Ich wollte die Koordinaten für Healingplace in Feuerrot researchen,
aber ich weiß nicht wie man das macht.
Kann mir jemand sagen, ob ich dafür das
Logging brauch?
Research Problem
-
-
Logging: Nein, du suchst ja keine Ressourcen über die Datenströme, sondern eine Routine bzw. Bytes, die die Koordinaten repräsentieren. Deshalb Kapitel 2. Debugger. Das heißt also, dass du als Ausgangswert eine RAM-Stelle oder das Offset einer Routine brauchst, die mit der Sache, Healingplaces, zutun hat. Aus Dokumentationen im Forum, außerhalb oder selber herausgefunden. Daher musst du Breakpoints setzen mit dem VBA-SDL-H. Da du am Anfang wohl noch gar keine eigenen Research-Ergebnisse haben wirst, musst du auf die Informationen von anderen zurückgreifen.
Es würde sich lohnen special 0xC8 zu untersuchen, da es für das in Ohmachtfallen zuständig ist. Die Pointer der einzelnen specials sind in einer Table angeordnet: 0x15FCC0
Daraus ergibt sich die Formel:
Den Pointer an dieser Stelle schreibst du zu einem Offset um, und ziehst noch 1 ab, da es sich um eine thumb-Routine handelt. Die Routine könntest du dir dann mit einem Debugger ansehen, z.B. im VisualBoyAdvance, Disassembler im Tools-Menü.
In diesem Post haben dir bereits wichtige Informationen zu den Healingplaces verraten. Setze doch mal einen Breakpoint auf die Table. Inmittelbar nach dem Auslesen der Bank und Map, sollte die Koordinaten in der Routine stehen.Zum Schluss noch die Notizen von JPAN, der die Koordinaten abhängig von Variablen gemacht hat, für die englische Feuerrot:
Code- .align 2
- .thumb
- /*this code is meant to ovewrite the "choose warp" part of the
- special 0xc8 (the blackout script).
- this code uses three consecutive variables to create that warp
- because this code is much smaller than the original, it will be
- inserted over it, starting at 0x080bfd54*/
- /*this will allow the code to compile correctly, but this output
- cannot replace the one in this folder, as it's too big and would
- corrupt the package.*/
- .org 0xbfd54
- replacer_code: ldr r0, var_405a
- bl 0x6e568
- lsl r1, r0, #0x18
- lsr r0, r0, #0x8
- lsr r1, r1, #0x18
- strb r1, [r4]
- strb r0, [r4, #0x1]
- mov r0, #0xff
- strb r0, [r4, #0x2]
- ldr r0, var_405b
- bl 0x6e568
- lsl r0, r0, #0x10
- lsr r0, r0, #0x10
- strh r0, [r4, #0x4]
- ldr r0, var_405c
- bl 0x6e568
- lsl r0, r0, #0x10
- lsr r0, r0, #0x10
- strh r0, [r4, #0x6]
- b 0x0bfdf4
- .hword 0x0000
- var_405a: .word 0x0000405a
- var_405b: .word 0x0000405b
- var_405c: .word 0x0000405c
- /*Pokecenter script 0x1A8D97
- mother script (activated with 0x1) 0x1A8DD8*/
-
Also ich hab jetzt den Pointer umgerechnet, aber wo soll ich im Offset 1 abziehen mein
Zwischenergebnis ist zurzeit 0xE0FF15? -
Was du gemacht hast: Du hast mit der Formel das Offset errechnet und davon dann den ersten und dritten Byte vertauscht.
Das ist Blödsinn. Wenn du bei 0x15FFE0 landest, sieht du dort einen Pointer 7DA50C08.
Umdrehen: 080CA57D
1 abziehen, weil Thumb-Routine: 080CA57CDieses Offset kannst du jetzt im Disassembler eingeben.
Dann wirst du nur eine kleine Routine sehen, wo aber ein Callback (grün) übergeben wird (Fenster 1).
Das führt dich zur nächsten Routine (Fenster 2). -
So, ich hab das jetzt mal mit dem Debugger untersucht.
Ist das so richtig? -
Was soll man da jetzt interessantes sehen?
-
Nein, ich wollte nur wissen
ob ich es richtig eingegeben hab? -
Wenn du einen Thumb-Breakpoint auf den Anfang der Routine setzen wolltest, ja.
-
Welche Table meintest du eigentlich die ich
auslesen soll? -
Bei 0x3EE500 liegt eine Table, die die Zielmaps der einzelnen Healingplaces angibt.
Zwei Bytes für die Bank, zwei Bytes für Map. -
Also heißt die Table 04000000?
-
Nein, das ist der I/O-RAM. Die Lösung habe ich eigentlich schon genannt, man muss nur weitersehen. Schau doch einfach mal ab dem Offset, wo JPAN seine Routine eingefügt hat bzw. wo diese Table geladen wird. Wie ich mir schon gedacht habe, liegen die Koordinaten nicht weit entfernt. Das ganze fängt bei 080BFF24 an. Halte nach mov rX Ausschau, die genau die Koordinaten sind. Die Überprüfung der Mapbank und Mapnummer ist immer unmittelbar vor der X-Koordinate. Das habe ich gefunden:
Alabastia
X-Koordinate
Y-Koordinate
Pokémon-CenterX-Koordinate
Y-Koordinate
Indigo Plateau Pokémon-CenterX-Koordinate in Abhängigkeit von Mapbank 13
Es wird geprüft, ob es Mapbank 0xD ist (Indigo Plateau). Da die X-Koordinate auch 0xD ist, wird gleich der Wert von Register r1 von dem cmp genutzt. Somit kann man die X-Koordinate nicht ändern ohne die Überprüfung der Mapbank zu ruinieren.
Y-Koordinate
Eiland 1 Pokémon-CenterX-Koordinate
Y-Koordinate
Trainerturm Pokémon-CenterX-Koordinate
Y-Koordinate -
Ich kann also beim Indigo Plateau die X-Koordinate
nur schwer ändern? -
Jop,
Müssten den Code halt so umschreiben das die Überprüfung der MapBank nicht zerstört wird.Gehen tut es
Jpan's methode Funktioniert eigentlich ganz gut. Müsstest da halt nur die offsets anpassen-SoulK3
-
Ich kann übrigens sehr den No$gba Debugger über dem VBA-SDL-H empfehlen.
Der ist irgendwie einfacher zu bedienen und macht nicht so viel Probleme und ist 32 MB ROM kompatibel:
http://problemkaputt.de/gba.htm (einfach die Debug Version runterladen) -
Okay, werde ich machen.
Ich hab auch noch ein Problem, wenn ich nämlich die Koordinaten von Alabastia nehme
geht das special 0xC8 kaputt und
die Textbox nach dem Wiederbeleben hat auch ein paar
Störungen. -
Keine Ahnung, was du gemacht hast.
Du hättest einfach nur an den Offsets ein Byte ändern müssen, so wie ich: -
Das habe ich doch auch gemacht, aber ich kann es ja
noch mal bearbeiten. -
Wahrscheinlich hast du dich irgendwo vertippt oder zu viel überschrieben.
-
Ich weiß jetzt wann es auftaucht, wenn man die Map-Daten
ändert passiert das.Kann ich das nicht so machen wie in Smaragd,
wo man immer vor dem Pokemon Center landet
wenn man besiegt wurde?In Feuerrot kann ich nämlich nur im Haus aus
respawnt werden? Sonst geht das Special 0xC8
immer kaputt, hier noch der Screenshot.