You are on page 1of 28
PRINCE OF PERSIA Technical Information PRINCE OF PERSIA and all source code, documentation, and supporting materials copyright @ 1989 Jordan Mechner. All rights reserved. October 12, 1184 BACKGROUND GRAPHICS Each level consists of up to 24 screens. Each screen consists of 30 blocks (10 blocks wide x 3 blocks high), also referred to as “pieces.” Examples of pieces are: floorpiece; pressure plate; spikes; solid block. The complete layout of each level is specified by a "level blueprint" ($900 bytes tong). COORDINATE SYSTEM The Apple screen is 40 bytes wide x 192 lines high, with 7 bits per byte. Most of the background graphics are done on the byte boundaries (e.9., an X-coordinate of 39 puts you at the far right-hand edge of the screen). Since each screen breaks down into 10 blocks across x 3 blocks high, that works out nicely with each block being 4 bytes wide. The moving characters (player, guard, etc.) use a slightly different coordinate system. The X-coordinate is represented by one byte. The screen is 140 pixels wide, with 58 as the screen's left edge giving us offscreen margins of 58 pixels on either side of the screen. (This makes it possible to compare the X-coordinates of two characters even if one is offscreen.) Since all the character movements throughout the program are specified according to the 140-wide coordinate system, we would like to keep the character's X-coordinate on a 140-wide screen (or a width that is a multiple of 140) for all the different conversions. The character's position could then be mapped to the actual screen width for that machine--320, 512, 640, or whatever--at the time the character is drawn. IMAGE TABLES There are two background image tables (bgtab1-2) and 7 character image tables (chtab1-7). Gh. table # Contents 1,2,3,5 Player (kid); misc. shapes 4 Enemy (guard, fat guard, skeleton, vizier, shadow) 67 Shapes for princess scenes (princess, vizier, hourglass) Note: chtab6 is too big to fit into memory all at once, so it is split into two files: chtab6.a used for opening title sequence & levels 1-2 chtab6.b used for levels 3 and up, including victory sequence There are two sets of background images, one for the dungeon and ‘one for the palace. See accompanying lists that describe the contents of chtabé-7 and bgtab1-2. MEMORY USE The Apple version uses memory, roughly, as follows: (during game play) Image tables Player Enemy Princess & Vizier Background TOTAL IMAGE TABLES Code Buffer space Music Level blueprint Screen memory TOTAL RAM Packed dblhires screens Packed princess's room TOTAL DISK SPACE RAM DISK 30K 30K 6K x5 = 30K 9K 13.5K x2 = 27K 49.5K 96K 48K 48K 8K 4k 6K 2.25K x16 = 54K 16K 127.75K 42K 6.5K 252.5K LEVEL SUMMARY #_Name _B.g,_Opponent 0 Demo Dun Gd 1 Cell Dun Gd 2 Guards Dun Gd 3 Newskel Dun Skel 4 Newmirror Pal Gd 5 Thief Pal Gd 6 Plunge Pal Fat 7 Wtless Dun Gd 8 "329" Dun Gd 9 Twisty Dun Gd 10 Quad Pal Gd 11 Wild Pal Gd 12 Tower Dun Shad 13 Final Dun Viz 14 Victory Pal Princess Level 0 is the demo level. Although levels 13 and 14 are technically separate levels, the “official” highest level number is 12. @ Dros C-section of block bela & to left @® Dru B-Seetior of black 4 ler @ Pow d-seckm @ Pou Ansection (D Prt Frmtpiece Kener 192 pines, cease Ssagyreeyx7s > sa7}ing 255 { OFF SCREEN OFF ScREEN lo wala Keeome cs|ce fe 38 pias go pins 5 plas PRINCE OF PERSIA. Routines to keep track of moving objects are contained in the file MOVER, and mobile objects unti| ANINTRANS decides It's tine for it to fall, At that point, the loose floor is deleted from the trans list, the block is replaced by “enpty space", and a new HOB is created to take its place. Under the control of ANINMOBS, the HOB then fails until it hits the ground, at which’ point ANINMOBS deletes the falling floor from the HOB list and changes the objid of the Block it landed on to “rubble. FRANE ADU IMAGE Lists AAR RA PERE ER ERE ENTE HERERO ERE EE EEE FRAMEADY never calls hires routines directly. instead, Parameters of Inages to be drawn are stored in “image There are 6 separate image lists: bg: Images in background plane (drawn first> x, ¥, ING, OP ipe: Solid-color wipes (drawn with b.g. planed x, ¥, H, Wy COL fg: Images in foreground plane drawn last? x, ¥, ING, OP Images between b.g. and f.9. planes X, OFF, ¥, ING, OP, TYP, CU, CD, CL, CR msg: Images in message plane (drawn last of all> x, OFF, ¥, IMG, OP Pere ee eee eee eee eee gen: General instructions (e.g. clear screen) 8/27/89 comments /2 116 117 118 119 120 121 122 123 PRINCE OF PERSIA. PRR RRER ER ERE EEE EE ERE AD ORE E REE E ERE E EERE EEE REAR EERE Explanation of parameters: X__ = X-coord Cin bytes? OFF = X-offset (0-6) Y= Y-coord IMG = image # in table ¢1-n> OP = opacity TYP = image type (for mid only? CU = top cutoff CD = bottom cutorf CL = left cutoft CR = right cutoff Ho = height WH = width Cin bytes? COL = color , Superseded by REDBUF. FREDBUF : Refers only to foreground plane, Marked when character goes behind a post or other object with a frontpiace. Superseded by REDBUF. FLOORBUF : Refers to floorpieces. Marked to the right of a falling or hanging character. FLOORBUF causes floorpi: to be draun in the mid plane (where it will cover up character if appropriate>. HALFBUF : Like FLOORBUF, but redraws a triangular section of the floorpiece instead of the whole thing. Used when a character clinbs up on the left side of a floorpiece and wa want to mask out his lover body uhile letting his upper body show, (Superseded by FLOOABUF. > OBUBUF : Marked whenever objects need to be drawn in a given block. CObjects ore aluays the last mid elements draun in a block. Objects are assigned to blocks based on their lover left x-y coords. Characters are considered objects. There can be multiple objects in a given block. > ‘TOPBUF: 10-byte buffer for row of D-sections across top of screen (from screen above) Note that TOPBUF is a 10-byte buffer while the others are all 90 butes. The specific routines called by SURE in FRANERDU) for each of these buffers are: REDBUF: redblock (drawc, drawb, droumb, draud, draund, drawa, drowna, drawfrnt? WIPEBUF: pesq MOUVEBUF: drawc, draumc, drawnb, drauna FREDBUF: drawfrnt FLOORBUF: drawfloor HALFRUF: deawhal f OBJBUF: drawobjs TOPBUF: drawe, drawb, redrawd, drawnd, drawirnt PERE EERE EE EERE EEE ERA R EES EEE EERE REAPS ERE ERASER EEE 8/27/89 comments /4 232 233 234 235 236 237 238 239 240 241 242 243 244 245 245 247 248 249 PRINCE OF PERSIA ARERR AER ER EEE EERO RRR E REE RR RARER ARE E HERRERO BLUEPRINT LEVEL BLUEPRINT <$900 bytes> Start Length BlueTypa B00 720 Bluespec. 0 720 LinkLoe BCAO 256 Linktiag, BORO 250 Hap BEAO 96 info BFOO 256 TOTAL: 2304 bytes BLUETVPE. Bytes 0-29 descr screen *1 Bytes 30-59 ° = screen #2 ete, 24 screens total. Each BLUETWPE byte corresponds te one block «20 blocks per screen.) Blocks are mapped Inte BLUETYPE left-right, top-bottom. AND with S$1F to get the “objid,” or object Identification nunber (0-31), of each black BLUESPEC. (Screen blocks mapped the same way as in BLUETVPE.> Taken together, each pair of corresponding bytes in BLUETYPE and BLUESPEC contains all the information about an object. The BLUETYPE byte always contains the object id. The BLUESPEC byte functions differently depending on what the object is. For movable objacts (gates, , torches, ete. > BLUESPEC specifies the object's “state” (e.g. is it open, closed, somewhere in between?) For static objects (floor, space, solid block, etc. > BLUESPEC specifies the object’s “pattern” (e.g. which design appears on the wali behind it?) For pressure plates, the BLUESPEC byte tells which gates the pressure plate controls. Specifically, the BLUESPEC byte is a pointer (0-255) to the first entry the link list for this pressure plate. 8/27/89 comments/5, 290 291 202 293 294 295 296 297 298 299 300 301 302 303 304 305 308 307 308 309 310 ani 312 313 ana a1s 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343, 344 345 345 347 PRINCE OF PERSIA * a Link Fist (LINKLOC/LINKMAP > Contains a list of the gates controlled by each pressure Plate, Each pair of bytes specifies one plate-to-gate linkage. There can be up to 256 such | inkage: LiNKLoc: Bits 0-4: gate screen posn (0-29) Bits 5-6: low 2 bits of gate screen # (1-24) Bit 7: 1= this is last entry, 0 = more gates te cone LINKMAP Bits 0-4: pressplate timer (0-31) Bits 5-7: high 3 bits of gate screen # If a pressplate contrals nething, LINKLOC = FF; LINKMAP still functions as pressplate tiner, NAP Specifies how the 24 screens of the level are connected, of the 4 adjacent screens. Bytes 0-3 = screen #1 Bytes 4-7 = screen #2 etc For each serean Byte #t Byte #2 Byte #3 Byte #4 sereen to left screen to right screen above screen below INFO Bytes 0-63: reserved for editor Bytes 64-255: Information abaut starting positions ‘of player & other characters on this level. (See MMNMEQ for details. > + * * * * * * * * * * * * * * * * * * * Each screen gets 4 bytes corresponding to the screen #s * * * * * * * * * * * * *SEQTABLE * Frame def list 8/27/89 comments /6 348 349 351 352 as 354 355 355 357 358 359 360 364 362 363 364 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 aed 385 386 387 389 390 391 392 393 394 305 395 397 398 399 400 401 402 403 404 405 PRINCE OF PERSIA ER REE E EEE EEE EERE EA AO REESE EER PAPA EERE EERE EE EERE 1200 bytes allocated -- 240 frames, 5 bytes each (241-255 reserved as commands) Fran definition consists of: <1) Fimage Bit 7 = chtable # (0-7, bit 2 Bits 0-6 = image * <0-127) SURRIARY: $00 + x: chtable 1 $00 + x: chtoble 5; <2) Fsword Bits 6-7 = chtable ® (0-7, bits 0-1 Bits 0-5 = pointer te SHORDTAB frame (0-63> SUMMARY > $00 + x: chtable 1,5 $40 + x: chtable 2,6 $80 + x: chtable 3,7 $00 + x: chtable 4,8 (2) Fax Xoshift in pixels (= fwd, - = bkwd> (NOTE =~ horizontal resolution is 140 pixels? <4) Fy Veshift In pixels (+ = down, - = up? (Frane #15 is defined as unshifted> «5> Feheck Bit 7 = odd/even pixel Bit 6 = 1 if floor check Is required Ci.e., if weight is on floor? BILS= 1 to” " this frame for collision detection Bits 0-4 = number of pixels (0-31 from left edge of image block to base x-coord (usually center of foot bearing character's welght> SUMMARY: $c0 + x: check, odd $40 + x: check, even $80 + x: no chack, odd $00 + x: no check, even + $20 to set bit S 8/27/89 comments/7 408, 407 408 409 410 au 412 aig 414 415, 416 4n7 ai 419 420 421 422 aza 424 425 426 427 429 430 431 432 433 434 435 436 437 438 439 440 4aat 442 443 444 443 445, 447 448 449. 450 451 432 453 454 455 4568 457 458 459 400 461 462 463 PRINCE OF PERSIA SEQPOINT is 2-byte pointer to character's current position in sequence table, Seq pointer is incremented by 1 with each frame-advance. CTRL can junp seq pointer cround at will

You might also like