Trasy w pixel art: połączenia map i dzielnice na iPhonie
Trzy pierwsze generacje Pokémonów pokonują komórkę 16 pikseli w 16 klatkach, około 3,73 komórki na sekundę, a kolekcjoner w Kiradex chodzi z prędkością 4 kafelków na sekundę, więc drogę zmierzoną w starych grach przelicza się na nasze miasteczko po ćwierć sekundy na kafelek.1234 Pierwsza trasa każdej gry zajmuje od dwóch do sześciu ekranów konsoli i nie ma na niej trenerów; pierwszy odcinek, od drzwi domu gracza do Centrum Pokémon w kolejnym mieście, to 58 komórek i 15,5 sekundy chodu w Emerald oraz 94 komórki i 25,2 sekundy w FireRed, a droga powrotna jest w obu krótsza, 42 i 76 komórek, po trasach, których uskoki zwrócone są w stronę domu.567 Tam, gdzie zmienia się grafika, Kanto stawia na drodze budynek: 76 z 78 połączeń map w Red łączy ten sam tileset, a każda strażnica w Red między dwoma różnymi miejscami łączy dwa.8 Silnik Hoenn kopiuje siedem komórek sąsiedniej mapy do marginesu wokół bieżącej z trzech stron i osiem od wschodu, rysuje je kafelkami bieżącej mapy, a własne kafelki drugorzędne i paletę sąsiada wczytuje w chwili przejścia, bez wygaszania.910 Ekran mapy w Emerald to siatka 28 na 15 pól; otwiera go mapa ścienna na piętrze domu gracza w miasteczku Littleroot, PokéNav nosi go ze sobą od miasta Rustboro, i rysuje on każde miejsce, odwiedzone czy nie, z wyjątkiem dwóch, które czekają na flagi fabularne, a Fly (ruch pozwalający przelecieć do miasta) oferuje tylko miasta, których flaga odwiedzin została ustawiona przy wejściu.111213 Kiradex World to dziś jedno miasteczko 40 na 30 bez niczego za płotem.14 Zmierzyłem więc w dekompilacjach drogi, szwy, strażnice i ekrany map z kanonu, przeczytałem Stardew Valley, Animal Crossing i Link’s Awakening jako modele dla kontrastu i zamieniłem liczby w brief dla czterech obszarów za placem, ekranu mapy i tramwaju, który otwiera przystanek przy pierwszym przybyciu.
W skrócie
- Komórka chodu kosztuje 16 klatek, mniej więcej ćwierć sekundy. Red, Crystal i Emerald chodzą w tempie 16 klatek na komórkę, a biegną lub jadą rowerem w tempie 8, co przy 59,7 Hz sprzętu daje 3,73 i 7,47 komórki na sekundę; Kiradex ma ustawiony chód 4 kafelków na sekundę, około 7% szybszy niż w konsolach przenośnych, oraz bieg nominalnie 6,4, który model jego kodu liczony klatka po klatce ustawia na 6,00 przy 60 Hz, około 20% poniżej ich biegu.1231541617
- Trasa ma od 2 do 10 ekranów, a pierwsza jest krótka i najbardziej zarośnięta trawą. Szesnaście zmierzonych tras ma wzdłuż swojej osi od 2,0 (Route 101 w Emerald) do 10,0 (Route 32 w Crystal) ekranów konsoli; cztery pierwsze trasy mają od 14,4% do 22,8% wysokiej trawy w powierzchni mapy, najwięcej w każdej grze, i żadnych trenerów. Na dziewięciu trasach, których oba końce łączą się pieszo, dłuższe przejście w poprzek ma od 1,15 do 1,70 długości dłuższego boku trasy, bo ścieżka się wije, a droga do domu od 0,95 do 1,42.5617
- Uskoki skracają drogę do domu. Na wszystkich dziewięciu zmierzonych trasach, których oba końce łączą się pieszo, a każda z nich ma uskoki, przejście w stronę wcześniejszego miasta jest krótsze o 2% do 44%, a najmniejsza liczba komórek wysokiej trawy w drodze do domu wynosi od 0 do 5, wobec 4 do 19 w drodze tam.5618
- Strażnice stoją tam, gdzie zmienia się grafika, i to w nich mieszkają reguły. Każda strażnica w Red między dwoma miejscami łączy dwa tilesety; strażnice kryją sprawdzenie odznaki, spragnionego strażnika i trzy nagrody za posiadanie 10, 30 i 50 gatunków. Silnik Hoenn wczytuje nowy tileset na szwie i zostawia tylko 4 budynki strażnic wobec 27 map z tilesetem strażnic w Red.8192010
- Szew w Gen 3 rysuje siedem komórek sąsiada (osiem od wschodu) i wczytuje jego grafikę przy przejściu. Margines bufora to
MAP_OFFSET 7, ponieważ „the player has 7 metatiles of view horizontally in either direction” (gracz widzi poziomo po 7 metatile’i w każdą stronę), a strona wschodnia kopiujeMAP_OFFSET + 1kolumn; przejście wczytuje drugorzędny tileset, muzykę i pogodę nowej mapy oraz wsuwa na około 3,2 sekundy tabliczkę z nazwą, bez wygaszania.91021 - Ekran mapy pokazuje każde miejsce; szybka podróż pokazuje, gdzie się było. Mapa w Emerald ma 28 na 15 pól, z których 158 zajmują 54 miejsca, a gdy gracz może ją otworzyć (mapa ścienna na piętrze domu, potem PokéNav), rysuje każde miejsce, odwiedzone czy nie, z wyjątkiem dwóch wstrzymanych przez flagi fabularne; miasto staje się celem Fly dopiero wtedy, gdy przy wejściu zostanie ustawiona jego flaga
FLAG_VISITED_*, a Red, FireRed, Crystal i Link’s Awakening prowadzą ten sam rodzaj rejestru odwiedzin.11121322232425 - Co z tego ma Kiradex. Brief dla czterech obszarów za Rynkiem (Aleja Klaserów, Łąkowa Ścieżka, Brzeg Jeziora i Dzielnica Galerii) o powierzchni 2,8 razy większej niż Rynek, otwarte szwy bez wygaszania, jeden ośmiokierunkowy graf chodu dla aplikacji i serwera, ekran mapy 16 na 12, tramwaj, którego przystanki otwierają się przy pierwszej wizycie, znaleziska będące wyłącznie kosmetykami albo notatkami z zadaniami oraz trzynaście testów akceptacyjnych, które może przeprowadzić skrypt albo nagranie.262728
1. Trasy, zmierzone
Trzy artykuły tej serii z 3 października nie wychodziły poza płot. Światy pixel art na iPhonie ustaliły system kafelków i przepis na RealityKit, Ludzie w pixel art kolekcjonera, a Budowle w pixel art budynki i drzwi. Kiradex World wyszło z nich jako jedno miasteczko: 40 na 30 kafelków, las narysowany 12 kafelków za płotem, siedem budynków, których drzwi prowadzą do pokojów albo do hali, i jeden kafelek przybycia.14 Ten artykuł dotyczy tego, co leży za płotem, i zaczyna się tam, gdzie zaczynały się poprzednie: od dekompilacji.
Każdą liczbę dotyczącą Pokémonów zmierzono na płytkich klonach dekompilacji pret w wersjach pokered d2704a6, pokecrystal 5beda23, pokeemerald 731ad5b i pokefirered 037335f, za pomocą sześciu małych skryptów w Pythonie, z których każdy można ponownie uruchomić w około sekundę albo krócej; przypisy podają, który skrypt stoi za każdą liczbą.29 Jednostką jest komórka, jedno pole chodu o wymiarach 16 na 16 pikseli: metatile w Gen 3 albo ćwiartka bloku w Gen 1 i Gen 2. Ekran Game Boya pokazuje 10 na 9 komórek (160 na 144 piksele), a ekran Game Boy Advance 15 na 10 (240 na 160).29 Model chodu jest we wszystkich skryptach ten sam: krok kosztuje jedną komórkę; uskok można przejść tylko w jego kierunku, a ląduje się komórkę dalej, co daje dwie komórki ruchu; w Crystal krok nie może przejść przez jednostronną ścianę kafelka, a narożny uskok pozwala skoczyć w każdą z jego dwóch stron (kod jest w sekcji 2); szew liczy się tylko tam, gdzie leżącą naprzeciw komórkę sąsiada da się osiągnąć pieszo z którychś z jego drzwi; trenerzy i inne postacie są pomijani, a surfowanie nie jest modelowane.29
Zegar
Wszystkie trzy generacje chodzą w tym samym tempie. W Red OverworldLoop wywołuje DelayFrame dwa razy na iterację, a AdvancePlayerSprite przesuwa widok o 2 piksele na iterację przez 8 iteracji (wWalkCounter wynosi 8), więc komórka zajmuje 16 klatek; na rowerze AdvancePlayerSprite wykonuje się dwa razy na iterację, 8 klatek na komórkę.1 StepVectors w Crystal dają krokowi pieszemu 8 tików po 2 piksele, a krokowi na rowerze 4 tiki po 4 piksele, a świat zewnętrzny wykonuje jeden tik co 2 klatki (MaxOverworldDelay: db 2), co znów daje 16 klatek na komórkę pieszo i 8 na rowerze.2 Tablice kroków w Emerald mają 16 wpisów dla chodu (sStep1Funcs), 8 dla biegu i surfowania, 6 dla Acro Bike i prądów wodnych, 4 dla Mach Bike przy pełnej prędkości i 2 dla najszybszego ruchu; skok z uskoku (JUMP_DISTANCE_FAR) trwa 32 klatki na dwie komórki i w szczycie wznosi się o 12 pikseli (sJumpY_High).3
Klatka to druga połowa zegara. GBATEK podaje klatkę Game Boy Advance jako 280 896 cykli, „ca. 59.737 Hz”; Pan Docs podaje klatkę Game Boya jako 70 224 kropki „@ 59.7 fps”.1530 Przy 16 klatkach na komórkę chód to około 3,73 komórki na sekundę, a bieg około 7,47.17 Sekundy w tym artykule liczone są jako 224 Hz podzielone przez 280 896, czyli 59,7275 klatki na sekundę; GBATEK podaje 59,737, a różnica jest mniejsza niż 0,02%.29
Kolekcjoner w Kiradex chodzi z tilesPerSecond = 4 i biega 1,6 razy szybciej, nominalnie 6,4 kafelka na sekundę.4 Liczba dla biegu to stała, a nie prędkość, którą kod osiąga: artykuł tej serii o ruchu zamodelował kod klatka po klatce i ustalił, że bieg pokonuje 6,00 kafelka na sekundę przy 60 Hz i 6,32 przy 120, bo każdy krok odrzuca postęp, o który przestrzelił.16 Chód jest o około 7% szybszy niż chód w konsolach przenośnych; bieg jest o około 20% wolniejszy od ich biegu przy 60 Hz i o 14% przy nominalnych 6,4.17 Chód jest na tyle zbliżony, że odległość zmierzoną w ich komórkach przelicza się na nasze po stałym kursie: czas trasy to liczba komórek razy 0,27 sekundy przy chodzie konsol przenośnych i liczba kafelków razy 0,25 sekundy przy naszym.17
Szesnaście tras
Zmierzyłem cztery pierwsze trasy każdej gry: Route 1 do 4 w Red, 29 do 32 w Crystal, 101 do 104 w Emerald i 1 do 4 w FireRed. Komórki Gen 3 odczytywane są z map.bin (bity 0 do 9 to metatile, 10 i 11 kolizja, 12 do 15 wysokość), a zachowanie każdej komórki sprawdzane jest w podstawowym albo drugorzędnym metatile_attributes.bin; trenerzy to zdarzenia obiektów na mapie, których trainer_type nie jest TRAINER_TYPE_NONE.6 W Gen 1 komórkę odczytuje się po jej lewym dolnym kafelku 8 na 8 w obrębie komórki 16 na 16, porównując go z listą kolizji tilesetu, kafelkiem trawy $52 i tablicą uskoków; w Gen 2 po czterech bajtach kolizji, które każdy blok ma na każdą ćwiartkę.5
| Gra | Trasa | Rozmiar (komórki) | Ekrany wzdłuż osi | Do chodzenia | Wysoka trawa, komórki (% mapy) | Komórki uskoków / ciągi | Trenerzy | Najkrótsze przejście w poprzek, w każdą stronę (komórki) |
|---|---|---|---|---|---|---|---|---|
| Red | 1 | 20 na 36 | 4,0 | 76,8% | 104 (14,4%) | 42 / 10 | 0 | na południe 40, na północ 52 |
| Red | 2 | 20 na 72 | 8,0 | 55,9% | 84 (5,8%) | 52 / 14 | 0 | przedzielona lasem |
| Red | 3 | 70 na 18 | 7,0 | 35,1% | 100 (7,9%) | 36 / 10 | 8 | w stronę Pewter 82, od Pewter 84 |
| Red | 4 | 90 na 18 | 9,0 | 45,0% | 60 (3,7%) | 169 / 27 | 1 | przedzielona jaskinią |
| Crystal | 29 | 60 na 18 | 6,0 | 47,7% | 160 (14,8%) | 35 / 13 | 0 | na wschód 71, na zachód 90 |
| Crystal | 30 | 20 na 54 | 6,0 | 47,6% | 140 (13,0%) | 21 / 6 | 3 | na południe 57, na północ 74 |
| Crystal | 31 | 40 na 18 | 4,0 | 39,3% | 64 (8,9%) | 13 / 5 | 1 | zachodni koniec to strażnica |
| Crystal | 32 | 20 na 90 | 10,0 | 48,3% | 152 (8,4%) | 6 / 5 | 8 | na południe 132, na północ 128 |
| Emerald | 101 | 20 na 20 | 2,0 | 59,2% | 91 (22,8%) | 13 / 3 plus 1 narożna | 0 | na południe 19, na północ 34 |
| Emerald | 102 | 50 na 20 | 3,3 | 48,9% | 143 (14,3%) | 17 / 4 | 4 | na wschód 55, na zachód 62 |
| Emerald | 103 | 80 na 22 | 5,3 | 27,3% | 92 (5,2%) | 24 / 3 | 9 | przedzielona morzem |
| Emerald | 104 | 40 na 80 | 8,0 | 34,0% | 126 (3,9%) | 13 / 4 | 8 | przedzielona lasem |
| FireRed | 1 | 24 na 40 | 4,0 | 62,3% | 178 (18,5%) | 61 / 10 | 0 | na południe 43, na północ 58 |
| FireRed | 2 | 24 na 80 | 8,0 | 40,8% | 84 (4,4%) | 44 / 13 | 0 | przedzielona lasem |
| FireRed | 3 | 84 na 20 | 5,6 | 37,6% | 117 (7,0%) | 42 / 10 | 8 | w stronę Pewter 94, od Pewter 97 |
| FireRed | 4 | 108 na 20 | 7,2 | 42,9% | 84 (3,9%) | 186 / 28 | 1 | przedzielona jaskinią |
Źródła tabeli: measure_gen12_routes.py i measure_gen3_routes.py uruchomione na czterech dekompilacjach.56 Kolumna ekranów dzieli dłuższy bok przez widok konsoli wzdłuż tej osi (10 lub 9 komórek na Game Boyu, 15 lub 10 na Game Boy Advance). Kolumna „do chodzenia” to odsetek komórek, na których można stanąć. Komórki uskoków to komórki skoku w Gen 1 i 3 oraz komórki krawędzi w Gen 2. Przejścia prowadzą między komórkami szwu osiągalnymi z drzwi, a trasa przedzielona to taka, na której w obrębie mapy nie istnieje przejście od szwu do szwu, bo między połowami stoi las, jaskinia, strażnica albo morze.29
Długość tras wzdłuż dłuższej osi, z najkrótszym przejściem w poprzek w każdą stronę; narysowane przez figures/make_figures.py na podstawie wyników obu skryptów tras.
Z tabeli wynika pięć rzeczy.
Trasy mają od 2 do 10 ekranów, a pierwsza jest krótka. Route 101 w Emerald ma wysokość dwóch ekranów Game Boy Advance; Route 32 w Crystal dziesięciu ekranów Game Boya; pierwsza trasa każdej gry od dwóch do sześciu ekranów.56 W komórkach zmierzone trasy mają wzdłuż dłuższego boku od 20 do 108.6
Dłuższe przejście w poprzek ma od 1,15 do 1,70 długości dłuższego boku. Dziewięć z szesnastu tras da się przejść od końca do końca. Na tych dziewięciu najkrótsze przejście w dłuższym kierunku, zestawione z dłuższym bokiem trasy, to 34 na 20, czyli 1,70, na północ po Route 101 w Emerald; 90 na 60, 1,50, na Route 29 w Crystal; 132 na 90, 1,47, na Route 32 w Crystal; 58 na 40, 1,45, na Route 1 w FireRed; 52 na 36, 1,44, na Route 1 w Red; 74 na 54, 1,37, na Route 30 w Crystal; 62 na 50, 1,24, na Route 102 w Emerald; 84 na 70, 1,20, na Route 3 w Red; oraz 97 na 84, 1,15, na Route 3 w FireRed.5617 Droga do domu jest prostsza, od 0,95 do 1,42 długości dłuższego boku: 19 na 20 na Route 101 w Emerald, 57 na 54 na Route 30 w Crystal, 43 na 40 na Route 1 w FireRed, 55 na 50 na Route 102 w Emerald, 40 na 36 na Route 1 w Red, 94 na 84 na Route 3 w FireRed, 82 na 70 na Route 3 w Red, 71 na 60 na Route 29 w Crystal i 128 na 90 na Route 32 w Crystal, której jednostronne ściany w obu kierunkach zmuszają do długiego obejścia.5617 Stosunek poniżej 1 nie jest skrótem przez przestrzeń: przejście od komórki szwu w pierwszym rzędzie do komórki w ostatnim rzędzie mapy o 20 komórkach zajmuje 19 kroków, więc idealnie prosta trasa uzyskuje 0,95.17 W mojej lekturze to liczba dla drogi tam służy do wymiarowania trasy: jej wijące się przejście, a nie prostokąt, w którym się mieści.
Trawa rzednie w miarę podróży. Wysoka trawa pokrywa od 3,7% do 22,8% mapy trasy. Cztery pierwsze trasy, Red 1, Crystal 29, Emerald 101 i FireRed 1, są najbardziej zarośnięte spośród czterech tras swojej gry, z 14,4%, 14,8%, 22,8% i 18,5%; drugie trasy mają od 4,4% do 14,3%, a trzecie i czwarte od 3,7% do 8,9%.56 Liczone zamiast tego względem gruntu, na którym można stanąć, odsetki są większe, a trend utrzymuje się tylko średnio: pierwsze trasy mają od 18,8% do 38,4% wysokiej trawy, a pozostałe dwanaście od 8,2% do 29,2%, przy czym Route 3 w Red (22,6%) ma pod stopami więcej trawy niż Route 1 w Red (18,8%). Na Route 101 w Emerald 91 z 237 komórek, po których można chodzić, to wysoka trawa, 38,4%.5617
Żadna pierwsza trasa nie ma trenera. Red 1, FireRed 1, Emerald 101 i Crystal 29 nie mają żadnego; trenerzy pojawiają się na drugiej lub trzeciej trasie, 4 na Route 102 w Emerald, 3 na Route 30 w Crystal i 8 na Route 3 w Red i FireRed.56 Ich zasięg wzroku na tych trasach wynosi od 0 do 7 komórek; dziewięciu trenerów z Route 103 w Emerald widzi od 1 do 5 komórek, a ośmiu z Route 104 od 0 do 7.6
Strefa spotkań losuje mniej więcej co dziewiąty krok, po krótkiej karencji. Emerald nigdy nie sprawdza pierwszych czterech kroków po wejściu gracza na mapę, przez szew albo przez drzwi, ani po walce: CheckStandardWildEncounter odlicza te kroki, dopóki sWildEncounterImmunitySteps < 4, i zeruje licznik po każdym spotkaniu, a każde wczytanie mapy i każdy początek walki również go zerują. Potem sprawdzany jest każdy krok na komórkę spotkań: 40% szans na pominięcie sprawdzenia, gdy krok prowadzi na komórkę o innym zachowaniu, a następnie Random() % 2880 < rate × 16. Route 101 do 104 używają wszystkie współczynnika 20, więc niezmodyfikowane losowanie to 320 na 2880, 11,1% na krok pieszo; rower, flet, Cleanse Tag albo niektóre zdolności prowadzącego Pokémona najpierw to skalują.31 FireRed dodaje podłogę i rampę: po spotkaniu oraz po wejściu na mapę obowiązuje okres wyciszenia 8 − rate/10 kroków po komórkach spotkań (6 dla współczynnika 21 na Route 1 do 4), a na każdym z tych kroków losowanie z 5% szans pozwala temu jednemu krokowi spróbować spotkania bez kończenia wyciszenia; potem losowanie z 60% szans przy nowym zachowaniu; potem rate × 16 na 1600, czyli 21%, plus premia, która rośnie o wartość współczynnika po każdym nieudanym losowaniu (encounterRateBuff).32 Karencję, podłogę i rampę odczytuję jako sposoby na to, by zarówno susze, jak i zalewy były krótkie. Kiradex nie będzie miał dzikich walk, więc ta liczba liczy się tu tylko jako rytm: po kilku pierwszych krokach pierwsza trasa daje coś do zauważenia mniej więcej co dziewięć kroków po trawie.
Ile świata to droga
| Gra | Mapy tras | Komórki tras | Mapy miast | Komórki miast | Trasy do miast |
|---|---|---|---|---|---|
| Red | 25 | 31 500 | 11 | 11 880 | 2,65 |
| Crystal (Johto i Kanto) | 54 | 49 880 | 23 | 25 380 | 1,97 |
| Emerald (trasy lądowe) | 41 | 87 787 | 16 | 23 700 | 3,70 |
| FireRed (z Sevii) | 57 | 98 451 | 19 | 25 470 | 3,87 |
Drogi zajmują od dwóch do czterech razy większą powierzchnię niż miasta.33 11 tras morskich w Emerald dodałoby kolejne 45 600 komórek.33 Stosunek zależy od tego, jak mapa jest klasyfikowana, a każda gra klasyfikuje inaczej: Red po identyfikatorze i nazwie mapy, Crystal po środowisku (jego środowisko ROUTE obejmuje na przykład teren na zewnątrz Ruins of Alph), Emerald i FireRed po map_type, przy czym trasy FireRed obejmują wyspy Sevii, a trasy Emerald nie obejmują oceanu.33 Na ekranie mapy w Emerald ten sam świat daje 129 pól tras wobec 22 pól miast, 5,9 do 1, bo miasto zajmuje jedno lub dwa pola bez względu na to, jak jest duże: dziesięć z 16 miast i miasteczek zajmuje jedno, a sześć zajmuje dwa.341117
Route 1 na trzy sposoby
Red, FireRed i Crystal rysują ten sam pomysł w trzech rozdzielczościach, a Route 1 daje najczystsze porównanie. W Red ma 10 na 18 bloków, 20 na 36 komórek, cztery ekrany Game Boya wysokości, 42 komórki uskoków w 10 zwróconych na południe ciągach między słupkami płotu i szpalerami drzew oraz 104 komórki trawy.5 Aby sprawdzić model komórek Gen 1, wyrenderowałem tę jedną mapę z jej blocksetu w podwójnym rozmiarze z siatką co 16 pikseli; widać na niej pas otwartego terenu szerokości 3 komórek poza zachodnim szpalerem drzew, który dotyka obu szwów, ale nie da się do niego dojść z drzwi żadnego z miast, i dlatego wyszukiwania zaczynają swoje przejścia od drzwi sąsiadów.5 Model Gen 1 odczytuje jeden kafelek 8 na 8 na komórkę, lewy dolny, i został sprawdzony na oko tylko na tym renderze; kolizje par kafelków, takie jak pary wody i lądu, nie są modelowane.29
Route 1 w FireRed ma 24 na 40 komórek, wciąż cztery ekrany wysokości na większym ekranie, 61 komórek uskoków i 178 komórek trawy, 18,5% mapy: remake zachował długość w ekranach, powiększył mapę o 4 komórki w każdym wymiarze i dodał uskoków.6 Od drzwi domu w miasteczku Pallet (Pallet Town) do Centrum w mieście Viridian (Viridian City) jest 94 komórki, 25 sekund, a w drugą stronę 76.7 Trasa otwierająca Crystal, Route 29, ma 60 na 18 komórek, sześć ekranów Game Boya szerokości, 14,8% trawy i żadnych trenerów; przejście od strony miasteczka New Bark do strony miasta Cherrygrove to 90 komórek, a z powrotem 71.5
2. Od drzwi do drzwi i droga do domu
Długość samej trasy to tylko część podróży. Gracz odczuwa odcinek: wyjście z jednego budynku, przejście przez miasto, przez trasę i przez kolejne miasto, wejście do następnego budynku. measure_travel.py przeszukuje całą tę drogę, po parach (mapa, komórka), przez szwy, warpy i uskoki, od komórki pod pierwszymi drzwiami do ostatnich drzwi, wliczając krok, którym się w nie wchodzi.7
| Gra | Skąd | Dokąd | Komórki | Chód | Bieg | Przecięte mapy |
|---|---|---|---|---|---|---|
| Emerald | Littleroot, dom gracza | Centrum w Oldale | 58 | 15,5 s | 7,8 s | miasteczko, trasa, miasteczko |
| Emerald | Centrum w Oldale | Centrum w Petalburg | 87 | 23,3 s | 11,7 s | miasteczko, trasa, miasto |
| Emerald | Centrum w Petalburg | Centrum w Rustboro | 250 | 67,0 s | 33,5 s | miasto, trasa, las, trasa, miasto |
| FireRed | Pallet, dom gracza | Centrum w Viridian | 94 | 25,2 s | 12,6 s | miasteczko, trasa, miasto |
| FireRed | Centrum w Viridian | Centrum w Pewter | 267 (156 po Cut) | 71,5 s (41,8 s) | 35,8 s | przez dwie strażnice lasu |
| FireRed | Centrum w Pewter | Centrum na Route 4 | 150 | 40,2 s | 20,1 s | miasto, trasa, trasa |
| FireRed | Centrum na Route 4 | Centrum w Cerulean | 314 | 84,1 s | 42,3 s | przez trzy piętra jaskini, jedno z nich dwukrotnie |
Sekundy chodu to komórki razy 16 klatek podzielone przez 59,7275 Hz. Bieg to drugie wyszukiwanie najmniejszej liczby klatek, 8 na komórkę, przy czym każdy skok z uskoku nadal trwa 32 klatki, bo to ten sam 32-klatkowy skok niezależnie od tempa; z siedmiu powyższych odcinków tylko odcinek przez jaskinię skacze z uskoku, raz, co daje 2528 klatek zamiast 2512. Liczba „po Cut” to to samo wyszukiwanie z usuniętymi pięcioma drzewami Cut (ruch HM do ścinania drzew) na Route 2, co otwiera wschodnią ścieżkę przez ROUTE2_EAST_BUILDING. Wygaszania i walki nie są liczone.7 Dwa uproszczenia w wyszukiwaniu ważą najwięcej na odcinku przez jaskinię: wysokość w Gen 3 sprowadzona jest do dwóch przypadków, równych wysokości albo którejkolwiek strony na poziomie 0 lub 15, a warp uruchamia się, gdy się na niego wchodzi, a nie gdy się na nim staje, więc 314 komórek przez jaskinię, której ścieżka biegnie przez 1F, B1F, B2F i znowu B1F, to najmniej pewna liczba w tabeli.29
Od drzwi do drzwi, tam oraz z powrotem tam, gdzie zmierzono powrót, z celami briefu obok kanonu; narysowane przez figures/make_figures.py na podstawie travel.json.
Pierwszy odcinek to 15 do 25 sekund chodu. Od drzwi domu do Centrum w kolejnym mieście jest 58 komórek, 15,5 sekundy, w Emerald i 94 komórki, 25,2 sekundy, w FireRed.7 Odcinki, które dochodzą do minuty (250 komórek w Emerald, 267 i 314 w FireRed), prowadzą przez las albo jaskinię; w mojej lekturze to lochy, a nie drogi, a loch jest osobnym rodzajem miejsca.
Droga powrotna jest krótsza. Z Centrum w Oldale do domu gracza w Littleroot jest 42 komórki wobec 58 tam; z Viridian do Pallet 76 wobec 94; z Petalburg do Oldale 81 wobec 87; z Rustboro do Petalburg 196 wobec 250; z Pewter do Viridian 254 wobec 267.7
HM to skrót przez strażnicę, którą już się minęło. Po usunięciu drzew Cut z Route 2 droga z Viridian do Pewter ma 156 komórek zamiast 267, a ścieżka prowadzi przez wschodni budynek Route 2 zamiast przez las.7
Trzy pierwsze odcinki w Hoenn
Emerald otwiera się trzema różnymi odpowiedziami na pytanie, co leży między miastami, a pomiary czynią ten projekt czytelnym.
Route 101 to korytarz z drzwiami frontowymi na każdym końcu. Ma 20 na 20 komórek, dwa ekrany wysokości, 22,8% wysokiej trawy, czyli 91 z 237 komórek, na których można stanąć; przecinają ją trzy zwrócone na południe ciągi uskoków po cztery komórki. Przejście na północ z Littleroot zajmuje 34 komórki i przecina co najmniej 10 komórek trawy; przejście na południe z miasteczka Oldale zajmuje 19 i może całkowicie ominąć trawę, przeskakując uskoki. Od drzwi frontowych domu gracza do Centrum w Oldale jest 58 komórek, 15,5 sekundy chodu.6187
Route 102 jest szersza i ma pierwszych trenerów. Ma 50 na 20 komórek, 3,3 ekranu szerokości, 14,3% trawy, 4 trenerów o zasięgu wzroku 2 lub 3 komórek, staw z 26 komórek wody i 17 komórek uskoków. Miasto Petalburg dołącza do niej z przesunięciem −10, więc 20 rzędów trasy styka się z rzędami 10 do 29 Petalburg. Od Centrum do Centrum, z Oldale do Petalburg, jest 87 komórek, 23,3 sekundy, a z powrotem 81.67
Route 104 to trasa z dwóch połówek. Ma 40 na 80 komórek, osiem ekranów wysokości, w jednej czwartej to woda, i żadne przejście nie łączy jej trzech szwów w obrębie mapy: południowa połowa sięga południowego wejścia do lasu Petalburg (Petalburg Woods), 51 komórek od szwu z Petalburg, a północna do jego północnego wyjścia, 60 komórek od szwu z Rustboro do bliższej z dwóch komórek progu wyjścia (61 do drugiej). Z Centrum w Petalburg do Centrum w Rustboro jest 250 komórek przez pięć map (miasto, trasa, las, trasa, miasto), 67 sekund chodu, a w drodze powrotnej 196.67
Między tymi trzema zmienia się mianownik. Pierwsza trasa to spacer krótszy niż 20 sekund, bez trenerów, z drogą do domu bez trawy; trzecia to minuta marszu przez loch. W mojej lekturze gra zaczyna wydawać odległość dopiero wtedy, gdy gracz nauczył się chodzić.
Uskoki wskazują dom
Tam i z powrotem na każdej zmierzonej trasie, której oba końce łączą się pieszo, oraz najmniejsza liczba komórek trawy w każdą stronę; narysowane przez figures/make_figures.py na podstawie wyników skryptów tras i grass_paths.txt.
Na każdej zmierzonej trasie, której oba końce łączą się pieszo, a wszystkie dziewięć ma uskoki, przejście w stronę wcześniejszego miasta jest krótsze. Na Route 1 w Red to 40 komórek do domu wobec 52 tam, o 23% mniej; na Route 1 w FireRed 43 wobec 58, 26%; na Route 101 w Emerald 19 wobec 34, 44%; na Route 102 w Emerald 55 wobec 62, 11%; na Route 29 w Crystal 71 wobec 90, 21%; na Route 30 w Crystal 57 wobec 74, 23%; na Route 3 w Red 82 wobec 84, na Route 3 w FireRed 94 wobec 97, a na Route 32 w Crystal 128 wobec 132, po 2% do 3%. 4 komórki na Route 32 pochodzą z jednego bocznego skoku z narożnego uskoku, jedynego skoku w drodze do domu.5617 Uskoki na pierwszych trasach zwrócone są w tę samą stronę: 42 komórki uskoków w 10 ciągach na Route 1 w Red, 61 w 10 ciągach na Route 1 w FireRed i 13 na Route 101 w Emerald (trzy ciągi po cztery i jedna komórka narożna) są wszystkie zwrócone na południe, narożna na południowy wschód, co na każdej z tych map jest drogą powrotną do miasta startowego.56
Uskoki zabierają też trawę z drogi do domu. Drugie wyszukiwanie, które minimalizuje liczbę przekraczanych komórek wysokiej trawy zamiast kroków, pokazuje, że idąc na północ po Route 1 w Red, trzeba przejść co najmniej 15 komórek trawy, a na południe tylko 4, wszystkie w przesmyku obok Pallet; na Route 1 w FireRed to 19 wobec 5; na Route 101 w Emerald 10 wobec 0; na Route 102 w Emerald 4 tam wobec 0 w drodze do domu.18 Opis Route 1 w Kanto na Bulbapedii mówi to samo prozą: idąc na południe, trenerzy „can either hop down ledges to completely avoid any contact with wild Pokémon” (mogą zeskakiwać z uskoków, by całkowicie uniknąć kontaktu z dzikimi Pokémonami) albo przejść przez „the grass patches, the required path for northbound travel” (połacie trawy, obowiązkową drogę na północ).35 To jedna strona wiki użyta raz, jako kontrola wyszukiwania, i wyszukiwanie zgadza się z nią z wyjątkiem przesmyku obok Pallet: ma on dwie komórki szerokości i cztery rzędy trawy głębokości, więc każde przejście na południe w modelu komórek przecina tam 4 komórki trawy, po jednej na rząd. Uskoki prowadzą piechura dookoła całej pozostałej trawy na trasie, ale nie dookoła absolutnie całej.18
Liczby z Gen 2 wymagają po jednym zastrzeżeniu. Kolizja w Crystal to cztery bajty na 32-pikselowy blok, po jednym na ćwiartkę, a skrypty zakładają, że idą one wierszami (lewa górna, prawa górna, lewa dolna, prawa dolna), bo makro tilecoll nie określa kolejności.29 Bajt COLL_HOP_* w Gen 2 oznacza krawędź, na której stoi gracz, a nie komórkę za nią, co rozstrzygnął probe_gen2_ledges.py, znajdując komórkę WALL pod każdą z 21 komórek HOP_DOWN na Route 30; odczyt krawędzi sprawdzono tylko na Route 29 i 30.529 Crystal ma też jednostronne ściany. Bajt kolizji od COLL_RIGHT_WALL do COLL_UP_LEFT_WALL oznacza ląd, ale GetMovementPermissions odmawia kroku wychodzącego z takiego kafelka przez jego zamurowaną stronę oraz kroku wchodzącego do niego przez tę stronę; na Route 32, jedynej z czterech, która je ma (41 komórek, wszystkie UP_WALL), wydłużają one najkrótsze przejście ze 110 komórek w każdą stronę, które znajduje wyszukiwanie je ignorujące, do 132 tam i 128 do domu. Jej narożne uskoki, HOP_DOWN_RIGHT i HOP_DOWN_LEFT, pozwalają skoczyć w dół albo w bok, zależnie od tego, w którą stronę patrzy gracz, gdy zwykły krok zostanie odrzucony, a droga do domu wykorzystuje jeden z nich bokiem. Red nie ma jednostronnych ścian: jego jedyna inna reguła ruchu, kolizje par kafelków, działa w obie strony i jest zdefiniowana tylko dla tilesetów jaskini i lasu, których żadna z tych map nie używa.5 Wyszukiwanie liczy też uskok jako dwie komórki ruchu, co zgadza się z 32-klatkowym skokiem w Gen 3 i jest założeniem dla Gen 1 i 2.293
Dane pokazują wynik, a nie zamiar: nie znalazłem żadnej wypowiedzi twórców, że uskoki umieszczono po to, by skrócić drogę do domu, tylko to, że na każdej zmierzonej trasie ją skracają.29 Reguła, którą z tego wyciągam, brzmi: uskok to jednokierunkowy skrót z powrotem, nigdy ściana na drodze naprzód.
Kwestia wysokości
To ustalenie źle współgra z poprzednim artykułem. Dossier budowli stojące za Budowlami w pixel art odrzuciło uskoki wprost, „No ledges to jump, no climbing, no isometric” (żadnych uskoków do skakania, żadnej wspinaczki, żadnej izometrii), a tamten artykuł wymienia jednokierunkowy uskok wśród rzeczy, których jego kompilacja nie robi.3637 To dossier mierzy uskoki jako kanoniczny skrót do domu. Oba nie są ze sobą sprzeczne co do faktów; różnią się w tym, czy kolekcjonerskie miasteczko potrzebuje wysokości, by uzyskać ten efekt. Decyzja należy do kolejnego artykułu programu, o wysokości, uskokach i mostach, który nie został jeszcze opublikowany. Dopóki tam nie zapadnie, brief w sekcji 7 odkłada uskoki do artykułu o wysokości, a krótszą drogę do domu uzyskuje dzięki furtce w żywopłocie: furtce na Łąkowej Ścieżce, która otwiera się tylko od strony jeziora, temu samemu jednokierunkowemu skrótowi z powrotem, bez żadnej wysokości.26
3. Szwy, strażnice i ekran mapy
Świat zewnętrzny w Pokémonach nie jest jedną dużą mapą. To wiele małych map, każda z własnym rozmiarem, kafelkami i muzyką, połączonych krawędź w krawędź tak, że przechodzi się z jednej do następnej bez cięcia. To, jak działa takie połączenie, rozstrzyga niemal wszystko inne w tej sekcji: gdzie na drodze musi stanąć budynek, dlaczego remaki mają ich mniej i co może wiedzieć ekran mapy.
Gen 1 i Gen 2: pas skopiowany do marginesu
Połączenie w Red to jeden wiersz w nagłówku mapy, podający kierunek, sąsiada i przesunięcie w blokach; dla Route 1 jest to connection north, ViridianCity, VIRIDIAN_CITY, -5, a makro z góry wylicza, który pas bloków sąsiada zostanie skopiowany do bufora bieżącej mapy.38 Bufor, wOverworldMap, przechowuje mapę z marginesem MAP_BORDER EQU 3 bloków, czyli 6 komórek, z każdej strony; połączenie wypełnia ten margines 3 najbliższymi rzędami lub kolumnami bloków sąsiada, a CheckMapConnections przełącza mapy, gdy współrzędna gracza przekroczy −1 albo szerokość lub wysokość mapy.39
Ponieważ pas kopiowany jest jako numery bloków i rysowany aktualnie wczytanym blocksetem, dwie mapy mogą spotkać się na szwie tylko wtedy, gdy dzielą tileset, i dane Red się tego trzymają: z 78 wierszy połączeń 76 łączy mapy o tym samym tilesecie. Dwa wyjątki to Route 22 i Route 23, OVERWORLD wobec PLATEAU, a pliki nagłówków oznaczają oba wiersze jako „; unnecessary” (niepotrzebne).840 Crystal ma 142 wiersze połączeń; 138 łączy ten sam tileset (wyjątki to miasto Goldenrod i Route 35 oraz Route 32 i Route 33, Johto wobec Johto Modern), a 92 pozostają w obrębie jednej grupy map.841
Gen 3: siedem komórek sąsiada (osiem od wschodu) i grafika przy przejściu
Połączenie w Gen 3 to wpis z polami map, offset i direction w pliku map.json mapy. Emerald ma 134 wpisy w górę, w dół, w lewo i w prawo oraz 14 wpisów nurkowania i wynurzania, a każdy ze 134 ma odpowiadający mu wpis odwrotny z zanegowanym przesunięciem.8 Porymap, edytor map używany przez społeczność dekompilacji, opisuje tę funkcję w trzech zdaniach: „Maps can be connected together so that the player can seamlessly walk between them” (mapy można połączyć, by gracz płynnie przechodził między nimi); „A connection has a direction, offset, and destination map” (połączenie ma kierunek, przesunięcie i mapę docelową); oraz „Connections are one-way, which means that you must keep the two connections in sync between the two maps” (połączenia są jednokierunkowe, więc oba połączenia między dwiema mapami trzeba utrzymywać w zgodzie).42
Silnik kopiuje bieżącą mapę do bufora z marginesem MAP_OFFSET 7 komórek z każdej strony (8 od wschodu, bo bufor ma szerokość mapy plus MAP_OFFSET_W, czyli 2 × 7 + 1), a nagłówek podaje powód w komentarzu: „the player has 7 metatiles of view horizontally in either direction” (gracz widzi poziomo po 7 metatile’i w każdą stronę). FillSouthConnection i jej siostrzane funkcje kopiują 7 rzędów lub kolumn sąsiada do tego marginesu (8 kolumn od wschodu) z przesunięciem połączenia, obejmując tylko szerokość samego sąsiada (FillNorthConnection zaczyna od przesunięcia plus MAP_OFFSET i kopiuje szerokość sąsiada tam, gdzie się mieści), a cały bufor może pomieścić co najwyżej MAX_MAP_DATA_SIZE 10240 komórek.9 Tam, gdzie połączenia nie ma, margines to wzór brzegowy 2 na 2 z układu mapy, połączony operacją OR z MAPGRID_IMPASSABLE, tak by nigdy nie dało się po nim chodzić (GetBorderBlockAt).9
Co zawiera bufor na szwie, schematycznie: jedno pole na komórkę, wymiary z MAP_OFFSET, FillNorthConnection i układu Route 101 o wymiarach 20 na 20 z układem Oldale o szerokości 20 na północy z przesunięciem 0; narysowane przez figures/make_figures.py, bez grafiki z gry.
Pas sąsiada rysowany jest tilesetami bieżącej mapy (DrawMetatileAt bierze podstawowy i drugorzędny zestaw mapy, na której się jest), dopóki gracz nie przejdzie. Przejście wywołuje LoadMapFromCameraTransition, które uruchamia skrypt przejścia nowej mapy, wczytuje tylko jej drugorzędny tileset i paletę, zmienia muzykę i pogodę oraz pokazuje tabliczkę z nazwą mapy, bez wygaszania.10 Dlatego żadna połączona para nie różni się podstawowym tilesetem: 0 ze 134 w Emerald i 0 ze 120 w FireRed. 38 połączeń w Emerald i 34 w FireRed łączy różne tilesety drugorzędne, a w 24 z każdej z tych grup pas sąsiada w marginesie (7 komórek, 8 od wschodu, przycięty tam, gdzie wychodziłby poza bufor, tak jak przycina go silnik) używa wyłącznie podstawowych metatile’i, więc rysuje się poprawnie z każdej strony.8
Przesunięcia są powszechne. 36 ze 134 połączeń w Emerald i 68 ze 120 w FireRed ma przesunięcie niezerowe; Route 1 w FireRed zaczyna się 12 komórek w głąb 48-komórkowej szerokości Viridian.8 Wzajemność nie jest w FireRed całkiem powszechna: 112 ze 120 wpisów jest wzajemnych, a otoczone murem miasto odpowiada za 6 z 8 pozostałych. Miasto Saffron (Saffron City) łączy się jednostronnie z Route 5 do 8, podczas gdy te trasy łączą się nie z Saffron, lecz z osobną mapą SAFFRON_CITY_CONNECTION; dwa ostatnie to prototypowe mapy Sevii.8 Układ Saffron odczytuję jako trik rysunkowy: połączenie istnieje po to, by narysować mur miasta za krawędzią trasy, a wejście prowadzi przez cztery strażnice, których strażnicy w Red zawracają gracza, dopóki nie dostaną czegoś do picia.819 Gdy miejsce ma wyglądać na ciągłe, a mimo to być strzeżone, Gen 3 rysuje sąsiada w marginesie, a drzwi umieszcza w budynku.
Po przejściu przez szew na mapę z ustawionym show_map_name wsuwa się nazwa miejsca. Zadanie tabliczki czeka 31 klatek, wsuwa się o 40 pikseli po 2 piksele na klatkę (20 klatek), trzyma się, dopóki jego licznik nie przekroczy 120 (121 klatek), i wysuwa się (20 klatek): około 190 klatek, 3,2 sekundy.21 Policzyłem stany zadania po ich progach, więc każdy stan może trwać klatkę dłużej lub krócej, niż podaję.29
Strażnice: tam, gdzie zmienia się grafika
Red ma 27 map z tilesetem GATE lub FOREST_GATE: dwupiętrowe strażnice na Route 11, 12, 15, 16 i 18 (10 map), jednopiętrowe strażnice na Route 2, 5, 6, 7 i 8, strażnicę na Route 22, strażnicę Safari Zone i jej 4 domy odpoczynku, 4 wejścia do Underground Path (podziemnego przejścia) i 2 strażnice lasu Viridian (Viridian Forest).8 Każda strażnica w Red, która łączy dwa różne miejsca, łączy dwa tilesety: OVERWORLD z FOREST (las Viridian, Safari Zone), z UNDERGROUND (cztery wejścia do przejścia) albo z PLATEAU (Route 22 z Route 23), czyli połączenia, których połączenia map w Red prawie nigdy nie tworzą.8
Route 2 to najwyraźniejszy przypadek. Ma 20 na 72 komórki w Red i 24 na 80 w FireRed i nie da się jej przejść od końca do końca: jej południowa i północna połowa spotykają się tylko przez las Viridian, który w Red narysowany jest tilesetem FOREST zamiast OVERWORLD i do którego wchodzi się przez dwie strażnice.58 W FireRed z Centrum w Viridian do Centrum w Pewter jest 267 komórek przez południową strażnicę, las i północną strażnicę.7 Wynikają z tego trzy odczytania, i są to odczytania danych, a nie wypowiedzi twórców.
- Strażnica stoi tam, gdzie zmienia się grafika. Szew w Gen 1 rysuje bloki sąsiada bieżącym blocksetem, więc dwie mapy mogą spotkać się na szwie tylko wtedy, gdy dzielą tileset, czego Red trzyma się w 76 z 78 połączeń. Las narysowany tilesetem leśnym potrzebuje więc drzwi, a strażnica jest tymi drzwiami.388
- Strażnica to miejsce, w którym może mieszkać reguła. Cztery strażnice Saffron zawracają gracza, dopóki nie poda napoju (
TEXT_ROUTE5GATE_GUARD_GEE_IM_THIRSTY,BIT_GAVE_SAFFRON_GUARDS_DRINK); strażnica na Route 22 sprawdzaBIT_BOULDERBADGE.19 Trzy strażnice nagradzają też kolekcjonowanie: pomocnicy profesora Oaka dają przedmiot, gdy liczba posiadanych gatunków (CountSetBitspowPokedexOwned) osiągnie 10 w strażnicy na Route 2, 30 na drugim piętrze strażnicy na Route 11 i 50 na drugim piętrze strażnicy na Route 15.20 - Strażnica to pauza z ludźmi w środku. W strażnicy na Route 2 są pomocnik Oaka i chłopiec; marsz wznawia się po wygaszeniu, w nowym miejscu.43
Remaki dzielą się według silnika. Crystal ma 25 map o środowisku GATE, z których 19 łączy mapy z różnych grup map, a 7 łączy różne tilesety.8 FireRed zachowuje strażnice Kanto: 8 map wewnętrznych prowadzi do dwóch różnych map zewnętrznych (para lasu Viridian, cztery wejścia do Saffron, północne wejście Route 22 i wejście do Safari Zone), a kolejne 13 ma drzwi po dwóch oddzielnych stronach jednej mapy zewnętrznej, wśród nich pięć dwupiętrowych strażnic tras i wschodni budynek Route 2.8 Hoenn niemal z nich rezygnuje. W Emerald tylko 2 mapy wewnętrzne prowadzą do dwóch różnych map zewnętrznych (parter Mt. Pyre i wejście do Safari Zone), a 5 ma drzwi po dwóch stronach jednej, wśród nich dwie stacje Cycling Road; trasy spotykają się z miastami na otwartych szwach.8 Liczone jako budynki, Emerald ma 4 strażnice (dwie stacje Cycling Road, wejście do Safari Zone i bramę Battle Frontier) wobec 14 w FireRed i 27 map z tilesetem strażnic w Red.8 Moje odczytanie, i jest to tylko odczytanie: Hoenn mógł zrezygnować ze strażnic, bo jego silnik wczytuje nowy drugorzędny tileset w chwili przejścia, więc trasa może spotkać się z miastem narysowanym inną grafiką bez budynku pomiędzy nimi.10
Ekran mapy i Fly
Mapa regionu w Emerald to siatka 28 na 15 pól (MAP_WIDTH 28, MAP_HEIGHT 15), łącznie 420; 158 z nich, 37,6%, należy do jakiegoś miejsca, podzielonych między 54 sekcje: 34 trasy, 16 miast i miasteczek oraz 4 inne. Trasy zajmują 129 pól, a miasta 22.11 Z 213 wpisów w region_map_sections.json 95 ma prostokąt na siatce; 49 z nich to pojedyncze pole, największy ma 4 na 3 (Route 124 i jej podwodny bliźniak), Slateport ma 1 na 2, a Mauville 2 na 1.11 Ekran mapy jest więc, wedle tych danych, zgrubną siatką nazwanych prostokątów, a większość miejsc to jedno pole.
Fly to miejsce, w którym ekran spotyka się z chodzeniem. Fly w Emerald wymaga szóstej odznaki (FIELD_MOVE_FLY wobec FLAG_BADGE06_GET w tabeli odznak) i zewnętrznego typu mapy (Overworld_MapTypeAllowsTeleportAndFly: trasa, miasteczko, miasto albo trasa morska). Na mapie miasto jest MAPSECTYPE_CITY_CANFLY tylko wtedy, gdy ustawiona jest jego flaga FLAG_VISITED_*, a każde z 16 miast i miasteczek ustawia własną flagę w swoim skrypcie przejścia; skrypt Oldale mówi setflag FLAG_VISITED_OLDALE_TOWN.13
Pozostałe gry zgadzają się co do kształtu. Mapa w FireRed ma 22 na 15 pól na stronę, cztery strony (Kanto i trzy zestawy wysp Sevii), każda w dwóch warstwach, świat zewnętrzny i lochy; warstwa zewnętrzna Kanto wypełnia 90 pól 38 sekcjami, a Fly wymaga trzeciej odznaki. Miejsce w FireRed liczy się jako odwiedzone, gdy ustawiona jest jego flaga FLAG_WORLD_MAP_*, co robi przy wejściu skrypt przejścia każdego miasta (setworldmapflag FLAG_WORLD_MAP_CELADON_CITY), a Fly przyjmuje tylko odwiedzone pole.23 Mapa w Crystal rozmieszcza 95 punktów orientacyjnych według pozycji w pikselach i oferuje 24 punkty lotu, 12 w Johto i 12 w Kanto; punkt lotu miasta ustawia callback przy wejściu do niego (VioletCityFlypointCallback: setflag ENGINE_FLYPOINT_VIOLET), a Fly sprawdza ENGINE_STORMBADGE.24 Mapa w Red wymienia 37 wpisów zewnętrznych na 4-bitowej siatce (jeden oznaczony jako nieużywany) i 60 wpisów wewnętrznych z własnymi pozycjami; wejście na którąkolwiek z 11 map miast ustawia bit tego miasta w wTownVisitedFlag, z komentarzem w kodzie „mark town as visited (for flying)” (oznacz miasto jako odwiedzone, na potrzeby latania), lista lotu pomija nieodwiedzone miasta, a Fly wymaga Thunder Badge i mapy zewnętrznej.22
Żadna z czterech gier nie daje graczowi na start mapy do noszenia; każda przekazuje ją w trakcie gry. Town Map w Red i FireRed to przedmiot od siostry rywala w Pallet (w Red oferowany, gdy gracz ma już Pokédex); Map Card w Crystal to prezent w Cherrygrove, pierwszym mieście za domem; PokéNav w Emerald pochodzi z budynku Devon w Rustboro, trzecim mieście za domem.442345127 Mapy ścienne otwierają ten sam ekran wcześniej: Emerald wiesza jedną na piętrze domu gracza i na parterze każdego Centrum Pokémon, FireRed w swoich Centrach, w szkole w Viridian i w niektórych domach, a tileset HOUSE w Red, używany przez dom rywala w Pallet, ma kafelek mapy ściennej.122344
Razem daje to regułę spójną w czterech grach i trzech generacjach. Gdy gracz ma już mapę, rysuje ona każde miejsce w regionie, odwiedzone czy nie; wyjątkami są późne miejsca wstrzymane przez fabułę albo wydarzenie: strony Sevii w FireRed, dopóki skrypty w Centrum Pokémon na One Island nie ustawią ich flag, a na tych stronach Navel Rock i Birth Island, zamalowane, dopóki gracz tam nie dotrze; Battle Frontier i Southern Island w Emerald do czasu ustawienia ich flag punktów orientacyjnych; oraz mapa Kanto w Crystal, dopóki gracz nie stanie w Kanto.44451223 Szybka podróż oferuje tylko miejsca, do których się weszło, zapisane flagą ustawianą przy wejściu, dostępna tylko na zewnątrz i tylko po odznace ze środka gry: trzeciej w Red i FireRed, szóstej w Emerald.13232422
4. Inne modele: Stardew Valley, Animal Crossing, Link’s Awakening
Pokémony to jedna odpowiedź na pytanie o ziemię między miastami. Trzy inne gry odpowiadają inaczej, a każda różnica to wybór, którego Kiradex musi dokonać. Liczby w tej sekcji pochodzą z wiki społeczności tych gier, a w przypadku Link’s Awakening z deasemblacji; nie sprawdzałem ich w kodzie gier, chyba że przypis mówi inaczej.29
Stardew Valley: węzeł ze szprychami, otwieranymi przez kalendarz
Stardew wygasza ekran na każdej krawędzi. Słowami wiki: „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” (gdy dochodzi się do krawędzi obszaru albo wchodzi do budynku, a ekran podczas przejścia wygasa do czerni, przechodzi się między mapami). Warp to właściwość mapy, której wartość wiki podaje jako Warp [ <int fromX> <int fromY> <string toArea> <int toX> <int toY> ]+, z przykładem „6 20 Mountain 76 9”.46
Dolina to mały graf wokół jednego węzła. Miasteczko Pelican (Pelican Town) łączy się z przystankiem autobusowym (Bus Stop) i farmą (Farm) na północnym zachodzie, z lasem Cindersap (Cindersap Forest) na południowym zachodzie, z plażą (The Beach) na południu i z górą (The Mountain) na północy.47 Przystanek autobusowy „connects the Farm to the west with Pelican Town to the east” (łączy farmę na zachodzie z Pelican Town na wschodzie) i prowadzi drogą na zachód do dolnej części lasu za farmą (Backwoods).48 Las Cindersap „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” (ma wyjścia na północ na farmę, na wschód do Pelican Town, na południe do kanałów i na północny zachód do sekretnego lasu).49 Las za farmą „consists of two disconnected sections” (składa się z dwóch niepołączonych części), górnej ścieżki łączącej farmę z górą i dolnej części, do której dochodzi się od drogi przy przystanku.50 Ramka z lokacjami na tych stronach wymienia według moich obliczeń 26 miejsc, od lasu za farmą po bagno wiedźmy (Witch’s Swamp).51
Szprychy otwierają się według daty i czynu. Góra ma na początku „only two exits: to the south leading to Pelican Town, and to the west leading to the Backwoods” (tylko dwa wyjścia: na południe do Pelican Town i na zachód do lasu za farmą); kopalnie (Mines) otwierają się 5 dnia wiosny, kolej (Railroad) po trzęsieniu ziemi 3 dnia lata, a most do kamieniołomu (Quarry) za pakiety z pokoju rzemiosł (Crafts Room) albo 25 000 g.52 Pustynia (The Desert) wymaga naprawy autobusu, za pakiety ze skarbca (Vault) albo 40 000 g; sekretny las (Secret Woods) wymaga usunięcia kłody stalową siekierą lub lepszą; pływy na plaży wymagają mostu z 300 sztuk drewna.53 Wiki podaje bazową prędkość gracza jako 2 w chodzie, 5 w biegu i 6,6 na koniu, bez jednostek, a ja nie otwierałem kodu gry, by je ustalić.54
Moje odczytanie: Pokémony blokują obszar zdolnością, którą gracz nosi ze sobą, odznaką albo HM. Stardew blokuje go czymś, co zrobiła społeczność: pakietem, mostem albo trzęsieniem ziemi w określonym dniu. To drugie to rodzaj blokady, której wspólne, kolekcjonerskie miasteczko może używać, nie sprawiając, że ktokolwiek poczuje się wykluczony przez swój poziom.
Animal Crossing: siatka akrów i pociąg
Animal Crossing na GameCube buduje miasteczko z akrów. „Acres are grid elements measuring 16x16 spaces” (akry to elementy siatki o wymiarach 16 na 16 pól); miasteczko ma „five acres across by six down” (pięć akrów wszerz i sześć w dół), a stacja kolejowa jest „always located in Acre A-3” (zawsze w akrze A-3), przy czym mapa oznacza kolumny od 1 do 5, a rzędy od A do F.55 Łącznie daje to 80 na 96 pól.17 Późniejsze gry zmieniły siatkę: Wild World ma 4 na 4 akry, City Folk 5 na 5, New Leaf 5 na 4, New Horizons 7 na 6, czyli 42 akry.55
Akr jest też regułą pojawiania się. „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” (za każdym razem, gdy gracz wchodzi do akra, z wyjątkiem wyjścia z domu po wczytaniu gry, w miejscach zapisanych w danych akra pojawiają się jedna ryba i jeden owad), a znikają, gdy gracz oddali się od tego akra o sześć pól.55 Mapa miasteczka pojawia się wcześnie, od Toma Nooka w czasie dorywczej pracy; „is organized in a grid, with each square representing an acre” (jest zorganizowana w siatkę, w której każde pole to jeden akr) i pokazuje morze, rzeki, budynki i domy, ale nie drzewa, przedmioty ani mieszkańców.56
Pociąg to w grze na GameCube jedyny sposób dotarcia do innego miasteczka, przez kartę pamięci, a „The train ride takes a few minutes” (jazda pociągiem trwa kilka minut); stacja „is located at the top of the player’s town” (znajduje się na górze miasteczka gracza), a nowa gra zaczyna się od przyjazdu gracza właśnie tam.57
Moje odczytanie: akry czynią miasteczko czytelnym, mapą nazwanych pól, i dają regułę pojawiania się, która nagradza przemieszczanie się bez kości rzucanych na każdym kroku. Pociąg zamienia podróż między światami w scenę, a nie w szew.
Link’s Awakening: świat pocięty na ekrany
Link’s Awakening DX przyjmuje podejście przeciwne do ciągłego przewijania w Pokémonach. W dokumentacji deasemblacji zladx rozgrywka „takes place in non-scrollable screen-wide rooms” (toczy się w nieprzewijanych pomieszczeniach szerokości ekranu), a „On the Overworld, rooms are stored as they are laid out during the game, on a 16x16 grid of rooms” (w świecie zewnętrznym pomieszczenia są zapisane tak, jak są rozmieszczone w grze, na siatce 16 na 16 pomieszczeń).58 Mapa świata zewnętrznego to 512 bajtów dwubajtowych wskaźników pomieszczeń, 256 pomieszczeń, a nakładka kafelków pomieszczenia to „a straight forward array of 10x8 tile numbers” (prosta tablica 10 na 8 numerów kafelków).59 „Overworld rooms are grouped in 2x2 sections (i.e. 4 rooms). Each section has a tileset ID” (pomieszczenia świata zewnętrznego są pogrupowane w sekcje 2 na 2, czyli po 4 pomieszczenia, a każda sekcja ma identyfikator tilesetu), a 32 kafelki sekcji są podmieniane podczas przejścia do pomieszczenia, które ich potrzebuje.58 Każde pomieszczenie świata zewnętrznego ma bajt stanu w wOverworldRoomStatus, 256 bajtów, z OW_ROOM_STATUS_VISITED EQU $80 obok bitów dla drzwi, zmian i sów; bit odczytałem ze stałych deasemblacji i nie prześledziłem, czy ekran mapy rysuje tylko pomieszczenia, które go mają.25
Moje odczytanie: Pokémony przewijają ciągły świat i nazywają go sekcjami; Link’s Awakening tnie świat na równe ekrany i zapisuje, które z nich się widziało. Na telefonie, którego widok zależy od urządzenia, 10,3 kafelka wszerz na iPhonie 18 Pro Max w pionie i 29,7 na otwartym iPhonie Duo, tylko model przewijany działa bez czarnych pasów w każdym pomieszczeniu, i dlatego używa go brief.60
5. Rzemiosło jako reguły z liczbami
Oto reguły, które wspierają pomiary, każda z podanym pochodzeniem. Tam, gdzie reguła zamienia zmierzony fakt w zalecenie, zalecenie jest moje, a reguła mówi to swoim czasownikiem.
| Element | Reguła | Źródło |
|---|---|---|
| Tempo | Komórka chodu kosztuje 16 klatek, około 0,27 sekundy; kafelek Kiradex kosztuje 0,25. Każdą podróż wymiarować w sekundach przy chodzie danej gry. | kod kroków Red, Crystal i Emerald; GBATEK; PlazaRig.swift |
| Długość trasy | Od 2 do 10 ekranów wzdłuż osi ruchu; pierwsza trasa gry od 2 do 6. | szesnaście zmierzonych tras |
| Wicie się | Dłuższe przejście w poprzek ma od 1,15 do 1,70 długości dłuższego boku trasy, droga do domu od 0,95 do 1,42. Wymiarować trasę według ścieżki, nie prostokąta, w którym się mieści. | najkrótsze przejścia względem dłuższych boków na dziewięciu trasach, których końce łączą się pieszo |
| Pierwszy odcinek | Od 15 do 25 sekund od drzwi do głównych drzwi następnego miasta. Odcinek trwający minutę to loch, a nie droga. | Emerald 58 komórek, FireRed 94; 250, 267 i 314 przez las albo jaskinię |
| Proporcje | Droga zajmuje od 2 do 4 razy więcej powierzchni niż miasto; na ekranie mapy 5,9 do 1, bo miasto to jedno lub dwa pola. | Crystal 1,97, Red 2,65, Emerald 3,70, FireRed 3,87; mapa w Emerald |
| Gęstość | Teren spotkań zajmuje od 14% do 23% mapy pierwszej trasy i rzednie do 4% do 9% na trzeciej i czwartej; względem gruntu do chodzenia pierwsza trasa ma od 19% do 38%. Pierwsza trasa nie ma trenerów. | tabela tras; trawa względem komórek do chodzenia |
| Rytm | Coś do zauważenia mniej więcej co dziewiąty krok na terenie spotkań, po kilku krokach karencji po przybyciu; susze i zalewy krótkie dzięki podłodze i rampie. | czterokrokowa odporność w Emerald, potem współczynnik 20, niezmodyfikowane 11,1%; wyciszenie i premia w FireRed |
| Droga do domu | Krótsza niż droga tam, o 2% do 44% na wszystkich dziewięciu trasach z uskokami, których końce łączą się pieszo, z 0 do 5 komórkami trawy wobec 4 do 19. Uskok to jednokierunkowy skrót z powrotem, nigdy ściana na drodze naprzód. | dziewięć tras; wyszukiwanie najmniejszej ilości trawy |
| Szwy | Dwa obszary mogą spotkać się na otwartym szwie tylko tam, gdzie oba rysują krawędź tym samym zestawem gruntu; tam, gdzie zmienia się grafika, stawiać budynek z dwojgiem drzwi. | Red 76 z 78, Crystal 138 ze 142, Gen 3 0 ze 134 i 0 ze 120 z różnymi zestawami podstawowymi; każda strażnica w Red między dwoma miejscami |
| Pas sąsiada | Rysować co najmniej pół widoku sąsiada za krawędzią. | 7 komórek w Gen 3 (8 od wschodu) dla ekranu 15 komórek; 6 komórek w Gen 1 dla 10 |
| Połączenia | Przesunięcia są normalne; każde połączenie ma odwrotne z zanegowanym przesunięciem, a jednostronne to celowy trik rysunkowy. | Emerald 36 ze 134 z przesunięciem, 134 ze 134 wzajemnych; Saffron w FireRed |
| Tabliczka z nazwą | Nazwać miejsce przy wejściu na około trzy sekundy. | tabliczka w Emerald, około 190 klatek |
| Strażnice | Strażnica to miejsce, w którym mieszkają reguła i nagroda: sprawdzenie etapu, strażnik, prezent przy określonej liczbie. | sprawdzenie odznaki w Red, spragniony strażnik i prezenty przy 10, 30 i 50 posiadanych gatunkach |
| Ekran mapy | Zgrubna siatka nazwanych prostokątów; większość miejsc to jedno pole, największe kilka. | Emerald 28 na 15, 49 z 95 prostokątów to pojedyncze pole, największy 4 na 3; akry 5 na 6 w Animal Crossing |
| Szybka podróż | Gdy gracz ma już mapę, pokazuje ona każde miejsce, odwiedzone czy nie, poza kilkoma, które wstrzymują flagi fabuły albo wydarzeń; szybka podróż pokazuje tylko miejsca, w których się było, oznaczone flagą przy wejściu, i tylko z zewnątrz. | Town Map, Map Card, PokéNav i mapy ścienne; wTownVisitedFlag w Red, punkty lotu w Crystal, FLAG_VISITED_* w Emerald, FLAG_WORLD_MAP_* w FireRed; rejestr odwiedzin nieprześledzony do ekranu mapy: bit OW_ROOM_STATUS_VISITED w Link’s Awakening |
| Odblokowania | Obszary otwierają się czynem i datą, a nie tylko zdolnością. | kopalnie, kolej, kamieniołom, pustynia i sekretny las w Stardew; 267 komórek zamienione na 156 dzięki Cut |
| Przejścia | Szew w obrębie jednego świata zewnętrznego; wygaszanie przy drzwiach i na krawędzi świata. | szew w Pokémonach, wygaszanie w Stardew, przesunięcie ekranu w Link’s Awakening |
| Orientacja | Trasę prowadzić wzdłuż dłuższej osi urządzenia; trasa, która w całości mieści się w jednym widoku, nie ma już nic do odsłonięcia. | liczby kafelków z 3 października; 20 na 20 Route 101 w Emerald wobec 29,7 na 20,9 otwartego Duo |
Źródła tabeli: kod kroków i taktowanie klatek z sekcji 1;12315 prędkość chodu Kiradex;4 skrypty tras, podróży, trawy i połączeń;567188 kod spotkań;3132 kod bufora, przejścia i tabliczki w Emerald;91021 skrypty strażnic;1920 ekrany map, sposób, w jaki gracz je dostaje, i Fly;1112132345244422 Stardew Valley, Animal Crossing i Link’s Awakening;465253555825 liczby kafelków dla urządzeń z pierwszego artykułu tej serii.60
Trzy z tych reguł zasługują na jedno zdanie więcej.
Reguła szwów jest sformułowana jako reguła o grafice, a nie o silnikach. Game Boy rysował pas sąsiada blocksetem bieżącej mapy, więc w ogóle nie mógł pokazać sąsiada w innym tilesecie; Game Boy Advance rysuje pas tilesetami bieżącej mapy do chwili przejścia, i w mojej lekturze dlatego jego szwy trzymają się jednego zestawu podstawowego i przeważnie podstawowych metatile’i.38108 Oba przypadki odczytuję jako ograniczenia pamięci kafelków, których telefon rysujący jeden atlas nie ma. Przetrwa powód wizualny: ścieżka, która zmienia materiał na prostej linii przecinającej ekran, wygląda jak szew bez względu na to, czy silnik go potrzebował. Dlatego reguła zachowuje pierwszą połowę (spotykać się otwarcie tam, gdzie grunt się ciągnie) i drugą (budynek tam, gdzie zmienia się grafika), nawet gdy nic do tego nie zmusza.
Reguła szybkiej podróży najbardziej zasługuje na dokładne skopiowanie. Każda zmierzona tu gra z Pokémonami przekazuje mapę wcześnie w trakcie gry, rysuje na niej każde miejsce, odwiedzone czy nie, poza kilkoma późnymi miejscami, które wstrzymują flagi fabuły albo wydarzeń, i blokuje wyłącznie skrót; każda z nich daje zasłużyć na skrót tym, że gdzieś się doszło, a nie zapłatą.44451213232224 Dla aplikacji kolekcjonerskiej, w której XP pochodzi wyłącznie z kart zeskanowanych w prawdziwym świecie, flaga odwiedzin jest właściwą walutą, bo kosztuje spacer i nic więcej.27
Reguła orientacji wynika z telefonu, a nie z kanonu. Pro Max w pionie widzi 10,3 na 22,4 kafelka w skali Kiradex, a otwarty iPhone Duo 29,7 na 20,9, więc trasa biegnąca z północy na południe pokazuje na zwykłym telefonie naraz 22 kafelki swojej długości, około 11 przed kolekcjonerem, którego kamera trzyma na środku, a trasa biegnąca ze wschodu na zachód pokazuje naraz 30, około 15 przed nim, tylko na otwartym Duo.602717 Route 101 w Emerald, 20 na 20, zmieściłaby się w całości w jednym widoku otwartego Duo, co oznacza, że tak krótka trasa nie ma tam już nic do odsłonięcia.617
6. Droga Apple: widoki, szwy, pokoje serwera i mapa
Silnik pod Kiradex World to ten, który przedstawił pierwszy artykuł: scena RealityKit używana jako renderer 2D, kamera ortograficzna z całkowitą liczbą pikseli urządzenia na teksel, grunt jako jedna siatka MeshDescriptor rysowana jednym wywołaniem, każdy materiał jako UnlitMaterial z progiem nieprzezroczystości oraz wyłączone w RealityView rozmycie ruchu i mapowanie tonów.60 Artykuł o budowlach dodał obiekty sortowane według głębokości w drugiej siatce, warpy jako dane i piętra podmieniane w miejscu przez nadanie scenie nowej tożsamości, .id(floor.name), tak by SwiftUI rozebrało jeden RealityView i zbudowało następny.37 Obszary za płotem potrzebują od tego silnika trzech kolejnych rzeczy: widoku sąsiada po drugiej stronie szwu, sposobu na zmianę pokoju na serwerze bez cięcia i ekranu mapy. Nic z tego nie zostało jeszcze zbudowane i nic w tej sekcji nie zostało zmierzone na telefonie; to plan, na którym opiera się brief, z każdym kosztem nazwanym i oznaczonym jako niezmierzony.
Co widzi telefon
Liczby kafelków pochodzą z tabeli w pierwszym artykule, obliczonej na podstawie stron ze specyfikacjami Apple i profili symulatora Xcode 27 przy całkowitych skalach Kiradex.60
| Urządzenie i orientacja | Piksele na teksel | Widoczne kafelki (wszerz na w dół) | Pół widoku |
|---|---|---|---|
| iPhone 18 Pro Max, pion | 8 | 10,3 na 22,4 | 6 wszerz, 12 w dół |
| iPhone Duo, ekran zewnętrzny, pion | 6 | 14,6 na 21,2 | 8 wszerz, 11 w dół |
| iPhone Duo, ekran wewnętrzny, otwarty | 6 | 29,7 na 20,9 | 15 wszerz, 11 w dół |
Ostatnia kolumna to połowa widoku zaokrąglona w górę, pas sąsiada, którego wymaga reguła szwów.17 Apple podaje ekran wewnętrzny iPhone’a Duo jako 1878 na 2670 pikseli przy 430 pikselach na cal, a zewnętrzny jako 1398 na 2034 przy 460.61 Liczby kafelków dla ekranu wewnętrznego nie pochodzą z tych pikseli panelu: pochodzą z logicznego bufora ramki symulatora, 2007 na 2853 przy skali 3,0 (2853 ÷ 96 to 29,7, a 2007 ÷ 96 to 20,9), który według wyjaśnienia w pierwszym artykule jest skalowany w dół o około 0,936 do szkła, więc na sprzęcie ta sama liczba kafelków powinna wypełnić panel, przy około 5,6 piksela panelu na teksel, jeśli kompozytor skaluje obraz tak, jak zakłada pierwszy artykuł; nie zostało to sprawdzone na sprzęcie, a pierwszym krokiem pierwszego artykułu jest zalogowanie nativeScale na urządzeniu.6017 Human Interface Guidelines proszą, by gry „look good and behave well at various aspect ratios” (dobrze wyglądały i dobrze działały przy różnych proporcjach ekranu), a pierwszy artykuł odczytał to jako argument za pokazywaniem większej części świata zamiast pasów, co właśnie robi plac.6260
Dla obszarów wynikają z tego dwie rzeczy. Gdy kamera podąża za kolekcjonerem, widok przed nim to mniej więcej połowa widoku.27 Trasa biegnąca z północy na południe to ta, którą każdy telefon pokazuje dobrze: 22 kafelki naraz na Pro Max w pionie, około 11 przed postacią, i 21 naraz na otwartym Duo, około 10 przed postacią. Trasa biegnąca ze wschodu na zachód pokazuje 30 kafelków naraz na otwartym Duo, około 15 przed postacią, a na Pro Max w pionie tylko 10, około 5 przed postacią, więc jej miejsce jest tam, gdzie cel jest blisko.6017 Dlatego długi spacer z briefu, Łąkowa Ścieżka, biegnie z północy na południe, i dlatego Aleja Klaserów, obszar najwyraźniej rozciągnięty ze wschodu na zachód (44 na 14, ponad trzy razy szerszy niż wyższy), jest ulicą witryn, którą na otwartym Duo widać prawie w całości z każdego miejsca. Brzeg Jeziora (36 na 20) i Dzielnica Galerii (30 na 20) też są szersze niż wyższe, ale w briefie są to miejsca, w których się zatrzymuje, brzeg i dzielnica muzeów, a nie drogi gdzieś indziej.2617
Szew w RealityKit
Podmiana pięter z artykułu o budowlach to złe narzędzie do szwu. Rozebranie jednego RealityView i zbudowanie następnego wymaga wygaszenia, które to ukryje, a drzwi w aplikacji jeszcze go nie mają: dziś miejsce zmienia się 220 milisekund po wejściu na drzwi, zmiana piętra podmienia scenę bez wygaszania, a artykuł tej serii o ruchu proponuje zasłonę, która przykryłaby jedno i drugie. Szew z definicji nie ma wygaszania.376316 Plan dla szwu zachowuje więc jedną scenę. Gdy kolekcjoner zbliży się na pół widoku do krawędzi z połączeniem, scena buduje grunt sąsiada jako drugą siatkę, z tego samego rodzaju MeshDescriptor co pierwsza, umieszczoną z przesunięciem połączenia w jednostkach świata, i dodaje obiekty sąsiada na ich własnych głębokościach. Gdy stopy kolekcjonera przekroczą krawędź, scena zmienia bazę: sąsiad staje się bieżącym obszarem, poprzedni staje się pasem z tyłu, a kamera, która dziś podąża za graczem z ograniczeniem do mapy, jest ograniczana do sumy obu obszarów, dopóki oba są wczytane.2726
Trzy fakty o silniku sprawiają, że na papierze jest to tanie. Grunt to jedna siatka i jedno wywołanie rysowania na obszar, więc sąsiad dodaje jedno wywołanie dla swojego gruntu i jedno dla obiektów.6037 Każdy piksel jest wycinany i zapisuje głębokość, więc drzewa sąsiada sortują się względem kolekcjonera według tej samej reguły głębokości co drzewa bieżącego obszaru, bez nowego sortowania.37 Kuźnia już eksportuje cały obszar jako litery, autokafelkowany grunt, obiekty i warpy, więc sąsiad to drugi plik tego samego rodzaju; brief dodaje do niego listę connections.1426 Niczego z tego nie mogę jednak powiedzieć o tym, ile kosztuje zbudowanie drugiej siatki w chwili, gdy jest potrzebna, ani o tym, czy zbudowanie jej w obrębie jednej klatki powoduje przycięcie; to nie jest zmierzone. Dlatego test 6 w briefie ma dwie połowy, a obie obejmują całe podejście, od chwili przed zbudowaniem siatki sąsiada do końca przejścia: dziennik czasów klatek, który wychwytuje zatrzymanie wątku głównego, i inspekcję każdej nagranej klatki, która wychwytuje czarną klatkę. Test na próbkach by nie wystarczył: jedna czarna klatka spośród sześćdziesięciu na sekundę nie musi zaburzyć rytmu wywołań, a próbka co 100 milisekund widzi jedną klatkę na sześć przy 60 Hz.17 Połowa czasowa i reguła każdej klatki to moje uzupełnienia testu z dossier, który próbkował jasność.
Autokafelkowanie to jedyna rzecz, której reguła GBA nie obejmuje. Gen 3 trzymała szwy na wspólnym gruncie, bo pas sąsiada rysowany był kafelkami bieżącej mapy.108 Kiradex rysuje każdy obszar z jednej palety atlasu, więc to ograniczenie go nie dotyczy, ale autokafelki typu blob na krawędzi obszaru obliczane są z liter samego obszaru; jeśli kuźnia nie zajrzy przez szew, ścieżka, która go przecina, kończy się obrzeżem po obu stronach. Brief każe więc kuźni obliczać maski krawędzi przez każde połączenie.26
Pokoje, obecność i ponowne połączenie
Plac w Kiradex to pokój na serwerze: pokoje do około 40 graczy, dzielone według regionu, na FastAPI i WebSockets.27 Obszar za płotem jest naturalnie kolejnym pokojem, co rodzi problem, którego jednoosobowa konsola przenośna nigdy nie miała: ludzi po drugiej stronie szwu. Plan zakłada, że klient zasubskrybuje piechurów z sąsiedniego pokoju, gdy zacznie rysować pas tego pokoju, tak by ludzie na Alei Klaserów byli widoczni z krawędzi Rynku, i przełączy własny pokój przy przejściu, tak by piechur nigdy się nie zatrzymał.26 Drzwi i tramwaj dostają wygaszanie, zasłonę, którą brief z artykułu o ruchu dodaje do drzwi, a to wygaszenie przykrywa ponowne połączenie, jak dossier budowli proponowało już dla wnętrz.1626 Poprawka z pierwszego artykułu na czarny widok dotyczy też tego wygaszenia: animowanie nieprzezroczystości widoku SwiftUI, który zawiera RealityView, zostawiało go niepomalowanym, więc wygaszenie to zasłona rysowana nad nim.60
Serwer potrzebuje tej samej mapy, którą rysuje klient. Dziś server/app/plaza.json zawiera litery miasteczka, żeby serwer mógł walidować chód; brief każe, by kopia każdego obszaru zawierała jego litery i połączenia, tak by chód przecinający szew był walidowany po obu jego stronach.6026 Ile kosztuje zmiana pokoju w prawdziwej sieci i czy subskrypcja drugiego pokoju podwaja częstotliwość wiadomości placu w pobliżu szwu, nie zostało zmierzone.
Tabliczka z nazwą, mapa i tramwaj w SwiftUI
Nazwa obszaru należy do SwiftUI, a nie do warstwy pikseli. Pierwszy artykuł ustalił, że pięciotekselowa czcionka pikselowa w skalach Kiradex wypada na 13,3 albo 10 punktów, ta druga poniżej 11-punktowego minimum z Human Interface Guidelines, i przeniósł tekst dialogów do SwiftUI w skali interfejsu; tabliczka z nazwą to ten sam rodzaj tekstu.60 Jej czas pochodzi z Emerald: około trzech sekund na ekranie.21
Ekran mapy to widok SwiftUI nad niewielkim modelem: siatką nazwanych prostokątów, bieżącym obszarem i zbiorem odwiedzonych obszarów. Na otwartym Duo stoi obok świata jako panel, tak jak plan świata umieszcza kartę profilu kolekcjonera obok placu („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”, plac na otwartym ekranie wewnętrznym to najlepsza wersja: szeroki widok i karta profilu obok świata po dotknięciu kogoś); na telefonie jest to arkusz.27 Tramwaj to warp z mapy: wygaszenie, zmiana pokoju, rozjaśnienie na przystanku docelowym.
Zbiór odwiedzonych obszarów musi podróżować z kolekcjonerem. Strona o grach w Human Interface Guidelines mówi „Let players pick up their game on any of their devices” (pozwól graczom podjąć grę na każdym ze swoich urządzeń), by ludzie mogli „start back up exactly where they left off on a different device” (wznowić dokładnie tam, gdzie skończyli, na innym urządzeniu).62 Przystanek tramwajowy otwarty na telefonie powinien być otwarty na iPadzie, więc zbiór odwiedzonych obszarów mieszka z profilem kolekcjonera na serwerze, a nie w lokalnej pamięci aplikacji.26 To rozszerza sekcję 3 planu świata, która mówi „Our server holds only the public profile card and the economy” (nasz serwer przechowuje tylko publiczną kartę profilu i ekonomię); dodałbym zbiór odwiedzonych obszarów jako jeszcze jedno pole obok nich, ograniczone do listy tego, do których z pięciu obszarów kolekcjoner wszedł, bez lokalizacji, bez tekstu i bez czasu wizyty, z kluczem takim jak reszta, identyfikatorem gracza w Game Center; ocena prywatności, której wymaga plan, musiałaby to objąć.2726
Ile to kosztuje i czego nie zmierzono
Nic w tej sekcji nie zostało zmierzone czasowo. Niezmierzone koszty to: zbudowanie siatek gruntu i obiektów sąsiada w chwili, gdy kolekcjoner zbliża się do krawędzi; rysowanie siatek dwóch obszarów, gdy oba są wczytane; subskrypcja drugiego pokoju w pobliżu szwu; oraz zmiana pokoju przy przejściu. Reguła nagrywania z pierwszego artykułu rozstrzyga, jak zostaną zmierzone: w symulatorze iPhone’a Duo klatki RealityKit są wierne tylko wtedy, gdy nagrywa się je z wnętrza pakietu testów (XCUIScreen.screens[1]), a nie z hosta.60 Test 6 z briefu używa dokładnie takiego nagrania dla widoku sąsiada przed szwem, a inspekcję każdej klatki i dziennik czasów klatek, odczytywany z wywołań CADisplayLink, przeprowadza na kompilacji na urządzenie zamiast w symulatorze: na otwartym iPhonie Duo, gdy tylko będzie pod ręką, a do tego czasu na iPhonie 18 Pro Max, bo w chwili pisania z moim Makiem nie jest sparowany żaden iPhone Duo.64 Nie wykazano jeszcze, by jakakolwiek metoda nagrywania rejestrowała każdą wyświetloną klatkę; to zgodność liczb w teście, klatek nagrania wobec wywołań w dzienniku czasów, rozstrzyga, czy któraś to robi.
7. Brief: co buduje Kiradex i jakie testy musi przejść
Synteza autora. To, co następuje, to moja propozycja, wyprowadzona z sekcji 1 do 6 i dopasowana do planu świata w repozytorium Kiradex, do jego sekcji 4 („The game”, gra) i sekcji 7 („Order of work”, kolejność prac).2726 Nie nazywa żadnego miejsca, stworzenia ani znaku z jakiejkolwiek gry z Pokémonami; tam, gdzie zapożycza mechanikę, przywołuje regułę z sekcji 5, a nie słownictwo gry źródłowej. Każdy rozmiar podany jest w kafelkach 16-pikselowych, a długość przejścia to jego koszt we własnym wyszukiwaniu ścieżek aplikacji, w którym krok po przekątnej liczy się jako √2 kafelka (punkt 3).28 Każdy czas to ta długość przy nominalnych 4 kafelkach na sekundę chodu, liczba do porównań z kanonem, a nie zmierzona; brief z artykułu o ruchu chodziłby w tempie 16 tików na prosty kafelek przy 60 Hz, czyli 3,75 kafelka na sekundę, a przekątną zaokrąglałby w górę do 23 tików, przy czym każdy podany tu czas wydłużyłby się o jedną piętnastą na prostych krokach i o mniej więcej jedną dwunastą na przekątnych.41617
Pętla Kiradex dzieje się w prawdziwym świecie. XP pochodzi wyłącznie z zeskanowanych i zarejestrowanych kart: „XP comes only from the real world, which is the point of the app” (XP pochodzi tylko z prawdziwego świata, i o to w aplikacji chodzi).27 Chodzenie jest więc kosztem, a nie treścią, i każdy obszar musi dać piechurowi coś do zrobienia z kolekcją: pokazać ją, wymieniać się wokół niej, zdobyć za nią kosmetyk albo zostać odesłanym z powrotem do skanera. Nic, co znajduje się albo zdobywa chodzeniem, nigdy nie jest kartą ani XP, i nic w świecie nie jest sprzedawane za pieniądze inaczej niż przez sklep, który plan świata już definiuje.27
1. Pięć obszarów: Rynek i cztery za nim
| Obszar | Czym jest | Rozmiar (kafelki) | Połączony z | Rola w pętli kolekcjonerskiej |
|---|---|---|---|---|
| Rynek (istnieje) | Miasteczko: domy, hala, kiosk, taras z fontanną, dziedziniec przybycia | 40 na 30 | węzeł | Przybyć, pochwalić się ulubioną kartą, wejść do pokojów i do hali |
| Aleja Klaserów | Ulica handlowa: sklep z kartami z zestawu budowli, punkt wymiany, tablica życzeń, a później rząd sześciu straganów | 44 na 14 | Rynek, wschód, otwarty szew | Wydawać monety na kosmetyki; zobaczyć, co kolekcjonerzy z miasteczka chcą, by im pokazać; ekran wymiany; stragany targowe, gdy nadejdzie ta faza |
| Łąkowa Ścieżka | Parkowa ścieżka przez łąkę i zagajniki, z kępami kwiatów, w których pojawiają się znaleziska, oraz obsadzoną żywopłotem alejką do domu, której furtka otwiera się tylko od strony jeziora | 24 na 60, dłuższa oś z północy na południe | Rynek, północ, otwarty szew | Znaleziska (punkt 6); spacer z przyjaciółmi; droga do jeziora |
| Brzeg Jeziora | Koniec spaceru: brzeg, pomost, ławki, przystań dla łodzi | 36 na 20 | Łąkowa Ścieżka, północ, otwarty szew | Spokojne miejsce, by usiąść i pokazać kartę o zachodzie słońca; cotygodniowe miejsce spotkań |
| Dzielnica Galerii | Kamienna dzielnica: muzeum i galeria ekspozycji kolekcjonerów | 30 na 20, plus budynek łuku 8 na 6 | Rynek, zachód, przez łuk (dwoje drzwi) | Zestawy ukończone na całym serwerze wypełniają muzeum; opiekun etapów w łuku (punkt 7) |
Łączna powierzchnia za Rynkiem to 616 plus 1440 plus 720 plus 600, czyli 3376 kafelków, 2,8 razy więcej niż 1200 kafelków Rynku, w obrębie kanonicznego przedziału od 1,97 do 3,87 (sekcja 5, Proporcje).1733 Dzielnica Galerii leży za budynkiem, bo narysowana jest w kamieniu z innego zestawu gruntu (sekcja 5, Szwy). Pozostałe trzy dzielą z Rynkiem trawnik i bruk, więc łączą się otwartymi szwami, w sumie trzema: Aleja Klaserów ze wschodnią krawędzią Rynku, Łąkowa Ścieżka z jego północną krawędzią, a Brzeg Jeziora z północną krawędzią Łąkowej Ścieżki.26 Tablica życzeń na Alei Klaserów pokazuje, co kolekcjonerzy z miasteczka chcą, by im pokazać, oceniane względem prawdziwych kart przez kod, który już to robi (Kiradex/World/Wants.swift); jej stragany czekają na targ, który plan świata prowadzi przez eBay w późniejszej fazie.6527
Proponowane obszary narysowane na siatce ekranu mapy; tylko schemat, narysowany przez figures/make_figures.py, który sprawdza, że każdy prostokąt ma rozmiar swojego obszaru podzielony przez 10 i zaokrąglony.
Testy: 4 (proporcje) i 5 (orientacja).
2. Odległości i czasy
| Podróż | Cel (kafelki) | Przy 4 kafelkach na sekundę | Odniesienie do kanonu |
|---|---|---|---|
| Z dziedzińca przybycia do drzwi sklepu z kartami | najwyżej 60 | najwyżej 15 s | sekcja 5, Pierwszy odcinek: od 15 do 25 s |
| Z dziedzińca przybycia na pomost nad Brzegiem Jeziora, tam | od 110 do 120 | od 28 do 30 s | Dłużej niż pierwszy odcinek (15 do 25 s), krócej niż kanoniczne odcinki drogi do 40 s i minutowe lochy; Wicie się, od 1,15 do 1,70 długości dłuższego boku w drodze tam |
| Z pomostu nad Brzegiem Jeziora na dziedziniec przybycia, do domu, przez furtkę w żywopłocie | najwyżej 0,8 przejścia tam | najwyżej 24 s | Droga do domu jest krótsza |
| Z dziedzińca przybycia przez łuk do drzwi muzeum | najwyżej 70 | najwyżej 18 s | Pierwszy odcinek |
| Z dowolnego obszaru do dowolnego odwiedzonego obszaru tramwajem | jedno wygaszenie | około 1 s plus ponowne połączenie | Szybka podróż; Przejścia |
60 kafelków długości Łąkowej Ścieżki wije się w 78 do 90 kafelków ścieżki, współczynnik od 1,3 do 1,5 (sekcja 5, Wicie się).26 Sama ścieżka nie może skrócić drogi do domu: na siatce, na której każdy krok można zrobić w obie strony, najkrótsze przejście od przybycia do pomostu jest najkrótszym przejściem z powrotem, a prostszą ścieżkę wybrałoby się także w drodze tam. Oszczędność wymaga czegoś jednokierunkowego. Tutaj jest to furtka w żywopłocie. Obsadzona żywopłotem alejka szerokości 2 kafelków biegnie prosto wzdłuż wschodniej strony Łąkowej Ścieżki, na linii pomostu, do północnej krawędzi Rynku między halą a domem na wschód od niej, gdzie trawnik między nimi schodzi w stronę dziedzińca przybycia. Furtka na jeziornym końcu alejki otwiera się tylko od strony jeziora. W drodze tam pozostaje zamknięta, a ścieżka się wije; w drodze do domu otwiera się, a alejka jest prosta. To kanoniczny jednokierunkowy skrót z powrotem (sekcja 5, Droga do domu) położony na płasko. Zamodelowałem te trzy obszary na wspólnym ośmiokierunkowym grafie z punktu 3, z miasteczkiem takim, jakim kuźnia rysuje je dziś, oraz alejką i pomostem umieszczonymi w ten sposób. Postanowiłem, że ścieżkę będą wić cztery żywopłoty w poprzek łąki, jeden co 12 rzędów, każdy z przerwą szerokości 2 kafelków. Kroki po przekątnej ścinają każdy zakręt. Przy każdym położeniu przerw dwa równo rozmieszczone żywopłoty nie są w stanie na tym grafie wydłużyć łąki do 78 kafelków: osiągają najwyżej 66,46 kafelka od krawędzi do krawędzi. Trzy, równo rozmieszczone, są w stanie, ale ledwo: 6 z ich 8000 położeń przerw wije łąkę na 78 do 79,77 kafelka, a 5 z tych 6 daje też drogę tam w przedziale od 110 do 120 kafelków, od 114,05 do 119,02, przy drodze do domu wynoszącej od 0,740 do 0,772 drogi tam, poniżej celu 0,8. Cztery żywopłoty wiją ją na 78 do 90 kafelków w 5912 ze 160 000 położeń, co zostawia kuźni swobodę w rozplanowaniu łąki. Ten zapas to mój powód, by wybrać cztery; graf tego nie wymusza. W tych układach z czterema żywopłotami droga do domu ma 88,07 kafelka wobec od 108,74 do 133,75 tam. Cel 0,8 wymaga co najmniej 110,09 tam, a w przedziale od 110 do 120 kafelków spełniają go wszystkie 4111 układów, przy 0,73 do 0,80. Przy furtce otwartej w obie strony oba przejścia wychodzą równe.66 To ośmiokierunkowy chód sprawia, że dwa żywopłoty z wcześniejszego modelu już nie wystarczają: skraca alejkę do domu tylko z 91 kafelków do 88,07, bo alejka i tak jest prosta, ale z wijącej się drogi tam zabiera znacznie więcej, więc furtka oszczędza mniej, chyba że łąka wije się mocniej. Ten sam model wyznacza dolny koniec przedziału. Żaden układ w nim, przy żadnym przesunięciu ani położeniu pomostu, które sprawdza, nie daje drogi tam krótszej niż 107,18 kafelka, a droga do domu nigdy nie jest krótsza niż 88,07, więc droga tam wyraźnie poniżej 110 kafelków nie spełnia celu 0,8.66 Jednokierunkowe zeskoki z tarasów łąki dałyby ten sam efekt po kanonicznemu, ale prace nad budowlami odrzuciły uskoki, więc zeskoki zostają odłożone do artykułu o wysokości, który o nich zdecyduje.3626
Test: 3 (odległości).
3. Połączenia jako dane
Każdy obszar to eksport z kuźni taki jak town.json: litery, autokafelkowany grunt, obiekty, warpy i przybycie, plus connections: [{"dir": "north"|"south"|"east"|"west", "area": "<id>", "offset": <tiles>}], gdzie przesunięcie to początek sąsiada wzdłuż wspólnej krawędzi, zgodnie z konwencją Gen 3.148 Każde połączenie ma odwrotne z zanegowanym przesunięciem (sekcja 5, Połączenia), bez wyjątku: kanoniczne połączenia jednostronne to trik rysunkowy, którego ten brief nie potrzebuje. Serwerowa kopia każdego obszaru zawiera litery i połączenia, tak by chód był walidowany przez szew.6026
Jeden graf chodu służy obu stronom. TileMap.path w aplikacji szuka w ośmiu kierunkach, przy czym krok po przekątnej kosztuje √2 i jest dozwolony tylko wtedy, gdy oba kafelki, między którymi przechodzi, nadają się do chodzenia, tak by nikt nie ścinał narożnika ściany; serwerowy Plaza.path w server/app/rooms.py szuka w czterech kierunkach, choć jego komentarz nazywa to „the same walk the app takes” (tym samym chodem, który wykonuje aplikacja).28 Brief czyni wyszukiwanie klienta kontraktem: zmiana po stronie serwera zastępuje Plaza.path tym samym ośmiokierunkowym wyszukiwaniem z √2 i bez ścinania narożników, a obie strony traktują furtkę w żywopłocie (punkt 2) jako krawędź skierowaną, na którą wchodzi się od strony jeziora tylko prostym krokiem i z której nigdy nie wychodzi się w stronę jeziora. Każda odległość w tym briefie jest mierzona na tym grafie.
Testy: 1 (wzajemność), 2 (przejścia) i 12 (zgodność z serwerem).
4. Otwarte szwy, bez wygaszania
Przejście przez otwarty szew nie ma wygaszania (sekcja 5, Przejścia). Klient rysuje grunt i obiekty sąsiada na głębokość co najmniej pół widoku: 15 kafelków przez szew przekraczany ze wschodu na zachód, połowę z 29,7 otwartego Duo, i 12 przez szew przekraczany z północy na południe, połowę z 22,4 Pro Max w pionie (sekcja 5, Pas sąsiada).6017 Kuźnia oblicza maski autokafelków przez każdy szew, tak by ścieżka, która go przecina, nie kończyła się obrzeżem, i wycina w płocie miasteczka przerwę przy każdym szwie, szerokości co najmniej 2 kafelków, z komórkami przerwy dostępnymi do chodzenia po obu stronach.1426 Las, który kuźnia rysuje dziś na głębokość 12 kafelków wokół miasteczka (MARGIN = 12), ustępuje sąsiadowi wzdłuż całej wspólnej krawędzi: pas sąsiada zastępuje tam margines lasu, a las zostaje tylko tam, gdzie nie dołącza żaden obszar. To koryguje dossier, które wycinało 2-kafelkową przerwę także w marginesie lasu i zostawiłoby las zakrywający większość pasa sąsiada.1426 Klient subskrybuje piechurów z sąsiedniego pokoju, gdy zaczyna rysować pas tego pokoju, i przełącza własny pokój przy przejściu.26
Test: 6 (żadnej czarnej klatki, żadnego zatrzymania wątku głównego i pas widoczny przed szwem).
5. Tabliczka z nazwą
Po wejściu do obszaru przez szew albo tramwajem jego nazwa wsuwa się, zatrzymuje i znika w ciągu około 3 sekund (sekcja 5, Tabliczka z nazwą), w skali interfejsu w SwiftUI, nigdy w warstwie pikseli.2160
Test: 7 (czas tabliczki z nazwą).
6. Znaleziska na Łąkowej Ścieżce
- Gdzie. Kępy kwiatów pokrywają od 12% do 18% kafelków Łąkowej Ścieżki, po których można chodzić, narysowane własnym zestawem autokafelków, by były czytelne z daleka.26 Ten odsetek to mój wybór, a nie liczba z kanonu. Liczone w ten sam sposób, względem gruntu do chodzenia, pierwsze trasy kanonu mają od 18,8% do 38,4% wysokiej trawy, a późniejsze od 8,2% do 29,2% (sekcja 1), więc kępy plasują się obok późniejszych tras i poniżej każdej pierwszej trasy: błysk jest umieszczony i widoczny, więc kępy muszą go tylko otaczać, a nie nieść losowania na każdym kroku.17
- Jak się pojawiają. Nie przez rzut kością na każdym kroku. Po wejściu na Łąkową Ścieżkę serwer umieszcza w kępie najwyżej jeden widoczny błysk dla danego kolekcjonera, wybrany deterministycznie na podstawie kolekcjonera, daty i obszaru, zgodnie z regułą wejścia do akra z Animal Crossing, dopóki kolekcjoner nie dostanie trzech tego dnia.5526 Widoczny błysk sprawia, że reguła pozostaje czytelna dla dziecka, i zapobiega seriom bez potrzeby wyciszenia i rampy z wiersza Rytm w sekcji 5.
- Czym są. Wyłącznie rzeczami ze świata: naklejką albo ramką do pokoju, kosmetykiem w postaci koszulki na kartę albo przypinki, albo notatką wskazującą jedno z zadań dnia, które może ukończyć tylko prawdziwe skanowanie; zadania są już oceniane na podstawie samej kolekcji (
Kiradex/World/Quests.swift).2765 Nigdy karta, nigdy XP, nigdy nic na sprzedaż; znalezisko nie może nigdy stać się powodem do zakupu. Monety muszą poczekać: plan świata pozwala zdobywać monety codziennymi wizytami, ale nie ustala ich liczby ani limitu i umieszcza monety w czwartej fazie, więc znaleziska monet są odłożone do czasu, aż ta reguła powstanie, a wtedy będą pochodzić z tej samej puli codziennych wizyt, a nie się do niej doliczać.27 - Kto je widzi. Błysk każdego kolekcjonera należy do niego; przyjaciele idący razem widzą każdy swój. Nie ma czego wyrywać i nie ma o co się kłócić.
Test: 10 (znaleziska).
7. Łuk i jego opiekun
Budynek między Rynkiem a Dzielnicą Galerii to pokój 8 na 6 z drzwiami po każdej stronie i opiekunem za ladą. Opiekun daje kosmetyk, gdy liczba zarejestrowanych kart kolekcjonera po raz pierwszy przekroczy 10, 30, 50 i 100, zgodnie z regułą strażnicy nagradzającej etapy kolekcji z wiersza Strażnice w sekcji 5, przy czym liczba ta jest liczona z kolekcji w prawdziwym świecie tak jak XP.2026 Pokój jest też miejscem, w którym grafika zmienia się z trawnika na kamień (sekcja 5, Szwy). Nic nie jest zamknięte: łuk jest zawsze otwarty, a opiekun tylko daje.
Test: 11 (opiekun łuku).
8. Ekran mapy
Siatka 16 na 12 nazwanych prostokątów, jedno pole na 10 kafelków, z zaokrągleniem: Rynek 4 na 3, Aleja Klaserów 4 na 1 po wschodniej stronie Rynku, Łąkowa Ścieżka 2 na 6 nad nim, Brzeg Jeziora 4 na 2 na samej górze, Dzielnica Galerii 3 na 2 na zachodzie. Ułożone jeden na drugim, Brzeg Jeziora, Łąkowa Ścieżka i Rynek zajmują 11 z 12 rzędów (sekcja 5, Ekran mapy).2617 Każdy obszar jest narysowany i nazwany od pierwszego dnia. To własny wybór Kiradex, a nie kanonu: cztery gry rysują każde miejsce, gdy gracz ma już mapę, z wyjątkiem kilku późnych miejsc, ale przekazują mapę w trakcie gry (sekcja 5, Szybka podróż), a kolekcjonerskie miasteczko nie ma powodu, by kazać komukolwiek zasługiwać na prawo do jej oglądania. Bieżący obszar pulsuje; odwiedzone obszary pokazują swój przystanek tramwaju. Na otwartym Duo mapa stoi obok świata jako panel; na telefonie jest arkuszem.27
Test: 8 (model ekranu mapy).
9. Tramwaj
Każdy obszar zewnętrzny ma przystanek. Przystanek otwiera się, gdy kolekcjoner po raz pierwszy wejdzie do tego obszaru, zgodnie z flagą odwiedzin z wiersza Szybka podróż w sekcji 5, ustawianą przy wejściu i nigdy za poziom ani za opłatą.1326 Dotknięcie odwiedzonego obszaru na ekranie mapy zabiera tam: wygaszenie, zmiana pokoju, rozjaśnienie na przystanku tego obszaru, a potem tabliczka z nazwą. Z wnętrz nie ma przejazdów, tak jak Fly nie pozwala na żaden (sekcja 5, Szybka podróż).13 Tramwaj zamienia 28 do 30 sekund marszu nad Brzeg Jeziora w jedno dotknięcie, gdy ten marsz zostanie raz wykonany, skrót zdobyty odwiedzinami, a nie zdolnością (sekcja 5, Odblokowania).26
Test: 9 (reguły tramwaju).
10. Nazwy i grafika
Nazwa, szyldy i teksty każdego obszaru przechodzą przez listę zakazanych nazw chronionych, a każdy kafelek i sprite pochodzi z kuźni.2726 Lista zakazanych nazw jeszcze nie istnieje: dossier obiecywało ją w repozytorium, a w repozytorium jej nie ma. Jej utworzenie jest częścią tego briefu: zwykła lista chronionych nazw, po jednej w wierszu, zapisana w repozytorium obok kuźni, oraz test, który odczytuje nazwę, szyldy i teksty każdego obszaru z eksportów kuźni i kończy się niepowodzeniem, jeśli znajdzie w nich którąkolwiek pozycję z listy, bez rozróżniania wielkości liter.26 Żadnych numerowanych nazw dróg, żadnego schematu nazewnictwa „regionów” i żadnego budynku, który odtwarza wygląd kanonicznej strażnicy: rozmiary i reguły mogą się zgadzać, ale kształty i nazwy muszą być własne Kiradex.26
Test: 13 (nazwy i grafika).
11. Kolejność prac
Plan świata stawia plac (pokoje, synchronizacja, dymki, profile, ekran wymiany) na trzecim miejscu, a monety i sklep na czwartym.27 Obszary pasują jako faza 3b, gdy sieć placu będzie działać stabilnie, przed monetami albo równolegle z nimi:26
- Połączenia w kuźni i na serwerze (format, wzajemność, rysowanie szwów, zmiana pokoju), ośmiokierunkowe wyszukiwanie na serwerze oraz lista zakazanych nazw z testem, z Aleją Klaserów jako pierwszym obszarem, bo korzysta ze sklepu z kartami, który prace nad budowlami już zaprojektowały, i jest najmniejsza.
- Łąkowa Ścieżka i znaleziska (rozmieszczanie na serwerze, dzienny limit, zawartość nagród).
- Ekran mapy i tramwaj.
- Brzeg Jeziora.
- Dzielnica Galerii z łukiem, gdy będzie istnieć wnętrze muzeum. Rząd straganów na Alei Klaserów czeka na fazę targu.
Każdy krok to kompilacja w TestFlight, tak jak plan świata wymaga tego od każdej fazy, z nagraniami do jego testów.27
Testy akceptacyjne
Każdy można przeprowadzić skryptem na eksportach kuźni i testach serwera albo nagraniem w symulatorze; test 6 przeprowadza się na urządzeniu, z wyjątkiem jego jednego nagrania w symulatorze.26
- Wzajemność. Eksporty zawierają dokładnie trzy otwarte szwy, Rynek wschód z Aleją Klaserów, Rynek północ z Łąkową Ścieżką i Łąkowa Ścieżka północ z Brzegiem Jeziora, a dla każdego połączenia
(a, dir, b, off)eksport zawiera(b, opposite(dir), a, −off); test kończy się niepowodzeniem przy każdym połączeniu jednostronnym, bez wyjątków. - Przejścia. Wyszukiwanie wszerz od przybycia i drzwi każdego obszaru znajduje co najmniej 2 kafelki przejścia po każdej stronie każdego szwu, zwrócone ku kafelkom do chodzenia po drugiej stronie, metodą z
measure_gen3_routes.py.6 - Odległości. Wspólne ośmiokierunkowe wyszukiwanie z punktu 3 na połączonych obszarach, z furtką w żywopłocie jako krawędzią jednokierunkową (wchodzi się na nią od strony jeziora tylko prostym krokiem i nigdy nie wychodzi w stronę jeziora) i z każdą długością liczoną jako koszt ścieżki, w którym krok po przekątnej to √2, zwraca: od przybycia do sklepu z kartami najwyżej 60 kafelków; od przybycia do pomostu nad Brzegiem Jeziora od 110 do 120; od pomostu do przybycia najwyżej 0,8 przejścia tam; od przybycia do drzwi muzeum najwyżej 70. Kuźnia wypisuje czasy przy 4 kafelkach na sekundę.
- Proporcje. Kafelki za Rynkiem podzielone przez kafelki Rynku mieszczą się między 2,0 a 3,9.
- Orientacja. Wysokość Łąkowej Ścieżki przekracza jej szerokość.
- Żadnej czarnej klatki i żadnego zatrzymania wątku głównego na szwie. Na kompilacji na urządzenie kolekcjoner przechodzi przez szew między Rynkiem a Aleją Klaserów, od kafelka położonego dalej niż pół widoku od szwu, zanim scena zacznie budować siatkę Alei Klaserów, aż do chwili, gdy pierwszy krok za szwem się zakończy, a Rynek stanie się pasem z tyłu. Cały ten odcinek obejmują dwa zapisy. Na czas przebiegu display link prosi o 60 Hz przez swój
preferredFrameRateRange, tak by zmienna częstotliwość ekranu ProMotion nie przesuwała liczenia w połowie marszu; Apple opisuje ten zakres jako taki, którego display link stara się w miarę możliwości dotrzymać, więc to dziennik czasów, a nie samo żądanie, pokazuje częstotliwość, która się utrzymała.67 Pierwszy zapis to każda klatka wyświetlona na ekranie, zachowana przez nagranie w tej częstotliwości i sprawdzana klatka po klatce: klatka jest czarna, gdy jej średnia jasność jest niższa niż jedna czwarta mediany klatek w odcinku (mój próg), a jedna czarna klatka w dowolnym miejscu odcinka oznacza niezaliczenie testu. Liczba klatek nagrania w odcinku musi równać się liczbie wywołań w dzienniku czasów w tym samym odcinku, tak by nagranie gubiące klatki nie mogło zaliczyć testu, pomijając tę czarną. Nie wykazano jeszcze, by jakakolwiek metoda nagrywania rejestrowała każdą wyświetloną klatkę, i to ta zgodność rozstrzyga, czy któraś to robi. Gdy liczby się różnią, a dziennik czasów spełnia swoją regułę podaną poniżej, winne jest nagranie i przebieg się nie liczy; gdy się różnią, a dziennik czasów tej reguły nie spełnia, test jest niezaliczony. Drugi zapis totargetTimestampwywołaniaCADisplayLinkzarejestrowanego w głównej pętli uruchomieniowej, tak jak rejestruje go przykład samego Apple, czyli moment, w którym według dokumentacji Apple wyświetla się następna klatka, zapisywany przy każdej klatce; żaden odstęp między kolejnymi wartościami nie może przekroczyć 25 milisekund, półtorej klatki przy 60 Hz, więc pojedyncza zgubiona klatka oznacza niezaliczenie tak samo jak pojedyncza czarna klatka, co wychwytuje zatrzymanie wątku głównego zarówno podczas budowania sąsiada, jak i przy przejściu. Przebieg, w którym dziennik czasów ustala się na jakiejkolwiek częstotliwości innej niż 60 Hz, się nie liczy, a tryb niskiego zużycia energii jest w nim wyłączony, bo Apple wymienia ten tryb, krytyczny stan termiczny i ustawienia dostępności wśród czynników, które mogą zmienić częstotliwość.67 Urządzeniem jest otwarty iPhone Duo, gdy tylko będzie pod ręką; w chwili pisania z moim Makiem nie jest sparowany żaden iPhone Duo, więc do tego czasu test przeprowadza się na iPhonie 18 Pro Max na tym samym szwie, co pokazuje, czy podejście i przejście zatrzymują albo wygaszają ekran na telefonie, ale nie pokazuje, jak wewnętrzny ekran Duo taktuje swoje klatki. Symulator nie może go zastąpić: w mojej lekturze jego taktowanie klatek mierzy Maca, na którym działa, a nie telefon. Osobno nagranie w symulatorze otwartego Duo z wnętrza pakietu testów, z kolekcjonerem na ostatnim kafelku Rynku przed szwem, pokazuje co najmniej 14 kafelków Alei Klaserów.6064 - Tabliczka z nazwą. Tabliczka jest na ekranie od 2,5 do 3,5 sekundy po przejściu przez szew albo przyjeździe tramwajem.
- Model ekranu mapy. Testy jednostkowe: prostokąt każdego obszaru mieści się w 16 na 12, żadne dwa się nie nakładają, każdy obszar ma nazwę, bieżący obszar jest oznaczony, a przystanek nieodwiedzonego obszaru jest wyłączony.
- Reguły tramwaju. Testy serwera: przejazd do nieodwiedzonego obszaru jest odrzucany; przejazd z wnętrza jest odrzucany; przejazd kończy się na przystanku docelowym.
- Znaleziska. Testy serwera: najwyżej jeden błysk na wejście do obszaru, najwyżej trzy na kolekcjonera dziennie, ten sam błysk dla tego samego kolekcjonera, daty i obszaru, a nagrody pochodzą wyłącznie z tabel kosmetyków i notatek z zadaniami, nigdy karta, XP ani monety. Test kuźni: kępy kwiatów pokrywają od 12% do 18% kafelków Łąkowej Ścieżki, po których można chodzić.
- Opiekun łuku. Test jednostkowy: cztery prezenty za etapy uruchamiają się po jednym razie, przy zarejestrowanych liczbach 10, 30, 50 i 100, i nigdy za monety ani zakupy.
- Zgodność z serwerem. Serwer wczytuje litery i połączenia każdego obszaru i prowadzi kolekcjonera od przybycia do pomostu nad Brzegiem Jeziora przez dwa szwy i z powrotem przez furtkę w żywopłocie, ośmiokierunkowym wyszukiwaniem z punktu 3; aplikacja i serwer zwracają te same kafelki i ten sam koszt w obie strony, a krok, który wyszukiwanie klienta by odrzuciło, ścięcie narożnika albo wyjście z alejki przez furtkę na zewnątrz, serwer również odrzuca, według wzoru istniejących testów serwera.3728
- Nazwy i grafika. Lista zakazanych nazw istnieje w repozytorium wraz z testem, a test przechodzi: każda nazwa obszaru, szyld i tekst przechodzą przez listę; każdy kafelek i sprite pochodzi z kuźni.
Poza tym briefem
- Losowe spotkania na każdym kroku ani nic, co gra się jak dzika walka. Znaleziska są umieszczone i widoczne.
- Blokady zdolności na głównych obszarach. Żaden obszar nie otwiera się za poziom, przypinkę, zakup ani narzędzie; obszary otwierają się przez to, że się do nich dojdzie, a zdobywa się tylko skrót, tramwaj, odwiedzinami. To wiersz Odblokowania z sekcji 5 odczytany w życzliwy sposób.5226
- Podróże dłuższe niż około 30 sekund między dwoma miejscami, w których ludzie się spotykają, bez tramwaju. Minutowe odcinki kanonu to lochy.7
- Uskoki, tarasy z jednokierunkowymi zeskokami i jakakolwiek wysokość na komórkę. Odłożone do artykułu o wysokości, który o nich zdecyduje; do tego czasu brief uzyskuje krótszą drogę do domu dzięki furtce w żywopłocie, która jest jednokierunkowa, ale płaska.36
- Numerowane nazwy dróg, schemat nazewnictwa „regionów”, szybka podróż zależna od odznak ani budynek kopiujący wygląd kanonicznej strażnicy.27
- Połączenia jednostronne. Kanon używa ich jako triku rysunkowego; ten brief nie ma żadnego, a test 1 kończy się niepowodzeniem przy każdym.8
- Znaleziska monet, dopóki plan świata nie ustali, ile monet daje codzienna wizyta.27
- Stragany targowe na Alei Klaserów przed fazą targu.27
Najważniejsze wnioski
Dla tych, którzy rysują grafikę
- Rysować szew tylko tam, gdzie grunt się ciągnie. Red łączy ten sam tileset w 76 z 78 połączeń, a każda strażnica w Red między dwoma miejscami stoi tam, gdzie zmienia się tileset; budynek z dwojgiem drzwi to uczciwy sposób na zmianę materiału.8
- Pierwszą trasę robić krótką i najbardziej zarośniętą: od dwóch do sześciu ekranów, od 14% do 23% mapy jako teren spotkań, bez trenerów. W miarę podróży ją przerzedzać.56
- Ekran mapy rysować jako zgrubną siatkę nazwanych prostokątów. Mapa w Emerald ma 28 na 15 pól, a 49 z jej 95 prostokątów to pojedyncze pola.11
Dla tych, którzy budują silnik
- Przechowywać połączenia jako dane z kierunkiem, sąsiadem i przesunięciem i testować, czy każde ma odwrotne z zanegowanym przesunięciem; wszystkie 134 w Emerald je mają.842
- Rysować co najmniej pół widoku sąsiada za krawędzią. Gen 3 kopiuje 7 komórek (8 od wschodu), bo gracz widzi po 7 w każdą stronę; w skalach Kiradex to 15 kafelków na otwartym Duo i 12 na Pro Max w pionie.960
- Zachowywać jedną scenę przez szew, a podmianę sceny zostawić dla drzwi i szybkiej podróży, gdzie ukrywa ją wygaszenie.1037
- Mierzyć odległości wyszukiwaniem, a nie linijką, i z każdą regułą ruchu, jaką ma silnik: na dziewięciu zmierzonych trasach, których końce łączą się pieszo, dłuższe przejście w poprzek ma od 1,15 do 1,70 długości dłuższego boku, a droga do domu od 0,95 do 1,42, i droga powrotna może być o jedną czwartą krótsza niż droga tam. Wyszukiwanie bez jednostronnych ścian i bocznych skoków z narożników z Crystal daje dla Route 32 po 110 komórek w każdą stronę; z nimi jest to 132 tam i 128 do domu.5617
- Dać aplikacji i serwerowi jeden graf chodu. Jeśli klient chodzi w ośmiu kierunkach, a serwer w czterech, każda odległość mierzona w teście należy tylko do jednego z nich.28
Dla tych, którzy projektują pętlę
- Wymiarować każdą podróż w sekundach. Pierwszy odcinek to w kanonie od 15 do 25 sekund chodu; minuta to loch.7
- Sprawić, by droga do domu była krótsza niż droga tam, i dać jej do tego coś jednokierunkowego, bo na siatce, po której można chodzić w obie strony, najkrótsza droga z powrotem jest najkrótszą drogą tam. Kanon robi to uskokami, o nawet 44%; furtka otwierana tylko z dalszej strony robi to bez wysokości.5666
- Gdy gracz ma już mapę, pokazywać na niej każde miejsce i dawać zasłużyć tylko na skrót, odwiedzinami. Każda zmierzona tu gra z Pokémonami przekazuje mapę w trakcie gry, rysuje na niej każde miejsce, odwiedzone czy nie, poza kilkoma późnymi miejscami wstrzymanymi przez flagi fabuły albo wydarzeń, ustawia flagę odwiedzin przy wejściu i do szybkiej podróży oferuje tylko odwiedzone miejsca; Kiradex idzie o krok dalej i pokazuje swoją mapę od pierwszego dnia.4445121323222426
- Otwierać obszary czynem i datą, tak jak Stardew, a nie poziomem albo zakupem, i dawać piechurowi coś do zrobienia z kolekcją, dokądkolwiek pójdzie.5227
Często zadawane pytania
Jak długa powinna być trasa w RPG z widokiem z góry?
W dwuwymiarowych Pokémonach od dwóch do dziesięciu ekranów konsoli wzdłuż osi ruchu, a pierwsza trasa od dwóch do sześciu. W komórkach szesnaście zmierzonych przeze mnie tras ma wzdłuż dłuższego boku od 20 do 108, a na dziewięciu, które da się przejść od końca do końca, najkrótsze przejście w poprzek w dłuższym kierunku ma od 1,15 do 1,70 tej długości, bo ścieżka się wije, a droga do domu od 0,95 do 1,42. Przy 16 klatkach na komórkę pierwszy odcinek od drzwi do głównego budynku kolejnego miasta trwa 15,5 sekundy w Emerald i 25,2 w FireRed.56717
Jak gry z Pokémonami łączą mapy bez ekranu ładowania?
Każda mapa wymienia swoich sąsiadów z kierunkiem i przesunięciem. W Emerald silnik kopiuje bieżącą mapę do bufora z marginesem 7 komórek (8 od wschodu), bo „the player has 7 metatiles of view horizontally in either direction” (gracz widzi poziomo po 7 metatile’i w każdą stronę), i wypełnia margines po połączonej stronie 7 rzędami lub kolumnami sąsiada (8 kolumnami od wschodu), rysowanymi kafelkami bieżącej mapy. Gdy gracz przechodzi, silnik wczytuje drugorzędny tileset, paletę, muzykę i pogodę nowej mapy i wsuwa tabliczkę z nazwą, bez wygaszania. Red robi to samo z marginesem 3 bloków, czyli 6 komórek.91039
Dlaczego trasy w Kanto mają strażnice?
W mojej lekturze danych dlatego, że szew na Game Boyu może połączyć tylko dwie mapy narysowane tym samym tilesetem, a strażnica to drzwi tam, gdzie tileset się zmienia: 76 z 78 połączeń w Red łączy ten sam tileset, a każda strażnica w Red między dwoma miejscami łączy dwa. Strażnice mieszczą też reguły: strażników Saffron, którzy chcą napoju, sprawdzenie odznaki na Route 22 i trzech pomocników, którzy dają przedmioty przy 10, 30 i 50 posiadanych gatunkach. Żadna wypowiedź twórców nie potwierdza powodu związanego z tilesetem.8192029
Dlaczego uskoki w Pokémonach są jednokierunkowe?
Zachowanie komórki uskoku wskazuje jeden kierunek ruchu, a gracz może ją przekroczyć tylko w tę stronę. Na zmierzonych wczesnych trasach uskoki zwrócone są w stronę wcześniejszego miasta: droga do domu jest o 2% do 44% krótsza niż droga tam na wszystkich dziewięciu trasach z uskokami, których końce łączą się pieszo. Na czterech trasach, na których to sprawdzono, droga do domu przecina od 0 do 5 komórek wysokiej trawy wobec 4 do 19 w drodze tam.365618
Jak Fly decyduje, do których miast można polecieć?
Na podstawie flagi odwiedzin ustawianej przy wejściu do miasta. W Emerald każde z 16 miast i miasteczek ustawia swoją flagę FLAG_VISITED_* w swoim skrypcie przejścia, a mapa regionu oznacza miasto jako cel Fly tylko wtedy, gdy flaga jest ustawiona; Red przechowuje bit na każde miasto w wTownVisitedFlag, a Crystal ustawia punkt lotu w callbacku mapy. Fly wymaga też odznaki (trzeciej w Red i FireRed, szóstej w Emerald) i mapy zewnętrznej.13222423
Jak duże jest miasto w porównaniu z drogami?
Od dwóch do czterech razy mniejsze. Komórki tras podzielone przez komórki miast dają 1,97 w Crystal, 2,65 w Red, 3,70 w lądowych trasach Emerald i 3,87 w FireRed; na ekranie mapy w Emerald stosunek wynosi 5,9 do 1, bo miasto zajmuje jedno lub dwa pola bez względu na to, jak jest duże.3334
Czy można legalnie skopiować sposób, w jaki Pokémony budują trasy?
Mechaniki, rozmiary i metody nie są chronione prawem autorskim. Konkretne kafelki i sprite’y są chronione prawem autorskim, a nazwy i znaki prawem znaków towarowych. Pierwszy artykuł tej serii omawia tę granicę, wraz z Circular 33 wydanym przez Copyright Office, który wyłącza systemy i metody działania spod prawa autorskiego, oraz patentami z pozwu Nintendo przeciwko twórcy Palworld.60 Ten brief zapożycza liczby i reguły, a każdy kafelek rysuje własną kuźnią Kiradex, z nazwami sprawdzanymi względem listy zakazanych nazw.26
Jak powstał ten artykuł. Dossier badawcze, na którym się opiera, zostało zebrane 4 października 2026 roku na podstawie płytkich klonów dekompilacji pret, zmierzonych sześcioma skryptami w Pythonie zapisanymi razem z wynikami, oraz zapisanych kopii Stardew Valley Wiki, Nookipedii, deasemblacji zladx, podręcznika Porymap, GBATEK, Pan Docs, jednej strony Bulbapedii i stron Apple. Każda liczba dotycząca Pokémonów w tekście to wynik skryptu, a każdy przypis nazywa skrypt. Przed publikacją druga recenzja 5 października doprowadziła do trzech ponownych pomiarów, jednostronnych ścian i skoków z narożników w Crystal, biegu przez uskoki oraz łąki z briefu na ośmiokierunkowym chodzie aplikacji, a także do uważniejszej lektury kroków karencji w kodzie spotkań; każdy przypis mówi, co się zmieniło. Propozycja w sekcji 7 jest moja i tak oznaczona; nic z niej nie zostało zbudowane.
Powiązane na tej stronie: Światy pixel art na iPhonie to pierwszy artykuł tej serii, z systemami kafelków, przepisem na RealityKit i liczbami kafelków dla urządzeń, na których opierają się widoki z tego artykułu; Ludzie w pixel art: postacie i kreator na iPhonie to kolekcjoner, który chodzi po tych trasach; Budowle w pixel art: domy, hale i wnętrza na iPhonie zawiera drzwi, warpy i podmiany pięter, z których korzystają tramwaj i łuk, oraz odrzucenie uskoków, które ten artykuł zostawia artykułowi o wysokości; iPhone Duo dla programistów wyprowadza rozmiar ekranu wewnętrznego, z którego liczony jest pas o szerokości pół widoku; Przygotowanie aplikacji na iPhone Duo omawia układ obok siebie, za którym podąża panel mapy; a Xcode 27.1 beta: aplikacja w symulatorze iPhone Duo omawia symulator, w którym działa test szwu z briefu.
Źródła
-
pret,
pokered/home/overworld.asmw commicied2704a6(OverworldLoopwywołująceDelayFramedwa razy na iterację;AdvancePlayerSpriteprzesuwające o 2 piksele na iterację przez 8 iteracji,wWalkCounter8; rower wywołującyAdvancePlayerSpritedwa razy na iterację), dostęp 4 października 2026, https://github.com/pret/pokered/blob/master/home/overworld.asm. ↩↩↩↩ -
pret,
pokecrystal/engine/overworld/map_objects.asm(StepVectors: krok pieszy z 8 tików po 2 piksele, krok na rowerze z 4 tików po 4 piksele) ipokecrystal/engine/overworld/events.asm(MaxOverworldDelay: db 2) w commicie5beda23, dostęp 4 października 2026, https://github.com/pret/pokecrystal/blob/master/engine/overworld/map_objects.asm. ↩↩↩↩ -
pret,
pokeemerald/src/event_object_movement.cw commicie731ad5b(tablice kroków: 16 wpisów wsStep1Funcsdla chodu, 8 dla biegu i surfowania, 6 dla Acro Bike i prądów, 4 dla Mach Bike, 2 dla najszybszego ruchu;JUMP_DISTANCE_FAR32 klatki na dwie komórki;sJumpY_Highze szczytem na 12 pikselach), dostęp 4 października 2026, https://github.com/pret/pokeemerald/blob/master/src/event_object_movement.c. ↩↩↩↩↩ -
Kod źródłowy Kiradex,
Kiradex/World/PlazaRig.swift, wiersz 101 (tilesPerSecond: Float = 4) i wiersz 122 (runPace: Float = 1.6), odczytane z drzewa roboczego 4 października 2026, oraz wiersze 660 i 666 (każda klatka dodajedt × tilesPerSecond × pace ÷ lengthdo postępu kroku, a zakończony krok ustawia postęp z powrotem na 0, odrzucając nadwyżkę), odczytane 5 października 2026; repozytorium prywatne. 6,4 kafelka na sekundę to nominalny bieg, 4 × 1,6. ↩↩↩↩↩ -
Pomiar autora, 4 października 2026:
measure_gen12_routes.pyw folderze dowodów autora do tego artykułu, wynikgen12_routes.txt. Dane wejściowe zpokeredpret wd2704a6:constants/map_constants.asm(rozmiary w blokach, podwojone do komórek),maps/Route*.blk,gfx/blocksets/overworld.bstwobecOverworld_Coll, kafelek trawy$52idata/tilesets/ledge_tiles.asm(jeden kafelek 8 na 8 na komórkę, lewy dolny),data/maps/objects/Route*.asm(trenerzy jako wierszeobject_eventz klasąOPP_),data/maps/headers/Route*.asm(połączenia). Zpokecrystalpret w5beda23:maps/Route*.blk,data/tilesets/<tileset>_collision.asmprzezCollisionPermissionTable(cztery bajty na blok, założona kolejność wierszami),maps/Route*.asm(trenerzy jakoOBJECTTYPE_TRAINER). Rozszerzone 5 października 2026 (wcześniejszy wynik zachowany jakogen12_routes.pre-walls.txt): boczne ściany Crystal, bajty kolizji odCOLL_RIGHT_WALLdoCOLL_UP_LEFT_WALL($b0do$b7) oraz boczne boje, odrzucają krok wychodzący przez zamurowaną stronę i krok wchodzący przez nią, tak jak ustawia jeGetMovementPermissions(home/map.asm, od wiersza 1511) i odczytuje.CheckLandPerms(engine/overworld/player_movement.asm, wiersz 686); narożne uskokiHOP_DOWN_RIGHTiHOP_DOWN_LEFTpozwalają skoczyć w dół albo w bok (.ledge_table, wiersz 383), a skok jest próbowany dopiero po niepowodzeniu zwykłego kroku (.Normal, wiersze 45 do 56); najkrótsze ścieżki wyznacza algorytm Dijkstry, bo skok kosztuje 2. Tylko Route 32 ma boczne ściany (41 komórek, wszystkieUP_WALL, w tym blok wdata/tilesets/johto_collision.asmwiersz 113) i tylko jej przejścia się zmieniły: wcześniej 110 w każdą stronę, potem 132 na południe i 128 na północ.probe_gen12_exact.py(wynikprobe_gen12_exact.txt) uruchamia każdą kombinację trzech zmian: same ściany dają 132 w każdą stronę, dwukierunkowe skoki z narożników skracają następnie drogę do domu do 128, a dokładne wyszukiwanie niczego nie zmienia;probe_route32_path.pyśledzi skok, z krawędziHOP_DOWN_RIGHTw komórce (8, 80) nad komórkąWALLdo (10, 80). pokered nie ma jednostronnych uprawnień na kafelek; jegoTilePairCollisionsLand(data/tilesets/pair_collision_tile_ids.asm) blokuje parę kafelków w obu kierunkach i wymienia tylko tilesety CAVERN i FOREST, podczas gdy każda mierzona tu mapa to OVERWORLD. Odczyt krawędzi w Gen 2 pochodzi zprobe_gen2_ledges.py(21 z 21 komórekHOP_DOWNna Route 30 ma pod sobą komórkęWALL). Model komórek Gen 1 sprawdzono na oko na renderze Route 1 z Red wykonanym przezrender_gen1.pyw podwójnym rozmiarze z siatką co 16 pikseli (render_Route1.png, wyłącznie do analizy, pochodzący z grafiki chronionej prawem autorskim i niepublikowany). Także powierzchnie tras i miast z przypisu 33. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Pomiar autora, 4 października 2026:
measure_gen3_routes.pyw folderze dowodów autora do tego artykułu, wynikigen3_routes.txtigen3_routes.json. Dane wejściowe zpokeemeraldpret w731ad5bipokefireredw037335f:data/layouts/layouts.json(rozmiary), każda komórkamap.binkażdej trasy (bity 0 do 9 metatile, 10 i 11 kolizja, 12 do 15 wysokość), jej zachowanie z podstawowego lub drugorzędnegometatile_attributes.bin(Emerald u16, bity zachowania 0 do 7; FireRed u32, bity zachowania 0 do 8, typ spotkania bity 24 do 26), liczby zachowańMB_TALL_GRASS,MB_JUMP_*i wodnych orazdata/maps/Route*/map.json(połączenia, trenerzy jakoobject_events, którychtrainer_typenie jestTRAINER_TYPE_NONE,trainer_sight_or_berry_tree_id). Najkrótsze przejścia wyszukiwaniem wszerz. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Pomiar autora, 4 października 2026:
measure_travel.pyw folderze dowodów autora do tego artykułu, wynikitravel.txtitravel.json, napokeemeraldpret w731ad5bipokefireredw037335f. Wyszukiwanie wszerz po parach (mapa, komórka) przez szwy, warpy i uskoki, od komórki pod pierwszymi drzwiami do ostatnich drzwi, z liczbą obejmującą ostatni krok wejścia w nie (wiersz 136, „+1: the step up into the door”); sekundy jako komórki × 16 klatek ÷ 59,7275 Hz w chodzie. Bieg, rozszerzony 5 października 2026 (wcześniejszy wynik, który wyceniał każdą komórkę biegu na 8 klatek, zachowany jakotravel.pre-ledgerun.txt), to drugie wyszukiwanie najmniejszej liczby klatek, 8 na krok i 32 na skok z uskoku, bo skok w FireRed toJump2przyJUMP_DISTANCE_FAR, 32 klatki niezależnie od tempa (src/field_player_avatar.cPlayerJumpLedge, wiersz 905;src/event_object_movement.cDoJumpSpriteMovement, wiersz 9094); odcinek z Centrum na Route 4 do Cerulean to 2528 klatek, 42,3 sekundy, z jednym skokiem, a żaden inny odcinek tam w tabeli nie skacze z uskoku; drzewa Cut, skały Rock Smash i głazy Strength blokują swoje komórki, chyba że przebieg stanowi inaczej (przebieg „po Cut” je usuwa, co na Route 2 otwieraROUTE2_EAST_BUILDING). Wygaszania i walki nie są liczone. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Pomiar autora, 4 października 2026, rozszerzony 5 października 2026 o odczyt 8 kolumn od wschodu, tak jak kopiuje je
FillEastConnection, i o przycinanie każdego pasa tam, gdzie wychodziłby poza bufor, tak jak przycinają goFillNorthConnection,FillSouthConnection,FillWestConnectioniFillEastConnection; liczby połączeń wyłącznie z podstawowymi metatile’ami zmieniły się z 22 z 38 (Emerald) i 25 z 34 (FireRed) na 24 z 38 i 24 z 34:measure_connections.pyw folderze dowodów autora do tego artykułu, wynikiconnections.txticonnections.json, na wszystkich czterech dekompilacjach: każde połączenie map, zgodność tilesetów przez każdy szew (dla Gen 3 zestawy podstawowe i drugorzędne oraz to, czy pas sąsiada w marginesie, 7 rzędów lub kolumn i 8 kolumn od wschodu, używa wyłącznie podstawowych metatile’i), wzajemność z zanegowanymi przesunięciami, niezerowe przesunięcia, mapy z tilesetami GATE i FOREST_GATE w Red (data/maps/headers/*.asm), środowisko GATE w Crystal (data/maps/maps.asm) oraz mapy wewnętrzne Gen 3, których warpy prowadzą do dwóch różnych map zewnętrznych albo na dwie strony jednej. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
pret,
pokeemerald/include/fieldmap.h(MAP_OFFSET 7i jego komentarz, „the player has 7 metatiles of view horizontally in either direction”;MAX_MAP_DATA_SIZE 10240;MAP_OFFSET_WjakoMAP_OFFSET * 2 + 1iMAP_OFFSET_HjakoMAP_OFFSET * 2),pokeemerald/src/fieldmap.c(InitMapLayoutDatawymiarujące bufor jako mapę plusMAP_OFFSET_WnaMAP_OFFSET_H;FillSouthConnectioni jej siostrzane funkcje, przy czymFillNorthConnectionustawiax = offset + MAP_OFFSETiwidth = cWidth, gdy pas się mieści, o wysokościMAP_OFFSETrzędów, aFillEastConnectionkopiujeMAP_OFFSET + 1kolumn;GetBorderBlockAtłączące brzeg operacją OR zMAPGRID_IMPASSABLE),data/maps/Route101/map.json(Oldale Town na północy z przesunięciem 0) idata/layouts/layouts.json(LAYOUT_ROUTE101iLAYOUT_OLDALE_TOWN, każdy 20 na 20) w731ad5b, dostęp 4 października 2026, https://github.com/pret/pokeemerald/blob/master/include/fieldmap.h i https://github.com/pret/pokeemerald/blob/master/src/fieldmap.c. ↩↩↩↩↩↩↩ -
pret,
pokeemerald/src/field_camera.c(DrawMetatileAtrysujące podstawowym i drugorzędnym tilesetem bieżącego układu) ipokeemerald/src/overworld.c(LoadMapFromCameraTransition: skrypt przejścia, drugorzędny tileset i paleta, muzyka, pogoda i tabliczka z nazwą mapy, bez wygaszania) w731ad5b, dostęp 4 października 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.hisrc/data/region_map/region_map_sections.jsonw731ad5b, dostęp 4 października 2026, z liczbami zmeasure_region_maps.py(wynikregion_maps.txt), https://github.com/pret/pokeemerald/blob/master/src/data/region_map/region_map_layout.h. ↩↩↩↩↩↩↩ -
pret,
pokeemerald/src/field_control_avatar.c(metatile z zachowaniemMB_REGION_MAPuruchamiaEventScript_RegionMap),data/event_scripts.s(EventScript_RegionMap,special FieldShowRegionMap),data/maps/RustboroCity_DevonCorp_3F/scripts.inc(setflag FLAG_SYS_POKENAV_GET),src/start_menu.c(pozycja PokéNav w menu tylko przy ustawionejFLAG_SYS_POKENAV_GET) isrc/region_map.c(Battle Frontier i Southern Island jakoMAPSECTYPE_NONEdo czasu ich flagFLAG_LANDMARK_*, wiersze 1213 do 1216) w731ad5b, dostęp 4 października 2026, z układami map ściennych wedługscan_wall_maps.pyw folderze dowodów autora do tego artykułu (wynikwall_maps.txt: piętro obu domów w Littleroot i parter każdego Centrum Pokémon), https://github.com/pret/pokeemerald/blob/master/data/event_scripts.s. ↩↩↩↩↩↩↩↩ -
pret,
pokeemerald/src/party_menu.c(FIELD_MOVE_FLYwobecFLAG_BADGE06_GET),src/overworld.c(Overworld_MapTypeAllowsTeleportAndFly),src/region_map.c(MAPSECTYPE_CITY_CANFLY, gdy ustawiona jestFLAG_VISITED_*miasta) idata/maps/OldaleTown/scripts.inc(setflag FLAG_VISITED_OLDALE_TOWN) w731ad5b, dostęp 4 października 2026, https://github.com/pret/pokeemerald/blob/master/src/region_map.c. ↩↩↩↩↩↩↩↩↩↩ -
Kod źródłowy Kiradex,
scripts/forge/town.py, wiersze 79 i 80 (MARGIN = 12,WIDTH, HEIGHT = 40, 30) i jego listaBUILDINGS(siedem budynków, drzwi doroom:me,room:npc-*lubhall, jedno przybycie), odczytane 4 października 2026; repozytorium prywatne. ↩↩↩↩↩↩ -
Martin Korth, GBATEK, taktowanie LCD („Total 228 lines, 16.743 ms, 280896 cycles - ca. 59.737 Hz”), zapisane 4 października 2026 jako
gbatek.txt, https://problemkaputt.de/gbatek.htm. ↩↩↩ -
Blake Crosley, „Pixel-Art Motion: Walks, Cameras and Doors on iPhone”, blakecrosley.com, 5 października 2026, sekcja 7 („Where the walk stands today”: model kodu chodu Kiradex liczony klatka po klatce, w którym bieg zajmuje 10 klatek na kafelek przy 60 Hz, 6,00 kafelka na sekundę, i 19 przy 120, 6,32, bo nadwyżka każdego kafelka jest odrzucana; 220-milisekundowe oczekiwanie przy drzwiach i zmiana piętra bez wygaszania; oraz chód z briefu po 1 pikselu na tik, 16 tików na kafelek przy 60 Hz, 3,75 kafelka na sekundę, ze skokową zasłoną nad drzwiami i piętrami), https://blakecrosley.com/blog/pixel-art-motion-on-iphone. ↩↩↩↩↩
-
Arytmetyka autora na podstawie zmierzonych wartości z tekstu, z liczbami z 5 października wypisanymi przez
arith_oct5.pyw folderze dowodów autora do tego artykułu (wynikarith_oct5.txt): komórki na sekundę jako 59,7275 ÷ 16 i ÷ 8; 4 kafelki na sekundę w Kiradex wobec 3,73 (o 7,2% szybciej), a jego bieg wobec 7,47 przy 6,00 (o 19,6% wolniej) i przy 6,4 (o 14,3% wolniej); czas przy 4 kafelkach na sekundę wobec czasu przy 3,75 jako 4 ÷ 3,75, o jedną piętnastą dłużej, a 23 tiki przekątnej przy 60 Hz wobec √2 ÷ 4 sekundy jako 0,3833 ÷ 0,3536 = 1,084, mniej więcej o jedną dwunastą dłużej (wypisane przezr6_arith.py); sekundy na komórkę jako 16 ÷ 59,7275 (0,27) i na kafelek Kiradex jako 1 ÷ 4 (0,25); współczynniki ścieżki jako najkrótsze przejście podzielone przez dłuższy bok trasy, dla dłuższego kierunku i dla drogi do domu, na dziewięciu trasach z przejściem od szwu do szwu w każdą stronę (proste przejście od pierwszego do ostatniego rzędu mapy o 20 komórkach to 19 kroków, 0,95), a oszczędności jako (tam − do domu) ÷ tam, od 2,38% (Route 3 w Red) do 44,12% (Route 101 w Emerald); wysoka trawa względem komórek do chodzenia na każdej trasie z liczb trawy i komórek do chodzenia z obu skryptów tras; pola miast na mapie Emerald zwidthiheight16 sekcji miast i miasteczek wregion_map_sections.json(dziesięć 1 na 1, sześć 1 na 2 lub 2 na 1, łącznie 22); liczby kafelków wewnętrznego ekranu Duo jako 2853 ÷ 96 i 2007 ÷ 96, gdzie 96 to 16 tekseli po 6 pikseli; kafelki przed wyśrodkowanym kolekcjonerem jako połowa widocznych kafelków wzdłuż osi ruchu; próbka co 100 milisekund jako jedna klatka na 100 × 60 ÷ 1000 = 6 przy 60 Hz; próg czasowy jako dwie klatki przy 60 Hz, 33 milisekundy; akry Animal Crossing 5 na 6 po 16 na 16 pól jako 80 na 96; obszary briefu jako 44 × 14 + 24 × 60 + 36 × 20 + 30 × 20 = 3376 kafelków wobec 40 × 30 = 1200; połowy widoku jako liczby kafelków z 3 października podzielone na pół i zaokrąglone w górę; pola ekranu mapy jako kafelki każdego obszaru podzielone przez 10 i zaokrąglone. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Pomiar autora, 4 października 2026:
measure_grass_paths.pyw folderze dowodów autora do tego artykułu, wynikgrass_paths.txt: wyszukiwanie wszerz 0-1, w którym wejście na komórkę wysokiej trawy kosztuje 1, a każdy inny ruch 0, z uskokami jednokierunkowymi, przy użyciu modeli komórek i osiągalnych z drzwi przejść z obu skryptów tras; Route 1 w Red, Route 1 w FireRed, Route 101 i 102 w Emerald. Komórki przesmyku pochodzą zprobe_grass_gateway.py(wynikgrass_gateway.txt), który ponownie uruchamia wyszukiwanie na południe po Route 1 w Red, zamieniając po kolei każdą komórkę trawy w zwykły grunt: tylko 8 komórek z czterech ostatnich rzędów przesmyku, po dwie na rząd, obniża minimum. ↩↩↩↩↩↩ -
pret,
pokered/scripts/Route5Gate.asm(TEXT_ROUTE5GATE_GUARD_GEE_IM_THIRSTY,BIT_GAVE_SAFFRON_GUARDS_DRINK) ipokered/scripts/Route22Gate.asm(BIT_BOULDERBADGE) wd2704a6, dostęp 4 października 2026, https://github.com/pret/pokered/blob/master/scripts/Route5Gate.asm. ↩↩↩↩↩ -
pret,
pokered/scripts/Route2Gate.asm,scripts/Route11Gate2F.asm,scripts/Route15Gate2F.asm(progi 10, 30 i 50) iengine/events/oaks_aide.asm(CountSetBitspowPokedexOwned) wd2704a6, dostęp 4 października 2026, https://github.com/pret/pokered/blob/master/engine/events/oaks_aide.asm. ↩↩↩↩↩ -
pret,
pokeemerald/src/map_name_popup.cw731ad5b(POPUP_OFFSCREEN_Y 40, wsuwanie po 2 piksele na klatkę,tOnscreenTimer > 120), dostęp 4 października 2026, https://github.com/pret/pokeemerald/blob/master/src/map_name_popup.c. Łączna liczba 190 klatek to policzenie przez autora stanów zadania według ich progów; każdy stan może trwać klatkę dłużej lub krócej. ↩↩↩↩↩ -
pret,
pokered/data/maps/town_map_entries.asm(37 wpisów zewnętrznych, jeden nieużywany; 60 wewnętrznych),engine/overworld/toggleable_objects.asm(wTownVisitedFlag, z komentarzem „mark town as visited (for flying)”),engine/items/town_map.asm(lista lotu pomijająca nieodwiedzone miasta) iengine/menus/start_sub_menus.asm(Fly wymaga Thunder Badge, bit 2, i mapy zewnętrznej) wd2704a6, dostęp 4 października 2026, https://github.com/pret/pokered/blob/master/engine/items/town_map.asm. ↩↩↩↩↩↩↩ -
pret,
pokefirered/src/data/region_map/region_map_layout_kanto.hi trzy układy Sevii (22 na 15 na stronę, warstwy świata zewnętrznego i lochów),src/party_menu.ciinclude/constants/party_menu.h(Fly jakoFLAG_BADGE01_GET + fieldMovezFIELD_MOVE_FLY2, trzecia odznaka),src/region_map.c(GetMapsecTypezwracająceMAPSECTYPE_VISITEDtylko wtedy, gdy ustawiona jest flagaFLAG_WORLD_MAP_*miejsca, od wiersza 2957; Fly przyjmujące tylko odwiedzone pole; strony Sevii wstrzymane do czasuFLAG_SYS_SEVII_MAP_123iFLAG_SYS_SEVII_MAP_4567, wiersze 1028 i 1556, które ustawiają skrypty Centrum na One Island; Navel Rock i Birth Island zamalowane do czasu ustawieniaFLAG_WORLD_MAP_NAVEL_ROCK_EXTERIORiFLAG_WORLD_MAP_BIRTH_ISLAND_EXTERIOR, wiersze 1521 do 1524),data/maps/CeladonCity/scripts.inc(setworldmapflag FLAG_WORLD_MAP_CELADON_CITYw skrypcie przejścia),data/maps/PalletTown_RivalsHouse/scripts.inc(siostra rywala dająca Town Map,RECEIVED_TOWN_MAP) idata/event_scripts.s(EventScript_WallTownMap,special ShowTownMap) w037335f, dostęp 4 października 2026, z liczbami zmeasure_region_maps.pyi mapami ściennymi wedługscan_wall_maps.py(wynikwall_maps.txt: parter każdego Centrum Pokémon, szkoła w Viridian i niektóre domy), https://github.com/pret/pokefirered/blob/master/src/data/region_map/region_map_layout_kanto.h. ↩↩↩↩↩↩↩↩↩↩ -
pret,
pokecrystal/data/maps/landmarks.asm(95 punktów orientacyjnych),data/maps/flypoints.asm(24 punkty lotu),maps/VioletCity.asm(VioletCityFlypointCallback: setflag ENGINE_FLYPOINT_VIOLET) iengine/events/overworld.asm(ENGINE_STORMBADGE) w5beda23, dostęp 4 października 2026, https://github.com/pret/pokecrystal/blob/master/data/maps/flypoints.asm. ↩↩↩↩↩↩↩ -
zladx, LADX-Disassembly w commicie
2a5c2c0,src/constants/memory/wram.asm(wOverworldRoomStatus,ds $100) isrc/constants/gameplay.asm(OW_ROOM_STATUS_VISITED EQU $80i pozostałe bity stanu), zapisane 4 października 2026 jakoladx-wram.asmiladx-gameplay.asm, https://github.com/zladx/LADX-Disassembly/blob/main/src/constants/gameplay.asm. ↩↩↩ -
Dossier badawcze autora, „Beyond the plaza: routes, map connections and districts in the canon”, 4 października 2026, sekcja 4 („The brief for Kiradex”), synteza autora: pięć obszarów i ich rozmiary, cele odległości, format połączeń, plan szwu, obecności i przerwy w płocie, znaleziska, opiekun łuku, ekran mapy, tramwaj, kolejność prac, trzynaście testów akceptacyjnych i odrzucenia. Repozytorium Kiradex,
docs/research/routes/01-routes.md; prywatne. Przedział drogi tam zawężono 5 października 2026 z 90 do 120 kafelków w dossier do 110 do 120, z powodu podanego w przypisie 66; kopia dossier wciąż zawiera wcześniejszy przedział. Ustalone także 5 października, po dossier i poza jego kopią: ośmiokierunkowy graf chodu wspólny dla aplikacji i serwera, cztery żywopłoty na łące, inspekcja każdej klatki w teście 6, lista zakazanych nazw jako praca do wykonania i odłożenie znalezisk monet. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Kiradex,
docs/WORLD.md, „Kiradex World: research and plan”, odczytane 4 października 2026 (repozytorium prywatne): sekcja 1 („The rules for Kiradex World”: nic z ich gier w świecie); sekcja 4 („Levels”: „XP comes only from the real world, which is the point of the app”; „Coins and the shop”: monety zdobywane za skany, poziomy i codzienne wizyty; „The plaza”: pokoje do około 40 graczy, dzielone według regionu, kamera podążająca za graczem z ograniczeniem do mapy); sekcja 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”); sekcja 6 (targ przez eBay, stragan); sekcja 7 („Order of work”, każda faza jako kompilacja w TestFlight); oraz decyzje z 2 października 2026 (serwer na FastAPI i WebSockets). ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Kod źródłowy Kiradex, odczytany 5 października 2026 (repozytorium prywatne):
Kiradex/World/TileMap.swift,path(from:to:)od wiersza 325 (osiem ruchów; przekątna kosztujeFloat(2).squareRoot()i w wierszu 348 jest pomijana, chyba że oba kafelki, między którymi przechodzi, nadają się do chodzenia; najpierw rozwijany jest najtańszy otwarty kafelek) orazserver/app/rooms.py,Plaza.pathod wiersza 52 (wszerz po czterech ruchach w wierszu 66; jego docstring: „the same walk the app takes”). ↩↩↩↩↩ -
Dossier badawcze autora, „Beyond the plaza: routes, map connections and districts in the canon”, zebrane 4 października 2026, sekcje „Method” i 5 („What is measured and what is not”): wspólne definicje chodu (krok to jedna komórka; uskok jednokierunkowy i dwie komórki; szew liczy się tylko tam, gdzie leżąca naprzeciw komórka sąsiada jest osiągalna z jednych z jego drzwi, z punktami startowymi z innych połączeń na jeden poziom w głąb dla sąsiada bez warpów; trenerzy, NPC i blokady fabularne pomijane; bez surfowania; wysokość w Gen 3 sprowadzona do równych wysokości albo którejkolwiek strony na poziomie 0 lub 15; warpy uruchamiane przy wejściu na nie; drzewa Cut, skały Rock Smash i głazy Strength blokujące, chyba że podano inaczej), zastrzeżenia do modeli komórek Gen 1 i Gen 2, zastrzeżenie do taktowania tabliczki, liczba dla częstotliwości klatek, zastrzeżenia klasyfikacji, źródła wtórne niesprawdzone względem danych gier oraz odczytania, które nie są faktami. Repozytorium Kiradex,
docs/research/routes/01-routes.md; prywatne, z kopią w stanie badań autora. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
gbdev, Pan Docs, „Rendering” (70 224 kropki na klatkę, „@ 59.7 fps”), zapisane 4 października 2026 jako
pandocs-timing.txt, https://gbdev.io/pandocs/Rendering.html. ↩ -
pret,
pokeemerald/src/field_control_avatar.c(CheckStandardWildEncounter, wiersze 668 do 686: dopókisWildEncounterImmunitySteps < 4, liczy krok i wraca bez sprawdzania; po udanymStandardWildEncounterustawia licznik z powrotem na 0),src/overworld.c(RestartWildEncounterImmunityStepswLoadMapFromCameraTransition, wiersz 800, i wLoadMapFromWarp, wiersz 850),src/battle_setup.c(to samo wywołanie na początku walki, wiersz 370),src/wild_encounter.c(StandardWildEncounter: 40-procentowe pominięcie przy zmianie zachowania, wiersze 531 do 539 i 599;WildEncounterCheck, od wiersza 502: współczynnik razy 16, skalowany przez Mach Bike i Acro Bike do 80%, przezApplyFluteEncounterRateModiApplyCleanseTagEncounterRateModoraz przez zdolność prowadzącego Pokémona, a następnieRandom() % 2880porównane z wynikiem) isrc/data/wild_encounters.json(lądowy współczynnik 20 na Route 101 do 104) w731ad5b, dostęp 4 i 5 października 2026, https://github.com/pret/pokeemerald/blob/master/src/field_control_avatar.c. ↩↩ -
pret,
pokefirered/src/wild_encounter.cw037335f, dostęp 4 i 5 października 2026:GetMapBaseEncounterCooldown(8 − rate/10kroków, wiersz 686);HandleWildEncounterCooldown, wiersze 707 do 755 (gdy liczba kroków od ostatniego spotkania osiągnie okres wyciszenia, każdy krok może próbować; wcześniej każdy krok po komórce spotkań dodaje jeden do licznika i pozwala temu jednemu krokowi spróbować, gdyRandom() % 100 < 5, bez kończenia wyciszenia);TryStandardWildEncounter, wiersze 757 do 776 (licznik i premia wracają do 0 dopiero po rozpoczęciu spotkania); to samo zerowanie przy każdym wczytaniu mapy, gdziesrc/overworld.c(wiersze 764 i 799) wywołujeRestartWildEncounterImmunitySteps, które w FireRed wywołujeResetEncounterRateModifiers(src/field_control_avatar.c, wiersze 735 do 737); 60-procentowe losowanie przy nowym zachowaniu (wiersz 370);DoWildEncounterRateTest, wiersz 309 (rate × 16plusencounterRateBuff × 16 / 200, naMAX_ENCOUNTER_RATE1600); orazAddToWildEncounterRateBuff, wiersz 778 (współczynnik dodawany po każdym nieudanym losowaniu, chyba że działa Repel), https://github.com/pret/pokefirered/blob/master/src/wild_encounter.c. ↩↩ -
Pomiar autora, 4 października 2026, z
measure_gen12_routes.py(Red:ROUTE_1doROUTE_25wobec 11 identyfikatorów map poniżej$0Bwconstants/map_constants.asm, bloki razy 4; Crystal: środowisko ROUTE wobec TOWN wdata/maps/maps.asm, rozmiary zconstants/map_constants.asm) imeasure_connections.py(Emerald i FireRed:map_typez rozmiarami zlayouts.json; 11 mapMAP_TYPE_OCEAN_ROUTEw Emerald, 45 600 komórek, wyłączonych z liczby lądowej; trasy FireRed obejmują wyspy Sevii). Wynikigen12_routes.txticonnections.txt. ↩↩↩↩↩↩ -
Pomiar autora, 4 października 2026:
measure_region_maps.pyw folderze dowodów autora do tego artykułu, wynikiregion_maps.txtiregion_maps.json(Emerald: 129 pól tras i 22 pola miast na siatce 28 na 15). ↩↩ -
Bulbapedia, „Kanto Route 1”, sekcja z opisem przejścia, zapisana 4 października 2026 jako
bulba-route1.txt, https://bulbapedia.bulbagarden.net/wiki/Kanto_Route_1. Użyta raz, jako kontrola wyszukiwania najmniejszej ilości trawy. ↩ -
Dossier badawcze autora do artykułu o budowlach, repozytorium Kiradex,
docs/research/structures/01-structures-in-the-canon.md, sekcja 8.8 („What to refuse”: „No ledges to jump, no climbing, no isometric”), oraz02-structures-craft-and-engine.md(GetLedgeJumpDirectionw Emerald, które pozwala przejść uskok tylko w kierunku wskazanym przez jego zachowanie), 3 października 2026; prywatne. ↩↩↩↩ -
Blake Crosley, „Pixel-Art Structures: Houses, Halls and Interiors on iPhone”, blakecrosley.com, 3 października 2026 (sekcja 6: jedna reguła głębokości i siatka obiektów, warpy jako dane, piętra podmieniane w miejscu przez
.id(floor.name); sekcja 7: testy serwera naplaza.jsoni lista tego, czego kompilacja nie robi, w tym „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) ipokered/macros/scripts/maps.asm(wskaźniki pasów w makrzeconnection) wd2704a6, dostęp 4 października 2026, https://github.com/pret/pokered/blob/master/macros/scripts/maps.asm. ↩↩↩ -
pret,
pokered/constants/map_data_constants.asm(MAP_BORDER EQU 3) ipokered/home/overworld.asm(CheckMapConnections) wd2704a6, dostęp 4 października 2026, https://github.com/pret/pokered/blob/master/constants/map_data_constants.asm. ↩↩ -
pret,
pokered/data/maps/headers/Route22.asmiRoute23.asm(connection north, Route23, ROUTE_23, 0 ; unnecessaryi jego odwrotność) wd2704a6, dostęp 4 października 2026, https://github.com/pret/pokered/blob/master/data/maps/headers/Route22.asm. ↩ -
pret,
pokecrystal/data/maps/attributes.asm(połączenia) idata/maps/maps.asm(tilesety, środowiska i grupy map) w5beda23, dostęp 4 października 2026, https://github.com/pret/pokecrystal/blob/master/data/maps/attributes.asm. ↩ -
Dokumentacja Porymap, „Editing Map Connections”, zapisana 4 października 2026 jako
porymap-connections.txt, https://huderlem.github.io/porymap/manual/editing-map-connections.html. ↩↩ -
pret,
pokered/data/maps/objects/Route2Gate.asm(pomocnik Oaka i chłopiec) wd2704a6, dostęp 4 października 2026, https://github.com/pret/pokered/blob/master/data/maps/objects/Route2Gate.asm. ↩ -
pret,
pokered/scripts/BluesHouse.asm(siostra rywala dającaTOWN_MAPpo ustawieniuEVENT_GOT_POKEDEX, potemEVENT_GOT_TOWN_MAP),engine/items/town_map.asm(DisplayTownMapprzechodzące przez każdy wpisTownMapOrderbez sprawdzania odwiedzin;wTownVisitedFlagodczytywane tylko wBuildFlyLocationsList)data/tilesets/bookshelf_tile_ids.asm(bookshelf_tile HOUSE, $3D, TownMapText, mapa ścienna otwierająca ten sam ekran),data/maps/headers/BluesHouse.asm(dom rywala z tilesetem HOUSE; dom gracza używaREDS_HOUSE_1iREDS_HOUSE_2),gfx/blocksets/house.bst(kafelek $3D tylko w bloku 14) imaps/BluesHouse.blk(blok 14 na drugiej pozycji w górnym rzędzie) wd2704a6, dostęp 4 października 2026, https://github.com/pret/pokered/blob/master/scripts/BluesHouse.asm. ↩↩↩↩↩↩ -
pret,
pokecrystal/maps/CherrygroveCity.asm(prezent od przewodnika,setflag ENGINE_MAP_CARD, wiersz 72) iengine/pokegear/pokegear.asm(POKEGEAR_MAP_CARD_Fkarty mapy;PokegearMap_CheckRegionpokazujące mapę Kanto tylko wtedy, gdy gracz stoi w punkcie orientacyjnym Kanto; punkty lotu Kanto wstrzymane do odwiedzenia Indigo Plateau) w5beda23, dostęp 4 października 2026, https://github.com/pret/pokecrystal/blob/master/maps/CherrygroveCity.asm. ↩↩↩↩↩ -
Stardew Valley Wiki, „Modding:Maps”, zapisane 4 października 2026 jako
sdv-modding-maps.txt, https://stardewvalleywiki.com/Modding:Maps. ↩↩ -
Stardew Valley Wiki, „Pelican Town”, zapisane 4 października 2026 jako
sdv-pelican-town.txt, https://stardewvalleywiki.com/Pelican_Town. ↩ -
Stardew Valley Wiki, „Bus Stop”, zapisane 4 października 2026 jako
sdv-bus-stop.txt, https://stardewvalleywiki.com/Bus_Stop. ↩ -
Stardew Valley Wiki, „Cindersap Forest”, zapisane 4 października 2026 jako
sdv-cindersap.txt, https://stardewvalleywiki.com/Cindersap_Forest. ↩ -
Stardew Valley Wiki, „Backwoods”, zapisane 4 października 2026 jako
sdv-backwoods.txt, https://stardewvalleywiki.com/Backwoods. ↩ -
Stardew Valley Wiki, ramka nawigacyjna lokacji w postaci, w jakiej pojawia się na stronie „Railroad”, zapisana 4 października 2026 jako
sdv-railroad.txt, https://stardewvalleywiki.com/Railroad; 26 miejsc według obliczeń autora. ↩ -
Stardew Valley Wiki, „The Mountain” (dwa początkowe wyjścia; kopalnie 5 dnia wiosny; kolej po trzęsieniu ziemi 3 dnia lata; most do kamieniołomu za pakiety z pokoju rzemiosł albo 25 000 g), zapisane 4 października 2026 jako
sdv-mountain.txt, https://stardewvalleywiki.com/The_Mountain. ↩↩↩↩ -
Stardew Valley Wiki, „The Desert” (autobus, pakiety ze skarbca albo 40 000 g), „Secret Woods” (kłoda i stalowa siekiera) i „The Beach” (most z 300 sztuk drewna), zapisane 4 października 2026 jako
sdv-desert.txt,sdv-secret-woods.txtisdv-beach.txt, https://stardewvalleywiki.com/The_Desert, https://stardewvalleywiki.com/Secret_Woods i https://stardewvalleywiki.com/The_Beach. ↩↩ -
Stardew Valley Wiki, „Speed”, zapisane 4 października 2026 jako
sdv-speed.txt, https://stardewvalleywiki.com/Speed. Strona nie podaje jednostek. ↩ -
Nookipedia, „Acre” (akr 16 na 16 pól; miasteczko na GameCube pięć akrów na sześć; stacja w A-3; oznaczenia; pojawianie się ryby i owada przy wejściu i znikanie po oddaleniu się o sześć pól; rozmiary miasteczek w późniejszych grach), zapisane 4 października 2026 jako
nook-acre.txt, https://nookipedia.com/wiki/Acre. ↩↩↩↩↩ -
Nookipedia, „Map”, zapisane 4 października 2026 jako
nook-map.txt, https://nookipedia.com/wiki/Map. ↩ -
Nookipedia, „Train” i „Train station”, zapisane 4 października 2026 jako
nook-train.txtinook-train-station.txt, https://nookipedia.com/wiki/Train i https://nookipedia.com/wiki/Train_station. ↩ -
zladx, wiki LADX-Disassembly, „Game engine documentation”, zapisane 4 października 2026 jako
ladx-engine.txt, https://github.com/zladx/LADX-Disassembly/wiki/Game-engine-documentation. ↩↩↩ -
zladx, wiki LADX-Disassembly, „Maps data format” (512-bajtowa mapa świata zewnętrznego z dwubajtowymi wskaźnikami pomieszczeń; nakładka 10 na 8), zapisane 4 października 2026 jako
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 października 2026 (sekcja 5: przepis na RealityKit, jedna siatka
MeshDescriptordla mapy, domyślne ustawienia RealityView, tabela skalowania obliczona na podstawie stron ze specyfikacjami Apple i profili symulatora Xcode 27, 11-punktowe minimum tekstu i tekst w SwiftUI, błąd animacji nieprzezroczystości i jego zasłona, nagrywanieXCUIScreenz wnętrza pakietu; „Since publishing”: jedna mapa liter eksportowana do aplikacji i serwera; pytanie o prawo autorskie i patenty w FAQ), https://blakecrosley.com/blog/pixel-art-world-on-iphone. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Apple, „iPhone Duo: Technical Specifications”, zapisane 4 października 2026 jako
apple-duo-specs.txt, https://www.apple.com/iphone-duo/specs/. ↩ -
Apple, Human Interface Guidelines, „Designing for games” (przez JSON dokumentacji), zapisane 4 października 2026 jako
hig-games-plain.txt, https://developer.apple.com/design/human-interface-guidelines/designing-for-games. ↩↩ -
Kod źródłowy Kiradex,
Kiradex/World/PlazaStage.swift, odczytany 5 października 2026 (repozytorium prywatne): wiersze 132 i 133 (przy warpie drzwiTask.sleep(for: .milliseconds(220)), a potemonWarp(warp), bez wygaszania) i wiersze 698 do 700 (warpfloor:ustawia nowe piętro w miejscu, bez wygaszania). ↩ -
Apple Developer Documentation, „targetTimestamp” (właściwość instancji
CADisplayLink, Core Animation; iOS i iPadOS 10.0 i nowsze), zapisane 4 października 2026 (streszczenie, „The time interval that represents when the next frame displays”, czyli przedział czasu oznaczający, kiedy wyświetli się następna klatka, oraz przykład dodający display link do głównej pętli uruchomieniowej), https://developer.apple.com/documentation/quartzcore/cadisplaylink/targettimestamp. ↩↩ -
Kod źródłowy Kiradex,
Kiradex/World/Wants.swift(„What the town’s own collectors ask to be shown, and whether the collection has it”, co kolekcjonerzy z miasteczka chcą, by im pokazać, i czy kolekcja to ma) iKiradex/World/Quests.swift(zadania dnia i tygodnia, „judged from the collection itself”), odczytane 4 października 2026; repozytorium prywatne. ↩↩ -
Pomiar autora, 5 października 2026:
measure_meadow_gate.pyw folderze dowodów autora do tego artykułu, wynikmeadow_gate.txt. Łączy Rynek, Łąkową Ścieżkę i Brzeg Jeziora z briefu w jedną siatkę o rozmiarach z sekcji 7: Rynek taki, jakim dostarcza go kuźnia (town.json, 40 na 30, przybycie w kolumnie 19, rzędzie 13, litery do chodzenia z serwera), z północnym płotem otwartym wzdłuż wspólnej krawędzi; Łąkowa Ścieżka, 24 na 60, 4 kafelki od zachodniego końca Rynku, tak by jej alejka spotykała się z trawnikiem między halą a domem na wschód od niej, alejka szerokości 2 kafelków za żywopłotem po wschodniej stronie, z furtką jako jednokierunkową krawędzią na jej jeziornym końcu, a reszta przecięta czterema żywopłotami w rzędach łąki 12, 24, 36 i 48, z 2-kafelkowymi przerwami sprawdzanymi w każdym położeniu; Brzeg Jeziora, 36 na 20, wyśrodkowany względem ścieżki, z północną połową jako jeziorem i pomostem szerokości 2 kafelków na linii alejki, mierzonym do jego kafelka od strony lądu. Model chodzi po grafie aplikacji (TileMap.path): osiem kierunków, przekątna kosztująca √2 i odrzucana, gdy którykolwiek z kafelków, między którymi przechodzi, jest zablokowany; furtka odrzuca każdy krok z alejki w stronę jeziora i przyjmuje krok od jeziora tylko na wprost. Wicie się to najkrótsze przejście samej łąki od jej południowej do północnej krawędzi, na zachód od alejki. Dwa żywopłoty, w rzędach łąki 20 i 40, wiją ją na 59,00 do 66,46 kafelka we wszystkich 400 położeniach, trzy (rzędy 15, 30 i 45) na 59,00 do 79,77 (6 z 8000 w zakresie 78 do 90), cztery na 59,00 do 95,43 (5912 ze 160 000 w zakresie 78 do 90); te granice dotyczą równo rozmieszczonych żywopłotów, a nierówne rozmieszczenia wiją mocniej według tej samej funkcji (r7_uneven_probe.py, 5 października, wynikr7_uneven_probe.txt: dwa żywopłoty w rzędach 0 i 2 osiągają 77,00, trzy w rzędach 20, 22 i 24 osiągają 95,00). To samo przeszukanie z trzema żywopłotami, w rzędach łąki 15, 30 i 45 (dodane do sekcji 5 skryptu 5 października po szóstej rundzie bramki przedpublikacyjnej): 6 układów daje drogę do domu 88,07 kafelka i drogę tam od 114,05 do 120,44, stosunek od 0,731 do 0,772, wszystkie na poziomie 0,8 lub niżej, a 5 z nich mieści się w przedziale od 110 do 120, droga tam od 114,05 do 119,02, stosunek od 0,740 do 0,772. Trzy żywopłoty spełniają więc wszystkie cele w 5 położeniach; cztery, wybór autora, spełniają je w 4111. W tych 5912 układach z czterema żywopłotami: droga do domu 88,07 kafelka, droga tam od 108,74 do 133,75, stosunek od 0,658 do 0,810, 5886 na poziomie 0,8 lub niżej; cel 0,8 wymaga 88,07 ÷ 0,8 = 110,09 tam; w przedziale od 110 do 120 jest 4111 układów, droga tam od 110,15 do 119,95, stosunek od 0,734 do 0,800, wszystkie na poziomie 0,8 lub niżej. Od przybycia do północnej krawędzi jest 17,07 kafelka; przy furtce otwartej w obie strony przejścia są równe (88,07 w każdą stronę w jednym układzie dla każdej liczby żywopłotów). Przy każdym przesunięciu od 0 do 16 kafelków i obu położeniach pomostu najkrótsza droga tam ma 107,18, a najkrótsza droga do domu 88,07; przy 4 kafelkach na sekundę 110 i 120 kafelków to 27,5 i 30 sekund. Ten sam wynik sprawdza się względem wcześniejszego modelu: uruchomione z jego zapisanej kopii czterokierunkowe wyszukiwanie wszerz z dwoma żywopłotami zachowuje 125 układów, droga tam od 113 do 119, do domu 91, stosunek od 0,765 do 0,805, a tych 125 układów przechodzonych w ośmiu kierunkach daje drogę tam od 97,18 do 99,67, do domu 88,07, stosunek od 0,884 do 0,906, żaden na poziomie 0,8. Tamten wcześniejszy model liczył wicie się jako kroki po łące w najkrótszej ścieżce, którą zwróciło wyszukiwanie, co remisy mogą zmienić; wicia od krawędzi do krawędzi nie mogą zmienić. Rozmieszczenia, których brief nie opisuje, przeszukane w tym samym wyniku: przy pomoście na środku brzegu najlepszy stosunek to 0,721 (przesunięcie 4, 2182 z 5912 układów na poziomie 0,8 lub niżej), a tam, gdzie alejka styka się z budynkiem, furtka niczego nie oszczędza. ↩↩↩↩ -
Apple Developer Documentation, „preferredFrameRateRange” (właściwość instancji
CADisplayLink, Core Animation; iOS i iPadOS 15.0 i nowsze), zapisane 4 października 2026 (sekcja Discussion: display link stara się w miarę możliwości wywoływać w obrębie zakresu, system bierze też pod uwagę sprzęt, inne zadania, tryb niskiego zużycia energii, stan termiczny i ustawienia dostępności, a domyślnie zakres równa się maksymalnej częstotliwości odświeżania ekranu), https://developer.apple.com/documentation/quartzcore/cadisplaylink/preferredframeraterange. ↩↩