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.

Knolli1: Das Grundbild von Knolli
vergrößern
Knolli1: Das Grundbild von Knolli
Knolli2: Die Spitze links oben ist anders
vergrößern
Knolli2: Die Spitze links oben ist anders
Knolli3: Mund anders
vergrößern
Knolli3: Mund anders
Knolli4: Mund und Augen anders
vergrößern
Knolli4: Mund und Augen anders
Knolli5: Spitze und Augen anders
vergrößern
Knolli5: Spitze und Augen anders
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:

Das Bild, das wir später einfügen werden
vergrößern
Das Bild, das wir später einfügen werden

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 Raster
vergrößern
Das Raster
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:

Die fertige Animation aus dem Rom entnommen
vergrößern
Die fertige Animation aus dem Rom entnommen

--Tauwasser 23:42, 2. Nov 2005 (CET)

Siehe auch

'Persönliche Werkzeuge