Rotas em pixel art: conexões de mapa e bairros no iPhone
As três primeiras gerações de Pokémon percorrem uma célula de 16 pixels em 16 quadros, cerca de 3,73 células por segundo, e o colecionador do Kiradex anda 4 tiles por segundo, então uma estrada medida nos jogos antigos se converte para a nossa cidade a um quarto de segundo por tile.1234 A primeira rota de cada jogo ocupa de duas a seis telas do console e não tem treinadores; o primeiro trecho, da porta de casa do jogador até o Centro Pokémon da cidade seguinte, tem 58 células e 15,5 segundos de caminhada em Emerald e 94 células e 25,2 segundos em FireRed, e a volta é mais curta nos dois, 42 e 76 células, por rotas cujos ressaltos estão todos virados para casa.567 Onde a arte muda, Kanto põe um prédio na estrada: 76 das 78 conexões de mapa de Red unem um mesmo tileset, e toda guarita de Red entre dois lugares diferentes une dois.8 O motor de Hoenn copia sete células do mapa vizinho numa margem ao redor do mapa atual em três lados e oito no leste, desenha essas células com os tiles do mapa atual e carrega os tiles secundários e a paleta do próprio vizinho no momento em que você atravessa, sem fade.910 A tela do mapa de Emerald é uma grade de 28 por 15 quadrados; um mapa de parede no andar de cima da casa do jogador na cidadezinha de Littleroot a abre, o PokéNav a leva consigo a partir da cidade de Rustboro, e ela desenha todos os lugares, visitados ou não, exceto dois que dependem de flags da história, enquanto Fly (o golpe que leva o jogador voando até uma cidade) só oferece as cidades cuja flag de visita foi ativada quando você entrou nelas.111213 O Kiradex World hoje é uma única cidade de 40 por 30 sem nada além da cerca.14 Então medi nas descompilações as estradas, as costuras, as guaritas e as telas de mapa do cânone, li Stardew Valley, Animal Crossing e Link’s Awakening como modelos de contraste e transformei os números num briefing para quatro áreas além da praça, uma tela de mapa e um bonde que abre uma parada na primeira vez que você chega.
Resumo
- Uma célula de caminhada custa 16 quadros, mais ou menos um quarto de segundo. Red, Crystal e Emerald andam a 16 quadros por célula e correm ou pedalam a 8, o que, nos 59,7 hertz do hardware, dá 3,73 e 7,47 células por segundo; o Kiradex está configurado para andar 4 tiles por segundo, cerca de 7% mais rápido que os portáteis, e para correr a 6,4 nominais, que um modelo quadro a quadro do código coloca em 6,00 a 60 hertz, cerca de 20% abaixo da corrida deles.1231541617
- Uma rota tem de 2 a 10 telas, e a primeira é curta e a mais gramada. Dezesseis rotas medidas vão de 2,0 (Rota 101 de Emerald) a 10,0 (Rota 32 de Crystal) telas de console ao longo do eixo; as quatro primeiras rotas têm de 14,4% a 22,8% de grama alta na área do mapa, a maior proporção de cada jogo, e nenhum treinador. Nas nove rotas cujas duas pontas se ligam a pé, a travessia mais longa mede de 1,15 a 1,70 vez o lado maior da rota, porque o caminho serpenteia, e a volta para casa de 0,95 a 1,42.5617
- Os ressaltos encurtam o caminho de casa. Nas nove rotas medidas cujas duas pontas se ligam a pé, todas elas com ressaltos, a caminhada em direção à cidade anterior é de 2% a 44% mais curta, e o mínimo de células de grama alta no caminho de volta vai de 0 a 5, contra 4 a 19 no de ida.5618
- As guaritas ficam onde a arte muda, e é nelas que moram as regras. Toda guarita de Red entre dois lugares une dois tilesets; as guaritas guardam uma checagem de insígnia, um guarda com sede e três recompensas por ter 10, 30 e 50 espécies. O motor de Hoenn carrega um tileset novo na costura e fica com apenas 4 prédios de guarita contra os 27 mapas com tileset de guarita de Red.8192010
- Uma costura da Gen 3 desenha sete células do vizinho (oito no leste) e carrega a arte dele na travessia. A margem do buffer é
MAP_OFFSET 7porque “the player has 7 metatiles of view horizontally in either direction” (o jogador vê 7 metatiles na horizontal para cada lado), e o lado leste copiaMAP_OFFSET + 1colunas; a travessia carrega o tileset secundário, a música e o clima do novo mapa e faz deslizar um letreiro com o nome por cerca de 3,2 segundos, sem fade.91021 - A tela do mapa mostra todos os lugares; a viagem rápida mostra onde você já esteve. O mapa de Emerald tem 28 por 15 quadrados, 158 deles ocupados por 54 lugares, e assim que o jogador consegue abri-lo (um mapa de parede no andar de cima de casa, depois o PokéNav) ele desenha todos os lugares, visitados ou não, exceto dois retidos por flags da história; uma cidade só vira destino de Fly quando a flag
FLAG_VISITED_*dela é ativada na entrada, e Red, FireRed, Crystal e Link’s Awakening mantêm o mesmo tipo de registro de visitas.11121322232425 - O que isso dá ao Kiradex. Um briefing para quatro áreas além do Largo (a Rua dos Fichários, o Passeio do Prado, a Beira do Lago e o Bairro da Galeria) com 2,8 vezes a área do Largo, costuras abertas sem fade, um único grafo de caminhada em oito direções para o app e o servidor, uma tela de mapa de 16 por 12, um bonde cujas paradas abrem na primeira visita, achados que são só cosméticos ou notas de missão, e treze testes de aceitação que um script ou uma captura consegue executar.262728
1. As rotas, medidas
Os três posts desta série de 3 de outubro ficaram dentro da cerca. Mundos em pixel art no iPhone definiu o sistema de tiles e a receita do RealityKit, Pessoas em pixel art o colecionador, e Estruturas em pixel art os prédios e as portas. Deles saiu o Kiradex World como uma única cidade: 40 por 30 tiles, a mata desenhada 12 tiles além da cerca, sete prédios cujas portas levam a quartos ou ao salão, e um único tile de chegada.14 Este post trata do que fica além da cerca, e começa onde os anteriores começaram: nas descompilações.
Todo número de Pokémon a seguir foi medido em clones rasos das descompilações do pret em pokered d2704a6, pokecrystal 5beda23, pokeemerald 731ad5b e pokefirered 037335f, por seis pequenos scripts em Python que rodam de novo em cerca de um segundo ou menos cada; as notas indicam o script por trás de cada número.29 A unidade é a célula, um quadrado de caminhada de 16 por 16 pixels: um metatile da Gen 3, ou um quarto de bloco da Gen 1 ou da Gen 2. Uma tela de Game Boy mostra 10 por 9 células (160 por 144 pixels) e uma de Game Boy Advance, 15 por 10 (240 por 160).29 O modelo de caminhada é o mesmo em todos os scripts: um passo custa uma célula; um ressalto só é cruzado na direção dele e a aterrissagem é uma célula adiante, duas células de movimento; em Crystal, um passo não pode atravessar a parede de um lado só de um tile, e um ressalto de canto salta em qualquer um de seus dois sentidos (a seção 2 traz o código); uma costura só conta onde a célula do vizinho que fica de frente pode ser alcançada a pé a partir de uma das portas do vizinho; treinadores e outras pessoas são ignorados, e o surf não é modelado.29
O relógio
As três gerações andam no mesmo ritmo. Em Red, OverworldLoop chama DelayFrame duas vezes por iteração e AdvancePlayerSprite move a visão 2 pixels por iteração durante 8 iterações (wWalkCounter vale 8), então uma célula leva 16 quadros; de bicicleta, AdvancePlayerSprite roda duas vezes por iteração, 8 quadros por célula.1 Os StepVectors de Crystal dão a um passo a pé 8 ticks de 2 pixels e a um passo de bicicleta 4 ticks de 4 pixels, e o mundo externo roda um tick a cada 2 quadros (MaxOverworldDelay: db 2), o que de novo dá 16 quadros por célula a pé e 8 de bicicleta.2 As tabelas de passo de Emerald têm 16 entradas para caminhar (sStep1Funcs), 8 para correr e surfar, 6 para a Acro Bike e as correntezas, 4 para a Mach Bike em velocidade máxima e 2 para o movimento mais rápido; um salto de ressalto (JUMP_DISTANCE_FAR) leva 32 quadros por duas células e sobe 12 pixels no ponto mais alto (sJumpY_High).3
O quadro é a outra metade do relógio. O GBATEK dá o quadro do Game Boy Advance como 280.896 ciclos, “ca. 59.737 Hz”; o Pan Docs dá o do Game Boy como 70.224 pontos “@ 59.7 fps”.1530 A 16 quadros por célula, caminhar é cerca de 3,73 células por segundo e correr cerca de 7,47.17 Os segundos deste post usam 224 hertz divididos por 280.896, ou seja, 59,7275 quadros por segundo; o GBATEK dá 59,737, e a diferença é menor que 0,02%.29
O colecionador do Kiradex anda a tilesPerSecond = 4 e corre a 1,6 vez isso, 6,4 tiles por segundo nominais.4 O número da corrida é a constante, não a velocidade que o código atinge: o post desta série sobre movimento modelou o código quadro a quadro e descobriu que a corrida cobre 6,00 tiles por segundo a 60 hertz e 6,32 a 120, porque cada passo joga fora o avanço que passou do ponto.16 A caminhada é cerca de 7% mais rápida que a dos portáteis; a corrida fica cerca de 20% abaixo da deles a 60 hertz, e 14% abaixo nos 6,4 nominais.17 A caminhada é próxima o bastante para que uma distância medida nas células deles se converta para a nossa a uma taxa fixa: o tempo de uma rota é o número de células vezes 0,27 segundo na caminhada dos portáteis, e o número de tiles vezes 0,25 segundo na nossa.17
Dezesseis rotas
Medi as quatro primeiras rotas de cada jogo: as Rotas 1 a 4 de Red, 29 a 32 de Crystal, 101 a 104 de Emerald e 1 a 4 de FireRed. As células da Gen 3 são lidas de map.bin (bits 0 a 9 o metatile, 10 e 11 a colisão, 12 a 15 a elevação) e o comportamento de cada célula é consultado no metatile_attributes.bin primário ou secundário; os treinadores são os eventos de objeto do mapa cujo trainer_type não é TRAINER_TYPE_NONE.6 Na Gen 1, cada célula é lida pelo tile 8 por 8 do canto inferior esquerdo da célula de 16 por 16, contra a lista de colisão do tileset, o tile de grama $52 e a tabela de ressaltos; na Gen 2, pelos quatro bytes de colisão que cada bloco carrega por quadrante.5
| Jogo | Rota | Tamanho (células) | Telas ao longo do eixo | Caminhável | Grama alta, células (% do mapa) | Células de ressalto / trechos | Treinadores | Travessia mais curta, em cada sentido (células) |
|---|---|---|---|---|---|---|---|---|
| Red | 1 | 20 por 36 | 4,0 | 76,8% | 104 (14,4%) | 42 / 10 | 0 | sul 40, norte 52 |
| Red | 2 | 20 por 72 | 8,0 | 55,9% | 84 (5,8%) | 52 / 14 | 0 | dividida por uma floresta |
| Red | 3 | 70 por 18 | 7,0 | 35,1% | 100 (7,9%) | 36 / 10 | 8 | rumo a Pewter 82, saindo de Pewter 84 |
| Red | 4 | 90 por 18 | 9,0 | 45,0% | 60 (3,7%) | 169 / 27 | 1 | dividida por uma caverna |
| Crystal | 29 | 60 por 18 | 6,0 | 47,7% | 160 (14,8%) | 35 / 13 | 0 | leste 71, oeste 90 |
| Crystal | 30 | 20 por 54 | 6,0 | 47,6% | 140 (13,0%) | 21 / 6 | 3 | sul 57, norte 74 |
| Crystal | 31 | 40 por 18 | 4,0 | 39,3% | 64 (8,9%) | 13 / 5 | 1 | a ponta oeste é uma guarita |
| Crystal | 32 | 20 por 90 | 10,0 | 48,3% | 152 (8,4%) | 6 / 5 | 8 | sul 132, norte 128 |
| Emerald | 101 | 20 por 20 | 2,0 | 59,2% | 91 (22,8%) | 13 / 3 mais 1 de canto | 0 | sul 19, norte 34 |
| Emerald | 102 | 50 por 20 | 3,3 | 48,9% | 143 (14,3%) | 17 / 4 | 4 | leste 55, oeste 62 |
| Emerald | 103 | 80 por 22 | 5,3 | 27,3% | 92 (5,2%) | 24 / 3 | 9 | dividida pelo mar |
| Emerald | 104 | 40 por 80 | 8,0 | 34,0% | 126 (3,9%) | 13 / 4 | 8 | dividida por uma floresta |
| FireRed | 1 | 24 por 40 | 4,0 | 62,3% | 178 (18,5%) | 61 / 10 | 0 | sul 43, norte 58 |
| FireRed | 2 | 24 por 80 | 8,0 | 40,8% | 84 (4,4%) | 44 / 13 | 0 | dividida por uma floresta |
| FireRed | 3 | 84 por 20 | 5,6 | 37,6% | 117 (7,0%) | 42 / 10 | 8 | rumo a Pewter 94, saindo de Pewter 97 |
| FireRed | 4 | 108 por 20 | 7,2 | 42,9% | 84 (3,9%) | 186 / 28 | 1 | dividida por uma caverna |
Fontes da tabela: measure_gen12_routes.py e measure_gen3_routes.py sobre as quatro descompilações.56 A coluna de telas divide o lado maior pela visão do console naquele eixo (10 ou 9 células no Game Boy, 15 ou 10 no Game Boy Advance). A coluna caminhável é a fração de células em que se pode ficar de pé. As células de ressalto são as células de salto nas Gens 1 e 3 e as células de borda na Gen 2. As travessias vão entre células de costura alcançáveis a partir de uma porta, e uma rota dividida é aquela em que não existe, dentro do mapa, nenhuma travessia de costura a costura, porque uma floresta, uma caverna, uma guarita ou o mar fica entre as metades.29
Comprimento das rotas no eixo maior, com a travessia mais curta em cada sentido; desenhado por figures/make_figures.py a partir das saídas dos dois scripts de rotas.
Cinco coisas saem da tabela.
As rotas ocupam de 2 a 10 telas, e a primeira é curta. A Rota 101 de Emerald tem duas telas de Game Boy Advance de altura; a Rota 32 de Crystal, dez telas de Game Boy de altura; a primeira rota de cada jogo, de duas a seis telas.56 Em células, as rotas medidas vão de 20 a 108 no lado maior.6
A travessia mais longa mede de 1,15 a 1,70 vez o lado maior. Nove das dezesseis rotas podem ser percorridas de ponta a ponta. Nessas nove, a travessia mais curta no sentido mais longo, comparada ao lado maior da rota, é 34 sobre 20, 1,70, rumo ao norte na Rota 101 de Emerald; 90 sobre 60, 1,50, na Rota 29 de Crystal; 132 sobre 90, 1,47, na Rota 32 de Crystal; 58 sobre 40, 1,45, na Rota 1 de FireRed; 52 sobre 36, 1,44, na Rota 1 de Red; 74 sobre 54, 1,37, na Rota 30 de Crystal; 62 sobre 50, 1,24, na Rota 102 de Emerald; 84 sobre 70, 1,20, na Rota 3 de Red; e 97 sobre 84, 1,15, na Rota 3 de FireRed.5617 A volta para casa é mais reta, de 0,95 a 1,42 vez o lado maior: 19 sobre 20 na Rota 101 de Emerald, 57 sobre 54 na Rota 30 de Crystal, 43 sobre 40 na Rota 1 de FireRed, 55 sobre 50 na Rota 102 de Emerald, 40 sobre 36 na Rota 1 de Red, 94 sobre 84 na Rota 3 de FireRed, 82 sobre 70 na Rota 3 de Red, 71 sobre 60 na Rota 29 de Crystal, e 128 sobre 90 na Rota 32 de Crystal, cujas paredes de um lado só obrigam a dar a volta mais longa nos dois sentidos.5617 Uma razão abaixo de 1 não é um atalho pelo espaço: uma caminhada de uma célula de costura na primeira fileira até uma na última fileira de um mapa de 20 células leva 19 passos, então uma rota totalmente reta marca 0,95.17 Na minha leitura, o número da ida é o que serve para dimensionar uma rota: a caminhada sinuosa, não o retângulo que a contém.
A grama vai rareando ao longo da jornada. A grama alta cobre de 3,7% a 22,8% do mapa de uma rota. As quatro primeiras rotas, Red 1, Crystal 29, Emerald 101 e FireRed 1, são as mais gramadas entre as quatro de cada jogo, com 14,4%, 14,8%, 22,8% e 18,5%; as segundas rotas vão de 4,4% a 14,3% e as terceiras e quartas, de 3,7% a 8,9%.56 Contando sobre o chão em que se pode pisar, as proporções são maiores e a tendência só se mantém na média: as primeiras rotas têm de 18,8% a 38,4% de grama alta e as outras doze, de 8,2% a 29,2%, e a Rota 3 de Red (22,6%) tem mais grama sob os pés que a Rota 1 de Red (18,8%). Na Rota 101 de Emerald, 91 das 237 células caminháveis são grama alta, 38,4%.5617
Nenhuma primeira rota tem treinador. Red 1, FireRed 1, Emerald 101 e Crystal 29 não têm nenhum; os treinadores começam na segunda ou terceira rota, com 4 na Rota 102 de Emerald, 3 na Rota 30 de Crystal e 8 na Rota 3 de Red e de FireRed.56 O alcance de visão deles nessas rotas vai de 0 a 7 células; os nove treinadores da Rota 103 de Emerald enxergam de 1 a 5 células e os oito da Rota 104, de 0 a 7.6
Uma zona de encontros sorteia mais ou menos um passo em nove, depois de uma breve carência. Emerald nunca testa os quatro primeiros passos depois que o jogador entra num mapa, por uma costura ou por uma porta, nem depois de uma batalha: CheckStandardWildEncounter desconta esses passos enquanto sWildEncounterImmunitySteps < 4 e zera a contagem depois de cada encontro, e todo carregamento de mapa e todo início de batalha também a zeram. Depois disso, cada passo numa célula de encontro é testado: 40% de chance de pular o teste quando o passo leva a um comportamento diferente, e depois Random() % 2880 < rate × 16. As Rotas 101 a 104 usam todas a taxa 20, então o sorteio sem modificação é 320 em 2.880, 11,1% por passo a pé; uma bicicleta, uma flauta, uma Cleanse Tag ou algumas habilidades do Pokémon que vai à frente ajustam esse valor antes.31 FireRed acrescenta um piso e uma rampa: depois de um encontro, e ao entrar num mapa, um período de espera de 8 − rate/10 passos em células de encontro (6 para a taxa 21 das Rotas 1 a 4), em cada um dos quais um sorteio de 5% deixa aquele passo tentar um encontro sem encerrar a espera; depois o sorteio de 60% num comportamento novo; depois rate × 16 em 1.600, 21%, mais um bônus que cresce no valor da taxa a cada sorteio fracassado (encounterRateBuff).32 Leio a carência, o piso e a rampa como formas de manter curtas tanto as secas quanto as enxurradas. O Kiradex não terá batalhas selvagens, então o número importa aqui só como ritmo: passados os primeiros passos, uma primeira rota oferece algo para notar mais ou menos a cada nove passos de grama.
Quanto de um mundo é estrada
| Jogo | Mapas de rota | Células de rota | Mapas de cidade | Células de cidade | Rota para cidade |
|---|---|---|---|---|---|
| Red | 25 | 31.500 | 11 | 11.880 | 2,65 |
| Crystal (Johto e Kanto) | 54 | 49.880 | 23 | 25.380 | 1,97 |
| Emerald (rotas terrestres) | 41 | 87.787 | 16 | 23.700 | 3,70 |
| FireRed (com Sevii) | 57 | 98.451 | 19 | 25.470 | 3,87 |
As estradas ocupam de duas a quatro vezes a área das cidades.33 As 11 rotas marítimas de Emerald acrescentariam outras 45.600 células.33 A razão depende de como um mapa é classificado, e cada jogo classifica de um jeito: Red pelo id e pelo nome do mapa, Crystal pelo ambiente (o ambiente ROUTE dele inclui, por exemplo, a área externa das Ruins of Alph), Emerald e FireRed pelo map_type, sendo que as rotas de FireRed incluem as Sevii Islands e as de Emerald excluem o oceano.33 Na tela do mapa de Emerald, o mesmo mundo se lê como 129 quadrados de rota contra 22 quadrados de cidade, 5,9 para 1, porque uma cidade ocupa um ou dois quadrados não importa o tamanho: dez das 16 cidades ocupam um, e seis ocupam dois.341117
A Rota 1, de três jeitos
Red, FireRed e Crystal desenham a mesma ideia em três resoluções, e a Rota 1 é a comparação mais limpa. A de Red tem 10 por 18 blocos, 20 por 36 células, quatro telas de Game Boy de altura, com 42 células de ressalto em 10 trechos virados para o sul entre mourões de cerca e fileiras de árvores, e 104 células de grama.5 Para checar o modelo de células da Gen 1, renderizei esse mapa a partir do blockset em tamanho dobrado com uma grade de 16 pixels; ele mostra uma faixa de 3 células de terreno aberto do lado de fora da fileira de árvores a oeste que encosta nas duas costuras e não pode ser alcançada pelas portas de nenhuma das duas cidades, e é por isso que as buscas partem das portas dos vizinhos para semear as travessias.5 O modelo da Gen 1 lê um tile 8 por 8 por célula, o do canto inferior esquerdo, e foi checado a olho apenas nesse render; as colisões entre pares de tiles, como os pares de água e terra, não são modeladas.29
A Rota 1 de FireRed tem 24 por 40 células, ainda quatro telas de altura na tela maior, com 61 células de ressalto e 178 células de grama, 18,5% do mapa: o remake manteve o comprimento em telas, aumentou o mapa em 4 células em cada dimensão e acrescentou ressaltos.6 Da porta da frente de casa na cidadezinha de Pallet (Pallet Town) até o Centro da cidade de Viridian (Viridian City) são 94 células, 25 segundos, e no sentido contrário 76.7 A rota de abertura de Crystal, a Rota 29, tem 60 por 18 células, seis telas de Game Boy de largura, 14,8% de grama e nenhum treinador; a travessia do lado da cidadezinha de New Bark até o lado da cidade de Cherrygrove é de 90 células e a volta de 71.5
2. De porta a porta, e o caminho de casa
O comprimento de uma rota é só parte de uma viagem. O que o jogador sente é o trecho: sair de um prédio, atravessar uma cidade, cruzar a rota e a cidade seguinte, entrar no próximo prédio. measure_travel.py busca esse caminho inteiro, sobre pares (mapa, célula), através de costuras, warps e ressaltos, da célula abaixo da primeira porta até a última porta, contando o passo de entrada nela.7
| Jogo | De | Até | Células | Andando | Correndo | Mapas atravessados |
|---|---|---|---|---|---|---|
| Emerald | Littleroot, casa do jogador | Centro de Oldale | 58 | 15,5 s | 7,8 s | cidadezinha, rota, cidadezinha |
| Emerald | Centro de Oldale | Centro de Petalburg | 87 | 23,3 s | 11,7 s | cidadezinha, rota, cidade |
| Emerald | Centro de Petalburg | Centro de Rustboro | 250 | 67,0 s | 33,5 s | cidade, rota, floresta, rota, cidade |
| FireRed | Pallet, casa do jogador | Centro de Viridian | 94 | 25,2 s | 12,6 s | cidadezinha, rota, cidade |
| FireRed | Centro de Viridian | Centro de Pewter | 267 (156 depois de Cut) | 71,5 s (41,8 s) | 35,8 s | pelas duas guaritas da floresta |
| FireRed | Centro de Pewter | Centro da Rota 4 | 150 | 40,2 s | 20,1 s | cidade, rota, rota |
| FireRed | Centro da Rota 4 | Centro de Cerulean | 314 | 84,1 s | 42,3 s | por três andares de caverna, um deles duas vezes |
Os segundos andando são células vezes 16 quadros divididos por 59,7275 hertz. Correndo é uma segunda busca pelo menor número de quadros, 8 por célula, com cada salto de ressalto ainda em 32 quadros, porque o salto é o mesmo salto de 32 quadros em qualquer andamento; dos sete trechos acima, só o da caverna salta um ressalto, uma vez, o que o deixa em 2.528 quadros em vez de 2.512. O número “depois de Cut” é a mesma busca com as cinco árvores de Cut (o golpe de HM que corta arbustos) da Rota 2 removidas, o que abre o caminho leste por ROUTE2_EAST_BUILDING. Fades e batalhas não são contados.7 Duas simplificações da busca pesam mais no trecho da caverna: a elevação da Gen 3 é reduzida a dois casos, alturas iguais ou qualquer um dos lados em 0 ou 15, e um warp dispara quando se pisa nele ao entrar, e não quando se chega nele, então as 314 células pela caverna, cujo caminho passa por 1F, B1F, B2F e de novo B1F, são o número menos certo da tabela.29
De porta a porta, na ida, e na volta onde ela foi medida, com as metas do briefing ao lado do cânone; desenhado por figures/make_figures.py a partir de travel.json.
Um primeiro trecho são de 15 a 25 segundos de caminhada. Da porta de casa ao Centro da cidade seguinte são 58 células, 15,5 segundos, em Emerald e 94 células, 25,2 segundos, em FireRed.7 Os trechos que chegam a um minuto (as 250 células de Emerald, as 267 e as 314 de FireRed) passam por uma floresta ou uma caverna; na minha leitura são masmorras, não estradas, e uma masmorra é um tipo de lugar à parte.
A volta é mais curta. Do Centro de Oldale até a casa do jogador em Littleroot são 42 células contra 58 na ida; de Viridian a Pallet, 76 contra 94; de Petalburg a Oldale, 81 contra 87; de Rustboro a Petalburg, 196 contra 250; de Pewter a Viridian, 254 contra 267.7
Uma HM é um atalho por uma guarita pela qual você já passou. Sem as árvores de Cut da Rota 2, de Viridian a Pewter são 156 células em vez de 267, e o caminho passa pelo prédio leste da Rota 2 em vez da floresta.7
Os três primeiros trechos de Hoenn
Emerald abre com três respostas diferentes à pergunta sobre o que existe entre as cidades, e as medições tornam o design legível.
A Rota 101 é um corredor com uma porta da frente em cada ponta. Tem 20 por 20 células, duas telas de altura, 22,8% de grama alta, 91 das 237 células em que se pode pisar; três trechos de ressalto de quatro células, virados para o sul, a atravessam. Caminhar para o norte a partir de Littleroot leva 34 células e cruza pelo menos 10 células de grama; caminhar para o sul a partir da cidadezinha de Oldale leva 19 e pode evitar a grama por completo saltando os ressaltos. Da porta da frente da casa do jogador ao Centro de Oldale são 58 células, 15,5 segundos andando.6187
A Rota 102 é mais larga e tem os primeiros treinadores. Tem 50 por 20 células, 3,3 telas de largura, 14,3% de grama, 4 treinadores cuja visão é de 2 ou 3 células, um lago de 26 células de água e 17 células de ressalto. A cidade de Petalburg se liga a ela com um deslocamento de −10, então as 20 fileiras da rota ficam de frente para as fileiras 10 a 29 de Petalburg. De Centro a Centro, de Oldale a Petalburg são 87 células, 23,3 segundos, e 81 na volta.67
A Rota 104 é uma rota em duas metades. Tem 40 por 80 células, oito telas de altura, um quarto dela é água, e nenhuma caminhada liga suas três costuras dentro do mapa: a metade sul chega à entrada sul da floresta de Petalburg (Petalburg Woods), a 51 células da costura de Petalburg, e a metade norte à saída norte dela, a 60 células da costura de Rustboro até a mais próxima das duas células da soleira da saída (61 até a outra). Do Centro de Petalburg ao de Rustboro são 250 células por cinco mapas (cidade, rota, floresta, rota, cidade), 67 segundos andando, e 196 na volta.67
O que muda entre as três é o denominador. A primeira rota é uma caminhada de menos de 20 segundos sem treinadores e com um caminho de casa sem grama; a terceira é um minuto de caminhada por uma masmorra. Na minha leitura, o jogo só começa a gastar distância depois que o jogador aprendeu a andar.
Os ressaltos apontam para casa
Ida e volta em cada rota medida cujas duas pontas se ligam a pé, e o mínimo de células de grama em cada sentido; desenhado por figures/make_figures.py a partir das saídas dos scripts de rotas e de grass_paths.txt.
Em toda rota medida cujas duas pontas se ligam a pé, todas as nove com ressaltos, a caminhada em direção à cidade anterior é mais curta. Na Rota 1 de Red são 40 células na volta contra 52 na ida, 23% a menos; na Rota 1 de FireRed, 43 contra 58, 26%; na Rota 101 de Emerald, 19 contra 34, 44%; na Rota 102 de Emerald, 55 contra 62, 11%; na Rota 29 de Crystal, 71 contra 90, 21%; na Rota 30 de Crystal, 57 contra 74, 23%; na Rota 3 de Red, 82 contra 84, na Rota 3 de FireRed, 94 contra 97 e na Rota 32 de Crystal, 128 contra 132, de 2% a 3% cada. As 4 células da Rota 32 vêm de um único salto lateral a partir de um ressalto de canto, o único salto da volta.5617 Os ressaltos das primeiras rotas estão todos virados para o mesmo lado: as 42 células de ressalto em 10 trechos da Rota 1 de Red, as 61 em 10 trechos da Rota 1 de FireRed e as 13 da Rota 101 de Emerald (três trechos de quatro e uma célula de canto) estão todas viradas para o sul, a de canto para o sudeste, que em cada um desses mapas é o caminho de volta para a cidade de partida.56
Os ressaltos também tiram a grama do caminho de casa. Uma segunda busca, que minimiza as células de grama alta atravessadas em vez dos passos, mostra que, rumo ao norte na Rota 1 de Red, é preciso cruzar pelo menos 15 células de grama e, rumo ao sul, só 4, todas na passagem estreita junto a Pallet; na Rota 1 de FireRed são 19 contra 5; na Rota 101 de Emerald, 10 contra 0; na Rota 102 de Emerald, 4 na ida contra 0 na volta.18 O guia da Bulbapedia sobre a Rota 1 de Kanto diz o mesmo em prosa: indo para o sul, os treinadores “can either hop down ledges to completely avoid any contact with wild Pokémon” (podem pular os ressaltos para evitar totalmente qualquer contato com Pokémon selvagens) ou atravessar “the grass patches, the required path for northbound travel” (os trechos de grama, o caminho obrigatório para quem vai para o norte).35 É uma única página de wiki usada uma única vez, como conferência da busca, e a busca concorda com ela, exceto na passagem estreita junto a Pallet: ela tem duas células de largura e quatro fileiras de grama de profundidade, então toda caminhada para o sul no modelo de células cruza ali 4 células de grama, uma por fileira. Os ressaltos levam quem caminha ao redor de toda a outra grama da rota, mas não de absolutamente toda.18
Os números da Gen 2 precisam de uma ressalva cada. A colisão de Crystal são quatro bytes por bloco de 32 pixels, um por quadrante, e os scripts supõem que eles vêm na ordem das linhas (superior esquerdo, superior direito, inferior esquerdo, inferior direito), porque a macro tilecoll não nomeia a ordem.29 Um byte COLL_HOP_* da Gen 2 marca a borda em que o jogador está, e não a célula seguinte, o que probe_gen2_ledges.py resolveu ao encontrar uma célula WALL abaixo de cada uma das 21 células HOP_DOWN da Rota 30; a leitura da borda só foi sondada nas Rotas 29 e 30.529 Crystal também tem paredes de um lado só. Um byte de colisão de COLL_RIGHT_WALL a COLL_UP_LEFT_WALL é terra, mas GetMovementPermissions recusa um passo que saia desse tile pelo lado murado, e um passo que entre nele por esse lado; na Rota 32, a única das quatro que tem alguma (41 células, todas UP_WALL), elas alongam a caminhada mais curta das 110 células em cada sentido que uma busca que as ignora encontra para 132 na ida e 128 na volta. Os ressaltos de canto dela, HOP_DOWN_RIGHT e HOP_DOWN_LEFT, saltam para baixo ou para o lado, conforme o lado para o qual o jogador está virado, depois que o passo comum é recusado, e a volta usa um deles de lado. Red não tem paredes de um lado só: sua única outra regra de movimento, as colisões entre pares de tiles, funciona nos dois sentidos e só está listada para os tilesets de caverna e de floresta, que nenhum desses mapas usa.5 E a busca conta um ressalto como duas células de movimento, o que bate com o salto de 32 quadros da Gen 3 e é suposto para as Gens 1 e 2.293
O que os dados mostram é um resultado, não uma intenção: não encontrei nenhuma declaração dos desenvolvedores de que os ressaltos foram colocados para encurtar o caminho de casa, só que, em toda rota medida, eles encurtam.29 A regra que tiro disso é que um ressalto é um atalho de volta de mão única, nunca uma parede no caminho de ida.
A questão da elevação
Essa descoberta se encaixa mal com o post anterior. O dossiê de estruturas por trás de Estruturas em pixel art recusou os ressaltos de cara, “No ledges to jump, no climbing, no isometric” (nada de ressaltos para pular, nada de escalada, nada de isométrico), e aquele post lista um ressalto de mão única entre as coisas que a build dele não faz.3637 Este dossiê mede os ressaltos como o atalho de volta para casa do cânone. Os dois não estão em conflito quanto aos fatos; discordam sobre se uma cidade de colecionadores precisa de altura para obter o efeito. A decisão cabe ao próximo post do programa, sobre elevação, ressaltos e pontes, que ainda não foi publicado. Até que ela seja tomada lá, o briefing da seção 7 adia os ressaltos para o post sobre elevação e obtém o caminho de casa mais curto de um portão na cerca viva: um portão no Passeio do Prado que só abre do lado do lago, o mesmo atalho de volta de mão única, sem nenhuma altura.26
3. Costuras, guaritas e a tela do mapa
O mundo externo de um Pokémon não é um único mapa grande. São muitos mapas pequenos, cada um com seu tamanho, seus tiles e sua música, unidos borda com borda para que você passe andando de um para o outro sem corte. O jeito como essa união funciona decide quase todo o resto desta seção: onde um prédio precisa ficar na estrada, por que os remakes têm menos deles e o que a tela do mapa pode saber.
Gen 1 e Gen 2: uma faixa copiada numa margem
Uma conexão de Red é uma linha no cabeçalho de um mapa com uma direção, o vizinho e um deslocamento em blocos; a da Rota 1 é connection north, ViridianCity, VIRIDIAN_CITY, -5, e a macro pré-calcula qual faixa de blocos do vizinho é copiada para o buffer do mapa atual.38 O buffer, wOverworldMap, guarda o mapa com uma margem de MAP_BORDER EQU 3 blocos, 6 células, em cada lado; a conexão preenche essa margem com as 3 fileiras ou colunas de blocos mais próximas do vizinho, e CheckMapConnections troca de mapa quando a coordenada do jogador passa de −1 ou da largura ou altura do mapa.39
Como a faixa é copiada como números de bloco e desenhada com o blockset que estiver carregado, dois mapas só podem se encontrar numa costura se compartilharem o tileset, e os dados de Red respeitam isso: das 78 linhas de conexão, 76 unem mapas com o mesmo tileset. As duas exceções são a Rota 22 e a Rota 23, OVERWORLD contra PLATEAU, e os arquivos de cabeçalho marcam as duas linhas com “; unnecessary” (desnecessária).840 Crystal tem 142 linhas de conexão; 138 unem o mesmo tileset (as exceções são a cidade de Goldenrod e a Rota 35, e a Rota 32 e a Rota 33, Johto contra Johto Modern), e 92 ficam dentro de um mesmo grupo de mapas.841
Gen 3: sete células do vizinho (oito no leste), e a arte na travessia
Uma conexão da Gen 3 é uma entrada de map, offset e direction no map.json do mapa. Emerald tem 134 entradas para cima, baixo, esquerda e direita mais 14 de mergulho e emersão, e cada uma das 134 tem uma entrada inversa correspondente com o deslocamento negado.8 O Porymap, o editor de mapas que a comunidade da descompilação usa, descreve o recurso em três frases: “Maps can be connected together so that the player can seamlessly walk between them” (mapas podem ser conectados para que o jogador ande entre eles sem interrupção); “A connection has a direction, offset, and destination map” (uma conexão tem direção, deslocamento e mapa de destino); e “Connections are one-way, which means that you must keep the two connections in sync between the two maps” (as conexões são de mão única, então é preciso manter sincronizadas as duas conexões entre os dois mapas).42
O motor copia o mapa atual para um buffer com MAP_OFFSET 7 células de margem em cada lado (8 no leste, porque o buffer tem a largura do mapa mais MAP_OFFSET_W, 2 × 7 + 1), e o cabeçalho dá o motivo num comentário: “the player has 7 metatiles of view horizontally in either direction” (o jogador vê 7 metatiles na horizontal para cada lado). FillSouthConnection e as funções irmãs copiam 7 fileiras ou colunas do vizinho para essa margem (8 colunas no leste) no deslocamento da conexão, cobrindo só a largura do próprio vizinho (FillNorthConnection começa no deslocamento mais MAP_OFFSET e copia a largura do vizinho onde ela cabe), e o buffer inteiro pode conter no máximo MAX_MAP_DATA_SIZE 10240 células.9 Onde não há conexão, a margem é o padrão de borda 2 por 2 do layout, combinado por OR com MAPGRID_IMPASSABLE para que nunca possa ser pisado (GetBorderBlockAt).9
O que o buffer guarda numa costura, em esquema: um quadrado por célula, dimensionado a partir de MAP_OFFSET, FillNorthConnection e do layout de 20 por 20 da Rota 101 com o layout de 20 de largura de Oldale ao norte com deslocamento 0; desenhado por figures/make_figures.py, sem arte do jogo.
A faixa do vizinho é desenhada com os tilesets do mapa atual (DrawMetatileAt usa os conjuntos primário e secundário do mapa em que você está) até o jogador atravessar. A travessia chama LoadMapFromCameraTransition, que roda o script de transição do novo mapa, carrega só o tileset secundário e a paleta dele, troca a música e o clima e mostra o letreiro com o nome do mapa, sem fade.10 É por isso que nenhum par conectado difere no tileset primário: 0 dos 134 de Emerald e 0 dos 120 de FireRed. 38 das conexões de Emerald e 34 das de FireRed unem tilesets secundários diferentes, e em 24 de cada uma a faixa do vizinho na margem (7 células, 8 no leste, cortada onde sairia do buffer, como o motor a corta) usa só metatiles primários, então ela é desenhada corretamente de qualquer um dos lados.8
Deslocamentos são comuns. 36 das 134 conexões de Emerald e 68 das 120 de FireRed não são zero; a Rota 1 de FireRed fica 12 células para dentro das 48 de largura de Viridian.8 A reciprocidade não é totalmente universal em FireRed: 112 das 120 entradas são recíprocas, e a cidade murada responde por 6 das 8 restantes. A cidade de Saffron (Saffron City) se conecta em mão única às Rotas 5 a 8, enquanto essas rotas não se conectam a Saffron, e sim a um mapa separado, SAFFRON_CITY_CONNECTION; as duas últimas são mapas protótipos de Sevii.8 Leio o arranjo de Saffron como um truque de desenho: a conexão existe para desenhar a muralha da cidade além da borda da rota, e a entrada é por quatro guaritas, cujos guardas em Red mandam o jogador voltar até ganharem algo para beber.819 Quando um lugar precisa parecer contínuo e mesmo assim ter acesso controlado, a Gen 3 desenha o vizinho na margem e põe a porta num prédio.
Atravessar uma costura para um mapa com show_map_name ativado faz o nome do lugar deslizar para dentro. A tarefa do letreiro espera 31 quadros, desliza 40 pixels a 2 pixels por quadro (20 quadros), fica parada até seu temporizador passar de 120 (121 quadros) e desliza para fora (20 quadros): cerca de 190 quadros, 3,2 segundos.21 Contei os estados da tarefa pelos limiares, então cada estado pode durar um quadro a mais ou a menos do que indico.29
Guaritas: onde a arte muda
Red tem 27 mapas com o tileset GATE ou FOREST_GATE: guaritas de dois andares nas Rotas 11, 12, 15, 16 e 18 (10 mapas), guaritas de um andar nas Rotas 2, 5, 6, 7 e 8, a guarita da Rota 22, a guarita da Safari Zone e suas 4 casas de descanso, 4 entradas do Underground Path (passagem subterrânea) e as 2 guaritas da floresta de Viridian (Viridian Forest).8 Toda guarita de Red que une dois lugares diferentes une dois tilesets: OVERWORLD com FOREST (a floresta de Viridian, a Safari Zone), com UNDERGROUND (as quatro entradas da passagem) ou com PLATEAU (Rota 22 com Rota 23), uniões que as conexões de Red quase nunca fazem.8
A Rota 2 é o caso mais claro. Tem 20 por 72 células em Red e 24 por 80 em FireRed e não pode ser percorrida de ponta a ponta: as metades sul e norte só se encontram pela floresta de Viridian, que em Red é desenhada com o tileset FOREST em vez de OVERWORLD e na qual se entra por duas guaritas.58 Em FireRed, do Centro de Viridian ao de Pewter são 267 células pela guarita sul, pela floresta e pela guarita norte.7 Daí saem três leituras, e são leituras dos dados, não declarações dos desenvolvedores.
- A guarita fica onde a arte muda. Uma costura da Gen 1 desenha os blocos do vizinho com o blockset atual, então dois mapas só podem se encontrar numa costura se compartilharem o tileset, o que Red respeita em 76 das 78 conexões. Uma floresta desenhada com um tileset de floresta precisa, portanto, de uma porta, e a guarita é essa porta.388
- A guarita é onde uma regra pode morar. As quatro guaritas de Saffron mandam o jogador voltar até ele entregar uma bebida (
TEXT_ROUTE5GATE_GUARD_GEE_IM_THIRSTY,BIT_GAVE_SAFFRON_GUARDS_DRINK); a guarita da Rota 22 checaBIT_BOULDERBADGE.19 E três guaritas recompensam a coleção: os assistentes do Professor Oak dão um item quando o número de espécies obtidas (CountSetBitssobrewPokedexOwned) chega a 10 na guarita da Rota 2, a 30 no segundo andar da guarita da Rota 11 e a 50 no segundo andar da guarita da Rota 15.20 - A guarita é uma pausa com gente dentro. A guarita da Rota 2 abriga um assistente de Oak e um garoto; a caminhada recomeça depois de um fade, num lugar novo.43
Os remakes se dividem conforme o motor. Crystal tem 25 mapas de ambiente GATE, dos quais 19 unem mapas de grupos de mapas diferentes e 7 unem tilesets diferentes.8 FireRed mantém as guaritas de Kanto: 8 mapas internos levam a dois mapas externos diferentes (o par da floresta de Viridian, as quatro entradas de Saffron, a entrada norte da Rota 22 e a entrada da Safari Zone), e outros 13 têm portas em dois lados separados de um mesmo mapa externo, entre eles as cinco guaritas de rota de dois andares e o prédio leste da Rota 2.8 Hoenn quase as abandona. Em Emerald, só 2 mapas internos levam a dois mapas externos diferentes (o térreo do Mt. Pyre e a entrada da Safari Zone) e 5 têm portas em dois lados de um mesmo mapa, entre eles as duas estações da Cycling Road; as rotas encontram as cidades em costuras abertas.8 Contadas como prédios, Emerald tem 4 guaritas (as duas estações da Cycling Road, a entrada da Safari Zone e o portão da Battle Frontier) contra 14 de FireRed e os 27 mapas com tileset de guarita de Red.8 Minha leitura, e é uma leitura: Hoenn pôde abrir mão das guaritas porque o motor carrega um novo tileset secundário no momento da travessia, então uma rota pode encontrar uma cidade desenhada com outra arte sem um prédio entre elas.10
A tela do mapa e Fly
O mapa da região de Emerald é uma grade de 28 por 15 quadrados (MAP_WIDTH 28, MAP_HEIGHT 15), 420 no total; 158 deles, 37,6%, pertencem a um lugar, divididos entre 54 seções: 34 rotas, 16 cidades e 4 outras. As rotas cobrem 129 quadrados e as cidades, 22.11 Das 213 entradas de region_map_sections.json, 95 têm um retângulo na grade; 49 delas são um único quadrado, a maior tem 4 por 3 (a Rota 124 e sua gêmea submarina), Slateport tem 1 por 2 e Mauville 2 por 1.11 Uma tela de mapa, por essa evidência, é uma grade grosseira de retângulos com nome, e a maioria dos lugares ocupa um quadrado.
Fly é onde a tela encontra a caminhada. O Fly de Emerald exige a sexta insígnia (FIELD_MOVE_FLY contra FLAG_BADGE06_GET na tabela de insígnias) e um tipo de mapa externo (Overworld_MapTypeAllowsTeleportAndFly: rota, cidadezinha, cidade ou rota marítima). No mapa, uma cidade só é MAPSECTYPE_CITY_CANFLY se a flag FLAG_VISITED_* dela estiver ativada, e cada uma das 16 cidades ativa a própria flag no script de transição; o de Oldale diz setflag FLAG_VISITED_OLDALE_TOWN.13
Os outros jogos concordam no formato. O mapa de FireRed tem 22 por 15 quadrados por página, quatro páginas (Kanto e três grupos de Sevii), cada uma em duas camadas, o mundo externo e as masmorras; a camada externa de Kanto preenche 90 quadrados com 38 seções, e Fly exige a terceira insígnia. Um lugar de FireRed conta como visitado quando a flag FLAG_WORLD_MAP_* dele está ativada, o que o script de transição de cada cidade faz na entrada (setworldmapflag FLAG_WORLD_MAP_CELADON_CITY), e Fly só aceita um quadrado visitado.23 O mapa de Crystal posiciona 95 pontos de referência por posição em pixels e oferece 24 pontos de voo, 12 em Johto e 12 em Kanto; o ponto de voo de uma cidade é ativado por um callback quando você entra nela (VioletCityFlypointCallback: setflag ENGINE_FLYPOINT_VIOLET), e Fly checa ENGINE_STORMBADGE.24 O mapa de Red lista 37 entradas externas numa grade de 4 bits (uma marcada como não usada) e 60 entradas internas com posições próprias; entrar em qualquer um dos 11 mapas de cidade ativa o bit daquela cidade em wTownVisitedFlag, com o comentário no código “mark town as visited (for flying)” (marcar a cidade como visitada, para voar), a lista de voo pula as cidades não visitadas, e Fly exige a Thunder Badge e um mapa externo.22
Nenhum dos quatro começa dando ao jogador um mapa para carregar; cada um entrega um durante o jogo. O Town Map de Red e de FireRed é um item da irmã do rival em Pallet (em Red, oferecido quando o jogador já tem a Pokédex); o Map Card de Crystal é um presente em Cherrygrove, a primeira cidade depois de casa; o PokéNav de Emerald vem do prédio da Devon em Rustboro, a terceira cidade depois de casa.442345127 Os mapas de parede abrem a mesma tela mais cedo: Emerald pendura um no andar de cima da casa do jogador e no térreo de todo Centro Pokémon, FireRed nos seus Centros, na escola de Viridian e em algumas casas, e o tileset HOUSE de Red, usado pela casa do rival em Pallet, tem um tile de mapa de parede.122344
Juntando tudo, a regra é consistente em quatro jogos e três gerações. Depois que o jogador tem o mapa, ele desenha todos os lugares da região, visitados ou não; as exceções são lugares tardios retidos pela história ou por um evento: as páginas de Sevii em FireRed até que scripts no Centro Pokémon de One Island ativem as flags delas, e, nessas páginas, Navel Rock e Birth Island, encobertas até o jogador ter estado lá; a Battle Frontier e a Southern Island de Emerald até as flags de ponto de referência delas; e o mapa de Kanto de Crystal até o jogador pisar em Kanto.44451223 A viagem rápida só lista lugares em que você entrou andando, registrados por uma flag ativada na entrada, disponível só ao ar livre e só depois de uma insígnia do meio do jogo: a terceira em Red e FireRed, a sexta em Emerald.13232422
4. Os outros modelos: Stardew Valley, Animal Crossing, Link’s Awakening
Pokémon é uma resposta para a terra entre as cidades. Três outros jogos respondem de outro jeito, e cada diferença é uma escolha que o Kiradex precisa fazer. Os números desta seção vêm das wikis das comunidades dos jogos e, no caso de Link’s Awakening, de um disassembly; não os conferi com o código do jogo, exceto onde uma nota diz isso.29
Stardew Valley: um centro com raios, abertos pelo calendário
Stardew faz fade em toda borda. Nas palavras da 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” (quando você chega à borda de uma área ou entra num prédio e a tela escurece durante a transição, você está passando de um mapa para outro). Um warp é uma propriedade do mapa cujo valor a wiki dá como Warp [ <int fromX> <int fromY> <string toArea> <int toX> <int toY> ]+, com o exemplo “6 20 Mountain 76 9”.46
O vale é um grafo pequeno em torno de um único centro. A cidadezinha de Pelican (Pelican Town) se liga ao ponto de ônibus (Bus Stop) e à fazenda (Farm) a noroeste, à floresta Cindersap (Cindersap Forest) a sudoeste, à praia (The Beach) ao sul e à montanha (The Mountain) ao norte.47 O ponto de ônibus “connects the Farm to the west with Pelican Town to the east” (liga a fazenda, a oeste, a Pelican Town, a leste) e dá acesso à parte de baixo da mata dos fundos (Backwoods) pela estrada a oeste.48 A floresta 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” (tem saídas ao norte para a fazenda, a leste para Pelican Town, ao sul para os esgotos e a noroeste para o bosque secreto).49 A mata dos fundos “consists of two disconnected sections” (consiste em duas seções desconectadas), um caminho de cima que liga a fazenda à montanha e uma seção de baixo à qual se chega pela estrada do ponto de ônibus.50 O quadro de locais dessas páginas lista 26 lugares, da mata dos fundos ao pântano da bruxa (Witch’s Swamp), pela minha contagem.51
Os raios abrem por data e por feito. A montanha começa com “only two exits: to the south leading to Pelican Town, and to the west leading to the Backwoods” (só duas saídas: ao sul, para Pelican Town, e a oeste, para a mata dos fundos); as minas (Mines) abrem no dia 5 da primavera, a ferrovia (Railroad) depois de um terremoto no dia 3 do verão, e a ponte da pedreira (Quarry) com os pacotes da sala de artesanato (Crafts Room) ou 25.000 g.52 O deserto (The Desert) exige consertar o ônibus, com os pacotes do cofre (Vault) ou 40.000 g; o bosque secreto (Secret Woods) exige tirar um tronco com um machado de aço ou melhor; as poças de maré da praia exigem uma ponte de 300 de madeira.53 A wiki dá a velocidade base do jogador como 2 andando, 5 correndo e 6,6 a cavalo, sem unidades, e eu não abri o código do jogo para descobri-las.54
Minha leitura: Pokémon libera uma área por uma habilidade que o jogador carrega, uma insígnia ou uma HM. Stardew a libera por algo que a comunidade fez, um pacote, uma ponte ou um terremoto numa data. O segundo tipo é o que uma cidade compartilhada de colecionadores pode usar sem fazer ninguém se sentir barrado pelo próprio nível.
Animal Crossing: a grade de acres e o trem
O Animal Crossing do GameCube monta a cidade com acres. “Acres are grid elements measuring 16x16 spaces” (acres são elementos de uma grade que medem 16 por 16 espaços); a cidade tem “five acres across by six down” (cinco acres de largura por seis de altura), com a estação de trem “always located in Acre A-3” (sempre no acre A-3), e o mapa rotula as colunas de 1 a 5 e as fileiras de A a F.55 Isso dá 80 por 96 espaços ao todo.17 Os jogos seguintes mudaram a grade: Wild World tem 4 por 4 acres, City Folk 5 por 5, New Leaf 5 por 4, New Horizons 7 por 6, 42 acres.55
O acre também é uma regra de surgimento. “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” (toda vez que o jogador entra num acre, exceto ao sair de casa logo depois de carregar o jogo, um peixe e um inseto surgem nos pontos programados nos dados do acre), e eles somem quando o jogador se afasta seis espaços daquele acre.55 O mapa da cidade chega cedo, pelas mãos de Tom Nook durante o trabalho de meio período; ele “is organized in a grid, with each square representing an acre” (é organizado numa grade, em que cada quadrado representa um acre) e mostra o mar, os rios, os prédios e as casas, não as árvores, os itens nem os moradores.56
O trem é a única forma de ir a outra cidade no jogo do GameCube, por meio do cartão de memória, e “The train ride takes a few minutes” (a viagem de trem leva alguns minutos); a estação “is located at the top of the player’s town” (fica no alto da cidade do jogador), e um jogo novo começa com o jogador chegando ali.57
Minha leitura: os acres tornam uma cidade legível, um mapa de quadrados com nome, e dão uma regra de surgimento que recompensa circular sem dados rolados a cada passo. O trem transforma a viagem entre mundos numa cena, e não numa costura.
Link’s Awakening: o mundo cortado em telas
Link’s Awakening DX adota a abordagem oposta à rolagem contínua de Pokémon. Na documentação do disassembly zladx, o jogo “takes place in non-scrollable screen-wide rooms” (acontece em salas da largura da tela que não rolam), e “On the Overworld, rooms are stored as they are laid out during the game, on a 16x16 grid of rooms” (no mundo externo, as salas são armazenadas como aparecem no jogo, numa grade de 16 por 16 salas).58 O mapa do mundo externo tem 512 bytes de ponteiros de sala de dois bytes, 256 salas, e a sobreposição de tiles de uma sala é “a straight forward array of 10x8 tile numbers” (um array simples de 10 por 8 números de tile).59 “Overworld rooms are grouped in 2x2 sections (i.e. 4 rooms). Each section has a tileset ID” (as salas do mundo externo são agrupadas em seções de 2 por 2, ou seja, 4 salas, e cada seção tem um ID de tileset), e os 32 tiles da seção são trocados durante a transição para uma sala que precisa deles.58 Cada sala do mundo externo tem um byte de status em wOverworldRoomStatus, 256 bytes, com OW_ROOM_STATUS_VISITED EQU $80 ao lado de bits para portas, mudanças e corujas; li o bit nas constantes do disassembly e não rastreei se a tela do mapa desenha só as salas que o têm.25
Minha leitura: Pokémon rola um mundo contínuo e o nomeia por seções; Link’s Awakening corta o mundo em telas iguais e registra quais você já viu. Num celular cuja visão muda conforme o aparelho, 10,3 tiles de largura num iPhone 18 Pro Max em retrato e 29,7 num iPhone Duo aberto, só o modelo de rolagem funciona sem pôr tarjas em cada sala, e é por isso que o briefing o usa.60
5. O ofício, em regras com números
Estas são as regras que as medições sustentam, cada uma com sua origem. Onde uma regra transforma um fato medido numa recomendação, a recomendação é minha e a regra diz isso pelo verbo.
| Elemento | Regra | Fonte |
|---|---|---|
| Ritmo | Uma célula de caminhada custa 16 quadros, cerca de 0,27 segundo; o tile do Kiradex custa 0,25. Dimensione toda viagem em segundos, na caminhada do próprio jogo. | código de passo de Red, Crystal e Emerald; GBATEK; PlazaRig.swift |
| Comprimento da rota | De 2 a 10 telas ao longo do eixo de deslocamento; a primeira rota de um jogo, de 2 a 6. | dezesseis rotas medidas |
| Sinuosidade | A travessia mais longa mede de 1,15 a 1,70 vez o lado maior da rota, a volta para casa de 0,95 a 1,42. Dimensione uma rota pelo caminho, não pelo retângulo que a contém. | travessias mais curtas sobre os lados maiores nas nove rotas cujas pontas se ligam a pé |
| Primeiro trecho | De 15 a 25 segundos de uma porta até a porta principal da cidade seguinte. Um trecho de um minuto é uma masmorra, não uma estrada. | Emerald 58 células, FireRed 94; 250, 267 e 314 por uma floresta ou uma caverna |
| Proporção | A estrada ocupa de 2 a 4 vezes a área da cidade; na tela do mapa, 5,9 para 1, porque uma cidade ocupa um ou dois quadrados. | Crystal 1,97, Red 2,65, Emerald 3,70, FireRed 3,87; o mapa de Emerald |
| Densidade | O terreno de encontros ocupa de 14% a 23% do mapa de uma primeira rota e cai para 4% a 9% na terceira e na quarta; sobre o chão caminhável, uma primeira rota tem de 19% a 38%. Uma primeira rota não tem treinadores. | a tabela de rotas; grama sobre células caminháveis |
| Cadência | Algo para notar mais ou menos a cada nove passos em terreno de encontros, depois de alguns passos de carência na chegada; mantenha curtas as secas e as enxurradas com um piso e uma rampa. | a imunidade de quatro passos de Emerald, depois taxa 20, 11,1% sem modificação; a espera e o bônus de FireRed |
| O caminho de casa | Mais curto que o de ida, de 2% a 44% nas nove rotas com ressaltos cujas pontas se ligam a pé, com 0 a 5 células de grama contra 4 a 19. Um ressalto é um atalho de volta de mão única, nunca uma parede no caminho de ida. | nove rotas; a busca de menos grama |
| Costuras | Deixe duas áreas se encontrarem numa costura aberta só onde ambas desenham a borda com o mesmo conjunto de chão; ponha um prédio com duas portas onde a arte muda. | Red 76 de 78, Crystal 138 de 142, Gen 3 0 de 134 e 0 de 120 com conjuntos primários diferentes; toda guarita de Red entre dois lugares |
| Faixa do vizinho | Desenhe pelo menos meia visão do vizinho além da borda. | as 7 células da Gen 3 (8 no leste) para uma tela de 15 células; as 6 células da Gen 1 para 10 |
| Conexões | Deslocamentos são normais; toda conexão tem uma inversa com o deslocamento negado, e uma conexão de um lado só é um truque de desenho deliberado. | Emerald 36 de 134 com deslocamento, 134 de 134 recíprocas; Saffron em FireRed |
| Letreiro com o nome | Nomeie o lugar na entrada por cerca de três segundos. | o letreiro de Emerald, cerca de 190 quadros |
| Guaritas | Uma guarita é onde moram uma regra e uma recompensa: uma checagem de marco, um guarda, um presente ao atingir uma contagem. | a checagem de insígnia de Red, o guarda com sede e os presentes a 10, 30 e 50 espécies obtidas |
| Tela do mapa | Uma grade grosseira de retângulos com nome; a maioria dos lugares, um quadrado, o maior, alguns. | Emerald 28 por 15, 49 de 95 retângulos com um único quadrado, o maior de 4 por 3; os 5 por 6 acres de Animal Crossing |
| Viagem rápida | Depois que o jogador tem o mapa, ele mostra todos os lugares, visitados ou não, exceto alguns que flags da história ou de eventos retêm; a viagem rápida mostra só onde você já esteve, marcado por uma flag na entrada, e só ao ar livre. | o Town Map, o Map Card, o PokéNav e os mapas de parede; wTownVisitedFlag de Red, os pontos de voo de Crystal, FLAG_VISITED_* de Emerald, FLAG_WORLD_MAP_* de FireRed; um registro de visitas não rastreado até a tela do mapa: o bit OW_ROOM_STATUS_VISITED de Link’s Awakening |
| Desbloqueios | As áreas abrem por feito e por data, além de por habilidade. | as minas, a ferrovia, a pedreira, o deserto e o bosque secreto de Stardew; as 267 células de Cut que viram 156 |
| Transições | Costura dentro de um mesmo mundo externo; fade nas portas e na borda do mundo. | a costura de Pokémon, o fade de Stardew, o empurrão de tela de Link’s Awakening |
| Orientação | Faça uma rota correr ao longo do eixo maior do aparelho; uma rota que cabe inteira numa visão não tem mais nada a revelar. | as contagens de tiles de 3 de outubro; os 20 por 20 da Rota 101 de Emerald contra os 29,7 por 20,9 de um Duo aberto |
Fontes da tabela: o código de passo e o tempo de quadro da seção 1;12315 a velocidade de caminhada do Kiradex;4 os scripts de rotas, de viagens, de grama e de conexões;567188 o código de encontros;3132 o código do buffer, da travessia e do letreiro de Emerald;91021 os scripts das guaritas;1920 as telas de mapa, como o jogador as recebe, e Fly;1112132345244422 Stardew Valley, Animal Crossing e Link’s Awakening;465253555825 as contagens de tiles por aparelho do primeiro post desta série.60
Três dessas regras merecem mais uma frase.
A regra das costuras está enunciada como uma regra sobre arte, não sobre motores. O Game Boy desenhava a faixa de um vizinho com o blockset do mapa atual, então simplesmente não conseguia mostrar um vizinho com outro tileset; o Game Boy Advance desenha a faixa com os tilesets do mapa atual até você atravessar, e, na minha leitura, é por isso que suas costuras se limitam a um único conjunto primário e, na maioria, a metatiles primários.38108 Leio as duas coisas como limites da memória de tiles, que um celular desenhando um único atlas não compartilha. O que sobrevive é o motivo visual: um caminho que muda de material numa linha reta que corta a tela se lê como uma costura, quer o motor precisasse dela, quer não. É por isso que a regra mantém a primeira metade (encontrar-se abertamente onde o chão continua) e a segunda (um prédio onde a arte muda) mesmo quando nada obriga a isso.
A regra da viagem rápida é a que mais vale copiar exatamente. Todo jogo de Pokémon medido aqui entrega o mapa cedo no jogo, desenha nele todos os lugares, visitados ou não, exceto alguns lugares tardios que flags da história ou de eventos retêm, e só controla o acesso ao atalho; todos eles fazem o atalho ser conquistado por ter ido andando a algum lugar, e não pagando.44451213232224 Para um app de coleção cujo XP vem só de cartas escaneadas no mundo real, a flag de visita é a moeda certa, porque custa uma caminhada e nada mais.27
A regra da orientação vem do celular, não do cânone. Um Pro Max em retrato vê 10,3 por 22,4 tiles na escala do Kiradex e um iPhone Duo aberto, 29,7 por 20,9, então uma rota que corre de norte a sul mostra 22 tiles do seu comprimento de uma vez no celular comum, cerca de 11 à frente de um colecionador que a câmera mantém centralizado, enquanto uma que corre de leste a oeste mostra 30 de uma vez, cerca de 15 à frente, só no Duo aberto.602717 A Rota 101 de Emerald, de 20 por 20, caberia inteira numa única visão do Duo aberto, o que quer dizer que uma rota tão curta não tem mais nada a revelar ali.617
6. O jeito Apple: visões, costuras, salas e um mapa
O motor por baixo do Kiradex World é o que o primeiro post apresentou: uma cena do RealityKit usada como renderizador 2D, uma câmera ortográfica com um número inteiro de pixels do aparelho por texel, o chão como uma única malha MeshDescriptor desenhada numa só chamada, todo material um UnlitMaterial com limiar de opacidade, e o motion blur e o tone mapping do RealityView desligados.60 O post de estruturas acrescentou objetos ordenados por profundidade numa segunda malha, warps como dados e andares trocados no lugar dando ao palco uma nova identidade, .id(floor.name), para que o SwiftUI desmonte um RealityView e monte o seguinte.37 As áreas além da cerca precisam de mais três coisas desse motor: uma visão do vizinho do outro lado de uma costura, um jeito de trocar de sala no servidor sem corte, e uma tela de mapa. Nada disso foi construído ainda, e nada nesta seção foi medido num celular; é o plano em que o briefing se apoia, com cada custo nomeado e marcado como não medido.
O que um celular vê
As contagens de tiles vêm da tabela do primeiro post, calculada a partir das páginas de especificações da Apple e dos perfis do simulador do Xcode 27 nas escalas inteiras do Kiradex.60
| Aparelho e orientação | Pixels por texel | Tiles visíveis (largura por altura) | Meia visão |
|---|---|---|---|
| iPhone 18 Pro Max, retrato | 8 | 10,3 por 22,4 | 6 de largura, 12 de altura |
| iPhone Duo, tela externa, retrato | 6 | 14,6 por 21,2 | 8 de largura, 11 de altura |
| iPhone Duo, tela interna, aberto | 6 | 29,7 por 20,9 | 15 de largura, 11 de altura |
A última coluna é metade da visão arredondada para cima, a faixa do vizinho que a regra das costuras pede.17 A Apple informa a tela interna do iPhone Duo como 1878 por 2670 pixels a 430 pixels por polegada e a externa como 1398 por 2034 a 460.61 As contagens de tiles da tela interna não saem desses pixels do painel: saem do framebuffer lógico do simulador, de 2007 por 2853 na escala 3,0 (2853 ÷ 96 dá 29,7 e 2007 ÷ 96 dá 20,9), que, como o primeiro post explica, é reduzido por um fator de cerca de 0,936 até o vidro, então no hardware o mesmo número de tiles deve preencher o painel, a cerca de 5,6 pixels de painel por texel, se o compositor reduzir a imagem como o primeiro post espera; isso não foi verificado em hardware, e o primeiro passo do primeiro post é registrar nativeScale num aparelho.6017 As Human Interface Guidelines pedem que os jogos “look good and behave well at various aspect ratios” (fiquem bonitos e funcionem bem em várias proporções de tela), e o primeiro post leu isso como um argumento para mostrar mais mundo em vez de tarjas, que é o que a praça faz.6260
Duas coisas decorrem disso para as áreas. Com a câmera seguindo o colecionador, a visão à frente é cerca de metade da visão.27 Uma rota que corre de norte a sul é a que todo celular mostra bem: 22 tiles dela de uma vez num Pro Max em retrato, cerca de 11 à frente, e 21 de uma vez no Duo aberto, cerca de 10 à frente. Uma rota que corre de leste a oeste mostra 30 tiles de uma vez no Duo aberto, cerca de 15 à frente, e só 10 num Pro Max em retrato, cerca de 5 à frente, então o lugar dela é onde o destino está perto.6017 É por isso que a caminhada longa do briefing, o Passeio do Prado, corre de norte a sul, e por isso a Rua dos Fichários, a área que mais nitidamente corre de leste a oeste (44 por 14, mais de três vezes mais larga que alta), é uma rua de vitrines que se vê quase inteira de qualquer ponto no Duo aberto. A Beira do Lago (36 por 20) e o Bairro da Galeria (30 por 20) também são mais largos que altos, mas no briefing são lugares para parar, uma margem e um bairro de museus, não caminhos para outro lugar.2617
Uma costura no RealityKit
A troca de andares do post de estruturas é a ferramenta errada para uma costura. Desmontar um RealityView e montar o seguinte exige um fade para esconder isso, e as portas do app ainda não têm um: hoje o lugar muda 220 milissegundos depois do passo sobre uma porta, uma mudança de andar troca o palco sem fade, e o post desta série sobre movimento propõe o véu que cobriria as duas coisas. Uma costura, por definição, não tem fade.376316 Então o plano para uma costura mantém uma única cena. Quando o colecionador chega a meia visão de uma borda que tem uma conexão, o palco constrói o chão do vizinho como uma segunda malha, a partir do mesmo tipo de MeshDescriptor da primeira, posicionada no deslocamento da conexão em unidades do mundo, e acrescenta os objetos do vizinho nas profundidades deles. Quando os pés do colecionador cruzam a borda, o palco muda de base: o vizinho passa a ser a área atual, a anterior passa a ser a faixa de trás, e a câmera, que hoje segue o jogador limitada ao mapa, passa a ser limitada à união das duas enquanto ambas estiverem carregadas.2726
Três fatos do motor fazem isso sair barato no papel. O chão é uma malha e uma chamada de desenho por área, então um vizinho acrescenta uma chamada de desenho para o chão e outra para os objetos.6037 Todo pixel é recortado e grava profundidade, então as árvores de um vizinho se ordenam em relação ao colecionador pela mesma regra de profundidade das da área atual, sem ordenação nova.37 E a forja já exporta uma área inteira como letras, chão com autotile, objetos e warps, então um vizinho é um segundo arquivo do mesmo tipo; o briefing acrescenta a ele uma lista connections.1426 O que nada disso me diz é quanto custa construir a segunda malha no momento em que ela é necessária, ou se construí-la dentro de um quadro causa um engasgo; isso não foi medido. Por isso o teste 6 do briefing tem duas metades, e as duas cobrem toda a aproximação, de antes de a malha do vizinho ser construída até o fim da travessia: um log de tempo por quadro, que pega um travamento da thread principal, e uma inspeção de cada quadro capturado, que pega um quadro preto. Um teste por amostragem não serviria: um quadro preto entre sessenta por segundo não precisa alterar o ritmo dos callbacks, e uma amostra a cada 100 milissegundos vê um quadro em cada seis a 60 hertz.17 A metade de tempo e a regra de todo quadro são acréscimos meus ao teste do dossiê, que amostrava o brilho.
O autotile é a única coisa que a regra do GBA não cobre. A Gen 3 mantinha as costuras sobre chão compartilhado porque a faixa do vizinho era desenhada com os tiles do mapa atual.108 O Kiradex desenha todas as áreas com uma única paleta de atlas, então esse limite não se aplica, mas os autotiles do tipo blob na borda de uma área são calculados a partir das letras da própria área; se a forja não olhar para o outro lado da costura, um caminho que a atravessa termina numa borda dos dois lados. Por isso o briefing faz a forja calcular as máscaras de borda através de cada conexão.26
Salas, presença e a reconexão
A praça do Kiradex é uma sala no servidor: salas de até uns 40 jogadores, divididas por região, em FastAPI e WebSockets.27 Uma área além da cerca é, naturalmente, outra sala, o que traz o problema que um portátil de um jogador só nunca teve: as pessoas do outro lado da costura. O plano é que o cliente assine os caminhantes da sala vizinha quando começa a desenhar a faixa dessa sala, para que as pessoas na Rua dos Fichários fiquem visíveis da borda do Largo, e troque a própria sala na travessia, para que quem caminha nunca pare.26 As portas e o bonde ganham um fade, o véu que o briefing do post de movimento acrescenta às portas, e esse fade cobre a reconexão, como o dossiê de estruturas já propunha para os interiores.1626 A correção do primeiro post para uma visão preta vale para esse fade: animar a opacidade da view do SwiftUI que contém o RealityView a deixava sem pintura, então o fade é um véu desenhado por cima.60
O servidor precisa do mesmo mapa que o cliente desenha. Hoje server/app/plaza.json traz as letras da cidade para que o servidor possa validar uma caminhada; o briefing faz a cópia de cada área trazer suas letras e suas conexões, para que uma caminhada que atravessa uma costura seja validada dos dois lados.6026 Quanto custa uma troca de sala numa rede real, e se assinar uma segunda sala dobra a taxa de mensagens da praça perto de uma costura, não foi medido.
O letreiro com o nome, o mapa e o bonde em SwiftUI
O nome da área pertence ao SwiftUI, não à camada de pixels. O primeiro post descobriu que uma fonte de pixels de cinco texels nas escalas do Kiradex fica em 13,3 ou 10 pontos, a segunda abaixo do mínimo de 11 pontos das Human Interface Guidelines, e passou o texto dos diálogos para o SwiftUI em escala de interface; um letreiro com o nome é o mesmo tipo de texto.60 O tempo dele vem de Emerald: cerca de três segundos na tela.21
A tela do mapa é uma view do SwiftUI sobre um modelo pequeno, uma grade de retângulos com nome, a área atual e o conjunto de áreas visitadas. No Duo aberto ela fica ao lado do mundo como um painel, do jeito que o plano do mundo põe o cartão de perfil do colecionador ao lado da praça (“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”, a praça na tela interna aberta é a melhor versão disso: visão ampla e seu cartão de perfil ao lado do mundo quando você toca em alguém); num celular, é uma sheet.27 O bonde é um warp a partir do mapa: fade de saída, troca de sala, fade de entrada na parada de destino.
O conjunto de áreas visitadas precisa viajar com o colecionador. A página de jogos das Human Interface Guidelines diz “Let players pick up their game on any of their devices” (deixe os jogadores retomarem o jogo em qualquer um dos seus aparelhos), para que as pessoas possam “start back up exactly where they left off on a different device” (recomeçar exatamente de onde pararam em outro aparelho).62 Uma parada de bonde aberta no celular deveria estar aberta no iPad, então o conjunto de áreas visitadas fica com o perfil do colecionador no servidor, e não no armazenamento local do app.26 Isso amplia a seção 3 do plano do mundo, que diz “Our server holds only the public profile card and the economy” (nosso servidor guarda só o cartão de perfil público e a economia); eu acrescentaria o conjunto de áreas visitadas como mais um campo ao lado deles, limitado a uma lista de quais das cinco áreas um colecionador já pisou, sem localização, sem texto e sem horário da visita, com a mesma chave que o resto, o id de jogador do Game Center; a revisão de privacidade que o plano pede teria de cobri-lo.2726
O que custa, e o que não foi medido
Nada nesta seção foi cronometrado. Os custos não medidos são: construir as malhas de chão e de objetos de um vizinho no momento em que o colecionador se aproxima de uma borda; desenhar as malhas de duas áreas enquanto as duas estão carregadas; assinar uma segunda sala perto de uma costura; e a troca de sala numa travessia. A regra de captura do primeiro post decide como eles serão medidos: no simulador do iPhone Duo, os quadros do RealityKit só são fiéis quando capturados de dentro do bundle de testes (XCUIScreen.screens[1]), não a partir do host.60 O teste 6 do briefing usa exatamente essa captura para a visão do vizinho antes da costura, e roda sua inspeção de cada quadro e seu log de tempo de quadro, lido dos callbacks de CADisplayLink, numa build para aparelho em vez do simulador: num iPhone Duo aberto assim que houver um à mão, e até lá num iPhone 18 Pro Max, porque nenhum iPhone Duo está pareado com o meu Mac enquanto escrevo.64 Nenhum método de captura demonstrou ainda gravar todos os quadros exibidos; a correspondência de contagens do teste, os quadros da gravação contra os callbacks do log de tempo, decide se algum grava.
7. O briefing: o que o Kiradex constrói e os testes que precisa passar
Síntese do autor. O que vem a seguir é a minha proposta, derivada das seções 1 a 6 e ajustada ao plano do mundo no repositório do Kiradex, à sua seção 4 (“The game”, o jogo) e à sua seção 7 (“Order of work”, a ordem de trabalho).2726 Ela não nomeia nenhum lugar, criatura ou marca de nenhum jogo de Pokémon; onde toma emprestada uma mecânica, cita a regra da seção 5, não o vocabulário do jogo de origem. Todo tamanho está em tiles de 16 pixels, e o comprimento de uma caminhada é o custo dela na própria busca de caminhos do app, em que um passo na diagonal conta √2 tiles (item 3).28 Todo tempo é esse comprimento aos 4 tiles por segundo nominais da caminhada, um número para comparar com o cânone, não um número medido; o briefing do post de movimento andaria 16 ticks por tile reto a 60 hertz, 3,75 tiles por segundo, e arredondaria uma diagonal para cima, para 23 ticks, e com isso cada tempo aqui cresceria um quinze avos nos passos retos e cerca de um doze avos nas diagonais.41617
O loop do Kiradex acontece no mundo real. O XP vem só de cartas escaneadas e registradas: “XP comes only from the real world, which is the point of the app” (o XP vem só do mundo real, e esse é o sentido do app).27 Então caminhar é um custo, não um conteúdo, e toda área precisa dar a quem caminha algo para fazer com a coleção: mostrá-la, trocar em torno dela, ganhar um cosmético por ela ou ser mandado de volta ao scanner. Nada que se encontra ou se ganha caminhando é jamais uma carta ou XP, e nada no mundo é vendido por dinheiro, a não ser pela loja que o plano do mundo já define.27
1. Cinco áreas: o Largo e quatro além dele
| Área | O que é | Tamanho (tiles) | Ligada a | Papel no loop de coleção |
|---|---|---|---|---|
| O Largo (existe) | A cidade: casas, salão, quiosque, terraço da fonte, pátio de chegada | 40 por 30 | o centro | Chegar, exibir a carta favorita, entrar nos quartos e no salão |
| A Rua dos Fichários | Uma rua de comércio: a loja de cartas do kit de estruturas, o posto de trocas, um mural de desejos e, mais tarde, uma fileira de seis barracas de mercado | 44 por 14 | o Largo, leste, costura aberta | Gastar moedas em cosméticos; ver o que os colecionadores da cidade pedem para ver; a tela de trocas; as barracas do mercado quando essa fase chegar |
| O Passeio do Prado | Um caminho de parque por um prado e pequenos bosques, com canteiros de flores onde aparecem achados, e uma alameda de volta para casa ladeada por cerca viva cujo portão só abre do lado do lago | 24 por 60, eixo maior de norte a sul | o Largo, norte, costura aberta | Achados (item 6); uma caminhada com amigos; o caminho até o lago |
| A Beira do Lago | O fim do passeio: uma margem, um píer, bancos, uma casa de barcos | 36 por 20 | o Passeio do Prado, norte, costura aberta | O lugar tranquilo para sentar e mostrar uma carta ao pôr do sol; o ponto de encontro semanal |
| O Bairro da Galeria | Um bairro de pedra: o museu e a galeria de vitrines dos colecionadores | 30 por 20, mais uma casa do arco de 8 por 6 | o Largo, oeste, pelo arco (duas portas) | Coleções completadas em todo o servidor enchem o museu; o guardião dos marcos no arco (item 7) |
A área total além do Largo é 616 mais 1.440 mais 720 mais 600, 3.376 tiles, 2,8 vezes os 1.200 do Largo, dentro da faixa do cânone de 1,97 a 3,87 (seção 5, Proporção).1733 O Bairro da Galeria fica atrás de um prédio porque é desenhado em pedra, com outro conjunto de chão (seção 5, Costuras). As outras três compartilham o gramado e o calçamento do Largo, então se ligam por costuras abertas, três ao todo: a Rua dos Fichários à borda leste do Largo, o Passeio do Prado à borda norte, e a Beira do Lago à borda norte do Passeio do Prado.26 O mural de desejos da Rua dos Fichários mostra o que os próprios colecionadores da cidade pedem para ver, avaliado contra as cartas reais pelo código que já faz isso (Kiradex/World/Wants.swift); as barracas dela esperam pelo mercado, que o plano do mundo encaminha pelo eBay numa fase posterior.6527
As áreas propostas, desenhadas na grade da tela do mapa; só um esquema, desenhado por figures/make_figures.py, que confere se cada retângulo tem o tamanho da sua área dividido por 10, arredondado.
Testes: 4 (proporção) e 5 (orientação).
2. Distâncias e tempos
| Trajeto | Meta (tiles) | A 4 tiles por segundo | Referência do cânone |
|---|---|---|---|
| Do pátio de chegada à porta da loja de cartas | no máximo 60 | no máximo 15 s | seção 5, Primeiro trecho: de 15 a 25 s |
| Do pátio de chegada ao píer da Beira do Lago, na ida | de 110 a 120 | de 28 a 30 s | Mais longo que um primeiro trecho (15 a 25 s), abaixo dos trechos de estrada do cânone, de até 40 s, e das masmorras de um minuto; Sinuosidade, de 1,15 a 1,70 vez o lado maior na ida |
| Do píer da Beira do Lago ao pátio de chegada, na volta, pelo portão da cerca viva | no máximo 0,8 vez a caminhada de ida | no máximo 24 s | O caminho de casa é mais curto |
| Do pátio de chegada, pelo arco, até a porta do museu | no máximo 70 | no máximo 18 s | Primeiro trecho |
| De qualquer área para qualquer área visitada, de bonde | um fade | cerca de 1 s mais a reconexão | Viagem rápida; Transições |
Os 60 tiles de comprimento do Passeio do Prado serpenteiam em 78 a 90 tiles de caminho, um fator de 1,3 a 1,5 (seção 5, Sinuosidade).26 Um caminho sozinho não consegue tornar a volta mais curta: numa grade em que todo passo pode ser dado nos dois sentidos, a caminhada mais curta da chegada ao píer é a caminhada mais curta de volta, e um caminho mais reto seria usado na ida também. A economia precisa de algo de mão única. Aqui, é um portão na cerca viva. Uma alameda ladeada por cerca viva, com 2 tiles de largura, desce reta pelo lado leste do Passeio do Prado, alinhada com o píer, até a borda norte do Largo entre o salão e a casa a leste dele, onde o gramado entre os dois desce em direção ao pátio de chegada. O portão na ponta da alameda do lado do lago só abre do lado do lago. Na ida, ele fica fechado e o caminho serpenteia; na volta, ele abre e a alameda é reta. É o atalho de volta de mão única do cânone (seção 5, O caminho de casa) colocado no plano. Modelei as três áreas no grafo compartilhado de oito direções do item 3, com a cidade como a forja a desenha hoje e com a alameda e o píer posicionados desse jeito. Escolhi fazê-lo serpentear com quatro cercas vivas atravessando o prado, uma a cada 12 fileiras, cada uma com uma abertura de 2 tiles. Os passos na diagonal cortam cada zigue-zague. Em todas as posições de abertura, duas cercas vivas igualmente espaçadas não conseguem fazer o prado serpentear 78 tiles nesse grafo: chegam no máximo a 66,46 tiles de borda a borda. Três, igualmente espaçadas, conseguem, mas por pouco: 6 das suas 8.000 posições de abertura fazem o prado serpentear de 78 a 79,77 tiles, e 5 dessas 6 também dão uma ida dentro da faixa de 110 a 120 tiles, de 114,05 a 119,02, com a volta entre 0,740 e 0,772 da ida, abaixo da meta de 0,8. Quatro cercas vivas fazem o prado serpentear de 78 a 90 tiles em 5.912 das suas 160.000 posições, o que deixa à forja margem para traçar o prado. Essa margem é o meu motivo para escolher quatro; o grafo não impõe isso. Nessas disposições com quatro cercas vivas, a volta tem 88,07 tiles contra 108,74 a 133,75 na ida. A meta de 0,8 exige pelo menos 110,09 na ida, e dentro da faixa de ida de 110 a 120 tiles todas as 4.111 disposições a cumprem, entre 0,73 e 0,80. Com o portão aberto nos dois sentidos, as duas caminhadas saem iguais.66 A caminhada em oito direções é o motivo pelo qual as duas cercas vivas do modelo anterior já não bastam: ela encurta a alameda de volta só de 91 tiles para 88,07, porque a alameda já é reta, mas tira muito mais de um caminho de ida sinuoso, então o portão economiza menos, a não ser que o prado serpenteie mais. O mesmo modelo define o limite inferior da faixa. Nenhuma disposição nele, em qualquer deslocamento ou posição de píer que ele teste, dá uma ida com menos de 107,18 tiles, e a volta nunca fica abaixo de 88,07, então uma ida bem abaixo de 110 tiles não cumpre a meta de 0,8.66 Descidas de mão única a partir de terraços do prado fariam o mesmo do jeito do cânone, mas o trabalho de estruturas recusou os ressaltos, então as descidas ficam adiadas para o post sobre elevação, que é quem decide sobre elas.3626
Teste: 3 (distâncias).
3. Conexões como dados
Cada área é uma exportação da forja como town.json: letras, chão com autotile, objetos, warps e a chegada, mais connections: [{"dir": "north"|"south"|"east"|"west", "area": "<id>", "offset": <tiles>}], em que o deslocamento é a origem do vizinho ao longo da borda compartilhada, a convenção da Gen 3.148 Toda conexão tem uma inversa com o deslocamento negado (seção 5, Conexões), sem exceção: as conexões de um lado só do cânone são um truque de desenho de que este briefing não precisa. A cópia de cada área no servidor traz as letras e as conexões, para que uma caminhada seja validada através da costura.6026
Um único grafo de caminhada serve aos dois lados. O TileMap.path do app busca em oito direções, com um passo na diagonal que custa √2 e só é permitido quando os dois tiles entre os quais ele passa são caminháveis, para que ninguém corte a quina de uma parede; o Plaza.path do servidor, em server/app/rooms.py, busca em quatro direções, embora o comentário dele o chame de “the same walk the app takes” (a mesma caminhada que o app faz).28 O briefing faz da busca do cliente o contrato: a mudança no servidor substitui Plaza.path pela mesma busca em oito direções, com √2 e sem cortar quinas, e os dois leem o portão da cerca viva (item 2) como uma aresta direcionada, em que se entra do lado do lago só com um passo reto e da qual nunca se sai em direção ao lago. Toda distância deste briefing é medida nesse grafo.
Testes: 1 (reciprocidade), 2 (travessias) e 12 (paridade com o servidor).
4. Costuras abertas, sem fade
Atravessar uma costura aberta não tem fade (seção 5, Transições). O cliente desenha o chão e os objetos do vizinho com pelo menos meia visão de profundidade: 15 tiles através de uma costura atravessada de leste para oeste, metade dos 29,7 do Duo aberto, e 12 através de uma costura atravessada de norte para sul, metade dos 22,4 de um Pro Max em retrato (seção 5, Faixa do vizinho).6017 A forja calcula as máscaras de autotile através de cada costura, para que um caminho que a atravessa não termine numa borda, e abre uma passagem na cerca da cidade em cada costura, com pelo menos 2 tiles de largura e com as células da passagem caminháveis dos dois lados.1426 A mata que a forja desenha hoje com 12 tiles de profundidade em volta da cidade (MARGIN = 12) cede lugar ao vizinho ao longo de toda a borda compartilhada: a faixa do vizinho substitui ali a margem de mata, e a mata fica só onde nenhuma área se liga. Isso revisa o dossiê, que abria a passagem de 2 tiles também na margem de mata e teria deixado a mata cobrindo a maior parte da faixa do vizinho.1426 O cliente assina os caminhantes da sala vizinha quando começa a desenhar a faixa dessa sala e troca a própria sala na travessia.26
Teste: 6 (nenhum quadro preto, nenhum travamento da thread principal, e a faixa visível antes da costura).
5. O letreiro com o nome
Ao entrar numa área por uma costura ou de bonde, o nome dela desliza para dentro, fica parado e sai em cerca de 3 segundos (seção 5, Letreiro com o nome), em escala de interface no SwiftUI, nunca na camada de pixels.2160
Teste: 7 (tempo do letreiro com o nome).
6. Achados no Passeio do Prado
- Onde. Canteiros de flores cobrem de 12% a 18% dos tiles caminháveis do Passeio do Prado, desenhados com um conjunto próprio de autotiles para que se leiam de longe.26 Essa proporção é uma escolha minha, não um número do cânone. Contadas do mesmo jeito, sobre o chão caminhável, as primeiras rotas do cânone têm de 18,8% a 38,4% de grama alta e as rotas posteriores, de 8,2% a 29,2% (seção 1), então os canteiros ficam junto das rotas posteriores e abaixo de qualquer primeira rota: um brilho é posicionado e visível, então os canteiros só precisam emoldurá-lo, não carregar um sorteio a cada passo.17
- Como aparecem. Não com dados a cada passo. Ao entrar no Passeio do Prado, o servidor põe no máximo um brilho visível para aquele colecionador dentro de um canteiro, escolhido de forma determinística a partir do colecionador, da data e da área, a regra de surgimento ao entrar num acre de Animal Crossing, até o colecionador ter recebido três naquele dia.5526 Um brilho visível mantém a regra legível para uma criança e evita sequências sem precisar da espera e da rampa da linha Cadência da seção 5.
- O que são. Só coisas do mundo: um adesivo ou uma moldura para o quarto, um cosmético de capinha ou de broche, ou uma nota que indica uma das missões do dia, que só um escaneamento real pode completar; as missões já são avaliadas a partir da própria coleção (
Kiradex/World/Quests.swift).2765 Nunca uma carta, nunca XP, nunca nada à venda; um achado nunca pode virar motivo para comprar. As moedas esperam: o plano do mundo deixa ganhar moedas com visitas diárias, mas não define quantidade nem limite, e põe as moedas na quarta fase, então os achados de moedas ficam adiados até essa regra existir, e aí saem do mesmo orçamento de visitas diárias em vez de se somarem a ele.27 - Quem os vê. O brilho de cada colecionador é dele; amigos que caminham juntos veem cada um o seu. Não há nada para arrancar e nada pelo que brigar.
Teste: 10 (achados).
7. O arco e o seu guardião
O prédio entre o Largo e o Bairro da Galeria é uma sala de 8 por 6 com uma porta de cada lado e um guardião atrás de um balcão. O guardião entrega um cosmético quando a contagem de cartas registradas do colecionador passa pela primeira vez de 10, 30, 50 e 100, a guarita de marcos de coleção da linha Guaritas da seção 5, contada a partir da coleção do mundo real, do mesmo jeito que o XP.2026 A sala também é onde a arte muda de gramado para pedra (seção 5, Costuras). Nada fica trancado: o arco está sempre aberto, e o guardião só dá.
Teste: 11 (guardião do arco).
8. A tela do mapa
Uma grade de 16 por 12 de retângulos com nome, um quadrado a cada 10 tiles, arredondado: o Largo 4 por 3, a Rua dos Fichários 4 por 1 no lado leste do Largo, o Passeio do Prado 2 por 6 acima dele, a Beira do Lago 4 por 2 no alto, o Bairro da Galeria 3 por 2 a oeste. Empilhados, a Beira do Lago, o Passeio do Prado e o Largo ocupam 11 das 12 fileiras (seção 5, Tela do mapa).2617 Toda área é desenhada e nomeada desde o primeiro dia. Essa é uma escolha do próprio Kiradex, não do cânone: os quatro jogos desenham todos os lugares depois que o jogador tem o mapa, exceto alguns lugares tardios, mas entregam o mapa durante o jogo (seção 5, Viagem rápida), e uma cidade de colecionadores não tem motivo para fazer alguém conquistar o direito de vê-lo. A área atual pulsa; as áreas visitadas mostram sua parada de bonde. No Duo aberto, o mapa fica ao lado do mundo como um painel; num celular, é uma sheet.27
Teste: 8 (modelo da tela do mapa).
9. O bonde
Toda área externa tem uma parada. Uma parada abre na primeira vez que o colecionador entra naquela área, a flag de visita da linha Viagem rápida da seção 5, ativada na entrada e nunca por nível ou pagamento.1326 Na tela do mapa, tocar numa área visitada leva até ela: fade de saída, troca de sala, fade de entrada na parada daquela área, e depois o letreiro com o nome. Não há viagens a partir de interiores, assim como Fly não permite nenhuma (seção 5, Viagem rápida).13 O bonde transforma a caminhada de 28 a 30 segundos até a Beira do Lago num toque depois que ela foi feita uma vez, um atalho conquistado visitando, e não por uma habilidade (seção 5, Desbloqueios).26
Teste: 9 (regras do bonde).
10. Nomes e arte
O nome, as placas e os textos de cada área passam por uma lista de nomes proibidos protegidos, e todo tile e todo sprite vêm da forja.2726 A lista de nomes proibidos ainda não existe: o dossiê prometia uma no repositório, e o repositório não tem nenhuma. Criá-la faz parte deste briefing: uma lista simples dos nomes protegidos, um por linha, versionada no repositório ao lado da forja, e um teste que lê o nome, as placas e os textos de cada área nas exportações da forja e falha diante de qualquer item da lista encontrado neles, sem diferenciar maiúsculas de minúsculas.26 Nada de nomes de estrada numerados, nada de um esquema de nomes de “região”, e nenhum prédio que reproduza a aparência de uma guarita do cânone: os tamanhos e as regras podem coincidir, mas as formas e os nomes precisam ser do próprio Kiradex.26
Teste: 13 (nomes e arte).
11. Ordem de trabalho
O plano do mundo põe a praça (salas, sincronização, balões, perfis, a tela de trocas) em terceiro lugar e as moedas e a loja em quarto.27 As áreas entram como uma fase 3b, depois que a rede da praça se sustentar e antes das moedas ou junto com elas:26
- Conexões na forja e no servidor (formato, reciprocidade, desenho das costuras, troca de sala), a busca em oito direções do servidor e a lista de nomes proibidos com o seu teste, com a Rua dos Fichários como primeira área, porque ela usa a loja de cartas que o trabalho de estruturas já projetou e é a menor.
- O Passeio do Prado e os achados (posicionamento no servidor, o limite diário, as recompensas).
- A tela do mapa e o bonde.
- A Beira do Lago.
- O Bairro da Galeria com o arco, quando o interior do museu existir. A fileira de barracas da Rua dos Fichários espera a fase do mercado.
Cada etapa é uma build do TestFlight, como o plano do mundo pede de toda fase, com capturas para os seus testes.27
Os testes de aceitação
Cada um pode ser executado por um script sobre as exportações da forja e os testes do servidor, ou por uma captura no simulador; o teste 6 roda num aparelho, exceto pela sua única captura no simulador.26
- Reciprocidade. As exportações contêm exatamente três costuras abertas, Largo leste com a Rua dos Fichários, Largo norte com o Passeio do Prado e Passeio do Prado norte com a Beira do Lago, e para toda conexão
(a, dir, b, off)a exportação contém(b, opposite(dir), a, −off); o teste falha diante de qualquer conexão de um lado só, sem exceções. - Travessias. Uma busca em largura a partir da chegada e das portas de cada área encontra pelo menos 2 tiles de travessia de cada lado de cada costura, de frente para tiles caminháveis do outro lado, o método de
measure_gen3_routes.py.6 - Distâncias. A busca compartilhada em oito direções do item 3 sobre as áreas unidas, com o portão da cerca viva como aresta de mão única (em que se entra do lado do lago só com um passo reto e da qual nunca se sai em direção ao lago), e com cada comprimento como custo de caminho em que um passo na diagonal conta √2, informa da chegada à loja de cartas no máximo 60 tiles; da chegada ao píer da Beira do Lago, de 110 a 120; do píer à chegada, no máximo 0,8 vez a caminhada de ida; da chegada à porta do museu, no máximo 70. A forja imprime os tempos a 4 tiles por segundo.
- Proporção. Os tiles além do Largo divididos pelos tiles do Largo ficam entre 2,0 e 3,9.
- Orientação. A altura do Passeio do Prado é maior que a largura.
- Nenhum quadro preto e nenhum travamento da thread principal numa costura. Numa build para aparelho, o colecionador atravessa a pé a costura entre o Largo e a Rua dos Fichários, de um tile a mais de meia visão da costura, antes de o palco começar a construir a malha da Rua dos Fichários, até o primeiro passo depois da costura terminar e o Largo virar a faixa de trás. Dois registros cobrem todo esse trecho. Para a execução, o display link pede 60 hertz pelo seu
preferredFrameRateRange, para que a taxa variável de uma tela ProMotion não mexa na contagem no meio da caminhada; a Apple descreve a faixa como uma que o display link faz o possível para respeitar, então é o log de tempo, e não o pedido, que mostra a taxa que se manteve.67 O primeiro registro é cada quadro que a tela exibe, guardado por uma gravação nessa taxa e inspecionado quadro a quadro: um quadro é preto quando o brilho médio dele fica abaixo de um quarto do quadro mediano do trecho (limiar meu), e um único quadro preto em qualquer ponto do trecho reprova o teste. O número de quadros da gravação no trecho precisa ser igual ao número de callbacks do log de tempo no mesmo trecho, para que uma captura que perde quadros não possa passar por ter pulado o preto. Nenhum método de captura demonstrou ainda gravar todos os quadros exibidos, e é essa correspondência que decide se algum grava. Quando as contagens diferem e o log de tempo cumpre sua própria regra, descrita abaixo, a culpa é da captura e a execução não conta; quando diferem e o log de tempo descumpre essa regra, o teste é reprovado. O segundo é otargetTimestampde um callback deCADisplayLinkregistrado no run loop principal, do jeito que o próprio exemplo da Apple o registra, o momento em que, segundo a documentação da Apple, o próximo quadro é exibido, registrado a cada quadro; nenhum intervalo entre valores sucessivos pode passar de 25 milissegundos, um quadro e meio a 60 hertz, então um único quadro perdido reprova o teste assim como um único quadro preto, o que pega um travamento da thread principal tanto enquanto o vizinho é construído quanto na travessia. Uma execução cujo log de tempo se estabiliza em qualquer taxa diferente de 60 hertz não conta, e o Modo de Pouca Energia fica desligado nela, já que a Apple cita esse modo, um estado térmico crítico e os ajustes de acessibilidade entre o que pode mudar a taxa.67 O aparelho é um iPhone Duo aberto assim que houver um à mão; nenhum iPhone Duo está pareado com o meu Mac enquanto escrevo, então até lá o teste roda num iPhone 18 Pro Max na mesma costura, o que mostra se a aproximação e a travessia travam ou apagam a tela num celular, mas não como a tela interna do Duo dá o ritmo dos seus quadros. O simulador não pode substituí-lo: na minha leitura, o tempo de quadro dele mede o Mac que o executa, não um celular. Separadamente, uma captura no simulador do Duo aberto feita de dentro do bundle de testes, com o colecionador no último tile do Largo antes da costura, mostra pelo menos 14 tiles da Rua dos Fichários.6064 - Letreiro com o nome. O letreiro fica na tela entre 2,5 e 3,5 segundos depois de atravessar uma costura ou de chegar de bonde.
- Modelo da tela do mapa. Testes unitários: o retângulo de cada área cabe em 16 por 12, nenhum par se sobrepõe, toda área tem nome, a área atual está marcada e a parada de uma área não visitada está desativada.
- Regras do bonde. Testes do servidor: uma viagem para uma área não visitada é recusada; uma viagem a partir de um interior é recusada; uma viagem termina na parada de destino.
- Achados. Testes do servidor: no máximo um brilho por entrada numa área, no máximo três por colecionador por dia, o mesmo brilho para o mesmo colecionador, data e área, e recompensas tiradas só das tabelas de cosméticos e de notas de missão, nunca uma carta, XP ou moedas. Um teste da forja: os canteiros de flores cobrem de 12% a 18% dos tiles caminháveis do Passeio do Prado.
- Guardião do arco. Um teste unitário: os quatro presentes de marco disparam uma vez cada, nas contagens registradas de 10, 30, 50 e 100, e nunca por moedas ou compras.
- Paridade com o servidor. O servidor carrega as letras e as conexões de cada área e leva um colecionador a pé da chegada ao píer da Beira do Lago, atravessando duas costuras, e de volta pelo portão da cerca viva, com a busca em oito direções do item 3; o app e o servidor devolvem os mesmos tiles e o mesmo custo nos dois sentidos, e um passo que a busca do cliente recusaria, um corte de quina ou um passo da alameda para fora pelo portão, é recusado pelo servidor também, no padrão dos testes de servidor existentes.3728
- Nomes e arte. A lista de nomes proibidos existe no repositório com o seu teste, e o teste passa: todo nome de área, placa e texto passa pela lista; todo tile e todo sprite vêm da forja.
Fora deste briefing
- Encontros aleatórios a cada passo, ou qualquer coisa que se jogue como uma batalha selvagem. Os achados são posicionados e visíveis.
- Bloqueios por habilidade nas áreas principais. Nenhuma área abre por um nível, um broche, uma compra ou uma ferramenta; as áreas abrem quando você chega até elas andando, e só o atalho, o bonde, é conquistado, visitando. É a linha Desbloqueios da seção 5 lida do jeito gentil.5226
- Viagens de mais de uns 30 segundos entre dois lugares onde as pessoas se encontram, sem bonde. Os trechos de um minuto do cânone são masmorras.7
- Ressaltos, terraços com descidas de mão única e qualquer altura por célula. Adiados para o post sobre elevação, que é quem decide sobre eles; até lá, o briefing obtém o caminho de casa mais curto do portão da cerca viva, que é de mão única, mas plano.36
- Nomes de estrada numerados, um esquema de nomes de “região”, viagem rápida liberada por insígnias ou um prédio que copie a aparência de uma guarita do cânone.27
- Conexões de um lado só. O cânone as usa como truque de desenho; este briefing não tem nenhuma, e o teste 1 falha diante de qualquer uma.8
- Achados de moedas, até o plano do mundo definir quantas moedas uma visita diária rende.27
- As barracas do mercado na Rua dos Fichários antes da fase do mercado.27
Principais conclusões
Se você desenha a arte
- Desenhe uma costura só onde o chão continua. Red une um mesmo tileset em 76 das 78 conexões, e toda guarita de Red entre dois lugares fica onde o tileset muda; um prédio com duas portas é o jeito honesto de mudar de material.8
- Faça a primeira rota curta e a mais gramada: de duas a seis telas, de 14% a 23% do mapa como terreno de encontros, sem treinadores. Vá rareando ao longo da jornada.56
- Desenhe a tela do mapa como uma grade grosseira de retângulos com nome. A de Emerald tem 28 por 15 quadrados, e 49 dos seus 95 retângulos têm um único quadrado.11
Se você constrói o motor
- Guarde as conexões como dados com uma direção, um vizinho e um deslocamento, e teste se cada uma tem uma inversa com o deslocamento negado; as 134 de Emerald têm.842
- Desenhe pelo menos meia visão do vizinho além da borda. A Gen 3 copia 7 células (8 no leste) porque o jogador vê 7 para cada lado; nas escalas do Kiradex, isso dá 15 tiles no Duo aberto e 12 num Pro Max em retrato.960
- Mantenha uma única cena através de uma costura e reserve a troca de cena para as portas e a viagem rápida, onde um fade a esconde.1037
- Meça as distâncias com uma busca, não com uma régua, e com todas as regras de movimento que o motor tiver: nas nove rotas medidas cujas pontas se ligam a pé, a travessia mais longa mede de 1,15 a 1,70 vez o lado maior e a volta para casa de 0,95 a 1,42, e a volta pode ser um quarto mais curta que a ida. Uma busca sem as paredes de um lado só e os saltos laterais de canto de Crystal põe a Rota 32 em 110 células em cada sentido; com eles, são 132 na ida e 128 na volta.5617
- Dê ao app e ao servidor um único grafo de caminhada. Se o cliente anda em oito direções e o servidor em quatro, toda distância que um teste mede pertence a só um dos dois.28
Se você projeta o loop de jogo
- Dimensione toda viagem em segundos. Um primeiro trecho são de 15 a 25 segundos de caminhada no cânone; um minuto é uma masmorra.7
- Faça o caminho de casa mais curto que o de ida, e dê a ele algo de mão única para isso, porque numa grade que se percorre nos dois sentidos a caminhada mais curta de volta é a caminhada mais curta de ida. O cânone faz isso com ressaltos, em até 44%; um portão que só abre do lado de lá faz isso sem altura.5666
- Depois que o jogador tem o mapa, mostre nele todos os lugares e faça conquistar só o atalho, visitando. Todo jogo de Pokémon medido aqui entrega o mapa durante o jogo, desenha nele todos os lugares, visitados ou não, exceto alguns lugares tardios retidos por flags da história ou de eventos, ativa a flag de visita na entrada e só lista lugares visitados para a viagem rápida; o Kiradex vai um passo além e mostra o mapa desde o primeiro dia.4445121323222426
- Abra as áreas por feito e por data, como o Stardew faz, e não por nível ou compra, e dê a quem caminha algo para fazer com a coleção aonde quer que vá.5227
Perguntas frequentes
Qual deve ser o comprimento de uma rota num RPG com visão de cima?
Nos Pokémon em 2D, de duas a dez telas de console ao longo do eixo de deslocamento, e a primeira rota de duas a seis. Em células, as dezesseis rotas que medi vão de 20 a 108 no lado maior, e nas nove que podem ser percorridas de ponta a ponta, a travessia mais curta no sentido mais longo mede de 1,15 a 1,70 vez esse comprimento, porque o caminho serpenteia, e a volta para casa de 0,95 a 1,42. A 16 quadros por célula, um primeiro trecho de uma porta até o prédio principal da cidade seguinte leva 15,5 segundos em Emerald e 25,2 em FireRed.56717
Como os jogos de Pokémon ligam os mapas sem tela de carregamento?
Cada mapa lista seus vizinhos com uma direção e um deslocamento. Em Emerald, o motor copia o mapa atual para um buffer com uma margem de 7 células (8 no leste), “the player has 7 metatiles of view horizontally in either direction” (o jogador vê 7 metatiles na horizontal para cada lado), e preenche a margem de um lado conectado com 7 fileiras ou colunas do vizinho (8 colunas no leste), desenhadas com os tiles do mapa atual. Quando o jogador atravessa, ele carrega o tileset secundário, a paleta, a música e o clima do novo mapa e faz deslizar um letreiro com o nome, sem fade. Red faz o mesmo com uma margem de 3 blocos, 6 células.91039
Por que as rotas de Kanto têm guaritas?
Na minha leitura dos dados, porque uma costura de Game Boy só consegue unir dois mapas desenhados com o mesmo tileset, e uma guarita é uma porta onde o tileset muda: 76 das 78 conexões de Red unem um mesmo tileset, e toda guarita de Red entre dois lugares une dois. As guaritas também abrigam regras: os guardas de Saffron que querem uma bebida, uma checagem de insígnia na Rota 22, e três assistentes que dão itens a 10, 30 e 50 espécies obtidas. Nenhuma declaração dos desenvolvedores confirma o motivo do tileset.8192029
Por que os ressaltos são de mão única em Pokémon?
O comportamento de uma célula de ressalto indica uma direção de deslocamento, e o jogador só pode atravessá-la nesse sentido. Medidos nas primeiras rotas, os ressaltos ficam virados para a cidade anterior: a volta para casa é de 2% a 44% mais curta que a ida nas nove rotas com ressaltos cujas pontas se ligam a pé. Nas quatro rotas em que isso foi buscado, o caminho de casa cruza de 0 a 5 células de grama alta, contra 4 a 19 no de ida.365618
Como Fly decide para quais cidades você pode voar?
Por uma flag de visita ativada quando você entra na cidade. Em Emerald, cada uma das 16 cidades ativa a sua flag FLAG_VISITED_* no script de transição, e o mapa da região só marca uma cidade como destino de Fly quando a flag está ativada; Red guarda um bit por cidade em wTownVisitedFlag, e Crystal ativa um ponto de voo num callback do mapa. Fly também exige uma insígnia (a terceira em Red e FireRed, a sexta em Emerald) e um mapa externo.13222423
Qual é o tamanho de uma cidade comparada às suas estradas?
De duas a quatro vezes menor. As células de rota divididas pelas células de cidade dão 1,97 em Crystal, 2,65 em Red, 3,70 nas rotas terrestres de Emerald e 3,87 em FireRed; na tela do mapa de Emerald, a razão se lê como 5,9 para 1, porque uma cidade ocupa um ou dois quadrados não importa o tamanho.3334
É legal copiar o jeito como Pokémon constrói suas rotas?
Mecânicas, tamanhos e métodos não são protegidos por direito autoral. Tiles e sprites específicos são protegidos por direito autoral, e nomes e marcas, pelo direito de marcas. O primeiro post desta série trata dessa linha, com a Circular 33 do Copyright Office, que deixa sistemas e métodos de operação fora do direito autoral, e as patentes do processo da Nintendo contra a desenvolvedora de Palworld.60 Este briefing toma emprestados números e regras e desenha todo tile com a forja do próprio Kiradex, com os nomes conferidos contra uma lista de nomes proibidos.26
Como este post foi feito. O dossiê de pesquisa por trás dele foi compilado em 4 de outubro de 2026 a partir de clones rasos das descompilações do pret, medidos por seis scripts em Python salvos junto com as saídas, e de cópias salvas da Stardew Valley Wiki, da Nookipedia, do disassembly zladx, do manual do Porymap, do GBATEK, do Pan Docs, de uma página da Bulbapedia e das páginas da Apple. Todo número de Pokémon no texto é a saída de um script, e cada nota nomeia o script. Antes da publicação, uma segunda revisão em 5 de outubro levou a três novas medições, as paredes de um lado só e os saltos de canto de Crystal, a corrida sobre ressaltos e o prado do briefing na caminhada em oito direções do app, e a uma leitura mais atenta dos passos de carência do código de encontros; cada nota diz o que mudou. A proposta da seção 7 é minha e está marcada como tal; nada dela foi construído.
Relacionados neste site: Mundos em pixel art no iPhone é o primeiro post desta série, com os sistemas de tiles, a receita do RealityKit e as contagens de tiles por aparelho em que se apoiam as visões deste post; Pessoas em pixel art: personagens e um criador no iPhone é o colecionador que percorre estas rotas; Estruturas em pixel art: casas, salões e interiores no iPhone tem as portas, os warps e as trocas de andar que o bonde e o arco reutilizam, e a recusa dos ressaltos que este post deixa para o post sobre elevação; iPhone Duo para desenvolvedores deriva o tamanho da tela interna a partir do qual a faixa de meia visão é calculada; Prepare seu app para o iPhone Duo trata do layout lado a lado que o painel do mapa segue; e Xcode 27.1 beta: seu app no simulador do iPhone Duo trata do simulador em que roda o teste de costura do briefing.
Fontes
-
pret,
pokered/home/overworld.asmno commitd2704a6(OverworldLoopchamandoDelayFrameduas vezes por iteração;AdvancePlayerSpritemovendo 2 pixels por iteração durante 8 iterações,wWalkCounter8; a bicicleta chamandoAdvancePlayerSpriteduas vezes por iteração), acessado em 4 de outubro de 2026, https://github.com/pret/pokered/blob/master/home/overworld.asm. ↩↩↩↩ -
pret,
pokecrystal/engine/overworld/map_objects.asm(StepVectors: um passo a pé de 8 ticks de 2 pixels, um passo de bicicleta de 4 ticks de 4 pixels) epokecrystal/engine/overworld/events.asm(MaxOverworldDelay: db 2) no commit5beda23, acessados em 4 de outubro de 2026, https://github.com/pret/pokecrystal/blob/master/engine/overworld/map_objects.asm. ↩↩↩↩ -
pret,
pokeemerald/src/event_object_movement.cno commit731ad5b(as tabelas de passo: 16 entradas emsStep1Funcspara caminhar, 8 para correr e surfar, 6 para a Acro Bike e as correntezas, 4 para a Mach Bike, 2 para o mais rápido;JUMP_DISTANCE_FAR32 quadros sobre duas células;sJumpY_Highcom pico em 12 pixels), acessado em 4 de outubro de 2026, https://github.com/pret/pokeemerald/blob/master/src/event_object_movement.c. ↩↩↩↩↩ -
Código-fonte do Kiradex,
Kiradex/World/PlazaRig.swift, linha 101 (tilesPerSecond: Float = 4) e linha 122 (runPace: Float = 1.6), lidas da árvore de trabalho em 4 de outubro de 2026, e linhas 660 e 666 (cada quadro somadt × tilesPerSecond × pace ÷ lengthao avanço de um passo, e um passo concluído volta o avanço para 0, descartando o excedente), lidas em 5 de outubro de 2026; repositório privado. Os 6,4 tiles por segundo são a corrida nominal, 4 × 1,6. ↩↩↩↩↩ -
Medição do autor, 4 de outubro de 2026:
measure_gen12_routes.pyna pasta de evidências do autor para este post, saídagen12_routes.txt. Entradas dopokereddo pret emd2704a6:constants/map_constants.asm(tamanhos em blocos, dobrados para células),maps/Route*.blk,gfx/blocksets/overworld.bstcontraOverworld_Coll, o tile de grama$52edata/tilesets/ledge_tiles.asm(um tile 8 por 8 por célula, o do canto inferior esquerdo),data/maps/objects/Route*.asm(treinadores como linhasobject_eventcom uma classeOPP_),data/maps/headers/Route*.asm(conexões). Dopokecrystaldo pret em5beda23:maps/Route*.blk,data/tilesets/<tileset>_collision.asmviaCollisionPermissionTable(os quatro bytes por bloco, supostos na ordem das linhas),maps/Route*.asm(treinadores comoOBJECTTYPE_TRAINER). Ampliado em 5 de outubro de 2026 (a saída anterior foi mantida comogen12_routes.pre-walls.txt): as paredes laterais de Crystal, os bytes de colisão deCOLL_RIGHT_WALLaCOLL_UP_LEFT_WALL($b0a$b7) e as boias laterais, recusam um passo que saia pelo lado murado e um passo que entre por ele, comoGetMovementPermissionsos define (home/map.asm, a partir da linha 1511) e.CheckLandPermsos lê (engine/overworld/player_movement.asm, linha 686); os ressaltos de cantoHOP_DOWN_RIGHTeHOP_DOWN_LEFTsaltam para baixo ou para o lado (.ledge_table, linha 383), e um salto só é tentado depois que o passo comum falha (.Normal, linhas 45 a 56); os caminhos mais curtos são encontrados pela busca de Dijkstra, já que um salto custa 2. Só a Rota 32 tem paredes laterais (41 células, todasUP_WALL, entre elas o bloco emdata/tilesets/johto_collision.asmlinha 113), e só as caminhadas dela mudaram: 110 em cada sentido antes, 132 para o sul e 128 para o norte depois.probe_gen12_exact.py(saídaprobe_gen12_exact.txt) roda todas as combinações das três mudanças: só as paredes dão 132 em cada sentido, os saltos de canto nos dois sentidos então encurtam a volta para 128, e a busca exata não muda nada;probe_route32_path.pyrastreia o salto, da bordaHOP_DOWN_RIGHTna célula (8, 80) por cima de uma célulaWALLaté (10, 80). O pokered não tem permissão de um lado só por tile; oTilePairCollisionsLanddele (data/tilesets/pair_collision_tile_ids.asm) bloqueia um par de tiles nos dois sentidos e só lista os tilesets CAVERN e FOREST, enquanto todo mapa medido aqui é OVERWORLD. A leitura da borda na Gen 2 vem deprobe_gen2_ledges.py(21 de 21 célulasHOP_DOWNna Rota 30 têm uma célulaWALLabaixo). O modelo de células da Gen 1 foi checado a olho no render da Rota 1 de Red feito porrender_gen1.pyem tamanho dobrado com uma grade de 16 pixels (render_Route1.png, só para análise, derivado de arte protegida por direito autoral e não publicado). Também as áreas de rotas e cidades da nota 33. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Medição do autor, 4 de outubro de 2026:
measure_gen3_routes.pyna pasta de evidências do autor para este post, saídasgen3_routes.txtegen3_routes.json. Entradas dopokeemeralddo pret em731ad5be dopokefireredem037335f:data/layouts/layouts.json(tamanhos), cada célula domap.binde cada rota (bits 0 a 9 metatile, 10 e 11 colisão, 12 a 15 elevação), o comportamento dela nometatile_attributes.binprimário ou secundário (Emerald u16, bits de comportamento 0 a 7; FireRed u32, bits de comportamento 0 a 8, tipo de encontro bits 24 a 26), contagens de comportamentosMB_TALL_GRASS,MB_JUMP_*e de água, edata/maps/Route*/map.json(conexões, treinadores comoobject_eventscujotrainer_typenão éTRAINER_TYPE_NONE,trainer_sight_or_berry_tree_id). Caminhadas mais curtas por busca em largura. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Medição do autor, 4 de outubro de 2026:
measure_travel.pyna pasta de evidências do autor para este post, saídastravel.txtetravel.json, sobre opokeemeralddo pret em731ad5be opokefireredem037335f. Busca em largura sobre pares (mapa, célula) através de costuras, warps e ressaltos, da célula abaixo da primeira porta até a última porta, com a contagem incluindo o passo final de entrada nela (linha 136, “+1: the step up into the door”); segundos como células × 16 quadros ÷ 59,7275 hertz andando. Correndo, ampliado em 5 de outubro de 2026 (a saída anterior, que cobrava 8 quadros por célula correndo, foi mantida comotravel.pre-ledgerun.txt), é uma segunda busca pelo menor número de quadros, 8 por passo e 32 por salto de ressalto, porque o salto de FireRed éJump2emJUMP_DISTANCE_FAR, 32 quadros em qualquer andamento (src/field_player_avatar.cPlayerJumpLedge, linha 905;src/event_object_movement.cDoJumpSpriteMovement, linha 9094); o trecho do Centro da Rota 4 a Cerulean tem 2.528 quadros, 42,3 segundos, com um salto, e nenhum outro trecho de ida da tabela salta um ressalto; árvores de Cut, pedras de Rock Smash e rochas de Strength bloqueiam suas células, a menos que a execução diga o contrário (a execução “depois de Cut” as remove, o que na Rota 2 abreROUTE2_EAST_BUILDING). Fades e batalhas não são contados. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Medição do autor, 4 de outubro de 2026, ampliada em 5 de outubro de 2026 para ler 8 colunas no leste, como
FillEastConnectionas copia, e para cortar cada faixa onde ela sairia do buffer, comoFillNorthConnection,FillSouthConnection,FillWestConnectioneFillEastConnectiona cortam; as contagens só de primários passaram de 22 de 38 (Emerald) e 25 de 34 (FireRed) para 24 de 38 e 24 de 34:measure_connections.pyna pasta de evidências do autor para este post, saídasconnections.txteconnections.json, sobre as quatro descompilações: cada conexão de mapa, a concordância de tileset em cada costura (na Gen 3, conjuntos primário e secundário, e se a faixa do vizinho na margem, 7 fileiras ou colunas e 8 colunas no leste, usa só metatiles primários), a reciprocidade com deslocamentos negados, os deslocamentos diferentes de zero, os mapas com os tilesets GATE e FOREST_GATE em Red (data/maps/headers/*.asm), o ambiente GATE em Crystal (data/maps/maps.asm) e os mapas internos da Gen 3 cujos warps levam a dois mapas externos diferentes ou a dois lados de um mesmo. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
pret,
pokeemerald/include/fieldmap.h(MAP_OFFSET 7e o comentário dele, “the player has 7 metatiles of view horizontally in either direction”;MAX_MAP_DATA_SIZE 10240;MAP_OFFSET_WcomoMAP_OFFSET * 2 + 1eMAP_OFFSET_HcomoMAP_OFFSET * 2),pokeemerald/src/fieldmap.c(InitMapLayoutDatadimensionando o buffer como o mapa maisMAP_OFFSET_WporMAP_OFFSET_H;FillSouthConnectione as funções irmãs, comFillNorthConnectiondefinindox = offset + MAP_OFFSETewidth = cWidthquando a faixa cabe,MAP_OFFSETfileiras de altura, eFillEastConnectioncopiandoMAP_OFFSET + 1colunas;GetBorderBlockAtcombinando a borda por OR comMAPGRID_IMPASSABLE),data/maps/Route101/map.json(Oldale Town ao norte com deslocamento 0) edata/layouts/layouts.json(LAYOUT_ROUTE101eLAYOUT_OLDALE_TOWN, cada um de 20 por 20) em731ad5b, acessados em 4 de outubro de 2026, https://github.com/pret/pokeemerald/blob/master/include/fieldmap.h e https://github.com/pret/pokeemerald/blob/master/src/fieldmap.c. ↩↩↩↩↩↩↩ -
pret,
pokeemerald/src/field_camera.c(DrawMetatileAtdesenhando com os tilesets primário e secundário do layout atual) epokeemerald/src/overworld.c(LoadMapFromCameraTransition: o script de transição, o tileset secundário e a paleta, a música, o clima e o letreiro com o nome do mapa, sem fade) em731ad5b, acessados em 4 de outubro de 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.hesrc/data/region_map/region_map_sections.jsonem731ad5b, acessados em 4 de outubro de 2026, com contagens demeasure_region_maps.py(saídaregion_maps.txt), https://github.com/pret/pokeemerald/blob/master/src/data/region_map/region_map_layout.h. ↩↩↩↩↩↩↩ -
pret,
pokeemerald/src/field_control_avatar.c(um metatile com o comportamentoMB_REGION_MAProdaEventScript_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(a entrada do PokéNav no menu só quandoFLAG_SYS_POKENAV_GETestá ativada) esrc/region_map.c(a Battle Frontier e a Southern Island comoMAPSECTYPE_NONEaté as flagsFLAG_LANDMARK_*delas, linhas 1213 a 1216) em731ad5b, acessados em 4 de outubro de 2026, com os layouts de mapas de parede segundoscan_wall_maps.pyna pasta de evidências do autor para este post (saídawall_maps.txt: o andar de cima das duas casas de Littleroot e o térreo de todo Centro Pokémon), https://github.com/pret/pokeemerald/blob/master/data/event_scripts.s. ↩↩↩↩↩↩↩↩ -
pret,
pokeemerald/src/party_menu.c(FIELD_MOVE_FLYcontraFLAG_BADGE06_GET),src/overworld.c(Overworld_MapTypeAllowsTeleportAndFly),src/region_map.c(MAPSECTYPE_CITY_CANFLYquando aFLAG_VISITED_*da cidade está ativada) edata/maps/OldaleTown/scripts.inc(setflag FLAG_VISITED_OLDALE_TOWN) em731ad5b, acessados em 4 de outubro de 2026, https://github.com/pret/pokeemerald/blob/master/src/region_map.c. ↩↩↩↩↩↩↩↩↩↩ -
Código-fonte do Kiradex,
scripts/forge/town.py, linhas 79 e 80 (MARGIN = 12,WIDTH, HEIGHT = 40, 30) e a listaBUILDINGSdele (sete prédios, portas pararoom:me,room:npc-*ouhall, uma chegada), lido em 4 de outubro de 2026; repositório privado. ↩↩↩↩↩↩ -
Martin Korth, GBATEK, temporização do LCD (“Total 228 lines, 16.743 ms, 280896 cycles - ca. 59.737 Hz”), salvo em 4 de outubro de 2026 como
gbatek.txt, https://problemkaputt.de/gbatek.htm. ↩↩↩ -
Blake Crosley, “Pixel-Art Motion: Walks, Cameras and Doors on iPhone”, blakecrosley.com, 5 de outubro de 2026, seção 7 (“Where the walk stands today”: o modelo quadro a quadro do código de caminhada do Kiradex, em que a corrida leva 10 quadros por tile a 60 hertz, 6,00 tiles por segundo, e 19 a 120, 6,32, porque o excedente de cada tile é descartado; a espera de 220 milissegundos da porta e a mudança de andar sem fade; e a caminhada do briefing de 1 pixel por tick, 16 ticks por tile a 60 hertz, 3,75 tiles por segundo, com o véu escalonado sobre portas e andares), https://blakecrosley.com/blog/pixel-art-motion-on-iphone. ↩↩↩↩↩
-
Aritmética do autor a partir dos valores medidos no texto, com os números de 5 de outubro impressos por
arith_oct5.pyna pasta de evidências do autor para este post (saídaarith_oct5.txt): células por segundo como 59,7275 ÷ 16 e ÷ 8; os 4 tiles por segundo do Kiradex contra 3,73 (7,2% mais rápido), e a corrida dele contra 7,47 a 6,00 (19,6% abaixo) e a 6,4 (14,3% abaixo); um tempo a 4 tiles por segundo contra um a 3,75 como 4 ÷ 3,75, um quinze avos mais longo, e os 23 ticks de uma diagonal a 60 hertz contra √2 ÷ 4 segundos como 0,3833 ÷ 0,3536 = 1,084, cerca de um doze avos mais longo (impresso porr6_arith.py); segundos por célula como 16 ÷ 59,7275 (0,27) e por tile do Kiradex como 1 ÷ 4 (0,25); fatores de caminho como a caminhada mais curta dividida pelo lado maior da rota, para o sentido mais longo e para a volta, nas nove rotas com uma caminhada de costura a costura em cada sentido (uma caminhada reta da primeira à última fileira de um mapa de 20 células são 19 passos, 0,95), e as economias como (ida − volta) ÷ ida, de 2,38% (Rota 3 de Red) a 44,12% (Rota 101 de Emerald); a grama alta sobre células caminháveis por rota a partir das contagens de grama e de células caminháveis dos dois scripts de rotas; os quadrados das cidades no mapa de Emerald a partir dowidthe doheightdas 16 seções de cidades emregion_map_sections.json(dez de 1 por 1, seis de 1 por 2 ou 2 por 1, 22 ao todo); as contagens de tiles do Duo interno como 2853 ÷ 96 e 2007 ÷ 96, sendo 96 os 16 texels a 6 pixels; os tiles à frente de um colecionador centralizado como metade dos tiles visíveis ao longo do eixo de deslocamento; uma amostra a cada 100 milissegundos como um quadro em cada 100 × 60 ÷ 1.000 = 6 a 60 hertz; o limiar de tempo como dois quadros a 60 hertz, 33 milissegundos; os 5 por 6 acres de 16 por 16 espaços de Animal Crossing como 80 por 96; as áreas do briefing como 44 × 14 + 24 × 60 + 36 × 20 + 30 × 20 = 3.376 tiles sobre 40 × 30 = 1.200; as meias visões como as contagens de tiles de 3 de outubro divididas por dois e arredondadas para cima; os quadrados da tela do mapa como os tiles de cada área divididos por 10, arredondados. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Medição do autor, 4 de outubro de 2026:
measure_grass_paths.pyna pasta de evidências do autor para este post, saídagrass_paths.txt: uma busca em largura 0-1 em que entrar numa célula de grama alta custa 1 e qualquer outro movimento 0, com ressaltos de mão única, usando os modelos de células e as travessias alcançáveis a partir de portas dos dois scripts de rotas; Rota 1 de Red, Rota 1 de FireRed, Rotas 101 e 102 de Emerald. As células da passagem estreita vêm deprobe_grass_gateway.py(saídagrass_gateway.txt), que roda de novo a busca para o sul da Rota 1 de Red transformando, uma de cada vez, cada célula de grama em chão comum: só as 8 células das quatro últimas fileiras da passagem, duas por fileira, baixam o mínimo. ↩↩↩↩↩↩ -
pret,
pokered/scripts/Route5Gate.asm(TEXT_ROUTE5GATE_GUARD_GEE_IM_THIRSTY,BIT_GAVE_SAFFRON_GUARDS_DRINK) epokered/scripts/Route22Gate.asm(BIT_BOULDERBADGE) emd2704a6, acessados em 4 de outubro de 2026, https://github.com/pret/pokered/blob/master/scripts/Route5Gate.asm. ↩↩↩↩↩ -
pret,
pokered/scripts/Route2Gate.asm,scripts/Route11Gate2F.asm,scripts/Route15Gate2F.asm(limiares de 10, 30 e 50) eengine/events/oaks_aide.asm(CountSetBitssobrewPokedexOwned) emd2704a6, acessados em 4 de outubro de 2026, https://github.com/pret/pokered/blob/master/engine/events/oaks_aide.asm. ↩↩↩↩↩ -
pret,
pokeemerald/src/map_name_popup.cem731ad5b(POPUP_OFFSCREEN_Y 40, o deslizamento de 2 pixels por quadro,tOnscreenTimer > 120), acessado em 4 de outubro de 2026, https://github.com/pret/pokeemerald/blob/master/src/map_name_popup.c. O total de 190 quadros é a contagem do autor dos estados da tarefa pelos limiares; cada estado pode durar um quadro a mais ou a menos. ↩↩↩↩↩ -
pret,
pokered/data/maps/town_map_entries.asm(37 entradas externas, uma não usada; 60 internas),engine/overworld/toggleable_objects.asm(wTownVisitedFlag, com o comentário “mark town as visited (for flying)”),engine/items/town_map.asm(a lista de voo pulando as cidades não visitadas) eengine/menus/start_sub_menus.asm(Fly exige a Thunder Badge, bit 2, e um mapa externo) emd2704a6, acessados em 4 de outubro de 2026, https://github.com/pret/pokered/blob/master/engine/items/town_map.asm. ↩↩↩↩↩↩↩ -
pret,
pokefirered/src/data/region_map/region_map_layout_kanto.he os três layouts de Sevii (22 por 15 por página, camadas de mundo externo e de masmorras),src/party_menu.ceinclude/constants/party_menu.h(Fly comoFLAG_BADGE01_GET + fieldMovecomFIELD_MOVE_FLY2, a terceira insígnia),src/region_map.c(GetMapsecTyperetornandoMAPSECTYPE_VISITEDsó quando a flagFLAG_WORLD_MAP_*do lugar está ativada, a partir da linha 2957; Fly aceitando só um quadrado visitado; as páginas de Sevii retidas atéFLAG_SYS_SEVII_MAP_123eFLAG_SYS_SEVII_MAP_4567, linhas 1028 e 1556, que os scripts do Centro de One Island ativam; Navel Rock e Birth Island encobertas atéFLAG_WORLD_MAP_NAVEL_ROCK_EXTERIOReFLAG_WORLD_MAP_BIRTH_ISLAND_EXTERIORserem ativadas, linhas 1521 a 1524),data/maps/CeladonCity/scripts.inc(setworldmapflag FLAG_WORLD_MAP_CELADON_CITYno script de transição),data/maps/PalletTown_RivalsHouse/scripts.inc(a irmã do rival entregando o Town Map,RECEIVED_TOWN_MAP) edata/event_scripts.s(EventScript_WallTownMap,special ShowTownMap) em037335f, acessados em 4 de outubro de 2026, com contagens demeasure_region_maps.pye mapas de parede segundoscan_wall_maps.py(saídawall_maps.txt: o térreo de todo Centro Pokémon, a escola de Viridian e algumas casas), https://github.com/pret/pokefirered/blob/master/src/data/region_map/region_map_layout_kanto.h. ↩↩↩↩↩↩↩↩↩↩ -
pret,
pokecrystal/data/maps/landmarks.asm(95 pontos de referência),data/maps/flypoints.asm(24 pontos de voo),maps/VioletCity.asm(VioletCityFlypointCallback: setflag ENGINE_FLYPOINT_VIOLET) eengine/events/overworld.asm(ENGINE_STORMBADGE) em5beda23, acessados em 4 de outubro de 2026, https://github.com/pret/pokecrystal/blob/master/data/maps/flypoints.asm. ↩↩↩↩↩↩↩ -
zladx, LADX-Disassembly no commit
2a5c2c0,src/constants/memory/wram.asm(wOverworldRoomStatus,ds $100) esrc/constants/gameplay.asm(OW_ROOM_STATUS_VISITED EQU $80e os outros bits de status), salvos em 4 de outubro de 2026 comoladx-wram.asmeladx-gameplay.asm, https://github.com/zladx/LADX-Disassembly/blob/main/src/constants/gameplay.asm. ↩↩↩ -
Dossiê de pesquisa do autor, “Beyond the plaza: routes, map connections and districts in the canon”, 4 de outubro de 2026, seção 4 (“The brief for Kiradex”), síntese do autor: as cinco áreas e seus tamanhos, as metas de distância, o formato das conexões, o plano de costura, presença e passagem na cerca, os achados, o guardião do arco, a tela do mapa, o bonde, a ordem de trabalho, os treze testes de aceitação e as recusas. Repositório do Kiradex,
docs/research/routes/01-routes.md; privado. A faixa de ida foi estreitada em 5 de outubro de 2026, dos 90 a 120 tiles do dossiê para 110 a 120, pelo motivo da nota 66; a cópia do dossiê ainda traz a faixa anterior. Também definidos em 5 de outubro, depois do dossiê e fora da cópia dele: o grafo de caminhada em oito direções compartilhado pelo app e pelo servidor, as quatro cercas vivas do prado, a inspeção de todo quadro no teste 6, a lista de nomes proibidos como trabalho a fazer e o adiamento dos achados de moedas. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Kiradex,
docs/WORLD.md, “Kiradex World: research and plan”, lido em 4 de outubro de 2026 (repositório privado): seção 1 (“The rules for Kiradex World”: nada deles no mundo); seção 4 (“Levels”: “XP comes only from the real world, which is the point of the app”; “Coins and the shop”: moedas ganhas com escaneamentos, níveis e visitas diárias; “The plaza”: salas de até uns 40 jogadores, divididas por região, a câmera seguindo o jogador limitada ao mapa); seção 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”); seção 6 (o mercado pelo eBay, a barraca); seção 7 (“Order of work”, cada fase uma build do TestFlight); e as decisões de 2 de outubro de 2026 (o servidor em FastAPI e WebSockets). ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Código-fonte do Kiradex, lido em 5 de outubro de 2026 (repositório privado):
Kiradex/World/TileMap.swift,path(from:to:)a partir da linha 325 (oito movimentos; uma diagonal custaFloat(2).squareRoot()e, na linha 348, é pulada a menos que os dois tiles entre os quais passa sejam caminháveis; o tile aberto mais barato é expandido primeiro), eserver/app/rooms.py,Plaza.patha partir da linha 52 (em largura sobre os quatro movimentos da linha 66; a docstring dele: “the same walk the app takes”). ↩↩↩↩↩ -
Dossiê de pesquisa do autor, “Beyond the plaza: routes, map connections and districts in the canon”, compilado em 4 de outubro de 2026, seções “Method” e 5 (“What is measured and what is not”): as definições de caminhada compartilhadas (um passo é uma célula; um ressalto de mão única e duas células; uma costura só conta onde a célula do vizinho que fica de frente é alcançável a partir de uma das portas dele, semeada a partir de outras conexões com um nível de profundidade para um vizinho sem warps; treinadores, NPCs e bloqueios da história ignorados; sem surf; a elevação da Gen 3 reduzida a alturas iguais ou a qualquer um dos lados em 0 ou 15; warps disparam ao serem pisados na entrada; árvores de Cut, pedras de Rock Smash e rochas de Strength bloqueadas, a menos que indicado), as ressalvas dos modelos de células da Gen 1 e da Gen 2, a ressalva do tempo do letreiro, o número da taxa de quadros, as ressalvas de classificação, as fontes secundárias não conferidas com os dados dos jogos e as leituras que não são fatos. Repositório do Kiradex,
docs/research/routes/01-routes.md; privado, com uma cópia no estado de pesquisa do autor. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
gbdev, Pan Docs, “Rendering” (70.224 pontos por quadro, “@ 59.7 fps”), salvo em 4 de outubro de 2026 como
pandocs-timing.txt, https://gbdev.io/pandocs/Rendering.html. ↩ -
pret,
pokeemerald/src/field_control_avatar.c(CheckStandardWildEncounter, linhas 668 a 686: enquantosWildEncounterImmunitySteps < 4, conta o passo e retorna sem testar; depois de umStandardWildEncounterbem-sucedido, volta a contagem para 0),src/overworld.c(RestartWildEncounterImmunityStepsemLoadMapFromCameraTransition, linha 800, e emLoadMapFromWarp, linha 850),src/battle_setup.c(a mesma chamada no início de uma batalha, linha 370),src/wild_encounter.c(StandardWildEncounter: o pulo de 40% numa mudança de comportamento, linhas 531 a 539 e 599;WildEncounterCheck, a partir da linha 502: a taxa vezes 16, reduzida pelas Mach Bike e Acro Bike a 80%, porApplyFluteEncounterRateModeApplyCleanseTagEncounterRateMode pela habilidade do Pokémon da frente, e depoisRandom() % 2880contra ela) esrc/data/wild_encounters.json(taxa terrestre 20 nas Rotas 101 a 104) em731ad5b, acessados em 4 e 5 de outubro de 2026, https://github.com/pret/pokeemerald/blob/master/src/field_control_avatar.c. ↩↩ -
pret,
pokefirered/src/wild_encounter.cem037335f, acessado em 4 e 5 de outubro de 2026:GetMapBaseEncounterCooldown(8 − rate/10passos, linha 686);HandleWildEncounterCooldown, linhas 707 a 755 (depois que os passos desde o último encontro atingem a espera, todo passo pode tentar; antes disso, cada passo numa célula de encontro soma um à contagem e deixa aquele passo tentar quandoRandom() % 100 < 5, sem encerrar a espera);TryStandardWildEncounter, linhas 757 a 776 (a contagem e o bônus só voltam a 0 depois que um encontro começa); o mesmo reinício a cada carregamento de mapa, em quesrc/overworld.c(linhas 764 e 799) chamaRestartWildEncounterImmunitySteps, que em FireRed chamaResetEncounterRateModifiers(src/field_control_avatar.c, linhas 735 a 737); o sorteio de 60% num comportamento novo (linha 370);DoWildEncounterRateTest, linha 309 (rate × 16maisencounterRateBuff × 16 / 200, sobreMAX_ENCOUNTER_RATE1.600); eAddToWildEncounterRateBuff, linha 778 (a taxa somada depois de cada sorteio fracassado, a menos que um Repel esteja ativo), https://github.com/pret/pokefirered/blob/master/src/wild_encounter.c. ↩↩ -
Medição do autor, 4 de outubro de 2026, a partir de
measure_gen12_routes.py(Red:ROUTE_1aROUTE_25contra os 11 ids de mapa abaixo de$0Bemconstants/map_constants.asm, blocos vezes 4; Crystal: ambiente ROUTE contra TOWN emdata/maps/maps.asm, tamanhos deconstants/map_constants.asm) e demeasure_connections.py(Emerald e FireRed:map_typecom tamanhos delayouts.json; os 11 mapasMAP_TYPE_OCEAN_ROUTEde Emerald, 45.600 células, excluídos do número terrestre; as rotas de FireRed incluem as Sevii Islands). Saídasgen12_routes.txteconnections.txt. ↩↩↩↩↩↩ -
Medição do autor, 4 de outubro de 2026:
measure_region_maps.pyna pasta de evidências do autor para este post, saídasregion_maps.txteregion_maps.json(Emerald: 129 quadrados de rota e 22 quadrados de cidade na grade de 28 por 15). ↩↩ -
Bulbapedia, “Kanto Route 1”, seção do guia, salva em 4 de outubro de 2026 como
bulba-route1.txt, https://bulbapedia.bulbagarden.net/wiki/Kanto_Route_1. Usada uma única vez, como conferência da busca de menos grama. ↩ -
Dossiês de pesquisa do autor para o post de estruturas, repositório do Kiradex,
docs/research/structures/01-structures-in-the-canon.md, seção 8.8 (“What to refuse”: “No ledges to jump, no climbing, no isometric”), e02-structures-craft-and-engine.md(oGetLedgeJumpDirectionde Emerald, que só deixa atravessar um ressalto na direção que o comportamento dele indica), 3 de outubro de 2026; privados. ↩↩↩↩ -
Blake Crosley, “Pixel-Art Structures: Houses, Halls and Interiors on iPhone”, blakecrosley.com, 3 de outubro de 2026 (seção 6: uma única regra de profundidade e a malha de objetos, warps como dados, andares trocados no lugar com
.id(floor.name); seção 7: os testes do servidor sobreplaza.jsone a lista do que a build não faz, incluindo “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) epokered/macros/scripts/maps.asm(os ponteiros de faixa da macroconnection) emd2704a6, acessados em 4 de outubro de 2026, https://github.com/pret/pokered/blob/master/macros/scripts/maps.asm. ↩↩↩ -
pret,
pokered/constants/map_data_constants.asm(MAP_BORDER EQU 3) epokered/home/overworld.asm(CheckMapConnections) emd2704a6, acessados em 4 de outubro de 2026, https://github.com/pret/pokered/blob/master/constants/map_data_constants.asm. ↩↩ -
pret,
pokered/data/maps/headers/Route22.asmeRoute23.asm(connection north, Route23, ROUTE_23, 0 ; unnecessarye a inversa) emd2704a6, acessados em 4 de outubro de 2026, https://github.com/pret/pokered/blob/master/data/maps/headers/Route22.asm. ↩ -
pret,
pokecrystal/data/maps/attributes.asm(conexões) edata/maps/maps.asm(tilesets, ambientes e grupos de mapas) em5beda23, acessados em 4 de outubro de 2026, https://github.com/pret/pokecrystal/blob/master/data/maps/attributes.asm. ↩ -
Documentação do Porymap, “Editing Map Connections”, salva em 4 de outubro de 2026 como
porymap-connections.txt, https://huderlem.github.io/porymap/manual/editing-map-connections.html. ↩↩ -
pret,
pokered/data/maps/objects/Route2Gate.asm(o assistente de Oak e um garoto) emd2704a6, acessado em 4 de outubro de 2026, https://github.com/pret/pokered/blob/master/data/maps/objects/Route2Gate.asm. ↩ -
pret,
pokered/scripts/BluesHouse.asm(a irmã do rival entregandoTOWN_MAPdepois queEVENT_GOT_POKEDEXestá ativado, e entãoEVENT_GOT_TOWN_MAP),engine/items/town_map.asm(DisplayTownMappercorrendo cada entrada deTownMapOrdersem checar visitas;wTownVisitedFlaglido só emBuildFlyLocationsList)data/tilesets/bookshelf_tile_ids.asm(bookshelf_tile HOUSE, $3D, TownMapText, um mapa de parede que abre a mesma tela),data/maps/headers/BluesHouse.asm(a casa do rival no tileset HOUSE; a casa do jogador usaREDS_HOUSE_1eREDS_HOUSE_2),gfx/blocksets/house.bst(o tile $3D só no bloco 14) emaps/BluesHouse.blk(o bloco 14 na segunda posição da fileira de cima) emd2704a6, acessados em 4 de outubro de 2026, https://github.com/pret/pokered/blob/master/scripts/BluesHouse.asm. ↩↩↩↩↩↩ -
pret,
pokecrystal/maps/CherrygroveCity.asm(o presente do senhor guia,setflag ENGINE_MAP_CARD, linha 72) eengine/pokegear/pokegear.asm(oPOKEGEAR_MAP_CARD_Fdo cartão de mapa;PokegearMap_CheckRegionmostrando o mapa de Kanto só quando o jogador está num ponto de referência de Kanto; os pontos de voo de Kanto retidos até a visita ao Indigo Plateau) em5beda23, acessados em 4 de outubro de 2026, https://github.com/pret/pokecrystal/blob/master/maps/CherrygroveCity.asm. ↩↩↩↩↩ -
Stardew Valley Wiki, “Modding:Maps”, salva em 4 de outubro de 2026 como
sdv-modding-maps.txt, https://stardewvalleywiki.com/Modding:Maps. ↩↩ -
Stardew Valley Wiki, “Pelican Town”, salva em 4 de outubro de 2026 como
sdv-pelican-town.txt, https://stardewvalleywiki.com/Pelican_Town. ↩ -
Stardew Valley Wiki, “Bus Stop”, salva em 4 de outubro de 2026 como
sdv-bus-stop.txt, https://stardewvalleywiki.com/Bus_Stop. ↩ -
Stardew Valley Wiki, “Cindersap Forest”, salva em 4 de outubro de 2026 como
sdv-cindersap.txt, https://stardewvalleywiki.com/Cindersap_Forest. ↩ -
Stardew Valley Wiki, “Backwoods”, salva em 4 de outubro de 2026 como
sdv-backwoods.txt, https://stardewvalleywiki.com/Backwoods. ↩ -
Stardew Valley Wiki, o quadro de navegação de locais como aparece em “Railroad”, salvo em 4 de outubro de 2026 como
sdv-railroad.txt, https://stardewvalleywiki.com/Railroad; 26 lugares pela contagem do autor. ↩ -
Stardew Valley Wiki, “The Mountain” (as duas saídas iniciais; as minas no dia 5 da primavera; a ferrovia depois do terremoto do dia 3 do verão; a ponte da pedreira pelos pacotes da sala de artesanato ou 25.000 g), salva em 4 de outubro de 2026 como
sdv-mountain.txt, https://stardewvalleywiki.com/The_Mountain. ↩↩↩↩ -
Stardew Valley Wiki, “The Desert” (o ônibus, os pacotes do cofre ou 40.000 g), “Secret Woods” (o tronco e um machado de aço) e “The Beach” (a ponte de 300 de madeira), salvas em 4 de outubro de 2026 como
sdv-desert.txt,sdv-secret-woods.txtesdv-beach.txt, https://stardewvalleywiki.com/The_Desert, https://stardewvalleywiki.com/Secret_Woods e https://stardewvalleywiki.com/The_Beach. ↩↩ -
Stardew Valley Wiki, “Speed”, salva em 4 de outubro de 2026 como
sdv-speed.txt, https://stardewvalleywiki.com/Speed. A página não dá unidades. ↩ -
Nookipedia, “Acre” (o acre de 16 por 16 espaços; a cidade do GameCube de cinco acres por seis; a estação em A-3; os rótulos; o surgimento de peixe e inseto na entrada e o sumiço a seis quadrados; os tamanhos de cidade dos jogos posteriores), salva em 4 de outubro de 2026 como
nook-acre.txt, https://nookipedia.com/wiki/Acre. ↩↩↩↩↩ -
Nookipedia, “Map”, salva em 4 de outubro de 2026 como
nook-map.txt, https://nookipedia.com/wiki/Map. ↩ -
Nookipedia, “Train” e “Train station”, salvas em 4 de outubro de 2026 como
nook-train.txtenook-train-station.txt, https://nookipedia.com/wiki/Train e https://nookipedia.com/wiki/Train_station. ↩ -
zladx, wiki do LADX-Disassembly, “Game engine documentation”, salva em 4 de outubro de 2026 como
ladx-engine.txt, https://github.com/zladx/LADX-Disassembly/wiki/Game-engine-documentation. ↩↩↩ -
zladx, wiki do LADX-Disassembly, “Maps data format” (o mapa do mundo externo de 512 bytes com ponteiros de sala de dois bytes; a sobreposição de 10 por 8), salva em 4 de outubro de 2026 como
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 de outubro de 2026 (seção 5: a receita do RealityKit, uma única malha
MeshDescriptorpara o mapa, os padrões do RealityView, a tabela de escala calculada a partir das páginas de especificações da Apple e dos perfis do simulador do Xcode 27, o mínimo de 11 pontos para texto e o texto em SwiftUI, o bug da animação de opacidade e o véu dele, a captura comXCUIScreende dentro do bundle; “Since publishing”: um único mapa de letras exportado para o app e para o servidor; a pergunta frequente sobre direito autoral e patentes), https://blakecrosley.com/blog/pixel-art-world-on-iphone. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Apple, “iPhone Duo: Technical Specifications”, salva em 4 de outubro de 2026 como
apple-duo-specs.txt, https://www.apple.com/iphone-duo/specs/. ↩ -
Apple, Human Interface Guidelines, “Designing for games” (pelo JSON da documentação), salva em 4 de outubro de 2026 como
hig-games-plain.txt, https://developer.apple.com/design/human-interface-guidelines/designing-for-games. ↩↩ -
Código-fonte do Kiradex,
Kiradex/World/PlazaStage.swift, lido em 5 de outubro de 2026 (repositório privado): linhas 132 e 133 (no warp de uma porta,Task.sleep(for: .milliseconds(220))e depoisonWarp(warp), sem fade) e linhas 698 a 700 (um warpfloor:define o novo andar no lugar, sem fade). ↩ -
Apple Developer Documentation, “targetTimestamp” (uma propriedade de instância de
CADisplayLink, Core Animation; iOS e iPadOS 10.0 e posteriores), salva em 4 de outubro de 2026 (o resumo, “The time interval that represents when the next frame displays”, o intervalo de tempo que representa quando o próximo quadro é exibido, e o exemplo que adiciona o display link ao run loop principal), https://developer.apple.com/documentation/quartzcore/cadisplaylink/targettimestamp. ↩↩ -
Código-fonte do Kiradex,
Kiradex/World/Wants.swift(“What the town’s own collectors ask to be shown, and whether the collection has it”, o que os próprios colecionadores da cidade pedem para ver e se a coleção tem) eKiradex/World/Quests.swift(as missões do dia e da semana, “judged from the collection itself”), lidos em 4 de outubro de 2026; repositório privado. ↩↩ -
Medição do autor, 5 de outubro de 2026:
measure_meadow_gate.pyna pasta de evidências do autor para este post, saídameadow_gate.txt. Ele junta o Largo, o Passeio do Prado e a Beira do Lago do briefing numa única grade, com os tamanhos da seção 7: o Largo como a forja o entrega (town.json, 40 por 30, a chegada na coluna 19, fileira 13, as letras caminháveis do servidor), com a cerca norte aberta ao longo da borda compartilhada; o Passeio do Prado, 24 por 60, 4 tiles para dentro a partir da ponta oeste do Largo para que a alameda encontre o gramado entre o salão e a casa a leste dele, a alameda de 2 tiles de largura atrás de uma cerca viva no lado leste, com o portão como aresta de mão única na ponta do lago, e o resto atravessado por quatro cercas vivas, nas fileiras 12, 24, 36 e 48 do prado, com aberturas de 2 tiles testadas em todas as posições; a Beira do Lago, 36 por 20, centralizada no passeio, com a metade norte de lago e o píer de 2 tiles de largura alinhado com a alameda e medido até o tile do lado da terra. Ele percorre o grafo do app (TileMap.path): oito direções, uma diagonal que custa √2 e é recusada quando qualquer um dos tiles entre os quais passa está bloqueado; o portão recusa qualquer passo da alameda em direção ao lago e só admite um passo reto vindo do lago. A sinuosidade é a caminhada mais curta do próprio prado, da borda sul à borda norte, a oeste da alameda. Duas cercas vivas, nas fileiras 20 e 40 do prado, fazem-no serpentear de 59,00 a 66,46 tiles em todas as 400 posições, três (fileiras 15, 30 e 45) de 59,00 a 79,77 (6 de 8.000 dentro de 78 a 90), quatro de 59,00 a 95,43 (5.912 de 160.000 dentro de 78 a 90); esses limites valem para cercas vivas igualmente espaçadas, e espaçamentos desiguais serpenteiam mais pela mesma função (r7_uneven_probe.py, 5 de outubro, saídar7_uneven_probe.txt: duas cercas vivas nas fileiras 0 e 2 chegam a 77,00, três nas fileiras 20, 22 e 24 chegam a 95,00). A mesma varredura com três cercas vivas, nas fileiras 15, 30 e 45 do prado (acrescentada à seção 5 do script em 5 de outubro, depois da sexta rodada do gate de revisão): as 6 disposições dão volta de 88,07 tiles e ida de 114,05 a 120,44, razão de 0,731 a 0,772, todas em 0,8 ou abaixo, e 5 delas ficam dentro da faixa de 110 a 120, ida de 114,05 a 119,02, razão de 0,740 a 0,772. Então três cercas vivas cumprem todas as metas em 5 posições; quatro, a escolha do autor, cumprem em 4.111. Nessas 5.912 disposições com quatro cercas vivas: volta de 88,07 tiles, ida de 108,74 a 133,75, razão de 0,658 a 0,810, 5.886 em 0,8 ou abaixo; a meta de 0,8 exige 88,07 ÷ 0,8 = 110,09 na ida; dentro da faixa de 110 a 120, 4.111 disposições, ida de 110,15 a 119,95, razão de 0,734 a 0,800, todas em 0,8 ou abaixo. Da chegada à borda norte são 17,07 tiles; com o portão aberto nos dois sentidos, as caminhadas são iguais (88,07 em cada sentido numa disposição de cada número de cercas vivas). Em todos os deslocamentos de 0 a 16 tiles e nas duas posições do píer, a ida mais curta é de 107,18 e a volta mais curta de 88,07; a 4 tiles por segundo, 110 e 120 tiles são 27,5 e 30 segundos. A mesma saída se confere com o modelo anterior: rodada a partir da cópia salva dele, a busca em largura em quatro direções com duas cercas vivas mantém 125 disposições, ida de 113 a 119, volta de 91, razão de 0,765 a 0,805, e essas 125 disposições percorridas em oito direções dão ida de 97,18 a 99,67, volta de 88,07, razão de 0,884 a 0,906, nenhuma em 0,8. Aquele modelo anterior contava a sinuosidade como os passos no prado do caminho mais curto que a busca devolvesse, o que empates podem mudar; a sinuosidade de borda a borda não pode mudar. Disposições que o briefing não descreve, varridas na mesma saída: com o píer no meio da margem, a melhor razão é 0,721 (deslocamento 4, 2.182 de 5.912 disposições em 0,8 ou abaixo), e onde a alameda encontra um prédio o portão não economiza nada. ↩↩↩↩ -
Apple Developer Documentation, “preferredFrameRateRange” (uma propriedade de instância de
CADisplayLink, Core Animation; iOS e iPadOS 15.0 e posteriores), salva em 4 de outubro de 2026 (a discussão: o display link faz o possível para chamar dentro da faixa, o sistema também leva em conta o hardware, outros trabalhos, o Modo de Pouca Energia, o estado térmico e os ajustes de acessibilidade, e por padrão a faixa é igual à taxa máxima de atualização da tela), https://developer.apple.com/documentation/quartzcore/cadisplaylink/preferredframeraterange. ↩↩