PKMN GSK Darstellung Bewegung People-Events
aus RHWiki, der freien Romhacking-Enzyklopädie
| Inhaltsverzeichnis |
In diesem Artikel wird das System erläutert mit dessen Hilfe in Pokémon Gold, Silber & Kristall Personen-Events dargestellt und bewegt werden.
Einleitung
Die Eigenschaften eines Personen-Events werden in den Personen-Daten einer Map festgelegt.
Des Weiteren werden spezielle Eigenschaften wie z.B. zu verwendende Grafiken und Standardpalette in den Spritedefinitionslisten, erlaubte Sprite-Nummern für Außen-Maps in den Spritesets festgelegt.
Hier wird kurz das System erklärt, das die Darstellung bewirkt und es wird auf einzelne Aspekte eingegangen, wie z.B. die benutzten Spritedaten für die Gras-Animation etc.
System
Das System besteht grob gesagt aus zwei Teilbereichen: einmal das Ausführen von Scripts und einmal das Errechnen von Spritedaten. Auf den ersten Blick hören sich die Aufgabenbereiche sehr identisch an, sind es jedoch nicht. Die auszuführenden Scripts ändern meist Aspekte des Personen-Events, bzw. dessen Daten im Ram. Die Routine, die die Spritedaten errechnet stellt dann je nach den Personen-Daten im Ram andere Spritedaten bereit. Das System übergibt sich praktisch einander die Aufgaben.
Es ist darauf zu achten, dass die meisten Scripts die Spritedatenset-Nummer variabel oder statisch vergeben. Ohne ASM-Kenntnisse gibt es keine einfache Möglichkeit diese Routinen effektiv zu bearbeiten.
Die nächsten zwei Abschnitte sind rein informativ und man sollte sie bloß überfliegen oder etwas Spezielles suchen. Das Zusammenspiel der einzelnen Routinen, Spritedaten, Bewegunsfunktionen und Bewegunsanimationen, wird im Bewegungsheader deutlich!
Errechnen der Spritedaten
Die zu benutzenden Spritedaten werden durch die zwei Scriptarten und den Bewegungsheader bestimmt. Es gibt insgesamt 0x20 Spritedatensets, also Set 0x00 bis Set 0x1F. Sollte die gewählte Nummer größer als 0x1F sein, so wird kein Sprite dargestellt. (Der Personen-Event ist jedoch nicht automatisch versteckt, d.h. Kollision und Interaktion ist immer noch möglich!)
Auflistung der Spritedatensets in Gruppen
| Nummer und Name der Daten | ||
| Beschreibung der Spritedaten | Anzahl der Tiles | [Y-Verschiebung in px][X-Verschiebung in px] [Tiledaten] [Tile-Nummer] |
Y-/X-Verschiebung:
- Die Verschiebung in px des einen Sprite-Tiles. Die Koordinaten eines Sprites für den Gameboy (Color) können maximal ein Byte groß sein, daher wirken sich die Verschiebungswerte wie signed Bytes aus.
Tiledaten:
- Bitweise Funktionen:
- 7 - Priority
- 6 - Y-Flip
- 5 - X-Flip
- 4 - Palettennummer für Gameboy Mono
- 3 - nicht vergeben
- 2 - 0: relativ zum Starttile der People-Event-Grafik, 1: absolute Tilenummer
- 1 - automatisch auf Priority stellen, wenn der People-Event Gras betritt
- 0 - nicht vergeben
Tile-Nummer:
- Abhängig von Bit 2 der Tiledaten entweder absolut oder relativ.
Wichtig: In Bildern, die nicht nur die entstehenden Tiles enthalten, sind die anderen Tiles in Graustufen abgebildet, um die Positionierung (bzw. die typische Positionierung) besser darzustellen.
Spritedatenset unten:
Spritedatenset oben:
Spritedatenset links:
Spritedatenset rechts:
Spritedatenset Angel:
Spritedatenset Gefühls-Blase:
| 0x14 Gefühls-Blase | ||
| Gefühls-Blase anzeigen | 0x04 Tiles | [00][00] [04] [F8] |
| [00][08] [04] [F9] | |
| [08][00] [04] [FA] | ||
| [08][08] [04] [FB] | ||
Spritedatenset Sprung-Schatten:
| 0x15 Sprung-Schatten | ||
| Sprung-Schatten anzeigen | 0x02 Tiles | [00][00] [04] [FC] |
| [00][08] [24] [FC] | |
Spritedatenset Riesenpuppen:
Spritedatenset Mogelbaum:
Spritedatenset Stärke:
Spritedatenset Gras:
| 0x1E Person läuft durch Gras #1 | 0x1F Person läuft durch Gras #2 | |||
| Gras-Animation beim Hindurchgehen | 0x02 Tiles | [08][00] [00] [00] | 0x02 Tiles | [09][FF] [00] [00] |
| [08][08] [20] [00] |
| [09][09] [20] [00] | |
Ausführen von Scripts
Es gibt zwei Arten von Script. Der Einfachheit halber, kann man sie in Bewegungsfunktions-Scripts und Bewegungsanimations-Scripts unterteilen, obwohl die eigentliche Funktionsteilung beider Arten mehr als schwammig ist! Die Bewegunsfunktionen rufen in der Regel die Bewegungsanimationen, technisch ist jedoch auch das umgedrehte möglich und eine gegenseitige, zeitlich gesteuerte Beeinflussung durchführbar.
Bewegungsfunktionen
| Erläuterung | |
| 0x00 | Keine Bewegungsfunktion. People-Event steht still. |
| 0x01 | People-Event kann bei jedem Schritt in Y-Richtung ±1 Feld zurücklegen. Maximal 0x7F Aufrufe hintereinander pausieren. |
| 0x02 | People-Event kann bei jedem Schritt in X-Richtung ±1 Feld zurücklegen. Maximal 0x7F Aufrufe hintereinander pausieren. |
| 0x03 | People-Event kann bei jedem Schritt entweder in X- oder in Y-Richtung ±1 Feld zurücklegen. Maximal 0x7F Aufrufe hintereinander pausieren. |
| 0x04 | People-Event dreht den Kopf wahllos in eine Richtung Maximal 0x7F Aufrufe hintereinander pausieren. |
| 0x05 | People-Event dreht den Kopf in eine Richtung, jedoch nie zweimal aufeinander folgend in dieselbe. Maximal 0x1F Aufrufe hintereinander pausieren. |
| 0x06 | People-Event hält starren Blick in eine Blickrichtung |
| 0x07+ | Bewegungen für HIRO, exakt wie 0x0D |
| 0x08b | Bewegungslistenroutine (wird so nicht mehr verwendet) Geh-Befehl von Liste an Offset in 0xCE8B/C laden (Zähler in der Liste in Personen-Ram-Daten 0x1B) |
| 0x09b | Bewegungslistenroutine (wird so nicht mehr verwendet) Geh-Befehl von Liste an Offset in 0xCE8B/C laden (Zähler in der Liste in Personen-Ram-Daten 0x1B) |
| 0x0A+ | Geh-Befehl aus 0xCE8B laden |
| 0x0B+ | Geh-Befehl aus 0xCE8B laden |
| 0x0C+ | Geh-Befehl aus 0xCE8B laden |
| 0x0D+ | Bewegungen für HIRO, im Spiel verwendet |
| 0x0E+ | Bewegungslistenroutine (wird so nicht mehr verwendet) Geh-Befehl von Liste an Offset in 0xCE8B/C laden (Zähler in der Liste in Personen-Ram-Daten 0x1B) |
| 0x0F* | Von aktuellem Geh-Befehl bis Anfag Folgen-Gehbefehlliste (Ram 0xD1F8) löschen Folgen ist ein Ingame-Scripting-Befehl. |
| 0x10* | Ingame-Scripts bearbeiten. |
| 0x11 | STÄRKE-Funktion für Felsen. |
| 0x12 | People-Event folgt einer Person. |
| 0x13* | Schatten (z.B. bei Sprüngen) darstellen |
| 0x14* | Gefühls-Blase darstellen. |
| 0x15 | Lapras-/Relaxo-Riesenpuppe: Daten laden. |
| 0x16 | Pokémon-Minibilder: Daten laden. |
| 0x17* | Bildschirm wackeln lassen. |
| 0x18 | People-Event führt Kreisbewegungen im Uhrzeigersinn aus. (Buggy! Bugfix hier.) |
| 0x19 | People-Event führt Kreisbewegungen gegen Uhrzeigersinn aus. (Buggy! Bugfix hier.) |
| 0x1A* | STÄRKE-Animation Rauch. |
| 0x1B* | Gras-Animation beim Hindurchgehen. |
Bei den Funktionen, die ausschließlich Personen-Events bewegen, wird zufällig ein Zeitintervall zwischen einer und einer nächsten Bewegung festgelegt. Die Obergrenzen dieser Intervalle sind meist angegeben.
Erklärung der Zusatzzeichen:
- b: Ingame nicht brauchbar, da das Spiel die Daten nicht mehr auf diese Weise lädt.
- *: Ingame allein stehend praktisch unbrauchbar, da diese Bewegunsfunktionen event-basierend sind, z.B. STÄRKE etc.
- +: Ingame nur einzeln verwendbar, da HIROs Bewegung automatisch die erforderlichen Register mit Geh-Befehlen für "Keine Bewegung" füllt.
Bewegunsanimationen
| Erläuterung für bewegliche Sprites | Erläuterung für stillstehende Sprites | |
| 0x00 | People-Event verstecken | People-Event verstecken |
| 0x01 | Auf Ende einer Geh-Animation warten, dann Stehen | Keine Aktion |
| 0x02 | Geh-Animation | Keine Aktion |
| 0x03 | Langsame Geh-Animation | Keine Aktion |
| 0x04 | im Uhrzeigersinn drehen | Keine Aktion |
| 0x05 | im Uhrzeigersinn drehen und verstecken | Verstecken |
| 0x06 | Angel-Darstellung | Angel-Darstellung |
| 0x07 | Schatten bei Sprung | Verstecken |
| 0x08 | Gefühls-Blase darstellen | Gefühls-Blase darstellen |
| 0x09 | Spritedatenset-Nummer für Riesenpuppen Relaxo/Lapras laden | Spritedatenset-Nummer für Riesenpuppen Relaxo/Lapras laden |
| 0x0A | Abwechselnd nach oben (Spritedaten 0x00) und nach unten (Spritedaten 0x04) gucken für Pokémon Minibilder | Nur nach oben (Spritedaten 0x00) gucken |
| 0x0B | In laufendem Wechsel Blickrichtung: unten, oben, unten, oben-gespeigelt (Spritedaten 0x18, 0x19, 0x1A, 0x1B) für Mogelbaum | Keine Aktion |
| 0x0C | Spritedatenset-Nummer für Riesenpuppe Onix laden | Spritedatenset-Nummer für Riesenpuppe Onix laden |
| 0x0D | Spritedatenset-Nummer für Riesenpuppe in HIROs Raum laden (entweder Relaxo, Lapras oder Onix anhand Computerauswahl) | Spritedatenset-Nummer für Riesenpuppe in HIROs Raum laden (entweder Relaxo, Lapras oder Onix anhand Computerauswahl) |
| 0x0E | Abwechselnd 2x Stärke bewegt Felsen #1 (Spriteset 0x1C) und 4x Stärke bewegt Felsen #2 (Spriteset 0x1D) für STÄRKE-Animation | Verstecken |
| 0x0F | Abwechselnd 4x Person läuft durch Gras #1 (Spriteset 0x1E) und 4x Person läuft durch Gras #2 (Spriteset 0x1F) für Gras-Animation | Verstecken |
Die beiden Systeme gehen Hand in Hand, daher gibt es vermeintlich "doppelte Belegungen", die aber keine sind, da die Bewegungsfunktionen die jeweiligen Bewegungsanimationen rufen! Ob die Animation für bewegliche oder stillstehende Sprites ausgeführt wird, hängt von vom Eigenschaftsbyte 2 im Bewegungsheader ab.
Bewegungsheader
Der Bewegungsheader ist der Kern der gesamten Darstellung und Bewegung von Sprites. Bisher wurden bloß die Teilaspekte ausgeleuchtet, aber nicht, wie sie eigentlich angesteuert werden!
Die Steuerung der Darstellung und der Bewegung eines People-Events auf einer Map wird einzig und allein mit dem Bewegungsbyte in den Personen-Daten des Events vorgenommen!
| Bewegungsbyte | [Bewegungsfunktion][Blickrichtung][Bewegungsanimation][Eigenschaftsbyte 1][Eigenschaftsbyte 2][Eigenschaftsbyte 3] | Beschreibung der Bewegungen |
Wichtig: Es handelt sich bei allen Daten um Initialwerte, die jederzeit durch Scripts (sowohl Bewegungsfunktionen/-animationen, als auch Ingame-Scripts und sonstige ASM-Script) geändert werden können. Manche Bewegungsanimationsbytes sind gar nicht nötig, da die Bewegungsfunktionen diese noch einmal setzen!
Bewegungsfunktion:
- Initiale Bewegungsfunktion, siehe Liste oben.
Blickrichtung:
- Initiale Blickrichtung. Byte * 0x04 ergibt Spritedatensetnummer:
- 0x00 - unten
- 0x01 - oben
- 0x02 - links
- 0x03 - rechts
- Andere Werte werden durch eine Abfrage auf diese vier Blickrichtungen herunter gerechnet.
Bewegungsanimation:
- Initiale Bewegungsanimation, siehe Liste oben.
Eigenschaftsbyte 1:
- Bitweise Funktionen:
- 7 - keine Kollisionsabfrage mit diesem People-Event
- 6 - keine Kollisionsabfrage mit HIRO
- 5 - kein Umherlaufen möglich
- 4 - BX/CX-Kollisionen ignorieren (Buggy! Geht nicht, falls in Eigenschaftsbyte 3 Bit 5 'Fortbewegung ausschließlich im Wasser' gesetzt ist! Bugfix: hier.)
- 3 - keine Geh-Animation zulassen beim Gehen (für People-Events, die Front-Sprites benutzen)
- 2 - Tileverschiebung anhand der Blickrichtung errechnen (z.B. bei Kopfbewegungen)
- 1 - People-Event auch beim Verlassen des Sichtbereichs von HIRO nicht aus dem Ram löschen
- 0 - OAM-Sprites verstecken
Eigenschaftsbyte 2:
- Bitweise Funktionen:
- 7 - Priority des Sprites ist eingeschaltet
- 6*- People-Event nicht auf Screen
- 5 - Bewegungsscripts für 0: bewegliche Sprites 1: stillstehende Sprites
- 4 - 0: OBJPal 0, 1: OBJPal 1 (nur für Gameboy Mono)
- 3*- People-Event steht auf Aktions-Kollisionsfeld (z.B. Warp)
- 2 - People-Event STÄRKE
- 1 - Sprite-Eventart #2 (Bewegend)
- 0 - Sprite-Eventart #1 (Still)
- Es sollte jeweils bloß eine Sprite-Eventart gesetzt sein, sonst wird der Sprite womöglich doppelt dargestellt. Diese Bits sind wichtig für die Reihenfolge in der die Sprites dargestellt werden. Bewegende Sprites (z.B. Gras-Animation) werden vor stillstehenden Sprites (z.B. Bäume, Menschen) dargestellt.
- People-Event STÄRKE wird nur für Felsen verwendet und löst eine Bewegung des Felsens aus.
- * bedeutet, dass es nicht sinnvoll ist, diese Bits zu setzen, da sie von der Darstellungsroutine richtig dem Status des People-Events entsprechend gesetzt werden.
Eigenschaftsbyte 3:
- Bitweise Funktionen:
- 7 - People-Event 2x2 Blockviertel groß
- 6 - People-Event per STÄRKE beweglich
- 5 - Fortbewegung ausschließlich im Wasser möglich (an Land nur Kopfbewegungen) (Buggy! Ignoriert Eigenschaftsbyte 1 Bit 4 'BX/CX-Kollisionen ignorieren', Bugfix dazu hier, und funktioniert selbst nicht richtig, Bugfix hier)
- 4 - nicht vergeben
- 3-0 - wird mit Palette von Sprite geORt (wahrscheinlich Vorstufe der Paletteneinstellung in den Spritedefinitionslisten; überflüssig)
Bewegungsbyte
| Daten | Beschreibung | |
| 0x00 | [00][00][01][02][00][00] | keine Bewegung |
| beim Verlassen des Sichtbereichs nicht löschen | ||
| 0x01 | [06][00][01][0C][00][00] | starr unten; kein Kopfdrehen bei Ansprechen (Bäume etc.; wie 0x17) |
| Tileverschiebung nicht anhand Blickrichtung errechnen | ||
| Keine Geh-Frames verwenden | ||
| 0x02 | [03][00][01][00][00][00] | Bewegung ±1 Feld in X- oder Y-Richtung |
| 0x03 | [04][00][01][00][00][00] | Kopf drehen |
| 0x04 | [01][00][01][00][00][00] | Bewegung ±1 Feld in Y-Richtung |
| 0x05 | [02][00][01][00][00][00] | Bewegung ±1 Feld in X-Richtung |
| 0x06 | [06][00][01][00][00][00] | starr unten; Kopfdrehen bei Ansprechen |
| 0x07 | [06][01][01][00][00][00] | starr oben; Kopfdrehen bei Ansprechen |
| 0x08 | [06][02][01][00][00][00] | starr links; Kopfdrehen bei Ansprechen |
| 0x09 | [06][03][01][00][00][00] | starr rechts; Kopfdrehen bei Ansprechen |
| 0x0A | [05][00][01][00][00][00] | Kopf drehen, jedoch nie zweimal dieselbe Richtung hintereinander |
| 0x0B | [07][00][01][02][00][00] | Bewegungen Hiro (dasselbe wie 0x0D, nicht verwendet) |
| beim Verlassen des Sichtbereichs nicht löschen | ||
| 0x0C | [08][00][01][00][00][00] | |
| 0x0D | [09][00][01][00][00][00] | Bewegungen Hiro (im Spiel benutzt) |
| 0x0E | [0A][00][01][00][00][00] | |
| 0x0F | [0B][00][01][00][00][00] | |
| 0x10 | [0C][00][01][00][00][00] | |
| 0x11 | [0D][00][01][00][00][00] | |
| 0x12 | [0E][00][01][00][00][00] | |
| 0x13 | [0F][00][01][02][00][00] | |
| 0x14 | [10][00][01][02][00][00] | |
| beim Verlassen des Sichtbereichs nicht löschen | ||
| 0x15 | [15][00][09][2E][01][C0] | Riesenpuppe Relaxo/Lapras |
| beim Verlassen des Sichtbereichs nicht löschen | ||
| Tileverschiebung nicht anhand Blickrichtung errechnen | ||
| Keine Geh-Frames verwenden | ||
| kein Umherlaufen möglich | ||
| Sprite-Eventart #1 (Still) | ||
| per STÄRKE beweglich | ||
| 2x2 Blockviertel groß | ||
| 0x16 | [16][00][0A][2E][00][00] | Ingame-PKMN z.B. Miltank-Farm |
| beim Verlassen des Sichtbereichs nicht löschen | ||
| Tileverschiebung nicht anhand Blickrichtung errechnen | ||
| Keine Geh-Frames verwenden | ||
| kein Umherlaufen möglich | ||
| 0x17 | [06][00][01][0C][00][00] | starr unten; kein Kopfdrehen bei Ansprechen (Bäume etc.) |
| Tileverschiebung nicht anhand Blickrichtung errechnen | ||
| Keine Geh-Animation | ||
| 0x18 | [06][00][01][2E][10][00] | starr unten; kein Kopfdrehen bei Ansprechen; OBJPal1 (Bäume etc.) |
| beim Verlassen des Sichtbereichs nicht löschen | ||
| Tileverschiebung nicht anhand Blickrichtung errechnen | ||
| Keine Geh-Frames verwenden | ||
| kein Umherlaufen möglich | ||
| bentuzt OBJPal1 | ||
| 0x19 | [11][00][01][2E][00][40] | Stärke-Funktion für Felsen |
| beim Verlassen des Sichtbereichs nicht löschen | ||
| Tileverschiebung nicht anhand Blickrichtung errechnen | ||
| Keine Geh-Frames verwenden | ||
| kein Umherlaufen möglich | ||
| per STÄRKE beweglich | ||
| 0x1A | [12][00][01][02][00][00] | Person folgen. |
| beim Verlassen des Sichtbereichs nicht löschen | ||
| 0x1B | [13][00][00][8E][01][00] | Schatten bei Sprung etc. |
| beim Verlassen des Sichtbereichs nicht löschen | ||
| Tileverschiebung nicht anhand Blickrichtung errechnen | ||
| Keine Geh-Frames verwenden | ||
| keine Kollisionsabfrage mit diesem People-Event | ||
| Sprite-Eventart #1 (Still) | ||
| 0x1C | [14][00][08][8E][02][00] | Gefühlsblase |
| beim Verlassen des Sichtbereichs nicht löschen | ||
| Tileverschiebung nicht anhand Blickrichtung errechnen | ||
| Keine Geh-Frames verwenden | ||
| keine Kollisionsabfrage mit diesem People-Event | ||
| Sprite-Eventart #2 (Bewegend) | ||
| 0x1D | [17][00][00][82][00][00] | Erdbeben |
| beim Verlassen des Sichtbereichs nicht löschen | ||
| keine Kollisionsabfrage mit diesem People-Event | ||
| 0x1E | [19][02][01][00][00][00] | Kreisbewegung entgegen Uhrzeigersinn; Start links; Buggy! Bugfix hier. |
| 0x1F | [18][03][01][00][00][00] | Kreisbewegung Uhrzeigersinn; Start rechts; Buggy! Bugfix hier. |
| 0x20 | [11][00][0C][2E][01][C0] | Riesenpuppe Onix |
| beim Verlassen des Sichtbereichs nicht löschen | ||
| Tileverschiebung nicht anhand Blickrichtung errechnen | ||
| Keine Geh-Frames verwenden | ||
| kein Umherlaufen möglich | ||
| Sprite-Eventart #1 (Still) | ||
| per STÄRKE beweglich | ||
| 2x2 Blockviertel groß | ||
| 0x21 | [11][00][0D][2E][01][C0] | Riesenpuppe Hiros Raum (Wahlweise Lapras, Relaxo, Onix) |
| beim Verlassen des Sichtbereichs nicht löschen | ||
| Tileverschiebung nicht anhand Blickrichtung errechnen | ||
| Keine Geh-Frames verwenden | ||
| kein Umherlaufen möglich | ||
| Sprite-Eventart #1 (Still) | ||
| per STÄRKE beweglich | ||
| 2x2 Blockviertel groß | ||
| 0x22 | [1A][00][0E][8E][01][00] | Stärke-Animation Rauch |
| beim Verlassen des Sichtbereichs nicht löschen | ||
| Tileverschiebung nicht anhand Blickrichtung errechnen | ||
| Keine Geh-Frames verwenden | ||
| keine Kollisionsabfrage mit diesem People-Event | ||
| Sprite-Eventart #1 (Still) | ||
| 0x23 | [1B][00][0F][8E][02][00] | Gras-Animation beim Hindurchgehen |
| beim Verlassen des Sichtbereichs nicht löschen | ||
| Tileverschiebung nicht anhand Blickrichtung errechnen | ||
| Keine Geh-Frames verwenden | ||
| keine Kollisionsabfrage mit diesem People-Event | ||
| Sprite-Eventart #2 (Bewegend) | ||
| 0x24 | [03][00][01][00][00][20] | Schwimmer ±1 Feld in X- oder Y-Richtung; Buggy! Bugfixes unten. |
| Fortbewegung ausschließlich im Wasser möglich | ||
| 0x25 | [00][00][01][00][00][00] | Keine Bewegung. Dummy-Daten, nicht wählbar. |
Bugfixes
BX/CX-Check für Fortbewegung im Wasser
Bei 01:7083 folgendes eingeben:
7E E6 03 5F 16 00 21 91 70 C3 6B 70 00 00
Code stellt sicher, dass das Ziel nicht ein Block ist, der in der Gegenrichtung unpassierbar ist.
Fortbewegung nur im Wasser
Bei 01:6FD7 folgendes eingeben:
21 04 00 09 CB 66 20 20 21 06 00 09 CB 6E 28 0A E5 C5 CD 42 70 C1 E1 D8 18 0E 00 00 00 00 00 00
Code stellt sicher, dass Eigenschaftsbyte 1 Bit 4 auch mit Eigenschaftsbyte 3 Bit 5 kompatibel ist.
Kreisbewegungen
Bei 01:4981 folgendes eingeben:
C6
Code stellt sicher, dass anstatt statischem Intervall von 0x10 nun 0x10 + Spezialbyte genommen wird. Somit ist das Zeitintervall zwischen einer Vierteldrehung variabel.



























