Kapitel 4: Tablefiler

Du behöver:
Windows Textdokument
Thingy32

Konsten att skapa en tablefil.

Tablefiler används för att underlätta textredigering, och är idag ett standardformat till många hexeditorer. Vad de gör, är att visa ett spels text-kod med bokstäver som finns inskrivna i filen.

I början kan det vara riktigt svårt att få igång en fullt fungerande tablefil. Det enda sättet att lära sig det är egentligen att göra tablefiler till många olika spel. Basta.

Men hur som helst, det vi ska göra nu är att skapa en tablefil till Dragonwarrior 3, till Nes. Målet är att du ska kunna skapa en exakt likadan tablefil som den du laddade ned (dw3.tbl), så om du är osäker på något, så kan du alltid öppna upp dw3.tbl i ordbehandlaren och kolla hur det ser ut där.

För att skapa vår tablefil behöver vi två saker:

Thingy32
Ordbehandlare

Med ordbehandlare så syftar jag på anteckningsblocket i windows (högerklicka> "nytt" > "textdokument").

Och det är här som all din nyvunna kunskap om Hex äntligen kommer att löna sig. För innan du gör en tablefil, så måste du kunna den grundläggande principen bakom text i en rom, samt vad det har att göra med tablefiler.

 

Hex = Inga bokstäver

Hur många bokstäver tror du en roms text innehåller? Som det utgår av rubriken, är svaret 0. Det finns med andra ord inte en enda bokstav i hela Dragonwarrior, eller någon annan rom med, för den delen.

Men vad menar jag med bokstäver? Jo, jag pratar om formatet ASCII, som är det format med vilket den text du nu läser står skriven med. I roms däremot, står texten inte med ASCII (jo, vissa undantag finns det, men de är få), utan i hex.

Alltså vadå, betyder det att man kan skriva bokstäver med hex?

Nej, det kan man inte. Men bara för att du ser en massa text på rutan när du spelar Dragonwarrior 3, så betyder det inte att det finns text i koden för det.

Det som däremot finns, är grafik. Dragonwarrior innehåller Tiles, grafiska rutor på 8x8 pixlar, och på varje Tile finns en bokstav utritad. För att göra det hela lite överskådligt, kommer här en bild ur Tile Layer Pro, som vi ska jobba i sen. Bilden föreställer det alfabet som DW3 använder.

Bild på DW3
Joxet på nedre delen är ovesäntligt.

Sådär lagras alfabetet i Dragonwarrior 3. Så vad har det med Hex att göra undrar du?

Som jag nämde tidigare så lagras inte text i en rom med hjälp av vanliga ASCII-tecken. Texten står skriven med hexdecimaler, och varje hexdecimal hänvisar till en ruta grafik från alfabetet. Så om jag vill skriva "Hej", så måste jag veta vilka hexdecimaler som spelet använder för att visa "H", "e" och "j" på skärmen. Och eftersom vi använder Thingy32 för att skriva in texten, så måste vi hitta på ett sätt att skapa en fil, som meddelar Thingy32 om vilka hexdecimaler som spelets bokstäver finns inlagda på.

Vi skulle kunna skriva vår text genom att sätta in en hexdecimal i taget i koden, men vore det inte bekvämt om vi på något sätt kunda lägga in olika hexdecimaler på vårt tangentbord? I så fall skulle vi inte behöva skriva varje siffra för sig, utan låta Thingy sätta in hexdecimaler genom att trycka ner tangenter.

Och det är det som är det besvärliga med hela tablefil-grejen. Man vet nämligen aldrig i förväg vilka hexdecimaler som står för vilka bokstäver (vi vill ju nämligen ha hexdecimalen för "A" på tangent A osv). Det man däremot VET, är att varje ruta med grafik har sin egen hexdecimal, och eftersom vi har 1 bokstav på varje ruta, så har varje bokstav sin personliga hexdecimal. Det vi ska göra är att lista ut vilka hexdecimaler i koden, som visar vilka bokstävs-rutor på skärmen. När vi har gjort det, och fört in informationen i en tablefil, så kommer Thingy32 automatiskt att visa texten som den står på skärmen. Låter det krångligt? Du fattar efter ett tag.

Nu har du emellertid ett val. Antingen kan du använda emulatorn Nesticle för att hitta texten, eller så kan du göra en relativ sökning (båda metoderna finns beskrivna här). Att använda Nesticle är rätt enkelt, men den metoden har sina begränsningar i och med att den bara fungerar på Nes roms.

Vill du däremot kunna ändra texten till andra format (Snes osv), så är du så illa tvungen att kunna göra sk "relativa sökningar". Men stressa inte. Du kan alltid gå tillbaks och läsa mer senare.


Den enkla vägen - Enter the Nesticle

För att sammanfatta det hela: Vi ska lista ut varje enskild hexdecimal för alfabetet i DW3. Vi ska sedan föra in det i en tablefil, så att även Thingy32 får veta vad hexdecimalerna som vi har hittat har för motsvarighet när de visas på skärmen.

Det första steget är att köra vår rom i Nesticle. Spela dig fram till en del i spelet som innehåller grafiken (i det här fallet bokstäver) som vi vill ha hexdecimalerna för. Det betyder alltså att du ska spela tills ett stycke dialog kommer fram på skärmen. Notera att jag använder en orginalrom utan några som helst ändringar.

Helst skulle jag vilja visa bilder på processen, men Nesticle verkar ha något emot skärmdumpar. Men jag ska försöka vara så beskrivande som jag bara kan ändå. Hit har jag i alla fall spelat:

Nesticle_DW1.jpg (31119 bytes)

Steg 2 i att hitta hexdecimalerna, är att trycka på F2 nu när texten är uppe på rutan. Nu borde du få upp en ruta som innehåller den grafik som används på skärmen, och högst upp till höger i den högra delen av rutan, så borde du kunna se alfabetet.

Det du nu ska göra, är att klicka på "a" som står efter "9". Då får du upp en ruta med bokstaven, där det högst upp står "0B". Anteckna "0B=a" på en papperslapp, och gör samma sak med alla bokstäver från det stora och det lilla lafabetet. Ifall du är osäker, så ska det stå "0C" när du trycker på "b", "0D" på "c" osv. Sedan kan du även göra samma sak med siffrorna. Det här kan ta lite tid, men det är samtidigt det enda "enkla" sättet till att kunna skapa en tablefil.

När du har fört ner alla nummer på en lapp (eller vart du nu skrev ner dem någonstans), så är du klar. Hoppa över nästa sektion, och gå direkt ner till "Att skriva sin Tablefil".

Det var väl enkelt? Ifall du inte har listat ut det, så är talen som du skrev ner hexdecimalerna för de tecken (dvs bokstäver, siffror och punktuationer) som du klickade på.

Lite svårare - Den relativa Sökningen

Notera att jag utgår ifrån att du skippade den "enkla" vägen.

Det finns även en annan sak som vi kan utläsa från bilden ovan (dvs den som visade DW3:s alfabet i TLP), nämligen att både det stora och det lilla alfabetet står i alfabetisk ordning. Alltså, a b c d e f g h i osv. Det vi ska göra nu är första steget till att skapa en tablefil, något som kallas för en "Relativ Sökning".

Så, med hjälp av det faktum att bokstäverna står i en bestämd ordning i grafiken, så kan vi nu lista ut vilka hexdecimaler som de har. För att hitta texten, måste vi dock veta vilken text det är vi letar efter. För att få reda på det, så spelar vi några sekunder in på DW3, till följande skärm:

Bild

Då har vi lite text att söka efter, och det är nu det krångliga börjar.

Så, vad menas med en "Relativ Sökning"? Jo, att det man söker på (hexdecimaler i vårt fall) står i en bestämd ordning, samt i relativa positioner till varandra.

Ett exempel är A, B och C. Dessa tre bokstäver står alltid i samma ordning i ett alfabet, med A först, sedan B och till sist C. Det vi kan få ut av det är att A alltid står 1 steg före B, och 2 steg före C. B står alltid 1 steg efter A, men 1 steg före C. C står 1 steg efter B och 2 steg efter A.

Om vi gjorde en relativ sökning på ABC, så skulle Thingy söka så här: A(0) B (+1) C (+1).

Om vi sökte på BCA så blir det: B (0) C (+1) A (-2)

Och på CAB så får vi: C (0) A (-2) B (+1)

Detta system gäller för alla bokstäver i hela spelet, eftersom alla bokstäver (eller åtminstone deras tiles och hexdecimaler) alltid står på samma position i förhållande till varandra i en rom.

Öppna nu Dragonwarrior3 i thingy, men öppna ingen tablefil. När du får ett meddelande, klicka bara på "Ignorera".

Tryck sedan på "S", så borde du få upp följande sökruta.

Thingy_Dw.jpg (21312 bytes)

Efter det så klickar du på rutan där det står "Change to Relative Search". Nu är du redo att utföra sökningen, men vad ska man egentligen söka efter?

Det enda vi kan hitta just nu, är kombinationer av hexdecimaler. För det, så väljer vi ut ett ord från texten på den övre rutan. I det här exemplet så tar vi "important".

Skriv in "important" i din Relativa Sök-ruta, och tryck på Retur. Tryck sedan bort rutan som kommer upp, så gör Thingy32 en sökning.

Men vad sökte Thingy32 på då? Inte var det "important" i alla fall. Det thingy gjorde var att välja ut den första bokstaven i ordet (i), och gämföra de andra bokstävernas relativa positioner mot den. Så om vi skulle ta och kolla vad som egentligen hände:

1. Först valde thingy ut bokstaven "i".

2. Sedan kollade programmet på nästa bokstav (m) och jämförde dess relativa position till "i". Den kom fram till att "m" stod 4 steg efter "i" i ett alfabete.

3. Därefter kollades nästa bokstav (p) in, och konstaterades att den stod 3 steg efter "m".

4. Den 4:e bokstaven var "o", och den stod 1 steg före "p"

5. Samma procedur upprepades med alla bokstäver i ordet.

6. Till slut hade thingy ett resultat som såg ut så här: i(0) m(+4) p(+3) o(+1) r(+3) t(+2) a(-19) n(+13) t(+6)

Alltså, det thingy sökte efter var en kombination av hexdecimaler där:

  • Den andra hexdecimalen var 4 värden större än den första. (m+4)
  • Den tredje hexdecimalen var 3 värden större än den andra (p+3)
  • Den fjärde hexdecimalen var 1 värden större än den tredje (o+1)
  • Den femte hexdecimalen var 3 värden större än den fjärde (r+3)

osv.

Som du säkert kan förstå så finns det inte så många ställen i koden som följer det ovanstående mönstret exakt, med undantag för ordet "important". Om du gjorde rätt, så borde det se ut så här:

Thingy, DW

Markören står som du märker på "13". Eftersom ordet vi sökte på var "important", så betyder det att hexdecimalen för "i" är "13".

OBS! Oavsett vad du har fått för resultat, så är hexdecimalen för "i" ändå "13". Tro mig, jag vet.

Nu när vi vet det, är resten busenkel. Vi tar och tittar på bilden från alfabetet igen.

DW3s Alfabete

Minns du vad jag sa om ordningen? Då kan du nog lista ut, att om hexdecimalen för "i" är 13, så borde "h" ha värdet 12 eftersom det står ett snäpp under "i". Med lite kvick huvudräkning så får du ut att "a" har värdet 0B, och sedan är det bara att räkna ut resterande bokstäver genom att lägga till 1 hex för varje bokstav efter "a".

Ex: 0B+1=0C. Det betyder att "b" har hexdecimalen 0C.

 

Att skriva sin tablefil

Nu när vi kan lista ut värdena för de olika bokstäverna så är det bara att skriva in dem i en tablefil. Vid det här laget så måste du kunna räkna i hex för att ha en chans att få klart filen. Om du inte kan det så gör det inget, eftersom du laddade ner en färdig fil innan du ens började läsa det här. Dock rekommenderar jag att fortsätta. Det här är sådant man måste kunna om man vill göra sin egna översättningar/texthack.

Men hur som helst, om "a" är 0B, så måste "b" vara 0C. "c" är sedan 0D, "d" är 0E, "e" är 0F och "f" är 10. Resten av alfabetet kan du nog lista ut själv med lite huvudräkning/mhj av kalkylatorn, och när du har kommit till "z" (24) så är det bara att fortsätta på det stora Alfabetet, där "A" är 25.

Allt detta bör du föra ner på en papperslapp om du inte skriver in det direkt i tablefilen (ni som valde att jobba med Nesticle har förhoppningsvis redan allt nedskrivet).

Men hur ska det egentligen stå då?

Först så ser du till att skriva i rätt program. Anteckningsblocket i Windows är att föredra.

Alla hexdecimaler skrivs på en vertikal rad, med ett = efteråt, samt den bokstav dom hänvisar till. Tex:

0B=a
0C=b
0D=c
0E=d
0F=e
10=f
11=g
12=h

osv. ända till 24=z. Det är viktigt att du inte har några mellanrum efter dina bokstäver. Här nedan har jag fyllt i några hexdecimaler samt deras motsvarighet i texten, men jag har lagt in mellanrum efter varje rad (något som man inte ska göra). Testa att markera alla fyra raderna så ser du vad jag menar.

*******
0B=a      
0C=b         
0D=c    
0E=d                                
*******

När du har skrivit in alla bokstäver, så kan du även bestämma resterande tecken. Tex så ligger ju siffrorna 0-9 precis för det lilla afabetet, så om "a" är 0B, så borde "9" vara 0A.

Om din tablefil inte fungerar, kan det ibland behövs en ny rad längst ner i dokumentet.. Ex: (Markera texten så ser du en blå kant längst ned)

***********
0B=a
0C=b
0D=c
 
***********

Slutligen, när du har fyllt i allting, så sparar du filen som dw3.tbl (välj "alla filer" som filformat i textdokumentet). Du måste även skriva in .tbl i namnet som du sparar filen till). Sedan är du klar. Om du av någon anledning skulle ha problem med din tablefil, så pröva med den du laddade ner vid första kapitlet för att se om det är filen eller dig som det är fel på.

Annars kan du gå vidare till nästa kaptel: Att ändra text.


Extra: Här har du alla hexdecimalerna för alfabetet i Dragonwarrior 3, som dom ska stå i tablefilen.

*=EE
\=FD
/=EF
01=0
02=1
03=2
04=3
05=4
06=5
07=6
08=7
09=8
0A=9
0B=a
0C=b
0D=c
0E=d
0F=e
10=f
11=g
12=h
13=i
14=j
15=k
16=l
17=m
18=n
19=o
1A=p
1B=q
1C=r
1D=s
1E=t
1F=u
20=v
21=w
22=x
23=y
24=z
25=A
26=B
27=C
28=D
29=E
2A=F
2B=G
2C=H
2D=I
2E=J
2F=K
30=L
31=M
32=N
33=O
34=P
35=Q
36=R
37=S
38=T
39=U
3A=V
3B=W
3C=X
3D=Y
3E=Z