Mapheader PKMN GSK
aus RHWiki, der freien Romhacking-Enzyklopädie
| Inhaltsverzeichnis |
|
2.1 Pointer auf sekundären Mapheader |
Der Mapheader in Pokémon Gold, Silber und Kristall ist der Ort, wo alle Eigenschaften einer Map zusammenlaufen. Er ist in zwei Teile gegliedert, den primären und den sekundären Mapheader.
Mapheader-Einteilung
| Deutsch | Englisch (v1.0 & Kristall v1.1) | Japanisch (v1.0 und Gold/Silber v1.1) | |
| Pokémon Gold & Silber | 25:40ED | ||
| Pokémon Kristall | 25:4000 | ||
An den Tabellenoffsets stehen jeweils Listen von 2byte-Pointern, die jede auf den ersten primären Mapheader einer Mapbank zeigen.
[2byte-Pointer auf Mapbank 0x01][2byte-Pointer auf Mapbank 0x02]...
Die Einteilung wird nicht beendet!
Primärer Mapheader
Der primäre Mapheader befasst sicht größtenteils mit höheren Eigenschaften der Maps, wie etwa der Musik, Tageszeit, dem Tileset etc. Für den eigentlichen Aufbau der Map ist der sekundäre Mapheader da.
[Rombank][Tileset][Aktionsbyte][2byte-Pointer auf sekundären Mapheader][Ort][Musik][Tageszeit][Angel-Set]
Pointer auf sekundären Mapheader
Rombank und 2byte-Pointer auf sekundären Mapheader zusammen ergeben einen 3byte-Pointer auf den sekundären Mapheader. Ungeachtet dessen wird im Original nur Rombank 0x25 verwendet.
Tileset
Entspricht dem Index aus der Tabelle der Tilesetdaten.
Aktionsbyte
| 0x00 | 0x01* | 0x02* | 0x03 | 0x04 | 0x05 | 0x06 | 0x07 | |
| TELEPORT anwendbar | ✓ | ✓ | ||||||
| SCHAUFLER/Fluchtseil benutzbar | ✓ | ✓ | ||||||
| FLIEGEN anwendbar | ✓ | ✓ | ||||||
| Auf-/Absteigen vom Fahrrad | ✓ | ✓ | ✓ | ✓ | ||||
| Vom Fahrrad absteigen bei Betreten der Map | ✓ | ✓ | ✓ | |||||
| SGB-Paletten ändern | ✓ | ✓ | ✓ | ✓ | ✓ | |||
| Wasserpokémon-Animation | ✓ | ✓ | ✓ | |||||
| Hintergrundpaletten | ✓ | ✓ | ✓ | ✓ | ✓ | |||
| Map als Rückkehrpunkt Ohnmacht/Fluchtseil/SCHAUFLER/TELEPORT | ✓ | ✓ | ✓ | ✓ | ||||
| Pokémon erscheinen überall außer auf Eis | ✓ | ✓ |
Die mit * gekennzeichneten Bytes haben außerdem Einfluss auf die Spritesets. Von der Verwendung von Aktionsbyte 0x00 wird dringend abgeraten. Aktionsbyte 0x03 erfüllt denselben Zweck und alle Funktionen des Spiels bleiben funktionstüchtig.
Auf-/Absteigen vom Fahrrad
Nur auf diesen Maps wird überhaupt erst geprüft, ob man auf das Fahrrad steigen darf.
SGB-Paletten ändern
Feature für den Super Gameboy, bei dem die Maps je nach Auswahl eine andere Farbe kriegen. Der SGB2 verwendet die Farben des Gameboy Colors. Siehe Liste der SGB-Farben in Pokémon Gold, Silber & Kristall.
Wasserpokémon-Animation
Die Wasseranimationen werden jeweils zufällig aus zweien ausgewählt. Die 2. und 4. scheinen bevorzugt zu werden. Wenn dieses Aktionsbyte benutzt wird, wird die Wahl auf zwei andere Kampfeinleitungen beschränkt.
Hintergrundpaletten
Siehe Hintergrundpaletten in Pokémon Gold, Silber & Kristall. Hier wurden die Farben der Außentilesets mit Aktionsbyte 0x01 als Standard betrachtet und alle anderen als Abweichung.
Map als Rückkehrpunkt
Eine Map wird als Rückkehrpunkt für Fluchtseil/SCHAUFLER gesetzt, wenn man eine Map mit diesem Aktionsbyte betritt und von einer Map mit Aktionsbyte 0x01 oder 0x02 kommt.
Eine Map wird als Rückkehrpunkt für Ohnmacht/Teleport gesetzt, wenn obiges zutrifft und die Map das Tileset 0x06 hat.
Pokémon erscheinen überall außer auf Eis
Dies ist im allgemeinen in Höhlen der Fall. Eis sind alle Teilblöcke, die die Kollisionsdaten 0x23 oder 0x2B haben. Wenn dieses Aktionsbyte nicht verwendet wird, dann können Pokémon üblicherweise nur auf Teilblöcken mit den Kollisionsdaten 0x08, 0x18, 0x14, 0x28, 0x29, 0x48, 0x49, 0x4A, 0x4B, 0x4C erscheinen.
Ort
Entspricht dem Index aus der Tabelle der Orte auf der PokéCom-Karte.
Musik
Entspricht dem Index aus der Liste der Hintergrundmusiken.
Tageszeit
Dieser Wert ist in 4bit-Werte aufgesplittet:
- 0xX0: Der Uhrzeit entsprechend entweder morgens, mittags, abends.
- 0xX1: Mittag
- 0xX2: Abend
- 0xX3: Morgen
- 0xX4: Höhle in der Blitz einmal einsetzbar ist, danach Abend-Paletten
- 0xX5: Der Uhrzeit entsprechend entweder morgens, mittags, abends.
- 0xX6: Der Uhrzeit entsprechend entweder morgens, mittags, abends.
- 0xX7: Der Uhrzeit entsprechend entweder morgens, mittags, abends.
- 0xNX: N = 0: Telefonempfang; N<>0: Kein Telefonempfang
X bedeutet, dass es auf diese Hälfte nicht ankommt. Zusammen ergeben beide Hälften die kompletten Werte, also Uhrzeit und Telefonempfang.
Angelset
Entspricht Index aus der Liste der Angelsets.
Sekundärer Mapheader
Der sekundäre Mapheader vereint in sich die gesamten Daten, die wirklich zum Bewegen auf und Anzeigen von einer Map gebraucht werden. Im Gegensatz zum primären Mapheader enthält er vorberechnete Anbindungskonstanten und Pointer z.B. zu den Mapdaten.
Konstanter Teil: [Rahmenblock][Höhe][Breite][3-Byte Mapdatenpointer][S/E-Bank][2-Byte Scriptpointer][2-Byte Eventpointer][Anbindungen](maximal) 0x04*[variabler Teil]
Variabler Teil: [Ziel-Mapbank][Ziel-Mapnummer][2-Byte Sichtteil-Pointer][2-Byte Sichtteil-Ziel][Größe][Breite][Y-Eventlinie][X-Eventlinie][2-Byte Sichtfenster]
Konstanter Teil
Der konstante Teil ist immer vorhanden, während der variable Teil nur bei Anbindungen vorhanden ist.
Rahmenblock
Block, der am Rand und anstelle des Blocks 0x00 auf der Map angezeigt wird. Ist immer nicht begehbar. Siehe auch Mapdaten.
Höhe & Breite
Anzahl der vertikalen & horizontalen Blöcke auf einer Map.
Mapdatenpointer
Pointet auf die Mapdaten einer Map.
S/E-Bank
Rombank für die Eventdaten und den Scriptheader einer Map.
Scriptpointer
2byte-Pointer innerhalb der S/E-Bank auf den Scriptheader der Map.
Eventpointer
2byte-Pointer innerhalb der S/E-Bank auf die Eventdaten der Map.
Anbindungen
Dieses Byte bestimmt wieviele und welche Anbindungen es gibt.
- Bitweise Funktionen:
- 7-4: 0
- 3: Anbindung nach oben
- 2: Anbindung nach unten
- 1: Anbindung nach links
- 0: Anbindung nach rechts
Gesetzte Bits bedeuten, dass eine Anbindung existiert, gelöschte, dass keine existiert.
Variabler Teil
Dieser Teil wird so oft nach dem konstanten Teil wiederholt, wie es Anbindungen gibt. Die Anbindungen werden dabei dem höchsten Bit zuerst nach hintereinander abgearbeitet. Wenn es keine Anbindung in eine Richtung geben sollte, so wird die darauffolgende genommen, es entsteht somit kein Loch.
Ziel-Mapbank & -Mapnummer
Das Ziel der Anbindung wird durch ihre Mapbank und Mapnummer eindeutig angegeben.
Sichtteil-Pointer
2byte-Pointer auf den linken, oberen Block am Anfang des Sichtteils. Die Rombank wird aus dem Mapheader der angebundenen Ziel-Map gelesen.
Sichtteil-Ziel
Dieser Pointer pointet direkt in den RAM wo die aktuelle Map hinein geladen wird. Alle unten stehenden Rechnungen sind LE-Rechnungen.
Richtung der Anbindung - Rechnung für den korrekten Wert (ausgehend von einem Anschluss am Rand der aktuellen Map) Oben 0xC703 + X_Verschiebung_des_Sichtteils_in_Blöcken Unten 0xC703 + (Höhe_der_aktuellen_Map + 0x03) * (Breite_der_aktuellen_Map + 0x06) + X_Verschiebung_des_Sichtteils_in_Blöcken Links 0xC700 + (Breite_der_aktuellen_Map + 0x06) * (Y_Verschiebung_des_Sichtteils_in_Blöcken + 0x03) Rechts 0xC6FD + (Breite_der_aktuellen_Map + 0x06) * (Y_Verschiebung_des_Sichtteils_in_Blöcken + 0x04)
Die Verschiebungen sind dementsprechend die relative Positionierung zur eigentlichen Map hin. Unten folgt ein Beispiel mit allen relevanten Daten markiert.
Größe & Breite
Größe des Sichtteils in Blöcken.
Richtung der Anbindung - Wert Oben/Unten Breite des Sichtteils. Links/Rechts Höhe des Sichtteils.
Der jeweils andere Wert ist automatisch 0x03. Also ist eine nach oben/unten angeschlossene Map automatisch mit Größe Blöcken horizontal und 0x03 Blöcken vertikal zu sehen. Bei Anbindungen nach links/rechts entsprechend andersherum, 0x03 Blöcke horizontal und Größe Blöcke vertikal. Unten folgt ein Beispiel mit allen relevanten Daten markiert.
Die Breite gibt immer die gesamte Breite der angeschlossenen Map an. Dieser Wert ist wichtig, damit die korrekten Blöcke im Sichtteil dargestellt werden.
Y- & X-Eventlinie
Relative X- und Y-Positionen des Spielers nach erfolgtem Mapwechsel.
Richtung der Anbindung - Rechnung für korrekten Wert (ausgehend von einem Anschluss am Rand der aktuellen Map)
Y:
Oben (Höhe_der_angebundenen_Map * 0x02) - 0x01
Unten 0x00
Links/Rechts (Y_Verschiebung_des_Sichtteils_in_Blöcken * -0x02)
X:
Oben/Unten (X_Verschiebung_des_Sichtteils_in_Blöcken * -0x02)
Links (X_Größe_der_angebundenen_Map * 0x02) - 0x01
Rechts 0x00
Sichtfenster
Dies gibt die Ramposition des oberen linken Blockes der auf dem Bildschirm nach dem Mapwechsel zu sehen ist an.
Richtung der Anbindung - Rechnung für den korrekten Wert (ausgehend von einem Anschluss am Rand der aktuellen Map) Oben 0xC701 + Höhe_der_angebundenen_Map * (Breite_der_angebundenen_Map + 0x06) Links 0xC706 + 0x02 * Breite_der_angebundenen_Map Unten/Rechts 0xC707 + Breite_der_angebundenen_Map
Beispiel
---/¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\--- X-Größe der aktuellen Map in Blöcken
+++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++
+++XXXXXXXXXXXXXXXXXXXXXXXXX+++¯¯\
+++XXXXXXXXXXXXXXXXXXXXXXXXX+++ |
+++XXXXXXXX/¯¯¯¯¯¯¯\XXXXXXXX+++ |
+++XXXXXXXX| Map 1 |XXXXXXXX+++ ├- Y-Größe der aktuellen Map in Blöcken
+++XXXXXXXX\_______/XXXXXXXX+++ |
+++XXXXXXXXXXXXX┏━━━━━━━┓┄|┄┄X-Größe des Sichtteils in Blöcken
+++XXXXXXXXXXXXX┃ XXXXXXXXXX+┃_╱
++++++++++++++++ZZZZZZZZZZZZZZZ########¯\
++++++++++++++++ZZ Sichtteil ZZ######## |
++++++++++++++++ZZZZZZZZZZZZZZZ######## |
---|-----------|####################### |
---|-----------|#######/¯¯¯¯¯¯¯\####### |
---|-----------|#######| Map 2 |####### ├- Y-Größe der angebundenen Map in Blöcken
---|-----------|#######\_______/####### |
---|-----------|####################### |
---|-----------|####################### |
---|-----------|####################### |
---|-----------|#######################_/
---|-----------|\_____________________/___ X-Größe der angebundenen Map in Blöcken
---|-----------|
---\___________/_ X-Verschiebung der angebundenen Map in Blöcken
X ist ein Block auf der aktuellen Map 1, # ein Block auf der angebundenen Map 2. Z ist ein Block im Sichtteil, der selbst Teil der angebundenen Map 2 ist. + ist ein Rahmenblock der aktuellen Map 1.





