← Tous les articles

Des pièces en pixel art : grilles de meubles, plafonds et notation

Dans Pokémon Version Émeraude, une pièce décorée, ce sont seize objets sur une grille de cellules de 16 pixels. Le code source décompilé plafonne la base d’un joueur à 16 décorations posées et la chambre à 12, et garde jusqu’à 20 bases dans la sauvegarde, la vôtre et celles d’autres joueurs.12 Le catalogue compte 120 décorations en huit catégories : 35 poupées, 23 ornements, 18 tapis, 10 posters, 10 coussins, 9 bureaux, 9 chaises et 6 plantes. 71 d’entre elles occupent une seule cellule, la moyenne est de 2,43 cellules, et 18 sont des surfaces qui accueillent les petites.23 Une base mesure de 44 à 81 cellules praticables, 60,2 en moyenne, si bien que le plafond représente environ un quart du sol. Le placement est une question à laquelle chaque cellule couverte répond, et rien dans la fonction de placement ne vérifie qu’un chemin subsiste.24 Chaque jeu plus récent de cet article reprend ce modèle avec un autre budget : 150 objets par pièce dans Animal Crossing: New Horizons, selon Nookipedia, avec une lettre du dimanche qui note la pièce ; de 150 à 600 en intérieur dans Final Fantasy XIV depuis le Patch 7.5, selon le type de logement ; 99 dans un igloo de Club Penguin, selon une seule source de fans.5678 Mon app, Kiradex, a des pièces que sa forge graphique meuble à partir d’un vocabulaire de 23 meubles, dont aucun ne peut être déplacé par le joueur. Cet article mesure le canon, énonce les règles avec leurs chiffres, les transpose vers SwiftData et SwiftUI, et se termine par le cahier des charges d’un système d’aménagement que Kiradex n’a pas encore construit : un plafond de 16 par étage, une règle de chemin que la fonction de placement d’Émeraude n’a pas, une note hebdomadaire dont chaque point est détaillé, et un catalogue qui ne se débloque qu’en jouant.910

En bref

  • Seize est un budget de composition, pas une limite de stockage. Émeraude place 16 décorations dans une base et 12 dans la chambre, mais réserve de la place pour 150 décorations possédées dans huit casiers par catégorie : le joueur peut donc posséder plus que ce qui tient. Chaque décoration posée coûte deux octets, un identifiant et une position avec x et y en quartets, ce qui fait tenir l’agencement complet d’une base dans 32 octets.111122
  • Les règles vivent dans le sol. Émeraude a cinq permissions de placement (sol, sol franchissable, derrière, mur, et sur une surface). Les cellules supérieures d’un bureau portent un comportement qui laisse une petite décoration s’y tenir : une fois le bureau posé, une poupée peut y aller. 18 décorations accueillent de petits objets et 14 de grands. La chambre n’accepte que les poupées et les coussins.1324
  • Les plafonds montent avec la plateforme, et l’un d’eux est aussi un budget d’images. Animal Crossing autorise 24 objets par pièce dans Wild World, 64 dans City Folk, 48 dans New Leaf et 150 dans New Horizons, selon Nookipedia. Final Fantasy XIV a relevé de moitié ses limites intérieures au Patch 7.5, à 150 jusqu’à 600, et les notes de version ajoutent qu’au-delà de 400 meubles à l’écran, ceux d’un autre étage cessent d’être dessinés.57
  • Une note a des sources détaillées, un jour fixe et une barre qui monte avec la maison. Le tableau de Nookipedia pour l’académie d’évaluation des maisons (Happy Home Academy) accorde 1 000 points à chacun des seuils de 6, 10, 15 et 20 objets dans une pièce, plus des bonus de série, d’ensemble, de catégorie, de couleur et de feng shui, et relève le seuil du rang S de 15 000 à 90 000 à mesure que la maison s’agrandit. La page ne cite aucune source pour ces chiffres de New Horizons.6
  • Les catalogues grandissent par l’achat, par le jeu, ou par les deux. Dans Émeraude, 90 des 120 décorations se vendent contre de l’argent, 24 ne sont jamais vendues (lots, points de combat et cadeaux), et deux autres coûtent 6 000 et 8 000 de cendre ramassée pas à pas. Stardew vend un stock quotidien aléatoire ; après le premier agrandissement de la maison, Robin vend aussi le catalogue de meubles (Furniture Catalogue) pour 200 000g, qui vend ensuite les meubles qu’il répertorie pour 0g en quantité illimitée, tandis que certains meubles ne s’obtiennent encore qu’au musée, lors des festivals et par d’autres sources. Habbo vend des meubles, dont certains sont rares ou aléatoires à dessein.14151617
  • Les visiteurs regardent et ne touchent pas. Un visiteur d’Animal Crossing peut utiliser les meubles de la maison d’un autre joueur, mais ne peut pas « modify the interior in any way » (modifier l’intérieur de quelque manière que ce soit). Les visiteurs de Habbo ne peuvent ni poser ni déplacer de meubles sans les droits du propriétaire. Club Penguin autorise un like par création et par jour, et son total général (Grand Total) « will never decrease » (ne diminuera jamais), selon une copie de fans de ses pages d’aide.51819
  • Ce que cela donne à Kiradex. Un cahier des charges, pas une fonctionnalité livrée : un placement par cellule pour 20 des 23 meubles de la forge ; une règle de chemin de la porte à l’escalier, à la place de l’hôte et à une cellule avant de chaque groupe d’exposition, vérifiée par un parcours ; 16 meubles par étage, les pièces de départ étant livrées avec 8 ; six papiers peints et six sols dessinés par la forge ; une lettre du dimanche sur laquelle chaque source de points est imprimée (23 600 au plus) ; un catalogue débloqué en jouant, à partir des niveaux et des pins disponibles aujourd’hui, dérivé de la collection synchronisée, des tampons de quête que l’app enregistre sur l’appareil et de trois nouveaux compteurs synchronisés pour les pas, les visites de pièces et le palier de maison de la lettre ; des visites en lecture seule dès que le serveur saura stocker un agencement ; un modèle SwiftData sans contrainte d’unicité, parce que la synchronisation CloudKit ne peut pas en imposer ; et un placement par glisser-déposer que VoiceOver peut effectuer sans toucher l’écran.9202122

1. Émeraude : seize objets sur une grille, mesurés à la source

La plus petite version complète de ce genre est le système de décoration de Pokémon Rubis, Saphir et Émeraude, et presque tout y est donnée. Je l’ai lu dans la décompilation d’Émeraude par pret au commit 731ad5b (commité le 1er octobre 2026), avec deux scripts qui analysent la source sans jamais lancer le jeu : l’un pour le catalogue, les plafonds, les surfaces porteuses et la taille des pièces, l’autre pour la provenance de chaque décoration. Leurs sorties sont enregistrées à côté d’eux.214 Chaque chiffre de cette section provient de ces deux sorties ou du fichier source qu’une note nomme.

Les plafonds

Trois constantes fixent les limites. DECOR_MAX_SECRET_BASE vaut 16, DECOR_MAX_PLAYERS_HOUSE vaut 12 et SECRET_BASES_COUNT vaut 20, le nombre de bases que garde la sauvegarde : la vôtre et celles reçues d’autres joueurs.12 Le plafond de ce que l’on pose est distinct du plafond de ce que l’on possède. La sauvegarde conserve 150 décorations possédées dans des casiers par catégorie : 10 bureaux, 10 chaises, 10 plantes, 30 ornements, 30 tapis, 10 posters, 40 poupées et 10 coussins.112 Le joueur peut donc posséder plus qu’une pièce ne peut contenir (une nouvelle partie commence avec tous les casiers vides), et choisir ce qui y entre, c’est le jeu.23

Une décoration posée coûte deux octets. Une base stocke decorations[16], un identifiant chacune, et decorationPositions[16], un octet chacune, avec x dans le quartet haut et y dans le bas ; une base est donc adressée comme une grille d’au plus 16 par 16 cellules, et l’agencement complet d’une base tient dans 32 octets.1112 J’y vois la raison pour laquelle la sauvegarde peut contenir vingt bases, la vôtre et celles d’autres joueurs.

Le catalogue

gDecorations[] compte 121 entrées. L’entrée 0, DECOR_NONE, est un emplacement vide qui réutilise les données du petit bureau, ce qui laisse 120 décorations aux identifiants 1 à 120.32 Par catégorie : 35 poupées, 23 ornements, 18 tapis, 10 posters, 10 coussins, 9 bureaux, 9 chaises et 6 plantes.2 Par forme, en cellules : 71 en 1 par 1, 22 en 1 par 2, 13 en 3 par 3, 5 en 2 par 1, 4 en 2 par 2, 3 en 3 par 2, et une chacune en 2 par 4 et en 4 par 2. L’en-tête déclare aussi 3 par 1 et 1 par 3, qu’aucune décoration n’utilise. Une décoration couvre de 1 à 9 cellules, 2,43 en moyenne.213 Si l’on compte l’emplacement vide comme une décoration, ainsi que le faisaient mes notes antérieures pour l’article sur les structures, on obtient 72 décorations d’une cellule et 19 de sol plein ; sans lui, 71 et 18.2

Un diagramme en barres horizontales empilées des 120 décorations d'Émeraude par catégorie, chaque barre divisée selon le nombre de cellules de 16 pixels que couvre une décoration : poupées 35 (25 d'une cellule, 10 de deux) ; ornements 23 (9 d'une, 9 de deux, 1 de quatre à six, 4 de huit ou neuf) ; tapis 18 (11 d'une, 7 de huit ou neuf) ; posters 10 (5 et 5) ; coussins 10, tous d'une cellule ; bureaux 9 (2 d'une, 3 de quatre à six, 4 de huit ou neuf) ; chaises 9, toutes d'une cellule ; plantes 6 (3 de deux, 3 de quatre à six).

L’essentiel du catalogue d’Émeraude tient en une cellule ; les grandes décorations sont les bureaux, les tapis de 3 par 3 et quelques ornements.243

Dans le tableau, les prix vont de 500 pour les tapis les moins chers à 10 000 pour les ornements et poupées les plus coûteux. Trois ont un prix de 0, deux boucliers et un ornement en verre, et tous trois sont des lots.23

Cinq permissions, et des surfaces qui sont des données

Chaque décoration porte l’une de cinq permissions. L’en-tête les nomme « collision and placement permissions, in that order » (permissions de collision et de placement, dans cet ordre).13 Par nombre :

Permission Ce qu’elle signifie Décorations
Sol plein bloque le passage, se pose au sol 18 : les 9 bureaux, 9 ornements
Sol franchissable se franchit, se pose au sol 37 : les 18 tapis, les 9 chaises, 10 ornements
Sol arrière bloque, et sa rangée du haut peut s’appuyer sur le mur du fond 10 : les 6 plantes, 4 ornements
Mur s’accroche au mur du fond 10 : les 10 posters
Sprite une figurine qui se tient sur une surface 45 : les 35 poupées, les 10 coussins

Décomptes de measure_emerald_decor.py sur src/data/decoration/header.h.2

Le plus astucieux, c’est qu’une surface est une propriété de cellule, pas un morceau de code. Chaque décoration est dessinée à partir de métatiles, et chaque métatile porte un octet de comportement. Dix-huit décorations portent des cellules au comportement MB_HOLDS_SMALL_DECORATION : 7 des 9 bureaux, 3 briques, un pneu et 7 tapis. Quatorze portent MB_HOLDS_LARGE_DECORATION : les mêmes 7 bureaux et 7 tapis.2 Une poupée de 1 par 2 a besoin d’une cellule « grande » sous elle ; toute autre poupée ou tout coussin prend une cellule « petite » ou « grande ».4 Une fois un bureau posé, le sol a donc de nouvelles cellules qui répondent « oui » à une poupée, et la même fonction de placement gère les deux cas. Voilà comment 16 objets donnent l’impression d’une pièce pleine : 45 des 120, les sprites, se tiennent sur 18 décorations-surfaces.2

Certaines décorations agissent aussi. Huit tapis musicaux jouent une note quand on marche dessus ; un tapis de saut, un tapis tournant et un tapis scintillant font ce que leur nom annonce ; trois ballons et une boule de boue éclatent ; il y a encore une porte cassable, un toboggan et un ornement de sable. Chacun est un comportement porté par les métatiles de la décoration (MB_SECRET_BASE_SOUND_MAT, _JUMP_MAT, _SPIN_MAT, _GLITTER_MAT, _BALLOON, _BREAKABLE_DOOR, MB_SLIDE_SOUTH, _SAND_ORNAMENT), lu dans le fichier d’attributs du tileset de la Base Secrète.225

Le placement est une question à laquelle chaque cellule répond

CanPlaceDecoration, dans src/decoration.c, parcourt les cellules que couvrirait la décoration tenue et pose une question à chacune. Les décorations de sol et de sol franchissable exigent un sol simple (MB_NORMAL) sous chaque cellule ; seule la planche pleine peut couvrir un trou. Aucun objet ne doit se tenir sur la cellule. La décoration ne peut couvrir la cellule où se trouvait le joueur à l’ouverture du menu qu’avec une tuile de type de calque normal ; la fonction la refuse à cet endroit quand sa propre tuile sur cette cellule a un autre type de calque. Une décoration de sol arrière exige du sol sous tout sauf sa rangée du haut, qui peut reposer sur le mur nord. Une décoration murale exige que chaque cellule soit du mur nord. Un sprite exige une cellule porteuse en dessous.4 Dans la chambre, le menu refuse toutes les catégories sauf les poupées et les coussins : DecorationItemsMenuAction_AttemptPlace affiche gText_CantPlaceInRoom quand isPlayerRoom est activé.4

Rien dans CanPlaceDecoration ne vérifie qu’un chemin subsiste. La seule protection que la fonction accorde au parcours est cette règle conditionnelle sur la cellule où l’on se tenait. Selon ma lecture de cette fonction, un joueur peut emmurer l’ordinateur de la base avec des bureaux, et le jeu le laissera faire.4 J’y reviens dans le cahier des charges, car une pièce que d’autres visitent a besoin de la vérification que cette fonction ne fait pas.

Les pièces auxquelles le plafond se mesure

Les 24 agencements de base sont six styles en quatre tailles chacun. Mesurés murs compris à partir de chaque map.bin, ils font de 7 à 17 cellules de large et de 7 à 17 de profondeur, de 99 cellules (11 par 9) à 196 (14 par 14), les plus longs et étroits mesurant 7 par 16, 10 par 17 et 17 par 8.226 Les cellules praticables, lues dans les bits de collision de chaque agencement, vont de 44 à 81, 60,2 en moyenne.2 Le plafond de 16 représente 0,27 du sol praticable d’une base moyenne.2 La chambre, au premier étage des deux maisons de joueur, mesure 9 par 8 avec 54 cellules praticables, et son plafond est de 12.21

Le sol seul surestime l’encombrement, car beaucoup des 16 sont des tapis que l’on franchit ou des poupées posées sur des bureaux. Le plafond budgète la composition, pas le sol.

La cellule face au personnage

La planche de marche du joueur mesure 144 par 32 pixels, neuf images de 16 par 32 : l’image du personnage fait donc une cellule de large et deux de haut sur la grille de métatiles de 16 pixels. La pose de décoration est une seule image de 16 par 32.27 La cellule de la grille correspond à la largeur de l’image, et chaque décoration est dimensionnée dans cette unité.

Comment le catalogue grandit

Le script de provenance a cherché chaque constante de décoration dans les scripts de boutique, de lots et de cadeaux. 90 des 120 se vendent contre de l’argent dans cinq boutiques. Trois sont des échanges au comptoir des lots, quinze s’échangent contre des points de combat, et dix sont offertes par un script : de nouveau les trois objets du comptoir, deux tentes pour avoir résolu une maison à énigmes, un ornement de l’étage d’un musée, deux boucliers donnés par l’hôte de l’installation de combat et deux poupées offertes par des habitants. Vingt-quatre se gagnent et ne se vendent jamais contre de l’argent.14

Deux autres s’achètent en marchant. Un atelier de verrerie échange une chaise contre 6 000 et un bureau contre 8 000 de cendre, et la cendre se ramasse à raison d’une unité par pas dans l’herbe couverte de cendres tant que le joueur porte le sac, jusqu’à 9 999 (VAR_ASH_GATHER_COUNT).15 Je lis cette paire comme la version la plus pure, dans le canon, du déblocage par le jeu : aucun argent ne change de mains, seulement des pas. Le sac n’affiche aucun compteur. Son usage sur le terrain est la fonction des objets inutilisables, et sa description est un texte fixe sur le ramassage et la conservation de cendres volcaniques.28 En dehors du compteur de pas lui-même, seul le script de l’atelier lit ce nombre : quand le joueur n’en a pas assez, il soustrait la cendre ramassée du prix et lui annonce la différence en nombre de pas qu’il reste à faire.15

Quatre décorations, trois poupées légendaires et une autre poupée, ne sont référencées par aucun script de boutique, de lot ou de cadeau couvert par la recherche. Elles arrivent peut-être par échange ou par une fonction de connexion ; je ne les ai pas suivies, et les décomptes de 90 vendues et de 24 uniquement gagnées reposent sur une recherche dans les scripts de boutique, de lots et de cadeaux, ces quatre-là restant non tracées.14

Ce qu’enseigne Émeraude

Un système de décoration, ce sont trois tables et une fonction : une ligne de catalogue par décoration (permission, forme, catégorie, prix, métatiles), un agencement dont les cellules disent ce qu’elles sont (sol, mur nord, trou), un inventaire possédé plus grand que le plafond de pose, et une vérification de placement qui pose une question à chaque cellule couverte. Les surfaces sont des cellules qui répondent « oui » à une décoration plus petite. Le plafond compte les décorations posées et rien d’autre. La faille, c’est le parcours : la fonction de placement vérifie des cellules, jamais des chemins.

2. Animal Crossing : 150 objets et une lettre le dimanche

Cette section repose sur Nookipedia, un wiki de fans, lu et enregistré le 5 octobre 2026 ; je n’ai pas cherché les chiffres de Nintendo. Là où le wiki ne cite rien, je le dis.56

Le plafond et les pièces

Chaque jeu de la série plafonne les objets d’une pièce, et ce plafond a grandi. Nookipedia donne 24 « furniture and clothing items » (meubles et vêtements) par pièce dans Wild World, 64 dans City Folk et 48 dans New Leaf. Pour New Horizons : « A maximum of 150 items can be placed in each room of the house, including wall and ceiling-mounted furniture. » (Chaque pièce de la maison peut accueillir au plus 150 objets, meubles muraux et de plafond compris.)5

Les pièces de New Horizons, d’après le tableau d’agrandissements de la même page : la tente fait 4 par 4 ; la maison 6 par 6 ; l’agrandissement de la pièce principale la porte à 8 par 8 ; les pièces arrière, gauche et droite font 6 par 6 chacune ; l’étage et le sous-sol 10 par 6. « Unlike previous games, only the main room can be expanded in size, as all other rooms have a fixed size. » (Contrairement aux jeux précédents, seule la pièce principale peut être agrandie, toutes les autres ayant une taille fixe.)5 À 150 objets dans une pièce de 6 par 6, on obtient 4,2 objets par tuile de sol, ce qui ne fonctionne que parce que les murs, les plafonds et le dessus des autres meubles accueillent des objets sans consommer de sol (mon calcul à partir des deux chiffres).529

Les meubles ont « a size in tiles that it takes up when placed, ranging from 1.0×0.5 » (une taille en tuiles une fois posés, à partir de 1.0×0.5) jusqu’à 3 par 3, et dans New Horizons ils « can also now be pushed in half-tile increments » (peuvent désormais aussi être poussés par demi-tuile).29 New Horizons les range en mobilier, objets divers posés au sol ou sur une surface, meubles muraux et décor de plafond, arrivé avec la version 2.0.29 Parmi les jeux dont cet article lit la grille de placement (les cellules d’Émeraude, les tuiles de Stardew et celles de New Horizons), seul New Horizons déplace les meubles de moins d’une tuile entière. Je n’ai pas lu la grille de placement de FFXIV, et les pas plus fins cités pour Habbo sont des hauteurs d’empilement tirées d’un client tiers (section 3).

Le catalogue

Selon la version 3.0.2, Nookipedia compte 2 076 meubles dans New Horizons, dont 1 074 ajoutés par des mises à jour. Une série, c’est « around 10 furniture items, as well as a matching wallpaper and flooring » (une dizaine de meubles, plus un papier peint et un sol assortis).29 Le wiki compte 262 papiers peints selon la version 1.9.0 et 215 sols.3031 Papier peint et sol se changent pièce par pièce, et la version 2.0 a ajouté un mur d’accent : « a second wall covering can be applied to single wall in the room » (un second revêtement peut être appliqué à un seul mur de la pièce).5

L’académie d’évaluation des maisons

La moitié notation est la partie que Kiradex emprunte. Nookipedia : l’académie « sends an evaluation by mail most Sunday mornings, which cannot be disabled » (envoie une évaluation par courrier la plupart des dimanches matin, et on ne peut pas la désactiver). Le rang est B, A ou S, et le seuil du rang S monte à chaque agrandissement : 15 000 pour la première maison, 23 000 après l’agrandissement de la pièce principale, puis 35 000, 47 000, 60 000, 75 000, et 90 000 avec le sous-sol.6

Les bonus de New Horizons tels que le wiki les présente :

Critère Points
6, 10, 15 et 20 meubles dans une pièce 1 000 à chaque seuil
Objets porte-bonheur 777 par objet
Meubles muraux 400 par objet, trois au plus
4 objets ou plus d’une même série 1 000 par objet
Un ensemble de meubles complet 800 par objet
3 objets ou plus d’une même catégorie 500 par objet
70 % ou plus des objets d’une pièce d’une même couleur 200 par objet
90 % ou plus d’une même couleur 600 par objet
Feng shui rouge, vert ou jaune 500
Cafards moins 2 500 chacun
Objets non mobiliers au sol moins 1 chacun
Déchets au sol moins 500 chacun
Objets orientés face à un mur moins 300 chacun

Nookipedia, « Happy Home Academy », les tableaux de New Horizons, enregistrés le 5 octobre 2026 ; sans source sur la page.6

Ces chiffres sont les moins sûrs de cette section. Les tableaux de bonus et de pénalités ne citent rien. Le tableau des récompenses qui les suit indique qu’il « Includes data sourced from the Data Spreadsheet for Animal Crossing New Horizons » (inclut des données tirées de la feuille de données d’Animal Crossing New Horizons), compilée par des contributeurs nommés, et la section sur les points par objet de New Horizons indique « This section is a stub » (cette section est une ébauche).6 L’arithmétique est donc une reconstitution de fans. Le cahier des charges final emprunte sa forme (sources détaillées, seuils de quantité, bonus d’ensemble et de couleur, jour fixe) et aucun de ses chiffres.

Deux choix y comptent pour toute app qui veut une note hebdomadaire de pièce. La barre monte avec la maison, si bien qu’une pièce plus grande ne rend pas le rang le plus haut plus facile. Et la lettre arrive un jour fixe, la plupart des dimanches matin, sans que le joueur puisse la désactiver.6 L’absence n’y est pas gratuite : la page sur la maison indique qu’un joueur qui néglige sa maison « for at least one week » (pendant au moins une semaine) la trouve infestée de cafards, et le tableau ci-dessus retire 2 500 points par cafard.56 Le cahier des charges garde le jour fixe et abandonne la pénalité.

Les visites

Dans chaque jeu de la série, selon le wiki, « a player may enter any other player’s house freely » (un joueur peut entrer librement dans la maison de n’importe quel autre joueur). Il peut utiliser les meubles, mais ne peut ni déposer ni ramasser d’objets « or modify the interior in any way » (ni modifier l’intérieur de quelque manière que ce soit).5 Une visite de rêve sur une autre île atteint le même but par un autre chemin. Sur la page du wiki consacrée au personnage qui gère les rêves, la section New Leaf indique que dans un rêve « any changes will not be saved and items cannot be brought back to the real world » (aucune modification ne sera enregistrée et les objets ne peuvent pas être rapportés dans le monde réel), et la section New Horizons que ses services « work the same as they do in New Leaf » (fonctionnent comme dans New Leaf). Publier un rêve rapporte à l’hôte un Dream Bell Exchange Ticket d’une valeur de 5 000 clochettes, puis un autre à chaque mise à jour.32 Selon ma lecture, c’est la forme de visite la plus sûre de cet article pour une app destinée aux enfants : le visiteur parcourt une copie et ne peut rien changer de ce qui est conservé, et l’hôte est récompensé de partager.

3. Habbo, Stardew, Final Fantasy XIV, Club Penguin, et d’où vient le modèle

Habbo : la pièce est le produit, et le produit se vend

Le centre d’aide de Habbo énonce sans détour les règles de propriété et de visite. « You can own 200 rooms. » (Vous pouvez posséder 200 pièces.)33 Sols et murs sont définitifs une fois posés : « Wallpaper and flooring are stuck down - so once you put them down, they can’t be picked back up. You can put new wallpaper or floor down if you wish to change the look of your room. » (Le papier peint et le sol sont collés : une fois posés, on ne peut plus les reprendre. Vous pouvez poser un nouveau papier peint ou un nouveau sol si vous voulez changer l’aspect de votre pièce.)33 Les visiteurs ne peuvent pas toucher : « You can’t drop or manipulate furni in other Habbo’s rooms unless you’re a member of a group, and the owner of that group has enabled you to participate in the building of that room. » (Vous ne pouvez ni poser ni manipuler de meubles dans les pièces d’autres Habbos, sauf si vous êtes membre d’un groupe dont le propriétaire vous a permis de participer à la construction de cette pièce.)18

L’économie du mobilier repose sur l’achat. « To buy furni you need credits, diamonds or duckets. » (Pour acheter des meubles, il vous faut des crédits, des diamants ou des duckets.)18 Le Builders Club prête des meubles jusqu’à une limite qui augmente de 250 à chaque mois d’abonnement, permet d’enregistrer des agencements de pièce personnalisés dans l’éditeur de plan, et promet : « Furni limits never go down. » (Les limites de meubles ne baissent jamais.)34 La page des définitions de meubles décrit des meubles de campagne retenus « for 4-12 months in order to leave an ample window for traders to build their businesses around them » (pendant 4 à 12 mois, afin de laisser aux marchands le temps de bâtir leur commerce autour), des raretés qui « will never be re-released » (ne seront jamais rééditées), des raretés à casser que l’on achète puis que l’on casse « to reveal another, random rare furni » (pour révéler un autre meuble rare, aléatoire), et les LTD, « a special type of rare, which comes in limited quantities » (un type particulier de rareté, en quantité limitée).17 L’échange exige un pass d’échange, et « There is no guide to what items of furni are worth » (il n’existe aucun guide de la valeur des meubles).35 Habbo limite même le hasard dans les pièces : « Placing more than three chance elements will disable all randomiser functions in the room. » (Placer plus de trois éléments de hasard désactive toutes les fonctions aléatoires de la pièce.)36

Les pages de Habbo elles-mêmes ne donnent ni la grille, ni les hauteurs d’empilement, ni une limite de meubles par pièce ; la recherche de « furni », « stack » et « floor plan » dans le centre d’aide n’a renvoyé aucun article qui le fasse.37 Les chiffres qui circulent viennent de Nitro, un client tiers open source. Les constantes de son éditeur de plan autorisent jusqu’à 64 tuiles par axe et un schéma de hauteur à 27 niveaux, comme l’article sur les structures de cette série l’a cité à partir du même fichier ; mes notes antérieures ajoutent, tiré de ce client, un outil de hauteur d’empilement de 0 à 40 par pas de 0,01, que je n’ai pas relu pour cet article.3839 Ces trois chiffres sont à considérer comme ceux du client, pas ceux de Sulake.

Selon ma lecture, Habbo montre ce que devient la boucle d’aménagement quand le catalogue est le modèle économique. Sa règle de visite est celle à copier ; son économie (rareté voulue, contenus aléatoires, valeur d’échange) celle à refuser.

Stardew Valley : un catalogue acheté une fois, puis des meubles gratuits

La page Furniture du Stardew Valley Wiki, révision 193159, liste 718 lignes d’objets réparties en 26 sections, soit 615 noms distincts. Ce sont mes décomptes des lignes de la page ; la section Movie Posters utilise un autre balisage et a été ignorée, et « distinct » fusionne un objet listé dans deux sections.4016 La page Wallpaper, révision 193801, montre 137 papiers peints (123 dans le catalogue, 12 hors catalogue, 2 impossibles à obtenir), et la page Flooring, révision 190285, 97 sols, tous comptés à partir des icônes des pages, pas des fichiers de données du jeu.404142

Le catalogue grandit de deux façons à la fois. Robin et la charrette ambulante « offer a random selection of furniture each day they are open » (proposent une sélection aléatoire de meubles chaque jour d’ouverture). « After the first Farmhouse upgrade, Robin also offers the Furniture Catalogue for sale » (Après le premier agrandissement de la ferme, Robin propose aussi à la vente le catalogue de meubles), à 200 000g dans le tableau des catalogues de la page, et une fois posé, il vend les meubles qu’il répertorie pour 0g « in unlimited quantity » (en quantité illimitée). 278 lignes de la page Furniture citent le catalogue de meubles comme source.1640 Les exceptions de la page restent des exceptions : « Some furniture can be obtained only by donating items to the Museum » (certains meubles ne s’obtiennent qu’en faisant des dons au musée), ou lors des festivals, au casino et par d’autres sources.16 Une étape franchie en jouant et un gros achat dans la monnaie du jeu mettent donc fin à la rareté pour ce que le catalogue répertorie, et seulement pour cela.

Le retour sur le placement se fait tuile par tuile : « Furniture will display a green square on tiles where it can be placed. The tile will turn red if the furniture cannot be placed. » (Le meuble affiche un carré vert sur les tuiles où il peut être placé ; la tuile devient rouge s’il ne peut pas l’être.)16 Le papier peint, c’est un geste pour une surface : les papiers peints « cover the whole room they’re placed in » (couvrent toute la pièce où ils sont posés), et pour en poser un, « the character must be facing up by its wall » (le personnage doit se tenir face au mur, tourné vers le haut) ; ils sont « single-use and do not stack » (à usage unique et non empilables).41 La ferme mesure 10 par 7 à l’intérieur avant agrandissement, sur des tuiles de 16 pixels, comme l’article sur les structures l’a cité d’après le wiki.39

Final Fantasy XIV : un plafond qui est aussi un budget d’images

Les notes du Patch 7.5 publiées par Square Enix sur le Lodestone ont relevé toutes les limites de logement. Les meubles d’intérieur sont passés de 100 à 150 pour les appartements et les chambres privées, de 200 à 300 pour les maisonnettes, de 300 à 450 pour les maisons et de 400 à 600 pour les villas ; ceux d’extérieur de 20 à 40, de 30 à 60 et de 40 à 80.7 Les mêmes notes en donnent la raison dans leurs propres termes : « Please note that up to 400 furnishings can be displayed on-screen at once. If more than 400 furnishings are on-screen simultaneously, those on a different floor to your character will stop being displayed, with small, more distant furnishings being hidden first. » (Au plus 400 meubles peuvent s’afficher à l’écran en même temps ; au-delà, ceux situés à un autre étage que votre personnage cessent d’être affichés, les plus petits et les plus éloignés étant masqués en premier.)7 Un plafond est à la fois un budget de conception et un budget de rendu.

Les notes ajoutent aussi « Furnishings from the FFXIV Furnishing Design Contest » (des meubles issus du concours de design de mobilier de FFXIV) : un concours communautaire dont les créations gagnantes sont devenues des meubles dans ce patch.7 C’est la forme sûre d’un concours : les joueurs créent, le studio juge et publie.

La taille des terrains ne figure pas dans cet article. Le guide du logement de Square Enix a renvoyé une erreur HTTP 404 le 5 octobre 2026, et je n’ai essayé aucune autre page officielle : FFXIV apporte donc les limites d’objets des notes du Lodestone, et rien d’autre.7

Club Penguin : un like par jour et un total qui ne baisse jamais

Chaque fait sur Club Penguin cité ici ne repose que sur une source. Les billets de blog officiels archivés que cite le Club Penguin Wiki ont renvoyé HTTP 429 depuis la Wayback Machine, deux fois, le 5 octobre 2026 ; je n’ai donc pas pu les vérifier.43

That Penguin Game reproduit ce qu’il présente comme les pages d’aide du jeu ; je n’ai pas vérifié cette provenance. Sa page « Your Igloo » : « You can Like any igloo design once every day! » (Vous pouvez liker chaque création d’igloo une fois par jour !) Chaque création « earns its own individual Likes » (récolte ses propres likes), qui s’additionnent dans le total général (Grand Total), et « Likes are permanent, so your Grand Total Likes will never decrease, even if you delete an igloo design! » (Les likes sont permanents : votre total général ne diminuera jamais, même si vous supprimez une création d’igloo !) L’onglet Popular classe les igloos selon leur total général de likes, et un igloo s’ouvre à « Everyone » (tout le monde) ou seulement aux « Friends » (amis).19

Le Club Penguin Wiki indique que « igloos have a limit preventing more than 99 units of furniture being placed at once » (les igloos ont une limite qui empêche de placer plus de 99 meubles à la fois), que la plupart des meubles ont une limite de possession de 99 par type, et qu’un propriétaire peut décorer son propre igloo « but not other player’s igloos » (mais pas celui des autres joueurs).8 La décoration était un avantage d’abonné : à partir du 1er novembre 2005, les joueurs sans abonnement pouvaient avoir un igloo mais pas le meubler, et à partir du 26 juillet 2012, ils ont reçu 6 meubles gratuits, un objet de sol, quatre objets ordinaires et un objet mural.438

L’histoire des concours d’igloos selon le wiki : le premier a été annoncé dans le numéro 9 du journal du jeu, paru le 15 décembre 2005, avec un gagnant récompensé de 5 000 pièces. Les concours suivants annonçaient leurs gagnants et leurs finalistes une à quatre semaines après l’appel, toujours avec des pièces et parfois des meubles. À partir du concours d’Halloween 2008, des personnages du jeu désignaient les gagnants et leurs commentaires paraissaient avec les igloos ; à partir de 2009, un bouton sur l’igloo permettait de le soumettre ; le dernier concours a eu lieu en décembre 2012. Un exemple : le Ye Olde Igloo Contest de 2008 a versé 25 000 pièces à chacun de ses dix gagnants et 15 000 à chacun de ses vingt finalistes.44

Les Sims : les personnages étaient là pour noter la maison

Le modèle grille-et-catalogue a une histoire d’origine, et c’est une histoire de notation. Ma source est une seule interview : Will Wright avec Tristan Donovan, publiée par Game Developer le 23 mai 2011. Je n’ai trouvé aucune conférence enregistrée de Wright datant de 1999 ou 2000 sur le mode construction.45

Sur l’inspiration : « one of the original things that was a really inspiration for The Sims was this book, A Pattern Language, by Christopher Alexander. » (l’une des vraies inspirations d’origine de The Sims, c’est ce livre, A Pattern Language, de Christopher Alexander.) Sur la notation : « In some sense I wanted The Sims originally to be an architecture game where it was analyzing these patterns. So the people in The Sims originally were just there to score the architecture. » (D’une certaine manière, je voulais à l’origine que The Sims soit un jeu d’architecture qui analyse ces motifs ; les personnages de The Sims n’étaient là, au départ, que pour noter l’architecture.) Sur le nom : « my original name for it was Doll House. We did some test marketing and found out that the name didn’t go very well with males. » (mon nom d’origine, c’était Doll House ; des tests marketing nous ont appris que ce nom ne plaisait guère aux hommes.) Sur les objets : « Everything we put in the world is advertising » (tout ce que nous mettons dans le monde est de la publicité), un modèle qu’il fait remonter aux pistes de phéromones de SimAnt.45

Le Sims Wiki, un wiki de fans et une source unique, décrit l’écran tel qu’il a été livré. Le mode achat permet aux joueurs de « purchase items from an object catalog and place them on the current lot » (acheter des objets dans un catalogue et les placer sur le terrain actuel) ; The Sims et The Sims 2 classaient ce catalogue par fonction d’objet ; et l’emprise de l’objet tenu s’affiche en vert là où il peut aller et en rouge là où il ne le peut pas. Le wiki rattache cette phrase sur le vert et le rouge à The Sims 2 et The Sims 3 ; je ne l’attribue donc pas à l’original de 2000.46 La notation est restée dans les Sims sous forme de besoin, Room dans le premier jeu et Environment dans le second, qui « analyzes the design and content of the room that the Sim is currently standing in » (analyse la conception et le contenu de la pièce où se trouve le Sim) : les petites pièces, le manque de lumière et les objets sales ou cassés le font baisser.47

Selon ma lecture, chaque jeu de cet article est cet écran unique avec un autre budget : un catalogue, une grille à la taille d’un pas humain, une emprise qui vire au vert ou au rouge, et un juge.

Les plafonds côte à côte

Un diagramme en barres horizontales intitulé « Limites d'objets posés », chaque barre étiquetée selon ce que compte sa limite et colorée selon sa source : la limite de placement intérieur de Final Fantasy XIV par type de logement, d'après les notes du Patch 7.5 sur le Lodestone (villa 600, auparavant 400 ; maison 450, auparavant 300 ; maisonnette 300, auparavant 200 ; appartement ou chambre privée 150, auparavant 100) ; Animal Crossing par pièce, d'après Nookipedia (New Horizons 150, City Folk 64, New Leaf 48, Wild World 24) ; Club Penguin par igloo, 99, d'après un seul wiki de fans ; Émeraude d'après le code décompilé (une base 16, la chambre 12) ; et les 16 par étage proposés pour Kiradex.

Les limites s’étendent de un à cinquante, de la chambre d’Émeraude à une villa de FFXIV, mais elles ne comptent pas la même chose : celle de FFXIV est une limite de placement intérieur donnée par type de logement, celle d’Animal Crossing vaut par pièce, celle de Club Penguin par igloo, celle d’Émeraude par base ou par chambre, et celle de Kiradex par étage. Seuls les chiffres de FFXIV et d’Émeraude proviennent du texte ou du code de l’éditeur lui-même.247581

4. Le métier, en règles chiffrées

Voici les règles que les mesures étayent, chacune avec la fourchette sur laquelle elle repose. Quand un chiffre relève de mon calcul ou de mon choix, la ligne le dit. « Cellule » désigne la cellule de marche de 16 pixels, qui est aussi la tuile de Kiradex.227

Élément Règle Source
Plafond de pose Plafonner ce qu’une pièce montre, par pièce, objets muraux compris. Émeraude 16 par base, 12 dans la chambre ; New Horizons 150 par pièce « including wall and ceiling-mounted furniture » (meubles muraux et de plafond compris) ; FFXIV de 150 à 600 en intérieur selon la taille du logement ; Club Penguin 99 (une seule source de fans)
Plafond de possession Laisser le joueur posséder plus que ce qui tient, pour que poser soit choisir. Émeraude 150 possédées en huit casiers contre 16 posées ; Club Penguin 99 de chaque type possédés (source de fans)
Plafond face au sol Dans une pièce 2D sans couche murale ni plafond, rester sous un objet pour trois cellules de sol (mon seuil, choisi pour qu’Émeraude se situe juste en dessous) ; surfaces et meubles franchissables l’étirent. Émeraude 16 contre une moyenne de 60,2 cellules praticables, 0,27 ; New Horizons 150 dans une pièce de 6 par 6, soit 4,2 par tuile, possible seulement grâce aux murs, au plafond et aux surfaces (mon calcul)
Surfaces Faire du fait de porter un petit objet une propriété de cellule, pour qu’un bureau ajoute du sol pour une poupée. Émeraude : 18 décorations portent de petits objets, 14 de grands, et 45 décorations sprites en ont besoin
Cellule de grille Dimensionner la grille sur la largeur de l’image ou de la cellule du personnage ; n’aller plus fin que si les meubles peuvent être décalés et que le graphisme le permet. Image du joueur d’Émeraude de 1 par 2 cellules de 16 pixels ; Stardew tuiles de 16 pixels ; New Horizons demi-tuiles
Vérification de placement Poser une question à chaque cellule couverte (sol, mur, surface ; vide ; ni sur la cellule d’arrivée ni sur celle de l’hôte) et afficher la réponse cellule par cellule. CanPlaceDecoration d’Émeraude pour les questions par cellule, même s’il ne refuse la cellule de départ du joueur que pour une tuile au type de calque non normal ; les cellules d’arrivée et d’hôte sont la règle de Kiradex (7.1) ; Stardew carré vert ou rouge par tuile ; The Sims 2 et 3 emprise verte ou rouge (wiki de fans)
Chemin Vérifier qu’un parcours survit à chaque placement (l’ajout du cahier des charges). CanPlaceDecoration d’Émeraude ne vérifie aucun chemin et ne protège la cellule où se tenait le joueur que d’une tuile au type de calque non normal ; les pages Stardew et Sims lues ici décrivent un retour par tuile et ne disent rien, dans un sens ou dans l’autre, des chemins ; le cahier des charges ajoute le parcours
Papier peint et sol Un par pièce, changé d’un geste, réversible. Stardew couvre « the whole room » (toute la pièce) depuis le mur ; New Horizons par pièce plus un mur d’accent ; ceux de Habbo sont définitifs, remplaçables seulement
Taille du catalogue Assez grand pour qu’un style soit un choix. Stardew 137 papiers peints et 97 sols (mes décomptes d’icônes du wiki) ; New Horizons 262 et 215 ; New Horizons 2 076 meubles selon la 3.0.2
Note Détailler les sources, fixer le jour, relever la barre avec la maison, ne jamais punir l’absence. Académie d’évaluation des maisons : la plupart des dimanches ; B, A, S ; S de 15 000 à 90 000 ; 1 000 à 6, 10, 15 et 20 objets ; série, ensemble, catégorie, couleur (tableaux de fans, sans source) ; la page du wiki sur la maison, qui ne nomme aucun jeu, dit qu’une maison négligée au moins une semaine se remplit de cafards, et le tableau HHA de New Horizons retire 2 500 par cafard, une pénalité que cette règle refuse
Croissance du catalogue Pour une app 9+, grandir par le jeu : une étagère gagnée plus un catalogue qui s’ouvre à une étape. Jamais par une vente aléatoire ou rare. Émeraude 90 des 120 vendues, 24 jamais vendues, deux autres contre 6 000 et 8 000 de cendre ; Stardew stock quotidien aléatoire, puis après le premier agrandissement un catalogue à 200 000g dont les meubles répertoriés coûtent 0g, avec des exclusivités du musée, des festivals et d’autres sources en dehors ; les raretés, meubles à casser et LTD de Habbo comme contre-exemple
Visites Les visiteurs regardent et ne touchent pas ; une marque par visiteur et par jour ; le total de l’hôte ne baisse jamais. Les visiteurs d’Animal Crossing ne peuvent pas « modify the interior in any way » (modifier l’intérieur de quelque manière que ce soit) ; ceux de Habbo ne peuvent ni poser ni déplacer de meubles sans droits ; Club Penguin un like par création et par jour, total général qui ne diminue jamais (une seule source de fans)
Stockage Un objet posé tient en quelques octets : type, cellule, orientation. Émeraude : un octet d’identifiant et un octet de position, 32 octets par base

Sources : sections 1 à 3 et leurs notes.256781916414033181746141511

Trois d’entre elles méritent chacune une phrase.

Le plafond est un budget pour l’œil, et parfois pour le GPU. Les 16 d’Émeraude représentent environ un quart du sol d’une base. FFXIV dit en toutes lettres qu’au-delà de 400 meubles à l’écran, il cesse d’en dessiner certains.27 Pour une app sur téléphone, la seconde raison est réelle, mais selon ma lecture c’est la première qui fixe le chiffre : un plafond est ce qui transforme une étagère en composition, et c’est la raison que l’article sur les mondes du 3 octobre donnait pour choisir seize.10

La règle de chemin est l’ajout du cahier des charges. CanPlaceDecoration d’Émeraude protège au plus une cellule, celle où l’on se tenait à l’ouverture du menu, et ne demande jamais si la porte atteint encore l’ordinateur.4 Les pages Stardew et Sims que j’ai lues décrivent une emprise colorée tuile par tuile ; elles ne disent pas si l’un ou l’autre jeu vérifie aussi un chemin, et je n’ai pas cherché plus loin, si bien que cet article n’affirme rien à leur sujet, dans un sens ou dans l’autre.1646 Une pièce que d’autres visitent a besoin d’une réponse à cette question, car un visiteur qui ne peut pas atteindre l’exposition n’a rien à regarder.

Le déblocage par le jeu est l’issue défendable de la question du catalogue pour une app destinée aux enfants. C’est ma lecture, pas un avis juridique : une boucle de décoration achetée, aléatoire ou rare s’expose à des questions de loot box et de pression dont une app de collection n’a pas besoin. L’étagère gagnée d’Émeraude montre une boucle de pièce qui n’a besoin de rien de tout cela, et le catalogue de Stardew, acheté une fois dans la monnaie du jeu après une étape franchie en jouant, montre comment mettre fin à la rareté pour tout ce qu’il répertorie.141617

5. La méthode Apple : un modèle qui se synchronise, un glissement qui s’aimante, une grille utilisable avec VoiceOver

Un écran d’aménagement sur iOS a besoin de trois choses : un enregistrement par meuble posé qui se synchronise via iCloud, un moyen de faire glisser un meuble sur une cellule, et un moyen de faire la même chose sans la vue ni le toucher. Tout ce qui suit provient des pages de documentation d’Apple enregistrées en JSON le 5 octobre 2026, dont un script a extrait titres, déclarations, résumés et plateformes.48 Rien n’a été construit ni exécuté pour cet article, et aucun coût ci-dessous n’est mesuré.

L’enregistrement : SwiftData, façonné pour CloudKit

@Model « Converts a Swift class into a stored model that’s managed by SwiftData » (convertit une classe Swift en modèle stocké géré par SwiftData), disponible depuis iOS 17.0.49 SwiftData peut imposer l’unicité avec #Unique, qui « Specifies the key-paths that SwiftData uses to enforce the uniqueness of model instances » (indique les key-paths que SwiftData utilise pour imposer l’unicité des instances de modèle), depuis iOS 18.0.50 Un meuble posé semble en être un usage naturel : un meuble par cellule.

La synchronisation CloudKit l’exclut. Le guide d’Apple sur la synchronisation de SwiftData indique que le framework « does include a small number of features that CloudKit doesn’t support natively, such as unique constraints and nonoptional relationships » (comporte quelques fonctionnalités que CloudKit ne prend pas en charge nativement, comme les contraintes d’unicité et les relations non optionnelles), et que « CloudKit requires all relationships to be optional. » (CloudKit exige que toutes les relations soient optionnelles.)22 Les modèles de Kiradex ont déjà cette forme. Le commentaire de CardCopy dit « every property has a default and nothing is unique, for CloudKit » (chaque propriété a une valeur par défaut et rien n’est unique, pour CloudKit), et PriceHistory est « Shaped for CloudKit like CollectionEntry: defaults everywhere, nothing unique » (façonné pour CloudKit comme CollectionEntry : des valeurs par défaut partout, rien d’unique), avec une fusion qui choisit le même gagnant sur chaque appareil quand deux appareils créent le même historique.5152

L’unicité qui compte, un meuble par cellule, doit donc être imposée dans le code : une fonction pure qui s’exécute à chaque lecture, résout partout vers le même gagnant les meubles de deux appareils sur une même cellule, et renvoie le perdant dans la réserve. Une cellule n’est pas la seule chose que deux appareils peuvent casser ensemble. Deux modifications qui passent chacune toutes les règles sur leur propre téléphone peuvent échouer ensemble : la fonction doit donc reconstruire la pièce en la faisant passer par la vérification de placement complète, pas seulement par le test de chevauchement. Le cahier des charges de la section 7 la spécifie.

Le glissement : draggable, une destination de dépôt et la cellule sous le doigt

draggable(_:) « Activates this view as the source of a drag and drop operation » (active cette vue comme source d’une opération de glisser-déposer) pour une charge Transferable, depuis iOS 16.0.53 dropDestination(for:action:isTargeted:) reçoit les éléments déposés et un CGPoint, que sa page décrit comme « the drop location in this view’s coordinate space » (l’emplacement du dépôt dans l’espace de coordonnées de cette vue), également depuis iOS 16.0.54 Associer ce point à une cellule relève de l’arithmétique : soustraire l’origine de la carte et diviser par la taille de la tuile en points.

Une découverte que mes notes antérieures n’avaient pas. La page enregistrée de dropDestination(for:action:isTargeted:) indique iOS 27.2 comme la version qui la rend obsolète, avec le message « Use dropDestination(for:isEnabled:action:) with an action that takes a DropSession parameter instead. » (Utilisez plutôt la variante dont l’action reçoit un paramètre DropSession.)54 L’action de la variante de remplacement reçoit une DropSession, « A description of a drop that is in progress » (la description d’un dépôt en cours), au lieu d’un point.54 Je n’ai pas enregistré la page de DropSession ; on ignore donc si elle porte un emplacement dans l’espace de coordonnées de la vue, et le cahier des charges nomme les deux formes.

Pour déplacer un meuble déjà dans la pièce, DragGesture est « A dragging motion that invokes an action as the drag-event sequence changes » (un mouvement de glissement qui déclenche une action à mesure que la séquence d’événements évolue, iOS 13.0), et SpatialTapGesture est « A gesture that recognizes one or more taps and reports their location » (un geste qui reconnaît un ou plusieurs touchers et en indique l’emplacement, iOS 16.0) : toucher pour sélectionner un meuble, glisser pour le déplacer cellule par cellule.5556

Que le point de dépôt corresponde proprement aux cellules de tuile sous la caméra de Kiradex n’a pas été testé. La pièce est dessinée par RealityKit avec un nombre entier de pixels d’appareil par texel, et la surcouche SwiftUI qui reçoit le dépôt se trouve au-dessus ; l’arithmétique est celle que fait déjà l’ajustement de la caméra, mais personne n’y a encore rien déposé.10

La grille sans toucher : VoiceOver

Une grille de meubles se prête mal au balayage élément par élément ; la conception donne donc à VoiceOver ses propres verbes :

  • accessibilityElement(children:) « Creates a new accessibility element, or modifies the AccessibilityChildBehavior of the existing accessibility element » (crée un nouvel élément d’accessibilité ou modifie le comportement des enfants de l’élément existant, iOS 13.0), si bien qu’un meuble de plusieurs cellules forme un seul élément, et non six.57
  • accessibilityAction(named:_:) ajoute une action nommée ; « Actions allow assistive technologies, such as the VoiceOver, to interact with the view by invoking the action » (les actions permettent aux technologies d’assistance comme VoiceOver d’interagir avec la vue en déclenchant l’action, iOS 16.0). Déplacer à gauche, Déplacer à droite, Déplacer vers le haut, Déplacer vers le bas, Tourner et Ranger sont chacune une action.58
  • accessibilityAdjustableAction(_:) traite le balayage vers le haut et vers le bas comme une AccessibilityAdjustmentDirection (iOS 13.0), ce qui convient pour faire défiler un papier peint ou un sol.59
  • accessibilityRotor(_:entries:) crée « an Accessibility Rotor with the specified user-visible label » (un rotor d’accessibilité avec le libellé visible indiqué, iOS 16.0), pour qu’un rotor « Mobilier » saute d’un meuble à l’autre dans la pièce.60
  • AccessibilityNotification.Announcement est « A notification that an app posts when it needs to convey an announcement to an assistive app » (une notification qu’une app publie quand elle doit transmettre une annonce à une app d’assistance, iOS 17.0) : chaque déplacement refusé est énoncé, avec sa raison.61

Un test d’interface peut ensuite auditer l’écran avec XCUIApplication.performAccessibilityAudit(for:_:), indiqué pour iOS 17.0 ; la page enregistrée ne comporte aucun résumé et indique Xcode 16.3 pour ce chemin de module.62 Un audit, c’est tout ce qu’il fait. Dans les en-têtes XCUIAutomation installés avec Xcode 27.0, l’audit « Runs an accessibility audit on the current view » (exécute un audit d’accessibilité de la vue courante). Les mêmes en-têtes ajoutent XCUIVoiceOverService, depuis iOS 27.0, qui « Provides programmatic control of VoiceOver for UI testing » (offre un contrôle programmatique de VoiceOver pour les tests d’interface) : il active et désactive VoiceOver, déplace le focus vers l’avant, vers l’arrière, dans et hors des conteneurs, et renvoie ce que VoiceOver prononce pour l’élément ciblé. Une recherche dans tous les en-têtes du framework ne trouve aucun appel qui exécute une action personnalisée nommée, fasse tourner un rotor ou lise une annonce : un test d’interface ne peut donc pas appuyer sur Déplacer à gauche ou Ranger comme le fait un utilisateur de VoiceOver.63 Le cahier des charges teste directement les gestionnaires de ces actions, vérifie les libellés prononcés avec le service VoiceOver, et laisse les actions, le rotor et les annonces à une personne qui utilise VoiceOver.

Ce que cela coûte

Non mesuré. Une maison meublée compte au plus 16 petits enregistrements sur chacun de ses deux étages. Si les meubles posés rejoignent le maillage d’objets unique que le moteur construit déjà pour les meubles de la forge, une modification implique de reconstruire ce maillage ; rien de tout cela n’a été profilé sur un téléphone.39

6. L’étude de cas : les intérieurs de Kiradex aujourd’hui

Kiradex est une app de collection de cartes pour iPhone, dotée d’une petite ville en pixels, Kiradex World, où chaque collectionneur a une maison à deux étages et où la ville possède un hall d’exposition. Tout ce qui figure dans cette section a été lu dans le dépôt de l’app le 5 octobre 2026, jamais exécuté ni modifié : les intérieurs ont été analysés par un script, la documentation et les modèles lus comme du texte.964

Ce qui a changé depuis l’article sur les structures

L’article sur les structures du 3 octobre disait que interiors.py dessine la pièce, l’étage du dessus et le hall « each 14 by 11, with a two-row wall band » (chacun de 14 par 11, avec un bandeau mural de deux rangées).39 C’était vrai au moment de l’écriture. Le même jour, la build TestFlight 26 a apporté le kit d’intérieur : « Rooms sixteen wide with a three-row wall band (cornice, face, wainscot) » (des pièces de seize de large avec un bandeau mural de trois rangées : corniche, parement, lambris), des meubles sur un rythme de 32 pixels, les meubles adossés au mur dessinés dans le décor au sol et les meubles indépendants comme des objets derrière lesquels le collectionneur passe.65 Aujourd’hui, la forge dessine room et room-up en 16 par 12 cellules et le hall en 16 par 13, chacun avec un bandeau de trois rangées : corniche, parement et lambris.964 La build 26 se situe entre la build 23 que décrit l’article sur les structures et la build 35 que décrit son addendum du soir ; les deux textes sont donc justes pour leur build respective.3965

Les meubles de la forge

scripts/forge/interiors.py nomme 23 meubles dans sa table PIECES, chacun avec une largeur et une hauteur en cellules et un indicateur précisant s’il est indépendant.9

Type Meubles et emprises (cellules, l par h)
Adossés au mur, dessinés dans le sol (9) bibliothèque 5 par 2 ; armoire 2 par 2 ; comptoir, évier et cuisinière 1 par 1 chacun ; cheminée 2 par 2 ; escalier et escalier descendant 2 par 3 chacun ; pilier 1 par 3
Indépendants, exportés comme objets avec lesquels le collectionneur est trié en profondeur (14) lit et lit à roses 2 par 3 chacun ; table de chevet 1 par 1 ; table 2 par 2 ; chaise en quatre orientations, 1 par 1 chacune ; canapé 3 par 2 ; banc 2 par 1 ; plante 1 par 2 ; coffre, caisse et tonneau 1 par 1 chacun

Analysé depuis PIECES par measure_kiradex_interiors.py ; le fichier n’est jamais importé ni exécuté.9

Un meuble couvre de 1 à 10 cellules, 3,04 en moyenne, contre 1 à 9 et 2,43 pour Émeraude.92 Les dessins distincts sont moins nombreux que les noms : les quatre chaises sont un seul dessin en quatre orientations, les deux lits deux variantes, les deux escaliers deux directions, et le comptoir, l’évier et la cuisinière un seul comptoir en trois versions.9

La docstring du fichier et sa table se contredisent. La docstring pose la convention « furniture on the 16-pixel grid in a 32-pixel rhythm, every piece at least two tiles on one axis » (des meubles sur la grille de 16 pixels selon un rythme de 32 pixels, chaque meuble faisant au moins deux tuiles sur un axe).64 Dans la table, 11 des 23 font 1 par 1 : les quatre chaises, le comptoir, l’évier, la cuisinière, la table de chevet, le coffre, la caisse et le tonneau.9 Le rythme vaut pour les grands meubles, pas pour les petits. C’est un écart entre un commentaire et le code d’un même fichier, scripts/forge/interiors.py, et le cahier des charges garde les petits meubles, car une pièce faite uniquement de meubles de deux tuiles n’aurait pas de chaises.

Le parement mural a son propre vocabulaire, en lettres : un tableau p, une horloge k, une fenêtre N, une fenêtre à rideaux K, une bannière n, une applique l, et W là où se trouve le tableau mural. Les sols sont le parquet o, le carrelage t, le marbre s, et un tapis r qui se dessine en neuf parties à partir de ses voisins. Il existe deux styles de mur, le plâtre et colombage de la maison et la pierre taillée du hall, choisis par intérieur via FACES.64

Les pièces telles qu’elles sont conçues

Carte Taille Cellules de sol Meubles (mobiles) Sol sous les meubles Sol libre Emplacements que l’app garnit
room 16 par 12 125 14 (13) 25 100 étagère 5 cellules, vitrine 2, bureau 2 ; arrivée, escalier, hôte
room-up 16 par 12 125 12 (11) 27 98 tableau mural 3 cellules, bureau 2 ; arrivée à l’escalier
hall 16 par 13 144 6 (4) 8 128 après 8 socles 8 socles

Mobiles exclut les escaliers et les piliers. D’après measure_kiradex_interiors.py.9

L’emplacement host est commenté dans le fichier comme « where the owner stands when you visit » (là où se tient le propriétaire quand vous lui rendez visite).64 Le check() de la forge refuse déjà un emplacement d’étagère, de vitrine, de bureau ou de socle sur la mauvaise lettre, une téléportation qui n’est pas sur une porte ou un escalier, une cellule d’arrivée, d’escalier ou d’hôte non praticable, et deux objets exportés sur une même cellule. Ses limites plus étroites comptent pour le cahier des charges. Il n’a aucune vérification de lettre pour les emplacements du tableau mural, et sa boucle de chevauchement ne lit que les objets exportés, c’est-à-dire les meubles indépendants : un meuble adossé au mur dessiné dans le sol n’y figure donc jamais. Il ne vérifie pas que la porte atteint chaque emplacement.64

La règle de chemin, appliquée aux pièces d’aujourd’hui

J’ai écrit un script qui reconstruit les lettres exportées comme le fait export() et parcourt dans les quatre directions, depuis l’arrivée de chaque étage, les lettres praticables de la forge, otsrUD.20 Sur les agencements actuels, le parcours atteint l’escalier et l’hôte en bas, et l’escalier en haut. Les cellules situées juste devant les emplacements d’exposition sont une autre histoire :

  • En bas, les cinq cellules avant de l’étagère : deux sont sous le tonneau et la caisse, trois sont atteintes.
  • Les deux cellules avant de la vitrine sont toutes deux atteintes.
  • Les deux cellules avant du bureau : l’une est sous la chaise tirée devant lui, l’autre est atteinte.
  • En haut, le bureau est dans le même cas, une sur deux.
  • En haut, les trois cellules avant du tableau mural sont sous le lit et la table de chevet. Aucune n’est atteinte.20

Une règle exigeant que la cellule avant de chaque emplacement soit accessible ferait donc échouer quatre des groupes garnis de la forge sur les deux étages (l’étagère et le bureau en bas, le bureau et le tableau mural en haut), soit sept cellules avant bloquées en tout, et une règle exigeant que chaque groupe garni ait une cellule avant accessible fait échouer un seul groupe : le tableau mural de l’étage. Le cahier des charges retient la forme par groupe et corrige le tableau lors du réagencement des pièces de départ.

Le script a aussi essayé des meubles supplémentaires dans room. Un meuble indépendant supplémentaire a 733 placements qui passent les règles de cellule ; 44 d’entre eux coupent l’accès à une cible, et chacun le fait en couvrant la cellule cible elle-même. Deux meubles supplémentaires, chacun à l’écart de toutes les cibles et sans chevauchement, forment 229 891 paires, et 713 d’entre elles coupent l’accès à une cible sans la couvrir : un lit en (9,3) et une table de chevet en (6,4), par exemple, ferment le recoin devant la vitrine.20 Ces 713 sont ce qu’une vérification par cellule laisse passer et qu’un parcours attrape. Ce sont aussi ce que deux téléphones peuvent construire à eux deux : chaque meuble seul laisse toutes les cibles accessibles et passe donc le parcours sur son propre appareil, et la paire n’échoue qu’une fois les deux synchronisés (7.7).66 Je n’ai pas poussé la recherche au-delà de deux meubles supplémentaires ; à seize, le nombre d’agencements qu’une vérification par cellule accepterait et qu’un parcours refuserait n’est pas mesuré.

Le collectionneur face à la grille

La cellule de sprite du collectionneur mesure 32 par 40 pixels, avec 7 pixels au-dessus de la figure et 2 en dessous ; la figure mesure donc environ 31 pixels de haut, et la cellule fait 2 tuiles de large et 2,5 de haut, contre l’image de 1 par 2 d’Émeraude. WORLD.md la décrit comme « a 30-pixel figure in a 32 × 40 cell » (une figure de 30 pixels dans une cellule de 32 × 40).2767 La largeur de la figure elle-même n’a pas été mesurée. J’y vois la raison pour laquelle la forge dessine ses meubles selon un rythme de 32 pixels sur une grille de 16 : la cellule du collectionneur fait deux tuiles de large.

Ce que les pièces ne font pas

La liste honnête de l’article sur les structures vaut toujours pour la maison : « Rooms have no wallpaper or floor choice and no placeable furniture; the house is dressed from the collection and nothing else. » (Les pièces n’offrent aucun choix de papier peint ni de sol, et aucun meuble à placer ; la maison est garnie par la collection et rien d’autre.)39 L’app garnit les emplacements nommés à partir de la collection (classeurs sur l’étagère, cartes dans la vitrine, rubans et pins sur le tableau, cartes sur les socles du hall), et la forge place chaque meuble.6439

Le serveur ne peut pas encore conserver une pièce. Son module rooms dit : « Everything here is in memory; a room empties when its last collector leaves and nothing of them is kept. » (Tout ici est en mémoire ; une pièce se vide quand son dernier collectionneur part, et rien d’eux n’est conservé.)68 Une visite chez un autre collectionneur est donc aujourd’hui la visite d’une carte, et des visites en lecture seule de l’aménagement réel d’un collectionneur exigent un serveur capable de stocker un agencement.

Où les règles de la pièce sont écrites

L’article sur les mondes du 3 octobre a publié les règles de pièce : « a furnishing cap of sixteen » (un plafond d’aménagement de seize) ; « visits are read-only, a like is once a day, and the room’s total never decreases » (les visites sont en lecture seule, un like se donne une fois par jour, et le total de la pièce ne décroît jamais) ; et « A report arrives every Sunday grading the room, with its point sources listed » (un bulletin arrive chaque dimanche pour noter la pièce, avec ses sources de points détaillées).10 Ces règles ne figurent pas dans le document de conception de l’app. La section 4 de docs/WORLD.md énumère la boutique payable en pièces de monnaie (« clothes, hats, backpacks, card-display frames and emotes », vêtements, chapeaux, sacs à dos, cadres d’exposition de cartes et emotes) et des cosmétiques verrouillés par niveau « that cannot be bought » (qu’on ne peut pas acheter), et ne dit rien des meubles, des plafonds, des likes ou d’un bulletin du dimanche.67 Les règles vivent dans la note de recherche docs/research/pixel-art/06-collecting-and-hubs.md, section 5.3, qui demande aussi que la lettre soit « a pixel object that appears on the doormat » (un objet en pixels qui apparaît sur le paillasson), qu’il y ait « a stamp on their passport per room visited, with ranks at 30 / 100 / 500 » (un tampon dans le passeport par pièce visitée, avec des rangs à 30 / 100 / 500), et, en section 5.7, que les objets de mécène ne soient « never a bigger furnishing cap » (jamais un plafond d’aménagement plus élevé).69 Cet article considère ces règles comme décidées, puisque l’article sur les mondes les a publiées, et le premier point d’intendance du cahier des charges consiste à les reporter dans WORLD.md. Le même paragraphe de l’article sur les mondes dit aussi « Patron flair stays on the name-plate and the room skin » (les attributs de mécène restent sur la plaque de nom et l’habillage de la pièce).10 Le cahier des charges ne considère pas l’habillage de pièce comme décidé : il le rouvre comme décision de Blake (7.5).

La semaine existe déjà

Les quêtes hebdomadaires tournent selon la semaine du calendrier dans Quest.current, le thème du hall est le titre de la quête de la semaine, et les notes de prototype interrogent les testeurs sur une « Weekly reset on your calendar’s week » (remise à zéro hebdomadaire selon la semaine de votre calendrier).7071 Une lettre du dimanche n’a besoin d’aucune nouvelle horloge, même si elle prend sa propre clé, la date du dimanche, pour une raison que donne la section 7.4.

7. Le cahier des charges : ce que Kiradex construit et les vérifications à passer

Ceci est un cahier des charges, pas le compte rendu d’un travail livré : rien de ce qui suit n’existe encore dans l’app. Il est rédigé comme un différentiel par rapport à ce que la section 6 a mesuré : les 23 meubles de la forge, deux étages de maison de 16 par 12 et un hall de 16 par 13, les emplacements garnis, un serveur qui ne conserve rien, un stockage SwiftData synchronisé via CloudKit, l’horloge des quêtes hebdomadaires et les règles de pièce que l’article sur les mondes a déjà publiées.96810 Chaque élément garde une mécanique mesurée plus haut et dessine tout avec la forge, la palette et les mots propres à Kiradex. Aucun élément ne nomme une créature, un lieu tiré d’un jeu ou une fonctionnalité d’une franchise, et rien dans une pièce n’est lancé, capturé, invoqué ou chevauché ; rien ne ressemble donc aux étapes revendiquées des brevets de méthode de jeu que décrit l’article sur les mondes ; c’est ma lecture, pas un avis juridique.10 Les coordonnées sont celles de la forge, x vers la droite et y vers le bas à partir de la cellule en haut à gauche. Les chiffres de cette section (les huit meubles de départ, le barème, les seuils de palier de maison, le calendrier de déblocage) sont mes propositions, pas des faits.

7.1 Placement par cellule, dans le vocabulaire de la forge

Un mode Aménagement dans la maison. Les meubles plaçables sont 20 des 23 de la forge : tous sauf stairs, stairs_down et pillar, qui restent partie intégrante de l’agencement. Les quatre chaises deviennent un seul type doté d’une orientation : les 20 meubles forment donc 17 types de sol. Le tableau, l’horloge, la bannière et l’applique du parement deviennent quatre objets muraux plaçables, ce qui fait 21 types issus de la forge actuelle ; les fenêtres et l’ouverture de l’escalier restent de l’architecture. La section 7.5 ajoute trois nouveaux meubles (une table d’exposition, un paravent et un objet mural de fleur pressée), ce qui porte le total à 24.72 Un meuble posé est (kind, x, y, facing) à sa cellule en haut à gauche sur la carte en lettres de l’étage, la même forme que celle qu’utilise déjà ROOM_FURNITURE.964

Les règles, cellule par cellule. Les cinq premières sont la question par cellule d’Émeraude transposée aux lettres de Kiradex ; la sixième est l’ajout du cahier des charges, une vérification que la fonction de placement d’Émeraude ne fait pas.4

  1. Un meuble indépendant exige que chaque cellule couverte soit du sol (o, t, s ou r) sans autre meuble dessus.
  2. Un meuble adossé au mur (bibliothèque, armoire, comptoir, évier, cuisinière, cheminée) exige que sa rangée du haut soit sur le bandeau mural, là où la forge les place déjà : la cheminée à y = 1, à cheval sur le parement et le lambris, les autres à y = 2, sur le lambris.64
  3. Un objet mural exige une cellule de parement (A) en rangée 1 qui ne soit ni une fenêtre ni l’ouverture de l’escalier.
  4. Aucun meuble sur la cellule d’arrivée, les deux cellules de porte (la forge dessine la porte sur deux cellules de large dans le mur du bas), les cellules praticables de l’escalier ou la cellule de l’hôte.
  5. La bibliothèque emporte avec elle ses cinq emplacements d’étagère, puisque ceux-ci sont relatifs au meuble : déplacer l’étagère déplace les classeurs. La vitrine c et le bureau d restent des lettres fixes dans ce cahier des charges.
  6. La règle de chemin. Après le placement, un parcours dans les quatre directions sur les cellules praticables depuis l’arrivée doit encore atteindre la cellule de l’escalier, celle de l’hôte et au moins une cellule juste devant chaque groupe garni : l’étagère, la vitrine, le bureau, le tableau mural. Un meuble qui rompt le parcours est refusé, et le refus nomme ce qu’il couperait.

Une grille de 16 par 12 du rez-de-chaussée de Kiradex tel que la forge le conçoit aujourd'hui, en cellules sans graphisme : le bandeau mural de trois rangées en haut, la bibliothèque et la vitrine devant lui, les cellules de l'escalier en haut à droite, la porte en bas ; le sol que l'arrivée atteint en blanc ; les meubles indépendants de la forge en gris ; l'arrivée, l'escalier et l'hôte marqués A, S et H ; les cellules avant de l'étagère, de la vitrine et du bureau marquées comme atteintes, ou barrées là où un tonneau, une caisse ou une chaise s'y trouve ; et, dessinés par-dessus en orange, un lit en (9,3) et une table de chevet en (6,4), avec le contour des six cellules devant la vitrine que la paire isole.

Chacun des deux meubles orange passe les règles de cellule ; ensemble, ils emmurent la vitrine, et seul le parcours de la règle 6 le détecte.2420

Pourquoi la forme par groupe. Sur les agencements actuels, la cellule devant un emplacement est souvent occupée par un meuble : le tonneau et la caisse sous deux des cinq cellules avant de l’étagère, une chaise devant chaque bureau, et le lit et la table de chevet sous les trois cellules du tableau.20 La forge parle déjà une partie de cette langue : check() refuse les chevauchements entre objets indépendants ainsi que les emplacements d’étagère, de vitrine, de bureau et de socle sur la mauvaise lettre.64 Le joueur reçoit ces règles étendues à chaque emprise, meubles adossés au mur compris, et aux cellules du tableau mural, plus le parcours.

Critères d’acceptation. - Un test unitaire applique les six règles à room.json : chacun des 24 types (les 21 de la forge actuelle et les trois qu’ajoute la section 7.5) est accepté sur une cellule et refusé sur une cellule pour chaque règle qui le concerne. - La règle de chemin passe sur les deux étages de départ livrés (7.2), et un test fixe que le tableau de l’étage a une cellule avant atteinte. - Un test de propriétés place dans room et room-up des séquences légales aléatoires de jusqu’à 16 meubles et vérifie après chaque étape que le parcours depuis l’arrivée atteint l’escalier, l’hôte et une cellule avant de chaque groupe garni. - Un test de régression place le lit en (9,3) et la table de chevet en (6,4) dans room et vérifie que le second est refusé avec un message qui nomme la vitrine.20 - Une capture du mode Aménagement sur le simulateur de l’iPhone 18 Pro Max montre l’emprise d’un meuble tenu teintée cellule par cellule, une légale et une illégale. - Le check() de la forge passe sur chaque agencement que l’app peut produire : le test exporte l’agencement posé sous forme de ROOM_FURNITURE et lui applique la vérification de la forge, en lecture seule. Comme cette vérification ne lit que les objets exportés et n’a aucune vérification de lettre pour le tableau mural, le même test vérifie aussi, avec le validateur propre au cahier des charges, qu’aucune paire d’emprises posées ne partage une cellule, meubles adossés au mur compris, et que les trois emplacements du tableau mural se trouvent sur les cellules W du tableau dans la carte conçue.64

7.2 Le plafond : seize par étage, pièces de départ à huit

Quoi. 16 meubles posés par carte d’étage, room et room-up chacun, objets muraux compris, comme New Horizons compte les objets muraux et de plafond dans ses 150.5 Ce que garnit la collection (classeurs sur l’étagère, cartes dans la vitrine, rubans et pins sur le tableau) ne compte jamais : le plafond budgète les meubles, et la collection est l’essentiel. La possession n’est pas plafonnée par lui ; un collectionneur peut posséder plus que ce qui tient, comme Émeraude, qui prévoit 150 décorations possédées contre 16 posées, le permet.2

Les chiffres. 16 pour 125 cellules de sol, c’est 0,13 par cellule, la moitié des 0,27 d’Émeraude, ce qui convient à des meubles de 3,04 cellules en moyenne contre 2,43 pour Émeraude et à un collectionneur dont la cellule fait deux tuiles de large (mon calcul).9227 La room de départ de la forge contient déjà 13 meubles mobiles et room-up 11 : un nouveau collectionneur arrivant à 13 sur 16 n’aurait plus que trois choix.9 La proposition : livrer chaque étage de départ avec 8 meubles mobiles, choisis dans la forge. En bas, la bibliothèque reste, puisqu’elle porte les emplacements d’étagère ; en haut, un lit reste, et le réagencement libère au moins une cellule devant le tableau mural, ce qu’aucune cellule n’est aujourd’hui. Les meubles retirés vont dans la réserve du collectionneur au lieu de disparaître, si bien que 8 places par étage appartiennent au collectionneur dès le premier jour.20 Les meubles de départ sont créés avec des identifiants fixes, pour que deux appareils lancés à froid créent les mêmes enregistrements, et non deux jeux (7.7).

Indifférent au mécénat. La ligne de la note de recherche tient : les objets de mécène ne sont « never a bigger furnishing cap » (jamais un plafond d’aménagement plus élevé).69

Critères d’acceptation. Un test unitaire pose 16 meubles et vérifie que le 17e est refusé avec un message qui nomme le plafond ; un test que les classeurs, cartes, rubans et pins sur les emplacements garnis ne changent pas le décompte ; un test que chaque palier de mécène voit un plafond de 16 ; un test que les deux étages de départ se chargent avec 8 meubles mobiles et passent la règle de chemin.

7.3 Papier peint et sol

Quoi. Par carte d’étage, un style de mur et un style de sol, chacun modifiable en mode Aménagement d’un seul toucher, gratuit et réversible : le geste unique pour une surface de Stardew et le choix par pièce de New Horizons, pas la permanence de Habbo.41533 Les styles ne comptent pas dans les 16.

Le vocabulaire existant. Deux parements (plaster et blocks), trois sols (parquet o, carrelage t, marbre s) et le tapis.64 La forge dessine selon des règles à partir de rampes de palette nommées : un style, c’est donc un dessinateur et une rampe. Le premier jeu, ce sont les 2 parements en 3 rampes chacun et les 3 sols en 2 rampes chacun : 6 styles de mur et 6 styles de sol, tous dessinés par la forge, aucun peint à la main. D’autres viennent en jouant (7.5).

Comment c’est livré. La forge exporte chaque style sous forme de cellules d’atlas à côté de celles de la pièce, et l’app échange les indices de sol des cellules de mur et de sol ; le tapis garde son découpage en neuf parties.

Critères d’acceptation. Une capture de room dans chaque style de mur et chaque style de sol, 12 en tout ; une vérification de palette que chaque pixel de chaque style est un indice de la palette de la forge ; un test qu’un changement de style laisse intacts les meubles posés et les emplacements garnis.

7.4 La lettre du dimanche : une note hebdomadaire dont chaque source est imprimée

Quoi. Une fois par semaine, à la première ouverture le dimanche à partir de minuit heure locale ou après, une lettre apparaît sur le paillasson (un objet sur la cellule d’arrivée) et note la maison telle qu’elle est. Une lettre par dimanche, indexée par la date de ce dimanche en heure locale. La semaine du tableau de quêtes ne peut pas servir de clé : Quest.current prend l’intervalle weekOfYear du calendrier, qui commence le jour où commence la semaine de ce calendrier, si bien qu’une clé de semaine et la règle du dimanche pourraient diverger.70 Une semaine manquée ne coûte rien. La lettre imprime chaque ligne de source avec ses points, puis le total et le palier de maison. Le nom est propre à Kiradex, la note du conservateur pour l’instant, jamais le nom du jeu dont elle emprunte le rythme.

Sources. La forme est celle de l’académie d’évaluation des maisons telle que Nookipedia la présente (seuils de quantité, un bonus d’ensemble, un bonus de couleur) ; les chiffres sont les miens, et la collection y figure.6 Les plafonds s’entendent par carte d’étage, comme les 16.

Source Points Plafond Ce qu’elle emprunte
Chaque meuble posé 100 16 meubles par étage les seuils de quantité
Un étage meublé : 6, 10 et 16 meubles 500 à chaque seuil 1 500 par étage 1 000 à 6, 10, 15 et 20 objets
Un ensemble : 4 meubles ou plus d’un même jeu de la forge sur un étage 200 par meuble 16 meubles par étage 4 ou plus d’une même série
Une rampe : 70 % des meubles de l’étage et de ses deux surfaces, mur et sol, dans une même famille de rampes 100 par meuble posé sur l’étage 16 par étage 70 % d’une même couleur
Une rampe à 90 % (remplace la ligne à 70 %) 300 par meuble posé sur l’étage 16 par étage 90 % d’une même couleur
L’étagère : les 5 places de classeur remplies à partir de la collection 500 une fois les bureaux d’Émeraude qui portent des poupées
La vitrine : chacune de ses 2 places contient une carte 300 chacune 600
Le tableau : chacune de ses 3 cellules porte un pin, un tampon ou un ruban 100 chacune 300
Pénalités aucune la règle de chemin refuse déjà une pièce bloquée

Proposition. Chaque ligne se calcule à partir de la pièce locale et de la collection.

La note la plus haute que ce barème puisse donner est 23 600, calculée ligne par ligne pour les deux étages à 16 meubles avec chaque bonus atteint ; les lignes d’ensemble et de rampe supposent un jeu et une famille de rampes assez grands pour les seize, c’est donc une borne supérieure, pas un agencement que quelqu’un a dessiné. Un étage de départ à 8 meubles, avant jeux, rampes ou emplacements, obtient 1 300.21

Un diagramme en barres horizontales des sources de points de la lettre du dimanche à leur maximum pour les deux étages : chaque meuble posé 3 200 ; un étage meublé à 6, 10 et 16 meubles 3 000 ; un ensemble 6 400 ; une rampe à 90 % 9 600 ; l'étagère pleine 500 ; la vitrine 600 ; le tableau 300 ; 23 600 en tout.

En haut de l’échelle, la composition (jeux et rampes) vaut plus que la quantité, et c’est tout l’intérêt d’un plafond.2421

La lettre classe la maison en trois paliers de maison, et chaque seuil est la note que le barème lui-même donne à une maison de référence : 4 500 pour les deux étages à 10 meubles avec l’étagère pleine ; 7 600 pour les deux étages à 16 meubles avec l’étagère, la vitrine et le tableau pleins ; et 14 000 pour cette maison avec un ensemble de 8 et 70 % d’une même rampe à chaque étage. Une maison de départ, les deux étages à 8, obtient 2 600, sous le premier palier.21 Ces trois chiffres sont ma proposition ; Blake fixe les définitifs avant la sortie de la lettre. Contrairement à ceux de l’académie, ils ne montent pas, parce que la forme de la maison ne change jamais (voir « Ce qui ne figure pas dans ce cahier des charges », plus bas).6 Un palier de maison n’est pas un ruban. Les rubans que l’app conserve déjà viennent des collectionneurs de la ville et sont stockés sous plaza.ribbons ; ce sont eux que le tableau affiche (section 6).73 Le palier de maison est imprimé sur la lettre et conservé sous forme de nombre (7.5), et il ne va jamais sur le tableau.

Ce que la note ne lit jamais. Le palier de mécène, les pièces de monnaie, les achats, les likes, quoi que ce soit concernant un autre joueur, ou un habillage de pièce de mécène. Chaque ligne se calcule à partir de la pièce locale et de la collection, si bien qu’un collectionneur peut voir exactement pourquoi il a obtenu ce qu’il a obtenu. Si l’habillage de pièce de mécène sort, il est dessiné par-dessus le style de mur ordinaire de l’étage et n’est pas lui-même un style de mur : l’étage garde ce style ordinaire pour la notation, si bien que les lignes de rampe comptent les mêmes meubles et les mêmes surfaces avec ou sans l’habillage (7.5).

Changement dans la forge. PIECES reçoit une étiquette set, dessinée comme un matériau assorti ; les premiers jeux sont les meubles existants regroupés selon le matériau dans lequel ils sont dessinés.

Critères d’acceptation. Une fonction pure Score.week(room:collection:) avec un test unitaire pour chaque ligne : un étage à 5, 6, 10 et 16 meubles ; un ensemble de 3 et de 4 ; 69 %, 70 %, 89 % et 90 % d’une même rampe ; une étagère à 4 et à 5 classeurs. Un test que le maximum est 23 600. Un test que les trois maisons de référence obtiennent 4 500, 7 600 et 14 000 et atteignent le premier, le deuxième et le troisième palier de maison, et que la maison de départ, à 2 600, n’en atteint aucun. Un test qu’atteindre un palier de maison n’ajoute rien à plaza.ribbons ni au tableau. Un test que la lettre d’un dimanche est générée une seule fois (la même date de dimanche deux fois donne une lettre, le dimanche suivant une autre), et qu’un calendrier dont la semaine commence le lundi produit les mêmes clés. Un test que deux profils qui ne diffèrent que par le palier de mécène obtiennent des notes identiques. Une capture d’interface de la lettre sur le paillasson un dimanche, avec un argument de lancement qui fixe la date.

7.5 Débloquer en jouant, jamais en payant

Quoi. Le catalogue que possède un collectionneur est dérivé du jeu. Trois de ses six entrées existent aujourd’hui : les niveaux et les pins, dérivés de la collection synchronisée, et les tampons de quête, enregistrés sur l’appareil seulement. Les trois autres exigent de nouveaux compteurs, chacun nommé et synchronisé :

  • Niveaux. La courbe de WORLD.md est level = floor(sqrt(XP / 40)) + 1.67 Un type ou un style à chaque niveau de 2 à 20, puis tous les deux niveaux, comme WORLD.md verrouille déjà par niveau des cosmétiques « that cannot be bought » (qu’on ne peut pas acheter).67 Disponible aujourd’hui, dérivé de la collection synchronisée : l’app en calcule l’expérience et le niveau, « so every device agrees without anything being stored » (si bien que tous les appareils concordent sans que rien soit stocké).74
  • Pins. Chaque pin débloque un meuble nommé : Full Set une table d’exposition, Vintage une horloge, Across the Sea un paravent. Le premier et le dernier sont de nouveaux meubles de la forge.67 Disponible aujourd’hui, dérivé de la collection synchronisée par le même calcul.74
  • Quêtes hebdomadaires. Chaque quête hebdomadaire accomplie ajoute un exemplaire d’un meuble de base : une chaise, une plante, une caisse.70 Enregistré aujourd’hui, mais sur l’appareil seulement : les tampons vivent dans @AppStorage("quests.stamps"), c’est-à-dire UserDefaults, pas le stockage synchronisé ; ils passent donc dans PlayRecord (plus bas) avant qu’un meuble n’en dépende.7375
  • Pas. Une longue marche, un meuble qui coûte un grand nombre de pas, comme la chaise de verre d’Émeraude coûte 6 000 de cendre ramassée pas à pas. Le sac d’Émeraude n’affiche aucun compteur, et son atelier n’annonce ce qui manque que lorsque le joueur y revient ; la proposition ici est un compteur qui reste visible sur la carte du meuble dans la réserve, pas parcourus contre pas nécessaires.2815 Une fleur pressée tirée de la plante sur le rebord de fenêtre est une proposition distincte : un objet mural dont le déblocage est fixé dans le cahier des charges de l’article hommage, la plante gagnant un stade tous les 256 pas, restant en fleur pendant 1 024 pas puis laissant tomber une fleur, et non par le compteur de ce point. Nouveau : l’app ne tient aujourd’hui aucun compte de pas, il faut donc stepsWalked.73
  • Visites. Les rangs de passeport à 30, 100 et 500 pièces visitées débloquent chacun un style.69 Nouveau : rien n’enregistre aujourd’hui une visite, ni sur l’appareil ni sur le serveur, il faut donc roomsVisited, les identifiants des hôtes.7368
  • La lettre. La première fois qu’un collectionneur atteint chaque palier de maison, cela débloque un meuble. Nouveau : les paliers de maison n’existent que dans ce cahier des charges (7.4), il faut donc letterTier, le palier de maison le plus élevé atteint.

Différentiel du modèle. Les tampons de quête et les trois nouveaux compteurs vivent dans un seul modèle synchronisé, PlayRecord, un enregistrement par appareil, façonné pour CloudKit comme les autres modèles de l’app (7.7). Le catalogue lit l’enregistrement de chaque appareil : les pas s’additionnent, les tampons et les hôtes visités sont réunis, et le palier de maison le plus élevé l’emporte. L’appareil garde l’uid de son propre enregistrement sous une clé @AppStorage, dans le même espace de noms UserDefaults que plaza.id, l’identifiant de l’appareil sur la place.7375 Chaque appareil n’écrit que son propre enregistrement : deux appareils ne modifient donc jamais le même, et aucune règle de fusion n’est nécessaire. Cela ne tient que tant que le pointeur reste sur un seul appareil, et une sauvegarde restaurée sur un second téléphone emporterait le pointeur avec elle (ma lecture ; aucune restauration n’a été testée). L’enregistrement porte donc un marqueur d’appareil, writer, et la règle est la suivante : un appareil restauré crée un nouvel enregistrement quand l’enregistrement de son pointeur a été écrit par un autre appareil. L’ancien enregistrement reste, et le catalogue le lit toujours. Quelle valeur ferait un marqueur qu’une sauvegarde n’emporte pas vers un nouveau téléphone, ce cahier des charges ne le tranche pas ; le test fixe la règle. Au premier lancement après le changement, l’appareil copie une fois sa liste quests.stamps dans son enregistrement.

Ce qui est refusé. Aucun meuble ni style en achat intégré, aucun prix en pièces de monnaie pour les meubles, aucun meuble aléatoire d’aucune sorte, aucun meuble en quantité limitée et aucun échange de meubles : les meubles à casser, raretés et valeurs d’échange de Habbo sont le contre-exemple.1735 Ma lecture : une app 9+ dont la boucle de décoration est achetée ou aléatoire s’expose à des questions de loot box et de pression dont l’app de collection n’a pas besoin, et le déblocage par le jeu les évite. La seule exception payante qu’admet la note de recherche est « one room skin » (un habillage de pièce) pour les mécènes, et l’article sur les mondes l’a nommée : « Patron flair stays on the name-plate and the room skin » (les attributs de mécène restent sur la plaque de nom et l’habillage de la pièce).6910 La même phrase pose la limite : les attributs de mécène « never touches a pedestal slot or a judging bonus » (ne touchent jamais une place de socle ni un bonus de jugement).10 Ce cahier des charges rouvre l’habillage comme décision de Blake au lieu de le tenir pour acquis. S’il le garde, l’habillage est une surcouche visuelle, pas un style de mur. L’étage garde le style de mur ordinaire choisi par le collectionneur, l’habillage est dessiné par-dessus, et la note ne lit que le style ordinaire, si bien que les lignes de rampe de la section 7.4 comptent les mêmes meubles et les mêmes surfaces, sur le même dénominateur, avec ou sans l’habillage. Retirer plutôt le mur du décompte de rampe ne serait pas neutre, car la proportion compte les surfaces autant que les meubles. Un étage de 16 meubles, dont 15 et le style de sol dans une même rampe et le mur en dehors, donne 16 sur 18, soit 88,9 %, sur la ligne à 70 % pour 1 600 points, 100 pour chacun des 16 meubles posés, celui hors rampe compris ; retirez le mur et l’on obtient 16 sur 17, soit 94,1 %, sur la ligne à 90 % pour 4 800, 300 pour chacun des 16, soit un bonus de jugement de 3 200 pour l’habillage payant.76 Le test ci-dessous exclut l’habillage nommément.

Critères d’acceptation. Un test unitaire que le catalogue possédé est une fonction pure de l’XP, des pins, des tampons de quête, des pas parcourus, des pièces visitées et du palier de maison, et ne change avec rien d’autre ; un test que les PlayRecord de deux appareils donnent le même catalogue quel que soit l’ordre de lecture (pas additionnés, tampons et hôtes réunis, palier de maison le plus élevé) ; un test que la liste quests.stamps existante d’un appareil est copiée une fois dans son enregistrement et jamais deux ; un test qu’un appareil dont le pointeur désigne un enregistrement portant le writer d’un autre appareil crée un nouvel enregistrement, laisse l’ancien intact et compte toujours les deux ; un test qu’aucun identifiant de produit StoreKit ni aucun article de la boutique en pièces de monnaie ne correspond à un type de meuble ou à un style, avec une exception nommée : si Blake garde l’habillage de pièce de mécène, son produit correspond à exactement une surcouche et à aucun style de mur, et l’appliquer laisse inchangé le style de mur de l’étage pris en compte dans la note ; un test qu’un étage obtient la même note, ligne par ligne, et le même palier de maison avec et sans l’habillage, exécuté à chaque frontière de seuil : 5, 6, 10 et 16 meubles, 69 %, 70 %, 89 % et 90 % d’une même rampe, chaque fois avec le mur ordinaire dans la famille de rampes et en dehors, et des maisons à un point sous chaque seuil de palier et pile sur ce seuil ; un test d’instantané de la réserve du catalogue au niveau 1 (le jeu de départ seul) et au niveau 20.

7.6 Les visites : lecture seule, un like par jour, un total qui ne baisse jamais

Quoi. Un visiteur entre dans la maison d’un hôte par sa porte, en empruntant les téléportations de pièce que la ville possède déjà pour les maisons de ses propres collectionneurs,39 et voit les meubles posés, les styles et les emplacements garnis de l’hôte. Le visiteur peut marcher et prononcer des phrases prédéfinies, mais ne peut rien déplacer, prendre ni ajouter : c’est la règle de Habbo, et le résultat qu’atteint le rêve de New Horizons en ne conservant rien de ce que change un visiteur.1832 Un like sur la porte compte une fois par visiteur, par hôte et par jour local, et le total de l’hôte ne diminue jamais, même quand il réaménage : la règle de Club Penguin, d’après son unique source de fans.19 Une visite rapporte au visiteur un tampon de passeport, que l’appareil du visiteur ajoute à roomsVisited dans son PlayRecord (7.5).69

Différentiel du serveur. Le serveur actuel ne conserve rien.68 Les visites exigent deux petits enregistrements par joueur. Le premier est l’agencement de la maison : au plus 32 meubles posés sur deux étages, chacun avec un type, x, y et une orientation, plus deux identifiants de style par étage. En JSON compact à clés nommées, avec le nom de type proposé le plus long dans chaque champ et des identifiants de style de 16 caractères, cela fait 1 974 octets, moins de 2 Ko ; en simples quadruplets de nombres, ce serait 385 (mon calcul ; la base entière d’Émeraude tient en 32 octets).7211 Le second est un total de likes accompagné de l’ensemble des visiteurs du jour. Aucun des deux ne contient de donnée personnelle au-delà du pseudonyme du joueur. Le serveur valide un agencement avec les mêmes six règles avant de le stocker : un client modifié ne peut donc pas stocker une pièce illégale. Les compteurs de jeu de la section 7.5 (tampons de quête, pas parcourus, pièces visitées, palier de maison) ne sont pas des enregistrements serveur : ils se synchronisent via l’iCloud du collectionneur dans PlayRecord, et le serveur ne les lit jamais.

Critères d’acceptation. Tests serveur : un agencement avec un chevauchement, un chemin bloqué ou un 17e meuble sur un étage est refusé ; un message de déplacement ou de pose d’un visiteur dans la pièce d’un hôte est refusé ; deux likes d’un même visiteur le même jour comptent une fois, et un like le lendemain compte ; un hôte qui vide la pièce garde son total. Un parcours sur deux simulateurs : l’appareil A aménage, l’appareil B visite et voit les mêmes meubles sur les mêmes cellules, avec une capture de chacun.

7.7 Le modèle et l’écran sous iOS 26

SwiftData. Deux modèles, façonnés pour CloudKit comme les autres de l’app : des valeurs par défaut partout, rien d’unique, et un uid fixé à un UUID dans init, comme Profile, PriceHistory et CardCopy en portent chacun un.51775222

@Model final class PlacedPiece {
    var uid: String = ""             // set once, at creation; orders the repair
    var roomMap: String = "room"     // "room" or "room-up"
    var kind: String = ""            // a forge PIECES name
    var x: Int = 0
    var y: Int = 0
    var facing: String = "down"
    init() { uid = UUID().uuidString }
}

@Model final class PlayRecord {      // one per device (7.5)
    var uid: String = ""             // the device's pointer to it is an @AppStorage key
    var writer: String = ""          // device marker: the one device that writes it
    var questStamps: [String] = []   // moved from @AppStorage("quests.stamps")
    var stepsWalked: Int = 0
    var roomsVisited: [String] = []  // hosts' ids
    var letterTier: Int = 0          // highest house tier reached, 0 to 3
    init() { uid = UUID().uuidString }
}

Les styles de mur et de sol vivent sous forme de chaînes sur Profile, à côté de lookData.77 Pas de #Unique ni de relation obligatoire, parce que CloudKit ne prend en charge ni l’un ni l’autre.22 L’exclusivité des cellules, le plafond et le parcours sont imposés dans le code, par une seule fonction. RoomLayout.repair(_:) s’exécute à chaque lecture. Elle trie par uid croissant les meubles synchronisés d’un étage et reconstruit l’étage à partir de son architecture fixe (la carte en lettres, les escaliers et les piliers), en ajoutant chaque meuble dans cet ordre seulement si la vérification de placement complète de la section 7.1 l’accepte face aux meubles déjà acceptés : les règles de cellule (donc aucun chevauchement), le plafond de 16 et la règle de chemin. Un meuble que la vérification refuse retourne dans la réserve. Chaque appareil trie les mêmes enregistrements de la même façon, si bien que chaque appareil reconstruit la même pièce, et quand deux meubles entrent en conflit, le plus petit uid l’emporte, la règle que PriceBook utilise déjà pour choisir entre les historiques de prix de deux appareils.52 L’ordre suit l’uid, pas une heure de placement, parce qu’une heure vient de l’horloge propre à chaque téléphone. Le chevauchement n’est pas le seul conflit que deux téléphones peuvent créer. Un lit posé en (9,3) sur un téléphone et une table de chevet posée en (6,4) sur un autre passent chacun la vérification complète sur leur propre appareil, et ensemble ils coupent l’accès aux deux cellules devant la vitrine ; la reconstruction garde celui dont l’uid est le plus petit et renvoie l’autre.2066 Comme retirer un meuble ne coupe jamais un chemin, un étage déjà légal passe la reconstruction inchangé, quel que soit l’ordre (mon raisonnement ; les tests d’acceptation le fixent). Les meubles de départ de la section 7.2 sont le seul endroit où deux appareils créent des enregistrements sans action d’un joueur : chacun reçoit donc un uid fixe tiré de son étage et de sa place, de starter.room.1 à starter.room-up.8, au lieu d’un uid aléatoire ; deux appareils lancés à froid créent ainsi les mêmes seize uid, et non seize paires que la reconstruction répartirait entre le sol et la réserve. Avant de reconstruire, repair fusionne les enregistrements qui partagent un uid, comme ModelContext.profile() fusionne déjà en un seul, celui au plus petit uid, les profils en double que laisse la synchronisation.77 Quand deux copies divergent, parce qu’un appareil a déplacé son meuble de départ avant le premier lancement de l’autre, la fusion garde la copie qui a quitté sa cellule de départ, et entre deux copies déplacées celle à la plus petite rangée, puis colonne (ma proposition). Si ranger un meuble supprime son enregistrement, un meuble de départ rangé sur un téléphone revient quand un second téléphone est lancé à froid ; ce cahier des charges ne tranche pas ce cas.

Placement. Le mode Aménagement superpose une réserve SwiftUI à la RealityView de la pièce. Un élément de la réserve est draggable avec son type comme charge Transferable ; la vue de la pièce est une destination de dépôt.53 Sous iOS 26, dropDestination(for:action:isTargeted:) transmet à l’action le point de dépôt dans les coordonnées de la vue, et ce point est associé à une cellule grâce à l’échelle en pixels entiers connue de la caméra : cell = floor((point - mapOrigin) / tileSizeInPoints).54 Comme la page d’Apple indique que cette forme devient obsolète dans iOS 27.2, le cahier des charges construit aussi la forme DropSession et lit l’emplacement dans la session, si elle en porte un ; cette page n’a pas été lue.54 Un meuble posé se sélectionne avec SpatialTapGesture et se déplace avec DragGesture, en s’aimantant cellule par cellule, son emprise teintée cellule par cellule comme Stardew teinte ses tuiles.565516

VoiceOver. En mode Aménagement, chaque meuble posé est un élément d’accessibilité, par exemple Canapé, trois par deux, colonne 9, rangée 8, avec les actions nommées Déplacer à gauche, Déplacer à droite, Déplacer vers le haut, Déplacer vers le bas, Tourner (chaises seulement) et Ranger.5758 Un rotor nommé « Mobilier » liste les meubles de la pièce.60 L’action Placer d’un élément de la réserve pose le meuble sur la cellule légale la plus proche de l’arrivée et lui donne le focus. Les styles de mur et de sol sont des éléments ajustables : balayer vers le haut ou vers le bas pour les faire défiler.59 Chaque refus est prononcé sous forme d’annonce, par exemple Déplacement impossible : le canapé couperait l’accès à l’étagère.61 Les règles de la section 7.1 forment une seule fonction : la voix et le toucher ne peuvent donc jamais diverger.

Critères d’acceptation. Un test unitaire que repair résout de la même façon un chevauchement entre deux appareils, quel que soit l’ordre. La régression de fusion à deux appareils, exécutée avec les deux enregistrements dans les deux ordres d’entrée : sur room tel que la forge le conçoit aujourd’hui, l’appareil A pose un lit en (9,3) et l’appareil B une table de chevet en (6,4) ; chaque placement passe seul la vérification complète ; une fois les deux synchronisés, repair renvoie la même pièce pour les deux ordres, garde le meuble au plus petit uid, place l’autre dans la réserve avec un message qui nomme la vitrine, et le parcours depuis l’arrivée atteint toujours les deux cellules devant la vitrine ; avec les deux uid intervertis, c’est l’autre meuble qui est gardé.66 Un test que repair laisse inchangé un étage légal de 16 meubles, ses enregistrements mélangés dans plusieurs ordres. Un test que 17 meubles synchronisés sur un étage, légaux ensemble sauf pour le plafond, reviennent à 16, celui au plus grand uid étant dans la réserve. Un test que deux appareils lancés à froid, créant chacun les meubles de départ, se synchronisent en un enregistrement par cellule de départ, 8 par étage, sans rien dans la réserve, quel que soit l’ordre de synchronisation ; et qu’un meuble de départ déplacé sur un appareil avant le lancement de l’autre reste là où il a été déplacé. Un test d’interface qui fait glisser un élément de la réserve sur une cellule et trouve un PlacedPiece sur cette cellule. Des tests unitaires des gestionnaires d’actions VoiceOver, appelés directement sur le modèle d’aménagement et non via VoiceOver : Placer pose une chaise sur la cellule légale la plus proche de l’arrivée ; Déplacer à gauche, Déplacer à droite, Déplacer vers le haut et Déplacer vers le bas la déplacent chacun d’une cellule ou refusent avec une raison ; Tourner fait défiler son orientation ; Ranger la renvoie dans la réserve ; et chaque refus produit le texte d’annonce que l’écran publiera. Sur un simulateur iOS 27, un test d’interface qui active VoiceOver via XCUIVoiceOverService, déplace le focus sur un meuble posé et vérifie son libellé prononcé, par exemple Canapé, trois par deux, colonne 9, rangée 8.63 Un audit du mode Aménagement avec performAccessibilityAudit qui ne signale aucun problème.62 Une vérification manuelle sur un appareil avec VoiceOver activé, consignée avec sa date et sa build, parce qu’aucun appel XCUIAutomation n’exécute une action personnalisée, ne fait tourner un rotor ni ne lit une annonce : poser une chaise depuis la réserve, la déplacer dans les quatre directions avec les actions, la tourner, la ranger, sauter d’un meuble à l’autre avec le rotor Mobilier, et entendre l’annonce de chaque déplacement refusé. Avant tout cela, un essai exploratoire : déposer une charge sur la pièce dans le simulateur, sous l’échelle réelle de la caméra, et consigner la cellule calculée face à la cellule sous le doigt, car cette correspondance n’est pas testée.

7.8 Intendance

  • WORLD.md reçoit les règles de pièce, avec les chiffres de ce cahier des charges, pour que le document de conception dise ce que l’article sur les mondes a publié.6710
  • La docstring et la table de interiors.py sont mises en accord, d’une façon ou d’une autre : soit la docstring dit que les petits meubles sont l’exception, soit les petits meubles sont redessinés sur deux tuiles. Le cahier des charges les garde.9

Ce qui ne figure pas dans ce cahier des charges

  • L’empilement au-delà des emplacements propres à l’étagère : aucun meuble sur une table, pas de surfaces façon poupée-sur-bureau. L’idée de surface est l’étape suivante, une fois le plafond et le parcours éprouvés.
  • Des meubles qui agissent quand on marche dessus : pas de tapis sonores, pas de ressorts, pas de toboggans.
  • Le placement par demi-cellule. La grille reste en cellules entières de 16 pixels.
  • L’aménagement du hall d’exposition. Ses socles restent ceux de l’exposition hebdomadaire.
  • Un concours d’aménagement. Le hall hebdomadaire est le concours, jugé selon ses propres règles.
  • Les plans : la forme de la maison ne change pas.
  • Les visites chez des inconnus hors d’une place partagée, et tout classement de pièces au-delà du total propre de l’hôte.

Jamais, pour l’aménagement

  1. Aucun vocabulaire de franchise pour rien de tout cela : ni la base, ni l’ordinateur de décoration, ni l’académie, ni le mélange d’enregistrements, ni le nom d’aucune décoration. Les mots de Kiradex seulement. Les jeux sont nommés dans cet article comme des faits relatifs à des œuvres publiées, pas comme des fonctionnalités.
  2. Aucun meuble dessiné d’après une décoration de jeu : pas de poupées ni de coussins de créatures, rien en forme de balle, pas de posters de créatures, pas de tapis nommé d’après une attaque. Les meubles de la forge sont du mobilier domestique, et le restent.
  3. Aucune créature dans aucune pièce. Les plantes sont des plantes.
  4. Aucun meuble acheté, aléatoire ou limité (7.5).
  5. Rien dans une pièce n’est visé, lancé, capturé, invoqué, lâché pour combattre ou chevauché.
  6. Aucun code ni aucune donnée issus des décompilations dans l’app ou la forge. Le code décompilé sert à l’étude et à la mesure ; les règles ci-dessus sont reformulées dans les termes propres à Kiradex.

Critères d’acceptation. Un grep du catalogue de chaînes, des noms PIECES de la forge et des tables du serveur avec une liste de mots construite à partir du vocabulaire de franchise du point 1, plus « decoration », « doll », « Happy Home » et « Academy », ne renvoie rien.

Points clés

Si vous dessinez les graphismes

  • Dessinez les meubles à la largeur de l’image ou de la cellule du personnage. L’image du joueur d’Émeraude fait une cellule de 16 pixels de large et ses décorations couvrent 2,43 cellules en moyenne ; le collectionneur de Kiradex se tient dans une cellule de deux tuiles de large et ses meubles en couvrent 3,04 en moyenne.2729
  • Constituez un catalogue fait surtout de petits meubles, avec quelques grandes pièces d’ancrage : 71 des 120 décorations d’Émeraude tiennent en une cellule, et ses bureaux et ses tapis de 3 par 3 sont les ancrages sur lesquels se tiennent les petites.224
  • Dessinez papiers peints et sols à partir de règles et de rampes, pour qu’un style soit un dessinateur et une palette, pas un nouveau tableau : deux parements en trois rampes et trois sols en deux rampes donnent six de chaque à Kiradex.64

Si vous construisez le moteur

  • Stockez un meuble posé sous forme de type, de cellule et d’orientation. Émeraude en stocke un en deux octets, une base en 32.1112
  • Vérifiez le placement cellule par cellule, puis parcourez. La vérification par cellule d’Émeraude ne demande jamais si la porte atteint encore quoi que ce soit ; au rez-de-chaussée de Kiradex, 713 des 229 891 paires légales de meubles supplémentaires coupent l’accès à l’escalier, à l’hôte ou à une exposition sans les couvrir.420
  • Avec la synchronisation CloudKit, SwiftData ne peut pas imposer de contrainte d’unicité : un meuble par cellule devient donc une fonction de réparation pure qui choisit le même gagnant sur chaque appareil. Faites-lui reconstruire la pièce en la faisant passer par la vérification de placement complète, parcours compris, dans un ordre fixe : deux modifications qui passent chacune sur leur propre téléphone peuvent ensemble couper l’accès à une exposition.225266
  • Donnez à VoiceOver des verbes, pas une grille à balayer : des actions de déplacement nommées, un rotor des meubles, une annonce pour chaque refus.586061

Si vous concevez la boucle de jeu

  • Plafonnez ce qui est posé, pas ce qui est possédé : Émeraude pose 16 et stocke 150. Le plafond, c’est la composition.2
  • Notez un jour fixe, chaque source détaillée, ne relevez la barre que quand la maison grandit, et ne punissez jamais une semaine manquée : la page du wiki sur la maison, qui ne nomme aucun jeu, dit qu’une maison négligée au moins une semaine se remplit de cafards, et le tableau HHA de New Horizons retire 2 500 points par cafard.56
  • Faites grandir le catalogue par le jeu. Émeraude ne vend jamais contre de l’argent 24 de ses 120 décorations et n’en vend deux autres que contre de la cendre ramassée en marchant, Stardew, après le premier agrandissement, vend un catalogue à 200 000g qui vend ensuite pour 0g les meubles qu’il répertorie, et les meubles rares et aléatoires de Habbo sont le contre-exemple pour une app destinée aux enfants.14151617
  • Les visiteurs regardent, ne touchent pas, et laissent un like par jour sur un total qui ne baisse jamais.51819

Questions fréquentes

Combien d’objets un joueur devrait-il pouvoir poser dans une pièce ?

Assez pour composer, assez peu pour choisir. Pokémon Émeraude plafonne une base à 16 décorations posées et la chambre à 12, soit environ un quart des 60,2 cellules praticables d’une base moyenne. Animal Crossing: New Horizons autorise 150 objets par pièce, objets muraux et de plafond compris, selon Nookipedia, et Final Fantasy XIV autorise de 150 à 600 objets en intérieur selon la taille du logement depuis le Patch 7.5. Pour une pièce 2D sans couche murale ni plafond, mon seuil est un plafond sous un objet pour trois cellules de sol, sous lequel les 0,27 d’Émeraude restent tout juste ; les 16 proposés pour Kiradex représentent 0,13 par cellule de sol.2579

Comment fonctionne le système de décoration de Pokémon Émeraude ?

Ce sont des données. 120 décorations portent chacune une catégorie, une forme de 1 à 9 cellules, un prix et l’une de cinq permissions (sol plein, sol franchissable, derrière, mur ou sprite). CanPlaceDecoration vérifie chaque cellule couverte : sol simple, aucun objet, et, sur la cellule où se tenait le joueur, aucune tuile au type de calque non normal ; des cellules de mur pour les posters ; une cellule porteuse pour les poupées et les coussins, petite ou grande pour la plupart, grande pour une poupée de 1 par 2. 18 décorations offrent de petites cellules porteuses : sept bureaux, trois briques, un pneu et sept tapis. Les décorations posées sont stockées sous forme d’un identifiant et d’un octet de position chacune.2411

Comment l’académie d’évaluation des maisons note-t-elle une pièce ?

D’après les tableaux de Nookipedia, qui ne citent aucune source pour New Horizons : une évaluation par courrier la plupart des dimanches matin, les rangs B, A et S, un seuil du rang S qui monte de 15 000 à 90 000 à mesure que la maison s’agrandit, 1 000 points à chacun des seuils de 6, 10, 15 et 20 objets dans une pièce, des bonus par objet pour les séries, les ensembles, les catégories, une couleur dominante et le feng shui, et des pénalités pour les cafards, les déchets et les objets tournés vers un mur. Les points par objet sont une ébauche sur le wiki.6

SwiftData peut-il imposer un objet par cellule de grille avec la synchronisation CloudKit ?

Pas avec #Unique. Le guide d’Apple sur la synchronisation de SwiftData range les contraintes d’unicité parmi les fonctionnalités « that CloudKit doesn’t support natively » (que CloudKit ne prend pas en charge nativement), et CloudKit exige que chaque relation soit optionnelle. Donnez une valeur par défaut à chaque propriété, ne rendez rien unique, et résolvez les meubles de deux appareils sur une même cellule dans une fonction pure qui s’exécute à chaque lecture et choisit le même gagnant sur chaque appareil. Faites reconstruire la pièce par cette fonction, dans un ordre fixe, en passant par la vérification de placement complète et pas seulement par le test de chevauchement, car deux modifications légales chacune peuvent enfreindre une règle ensemble.225166

Comment rendre une grille de meubles en glisser-déposer accessible avec VoiceOver ?

Faites de chaque meuble posé un élément d’accessibilité dont le libellé indique sa taille et sa cellule, donnez-lui des actions nommées pour le déplacer d’une cellule dans chaque direction, le tourner et le ranger, ajoutez un rotor qui liste les meubles de la pièce, et annoncez chaque déplacement refusé avec sa raison. accessibilityAction(named:_:), accessibilityRotor(_:entries:) et AccessibilityNotification.Announcement d’Apple couvrent chaque partie, et performAccessibilityAudit vérifie l’écran dans un test d’interface. L’audit n’appuie pas sur les actions nommées, et dans Xcode 27.0 aucun appel XCUIAutomation ne le fait : testez donc directement les gestionnaires d’actions, et vérifiez à la main, VoiceOver activé, les actions, le rotor et les annonces.5860616263

Un jeu pour enfants devrait-il vendre des meubles ?

Ma lecture est que non, pour une app classée 9+ : une boucle de décoration achetée, aléatoire ou rare s’expose à des questions de loot box et de pression dont le jeu n’a pas besoin. Émeraude ne vend jamais contre de l’argent 24 de ses 120 décorations (ce sont des lots, des échanges contre des points de combat et des cadeaux) et n’en vend deux autres que contre de la cendre ramassée en marchant, et une fois le premier agrandissement de la maison fait, Stardew vend un catalogue de meubles à 200 000g qui vend ensuite pour 0g les meubles qu’il répertorie, même si certains ne s’obtiennent encore qu’au musée, lors des festivals et par d’autres sources. L’économie de Habbo, fondée sur l’achat, avec ses raretés et ses meubles à casser aléatoires, montre l’autre extrémité.14151617

Pourquoi les visiteurs de ces jeux n’ont-ils qu’un accès en lecture seule ?

Selon ma lecture, parce que la pièce est l’expression de l’hôte. Les visiteurs d’Animal Crossing ne peuvent pas « modify the interior in any way » (modifier l’intérieur de quelque manière que ce soit), ceux de Habbo ne peuvent ni poser ni déplacer de meubles sans les droits du propriétaire, et les propriétaires de Club Penguin peuvent décorer leur propre igloo « but not other player’s igloos » (mais pas celui des autres joueurs). Ce que les visiteurs obtiennent à la place, c’est une marque qui compte : le like par création et par jour de Club Penguin, sur un total général qui ne diminue jamais.518819

Sur ce site, à lire aussi : Des structures en pixel art : maisons, halls et intérieurs sur iPhone a construit les intérieurs que ce cahier des charges meuble, et sa section sur les intérieurs décrit les pièces de 14 par 11 que la build 26 a remplacées ; Des mondes en pixel art sur iPhone est l’article où le plafond de seize, les visites en lecture seule, le like quotidien et le bulletin du dimanche ont été publiés pour la première fois ; Des personnages en pixel art : personnages et éditeur sur iPhone présente le collectionneur dont la largeur fixe le rythme des meubles ; L’agencement des villes en pixel art : de Bourg Palette à Pelican Town, mesuré mesure la ville où se dressent les maisons ; Le mouvement en pixel art : marche, caméra et portes sur iPhone traite de la marche et des portes par lesquelles entre un visiteur ; et Des routes en pixel art : connexions de cartes et quartiers sur iPhone traite des terres au-delà de la ville.

Sources


  1. pret, pokeemerald/include/constants/global.h (SECRET_BASES_COUNT 20, DECOR_MAX_SECRET_BASE 16, DECOR_MAX_PLAYERS_HOUSE 12), commit 731ad5b (1er octobre 2026), lu le 5 octobre 2026, https://github.com/pret/pokeemerald/blob/master/include/constants/global.h. ↩↩↩↩↩

  2. Mesure de l’auteur, 5 octobre 2026 : measure_emerald_decor.py dans le dossier de preuves de l’auteur pour cet article, sortie enregistrée sous measure_emerald_decor.out, exécuté sur un clone superficiel de pokeemerald (pret) au commit 731ad5b. Il lit les plafonds dans include/constants/global.h ; les 120 décorations (hors DECOR_NONE) avec catégorie, forme, permission et prix dans src/data/decoration/header.h ; les tableaux d’inventaire par catégorie dans include/global.h ; l’octet de comportement de chaque métatile de décoration dans data/tilesets/secondary/secret_base/metatile_attributes.bin ; et chacun des 24 agencements de base ainsi que la chambre dans data/layouts/layouts.json et son map.bin, en comptant les cellules praticables à partir des bits de collision. Cellules par décoration d’après les noms de forme ; plafond rapporté à la moyenne des cellules praticables 16 / 60,2 = 0,27. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  3. pret, pokeemerald/src/data/decoration/header.h (gDecorations[] : nom, permission, forme, catégorie, prix et tuiles par décoration ; entrée 0 DECOR_NONE), commit 731ad5b, lu le 5 octobre 2026, https://github.com/pret/pokeemerald/blob/master/src/data/decoration/header.h. ↩↩↩↩

  4. pret, pokeemerald/src/decoration.c (CanPlaceDecoration, DecorationItemsMenuAction_AttemptPlace, isPlayerRoom, gText_CantPlaceInRoom ; les vérifications de cellule porteuse pour les décorations sprites), commit 731ad5b, lu le 5 octobre 2026, https://github.com/pret/pokeemerald/blob/master/src/decoration.c. Dans le cas des sprites, une décoration de 1 par 2 exige MetatileBehavior_HoldsLargeDecoration et toute autre prend une cellule porteuse petite ou grande ; IsntInitialPosition ne refuse la cellule de départ du joueur que lorsque la tuile de la décoration à cet endroit a un type de calque autre que METATILE_LAYER_TYPE_NORMAL. Que rien dans la fonction ne vérifie un chemin relève de la lecture de l’auteur. ↩↩↩↩↩↩↩↩↩↩

  5. Nookipedia, « Player house » (plafonds par pièce : 24 dans Wild World, 64 dans City Folk, 48 dans New Leaf, 150 dans New Horizons « including wall and ceiling-mounted furniture » ; le tableau d’agrandissements de New Horizons avec les tailles de pièce ; « only the main room can be expanded in size » ; le mur d’accent depuis la 2.0 ; les visiteurs ne peuvent pas « modify the interior in any way » ; un joueur qui néglige sa maison « for at least one week » la trouve infestée de cafards), récupéré et enregistré le 5 octobre 2026 sous nook-player-house.html et .txt dans le dossier de preuves sur les pièces, https://nookipedia.com/wiki/Player_house. Les 4,2 objets par tuile sont le calcul de l’auteur (150 / 36). ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  6. Nookipedia, « Happy Home Academy » (l’évaluation du dimanche ; les rangs B, A et S par agrandissement ; les bonus et pénalités de New Horizons ; « This section is a stub » pour les points par objet de New Horizons ; la note du tableau des récompenses « Includes data sourced from the Data Spreadsheet for Animal Crossing New Horizons »), récupéré et enregistré le 5 octobre 2026 sous nook-hha.html et .txt, https://nookipedia.com/wiki/Happy_Home_Academy. Les tableaux de bonus et de pénalités ne portent aucune citation sur la page. ↩↩↩↩↩↩↩↩↩↩↩↩↩

  7. Square Enix, The Lodestone, notes du Patch 7.5 de Final Fantasy XIV (mises à jour le 13 mai 2026 ; les limites de meubles intérieurs et extérieurs avant et après dans la section Logement ; la note sur l’affichage de 400 meubles ; « Furnishings from the FFXIV Furnishing Design Contest have been added »), récupérées et enregistrées le 5 octobre 2026 sous ffxiv-patch-7-5.html et .txt, https://eu.finalfantasyxiv.com/lodestone/topics/detail/9beb8a7b5c46944cd80ed92b2b8e972395fbea80/. Le guide de jeu sur le logement, https://na.finalfantasyxiv.com/lodestone/playguide/contentsguide/housing/, a renvoyé HTTP 404 le même jour ; la taille des terrains n’est pas sourcée dans cet article. ↩↩↩↩↩↩↩↩↩↩

  8. Club Penguin Wiki (Fandom), « Furniture » (la limite de possession de 99 pour la plupart des meubles ; « igloos have a limit preventing more than 99 units of furniture being placed at once » ; les propriétaires décorent leur propre igloo « but not other player’s igloos » ; les six objets gratuits pour les non-abonnés du 26 juillet 2012), lu via l’API MediaWiki du wiki et enregistré le 5 octobre 2026 sous cp-fandom-furniture.html et .txt, https://clubpenguin.fandom.com/wiki/Furniture. Source unique. ↩↩↩↩↩↩

  9. Mesure de l’auteur, 5 octobre 2026 : measure_kiradex_interiors.py dans le dossier de preuves sur les pièces, sortie measure_kiradex_interiors.out, qui analyse scripts/forge/interiors.py du dépôt Kiradex avec le module ast de Python (le fichier n’est jamais importé ni exécuté) : les 23 entrées de PIECES avec largeur, hauteur et indicateur d’indépendance ; les cartes en lettres ROOM, ROOM_UP et HALL avec leurs listes de meubles et leurs emplacements ; cellules de sol comptées comme les lettres o t s r ; meubles mobiles hors stairs, stairs_down et pillar. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  10. Blake Crosley, « Pixel-Art Worlds on iPhone: What the 16-Bit Masters Knew », blakecrosley.com, 3 octobre 2026 (les règles de pièce : « a furnishing cap of sixteen », visites en lecture seule, un like une fois par jour, un total qui ne décroît jamais, un bulletin du dimanche « with its point sources listed » ; dans le même paragraphe, « Patron flair stays on the name-plate and the room skin » ; les brevets cités dans le procès Palworld ; l’ajustement de la caméra en pixels d’appareil par texel), https://blakecrosley.com/blog/pixel-art-world-on-iphone. ↩↩↩↩↩↩↩↩↩↩

  11. pret, pokeemerald/include/global.h (u8 decorations[DECOR_MAX_SECRET_BASE] et u8 decorationPositions[DECOR_MAX_SECRET_BASE] dans l’enregistrement de la Base Secrète ; les tableaux d’inventaire de décorations par catégorie dans la sauvegarde), commit 731ad5b, lu le 5 octobre 2026, https://github.com/pret/pokeemerald/blob/master/include/global.h. ↩↩↩↩↩↩↩

  12. pret, pokeemerald/src/secret_base.c (positions de décoration lues avec x dans le quartet haut et y dans le bas), commit 731ad5b, lu le 5 octobre 2026, https://github.com/pret/pokeemerald/blob/master/src/secret_base.c. ↩↩↩

  13. pret, pokeemerald/include/decoration.h (enum DecorationPermission avec le commentaire « The nomenclature here describes collision and placement permissions, in that order. » ; enum DecorationShape, avec DECORSHAPE_3x1 et DECORSHAPE_1x3 marquées inutilisées), commit 731ad5b, lu le 5 octobre 2026, https://github.com/pret/pokeemerald/blob/master/include/decoration.h. ↩↩↩

  14. Mesure de l’auteur, 5 octobre 2026 : measure_emerald_sources.py dans le dossier de preuves sur les pièces, sortie measure_emerald_sources.out, qui cherche dans pokeemerald 731ad5b chaque constante DECOR_ dans les listes pokemartdecoration de data/maps/*/scripts.inc, le script du coin des lots, la table d’échange de l’installation de combat dans src/data/battle_frontier/battle_frontier_exchange_corner.h, et le premier argument de givedecoration et adddecoration partout sous data/ : 90 vendues contre de l’argent dans cinq boutiques, 3 au comptoir des lots, 15 contre des points de combat, 10 offertes par script, 24 jamais vendues contre de l’argent, 6 dans aucune de ces sources. Deux des six sont la paire de l’atelier de verrerie (note 15) ; les quatre autres, trois poupées légendaires et une autre poupée, n’ont pas été tracées. ↩↩↩↩↩↩↩↩

  15. pret, pokeemerald/data/maps/Route113_GlassWorkshop/scripts.inc (PRETTY_CHAIR_PRICE, 6000, PRETTY_DESK_PRICE, 8000, payés depuis VAR_ASH_GATHER_COUNT ; Route113_GlassWorkshop_EventScript_NotEnoughAsh et _NotEnoughAshForItem soustraient le compteur du prix et affichent la différence en pas restant à faire ; une recherche dans src, data et include ne trouve VAR_ASH_GATHER_COUNT utilisé qu’à cet endroit et dans field_tasks.c, hors sa définition) et pokeemerald/src/field_tasks.c (une cendre par pas dans l’herbe cendrée tant que le sac est porté, jusqu’à 9999), commit 731ad5b, lu le 5 octobre 2026, https://github.com/pret/pokeemerald/blob/master/data/maps/Route113_GlassWorkshop/scripts.inc et https://github.com/pret/pokeemerald/blob/master/src/field_tasks.c. ↩↩↩↩↩↩↩

  16. Stardew Valley Wiki, « Furniture », révision 193159 (Robin et la charrette ambulante « offer a random selection of furniture each day they are open » ; « After the first Farmhouse upgrade, Robin also offers the Furniture Catalogue for sale » ; 0g « in unlimited quantity » ; la ligne du tableau des catalogues pour le catalogue de meubles, vendu à la menuiserie (Carpenter’s Shop) pour 200 000g ; « Some furniture can be obtained only by donating items to the Museum », les festivals, le casino et d’autres sources ; les carrés de placement verts et rouges), récupéré et enregistré le 5 octobre 2026 sous sdv-furniture.html et .txt, https://stardewvalleywiki.com/Furniture. ↩↩↩↩↩↩↩↩↩↩↩

  17. Sulake, centre d’aide Habbo, « Furni Definitions » (meubles de campagne retenus « 4-12 months » pour les marchands, raretés qui « will never be re-released », meubles rares à casser, LTD « in limited quantities »), corps de l’article enregistré le 5 octobre 2026 dans habbo-articles.txt du dossier de preuves sur les pièces, https://help.habbo.com/hc/en-us/articles/360011621699-Furni-Definitions. ↩↩↩↩↩↩↩

  18. Sulake, centre d’aide Habbo, « What is Furni? » (« To buy furni you need credits, diamonds or duckets » ; « You can’t drop or manipulate furni in other Habbo’s rooms unless you’re a member of a group »), corps de l’article enregistré le 5 octobre 2026 dans habbo-articles.txt, https://help.habbo.com/hc/en-us/articles/360011512940-What-is-Furni. ↩↩↩↩↩↩↩

  19. That Penguin Game, « Your Igloo » (une reproduction des pages d’aide de Club Penguin ; sa provenance n’a pas été vérifiée : « You can Like any igloo design once every day! » ; likes individuels et total général ; « Likes are permanent, so your Grand Total Likes will never decrease, even if you delete an igloo design! » ; les réglages Everyone et Friends), récupéré et enregistré le 5 octobre 2026 sous tpg-your-igloo.html et .txt, https://thatpenguingame.com/club-penguin-help/game-help/your-igloo/. Source unique. ↩↩↩↩↩↩

  20. Mesure de l’auteur, 5 octobre 2026 : measure_path_rule.py, conservé à côté du brouillon de l’article, sorties measure_path_rule.out et path_rule.json. Il analyse scripts/forge/interiors.py du dépôt Kiradex avec ast, reconstruit les lettres exportées comme le fait export(), parcourt dans les quatre directions depuis l’arrivée de chaque étage les lettres otsrUD (l’ensemble praticable du check() de la forge), et rapporte l’escalier, l’hôte et la cellule avant de chaque emplacement garni (la première cellule plein sud au-delà de l’étagère et du bandeau mural). Il essaie ensuite, dans room, chaque placement d’un meuble indépendant supplémentaire (10 dessins : les chaises une fois, les lits une fois) sur un sol libre à l’écart des cellules d’arrivée, d’escalier et d’hôte (733 placements ; 44 coupent l’accès à une cible, tous en la couvrant), et chaque paire sans chevauchement de meubles supplémentaires à l’écart de toutes les cibles (689 placements uniques, 229 891 paires ; 713 coupent l’accès à une cible). ↩↩↩↩↩↩↩↩↩↩

  21. Calcul de l’auteur, 5 octobre 2026 : score_max.py dans le dossier figures/ du brouillon, sorties score_max.out et score_max.json : le barème du cahier des charges additionné pour deux étages à 16 meubles, chaque ligne à son plafond (3 200 + 3 000 + 6 400 + 9 600 + 500 + 600 + 300 = 23 600), et un étage à 8 meubles sans lignes de jeu, de rampe ou d’emplacement (800 + 500 = 1 300). Le même script note, avec les lignes du barème lui-même, les trois maisons de référence qui fixent les seuils de palier proposés : les deux étages à 10 meubles avec l’étagère pleine, 4 500 ; les deux étages à 16 meubles avec l’étagère, la vitrine et le tableau pleins, 7 600 ; cette maison plus un ensemble de 8 et 70 % d’une même rampe à chaque étage, 14 000 ; et la maison de départ, les deux étages à 8, 2 600. ↩↩↩↩

  22. Apple Developer Documentation, « Syncing model data across a person’s devices » (SwiftData ; « does include a small number of features that CloudKit doesn’t support natively, such as unique constraints and nonoptional relationships » ; « CloudKit requires all relationships to be optional »), JSON de documentation enregistré le 5 octobre 2026 sous apple-swiftdata-cloudkit-sync.html et .txt, https://developer.apple.com/documentation/swiftdata/syncing-model-data-across-a-persons-devices. ↩↩↩↩↩↩

  23. pret, pokeemerald/src/new_game.c (NewGameInitData appelle ClearDecorationInventories()) et pokeemerald/src/decoration_inventory.c (ClearDecorationInventory met chaque emplacement de chaque catégorie à DECOR_NONE), commit 731ad5b, lu le 5 octobre 2026, https://github.com/pret/pokeemerald/blob/master/src/new_game.c. ↩

  24. Figures de l’auteur, 5 octobre 2026 : make_figures.py dans le dossier figures/ du brouillon, qui lit src/data/decoration/header.h de pokeemerald 731ad5b, les plafonds cités aux notes 1, 5, 8 et 7, path_rule.json et score_max.json, vérifie chaque total par rapport aux mesures ci-dessus, et écrit emerald-decor-sizes.svg, caps.svg, room-path-rule.svg et score-sources.svg. Les classes d’emprise (1 cellule, 2 cellules, 4 à 6, 8 ou 9) regroupent les formes selon le nombre de cellules couvertes. Palette vérifiée avec le validateur dataviz ; aucun graphisme de jeu. ↩↩↩↩↩

  25. pret, pokeemerald/include/constants/metatile_behaviors.h (les comportements MB_SECRET_BASE_*, MB_SLIDE_SOUTH, MB_HOLDS_SMALL_DECORATION, MB_HOLDS_LARGE_DECORATION), commit 731ad5b, lu le 5 octobre 2026, https://github.com/pret/pokeemerald/blob/master/include/constants/metatile_behaviors.h. ↩

  26. pret, pokeemerald/data/layouts/layouts.json (les 24 agencements LAYOUT_SECRET_BASE_* et les étages des deux maisons de joueur, avec largeurs et hauteurs) et le map.bin de chaque agencement, commit 731ad5b, lu le 5 octobre 2026, https://github.com/pret/pokeemerald/blob/master/data/layouts/layouts.json. Les fourchettes de largeur, de hauteur et de surface sont établies par l’auteur à partir de la sortie de la mesure. ↩

  27. Mesure de l’auteur, 5 octobre 2026 : measure_character_cell.py dans le dossier de preuves sur les pièces, sortie measure_character_cell.out, qui lit les en-têtes PNG de graphics/object_events/pics/people/brendan/walking.png (144 par 32) et decorating.png (16 par 32) dans pokeemerald, ainsi que la cellule (32 par 40), figureTop (7) et underFeet (2) dans Kiradex/Resources/World/characters.json du dépôt Kiradex. Le script mesure la cellule et la hauteur de la figure (31 pixels), pas la largeur de la figure dessinée. ↩↩↩↩↩

  28. pret, pokeemerald/src/data/items.h (ITEM_SOOT_SACK, .fieldUseFunc = ItemUseOutOfBattle_CannotUse) et pokeemerald/src/data/text/item_descriptions.h (sSootSackDesc, une description fixe de trois lignes), commit 731ad5b, lu le 5 octobre 2026, https://github.com/pret/pokeemerald/blob/master/src/data/items.h. ↩↩

  29. Nookipedia, « Furniture » (tailles « ranging from 1.0×0.5 » jusqu’à 3 par 3 ; déplacement par demi-tuile ; les types de meubles de New Horizons et le décor de plafond depuis la 2.0 ; 2 076 meubles selon la 3.0.2, dont 1 074 ajoutés par des mises à jour ; une série de « around 10 furniture items, as well as a matching wallpaper and flooring »), récupéré et enregistré le 5 octobre 2026 sous nook-furniture.html et .txt, https://nookipedia.com/wiki/Furniture. ↩↩↩↩

  30. Nookipedia, « Wallpaper » (262 papiers peints dans New Horizons selon la version 1.9.0), récupéré et enregistré le 5 octobre 2026 sous nook-wallpaper.html et .txt, https://nookipedia.com/wiki/Wallpaper. ↩

  31. Nookipedia, « Flooring » (215 dans New Horizons), récupéré et enregistré le 5 octobre 2026 sous nook-flooring.html et .txt, https://nookipedia.com/wiki/Flooring. ↩

  32. Nookipedia, « Luna » (la section New Leaf : « any changes will not be saved and items cannot be brought back to the real world » ; la section New Horizons : ses services « work the same as they do in New Leaf », et un Dream Bell Exchange Ticket d’une valeur de 5 000 clochettes pour chaque publication), récupéré et enregistré le 5 octobre 2026 sous nook-luna.html et .txt, https://nookipedia.com/wiki/Luna. ↩↩

  33. Sulake, centre d’aide Habbo, « Rooms » (« You can own 200 rooms. » ; « Wallpaper and flooring are stuck down »), récupéré et enregistré le 5 octobre 2026 sous habbo-rooms.html et .txt, https://help.habbo.com/hc/en-us/articles/360011512640-Rooms. ↩↩↩↩

  34. Sulake, centre d’aide Habbo, « What is Builders Club? » (la limite de meubles « increased by 250 » par mois d’abonnement ; l’enregistrement d’agencements personnalisés dans l’éditeur de plan) et « What can I buy in Habbo? » (« Furni limits never go down. »), corps des articles enregistrés le 5 octobre 2026 dans habbo-articles.txt, https://help.habbo.com/hc/en-us/articles/360011621659-What-is-Builders-Club et https://help.habbo.com/hc/en-us/articles/360011620599-What-can-I-buy-in-Habbo. ↩

  35. Sulake, centre d’aide Habbo, « Player to player trading in Habbo » (un pass d’échange est requis ; « There is no guide to what items of furni are worth »), corps de l’article enregistré le 5 octobre 2026 dans habbo-articles.txt, https://help.habbo.com/hc/en-us/articles/4408726781842-Player-to-player-trading-in-Habbo. ↩↩

  36. Sulake, centre d’aide Habbo, « Guidelines on user created games in Habbo » (« Placing more than three chance elements will disable all randomiser functions in the room. »), corps de l’article enregistré le 5 octobre 2026 dans habbo-articles.txt, https://help.habbo.com/hc/en-us/articles/360011513060-Guidelines-on-user-created-games-in-Habbo. ↩

  37. Sulake, API de recherche du centre d’aide Habbo, jeux de résultats pour « furni », « stack » et « floor plan », enregistrés le 5 octobre 2026 sous habbo-search-furni, habbo-search-stack et habbo-search-floorplan (.html et .txt) dans le dossier de preuves sur les pièces ; aucun n’indique une taille de grille, une hauteur d’empilement ou une limite de meubles par pièce. ↩

  38. billsonnn, nitro-react/src/components/floorplan-editor/common/Constants.ts (MAX_NUM_TILE_PER_AXIS = 64, HEIGHT_SCHEME = 'x0123456789abcdefghijklmnopq', 27 niveaux de hauteur après le x vide), un client Habbo tiers open source, tel que cité dans l’article sur les structures le 3 octobre 2026, https://github.com/billsonnn/nitro-react/blob/main/src/components/floorplan-editor/common/Constants.ts. La plage de l’outil de hauteur d’empilement (0 à 40 par pas de 0,01) vient de mes notes antérieures, lue dans le même client et non relue le 5 octobre 2026. ↩

  39. Blake Crosley, « Pixel-Art Structures: Houses, Halls and Interiors on iPhone », blakecrosley.com, 3 octobre 2026 (les intérieurs « each 14 by 11, with a two-row wall band » ; les builds 22, 23 et, dans l’addendum du soir, 35 ; « Rooms have no wallpaper or floor choice and no placeable furniture; the house is dressed from the collection and nothing else » ; les téléportations room:npc-… ; le maillage d’objets ; la ferme de Stardew de « 10×7 » à l’intérieur, note 54 ; les constantes de Nitro, note 62), https://blakecrosley.com/blog/pixel-art-structures-on-iphone. ↩↩↩↩↩↩↩↩

  40. Mesure de l’auteur, 5 octobre 2026 : measure_sdv_catalogue.py dans le dossier de preuves sur les pièces, sortie measure_sdv_catalogue.out : lignes de meubles comptées par section à partir du lien de nom de chaque ligne sur la page Furniture enregistrée (rév. 193159), en ignorant la section Movie Posters, dont les lignes utilisent un autre balisage, ainsi que les sections References, History et Exploits ; papiers peints et sols comptés comme icônes distinctes sur les pages Wallpaper (rév. 193801) et Flooring (rév. 190285) enregistrées ; lignes citant le catalogue de meubles comme source comptées par son lien. Décomptes de lignes et d’icônes du wiki, pas des fichiers de données du jeu. ↩↩↩↩

  41. Stardew Valley Wiki, « Wallpaper », révision 193801 (« Wallpapers are single-use and do not stack. They cover the whole room they’re placed in » ; « the character must be facing up by its wall »), récupéré et enregistré le 5 octobre 2026 sous sdv-wallpaper.html et .txt, https://stardewvalleywiki.com/Wallpaper. ↩↩↩↩

  42. Stardew Valley Wiki, « Flooring », révision 190285, récupéré et enregistré le 5 octobre 2026 sous sdv-flooring.html et .txt, https://stardewvalleywiki.com/Flooring. ↩

  43. Club Penguin Wiki (Fandom), « Igloo » (l’historique : le 1er novembre 2005, des igloos pour les joueurs sans abonnement, qui « were unable to decorate them with furniture » ; le 26 juillet 2012, la nouvelle expérience d’igloo et « a set of six items available without membership »), lu via l’API MediaWiki et enregistré le 5 octobre 2026 sous cp-fandom-igloo.html et .txt, https://clubpenguin.fandom.com/wiki/Igloo. Les billets de blog officiels archivés qu’il cite ont renvoyé HTTP 429 depuis la Wayback Machine, deux fois, le 5 octobre 2026. Source unique. ↩↩

  44. Club Penguin Wiki (Fandom), « Igloo Contests » (le premier concours dans le numéro 9, le 15 décembre 2005, un gagnant à 5 000 pièces ; les gagnants « After one to four weeks » ; des personnages comme juges à partir du concours d’Halloween 2008 ; le bouton de soumission à partir de 2009 ; le dernier concours en décembre 2012 ; les dix gagnants à 25 000 pièces et les vingt finalistes à 15 000 du Ye Olde Igloo Contest de 2008), lu via l’API MediaWiki et enregistré le 5 octobre 2026 sous cp-fandom-contests.html et .txt, https://clubpenguin.fandom.com/wiki/Igloo_Contests. Source unique. ↩

  45. Tristan Donovan, « The Replay Interviews: Will Wright », Game Developer, 23 mai 2011, récupéré et enregistré le 5 octobre 2026 sous gd-replay-wright.html et .txt, https://www.gamedeveloper.com/business/the-replay-interviews-will-wright. Aucune conférence enregistrée de Wright datant de 1999 ou 2000 sur le mode construction n’a été trouvée. ↩↩

  46. The Sims Wiki (Fandom), « Buy mode » (« purchase items from an object catalog and place them on the current lot » ; le classement par fonction dans The Sims et The Sims 2 ; la phrase sur l’emprise verte et rouge, rattachée sur la page à The Sims 2 et The Sims 3), lu via l’API MediaWiki et enregistré le 5 octobre 2026 sous sims-fandom-buymode.html et .txt, https://sims.fandom.com/wiki/Buy_mode. Source unique. ↩↩↩

  47. The Sims Wiki (Fandom), « Environment » (le besoin Room et Environment, qui « analyzes the design and content of the room that the Sim is currently standing in »), lu via l’API MediaWiki et enregistré le 5 octobre 2026 sous sims-fandom-environment.html et .txt, https://sims.fandom.com/wiki/Environment. Source unique. ↩

  48. Extraction de l’auteur, 5 octobre 2026 : measure_apple_docs.py dans le dossier de preuves sur les pièces, sortie measure_apple_docs.out : titre, déclaration, résumé et plateformes de chaque page JSON de documentation Apple enregistrée. Les champs d’obsolescence cités pour dropDestination(for:action:isTargeted:) ont été lus dans le même JSON enregistré. ↩

  49. Apple Developer Documentation, Model() (macro SwiftData ; « Converts a Swift class into a stored model that’s managed by SwiftData » ; iOS 17.0), JSON enregistré le 5 octobre 2026 sous apple-swiftdata-model.html et .txt, https://developer.apple.com/documentation/swiftdata/model(). ↩

  50. Apple Developer Documentation, Unique(_:) (macro SwiftData ; « Specifies the key-paths that SwiftData uses to enforce the uniqueness of model instances » ; iOS 18.0), JSON enregistré le 5 octobre 2026 sous apple-swiftdata-unique.html et .txt, https://developer.apple.com/documentation/swiftdata/unique(_:). ↩

  51. Dépôt Kiradex, Kiradex/Models/CardCopy.swift (commentaire de documentation : « every property has a default and nothing is unique, for CloudKit »), lu le 5 octobre 2026. ↩↩↩

  52. Dépôt Kiradex, Kiradex/Models/PriceHistory.swift (commentaire de documentation : « Shaped for CloudKit like CollectionEntry: defaults everywhere, nothing unique » ; PriceBook fusionne les historiques de deux appareils « into the one with the smallest uid »), lu le 5 octobre 2026. ↩↩↩↩

  53. Apple Developer Documentation, draggable(_:) (SwiftUI ; « Activates this view as the source of a drag and drop operation » ; une charge Transferable ; iOS 16.0), JSON enregistré le 5 octobre 2026 sous apple-swiftui-draggable.html et .txt, https://developer.apple.com/documentation/swiftui/view/draggable(_:). ↩↩

  54. Apple Developer Documentation, dropDestination(for:action:isTargeted:) (SwiftUI ; une action de type ([T], CGPoint) -> Bool, le second paramètre étant « the drop location in this view’s coordinate space » ; iOS 16.0 ; l’entrée de plateforme iOS indique deprecatedAt 27.2 avec le message « Use dropDestination(for:isEnabled:action:) with an action that takes a DropSession parameter instead. » ; la référence à DropSession, « A description of a drop that is in progress »), JSON enregistré le 5 octobre 2026 sous apple-swiftui-dropdestination.html et .txt, https://developer.apple.com/documentation/swiftui/view/dropdestination(for:action:istargeted:). ↩↩↩↩↩

  55. Apple Developer Documentation, DragGesture (SwiftUI ; « A dragging motion that invokes an action as the drag-event sequence changes » ; iOS 13.0), JSON enregistré le 5 octobre 2026 sous apple-swiftui-draggesture.html et .txt, https://developer.apple.com/documentation/swiftui/draggesture. ↩↩

  56. Apple Developer Documentation, SpatialTapGesture (SwiftUI ; « A gesture that recognizes one or more taps and reports their location » ; iOS 16.0), JSON enregistré le 5 octobre 2026 sous apple-swiftui-spatialtap.html et .txt, https://developer.apple.com/documentation/swiftui/spatialtapgesture. ↩↩

  57. Apple Developer Documentation, accessibilityElement(children:) (SwiftUI ; iOS 13.0), JSON enregistré le 5 octobre 2026 sous apple-swiftui-accessibilityelement.html et .txt, https://developer.apple.com/documentation/swiftui/view/accessibilityelement(children:). ↩↩

  58. Apple Developer Documentation, accessibilityAction(named:_:) (SwiftUI ; « Actions allow assistive technologies, such as the VoiceOver, to interact with the view by invoking the action » ; iOS 16.0), JSON enregistré le 5 octobre 2026 sous apple-swiftui-accessibilityaction-named.html et .txt, https://developer.apple.com/documentation/swiftui/view/accessibilityaction(named:_:). ↩↩↩↩

  59. Apple Developer Documentation, accessibilityAdjustableAction(_:) (SwiftUI ; un gestionnaire qui reçoit une AccessibilityAdjustmentDirection ; iOS 13.0), JSON enregistré le 5 octobre 2026 sous apple-swiftui-adjustable.html et .txt, https://developer.apple.com/documentation/swiftui/view/accessibilityadjustableaction(_:). ↩↩

  60. Apple Developer Documentation, accessibilityRotor(_:entries:) (SwiftUI ; « Create an Accessibility Rotor with the specified user-visible label » ; iOS 16.0), JSON enregistré le 5 octobre 2026 sous apple-swiftui-accessibilityrotor.html et .txt, https://developer.apple.com/documentation/swiftui/view/accessibilityrotor(_:entries:). ↩↩↩↩

  61. Apple Developer Documentation, AccessibilityNotification.Announcement (Accessibility ; « A notification that an app posts when it needs to convey an announcement to an assistive app » ; iOS 17.0), JSON enregistré le 5 octobre 2026 sous apple-swiftui-accessibilitynotification.html et .txt, https://developer.apple.com/documentation/accessibility/accessibilitynotification/announcement. ↩↩↩↩

  62. Apple Developer Documentation, performAccessibilityAudit(for:_:) (XCUIAutomation, XCUIApplication ; iOS 17.0 ; le JSON indique Xcode 16.3 et ne comporte aucun résumé), JSON enregistré le 5 octobre 2026 sous apple-xctest-accessibilityaudit.html et .txt, https://developer.apple.com/documentation/xcuiautomation/xcuiapplication/performaccessibilityaudit(for:_:). ↩↩↩

  63. Apple, en-têtes du framework XCUIAutomation dans Xcode 27.0 (build 27A266a), plateforme iPhone Simulator, lus le 5 octobre 2026 : XCUIApplication.h (performAccessibilityAuditWithAuditTypes:issueHandler:error:, « Runs an accessibility audit on the current view ») ; XCUIVoiceOverService.h (« Provides programmatic control of VoiceOver for UI testing » ; activer, désactiver, avancer, reculer, entrer et sortir, et l’énoncé courant ; iOS 27.0) ; XCUIDevice.h (la propriété voiceOverService, iOS 27.0). Une recherche dans tous les en-têtes du framework portant sur les actions personnalisées, les rotors et les annonces n’a rien trouvé. ↩↩↩

  64. Dépôt Kiradex, scripts/forge/interiors.py (la docstring du module, y compris « every piece at least two tiles on one axis » ; les cartes en lettres ROOM, ROOM_UP et HALL, listes de meubles, emplacements et téléportations ; le commentaire de host, « where the owner stands when you visit » ; PIECES, FACES, EXPORT_LETTERS, export() et check(), dont les vérifications d’emplacement couvrent l’arrivée, l’escalier, l’hôte, l’étagère, la vitrine, le bureau et les socles mais pas le tableau mural, et dont la boucle de chevauchement lit data["objects"], les meubles indépendants exportés), lu le 5 octobre 2026, jamais exécuté. ↩↩↩↩↩↩↩↩↩↩↩↩↩

  65. Dépôt Kiradex, docs/TestFlight.md, point 46 (« Build 26: the interior kit. Rooms sixteen wide with a three-row wall band (cornice, face, wainscot) »), lu le 5 octobre 2026. La build n’est pas datée dans le fichier ; elle se situe entre la build 23 et la build 35, que l’article sur les structures date toutes deux du 3 octobre 2026. ↩↩

  66. Calcul de l’auteur, 5 octobre 2026 : merge_regression.py dans le dossier figures/ du brouillon, sortie merge_regression.out. Sur room tel que la forge le conçoit (13 meubles mobiles, lus dans path_rule.json et, avec ast, dans scripts/forge/interiors.py du dépôt Kiradex), un lit seul en (9,3) et une table de chevet seule en (6,4) passent chacun les règles de cellule, le plafond et le parcours ; ensemble, ils coupent l’accès à (7,3) et (8,3), les deux cellules devant la vitrine. Une réparation qui trie les deux par uid et ajoute chacun via la vérification complète garde le plus petit uid et renvoie l’autre, avec le même résultat pour les deux ordres d’entrée et pour les deux attributions de uid. Que chacune des 713 paires qui coupent un accès soit légale meuble par meuble découle de measure_path_rule.out : aucun placement unique à l’écart des cibles n’en coupe une. ↩↩↩↩↩

  67. Dépôt Kiradex, docs/WORLD.md (section 4 : les « clothes, hats, backpacks, card-display frames and emotes » de la boutique, level = floor(sqrt(XP / 40)) + 1, des cosmétiques verrouillés par niveau « that cannot be bought », les pins dont Full Set, Vintage et Across the Sea ; le collectionneur comme « a 30-pixel figure in a 32 × 40 cell »), lu le 5 octobre 2026 ; recherche faite sur sixteen, cap, decoration, furnishing, Sunday, once a day et read-only, dont aucun n’énonce une règle de pièce. ↩↩↩↩↩↩

  68. Dépôt Kiradex, server/app/rooms.py (docstring du module : « Everything here is in memory; a room empties when its last collector leaves and nothing of them is kept. »), lu le 5 octobre 2026. ↩↩↩↩

  69. Dépôt Kiradex, docs/research/pixel-art/06-collecting-and-hubs.md, section 5.3 (« Rooms: a budget, a Sunday letter, and a like that never goes down » : le plafond de 16, la lettre du dimanche comme « a pixel object that appears on the doormat », les visites en lecture seule, un like une fois par visiteur et par jour, « a stamp on their passport per room visited, with ranks at 30 / 100 / 500 ») et section 5.7 (les objets de mécène comprennent « one room skin » et ne sont « never a bigger furnishing cap »), lu le 5 octobre 2026. ↩↩↩↩↩

  70. Dépôt Kiradex, Kiradex/World/Quests.swift (Quest.current(on:calendar:), indexé par l’intervalle weekOfYear du calendrier, qui commence au premier jour de la semaine propre au calendrier) et Kiradex/World/HallView.swift (le commentaire « The week’s theme is the week’s quest », et le thème lu comme le titre de la quête hebdomadaire), lus le 5 octobre 2026. ↩↩↩

  71. Dépôt Kiradex, docs/PROTOTYPES.md (la question posée aux testeurs du prototype de quête hebdomadaire, « Weekly reset on your calendar’s week: say if it feels wrong. »), lu le 5 octobre 2026. ↩

  72. Calcul de l’auteur, 5 octobre 2026 : layout_size.py dans le dossier figures/ du brouillon, sortie layout_size.out : le nombre de types, 21 issus de la forge actuelle (17 types de sol et 4 objets muraux) et 3 nouveaux en section 7.5, 24 en tout ; l’agencement de maison stocké (deux étages, 16 meubles chacun avec type, x, y et orientation, deux identifiants de style par étage) en JSON compact à clés nommées, chaque type fixé au nom proposé le plus long (pressed_flower, 14 caractères) et chaque identifiant de style à 16 caractères, 1 974 octets ; le même avec chaque type complété à 16 caractères, 2 038 octets ; de simples quadruplets d’entiers pour 32 meubles, 385 octets. ↩↩

  73. Dépôt Kiradex, Kiradex/World/PlazaStage.swift (@AppStorage("plaza.id"), « Who this device is to the plaza » ; @AppStorage("quests.stamps"), les tampons de quête sous forme de liste séparée par des virgules, lue aussi par QuestBoardView et MeView ; @AppStorage("plaza.ribbons"), « Ribbons from the town’s collectors »), lu le 5 octobre 2026 ; une recherche dans les sources Swift de l’app d’un compte de pas stocké ou d’un registre des pièces visitées n’a rien trouvé, pas plus qu’une recherche dans l’app et le serveur d’un podomètre, d’un type de compte de pas ou d’un passeport (les seuls steps sont des chemins de marche dans TileMap.swift et PlazaRig.swift). ↩↩↩↩↩

  74. Dépôt Kiradex, Kiradex/Models/Progression.swift (le commentaire de documentation de Progression : l’expérience, le niveau et les pins sont « worked out from the collection as it is, so every device agrees without anything being stored »), lu le 5 octobre 2026. ↩↩

  75. Apple Developer Documentation, AppStorage (SwiftUI ; « A property wrapper type that reflects a value from UserDefaults » ; iOS 14.0), JSON enregistré le 5 octobre 2026 sous apple-swiftui-appstorage.html et .txt, https://developer.apple.com/documentation/swiftui/appstorage. ↩↩

  76. Calcul de l’auteur, 5 octobre 2026 : skin_denominator.py dans le dossier figures/ du brouillon, sortie skin_denominator.out, à partir des lignes de rampe du cahier des charges : un étage de 16 meubles, dont 15 et le style de sol dans une même famille de rampes et le mur en dehors, donne 16 sur 18 (88,9 %), 1 600 points sur la ligne à 70 % ; en retirant le mur de la proportion, on obtient 16 sur 17 (94,1 %), 4 800 points sur la ligne à 90 %, soit 3 200 de plus. ↩

  77. Dépôt Kiradex, Kiradex/Models/Profile.swift (var lookData: Data = Data() sur le profil synchronisé ; var uid: String = "", fixé à UUID().uuidString dans init(handle:), comme PriceHistory et CardCopy portent aussi un uid ; ModelContext.profile(), lignes 224 à 237, récupère les profils triés par uid, garde le premier et supprime les autres, le commentaire parlant d’une fusion vers le plus petit uid), lu le 5 octobre 2026. ↩↩↩

Articles connexes

Pixel-Art Structures: Houses, Halls and Interiors on iPhone

How Pokémon, the SNES RPGs and Stardew build houses, interiors and floors, measured from source, and how Kiradex's town …

80 min de lecture

Pixel-Art Routes: Map Connections and Districts on iPhone

How Pokémon, Stardew and Animal Crossing build the land between towns, measured from source: routes, seams, gates, map s…

110 min de lecture

Préparer votre app pour l'iPhone Duo : un exemple complet

Préparer et soumettre une app pour l'iPhone Duo : le tampon de SDK qui active la mise en page, une vraie app dans chaque…

75 min de lecture