Vorwort
Da ich das ganze Zeug vom Aufbau der Map etc. mir angeguckt habe,
habe ich mir gedacht, dass ich das hier veröffentliche, weil viele Anfänger mit den Maps Probleme haben.
Vielleicht bleibt bei den Anfängern ein paar Sachen hängen und können dieses Wissen nutzen.
An sich wird das eine kleine Übersicht, da es nicht viel zu diesem Thema zu sagen gibt, aber es wird alle nötige erklärt,
was man braucht um eine eigene Struktur zu schreiben.
Inhaltsverzeichnis
0.Hintergrundwissen
1.Mapbank-Header
2.Mapbank
3.Map-Header
4.Mapfooter-Table
5.Mapfooter
6.Maps
6.1.Map Tile Daten Struktur
6.2.Map Gehdaten Struktur
7.Events
7.1.Eventmenge
8.Anbindungen
9.Wilde Pokémon Header
9.1. Wilde Pokémon Daten
0.Hintergrundwissen
Byte = 8 Bits
Hword(Halfword) = 2 Bytes
Word = 4 Bytes
Words und Hwords werden ins ROM LE Encoded (Little Endian = Byteverkehrt).
Das heißt, dass der Pointer 0x08010203 ins ROM als 0x03020108 geschrieben wird.
Ein Pointer ist immer ein Word groß, also 4 Bytes.
1.Mapbank-Header
Im Mapbank-Header befinden sich Pointer die auf die jeweilige Mapbank zeigen.
Aufbau:
Pointer zu einer Mapbank
2.Mapbank
Die Mapbank beinhaltet Pointer zum Mapheader der jeweiligen Map.
Wenn man also zwei Maps in der Bank hat, dann würde in der Mapbank zwei
Pointer auf den jeweiligen Mapheader der Map zeigen.
Aufbau:
Pointer zum jeweiligen Map-Header
3.Map-Header
Der Map-Header befindet sich in jeder Map gleich am Anfang, er ist also der Kopf der Map.
In ihm werden sämtliche Einstellungen der Map getroffen.
Aufbau:
Gesamt: 28 Bytes
[Pointer auf Mapfooter Offset][Pointer auf Event Offset][Pointer auf Mapscript Offset]
[Pointer zum Anbindungs Pointer Offset][Hintergrund Musik hword][map index hword]
[Name des Ortes byte][blitz byte][Wetter byte][Map Typ byte][Fahrrad(1 für erlaubt und 0 für nicht erlaubt byte]
[Namen beim Betreten anzeigen byte][Etagen(z.B. Erdgeschoss, 1.Etage etc.) byte][Kampf-Typ byte]
Das einzige was ich vielleicht noch erwähnen sollte ist, dass der Map Index für den richtigen Mapfooter ist.
Also sprich in der Mapfooter-Table ist der erste Mapfooter die 1 und die würde man dann im ersten Map-Header bei Map-Index eintragen.
4.Mapfooter-Table
In der Mapfooter-Table werden alle Mapfooter gesammelt und werden nummeriert ab 1 aufsteigend.
Diese Reihenfolge wird als Map Index bezeichnet der im Mapheader steht.
Aufbau:
Pointer zum jeweiligen Mapfooter einer Map (word)
5.Mapfooter
Der Mapfooter ist das Ende der Map und beinhaltet unter
anderem auch den Pointer auf die Map.
Aufbau:
Gesamt: 28 Bytes
[Map-Breite hword][00][00][Map-Höhe hword][00][00][Pointer zum Randoffset][Pointer zum Map-Offset][Pointer zum Tileset-Teil1]
[Pointer zum Tileset-Teil2][Rand-Breite byte][Rand-Höhe byte][00][00]
Hierzu muss ich denke ich nicht viel hinzufügen, außer dass die Randbreite und Randhöhe nur in Feuerrot/Blattgrün gibt.
In Smaragd/Rubin/Saphir wäre schon nach dem Pointer zum Tileset Teil 2 Schluss.
6.Map
Der Aufbau zeigt nur wie es in Pokémon gemacht wird, aber lässt sich, wenn man
sich das selbst schreibt, individuell einrichten.
Aufbau:
Map-Header
Tiles-Daten
Geh-Daten
Mapfooter
Events
Eventmenge
Die Tile-Daten, also die Map als "Grafik" wird in Bits gecoded, sowie auch die Geh-Daten.
6.1.Map Tile Daten Struktur
Jetzt erkläre ich wie das Prinzip der Map Daten im Hintergrund des Mapeditors funktioniert, wenn ihr mit dem Tileset eure
Maps erstellt mit einem GBA Pokémon Mapeditor (z.B. Advance Map).
Die Map Tile Daten lassen sich schwer in Worte fassen, deshalb habe ich
daraus einen Pseudo Code gemacht der wie folgt heißt:
Pseudo Code Start:
Tile Index n = 0
solange ( nicht Ende von tileset 1 + tileset 2 erreicht ist )
wenn ( Tile Index n > 255 )
Tile Index n = starte wieder bei 0 zu zählen
Ende
ansonsten
Tile Index n = weiterzählen
Ende
Pseudo Code End
Der Tile Index n startet immer wieder bei 0 und zählt dann herauf bis er bei 255 angekommen ist,
danach wird bei 0 wieder angefangen zu zählen.
Dies ist noch für die Struktur der Gehdaten sehr wichtig,
also merkt euch das gut.
Mehr gibt es denke ich nicht dazu zu sagen, aber wenn ihr Fragen habt oder
mit dem Pseudo Code nicht klar kommt, dann stellt die Fragen einfach.
6.2.Map Gehdaten Struktur
Jetzt komme ich zu den Gehdaten, die aber sehr mit den Map Tile Daten verzweigt sind.
Hierzu werde ich auch wieder ein Pseudo Code zur Erläuterung benutzen:
Pseudo Code Start:
Zähler = 0
Tile Index n = 0
solange (Ende von tileset 1 + tileset 2 nicht erreicht ist)
wenn ( Tile Index n > 255)
Zähler = Zähler + 1
Gehdaten Wert x = (Gehdaten Index m * 4) + Zähler
Tile Index n = starte wieder bei 0 zu zählen
Ende
ansonsten
Gehdaten Wert x = (Gehdaten Index m * 4) + Zähler
Tile Index n = weiterzählen
Ende
Pseudo Code End
Der Gehdaten Wert x berechnet sich immer aus dem Gehdaten Index m mal 4 + den n-ten Zähldurchlauf bis 255.
Wenn der Tile Index n den Wert 255 erreicht hat starte der Index wieder bei 0 und der Zähler zählt den Durchlauf.
Hier wieder auch, wenn ihr jegliche Fragen zu diesem Thema habt, dann stellt diese Fragen,
denn ihr lest ja das Tutorial, weil ihr etwas lernen wollt.
Dies wäre auch schon alles zu den Geheimnissen der beiden Strukturen.
Mit diesem Prinzip müsste man eigentlich einen einfachen Mapeditor zusammenbauen können,
der in der Lage ist mit dem Mapsystem von GBA Pokémon Spielen zu arbeiten.
7.Events
Die Events sind der Hauptkern des Spielgeschehens.
Aufbau:
Person
pro Person 24 bytes
[Personen Nr. byte][Bildnummer byte][unbekannt byte][unbekannt byte][x-koordinate hword][y-koordinate hword][Ansprechebene byte]
[beweg Typ byte][Bewegung byte][unbekannt byte][Trainer j/n byte][unbekannt byte][sichtweite hword]
[pointer script offset word][personen id hword][unbekannt byte][unbekannt byte]
Warp
pro Warp 8 Bytes
[x-koordinate hword][y-koordinate hword][Ansprechebene byte][Warp nr. byte][Map byte][Mapbank byte]
Scriptfeld
pro Scriptfeld 16 bytes
[x-koordinate hword][y-koordinate hword][unbekannt hword][var nummer hword][var wert hword][unbekannt byte][unbekannt byte][pointer script offset word]
Signpost
pro Signpost 12 bytes
[x-koordinate hword][y-koordinate hword][ansprechebene byte][signpost typ byte][unbekannt byte][unbekannt byte][pointer script offset word]
7.1.Eventmenge
Die Eventmenge beinhaltet die Menge der Events auf der Map und die
Pointer zum jeweiligen Eventtyp der Map.
Aufbau:
Anzahl der Eventtypen:
Personen
Warps
Scriptfelder
Signposts
Pointer auf Personen
Pointer auf Warps
Pointer auf Scripts
Pointer auf Signposts
8.Anbindungen
Eine Anbindung verbindet zwei Maps miteinander, damit es einen flüssigen Übergang gibt
z.b. von einer Route zu einer Stadt.
Aufbau:
Gesamt: 12 Bytes
[Richtung word][Verschiebung word][Mapbank byte][Map nr. byte][Nullen hword][Anzahl Anbindungen auf der Map word]
[Pointer zum Offset der Anbindungsliste]
9.Wilde Pokémon Header
In dem Header werden die Typen der Habitats der Pokémon auf einer Map bestimmt.
Aufbau:
Gesamt: 20 Bytes
[Mapbank byte][Map nr. byte][00][00][Pointer zum Gras Eintrag][Pointer zum Wasser Eintrag][Pointer zum Bäume Eintrag][Pointer zum Angel Eintrag]
9.1. Wilde Pokémon Daten
In den Daten wird bestimmt was für Pokémon auf welchem Level auftauchen.
Aufbau:
Habitats:
Gras Eintrag
[12 Pokémon Einträge*][Häufigkeit byte][00][00][00][Pointer zu den Pokémon Einträgen]
Wasser Eintrag
[5 Pokémon Einträge*][Häufigkeit byte][00][00][00[Pointer zu den Pokémon Einträgen]
Bäume Eintrag
[5 Pokémon Einträge*][Häufigkeit byte][00][00][00][Pointer zu den Pokémon Einträgen]
Angel Eintrag
[10 Pokémon Einträge*][Häufigkeit byte][00][00][00][Pointer zu den Pokémon Einträgen]
*Pro Pokémon Eintrag 4 Bytes
[minimum lvl byte][maximum lvl byte][pokemon hword]
Nachwort
Gut, ich würde das ganze hier viel mehr als eine Art Aufzeichnung
bezeichnen, da ich nur Daten hier erkläre.
Ich hoffe es hat euch irgendwie geholfen zu verstehen wie das ganze in AM funktioniert
und ihr damit etwas anfangen könnt.
Ich werde höchstwahrscheinlich die Funktionsweise eines Tilesets etc. noch hinzufügen zu diesem Tutorial.
Im Anhang gibt es noch die Offsets, damit ihr die Tables umpointen könnt
Wenn Fragen sind oder ihr Feedback loswerden wollt postet es hier.
Mfg
HunterxPokemon