Animationsdaten PKMN Kristall Ändern
aus RHWiki, der freien Romhacking-Enzyklopädie
| Inhaltsverzeichnis |
Noch bevor es losgeht
Um diese Hackinganleitung nachvollziehen zu können, solltet ihr mindestens einmal einen Hexeditor bedient haben, natürlich das Tutorial Animationsdaten in Pokémon Kristall-Edition gelesen haben und ein Abbild des deutschen Roms haben. Desweiteren solltet ihr das Programm AgiXP zur Hand haben, damit ihr Grafiken einfügen könnt.
Vorbereitung
Wir haben eine Idee, und zeichen ein wunderschönes Pokémon, wie z.B. Knolli. Mit Animationen natürlich, weil es die ja zu ändern gilt. Wir wollen das Pokémon Nr. 2, Bisaknosp ersetzen.
Das ist das Ausgangsbild und die Animationen dafür. Wie wir sehen, ändern sich pro Animation recht wenig Tiles, und eben diese gilt es dem Spiel "beizubringen".Die Reihenfolge soll sein: Animationsnr. (Länge)
Kampf:Knolli2 (kurz), Knolli1 (lange), Knolli3 (mittel), Knolli4 (kurz), Knolli5(lange) Status: Knolli1 (mittel), Knolli3 (kurz) [kommen hinzu]
Wir werden nun anhand des Tutorials Animationsdaten in Pokémon Kristall-Edition ersteinmal die Offsets rausfinden, die wir benutzen werden.
Auszug: Animationsdaten in Pokémon Kristall-Edition
Offsets
Die Offsets der Tabellen sind wie folgt: (siehe Pointer )
| Pokémon < 0x98 | Pokémon >= 0x98 | Icognito | Ei | |
|---|---|---|---|---|
| 1. Tabelle | 34:4695 | 34:4695 | 34:6229 | 34:5696 |
| 2. Tabelle | 35:4000 | 36:4000 | 36:59A9 | 36:598B |
| 3. Tabelle | 34:64EF | 34:64EF | 34:7AD3 | 34:7ACF |
Die Offsets der speziellen Tabelle 1 sind wie folgt:
| Pokémon < 0x98 | Pokémon >= 0x98 | Icognito | Ei | |
|---|---|---|---|---|
| 1. Tabelle | 34:56A3 | 34:56A3 | 34:63D1 | 34:6222 |
Wir wollen Pokémon Bisaknosp ersetzen, also Pokémon Nr.2. Wir suchen die Offsets raus und erhalten:
| Pokémon < 0x98 | |
|---|---|
| 1. Tabelle | 34:4695 |
| 2. Tabelle | 35:4000 |
| 3. Tabelle | 34:64EF |
| 1. Spezialtabelle | 34:56A3 |
Die benutzte Angabeform des Offsets (RB:Pointer) kann man übrigens im Artikel GB-Rombänke anschauen.
Die ersten Daten
Die ersten Daten geben laut Strukturtutorial die Animationstreihenfolge an. Wir haben fünf Animationen, die wir ausführen wollen. Und zwei, die im Statusbild des Pokémons angehängt werden sollen. Zunächst sollten wir also gucken, ob wir genug Platz haben oder ggf. die ersten Daten für das Pokémon #2 umpointen müssen.
Die 1. Tabelle ist bei 34:4695 und die 1. Spezialtabelle ist bei 34:56A3. Es sind 2byte-Pointertabellen, also nehmen wir den zweiten Pointer in jeder um das Datenoffset zu finden.
Auszug aus Rom bei 34:4695 [8B48][9C48][A548][B648][C548]... [9C48] korrespondiert also mit Pokémon #2. Offset ist also 34:489C bzw. 0xD089C
Dieselbe Vorgehensweise liefert und auch das andere Offset, nämlich 0xD18A0. Da wir fünf bzw. zwei Animationen wollen, errechnen wir, dass wir (laut dem Tutorial) 0x0B bzw 0x05 Bytes an den jeweiligen Offsets brauchen bzw. Bytes, die nicht schon vergeben sind.
Bei 0xD18A0 ist es kein Problem 5 Bytes unterzukriegen, da dort original 0x0D Bytes verwendet werden. Bei 0xD089C scheitert unser vorhaben daran, dass im Originalrom nur 0x09 Bytes, also zwei weniger als wir benötigen, vorhanden sind. Hier hilft also nur umpointen. Wir suchen ein Offset an dem mindestens 0x0B 00-Bytes bzw. unbenutzte Bytes sind und werden z.B. bei D3C50 fündig. Wir pointen also in der Pointertabelle jetzt für Pokémon #2 auf D3C50, anstatt auf D089C:
[8B48][507C][A548][B648][C548]...
Die ersten Daten schreiben
An unsere beiden Offsets schreiben wir jetzt unsere jeweiligen Daten hin. Für kurz habe ich eine Wartezeit von 0x08, für mittel 0x10 und für lang eine Zeit von 0x20 genommen:
Bei D3C50: [0108][0020][0210][0308][0420][FF] (vgl. mit Tutorial) Bei D18A0: [0010][0208][FF] (und den Rest der ursprünglichen Daten ändern wir auf 00-Bytes ab)
Soweit so gut. Jetzt müssen wir die anderen Daten entsprechend anpassen!
Zwischenüberlegungen
Zunächst einmal machen wir eine Analyse unserer eigentlichen Daten. Wir müssen ja zunächst mal wissen, wo die Tiles gesetzt werden und welche Nummern sie haben. Als allererstes stellen wir jetzt ein Pokémon-Bild mit allen verwendeten Tiles (jedoch keinen Doppelten für die Animationen) her. Das sollte dann in etwa so aussehen:
Diese Breite habe ich gewählt, da man jetzt einfacher abzählen kann, da jede Zeile 0x10 Tiles besitzt. Die "Animationstiles" fangen in unserem Beispiel bei 0x19 an (da das Bild bloß 5*5 Tiles besitzt, also Tile 0x00 - 0x18 und demnach bei Tile 0x19 die "Animationstiles" anfangen).
Tiles 0x19-0x1B sind die Grasspitze links oben, Tiles 0x1C-0x1D ist der Mund, und Tiles 0x1E-0x20 sind die Augen.
Jetzt müssen wir wissen, welche Tiles ersetzt werden sollen (im Original-Bild). Dazu zählen wir von links oben beginnend die Tiles ab und merken uns die Tilenummern, die für die Tiles stehen, die wir ersetzen wollen.
Das ist das Abzählraster anhand dessen nun die Tiles gesetzt werden. Wir denken uns für jede Tilenummer ein bit; undzwar ein gesetzt, falls wir das Tile ersetzen wollen und ein nicht gesetztes wenn wir es so lassen wollen. Am Ende haben wir dann die Bytes, die wir für die dritten Daten brauchen. Die zweiten Daten sind dann die Tilenummern, die wir einsetzen werden.Wir kommen auf folgende Ergebnisse: Tilenummern: Bitabfolge
Knolli2 0x19,0x1A,0x1B: 1100010000000000000000000
Knolli3 0x1C,0x1D : 0000000010000100000000000
Knolli4 0x1E,0x1C,0x1F: 0000000110001100010000000
0x1D,0x20
Knolli5 0x19,0x1A,0x1B: 1100010100001000010000000
0x1E,0x1F,0x20
Die zweiten und dritten Daten
Als erstes errechnen wir wieder die Offsets der Daten und gucken, ob wir genug Platz haben. In unserem Fall brauchen wir für die zweiten Daten zumindest Platz für vier 2byte-Pointer (für die Animationsstufen Knolli2-5). Für die dritten Daten brauchen wir mindestens 4*0x04 Bytes Platz, da in unserem Beispiel die feste Länge der Daten 4 Bytes beträgt und wir 4 unterschiedliche Animationen haben wollen. Die zweiten Daten müssen nicht notwendigerweise umgepointet werden, da hinter ihnen ja genug Platz ist, wenn man die alten Tilenummern überschreibt. Die dritten Daten müssen aber unweigerlich überschrieben werden, da dort 1 Byte fehlt. Es sind 0x0F Bytes vorhanden für 3 Animationen im originalen Spiel. Also Platz suchen und umpointen, z.B. nach 0xD3C60.
Die zweiten Daten schreiben
Einfach am Offset pro Animation einen Pointer hinschreiben, der auf die jeweiligen Zähler und Tilenummern zeigt. Da wir jedes Mal andere Bitabfolgen haben, nehmen wir jedes Mal einen anderen Zähler, angefangen bei 0x00. Also schematisch dargestellt:
[Pointer auf X0][Pointer auf X1][Pointer auf X2][Pointer als X3] @X0: [00][191A1B] @X1: [01][1C1D] @X2: [02][1E1C1F1D20] @X3: [03][191A1B1E1F20] Die zweiten Daten wären damit komplett im Spiel drin. Jetzt fehlen bloß noch die dritten Daten, das Bild und die Pokémondaten und es sollte funktionieren.
Die dritten Daten schreiben
Jetzt nehmen wir wieder unsere Bitabfolgen von oben. Diese müssen wir zunächst jedoch noch in richtige Bytes umwandeln, da die "Leserichtung" der Bits anders herum ist und sich somit von unserer Liste unterschiedet. Wir müssen die Bits in 8er-Gruppen einmal komplett umdrehen (d.h. 010110 --> 011010 etc.). Für Knolli2 wäre das:
Knolli2 11000100 00000000 00000000 0(0000000) --> 00100011 00000000 00000000 00000000 --> 0x23 0x00 0x00 0x00
Diese Daten werden jetzt an das ausgewählte Offset einfach immer hintereinander hingeschrieben. Die Daten wären damit bereitgestellt, alles was jetzt noch fehlt ist das eigentliche Bild, die neuen Ausmaße und die Paletten. Wie man diese ändert findet sich in den Tutorials zu den Pokémondaten in Pokémon Gold, Silber & Kristall und den Pokémonbildern in Pokémon Gold, Silber & Kristall.
Wenn alles geklappt hat, sollte es so im Rom aussehen:
--Tauwasser 23:42, 2. Nov 2005 (CET)







