Du behöver:
Kunskap om allt från de tidigare kapitlen
DTE
Då var vi äntligen här, det sista, stora kapitlet om att hacka roms. Nog för att det finns mer kvar att lära sig (och ja, det kommer mer i nästa kapitel), men det här är nog en av de får grundläggande (om än avancerade) sakerna som tas upp. Eftersom vi är inne på mer avancerade tekniker så kommer det att vara färre bilder än tidigare, och jag kommer inte att beskriva varje enskilt moment samt lägga till kommentarer. Faktum är att mot slutet kommer det inte att finnas en enda bild att se på. Det finns mycket att veta, men lite att visa.
Let's go. Som bekant är alla romhackares värsta mardröm komprimering i text och grafik. Komprimerad grafik kan inte ändras (trots att man kan se den) och komprimerad text kan inte hittas oavsett hur många sökningar man gör i sin rom. Problemet är det, att det inte finns något mirakelprogram som kan jobba med komprimering, vare sig grafik eller text. Men det finns en (och bara en) komprimering som faktiskt alla kan ta sig förbi, och använda till sin egen fördel. Det är nämligen DTE.
DTE står för Dual Tile Encoding. Och vad betyder det? Tja, av namnet så kan man utläsa:
Dual: Dubbel / 2st av något
Tile: Det vet du. En ruta med grafik
Encoding: Eh, nåt med kodning...typ.
Så, kodning som ger två stycken Tiles kanske? Helt rätt, men riktigt så enkelt är det inte.
En Enkel förklaring
Alla gillar sådana, så här kommer en:
Som vi har listat ut vid det här laget, så skriver man text genom att sätta in hexdecimaler i spelets kod. Vi vet också att varje hexdecimal fungerar som en "länk" till en Tile i grafiken, som har en bokstav ritad på sig. Därmed får vi effekten att vi kan "skriva" genom att sätta in hexdecimaler på rätt ställe. Den gyllene regeln blir alltså att: När vi skriver in en hexdecimal i koden, så kommer det upp en bokstav på skärmen.
Men, tänk om det inte gjorde det? Om vi på något sätt kunde göra så, att en hexdecimal i koden resulterade i TVÅ bokstäver på skärmen. Då skulle ju det innebära att vi antingen skulle kunna visa dubbelt så mycket text, eller spara hälften av utrymmet som krävs för att skriva den. I spel med mycket text (FF3 någon?) så är detta värt sin vikt i guld, och sparar högvis med utrymme.
Det var den enkla förklaringen. Då är det dags för:
Ett Enkelt exempel
Låt säga att vi tar ett vanligt svenskt ord: "är".
Vanligtvis så skulle "är" kräva två hexdecimaler att skriva, en för "ä" och en för "r". Men, "är" är som de flesta vet ett väldigt vanligt ord, så varför inte fixa så att man kan skriva det med bara EN hexdecimal istället?
Dessvärre måste jag erkänna att jag inte har en aning om hur man lägger in en DTE-rutin i ett spel. Men vad jag däremot kan, är att utnyttja de som redan finns. Vi kan låtsas att jag tänker översätta ett engelskt spel med DTE i sig. Det jag skulle göra då, är att ändra en av de redan existerande DTE-kombinationerna till att visa "är" istället.
En vanlig kombination inom engelskan är "th", men på svenska så skrivs de bokstäverna aldrig efter varandra, så dem tar jag bort. Efter att jag har skrivit om "th" till "är" så behöver jag bara skriva in hexdecimalen för "th" i koden, så kommer "är" upp på skärmen.
Det jag vill ha sagt, är att även om ett spel har DTE i sig, så måste spelet någonstans ha kombinationerna skrivna i dess ursprungliga form. Någonstans måste det finnas ett "orginal" med bokstäverna "t" och "h" skrivna var för sig, som spelet kan hänvisa till med DTE-hexdecimalen för "th". Och om dom finns någonstans, så går dom att hitta. Och när man hittar dom, så kan man ändra dom till vad man vill.
Innan vi går vidare ska jag passa på att klargöra ett par termer:
DTE: Dual Tile Encoding. Se beskrivning ovan.
(DTE) Kombination: Ett par bokstäver som tack vare DTE har en gemensam hexdecimal.
DTE i FF3
Nu ska vi titta lite på hur DTE fungerar i praktiken. Öppna upp FF3 i Thingy32 och ladda den tablefil (ff3.tbl) som du har laddat ned. Tryck "J" och hoppa till början av dialogen igen. Hit med andra ord:
Markera "V" i VICKS och tryck mellanslag, däreefter gör du samma sam med " : " som kommer efter "VICKS". När du sedan får upp text-rutan så kan vi kolla hur Thingy för in DTE. Vi kan använda "st" som exempel. Skriv därför in "s" och titta på vilken hexdecimal som fylls i på nedre raden (4C). Därefter kan du skriva in "d" och titta om något händer med hexdecimalerna där nere. Inget alls va? Radera "d" och skriv in "t" istället. Nu hände väl något?
Det är nämligen så, att i vår tablefil finns det inskrivet att kombinationen "st" ska resultera i hexdecimalen 9F (den som kommer fram om man skriver in "s" och "t" efter varandra), och eftersom "st" även finns i spelet som en DTE-kombination, så blir resultatet att Thingy automatiskt lägger in hexdecimalen 9F när man skriver "st".
För att visa på hur praktiskt detta kan vara så ska vi fylla i lite text i rutan som vi markerade. Om du har gjort rätt så ska du ha markerat hela ordet "VICKS" vid det här laget. Ordet har, som du vet, bara 5 bokstäver, men testa att skriva in:
stedtaee!! (bara en samling med DTE-kombinationer)
Trots att ovanstående "ord" innehåller 10 bokstäver så kan man utan problem skriva inte det, eftersom det bara består av 5 DTE-kombinationer.
Nu ska vi kolla hur DTE:n ter sig på skärmen, så du kan bortse från det du fyllde i "VICKS" tidigare. Sätt ut textmarkeringar på "V" i "VICKS" och på den första #:en som kommer i hans mening. I rutan som kommer upp så skriver du bara in en massa "z" (du måste inte använda "z", men det är bra om du använder en bokstav som förekommer sällan i texter) tills det tar stopp. När du har gjort det så borde det se ut såhär:
Varför ville jag att du skulle fylla i det då, och vad har det att göra med DTE? Inget alls faktiskt, men nu när vi har fyllt i meningen med en massa "z", så kommer vi lättare att kunna testa DTE:n, eftersom "zz" inte är någon DTE-kombination. Med andra ord så kan vi nu se varje enskild hexdecimal i VICKS första mening. För att göra det, så starta om Thingy med FF3 igen, och hoppa till början av dialogen. Den här gången borde du kunna se alla "z":n som vi har fyllt i.
Nu ska vi testa våra DTE-kombinationer. Vi kan väl ta "st" när vi liks håller på. Ta upp skriv-rutan genom att markera ett "z", och fyll i "st" i den rutan. På nästa bild har jag markerat det tredje och det fjärde "z":t och fyllt i "st" i rutan som kom upp. Resultatet blev så här:
Trots att jag bara markerade och skrev över 1 "z" (med hexdecimalen 9F som kommer upp när man skriver "st"), så blev resultatet "st" på skärmen. Det här var ett exempel på hur man skriver in DTE i sin text, och svårare än så blir det faktiskt inte. Anledningen till att vi lade in en massa Z:an, är att DTE inte alltid visar bokstäver på skrämen. Om vi tex hade gjort vårt test med hexdecimalen som visade "e_" (e och mellanslag) så hade vi inte kunnat urskilja mellanslaget om vi tex skrev in DTE:n i slutet på en mening. Men eftersom vi har "z" på båda sidor så vet vi med säkerhet vad som är och inte är en del av DTE:n.
Sökningar med DTE fungerar samma på samma sätt, där
Thingy fortfarande kommer att lägga in de DTE-kombinationer som finns angivna i
tablefilen. Men, innan man börjar översätta så finns det vissa saker som man bör ta
hänsyn till...
Engelsk DTE kontra Svensk
DTE var ju som sagt ett sätt att spara utrymme på genom att visa 2 bokstäver på skärmen, med 1 hexdecimal i koden. Problemet är, att beroende på vilket språk som använder, blir behovet av DTE väldigt olika.
Om vi går tillbaka till DTE:n "th" igen. Denna kombination finns i FF3, men jag kan lova dig att du som svensk ALDRIG kommer att skriva "th" i en mening (typos och utländska namn undantaget). Den mängd DTE som FF3 har är begränsad, så visst vill vi att de få kombinationer som spelet har ska utnyttjas till några riktig vanliga bokstavspar i vårt språk?
Av den anledningen, så bör man alltid ändra ett spels DTE innan man börjar översätta det. Risken finns, att man annars måste gå tillbaka och skriva om texten. Dessutom sparar man utrymme på det sättet. För att ge ett praktiskt exempel, så går vi vidare till:
Ändra DTE i FF3 - Den lätta versionen
Dags för lite praktiskt arbete. Återigen kommer vi till FF3, som har ett ovanligt enkelt system för att lagra DTE. Alla spel är inte så här snälla, men som tur är så ger FF3 oss en chans att få en mjukstart.
Om du har laddat rätt tablefil (ff3.tbl) så borde du se en rad som lyder "DTE start" om du trycker på "J". Hoppa dit.
Jaha, svårare än så var det inte. Det du nu har framför dig är spelets alla DTE-kombinationer. Om du befinner dig på rätt plats så ska det se ut så här:
Jaha, det var ju intressant, men hur ser man vilka bokstäver som hör samman då? Mycket enkelt faktiskt, det enda du behöver göra är att öppna din tablefil i ett textdokument igen. Dina DTE-kombinationer börjar sedan på 80, och slutar på FF. Anledningen till att man kan se att de är DTE-kombinationer är... tja, det faktum att dom står i par kanske?
Ifall du undrar varför vissa kombinationer verkar bestå av en bokstav och ett mellanslag (jag kommer hädanefter att visa "mellanslag" genom att skriva " _ ") så beror det på att även det kan spara utrymme ibland. Ta den allra första kombinationen på 80 som exempel. Där står det "80=e_".
Faktum är, att det finns mycket utrymme att spara genom att även lägga in mellanslag på rätt ställe. Ta ordet "nu" som exempel. Om vi ville, skulle vi kunna lägga in det på en hexdecimal, och på så sätt kunna skriva det ordet. Men varje ord har ju mellanslag mellan sig, så varför inte lägga in "_n" och "u_"? På så sätt kan man skriva in "_nu_" med 2 hexdecimaler, något som annars skulle kräva 3.
Men nu återgår vi till vårt exempel. Det vi ska göra, är att gämföra vår DTE i spelet med den i tablefilen. 80 var ju som sagt "e_". 81 är sedan "_t". 82 är ":_" och 83 är "th". Om du tittar på bilden ovan eller i Thingy32, så ser du att det är just de bokstäverna som befinner sig i början på texten som befinner sig vid E1A0 (DTE start). En ren slump? Skulle inte tro det. För att testa, så ska vi skriva om "th" så att det visas något vettigare istället.
Sätt därför skrivmarkeringar på "t" i "th" och på det "t" som kommer efter "th" (som är en del av "84=t_"). Notera att du inte kan skriva in några svenska bokstväer (ÅÄÖ med andra ord) eftersom vi inte har ritat in dem. Men, varför inte skriva in ett ord som "ja"? Gör det. Var även försiktig så att du inte skriver in några DTE-kombinationer. Bara enskilda hexdecimaler tack.
Det vi ska göra nu, är att testa vår nya DTE-kombination. Men innan vi gör det, är det en sak som måste ändras först. Vi måste öppna vår tablefil (om du inte redan har gjort det) och skriva in "ja" där det står "th" (du vet, den DTE-kombination som vi ändrade). Så, radera "th" och skriv "ja" istället. Spara sedan filen som en ny tablefil (Tryck "spara som", välj "alla filer" och skriv ff3_2.tbl). Nu kan vi öppna vår FF3-rom i thingy med den nya tablefilen.
Hoppa därefter till dialogen (med alla "z"), och markera åter den hexdecimal som vi ändrade förra gången (det tredje "z":at). Om du gjorde rätt så borde det stå "st" där nu. Markera sedan "st" och z:at efter det så att skrivrutan kommer upp. Fyll i "ja" med din nya tablefil, så borde "j" och "a" slås ihop till 83, precis som med "th". När du sedan laddar FF3 i Snes9x, så borde det se ut så här:
Puuuuh, det tog sin tid, men nu är du klar. Du har just ändrat ett stycke DTE för att bättre passa in på det svenska språket. Sedan så skulle en översättning visserligen kräva att resten ändrades också, men principen är densamma. Men det här var ett exempel som utgick från att du hade en tablefil som redan innehöll alla DTE-kombinationer, samt pekade ut vart dom befinner sig någonstans. Om du tror att det alltid går så här lätt, så kan du drömma vidare. Nu ska vi gå igenom hur man kan hitta DTE UTAN en komplett tablefil.
Att hitta DTE:ns hexdecimaler utan hjälp - Sökningens Gissel
Det som alltid djävlas när man försöker översätta ett spel med DTE (och inte vet att det faktiskt innehåller DTE) är att oavsett vad man söker på, så får man bara inte några träffar som man kan skapa tablefiler utav. Antingen så hamnar man på ett stycke kod som bara följer samma relativa mönster som ordet man gjorde en (relativ) sökning på, eller så får man inga träffar alls. Faktum är, att när det här händer, så har man mycket slit att se fram emot. Men vad vore romhackning om inget gick sett ibland?
Först och främst, VARFÖR kan man aldrig hitta någon text som innehåller DTE, bara för att man inte har alla DTE-kombinationer? Om du är nyfiken, så kan du alltid öppna upp en skrivruta från FF3 och skriva in "Jag spelar nu" i VICKS zzzzz-text. Sedan kan du öppna din tablefil, radera alla DTE-kombinationer (dvs allt från 80-FF) och spara filen som ff3_3.tbl.
Öppna upp Thingy på nytt, med FF3 och din nya talefil, och gör en relativ sökning på "spelar". De andra två orden är för korta för att deras mönster ska kunna ses som tillräckligt unikt och inte ha några andra motsvarigheter i koden. Om du gjorde rätt (eller snarare fel) så borde du inte ha fått någon träff alls med din relativa sökning. Testa att göra en vanlig sökning utan DTE då. Sök bara på "spelar" som vanligt. Ingen träff där heller? Så tråkigt...
Om vill se varför, så gå till början av dialogen igen (D0200) och kolla på meningen som du skrev in med DTE (för det gjorde du).
Men hoppsan! Det verkar som om nästan all text är BORTA! Utan en tablefil som innehåller alla DTE-kombinationer, så kan man ju nästa inte hitta något alls. Det enda som återstod av "Jag spelar nu" är "J", "l" och "u". Vilken osis. Men nu kanske du förstår, varför man inte kan hitta ord soms står skrivna med DTE bara genom en vanlig sökning. Så, hur hittar men ett ord då? Jo, så här:
Oavsett hur mycket DTE ett spel innehåller, så finns det alltid vissa ord som INTE innehåller DTE (Det kan inte finnas DTE för precis ALLT, eller hur?). Och om det gör det, så går dessa ord att hitta. Ta bara namnen VICKS och WEDGE som exempel. Visst kan du fortfarande läsa dem, trots att DTE:n är borta? I så fall kan du göra en relativ sökning på tex. VICKS och på så sätt kunna bestämma det stora alfabtets hexdecimaler.
Det finns även ett ord lite längre ned som har besparats från DTE, nämligen "worry" (D030B). En relativ sökning på detta ord skulle ge en korrekt träff, och utifrån det skulle vi kunna bestämma hexdecimalerna för det lilla lafabetet också.
Problemet är ju att man inte VET vilka ord som innehåller DTE och inte innan man börjar söka, man får bara pröva sig fram. Och det tar tid. Mycket tid. När man väl har skapat en tablefil med det stora och lilla lafabetet får man kolla runt i Thingy efter texter som man känner igen, och fylla i DTE som man utläser av spelet allt eftersom. Mer och mer av texten kommer på så sätt att komma fram i Thingy, och till slut så har man fyllt i DTE så att texten är helt läsbar. Dock finns det ett annat sätt för dem som inte får till det:
Den enkla, men dock så tidsödande vägen...
Den här metoden är till för dem, som har hittat hexdecimalerna för alla bokstäver, men inte kan lista ut vilka DTE-kombinationer som spelet använder. Det kräver också en sak till, nämligen att du har hittat åtminsone ETT ord från EN text i Thingy, som du kan spela dig fram till i spelet. Det första du kan göra är att ta en Savestate i Snes9x just inann texten kommer upp (tryck shift+F1-F10).
Nu kommer det ett skitgöra utan dess like. Det du ska göra är att fylla i hela ordet med en ovanlig bokstav, tex Q,W eller Z. Ladda sedan om din rom i Snes9x och använd din Savestate (tryck F1-F10 utan shift) för att hoppa till texten. Om texten har blivit ändrad, så vet du att du är på rätt plats.
Nu väljer du ut en bokstav mitt i ordet, så att du får tex Z:an på båda sidorna av ordet. Du markerar det i vanlig ordning så att skrivrutan kommer upp, och därefter så trycker du på " @ " så att "fyll-i-din-egen-hexdecimal" rutan kommer upp.
I den rutan fyller du i hexdecimalen 00, och laddar sedan om din rom i Snes9x, tar fram texten, och kollar vad som har blivit ändrat. Ifall det helt plötsligt kommer fram två bokstäver (eller en bokstav och ett mellanrum) bland alla Z:an, så har du hittat en DTE-kombination för hexdecimalen 00. Ta sedan din tablefil och fyll i 00=(den DTE som kom upp), och gå vidare till nästa hexdecimal (01) och gör samma sak igen.
Om du INTE får upp någon DTE, utan bara en massa jidder på skärmen, så är det att vänta sig. Då är det bara att fortsätta med nästa hexdecimal tills du har prövat med alla. Om du är kvick på huvudräkning, så förstår du att du måste kolla igenom 256 olika hexdecimaler innan du har prövat alla. Men slappna inte av, har du otur så finns det mer att göra.
Det är nämligen så, att vissa hexdecimaler (som är DTE) ger OLIKA resultat beroende på var de används. En hexdecimal kan ge ett resultat i dialogen, och ett annat i menyer. Detta gäller för långt ifrån alla spel, men själv har jag råkat ut för två sådana exempel. I så fall så måste du hitta ett nytt ord från den nya sortens text och testa alla 256 hexdecimaler där med. Som du förstår så är detta den absolut sista, desperata utvägen. Undvik den om möjlighet ges.
Och slutligen. Kolla ifall det inte redan finns en färdig tablefil på internet, eller om det finns något program som kan färdigställa en fil automatiskt. Annars finns risken att man får psykbryt efter att ha suttit två dagar i rad med något som redan fanns färdigt på internet. Tro mig, jag vet.
Lagrad DTE - Den svåra versionen
Som jag nämnde med FF3, så är det ett ovanligt enkelt exempel på att lagra DTE. Alla bokstäver ligger samlade på samma ställe i rad, och allt man behöver göra är att ändra dem en i taget. I vissa fall är det dock inte lika lätt, men det är fortfarande möjligt så länge man har färdigställt sin tablefil.
Kruxet ligger i hur DTE:n lagras. I vissa spel ligger den inte samlad som i FF3, utan varje DTE-kommando är uppdelat i två, där den första bokstaven från varje kombination befinner sig i en rad, och den andra bokstaven befinner sig i en annan rad. Dag för exempel:
Låt säga att vi har DTE:n "th", "wh", "no","be" och "at". Om dessa fanns med i FF3 så skulle de lagras så här:
"thwhnobeat"
Prydligt på rad, som du ser. Men i andra spel så bryts de itu, och den första och andra bokstaven lagras på olika rader med text. I så fall så skulle det se ut så här:
Rad 1: "twnba"
Rad 2: "hhoet"
Ser du mönstret? Tar man den första bokstave från rad 1 och 2, så bildar den DTE:n "th". Dessa två rader lagras dock sällan just bredvid varandra, och faktum är att spelets DTE kan vara uppdelat på flera olika Rad1 & 2.
Hur gör man då för att ändra på DTE:n i det här fallet? Jo, allt man behöver göra om man tex vill ändra "th", är att först ändra "t" i rad 1, och sedan gå till rad 2 för att ändra "h".
Men hur hittar man raderna? Det är här som din tablefil kommer väl till pass, men bara om du är säker på att du har fört in all DTE där. Oavsett vilket system som används för att lagra DTE, så ligger fortfarande kombinationerna på rad. Gå därför till början av din DTE i tablefilen (i FF3 är det på 80) och ta de första bokstäverna i 4-5 kombinationer. Här kommer ett exempel från FF3:
80=e_
81=_t
82=:_
83=th
84=t_
85=he
Här har du de 6 första kombinationerna från FF3. Om DTE:n nu skulle lagras på det sättet som beskrivs i det här avsnittet, så skulle jag ta ut det första tecknet från varje rad. Då skulle jag få "e_:tth" (_ betyder mellanslag). Sedan skulle jag göra an vanlig sökning med min tablefil för att hitta rad 1. Sedan skulle jag ta de fem SISTA bokstäverna (_t_h_e) och söka igen. Svårare är det inte.
Men, nu är det inte alltid säker att de 6 första kombinationerna är i samma rad. Kanske får jag bara träff om jag söker på de tre första, eller örjar på 82 och fortsätter till 85. Testa dig fram.
Library DTE
Ännu en form av DTE som gör det svårt att hitta ord. Men riktigt lika krångligt är det inte. Library DTE är nämligen bara en metod som möjliggör det att lägga in hela ord med en enda hexdecimal. Dess ord finns istället lagrade någon annanstan i spelet, och kan hittas igen lika lätt som när man söker på vanlig text.
Här är ett exempel: Låt säga att du har texten "Vad gör du imorgon?". När du söker på hela den textraden så får du sedan ingen träff. Då beror detta på att tex ordet "imorgon" är Library DTE, och lagras någon annanstans. För att hitta meningen så kan du söka på "Vad gör du", så kommer du troligen att hitta en text som lyder "Vad gör du #?". Gissa vad " # " står för?
Om du sedan vill hitta och ändra "imorgon", så gör bara en specifik sökning på just det ordet. Sedan kan du ändra det precis som vanligt. Notera dock att Library DTE kan innehålla vanlig DTE också. En hexdecimal kan med andra ord peka på en anna rad hexdecimaler, varav några är vanlig DTE. Krångligt blir det...
Inte blir det bättre när du inser att du inte bara kan skriva om Library DTE hur som helst. Om du ändrar på "imorgon" så kommer det ordet att ändras i alla meningar där det står. När du skriver om Library DTE, så ska du helst ha kollat runt lite i koden, spelat spelet och ha en klar uppfattning om vilka ord som kommer att behöva skrivas med L. DTE. I vissa fall kan det vara så att kortare meningar skrivs helt med L DTE. En mening kan tex lyda "Du fick föremålet!", men i koden se ut som "# # #!" då alla tre orden bestod av L DTE. Planera därför noga in vad du ska skriva innan du gör några ändringar.
Ofta kommer du att behöva gå tillbaka och ändra om L DTE:n för att den inte passade. Då kommer även andra meningar behöva skrivas om, men det är så det fungerar. Tålamod är nyckeln i det här fallet, inte skicklighet. Som vanligt så gäller även här att hexdecimalerna för DTE kan ge olika resultat beroende på vart dom används.
Nu var det slut. Du kan allt. Nej, inte riktigt allt, men en bra bit på vägen. Om inte
annat så har du mer än tillräckligt med kunskap för att översätta engelska roms
från och med nu. För er som siktar på japanska roms, kan ni dock gå vidare till näst
kapitel:
Att översätta Japanska spel!

