Pixel-Art-Routen: Kartenverbindungen und Viertel auf dem iPhone
Die ersten drei Pokémon-Generationen laufen eine 16 Pixel große Zelle in 16 Frames ab, etwa 3,73 Zellen pro Sekunde, und der Sammler von Kiradex läuft 4 Tiles pro Sekunde, sodass sich ein in den alten Spielen gemessener Weg mit einer Viertelsekunde pro Tile in unsere Stadt umrechnen lässt.1234 Die erste Route jedes Spiels erstreckt sich über zwei bis sechs Konsolenbildschirme und hat keine Trainer; der erste Abschnitt, von der Haustür der Spielfigur bis zum Pokémon-Center der nächsten Stadt, misst in Smaragd 58 Zellen und 15,5 Sekunden Fußweg, in Feuerrot 94 Zellen und 25,2 Sekunden, und der Rückweg ist in beiden kürzer, 42 und 76 Zellen, über Routen, deren Felsvorsprünge alle Richtung Heimat zeigen.567 Wo sich die Grafik ändert, stellt Kanto ein Gebäude auf den Weg: 76 der 78 Kartenverbindungen von Rot verbinden ein einziges Tileset, und jedes Torhaus in Rot zwischen zwei verschiedenen Orten verbindet zwei.8 Die Engine von Hoenn kopiert sieben Zellen der Nachbarkarte in einen Rand um die aktuelle Karte, an drei Seiten sieben und im Osten acht, zeichnet sie mit den Tiles der aktuellen Karte und lädt die eigenen sekundären Tiles und die Palette des Nachbarn erst in dem Moment, in dem Sie hinübergehen, ohne Abblende.910 Der Kartenbildschirm von Smaragd ist ein Raster aus 28 mal 15 Feldern; eine Wandkarte im Obergeschoss des Hauses der Spielfigur in Wurzelheim öffnet ihn, ab Metarost City trägt der PokéNav ihn mit sich, und er zeigt jeden Ort, besucht oder nicht, bis auf zwei, die auf Story-Flags warten, während Fliegen nur die Städte anbietet, deren Besucht-Flag beim Betreten gesetzt wurde.111213 Kiradex World ist heute eine einzige Stadt von 40 mal 30 Tiles, hinter deren Zaun nichts liegt.14 Also habe ich die Wege, Nähte, Tore und Kartenbildschirme des Kanons aus den Dekompilierungen vermessen, Stardew Valley, Animal Crossing und Link’s Awakening als Gegenmodelle gelesen und die Zahlen in ein Briefing übersetzt: vier Gebiete jenseits des Platzes, ein Kartenbildschirm und eine Tram, die eine Haltestelle beim ersten Ankommen freischaltet.
Kurzfassung
- Eine Laufzelle kostet 16 Frames, etwa eine Viertelsekunde. Rot, Kristall und Smaragd laufen alle mit 16 Frames pro Zelle und rennen oder fahren mit 8, was bei den 59,7 Hertz der Hardware 3,73 und 7,47 Zellen pro Sekunde ergibt; Kiradex ist auf 4 Tiles pro Sekunde beim Gehen eingestellt, etwa 7 % schneller als die Handhelds, und auf nominell 6,4 beim Rennen, was ein Frame-Modell seines Codes bei 60 Hertz auf 6,00 beziffert, rund 20 % unter deren Rennen.1231541617
- Eine Route ist 2 bis 10 Bildschirme lang, und die erste ist kurz und am grasreichsten. Sechzehn vermessene Routen erstrecken sich entlang ihrer Achse über 2,0 (Smaragd, Route 101) bis 10,0 (Kristall, Route 32) Konsolenbildschirme; die vier ersten Routen bestehen nach Kartenfläche zu 14,4 % bis 22,8 % aus hohem Gras, so viel wie in keiner anderen ihres Spiels, und haben keine Trainer. Auf den neun Routen, deren Enden zu Fuß verbunden sind, beträgt der längere Weg hinüber das 1,15- bis 1,70-Fache der Längsseite, weil der Pfad sich windet, und der Heimweg das 0,95- bis 1,42-Fache.5617
- Felsvorsprünge verkürzen den Heimweg. Auf allen neun vermessenen Routen, deren Enden zu Fuß verbunden sind, und jede davon hat Vorsprünge, ist der Weg zur früheren Stadt 2 % bis 44 % kürzer, und die wenigsten Zellen hohen Grases auf dem Heimweg liegen bei 0 bis 5 gegenüber 4 bis 19 auf dem Hinweg.5618
- Torhäuser stehen dort, wo sich die Grafik ändert, und sie tragen die Regeln. Jedes Tor in Rot zwischen zwei Orten verbindet zwei Tilesets; in den Toren sitzen eine Ordensprüfung, ein durstiger Wachposten und drei Belohnungen für den Besitz von 10, 30 und 50 Arten. Die Engine von Hoenn lädt an der Naht ein neues Tileset und behält nur 4 Torgebäude gegenüber den 27 Karten auf Tor-Tilesets in Rot.8192010
- Eine Naht der dritten Generation zeichnet sieben Zellen des Nachbarn (acht im Osten) und lädt seine Grafik beim Überqueren. Der Rand des Puffers ist
MAP_OFFSET 7, weil „the player has 7 metatiles of view horizontally in either direction“ (die Spielfigur horizontal in jede Richtung 7 Metatiles weit sieht), und die Ostseite kopiertMAP_OFFSET + 1Spalten; beim Überqueren werden das sekundäre Tileset, die Musik und das Wetter der neuen Karte geladen, und ein Namensschild gleitet für etwa 3,2 Sekunden herein, ohne Abblende.91021 - Der Kartenbildschirm zeigt jeden Ort; die Schnellreise zeigt, wo Sie schon waren. Die Karte von Smaragd umfasst 28 mal 15 Felder, von denen 54 Orte 158 belegen, und sobald die Spielfigur sie öffnen kann (eine Wandkarte oben im eigenen Haus, dann der PokéNav), zeigt sie jeden Ort, besucht oder nicht, bis auf zwei, die Story-Flags zurückhalten; eine Stadt wird erst dann zum Ziel für Fliegen, wenn ihr
FLAG_VISITED_*-Flag beim Betreten gesetzt wird, und Rot, Feuerrot, Kristall und Link’s Awakening führen dieselbe Art von Besuchsprotokoll.11121322232425 - Was das Kiradex bringt. Ein Briefing für vier Gebiete jenseits des Stadtplatzes (die Albumgasse, den Wiesenweg, das Seeufer und das Galerieviertel) mit der 2,8-fachen Fläche des Stadtplatzes, offene Nähte ohne Abblende, einen gemeinsamen Achtwege-Laufgraphen für App und Server, einen Kartenbildschirm von 16 mal 12, eine Tram, deren Haltestellen beim ersten Besuch freigeschaltet werden, Fundstücke, die nur Kosmetik oder Questnotizen sind, und dreizehn Abnahmeprüfungen, die ein Skript oder eine Aufnahme ausführen kann.262728
1. Routen, vermessen
Die drei Beiträge dieser Reihe vom 3. Oktober blieben innerhalb des Zauns. Pixel-Art-Welten auf dem iPhone legte das Tile-System und das RealityKit-Rezept fest, Pixel-Art-Menschen den Sammler und Pixel-Art-Bauten die Gebäude und die Türen. Kiradex World ging daraus als eine einzige Stadt hervor: 40 mal 30 Tiles, der Wald 12 Tiles über den Zaun hinaus gezeichnet, sieben Gebäude, deren Türen in Räume oder die Halle führen, und ein Ankunfts-Tile.14 Dieser Beitrag handelt davon, was jenseits des Zauns liegt, und er beginnt dort, wo die früheren begannen: bei den Dekompilierungen.
Jede Pokémon-Zahl unten wurde an flachen Klonen der Dekompilierungen von pret gemessen, bei pokered d2704a6, pokecrystal 5beda23, pokeemerald 731ad5b und pokefirered 037335f, und zwar von sechs kleinen Python-Skripten, von denen jedes in etwa einer Sekunde oder weniger erneut läuft; die Anmerkungen nennen das Skript hinter jeder Zahl.29 Die Einheit ist die Zelle, ein Laufquadrat von 16 mal 16 Pixeln: ein Metatile der dritten Generation oder ein Viertel eines Blocks der ersten oder zweiten. Ein Game-Boy-Bildschirm zeigt 10 mal 9 Zellen (160 mal 144 Pixel), ein Game-Boy-Advance-Bildschirm 15 mal 10 (240 mal 160).29 Das Laufmodell ist in jedem Skript dasselbe: Ein Schritt kostet eine Zelle; ein Felsvorsprung wird nur in seiner Richtung überquert und landet eine Zelle dahinter, also zwei Zellen Bewegung; in Kristall darf ein Schritt die einseitige Wand eines Tiles nicht passieren, und ein Eckvorsprung springt in eine seiner beiden Richtungen (Abschnitt 2 zeigt den Code); eine Naht zählt nur dort, wo die gegenüberliegende Zelle des Nachbarn von einer seiner Türen aus zu Fuß erreichbar ist; Trainer und andere Personen werden ignoriert, und Surfen wird nicht modelliert.29
Die Uhr
Alle drei Generationen laufen im selben Tempo. In Rot ruft OverworldLoop DelayFrame zweimal pro Iteration auf, und AdvancePlayerSprite verschiebt die Ansicht 8 Iterationen lang um je 2 Pixel (wWalkCounter ist 8), sodass eine Zelle 16 Frames dauert; auf dem Fahrrad läuft AdvancePlayerSprite zweimal pro Iteration, 8 Frames pro Zelle.1 Die StepVectors von Kristall geben einem Laufschritt 8 Ticks zu 2 Pixeln und einem Fahrradschritt 4 Ticks zu 4 Pixeln, und die Oberwelt läuft mit einem Tick alle 2 Frames (MaxOverworldDelay: db 2), was wieder 16 Frames pro Zelle zu Fuß und 8 auf dem Fahrrad ergibt.2 Die Schritttabellen von Smaragd haben 16 Einträge fürs Gehen (sStep1Funcs), 8 fürs Rennen und Surfen, 6 für das Kunstrad und Strömungen, 4 für das Eilrad bei voller Geschwindigkeit und 2 für die schnellste Stufe; ein Sprung vom Vorsprung (JUMP_DISTANCE_FAR) dauert 32 Frames für zwei Zellen und steigt am Scheitelpunkt 12 Pixel hoch (sJumpY_High).3
Der Frame ist die andere Hälfte der Uhr. GBATEK gibt den Frame des Game Boy Advance mit 280.896 Zyklen an, „ca. 59.737 Hz“ (etwa 59,737 Hz); Pan Docs gibt den des Game Boy mit 70.224 Dots „@ 59.7 fps“ (bei 59,7 Bildern pro Sekunde) an.1530 Bei 16 Frames pro Zelle ist Gehen etwa 3,73 Zellen pro Sekunde und Rennen etwa 7,47.17 Die Sekunden in diesem Beitrag verwenden 224 Hertz geteilt durch 280.896, also 59,7275 Frames pro Sekunde; GBATEK nennt 59,737, und der Unterschied liegt unter 0,02 %.29
Der Sammler von Kiradex geht mit tilesPerSecond = 4 und rennt mit dem 1,6-Fachen davon, nominell 6,4 Tiles pro Sekunde.4 Die Zahl fürs Rennen ist die Konstante, nicht die Geschwindigkeit, die der Code erreicht: Der Bewegungsbeitrag dieser Reihe hat den Code Frame für Frame modelliert und festgestellt, dass das Rennen bei 60 Hertz 6,00 Tiles pro Sekunde zurücklegt und bei 120 Hertz 6,32, weil jeder Schritt den Fortschritt verwirft, um den er übers Ziel hinausschießt.16 Das Gehen ist etwa 7 % schneller als das Gehen der Handhelds; das Rennen liegt bei 60 Hertz etwa 20 % unter deren Rennen und bei seinen nominellen 6,4 um 14 % darunter.17 Beim Gehen ist der Abstand so gering, dass sich eine in ihren Zellen gemessene Strecke mit einem festen Faktor in unsere umrechnen lässt: Die Zeit einer Route sind ihre Zellen mal 0,27 Sekunden im Gehtempo der Handhelds und ihre Tiles mal 0,25 Sekunden in unserem.17
Sechzehn Routen
Ich habe die ersten vier Routen jedes Spiels vermessen: die Routen 1 bis 4 von Rot, 29 bis 32 von Kristall, 101 bis 104 von Smaragd und 1 bis 4 von Feuerrot. Zellen der dritten Generation werden aus map.bin gelesen (Bits 0 bis 9 das Metatile, 10 und 11 die Kollision, 12 bis 15 die Höhe), und das Verhalten jeder Zelle wird im primären oder sekundären metatile_attributes.bin nachgeschlagen; Trainer sind die Objektereignisse der Karte, deren trainer_type nicht TRAINER_TYPE_NONE ist.6 Zellen der ersten Generation lesen das linke untere 8-mal-8-Tile jeder 16-mal-16-Zelle gegen die Kollisionsliste des Tilesets, das Gras-Tile $52 und die Vorsprungstabelle; Zellen der zweiten Generation lesen die vier Kollisionsbytes, die jeder Block pro Quadrant mitführt.5
| Spiel | Route | Größe (Zellen) | Bildschirme entlang der Achse | Begehbar | Hohes Gras, Zellen (% der Karte) | Vorsprungszellen / Reihen | Trainer | Kürzester Weg hinüber, je Richtung (Zellen) |
|---|---|---|---|---|---|---|---|---|
| Rot | 1 | 20 mal 36 | 4,0 | 76,8 % | 104 (14,4 %) | 42 / 10 | 0 | Süd 40, Nord 52 |
| Rot | 2 | 20 mal 72 | 8,0 | 55,9 % | 84 (5,8 %) | 52 / 14 | 0 | durch einen Wald geteilt |
| Rot | 3 | 70 mal 18 | 7,0 | 35,1 % | 100 (7,9 %) | 36 / 10 | 8 | Richtung Marmoria 82, weg 84 |
| Rot | 4 | 90 mal 18 | 9,0 | 45,0 % | 60 (3,7 %) | 169 / 27 | 1 | durch eine Höhle geteilt |
| Kristall | 29 | 60 mal 18 | 6,0 | 47,7 % | 160 (14,8 %) | 35 / 13 | 0 | Ost 71, West 90 |
| Kristall | 30 | 20 mal 54 | 6,0 | 47,6 % | 140 (13,0 %) | 21 / 6 | 3 | Süd 57, Nord 74 |
| Kristall | 31 | 40 mal 18 | 4,0 | 39,3 % | 64 (8,9 %) | 13 / 5 | 1 | Westende ist ein Tor |
| Kristall | 32 | 20 mal 90 | 10,0 | 48,3 % | 152 (8,4 %) | 6 / 5 | 8 | Süd 132, Nord 128 |
| Smaragd | 101 | 20 mal 20 | 2,0 | 59,2 % | 91 (22,8 %) | 13 / 3 plus 1 Ecke | 0 | Süd 19, Nord 34 |
| Smaragd | 102 | 50 mal 20 | 3,3 | 48,9 % | 143 (14,3 %) | 17 / 4 | 4 | Ost 55, West 62 |
| Smaragd | 103 | 80 mal 22 | 5,3 | 27,3 % | 92 (5,2 %) | 24 / 3 | 9 | durch das Meer geteilt |
| Smaragd | 104 | 40 mal 80 | 8,0 | 34,0 % | 126 (3,9 %) | 13 / 4 | 8 | durch einen Wald geteilt |
| Feuerrot | 1 | 24 mal 40 | 4,0 | 62,3 % | 178 (18,5 %) | 61 / 10 | 0 | Süd 43, Nord 58 |
| Feuerrot | 2 | 24 mal 80 | 8,0 | 40,8 % | 84 (4,4 %) | 44 / 13 | 0 | durch einen Wald geteilt |
| Feuerrot | 3 | 84 mal 20 | 5,6 | 37,6 % | 117 (7,0 %) | 42 / 10 | 8 | Richtung Marmoria 94, weg 97 |
| Feuerrot | 4 | 108 mal 20 | 7,2 | 42,9 % | 84 (3,9 %) | 186 / 28 | 1 | durch eine Höhle geteilt |
Quellen der Tabelle: measure_gen12_routes.py und measure_gen3_routes.py über die vier Dekompilierungen.56 Die Spalte mit den Bildschirmen teilt die Längsseite durch die Sicht der Konsole entlang dieser Achse (10 oder 9 Zellen auf dem Game Boy, 15 oder 10 auf dem Game Boy Advance). Die Spalte „Begehbar“ ist der Anteil der Zellen, auf denen jemand stehen kann. Vorsprungszellen sind in der ersten und dritten Generation die Sprungzellen und in der zweiten die Kantenzellen. Wege verlaufen zwischen Nahtzellen, die von einer Tür aus erreichbar sind, und eine geteilte Route ist eine, auf der innerhalb der Karte kein Weg von Naht zu Naht existiert, weil ein Wald, eine Höhle, ein Tor oder das Meer zwischen den Hälften liegt.29
Routenlänge entlang der Längsachse, mit dem kürzesten Weg hinüber in jeder Richtung; gezeichnet von figures/make_figures.py aus den Ausgaben der beiden Routenskripte.
Fünf Dinge ergeben sich aus der Tabelle.
Routen umfassen 2 bis 10 Bildschirme, und die erste ist kurz. Smaragds Route 101 ist zwei Game-Boy-Advance-Bildschirme hoch; Kristalls Route 32 zehn Game-Boy-Bildschirme; die erste Route jedes Spiels zwei bis sechs Bildschirme.56 In Zellen reichen die vermessenen Routen entlang ihrer Längsseite von 20 bis 108.6
Der längere Weg hinüber ist das 1,15- bis 1,70-Fache der Längsseite. Neun der sechzehn Routen lassen sich von Ende zu Ende begehen. Auf diesen neun beträgt der kürzeste Weg in der längeren Richtung, gemessen an der Längsseite der Route, 34 zu 20, also 1,70, nordwärts auf Smaragd Route 101; 90 zu 60, 1,50, auf Kristall Route 29; 132 zu 90, 1,47, auf Kristall Route 32; 58 zu 40, 1,45, auf Feuerrot Route 1; 52 zu 36, 1,44, auf Rot Route 1; 74 zu 54, 1,37, auf Kristall Route 30; 62 zu 50, 1,24, auf Smaragd Route 102; 84 zu 70, 1,20, auf Rot Route 3; und 97 zu 84, 1,15, auf Feuerrot Route 3.5617 Der Heimweg ist gerader, das 0,95- bis 1,42-Fache der Längsseite: 19 zu 20 auf Smaragd Route 101, 57 zu 54 auf Kristall Route 30, 43 zu 40 auf Feuerrot Route 1, 55 zu 50 auf Smaragd Route 102, 40 zu 36 auf Rot Route 1, 94 zu 84 auf Feuerrot Route 3, 82 zu 70 auf Rot Route 3, 71 zu 60 auf Kristall Route 29 und 128 zu 90 auf Kristall Route 32, deren einseitige Wände den Weg in beiden Richtungen auf einen Umweg schicken.5617 Ein Verhältnis unter 1 ist keine Abkürzung durch den Raum: Ein Weg von einer Nahtzelle in der ersten Reihe zu einer in der letzten Reihe einer 20 Zellen hohen Karte braucht 19 Schritte, eine schnurgerade Route kommt also auf 0,95.17 Nach meiner Lesart ist der Wert für den Hinweg die Zahl, nach der man eine Route bemessen sollte: ihr gewundener Weg, nicht ihr umschließendes Rechteck.
Das Gras wird im Laufe der Reise dünner. Hohes Gras bedeckt 3,7 % bis 22,8 % der Karte einer Route. Die vier ersten Routen, Rot 1, Kristall 29, Smaragd 101 und Feuerrot 1, sind mit 14,4 %, 14,8 %, 22,8 % und 18,5 % die grasreichsten der jeweils vier ihres Spiels; die zweiten Routen liegen bei 4,4 % bis 14,3 %, die dritten und vierten bei 3,7 % bis 8,9 %.56 Bezogen auf den Boden, auf dem man stehen kann, sind die Anteile größer, und der Trend hält nur im Durchschnitt: Die ersten Routen bestehen zu 18,8 % bis 38,4 % aus hohem Gras, die zwölf späteren zu 8,2 % bis 29,2 %, und Rot Route 3 (22,6 %) ist unter den Füßen grasreicher als Rot Route 1 (18,8 %). Auf Smaragd Route 101 sind 91 der 237 begehbaren Zellen hohes Gras, 38,4 %.5617
Keine erste Route hat einen Trainer. Rot 1, Feuerrot 1, Smaragd 101 und Kristall 29 haben keinen; Trainer beginnen auf der zweiten oder dritten Route, mit 4 auf Smaragd Route 102, 3 auf Kristall Route 30 und 8 auf Route 3 in Rot und Feuerrot.56 Ihre Sichtweiten auf diesen Routen reichen von 0 bis 7 Zellen; die neun Trainer auf Smaragd Route 103 sehen 1 bis 5 Zellen, die acht auf Route 104 0 bis 7.6
Eine Begegnungszone würfelt etwa bei jedem neunten Schritt, nach einer kurzen Schonfrist. Smaragd prüft nie die ersten vier Schritte, nachdem die Spielfigur eine Karte betreten hat, über eine Naht oder eine Tür, oder nach einem Kampf: CheckStandardWildEncounter zählt diese Schritte ab, solange sWildEncounterImmunitySteps < 4 gilt, und beginnt die Zählung nach jeder Begegnung neu, und jedes Laden einer Karte und jeder Kampfbeginn setzt sie ebenfalls zurück. Danach wird jeder Schritt auf eine Begegnungszelle geprüft: zunächst mit 40 % Wahrscheinlichkeit, die Prüfung auszulassen, wenn der Schritt auf ein anderes Verhalten führt, dann Random() % 2880 < rate × 16. Die Routen 101 bis 104 verwenden alle die Rate 20, der unveränderte Wurf ist also 320 zu 2.880, 11,1 % pro Schritt zu Fuß; ein Fahrrad, eine Flöte, ein Schutzband oder manche Fähigkeiten des vordersten Pokémon skalieren ihn vorher.31 Feuerrot fügt einen Boden und eine Rampe hinzu: nach einer Begegnung und beim Betreten einer Karte eine Abklingzeit von 8 − rate/10 Schritten auf Begegnungszellen (6 bei der Rate 21 der Routen 1 bis 4), während der ein Wurf von 5 % bei jedem Schritt genau diesen einen Schritt eine Begegnung versuchen lässt, ohne die Abklingzeit zu beenden; dann der Wurf von 60 % bei einem neuen Verhalten; dann rate × 16 von 1.600, 21 %, plus ein Bonus, der nach jedem misslungenen Wurf um die Rate wächst (encounterRateBuff).32 Ich lese die Schonfrist, den Boden und die Rampe als Mittel, sowohl Durststrecken als auch Fluten kurz zu halten. Kiradex wird keine wilden Kämpfe haben, also zählt die Zahl hier nur als Rhythmus: Nach den ersten paar Schritten bietet eine erste Route etwa alle neun Schritte im Gras etwas, das man bemerkt.
Wie viel einer Welt Weg ist
| Spiel | Routenkarten | Routenzellen | Stadtkarten | Stadtzellen | Route zu Stadt |
|---|---|---|---|---|---|
| Rot | 25 | 31.500 | 11 | 11.880 | 2,65 |
| Kristall (Johto und Kanto) | 54 | 49.880 | 23 | 25.380 | 1,97 |
| Smaragd (Landrouten) | 41 | 87.787 | 16 | 23.700 | 3,70 |
| Feuerrot (mit Sevii) | 57 | 98.451 | 19 | 25.470 | 3,87 |
Wege nehmen die zwei- bis vierfache Fläche der Städte ein.33 Die 11 Seerouten von Smaragd würden weitere 45.600 Zellen hinzufügen.33 Das Verhältnis hängt davon ab, wie eine Karte eingeordnet wird, und jedes Spiel ordnet anders ein: Rot nach Karten-ID und Name, Kristall nach Umgebung (seine ROUTE-Umgebung umfasst zum Beispiel das Außengelände der Alph-Ruinen), Smaragd und Feuerrot nach map_type, wobei die Routen von Feuerrot die Sevii Eilande einschließen und die von Smaragd das Meer ausschließen.33 Auf dem Kartenbildschirm von Smaragd liest sich dieselbe Welt als 129 Routenfelder zu 22 Stadtfeldern, 5,9 zu 1, weil eine Stadt ein oder zwei Felder belegt, egal wie groß sie ist: Zehn der 16 Städte belegen eines, sechs belegen zwei.341117
Route 1, dreimal
Rot, Feuerrot und Kristall zeichnen dieselbe Idee in drei Auflösungen, und Route 1 ist der sauberste Vergleich. Die von Rot misst 10 mal 18 Blöcke, 20 mal 36 Zellen, vier Game-Boy-Bildschirme hoch, mit 42 Vorsprungszellen in 10 nach Süden gerichteten Reihen zwischen Zaunpfählen und Baumreihen und 104 Zellen Gras.5 Um das Zellenmodell der ersten Generation zu prüfen, habe ich diese eine Karte aus ihrem Blockset in doppelter Größe mit einem 16-Pixel-Raster gerendert; das Bild zeigt außerhalb der westlichen Baumreihe einen 3 Zellen breiten Streifen offenen Bodens, der beide Nähte berührt und von den Türen keiner der beiden Städte aus erreichbar ist, weshalb die Suchen ihre Übergänge von den Türen der Nachbarn aus beginnen.5 Das Modell der ersten Generation liest pro Zelle ein 8-mal-8-Tile, das linke untere, und es wurde nur an diesem einen Rendering per Augenschein geprüft; Kollisionen zwischen Tile-Paaren, etwa zwischen Wasser und Land, werden nicht modelliert.29
Die Route 1 von Feuerrot misst 24 mal 40 Zellen, auf dem größeren Bildschirm weiterhin vier Bildschirme hoch, mit 61 Vorsprungszellen und 178 Graszellen, 18,5 % der Karte: Das Remake behielt die Länge in Bildschirmen bei, vergrößerte die Karte in jeder Richtung um 4 Zellen und fügte Vorsprünge hinzu.6 Von der Haustür in Alabastia bis zum Pokémon-Center von Vertania City sind es 94 Zellen, 25 Sekunden, umgekehrt 76.7 Die Eröffnungsroute von Kristall, Route 29, misst 60 mal 18 Zellen, sechs Game-Boy-Bildschirme breit, zu 14,8 % Gras, ohne Trainer; der Weg hinüber von der Seite von Neuborkia zu der von Rosalia City beträgt 90 Zellen, der Rückweg 71.5
2. Von Tür zu Tür, und der Heimweg
Die Länge einer Route ist nur ein Teil einer Reise. Was die Spielerin oder der Spieler spürt, ist der Abschnitt: aus einem Gebäude heraus, durch eine Stadt, über die Route und die nächste Stadt, in das nächste Gebäude hinein. measure_travel.py durchsucht diesen ganzen Pfad über Paare aus (Karte, Zelle), durch Nähte, Warps und Vorsprünge, von der Zelle unter der ersten Tür bis zur letzten Tür, wobei der Schritt hinauf in sie mitgezählt wird.7
| Spiel | Von | Nach | Zellen | Gehen | Rennen | Durchquerte Karten |
|---|---|---|---|---|---|---|
| Smaragd | Wurzelheim, Haus der Spielfigur | Center von Rosaltstadt | 58 | 15,5 s | 7,8 s | Stadt, Route, Stadt |
| Smaragd | Center von Rosaltstadt | Center von Blütenburg City | 87 | 23,3 s | 11,7 s | Stadt, Route, Großstadt |
| Smaragd | Center von Blütenburg City | Center von Metarost City | 250 | 67,0 s | 33,5 s | Großstadt, Route, Wald, Route, Großstadt |
| Feuerrot | Alabastia, Haus der Spielfigur | Center von Vertania City | 94 | 25,2 s | 12,6 s | Stadt, Route, Großstadt |
| Feuerrot | Center von Vertania City | Center von Marmoria City | 267 (156 nach Zerschneider) | 71,5 s (41,8 s) | 35,8 s | durch die beiden Torhäuser des Waldes |
| Feuerrot | Center von Marmoria City | Center an Route 4 | 150 | 40,2 s | 20,1 s | Großstadt, Route, Route |
| Feuerrot | Center an Route 4 | Center von Azuria City | 314 | 84,1 s | 42,3 s | durch drei Höhlenebenen, eine davon zweimal |
Sekunden im Gehtempo sind Zellen mal 16 Frames geteilt durch 59,7275 Hertz. Rennen ist eine zweite Suche nach den wenigsten Frames, 8 pro Zelle, wobei jeder Sprung vom Vorsprung weiterhin 32 Frames kostet, weil der Sprung in jeder Gangart derselbe 32-Frame-Sprung ist; von den sieben Abschnitten oben springt nur der Höhlenabschnitt von einem Vorsprung, einmal, was ihn auf 2.528 statt 2.512 Frames bringt. Der Wert „nach Zerschneider“ ist dieselbe Suche, bei der die fünf Zerschneider-Bäume von Route 2 entfernt sind, was den Ostweg durch ROUTE2_EAST_BUILDING öffnet. Abblenden und Kämpfe werden nicht gezählt.7 Zwei Vereinfachungen der Suche wiegen beim Höhlenabschnitt am schwersten: Die Höhe der dritten Generation wird auf zwei Fälle reduziert, gleiche Höhe oder eine der beiden Seiten auf 0 oder 15, und ein Warp löst aus, wenn man in ihn hineintritt, nicht wenn man auf ihm ankommt; die 314 Zellen durch die Höhle, deren Pfad über 1F, B1F, B2F und wieder B1F führt, sind deshalb die unsicherste Zahl der Tabelle.29
Von Tür zu Tür, hin und, wo der Rückweg gemessen wurde, zurück, mit den Zielen des Briefings neben dem Kanon; gezeichnet von figures/make_figures.py aus travel.json.
Ein erster Abschnitt sind 15 bis 25 Sekunden Fußweg. Von der Haustür bis zum Pokémon-Center der nächsten Stadt sind es in Smaragd 58 Zellen, 15,5 Sekunden, und in Feuerrot 94 Zellen, 25,2 Sekunden.7 Die Abschnitte, die eine Minute erreichen (Smaragds 250 Zellen, Feuerrots 267 und 314), führen durch einen Wald oder eine Höhle; nach meiner Lesart sind das Dungeons, keine Wege, und ein Dungeon ist eine eigene Art von Ort.
Der Rückweg ist kürzer. Vom Center von Rosaltstadt zum Haus der Spielfigur in Wurzelheim sind es 42 Zellen gegenüber 58 auf dem Hinweg; von Vertania City nach Alabastia 76 gegenüber 94; von Blütenburg City nach Rosaltstadt 81 gegenüber 87; von Metarost City nach Blütenburg City 196 gegenüber 250; von Marmoria City nach Vertania City 254 gegenüber 267.7
Eine VM ist eine Abkürzung durch ein Tor, an dem Sie schon vorbeigegangen sind. Ohne die Zerschneider-Bäume auf Route 2 sind es von Vertania City nach Marmoria City 156 statt 267 Zellen, und der Pfad führt durch das Ostgebäude von Route 2 statt durch den Wald.7
Die ersten drei Abschnitte in Hoenn
Smaragd beginnt mit drei verschiedenen Antworten auf die Frage, was zwischen den Städten liegt, und die Messungen machen das Design lesbar.
Route 101 ist ein Korridor mit einer Haustür an jedem Ende. Sie misst 20 mal 20 Zellen, zwei Bildschirme hoch, zu 22,8 % hohes Gras, 91 der 237 Zellen, auf denen man stehen kann; drei nach Süden gerichtete Vorsprungsreihen von je vier Zellen durchqueren sie. Nordwärts von Wurzelheim braucht man 34 Zellen und überquert mindestens 10 Graszellen; südwärts von Rosaltstadt braucht man 19 und kann das Gras ganz umgehen, indem man von den Vorsprüngen springt. Von der Haustür der Spielfigur bis zum Center von Rosaltstadt sind es 58 Zellen, 15,5 Sekunden zu Fuß.6187
Route 102 ist breiter und hat die ersten Trainer. Sie misst 50 mal 20 Zellen, 3,3 Bildschirme breit, zu 14,3 % Gras, mit 4 Trainern, deren Sicht 2 oder 3 Zellen beträgt, einem Teich aus 26 Wasserzellen und 17 Vorsprungszellen. Blütenburg City schließt mit einem Versatz von −10 an, sodass die 20 Reihen der Route den Reihen 10 bis 29 von Blütenburg City gegenüberliegen. Von Center zu Center sind es von Rosaltstadt nach Blütenburg City 87 Zellen, 23,3 Sekunden, und zurück 81.67
Route 104 ist eine Route in zwei Hälften. Sie misst 40 mal 80 Zellen, acht Bildschirme hoch, zu einem Viertel Wasser, und kein Weg innerhalb der Karte verbindet ihre drei Nähte: Die südliche Hälfte erreicht den Südeingang des Blütenburg-Waldes, 51 Zellen von der Naht zu Blütenburg City, und die nördliche Hälfte seinen Nordausgang, 60 Zellen von der Naht zu Metarost City bis zur näheren der beiden Türzellen des Ausgangs (61 bis zur anderen). Vom Center von Blütenburg City zu dem von Metarost City sind es 250 Zellen über fünf Karten (Großstadt, Route, Wald, Route, Großstadt), 67 Sekunden zu Fuß, und 196 auf dem Rückweg.67
Was sich über die drei hinweg ändert, ist der Nenner. Die erste Route ist ein Weg von unter 20 Sekunden ohne Trainer und mit einem graslosen Heimweg; die dritte ist eine Minute Fußweg durch einen Dungeon. Nach meiner Lesart gibt das Spiel seine Distanz erst aus, nachdem die Spielfigur laufen gelernt hat.
Vorsprünge zeigen nach Hause
Hin und heim auf jeder vermessenen Route, deren Enden zu Fuß verbunden sind, und die wenigsten Graszellen in jeder Richtung; gezeichnet von figures/make_figures.py aus den Ausgaben der Routenskripte und grass_paths.txt.
Auf jeder vermessenen Route, deren Enden zu Fuß verbunden sind, alle neun mit Vorsprüngen, ist der Weg zur früheren Stadt kürzer. Rot Route 1 ist heimwärts 40 Zellen gegenüber 52 hin, 23 % kürzer; Feuerrot Route 1 43 gegenüber 58, 26 %; Smaragd Route 101 19 gegenüber 34, 44 %; Smaragd Route 102 55 gegenüber 62, 11 %; Kristall Route 29 71 gegenüber 90, 21 %; Kristall Route 30 57 gegenüber 74, 23 %; Rot Route 3 82 gegenüber 84, Feuerrot Route 3 94 gegenüber 97 und Kristall Route 32 128 gegenüber 132, jeweils 2 % bis 3 %. Die 4 Zellen von Route 32 stammen von einem einzigen seitlichen Sprung von einem Eckvorsprung, dem einzigen Sprung des Heimwegs.5617 Die Vorsprünge auf den ersten Routen zeigen alle in dieselbe Richtung: Die 42 Vorsprungszellen in 10 Reihen von Rot Route 1, die 61 in 10 Reihen von Feuerrot Route 1 und die 13 von Smaragd Route 101 (drei Reihen zu vier und eine Eckzelle) zeigen alle nach Süden, die Ecke nach Südosten, und das ist auf jeder dieser Karten der Weg zurück zur Ausgangsstadt.56
Die Vorsprünge nehmen auch das Gras aus dem Heimweg. Eine zweite Suche, die statt der Schritte die durchquerten Graszellen minimiert, findet, dass man auf Rot Route 1 nordwärts mindestens 15 Graszellen durchqueren muss und südwärts nur 4, alle im Durchgang neben Alabastia; Feuerrot Route 1 kommt auf 19 gegenüber 5; Smaragd Route 101 auf 10 gegenüber 0; Smaragd Route 102 auf 4 hin gegenüber 0 heim.18 Bulbapedias Komplettlösung zu Kantos Route 1 sagt dasselbe in Prosa: Südwärts können Trainer „can either hop down ledges to completely avoid any contact with wild Pokémon“ (von Vorsprüngen springen, um jeden Kontakt mit wilden Pokémon zu vermeiden) oder durch „the grass patches, the required path for northbound travel.“ (die Grasflächen gehen, den Pflichtweg nach Norden).35 Das ist eine einzige Wiki-Seite, einmal verwendet, als Gegenprobe zur Suche, und die Suche stimmt mit ihr überein, bis auf den Durchgang neben Alabastia: Er ist zwei Zellen breit und vier Grasreihen tief, sodass jeder Südweg im Zellenmodell dort 4 Graszellen durchquert, eine pro Reihe. Die Vorsprünge führen um alles andere Gras der Route herum, nicht ganz um alles.18
Die Zahlen der zweiten Generation brauchen je einen Vorbehalt. Die Kollision von Kristall besteht aus vier Bytes pro 32-Pixel-Block, eines pro Quadrant, und die Skripte nehmen an, dass sie zeilenweise geordnet sind (oben links, oben rechts, unten links, unten rechts), weil das Makro tilecoll die Reihenfolge nicht nennt.29 Ein COLL_HOP_*-Byte der zweiten Generation markiert die Kante, auf der die Spielfigur steht, nicht die Zelle dahinter; das hat probe_gen2_ledges.py geklärt, indem es unter jeder der 21 HOP_DOWN-Zellen auf Route 30 eine WALL-Zelle fand; die Kantenlesart wurde nur auf den Routen 29 und 30 geprüft.529 Kristall hat außerdem einseitige Wände. Ein Kollisionsbyte von COLL_RIGHT_WALL bis COLL_UP_LEFT_WALL ist Land, aber GetMovementPermissions verweigert einen Schritt aus einem solchen Tile durch seine Wandseite hinaus und einen Schritt durch diese Seite hinein; auf Route 32, der einzigen der vier mit solchen Wänden (41 Zellen, alle UP_WALL), verlängern sie den kürzesten Weg von 110 Zellen in jede Richtung, die eine Suche ohne sie findet, auf 132 hin und 128 heim. Ihre Eckvorsprünge, HOP_DOWN_RIGHT und HOP_DOWN_LEFT, springen nach unten oder zur Seite, je nachdem, wohin die Spielfigur schaut, sobald der normale Schritt verweigert wird, und der Heimweg nimmt einen von ihnen seitwärts. Rot hat keine einseitigen Wände: Seine einzige weitere Bewegungsregel, die Kollisionen zwischen Tile-Paaren, wirkt in beide Richtungen und ist nur für die Höhlen- und Wald-Tilesets aufgeführt, die keine dieser Karten verwendet.5 Und die Suche zählt einen Vorsprung als zwei Zellen Bewegung, was dem 32-Frame-Sprung der dritten Generation entspricht und für die erste und zweite angenommen wird.293
Was die Daten zeigen, ist ein Ergebnis, keine Absicht: Ich habe keine Aussage der Entwickler gefunden, dass Vorsprünge platziert wurden, um den Heimweg zu verkürzen, nur dass sie es auf jeder vermessenen Route tun.29 Die Regel, die ich daraus ableite: Ein Vorsprung ist eine Einbahn-Abkürzung zurück, niemals eine Wand nach vorn.
Die Frage der Höhe
Dieser Befund steht etwas quer zum vorigen Beitrag. Das Strukturen-Dossier hinter Pixel-Art-Bauten lehnte Vorsprünge rundweg ab, „No ledges to jump, no climbing, no isometric,“ (keine Vorsprünge zum Springen, kein Klettern, keine Isometrie), und jener Beitrag führt einen Einbahn-Vorsprung unter den Dingen auf, die sein Build nicht kann.3637 Dieses Dossier misst Vorsprünge als die Heim-Abkürzung des Kanons. Die beiden widersprechen sich nicht in den Fakten; sie sind sich uneinig darüber, ob eine Sammlerstadt Höhe braucht, um den Effekt zu erzielen. Die Entscheidung gehört in den nächsten Beitrag des Programms, über Höhe, Vorsprünge und Brücken, der noch nicht erschienen ist. Bis sie dort gefallen ist, vertagt das Briefing in Abschnitt 7 Vorsprünge auf den Höhenbeitrag und gewinnt seinen kürzeren Heimweg stattdessen aus einem Heckentor: ein Tor am Wiesenweg, das sich nur von der Seeseite öffnet, dieselbe Einbahn-Abkürzung zurück, ganz ohne Höhe.26
3. Nähte, Tore und der Kartenbildschirm
Eine Pokémon-Oberwelt ist keine große Karte. Sie besteht aus vielen kleinen, jede mit eigener Größe, eigenen Tiles und eigener Musik, Kante an Kante verbunden, sodass Sie ohne Schnitt von einer in die nächste gehen. Wie diese Verbindung funktioniert, entscheidet fast alles andere in diesem Abschnitt: wo ein Gebäude im Weg stehen muss, warum die Remakes weniger davon haben und was der Kartenbildschirm wissen kann.
Erste und zweite Generation: ein Streifen, in einen Rand kopiert
Eine Verbindung in Rot ist eine Zeile im Header einer Karte, die eine Richtung, den Nachbarn und einen Versatz in Blöcken nennt; die von Route 1 lautet connection north, ViridianCity, VIRIDIAN_CITY, -5, und das Makro berechnet vorab, welcher Streifen aus den Blöcken des Nachbarn in den Puffer der aktuellen Karte kopiert wird.38 Der Puffer, wOverworldMap, hält die Karte mit einem Rand von MAP_BORDER EQU 3 Blöcken, 6 Zellen, auf jeder Seite; die Verbindung füllt diesen Rand mit den nächstgelegenen 3 Blockreihen oder -spalten des Nachbarn, und CheckMapConnections wechselt die Karte, wenn die Koordinate der Spielfigur −1 oder die Breite oder Höhe der Karte überschreitet.39
Weil der Streifen als Blocknummern kopiert und mit dem gerade geladenen Blockset gezeichnet wird, können sich zwei Karten nur dann an einer Naht treffen, wenn sie ein Tileset teilen, und die Daten von Rot halten sich daran: Von seinen 78 Verbindungszeilen verbinden 76 Karten mit demselben Tileset. Die beiden Ausnahmen sind Route 22 und Route 23, OVERWORLD gegen PLATEAU, und die Header-Dateien markieren beide Zeilen mit „; unnecessary“ (unnötig).840 Kristall hat 142 Verbindungszeilen; 138 verbinden dasselbe Tileset (die Ausnahmen sind Dukatia City und Route 35 sowie Route 32 und Route 33, Johto gegen Johto Modern), und 92 bleiben innerhalb einer Kartengruppe.841
Dritte Generation: sieben Zellen des Nachbarn (acht im Osten), und die Grafik beim Überqueren
Eine Verbindung der dritten Generation ist ein Eintrag aus map, offset und direction in der map.json der Karte. Smaragd hat 134 Einträge für oben, unten, links und rechts sowie 14 Einträge fürs Tauchen und Auftauchen, und jeder der 134 hat einen passenden Gegeneintrag mit negiertem Versatz.8 Porymap, der Karteneditor, den die Dekompilierungs-Community verwendet, beschreibt die Funktion in drei Sätzen: „Maps can be connected together so that the player can seamlessly walk between them“ (Karten lassen sich verbinden, sodass die Spielfigur nahtlos zwischen ihnen gehen kann); „A connection has a direction, offset, and destination map“ (eine Verbindung hat eine Richtung, einen Versatz und eine Zielkarte); und „Connections are one-way, which means that you must keep the two connections in sync between the two maps.“ (Verbindungen sind einseitig, Sie müssen die beiden Verbindungen zwischen den Karten also synchron halten).42
Die Engine kopiert die aktuelle Karte in einen Puffer mit MAP_OFFSET 7 Zellen Rand auf jeder Seite (8 im Osten, weil der Puffer die Kartenbreite plus MAP_OFFSET_W breit ist, 2 × 7 + 1), und der Header nennt den Grund in einem Kommentar: „the player has 7 metatiles of view horizontally in either direction.“ (die Spielfigur sieht horizontal in jede Richtung 7 Metatiles weit). FillSouthConnection und seine Geschwister kopieren 7 Reihen oder Spalten des Nachbarn in diesen Rand (8 Spalten im Osten), am Versatz der Verbindung und nur über die eigene Breite des Nachbarn (FillNorthConnection beginnt beim Versatz plus MAP_OFFSET und kopiert die Breite des Nachbarn, soweit sie passt), und der ganze Puffer darf höchstens MAX_MAP_DATA_SIZE 10240 Zellen fassen.9 Wo keine Verbindung besteht, ist der Rand das 2-mal-2-Randmuster des Layouts, mit MAPGRID_IMPASSABLE per OR verknüpft, sodass er nie begangen werden kann (GetBorderBlockAt).9
Was der Puffer an einer Naht enthält, schematisch: ein Quadrat pro Zelle, bemessen nach MAP_OFFSET, FillNorthConnection und dem 20-mal-20-Layout von Route 101 mit dem 20 Zellen breiten Layout von Rosaltstadt im Norden bei Versatz 0; gezeichnet von figures/make_figures.py, ohne Spielgrafik.
Der Streifen des Nachbarn wird mit den Tilesets der aktuellen Karte gezeichnet (DrawMetatileAt nimmt das primäre und das sekundäre Set der Karte, auf der Sie sich befinden), bis die Spielfigur hinübergeht. Das Überqueren ruft LoadMapFromCameraTransition auf, das das Übergangsskript der neuen Karte ausführt, nur ihr sekundäres Tileset und ihre Palette lädt, Musik und Wetter wechselt und das Namensschild der Karte zeigt, ohne Abblende.10 Deshalb unterscheidet sich kein verbundenes Paar im primären Tileset: 0 der 134 von Smaragd und 0 der 120 von Feuerrot. 38 von Smaragd und 34 von Feuerrot verbinden verschiedene sekundäre Tilesets, und bei jeweils 24 davon verwendet der Streifen des Nachbarn im Rand (7 Zellen, 8 im Osten, abgeschnitten, wo er den Puffer verlassen würde, so wie die Engine ihn abschneidet) nur primäre Metatiles und wird deshalb von beiden Seiten aus korrekt gezeichnet.8
Versätze sind häufig. 36 der 134 Verbindungen von Smaragd und 68 der 120 von Feuerrot sind ungleich null; die Route 1 von Feuerrot sitzt 12 Zellen weit in der 48 Zellen breiten Kante von Vertania City.8 Die Gegenseitigkeit gilt in Feuerrot nicht ganz ausnahmslos: 112 seiner 120 Einträge sind gegenseitig, und die ummauerte Stadt macht 6 der übrigen 8 aus. Saffronia City verbindet sich einseitig mit den Routen 5 bis 8, während diese Routen sich nicht mit Saffronia verbinden, sondern mit einer eigenen Karte SAFFRON_CITY_CONNECTION; die letzten beiden sind Prototyp-Karten der Sevii Eilande.8 Ich lese die Anordnung um Saffronia als Zeichentrick: Die Verbindung existiert, um die Stadtmauer jenseits des Routenrands zu zeichnen, und der Weg hinein führt durch vier Torhäuser, deren Wachen in Rot die Spielfigur zurückschicken, bis sie ein Getränk bekommen.819 Wenn ein Ort durchgehend aussehen und dennoch abgesperrt sein muss, zeichnet die dritte Generation den Nachbarn in den Rand und setzt die Tür in ein Gebäude.
Wer eine Naht in eine Karte mit gesetztem show_map_name überquert, sieht den Namen des Ortes hereingleiten. Die Popup-Aufgabe wartet 31 Frames, gleitet mit 2 Pixeln pro Frame 40 Pixel herein (20 Frames), hält, bis ihr Zähler 120 überschreitet (121 Frames), und gleitet wieder hinaus (20 Frames): etwa 190 Frames, 3,2 Sekunden.21 Ich habe die Zustände der Aufgabe anhand ihrer Schwellen gezählt, also kann jeder Zustand einen Frame länger oder kürzer sein, als ich ihn angebe.29
Torhäuser: wo sich die Grafik ändert
Rot hat 27 Karten auf dem Tileset GATE oder FOREST_GATE: zweistöckige Tore an den Routen 11, 12, 15, 16 und 18 (10 Karten), einstöckige Tore an den Routen 2, 5, 6, 7 und 8, das Tor an Route 22, das Tor der Safari-Zone und ihre 4 Rasthäuser, 4 Eingänge zum Tunnelpfad und die 2 Tore des Vertania-Waldes.8 Jedes Tor in Rot, das zwei verschiedene Orte verbindet, verbindet zwei Tilesets: OVERWORLD mit FOREST (Vertania-Wald, Safari-Zone), mit UNDERGROUND (die vier Tunneleingänge) oder mit PLATEAU (Route 22 mit Route 23), Verbindungen, die die Kartenverbindungen von Rot fast nie herstellen.8
Route 2 ist der klarste Fall. Sie misst in Rot 20 mal 72 Zellen und in Feuerrot 24 mal 80 und lässt sich nicht von Ende zu Ende begehen: Ihre südliche und nördliche Hälfte treffen sich nur durch den Vertania-Wald, der in Rot aus dem Tileset FOREST statt OVERWORLD gezeichnet ist und durch zwei Torhäuser betreten wird.58 In Feuerrot sind es vom Center von Vertania City zu dem von Marmoria City 267 Zellen durch das Südtor, den Wald und das Nordtor.7 Daraus folgen drei Lesarten, und es sind Lesarten der Daten, keine Aussagen der Entwickler.
- Das Tor steht dort, wo sich die Grafik ändert. Eine Naht der ersten Generation zeichnet die Blöcke des Nachbarn mit dem aktuellen Blockset, also können sich zwei Karten nur dann an einer Naht treffen, wenn sie ein Tileset teilen, woran sich Rot in 76 seiner 78 Verbindungen hält. Ein Wald, der aus einem Wald-Tileset gezeichnet ist, braucht deshalb eine Tür, und das Torhaus ist die Tür.388
- Das Tor ist der Ort, an dem eine Regel wohnen kann. Die vier Tore von Saffronia schicken die Spielfigur zurück, bis ein Getränk übergeben wird (
TEXT_ROUTE5GATE_GUARD_GEE_IM_THIRSTY,BIT_GAVE_SAFFRON_GUARDS_DRINK); das Tor an Route 22 prüftBIT_BOULDERBADGE.19 Und drei Tore belohnen das Sammeln: Die Assistenten von Professor Eich überreichen ein Item, wenn die Zahl der besessenen Arten (CountSetBitsüberwPokedexOwned) am Tor von Route 2 10 erreicht, im Obergeschoss des Tors an Route 11 30 und im Obergeschoss des Tors an Route 15 50.20 - Das Tor ist eine Pause mit Menschen darin. Im Tor an Route 2 stehen ein Assistent von Professor Eich und ein Junge; der Weg geht nach einer Abblende an einem neuen Ort weiter.43
Die Remakes trennen sich nach Engine. Kristall hat 25 Karten mit der Umgebung GATE, von denen 19 Karten in verschiedenen Kartengruppen und 7 verschiedene Tilesets verbinden.8 Feuerrot behält die Tore von Kanto: 8 Innenkarten führen zu zwei verschiedenen Außenkarten (das Paar am Vertania-Wald, die vier Eingänge von Saffronia, der Nordeingang an Route 22 und der Safari-Eingang), und 13 weitere haben Türen an zwei getrennten Seiten einer Außenkarte, darunter die fünf zweistöckigen Routentore und das Ostgebäude von Route 2.8 Hoenn lässt sie fast ganz weg. In Smaragd führen nur 2 Innenkarten zu zwei verschiedenen Außenkarten (das Erdgeschoss des Pyrobergs und der Eingang der Safari-Zone), und 5 haben Türen an zwei Seiten einer Karte, darunter die beiden Stationen des Radwegs; Routen treffen Städte an offenen Nähten.8 Als Gebäude gezählt hat Smaragd 4 Tore (die beiden Radweg-Stationen, den Eingang der Safari-Zone und das Tor zur Kampfzone) gegenüber 14 in Feuerrot und 27 Karten auf Tor-Tilesets in Rot.8 Meine Lesart, und es ist eine Lesart: Hoenn konnte die Tore weglassen, weil seine Engine im Moment des Überquerens ein neues sekundäres Tileset lädt, sodass eine Route auf eine in anderer Grafik gezeichnete Stadt treffen kann, ohne dass ein Gebäude dazwischensteht.10
Der Kartenbildschirm und Fliegen
Die Regionskarte von Smaragd ist ein Raster aus 28 mal 15 Feldern (MAP_WIDTH 28, MAP_HEIGHT 15), 420 insgesamt; 158 davon, 37,6 %, gehören zu einem Ort, verteilt auf 54 Abschnitte: 34 Routen, 16 Städte und 4 weitere. Routen belegen 129 Felder und Städte 22.11 Von den 213 Einträgen in region_map_sections.json tragen 95 ein Rechteck auf dem Raster; 49 davon sind ein einzelnes Feld, das größte misst 4 mal 3 (Route 124 und ihr Unterwasser-Zwilling), Graphitport City 1 mal 2 und Malvenfroh City 2 mal 1.11 Ein Kartenbildschirm ist nach diesem Befund ein grobes Raster benannter Rechtecke, und die meisten Orte belegen ein Feld.
Fliegen ist der Punkt, an dem der Bildschirm auf das Gehen trifft. Fliegen verlangt in Smaragd den sechsten Orden (FIELD_MOVE_FLY gegen FLAG_BADGE06_GET in der Ordenstabelle) und einen Außenkartentyp (Overworld_MapTypeAllowsTeleportAndFly: Route, Stadt, Großstadt oder Seeroute). Auf der Karte ist eine Stadt nur dann MAPSECTYPE_CITY_CANFLY, wenn ihr FLAG_VISITED_*-Flag gesetzt ist, und jede der 16 Städte setzt ihr eigenes Flag in ihrem Übergangsskript; das von Rosaltstadt lautet setflag FLAG_VISITED_OLDALE_TOWN.13
Die anderen Spiele stimmen in der Form überein. Die Karte von Feuerrot misst 22 mal 15 Felder pro Seite, vier Seiten (Kanto und drei Gruppen der Sevii Eilande), jede in zwei Ebenen, Oberwelt und Dungeons; die Oberwelt-Ebene von Kanto füllt 90 Felder mit 38 Abschnitten, und Fliegen verlangt den dritten Orden. Ein Ort gilt in Feuerrot als besucht, wenn sein FLAG_WORLD_MAP_*-Flag gesetzt ist, was das Übergangsskript jeder Stadt beim Betreten erledigt (setworldmapflag FLAG_WORLD_MAP_CELADON_CITY), und Fliegen akzeptiert nur ein besuchtes Feld.23 Die Karte von Kristall platziert 95 Landmarken nach Pixelposition und bietet 24 Flugpunkte, 12 in Johto und 12 in Kanto; der Flugpunkt einer Stadt wird beim Betreten durch einen Callback gesetzt (VioletCityFlypointCallback: setflag ENGINE_FLYPOINT_VIOLET), und Fliegen prüft ENGINE_STORMBADGE.24 Die Stadtkarte von Rot führt 37 Außeneinträge auf einem 4-Bit-Raster (einer als unbenutzt markiert) und 60 Inneneinträge mit eigenen Positionen; das Betreten einer ihrer 11 Stadtkarten setzt das Bit dieser Stadt in wTownVisitedFlag, mit dem Quellkommentar „mark town as visited (for flying)“ (Stadt als besucht markieren, fürs Fliegen), die Flugliste überspringt unbesuchte Städte, und Fliegen verlangt den Donnerorden und eine Außenkarte.22
Keines der vier Spiele gibt der Spielfigur von Anfang an eine Karte mit; jedes übergibt sie im Laufe des Spiels. Die Karte (Town Map) in Rot und Feuerrot ist ein Item von der Schwester des Rivalen in Alabastia (in Rot angeboten, sobald die Spielfigur den Pokédex hat); das Karten-Modul (Map Card) in Kristall ist ein Geschenk in Rosalia City, der ersten Stadt hinter der Heimat; der PokéNav in Smaragd stammt aus dem Devon-Gebäude in Metarost City, der dritten Stadt hinter der Heimat.442345127 Wandkarten öffnen denselben Bildschirm früher: Smaragd hängt eine im Obergeschoss des eigenen Hauses und im Erdgeschoss jedes Pokémon-Centers auf, Feuerrot in seinen Centern, in der Schule von Vertania City und in einigen Häusern, und das HOUSE-Tileset von Rot, das das Haus des Rivalen in Alabastia verwendet, enthält ein Wandkarten-Tile.122344
Zusammengenommen ist die Regel über vier Spiele und drei Generationen hinweg einheitlich. Sobald die Spielfigur die Karte hat, zeigt sie jeden Ort der Region, besucht oder nicht; die Ausnahmen sind späte Orte, die von der Geschichte oder einem Event zurückgehalten werden: die Sevii-Seiten von Feuerrot, bis Skripte im Pokémon-Center von Eiland Eins ihre Flags setzen, und auf diesen Seiten Nabelfels und Geburtsinsel, die übermalt bleiben, bis die Spielfigur dort war; die Kampfzone und die Südliche Insel in Smaragd bis zu ihren Landmarken-Flags; und die Kanto-Karte in Kristall, bis die Spielfigur in Kanto steht.44451223 Die Schnellreise listet nur Orte auf, die Sie betreten haben, festgehalten durch ein beim Betreten gesetztes Flag, nur im Freien verfügbar und erst nach einem Orden aus der Spielmitte: dem dritten in Rot und Feuerrot, dem sechsten in Smaragd.13232422
4. Die anderen Modelle: Stardew Valley, Animal Crossing, Link’s Awakening
Pokémon ist eine Antwort auf das Land zwischen den Städten. Drei andere Spiele antworten anders, und jeder Unterschied ist eine Entscheidung, die Kiradex treffen muss. Die Zahlen in diesem Abschnitt stammen aus den Community-Wikis der Spiele und, bei Link’s Awakening, aus einer Disassemblierung; ich habe sie nicht mit dem Spielcode abgeglichen, außer wo eine Anmerkung es sagt.29
Stardew Valley: eine Nabe mit Speichen, vom Kalender geöffnet
Stardew blendet an jeder Kante ab. In den Worten seines Wikis: „When you reach the edge of an area or enter a building, and the screen fades to black during the transition, you’re moving between maps.“ (Wenn Sie den Rand eines Gebiets erreichen oder ein Gebäude betreten und der Bildschirm beim Übergang schwarz wird, wechseln Sie zwischen Karten.) Ein Warp ist eine Karteneigenschaft, deren Wert das Wiki als Warp [ <int fromX> <int fromY> <string toArea> <int toX> <int toY> ]+ angibt, mit dem Beispiel „6 20 Mountain 76 9“.46
Das Tal ist ein kleiner Graph um eine einzige Nabe. Pelican Town, das Dorf in der Mitte, verbindet sich im Nordwesten mit der Bushaltestelle und der Farm, im Südwesten mit dem Cindersap Forest, im Süden mit dem Strand und im Norden mit dem Berg.47 Die Bushaltestelle „connects the Farm to the west with Pelican Town to the east“ (verbindet die Farm im Westen mit Pelican Town im Osten) und öffnet sich über die Straße nach Westen zum unteren Teil der Backwoods.48 Der Cindersap Forest „has exits to the north into the Farm, to the east into Pelican Town, to the south into The Sewers, and to the northwest into the Secret Woods.“ (hat Ausgänge nach Norden zur Farm, nach Osten nach Pelican Town, nach Süden in die Kanalisation und nach Nordwesten in den geheimen Wald.)49 Die Backwoods „consists of two disconnected sections“ (bestehen aus zwei nicht verbundenen Teilen), einem oberen Pfad, der die Farm mit dem Berg verbindet, und einem unteren Teil, den man von der Straße an der Bushaltestelle erreicht.50 Der Ortskasten auf diesen Seiten listet nach meiner Zählung 26 Orte auf, von den Backwoods bis zum Hexensumpf.51
Die Speichen öffnen sich nach Datum und Tat. Der Berg hat anfangs „only two exits: to the south leading to Pelican Town, and to the west leading to the Backwoods“ (nur zwei Ausgänge: nach Süden nach Pelican Town und nach Westen in die Backwoods); die Minen öffnen am 5. Frühling, die Eisenbahn nach einem Erdbeben am 3. Sommer und die Brücke zum Steinbruch für die Bündel des Bastelraums oder 25.000 g.52 Die Wüste braucht den reparierten Bus, durch die Bündel des Tresorraums oder 40.000 g; der geheime Wald einen Baumstamm, der mit einer Stahlaxt oder besser geräumt wird; die Gezeitentümpel am Strand eine Brücke aus 300 Holz.53 Das Wiki nennt als Grundgeschwindigkeit der Spielfigur 2 beim Gehen, 5 beim Rennen und 6,6 auf dem Pferd, ohne Einheiten, und ich habe den Code des Spiels nicht geöffnet, um sie nachzuschlagen.54
Meine Lesart: Pokémon sperrt ein Gebiet über eine Fähigkeit, die die Spielfigur bei sich trägt, einen Orden oder eine VM. Stardew sperrt es über etwas, das die Gemeinschaft getan hat, ein Bündel, eine Brücke oder ein Erdbeben an einem Datum. Die zweite Art ist die, die eine gemeinsame Sammlerstadt verwenden kann, ohne dass sich jemand wegen seines Levels ausgesperrt fühlt.
Animal Crossing: das Acre-Raster und der Zug
Das Animal Crossing für den GameCube baut seine Stadt aus Acres. „Acres are grid elements measuring 16x16 spaces“ (Acres sind Rasterelemente von 16 mal 16 Feldern); die Stadt ist „five acres across by six down“ (fünf Acres breit und sechs hoch), mit dem Bahnhof „always located in Acre A-3“ (immer in Acre A-3), und die Karte beschriftet die Spalten mit 1 bis 5 und die Reihen mit A bis F.55 Das sind insgesamt 80 mal 96 Felder.17 Spätere Spiele änderten das Raster: Wild World hat 4 mal 4 Acres, Let’s Go to the City (City Folk) 5 mal 5, New Leaf 5 mal 4, New Horizons 7 mal 6, also 42 Acres.55
Der Acre ist auch eine Spawn-Regel. „Every time the player moves into an acre (with the exception of a player exiting their house upon loading the game), one fish and one bug spawn at the locations programmed within the acre data,“ (jedes Mal, wenn die Spielfigur einen Acre betritt, außer beim Verlassen des Hauses nach dem Laden des Spiels, erscheinen ein Fisch und ein Insekt an den in den Acre-Daten programmierten Stellen), und sie verschwinden, sobald die Spielfigur sechs Felder von diesem Acre entfernt ist.55 Die Stadtkarte kommt früh, von Tom Nook während des Teilzeitjobs; sie „is organized in a grid, with each square representing an acre,“ (ist als Raster angelegt, jedes Quadrat steht für einen Acre) und zeigt das Meer, die Flüsse, die Gebäude und die Wohnhäuser, nicht aber Bäume, Gegenstände oder Bewohner.56
Der Zug ist im GameCube-Spiel der einzige Weg in eine andere Stadt, per Memory Card, und „The train ride takes a few minutes“ (die Zugfahrt dauert ein paar Minuten); der Bahnhof „is located at the top of the player’s town,“ (liegt am oberen Rand der Stadt der Spielfigur), und ein neues Spiel beginnt damit, dass die Spielfigur dort ankommt.57
Meine Lesart: Acres machen eine Stadt lesbar, als Karte benannter Quadrate, und liefern eine Spawn-Regel, die das Herumlaufen belohnt, ohne pro Schritt zu würfeln. Der Zug macht die Reise zwischen Welten zu einer Szene statt zu einer Naht.
Link’s Awakening: die Welt in Bildschirme geschnitten
The Legend of Zelda: Link’s Awakening DX geht den umgekehrten Weg zum durchgehenden Scrollen von Pokémon. In der Dokumentation der zladx-Disassemblierung findet das Spiel „takes place in non-scrollable screen-wide rooms,“ (in nicht scrollbaren, bildschirmbreiten Räumen) statt, und „On the Overworld, rooms are stored as they are laid out during the game, on a 16x16 grid of rooms.“ (in der Oberwelt sind die Räume so gespeichert, wie sie im Spiel angeordnet sind, auf einem 16-mal-16-Raster aus Räumen.)58 Die Oberweltkarte umfasst 512 Bytes aus Zwei-Byte-Raumzeigern, 256 Räume, und die Tile-Überlagerung eines Raums ist „a straight forward array of 10x8 tile numbers“ (ein schlichtes Array aus 10 mal 8 Tile-Nummern).59 „Overworld rooms are grouped in 2x2 sections (i.e. 4 rooms). Each section has a tileset ID,“ (Oberwelträume sind in 2-mal-2-Abschnitte gruppiert, also 4 Räume; jeder Abschnitt hat eine Tileset-ID), und die 32 Tiles des Abschnitts werden beim Übergang in einen Raum ausgetauscht, der sie braucht.58 Jeder Oberweltraum hat ein Statusbyte in wOverworldRoomStatus, 256 Bytes, mit OW_ROOM_STATUS_VISITED EQU $80 neben Bits für Türen, Änderungen und Eulen; ich habe das Bit aus den Konstanten der Disassemblierung gelesen und nicht nachverfolgt, ob der Kartenbildschirm nur die Räume zeichnet, die es tragen.25
Meine Lesart: Pokémon scrollt eine durchgehende Welt und benennt sie abschnittsweise; Link’s Awakening schneidet die Welt in gleich große Bildschirme und merkt sich, welche Sie gesehen haben. Auf einem Telefon, dessen Sicht je nach Gerät variiert, 10,3 Tiles in der Breite auf einem iPhone 18 Pro Max im Hochformat und 29,7 auf einem aufgeklappten iPhone Duo, funktioniert nur das Scroll-Modell, ohne jeden Raum mit Balken einzufassen, und deshalb verwendet das Briefing es.60
5. Das Handwerk, als Regeln mit Zahlen
Das sind die Regeln, die die Messungen stützen, jeweils mit ihrer Herkunft. Wo eine Regel eine gemessene Tatsache in eine Empfehlung verwandelt, ist die Empfehlung meine, und die Regel zeigt das durch ihr Verb.
| Element | Regel | Quelle |
|---|---|---|
| Tempo | Eine Laufzelle kostet 16 Frames, etwa 0,27 Sekunden; ein Tile von Kiradex 0,25. Bemessen Sie jede Reise in Sekunden im eigenen Gehtempo des Spiels. | Schrittcode von Rot, Kristall und Smaragd; GBATEK; PlazaRig.swift |
| Routenlänge | 2 bis 10 Bildschirme entlang der Bewegungsachse; die erste Route eines Spiels 2 bis 6. | sechzehn vermessene Routen |
| Windung | Der längere Weg hinüber ist das 1,15- bis 1,70-Fache der Längsseite, der Heimweg das 0,95- bis 1,42-Fache. Bemessen Sie eine Route nach ihrem Pfad, nicht nach ihrem umschließenden Rechteck. | kürzeste Wege über Längsseiten auf den neun Routen, deren Enden zu Fuß verbunden sind |
| Erster Abschnitt | 15 bis 25 Sekunden von einer Tür bis zur Haupttür der nächsten Stadt. Ein Abschnitt von einer Minute ist ein Dungeon, kein Weg. | Smaragd 58 Zellen, Feuerrot 94; 250, 267 und 314 durch einen Wald oder eine Höhle |
| Proportion | Wege haben die zwei- bis vierfache Fläche der Stadt; auf dem Kartenbildschirm 5,9 zu 1, weil eine Stadt ein oder zwei Felder belegt. | Kristall 1,97, Rot 2,65, Smaragd 3,70, Feuerrot 3,87; Smaragds Karte |
| Dichte | Begegnungsboden macht 14 % bis 23 % der Karte einer ersten Route aus und dünnt bis zur dritten und vierten Route auf 4 % bis 9 % aus; über begehbarem Boden liegt eine erste Route bei 19 % bis 38 %. Eine erste Route hat keine Trainer. | die Routentabelle; Gras über begehbaren Zellen |
| Rhythmus | Etwa bei jedem neunten Schritt auf Begegnungsboden etwas zum Bemerken, nach ein paar Schritten Schonfrist bei der Ankunft; halten Sie Durststrecken und Fluten mit einem Boden und einer Rampe kurz. | Smaragds Schutz für vier Schritte, dann Rate 20, unverändert 11,1 %; Feuerrots Abklingzeit und Bonus |
| Der Heimweg | Kürzer als der Hinweg, um 2 % bis 44 % auf allen neun Routen mit Vorsprüngen, deren Enden zu Fuß verbunden sind, mit 0 bis 5 Graszellen gegenüber 4 bis 19. Ein Vorsprung ist eine Einbahn-Abkürzung zurück, niemals eine Wand nach vorn. | neun Routen; die Suche nach dem wenigsten Gras |
| Nähte | Lassen Sie zwei Gebiete nur dort an einer offenen Naht aufeinandertreffen, wo beide die Kante aus demselben Bodenset zeichnen; setzen Sie ein Gebäude mit zwei Türen dorthin, wo sich die Grafik ändert. | Rot 76 von 78, Kristall 138 von 142, dritte Generation 0 von 134 und 0 von 120 mit verschiedenen primären Sets; jedes Tor in Rot zwischen zwei Orten |
| Nachbarstreifen | Zeichnen Sie mindestens eine halbe Sicht des Nachbarn über die Kante hinaus. | die 7 Zellen der dritten Generation (8 im Osten) bei einem Bildschirm von 15 Zellen; die 6 Zellen der ersten bei 10 |
| Verbindungen | Versätze sind normal; jede Verbindung hat eine Gegenverbindung mit negiertem Versatz, und eine einseitige ist ein bewusster Zeichentrick. | Smaragd 36 von 134 mit Versatz, 134 von 134 gegenseitig; Feuerrots Saffronia |
| Namenskarte | Nennen Sie den Ort beim Betreten etwa drei Sekunden lang. | Smaragds Popup, etwa 190 Frames |
| Tore | Ein Tor ist der Ort, an dem eine Regel und eine Belohnung wohnen: eine Meilensteinprüfung, eine Wache, ein Geschenk bei einer bestimmten Anzahl. | Ordensprüfung, durstige Wache und Geschenke bei 10, 30 und 50 besessenen Arten in Rot |
| Kartenbildschirm | Ein grobes Raster benannter Rechtecke; die meisten Orte ein Feld, die größten ein paar. | Smaragd 28 mal 15, 49 von 95 Rechtecken ein einzelnes Feld, das größte 4 mal 3; die 5 mal 6 Acres von Animal Crossing |
| Schnellreise | Sobald die Spielfigur die Karte hat, zeigt sie jeden Ort, besucht oder nicht, bis auf wenige, die Story- oder Event-Flags zurückhalten; die Schnellreise zeigt nur, wo Sie waren, gesetzt durch ein Flag beim Betreten, und nur von draußen. | die Karte, das Karten-Modul, der PokéNav und Wandkarten; wTownVisitedFlag in Rot, die Flugpunkte von Kristall, FLAG_VISITED_* in Smaragd, FLAG_WORLD_MAP_* in Feuerrot; ein Besuchsprotokoll, das nicht bis zu seinem Kartenbildschirm verfolgt wurde: das Bit OW_ROOM_STATUS_VISITED in Link’s Awakening |
| Freischaltungen | Gebiete öffnen sich durch Tat und Datum ebenso wie durch Fähigkeit. | Stardews Minen, Eisenbahn, Steinbruch, Wüste und geheimer Wald; Zerschneider macht aus 267 Zellen 156 |
| Übergänge | Naht innerhalb einer Außenwelt; Abblende durch Türen und am Rand der Welt. | Pokémons Naht, Stardews Abblende, das Schieben in Link’s Awakening |
| Ausrichtung | Legen Sie eine Route entlang der langen Achse des Geräts an; eine Route, die ganz in eine Sicht passt, hat nichts mehr zu enthüllen. | die Tile-Zahlen vom 3. Oktober; Smaragd Route 101 mit 20 mal 20 gegenüber den 29,7 mal 20,9 eines aufgeklappten Duo |
Quellen der Tabelle: der Schrittcode und das Frame-Timing in Abschnitt 1;12315 das Gehtempo von Kiradex;4 die Skripte zu Routen, Reisen, Gras und Verbindungen;567188 der Begegnungscode;3132 Smaragds Code für Puffer, Überqueren und Popup;91021 die Torskripte;1920 die Kartenbildschirme, wie die Spielfigur sie erhält, und Fliegen;1112132345244422 Stardew Valley, Animal Crossing und Link’s Awakening;465253555825 die Tile-Zahlen pro Gerät aus dem ersten Beitrag dieser Reihe.60
Drei dieser Regeln verdienen einen weiteren Satz.
Die Nahtregel ist als Regel über Grafik formuliert, nicht über Engines. Der Game Boy zeichnete den Streifen eines Nachbarn mit dem Blockset der aktuellen Karte und konnte einen Nachbarn mit anderem Tileset deshalb überhaupt nicht zeigen; der Game Boy Advance zeichnet den Streifen mit den Tilesets der aktuellen Karte, bis Sie hinübergehen, und deshalb bleiben seine Nähte nach meiner Lesart bei einem primären Set und überwiegend bei primären Metatiles.38108 Beides lese ich als Grenzen des Tile-Speichers, die ein Telefon, das einen einzigen Atlas zeichnet, nicht teilt. Was bleibt, ist der visuelle Grund: Ein Weg, der an einer geraden Linie quer über den Bildschirm sein Material wechselt, wirkt wie eine Naht, ob die Engine eine brauchte oder nicht. Deshalb behält die Regel ihre erste Hälfte (offen aufeinandertreffen, wo der Boden weitergeht) und ihre zweite (ein Gebäude, wo sich die Grafik ändert), auch wenn nichts dazu zwingt.
Die Schnellreiseregel ist diejenige, die sich am ehesten genau zu kopieren lohnt. Jedes hier vermessene Pokémon-Spiel übergibt die Karte früh im Spiel, zeigt darauf jeden Ort, besucht oder nicht, bis auf wenige späte Orte, die Story- oder Event-Flags zurückhalten, und sperrt nur die Abkürzung; jedes verdient die Abkürzung dadurch, dass man irgendwo hingegangen ist, nicht durch Bezahlen.44451213232224 Für eine Sammel-App, deren XP nur aus in der realen Welt gescannten Karten stammt, ist das Besucht-Flag die richtige Währung, weil es einen Weg kostet und sonst nichts.27
Die Ausrichtungsregel kommt vom Telefon, nicht vom Kanon. Ein Pro Max im Hochformat sieht im Maßstab von Kiradex 10,3 mal 22,4 Tiles und ein aufgeklapptes iPhone Duo 29,7 mal 20,9, sodass eine Route in Nord-Süd-Richtung auf dem gängigen Telefon 22 Tiles ihrer Länge auf einmal zeigt, etwa 11 vor einem Sammler, den die Kamera zentriert hält, während eine in Ost-West-Richtung 30 auf einmal zeigt, etwa 15 voraus, aber nur auf dem aufgeklappten Duo.602717 Smaragds Route 101 mit 20 mal 20 würde ganz in eine einzige Sicht des aufgeklappten Duo passen, was bedeutet, dass eine so kurze Route dort nichts mehr zu enthüllen hat.617
6. Der Apple-Weg: Sichten, Nähte, Räume und eine Karte
Die Engine unter Kiradex World ist die, die der erste Beitrag dargelegt hat: eine RealityKit-Szene als 2D-Renderer, eine orthografische Kamera mit einer ganzen Zahl von Gerätepixeln pro Texel, der Boden als ein einziges MeshDescriptor-Mesh in einem Draw Call, jedes Material ein UnlitMaterial mit Deckkraftschwelle, und Bewegungsunschärfe sowie Tone Mapping von RealityView abgeschaltet.60 Der Strukturen-Beitrag fügte nach Tiefe sortierte Objekte in einem zweiten Mesh hinzu, Warps als Daten und Etagen, die an Ort und Stelle getauscht werden, indem die Bühne eine neue Identität bekommt, .id(floor.name), sodass SwiftUI einen RealityView abbaut und den nächsten aufbaut.37 Gebiete jenseits des Zauns brauchen von dieser Engine drei weitere Dinge: eine Sicht auf den Nachbarn über eine Naht hinweg, eine Möglichkeit, auf dem Server den Raum ohne Schnitt zu wechseln, und einen Kartenbildschirm. Nichts davon ist bisher gebaut, und nichts in diesem Abschnitt wurde auf einem Telefon gemessen; es ist der Plan, auf dem das Briefing ruht, mit jeder Kostenstelle benannt und als ungemessen gekennzeichnet.
Was ein Telefon sieht
Die Tile-Zahlen stammen aus der Tabelle des ersten Beitrags, berechnet aus Apples Spezifikationsseiten und den Simulatorprofilen von Xcode 27 bei den ganzzahligen Maßstäben von Kiradex.60
| Gerät und Ausrichtung | Pixel pro Texel | Sichtbare Tiles (Breite mal Höhe) | Halbe Sicht |
|---|---|---|---|
| iPhone 18 Pro Max, Hochformat | 8 | 10,3 mal 22,4 | 6 quer, 12 hoch |
| iPhone Duo Außendisplay, Hochformat | 6 | 14,6 mal 21,2 | 8 quer, 11 hoch |
| iPhone Duo Innendisplay, aufgeklappt | 6 | 29,7 mal 20,9 | 15 quer, 11 hoch |
Die letzte Spalte ist die aufgerundete halbe Sicht, der Nachbarstreifen, den die Nahtregel verlangt.17 Apple gibt das Innendisplay des iPhone Duo mit 1878 mal 2670 Pixeln bei 430 Pixeln pro Zoll an und das Außendisplay mit 1398 mal 2034 bei 460.61 Die Tile-Zahlen des Innendisplays sind nicht aus diesen Panelpixeln abgeleitet: Sie stammen aus dem logischen Framebuffer des Simulators von 2007 mal 2853 bei Maßstab 3,0 (2853 ÷ 96 ergibt 29,7 und 2007 ÷ 96 ergibt 20,9), der, wie der erste Beitrag erklärt, mit etwa 0,936 auf das Glas herunterskaliert wird, sodass auf der Hardware dieselbe Zahl an Tiles das Panel füllen sollte, mit etwa 5,6 Panelpixeln pro Texel, sofern der Compositor so herunterskaliert, wie der erste Beitrag es erwartet; das ist auf Hardware unbestätigt, und der erste Schritt des ersten Beitrags ist, nativeScale auf einem Gerät zu protokollieren.6017 Die Human Interface Guidelines verlangen, dass Spiele „look good and behave well at various aspect ratios“ (bei verschiedenen Seitenverhältnissen gut aussehen und sich gut verhalten), und der erste Beitrag las das als Argument dafür, mehr Welt statt Balken zu zeigen, was der Platz auch tut.6260
Für die Gebiete folgen daraus zwei Dinge. Wenn die Kamera dem Sammler folgt, ist die Sicht nach vorn etwa eine halbe Sicht.27 Eine Route in Nord-Süd-Richtung ist diejenige, die jedes Telefon gut zeigt: 22 Tiles davon auf einmal auf einem Pro Max im Hochformat, etwa 11 voraus, und 21 auf einmal auf dem aufgeklappten Duo, etwa 10 voraus. Eine Route in Ost-West-Richtung zeigt auf dem aufgeklappten Duo 30 Tiles auf einmal, etwa 15 voraus, und auf einem Pro Max im Hochformat nur 10, etwa 5 voraus, gehört also dorthin, wo das Ziel nahe ist.6017 Deshalb verläuft der lange Weg des Briefings, der Wiesenweg, von Nord nach Süd, und deshalb ist die Albumgasse, das am stärksten ost-westlich gestreckte Gebiet (44 mal 14, mehr als dreimal so breit wie hoch), eine Straße mit Ladenfronten, von der Sie auf dem aufgeklappten Duo von jedem Standpunkt aus den Großteil sehen. Das Seeufer (36 mal 20) und das Galerieviertel (30 mal 20) sind ebenfalls breiter als hoch, aber im Briefing sind sie Orte zum Verweilen, ein Ufer und ein Museumsviertel, keine Wege irgendwohin.2617
Eine Naht in RealityKit
Der Etagentausch aus dem Strukturen-Beitrag ist das falsche Werkzeug für eine Naht. Einen RealityView abzubauen und den nächsten aufzubauen, braucht eine Abblende, die es verbirgt, und die Türen der App haben noch keine: Heute wechselt der Ort 220 Millisekunden nach dem Schritt auf eine Tür, ein Etagenwechsel tauscht die Bühne ohne Abblende, und der Bewegungsbeitrag dieser Reihe schlägt den Schleier vor, der beides abdecken würde. Eine Naht hat per Definition keine Abblende.376316 Der Plan für eine Naht behält deshalb eine einzige Szene. Wenn der Sammler einer Kante mit Verbindung bis auf eine halbe Sicht nahekommt, baut die Bühne den Boden des Nachbarn als zweites Mesh, aus derselben Art von MeshDescriptor wie das erste, platziert es am Versatz der Verbindung in Welteinheiten und fügt die Objekte des Nachbarn in ihren eigenen Tiefen hinzu. Wenn die Füße des Sammlers die Kante überqueren, setzt die Bühne neu auf: Der Nachbar wird zum aktuellen Gebiet, das alte zum Streifen dahinter, und die Kamera, die heute der Spielfigur folgt und an die Karte geklemmt ist, wird an die Vereinigung beider geklemmt, solange beide geladen sind.2726
Drei Fakten der Engine machen das auf dem Papier günstig. Der Boden ist ein Mesh und ein Draw Call pro Gebiet, ein Nachbar fügt also einen Draw Call für seinen Boden und einen für seine Objekte hinzu.6037 Jedes Pixel ist ausgestanzt und schreibt Tiefe, sodass die Bäume eines Nachbarn nach derselben Tiefenregel wie die des aktuellen Gebiets gegen den Sammler sortiert werden, ohne neue Sortierung.37 Und die Schmiede exportiert bereits ein ganzes Gebiet als Buchstaben, Autotile-Boden, Objekte und Warps, ein Nachbar ist also eine zweite Datei derselben Art; das Briefing fügt ihr eine Liste connections hinzu.1426 Was mir nichts davon verrät, ist, was es kostet, das zweite Mesh in dem Moment zu bauen, in dem es gebraucht wird, oder ob es ein Ruckeln verursacht, wenn es innerhalb eines Frames gebaut wird; das ist ungemessen. Prüfung 6 im Briefing hat deshalb zwei Hälften, und beide decken die gesamte Annäherung ab, von bevor das Mesh des Nachbarn gebaut wird bis zum Ende des Überquerens: ein Timing-Protokoll pro Frame, das einen Stillstand des Main Thread erfasst, und eine Prüfung jedes aufgenommenen Frames, die einen schwarzen Frame erfasst. Eine Stichprobenprüfung würde nicht genügen: Ein schwarzer Frame unter sechzig pro Sekunde muss das Timing der Callbacks nicht stören, und eine Stichprobe alle 100 Millisekunden sieht bei 60 Hertz einen Frame von sechs.17 Die Timing-Hälfte und die Regel für jeden Frame sind meine Ergänzungen zur Prüfung des Dossiers, die die Helligkeit stichprobenartig erfasste.
Autotiling ist das Einzige, was die Regel des GBA nicht abdeckt. Die dritte Generation hielt ihre Nähte auf gemeinsamem Boden, weil der Streifen des Nachbarn mit den Tiles der aktuellen Karte gezeichnet wurde.108 Kiradex zeichnet jedes Gebiet aus einer einzigen Atlaspalette, diese Grenze gilt also nicht, aber die Blob-Autotiles am Rand eines Gebiets werden aus den eigenen Buchstaben des Gebiets berechnet; wenn die Schmiede nicht über die Naht hinwegschaut, endet ein Weg, der sie kreuzt, auf beiden Seiten in einer Einfassung. Das Briefing lässt die Schmiede deshalb die Randmasken über jede Verbindung hinweg berechnen.26
Räume, Präsenz und das erneute Verbinden
Der Platz von Kiradex ist ein Serverraum: Räume mit bis zu etwa 40 Spielenden, nach Region geshardet, auf FastAPI und WebSockets.27 Ein Gebiet jenseits des Zauns ist naturgemäß ein weiterer Raum, und das wirft das Problem auf, das ein Einzelspieler-Handheld nie hatte: die Menschen jenseits der Naht. Der Plan ist, dass der Client die Gehenden des benachbarten Raums abonniert, sobald er beginnt, dessen Streifen zu zeichnen, damit die Menschen in der Albumgasse vom Rand des Stadtplatzes aus sichtbar sind, und seinen eigenen Raum erst beim Überqueren wechselt, damit die gehende Figur nie anhält.26 Türen und die Tram bekommen eine Abblende, den Schleier, den das Briefing des Bewegungsbeitrags den Türen hinzufügt, und diese Abblende deckt das erneute Verbinden ab, wie es das Strukturen-Dossier schon für Innenräume vorgeschlagen hat.1626 Die Lösung des ersten Beitrags für eine schwarze Ansicht gilt auch für diese Abblende: Die Deckkraft der SwiftUI-Ansicht zu animieren, die den RealityView enthält, ließ ihn ungezeichnet, also ist die Abblende ein Schleier, der darüber gezeichnet wird.60
Der Server braucht dieselbe Karte, die der Client zeichnet. Heute trägt server/app/plaza.json die Buchstaben der Stadt, damit der Server einen Weg validieren kann; das Briefing lässt die Kopie jedes Gebiets ihre Buchstaben und ihre Verbindungen tragen, sodass ein Weg, der eine Naht überquert, auf beiden Seiten validiert wird.6026 Was ein Raumwechsel in einem echten Netzwerk kostet und ob das Abonnement eines zweiten Raums nahe einer Naht die Nachrichtenrate des Platzes verdoppelt, ist ungemessen.
Die Namenskarte, die Karte und die Tram in SwiftUI
Der Name des Gebiets gehört in SwiftUI, nicht in die Pixelebene. Der erste Beitrag stellte fest, dass eine fünf Texel hohe Pixelschrift bei den Maßstäben von Kiradex auf 13,3 oder 10 Punkte fällt, die zweite unter das 11-Punkt-Minimum der Human Interface Guidelines, und verlegte Dialogtext in SwiftUI im UI-Maßstab; eine Namenskarte ist dieselbe Art von Text.60 Ihr Timing stammt aus Smaragd: etwa drei Sekunden auf dem Bildschirm.21
Der Kartenbildschirm ist eine SwiftUI-Ansicht über einem kleinen Modell, einem Raster benannter Rechtecke, dem aktuellen Gebiet und der Menge der besuchten Gebiete. Auf dem aufgeklappten Duo sitzt er als Panel neben der Welt, so wie der Weltplan die Profilkarte des Sammlers neben den Platz setzt („The plaza on the open inner display is the best version of this: wide view, your profile card beside the world when you tap someone“, der Platz auf dem aufgeklappten Innendisplay ist die beste Version davon: weite Sicht, Ihre Profilkarte neben der Welt, wenn Sie jemanden antippen); auf einem Telefon ist er ein Sheet.27 Die Tram ist ein Warp von der Karte aus: abblenden, Raum wechseln, an der Haltestelle des Ziels aufblenden.
Die Menge der besuchten Gebiete muss mit dem Sammler reisen. Die Seite der Human Interface Guidelines zu Spielen sagt „Let players pick up their game on any of their devices,“ (lassen Sie Spielende ihr Spiel auf jedem ihrer Geräte fortsetzen), damit man „start back up exactly where they left off on a different device.“ (auf einem anderen Gerät genau dort weitermachen kann, wo man aufgehört hat).62 Eine auf dem Telefon freigeschaltete Tramhaltestelle sollte auch auf dem iPad offen sein, also liegt die Menge der besuchten Gebiete beim Profil des Sammlers auf dem Server statt im lokalen Speicher der App.26 Das erweitert Abschnitt 3 des Weltplans, der sagt: „Our server holds only the public profile card and the economy“ (unser Server hält nur die öffentliche Profilkarte und die Ökonomie); ich würde die Menge der besuchten Gebiete als ein weiteres Feld daneben hinzufügen, beschränkt auf eine Liste, welche der fünf Gebiete ein Sammler betreten hat, ohne Ort, ohne Text und ohne Besuchszeit, wie alles andere unter der Game-Center-Spieler-ID als Schlüssel abgelegt; die Datenschutzprüfung, die der Plan verlangt, müsste es mit abdecken.2726
Was es kostet, und was nicht gemessen ist
Nichts in diesem Abschnitt wurde zeitlich gemessen. Die ungemessenen Kosten sind: das Bauen der Boden- und Objekt-Meshes eines Nachbarn in dem Moment, in dem der Sammler sich einer Kante nähert; das Zeichnen der Meshes zweier Gebiete, solange beide geladen sind; das Abonnieren eines zweiten Raums nahe einer Naht; und der Raumwechsel beim Überqueren. Die Aufnahmeregel des ersten Beitrags bestimmt, wie sie gemessen werden: Im iPhone Duo Simulator sind RealityKit-Frames nur dann getreu, wenn sie aus dem Test-Bundle heraus aufgenommen werden (XCUIScreen.screens[1]), nicht vom Host aus.60 Prüfung 6 des Briefings nutzt genau diese Aufnahme für ihre Sicht auf den Nachbarn vor der Naht und führt ihre Prüfung jedes Frames und ihr aus CADisplayLink-Callbacks gelesenes Frame-Timing-Protokoll auf einem Geräte-Build statt im Simulator aus: auf einem aufgeklappten iPhone Duo, sobald eines zur Hand ist, und bis dahin auf einem iPhone 18 Pro Max, weil zum Zeitpunkt des Schreibens kein iPhone Duo mit meinem Mac gekoppelt ist.64 Bisher hat sich keine Aufnahmemethode als fähig erwiesen, jeden angezeigten Frame aufzuzeichnen; der Abgleich der Frame-Zahlen in der Prüfung, die Frames der Aufnahme gegen die Callbacks des Timing-Protokolls, entscheidet, ob eine es kann.
7. Das Briefing: was Kiradex baut und welche Prüfungen es bestehen muss
Synthese des Autors. Was folgt, ist mein Vorschlag, abgeleitet aus den Abschnitten 1 bis 6 und eingepasst in den Weltplan im Kiradex-Repository, dessen Abschnitt 4 („The game“, das Spiel) und Abschnitt 7 („Order of work“, Reihenfolge der Arbeit).2726 Er nennt keinen Ort, keine Kreatur und kein Zeichen aus einem Pokémon-Spiel; wo er eine Mechanik übernimmt, zitiert er die Regel aus Abschnitt 5, nicht das Vokabular des Ursprungsspiels. Jede Größe ist in 16-Pixel-Tiles angegeben, und die Länge eines Weges sind seine Kosten in der eigenen Pfadsuche der App, wobei ein diagonaler Schritt √2 Tiles zählt (Punkt 3).28 Jede Zeit ist diese Länge beim nominellen Gehtempo von 4 Tiles pro Sekunde, eine Zahl zum Vergleich mit dem Kanon, keine gemessene; das Briefing des Bewegungsbeitrags würde ein gerades Tile in 16 Ticks bei 60 Hertz gehen, 3,75 Tiles pro Sekunde, und eine Diagonale auf 23 Ticks aufrunden, womit jede Zeit hier bei geraden Schritten um ein Fünfzehntel und bei Diagonalen um etwa ein Zwölftel wächst.41617
Die Schleife von Kiradex spielt in der realen Welt. XP kommt nur von gescannten und registrierten Karten: „XP comes only from the real world, which is the point of the app.“ (XP kommt nur aus der realen Welt, und genau darum geht es in der App.)27 Gehen ist also ein Aufwand, kein Inhalt, und jedes Gebiet muss den Gehenden etwas geben, das sie mit ihrer Sammlung tun können: sie zeigen, um sie herum tauschen, eine Kosmetik dafür verdienen oder zurück zum Scanner geschickt werden. Nichts, was beim Gehen gefunden oder verdient wird, ist je eine Karte oder XP, und nichts in der Welt wird für Geld verkauft, außer über den Shop, den der Weltplan bereits festlegt.27
1. Fünf Gebiete: der Stadtplatz und vier dahinter
| Gebiet | Was es ist | Größe (Tiles) | Verbunden mit | Rolle in der Sammelschleife |
|---|---|---|---|---|
| Der Stadtplatz (vorhanden) | Die Stadt: Häuser, Halle, Kiosk, Brunnenterrasse, Ankunftshof | 40 mal 30 | die Nabe | Ankommen, die Lieblingskarte vorzeigen, Räume und die Halle betreten |
| Die Albumgasse | Eine Einkaufsstraße: der Kartenladen aus dem Strukturen-Baukasten, der Tauschposten, eine Wunschtafel, später eine Reihe aus sechs Marktständen | 44 mal 14 | der Stadtplatz, Osten, offene Naht | Münzen für Kosmetik ausgeben; sehen, was die Sammler der Stadt gezeigt bekommen möchten; der Tauschbildschirm; die Marktstände, wenn diese Phase kommt |
| Der Wiesenweg | Ein Parkweg durch Wiese und Gehölze, mit Blumenbeeten, in denen Fundstücke erscheinen, und einer von Hecken gesäumten Gasse nach Hause, deren Tor sich nur von der Seeseite öffnet | 24 mal 60, Längsachse Nord-Süd | der Stadtplatz, Norden, offene Naht | Fundstücke (Punkt 6); ein Spaziergang mit Freunden; der Weg zum See |
| Das Seeufer | Das ferne Ende des Weges: ein Ufer, ein Steg, Bänke, ein Bootshaus | 36 mal 20 | der Wiesenweg, Norden, offene Naht | Der stille Ort, um sich zu setzen und bei Sonnenuntergang eine Karte zu zeigen; der wöchentliche Treffpunkt |
| Das Galerieviertel | Ein steinernes Viertel: das Museum und die Galerie der Sammlerauslagen | 30 mal 20, dazu ein Torbogenhaus von 8 mal 6 | der Stadtplatz, Westen, durch den Torbogen (zwei Türen) | Auf dem ganzen Server vervollständigte Sets füllen das Museum; der Meilensteinhüter im Torbogen (Punkt 7) |
Die Gesamtfläche jenseits des Stadtplatzes beträgt 616 plus 1.440 plus 720 plus 600, also 3.376 Tiles, das 2,8-Fache der 1.200 des Stadtplatzes, innerhalb des Bandes von 1,97 bis 3,87 im Kanon (Abschnitt 5, Proportion).1733 Das Galerieviertel liegt hinter einem Gebäude, weil es in Stein aus einem anderen Bodenset gezeichnet ist (Abschnitt 5, Nähte). Die anderen drei teilen Rasen und Pflaster des Stadtplatzes und treffen sich deshalb an offenen Nähten, insgesamt drei: die Albumgasse an der Ostkante des Stadtplatzes, der Wiesenweg an seiner Nordkante und das Seeufer an der Nordkante des Wiesenwegs.26 Die Wunschtafel der Albumgasse zeigt, was die eigenen Sammler der Stadt gezeigt bekommen möchten, beurteilt an den echten Karten durch den Code, der das bereits tut (Kiradex/World/Wants.swift); ihre Stände warten auf den Marktplatz, den der Weltplan in einer späteren Phase über eBay abwickelt.6527
Die vorgeschlagenen Gebiete, auf das Raster des Kartenbildschirms gezeichnet; nur schematisch, gezeichnet von figures/make_figures.py, das prüft, dass jedes Rechteck der Größe seines Gebiets geteilt durch 10, gerundet, entspricht.
Prüfungen: 4 (Proportion) und 5 (Ausrichtung).
2. Distanzen und Zeiten
| Strecke | Ziel (Tiles) | Bei 4 Tiles pro Sekunde | Bezug im Kanon |
|---|---|---|---|
| Ankunftshof bis zur Tür des Kartenladens | höchstens 60 | höchstens 15 s | Abschnitt 5, Erster Abschnitt: 15 bis 25 s |
| Ankunftshof bis zum Steg am Seeufer, hin | 110 bis 120 | 28 bis 30 s | Länger als ein erster Abschnitt (15 bis 25 s), unter den Wegabschnitten des Kanons von bis zu 40 s und seinen minutenlangen Dungeons; Windung, hin das 1,15- bis 1,70-Fache der Längsseite |
| Steg am Seeufer bis zum Ankunftshof, heim, durch das Heckentor | höchstens das 0,8-Fache des Hinwegs | höchstens 24 s | Der Heimweg ist kürzer |
| Ankunftshof durch den Torbogen bis zur Museumstür | höchstens 70 | höchstens 18 s | Erster Abschnitt |
| Von jedem Gebiet zu jedem besuchten Gebiet per Tram | eine Abblende | etwa 1 s plus das erneute Verbinden | Schnellreise; Übergänge |
Die 60 Tiles Länge des Wiesenwegs winden sich zu 78 bis 90 Tiles Pfad, ein Faktor von 1,3 bis 1,5 (Abschnitt 5, Windung).26 Ein Pfad allein kann den Heimweg nicht kürzer machen: Auf einem Raster, in dem jeder Schritt in beide Richtungen gegangen werden kann, ist der kürzeste Weg von der Ankunft zum Steg der kürzeste Weg zurück, und ein geraderer Pfad würde auch auf dem Hinweg genommen. Die Ersparnis braucht etwas Einseitiges. Hier ist es ein Heckentor. Eine 2 Tiles breite, von Hecken gesäumte Gasse läuft schnurgerade an der Ostseite des Wiesenwegs hinunter, in einer Linie mit dem Steg, bis zur Nordkante des Stadtplatzes zwischen der Halle und dem Haus östlich davon, wo der Rasen zwischen beiden hinunter zum Ankunftshof führt. Das Tor am seeseitigen Ende der Gasse öffnet sich nur von der Seeseite. Auf dem Hinweg bleibt es zu, und der Pfad windet sich; auf dem Heimweg öffnet es sich, und die Gasse ist gerade. Das ist die Einbahn-Abkürzung zurück aus dem Kanon (Abschnitt 5, Der Heimweg), flach gelegt. Ich habe die drei Gebiete auf dem gemeinsamen Achtwege-Graphen aus Punkt 3 modelliert, mit der Stadt, wie die Schmiede sie heute zeichnet, und Gasse und Steg auf diese Weise platziert. Ich habe mich entschieden, die Wiese mit vier Hecken quer darüber zu winden, eine alle 12 Reihen, jede mit einer Lücke von 2 Tiles. Diagonale Schritte kürzen jede Kehre ab. Über alle Lückenpositionen hinweg können zwei gleichmäßig verteilte Hecken die Wiese auf diesem Graphen nicht auf 78 Tiles winden: Sie erreichen von Kante zu Kante höchstens 66,46 Tiles. Drei gleichmäßig verteilte können es, aber nur knapp: 6 ihrer 8.000 Lückenpositionen winden sie auf 78 bis 79,77 Tiles, und 5 dieser 6 liegen auch auf dem Hinweg innerhalb des Bandes von 110 bis 120 Tiles, bei 114,05 bis 119,02, mit einem Heimweg vom 0,740- bis 0,772-Fachen des Hinwegs, unter dem Ziel von 0,8. Vier Hecken winden sie in 5.912 ihrer 160.000 Positionen auf 78 bis 90 Tiles, was der Schmiede Spielraum lässt, die Wiese anzulegen. Dieser Spielraum ist mein Grund für vier; der Graph erzwingt ihn nicht. Auf diesen Layouts mit vier Hecken ist der Heimweg 88,07 Tiles lang, der Hinweg 108,74 bis 133,75. Das Ziel von 0,8 verlangt mindestens 110,09 auf dem Hinweg, und innerhalb des Bandes von 110 bis 120 Tiles erfüllen alle 4.111 Layouts es, bei 0,73 bis 0,80. Ist das Tor in beide Richtungen offen, sind beide Wege gleich lang.66 Das Gehen in acht Richtungen ist der Grund, warum die zwei Hecken des früheren Modells nicht mehr genügen: Es verkürzt die Gasse nach Hause nur von 91 Tiles auf 88,07, weil die Gasse schon gerade ist, nimmt aber einem gewundenen Hinweg weit mehr ab, sodass das Tor weniger spart, wenn sich die Wiese nicht stärker windet. Dasselbe Modell legt das untere Ende des Bandes fest. Kein Layout darin, bei keinem Versatz und keiner Stegposition, die es ausprobiert, kommt auf dem Hinweg unter 107,18 Tiles, und der Heimweg liegt nie unter 88,07, sodass ein Hinweg deutlich unter 110 Tiles das Ziel von 0,8 verfehlt.66 Einseitige Absätze von den Terrassen der Wiese würden dasselbe auf die Art des Kanons leisten, aber die Strukturen-Arbeit hat Vorsprünge abgelehnt, also werden die Absätze auf den Höhenbeitrag vertagt, der über sie entscheidet.3626
Prüfung: 3 (Distanzen).
3. Verbindungen als Daten
Jedes Gebiet ist ein Export der Schmiede wie town.json: Buchstaben, Autotile-Boden, Objekte, Warps und die Ankunft, dazu connections: [{"dir": "north"|"south"|"east"|"west", "area": "<id>", "offset": <tiles>}], wobei der Versatz der Ursprung des Nachbarn entlang der gemeinsamen Kante ist, die Konvention der dritten Generation.148 Jede Verbindung hat eine Gegenverbindung mit negiertem Versatz (Abschnitt 5, Verbindungen), ausnahmslos: Die einseitigen Verbindungen des Kanons sind ein Zeichentrick, den dieses Briefing nicht braucht. Die Kopie jedes Gebiets auf dem Server trägt die Buchstaben und die Verbindungen, sodass ein Weg über die Naht hinweg validiert wird.6026
Ein einziger Laufgraph dient beiden Seiten. TileMap.path in der App sucht in acht Richtungen, wobei ein diagonaler Schritt √2 kostet und nur erlaubt ist, wenn beide Tiles, zwischen denen er hindurchführt, begehbar sind, sodass niemand eine Wandecke abschneidet; Plaza.path des Servers in server/app/rooms.py sucht in vier Richtungen, obwohl sein Kommentar es „the same walk the app takes“ (denselben Weg, den die App nimmt) nennt.28 Das Briefing macht die Suche des Clients zum Vertrag: Die Änderung am Server ersetzt Plaza.path durch dieselbe Suche in acht Richtungen, mit √2 und ohne Eckenabschneiden, und beide lesen das Heckentor (Punkt 2) als gerichtete Kante, die von der Seeseite nur mit einem geraden Schritt betreten und nie Richtung See verlassen wird. Jede Distanz in diesem Briefing wird auf diesem Graphen gemessen.
Prüfungen: 1 (Gegenseitigkeit), 2 (Übergänge) und 12 (Serverparität).
4. Offene Nähte, keine Abblende
Das Überqueren einer offenen Naht hat keine Abblende (Abschnitt 5, Übergänge). Der Client zeichnet Boden und Objekte des Nachbarn mindestens eine halbe Sicht tief: 15 Tiles über eine Ost-West-Naht, die Hälfte der 29,7 des aufgeklappten Duo, und 12 über eine Nord-Süd-Naht, die Hälfte der 22,4 eines Pro Max im Hochformat (Abschnitt 5, Nachbarstreifen).6017 Die Schmiede berechnet die Autotile-Masken über jede Naht hinweg, damit ein Weg, der sie kreuzt, nicht in einer Einfassung endet, und schneidet an jeder Naht eine mindestens 2 Tiles breite Lücke in den Zaun der Stadt, deren Zellen auf beiden Seiten begehbar sind.1426 Der Wald, den die Schmiede heute 12 Tiles tief um die Stadt zeichnet (MARGIN = 12), weicht entlang der gesamten gemeinsamen Kante dem Nachbarn: Der Streifen des Nachbarn ersetzt dort den Waldrand, und der Wald bleibt nur dort, wo kein Gebiet angrenzt. Das korrigiert das Dossier, das die Lücke von 2 Tiles auch in den Waldrand schnitt und den Wald damit den größten Teil des Nachbarstreifens hätte verdecken lassen.1426 Der Client abonniert die Gehenden des benachbarten Raums, sobald er beginnt, dessen Streifen zu zeichnen, und wechselt seinen eigenen Raum beim Überqueren.26
Prüfung: 6 (kein schwarzer Frame, kein Stillstand des Main Thread und der Streifen vor der Naht sichtbar).
5. Die Namenskarte
Beim Betreten eines Gebiets über eine Naht oder per Tram gleitet sein Name herein, bleibt stehen und verschwindet innerhalb von etwa 3 Sekunden (Abschnitt 5, Namenskarte), im UI-Maßstab in SwiftUI, nie in der Pixelebene.2160
Prüfung: 7 (Timing der Namenskarte).
6. Fundstücke am Wiesenweg
- Wo. Blumenbeete bedecken 12 % bis 18 % der begehbaren Tiles des Wiesenwegs, gezeichnet als eigenes Autotile-Set, damit sie aus der Entfernung erkennbar sind.26 Dieser Anteil ist meine Wahl, keine Zahl aus dem Kanon. Auf dieselbe Weise gezählt, über begehbarem Boden, bestehen die ersten Routen des Kanons zu 18,8 % bis 38,4 % aus hohem Gras und seine späteren Routen zu 8,2 % bis 29,2 % (Abschnitt 1), die Beete liegen also bei den späteren Routen und unter jeder ersten Route: Ein Glitzern wird platziert und ist sichtbar, die Beete müssen es also nur einrahmen, nicht einen Wurf pro Schritt tragen.17
- Wie sie erscheinen. Nicht durch Würfeln pro Schritt. Beim Betreten des Wiesenwegs platziert der Server für diesen Sammler höchstens ein sichtbares Glitzern in einem Beet, deterministisch gewählt aus Sammler, Datum und Gebiet, die Acre-Betreten-Regel von Animal Crossing, bis der Sammler an diesem Tag drei hatte.5526 Ein sichtbares Glitzern hält die Regel auch für ein Kind lesbar und vermeidet Serien, ohne die Abklingzeit mit Rampe aus der Zeile Rhythmus in Abschnitt 5 zu brauchen.
- Was sie sind. Nur Dinge der Welt: ein Sticker oder Rahmen für den Raum, eine Kosmetik als Hülle oder Anstecker oder eine Notiz, die eine der Quests des Tages nennt, die nur ein echter Scan erfüllen kann; die Quests werden bereits aus der Sammlung selbst beurteilt (
Kiradex/World/Quests.swift).2765 Nie eine Karte, nie XP, nie etwas Verkauftes; ein Fundstück kann nie ein Grund zum Kaufen werden. Münzen warten: Der Weltplan lässt Münzen durch tägliche Besuche verdienen, legt aber weder Menge noch Obergrenze fest und setzt Münzen in seine vierte Phase, also werden Münzfunde vertagt, bis diese Regel existiert, und kommen dann aus demselben Budget für tägliche Besuche, statt etwas hinzuzufügen.27 - Wer sie sieht. Das Glitzern jedes Sammlers gehört ihm; Freunde, die zusammen gehen, sehen jeweils ihr eigenes. Es gibt nichts zu schnappen und nichts, worum man sich streiten müsste.
Prüfung: 10 (Fundstücke).
7. Der Torbogen und sein Hüter
Das Gebäude zwischen dem Stadtplatz und dem Galerieviertel ist ein Raum von 8 mal 6 mit einer Tür auf jeder Seite und einem Hüter an einer Theke. Der Hüter überreicht eine Kosmetik, wenn die Zahl der registrierten Karten des Sammlers erstmals 10, 30, 50 und 100 überschreitet, das Sammelmeilenstein-Tor aus der Zeile Tore in Abschnitt 5, gezählt aus der realen Sammlung, so wie XP gezählt wird.2026 Der Raum ist auch der Ort, an dem die Grafik von Rasen zu Stein wechselt (Abschnitt 5, Nähte). Nichts ist verschlossen: Der Torbogen ist immer offen, und der Hüter gibt nur.
Prüfung: 11 (Torbogenhüter).
8. Der Kartenbildschirm
Ein Raster von 16 mal 12 benannten Rechtecken, ein Feld pro 10 Tiles, gerundet: der Stadtplatz 4 mal 3, die Albumgasse 4 mal 1 an der Ostseite des Stadtplatzes, der Wiesenweg 2 mal 6 darüber, das Seeufer 4 mal 2 ganz oben, das Galerieviertel 3 mal 2 im Westen. Übereinander belegen das Seeufer, der Wiesenweg und der Stadtplatz 11 der 12 Reihen (Abschnitt 5, Kartenbildschirm).2617 Jedes Gebiet ist vom ersten Tag an gezeichnet und benannt. Das ist die eigene Entscheidung von Kiradex, nicht die des Kanons: Die vier Spiele zeigen jeden Ort, sobald die Spielfigur die Karte hat, bis auf wenige späte Orte, übergeben die Karte aber erst im Laufe des Spiels (Abschnitt 5, Schnellreise), und eine Sammlerstadt hat keinen Grund, jemanden das Recht verdienen zu lassen, sie zu sehen. Das aktuelle Gebiet pulsiert; besuchte Gebiete zeigen ihre Tramhaltestelle. Auf dem aufgeklappten Duo sitzt die Karte als Panel neben der Welt; auf einem Telefon ist sie ein Sheet.27
Prüfung: 8 (Modell des Kartenbildschirms).
9. Die Tram
Jedes Außengebiet hat eine Haltestelle. Eine Haltestelle öffnet sich, wenn der Sammler dieses Gebiet zum ersten Mal betritt, das Besucht-Flag aus der Zeile Schnellreise in Abschnitt 5, beim Betreten gesetzt und nie durch Level oder Bezahlung.1326 Vom Kartenbildschirm aus fährt ein Tippen auf ein besuchtes Gebiet dorthin: abblenden, der Raum wechselt, an der Haltestelle dieses Gebiets aufblenden, dann die Namenskarte. Aus Innenräumen gibt es keine Fahrten, so wie Fliegen keine zulässt (Abschnitt 5, Schnellreise).13 Die Tram macht aus dem Weg von 28 bis 30 Sekunden zum Seeufer ein Tippen, sobald der Weg einmal gegangen wurde, eine Abkürzung, die durch Besuchen statt durch eine Fähigkeit verdient wird (Abschnitt 5, Freischaltungen).26
Prüfung: 9 (Tramregeln).
10. Namen und Grafik
Der Name, die Schilder und die Zeichenketten jedes Gebiets durchlaufen eine Sperrliste geschützter Namen, und jedes Tile und jeder Sprite stammt aus der Schmiede.2726 Die Sperrliste existiert noch nicht: Das Dossier versprach eine im Repository, und das Repository hat keine. Sie anzulegen, ist Teil dieses Briefings: eine schlichte Liste der geschützten Namen, einer pro Zeile, im Repository neben der Schmiede eingecheckt, und ein Test, der Namen, Schilder und Zeichenketten jedes Gebiets aus den Exporten der Schmiede liest und fehlschlägt, sobald er einen Eintrag der Liste darin findet, ohne Rücksicht auf Groß- und Kleinschreibung.26 Keine nummerierten Straßennamen, kein Benennungsschema nach „Regionen“ und kein Gebäude, das das Aussehen eines Torhauses aus dem Kanon nachbildet: Größen und Regeln dürfen übereinstimmen, aber Formen und Namen müssen Kiradex gehören.26
Prüfung: 13 (Namen und Grafik).
11. Reihenfolge der Arbeit
Der Weltplan setzt den Platz (Räume, Synchronisierung, Sprechblasen, Profile, der Tauschbildschirm) an dritte Stelle und Münzen sowie den Shop an vierte.27 Die Gebiete passen als Phase 3b dazwischen, nachdem das Netzwerk des Platzes steht und vor oder parallel zu den Münzen:26
- Verbindungen in der Schmiede und auf dem Server (Format, Gegenseitigkeit, Zeichnen der Naht, Raumwechsel), die Achtwege-Suche des Servers und die Sperrliste mit ihrem Test, mit der Albumgasse als erstem Gebiet, weil sie den Kartenladen nutzt, den die Strukturen-Arbeit schon entworfen hat, und am kleinsten ist.
- Der Wiesenweg und die Fundstücke (Platzierung durch den Server, die Tagesobergrenze, die Inhalte).
- Der Kartenbildschirm und die Tram.
- Das Seeufer.
- Das Galerieviertel mit dem Torbogen, sobald das Innere des Museums existiert. Die Standreihe in der Albumgasse wartet auf die Marktplatzphase.
Jeder Schritt ist ein TestFlight-Build, wie es der Weltplan von jeder Phase verlangt, mit Aufnahmen für seine Prüfungen.27
Die Abnahmeprüfungen
Jede lässt sich durch ein Skript über die Exporte der Schmiede und die Tests des Servers ausführen oder durch eine Aufnahme im Simulator; Prüfung 6 läuft auf einem Gerät, abgesehen von ihrer einen Simulatoraufnahme.26
- Gegenseitigkeit. Die Exporte enthalten genau drei offene Nähte, Stadtplatz Ost zur Albumgasse, Stadtplatz Nord zum Wiesenweg und Wiesenweg Nord zum Seeufer, und für jede Verbindung
(a, dir, b, off)enthält der Export(b, opposite(dir), a, −off); der Test schlägt bei jeder einseitigen Verbindung fehl, ausnahmslos. - Übergänge. Eine Breitensuche von der Ankunft und den Türen jedes Gebiets aus findet auf jeder Seite jeder Naht mindestens 2 Übergangs-Tiles, die begehbaren Tiles auf der anderen Seite gegenüberliegen, die Methode von
measure_gen3_routes.py.6 - Distanzen. Die gemeinsame Achtwege-Suche aus Punkt 3 über die verbundenen Gebiete, mit dem Heckentor als Einbahnkante (von der Seeseite nur mit einem geraden Schritt betreten, nie Richtung See verlassen) und jeder Länge als Pfadkosten mit √2 für einen diagonalen Schritt, meldet: Ankunft bis Kartenladen höchstens 60 Tiles; Ankunft bis zum Steg am Seeufer 110 bis 120; Steg bis Ankunft höchstens das 0,8-Fache des Hinwegs; Ankunft bis zur Museumstür höchstens 70. Die Schmiede gibt die Zeiten bei 4 Tiles pro Sekunde aus.
- Proportion. Die Tiles jenseits des Stadtplatzes geteilt durch die Tiles des Stadtplatzes liegen zwischen 2,0 und 3,9.
- Ausrichtung. Die Höhe des Wiesenwegs übersteigt seine Breite.
- Kein schwarzer Frame und kein Stillstand des Main Thread an einer Naht. Auf einem Geräte-Build geht der Sammler über die Naht zwischen dem Stadtplatz und der Albumgasse, von einem Tile, das mehr als eine halbe Sicht vor der Naht liegt, bevor die Bühne mit dem Bau des Meshes der Albumgasse beginnt, bis der erste Schritt hinter der Naht beendet ist und der Stadtplatz zum Streifen dahinter geworden ist. Zwei Aufzeichnungen decken diese ganze Spanne ab. Für den Lauf fordert der Display Link über seinen
preferredFrameRateRange60 Hertz an, damit die wechselnde Rate eines ProMotion-Displays die Zählung nicht mitten im Gang verschiebt; Apple beschreibt den Bereich als einen, den der Display Link nach besten Kräften einzuhalten versucht, also zeigt das Timing-Protokoll und nicht die Anforderung, welche Rate tatsächlich galt.67 Die erste Aufzeichnung ist jeder Frame, den das Display zeigt, festgehalten durch eine Aufnahme bei dieser Rate und Frame für Frame geprüft: Ein Frame ist schwarz, wenn seine mittlere Helligkeit unter einem Viertel des Median-Frames der Spanne liegt (meine Schwelle), und ein einziger schwarzer Frame irgendwo in der Spanne lässt die Prüfung scheitern. Die Frame-Zahl der Aufnahme über die Spanne muss der Zahl der Callbacks im Timing-Protokoll über dieselbe Spanne entsprechen, damit eine Aufnahme, die Frames verliert, nicht bestehen kann, indem sie den schwarzen verpasst. Bisher hat sich keine Aufnahmemethode als fähig erwiesen, jeden angezeigten Frame aufzuzeichnen, und dieser Abgleich entscheidet, ob eine es kann. Weichen die Zahlen ab und besteht das Timing-Protokoll seine eigene Regel unten, liegt der Fehler bei der Aufnahme, und der Lauf zählt nicht; weichen sie ab und verfehlt das Timing-Protokoll diese Regel, scheitert die Prüfung. Die zweite ist dertargetTimestampeinesCADisplayLink-Callbacks, der auf dem Main Run Loop registriert ist, so wie Apples eigenes Beispiel ihn registriert, also der Zeitpunkt, zu dem laut Apples Dokumentation der nächste Frame angezeigt wird, protokolliert bei jedem Frame; kein Intervall zwischen aufeinanderfolgenden Werten darf 25 Millisekunden überschreiten, anderthalb Frames bei 60 Hertz, sodass schon ein einziger verlorener Frame die Prüfung scheitern lässt, so wie ein einziger schwarzer Frame es tut, was einen Stillstand des Main Thread beim Bau des Nachbarn ebenso erfasst wie beim Überqueren. Ein Lauf, dessen Timing-Protokoll sich auf eine andere Rate als 60 Hertz einpendelt, zählt nicht, und der Stromsparmodus ist dabei ausgeschaltet, weil Apple diesen Modus, einen kritischen thermischen Zustand und Bedienungshilfen unter dem nennt, was die Rate ändern kann.67 Das Gerät ist ein aufgeklapptes iPhone Duo, sobald eines zur Hand ist; zum Zeitpunkt des Schreibens ist kein iPhone Duo mit meinem Mac gekoppelt, also läuft die Prüfung bis dahin auf einem iPhone 18 Pro Max über dieselbe Naht, was zeigt, ob die Annäherung und das Überqueren auf einem Telefon stocken oder den Bildschirm schwarz werden lassen, aber nicht, wie das Innendisplay des Duo seine Frames taktet. Der Simulator kann nicht einspringen: Nach meiner Lesart misst sein Frame-Timing den Mac, auf dem er läuft, nicht ein Telefon. Daneben zeigt eine Aufnahme im Simulator des aufgeklappten Duo aus dem Test-Bundle heraus, mit dem Sammler auf dem letzten Tile des Stadtplatzes vor der Naht, mindestens 14 Tiles der Albumgasse.6064 - Namenskarte. Die Karte ist zwischen 2,5 und 3,5 Sekunden nach dem Überqueren einer Naht oder einer Ankunft per Tram auf dem Bildschirm.
- Modell des Kartenbildschirms. Unit-Tests: Das Rechteck jedes Gebiets liegt innerhalb von 16 mal 12, keine zwei überlappen sich, jedes Gebiet hat einen Namen, das aktuelle Gebiet ist markiert, und die Haltestelle eines unbesuchten Gebiets ist deaktiviert.
- Tramregeln. Servertests: Eine Fahrt zu einem unbesuchten Gebiet wird abgelehnt; eine Fahrt aus einem Innenraum wird abgelehnt; eine Fahrt endet an der Haltestelle des Ziels.
- Fundstücke. Servertests: höchstens ein Glitzern pro Betreten eines Gebiets, höchstens drei pro Sammler und Tag, dasselbe Glitzern für denselben Sammler, dasselbe Datum und dasselbe Gebiet, und Inhalte nur aus den Tabellen für Kosmetik und Questnotizen, nie eine Karte, XP oder Münzen. Ein Test der Schmiede: Blumenbeete bedecken 12 % bis 18 % der begehbaren Tiles des Wiesenwegs.
- Torbogenhüter. Ein Unit-Test: Die vier Meilensteingeschenke lösen je einmal aus, bei registrierten Zahlen von 10, 30, 50 und 100, und nie durch Münzen oder Käufe.
- Serverparität. Der Server lädt die Buchstaben und Verbindungen jedes Gebiets und führt einen Sammler von der Ankunft über zwei Nähte zum Steg am Seeufer und durch das Heckentor zurück, mit der Achtwege-Suche aus Punkt 3; App und Server liefern in beiden Richtungen dieselben Tiles und dieselben Kosten, und einen Schritt, den die Suche des Clients verweigern würde, eine abgeschnittene Ecke oder einen Schritt aus der Gasse hinaus durch das Tor, verweigert auch der Server, nach dem Muster der bestehenden Servertests.3728
- Namen und Grafik. Die Sperrliste existiert im Repository mit ihrem Test, und der Test besteht: Jeder Gebietsname, jedes Schild und jede Zeichenkette passiert die Liste; jedes Tile und jeder Sprite stammt aus der Schmiede.
Nicht in diesem Briefing
- Zufallsbegegnungen pro Schritt oder irgendetwas, das sich wie ein wilder Kampf spielt. Fundstücke werden platziert und sind sichtbar.
- Fähigkeitssperren für Kerngebiete. Kein Gebiet öffnet sich durch ein Level, einen Anstecker, einen Kauf oder ein Werkzeug; Gebiete öffnen sich, indem man hingeht, und nur die Abkürzung, die Tram, wird verdient, durch Besuchen. Das ist die Zeile Freischaltungen aus Abschnitt 5, auf die freundliche Art gelesen.5226
- Wege von mehr als etwa 30 Sekunden zwischen zwei Orten, an denen sich Menschen treffen, ohne Tram. Die minutenlangen Abschnitte des Kanons sind Dungeons.7
- Vorsprünge, Terrassen mit einseitigen Absätzen und jede Höhe pro Zelle. Vertagt auf den Höhenbeitrag, der über sie entscheidet; bis dahin gewinnt das Briefing seinen kürzeren Heimweg aus dem Heckentor, das einseitig, aber flach ist.36
- Nummerierte Straßennamen, ein Benennungsschema nach „Regionen“, an Orden gebundene Schnellreise oder ein Gebäude, das das Aussehen eines Torhauses aus dem Kanon kopiert.27
- Einseitige Verbindungen. Der Kanon nutzt sie als Zeichentrick; dieses Briefing hat keine, und Prüfung 1 schlägt bei jeder fehl.8
- Münzfunde, bis der Weltplan festlegt, wie viele Münzen ein täglicher Besuch einbringt.27
- Die Marktstände in der Albumgasse vor der Marktplatzphase.27
Die wichtigsten Erkenntnisse
Wenn Sie die Grafik zeichnen
- Zeichnen Sie eine Naht nur dort, wo der Boden weitergeht. Rot verbindet in 76 seiner 78 Verbindungen ein einziges Tileset, und jedes Torhaus in Rot zwischen zwei Orten steht dort, wo das Tileset wechselt; ein Gebäude mit zwei Türen ist die ehrliche Art, das Material zu wechseln.8
- Machen Sie die erste Route kurz und am grasreichsten: zwei bis sechs Bildschirme, 14 % bis 23 % ihrer Karte Begegnungsboden, keine Trainer. Dünnen Sie sie im Laufe der Reise aus.56
- Zeichnen Sie den Kartenbildschirm als grobes Raster benannter Rechtecke. Der von Smaragd umfasst 28 mal 15 Felder, und 49 seiner 95 Rechtecke sind ein einzelnes Feld.11
Wenn Sie die Engine bauen
- Speichern Sie Verbindungen als Daten mit Richtung, Nachbar und Versatz, und testen Sie, dass jede eine Gegenverbindung mit negiertem Versatz hat; die 134 von Smaragd haben alle eine.842
- Zeichnen Sie mindestens eine halbe Sicht des Nachbarn über die Kante hinaus. Die dritte Generation kopiert 7 Zellen (8 im Osten), weil die Spielfigur zu jeder Seite 7 weit sieht; in den Maßstäben von Kiradex sind das 15 Tiles auf dem aufgeklappten Duo und 12 auf einem Pro Max im Hochformat.960
- Behalten Sie über eine Naht hinweg eine einzige Szene und heben Sie den Szenenwechsel für Türen und Schnellreise auf, wo eine Abblende ihn verbirgt.1037
- Messen Sie Distanzen mit einer Suche, nicht mit einem Lineal, und mit jeder Bewegungsregel, die die Engine hat: Auf den neun vermessenen Routen, deren Enden zu Fuß verbunden sind, ist der längere Weg hinüber das 1,15- bis 1,70-Fache der Längsseite und der Heimweg das 0,95- bis 1,42-Fache, und der Rückweg kann ein Viertel kürzer sein als der Hinweg. Eine Suche ohne die einseitigen Wände und seitlichen Eckensprünge von Kristall setzt Route 32 mit 110 Zellen in jede Richtung an; mit ihnen sind es 132 hin und 128 heim.5617
- Geben Sie App und Server einen einzigen Laufgraphen. Wenn der Client in acht Richtungen geht und der Server in vier, gehört jede Distanz, die ein Test misst, nur einem von beiden.28
Wenn Sie die Schleife entwerfen
- Bemessen Sie jede Reise in Sekunden. Ein erster Abschnitt sind im Kanon 15 bis 25 Sekunden Fußweg; eine Minute ist ein Dungeon.7
- Machen Sie den Heimweg kürzer als den Hinweg, und geben Sie ihm etwas Einseitiges dafür, denn auf einem Raster, das in beide Richtungen begehbar ist, ist der kürzeste Weg zurück der kürzeste Weg hin. Der Kanon schafft es mit Vorsprüngen, um bis zu 44 %; ein Tor, das sich nur von der fernen Seite öffnet, schafft es ohne Höhe.5666
- Sobald die Spielfigur die Karte hat, zeigen Sie darauf jeden Ort, und lassen Sie nur die Abkürzung verdienen, durch Besuchen. Jedes hier vermessene Pokémon-Spiel übergibt die Karte im Laufe des Spiels, zeigt darauf jeden Ort, besucht oder nicht, bis auf wenige späte Orte, die Story- oder Event-Flags zurückhalten, setzt das Besucht-Flag beim Betreten und listet für die Schnellreise nur besuchte Orte; Kiradex geht einen Schritt weiter und zeigt seine Karte vom ersten Tag an.4445121323222426
- Öffnen Sie Gebiete durch Tat und Datum, wie Stardew es tut, statt durch ein Level oder einen Kauf, und geben Sie den Gehenden überall etwas, das sie mit ihrer Sammlung tun können.5227
Häufige Fragen
Wie lang sollte eine Route in einem Top-down-RPG sein?
In den 2D-Pokémon-Spielen zwei bis zehn Konsolenbildschirme entlang der Bewegungsachse, die erste Route zwei bis sechs. In Zellen reichen die sechzehn von mir vermessenen Routen entlang ihrer Längsseite von 20 bis 108, und auf den neun, die sich von Ende zu Ende begehen lassen, ist der kürzeste Weg hinüber in der längeren Richtung das 1,15- bis 1,70-Fache dieser Länge, weil der Pfad sich windet, und der Heimweg das 0,95- bis 1,42-Fache. Bei 16 Frames pro Zelle dauert ein erster Abschnitt von einer Tür bis zum Hauptgebäude der nächsten Stadt in Smaragd 15,5 Sekunden und in Feuerrot 25,2.56717
Wie verbinden Pokémon-Spiele Karten ohne Ladebildschirm?
Jede Karte listet ihre Nachbarn mit einer Richtung und einem Versatz auf. In Smaragd kopiert die Engine die aktuelle Karte in einen Puffer mit einem Rand von 7 Zellen (8 im Osten), „the player has 7 metatiles of view horizontally in either direction“ (die Spielfigur sieht horizontal in jede Richtung 7 Metatiles weit), und füllt den Rand an einer verbundenen Seite mit 7 Reihen oder Spalten des Nachbarn (8 Spalten im Osten), gezeichnet mit den Tiles der aktuellen Karte. Wenn die Spielfigur hinübergeht, lädt sie das sekundäre Tileset, die Palette, die Musik und das Wetter der neuen Karte und lässt ein Namensschild hereingleiten, ohne Abblende. Rot macht dasselbe mit einem Rand von 3 Blöcken, 6 Zellen.91039
Warum haben die Routen von Kanto Torhäuser?
Nach meiner Lesart der Daten, weil eine Game-Boy-Naht nur zwei Karten aus demselben Tileset verbinden kann und ein Torhaus eine Tür dort ist, wo das Tileset wechselt: 76 der 78 Verbindungen von Rot verbinden ein einziges Tileset, und jedes Tor in Rot zwischen zwei Orten verbindet zwei. Tore tragen auch Regeln: die Wachen von Saffronia, die ein Getränk wollen, eine Ordensprüfung an Route 22 und drei Assistenten, die bei 10, 30 und 50 besessenen Arten Items überreichen. Keine Aussage der Entwickler bestätigt den Tileset-Grund.8192029
Warum sind Vorsprünge in Pokémon Einbahnwege?
Das Verhalten einer Vorsprungszelle nennt eine Bewegungsrichtung, und die Spielfigur kann sie nur in dieser Richtung überqueren. Auf den frühen Routen gemessen zeigen die Vorsprünge zur früheren Stadt: Der Heimweg ist auf allen neun Routen mit Vorsprüngen, deren Enden zu Fuß verbunden sind, 2 % bis 44 % kürzer als der Hinweg. Auf den vier dafür durchsuchten Routen durchquert der Heimweg 0 bis 5 Zellen hohen Grases gegenüber 4 bis 19 auf dem Hinweg.365618
Wie entscheidet Fliegen, zu welchen Städten Sie fliegen können?
Über ein Besucht-Flag, das beim Betreten der Stadt gesetzt wird. In Smaragd setzt jede der 16 Städte ihr FLAG_VISITED_*-Flag in ihrem Übergangsskript, und die Regionskarte markiert eine Stadt nur dann als Ziel für Fliegen, wenn das Flag gesetzt ist; Rot hält ein Bit pro Stadt in wTownVisitedFlag, und Kristall setzt einen Flugpunkt in einem Karten-Callback. Fliegen verlangt außerdem einen Orden (den dritten in Rot und Feuerrot, den sechsten in Smaragd) und eine Außenkarte.13222423
Wie groß ist eine Stadt im Vergleich zu ihren Wegen?
Zwei- bis viermal kleiner. Routenzellen geteilt durch Stadtzellen ergeben 1,97 in Kristall, 2,65 in Rot, 3,70 bei den Landrouten von Smaragd und 3,87 in Feuerrot; auf dem Kartenbildschirm von Smaragd liest sich das Verhältnis als 5,9 zu 1, weil eine Stadt ein oder zwei Felder belegt, egal wie groß sie ist.3334
Ist es legal, die Art zu kopieren, wie Pokémon seine Routen baut?
Mechaniken, Größen und Methoden sind nicht urheberrechtlich geschützt. Konkrete Tiles und Sprites sind urheberrechtlich geschützt, Namen und Zeichen markenrechtlich. Der erste Beitrag dieser Reihe behandelt die Grenze, mit dem Circular 33 des US Copyright Office, das Systeme und Betriebsmethoden vom Urheberrecht ausnimmt, und den Patenten in Nintendos Klage gegen den Entwickler von Palworld.60 Dieses Briefing übernimmt Zahlen und Regeln, zeichnet jedes Tile aus der eigenen Schmiede von Kiradex und prüft Namen gegen eine Sperrliste.26
Wie dieser Beitrag entstand. Das Recherchedossier dahinter wurde am 4. Oktober 2026 zusammengestellt, aus flachen Klonen der Dekompilierungen von pret, vermessen von sechs Python-Skripten, die samt ihren Ausgaben gespeichert sind, und aus gespeicherten Kopien des Stardew Valley Wiki, von Nookipedia, der zladx-Disassemblierung, des Handbuchs von Porymap, von GBATEK, Pan Docs, einer Bulbapedia-Seite und Apples Seiten. Jede Pokémon-Zahl im Text ist die Ausgabe eines Skripts, und jede Anmerkung nennt das Skript. Vor der Veröffentlichung führte eine zweite Prüfung am 5. Oktober zu drei Neumessungen, Kristalls einseitige Wände und Eckensprünge, Rennen über Vorsprünge und die Wiese des Briefings auf dem Achtwege-Gehen der App, und zu einer genaueren Lektüre der Schonschritte im Begegnungscode; jede Anmerkung sagt, was sich verschoben hat. Der Vorschlag in Abschnitt 7 ist meiner und als solcher gekennzeichnet; nichts davon ist gebaut.
Verwandt auf dieser Website: Pixel-Art-Welten auf dem iPhone ist der erste Beitrag dieser Reihe, mit den Tile-Systemen, dem RealityKit-Rezept und den Tile-Zahlen pro Gerät, auf denen die Sichten dieses Beitrags ruhen; Pixel-Art-Menschen: Figuren und ein Editor auf dem iPhone ist der Sammler, der diese Routen geht; Pixel-Art-Bauten: Häuser, Hallen und Innenräume auf dem iPhone enthält die Türen, Warps und Etagenwechsel, die Tram und Torbogen wiederverwenden, und die Ablehnung von Vorsprüngen, die dieser Beitrag dem Höhenbeitrag überlässt; iPhone Duo für Entwickler leitet die Größe des Innendisplays her, aus der der Streifen der halben Sicht berechnet wird; Ihre App für das iPhone Duo vorbereiten behandelt das Nebeneinander-Layout, dem das Kartenpanel folgt; und Xcode 27.1 beta: Ihre App im iPhone Duo Simulator behandelt den Simulator, auf dem die Nahtprüfung des Briefings läuft.
Quellen
-
pret,
pokered/home/overworld.asmbei Commitd2704a6(OverworldLoopruftDelayFramezweimal pro Iteration auf;AdvancePlayerSpritebewegt 8 Iterationen lang um je 2 Pixel,wWalkCounter8; auf dem Fahrrad wirdAdvancePlayerSpritezweimal pro Iteration aufgerufen), gelesen am 4. Oktober 2026, https://github.com/pret/pokered/blob/master/home/overworld.asm. ↩↩↩↩ -
pret,
pokecrystal/engine/overworld/map_objects.asm(StepVectors: ein Laufschritt aus 8 Ticks zu 2 Pixeln, ein Fahrradschritt aus 4 Ticks zu 4 Pixeln) undpokecrystal/engine/overworld/events.asm(MaxOverworldDelay: db 2) bei Commit5beda23, gelesen am 4. Oktober 2026, https://github.com/pret/pokecrystal/blob/master/engine/overworld/map_objects.asm. ↩↩↩↩ -
pret,
pokeemerald/src/event_object_movement.cbei Commit731ad5b(die Schritttabellen: 16 Einträge insStep1Funcsfürs Gehen, 8 fürs Rennen und Surfen, 6 für das Kunstrad und Strömungen, 4 für das Eilrad, 2 für die schnellste Stufe;JUMP_DISTANCE_FAR32 Frames über zwei Zellen;sJumpY_Highmit einem Scheitel von 12 Pixeln), gelesen am 4. Oktober 2026, https://github.com/pret/pokeemerald/blob/master/src/event_object_movement.c. ↩↩↩↩↩ -
Kiradex-Quellcode,
Kiradex/World/PlazaRig.swift, Zeile 101 (tilesPerSecond: Float = 4) und Zeile 122 (runPace: Float = 1.6), am 4. Oktober 2026 aus dem Arbeitsverzeichnis gelesen, sowie die Zeilen 660 und 666 (jeder Frame addiertdt × tilesPerSecond × pace ÷ lengthzum Fortschritt eines Schritts, und ein beendeter Schritt setzt den Fortschritt auf 0 zurück und verwirft den Überschuss), gelesen am 5. Oktober 2026; privates Repository. Die 6,4 Tiles pro Sekunde sind das nominelle Rennen, 4 × 1,6. ↩↩↩↩↩ -
Messung des Autors, 4. Oktober 2026:
measure_gen12_routes.pyim Belegordner des Autors zu diesem Beitrag, Ausgabegen12_routes.txt. Eingaben aus pretpokeredbeid2704a6:constants/map_constants.asm(Größen in Blöcken, verdoppelt zu Zellen),maps/Route*.blk,gfx/blocksets/overworld.bstgegenOverworld_Coll, Gras-Tile$52unddata/tilesets/ledge_tiles.asm(ein 8-mal-8-Tile pro Zelle, das linke untere),data/maps/objects/Route*.asm(Trainer alsobject_event-Zeilen mit einerOPP_-Klasse),data/maps/headers/Route*.asm(Verbindungen). Aus pretpokecrystalbei5beda23:maps/Route*.blk,data/tilesets/<tileset>_collision.asmüberCollisionPermissionTable(die vier Bytes pro Block als zeilenweise angenommen),maps/Route*.asm(Trainer alsOBJECTTYPE_TRAINER). Erweitert am 5. Oktober 2026 (die frühere Ausgabe ist alsgen12_routes.pre-walls.txtaufbewahrt): Kristalls Seitenwände, die KollisionsbytesCOLL_RIGHT_WALLbisCOLL_UP_LEFT_WALL($b0bis$b7) und die seitlichen Bojen, verweigern einen Schritt durch die Wandseite hinaus und einen Schritt durch sie hinein, so wieGetMovementPermissionssie setzt (home/map.asm, ab Zeile 1511) und.CheckLandPermssie liest (engine/overworld/player_movement.asm, Zeile 686); die EckvorsprüngeHOP_DOWN_RIGHTundHOP_DOWN_LEFTspringen nach unten oder zur Seite (.ledge_table, Zeile 383), und ein Sprung wird erst versucht, nachdem der normale Schritt scheitert (.Normal, Zeilen 45 bis 56); kürzeste Wege werden mit Dijkstras Suche gefunden, da ein Sprung 2 kostet. Nur Route 32 hat Seitenwände (41 Zellen, alleUP_WALL, darunter der Block indata/tilesets/johto_collision.asmZeile 113), und nur ihre Wege haben sich verschoben: vorher 110 in jede Richtung, danach 132 nach Süden und 128 nach Norden.probe_gen12_exact.py(Ausgabeprobe_gen12_exact.txt) führt jede Kombination der drei Änderungen aus: Die Wände allein ergeben 132 in jede Richtung, die beidseitigen Eckensprünge verkürzen dann den Heimweg auf 128, und die exakte Suche ändert nichts;probe_route32_path.pyverfolgt den Sprung, von derHOP_DOWN_RIGHT-Kante bei Zelle (8, 80) über eineWALL-Zelle nach (10, 80). pokered hat keine einseitige Durchlassregel pro Tile; seinTilePairCollisionsLand(data/tilesets/pair_collision_tile_ids.asm) sperrt ein Tile-Paar in beide Richtungen und listet nur die Tilesets CAVERN und FOREST, während jede hier vermessene Karte OVERWORLD ist. Die Kantenlesart der zweiten Generation stammt ausprobe_gen2_ledges.py(21 von 21HOP_DOWN-Zellen auf Route 30 haben eineWALL-Zelle darunter). Das Zellenmodell der ersten Generation wurde per Augenschein an dem Rendering von Rot Route 1 durchrender_gen1.pyin doppelter Größe mit 16-Pixel-Raster geprüft (render_Route1.png, nur zur Analyse, aus urheberrechtlich geschützter Grafik abgeleitet und nicht veröffentlicht). Ebenso die Routen- und Stadtflächen hinter Anmerkung 33. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Messung des Autors, 4. Oktober 2026:
measure_gen3_routes.pyim Belegordner des Autors zu diesem Beitrag, Ausgabengen3_routes.txtundgen3_routes.json. Eingaben aus pretpokeemeraldbei731ad5bundpokefireredbei037335f:data/layouts/layouts.json(Größen), jede Zelle dermap.binjeder Route (Bits 0 bis 9 Metatile, 10 und 11 Kollision, 12 bis 15 Höhe), ihr Verhalten aus dem primären oder sekundärenmetatile_attributes.bin(Smaragd u16, Verhaltensbits 0 bis 7; Feuerrot u32, Verhaltensbits 0 bis 8, Begegnungstyp Bits 24 bis 26), Zählungen vonMB_TALL_GRASS,MB_JUMP_*und Wasserverhalten sowiedata/maps/Route*/map.json(Verbindungen, Trainer alsobject_events, derentrainer_typenichtTRAINER_TYPE_NONEist,trainer_sight_or_berry_tree_id). Kürzeste Wege per Breitensuche. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Messung des Autors, 4. Oktober 2026:
measure_travel.pyim Belegordner des Autors zu diesem Beitrag, Ausgabentravel.txtundtravel.json, über pretpokeemeraldbei731ad5bundpokefireredbei037335f. Breitensuche über Paare aus (Karte, Zelle) durch Nähte, Warps und Vorsprünge, von der Zelle unter der ersten Tür bis zur letzten Tür, einschließlich des letzten Schritts hinauf in sie (Zeile 136, „+1: the step up into the door“); Sekunden als Zellen × 16 Frames ÷ 59,7275 Hertz im Gehtempo. Das Rennen, erweitert am 5. Oktober 2026 (die frühere Ausgabe, die jede Rennzelle mit 8 Frames ansetzte, ist alstravel.pre-ledgerun.txtaufbewahrt), ist eine zweite Suche nach den wenigsten Frames, 8 pro Schritt und 32 pro Sprung vom Vorsprung, weil der Sprung in FeuerrotJump2beiJUMP_DISTANCE_FARist, 32 Frames in jeder Gangart (src/field_player_avatar.cPlayerJumpLedge, Zeile 905;src/event_object_movement.cDoJumpSpriteMovement, Zeile 9094); der Abschnitt vom Center an Route 4 nach Azuria City dauert 2.528 Frames, 42,3 Sekunden, mit einem Sprung, und kein anderer Hinweg der Tabelle springt von einem Vorsprung; Zerschneider-Bäume, Zertrümmerer-Felsen und Stärke-Felsbrocken blockieren ihre Zellen, sofern der Lauf nichts anderes sagt (der Lauf „nach Zerschneider“ entfernt sie, was auf Route 2ROUTE2_EAST_BUILDINGöffnet). Abblenden und Kämpfe werden nicht gezählt. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Messung des Autors, 4. Oktober 2026, erweitert am 5. Oktober 2026, um im Osten 8 Spalten zu lesen, wie
FillEastConnectionsie kopiert, und jeden Streifen dort abzuschneiden, wo er den Puffer verlassen würde, wieFillNorthConnection,FillSouthConnection,FillWestConnectionundFillEastConnectionihn abschneiden; die Zählungen nur primärer Tiles verschoben sich von 22 von 38 (Smaragd) und 25 von 34 (Feuerrot) auf 24 von 38 und 24 von 34:measure_connections.pyim Belegordner des Autors zu diesem Beitrag, Ausgabenconnections.txtundconnections.json, über alle vier Dekompilierungen: jede Kartenverbindung, die Übereinstimmung der Tilesets über jede Naht (für die dritte Generation primäre und sekundäre Sets und ob der Streifen des Nachbarn im Rand, 7 Reihen oder Spalten und 8 Spalten im Osten, nur primäre Metatiles verwendet), Gegenseitigkeit mit negierten Versätzen, Versätze ungleich null, Karten auf den Tilesets GATE und FOREST_GATE in Rot (data/maps/headers/*.asm), Umgebung GATE in Kristall (data/maps/maps.asm) und Innenkarten der dritten Generation, deren Warps zu zwei verschiedenen Außenkarten oder zu zwei Seiten einer einzigen führen. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
pret,
pokeemerald/include/fieldmap.h(MAP_OFFSET 7und sein Kommentar „the player has 7 metatiles of view horizontally in either direction“;MAX_MAP_DATA_SIZE 10240;MAP_OFFSET_WalsMAP_OFFSET * 2 + 1undMAP_OFFSET_HalsMAP_OFFSET * 2),pokeemerald/src/fieldmap.c(InitMapLayoutDatabemisst den Puffer als Karte plusMAP_OFFSET_WmalMAP_OFFSET_H;FillSouthConnectionund seine Geschwister, wobeiFillNorthConnectionx = offset + MAP_OFFSETundwidth = cWidthsetzt, wenn der Streifen passt,MAP_OFFSETReihen hoch, undFillEastConnectionMAP_OFFSET + 1Spalten kopiert;GetBorderBlockAtverknüpft den Rand per OR mitMAPGRID_IMPASSABLE),data/maps/Route101/map.json(Rosaltstadt im Norden bei Versatz 0) unddata/layouts/layouts.json(LAYOUT_ROUTE101undLAYOUT_OLDALE_TOWN, je 20 mal 20) bei731ad5b, gelesen am 4. Oktober 2026, https://github.com/pret/pokeemerald/blob/master/include/fieldmap.h und https://github.com/pret/pokeemerald/blob/master/src/fieldmap.c. ↩↩↩↩↩↩↩ -
pret,
pokeemerald/src/field_camera.c(DrawMetatileAtzeichnet mit dem primären und sekundären Tileset des aktuellen Layouts) undpokeemerald/src/overworld.c(LoadMapFromCameraTransition: das Übergangsskript, das sekundäre Tileset und die Palette, Musik, Wetter und das Namensschild der Karte, ohne Abblende) bei731ad5b, gelesen am 4. Oktober 2026, https://github.com/pret/pokeemerald/blob/master/src/overworld.c. ↩↩↩↩↩↩↩↩↩↩ -
pret,
pokeemerald/src/region_map.c(MAP_WIDTH 28,MAP_HEIGHT 15),src/data/region_map/region_map_layout.hundsrc/data/region_map/region_map_sections.jsonbei731ad5b, gelesen am 4. Oktober 2026, mit Zählungen durchmeasure_region_maps.py(Ausgaberegion_maps.txt), https://github.com/pret/pokeemerald/blob/master/src/data/region_map/region_map_layout.h. ↩↩↩↩↩↩↩ -
pret,
pokeemerald/src/field_control_avatar.c(ein Metatile mit dem VerhaltenMB_REGION_MAPführtEventScript_RegionMapaus),data/event_scripts.s(EventScript_RegionMap,special FieldShowRegionMap),data/maps/RustboroCity_DevonCorp_3F/scripts.inc(setflag FLAG_SYS_POKENAV_GET),src/start_menu.c(der Menüeintrag für den PokéNav nur, wennFLAG_SYS_POKENAV_GETgesetzt ist) undsrc/region_map.c(Kampfzone und Südliche InselMAPSECTYPE_NONEbis zu ihrenFLAG_LANDMARK_*-Flags, Zeilen 1213 bis 1216) bei731ad5b, gelesen am 4. Oktober 2026, mit den Wandkarten-Layouts durchscan_wall_maps.pyim Belegordner des Autors zu diesem Beitrag (Ausgabewall_maps.txt: die Obergeschosse beider Häuser in Wurzelheim und das Erdgeschoss jedes Pokémon-Centers), https://github.com/pret/pokeemerald/blob/master/data/event_scripts.s. ↩↩↩↩↩↩↩↩ -
pret,
pokeemerald/src/party_menu.c(FIELD_MOVE_FLYgegenFLAG_BADGE06_GET),src/overworld.c(Overworld_MapTypeAllowsTeleportAndFly),src/region_map.c(MAPSECTYPE_CITY_CANFLY, wenn dasFLAG_VISITED_*der Stadt gesetzt ist) unddata/maps/OldaleTown/scripts.inc(setflag FLAG_VISITED_OLDALE_TOWN) bei731ad5b, gelesen am 4. Oktober 2026, https://github.com/pret/pokeemerald/blob/master/src/region_map.c. ↩↩↩↩↩↩↩↩↩↩ -
Kiradex-Quellcode,
scripts/forge/town.py, Zeilen 79 und 80 (MARGIN = 12,WIDTH, HEIGHT = 40, 30) und seine ListeBUILDINGS(sieben Gebäude, Türen zuroom:me,room:npc-*oderhall, eine Ankunft), gelesen am 4. Oktober 2026; privates Repository. ↩↩↩↩↩↩ -
Martin Korth, GBATEK, LCD-Timing („Total 228 lines, 16.743 ms, 280896 cycles - ca. 59.737 Hz“, insgesamt 228 Zeilen, 16,743 ms, 280.896 Zyklen, etwa 59,737 Hz), gespeichert am 4. Oktober 2026 als
gbatek.txt, https://problemkaputt.de/gbatek.htm. ↩↩↩ -
Blake Crosley, „Pixel-Art Motion: Walks, Cameras and Doors on iPhone“, blakecrosley.com, 5. Oktober 2026, Abschnitt 7 („Where the walk stands today“: das Frame-Modell des Laufcodes von Kiradex, in dem das Rennen bei 60 Hertz 10 Frames pro Tile braucht, 6,00 Tiles pro Sekunde, und bei 120 Hertz 19, 6,32, weil der Überschuss jedes Tiles verworfen wird; die Wartezeit von 220 Millisekunden an der Tür und der Etagenwechsel ohne Abblende; und das Gehen des Briefings mit 1 Pixel pro Tick, 16 Ticks pro Tile bei 60 Hertz, 3,75 Tiles pro Sekunde, mit dem gestuften Schleier über Türen und Etagen), https://blakecrosley.com/blog/pixel-art-motion-on-iphone. ↩↩↩↩↩
-
Rechnung des Autors aus den Messwerten im Text, die Zahlen vom 5. Oktober ausgegeben von
arith_oct5.pyim Belegordner des Autors zu diesem Beitrag (Ausgabearith_oct5.txt): Zellen pro Sekunde als 59,7275 ÷ 16 und ÷ 8; die 4 Tiles pro Sekunde von Kiradex gegen 3,73 (7,2 % schneller) und sein Rennen gegen 7,47 bei 6,00 (19,6 % darunter) und 6,4 (14,3 % darunter); eine Zeit bei 4 Tiles pro Sekunde gegen eine bei 3,75 als 4 ÷ 3,75, ein Fünfzehntel länger, und die 23 Ticks einer Diagonale bei 60 Hertz gegen √2 ÷ 4 Sekunden als 0,3833 ÷ 0,3536 = 1,084, etwa ein Zwölftel länger (ausgegeben vonr6_arith.py); Sekunden pro Zelle als 16 ÷ 59,7275 (0,27) und pro Kiradex-Tile als 1 ÷ 4 (0,25); Pfadfaktoren als kürzester Weg geteilt durch die Längsseite der Route, für die längere Richtung und für den Heimweg, auf den neun Routen mit einem Weg von Naht zu Naht in jeder Richtung (ein gerader Weg von der ersten zur letzten Reihe einer 20 Zellen hohen Karte sind 19 Schritte, 0,95), und die Ersparnis als (Hinweg − Heimweg) ÷ Hinweg, 2,38 % (Rot Route 3) bis 44,12 % (Smaragd Route 101); hohes Gras über begehbaren Zellen pro Route aus den Gras- und Begehbarkeitszählungen der beiden Routenskripte; die Felder der Städte auf Smaragds Karte auswidthundheightder 16 Stadtabschnitte inregion_map_sections.json(zehn mit 1 mal 1, sechs mit 1 mal 2 oder 2 mal 1, 22 insgesamt); die Tile-Zahlen des inneren Duo als 2853 ÷ 96 und 2007 ÷ 96, wobei 96 für 16 Texel zu 6 Pixeln steht; Tiles vor einem zentrierten Sammler als die Hälfte der entlang der Bewegungsachse sichtbaren Tiles; eine Stichprobe alle 100 Millisekunden als ein Frame von 100 × 60 ÷ 1.000 = 6 bei 60 Hertz; die Timing-Schwelle als zwei Frames bei 60 Hertz, 33 Millisekunden; die 5 mal 6 Acres von Animal Crossing zu je 16 mal 16 Feldern als 80 mal 96; die Gebiete des Briefings als 44 × 14 + 24 × 60 + 36 × 20 + 30 × 20 = 3.376 Tiles über 40 × 30 = 1.200; halbe Sichten als die Tile-Zahlen vom 3. Oktober halbiert und aufgerundet; Felder des Kartenbildschirms als die Tiles jedes Gebiets geteilt durch 10, gerundet. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Messung des Autors, 4. Oktober 2026:
measure_grass_paths.pyim Belegordner des Autors zu diesem Beitrag, Ausgabegrass_paths.txt: eine 0-1-Breitensuche, bei der das Betreten einer Zelle hohen Grases 1 kostet und jede andere Bewegung 0, Vorsprünge einseitig, mit den Zellenmodellen und den von Türen aus erreichbaren Übergängen der beiden Routenskripte; Rot Route 1, Feuerrot Route 1, Smaragd Routen 101 und 102. Die Zellen des Durchgangs stammen ausprobe_grass_gateway.py(Ausgabegrass_gateway.txt), das die Südsuche auf Rot Route 1 wiederholt und dabei jede Graszelle nacheinander zu normalem Boden macht: Nur die 8 Zellen der letzten vier Reihen des Durchgangs, zwei pro Reihe, senken das Minimum. ↩↩↩↩↩↩ -
pret,
pokered/scripts/Route5Gate.asm(TEXT_ROUTE5GATE_GUARD_GEE_IM_THIRSTY,BIT_GAVE_SAFFRON_GUARDS_DRINK) undpokered/scripts/Route22Gate.asm(BIT_BOULDERBADGE) beid2704a6, gelesen am 4. Oktober 2026, https://github.com/pret/pokered/blob/master/scripts/Route5Gate.asm. ↩↩↩↩↩ -
pret,
pokered/scripts/Route2Gate.asm,scripts/Route11Gate2F.asm,scripts/Route15Gate2F.asm(Schwellen von 10, 30 und 50) undengine/events/oaks_aide.asm(CountSetBitsüberwPokedexOwned) beid2704a6, gelesen am 4. Oktober 2026, https://github.com/pret/pokered/blob/master/engine/events/oaks_aide.asm. ↩↩↩↩↩ -
pret,
pokeemerald/src/map_name_popup.cbei731ad5b(POPUP_OFFSCREEN_Y 40, das Gleiten um 2 Pixel pro Frame,tOnscreenTimer > 120), gelesen am 4. Oktober 2026, https://github.com/pret/pokeemerald/blob/master/src/map_name_popup.c. Die Summe von 190 Frames ist die Zählung des Autors über die Zustände der Aufgabe anhand ihrer Schwellen; jeder Zustand kann einen Frame länger oder kürzer sein. ↩↩↩↩↩ -
pret,
pokered/data/maps/town_map_entries.asm(37 Außeneinträge, einer unbenutzt; 60 Inneneinträge),engine/overworld/toggleable_objects.asm(wTownVisitedFlag, kommentiert mit „mark town as visited (for flying)“),engine/items/town_map.asm(die Flugliste überspringt unbesuchte Städte) undengine/menus/start_sub_menus.asm(Fliegen verlangt den Donnerorden, Bit 2, und eine Außenkarte) beid2704a6, gelesen am 4. Oktober 2026, https://github.com/pret/pokered/blob/master/engine/items/town_map.asm. ↩↩↩↩↩↩↩ -
pret,
pokefirered/src/data/region_map/region_map_layout_kanto.hund die drei Sevii-Layouts (22 mal 15 pro Seite, Oberwelt- und Dungeon-Ebene),src/party_menu.cundinclude/constants/party_menu.h(Fliegen alsFLAG_BADGE01_GET + fieldMovemitFIELD_MOVE_FLY2, der dritte Orden),src/region_map.c(GetMapsecTypeliefertMAPSECTYPE_VISITEDnur, wenn dasFLAG_WORLD_MAP_*-Flag des Ortes gesetzt ist, ab Zeile 2957; Fliegen akzeptiert nur ein besuchtes Feld; die Sevii-Seiten bleiben bisFLAG_SYS_SEVII_MAP_123undFLAG_SYS_SEVII_MAP_4567verborgen, Zeilen 1028 und 1556, die die Skripte des Centers von Eiland Eins setzen; Nabelfels und Geburtsinsel bleiben übermalt, bisFLAG_WORLD_MAP_NAVEL_ROCK_EXTERIORundFLAG_WORLD_MAP_BIRTH_ISLAND_EXTERIORgesetzt sind, Zeilen 1521 bis 1524),data/maps/CeladonCity/scripts.inc(setworldmapflag FLAG_WORLD_MAP_CELADON_CITYim Übergangsskript),data/maps/PalletTown_RivalsHouse/scripts.inc(die Schwester des Rivalen übergibt die Karte,RECEIVED_TOWN_MAP) unddata/event_scripts.s(EventScript_WallTownMap,special ShowTownMap) bei037335f, gelesen am 4. Oktober 2026, mit Zählungen durchmeasure_region_maps.pyund Wandkarten durchscan_wall_maps.py(Ausgabewall_maps.txt: das Erdgeschoss jedes Pokémon-Centers, die Schule von Vertania City und einige Häuser), https://github.com/pret/pokefirered/blob/master/src/data/region_map/region_map_layout_kanto.h. ↩↩↩↩↩↩↩↩↩↩ -
pret,
pokecrystal/data/maps/landmarks.asm(95 Landmarken),data/maps/flypoints.asm(24 Flugpunkte),maps/VioletCity.asm(VioletCityFlypointCallback: setflag ENGINE_FLYPOINT_VIOLET) undengine/events/overworld.asm(ENGINE_STORMBADGE) bei5beda23, gelesen am 4. Oktober 2026, https://github.com/pret/pokecrystal/blob/master/data/maps/flypoints.asm. ↩↩↩↩↩↩↩ -
zladx, LADX-Disassembly bei Commit
2a5c2c0,src/constants/memory/wram.asm(wOverworldRoomStatus,ds $100) undsrc/constants/gameplay.asm(OW_ROOM_STATUS_VISITED EQU $80und die übrigen Statusbits), gespeichert am 4. Oktober 2026 alsladx-wram.asmundladx-gameplay.asm, https://github.com/zladx/LADX-Disassembly/blob/main/src/constants/gameplay.asm. ↩↩↩ -
Recherchedossier des Autors, „Beyond the plaza: routes, map connections and districts in the canon“, 4. Oktober 2026, Abschnitt 4 („The brief for Kiradex“), die Synthese des Autors: die fünf Gebiete und ihre Größen, die Distanzziele, das Verbindungsformat, der Plan für Naht, Präsenz und Zaunlücke, die Fundstücke, der Torbogenhüter, der Kartenbildschirm, die Tram, die Reihenfolge der Arbeit, die dreizehn Abnahmeprüfungen und die Ablehnungen. Kiradex-Repository
docs/research/routes/01-routes.md; privat. Das Band für den Hinweg wurde am 5. Oktober 2026 von den 90 bis 120 Tiles des Dossiers auf 110 bis 120 verengt, aus dem in Anmerkung 66 genannten Grund; die Kopie des Dossiers trägt noch das frühere Band. Ebenfalls am 5. Oktober festgelegt, nach dem Dossier und nicht in seiner Kopie: der gemeinsame Achtwege-Laufgraph von App und Server, die vier Hecken der Wiese, die Prüfung jedes Frames in Prüfung 6, die Sperrliste als offene Arbeit und das Vertagen der Münzfunde. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Kiradex,
docs/WORLD.md, „Kiradex World: research and plan“, gelesen am 4. Oktober 2026 (privates Repository): Abschnitt 1 („The rules for Kiradex World“: nichts von ihnen in der Welt); Abschnitt 4 („Levels“: „XP comes only from the real world, which is the point of the app“; „Coins and the shop“: Münzen durch Scans, Level und tägliche Besuche verdient; „The plaza“: Räume mit bis zu etwa 40 Spielenden, nach Region geshardet, die Kamera folgt der Spielfigur und ist an die Karte geklemmt); Abschnitt 5 („What the Duo gives us“: „The plaza on the open inner display is the best version of this: wide view, your profile card beside the world when you tap someone“); Abschnitt 6 (der Marktplatz über eBay, der Stand); Abschnitt 7 („Order of work“, jede Phase ein TestFlight-Build); und die Entscheidungen vom 2. Oktober 2026 (der Server auf FastAPI und WebSockets). ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Kiradex-Quellcode, gelesen am 5. Oktober 2026 (privates Repository):
Kiradex/World/TileMap.swift,path(from:to:)ab Zeile 325 (acht Bewegungen; eine Diagonale kostetFloat(2).squareRoot()und wird in Zeile 348 übersprungen, wenn nicht beide Tiles, zwischen denen sie hindurchführt, begehbar sind; das günstigste offene Tile wird zuerst erweitert), undserver/app/rooms.py,Plaza.pathab Zeile 52 (Breitensuche über die vier Bewegungen in Zeile 66; sein Docstring: „the same walk the app takes“). ↩↩↩↩↩ -
Recherchedossier des Autors, „Beyond the plaza: routes, map connections and districts in the canon“, zusammengestellt am 4. Oktober 2026, die Abschnitte „Method“ und 5 („What is measured and what is not“): die gemeinsamen Laufdefinitionen (ein Schritt ist eine Zelle; ein Vorsprung einseitig und zwei Zellen; eine Naht zählt nur dort, wo die gegenüberliegende Zelle des Nachbarn von einer seiner Türen aus erreichbar ist, bei einem Nachbarn ohne Warps eine Ebene tief von anderen Verbindungen aus gesät; Trainer, NPCs und Story-Sperren ignoriert; kein Surfen; die Höhe der dritten Generation auf gleiche Höhe oder eine Seite auf 0 oder 15 reduziert; Warps lösen beim Hineintreten aus; Zerschneider-Bäume, Zertrümmerer-Felsen und Stärke-Felsbrocken blockiert, sofern nicht anders angegeben), die Vorbehalte zu den Zellenmodellen der ersten und zweiten Generation, der Vorbehalt zum Popup-Timing, die Framerate, die Vorbehalte zur Einordnung, die nicht mit Spieldaten abgeglichenen Sekundärquellen und die Lesarten, die keine Fakten sind. Kiradex-Repository
docs/research/routes/01-routes.md; privat, mit einer Kopie im Recherchebestand des Autors. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
gbdev, Pan Docs, „Rendering“ (70.224 Dots pro Frame, „@ 59.7 fps“), gespeichert am 4. Oktober 2026 als
pandocs-timing.txt, https://gbdev.io/pandocs/Rendering.html. ↩ -
pret,
pokeemerald/src/field_control_avatar.c(CheckStandardWildEncounter, Zeilen 668 bis 686: SolangesWildEncounterImmunitySteps < 4gilt, zählt es den Schritt und kehrt ohne Prüfung zurück; nach einem erfolgreichenStandardWildEncountersetzt es die Zählung auf 0 zurück),src/overworld.c(RestartWildEncounterImmunityStepsinLoadMapFromCameraTransition, Zeile 800, undLoadMapFromWarp, Zeile 850),src/battle_setup.c(derselbe Aufruf zu Beginn eines Kampfes, Zeile 370),src/wild_encounter.c(StandardWildEncounter: das Auslassen mit 40 % bei einem Verhaltenswechsel, Zeilen 531 bis 539 und 599;WildEncounterCheck, ab Zeile 502: die Rate mal 16, durch Eilrad und Kunstrad auf 80 % skaliert, durchApplyFluteEncounterRateModundApplyCleanseTagEncounterRateModund durch die Fähigkeit des vordersten Pokémon, dannRandom() % 2880dagegen) undsrc/data/wild_encounters.json(Landrate 20 auf den Routen 101 bis 104) bei731ad5b, gelesen am 4. und 5. Oktober 2026, https://github.com/pret/pokeemerald/blob/master/src/field_control_avatar.c. ↩↩ -
pret,
pokefirered/src/wild_encounter.cbei037335f, gelesen am 4. und 5. Oktober 2026:GetMapBaseEncounterCooldown(8 − rate/10Schritte, Zeile 686);HandleWildEncounterCooldown, Zeilen 707 bis 755 (sobald die Schritte seit der letzten Begegnung die Abklingzeit erreichen, darf jeder Schritt es versuchen; davor addiert jeder Schritt auf einer Begegnungszelle eins zur Zählung und lässt genau diesen Schritt einen Versuch machen, wennRandom() % 100 < 5, ohne die Abklingzeit zu beenden);TryStandardWildEncounter, Zeilen 757 bis 776 (Zählung und Bonus gehen erst nach Beginn einer Begegnung auf 0 zurück); dasselbe Zurücksetzen bei jedem Laden einer Karte, wosrc/overworld.c(Zeilen 764 und 799)RestartWildEncounterImmunityStepsaufruft, das in FeuerrotResetEncounterRateModifiersaufruft (src/field_control_avatar.c, Zeilen 735 bis 737); der Wurf von 60 % bei einem neuen Verhalten (Zeile 370);DoWildEncounterRateTest, Zeile 309 (rate × 16plusencounterRateBuff × 16 / 200, vonMAX_ENCOUNTER_RATE1.600); undAddToWildEncounterRateBuff, Zeile 778 (die Rate wird nach jedem misslungenen Wurf addiert, außer wenn ein Schutz aktiv ist), https://github.com/pret/pokefirered/blob/master/src/wild_encounter.c. ↩↩ -
Messung des Autors, 4. Oktober 2026, aus
measure_gen12_routes.py(Rot:ROUTE_1bisROUTE_25gegen die 11 Karten-IDs unter$0Binconstants/map_constants.asm, Blöcke mal 4; Kristall: Umgebung ROUTE gegen TOWN indata/maps/maps.asm, Größen ausconstants/map_constants.asm) undmeasure_connections.py(Smaragd und Feuerrot:map_typemit Größen auslayouts.json; die 11MAP_TYPE_OCEAN_ROUTE-Karten von Smaragd, 45.600 Zellen, aus der Landzahl ausgenommen; die Routen von Feuerrot schließen die Sevii Eilande ein). Ausgabengen12_routes.txtundconnections.txt. ↩↩↩↩↩↩ -
Messung des Autors, 4. Oktober 2026:
measure_region_maps.pyim Belegordner des Autors zu diesem Beitrag, Ausgabenregion_maps.txtundregion_maps.json(Smaragd: 129 Routenfelder und 22 Stadtfelder auf dem Raster von 28 mal 15). ↩↩ -
Bulbapedia, „Kanto Route 1“, Abschnitt Komplettlösung, gespeichert am 4. Oktober 2026 als
bulba-route1.txt, https://bulbapedia.bulbagarden.net/wiki/Kanto_Route_1. Einmal verwendet, als Gegenprobe zur Suche nach dem wenigsten Gras. ↩ -
Recherchedossiers des Autors zum Strukturen-Beitrag, Kiradex-Repository
docs/research/structures/01-structures-in-the-canon.md, Abschnitt 8.8 („What to refuse“: „No ledges to jump, no climbing, no isometric“), und02-structures-craft-and-engine.md(SmaragdsGetLedgeJumpDirection, das einen Vorsprung nur in der Richtung überqueren lässt, die sein Verhalten nennt), 3. Oktober 2026; privat. ↩↩↩↩ -
Blake Crosley, „Pixel-Art Structures: Houses, Halls and Interiors on iPhone“, blakecrosley.com, 3. Oktober 2026 (Abschnitt 6: eine Tiefenregel und das Objekt-Mesh, Warps als Daten, Etagen an Ort und Stelle mit
.id(floor.name)getauscht; Abschnitt 7: die Servertests zuplaza.jsonund die Liste dessen, was der Build nicht kann, darunter „a one-way ledge“), https://blakecrosley.com/blog/pixel-art-structures-on-iphone. ↩↩↩↩↩↩↩ -
pret,
pokered/data/maps/headers/Route1.asm(connection north, ViridianCity, VIRIDIAN_CITY, -5) undpokered/macros/scripts/maps.asm(die Streifenzeiger des Makrosconnection) beid2704a6, gelesen am 4. Oktober 2026, https://github.com/pret/pokered/blob/master/macros/scripts/maps.asm. ↩↩↩ -
pret,
pokered/constants/map_data_constants.asm(MAP_BORDER EQU 3) undpokered/home/overworld.asm(CheckMapConnections) beid2704a6, gelesen am 4. Oktober 2026, https://github.com/pret/pokered/blob/master/constants/map_data_constants.asm. ↩↩ -
pret,
pokered/data/maps/headers/Route22.asmundRoute23.asm(connection north, Route23, ROUTE_23, 0 ; unnecessaryund die Gegenrichtung) beid2704a6, gelesen am 4. Oktober 2026, https://github.com/pret/pokered/blob/master/data/maps/headers/Route22.asm. ↩ -
pret,
pokecrystal/data/maps/attributes.asm(Verbindungen) unddata/maps/maps.asm(Tilesets, Umgebungen und Kartengruppen) bei5beda23, gelesen am 4. Oktober 2026, https://github.com/pret/pokecrystal/blob/master/data/maps/attributes.asm. ↩ -
Porymap-Dokumentation, „Editing Map Connections“, gespeichert am 4. Oktober 2026 als
porymap-connections.txt, https://huderlem.github.io/porymap/manual/editing-map-connections.html. ↩↩ -
pret,
pokered/data/maps/objects/Route2Gate.asm(ein Assistent von Professor Eich und ein Junge) beid2704a6, gelesen am 4. Oktober 2026, https://github.com/pret/pokered/blob/master/data/maps/objects/Route2Gate.asm. ↩ -
pret,
pokered/scripts/BluesHouse.asm(die Schwester des Rivalen übergibtTOWN_MAP, sobaldEVENT_GOT_POKEDEXgesetzt ist, danachEVENT_GOT_TOWN_MAP),engine/items/town_map.asm(DisplayTownMapdurchläuft jeden Eintrag vonTownMapOrderohne Besuchsprüfung;wTownVisitedFlagwird nur inBuildFlyLocationsListgelesen),data/tilesets/bookshelf_tile_ids.asm(bookshelf_tile HOUSE, $3D, TownMapText, eine Wandkarte, die denselben Bildschirm öffnet),data/maps/headers/BluesHouse.asm(das Haus des Rivalen auf dem HOUSE-Tileset; das Haus der Spielfigur aufREDS_HOUSE_1undREDS_HOUSE_2),gfx/blocksets/house.bst(Tile $3D nur in Block 14) undmaps/BluesHouse.blk(Block 14 an zweiter Stelle der oberen Reihe) beid2704a6, gelesen am 4. Oktober 2026, https://github.com/pret/pokered/blob/master/scripts/BluesHouse.asm. ↩↩↩↩↩↩ -
pret,
pokecrystal/maps/CherrygroveCity.asm(das Geschenk des Fremdenführers,setflag ENGINE_MAP_CARD, Zeile 72) undengine/pokegear/pokegear.asm(POKEGEAR_MAP_CARD_Fdes Karten-Moduls;PokegearMap_CheckRegionzeigt die Karte von Kanto nur, wenn die Spielfigur an einer Landmarke in Kanto steht; die Flugpunkte von Kanto bleiben gesperrt, bis das Indigo Plateau besucht wurde) bei5beda23, gelesen am 4. Oktober 2026, https://github.com/pret/pokecrystal/blob/master/maps/CherrygroveCity.asm. ↩↩↩↩↩ -
Stardew Valley Wiki, „Modding:Maps“, gespeichert am 4. Oktober 2026 als
sdv-modding-maps.txt, https://stardewvalleywiki.com/Modding:Maps. ↩↩ -
Stardew Valley Wiki, „Pelican Town“, gespeichert am 4. Oktober 2026 als
sdv-pelican-town.txt, https://stardewvalleywiki.com/Pelican_Town. ↩ -
Stardew Valley Wiki, „Bus Stop“, gespeichert am 4. Oktober 2026 als
sdv-bus-stop.txt, https://stardewvalleywiki.com/Bus_Stop. ↩ -
Stardew Valley Wiki, „Cindersap Forest“, gespeichert am 4. Oktober 2026 als
sdv-cindersap.txt, https://stardewvalleywiki.com/Cindersap_Forest. ↩ -
Stardew Valley Wiki, „Backwoods“, gespeichert am 4. Oktober 2026 als
sdv-backwoods.txt, https://stardewvalleywiki.com/Backwoods. ↩ -
Stardew Valley Wiki, der Navigationskasten der Orte, wie er auf „Railroad“ erscheint, gespeichert am 4. Oktober 2026 als
sdv-railroad.txt, https://stardewvalleywiki.com/Railroad; 26 Orte nach Zählung des Autors. ↩ -
Stardew Valley Wiki, „The Mountain“ (die beiden Ausgänge zu Beginn; die Minen am 5. Frühling; die Eisenbahn nach dem Erdbeben am 3. Sommer; die Brücke zum Steinbruch für die Bündel des Bastelraums oder 25.000 g), gespeichert am 4. Oktober 2026 als
sdv-mountain.txt, https://stardewvalleywiki.com/The_Mountain. ↩↩↩↩ -
Stardew Valley Wiki, „The Desert“ (der Bus, Bündel des Tresorraums oder 40.000 g), „Secret Woods“ (der Baumstamm und eine Stahlaxt) und „The Beach“ (die Brücke aus 300 Holz), gespeichert am 4. Oktober 2026 als
sdv-desert.txt,sdv-secret-woods.txtundsdv-beach.txt, https://stardewvalleywiki.com/The_Desert, https://stardewvalleywiki.com/Secret_Woods und https://stardewvalleywiki.com/The_Beach. ↩↩ -
Stardew Valley Wiki, „Speed“, gespeichert am 4. Oktober 2026 als
sdv-speed.txt, https://stardewvalleywiki.com/Speed. Die Seite nennt keine Einheiten. ↩ -
Nookipedia, „Acre“ (der Acre von 16 mal 16 Feldern; die GameCube-Stadt aus fünf mal sechs Acres; der Bahnhof in A-3; die Beschriftungen; das Erscheinen von Fisch und Insekt beim Betreten und das Verschwinden nach sechs Feldern; die Stadtgrößen späterer Spiele), gespeichert am 4. Oktober 2026 als
nook-acre.txt, https://nookipedia.com/wiki/Acre. ↩↩↩↩↩ -
Nookipedia, „Map“, gespeichert am 4. Oktober 2026 als
nook-map.txt, https://nookipedia.com/wiki/Map. ↩ -
Nookipedia, „Train“ und „Train station“, gespeichert am 4. Oktober 2026 als
nook-train.txtundnook-train-station.txt, https://nookipedia.com/wiki/Train und https://nookipedia.com/wiki/Train_station. ↩ -
zladx, LADX-Disassembly-Wiki, „Game engine documentation“, gespeichert am 4. Oktober 2026 als
ladx-engine.txt, https://github.com/zladx/LADX-Disassembly/wiki/Game-engine-documentation. ↩↩↩ -
zladx, LADX-Disassembly-Wiki, „Maps data format“ (die 512 Bytes große Oberweltkarte aus Zwei-Byte-Raumzeigern; die Überlagerung von 10 mal 8), gespeichert am 4. Oktober 2026 als
ladx-maps-format.txt, https://github.com/zladx/LADX-Disassembly/wiki/Maps-data-format. ↩ -
Blake Crosley, „Pixel-Art Worlds on iPhone: What the 16-Bit Masters Knew“, blakecrosley.com, 3. Oktober 2026 (Abschnitt 5: das RealityKit-Rezept, ein einziges
MeshDescriptor-Mesh für die Karte, die Standardwerte von RealityView, die Maßstabstabelle aus Apples Spezifikationsseiten und den Simulatorprofilen von Xcode 27, das 11-Punkt-Minimum für Text und SwiftUI-Text, der Fehler bei der Deckkraftanimation und sein Schleier, die Aufnahme mitXCUIScreenim Bundle; „Since publishing“: eine Buchstabenkarte, an App und Server exportiert; die FAQ zu Urheberrecht und Patenten), https://blakecrosley.com/blog/pixel-art-world-on-iphone. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Apple, „iPhone Duo: Technical Specifications“, gespeichert am 4. Oktober 2026 als
apple-duo-specs.txt, https://www.apple.com/iphone-duo/specs/. ↩ -
Apple, Human Interface Guidelines, „Designing for games“ (über das JSON der Dokumentation), gespeichert am 4. Oktober 2026 als
hig-games-plain.txt, https://developer.apple.com/design/human-interface-guidelines/designing-for-games. ↩↩ -
Kiradex-Quellcode,
Kiradex/World/PlazaStage.swift, gelesen am 5. Oktober 2026 (privates Repository): Zeilen 132 und 133 (beim Warp einer TürTask.sleep(for: .milliseconds(220))und dannonWarp(warp), ohne Abblende) und Zeilen 698 bis 700 (einfloor:-Warp setzt die neue Etage an Ort und Stelle, ohne Abblende). ↩ -
Apple Developer Documentation, „targetTimestamp“ (eine Instanzeigenschaft von
CADisplayLink, Core Animation; iOS und iPadOS 10.0 und neuer), gespeichert am 4. Oktober 2026 (die Kurzbeschreibung „The time interval that represents when the next frame displays,“ also das Zeitintervall, zu dem der nächste Frame angezeigt wird, und das Beispiel, das den Display Link dem Main Run Loop hinzufügt), https://developer.apple.com/documentation/quartzcore/cadisplaylink/targettimestamp. ↩↩ -
Kiradex-Quellcode,
Kiradex/World/Wants.swift(„What the town’s own collectors ask to be shown, and whether the collection has it“, was die Sammler der Stadt gezeigt bekommen möchten und ob die Sammlung es hat) undKiradex/World/Quests.swift(die Quests des Tages und der Woche, „judged from the collection itself“, aus der Sammlung selbst beurteilt), gelesen am 4. Oktober 2026; privates Repository. ↩↩ -
Messung des Autors, 5. Oktober 2026:
measure_meadow_gate.pyim Belegordner des Autors zu diesem Beitrag, Ausgabemeadow_gate.txt. Es fügt den Stadtplatz, den Wiesenweg und das Seeufer des Briefings in den Größen aus Abschnitt 7 zu einem Raster zusammen: den Stadtplatz, wie die Schmiede ihn ausliefert (town.json, 40 mal 30, die Ankunft in Spalte 19, Reihe 13, die begehbaren Buchstaben des Servers), seinen Nordzaun entlang der gemeinsamen Kante geöffnet; den Wiesenweg, 24 mal 60, 4 Tiles vom Westende des Stadtplatzes eingerückt, damit seine Gasse auf den Rasen zwischen der Halle und dem Haus östlich davon trifft, die Gasse 2 Tiles breit hinter einer Hecke an der Ostseite mit dem Tor als Einbahnkante an ihrem Seeende, der Rest von vier Hecken durchquert, in den Reihen 12, 24, 36 und 48 der Wiese, mit Lücken von 2 Tiles in jeder Position ausprobiert; das Seeufer, 36 mal 20, auf den Weg zentriert, seine Nordhälfte See, der Steg 2 Tiles breit in einer Linie mit der Gasse und bis zu seinem landseitigen Tile gemessen. Es geht auf dem Graphen der App (TileMap.path): acht Richtungen, eine Diagonale kostet √2 und wird verweigert, wenn eines der beiden Tiles, zwischen denen sie hindurchführt, blockiert ist; das Tor verweigert jeden Schritt aus der Gasse Richtung See und lässt einen Schritt vom See nur gerade zu. Die Windung ist der eigene kürzeste Weg der Wiese von ihrer Süd- zu ihrer Nordkante, westlich der Gasse. Zwei Hecken, in den Reihen 20 und 40 der Wiese, winden sie über alle 400 Positionen auf 59,00 bis 66,46 Tiles, drei (Reihen 15, 30 und 45) auf 59,00 bis 79,77 (6 von 8.000 innerhalb von 78 bis 90), vier auf 59,00 bis 95,43 (5.912 von 160.000 innerhalb von 78 bis 90); diese Grenzen gelten für gleichmäßig verteilte Hecken, und ungleichmäßige Abstände winden nach derselben Funktion stärker (r7_uneven_probe.py, 5. Oktober, Ausgaber7_uneven_probe.txt: zwei Hecken in den Reihen 0 und 2 erreichen 77,00, drei in den Reihen 20, 22 und 24 erreichen 95,00). Derselbe Durchlauf mit drei Hecken, in den Reihen 15, 30 und 45 der Wiese (am 5. Oktober nach der sechsten Runde des Gates in Abschnitt 5 des Skripts ergänzt): Die 6 Layouts gehen heim 88,07 Tiles und hin 114,05 bis 120,44, Verhältnis 0,731 bis 0,772, alle bei oder unter 0,8, und 5 davon liegen innerhalb des Bandes von 110 bis 120, hin 114,05 bis 119,02, Verhältnis 0,740 bis 0,772. Drei Hecken erfüllen also in 5 Positionen jedes Ziel; vier, die Wahl des Autors, in 4.111. Auf diesen 5.912 Layouts mit vier Hecken: heim 88,07 Tiles, hin 108,74 bis 133,75, Verhältnis 0,658 bis 0,810, 5.886 bei oder unter 0,8; das Ziel von 0,8 verlangt 88,07 ÷ 0,8 = 110,09 hin; innerhalb des Bandes von 110 bis 120 sind es 4.111 Layouts, hin 110,15 bis 119,95, Verhältnis 0,734 bis 0,800, alle bei oder unter 0,8. Von der Ankunft bis zur Nordkante sind es 17,07 Tiles; ist das Tor in beide Richtungen offen, sind die Wege gleich (88,07 in jede Richtung bei je einem Layout jeder Heckenzahl). Über jeden Versatz von 0 bis 16 Tiles und beide Stegpositionen ist der kürzeste Hinweg 107,18 und der kürzeste Heimweg 88,07; bei 4 Tiles pro Sekunde sind 110 und 120 Tiles 27,5 und 30 Sekunden. Dieselbe Ausgabe prüft sich gegen das frühere Modell: Aus dessen gespeicherter Kopie ausgeführt, behält die Breitensuche in vier Richtungen mit zwei Hecken 125 Layouts, hin 113 bis 119, heim 91, Verhältnis 0,765 bis 0,805, und diese 125 Layouts kommen in acht Richtungen gegangen auf hin 97,18 bis 99,67, heim 88,07, Verhältnis 0,884 bis 0,906, keines bei 0,8. Jenes frühere Modell zählte die Windung als die Wiesenschritte desjenigen kürzesten Pfads, den seine Suche zurückgab, was Gleichstände ändern können; die Windung von Kante zu Kante kann das nicht. Platzierungen, die das Briefing nicht beschreibt, in derselben Ausgabe durchlaufen: Mit dem Steg in der Mitte des Ufers ist das beste Verhältnis 0,721 (Versatz 4, 2.182 von 5.912 Layouts bei oder unter 0,8), und wo die Gasse auf ein Gebäude trifft, spart das Tor nichts. ↩↩↩↩ -
Apple Developer Documentation, „preferredFrameRateRange“ (eine Instanzeigenschaft von
CADisplayLink, Core Animation; iOS und iPadOS 15.0 und neuer), gespeichert am 4. Oktober 2026 (die Discussion: Der Display Link versucht nach besten Kräften, innerhalb des Bereichs zurückzurufen, das System berücksichtigt außerdem die Hardware, andere Arbeit, den Stromsparmodus, den thermischen Zustand und Bedienungshilfen, und standardmäßig entspricht der Bereich der maximalen Bildwiederholrate des Displays), https://developer.apple.com/documentation/quartzcore/cadisplaylink/preferredframeraterange. ↩↩