Mapsystem GBA Pokémon Dokumentation

    • [Grundkenntnisse]
    • Mapsystem GBA Pokémon Dokumentation

      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:
      Spoiler anzeigen

      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:
      Spoiler anzeigen

      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:
      Spoiler anzeigen

      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:
      Spoiler anzeigen

      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:
      Spoiler anzeigen

      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:
      Spoiler anzeigen

      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:

      Spoiler anzeigen

      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:

      Spoiler anzeigen

      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:
      Spoiler anzeigen

      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:
      Spoiler anzeigen

      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:
      Spoiler anzeigen

      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:
      Spoiler anzeigen

      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:
      Spoiler anzeigen

      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
      Dateien
      • map_data.zip

        (291 Byte, 24 mal heruntergeladen, zuletzt: )
      Pokémon Flammen werden emporsteigen.


      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von DarkGengar ()

    • Top :D
      Wobei es mit dem Obscurity-Design sehr schlecht Zu lesen ist..

      -SoulK3
      ------------------------------------------------------------------------------------
      ~ ~ ~ SoulK3 ~ ~ ~

      :thumbsup: Wer Rechtschreibfehler findet darf sie gerne Behalten :thumbsup:

      Drei Menschen können ein Geheimnis bewahren.
      Wenn Zwei von ihnen Tot sind.
      :evil:
      ------------------------------------------------------------------------------------
    • Du solltest noch nachtragen, dass die Randbreite und die Randhöhe im Mapfooter exklusiv für Pokémon Feuerrote und Blattgrüne Edition sind, womit in Rubin, Saphir und Smaragd beim Pointer zum Tileset 2 Schluss ist. ;)

      Zu den Events: Bei Personen und Warps ist der Byte nach den Koordinaten nicht unbekannt. Dieser Byte legt die Ansprechebene fest.

      00 = Immer
      01 = Gehdaten 0x4 (Surfer)
      03 = Gehdaten 0xC
      04 = Gehdaten 0x10 und Gehdaten 0x3C (Brücke)
      05 = Gehdaten 0x14

      Tipp: Wäre auch schlau, wenn man sich diese Felder auch so in seiner AdvanceMap-Ini einträgt.

      Wenn in Rubin, Saphir und Smaragd bei einer Person die Bildnummer 60 ist, dann steht die Sichtweite für die Pflanzen-ID. Da kannst du gleich auf mein Tutorial verlinken.
      Du könntest auch noch die verschiedenen Signpost-Typen einzeln erklären, also versteckte Items und Geheimbasis.
    • So, ich habe jetzt nach längerer Zeit mein Tutorial mal überarbeitet, da ich im Moment mehr Zeit habe
      um solche Sachen zu überarbeiten ^^

      Im Grunde genommen habe ich bei den Events die Parameter ein wenig angepasst und
      habe bei dem Punkt 6 Maps das Prinzip der Maps erklärt, also wie das Prinzip der
      Map Erstellung in den Pokémon GBA Versionen aussieht.

      Und ich habe die Farbe von den Überschriften und der Inhaltsangabe geändert wie gewünscht wurde.

      Damit müsste man dann auch in der Lage sein einen einfachen Mapeditor für GBA Pokémon Spiele zu basteln, wenn man denn auch schon Vorkenntnisse in der Programmierung von solcher Software hat.

      Bei Fragen oder einem Feedback an mich könnt ihr gerne hier schreiben.


      Na dann, viel Spaß beim lesen und in naher Zukunft bringe ich
      vielleicht noch ein paar Updates zu der Dokumentation hier mit, aber bis dahin erst einmal ciao ^^

      // HunterxPokemon
      Pokémon Flammen werden emporsteigen.