Routes en pixel art : connexions de cartes et quartiers sur iPhone
Les trois premières générations de Pokémon parcourent toutes une cellule de 16 pixels en 16 images, environ 3,73 cellules par seconde, et le collectionneur de Kiradex marche à 4 tuiles par seconde, si bien qu’une route mesurée dans les anciens jeux se convertit dans notre ville à un quart de seconde par tuile.1234 La première route de chaque jeu s’étend sur deux à six écrans de console et ne compte aucun dresseur ; le premier trajet, de la porte d’entrée du joueur au Centre Pokémon de la ville suivante, fait 58 cellules et 15,5 secondes de marche dans Émeraude, 94 cellules et 25,2 secondes dans Rouge Feu, et le retour est plus court dans les deux, 42 et 76 cellules, sur des routes dont tous les rebords regardent vers la maison.567 Là où le graphisme change, Kanto place un bâtiment sur la route : 76 des 78 connexions de cartes de Rouge relient un seul jeu de tuiles, et chaque poste de passage de Rouge entre deux lieux différents en relie deux.8 Le moteur de Hoenn copie sept cellules de la carte voisine dans une marge autour de la carte courante, sept sur trois côtés et huit à l’est, les dessine avec les tuiles de la carte courante, et ne charge les tuiles secondaires et la palette propres au voisin qu’au moment où vous traversez, sans fondu.910 L’écran de carte d’Émeraude est une grille de 28 cases sur 15 ; une carte murale à l’étage de la maison du joueur à Bourg-en-Vol l’ouvre, le PokéNav l’emporte à partir de Mérouville, et il dessine chaque lieu, visité ou non, sauf deux qui attendent des drapeaux de scénario, tandis que Vol ne propose que les villes dont le drapeau « visité » a été posé à votre arrivée.111213 Kiradex World est aujourd’hui une seule ville de 40 sur 30, sans rien au-delà de la clôture.14 J’ai donc mesuré dans les décompilations les routes, raccords, postes et écrans de carte du canon, lu Stardew Valley, Animal Crossing et Link’s Awakening comme modèles contrastés, et traduit les chiffres en un cahier des charges : quatre zones au-delà de la place, un écran de carte et un tram qui ouvre une station la première fois que vous y arrivez.
En bref
- Une cellule de marche coûte 16 images, environ un quart de seconde. Rouge, Cristal et Émeraude marchent tous à 16 images par cellule et courent ou roulent à 8, ce qui, aux 59,7 hertz du matériel, donne 3,73 et 7,47 cellules par seconde ; Kiradex est réglé pour marcher à 4 tuiles par seconde, environ 7 % plus vite que les consoles portables, et pour courir à 6,4 nominal, qu’un modèle image par image de son code ramène à 6,00 à 60 hertz, environ 20 % sous leur course.1231541617
- Une route fait 2 à 10 écrans, et la première est courte et la plus herbeuse. Seize routes mesurées couvrent de 2,0 (Émeraude, Route 101) à 10,0 (Cristal, Route 32) écrans de console le long de leur axe ; les quatre premières routes comptent 14,4 % à 22,8 % de hautes herbes en surface de carte, le plus de chaque jeu, et aucun dresseur. Sur les neuf routes dont les deux extrémités se rejoignent à pied, la traversée la plus longue vaut 1,15 à 1,70 fois le grand côté de la route parce que le chemin serpente, et le retour 0,95 à 1,42.5617
- Les rebords raccourcissent le chemin du retour. Sur les neuf routes mesurées dont les deux extrémités se rejoignent à pied, toutes dotées de rebords, la marche vers la ville précédente est de 2 % à 44 % plus courte, et le minimum de cellules de hautes herbes au retour est de 0 à 5, contre 4 à 19 à l’aller.5618
- Les postes de passage se dressent là où le graphisme change, et ils portent les règles. Chaque poste de Rouge entre deux lieux relie deux jeux de tuiles ; les postes abritent une vérification de badge, un garde assoiffé et trois récompenses pour la possession de 10, 30 et 50 espèces. Le moteur de Hoenn charge un nouveau jeu de tuiles au raccord et ne garde que 4 bâtiments de passage, contre 27 cartes sur jeu de tuiles de poste dans Rouge.8192010
- Un raccord de troisième génération dessine sept cellules du voisin (huit à l’est) et charge son graphisme au passage. La marge du tampon est
MAP_OFFSET 7parce que « the player has 7 metatiles of view horizontally in either direction » (le joueur voit 7 métatuiles horizontalement de chaque côté), et le côté est copieMAP_OFFSET + 1colonnes ; le passage charge le jeu de tuiles secondaire, la musique et la météo de la nouvelle carte et fait glisser un cartouche de nom pendant environ 3,2 secondes, sans fondu.91021 - L’écran de carte montre chaque lieu ; le voyage rapide montre où vous êtes allé. La carte d’Émeraude fait 28 cases sur 15, dont 158 occupées par 54 lieux, et dès que le joueur peut l’ouvrir (une carte murale à l’étage de la maison, puis le PokéNav), elle dessine chaque lieu, visité ou non, sauf deux retenus par des drapeaux de scénario ; une ville ne devient destination de Vol que lorsque son drapeau
FLAG_VISITED_*est posé à l’arrivée, et Rouge, Rouge Feu, Cristal et Link’s Awakening tiennent le même genre de registre des visites.11121322232425 - Ce que cela donne à Kiradex. Un cahier des charges pour quatre zones au-delà de la Grand-Place (la rue des Classeurs, la promenade des Prés, le Bord du lac et le quartier des Galeries) couvrant 2,8 fois la surface de la Grand-Place, des raccords ouverts sans fondu, un seul graphe de marche à huit directions pour l’app et le serveur, un écran de carte de 16 sur 12, un tram dont les stations s’ouvrent à la première visite, des trouvailles qui ne sont que des cosmétiques ou des notes de quête, et treize vérifications de recette qu’un script ou une capture peut exécuter.262728
1. Les routes, mesurées
Les trois billets de cette série publiés le 3 octobre sont restés à l’intérieur de la clôture. Des mondes en pixel art sur iPhone a fixé le système de tuiles et la recette RealityKit, Des personnages en pixel art le collectionneur, et Des structures en pixel art les bâtiments et les portes. Kiradex World en est sorti sous la forme d’une seule ville : 40 tuiles sur 30, la forêt dessinée sur 12 tuiles au-delà de la clôture, sept bâtiments dont les portes mènent à des pièces ou à la halle, et une tuile d’arrivée.14 Ce billet porte sur ce qui se trouve au-delà de la clôture, et il commence là où les précédents ont commencé : par les décompilations.
Chaque chiffre Pokémon ci-dessous a été mesuré sur des clones superficiels des décompilations de pret, à pokered d2704a6, pokecrystal 5beda23, pokeemerald 731ad5b et pokefirered 037335f, par six petits scripts Python qui se relancent chacun en une seconde environ ou moins ; les notes nomment le script derrière chaque chiffre.29 L’unité est la cellule, un carré de marche de 16 pixels sur 16 : une métatuile de troisième génération, ou le quart d’un bloc de première ou de deuxième génération. Un écran de Game Boy affiche 10 cellules sur 9 (160 pixels sur 144) et un écran de Game Boy Advance 15 sur 10 (240 sur 160).29 Le modèle de marche est le même dans chaque script : un pas coûte une cellule ; un rebord ne se franchit que dans son sens et fait atterrir une cellule plus loin, soit deux cellules de déplacement ; dans Cristal, un pas ne peut pas traverser le mur à sens unique d’une tuile, et un rebord d’angle saute dans l’un ou l’autre de ses deux sens (la section 2 donne le code) ; un raccord ne compte que là où la cellule d’en face chez le voisin est accessible à pied depuis l’une des portes du voisin ; les dresseurs et les autres personnages sont ignorés, et le Surf n’est pas modélisé.29
L’horloge
Les trois générations marchent au même rythme. Dans Rouge, OverworldLoop appelle DelayFrame deux fois par itération et AdvancePlayerSprite déplace la vue de 2 pixels par itération pendant 8 itérations (wWalkCounter vaut 8), si bien qu’une cellule prend 16 images ; à vélo, AdvancePlayerSprite s’exécute deux fois par itération, 8 images par cellule.1 Les StepVectors de Cristal donnent à un pas de marche 8 ticks de 2 pixels et à un pas de vélo 4 ticks de 4 pixels, et son monde extérieur exécute un tick toutes les 2 images (MaxOverworldDelay: db 2), soit à nouveau 16 images par cellule à pied et 8 à vélo.2 Les tables de pas d’Émeraude comptent 16 entrées pour la marche (sStep1Funcs), 8 pour la course et le Surf, 6 pour le Vélo Cross et les courants, 4 pour le Vélo Course à pleine vitesse et 2 pour la plus rapide ; un saut de rebord (JUMP_DISTANCE_FAR) prend 32 images pour deux cellules et monte de 12 pixels à son sommet (sJumpY_High).3
L’image est l’autre moitié de l’horloge. GBATEK donne l’image de la Game Boy Advance comme 280 896 cycles, « ca. 59.737 Hz » (environ 59,737 Hz) ; Pan Docs donne celle de la Game Boy comme 70 224 points « @ 59.7 fps » (à 59,7 images par seconde).1530 À 16 images par cellule, la marche vaut environ 3,73 cellules par seconde et la course environ 7,47.17 Les secondes de ce billet utilisent 224 hertz divisés par 280 896, soit 59,7275 images par seconde ; GBATEK donne 59,737, et l’écart est inférieur à 0,02 %.29
Le collectionneur de Kiradex marche à tilesPerSecond = 4 et court à 1,6 fois cette valeur, soit 6,4 tuiles par seconde en nominal.4 Le chiffre de la course est la constante, pas la vitesse qu’atteint le code : le billet de cette série consacré au mouvement a modélisé le code image par image et constaté que la course couvre 6,00 tuiles par seconde à 60 hertz et 6,32 à 120, parce que chaque pas jette la progression qu’il a dépassée.16 La marche est environ 7 % plus rapide que celle des consoles portables ; la course est environ 20 % sous la leur à 60 hertz, et 14 % sous la leur à ses 6,4 nominaux.17 La marche est assez proche pour qu’une distance mesurée en leurs cellules se convertisse en nos tuiles à un taux fixe : le temps d’une route vaut ses cellules fois 0,27 seconde à la marche des consoles portables, et ses tuiles fois 0,25 seconde à la nôtre.17
Seize routes
J’ai mesuré les quatre premières routes de chaque jeu : les Routes 1 à 4 de Rouge, 29 à 32 de Cristal, 101 à 104 d’Émeraude et 1 à 4 de Rouge Feu. Les cellules de troisième génération sont lues dans map.bin (bits 0 à 9 pour la métatuile, 10 et 11 pour la collision, 12 à 15 pour l’élévation) et le comportement de chaque cellule est recherché dans le metatile_attributes.bin primaire ou secondaire ; les dresseurs sont les événements d’objet de la carte dont le trainer_type n’est pas TRAINER_TYPE_NONE.6 Les cellules de première génération lisent la tuile de 8 sur 8 en bas à gauche de chaque cellule de 16 sur 16 et la comparent à la liste de collision du jeu de tuiles, à la tuile d’herbe $52 et à la table des rebords ; les cellules de deuxième génération lisent les quatre octets de collision que chaque bloc porte par quadrant.5
| Jeu | Route | Taille (cellules) | Écrans le long de son axe | Praticable | Hautes herbes, cellules (% de la carte) | Cellules de rebord / séries | Dresseurs | Traversée la plus courte, dans chaque sens (cellules) |
|---|---|---|---|---|---|---|---|---|
| Rouge | 1 | 20 sur 36 | 4,0 | 76,8 % | 104 (14,4 %) | 42 / 10 | 0 | sud 40, nord 52 |
| Rouge | 2 | 20 sur 72 | 8,0 | 55,9 % | 84 (5,8 %) | 52 / 14 | 0 | coupée par une forêt |
| Rouge | 3 | 70 sur 18 | 7,0 | 35,1 % | 100 (7,9 %) | 36 / 10 | 8 | vers Argenta 82, en s’éloignant 84 |
| Rouge | 4 | 90 sur 18 | 9,0 | 45,0 % | 60 (3,7 %) | 169 / 27 | 1 | coupée par une grotte |
| Cristal | 29 | 60 sur 18 | 6,0 | 47,7 % | 160 (14,8 %) | 35 / 13 | 0 | est 71, ouest 90 |
| Cristal | 30 | 20 sur 54 | 6,0 | 47,6 % | 140 (13,0 %) | 21 / 6 | 3 | sud 57, nord 74 |
| Cristal | 31 | 40 sur 18 | 4,0 | 39,3 % | 64 (8,9 %) | 13 / 5 | 1 | l’extrémité ouest est un poste |
| Cristal | 32 | 20 sur 90 | 10,0 | 48,3 % | 152 (8,4 %) | 6 / 5 | 8 | sud 132, nord 128 |
| Émeraude | 101 | 20 sur 20 | 2,0 | 59,2 % | 91 (22,8 %) | 13 / 3 plus 1 angle | 0 | sud 19, nord 34 |
| Émeraude | 102 | 50 sur 20 | 3,3 | 48,9 % | 143 (14,3 %) | 17 / 4 | 4 | est 55, ouest 62 |
| Émeraude | 103 | 80 sur 22 | 5,3 | 27,3 % | 92 (5,2 %) | 24 / 3 | 9 | coupée par la mer |
| Émeraude | 104 | 40 sur 80 | 8,0 | 34,0 % | 126 (3,9 %) | 13 / 4 | 8 | coupée par une forêt |
| Rouge Feu | 1 | 24 sur 40 | 4,0 | 62,3 % | 178 (18,5 %) | 61 / 10 | 0 | sud 43, nord 58 |
| Rouge Feu | 2 | 24 sur 80 | 8,0 | 40,8 % | 84 (4,4 %) | 44 / 13 | 0 | coupée par une forêt |
| Rouge Feu | 3 | 84 sur 20 | 5,6 | 37,6 % | 117 (7,0 %) | 42 / 10 | 8 | vers Argenta 94, en s’éloignant 97 |
| Rouge Feu | 4 | 108 sur 20 | 7,2 | 42,9 % | 84 (3,9 %) | 186 / 28 | 1 | coupée par une grotte |
Sources du tableau : measure_gen12_routes.py et measure_gen3_routes.py sur les quatre décompilations.56 La colonne des écrans divise le grand côté par la vue de la console le long de cet axe (10 ou 9 cellules sur Game Boy, 15 ou 10 sur Game Boy Advance). La colonne « praticable » est la part des cellules sur lesquelles un marcheur peut se tenir. Les cellules de rebord sont les cellules de saut dans les générations 1 et 3 et les cellules de lèvre dans la génération 2. Les marches relient des cellules de raccord accessibles depuis une porte, et une route coupée est une route où aucune marche de raccord à raccord n’existe à l’intérieur de la carte, parce qu’une forêt, une grotte, un poste ou la mer s’interpose entre les deux moitiés.29
Longueur des routes sur le grand axe, avec la traversée la plus courte dans chaque sens ; dessiné par figures/make_figures.py à partir des sorties des deux scripts de routes.
Cinq choses ressortent du tableau.
Les routes couvrent 2 à 10 écrans, et la première est courte. La Route 101 d’Émeraude fait deux écrans de Game Boy Advance de haut ; la Route 32 de Cristal dix écrans de Game Boy ; la première route de chaque jeu deux à six écrans.56 En cellules, les routes mesurées vont de 20 à 108 le long de leur grand côté.6
La traversée la plus longue vaut 1,15 à 1,70 fois le grand côté. Neuf des seize routes peuvent se parcourir d’un bout à l’autre. Sur ces neuf, la marche la plus courte dans le sens le plus long, rapportée au grand côté de la route, donne 34 sur 20, 1,70, vers le nord sur la Route 101 d’Émeraude ; 90 sur 60, 1,50, sur la Route 29 de Cristal ; 132 sur 90, 1,47, sur la Route 32 de Cristal ; 58 sur 40, 1,45, sur la Route 1 de Rouge Feu ; 52 sur 36, 1,44, sur la Route 1 de Rouge ; 74 sur 54, 1,37, sur la Route 30 de Cristal ; 62 sur 50, 1,24, sur la Route 102 d’Émeraude ; 84 sur 70, 1,20, sur la Route 3 de Rouge ; et 97 sur 84, 1,15, sur la Route 3 de Rouge Feu.5617 Le retour est plus droit, 0,95 à 1,42 fois le grand côté : 19 sur 20 sur la Route 101 d’Émeraude, 57 sur 54 sur la Route 30 de Cristal, 43 sur 40 sur la Route 1 de Rouge Feu, 55 sur 50 sur la Route 102 d’Émeraude, 40 sur 36 sur la Route 1 de Rouge, 94 sur 84 sur la Route 3 de Rouge Feu, 82 sur 70 sur la Route 3 de Rouge, 71 sur 60 sur la Route 29 de Cristal, et 128 sur 90 sur la Route 32 de Cristal, dont les murs à sens unique envoient la marche faire le grand tour dans les deux sens.5617 Un rapport inférieur à 1 n’est pas un raccourci à travers l’espace : une marche d’une cellule de raccord de la première rangée à une cellule de la dernière rangée d’une carte de 20 cellules prend 19 pas, si bien qu’une route parfaitement droite obtient 0,95.17 Selon ma lecture, c’est le chiffre de l’aller qui sert à dimensionner une route : son chemin sinueux, pas son rectangle englobant.
L’herbe se raréfie à mesure que le voyage avance. Les hautes herbes couvrent de 3,7 % à 22,8 % de la carte d’une route. Les quatre premières routes, Rouge 1, Cristal 29, Émeraude 101 et Rouge Feu 1, sont les plus herbeuses des quatre de leur jeu, à 14,4 %, 14,8 %, 22,8 % et 18,5 % ; les deuxièmes routes vont de 4,4 % à 14,3 % et les troisièmes et quatrièmes de 3,7 % à 8,9 %.56 Rapportées au sol sur lequel on peut se tenir, les parts sont plus grandes et la tendance ne tient qu’en moyenne : les premières routes comptent 18,8 % à 38,4 % de hautes herbes et les douze suivantes 8,2 % à 29,2 %, et la Route 3 de Rouge (22,6 %) est plus herbeuse sous le pied que la Route 1 de Rouge (18,8 %). Sur la Route 101 d’Émeraude, 91 des 237 cellules praticables sont des hautes herbes, 38,4 %.5617
Aucune première route n’a de dresseur. Rouge 1, Rouge Feu 1, Émeraude 101 et Cristal 29 n’en ont aucun ; les dresseurs commencent sur la deuxième ou la troisième route, avec 4 sur la Route 102 d’Émeraude, 3 sur la Route 30 de Cristal et 8 sur la Route 3 de Rouge et de Rouge Feu.56 Leurs portées de vue sur ces routes vont de 0 à 7 cellules ; les neuf dresseurs de la Route 103 d’Émeraude voient de 1 à 5 cellules et les huit de la Route 104 de 0 à 7.6
Une zone de rencontre tire environ un pas sur neuf, après une courte période de grâce. Émeraude ne teste jamais les quatre premiers pas après que le joueur est entré dans une carte, par un raccord ou une porte, ni après un combat : CheckStandardWildEncounter décompte ces pas tant que sWildEncounterImmunitySteps < 4 et relance le décompte après chaque rencontre, et chaque chargement de carte et chaque début de combat le relancent aussi. Ensuite, chaque pas sur une cellule de rencontre est testé : 40 % de chances de sauter le test quand le pas mène sur un comportement différent, puis Random() % 2880 < rate × 16. Les Routes 101 à 104 utilisent toutes le taux 20, si bien que le tirage non modifié est de 320 sur 2 880, 11,1 % par pas à pied ; un vélo, une flûte, une Rune Purifiante ou certains talents du Pokémon de tête le modulent d’abord.31 Rouge Feu ajoute un plancher et une rampe : après une rencontre, et à l’entrée dans une carte, un temps de recharge de 8 − rate/10 pas sur des cellules de rencontre (6 pour le taux 21 des Routes 1 à 4), pendant lequel un tirage de 5 % à chaque pas permet à ce seul pas de tenter une rencontre sans mettre fin à la recharge ; puis le tirage de 60 % sur un nouveau comportement ; puis rate × 16 sur 1 600, 21 %, plus un bonus qui augmente du taux après chaque tirage raté (encounterRateBuff).32 Je lis la grâce, le plancher et la rampe comme des moyens de garder courtes à la fois les disettes et les déluges. Kiradex n’aura pas de combats sauvages, donc le chiffre ne compte ici que comme un rythme : passé les premiers pas, une première route offre quelque chose à remarquer environ tous les neuf pas dans l’herbe.
Quelle part d’un monde est de la route
| Jeu | Cartes de route | Cellules de route | Cartes de ville | Cellules de ville | Route sur ville |
|---|---|---|---|---|---|
| Rouge | 25 | 31 500 | 11 | 11 880 | 2,65 |
| Cristal (Johto et Kanto) | 54 | 49 880 | 23 | 25 380 | 1,97 |
| Émeraude (routes terrestres) | 41 | 87 787 | 16 | 23 700 | 3,70 |
| Rouge Feu (avec Sevii) | 57 | 98 451 | 19 | 25 470 | 3,87 |
Les routes occupent deux à quatre fois la surface des villes.33 Les 11 routes maritimes d’Émeraude ajouteraient 45 600 cellules de plus.33 Le rapport dépend de la façon dont une carte est classée, et chaque jeu classe différemment : Rouge par identifiant et nom de carte, Cristal par environnement (son environnement ROUTE inclut par exemple l’extérieur des Ruines d’Alpha), Émeraude et Rouge Feu par map_type, les routes de Rouge Feu incluant les îles Sevii et celles d’Émeraude excluant l’océan.33 Sur l’écran de carte d’Émeraude, le même monde se lit comme 129 cases de route pour 22 cases de ville, 5,9 pour 1, parce qu’une ville prend une ou deux cases quelle que soit sa taille : dix de ses 16 villes en prennent une, et six en prennent deux.341117
La Route 1, de trois façons
Rouge, Rouge Feu et Cristal dessinent la même idée à trois résolutions, et la Route 1 est la comparaison la plus nette. Celle de Rouge fait 10 blocs sur 18, 20 cellules sur 36, quatre écrans de Game Boy de haut, avec 42 cellules de rebord en 10 séries orientées vers le sud entre des poteaux de clôture et des rangées d’arbres, et 104 cellules d’herbe.5 Pour vérifier le modèle de cellules de première génération, j’ai rendu cette seule carte à partir de son jeu de blocs, en taille double avec une grille de 16 pixels ; on y voit, à l’extérieur de la rangée d’arbres ouest, une bande de sol dégagé de 3 cellules qui touche les deux raccords et qu’aucune porte des deux villes ne permet d’atteindre, raison pour laquelle les recherches amorcent leurs passages depuis les portes des voisins.5 Le modèle de première génération lit une tuile de 8 sur 8 par cellule, celle en bas à gauche, et il n’a été vérifié à l’œil que sur ce rendu ; les collisions par paires de tuiles, comme les paires eau-terre, ne sont pas modélisées.29
La Route 1 de Rouge Feu fait 24 cellules sur 40, toujours quatre écrans de haut sur l’écran plus grand, avec 61 cellules de rebord et 178 cellules d’herbe, 18,5 % de la carte : le remake a gardé la longueur en écrans, agrandi la carte de 4 cellules dans chaque sens et ajouté des rebords.6 De la porte d’entrée de Bourg Palette au Centre de Jadielle, il y a 94 cellules, 25 secondes, et 76 en sens inverse.7 La route d’ouverture de Cristal, la Route 29, fait 60 cellules sur 18, six écrans de Game Boy de large, 14,8 % d’herbe, sans dresseur ; la traversée du côté de Bourg Geon à celui de Ville Griotte fait 90 cellules, et le retour 71.5
2. De porte à porte, et le chemin du retour
La longueur propre d’une route n’est qu’une partie d’un trajet. Ce que le joueur ressent, c’est l’étape : sortir d’un bâtiment, traverser une ville, franchir la route et la ville suivante, entrer dans le bâtiment suivant. measure_travel.py explore tout ce chemin, sur des paires (carte, cellule), à travers raccords, téléporteurs et rebords, de la cellule sous la première porte jusqu’à la dernière porte, en comptant le pas qui y entre.7
| Jeu | De | À | Cellules | Marche | Course | Cartes traversées |
|---|---|---|---|---|---|---|
| Émeraude | Bourg-en-Vol, maison du joueur | Centre de Rosyères | 58 | 15,5 s | 7,8 s | bourg, route, bourg |
| Émeraude | Centre de Rosyères | Centre de Clémenti-Ville | 87 | 23,3 s | 11,7 s | bourg, route, ville |
| Émeraude | Centre de Clémenti-Ville | Centre de Mérouville | 250 | 67,0 s | 33,5 s | ville, route, forêt, route, ville |
| Rouge Feu | Bourg Palette, maison du joueur | Centre de Jadielle | 94 | 25,2 s | 12,6 s | bourg, route, ville |
| Rouge Feu | Centre de Jadielle | Centre d’Argenta | 267 (156 après Coupe) | 71,5 s (41,8 s) | 35,8 s | par les deux postes de la forêt |
| Rouge Feu | Centre d’Argenta | Centre de la Route 4 | 150 | 40,2 s | 20,1 s | ville, route, route |
| Rouge Feu | Centre de la Route 4 | Centre d’Azuria | 314 | 84,1 s | 42,3 s | par trois niveaux de grotte, dont un deux fois |
Les secondes de marche valent les cellules fois 16 images divisées par 59,7275 hertz. La course est une seconde recherche du nombre minimal d’images, 8 par cellule, chaque saut de rebord restant à 32 images, parce que le saut est le même saut de 32 images à toute allure ; des sept étapes ci-dessus, seule l’étape de la grotte saute un rebord, une fois, ce qui la porte à 2 528 images au lieu de 2 512. Le chiffre « après Coupe » est la même recherche avec les cinq arbres à Coupe de la Route 2 retirés, ce qui ouvre le chemin est par ROUTE2_EAST_BUILDING. Les fondus et les combats ne sont pas comptés.7 Deux simplifications de la recherche pèsent le plus sur l’étape de la grotte : l’élévation de troisième génération est réduite à deux cas, hauteurs égales ou l’un des deux côtés à 0 ou 15, et un téléporteur se déclenche quand on y entre plutôt que quand on y arrive ; les 314 cellules à travers la grotte, dont le chemin passe par 1F, B1F, B2F puis de nouveau B1F, sont donc le chiffre le moins sûr du tableau.29
De porte à porte, à l’aller, et au retour là où il a été mesuré, avec les cibles du cahier des charges à côté du canon ; dessiné par figures/make_figures.py à partir de travel.json.
Une première étape représente 15 à 25 secondes de marche. De la porte de la maison au Centre de la ville suivante, il y a 58 cellules, 15,5 secondes, dans Émeraude et 94 cellules, 25,2 secondes, dans Rouge Feu.7 Les étapes qui atteignent la minute (les 250 cellules d’Émeraude, les 267 et 314 de Rouge Feu) traversent une forêt ou une grotte ; selon ma lecture, ce sont des donjons, pas des routes, et un donjon est un lieu d’un autre genre.
Le retour est plus court. Du Centre de Rosyères à la maison du joueur à Bourg-en-Vol, il y a 42 cellules contre 58 à l’aller ; de Jadielle à Bourg Palette 76 contre 94 ; de Clémenti-Ville à Rosyères 81 contre 87 ; de Mérouville à Clémenti-Ville 196 contre 250 ; d’Argenta à Jadielle 254 contre 267.7
Une CS est un raccourci par un poste devant lequel vous êtes déjà passé. Sans les arbres à Coupe de la Route 2, Jadielle à Argenta fait 156 cellules au lieu de 267, et le chemin passe par le bâtiment est de la Route 2 au lieu de la forêt.7
Les trois premières étapes de Hoenn
Émeraude s’ouvre sur trois réponses différentes à la question de ce qui se trouve entre les villes, et les mesures rendent la conception lisible.
La Route 101 est un couloir avec une porte d’entrée à chaque bout. Elle fait 20 cellules sur 20, deux écrans de haut, 22,8 % de hautes herbes, 91 des 237 cellules sur lesquelles on peut se tenir ; trois séries de rebords de quatre cellules orientées vers le sud la traversent. Marcher vers le nord depuis Bourg-en-Vol prend 34 cellules et traverse au moins 10 cellules d’herbe ; marcher vers le sud depuis Rosyères en prend 19 et peut éviter entièrement l’herbe en sautant les rebords. De la porte d’entrée du joueur au Centre de Rosyères, il y a 58 cellules, 15,5 secondes de marche.6187
La Route 102 est plus large et accueille les premiers dresseurs. Elle fait 50 cellules sur 20, 3,3 écrans de large, 14,3 % d’herbe, avec 4 dresseurs dont la vue porte à 2 ou 3 cellules, un étang de 26 cellules d’eau et 17 cellules de rebord. Clémenti-Ville s’y raccorde avec un décalage de −10, si bien que les 20 rangées de la route font face aux rangées 10 à 29 de Clémenti-Ville. De Centre à Centre, Rosyères à Clémenti-Ville fait 87 cellules, 23,3 secondes, et le retour 81.67
La Route 104 est une route en deux moitiés. Elle fait 40 cellules sur 80, huit écrans de haut, un quart d’eau, et aucune marche ne relie ses trois raccords à l’intérieur de la carte : la moitié sud atteint l’entrée sud du Bois Clémenti, à 51 cellules du raccord de Clémenti-Ville, et la moitié nord sa sortie nord, à 60 cellules du raccord de Mérouville jusqu’à la plus proche des deux cellules de seuil de la sortie (61 jusqu’à l’autre). Du Centre de Clémenti-Ville à celui de Mérouville, il y a 250 cellules à travers cinq cartes (ville, route, bois, route, ville), 67 secondes de marche, et 196 au retour.67
Ce qui change d’une route à l’autre, c’est le dénominateur. La première route est une marche de moins de 20 secondes, sans dresseur, avec un retour sans herbe ; la troisième est une minute de marche à travers un donjon. Selon ma lecture, le jeu ne dépense sa distance qu’une fois que le joueur a appris à marcher.
Les rebords pointent vers la maison
Aller et retour sur chaque route mesurée dont les deux extrémités se rejoignent à pied, et le minimum de cellules d’herbe dans chaque sens ; dessiné par figures/make_figures.py à partir des sorties des scripts de routes et de grass_paths.txt.
Sur chaque route mesurée dont les deux extrémités se rejoignent à pied, toutes les neuf dotées de rebords, la marche vers la ville précédente est plus courte. La Route 1 de Rouge fait 40 cellules au retour contre 52 à l’aller, 23 % plus court ; la Route 1 de Rouge Feu 43 contre 58, 26 % ; la Route 101 d’Émeraude 19 contre 34, 44 % ; la Route 102 d’Émeraude 55 contre 62, 11 % ; la Route 29 de Cristal 71 contre 90, 21 % ; la Route 30 de Cristal 57 contre 74, 23 % ; la Route 3 de Rouge 82 contre 84, la Route 3 de Rouge Feu 94 contre 97 et la Route 32 de Cristal 128 contre 132, 2 % à 3 % chacune. Les 4 cellules de la Route 32 viennent d’un seul saut latéral depuis un rebord d’angle, le seul saut du retour.5617 Les rebords des premières routes regardent tous dans la même direction : les 42 cellules de rebord en 10 séries de la Route 1 de Rouge, les 61 en 10 séries de la Route 1 de Rouge Feu et les 13 de la Route 101 d’Émeraude (trois séries de quatre et une cellule d’angle) regardent toutes vers le sud, l’angle vers le sud-est, ce qui, sur chacune de ces cartes, est le chemin du retour vers la ville de départ.56
Les rebords retirent aussi l’herbe du chemin du retour. Une seconde recherche, qui minimise les cellules de hautes herbes traversées plutôt que les pas, trouve que sur la Route 1 de Rouge un marcheur doit traverser au moins 15 cellules d’herbe vers le nord et seulement 4 vers le sud, toutes dans le passage près de Bourg Palette ; la Route 1 de Rouge Feu donne 19 contre 5 ; la Route 101 d’Émeraude 10 contre 0 ; la Route 102 d’Émeraude 4 à l’aller contre 0 au retour.18 La soluce de Bulbapedia pour la Route 1 de Kanto dit la même chose en prose : vers le sud, les dresseurs « can either hop down ledges to completely avoid any contact with wild Pokémon » (peuvent sauter les rebords pour éviter tout contact avec les Pokémon sauvages) ou passer par « the grass patches, the required path for northbound travel. » (les zones d’herbe, le chemin obligé vers le nord).35 C’est une seule page de wiki utilisée une seule fois, comme vérification croisée de la recherche, et la recherche s’accorde avec elle sauf pour le passage près de Bourg Palette : il fait deux cellules de large et quatre rangées d’herbe de profondeur, si bien que chaque marche vers le sud du modèle de cellules y traverse 4 cellules d’herbe, une par rangée. Les rebords font contourner au marcheur toute l’autre herbe de la route, pas tout à fait toute.18
Les chiffres de deuxième génération appellent chacun une réserve. La collision de Cristal tient sur quatre octets par bloc de 32 pixels, un par quadrant, et les scripts supposent qu’ils sont rangés par lignes (haut gauche, haut droite, bas gauche, bas droite), parce que la macro tilecoll ne précise pas l’ordre.29 Un octet COLL_HOP_* de deuxième génération marque la lèvre sur laquelle se tient le joueur plutôt que la cellule au-delà, ce que probe_gen2_ledges.py a établi en trouvant une cellule WALL sous chacune des 21 cellules HOP_DOWN de la Route 30 ; la lecture par lèvre n’a été sondée que sur les Routes 29 et 30.529 Cristal a aussi des murs à sens unique. Un octet de collision de COLL_RIGHT_WALL à COLL_UP_LEFT_WALL est du terrain, mais GetMovementPermissions refuse un pas qui sort d’une telle tuile par son côté muré, et un pas qui y entre par ce côté ; sur la Route 32, la seule des quatre qui en ait (41 cellules, toutes UP_WALL), ils allongent la marche la plus courte de 110 cellules dans chaque sens, ce que trouve une recherche qui les ignore, à 132 à l’aller et 128 au retour. Ses rebords d’angle, HOP_DOWN_RIGHT et HOP_DOWN_LEFT, sautent vers le bas ou sur le côté, selon la direction où regarde le joueur, une fois le pas normal refusé, et le retour en prend un sur le côté. Rouge n’a pas de murs à sens unique : sa seule autre règle de déplacement, les collisions par paires de tuiles, joue dans les deux sens et n’est listée que pour les jeux de tuiles de grotte et de forêt, qu’aucune de ces cartes n’utilise.5 Enfin, la recherche compte un rebord comme deux cellules de déplacement, ce qui correspond au saut de 32 images de la troisième génération et est supposé pour les générations 1 et 2.293
Ce que montrent les données est un résultat, pas une intention : je n’ai trouvé aucune déclaration des développeurs disant que les rebords ont été placés pour raccourcir le retour, seulement que, sur chaque route mesurée, ils le font.29 La règle que j’en tire : un rebord est un raccourci à sens unique pour revenir, jamais un mur pour avancer.
La question de l’élévation
Ce constat cadre mal avec le billet précédent. Le dossier sur les structures derrière Des structures en pixel art refusait catégoriquement les rebords, « No ledges to jump, no climbing, no isometric, » (pas de rebords à sauter, pas d’escalade, pas d’isométrie), et ce billet range un rebord à sens unique parmi les choses que sa build ne fait pas.3637 Ce dossier-ci mesure les rebords comme le raccourci du retour dans le canon. Les deux ne se contredisent pas sur les faits ; ils divergent sur la question de savoir si une ville de collectionneurs a besoin de relief pour obtenir l’effet. La décision revient au prochain billet du programme, sur l’élévation, les rebords et les ponts, qui n’est pas encore publié. En attendant qu’elle y soit prise, le cahier des charges de la section 7 renvoie les rebords au billet sur l’élévation et obtient son retour plus court d’un portillon dans une haie : un portillon sur la promenade des Prés qui ne s’ouvre que du côté du lac, le même raccourci à sens unique pour revenir, sans aucun relief.26
3. Raccords, postes et écran de carte
Un monde extérieur de Pokémon n’est pas une grande carte. C’en est beaucoup de petites, chacune avec sa taille, ses tuiles et sa musique, jointes bord à bord pour que vous passiez de l’une à la suivante sans coupure. La façon dont se fait la jonction décide de presque tout le reste dans cette section : où un bâtiment doit se dresser sur la route, pourquoi les remakes en ont moins, et ce que l’écran de carte peut savoir.
Générations 1 et 2 : une bande copiée dans une marge
Une connexion de Rouge est une ligne dans l’en-tête d’une carte, qui nomme une direction, le voisin et un décalage en blocs ; celle de la Route 1 est connection north, ViridianCity, VIRIDIAN_CITY, -5, et la macro précalcule quelle bande de blocs du voisin est copiée dans le tampon de la carte courante.38 Le tampon, wOverworldMap, contient la carte avec une marge de MAP_BORDER EQU 3 blocs, 6 cellules, de chaque côté ; la connexion remplit cette marge avec les 3 rangées ou colonnes de blocs les plus proches du voisin, et CheckMapConnections change de carte quand la coordonnée du joueur dépasse −1 ou la largeur ou la hauteur de la carte.39
Parce que la bande est copiée sous forme de numéros de blocs et dessinée avec le jeu de blocs chargé à ce moment-là, deux cartes ne peuvent se rejoindre à un raccord que si elles partagent un jeu de tuiles, et les données de Rouge s’y tiennent : sur ses 78 lignes de connexion, 76 relient des cartes de même jeu de tuiles. Les deux exceptions sont la Route 22 et la Route 23, OVERWORLD contre PLATEAU, et les fichiers d’en-tête marquent ces deux lignes « ; unnecessary » (inutile).840 Cristal compte 142 lignes de connexion ; 138 relient le même jeu de tuiles (les exceptions sont Doublonville et la Route 35, et la Route 32 et la Route 33, Johto contre Johto Modern), et 92 restent dans un même groupe de cartes.841
Génération 3 : sept cellules du voisin (huit à l’est), et le graphisme au passage
Une connexion de troisième génération est une entrée map, offset et direction dans le map.json de la carte. Émeraude compte 134 entrées haut, bas, gauche et droite plus 14 entrées de plongée et de remontée, et chacune des 134 a une entrée inverse correspondante au décalage opposé.8 Porymap, l’éditeur de cartes qu’utilise la communauté de la décompilation, décrit la fonction en trois phrases : « Maps can be connected together so that the player can seamlessly walk between them » (les cartes peuvent être reliées pour que le joueur passe de l’une à l’autre sans coupure) ; « A connection has a direction, offset, and destination map » (une connexion a une direction, un décalage et une carte de destination) ; et « Connections are one-way, which means that you must keep the two connections in sync between the two maps. » (les connexions sont à sens unique, il faut donc garder synchronisées les deux connexions entre les deux cartes).42
Le moteur copie la carte courante dans un tampon avec une marge de MAP_OFFSET 7 cellules de chaque côté (8 à l’est, parce que le tampon a la largeur de la carte plus MAP_OFFSET_W, 2 × 7 + 1), et l’en-tête en donne la raison dans un commentaire : « the player has 7 metatiles of view horizontally in either direction. » (le joueur voit 7 métatuiles horizontalement de chaque côté). FillSouthConnection et ses sœurs copient 7 rangées ou colonnes du voisin dans cette marge (8 colonnes à l’est) au décalage de la connexion, sur la seule largeur du voisin (FillNorthConnection commence au décalage plus MAP_OFFSET et copie la largeur du voisin là où elle tient), et le tampon entier ne peut contenir plus de MAX_MAP_DATA_SIZE 10240 cellules.9 Là où il n’existe aucune connexion, la marge est le motif de bordure de 2 sur 2 du plan, combiné par OU avec MAPGRID_IMPASSABLE pour qu’il ne soit jamais praticable (GetBorderBlockAt).9
Ce que contient le tampon à un raccord, en schéma : un carré par cellule, dimensionné d’après MAP_OFFSET, FillNorthConnection et le plan de 20 sur 20 de la Route 101 avec le plan de 20 de large de Rosyères au nord au décalage 0 ; dessiné par figures/make_figures.py, sans aucun graphisme du jeu.
La bande du voisin est dessinée avec les jeux de tuiles de la carte courante (DrawMetatileAt prend les jeux primaire et secondaire de la carte où vous vous trouvez) jusqu’à ce que le joueur traverse. Le passage appelle LoadMapFromCameraTransition, qui exécute le script de transition de la nouvelle carte, ne charge que son jeu de tuiles secondaire et sa palette, change la musique et la météo, et affiche le cartouche du nom de la carte, sans fondu.10 C’est pourquoi aucune paire raccordée ne diffère par son jeu de tuiles primaire : 0 sur les 134 d’Émeraude et 0 sur les 120 de Rouge Feu. 38 paires d’Émeraude et 34 de Rouge Feu relient des jeux de tuiles secondaires différents, et dans 24 de chaque, la bande du voisin dans la marge (7 cellules, 8 à l’est, coupée là où elle sortirait du tampon, comme le moteur la coupe) n’utilise que des métatuiles primaires, si bien qu’elle se dessine correctement des deux côtés.8
Les décalages sont courants. 36 des 134 connexions d’Émeraude et 68 des 120 de Rouge Feu sont non nuls ; la Route 1 de Rouge Feu se situe à 12 cellules dans les 48 cellules de largeur de Jadielle.8 La réciprocité n’est pas tout à fait universelle dans Rouge Feu : 112 de ses 120 entrées sont réciproques, et la ville fortifiée explique 6 des 8 autres. Safrania se connecte à sens unique aux Routes 5 à 8, tandis que ces routes ne se connectent pas à Safrania mais à une carte distincte SAFFRON_CITY_CONNECTION ; les deux dernières sont des cartes prototypes des îles Sevii.8 Je lis l’agencement de Safrania comme un artifice de dessin : la connexion existe pour dessiner le rempart de la ville au-delà du bord de la route, et l’entrée passe par quatre postes de passage, dont les gardes, dans Rouge, renvoient le joueur tant qu’on ne leur a pas donné à boire.819 Quand un lieu doit paraître continu tout en restant fermé, la troisième génération dessine le voisin dans la marge et met la porte dans un bâtiment.
Franchir un raccord vers une carte dont show_map_name est activé fait glisser le nom du lieu à l’écran. La tâche du cartouche attend 31 images, glisse de 40 pixels à 2 pixels par image (20 images), reste affichée jusqu’à ce que son minuteur dépasse 120 (121 images) et ressort en glissant (20 images) : environ 190 images, 3,2 secondes.21 J’ai compté les états de la tâche d’après leurs seuils, chaque état peut donc durer une image de plus ou de moins que ce que j’indique.29
Les postes de passage : là où le graphisme change
Rouge compte 27 cartes sur le jeu de tuiles GATE ou FOREST_GATE : des postes à deux étages sur les Routes 11, 12, 15, 16 et 18 (10 cartes), des postes simples sur les Routes 2, 5, 6, 7 et 8, le poste de la Route 22, le poste du Parc Safari et ses 4 maisons de repos, 4 entrées du Souterrain, et les 2 postes de la Forêt de Jade.8 Chaque poste de Rouge qui relie deux lieux différents relie deux jeux de tuiles : OVERWORLD vers FOREST (la Forêt de Jade, le Parc Safari), vers UNDERGROUND (les quatre entrées du souterrain) ou vers PLATEAU (Route 22 vers Route 23), des jonctions que les connexions de Rouge ne font presque jamais.8
La Route 2 est le cas le plus net. Elle fait 20 cellules sur 72 dans Rouge et 24 sur 80 dans Rouge Feu et ne peut pas se parcourir d’un bout à l’autre : ses moitiés sud et nord ne se rejoignent que par la Forêt de Jade, qui, dans Rouge, est dessinée avec le jeu de tuiles FOREST plutôt qu’OVERWORLD et où l’on entre par deux postes de passage.58 Dans Rouge Feu, du Centre de Jadielle à celui d’Argenta, il y a 267 cellules par le poste sud, la forêt et le poste nord.7 Trois lectures en découlent, et ce sont des lectures des données, pas des déclarations des développeurs.
- Le poste est là où le graphisme change. Un raccord de première génération dessine les blocs du voisin avec le jeu de blocs courant, donc deux cartes ne peuvent se rejoindre à un raccord que si elles partagent un jeu de tuiles, ce que Rouge respecte dans 76 de ses 78 connexions. Une forêt dessinée avec un jeu de tuiles de forêt a donc besoin d’une porte, et le poste de passage est cette porte.388
- Le poste est là où une règle peut vivre. Les quatre postes de Safrania renvoient le joueur tant qu’une boisson n’a pas été donnée (
TEXT_ROUTE5GATE_GUARD_GEE_IM_THIRSTY,BIT_GAVE_SAFFRON_GUARDS_DRINK) ; le poste de la Route 22 vérifieBIT_BOULDERBADGE.19 Et trois postes récompensent la collection : les assistants du Professeur Chen remettent un objet quand le nombre d’espèces possédées (CountSetBitssurwPokedexOwned) atteint 10 au poste de la Route 2, 30 au premier étage du poste de la Route 11 et 50 au premier étage du poste de la Route 15.20 - Le poste est une pause habitée. Le poste de la Route 2 abrite un assistant du Professeur Chen et un gamin ; la marche reprend après un fondu, dans un nouveau lieu.43
Les remakes se séparent selon leur moteur. Cristal compte 25 cartes d’environnement GATE, dont 19 relient des cartes de groupes différents et 7 des jeux de tuiles différents.8 Rouge Feu garde les postes de Kanto : 8 cartes intérieures mènent à deux cartes extérieures différentes (la paire de la Forêt de Jade, les quatre entrées de Safrania, l’entrée nord de la Route 22 et l’entrée du Safari), et 13 autres ont des portes sur deux côtés distincts d’une même carte extérieure, parmi lesquelles les cinq postes de route à deux étages et le bâtiment est de la Route 2.8 Hoenn les abandonne presque. Dans Émeraude, seules 2 cartes intérieures mènent à deux cartes extérieures différentes (le rez-de-chaussée du Mont Mémoria et l’entrée du Parc Safari) et 5 ont des portes sur deux côtés d’une même carte, dont les deux stations de la Piste Cyclable ; les routes rejoignent les villes à des raccords ouverts.8 Comptés en bâtiments, Émeraude a 4 postes (les deux stations de la Piste Cyclable, l’entrée du Parc Safari et le poste de la Zone de Combat) contre 14 dans Rouge Feu et 27 cartes sur jeu de tuiles de poste dans Rouge.8 Ma lecture, et ce n’est qu’une lecture : Hoenn a pu abandonner les postes parce que son moteur charge un nouveau jeu de tuiles secondaire au moment du passage, si bien qu’une route peut rejoindre une ville dessinée dans un autre graphisme sans bâtiment entre les deux.10
L’écran de carte et Vol
La carte régionale d’Émeraude est une grille de 28 cases sur 15 (MAP_WIDTH 28, MAP_HEIGHT 15), 420 en tout ; 158 d’entre elles, 37,6 %, appartiennent à un lieu, réparties entre 54 sections : 34 routes, 16 villes et 4 autres. Les routes couvrent 129 cases et les villes 22.11 Sur les 213 entrées de region_map_sections.json, 95 portent un rectangle sur la grille ; 49 d’entre elles sont une seule case, la plus grande fait 4 sur 3 (la Route 124 et sa jumelle sous-marine), Poivressel fait 1 sur 2 et Lavandia 2 sur 1.11 Un écran de carte, d’après ces éléments, est une grille grossière de rectangles nommés, et la plupart des lieux occupent une case.
Vol est le point où l’écran rencontre la marche. Vol, dans Émeraude, exige le sixième badge (FIELD_MOVE_FLY contre FLAG_BADGE06_GET dans la table des badges) et un type de carte extérieur (Overworld_MapTypeAllowsTeleportAndFly : route, bourg, ville ou route maritime). Sur la carte, une ville n’est MAPSECTYPE_CITY_CANFLY que si son drapeau FLAG_VISITED_* est posé, et chacune des 16 villes pose son propre drapeau dans son script de transition ; celui de Rosyères dit setflag FLAG_VISITED_OLDALE_TOWN.13
Les autres jeux s’accordent sur la forme. La carte de Rouge Feu fait 22 cases sur 15 par page, quatre pages (Kanto et trois groupes des îles Sevii), chacune en deux couches, le monde extérieur et les donjons ; la couche extérieure de Kanto remplit 90 cases avec 38 sections, et Vol exige le troisième badge. Un lieu de Rouge Feu compte comme visité quand son drapeau FLAG_WORLD_MAP_* est posé, ce que fait le script de transition de chaque ville à l’entrée (setworldmapflag FLAG_WORLD_MAP_CELADON_CITY), et Vol n’accepte qu’une case visitée.23 La carte de Cristal place 95 repères par position en pixels et offre 24 points de vol, 12 à Johto et 12 à Kanto ; le point de vol d’une ville est posé par un callback à votre entrée (VioletCityFlypointCallback: setflag ENGINE_FLYPOINT_VIOLET), et Vol vérifie ENGINE_STORMBADGE.24 La carte de la ville de Rouge liste 37 entrées extérieures sur une grille de 4 bits (dont une marquée inutilisée) et 60 entrées intérieures avec leurs propres positions ; entrer dans l’une de ses 11 cartes de ville pose le bit de cette ville dans wTownVisitedFlag, avec le commentaire source « mark town as visited (for flying) » (marquer la ville comme visitée, pour le vol), la liste de vol saute les villes non visitées, et Vol exige le Badge Foudre et une carte extérieure.22
Aucun des quatre ne fait partir le joueur avec une carte en poche ; chacun en remet une en cours de partie. La Carte de Rouge et de Rouge Feu est un objet remis par la sœur du rival à Bourg Palette (dans Rouge, offerte une fois que le joueur a le Pokédex) ; la carte (Map Card) de Cristal est un cadeau reçu à Ville Griotte, la première ville après la maison ; le PokéNav d’Émeraude vient du bâtiment Devon à Mérouville, la troisième ville après la maison.442345127 Les cartes murales ouvrent le même écran plus tôt : Émeraude en accroche une à l’étage de la maison du joueur et au rez-de-chaussée de chaque Centre Pokémon, Rouge Feu dans ses Centres, à l’école de Jadielle et dans quelques maisons, et le jeu de tuiles HOUSE de Rouge, qu’utilise la maison du rival à Bourg Palette, comporte une tuile de carte murale.122344
Mise bout à bout, la règle est cohérente à travers quatre jeux et trois générations. Une fois que le joueur a la carte, elle dessine chaque lieu de la région, visité ou non ; les exceptions sont des lieux tardifs retenus par le scénario ou un événement : les pages Sevii de Rouge Feu, jusqu’à ce que des scripts du Centre Pokémon de l’Île 1 (One Island) posent leurs drapeaux, et, sur ces pages, le Rocher Nombril et l’Île Aurore, masqués tant que le joueur n’y est pas allé ; la Zone de Combat et l’Île du Sud d’Émeraude jusqu’à leurs drapeaux de repère ; et la carte de Kanto de Cristal jusqu’à ce que le joueur se trouve à Kanto.44451223 Le voyage rapide ne liste que les lieux où vous êtes entré, enregistrés par un drapeau posé à l’entrée, disponible seulement en extérieur, et seulement après un badge de milieu de partie : le troisième dans Rouge et Rouge Feu, le sixième dans Émeraude.13232422
4. Les autres modèles : Stardew Valley, Animal Crossing, Link’s Awakening
Pokémon est une réponse à la question de la terre entre les villes. Trois autres jeux répondent autrement, et chaque différence est un choix que Kiradex doit faire. Les chiffres de cette section viennent des wikis communautaires des jeux et, pour Link’s Awakening, d’un désassemblage ; je ne les ai pas vérifiés dans le code du jeu, sauf là où une note le précise.29
Stardew Valley : un moyeu et des rayons, ouverts par le calendrier
Stardew fait un fondu à chaque bord. Selon les mots de son 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. » (quand vous atteignez le bord d’une zone ou entrez dans un bâtiment, et que l’écran passe au noir pendant la transition, vous changez de carte). Un téléporteur est une propriété de carte dont le wiki donne la valeur sous la forme Warp [ <int fromX> <int fromY> <string toArea> <int toX> <int toY> ]+, avec l’exemple « 6 20 Mountain 76 9 ».46
La vallée est un petit graphe autour d’un seul moyeu. Pelican Town, le village central, se connecte à l’arrêt de bus et à la ferme au nord-ouest, à Cindersap Forest au sud-ouest, à la plage au sud et à la montagne au nord.47 L’arrêt de bus « connects the Farm to the west with Pelican Town to the east » (relie la ferme à l’ouest à Pelican Town à l’est) et donne sur la partie basse des Backwoods par la route de l’ouest.48 Cindersap Forest « has exits to the north into the Farm, to the east into Pelican Town, to the south into The Sewers, and to the northwest into the Secret Woods. » (a des sorties au nord vers la ferme, à l’est vers Pelican Town, au sud vers les égouts et au nord-ouest vers les bois secrets).49 Les Backwoods « consists of two disconnected sections » (se composent de deux parties non reliées), un chemin du haut reliant la ferme à la montagne et une partie basse atteinte depuis la route de l’arrêt de bus.50 L’encadré des lieux sur ces pages liste 26 endroits, des Backwoods au marais de la sorcière, selon mon décompte.51
Les rayons s’ouvrent par la date et par l’action. La montagne commence avec « only two exits: to the south leading to Pelican Town, and to the west leading to the Backwoods » (seulement deux sorties : au sud vers Pelican Town et à l’ouest vers les Backwoods) ; les mines ouvrent le 5 du printemps, la voie ferrée après un tremblement de terre le 3 de l’été, et le pont de la carrière contre les lots de la salle d’artisanat ou 25 000 g.52 Le désert exige le bus réparé, par les lots de la salle des coffres ou 40 000 g ; les bois secrets exigent de dégager une souche avec une hache en acier ou mieux ; les mares de la plage exigent un pont de 300 bois.53 Le wiki donne pour vitesse de base du joueur 2 à la marche, 5 à la course et 6,6 à cheval, sans unités, et je n’ai pas ouvert le code du jeu pour les retrouver.54
Ma lecture : Pokémon ferme une zone par une capacité que le joueur porte sur lui, un badge ou une CS. Stardew la ferme par quelque chose que la communauté a fait, un lot, un pont ou un tremblement de terre à une date donnée. Le second type est celui qu’une ville de collectionneurs partagée peut employer sans que personne se sente exclu à cause de son niveau.
Animal Crossing : la grille d’acres et le train
L’Animal Crossing de la GameCube construit sa ville avec des acres. « Acres are grid elements measuring 16x16 spaces » (les acres sont des éléments de grille de 16 cases sur 16) ; la ville fait « five acres across by six down » (cinq acres de large sur six de haut), avec la gare « always located in Acre A-3 » (toujours située dans l’acre A-3), et la carte numérote les colonnes de 1 à 5 et les rangées de A à F.55 Cela fait 80 cases sur 96 en tout.17 Les jeux suivants ont changé la grille : Wild World fait 4 acres sur 4, Let’s Go to the City (City Folk) 5 sur 5, New Leaf 5 sur 4, New Horizons 7 sur 6, soit 42 acres.55
L’acre est aussi une règle d’apparition. « 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, » (chaque fois que le joueur entre dans un acre, sauf en sortant de sa maison au chargement de la partie, un poisson et un insecte apparaissent aux emplacements programmés dans les données de l’acre), et ils disparaissent une fois que le joueur est à six cases de cet acre.55 La carte de la ville arrive tôt, de Tom Nook pendant le travail à mi-temps ; elle « is organized in a grid, with each square representing an acre, » (est organisée en grille, chaque case représentant un acre) et montre la mer, les rivières, les bâtiments et les maisons, mais ni les arbres, ni les objets, ni les habitants.56
Le train est le seul moyen, dans le jeu GameCube, de se rendre dans une autre ville, par carte mémoire, et « The train ride takes a few minutes » (le trajet en train dure quelques minutes) ; la gare « is located at the top of the player’s town, » (se trouve en haut de la ville du joueur), et une nouvelle partie commence avec l’arrivée du joueur à cet endroit.57
Ma lecture : les acres rendent une ville lisible, une carte de cases nommées, et fournissent une règle d’apparition qui récompense le déplacement sans tirage à chaque pas. Le train fait du voyage entre les mondes une scène plutôt qu’un raccord.
Link’s Awakening : le monde découpé en écrans
The Legend of Zelda: Link’s Awakening DX prend le contre-pied du défilement continu de Pokémon. Dans la documentation du désassemblage zladx, le jeu « takes place in non-scrollable screen-wide rooms, » (se déroule dans des salles de la largeur de l’écran, sans défilement), et « On the Overworld, rooms are stored as they are laid out during the game, on a 16x16 grid of rooms. » (dans le monde extérieur, les salles sont stockées telles qu’elles sont disposées en jeu, sur une grille de 16 salles sur 16).58 La carte extérieure fait 512 octets de pointeurs de salle sur deux octets, soit 256 salles, et la couche de tuiles d’une salle est « a straight forward array of 10x8 tile numbers » (un simple tableau de 10 sur 8 numéros de tuiles).59 « Overworld rooms are grouped in 2x2 sections (i.e. 4 rooms). Each section has a tileset ID, » (les salles extérieures sont regroupées en sections de 2 sur 2, soit 4 salles ; chaque section a un identifiant de jeu de tuiles), et les 32 tuiles de la section sont échangées pendant la transition vers une salle qui en a besoin.58 Chaque salle extérieure a un octet d’état dans wOverworldRoomStatus, 256 octets, avec OW_ROOM_STATUS_VISITED EQU $80 à côté de bits pour les portes, les changements et les hiboux ; j’ai lu ce bit dans les constantes du désassemblage et je n’ai pas vérifié si l’écran de carte ne dessine que les salles qui l’ont.25
Ma lecture : Pokémon fait défiler un monde continu et le nomme par sections ; Link’s Awakening découpe le monde en écrans égaux et note ceux que vous avez vus. Sur un téléphone dont la vue varie selon l’appareil, 10,3 tuiles de large sur un iPhone 18 Pro Max en portrait et 29,7 sur un iPhone Duo ouvert, seul le modèle à défilement fonctionne sans encadrer chaque salle de bandes, et c’est pourquoi le cahier des charges l’adopte.60
5. Le métier, en règles chiffrées
Voici les règles que les mesures étayent, chacune avec sa provenance. Là où une règle transforme un fait mesuré en recommandation, la recommandation est la mienne et la règle le signale par son verbe.
| Élément | Règle | Source |
|---|---|---|
| Rythme | Une cellule de marche coûte 16 images, environ 0,27 seconde ; une tuile de Kiradex en coûte 0,25. Dimensionnez chaque trajet en secondes à la marche propre du jeu. | Code de pas de Rouge, Cristal et Émeraude ; GBATEK ; PlazaRig.swift |
| Longueur de route | 2 à 10 écrans le long de l’axe de déplacement ; la première route d’un jeu 2 à 6. | seize routes mesurées |
| Sinuosité | La traversée la plus longue vaut 1,15 à 1,70 fois le grand côté de la route, le retour 0,95 à 1,42. Dimensionnez une route par son chemin, pas par son rectangle englobant. | marches les plus courtes rapportées aux grands côtés sur les neuf routes dont les extrémités se rejoignent à pied |
| Première étape | 15 à 25 secondes d’une porte à la porte principale de la ville suivante. Une étape d’une minute est un donjon, pas une route. | Émeraude 58 cellules, Rouge Feu 94 ; 250, 267 et 314 à travers une forêt ou une grotte |
| Proportion | La route occupe 2 à 4 fois la surface de la ville ; 5,9 pour 1 sur l’écran de carte, parce qu’une ville prend une ou deux cases. | Cristal 1,97, Rouge 2,65, Émeraude 3,70, Rouge Feu 3,87 ; la carte d’Émeraude |
| Densité | Le terrain de rencontre couvre 14 % à 23 % de la carte d’une première route et se raréfie à 4 % à 9 % aux troisième et quatrième routes ; sur le sol praticable, une première route en compte 19 % à 38 %. Une première route n’a aucun dresseur. | le tableau des routes ; herbe sur cellules praticables |
| Cadence | Quelque chose à remarquer environ un pas sur neuf sur le terrain de rencontre, après quelques pas de grâce à l’arrivée ; gardez disettes et déluges courts avec un plancher et une rampe. | l’immunité de quatre pas d’Émeraude, puis le taux 20, 11,1 % non modifié ; la recharge et le bonus de Rouge Feu |
| Le retour | Plus court que l’aller, de 2 % à 44 % sur les neuf routes à rebords dont les extrémités se rejoignent à pied, avec 0 à 5 cellules d’herbe contre 4 à 19. Un rebord est un raccourci à sens unique pour revenir, jamais un mur pour avancer. | neuf routes ; la recherche du minimum d’herbe |
| Raccords | Ne faites se rejoindre deux zones à un raccord ouvert que là où toutes deux dessinent le bord avec le même jeu de sol ; placez un bâtiment à deux portes là où le graphisme change. | Rouge 76 sur 78, Cristal 138 sur 142, génération 3 0 sur 134 et 0 sur 120 avec des jeux primaires différents ; chaque poste de Rouge entre deux lieux |
| Bande voisine | Dessinez au moins une demi-vue du voisin au-delà du bord. | les 7 cellules de la génération 3 (8 à l’est) pour un écran de 15 cellules ; les 6 cellules de la génération 1 pour 10 |
| Connexions | Les décalages sont normaux ; chaque connexion a une inverse au décalage opposé, et une connexion à sens unique est un artifice de dessin délibéré. | Émeraude 36 sur 134 décalées, 134 sur 134 réciproques ; Safrania dans Rouge Feu |
| Cartouche de nom | Nommez le lieu à l’entrée pendant environ trois secondes. | le cartouche d’Émeraude, environ 190 images |
| Postes | Un poste est l’endroit où vivent une règle et une récompense : une vérification d’étape, un garde, un cadeau à un certain nombre. | la vérification de badge, le garde assoiffé et les cadeaux à 10, 30 et 50 espèces possédées de Rouge |
| Écran de carte | Une grille grossière de rectangles nommés ; la plupart des lieux sur une case, les plus grands sur quelques-unes. | Émeraude 28 sur 15, 49 rectangles sur 95 d’une seule case, le plus grand 4 sur 3 ; les 5 acres sur 6 d’Animal Crossing |
| Voyage rapide | Une fois que le joueur a la carte, elle montre chaque lieu, visité ou non, à l’exception de quelques-uns que des drapeaux de scénario ou d’événement retiennent ; le voyage rapide ne montre que les lieux où vous êtes allé, posés par un drapeau à l’entrée, et seulement depuis l’extérieur. | la Carte, la carte du PokéMatos, le PokéNav et les cartes murales ; wTownVisitedFlag de Rouge, les points de vol de Cristal, FLAG_VISITED_* d’Émeraude, FLAG_WORLD_MAP_* de Rouge Feu ; un registre des visites non relié à son écran de carte : le bit OW_ROOM_STATUS_VISITED de Link’s Awakening |
| Déblocages | Les zones s’ouvrent par l’action et la date autant que par la capacité. | les mines, la voie ferrée, la carrière, le désert et les bois secrets de Stardew ; Coupe ramène 267 cellules à 156 |
| Transitions | Raccord à l’intérieur d’un même monde extérieur ; fondu aux portes et au bord du monde. | le raccord de Pokémon, le fondu de Stardew, la poussée de Link’s Awakening |
| Orientation | Faites courir une route le long du grand axe de l’appareil ; une route qui tient entière dans une vue n’a plus rien à révéler. | les décomptes de tuiles du 3 octobre ; les 20 sur 20 de la Route 101 d’Émeraude contre les 29,7 sur 20,9 d’un Duo ouvert |
Sources du tableau : le code de pas et la cadence d’images de la section 1 ;12315 la vitesse de marche de Kiradex ;4 les scripts de routes, de trajets, d’herbe et de connexions ;567188 le code de rencontre ;3132 le code du tampon, du passage et du cartouche d’Émeraude ;91021 les scripts des postes ;1920 les écrans de carte, la façon dont le joueur les obtient, et Vol ;1112132345244422 Stardew Valley, Animal Crossing et Link’s Awakening ;465253555825 les décomptes de tuiles par appareil du premier billet de cette série.60
Trois de ces règles méritent une phrase de plus.
La règle des raccords est énoncée comme une règle de graphisme, pas de moteur. La Game Boy dessinait la bande d’un voisin avec le jeu de blocs de la carte courante, elle ne pouvait donc pas du tout montrer un voisin d’un autre jeu de tuiles ; la Game Boy Advance dessine la bande avec les jeux de tuiles de la carte courante jusqu’à ce que vous traversiez, ce qui explique, selon ma lecture, que ses raccords s’en tiennent à un seul jeu primaire et surtout à des métatuiles primaires.38108 Je lis l’un et l’autre comme des limites de la mémoire de tuiles, qu’un téléphone dessinant un seul atlas ne partage pas. Ce qui survit, c’est la raison visuelle : un chemin qui change de matière le long d’une ligne droite en travers de l’écran se lit comme un raccord, que le moteur en ait eu besoin ou non. C’est pourquoi la règle garde sa première moitié (se rejoindre à découvert là où le sol continue) et sa seconde (un bâtiment là où le graphisme change) même quand rien ne l’impose.
La règle du voyage rapide est celle qui mérite le plus d’être copiée telle quelle. Chaque jeu Pokémon mesuré ici remet la carte tôt dans la partie, y dessine chaque lieu, visité ou non, hormis quelques lieux tardifs que des drapeaux de scénario ou d’événement retiennent, et ne ferme que le raccourci ; chacun fait mériter le raccourci en étant allé quelque part, pas en payant.44451213232224 Pour une app de collection dont l’XP ne vient que de cartes scannées dans le monde réel, le drapeau « visité » est la bonne monnaie, parce qu’il coûte une marche et rien d’autre.27
La règle d’orientation vient du téléphone, pas du canon. Un Pro Max en portrait voit 10,3 tuiles sur 22,4 à l’échelle de Kiradex et un iPhone Duo ouvert 29,7 sur 20,9, si bien qu’une route orientée nord-sud montre 22 tuiles de sa longueur d’un coup sur le téléphone courant, environ 11 devant un collectionneur que la caméra garde centré, tandis qu’une route orientée est-ouest en montre 30 d’un coup, environ 15 devant, mais seulement sur le Duo ouvert.602717 La Route 101 d’Émeraude, 20 sur 20, tiendrait tout entière dans une seule vue du Duo ouvert, ce qui veut dire qu’une route aussi courte n’aurait plus rien à y révéler.617
6. La manière Apple : vues, raccords, salons et une carte
Le moteur sous Kiradex World est celui que le premier billet a exposé : une scène RealityKit utilisée comme moteur de rendu 2D, une caméra orthographique à un nombre entier de pixels de l’appareil par texel, le sol en un seul maillage MeshDescriptor dessiné en un seul appel, chaque matériau un UnlitMaterial avec un seuil d’opacité, et le flou de mouvement et le mappage tonal de RealityView désactivés.60 Le billet sur les structures a ajouté des objets triés par profondeur dans un second maillage, des téléporteurs sous forme de données, et des étages échangés sur place en donnant à la scène une nouvelle identité, .id(floor.name), pour que SwiftUI démonte un RealityView et construise le suivant.37 Les zones au-delà de la clôture demandent trois choses de plus à ce moteur : une vue sur le voisin à travers un raccord, un moyen de changer de salon sur le serveur sans coupure, et un écran de carte. Rien de tout cela n’est encore construit, et rien dans cette section n’a été mesuré sur un téléphone ; c’est le plan sur lequel repose le cahier des charges, chaque coût nommé et marqué comme non mesuré.
Ce que voit un téléphone
Les décomptes de tuiles viennent du tableau du premier billet, calculé à partir des pages de spécifications d’Apple et des profils du simulateur de Xcode 27 aux échelles entières de Kiradex.60
| Appareil et orientation | Pixels par texel | Tuiles visibles (largeur sur hauteur) | Demi-vue |
|---|---|---|---|
| iPhone 18 Pro Max, portrait | 8 | 10,3 sur 22,4 | 6 en largeur, 12 en hauteur |
| iPhone Duo écran externe, portrait | 6 | 14,6 sur 21,2 | 8 en largeur, 11 en hauteur |
| iPhone Duo écran interne, ouvert | 6 | 29,7 sur 20,9 | 15 en largeur, 11 en hauteur |
La dernière colonne est la demi-vue arrondie à l’entier supérieur, la bande voisine que demande la règle des raccords.17 Apple indique pour l’écran interne de l’iPhone Duo 1878 pixels sur 2670 à 430 pixels par pouce et pour l’écran externe 1398 sur 2034 à 460.61 Les décomptes de tuiles de l’écran interne ne sont pas tirés de ces pixels de dalle : ils viennent du framebuffer logique du simulateur, 2007 sur 2853 à l’échelle 3,0 (2853 ÷ 96 donne 29,7 et 2007 ÷ 96 donne 20,9), que le premier billet explique être sous-échantillonné d’environ 0,936 vers la vitre, si bien que sur le matériel le même nombre de tuiles devrait remplir la dalle, à environ 5,6 pixels de dalle par texel, si le compositeur sous-échantillonne comme le premier billet s’y attend ; ce n’est pas vérifié sur le matériel, et la première étape du premier billet est de journaliser nativeScale sur un appareil.6017 Les Human Interface Guidelines demandent que les jeux « look good and behave well at various aspect ratios » (soient beaux et se comportent bien à divers rapports d’aspect), et le premier billet y a lu un argument pour montrer davantage de monde plutôt que des bandes, ce que fait la place.6260
Il en découle deux choses pour les zones. Avec la caméra qui suit le collectionneur, la vue vers l’avant fait environ une demi-vue.27 Une route orientée nord-sud est celle que chaque téléphone montre bien : 22 tuiles d’un coup sur un Pro Max en portrait, environ 11 devant, et 21 d’un coup sur le Duo ouvert, environ 10 devant. Une route orientée est-ouest montre 30 tuiles d’un coup sur le Duo ouvert, environ 15 devant, et seulement 10 sur un Pro Max en portrait, environ 5 devant ; elle a donc sa place là où la destination est proche.6017 Voilà pourquoi la longue marche du cahier des charges, la promenade des Prés, court du nord au sud, et pourquoi la rue des Classeurs, la zone la plus nettement est-ouest (44 sur 14, plus de trois fois plus large que haute), est une rue de devantures dont vous voyez l’essentiel où que vous vous teniez sur le Duo ouvert. Le Bord du lac (36 sur 20) et le quartier des Galeries (30 sur 20) sont eux aussi plus larges que hauts, mais dans le cahier des charges ce sont des lieux où s’arrêter, une rive et un quartier de musée, pas des chemins menant ailleurs.2617
Un raccord dans RealityKit
L’échange d’étage du billet sur les structures est le mauvais outil pour un raccord. Démonter un RealityView et construire le suivant exige un fondu pour le masquer, et les portes de l’app n’en ont pas encore : aujourd’hui le lieu change 220 millisecondes après le pas sur une porte, un changement d’étage échange la scène sans fondu, et le billet de cette série sur le mouvement propose le voile qui couvrirait les deux. Un raccord n’a, par définition, pas de fondu.376316 Le plan pour un raccord garde donc une seule scène. Quand le collectionneur arrive à moins d’une demi-vue d’un bord doté d’une connexion, la scène construit le sol du voisin comme un second maillage, du même type de MeshDescriptor que le premier, placé au décalage de la connexion en unités du monde, et ajoute les objets du voisin à leurs propres profondeurs. Quand les pieds du collectionneur franchissent le bord, la scène se recale : le voisin devient la zone courante, l’ancienne devient la bande derrière, et la caméra, qui suit aujourd’hui le joueur en restant bornée à la carte, est bornée à l’union des deux tant que les deux sont chargées.2726
Trois faits du moteur rendent cela bon marché sur le papier. Le sol est un maillage et un appel de dessin par zone, donc un voisin ajoute un appel de dessin pour son sol et un pour ses objets.6037 Chaque pixel est découpé et écrit la profondeur, si bien que les arbres d’un voisin se trient par rapport au collectionneur selon la même règle de profondeur que ceux de la zone courante, sans nouveau tri.37 Et la forge exporte déjà une zone entière sous forme de lettres, de sol en autotuiles, d’objets et de téléporteurs, donc un voisin est un second fichier du même type ; le cahier des charges y ajoute une liste connections.1426 Ce que rien de tout cela ne me dit, c’est ce que coûte la construction du second maillage au moment où il devient nécessaire, ni si le construire en une seule image provoque un à-coup ; ce n’est pas mesuré. La vérification 6 du cahier des charges a donc deux moitiés, et toutes deux couvrent toute l’approche, d’avant la construction du maillage du voisin jusqu’à la fin du passage : un journal de cadence par image, qui détecte un blocage du fil principal, et une inspection de chaque image capturée, qui détecte une image noire. Une vérification par échantillonnage ne suffirait pas : une image noire parmi soixante par seconde ne perturbe pas forcément la cadence des callbacks, et un échantillon toutes les 100 millisecondes voit une image sur six à 60 hertz.17 La moitié sur la cadence et la règle de chaque image sont mes ajouts à la vérification du dossier, qui échantillonnait la luminosité.
L’autotuilage est la seule chose que la règle de la GBA ne couvre pas. La troisième génération gardait ses raccords sur un sol commun parce que la bande du voisin était dessinée avec les tuiles de la carte courante.108 Kiradex dessine chaque zone à partir d’une seule palette d’atlas, donc cette limite ne s’applique pas, mais les autotuiles en blob au bord d’une zone sont calculées à partir des lettres propres à la zone ; si la forge ne regarde pas de l’autre côté du raccord, un chemin qui le traverse se termine par une bordure des deux côtés. Le cahier des charges fait donc calculer à la forge les masques de bord à travers chaque connexion.26
Salons, présence et reconnexion
La place de Kiradex est un salon serveur : des salons d’environ 40 joueurs au plus, répartis par région, sur FastAPI et WebSockets.27 Une zone au-delà de la clôture est naturellement un autre salon, ce qui soulève le problème qu’une console portable en solo n’a jamais eu : les gens de l’autre côté du raccord. Le plan est que le client s’abonne aux marcheurs du salon voisin dès qu’il commence à dessiner la bande de ce salon, pour que les gens de la rue des Classeurs soient visibles depuis le bord de la Grand-Place, et qu’il change de salon au passage, pour que le marcheur ne s’arrête jamais.26 Les portes et le tram ont droit à un fondu, le voile que le cahier des charges du billet sur le mouvement ajoute aux portes, et ce fondu couvre la reconnexion, comme le dossier sur les structures le proposait déjà pour les intérieurs.1626 Le correctif du premier billet pour une vue noire s’applique à ce fondu : animer l’opacité de la vue SwiftUI qui contient le RealityView le laissait sans rendu, si bien que le fondu est un voile dessiné par-dessus.60
Le serveur a besoin de la même carte que celle que dessine le client. Aujourd’hui, server/app/plaza.json porte les lettres de la ville pour que le serveur puisse valider une marche ; le cahier des charges fait porter à la copie de chaque zone ses lettres et ses connexions, pour qu’une marche qui franchit un raccord soit validée des deux côtés.6026 Ce que coûte un changement de salon sur un vrai réseau, et si l’abonnement à un second salon près d’un raccord double le débit de messages de la place, n’est pas mesuré.
Le cartouche de nom, la carte et le tram dans SwiftUI
Le nom de la zone appartient à SwiftUI, pas à la couche de pixels. Le premier billet a constaté qu’une police pixel de cinq texels, aux échelles de Kiradex, tombe à 13,3 ou 10 points, la seconde sous le minimum de 11 points des Human Interface Guidelines, et a déplacé le texte des dialogues vers SwiftUI à l’échelle de l’interface ; un cartouche de nom est le même genre de texte.60 Sa durée vient d’Émeraude : environ trois secondes à l’écran.21
L’écran de carte est une vue SwiftUI posée sur un petit modèle : une grille de rectangles nommés, la zone courante et l’ensemble des zones visitées. Sur le Duo ouvert, il se place en panneau à côté du monde, comme le plan du monde place la fiche de profil du collectionneur à côté de la place (« 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 », la place sur l’écran interne ouvert en est la meilleure version : vue large, votre fiche de profil à côté du monde quand vous touchez quelqu’un) ; sur un téléphone, c’est une feuille.27 Le tram est un téléporteur depuis la carte : fondu au noir, changement de salon, retour à l’image à la station de destination.
L’ensemble des zones visitées doit suivre le collectionneur. La page des Human Interface Guidelines consacrée aux jeux dit « Let players pick up their game on any of their devices, » (laissez les joueurs reprendre leur partie sur n’importe lequel de leurs appareils), pour qu’ils puissent « start back up exactly where they left off on a different device. » (reprendre exactement là où ils s’étaient arrêtés sur un autre appareil).62 Une station de tram ouverte sur le téléphone devrait l’être aussi sur l’iPad, donc l’ensemble des zones visitées vit avec le profil du collectionneur sur le serveur plutôt que dans le stockage local de l’app.26 Cela prolonge la section 3 du plan du monde, qui dit « Our server holds only the public profile card and the economy » (notre serveur ne détient que la fiche de profil publique et l’économie) ; j’y ajouterais l’ensemble des zones visitées comme un champ de plus à côté, limité à la liste de celles des cinq zones où un collectionneur est entré, sans lieu, sans texte et sans heure de visite, indexé comme le reste par l’identifiant de joueur Game Center ; l’examen de confidentialité que demande le plan devrait le couvrir.2726
Ce que cela coûte, et ce qui n’est pas mesuré
Rien dans cette section n’a été chronométré. Les coûts non mesurés sont : la construction des maillages de sol et d’objets d’un voisin au moment où le collectionneur approche d’un bord ; le dessin des maillages de deux zones tant que les deux sont chargées ; l’abonnement à un second salon près d’un raccord ; et le changement de salon au passage. La règle de capture du premier billet décide de la façon de les mesurer : dans le simulateur iPhone Duo, les images RealityKit ne sont fidèles que capturées depuis l’intérieur du bundle de test (XCUIScreen.screens[1]), pas depuis l’hôte.60 La vérification 6 du cahier des charges utilise exactement cette capture pour sa vue du voisin avant le raccord, et exécute son inspection de chaque image et son journal de cadence, lu à partir des callbacks de CADisplayLink, sur une build pour appareil plutôt que sur le simulateur : sur un iPhone Duo ouvert dès qu’il y en aura un sous la main, et d’ici là sur un iPhone 18 Pro Max, parce qu’aucun iPhone Duo n’est appairé à mon Mac au moment où j’écris.64 Aucune méthode de capture n’a encore montré qu’elle enregistrait chaque image affichée ; la correspondance du nombre d’images dans la vérification, les images de l’enregistrement contre les callbacks du journal de cadence, décide si l’une d’elles y parvient.
7. Le cahier des charges : ce que Kiradex construit et les vérifications à passer
Synthèse de l’auteur. Ce qui suit est ma proposition, déduite des sections 1 à 6 et ajustée au plan du monde du dépôt Kiradex, à sa section 4 (« The game », le jeu) et à sa section 7 (« Order of work », l’ordre des travaux).2726 Elle ne nomme aucun lieu, aucune créature ni aucune marque d’un jeu Pokémon ; là où elle emprunte une mécanique, elle cite la règle de la section 5, pas le vocabulaire du jeu d’origine. Chaque taille est exprimée en tuiles de 16 pixels, et la longueur d’une marche est son coût dans la recherche de chemin propre à l’app, un pas en diagonale comptant √2 tuiles (point 3).28 Chaque durée est cette longueur à la marche nominale de 4 tuiles par seconde, un chiffre de comparaison avec le canon, pas une mesure ; le cahier des charges du billet sur le mouvement ferait parcourir une tuile droite en 16 ticks à 60 hertz, 3,75 tuiles par seconde, et arrondirait une diagonale à 23 ticks, ce qui allongerait chaque durée ici d’un quinzième sur les pas droits et d’environ un douzième sur les diagonales.41617
La boucle de Kiradex se joue dans le monde réel. L’XP ne vient que de cartes scannées et enregistrées : « XP comes only from the real world, which is the point of the app. » (l’XP ne vient que du monde réel, et c’est tout l’objet de l’app).27 La marche est donc un coût, pas un contenu, et chaque zone doit donner au marcheur quelque chose à faire de sa collection : la montrer, échanger autour d’elle, gagner un cosmétique grâce à elle, ou être renvoyé vers le scanner. Rien de ce qui est trouvé ou gagné en marchant n’est jamais une carte ou de l’XP, et rien dans le monde n’est vendu contre de l’argent, sauf par la boutique que le plan du monde définit déjà.27
1. Cinq zones : la Grand-Place et quatre au-delà
| Zone | Ce que c’est | Taille (tuiles) | Reliée à | Rôle dans la boucle de collection |
|---|---|---|---|---|
| La Grand-Place (existe) | La ville : maisons, halle, kiosque, terrasse de la fontaine, cour d’arrivée | 40 sur 30 | le moyeu | Arriver, exhiber sa carte préférée, entrer dans les pièces et la halle |
| La rue des Classeurs | Une rue commerçante : la boutique de cartes du kit des structures, le comptoir d’échange, un tableau des demandes, plus tard une rangée de six étals de marché | 44 sur 14 | la Grand-Place, à l’est, raccord ouvert | Dépenser des pièces en cosmétiques ; voir ce que les collectionneurs de la ville demandent à voir ; l’écran d’échange ; les étals de marché quand cette phase viendra |
| La promenade des Prés | Un chemin de parc à travers prés et bosquets, avec des massifs de fleurs où apparaissent les trouvailles, et une allée bordée de haies pour le retour, dont le portillon ne s’ouvre que du côté du lac | 24 sur 60, grand axe nord-sud | la Grand-Place, au nord, raccord ouvert | Trouvailles (point 6) ; une promenade entre amis ; le chemin du lac |
| Le Bord du lac | Le bout de la promenade : une rive, un ponton, des bancs, un hangar à bateaux | 36 sur 20 | la promenade des Prés, au nord, raccord ouvert | Le lieu calme où s’asseoir et montrer une carte au coucher du soleil ; le point de rendez-vous hebdomadaire |
| Le quartier des Galeries | Un quartier de pierre : le musée et la galerie des vitrines des collectionneurs | 30 sur 20, plus une maison de l’arche de 8 sur 6 | la Grand-Place, à l’ouest, par l’arche (deux portes) | Les séries complétées sur tout le serveur remplissent le musée ; le gardien des étapes dans l’arche (point 7) |
La surface totale au-delà de la Grand-Place vaut 616 plus 1 440 plus 720 plus 600, soit 3 376 tuiles, 2,8 fois les 1 200 de la Grand-Place, dans la fourchette du canon de 1,97 à 3,87 (section 5, Proportion).1733 Le quartier des Galeries se trouve derrière un bâtiment parce qu’il est dessiné en pierre à partir d’un autre jeu de sol (section 5, Raccords). Les trois autres partagent la pelouse et le pavage de la Grand-Place, ils se rejoignent donc à des raccords ouverts, trois en tout : la rue des Classeurs au bord est de la Grand-Place, la promenade des Prés à son bord nord, et le Bord du lac au bord nord de la promenade des Prés.26 Le tableau des demandes de la rue des Classeurs montre ce que les collectionneurs de la ville eux-mêmes demandent à voir, jugé sur les vraies cartes par le code qui le fait déjà (Kiradex/World/Wants.swift) ; ses étals attendent la place de marché, que le plan du monde fait passer par eBay dans une phase ultérieure.6527
Les zones proposées, dessinées sur la grille de l’écran de carte ; schéma seulement, dessiné par figures/make_figures.py, qui vérifie que chaque rectangle correspond à la taille de sa zone divisée par 10, arrondie.
Vérifications : 4 (proportion) et 5 (orientation).
2. Distances et durées
| Trajet | Cible (tuiles) | À 4 tuiles par seconde | Référence du canon |
|---|---|---|---|
| Cour d’arrivée jusqu’à la porte de la boutique de cartes | au plus 60 | au plus 15 s | section 5, Première étape : 15 à 25 s |
| Cour d’arrivée jusqu’au ponton du Bord du lac, aller | 110 à 120 | 28 à 30 s | Plus long qu’une première étape (15 à 25 s), en deçà des étapes de route du canon allant jusqu’à 40 s et de ses donjons d’une minute ; Sinuosité, aller 1,15 à 1,70 fois le grand côté |
| Ponton du Bord du lac jusqu’à la cour d’arrivée, retour, par le portillon de la haie | au plus 0,8 fois la marche aller | au plus 24 s | Le retour est plus court |
| Cour d’arrivée par l’arche jusqu’à la porte du musée | au plus 70 | au plus 18 s | Première étape |
| De n’importe quelle zone à n’importe quelle zone visitée en tram | un fondu | environ 1 s plus la reconnexion | Voyage rapide ; Transitions |
Les 60 tuiles de longueur de la promenade des Prés serpentent en 78 à 90 tuiles de chemin, un facteur de 1,3 à 1,5 (section 5, Sinuosité).26 Un chemin seul ne peut pas raccourcir le retour : sur une grille où chaque pas se fait dans les deux sens, la marche la plus courte de l’arrivée au ponton est aussi la marche la plus courte du retour, et un chemin plus droit serait pris à l’aller aussi. L’économie exige quelque chose à sens unique. Ici, c’est un portillon dans une haie. Une allée de 2 tuiles de large bordée de haies descend tout droit le long du côté est de la promenade des Prés, dans l’alignement du ponton, jusqu’au bord nord de la Grand-Place entre la halle et la maison à l’est de celle-ci, où la pelouse entre les deux descend vers la cour d’arrivée. Le portillon au bout de l’allée côté lac ne s’ouvre que du côté du lac. À l’aller, il reste fermé et le chemin serpente ; au retour, il s’ouvre et l’allée est droite. C’est le raccourci à sens unique du canon pour revenir (section 5, Le retour), mis à plat. J’ai modélisé les trois zones sur le graphe commun à huit directions du point 3, avec la ville telle que la forge la dessine aujourd’hui, et l’allée et le ponton placés de cette façon. J’ai choisi de faire serpenter le pré avec quatre haies en travers, une toutes les 12 rangées, chacune percée d’une ouverture de 2 tuiles. Les pas en diagonale raccourcissent chaque lacet. Sur toutes les positions d’ouverture, deux haies régulièrement espacées ne peuvent pas faire serpenter le pré sur 78 tuiles avec ce graphe : elles atteignent au plus 66,46 tuiles d’un bord à l’autre. Trois haies régulièrement espacées le peuvent, mais de justesse : 6 de leurs 8 000 positions d’ouverture le font serpenter sur 78 à 79,77 tuiles, et 5 de ces 6 donnent aussi un aller dans la fourchette de 110 à 120 tuiles, à 114,05 à 119,02, avec un retour de 0,740 à 0,772 fois l’aller, sous la cible de 0,8. Quatre haies le font serpenter sur 78 à 90 tuiles dans 5 912 de leurs 160 000 positions, ce qui laisse à la forge de la marge pour aménager le pré. Cette marge est ma raison de choisir quatre ; le graphe ne l’impose pas. Sur ces agencements à quatre haies, le retour fait 88,07 tuiles contre 108,74 à 133,75 à l’aller. La cible de 0,8 exige au moins 110,09 à l’aller, et dans la fourchette aller de 110 à 120 tuiles, les 4 111 agencements la respectent tous, à 0,73 à 0,80. Avec le portillon ouvert dans les deux sens, les deux marches sont égales.66 La marche à huit directions explique pourquoi les deux haies du modèle précédent ne suffisent plus : elle ne raccourcit l’allée du retour que de 91 tuiles à 88,07, parce que l’allée est déjà droite, mais retranche bien davantage à un chemin aller sinueux, si bien que le portillon économise moins à moins que le pré ne serpente davantage. Le même modèle fixe la borne basse de la fourchette. Aucun agencement, à aucun décalage ni à aucune position de ponton qu’il essaie, ne donne un aller de moins de 107,18 tuiles, et le retour n’est jamais inférieur à 88,07, si bien qu’un aller nettement sous 110 tuiles manque la cible de 0,8.66 Des descentes à sens unique depuis les terrasses du pré feraient la même chose à la manière du canon, mais le travail sur les structures a refusé les rebords, donc les descentes sont renvoyées au billet sur l’élévation, qui en décidera.3626
Vérification : 3 (distances).
3. Les connexions comme données
Chaque zone est un export de la forge comme town.json : lettres, sol en autotuiles, objets, téléporteurs et arrivée, plus connections: [{"dir": "north"|"south"|"east"|"west", "area": "<id>", "offset": <tiles>}], où le décalage est l’origine du voisin le long du bord commun, la convention de la troisième génération.148 Chaque connexion a une inverse au décalage opposé (section 5, Connexions), sans exception : les connexions à sens unique du canon sont un artifice de dessin dont ce cahier des charges n’a pas besoin. La copie de chaque zone sur le serveur porte les lettres et les connexions, pour qu’une marche soit validée à travers le raccord.6026
Un seul graphe de marche sert les deux côtés. Le TileMap.path de l’app cherche dans huit directions, un pas en diagonale coûtant √2 et n’étant autorisé que si les deux tuiles entre lesquelles il passe sont praticables, pour que personne ne coupe l’angle d’un mur ; le Plaza.path du serveur, dans server/app/rooms.py, cherche dans quatre directions, bien que son commentaire le décrive comme « the same walk the app takes » (la même marche que celle de l’app).28 Le cahier des charges fait de la recherche du client le contrat : la modification du serveur remplace Plaza.path par la même recherche à huit directions, à √2 et sans couper les angles, et les deux lisent le portillon de la haie (point 2) comme une arête orientée, dans laquelle on n’entre que du côté du lac par un pas droit et qu’on ne quitte jamais vers le lac. Chaque distance de ce cahier des charges est mesurée sur ce graphe.
Vérifications : 1 (réciprocité), 2 (passages) et 12 (parité serveur).
4. Raccords ouverts, sans fondu
Franchir un raccord ouvert se fait sans fondu (section 5, Transitions). Le client dessine le sol et les objets du voisin sur au moins une demi-vue de profondeur : 15 tuiles à travers un raccord est-ouest, la moitié des 29,7 du Duo ouvert, et 12 à travers un raccord nord-sud, la moitié des 22,4 d’un Pro Max en portrait (section 5, Bande voisine).6017 La forge calcule les masques d’autotuiles à travers chaque raccord, pour qu’un chemin qui le franchit ne se termine pas par une bordure, et ouvre dans la clôture de la ville, à chaque raccord, une brèche d’au moins 2 tuiles de large dont les cellules sont praticables des deux côtés.1426 La forêt que la forge dessine aujourd’hui sur 12 tuiles autour de la ville (MARGIN = 12) cède la place au voisin sur tout le bord commun : la bande du voisin y remplace la marge de forêt, et la forêt ne reste que là où aucune zone ne se raccorde. Cela corrige le dossier, qui ouvrait aussi la brèche de 2 tuiles dans la marge de forêt et aurait laissé la forêt masquer l’essentiel de la bande du voisin.1426 Le client s’abonne aux marcheurs du salon voisin dès qu’il commence à dessiner la bande de ce salon et change de salon au passage.26
Vérification : 6 (aucune image noire, aucun blocage du fil principal, et la bande visible avant le raccord).
5. Le cartouche de nom
En entrant dans une zone par un raccord ou en tram, son nom glisse à l’écran, reste affiché puis s’en va en environ 3 secondes (section 5, Cartouche de nom), à l’échelle de l’interface dans SwiftUI, jamais dans la couche de pixels.2160
Vérification : 7 (durée du cartouche de nom).
6. Les trouvailles de la promenade des Prés
- Où. Les massifs de fleurs couvrent 12 % à 18 % des tuiles praticables de la promenade des Prés, dessinés avec leur propre jeu d’autotuiles pour se lire de loin.26 Cette part est mon choix, pas un chiffre du canon. Comptées de la même manière, sur le sol praticable, les premières routes du canon ont 18,8 % à 38,4 % de hautes herbes et ses routes suivantes 8,2 % à 29,2 % (section 1), si bien que les massifs se situent avec les routes suivantes et sous toutes les premières routes : un éclat est placé et visible, les massifs n’ont donc qu’à l’encadrer, pas à porter un tirage à chaque pas.17
- Comment elles apparaissent. Pas par un tirage à chaque pas. En entrant dans la promenade des Prés, le serveur place au plus un éclat visible pour ce collectionneur dans un massif, choisi de façon déterministe à partir du collectionneur, de la date et de la zone, la règle d’entrée dans un acre d’Animal Crossing, jusqu’à ce que le collectionneur en ait eu trois ce jour-là.5526 Un éclat visible garde la règle lisible pour un enfant et évite les séries sans avoir besoin de la recharge avec rampe de la ligne Cadence de la section 5.
- Ce qu’elles sont. Uniquement des choses du monde : un autocollant ou un cadre pour la pièce, un cosmétique de pochette ou d’épinglette, ou une note qui nomme l’une des quêtes du jour, que seul un vrai scan peut accomplir ; les quêtes sont déjà jugées à partir de la collection elle-même (
Kiradex/World/Quests.swift).2765 Jamais une carte, jamais de l’XP, jamais rien de vendu ; une trouvaille ne peut jamais devenir une raison d’acheter. Les pièces attendent : le plan du monde permet de gagner des pièces par les visites quotidiennes mais n’en fixe ni le montant ni le plafond, et place les pièces dans sa quatrième phase, si bien que les trouvailles en pièces sont reportées jusqu’à ce que cette règle existe, et viendront alors du même budget de visites quotidiennes plutôt que de s’y ajouter.27 - Qui les voit. L’éclat de chaque collectionneur est le sien ; des amis qui marchent ensemble voient chacun le leur. Il n’y a rien à rafler ni à se disputer.
Vérification : 10 (trouvailles).
7. L’arche et son gardien
Le bâtiment entre la Grand-Place et le quartier des Galeries est une pièce de 8 sur 6 avec une porte de chaque côté et un gardien à un comptoir. Le gardien remet un cosmétique quand le nombre de cartes enregistrées du collectionneur dépasse pour la première fois 10, 30, 50 et 100, la porte d’étape de collection de la ligne Postes de la section 5, comptée à partir de la collection du monde réel comme l’est l’XP.2026 La pièce est aussi l’endroit où le graphisme passe de la pelouse à la pierre (section 5, Raccords). Rien n’est verrouillé : l’arche est toujours ouverte, et le gardien ne fait que donner.
Vérification : 11 (gardien de l’arche).
8. L’écran de carte
Une grille de 16 sur 12 de rectangles nommés, une case pour 10 tuiles, arrondie : la Grand-Place 4 sur 3, la rue des Classeurs 4 sur 1 du côté est de la Grand-Place, la promenade des Prés 2 sur 6 au-dessus, le Bord du lac 4 sur 2 tout en haut, le quartier des Galeries 3 sur 2 à l’ouest. Empilés, le Bord du lac, la promenade des Prés et la Grand-Place occupent 11 des 12 rangées (section 5, Écran de carte).2617 Chaque zone est dessinée et nommée dès le premier jour. C’est le choix propre de Kiradex, pas celui du canon : les quatre jeux dessinent chaque lieu une fois que le joueur a la carte, à quelques lieux tardifs près, mais ne remettent la carte qu’en cours de partie (section 5, Voyage rapide), et une ville de collectionneurs n’a aucune raison de faire mériter à qui que ce soit le droit de la voir. La zone courante pulse ; les zones visitées montrent leur station de tram. Sur le Duo ouvert, la carte se place en panneau à côté du monde ; sur un téléphone, c’est une feuille.27
Vérification : 8 (modèle de l’écran de carte).
9. Le tram
Chaque zone extérieure a une station. Une station s’ouvre la première fois que le collectionneur entre dans cette zone, le drapeau « visité » de la ligne Voyage rapide de la section 5, posé à l’entrée et jamais par le niveau ou le paiement.1326 Depuis l’écran de carte, toucher une zone visitée y emmène : fondu au noir, changement de salon, retour à l’image à la station de cette zone, puis le cartouche de nom. Pas de trajet depuis un intérieur, de même que Vol n’en permet aucun (section 5, Voyage rapide).13 Le tram transforme les 28 à 30 secondes de marche jusqu’au Bord du lac en une simple touche une fois la marche faite une fois, un raccourci gagné en visitant plutôt que par une capacité (section 5, Déblocages).26
Vérification : 9 (règles du tram).
10. Noms et graphisme
Le nom, les panneaux et les chaînes de chaque zone passent une liste d’exclusion de noms protégés, et chaque tuile et chaque sprite vient de la forge.2726 La liste d’exclusion n’existe pas encore : le dossier en promettait une dans le dépôt, et le dépôt n’en a aucune. La créer fait partie de ce cahier des charges : une simple liste des noms protégés, un par ligne, versionnée dans le dépôt à côté de la forge, et un test qui lit le nom, les panneaux et les chaînes de chaque zone dans les exports de la forge et échoue sur toute entrée de la liste qui s’y trouve, sans tenir compte de la casse.26 Pas de noms de routes numérotés, pas de schéma de nommage par « régions », et aucun bâtiment qui reproduise l’apparence d’un poste de passage du canon : les tailles et les règles peuvent correspondre, mais les formes et les noms doivent appartenir à Kiradex.26
Vérification : 13 (noms et graphisme).
11. Ordre des travaux
Le plan du monde place la place (salons, synchronisation, bulles, profils, écran d’échange) en troisième et les pièces et la boutique en quatrième.27 Les zones s’insèrent comme une phase 3b, une fois le réseau de la place stabilisé et avant les pièces ou en parallèle :26
- Les connexions dans la forge et le serveur (format, réciprocité, dessin des raccords, changement de salon), la recherche à huit directions du serveur, et la liste d’exclusion avec son test, avec la rue des Classeurs comme première zone, parce qu’elle utilise la boutique de cartes que le travail sur les structures a déjà conçue et que c’est la plus petite.
- La promenade des Prés et les trouvailles (placement par le serveur, le plafond quotidien, les contenus).
- L’écran de carte et le tram.
- Le Bord du lac.
- Le quartier des Galeries avec l’arche, une fois que l’intérieur du musée existera. La rangée d’étals de la rue des Classeurs attend la phase de la place de marché.
Chaque étape est une build TestFlight, comme le plan du monde le demande pour chaque phase, avec des captures pour ses vérifications.27
Les vérifications de recette
Chacune peut être exécutée par un script sur les exports de la forge et les tests du serveur, ou par une capture dans le simulateur ; la vérification 6 s’exécute sur un appareil, hormis sa seule capture dans le simulateur.26
- Réciprocité. Les exports contiennent exactement trois raccords ouverts, Grand-Place est vers la rue des Classeurs, Grand-Place nord vers la promenade des Prés et promenade des Prés nord vers le Bord du lac, et pour chaque connexion
(a, dir, b, off)l’export contient(b, opposite(dir), a, −off); le test échoue sur toute connexion à sens unique, sans exception. - Passages. Une recherche en largeur depuis l’arrivée et les portes de chaque zone trouve au moins 2 tuiles de passage de chaque côté de chaque raccord, face à des tuiles praticables de l’autre côté, la méthode de
measure_gen3_routes.py.6 - Distances. La recherche commune à huit directions du point 3 sur les zones raccordées, avec le portillon de la haie comme arête à sens unique (où l’on n’entre que du côté du lac par un pas droit et qu’on ne quitte jamais vers le lac), et chaque longueur comptée comme un coût de chemin où un pas en diagonale vaut √2, indique : arrivée à la boutique de cartes au plus 60 tuiles ; arrivée au ponton du Bord du lac 110 à 120 ; ponton à l’arrivée au plus 0,8 fois la marche aller ; arrivée à la porte du musée au plus 70. La forge affiche les durées à 4 tuiles par seconde.
- Proportion. Les tuiles au-delà de la Grand-Place divisées par les tuiles de la Grand-Place sont comprises entre 2,0 et 3,9.
- Orientation. La hauteur de la promenade des Prés dépasse sa largeur.
- Aucune image noire et aucun blocage du fil principal à un raccord. Sur une build pour appareil, le collectionneur traverse le raccord entre la Grand-Place et la rue des Classeurs, à partir d’une tuile située à plus d’une demi-vue du raccord, avant que la scène commence à construire le maillage de la rue des Classeurs, jusqu’à ce que le premier pas au-delà du raccord soit terminé et que la Grand-Place soit devenue la bande derrière. Deux enregistrements couvrent toute cette durée. Pour l’exécution, le display link demande 60 hertz par son
preferredFrameRateRange, pour que la fréquence variable d’un écran ProMotion ne fasse pas bouger le décompte en pleine marche ; Apple décrit cette plage comme une plage que le display link fait de son mieux pour respecter, c’est donc le journal de cadence, et non la demande, qui montre la fréquence effectivement tenue.67 Le premier enregistrement est chaque image affichée par l’écran, conservée par un enregistrement à cette fréquence et inspectée image par image : une image est noire quand sa luminosité moyenne est inférieure au quart de celle de l’image médiane de la durée (mon seuil), et une seule image noire n’importe où dans la durée fait échouer la vérification. Le nombre d’images de l’enregistrement sur la durée doit égaler le nombre de callbacks du journal de cadence sur la même durée, pour qu’une capture qui perd des images ne puisse pas réussir en manquant justement l’image noire. Aucune méthode de capture n’a encore montré qu’elle enregistrait chaque image affichée, et cette correspondance est ce qui décide si l’une d’elles y parvient. Quand les nombres diffèrent et que le journal de cadence respecte sa propre règle ci-dessous, la faute revient à la capture et l’exécution ne compte pas ; quand ils diffèrent et que le journal de cadence échoue à cette règle, la vérification échoue. Le second est letargetTimestampd’un callbackCADisplayLinkenregistré sur la boucle d’exécution principale, comme le fait l’exemple d’Apple lui-même, l’instant auquel, selon la documentation d’Apple, la prochaine image s’affiche, journalisé à chaque image ; aucun intervalle entre deux valeurs successives ne doit dépasser 25 millisecondes, une image et demie à 60 hertz, si bien qu’une seule image perdue fait échouer la vérification comme le fait une seule image noire, ce qui détecte un blocage du fil principal pendant la construction du voisin aussi bien qu’au passage. Une exécution dont le journal de cadence se stabilise à une fréquence autre que 60 hertz ne compte pas, et le mode économie d’énergie est désactivé pour elle, puisqu’Apple cite ce mode, un état thermique critique et les réglages d’accessibilité parmi ce qui peut changer la fréquence.67 L’appareil est un iPhone Duo ouvert dès qu’il y en aura un sous la main ; aucun iPhone Duo n’est appairé à mon Mac au moment où j’écris, donc d’ici là la vérification s’exécute sur un iPhone 18 Pro Max à travers le même raccord, ce qui montre si l’approche et le passage bloquent ou noircissent l’écran sur un téléphone, mais pas comment l’écran interne du Duo cadence ses images. Le simulateur ne peut pas le remplacer : selon ma lecture, sa cadence d’images mesure le Mac qui l’exécute, pas un téléphone. Par ailleurs, une capture dans le simulateur du Duo ouvert depuis l’intérieur du bundle de test, avec le collectionneur sur la dernière tuile de la Grand-Place avant le raccord, montre au moins 14 tuiles de la rue des Classeurs.6064 - Cartouche de nom. Le cartouche est à l’écran entre 2,5 et 3,5 secondes après le franchissement d’un raccord ou une arrivée en tram.
- Modèle de l’écran de carte. Tests unitaires : le rectangle de chaque zone tient dans 16 sur 12, deux rectangles ne se chevauchent jamais, chaque zone a un nom, la zone courante est marquée, et la station d’une zone non visitée est désactivée.
- Règles du tram. Tests serveur : un trajet vers une zone non visitée est refusé ; un trajet depuis un intérieur est refusé ; un trajet se termine à la station de destination.
- Trouvailles. Tests serveur : au plus un éclat par entrée dans une zone, au plus trois par collectionneur et par jour, le même éclat pour le même collectionneur, la même date et la même zone, et des contenus tirés uniquement des tables de cosmétiques et de notes de quête, jamais une carte, de l’XP ou des pièces. Un test de la forge : les massifs de fleurs couvrent 12 % à 18 % des tuiles praticables de la promenade des Prés.
- Gardien de l’arche. Un test unitaire : les quatre cadeaux d’étape se déclenchent une fois chacun, à des nombres de cartes enregistrées de 10, 30, 50 et 100, et jamais à partir de pièces ou d’achats.
- Parité serveur. Le serveur charge les lettres et les connexions de chaque zone et fait marcher un collectionneur de l’arrivée au ponton du Bord du lac à travers deux raccords, puis retour par le portillon de la haie, avec la recherche à huit directions du point 3 ; l’app et le serveur renvoient les mêmes tuiles et le même coût dans les deux sens, et un pas que la recherche du client refuserait, un angle coupé ou un pas sortant de l’allée par le portillon, est refusé aussi par le serveur, sur le modèle des tests serveur existants.3728
- Noms et graphisme. La liste d’exclusion existe dans le dépôt avec son test, et le test passe : chaque nom de zone, panneau et chaîne franchit la liste ; chaque tuile et chaque sprite vient de la forge.
Hors de ce cahier des charges
- Les rencontres aléatoires à chaque pas, ou tout ce qui se joue comme un combat sauvage. Les trouvailles sont placées et visibles.
- Les verrous de capacité sur les zones principales. Aucune zone ne s’ouvre par un niveau, une épinglette, un achat ou un outil ; les zones s’ouvrent en y marchant, et seul le raccourci, le tram, se mérite, en visitant. C’est la ligne Déblocages de la section 5 lue avec bienveillance.5226
- Les trajets de plus d’environ 30 secondes entre deux lieux où les gens se retrouvent, sans tram. Les étapes d’une minute du canon sont des donjons.7
- Les rebords, les terrasses à descente à sens unique et toute hauteur par cellule. Renvoyés au billet sur l’élévation, qui en décidera ; d’ici là, le cahier des charges obtient son retour plus court du portillon de la haie, à sens unique mais plat.36
- Les noms de routes numérotés, un schéma de nommage par « régions », un voyage rapide conditionné à des badges, ou un bâtiment qui copie l’apparence d’un poste de passage du canon.27
- Les connexions à sens unique. Le canon s’en sert comme artifice de dessin ; ce cahier des charges n’en a aucune, et la vérification 1 échoue sur la moindre.8
- Les trouvailles en pièces, jusqu’à ce que le plan du monde fixe combien de pièces rapporte une visite quotidienne.27
- Les étals de marché de la rue des Classeurs avant la phase de la place de marché.27
Points clés
Si vous dessinez le graphisme
- Ne dessinez un raccord que là où le sol continue. Rouge relie un seul jeu de tuiles dans 76 de ses 78 connexions, et chaque poste de passage de Rouge entre deux lieux se trouve là où le jeu de tuiles change ; un bâtiment à deux portes est la façon honnête de changer de matière.8
- Faites une première route courte et la plus herbeuse : deux à six écrans, 14 % à 23 % de sa carte en terrain de rencontre, aucun dresseur. Raréfiez-la à mesure que le voyage avance.56
- Dessinez l’écran de carte comme une grille grossière de rectangles nommés. Celui d’Émeraude fait 28 cases sur 15, et 49 de ses 95 rectangles sont une seule case.11
Si vous construisez le moteur
- Stockez les connexions comme des données avec une direction, un voisin et un décalage, et testez que chacune a une inverse au décalage opposé ; les 134 d’Émeraude en ont toutes une.842
- Dessinez au moins une demi-vue du voisin au-delà du bord. La troisième génération copie 7 cellules (8 à l’est) parce que le joueur en voit 7 de chaque côté ; aux échelles de Kiradex, cela fait 15 tuiles sur le Duo ouvert et 12 sur un Pro Max en portrait.960
- Gardez une seule scène à travers un raccord et réservez le changement de scène aux portes et au voyage rapide, là où un fondu le masque.1037
- Mesurez les distances avec une recherche, pas avec une règle, et avec chaque règle de déplacement du moteur : sur les neuf routes mesurées dont les extrémités se rejoignent à pied, la traversée la plus longue vaut 1,15 à 1,70 fois le grand côté et le retour 0,95 à 1,42, et le retour peut être d’un quart plus court que l’aller. Une recherche sans les murs à sens unique ni les sauts latéraux d’angle de Cristal donne 110 cellules dans chaque sens pour la Route 32 ; avec eux, c’est 132 à l’aller et 128 au retour.5617
- Donnez à l’app et au serveur un seul graphe de marche. Si le client marche dans huit directions et le serveur dans quatre, chaque distance qu’un test mesure n’appartient qu’à l’un des deux.28
Si vous concevez la boucle
- Dimensionnez chaque trajet en secondes. Une première étape représente 15 à 25 secondes de marche dans le canon ; une minute, c’est un donjon.7
- Rendez le retour plus court que l’aller, et donnez-lui quelque chose à sens unique pour y parvenir, car sur une grille praticable dans les deux sens, le plus court chemin du retour est le plus court chemin de l’aller. Le canon y parvient avec des rebords, jusqu’à 44 % ; un portillon qui ne s’ouvre que du côté éloigné y parvient sans relief.5666
- Une fois que le joueur a la carte, montrez-y chaque lieu, et ne faites mériter que le raccourci, en visitant. Chaque jeu Pokémon mesuré ici remet la carte en cours de partie, y dessine chaque lieu, visité ou non, hormis quelques lieux tardifs que des drapeaux de scénario ou d’événement retiennent, pose le drapeau « visité » à l’entrée, et ne liste que les lieux visités pour le voyage rapide ; Kiradex va un pas plus loin et montre sa carte dès le premier jour.4445121323222426
- Ouvrez les zones par l’action et la date, comme le fait Stardew, plutôt que par un niveau ou un achat, et donnez au marcheur quelque chose à faire de sa collection partout où il va.5227
Questions fréquentes
Quelle longueur pour une route dans un RPG en vue de dessus ?
Dans les jeux Pokémon en 2D, deux à dix écrans de console le long de l’axe de déplacement, et deux à six pour la première route. En cellules, les seize routes que j’ai mesurées vont de 20 à 108 le long de leur grand côté, et sur les neuf qui se parcourent d’un bout à l’autre, la traversée la plus courte dans le sens le plus long vaut 1,15 à 1,70 fois cette longueur parce que le chemin serpente, et le retour 0,95 à 1,42. À 16 images par cellule, une première étape d’une porte au bâtiment principal de la ville suivante prend 15,5 secondes dans Émeraude et 25,2 dans Rouge Feu.56717
Comment les jeux Pokémon relient-ils les cartes sans écran de chargement ?
Chaque carte liste ses voisines avec une direction et un décalage. Dans Émeraude, le moteur copie la carte courante dans un tampon avec une marge de 7 cellules (8 à l’est), « the player has 7 metatiles of view horizontally in either direction » (le joueur voit 7 métatuiles horizontalement de chaque côté), et remplit la marge d’un côté raccordé avec 7 rangées ou colonnes du voisin (8 colonnes à l’est), dessinées avec les tuiles de la carte courante. Quand le joueur traverse, il charge le jeu de tuiles secondaire, la palette, la musique et la météo de la nouvelle carte et fait glisser un cartouche de nom, sans fondu. Rouge fait la même chose avec une marge de 3 blocs, 6 cellules.91039
Pourquoi les routes de Kanto ont-elles des postes de passage ?
Selon ma lecture des données, parce qu’un raccord de Game Boy ne peut relier que deux cartes dessinées avec le même jeu de tuiles, et qu’un poste de passage est une porte là où le jeu de tuiles change : 76 des 78 connexions de Rouge relient un seul jeu de tuiles, et chaque poste de Rouge entre deux lieux en relie deux. Les postes portent aussi des règles : les gardes de Safrania qui veulent à boire, une vérification de badge sur la Route 22, et trois assistants qui remettent des objets à 10, 30 et 50 espèces possédées. Aucune déclaration des développeurs ne confirme la raison du jeu de tuiles.8192029
Pourquoi les rebords sont-ils à sens unique dans Pokémon ?
Le comportement d’une cellule de rebord désigne un sens de déplacement, et le joueur ne peut la franchir que dans ce sens. Mesurés sur les premières routes, les rebords regardent vers la ville précédente : le retour est de 2 % à 44 % plus court que l’aller sur les neuf routes à rebords dont les extrémités se rejoignent à pied. Sur les quatre routes explorées à cet effet, le retour traverse 0 à 5 cellules de hautes herbes contre 4 à 19 à l’aller.365618
Comment Vol décide-t-il vers quelles villes vous pouvez voler ?
Par un drapeau « visité » posé quand vous entrez dans la ville. Dans Émeraude, chacune des 16 villes pose son drapeau FLAG_VISITED_* dans son script de transition, et la carte régionale ne marque une ville comme destination de Vol que si le drapeau est posé ; Rouge garde un bit par ville dans wTownVisitedFlag, et Cristal pose un point de vol dans un callback de carte. Vol exige aussi un badge (le troisième dans Rouge et Rouge Feu, le sixième dans Émeraude) et une carte extérieure.13222423
Quelle taille fait une ville par rapport à ses routes ?
Deux à quatre fois plus petite. Les cellules de route divisées par les cellules de ville donnent 1,97 dans Cristal, 2,65 dans Rouge, 3,70 pour les routes terrestres d’Émeraude et 3,87 dans Rouge Feu ; sur l’écran de carte d’Émeraude, le rapport se lit 5,9 pour 1, parce qu’une ville prend une ou deux cases quelle que soit sa taille.3334
Est-il légal de copier la façon dont Pokémon construit ses routes ?
Les mécaniques, les tailles et les méthodes ne sont pas protégées par le droit d’auteur. Les tuiles et les sprites précis le sont, et les noms et les marques relèvent du droit des marques. Le premier billet de cette série traite de cette frontière, avec la Circular 33 du Copyright Office américain, qui place les systèmes et les méthodes de fonctionnement hors du droit d’auteur, et les brevets du procès intenté par Nintendo au développeur de Palworld.60 Ce cahier des charges emprunte des chiffres et des règles et dessine chaque tuile avec la forge propre à Kiradex, en vérifiant les noms contre une liste d’exclusion.26
Comment ce billet a été fait. Le dossier de recherche qui le sous-tend a été compilé le 4 octobre 2026 à partir de clones superficiels des décompilations de pret, mesurés par six scripts Python conservés avec leurs sorties, et de copies enregistrées du Stardew Valley Wiki, de Nookipedia, du désassemblage zladx, du manuel de Porymap, de GBATEK, de Pan Docs, d’une page de Bulbapedia et de pages d’Apple. Chaque chiffre Pokémon du texte est la sortie d’un script, et chaque note nomme le script. Avant publication, une seconde relecture le 5 octobre a conduit à trois nouvelles mesures, les murs à sens unique et les sauts d’angle de Cristal, la course par-dessus les rebords, et le pré du cahier des charges sur la marche à huit directions de l’app, ainsi qu’à une lecture plus attentive des pas de grâce du code de rencontre ; chaque note dit ce qui a bougé. La proposition de la section 7 est la mienne et signalée comme telle ; rien n’en a été construit.
À lire aussi sur ce site : Des mondes en pixel art sur iPhone est le premier billet de cette série, avec les systèmes de tuiles, la recette RealityKit et les décomptes de tuiles par appareil sur lesquels reposent les vues de ce billet ; Des personnages en pixel art : personnages et éditeur sur iPhone est le collectionneur qui parcourt ces routes ; Des structures en pixel art : maisons, halls et intérieurs sur iPhone contient les portes, les téléporteurs et les échanges d’étage que réutilisent le tram et l’arche, ainsi que le refus des rebords que ce billet laisse au billet sur l’élévation ; iPhone Duo pour les développeurs établit la taille de l’écran interne d’où se calcule la bande d’une demi-vue ; Préparer votre app pour l’iPhone Duo traite de la disposition côte à côte que suit le panneau de carte ; et Xcode 27.1 beta : votre app dans le simulateur iPhone Duo traite du simulateur sur lequel tourne la vérification de raccord du cahier des charges.
Sources
-
pret,
pokered/home/overworld.asmau commitd2704a6(OverworldLoopappelleDelayFramedeux fois par itération ;AdvancePlayerSpritedéplace de 2 pixels par itération pendant 8 itérations,wWalkCountervaut 8 ; à vélo,AdvancePlayerSpriteest appelé deux fois par itération), consulté le 4 octobre 2026, https://github.com/pret/pokered/blob/master/home/overworld.asm. ↩↩↩↩ -
pret,
pokecrystal/engine/overworld/map_objects.asm(StepVectors: un pas de marche de 8 ticks de 2 pixels, un pas de vélo de 4 ticks de 4 pixels) etpokecrystal/engine/overworld/events.asm(MaxOverworldDelay: db 2) au commit5beda23, consultés le 4 octobre 2026, https://github.com/pret/pokecrystal/blob/master/engine/overworld/map_objects.asm. ↩↩↩↩ -
pret,
pokeemerald/src/event_object_movement.cau commit731ad5b(les tables de pas : 16 entrées danssStep1Funcspour la marche, 8 pour la course et le Surf, 6 pour le Vélo Cross et les courants, 4 pour le Vélo Course, 2 pour la plus rapide ;JUMP_DISTANCE_FAR, 32 images sur deux cellules ;sJumpY_Highculminant à 12 pixels), consulté le 4 octobre 2026, https://github.com/pret/pokeemerald/blob/master/src/event_object_movement.c. ↩↩↩↩↩ -
Code source de Kiradex,
Kiradex/World/PlazaRig.swift, ligne 101 (tilesPerSecond: Float = 4) et ligne 122 (runPace: Float = 1.6), lues dans l’arbre de travail le 4 octobre 2026, et lignes 660 et 666 (chaque image ajoutedt × tilesPerSecond × pace ÷ lengthà la progression d’un pas, et un pas terminé remet la progression à 0, en abandonnant le dépassement), lues le 5 octobre 2026 ; dépôt privé. Les 6,4 tuiles par seconde sont la course nominale, 4 × 1,6. ↩↩↩↩↩ -
Mesure de l’auteur, 4 octobre 2026 :
measure_gen12_routes.pydans le dossier de preuves de l’auteur pour ce billet, sortiegen12_routes.txt. Entrées tirées de pretpokeredàd2704a6:constants/map_constants.asm(tailles en blocs, doublées en cellules),maps/Route*.blk,gfx/blocksets/overworld.bstcomparé àOverworld_Coll, la tuile d’herbe$52etdata/tilesets/ledge_tiles.asm(une tuile de 8 sur 8 par cellule, celle en bas à gauche),data/maps/objects/Route*.asm(les dresseurs comme lignesobject_eventavec une classeOPP_),data/maps/headers/Route*.asm(connexions). Tirées de pretpokecrystalà5beda23:maps/Route*.blk,data/tilesets/<tileset>_collision.asmviaCollisionPermissionTable(les quatre octets par bloc supposés rangés par lignes),maps/Route*.asm(les dresseurs commeOBJECTTYPE_TRAINER). Étendu le 5 octobre 2026 (la sortie antérieure est conservée sousgen12_routes.pre-walls.txt) : les murs latéraux de Cristal, les octets de collisionCOLL_RIGHT_WALLàCOLL_UP_LEFT_WALL($b0à$b7) et les bouées latérales, refusent un pas qui sort par le côté muré et un pas qui y entre, tels queGetMovementPermissionsles pose (home/map.asm, à partir de la ligne 1511) et que.CheckLandPermsles lit (engine/overworld/player_movement.asm, ligne 686) ; les rebords d’angleHOP_DOWN_RIGHTetHOP_DOWN_LEFTsautent vers le bas ou sur le côté (.ledge_table, ligne 383), et un saut n’est tenté qu’après l’échec du pas normal (.Normal, lignes 45 à 56) ; les plus courts chemins sont trouvés par l’algorithme de Dijkstra, puisqu’un saut coûte 2. Seule la Route 32 a des murs latéraux (41 cellules, toutesUP_WALL, dont le bloc dedata/tilesets/johto_collision.asmligne 113), et seules ses marches ont bougé : 110 dans chaque sens avant, 132 vers le sud et 128 vers le nord après.probe_gen12_exact.py(sortieprobe_gen12_exact.txt) exécute toutes les combinaisons des trois changements : les murs seuls donnent 132 dans chaque sens, les sauts d’angle dans les deux sens raccourcissent ensuite le retour à 128, et la recherche exacte ne change rien ;probe_route32_path.pysuit le saut, depuis la lèvreHOP_DOWN_RIGHTà la cellule (8, 80) par-dessus une celluleWALLjusqu’à (10, 80). pokered n’a aucune permission à sens unique par tuile ; sonTilePairCollisionsLand(data/tilesets/pair_collision_tile_ids.asm) bloque une paire de tuiles dans les deux sens et ne liste que les jeux de tuiles CAVERN et FOREST, alors que chaque carte mesurée ici est OVERWORLD. La lecture par lèvre de la deuxième génération vient deprobe_gen2_ledges.py(21 des 21 cellulesHOP_DOWNde la Route 30 ont une celluleWALLen dessous). Le modèle de cellules de première génération a été vérifié à l’œil sur le rendu de la Route 1 de Rouge parrender_gen1.py, en taille double avec une grille de 16 pixels (render_Route1.png, pour analyse uniquement, dérivé d’un graphisme protégé et non publié). Également les surfaces de routes et de villes derrière la note 33. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Mesure de l’auteur, 4 octobre 2026 :
measure_gen3_routes.pydans le dossier de preuves de l’auteur pour ce billet, sortiesgen3_routes.txtetgen3_routes.json. Entrées tirées de pretpokeemeraldà731ad5betpokefireredà037335f:data/layouts/layouts.json(tailles), chaque cellule dumap.binde chaque route (bits 0 à 9 métatuile, 10 et 11 collision, 12 à 15 élévation), son comportement tiré dumetatile_attributes.binprimaire ou secondaire (Émeraude u16, bits de comportement 0 à 7 ; Rouge Feu u32, bits de comportement 0 à 8, type de rencontre bits 24 à 26), les décomptes deMB_TALL_GRASS,MB_JUMP_*et des comportements d’eau, etdata/maps/Route*/map.json(connexions, dresseurs commeobject_eventsdont letrainer_typen’est pasTRAINER_TYPE_NONE,trainer_sight_or_berry_tree_id). Marches les plus courtes par recherche en largeur. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Mesure de l’auteur, 4 octobre 2026 :
measure_travel.pydans le dossier de preuves de l’auteur pour ce billet, sortiestravel.txtettravel.json, sur pretpokeemeraldà731ad5betpokefireredà037335f. Recherche en largeur sur des paires (carte, cellule) à travers raccords, téléporteurs et rebords, de la cellule sous la première porte jusqu’à la dernière porte, en comptant le dernier pas qui y entre (ligne 136, « +1: the step up into the door ») ; secondes calculées comme cellules × 16 images ÷ 59,7275 hertz à la marche. La course, étendue le 5 octobre 2026 (la sortie antérieure, qui comptait chaque cellule de course à 8 images, est conservée soustravel.pre-ledgerun.txt), est une seconde recherche du nombre minimal d’images, 8 par pas et 32 par saut de rebord, parce que le saut de Rouge Feu estJump2àJUMP_DISTANCE_FAR, 32 images à toute allure (src/field_player_avatar.cPlayerJumpLedge, ligne 905 ;src/event_object_movement.cDoJumpSpriteMovement, ligne 9094) ; l’étape du Centre de la Route 4 à Azuria fait 2 528 images, 42,3 secondes, avec un saut, et aucune autre étape aller du tableau ne saute de rebord ; les arbres à Coupe, les rochers à Éclate-Roc et les rochers à Force bloquent leurs cellules sauf mention contraire de l’exécution (l’exécution « après Coupe » les retire, ce qui ouvreROUTE2_EAST_BUILDINGsur la Route 2). Les fondus et les combats ne sont pas comptés. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Mesure de l’auteur, 4 octobre 2026, étendue le 5 octobre 2026 pour lire 8 colonnes à l’est, comme les copie
FillEastConnection, et pour couper chaque bande là où elle sortirait du tampon, comme la coupentFillNorthConnection,FillSouthConnection,FillWestConnectionetFillEastConnection; les décomptes en primaire seul sont passés de 22 sur 38 (Émeraude) et 25 sur 34 (Rouge Feu) à 24 sur 38 et 24 sur 34 :measure_connections.pydans le dossier de preuves de l’auteur pour ce billet, sortiesconnections.txtetconnections.json, sur les quatre décompilations : chaque connexion de carte, la concordance des jeux de tuiles à chaque raccord (pour la troisième génération, jeux primaire et secondaire, et si la bande du voisin dans la marge, 7 rangées ou colonnes et 8 colonnes à l’est, n’utilise que des métatuiles primaires), la réciprocité avec décalages opposés, les décalages non nuls, les cartes sur les jeux de tuiles GATE et FOREST_GATE dans Rouge (data/maps/headers/*.asm), l’environnement GATE dans Cristal (data/maps/maps.asm), et les cartes intérieures de troisième génération dont les téléporteurs mènent à deux cartes extérieures différentes ou à deux côtés d’une même carte. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
pret,
pokeemerald/include/fieldmap.h(MAP_OFFSET 7et son commentaire, « the player has 7 metatiles of view horizontally in either direction » ;MAX_MAP_DATA_SIZE 10240;MAP_OFFSET_Wdéfini commeMAP_OFFSET * 2 + 1etMAP_OFFSET_HcommeMAP_OFFSET * 2),pokeemerald/src/fieldmap.c(InitMapLayoutDatadimensionne le tampon comme la carte plusMAP_OFFSET_WsurMAP_OFFSET_H;FillSouthConnectionet ses sœurs,FillNorthConnectionfixantx = offset + MAP_OFFSETetwidth = cWidthquand la bande tient, surMAP_OFFSETrangées de haut, etFillEastConnectioncopiantMAP_OFFSET + 1colonnes ;GetBorderBlockAtcombinant la bordure par OU avecMAPGRID_IMPASSABLE),data/maps/Route101/map.json(Rosyères au nord au décalage 0) etdata/layouts/layouts.json(LAYOUT_ROUTE101etLAYOUT_OLDALE_TOWN, chacun de 20 sur 20) à731ad5b, consultés le 4 octobre 2026, https://github.com/pret/pokeemerald/blob/master/include/fieldmap.h et https://github.com/pret/pokeemerald/blob/master/src/fieldmap.c. ↩↩↩↩↩↩↩ -
pret,
pokeemerald/src/field_camera.c(DrawMetatileAtdessine avec les jeux de tuiles primaire et secondaire du plan courant) etpokeemerald/src/overworld.c(LoadMapFromCameraTransition: le script de transition, le jeu de tuiles secondaire et la palette, la musique, la météo et le cartouche du nom de la carte, sans fondu) à731ad5b, consultés le 4 octobre 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.hetsrc/data/region_map/region_map_sections.jsonà731ad5b, consultés le 4 octobre 2026, avec des décomptes parmeasure_region_maps.py(sortieregion_maps.txt), https://github.com/pret/pokeemerald/blob/master/src/data/region_map/region_map_layout.h. ↩↩↩↩↩↩↩ -
pret,
pokeemerald/src/field_control_avatar.c(une métatuile au comportementMB_REGION_MAPexécuteEventScript_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(l’entrée de menu du PokéNav seulement quandFLAG_SYS_POKENAV_GETest posé) etsrc/region_map.c(la Zone de Combat et l’Île du Sud enMAPSECTYPE_NONEjusqu’à leurs drapeauxFLAG_LANDMARK_*, lignes 1213 à 1216) à731ad5b, consultés le 4 octobre 2026, avec les plans des cartes murales trouvés parscan_wall_maps.pydans le dossier de preuves de l’auteur pour ce billet (sortiewall_maps.txt: l’étage des deux maisons de Bourg-en-Vol et le rez-de-chaussée de chaque Centre Pokémon), https://github.com/pret/pokeemerald/blob/master/data/event_scripts.s. ↩↩↩↩↩↩↩↩ -
pret,
pokeemerald/src/party_menu.c(FIELD_MOVE_FLYcontreFLAG_BADGE06_GET),src/overworld.c(Overworld_MapTypeAllowsTeleportAndFly),src/region_map.c(MAPSECTYPE_CITY_CANFLYquand leFLAG_VISITED_*de la ville est posé) etdata/maps/OldaleTown/scripts.inc(setflag FLAG_VISITED_OLDALE_TOWN) à731ad5b, consultés le 4 octobre 2026, https://github.com/pret/pokeemerald/blob/master/src/region_map.c. ↩↩↩↩↩↩↩↩↩↩ -
Code source de Kiradex,
scripts/forge/town.py, lignes 79 et 80 (MARGIN = 12,WIDTH, HEIGHT = 40, 30) et sa listeBUILDINGS(sept bâtiments, portes versroom:me,room:npc-*ouhall, une arrivée), consulté le 4 octobre 2026 ; dépôt privé. ↩↩↩↩↩↩ -
Martin Korth, GBATEK, cadence LCD (« Total 228 lines, 16.743 ms, 280896 cycles - ca. 59.737 Hz », 228 lignes au total, 16,743 ms, 280 896 cycles, environ 59,737 Hz), enregistré le 4 octobre 2026 sous
gbatek.txt, https://problemkaputt.de/gbatek.htm. ↩↩↩ -
Blake Crosley, « Pixel-Art Motion: Walks, Cameras and Doors on iPhone », blakecrosley.com, 5 octobre 2026, section 7 (« Where the walk stands today » : le modèle image par image du code de marche de Kiradex, dans lequel la course prend 10 images par tuile à 60 hertz, 6,00 tuiles par seconde, et 19 à 120, 6,32, parce que le dépassement de chaque tuile est abandonné ; l’attente de 220 millisecondes à la porte et le changement d’étage sans fondu ; et la marche du cahier des charges à 1 pixel par tick, 16 ticks par tuile à 60 hertz, 3,75 tuiles par seconde, avec le voile par paliers sur les portes et les étages), https://blakecrosley.com/blog/pixel-art-motion-on-iphone. ↩↩↩↩↩
-
Calcul de l’auteur à partir des valeurs mesurées du texte, les chiffres du 5 octobre étant affichés par
arith_oct5.pydans le dossier de preuves de l’auteur pour ce billet (sortiearith_oct5.txt) : cellules par seconde comme 59,7275 ÷ 16 et ÷ 8 ; les 4 tuiles par seconde de Kiradex contre 3,73 (7,2 % plus vite), et sa course contre 7,47 à 6,00 (19,6 % en dessous) et à 6,4 (14,3 % en dessous) ; une durée à 4 tuiles par seconde contre une durée à 3,75 comme 4 ÷ 3,75, un quinzième de plus, et les 23 ticks d’une diagonale à 60 hertz contre √2 ÷ 4 secondes comme 0,3833 ÷ 0,3536 = 1,084, environ un douzième de plus (affiché parr6_arith.py) ; secondes par cellule comme 16 ÷ 59,7275 (0,27) et par tuile de Kiradex comme 1 ÷ 4 (0,25) ; facteurs de chemin comme la marche la plus courte divisée par le grand côté de la route, pour le sens le plus long et pour le retour, sur les neuf routes ayant une marche de raccord à raccord dans chaque sens (une marche droite de la première rangée à la dernière d’une carte de 20 cellules fait 19 pas, 0,95), et les économies comme (aller − retour) ÷ aller, de 2,38 % (Route 3 de Rouge) à 44,12 % (Route 101 d’Émeraude) ; hautes herbes sur cellules praticables par route à partir des décomptes d’herbe et de cellules praticables des deux scripts de routes ; les cases des villes sur la carte d’Émeraude à partir deswidthetheightdes 16 sections de villes dansregion_map_sections.json(dix de 1 sur 1, six de 1 sur 2 ou 2 sur 1, 22 en tout) ; les décomptes de tuiles du Duo interne comme 2853 ÷ 96 et 2007 ÷ 96, 96 valant 16 texels de 6 pixels ; les tuiles devant un collectionneur centré comme la moitié des tuiles visibles le long de l’axe de déplacement ; un échantillon toutes les 100 millisecondes comme une image sur 100 × 60 ÷ 1 000 = 6 à 60 hertz ; le seuil de cadence comme deux images à 60 hertz, 33 millisecondes ; les 5 acres sur 6 d’Animal Crossing, de 16 cases sur 16, comme 80 sur 96 ; les zones du cahier des charges comme 44 × 14 + 24 × 60 + 36 × 20 + 30 × 20 = 3 376 tuiles sur 40 × 30 = 1 200 ; les demi-vues comme les décomptes de tuiles du 3 octobre divisés par deux et arrondis à l’entier supérieur ; les cases de l’écran de carte comme les tuiles de chaque zone divisées par 10, arrondies. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Mesure de l’auteur, 4 octobre 2026 :
measure_grass_paths.pydans le dossier de preuves de l’auteur pour ce billet, sortiegrass_paths.txt: une recherche en largeur 0-1 où entrer dans une cellule de hautes herbes coûte 1 et tout autre déplacement 0, rebords à sens unique, avec les modèles de cellules et les passages accessibles depuis une porte des deux scripts de routes ; Route 1 de Rouge, Route 1 de Rouge Feu, Routes 101 et 102 d’Émeraude. Les cellules du passage viennent deprobe_grass_gateway.py(sortiegrass_gateway.txt), qui relance la recherche vers le sud sur la Route 1 de Rouge en transformant tour à tour chaque cellule d’herbe en sol ordinaire : seules les 8 cellules des quatre dernières rangées du passage, deux par rangée, abaissent le minimum. ↩↩↩↩↩↩ -
pret,
pokered/scripts/Route5Gate.asm(TEXT_ROUTE5GATE_GUARD_GEE_IM_THIRSTY,BIT_GAVE_SAFFRON_GUARDS_DRINK) etpokered/scripts/Route22Gate.asm(BIT_BOULDERBADGE) àd2704a6, consultés le 4 octobre 2026, https://github.com/pret/pokered/blob/master/scripts/Route5Gate.asm. ↩↩↩↩↩ -
pret,
pokered/scripts/Route2Gate.asm,scripts/Route11Gate2F.asm,scripts/Route15Gate2F.asm(seuils de 10, 30 et 50) etengine/events/oaks_aide.asm(CountSetBitssurwPokedexOwned) àd2704a6, consultés le 4 octobre 2026, https://github.com/pret/pokered/blob/master/engine/events/oaks_aide.asm. ↩↩↩↩↩ -
pret,
pokeemerald/src/map_name_popup.cà731ad5b(POPUP_OFFSCREEN_Y 40, le glissement de 2 pixels par image,tOnscreenTimer > 120), consulté le 4 octobre 2026, https://github.com/pret/pokeemerald/blob/master/src/map_name_popup.c. Le total de 190 images est le décompte par l’auteur des états de la tâche d’après leurs seuils ; chaque état peut durer une image de plus ou de moins. ↩↩↩↩↩ -
pret,
pokered/data/maps/town_map_entries.asm(37 entrées extérieures, dont une inutilisée ; 60 intérieures),engine/overworld/toggleable_objects.asm(wTownVisitedFlag, commenté « mark town as visited (for flying) »),engine/items/town_map.asm(la liste de vol saute les villes non visitées) etengine/menus/start_sub_menus.asm(Vol exige le Badge Foudre, bit 2, et une carte extérieure) àd2704a6, consultés le 4 octobre 2026, https://github.com/pret/pokered/blob/master/engine/items/town_map.asm. ↩↩↩↩↩↩↩ -
pret,
pokefirered/src/data/region_map/region_map_layout_kanto.het les trois plans Sevii (22 sur 15 par page, couches extérieure et donjons),src/party_menu.cetinclude/constants/party_menu.h(Vol commeFLAG_BADGE01_GET + fieldMoveavecFIELD_MOVE_FLYégal à 2, le troisième badge),src/region_map.c(GetMapsecTypene renvoieMAPSECTYPE_VISITEDque si le drapeauFLAG_WORLD_MAP_*du lieu est posé, à partir de la ligne 2957 ; Vol n’accepte qu’une case visitée ; les pages Sevii restent masquées jusqu’àFLAG_SYS_SEVII_MAP_123etFLAG_SYS_SEVII_MAP_4567, lignes 1028 et 1556, que posent les scripts du Centre de l’Île 1 ; le Rocher Nombril et l’Île Aurore restent masqués jusqu’à ce queFLAG_WORLD_MAP_NAVEL_ROCK_EXTERIORetFLAG_WORLD_MAP_BIRTH_ISLAND_EXTERIORsoient posés, lignes 1521 à 1524),data/maps/CeladonCity/scripts.inc(setworldmapflag FLAG_WORLD_MAP_CELADON_CITYdans le script de transition),data/maps/PalletTown_RivalsHouse/scripts.inc(la sœur du rival remet la Carte,RECEIVED_TOWN_MAP) etdata/event_scripts.s(EventScript_WallTownMap,special ShowTownMap) à037335f, consultés le 4 octobre 2026, avec des décomptes parmeasure_region_maps.pyet les cartes murales parscan_wall_maps.py(sortiewall_maps.txt: le rez-de-chaussée de chaque Centre Pokémon, l’école de Jadielle et quelques maisons), https://github.com/pret/pokefirered/blob/master/src/data/region_map/region_map_layout_kanto.h. ↩↩↩↩↩↩↩↩↩↩ -
pret,
pokecrystal/data/maps/landmarks.asm(95 repères),data/maps/flypoints.asm(24 points de vol),maps/VioletCity.asm(VioletCityFlypointCallback: setflag ENGINE_FLYPOINT_VIOLET) etengine/events/overworld.asm(ENGINE_STORMBADGE) à5beda23, consultés le 4 octobre 2026, https://github.com/pret/pokecrystal/blob/master/data/maps/flypoints.asm. ↩↩↩↩↩↩↩ -
zladx, LADX-Disassembly au commit
2a5c2c0,src/constants/memory/wram.asm(wOverworldRoomStatus,ds $100) etsrc/constants/gameplay.asm(OW_ROOM_STATUS_VISITED EQU $80et les autres bits d’état), enregistrés le 4 octobre 2026 sousladx-wram.asmetladx-gameplay.asm, https://github.com/zladx/LADX-Disassembly/blob/main/src/constants/gameplay.asm. ↩↩↩ -
Dossier de recherche de l’auteur, « Beyond the plaza: routes, map connections and districts in the canon », 4 octobre 2026, section 4 (« The brief for Kiradex »), la synthèse de l’auteur : les cinq zones et leurs tailles, les cibles de distance, le format des connexions, le plan de raccord, de présence et de brèche dans la clôture, les trouvailles, le gardien de l’arche, l’écran de carte, le tram, l’ordre des travaux, les treize vérifications de recette et les refus. Dépôt Kiradex
docs/research/routes/01-routes.md; privé. La fourchette aller a été resserrée le 5 octobre 2026, des 90 à 120 tuiles du dossier à 110 à 120, pour la raison donnée dans la note 66 ; la copie du dossier porte encore l’ancienne fourchette. Également fixés le 5 octobre, après le dossier et absents de sa copie : le graphe de marche à huit directions partagé par l’app et le serveur, les quatre haies du pré, l’inspection de chaque image de la vérification 6, la liste d’exclusion comme travail à faire, et le report des trouvailles en pièces. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Kiradex,
docs/WORLD.md, « Kiradex World: research and plan », consulté le 4 octobre 2026 (dépôt privé) : section 1 (« The rules for Kiradex World » : rien des leurs dans le monde) ; section 4 (« Levels » : « XP comes only from the real world, which is the point of the app » ; « Coins and the shop » : des pièces gagnées par les scans, les niveaux et les visites quotidiennes ; « The plaza » : des salons d’environ 40 joueurs au plus, répartis par région, la caméra suivant le joueur en restant bornée à la carte) ; section 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 ») ; section 6 (la place de marché via eBay, l’étal) ; section 7 (« Order of work », chaque phase une build TestFlight) ; et les décisions du 2 octobre 2026 (le serveur sur FastAPI et WebSockets). ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Code source de Kiradex, consulté le 5 octobre 2026 (dépôt privé) :
Kiradex/World/TileMap.swift,path(from:to:)à partir de la ligne 325 (huit déplacements ; une diagonale coûteFloat(2).squareRoot()et, ligne 348, est ignorée sauf si les deux tuiles entre lesquelles elle passe sont praticables ; la tuile ouverte la moins coûteuse est développée en premier), etserver/app/rooms.py,Plaza.pathà partir de la ligne 52 (recherche en largeur sur les quatre déplacements de la ligne 66 ; sa docstring : « the same walk the app takes »). ↩↩↩↩↩ -
Dossier de recherche de l’auteur, « Beyond the plaza: routes, map connections and districts in the canon », compilé le 4 octobre 2026, sections « Method » et 5 (« What is measured and what is not ») : les définitions de marche communes (un pas vaut une cellule ; un rebord à sens unique et deux cellules ; un raccord ne compte que là où la cellule d’en face chez le voisin est accessible depuis l’une de ses portes, amorcé depuis d’autres connexions sur un niveau de profondeur pour un voisin sans téléporteur ; dresseurs, PNJ et blocages de scénario ignorés ; pas de Surf ; l’élévation de troisième génération réduite à hauteurs égales ou un côté à 0 ou 15 ; les téléporteurs se déclenchent quand on y entre ; arbres à Coupe, rochers à Éclate-Roc et rochers à Force bloqués sauf mention contraire), les réserves sur les modèles de cellules des générations 1 et 2, la réserve sur la cadence du cartouche, la fréquence d’images, les réserves de classement, les sources secondaires non vérifiées dans les données du jeu, et les lectures qui ne sont pas des faits. Dépôt Kiradex
docs/research/routes/01-routes.md; privé, avec une copie dans les archives de recherche de l’auteur. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
gbdev, Pan Docs, « Rendering » (70 224 points par image, « @ 59.7 fps »), enregistré le 4 octobre 2026 sous
pandocs-timing.txt, https://gbdev.io/pandocs/Rendering.html. ↩ -
pret,
pokeemerald/src/field_control_avatar.c(CheckStandardWildEncounter, lignes 668 à 686 : tant quesWildEncounterImmunitySteps < 4, il compte le pas et revient sans tester ; après unStandardWildEncounterréussi, il remet le compte à 0),src/overworld.c(RestartWildEncounterImmunityStepsdansLoadMapFromCameraTransition, ligne 800, etLoadMapFromWarp, ligne 850),src/battle_setup.c(le même appel au début d’un combat, ligne 370),src/wild_encounter.c(StandardWildEncounter: le saut de 40 % sur un changement de comportement, lignes 531 à 539 et 599 ;WildEncounterCheck, à partir de la ligne 502 : le taux fois 16, ramené à 80 % par le Vélo Course et le Vélo Cross, modulé parApplyFluteEncounterRateModetApplyCleanseTagEncounterRateModet par le talent du Pokémon de tête, puis comparé àRandom() % 2880) etsrc/data/wild_encounters.json(taux terrestre de 20 sur les Routes 101 à 104) à731ad5b, consultés les 4 et 5 octobre 2026, https://github.com/pret/pokeemerald/blob/master/src/field_control_avatar.c. ↩↩ -
pret,
pokefirered/src/wild_encounter.cà037335f, consulté les 4 et 5 octobre 2026 :GetMapBaseEncounterCooldown(8 − rate/10pas, ligne 686) ;HandleWildEncounterCooldown, lignes 707 à 755 (une fois que les pas depuis la dernière rencontre atteignent la recharge, chaque pas peut tenter ; avant cela, chaque pas sur une cellule de rencontre ajoute un au compte et laisse ce seul pas tenter quandRandom() % 100 < 5, sans mettre fin à la recharge) ;TryStandardWildEncounter, lignes 757 à 776 (le compte et le bonus ne reviennent à 0 qu’après le début d’une rencontre) ; la même remise à zéro à chaque chargement de carte, oùsrc/overworld.c(lignes 764 et 799) appelleRestartWildEncounterImmunitySteps, qui dans Rouge Feu appelleResetEncounterRateModifiers(src/field_control_avatar.c, lignes 735 à 737) ; le tirage de 60 % sur un nouveau comportement (ligne 370) ;DoWildEncounterRateTest, ligne 309 (rate × 16plusencounterRateBuff × 16 / 200, surMAX_ENCOUNTER_RATE1 600) ; etAddToWildEncounterRateBuff, ligne 778 (le taux ajouté après chaque tirage raté, sauf si un Repousse est actif), https://github.com/pret/pokefirered/blob/master/src/wild_encounter.c. ↩↩ -
Mesure de l’auteur, 4 octobre 2026, à partir de
measure_gen12_routes.py(Rouge :ROUTE_1àROUTE_25contre les 11 identifiants de carte inférieurs à$0Bdansconstants/map_constants.asm, blocs fois 4 ; Cristal : environnement ROUTE contre TOWN dansdata/maps/maps.asm, tailles tirées deconstants/map_constants.asm) et demeasure_connections.py(Émeraude et Rouge Feu :map_typeavec des tailles tirées delayouts.json; les 11 cartesMAP_TYPE_OCEAN_ROUTEd’Émeraude, 45 600 cellules, exclues du chiffre terrestre ; les routes de Rouge Feu incluent les îles Sevii). Sortiesgen12_routes.txtetconnections.txt. ↩↩↩↩↩↩ -
Mesure de l’auteur, 4 octobre 2026 :
measure_region_maps.pydans le dossier de preuves de l’auteur pour ce billet, sortiesregion_maps.txtetregion_maps.json(Émeraude : 129 cases de route et 22 cases de ville sur la grille de 28 sur 15). ↩↩ -
Bulbapedia, « Kanto Route 1 », section soluce, enregistrée le 4 octobre 2026 sous
bulba-route1.txt, https://bulbapedia.bulbagarden.net/wiki/Kanto_Route_1. Utilisée une seule fois, comme vérification croisée de la recherche du minimum d’herbe. ↩ -
Dossiers de recherche de l’auteur pour le billet sur les structures, dépôt Kiradex
docs/research/structures/01-structures-in-the-canon.md, section 8.8 (« What to refuse » : « No ledges to jump, no climbing, no isometric »), et02-structures-craft-and-engine.md(leGetLedgeJumpDirectiond’Émeraude, qui ne laisse franchir un rebord que dans le sens que désigne son comportement), 3 octobre 2026 ; privés. ↩↩↩↩ -
Blake Crosley, « Pixel-Art Structures: Houses, Halls and Interiors on iPhone », blakecrosley.com, 3 octobre 2026 (section 6 : une seule règle de profondeur et le maillage des objets, les téléporteurs comme données, les étages échangés sur place avec
.id(floor.name); section 7 : les tests serveur surplaza.jsonet la liste de ce que la build ne fait pas, dont « 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) etpokered/macros/scripts/maps.asm(les pointeurs de bande de la macroconnection) àd2704a6, consultés le 4 octobre 2026, https://github.com/pret/pokered/blob/master/macros/scripts/maps.asm. ↩↩↩ -
pret,
pokered/constants/map_data_constants.asm(MAP_BORDER EQU 3) etpokered/home/overworld.asm(CheckMapConnections) àd2704a6, consultés le 4 octobre 2026, https://github.com/pret/pokered/blob/master/constants/map_data_constants.asm. ↩↩ -
pret,
pokered/data/maps/headers/Route22.asmetRoute23.asm(connection north, Route23, ROUTE_23, 0 ; unnecessaryet son inverse) àd2704a6, consultés le 4 octobre 2026, https://github.com/pret/pokered/blob/master/data/maps/headers/Route22.asm. ↩ -
pret,
pokecrystal/data/maps/attributes.asm(connexions) etdata/maps/maps.asm(jeux de tuiles, environnements et groupes de cartes) à5beda23, consultés le 4 octobre 2026, https://github.com/pret/pokecrystal/blob/master/data/maps/attributes.asm. ↩ -
Documentation de Porymap, « Editing Map Connections », enregistrée le 4 octobre 2026 sous
porymap-connections.txt, https://huderlem.github.io/porymap/manual/editing-map-connections.html. ↩↩ -
pret,
pokered/data/maps/objects/Route2Gate.asm(un assistant du Professeur Chen et un gamin) àd2704a6, consulté le 4 octobre 2026, https://github.com/pret/pokered/blob/master/data/maps/objects/Route2Gate.asm. ↩ -
pret,
pokered/scripts/BluesHouse.asm(la sœur du rival remetTOWN_MAPune foisEVENT_GOT_POKEDEXposé, puisEVENT_GOT_TOWN_MAP),engine/items/town_map.asm(DisplayTownMapparcourt chaque entrée deTownMapOrdersans vérification de visite ;wTownVisitedFlagn’est lu que dansBuildFlyLocationsList),data/tilesets/bookshelf_tile_ids.asm(bookshelf_tile HOUSE, $3D, TownMapText, une carte murale qui ouvre le même écran),data/maps/headers/BluesHouse.asm(la maison du rival sur le jeu de tuiles HOUSE ; la maison du joueur surREDS_HOUSE_1etREDS_HOUSE_2),gfx/blocksets/house.bst(la tuile $3D seulement dans le bloc 14) etmaps/BluesHouse.blk(le bloc 14 dans la deuxième position de la rangée du haut) àd2704a6, consultés le 4 octobre 2026, https://github.com/pret/pokered/blob/master/scripts/BluesHouse.asm. ↩↩↩↩↩↩ -
pret,
pokecrystal/maps/CherrygroveCity.asm(le cadeau du guide,setflag ENGINE_MAP_CARD, ligne 72) etengine/pokegear/pokegear.asm(lePOKEGEAR_MAP_CARD_Fde la carte ;PokegearMap_CheckRegionne montre la carte de Kanto que quand le joueur se tient sur un repère de Kanto ; les points de vol de Kanto restent fermés jusqu’à la visite du Plateau Indigo) à5beda23, consultés le 4 octobre 2026, https://github.com/pret/pokecrystal/blob/master/maps/CherrygroveCity.asm. ↩↩↩↩↩ -
Stardew Valley Wiki, « Modding:Maps », enregistrée le 4 octobre 2026 sous
sdv-modding-maps.txt, https://stardewvalleywiki.com/Modding:Maps. ↩↩ -
Stardew Valley Wiki, « Pelican Town », enregistrée le 4 octobre 2026 sous
sdv-pelican-town.txt, https://stardewvalleywiki.com/Pelican_Town. ↩ -
Stardew Valley Wiki, « Bus Stop », enregistrée le 4 octobre 2026 sous
sdv-bus-stop.txt, https://stardewvalleywiki.com/Bus_Stop. ↩ -
Stardew Valley Wiki, « Cindersap Forest », enregistrée le 4 octobre 2026 sous
sdv-cindersap.txt, https://stardewvalleywiki.com/Cindersap_Forest. ↩ -
Stardew Valley Wiki, « Backwoods », enregistrée le 4 octobre 2026 sous
sdv-backwoods.txt, https://stardewvalleywiki.com/Backwoods. ↩ -
Stardew Valley Wiki, l’encadré de navigation des lieux tel qu’il apparaît sur « Railroad », enregistré le 4 octobre 2026 sous
sdv-railroad.txt, https://stardewvalleywiki.com/Railroad ; 26 lieux selon le décompte de l’auteur. ↩ -
Stardew Valley Wiki, « The Mountain » (les deux sorties de départ ; les mines le 5 du printemps ; la voie ferrée après le tremblement de terre du 3 de l’été ; le pont de la carrière contre les lots de la salle d’artisanat ou 25 000 g), enregistrée le 4 octobre 2026 sous
sdv-mountain.txt, https://stardewvalleywiki.com/The_Mountain. ↩↩↩↩ -
Stardew Valley Wiki, « The Desert » (le bus, les lots de la salle des coffres ou 40 000 g), « Secret Woods » (la souche et une hache en acier) et « The Beach » (le pont de 300 bois), enregistrées le 4 octobre 2026 sous
sdv-desert.txt,sdv-secret-woods.txtetsdv-beach.txt, https://stardewvalleywiki.com/The_Desert, https://stardewvalleywiki.com/Secret_Woods et https://stardewvalleywiki.com/The_Beach. ↩↩ -
Stardew Valley Wiki, « Speed », enregistrée le 4 octobre 2026 sous
sdv-speed.txt, https://stardewvalleywiki.com/Speed. La page ne donne pas d’unités. ↩ -
Nookipedia, « Acre » (l’acre de 16 cases sur 16 ; la ville GameCube de cinq acres sur six ; la gare en A-3 ; les libellés ; l’apparition d’un poisson et d’un insecte à l’entrée et leur disparition à six cases ; les tailles de ville des jeux suivants), enregistrée le 4 octobre 2026 sous
nook-acre.txt, https://nookipedia.com/wiki/Acre. ↩↩↩↩↩ -
Nookipedia, « Map », enregistrée le 4 octobre 2026 sous
nook-map.txt, https://nookipedia.com/wiki/Map. ↩ -
Nookipedia, « Train » et « Train station », enregistrées le 4 octobre 2026 sous
nook-train.txtetnook-train-station.txt, https://nookipedia.com/wiki/Train et https://nookipedia.com/wiki/Train_station. ↩ -
zladx, wiki de LADX-Disassembly, « Game engine documentation », enregistrée le 4 octobre 2026 sous
ladx-engine.txt, https://github.com/zladx/LADX-Disassembly/wiki/Game-engine-documentation. ↩↩↩ -
zladx, wiki de LADX-Disassembly, « Maps data format » (la carte extérieure de 512 octets de pointeurs de salle sur deux octets ; la couche de 10 sur 8), enregistrée le 4 octobre 2026 sous
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 octobre 2026 (section 5 : la recette RealityKit, un seul maillage
MeshDescriptorpour la carte, les réglages par défaut de RealityView, le tableau des échelles calculé à partir des pages de spécifications d’Apple et des profils du simulateur de Xcode 27, le minimum de 11 points pour le texte et le texte SwiftUI, le bogue d’animation d’opacité et son voile, la captureXCUIScreendans le bundle ; « Since publishing » : une carte de lettres exportée vers l’app et le serveur ; la FAQ sur le droit d’auteur et les brevets), https://blakecrosley.com/blog/pixel-art-world-on-iphone. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Apple, « iPhone Duo: Technical Specifications », enregistrée le 4 octobre 2026 sous
apple-duo-specs.txt, https://www.apple.com/iphone-duo/specs/. ↩ -
Apple, Human Interface Guidelines, « Designing for games » (via le JSON de la documentation), enregistrée le 4 octobre 2026 sous
hig-games-plain.txt, https://developer.apple.com/design/human-interface-guidelines/designing-for-games. ↩↩ -
Code source de Kiradex,
Kiradex/World/PlazaStage.swift, consulté le 5 octobre 2026 (dépôt privé) : lignes 132 et 133 (sur le téléporteur d’une porte,Task.sleep(for: .milliseconds(220))puisonWarp(warp), sans fondu) et lignes 698 à 700 (un téléporteurfloor:place le nouvel étage sur place, sans fondu). ↩ -
Apple Developer Documentation, « targetTimestamp » (une propriété d’instance de
CADisplayLink, Core Animation ; iOS et iPadOS 10.0 et versions ultérieures), enregistrée le 4 octobre 2026 (le résumé, « The time interval that represents when the next frame displays, », l’intervalle de temps qui représente le moment où la prochaine image s’affiche, et l’exemple qui ajoute le display link à la boucle d’exécution principale), https://developer.apple.com/documentation/quartzcore/cadisplaylink/targettimestamp. ↩↩ -
Code source de Kiradex,
Kiradex/World/Wants.swift(« What the town’s own collectors ask to be shown, and whether the collection has it », ce que les collectionneurs de la ville demandent à voir, et si la collection le possède) etKiradex/World/Quests.swift(les quêtes du jour et de la semaine, « judged from the collection itself », jugées à partir de la collection elle-même), consultés le 4 octobre 2026 ; dépôt privé. ↩↩ -
Mesure de l’auteur, 5 octobre 2026 :
measure_meadow_gate.pydans le dossier de preuves de l’auteur pour ce billet, sortiemeadow_gate.txt. Il assemble la Grand-Place, la promenade des Prés et le Bord du lac du cahier des charges en une seule grille aux tailles de la section 7 : la Grand-Place telle que la livre la forge (town.json, 40 sur 30, l’arrivée en colonne 19, rangée 13, les lettres praticables du serveur), sa clôture nord ouverte le long du bord commun ; la promenade des Prés, 24 sur 60, à 4 tuiles en retrait de l’extrémité ouest de la Grand-Place pour que son allée rejoigne la pelouse entre la halle et la maison à l’est de celle-ci, l’allée de 2 tuiles de large derrière une haie du côté est avec le portillon comme arête à sens unique à son extrémité côté lac, le reste traversé par quatre haies, aux rangées 12, 24, 36 et 48 du pré, avec des ouvertures de 2 tuiles essayées à chaque position ; le Bord du lac, 36 sur 20, centré sur la promenade, sa moitié nord étant le lac, le ponton de 2 tuiles de large dans l’alignement de l’allée et mesuré jusqu’à sa tuile côté terre. Il marche sur le graphe de l’app (TileMap.path) : huit directions, une diagonale coûtant √2 et refusée quand l’une des deux tuiles entre lesquelles elle passe est bloquée ; le portillon refuse tout pas de l’allée vers le lac et n’admet un pas venant du lac qu’en ligne droite. La sinuosité est la marche la plus courte propre au pré, de son bord sud à son bord nord, à l’ouest de l’allée. Deux haies, aux rangées 20 et 40 du pré, le font serpenter sur 59,00 à 66,46 tuiles sur l’ensemble des 400 positions, trois (rangées 15, 30 et 45) sur 59,00 à 79,77 (6 sur 8 000 entre 78 et 90), quatre sur 59,00 à 95,43 (5 912 sur 160 000 entre 78 et 90) ; ces bornes valent pour des haies régulièrement espacées, et des espacements irréguliers font serpenter davantage selon la même fonction (r7_uneven_probe.py, 5 octobre, sortier7_uneven_probe.txt: deux haies aux rangées 0 et 2 atteignent 77,00, trois aux rangées 20, 22 et 24 atteignent 95,00). Le même balayage avec trois haies, aux rangées 15, 30 et 45 du pré (ajouté à la section 5 du script le 5 octobre après le sixième tour du contrôle) : les 6 agencements donnent un retour de 88,07 tuiles et un aller de 114,05 à 120,44, rapport de 0,731 à 0,772, tous à 0,8 ou moins, et 5 d’entre eux sont dans la fourchette de 110 à 120, aller de 114,05 à 119,02, rapport de 0,740 à 0,772. Trois haies respectent donc toutes les cibles dans 5 positions ; quatre, le choix de l’auteur, dans 4 111. Sur ces 5 912 agencements à quatre haies : retour de 88,07 tuiles, aller de 108,74 à 133,75, rapport de 0,658 à 0,810, 5 886 à 0,8 ou moins ; la cible de 0,8 exige 88,07 ÷ 0,8 = 110,09 à l’aller ; dans la fourchette de 110 à 120, 4 111 agencements, aller de 110,15 à 119,95, rapport de 0,734 à 0,800, tous à 0,8 ou moins. De l’arrivée au bord nord, il y a 17,07 tuiles ; avec le portillon ouvert dans les deux sens, les marches sont égales (88,07 dans chaque sens sur un agencement par nombre de haies). Sur chaque décalage de 0 à 16 tuiles et les deux positions de ponton, l’aller le plus court fait 107,18 et le retour le plus court 88,07 ; à 4 tuiles par seconde, 110 et 120 tuiles font 27,5 et 30 secondes. La même sortie se vérifie par rapport au modèle précédent : exécutée depuis sa copie enregistrée, la recherche en largeur à quatre directions avec deux haies garde 125 agencements, aller de 113 à 119, retour de 91, rapport de 0,765 à 0,805, et ces 125 agencements parcourus en huit directions donnent un aller de 97,18 à 99,67, un retour de 88,07, un rapport de 0,884 à 0,906, aucun à 0,8. Ce modèle précédent comptait la sinuosité comme les pas dans le pré du plus court chemin que renvoyait sa recherche, ce que les égalités peuvent changer ; la sinuosité d’un bord à l’autre ne le peut pas. Placements que le cahier des charges ne décrit pas, balayés dans la même sortie : avec le ponton au milieu de la rive, le meilleur rapport est de 0,721 (décalage 4, 2 182 agencements sur 5 912 à 0,8 ou moins), et là où l’allée rejoint un bâtiment, le portillon n’économise rien. ↩↩↩↩ -
Apple Developer Documentation, « preferredFrameRateRange » (une propriété d’instance de
CADisplayLink, Core Animation ; iOS et iPadOS 15.0 et versions ultérieures), enregistrée le 4 octobre 2026 (la Discussion : le display link fait de son mieux pour rappeler dans la plage, le système tient aussi compte du matériel, des autres tâches, du mode économie d’énergie, de l’état thermique et des réglages d’accessibilité, et par défaut la plage est égale à la fréquence de rafraîchissement maximale de l’écran), https://developer.apple.com/documentation/quartzcore/cadisplaylink/preferredframeraterange. ↩↩