Prince Of Persia
törések

Mielött elkészült volna a mapeditor, kikisérleteztük, hogyan is lehet „kézzel” pályát készíteni.
Ez az oldal több hónapi lelkes csapatmunka eredménye. És bár kész a pályakészítő, mégis nagyon hasznos lehet mindazoknak, akik szintén pályakészítőt szeretnének készíteni akár ehhez, akár másik játékhoz.
És persze elengedhetettlenül fontos mindenkinek, aki pályát akar készíteni a Prince Of Persia 1-hez, hiszen még sok ismeretlen rész maradt, és nem mindent lehet az editorral módosítani. Mindemellet nem árt tudni, hogyan és épülnek fel a pályát.

Jó szórakozást!

Eddigi eredményeinket letöltheted itt:
popdoc.doc (Word 6.0 27 kbyte)
(utolsó módosítás: 2000. XII. 13.)
popdoc.zip (7 kbyte)

A pálya a LEVELS.DAT-ban van. Minden képernyő 3×10 egységből áll. A képernyők között nincs választóvonal.
Egy szint 2304 byte-ból áll. A szint byte-inak értéke összeadódik, és egy állandót adnak. A szint felépítése a következő:
 

1 byte
Ellenőrző kód 00-FF
kezdet
720 byte 
A pályaelemek (24 kép × 30 elem) 34, 14, 01, 21, stb...
1
720 byte 
A pályaelemek attribútuma 00!, 01-0F, FF
1441
18 byte 
Ajtókapcsoló függvények első része 89, 9A, stb..
1696
237 byte 
Ismeretlen (22+215?)  89, A9, 00, FF, stb...
18 byte 
Ajtókapcsoló függvények második része 00, 20, 40, 60, 80
237 byte 
Ismeretlen (22+215?)  89, A9, 00, FF, stb...
96 byte 
A képernyők elrendezése 00-18
1951
64 byte 
Egyenlőre ismeretlen  18, 19, 10, 11, stb...
7 byte 
Prince induló poziciója (kép, elem, irány) 00-1D, FF
2111
24 byte 
Őrök elhelyezkedése a 24 képen 00-1D, 1E, ha nincs
2118
24 byte 
Őrök iránya a 24 képen 00-jobbra, FF-balra (jobbrább áll)
24 byte 
Ismeretlen* ált. FF
24 byte 
Ismeretlen 00, FF
24 byte 
Őrök játékereje képenként FF, 00-0A
24 byte 
Ismeretlen FF, ha * nem FF, akkor 00
24 byte 
Őrök színe képenként FF, 00-07
16 byte 
Ismeretlen 00, FF
2 byte 
Lezárás (néhol csak 1 byte: 09, az elötte levő részek 1 byte-al hosszabbak) 0F 09 

Az ellenőrző kód:
A pálya HEX számai összeadódnak (a kóddal együtt). A pálya elején lévő kódot mahinálva lehet variálni a pálya felépítését. Tehát ha valahol növeljük az értéket, akkor ezt a számot annyival kell csökkenteni. Az érték 00-FF változhat. Ez alatt v. felett túlfordúl, csak az utolsó két helyiérték számit. Az elötte levők nem.

Az egységek:
Az egységek száma 00-1E-ig terjed, majd 20-tól kezdve ismétlődik. Így a 00 megegyezik a 20, 40, 60, stb.. is. Ez némileg segíthet az ellenőrző kódban. Bizonyos egységek csak bizonyos színteken lehetnek! Ezt mindig feltüntetjül.
 

00 Semmi
01 Járat
02 Járat + tüske
03 Oszlopos járat
04 Ajtó jobb oldalt
05 Járat, enyhén süllyesztett
06 Ajtó záró lap
07 járat, a jobb szélén faliszőnyeg (csak palota: 4, 5, 6, 10, 11)
08 óriás oszlop alja (csak palota: 4, 5, 6, 10, 11) 
09 óriás oszlop teteje (csak palota: 4, 5, 6, 10, 11) 
0A Ital
0B Leeső járat
0C semmi, a jobb szélén faliszőnyeg (csak palota: 4, 5, 6, 10, 11)
0D Tükör (csak a 4. pályán)
0E Járat + törmelék (nincs: 12, 13)
0F Ajtó nyitó
10 Nagy ajtó bal fele
11  Nagy ajtó jobb fele
12 Fogsor-csapda (nincs: 1) 
13 Járat + fáklya
14 Fal
15 Járat + csontkupac (csak 1, 3, 7, 8, 12)
16 Járat + kard
17 járat, a háttérben "erkély" bal oldala (pl 6-os szint) (csak palota: 4, 5, 6, 10, 11)
18 járat, a háttérben "erkély" jobb oldala (pl 6-os szint) (csak palota: 4, 5, 6, 10, 11)
19 boltívtartó oszlop (csak palota: 4, 5, 6, 10, 11) 
1A boltív törzse (csak palota: 4, 5, 6, 10, 11)
1B keskenyebb boltív (csak palota: 4, 5, 6, 10, 11) 
1C szélesebb boltív bal fele (csak palota: 4, 5, 6, 10, 11)
1D szélesebb boltív jobb fele (csak palota: 4, 5, 6, 10, 11)
1E Járat + törmelék + fáklya
1F nincs ilyen egyik pályán sem

Szöveges megjegyzések:
Az 1A-1D boltívek természetesen nem járatok, hanem hátterek. Kétféle boltív létezik. A boltívelemek szabadon elhelyezhetők.
A 08-09 és a 17-18 párok együttesen alkalmazandók, különben nem tudja rendesen megrajzolni a képernyőt.
A 03 oszlopos járat a palota részen két oszlopos járat, egy oszlop elöl, egy hátul van. Ezzel szemben a 19 boltívtartó egy olyan járat, amelyen egy oszlop van, ezt akkor használja a programíró, amikor felette 1A boltívtörzs van.
A faliszőnyeg amolyan vékony fal, nem tudom, hogy a róla induló boltívdarab a része-e az egységnek, valószínűleg igen.

A pályaelemek attributumai:
Na, következzen az a második réteg. Szóval itt a bizonyos elemekhez "alelemet" rendelhetünk. Legegyszerűbben a 0A (ital) elemmel mutatható be.
Ha a pályaelemeket tartalmazó 720 bájtos rész mondjuk negyedik eleme 0A, vagyis ital, akkor a 'második réteg' negyedik eleme mondja meg, hogy
milyen típusú ital. Ez persze nemcsak a megjelenítésnél számít, a hatást is ez határozza meg. A második rétegnél eszerint lehet:Ital (0A) 

00 buborék nélküli pia (hatástalan)
01 piros pia
02 piros anfóra
03 zöld anfóra (lassú esés)
04 zöld amfóra (fejtetőre állított képernyő)
05 kék pia
06 kék pia (hatástalan)
07 piros pia (hatástalan)

Ezután ismétlődik. Megjegyezendő, hogy pl. a kódellenőrző szinten (amelyik az első és a második szint között van, a levels.dat-ban viszont ezt
definiálták utolsóként) is 05-ös italok vannak, mégsem hagyományosan (-1 élet) működnek.

Hasonlóan a 00 (üres) és a 01 (járat) elemhez ezek tartoznak:
 

00 semmi
01 téglaháttér
02 téglaháttér #2 
03 ablak (01-járat esetén téglaháttér)
A palotarészen bonyolúltabb az ügy, más helyen más jelentést kap, lehet, hogy azzal függ össze, hogy az alsó és a felső vagy pedig a középső sorban van (ahol ez eltérést okoz, ott ezt perjel jelzi):
00 üres / díszcsík
01 díszcsík / üres
02 díszítés a csíkon 
03 ablak (01-járat esetén téglaháttér)

A fűrészfog csapda (12) attribútuma 00, ám ha ezt megváltoztatjuk, akkor álló fűrészfogakat kapunk:
 

00 semmi
01 félzár
02 zár - ez az egy gyilkol!
03 háromnegyedrészt zárt
04 nyitot
05 háromnegyedrészt nyitott
06, 07 ugyan az, mint a 05

Ebből két érdekesség adódik:
1. talán a működés animálása az attribútum változtatásával történik
2. a csapdák 'időzítése' itt nincs definiálva

Ajtó (04)
 

01 induláskor nyitva
02 induláskor zárva

Ajtó nyitó (0F), záró (06) kapcsoló
 

00-11 a kapcsoló által meghívott függvény

Nagy ajtó bal fele (10)
 

00 működéshez kötelező attributum 

Ajtók és kapcsolók működése
Az ajtók induláskor nyitva (01 attrib.) vagy zárva (02) is lehetnek. Az ajtókat 18 "függvény" működteti. Ezeket hívják meg a nyitó vagy záró kapcsolók (hex.) 00-11 attribútummal. Minden függvény két bájtból áll, ezek egymástól 256 bájtra vannak. Az 1-1 egymást követő 18, ajtót működtető bájt sorrendben a 18 függvény 1-1 adata. A két adat együttesen az alábbi három tényezőt adja meg:
ˇ hányas sorszámú (hex. 01-18) képernyőn lévő ajtót működtet,
ˇ azon a képernyőn hanyadik elem (hex. 00-1D) az adott ajtó,
ˇ egy ajtót működtet a kapcsoló, vagy többet is.
Tehát nem szerepel, hogy nyitásról vagy zárásról van-e szó, ezt kizárólag a kapcsoló típusa határozza meg. Szintén nincs adat arra, hogy meddig maradjon nyitva az ajtó, ez talán állandó. Ha több ajtót működtet egy kapcsoló, akkor ez kiderül a két bájtból: ilyenkor a következő "függvényt" is végrehajtja a kapcsoló, így már két ajtó nyílik vagy záródik. Természetesen ha a második 2 bájt is lehetővé teszi a következő olvasását, akkor már 3 ajtó mozog egyszerre.
A két bájt egyike rendszerint 89, A9, 29, A5 és hasonló, változatos szám, a másik csak 00, 20, 40, 60, 80 és A0 lehet. Most álljon itt egy matematikai képlet az ajtókra való hivatkozáshoz. Az első bájtot A-val, a másodikat B-vel jelölöm. A képletet hexadecimálisan adom meg.

A={[M(x/4)]*2+8}*10+y ahol M az osztás maradékát jelenti
B=[E(x/4)]*2*10 ahol E az egész részt jelenti (lefele kerekítés)
ahol x a képernyőszám (01-18) és y a képelem szám a képernyőn (00-1D)
Ha azt akarjuk, hogy a következő 2 bájtot is értelmezze a kapcsoló (dupla ajtómozgatás), akkor az első képletből a +8-at ki kell hagyni. A gyakorlatban ez a következőt jelenti. Például
 

1. képernyő A_ 00 duplázás esetén: 2_ 00 Az elso számhoz hozzáadódik a képelem szám, tehát például az 5. képernyo második sorának utolsó eleme esetén (20. elem) hex. 13, így ez esetben a hivatkozás B3 és 20, vagy duplázás estén 33 és 20 lesz.
2. képernyő C_ 00 duplázás esetén: 3_ 00
3. képernyő E_ 00 duplázás esetén: 6_ 00
4. képernyő 8_ 20 duplázás esetén: 0_ 20
5. képernyő A_ 20 duplázás esetén: 2_ 20
6. képernyő C_ 20 duplázás esetén: 3_ 20
7. képernyő E_ 20 duplázás esetén: 6_ 20
8. képernyő 8_ 40 duplázás esetén: 0_ 40
És így tovább....

A nagyajtóra ugyanígy hivatkozunk, a képelemnek a nagyajtó bal oldali eleme (10-es kód) számít. (Ennek az elemnek 00 az attribútuma.) Ha azon a képernyőn, amelyről adott szinten indulunk, nagyajtó van, akkor az a szint kezdetekor automatikusan "bezáródik". Ezt az ajtót is ki lehet ugyan nyitni később, ám akkor nem lesz benne lépcső, és nem lehet rajta "bemenni". Vagyis a továbbmenetelhez szükséges nagyajtó nem lehet az induló képernyőn.

Ha rálépünk egy 0F- nyitó kapcsolóra, abból ideiglenesen 01- normál járat lesz, ha egy 06- záró kapcsolóra lépünk, akkor az 05- süllyesztett járat lesz.

A képernyők elrendezése
A képernyők térképét pofonegyszerűen csinálták meg!! A képernyők ugye 30 bájtból állnak, és egy adott sorrendben követik egymást a levels.dat-ban.
Legyen az először definiált képernyő sorszáma 01, a másodiké 02, és így a 24. legyen 18 (hexában vagyunk!). Na most jön az a 96 bájt, ahol 4-4 bájt definálja egy adott képernyő szomszédait. A 4 bájt sorrendje:
Bal, jobb, fenti, lenti képernyő száma.
Vagyis az első négy bájt az elsőként definiált képernyő szomszédait írja le.
A szomszédokra a sorszámával hivatkozunk, ha nincs szomszéd egy irányba, akkor 00-t írunk.
Megfigyelhető, hogy minden képernyőnél külön definiáljuk a szomszédjait, vagyis előfordulhat, hogy Y képernyő bal oldali szomszédja X, miközben X oldal jobb oldali szomszédja nem Y.
Amelyik képernyőre semmelyik másik pályaképernyő nem mutat, azt nem látjuk a játék során, mégha az amúgy 'szomszédjának tekint' néhány látható képernyőt. [[Ugye ért valaki?]]
Természetesen szintenként újra kell definiálni ezeket a kapcsolatokat.

Honnét indul adott szinten a játékos?
Erre a válasz mindössze 7 bájt. Az első a képernyő szám (01-18), a második a képelem száma a képernyőn (00-1D). A harmadik bájt megadja, merre néz a legelső pillanatban Prince:
FF: jobbra; 00: balra.
Ezt három 00 bájt követi, majd a 7. bájt tartalmazza a végső állapotot, hogy merre néz Prince az induláskor: szintén FF a jobbra és 00 a balra. Gyakori ugyanis, hogy a szint kezdetén Prince "fordul egyet". Bizonyos szinteknél azonban a prince.exe némileg felülbírálja ezt, például az 1-es szinten mindenképp esik Prince, hasonlóan a 7-es szinten is.

Őrök
Az őröket képernyőhöz kötve definiáljuk. Egymás utáni 24 bájt a 24 képernyőt jelenti, illetve az ezekről induló őröket. Négy tulajdonságot definiálunk.
1. Van-e őr, és ha igen, a képernyő mely pontján?
1E, ha nincs; a hely: 00-1D-edik képelem.

2. Merre néz induláskor az őr?
Jobbra: 00; balra: FF (ez esetben eggyel jobbra áll az őr).

3. Milyen kardozási stílusa van?
 

00 level1 szintű , pancser
01, 02, 03 level 2 szintű
04 plusz 1 élet a többiekéhez képest
05 erős, pl. Fat
06 erős
07 nem támadó 
08 elállja az utat, de nem harcol
09 nagy csatázó, pl. Jaffar
0A még nagyobb csatázó
0B ez is elég csatázó (?)
0C, 0D, 0E, 0F ezek elég gyengék 

4. Milyen színű?
Az őrök színe 01-07-ig változik. Az FF színnel érdekes "árnyéklovagot" hozhatunk létre, sajnos azonban kiszíneződik, ha másik (színes) őrrel találkozunk útközben.
 

00 totál fekete
01 kék
02 piros
03 sárga/narancs
04 zöld
05 kék
06 lila
07 sárga

Az őrök életerejét nem a levels.dat fájlban határozzák meg. A prince.exe adja meg, hogy adott szinten az őröknek hány "élete" van, ehhez képest egy élettel mindig többel bír a 04-es harcstílusú őr. Az életek száma az egyes szinteken:
 

Level 1-2 3 élet (level1: guard2.dat is kell)
Level 3 Csontváz, végtelen élet (skel.dat)
Level 4-5 4 élet, level5: +1 is (level4: guard1.dat is kell)
Level 6 Fat, 5 élet (fat.dat)
Level 7-8 4 élet
Level 9-11 5 élet, level10,11: +1 is
Level 12 Önmagam, 4 élet (shadow.dat)
Level 13 (12/b) Jaffar, 6 élet (vizier.dat)
Level +1 Nincs őr definiálva

A speciális őrök (csontváz, kövér, tükörkép, jaffar) nem a levels.dat alapján szerepelnek, az egyes szintekhez a prince.exe rendeli hozzá, hogy melyik fájlból vegye az őr mintázatát, az adott szinten minden őr ilyen. A "normál" őröket a guard.dat írja le, illetve időnként ezt kiegészíti a guard1.dat és a guard2.dat.
Ahhoz, hogy kövér őrt kapj, szükséged lesz egy 00 színű FAT stílusú őrre. Ezzel már van is egy kövérkéd. Jaffarral ugyanez kell, csak Jaffar stílusban.

A LEVELS.DAT eleje és vége

A levels.dat fájlban a "nulladik" szint 2304 bájtja előtt 6 bájt van. [ 25 90 00 00 82 00 ] Az első kettő (25 90) az utolsó pálya utáni részre hivatkozik, e két bájt felcserélve a levels.dat végső részének elejét (hex. 9025) adja meg. Ezt két 00 bájt követi, majd a 82 a végső rész hosszát adja meg hexadecimálisan. Ezután még egy 00 van, majd kezdődnek a szintek.

A levels.dat végén, a kód szint után találjuk annak meghatározását, hogy az egyes szintek hol találhatók a fájlban. A szintet leíró 2304 bájt első bájtjának hexa címére kell két bájtban hivatkozni, ez esetben is felcserélve a két bájtot. Összesen 16 pálya van. A "nulladik" a bemutató szint, ezt követik a normál pályák. A 13. (hexa D) a level 12 második része, a 14. az utolsó szint és a 15. a kód szint. Az utolsó bájtok tehát:
 

szint
 
2. byte
1. byte
02
10
00
D0
07
06
00
00
00
01
09
D1
07
08
09
00
00
01
09
D2
07
0A
12
00
00
01
09
D3
07
0C
1B
00
00
01
09
D4
07
0E
24
00
00
01
09
D5
07
10
2D
00
00
01
09
D6
07
12
36
00
00
01
09
D7
07
14
3F
00
00
01
09
D8
07
16
48
00
00
01
09
D9
07
18
51
00
00
01
09
DA
07
1A
5A
00
00
01
09
DB
07
1C
63
00
00
01
09
DC
07
1E
6C
00
00
01
09
DD
07
20
75
00
00
01
09
DE
07
22
7E
00
00
01
09
DF
07
24
87
00
00
00
09

Ha bármilyen kérdésed van, azt itt teheted fel: http://index.hu/forum/forum.cgi?a=t&t=9011167&uq=40
Vissza