Strukturen

aus RHWiki, der freien Romhacking-Enzyklopädie

Inhaltsverzeichnis

Vorwort

Strukturen gibt es generell in jedem Rom. Meist sind es Tabellen mit Pointern, die auf Texte, Daten oder sogar andere Tabellen zeigen, sog. Pointertabellen. Andere Strukturen können zum Beispiel das Verhalten einer Figur steuern oder viele Daten wirksam anhand einer Indexzahl bereitstellen oder zum Beispiel Animationen oder Scriptevents steuern. Strukturen sind also sehr mächtig, aber auch sehr einfach sowohl für Programmierer als auch für Hacker.
Sie stellen außerdem Arrays und Vektoren dar, da in ihnen viele Daten gleichen Typs addressiert werden bzw. anhand bestimmter Werte genau auf einen Eintrag zurückgegriffen wird.
Aus eben diesen Gründen ist es sehr ratsam, wenn man weiß, wie man dokumentierte Strukturen versteht und für sich ausnutzt.

Aussehen

Strukturen werden immer verschieden aussehen, weil sie ja in jedem Rom oder Teil des Roms immer etwas anderes machen, daher sind sie meist nicht so einfach zu erkennen. Dokumente und Tutorials über Strukturen jedoch haben meist einen simplen Aufbau und sind recht übersichtlich gehalten.

Lesen von Dokumentationen

Auszug aus F-Zeros und Tauwassers Dokumentation der Mapheader in Pokémon Gold und Silber:


Sekundärer Mapheader: (Bekannter Teil)
===============================================
[Rahmenblock][Höhe][Breite][3-Byte Blockpointer]
[S/E-Bank][2-Byte Scriptpointer][2-Byte Eventpointer][Anbindungen]
===============================================

Wie man sieht sind alle Teile, die direkt den Mapheader betreffen in "[]" oder "()". Das wird oft bis immer so sein, da es der Übersicht große Dienste erweist. Da Strukturen in Roms immer byteweise gelesen werden, wird ein Ausdruck in "[]" oder "()" meistens für 1 Byte stehen, außer dort steht, wie hier bei „Blockpointer”, „Scriptpointer” und „Eventpointer” eine feste Größe in der Klammer. Bei „Blockpointer” steht zum Beispiel, dass es 3 Bytes sind. Demnach steht der Ausdruck [3-Byte Blockpointer] für 3 Bytes, die zusammen den „Blockpointer” ergeben.

 Auszug aus Tauwassers Scripting Dokumentation für Pokémon Gold und Silber:


[Bit-Nr. (2byte)][Trainer-Gruppe][Trainer][2byte-Pointer auf Text bei Gesehenwerden]


Wie man sieht, stehen hier keine anderen Bytes in "()" sondern die Länge der einzelnen Datenteile im „Eintrag” dieser Struktur. [Bit-Nr. (2byte)] ist also 2 Bytes lang, während [Trainer-Gruppe] und [Trainer] nur 1 Byte lang sind.

Was die einzelnen Daten wie „Bit-Nr.”, „Trainer-Gruppe” usw. bedeuten, das steht meistens gesondert unter der Darstellung der Struktur. Dort wird dann auch erklärt werden, welche Nummern womit korrespondieren. Das Hacken und Ausnutzen dieser Strukturen muss jedoch immer der Hacker wissen. Darum gibt es hier im Wiki auch Anleitungen, wie man Schrittweise etwas ändert anhand der Strukturen.

Was soll das nun alles?

Die Strukturen sind, wie schon erwähnt, für Programmierer ideal, da sie sehr einfach abzurufen und abzufragen sind und sehr viele Informationen auf kleinem Raum haben. Ein kleines Beispiel dazu:

Der Programmierer macht für jede Map eigens einen Code: (Am Beispiel der Mapheader in G/S)

Für Map1:

Rahmenblock = A0
Höhe = 07
Breite = 05
Blockpointer = A05560
S/E-Bank = 60
Scriptpointer = 7755
Eventpointer = 9855
Anbindungen = Keine

Für Map2:

Rahmenblock = 77
Höhe = 18
Breite = 37
Blockpointer = A1577F
S/E-Bank = 21
Scriptpointer = 5577
Eventpointer = 5077
Anbindungen = 3

………

Der Programmierer hat hierbei genau nach 2 Minuten keine Lust mehr.

Einfacher ist es zum Beispiel so:

Für jede Map derselbe Code:

Lade Tabellenoffset
Lade Mapnummer
Addierer = Rechne Mapnummer * Größe eines Eintrages in der Tabelle
Leseoffset = Rechne Tabellenoffset + Addierer
Rahmenblock = Leseoffset
Höhe = Leseoffset + 1
Breite = Leseoffset + 2
Blockpointer = Leseoffset + 3
S/E-Bank = Leseoffset + 4
Scriptpointer = Leseoffset + 5
Eventpointer = Leseoffset + 6

Der Programmierer hat hier sehr viel Zeit gespart und kann nun bequem alle Daten in eine große Datei hintereinander Schreiben, auf die dann "Tabellenoffset" zeigt.

Wie finden?

Strukturen kann man auf die unterschiedlichsten Weisen finden. Bei Strukturen, die auf irgendetwas zeigen, die man also anhand der Pointer finden will, ist es gut, sich so viele Details über den Umstand wie möglich zu vermerken. Die Strukturen zum Mapheader wurden beispielsweise gefunden indem man den Mappointer gefunden hat und dann festgestellt hat, dass die 2 Byte vor dem Pointer immer der Höhe und der Breite der Map entsprechen. Irgendwann hat man dann festgestellt, dass danach noch mehr Pointer kommen und dann hat man untersucht, worauf diese zeigen und so weiter.

Bei Tabellen ohne Pointer, hat man meist keine andere Chance, als mit einem relativen Suche zu suchen, oder probieren, eine Abfolge zu raten, die möglichst Sinnvoll aus der Sicht eines Programmierers ist.

Die "knackigste" Methode ist jedoch, den Assembler-Code eines ROMs durchzughen und dort nach einem Pointer oder einer Adressformel zu suchen.

Siehe auch

'Persönliche Werkzeuge