Kapitel 9: Pointers

Pointers

Du behöver:
Final Fantasy 3 (Snes) rom
Thingy32

Vi det här laget förväntar jag mig att du kan räkna någorlunda bra i hex. Dessutom bör du ha vant dig vid att kolla på hexdecimal kod i Thingy32 och att skapa tablefiler. Det är fullt möjligt att göra en översättning utan att jobba med pointers, men kunskap om hur dom fungerar tenderar att göra saker så mycket enklare, och dessutom leder det ofta till ett bättre resultat.

I exemplen här kommer vi inte att utföra några sökningar. FF3 innehåller en slags text-koprimering som jag kommer att gå in på lite senare, så tills vidare kommer jag att ge ut adresserna till de textstycken vi ska jobba med.

Med andra ord: Nu är du ute på avancerade vatten. Lär dig hellre steg 1-8 först innan du simmar vidare.

Vad är då en pointer?

En direkt översättning ger oss ordet pekare, så vi kan sluta oss till att det är ett stycke kod som "pekar" på något.

Det som pekas ut, är för övrigt text. All kod som en rom har är unik för just det spelet (men inte för just den rom:en). Det som däremot gäller för alla roms, är att när det blir dags att ladda upp text på rutan, så har dom inte en suck om vilken text som ska visas upp. För att få reda på det, går spelet till ett stycke kod som pekar på den den text som ska visas, följer anvisningarna, och bingo. En pointer är använd.

Men hur fungerar själva pekandet? En pointer pekar bara på den första bokstaven i textstycket som ska visas. Sedan läser spelet vidare tills den kommer till ett stycke kontrollkod som säger att "nu är texten slut". Här följer ett exempel som visar hur det fungerar (* betyder det ställe som pointern pekar på):

             *                 *
#####Hej på dig!/Vad gör du?/#####

Som du ser så pekar vår tänkta pointers på "H" i "Hej" och på "V" i "Vad". Sedan läses texten fram till " / ", som ska föreställa en hexdecimal som deklarerar ett slut på texten. Notera att alla " # " bara är till för att få det hela att se mer "Thingy-aktigt" ut. Själva textstycket är 23 tecken långt.

Så, vad är då pointers bra för? Nu ska jag använda mig av ovanstående två meningar, men den här gången ska jag skriva om dem lite. I nästa exempel ska jag göra den första meningen kortare, och använda utrymmet som blev över till att förlänga meningen som kommer efter. Den totala mängden text/kod är dock densamma.

             *                  *
#####Men hej!/Vad görs då!?/#####

Märker du vad som hände? Trots att jag skrev om meningarna så att den första meningen blev lite kortare, och den andra blev lite längre, så stannade ju mina pointers kvar. Resultatet blir följande när man spelar spelet:

"Men hej!" (Den här meningen ser bra ut. Man börjar att läsa på "M", och fortsätter till " / " som vanligt)

"d görs då!?" (Inte lika bra. Eftersom vår pointer fortfarande pekar på det ställe som V:et stog på förut, så kommer inte längre "Va" med i texten.)

För att råda bot på detta, så måste vi flytta vår pointer från "d" till "V", så att det ser bra ut igen. När vi har gjort detta, så har vi till slut uttnyttjat pointers för att justera två texters längd.
Slugiltigt exempel:

*               *<(*)
Men hej!/Vad görs då!?/

Resultat: "Vad görs då!?"

 

Ja/Nej & Yes/No

Du kanske undrar varför man skulle vilja göra något som liknar det ovanstående exemplet? Här har du svaret:

För de som har översatt engelska spel förut, så vet ni att man förr eller senare träffar på ett spel där man (i spelet på menyer och dyl.) får välja antingen "Yes" eller "No" (Ja och Nej). Ok, tänker ni, det är väl bara att översätta till Ja och Nej då.

Men icke! Allt för ofta ser det ut så här i koden:

*     *
Yes/No/

" / " representerar en kontrollkod som säger att texten är slut. Och vad händer om du ändrar det till:

*     *
Ja/Nej/

Jo, resultat blir så här:

Ja
ej

Illa illa. Bokstaven "N" försvinner ju. Men, om ni kan hitta er pointer så behöver ni bara justera den så att den pekar på "N" istället för "e", och därmed så ser det bra ut igen.

Notera att långt ifrån alla spel använder sig av det här systemet, men tillräckligt många gör det för att det ska vara värt att nämnas. Fast alla språk är inte det inte lika illa med. Japanskan använder två tecken för att skriva ordet "ja" ([ha][i]) och tre tecken för ordet "nej" ([i][i][e]) så där har man inga problem.

Ett gör-det-själv exempel

Hittils har vi pratat om själva principen bakom att flytta runt pointers, samt var det kan vara bra att göra det. I början kan det dock vara lite krångligare än så, men vi ska ta ett gör-det-själv-exempel med hjälp av Final Fantasy 3. Öppna därför din FF3-rom i Thingy32 (samt din tablefil), och förflytta dig till början av textblocket med dialog . För att göra detta, kan du trycka "J", markera "Början på dialogen" och tryck sedan på "OK". På så sätt förflyttas du till position (0)D0200. Det vi ska koncentrera oss på, är dock bara en enda pointer. Den som pekar på "V" i "VICKS", i texten som är markerad nedan:

Thingy, FF3

Pointern för texten på bilden ser ut så här (*=pointer):

*
VICKS: Think it's still alive? Wedge: Probably_ _judging from the urgency of our orders.###/

Texten börjar enligt pointern på "V" i "VICKS" och slutar efter ### (kontrollkoder som du kan strunta i) med ett " / "(som är hexdecimalen 00). Hur ser man då att det finns en pointer där? Det gör man inte. Men man kan se att det är där som texten börjar (eftersom, just före VICKS, så finns det ett " / ", som visar att den föregående meningen tar slut där), och i 99 fall av 100 så pekar pointers på textens början. Man kan även spela sig fram till dialogen och konstatera att det inte står något annat före (än den mening som står före i Thingy32).

Med det vill jag ha sagt, att alla spel har pointers. Där ett textstycke börjar, där finns det en pointer. De enda gångerna du inte behöver besvära dig, är när du översätter ett spel som saknar text. Hmm...

Det vi ska göra nu, är att flytta på pekaren lite. Vi ska få den att peka på "s" i "still" (finns i samma mening). Innan jag börjar förklara, så behöver du bara följa stegen som följer här (beskrivningen av vad du egentligen gör kommer senare). Men innan du börjar, öppna upp FF3 i Snes9x och spela dig fram till dialogen som vi ska ändra. Om du har en korrekt rom så borde det se ut så här:

Snes, FF3
Den här dialogen kommer bara en minut eller så in på spelet.

Så, öppna upp FF3 i Thingy om du inte redan har gjort det (med din tablefil).

1. Tryck på J i Thingy för att få upp "Jump-rutan".
Thingy_Jump.jpg (18943 bytes)

2. Tryck på Manual Adress, och skriv in &HCE804, tryck sedan OK.

3. På det sättet kommer du till början av FF3:s Pointertable, den plats i rom:en som alla pointers sparas på (du kommer att få lära dig hur du hittar den själv längre ned på sidan). På den nedre bilden ser du vart du borde befinna dig nu (titta på den omarkerade rutan i vänster fält). Den högra rutan är ointressant, eftersom vi måste titta på hexdecimalerna.

Thingy, FF3

4. Om du gjort rätt så borde den röda rutan nu befinna sig på 00 som på bilden. Flytta nu rutan till 59, som ligger två steg åt höger (det gör du genom att trycka höger på piltangenterna två gånger):

Thingy_FF3.jpg (4729 bytes)

Hamnade du någon annan stans än på 00 så gör det inget. Flytta bara till 59 i alla fall. Tryck sedan på "mellanslag" en gång, så att det står "Selecting" i övre vänstra hörnet.

Efter det så flyttar du markören två steg åt höger så att den nu står på A0:

Thingy_FF4.jpg (4776 bytes)

Trck på mellanslag igen, så markeras hexdecimalerna 59 och 00. Du borde nu få upp rutan som man skriver in text i.

5. Som du säkert kan gissa så är det dags att fylla i en ny pointer (för det är vad du just markerade, en pointer!). Men, nu så lämpar det sig att fylla i hexdecimaler utan att för den skull behöva lägga in dem på en tangent. Tryck därför på @ (Alt Gr+2) så får du upp en ny ruta:

Thingy_at.jpg (4214 bytes)

Här skriver du "68", så fyller thingy i 68 på den nedre raden, och # på den övre. Sendan trycker du @ igen (utan att trycka bort Skriv-in rutan) för att få upp samma ruta igen. Den här gången skriver du in "00". Sedan trycker du på Retur, så är du klar sen.

6. Öppna om FF3 i Snes9x igen, så kommer du att se följande resultat när du kommer till dialogen igen:

Snes, FF3

Grattulerar! Nu har du ändrat din första pointer! Men för att förstå vad du egentligen gjorde, så rekommenderar jag att du läser vidare.

 

Vad som egentligen hände.

Från början hade vi vår text, med pointer och allt som såg ut så här:

*
VICKS: Think it's still alive? Wedge: Probably_ _judging from the urgency of our orders.###/

Vår text pekade på block 00 (59 00) och på position 59 (59 00) i det blocket. Efter att vi hade flyttat pointern till en hexdecimal som låg nio steg framåt genom att öka den från 59 till 68, så såg det ut så här:

                               *
VICKS: Think it's still alive? Wedge: Probably_ _judging from the urgency of our orders.###/

Obs! Bry dig inte om att räkna bokstäver. Sätt markören på "V" och tryck höger nio gånger så hamnar du på "s". Varför Thingy hoppar över vissa bokstäver ska jag förklara i DTE-kapitlet.

Om du inte förstår, så testa att he markören på "s" i"still" (gå till D0200 för att hitta texten).

Titta nu på "Position" uppe till vänster. Vilken hexdecimal står längst till höger? 68, eller hur? Och det var ju det (68 00) som vi skrev in i den här rutan:

Thingy_at.jpg (4214 bytes)

Om vi hade velat peka på "P" i "Probably" så hade vi skrivit in 78 istället för 68 (kolla så får du se, sätt markören på "P").

Så, vad är det nu jag försöker komma till egentligen? Kan man bestämma värdet för en pointer bara genom att sätta markören på den bokstav/kontrollkod/annan hexdecimal som man vill peka på?

Svaret är: Ja, det kan man. Men först måste man veta hur man räknar ut en pointer, det är nämligen inte bara hexdecimalen till höger som räknas.

 

Hur man räknar ut en Pointer.

Först och främst, så räknas pointers till olika system ut olika. Det vi ska lära oss är hur man räknar ut pointers till Snes, eftersom de är de odiskutabelt lättaste att lära sig. Men principen för pointers är densamma för alla format, så med undantag för själva "formeln" som används för att räkna ut en pointer, kan resten av informationen här användas på alla system (Nes, Snes, GB etc).

Då börjar vi. Nyckeln till det hela är givetvis först att hitta sin pointer. Dessvärre så måste man veta hur man räknar ut den först, annars kan man få problem. För att räkna ut en pointer så använder man sig av det Offset som man får av "Position" (alltså, med offset så menar jag raddan med hexdecimaler som står just efter Position).

Här är processen stegvis, där vi ska räkna ut den ursprungliga pointern för texten som vi ändrade i exemplet ovan. Om du inte är så haj på att räkna i hex så rekommenderar jag att du använder en kalkylator.

1. Sätt markören på den första bokstaven i texten, och läs av offset från Position. I det här fallet så borde det stå D0259 (om man sätter markören på "V" i "VICKS", och det är det som du ska göra nu).

Thingy, FF3
Detta är texten du jobbar med nu.

2. Ta bort alla siffror utom de FYRA sista. Vi får 0259 (0D åker bort).

3. Nu har du ett hexdecimalt tal. Dra bort 200 hex från talet. I kalkylatorn slår du bara på hex, skriver in 259 (egentligen så skulle du skriva 0259, men kalkylatorn bryr sig inte om nollor som står före talet) och tar minus 200.

STOPP STOPP STOPP! Vad var det där med "minus 200" kanske du undrar? Jo, när man dumpar en rom, så lägger man in en Header (ett stycke kod) som gör att spelet fungerar ordentligt. På snes roms är dessa headers 200 byte, så därför måste vi dra bort 200 från vår position för att få det tal som programmerarna använde när de gjorde spelet.

4. Nu har du troligtvis fått 59 (duh, 259-200) men glöm inte att nollorna finns där ändå. Talet vi började med hade FYRA siffor, så talet vi har fått är 0059.

5. Bryt isär talet i två bitar: 0059 -> 00 59

6. Byt plats på dina två nya tal. 00 59 -> 59 00

7. Presto, du har din nya pointer. För att kolla, så har du här en bild (igen) från FF3:s pointertable (samma som ovan).

Thingy_FF3.jpg (4729 bytes)
59 00, eller hur?

Tror du att det var en tillfällighet att vi fick 59 00 när vi räknade ut pointern för "V", och att just det stycket försvann när vi drog om det till "s"?

Icke! 59 00 är pointern som pekar på "V" i "VICKS"!

Nu ska vi ha lite kul. För att bli av med de ändringar vi gjorde i vår rom, så kan du radera den och ta en ny kopia av din ursprungliga FF3-rom som ligger någon annanstans på din dator. Därefter öppnar du din nya kopia i Thingy32 och hoppar som vanligt till början av dialogen.

Det vi ska göra nu, är att ändra samma pointer igen, men nu ska vi inte öka värdet från 59 till 68, som bara flyttar fram pointern några steg, utan vi ska ta fram en pointer som leder till ett helt annat textstycke. Nu skulle det vara kul att be dig som läsare välja en egen text, men då blir det omöjligt att ge exempel.

Av den anledningen, har jag valt följande text:

"SOLDIER: Open this door!*We want that girl!*She's an officer of the Empire!/"

(Notera att * inte betyder pointers. det är bara kontrollkod som är inlagd på *-tangenten.)

Texten ovan finns på offset D0795, så tryck "J" och hoppa dit (med Manual Adress). Så här borde det se ut:

Thingy, FF3

Nu tar vi och läser av offset från "Position". Visserligen visste du redan om värdet eftersom jag just gav dig adressen hit, men låstsas som om du hittade hit själv. Sedan tar vi om processen stegvis igen:

1. Läs av "Position", så ser du att "S" i "SOLDIER" befinner sig på D0795. Anledningen till att vi kollar på "S" är att den bokstaven ju är först i textstycket.

2. Dra bort alla siffror utom de fyra sista: 0795

3. Dra bort 200 i hex från talet: 0595

4. Dela talet: 05 95

5. Byt plats på de två talen: 95 05

6. Du har din pointer. 95 05 pekar på "S" i "SOLDIER".

Nu tar vi och hoppar bakåt till din pointertable som ligger på CE804 (skriv &HCE804 i Manual Adress). Hitta igen 59 00 (den pointer som vi räknade ut för VICKS). Markera sedan 59 och tryck mellanslag. Markera A0 och tryck mellanslag.

Thingy_FF3.jpg (4729 bytes) Thingy_FF4.jpg (4776 bytes)

I rutan som kommer upp trycker du @.

Thingy_at.jpg (4214 bytes)

Fyll i 95. Tryck @ en gång till, och skriv 05. Nu har du fyllt i din nya pointer (95 05) och på så sätt ändrat på 59 00 till att peka på 95 05 istället. Mer än så var det inte, så nu kommer vi in på hur man hittar igen sitt pointertable. Om du gjorde rätt så ska det förresten se ut så här:

Snes, FF3

En liten beskrivning av vad som hände innan vi går vidare bara. Spelet var programmerat att kolla på CE804 efter den pekare som väljer vilken text som ska visas. Det enda vi gjorde var att ändra den pekaren så att den pekade någon annanstans istället. Det enda som vi inte kan ändra, är mängden pointers, och vart dom förvaras någonstans (dvs, du kan inte flytta på 59 00 så att den pointern läggs någon annan stans, men varför skulle du det?)

Att hitta sitt pointertable.

Vart ligger alla pointers då? Inte helt oväntat så ligger de oftast rakt ovanför textblocket som dom pekar på. Ibland (som i FF3) så har man bara ett texblock (som är JÄTTE stort) och en massa pointers rakt ovanför (Nja, först ligger det en massa FF emellan, men sen kommer de).

Hur ser man då att ett stycke med till synes slumpmässiga hexdecimaler tillhör ett pointertable? Jo, ett pointertable följer alltid ett visst system, nämligen att varannan hexdecimal är konstant. Här är ett exempel:

25 00 6D 00 89 00 D7 00 3F 00

Ser du mönstret? Varannan hexdecimal är 00, eftersom flera textstycken ligger på samma block (00) i koden.

Vad jag menar med det, är att tex pointern 59 00 pekar till blocket 00, samt den 59:e hexdecimalen i det blocket. Nästa pointer är A0, även den från blocket 00. Men till slut så tar det slut på utrymme i 00, så då ökar siffran till 01:

ED 00 F9 00 08 01 0F 01 17 01 29 01 etc

Hexdecimalerna emellan kan vara oregelbundna, men i övrigt så finner man alltid mönstret som går från 00 till 01 till 02 ända upp till FF. Leta därför efter ställen i koden där varannan hexdecimal alltid är densamma och ökar steg för steg efter ett tag.

Ifall du fortfarande inte greppar det här, så har jag här gett ett exempel på ett av de "block" som jag pratar om. Termen "block" är dock bara min personliga benämning. Detta föreställer block 00, som texten med Vicks (Det vi ändrade på i FF3-exemplet) stog skrivet i. Varje hexdecimal som du ser här nere representerar en unik position i blocket (och i rom:en), och rymmer en (och endast en) hexdecimal där. Vicks dialog började på 59 (du vet, hans pointer var ju 59 00), men vi ändrade den så att den pekade på 68 istället. Dock ändrade vi inte på blocket (från 5900 till 6800, alltid 00), så med andra ord sköt vi bara fram pointern 15 steg till "s", som låg på 68. Efter Vicks dialog så börjar nästa text på A0, forfarande inom samma block. Men när vi har kommit till FF så går det inte att öka mer, istället så kommer vi till block 01, som ser likadant ut. Detta är grundprincipen bakom ett Hex Offset, och är anledningen till varför den andra siffran i Pointers hela tiden ökar, ju längre fram i texten som den pekar.

00
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
50 51 52 53 54 55 56 57 58 59 V 5A 5B 5C 5D 5E 5F
60 61 62 63 64 65 66 67 68 s 69 6A 6B 6C 6D 6E 6F
70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF

Ifall du inte tror mig så kan du alltid öppna upp FF3 i Thingy, och hoppa till dialogen. Skrolla upp en bit, så ser du en massa FF. Fortsätt längre upp, så kommer du att se botten av FF3:s ANDRA pointertable. Man kan tydligt urskilja mönstret som finns där. Ser du det inte, så sätt markören någonstans, och kolla sedan på den vänstra rutan. Tryck åt höger på piltangenterna, en hexdecimal i taget, så måste du märka det efter ett tag.

Och det tar oss till den sista saken man bör veta om pointers. Oftast så ligger dom bredvid varandra. Så, om jag vet min pointer för "text 1", och jag vill veta pointern för "text 2" (som kommer just efter "text 1") så ligger ofta "pointer 2" direkt efter "pointer 1". Svårare än så är det sällan (med vissa undantag). Om du vill testa, så räkna ut pointern för textstycket som ligger efter VICKs dialog (den på 59 00). Du kommer att se att den pointern lagras precis efter 59 00, samt att ändå nästa stycke har sin pointer precis efter det.

Krångligt? Om jag säger så här då:

Texten står såhär: Text 1, Text 2, Text3.

Pointern lagras såhär: P1, P2, P3.

Hittar du pointern för text 1, så behöver du oftast bara kolla ett steg till höger för att hitta pointern för text 2.

 

Begränsningar

Så, nu när vi har hittat vårt pointertable i FF3, betyder det att vi kan peka om våra texter vart som helst? Tyvärr så går det inte, och här har du orsaken till det:

Våra pointers i FF3 är 4 byte stora (binärt språk, se det som två hexdecimaler istället). Det lägsta värdet vi kan göra med två hexdecimaler är 00 00, och det högsta är FF FF. Men tänk om det finns text på en större yta än så? Det finns det i FF3, och av den anledningen så har spelet 2 stycken med pointers (den som finns närmast textblocket är nr.2). Således kan man inte peka på texter blocken emellan, utan är begränsad till sitt eget block.

Ex: Säg att du har pointern 59 00 i block 1, och vill peka på A8 36 från block 2. Om du bara ändrade 59 00 till A8 36, så skulle den ju fortfarande peka på A8 35 i block 1, eller hur?

Det enda sättet att peka mellan blocken vore ifall våra pointers bestod utav 3 hexdecimaler. Då skulle vi ha  59 00 01, och skulle kunna peka på  A8 36 02.

Men sån tur har man sällan. Oftast står pointers med 2 hexdecimaler.

 

Söka efter Pointers

Ifall man nu inte hittar sitt pointertable, men är säker på vilken formel som används för att räkna ut de aktuella pekarna, så kan man även leta reda på pointers med en vanlig sökning. Det hela går till så här:

1. Räkna ut din pointer.

2. Gör en sökning (tryck "S")

3. Tryck @ för att fylla i hexdecimaler.

4. Fyll i så många hexdecimaler som du vill leta efter (oftast två)

5. Sök. Men vänta lite.....

Risken är stor att du kommer att få in många träffar som inte har något med pointers att göra. Har du tur så är det inte med än ett par hundra stycken, och det är inget man vill sitta och kolla igenom var för sig.

Så, för att öka träffsäkerheten, så kan man söka på flera pointers samtidigt. Räkna bara ut pointers för ett par texter som ligger på rad, och gör sedan en sökning ingen.

Ex: Anta att jag vill hitta 78 D9. Då skule jag dessutom räkna ut pointers för nästkommande tre stycken också, så att jag kan söka på:

78 D9 8A D9 95 D9 AF D9
(Alla tal är slumpmässiga exempel)

Ett annat program som jag tyvärr inte kan erbjuda pga licensskyddet, är Hex Workshop. Detta program kan söka uppåt (Thingy söker bara nedåt), vilket gör att man kan göra en sökning rakt ovanför sin text, istället för att börja från början. Detta kan komma väl till pass, då vårt pointertable ofta ligger rakt ovanför texten. En sökning uppåt ger då ofta rätt träff på en gång.

 

Övrig info

Nu har vi lämnat alla tidigare exempel bakom oss. Här tänkte jag lägga lite strö-info om andra format mm, dock utan bilder. Vi kan börja med Nes pointers.


Nes pointers

Dessa räknas ut på ett sätt som skiljer sig lite från Snes, med preincipen är densamma. Här har du proceduren i steg-för-steg-format:

1. Läs av din Position (Det här har du gjort förut)

2. Dra bort 10 för Headern (10, inte 200 som för Snes)

3. Ta ut de fyra sista siffrorna (verkar det bekant?)

4. Bryt isär dem och...

5. Just det, byt plats.

Där har du din pointer. Notera att det finns fler system till Nes som inte står här. Om du är intresserad att pröva ovanstående metod, så vet jag dock med säkerhet att Final Fantasy (till Nes) använder det här systemet, annars finns det andra dokument på internet (engelska dock) som täcker andra format.

GB pointers

Pointers till Gameboy och Gameboy Color räknas i stort ut som Snes Pointers, med undantag för att man inte drar bort 200 för headern. Istället så utför man en annan beräkning som visas här nedan.

Hur man räknar ut en Pointer till GB/GBC:

1. Läs av Position för att få ett Hex Offset.

2. Ta bort alla siffror utom de fyra sista.

3. Här kommer det nya elementet. Om texten som du söker efter pointers till ligger mellan:

X0000-X3FFF så lägger du till 4000
X4000-X7FFF så gör du ingenting
X8000-XBFFF så drar du av 4000
XC000-XFFFF så lägger du till 8000

4. Därefter bryter du isär talet och byter plats, precis som till Snes.

Nu har du har din pointer. Bokstaven X kan symbolisera vilken siffra som heldst.

En annan viktig sak är att alla pointers i GB-spel lagras mellan 4000 och 7FFF.


Allt är inte alltid pointers

I vissa fall så använder spel sig inte alltid av pointers, utan av annan kod för att bestämma var text börjar/slutar. Ett exempel är Yes/No-exemplet som vi hade i början av kapitlet. Det såg då ut så här:

*     *
Yes/No

Men, det är inte alltid som ett spel använder sig av pointers för att bestämma var Yes och No slutar. I vissa spel så kan man flytta runt sin hexdecimal som skiljer Yes och No åt, utan att någon bokstav försvinner. Somliga spel är nämligen bara programmerade att läsa tills dom får input att raden är slut. Sedan tolkar dom det som att nästa text börjar automatiskt, oavsett var den texten börjar. Om det här lät obegripligt, så kommer jag att ta upp det i ett separat kapitel, där vi kommer att jobba med Yes/No i Pokémon (Woppie!).

Även andra saker som var texter börjar kan styras av tex kontrollkoder, hellre än pointers. Dessa ligger då inte inbäddade i texten, utan kanske före alt. efter. Med lite otur så är de benägna någon helt annan stans, och då får man problem om man måste hitta dem.


Ibland så kan man låta det vara...

Okej, pointers säger jag. Bra säger du. Inte alltid säger jag...

Jo, pointers är en bra sak att kunna, men allt är inte till godo jämt. Om man använder pointers så kan man som sagt utnyttja sitt överblivna utrymme bättre, genom att skriva något annat där, och flytta pointers för närliggande texter dit istället. Men resultatet av detta blir, att om man skulle vilja ändra texten som man har tryckt ihop, så är ju det extra utrymmet borta (eller rättare sagt använt till annat). Därför kan det ibland ha sina fördelar att låta texternas ursprungliga storlek vara, utifall att man vill gå tillbaka och göra ändringar (som innebär att man behöver mer plats) senare.

I andra fall så ska man bara låta det vara i alla fall. Med Nes/Snes/GB roms och dylika format, så går det ju bra att ändra runt lite som man vill, men när man börjar komma upp i N64/PSX/Saturn så blir det svårare. Koden är betydligt mer instabil till de mer avancerade formaten, och det kan ha sina fördelar om man inte mixtrar med koden mer än nödvändigt. Såvida man nu inte har lite mer gedigna kunskaper om programmering vill säga. Ett exempel jag skulle kunna ta på detta, är att när jag ändrade ett radbyte i en meny på Zelda64: OOT så sket sig all grafik i det rummet som menyn befann sig i. Detta gäller inte på alla menyer i spelet, men ibland så brukar jag försöka att ändra så lite som möjligt.


Vidare till nästa kapitel: DTE.