Habitaciones en pixel art: cuadrículas de muebles, topes y puntuación
Una habitación decorada en Pokémon Emerald son dieciséis cosas sobre una cuadrícula de celdas de 16 pixeles. El código descompilado pone un tope de 16 decoraciones colocadas en la base de un jugador y de 12 en el dormitorio, y guarda hasta 20 bases en la partida, la tuya y las de otros jugadores.12 El catálogo tiene 120 decoraciones en ocho categorías: 35 muñecos, 23 adornos, 18 alfombras, 10 pósteres, 10 cojines, 9 escritorios, 9 sillas y 6 plantas. 71 de ellas ocupan una sola celda, la media es de 2,43 celdas, y 18 son superficies que sostienen a las pequeñas.23 Una base mide de 44 a 81 celdas transitables, 60,2 de media, así que el tope equivale a más o menos una cuarta parte del suelo. La colocación es una pregunta que responde cada celda cubierta, y nada en la función de colocación comprueba que sobreviva un camino.24 Tres juegos posteriores de este artículo aplican ese modelo con otros presupuestos: 150 objetos por habitación en Animal Crossing: New Horizons, según Nookipedia, con una carta de los domingos que califica la habitación; de 150 a 600 en interiores en Final Fantasy XIV desde el parche 7.5, según el tipo de vivienda; 99 en un iglú de Club Penguin, según una sola fuente de fans.5678 Mi app, Kiradex, tiene habitaciones que su forja de arte amuebla con un vocabulario de 23 piezas, ninguna de las cuales puede mover el jugador. Este artículo mide el canon, enuncia las reglas con sus números, las traslada a SwiftData y SwiftUI, y termina con el encargo de un sistema de amueblado que Kiradex todavía no ha construido: un tope de 16 por planta, una regla de camino que la función de colocación de Emerald no tiene, una puntuación semanal con cada punto desglosado y un catálogo que solo se desbloquea jugando.910
Lo esencial
- Dieciséis es un presupuesto de composición, no un límite de almacenamiento. Emerald coloca 16 decoraciones en una base y 12 en el dormitorio, pero tiene espacio para 150 decoraciones en propiedad repartidas en ocho compartimentos por categoría, así que el jugador puede tener más de lo que cabe. Cada decoración colocada cuesta dos bytes, un id y una posición con x e y como nibbles, de modo que la distribución completa de una base ocupa 32 bytes.111122
- Las reglas viven en el suelo. Emerald tiene cinco permisos de colocación (suelo, suelo que se pisa, detrás, pared y sobre una superficie). Las celdas superiores de un escritorio llevan un comportamiento que permite apoyar en ellas una decoración pequeña, así que en cuanto el escritorio está puesto, se le puede subir un muñeco. 18 decoraciones sostienen cosas pequeñas y 14 sostienen cosas grandes. El dormitorio solo acepta muñecos y cojines.1324
- Los topes suben con la plataforma, y uno de ellos es además un presupuesto de fotogramas. Animal Crossing permite 24 objetos por habitación en Wild World, 64 en City Folk, 48 en New Leaf y 150 en New Horizons, según Nookipedia. Final Fantasy XIV aumentó en la mitad los límites de interior en el parche 7.5, de 150 a 600, y las notas añaden que por encima de 400 muebles en pantalla, los de otra planta dejan de dibujarse.57
- Una puntuación tiene fuentes desglosadas, un día fijo y un listón que sube con la casa. La tabla de Nookipedia de la Academia de Interiorismo Feliz (Happy Home Academy) paga 1.000 puntos al llegar a 6, 10, 15 y 20 objetos en una habitación, más bonificaciones por serie, conjunto, categoría, color y feng shui, y sube el umbral de la S de 15.000 a 90.000 a medida que crece la casa. La página no cita ninguna fuente para esos números de New Horizons.6
- Los catálogos crecen comprando, jugando o de las dos maneras. En Emerald, 90 de las 120 decoraciones se venden por dinero, 24 nunca se venden (premios, puntos de batalla y regalos) y otras dos cuestan 6.000 y 8.000 de ceniza recogida paso a paso. Stardew vende un surtido diario aleatorio; después de la primera mejora de la casa, Robin vende además el Catálogo de muebles (Furniture Catalogue) por 200.000g, que a partir de ahí vende por 0g y en cantidad ilimitada los muebles que lista, aunque algunas piezas siguen saliendo solo del Museo, de los festivales y de otras fuentes. Habbo vende muebles, y parte de ellos son escasos o aleatorios a propósito.14151617
- Los visitantes miran y no tocan. Un visitante de Animal Crossing puede usar los muebles de la casa de otro jugador, pero no puede «modify the interior in any way» (modificar el interior de ningún modo). Los visitantes de Habbo no pueden soltar ni mover muebles sin los permisos del dueño. Club Penguin permite un «me gusta» por diseño y por día, y su Grand Total (total general) «will never decrease» (nunca bajará), según una copia de fans de sus páginas de ayuda.51819
- Lo que esto le da a Kiradex. Un encargo, no una función publicada: colocación por celda para 20 de las 23 piezas de la forja; una regla de camino desde la puerta hasta la escalera, el anfitrión y una celda frontal de cada grupo expositivo, comprobada con una caminata; 16 piezas por planta, con las habitaciones iniciales entregadas con 8; seis papeles pintados y seis suelos dibujados por la forja; una carta de los domingos con cada fuente de puntos impresa (23.600 como máximo); un catálogo que se desbloquea jugando, a partir de los niveles y los pines que existen hoy, derivado de la colección sincronizada, de los sellos de misión que la app registra en el dispositivo y de tres contadores sincronizados nuevos para pasos, visitas a habitaciones y el grado de la casa en la carta; visitas de solo lectura en cuanto el servidor pueda guardar una distribución; un modelo de SwiftData sin restricción de unicidad, porque la sincronización con CloudKit no puede imponer una; y una colocación por arrastre que VoiceOver puede hacer sin tocar la pantalla.9202122
1. Emerald: dieciséis cosas sobre una cuadrícula, medidas en el código
La versión completa más pequeña de este género es el sistema de decoración de Pokémon Ruby, Sapphire y Emerald, y casi todo él son datos. Lo leí en la descompilación de Emerald de pret, en el commit 731ad5b (del 1 de octubre de 2026), con dos scripts que analizan el código y nunca ejecutan el juego: uno para el catálogo, los topes, las superficies que sostienen y los tamaños de las salas, y otro para la procedencia de cada decoración. Sus salidas están guardadas junto a ellos.214 Cada número de esta sección sale de esas dos salidas o del archivo fuente que nombra una nota.
Los topes
Tres constantes fijan los límites. DECOR_MAX_SECRET_BASE vale 16, DECOR_MAX_PLAYERS_HOUSE vale 12 y SECRET_BASES_COUNT vale 20, el número de bases que guarda la partida: la tuya y las recibidas de otros jugadores.12 El tope de lo que colocas está separado del tope de lo que posees. La partida guarda 150 decoraciones en propiedad en compartimentos por categoría: 10 escritorios, 10 sillas, 10 plantas, 30 adornos, 30 alfombras, 10 pósteres, 40 muñecos y 10 cojines.112 Así que el jugador puede poseer más de lo que cabe en una habitación (una partida nueva empieza con todos los compartimentos vacíos), y elegir qué entra es el juego.23
Una decoración colocada cuesta dos bytes. Una base guarda decorations[16], un id cada una, y decorationPositions[16], un byte cada una, con x en el nibble alto e y en el bajo, de modo que una base se direcciona como una cuadrícula de 16 por 16 celdas como máximo, y la distribución completa de una base cabe en 32 bytes.1112 Leo ese tamaño como la razón por la que la partida puede guardar veinte bases, la tuya y las de otros jugadores.
El catálogo
gDecorations[] tiene 121 entradas. La entrada 0, DECOR_NONE, es una ranura vacía que reutiliza los datos del escritorio pequeño, lo que deja 120 decoraciones con ids del 1 al 120.32 Por categoría son 35 muñecos, 23 adornos, 18 alfombras, 10 pósteres, 10 cojines, 9 escritorios, 9 sillas y 6 plantas.2 Por forma, en celdas, hay 71 de 1 por 1, 22 de 1 por 2, 13 de 3 por 3, 5 de 2 por 1, 4 de 2 por 2, 3 de 3 por 2, y una de 2 por 4 y otra de 4 por 2. La cabecera declara también 3 por 1 y 1 por 3, que ninguna decoración usa. Una decoración cubre de 1 a 9 celdas, 2,43 de media.213 Si se cuenta la ranura vacía como decoración, como hacían mis notas anteriores para el artículo de estructuras, salen 72 piezas de una celda y 19 de suelo sólido; sin ella, las cifras son 71 y 18.2
La mayor parte del catálogo de Emerald ocupa una celda; las piezas grandes son los escritorios, las alfombras de 3 por 3 y unos cuantos adornos.243
Los precios de la tabla van de 500 para las alfombras más baratas a 10.000 para los adornos y muñecos más caros. Tres tienen precio 0, dos escudos y un adorno de cristal, y los tres son premios.23
Cinco permisos, y superficies que son datos
Cada decoración lleva uno de cinco permisos. La cabecera los describe como «collision and placement permissions, in that order» (permisos de colisión y de colocación, en ese orden).13 Por número:
| Permiso | Qué significa | Decoraciones |
|---|---|---|
| Suelo sólido | bloquea el paso, se apoya en el suelo | 18: los 9 escritorios, 9 adornos |
| Suelo pisable | se camina por encima, se apoya en el suelo | 37: las 18 alfombras, las 9 sillas, 10 adornos |
| Suelo detrás | bloquea, y su fila superior puede quedar sobre la pared del fondo | 10: las 6 plantas, 4 adornos |
| Pared | cuelga de la pared del fondo | 10: los 10 pósteres |
| Sprite | una figura que se apoya en una superficie | 45: los 35 muñecos, los 10 cojines |
Recuentos de measure_emerald_decor.py sobre src/data/decoration/header.h.2
Lo más ingenioso es que una superficie es una propiedad de una celda, no un fragmento de código. Cada decoración se dibuja con metatiles, y cada metatile lleva un byte de comportamiento. Dieciocho decoraciones tienen celdas con el comportamiento MB_HOLDS_SMALL_DECORATION: 7 de los 9 escritorios, 3 ladrillos, un neumático y 7 alfombras. Catorce tienen MB_HOLDS_LARGE_DECORATION: los mismos 7 escritorios y 7 alfombras.2 Un muñeco de 1 por 2 necesita debajo una celda «grande»; cualquier otro muñeco o cojín admite una celda «pequeña» o una «grande».4 Así que, una vez colocado un escritorio, el suelo tiene celdas nuevas que responden «sí» a un muñeco, y la misma función de colocación se encarga de ambos casos. Así es como 16 objetos hacen que una habitación parezca llena: 45 de los 120, los sprites, se apoyan en 18 piezas que hacen de superficie.2
Algunas decoraciones, además, hacen algo. Ocho alfombras musicales suenan al pisarlas; una alfombra de salto, una giratoria y una brillante hacen lo que dicen; tres globos y una bola de barro revientan; hay una puerta que se rompe, un tobogán y un adorno de arena. Cada una es un comportamiento en los metatiles de la decoración (MB_SECRET_BASE_SOUND_MAT, _JUMP_MAT, _SPIN_MAT, _GLITTER_MAT, _BALLOON, _BREAKABLE_DOOR, MB_SLIDE_SOUTH, _SAND_ORNAMENT), leído del archivo de atributos del tileset de la base secreta.225
La colocación es una pregunta que responde cada celda
CanPlaceDecoration, en src/decoration.c, recorre las celdas que cubriría la decoración que tienes en la mano y le hace una pregunta a cada una. Las piezas de suelo y de suelo pisable necesitan suelo liso (MB_NORMAL) bajo cada celda; solo la tabla sólida puede tapar un agujero. Ningún objeto puede estar sobre la celda. La pieza puede cubrir la celda en la que estaba el jugador al abrir el menú solo con un tile del tipo de capa normal; la función la rechaza ahí cuando su propio tile en esa celda tiene cualquier otro tipo de capa. Una pieza de suelo detrás necesita suelo bajo todas sus filas salvo la superior, que puede quedar sobre la pared norte. Una pieza de pared necesita que todas sus celdas sean pared norte. Un sprite necesita debajo una celda que sostenga.4 En el dormitorio, el menú rechaza todas las categorías salvo muñecos y cojines: DecorationItemsMenuAction_AttemptPlace muestra gText_CantPlaceInRoom cuando isPlayerRoom está activado.4
Nada en CanPlaceDecoration comprueba que sobreviva un camino. La única protección que la función le da a la caminata es esa regla condicional sobre la celda en la que estabas. Según mi lectura de esa función, un jugador puede tapiar la computadora de la base con escritorios y el juego se lo permite.4 Vuelvo a esto en el encargo, porque una habitación que visitan otras personas necesita la comprobación que esta función no hace.
Las salas contra las que se mide el tope
Las 24 distribuciones de base son seis estilos en cuatro tamaños cada uno. Medidas con paredes a partir de cada map.bin, tienen de 7 a 17 celdas de ancho y de 7 a 17 de fondo, de 99 celdas (11 por 9) a 196 (14 por 14), con las alargadas en 7 por 16, 10 por 17 y 17 por 8.226 Las celdas transitables, leídas de los bits de colisión de cada distribución, van de 44 a 81, 60,2 de media.2 El tope de 16 es 0,27 del suelo transitable de una base media.2 El dormitorio, la segunda planta de las dos casas del jugador, mide 9 por 8 con 54 celdas transitables, y su tope es 12.21
El suelo por sí solo exagera la sensación de abarrotamiento, porque muchas de las 16 son alfombras que se pisan o muñecos de pie sobre escritorios. El tope presupuesta la composición, no el suelo.
La celda frente al personaje
La hoja de caminata del jugador mide 144 por 32 pixeles, nueve fotogramas de 16 por 32, así que el fotograma del personaje tiene una celda de ancho y dos de alto sobre la cuadrícula de metatiles de 16 pixeles. La postura de decorar es un único fotograma de 16 por 32.27 La celda de la cuadrícula es el ancho del fotograma, y cada decoración se dimensiona en esa unidad.
Cómo crece el catálogo
El script de procedencias buscó cada constante de decoración en los scripts de tiendas, premios y regalos. 90 de las 120 se venden por dinero en cinco tiendas. Tres se canjean en el mostrador de premios, quince se canjean por puntos de batalla y diez las entrega un script: otra vez los tres objetos del mostrador de premios, dos tiendas de campaña por resolver una casa de acertijos, un adorno del piso superior de un museo, dos escudos del anfitrión de la instalación de combate y dos muñecos de unos vecinos. Veinticuatro se ganan y nunca se venden por dinero.14
Otras dos se compran caminando. Un taller de vidrio cambia una silla por 6.000 y un escritorio por 8.000 de ceniza, y la ceniza se recoge a razón de una unidad por paso entre la hierba cubierta de ceniza mientras el jugador lleva el saco, hasta 9.999 (VAR_ASH_GATHER_COUNT).15 Leo esa pareja como la versión más pura del desbloqueo jugando que hay en el canon: no cambia de manos ningún dinero, solo pasos. El saco no muestra ningún contador. Su uso en el campo es la función de los objetos que no se pueden usar, y su descripción es un texto fijo sobre recoger y guardar ceniza volcánica.28 Fuera del propio contador de pasos, solo el script del taller lee la cifra: cuando al jugador le falta ceniza, resta lo recogido del precio y le dice la diferencia como un número de pasos que todavía tiene que caminar.15
Cuatro decoraciones, tres muñecos legendarios y otro muñeco, no aparecen en ningún script de tienda, premio o regalo de los que cubrió la búsqueda. Puede que lleguen por intercambio o por una función de conexión; no las rastreé, y las cifras de 90 vendidas y 24 solo ganables se apoyan en una búsqueda en los scripts de tiendas, premios y regalos con esas cuatro sin rastrear.14
Lo que enseña Emerald
Un sistema de decoración son tres tablas y una función: una fila de catálogo por pieza (permiso, forma, categoría, precio, metatiles), una distribución cuyas celdas dicen qué son (suelo, pared norte, agujero), un inventario en propiedad mayor que el tope de colocación, y una comprobación de colocación que le hace una pregunta a cada celda cubierta. Las superficies son celdas que responden «sí» a una pieza más pequeña. El tope cuenta piezas colocadas y nada más. El hueco es la caminata: la función de colocación comprueba celdas, nunca caminos.
2. Animal Crossing: 150 objetos y una carta los domingos
Esta sección se apoya en Nookipedia, una wiki de fans, leída y guardada el 5 de octubre de 2026; no busqué las cifras de la propia Nintendo. Donde la wiki no cita nada, lo digo.56
El tope y las habitaciones
Todos los juegos de la serie ponen tope a los objetos de una habitación, y el tope ha ido creciendo. Nookipedia da 24 «furniture and clothing items» (muebles y prendas) por habitación en Wild World, 64 en City Folk y 48 en New Leaf. Para New Horizons: «A maximum of 150 items can be placed in each room of the house, including wall and ceiling-mounted furniture.» (Se pueden colocar como máximo 150 objetos en cada habitación de la casa, incluidos los muebles de pared y de techo.)5
Las habitaciones de New Horizons, según la tabla de ampliaciones de la misma página: la tienda de campaña mide 4 por 4; la casa, 6 por 6; la ampliación de la habitación principal la deja en 8 por 8; las habitaciones del fondo, izquierda y derecha miden 6 por 6 cada una; la segunda planta y el sótano, 10 por 6. «Unlike previous games, only the main room can be expanded in size, as all other rooms have a fixed size.» (A diferencia de los juegos anteriores, solo la habitación principal puede ampliarse, porque las demás tienen un tamaño fijo.)5 Con 150 objetos en una habitación de 6 por 6, salen 4,2 objetos por tile de suelo, algo que solo funciona porque las paredes, los techos y la parte superior de otros muebles admiten objetos sin gastar suelo (mi aritmética a partir de las dos cifras).529
Los muebles ocupan «a size in tiles that it takes up when placed, ranging from 1.0×0.5» (un tamaño en tiles al colocarse, desde 1.0×0.5) hasta 3 por 3, y en New Horizons «can also now be pushed in half-tile increments» (ahora también pueden empujarse de medio tile en medio tile).29 New Horizons los clasifica en enseres, objetos varios que van en el suelo o sobre una superficie, piezas de pared y decoración de techo, que llegó con la versión 2.0.29 De los juegos cuya cuadrícula de colocación lee este artículo (las celdas de Emerald, los tiles de Stardew y los de New Horizons), solo New Horizons mueve los muebles menos de un tile entero. No leí la cuadrícula de colocación de FFXIV, y los pasos más finos que se citan para Habbo son alturas de apilado de un cliente de terceros (sección 3).
El catálogo
A la versión 3.0.2, Nookipedia cuenta 2.076 muebles en New Horizons, 1.074 de ellos añadidos en actualizaciones. Una serie son «around 10 furniture items, as well as a matching wallpaper and flooring» (unos 10 muebles, más un papel pintado y un suelo a juego).29 La wiki cuenta 262 papeles pintados a la versión 1.9.0 y 215 suelos.3031 El papel pintado y el suelo cambian por habitación, y la versión 2.0 añadió una pared de acento: «a second wall covering can be applied to single wall in the room» (se puede aplicar un segundo revestimiento a una sola pared de la habitación).5
La Academia de Interiorismo Feliz
La mitad de la puntuación es la parte que toma prestada Kiradex. Nookipedia: la Academia «sends an evaluation by mail most Sunday mornings, which cannot be disabled» (envía una evaluación por correo la mayoría de los domingos por la mañana, y no se puede desactivar). El rango es B, A o S, y el umbral de la S sube con cada ampliación: 15.000 para la primera casa, 23.000 tras ampliar la habitación principal, luego 35.000, 47.000, 60.000, 75.000 y 90.000 con el sótano.6
Las bonificaciones de New Horizons tal como las tabula la wiki:
| Criterio | Puntos |
|---|---|
| 6, 10, 15 y 20 muebles en una habitación | 1.000 en cada umbral |
| Objetos de la suerte | 777 por objeto |
| Muebles de pared | 400 por objeto, tres como máximo |
| 4 o más objetos de una misma serie | 1.000 por objeto |
| Un conjunto de muebles completo | 800 por objeto |
| 3 o más objetos de una misma categoría | 500 por objeto |
| 70 % o más de los objetos de una habitación de un mismo color | 200 por objeto |
| 90 % o más de un mismo color | 600 por objeto |
| Feng shui rojo, verde o amarillo | 500 |
| Cucarachas | menos 2.500 cada una |
| Objetos que no son muebles en el suelo | menos 1 cada uno |
| Basura en el suelo | menos 500 cada una |
| Objetos con orientación mirando a una pared | menos 300 cada uno |
Nookipedia, «Happy Home Academy», las tablas de New Horizons, guardadas el 5 de octubre de 2026; sin cita en la página.6
Esos números son los menos seguros de esta sección. Las tablas de bonificaciones y deducciones no llevan ninguna cita. La tabla de recompensas que va debajo dice que «Includes data sourced from the Data Spreadsheet for Animal Crossing New Horizons» (incluye datos de la hoja de cálculo de datos de Animal Crossing New Horizons), compilada por colaboradores con nombre, y la sección de puntos por objeto de New Horizons dice «This section is a stub» (esta sección es un esbozo).6 Así que la aritmética es una reconstrucción de fans. El encargo del final toma prestada su forma (fuentes desglosadas, umbrales por cantidad, bonificaciones por conjunto y por color, un día fijo) y ninguno de sus números.
Dos decisiones suyas importan para cualquier app que quiera una puntuación semanal de la habitación. El listón sube con la casa, así que una habitación más grande no es un rango máximo más fácil. Y la carta llega en un día fijo, la mayoría de los domingos por la mañana, y el jugador no puede desactivarla.6 Ausentarse no sale gratis: la página de la casa dice que un jugador que descuida su casa «for at least one week» (durante al menos una semana) la encuentra infestada de cucarachas, y la tabla de arriba resta 2.500 puntos por cada una.56 El encargo se queda con el día fijo y descarta la penalización.
Las visitas
En todos los juegos de la serie, según la wiki, «a player may enter any other player’s house freely» (un jugador puede entrar libremente en la casa de cualquier otro). Puede usar los muebles, pero no soltar ni recoger objetos «or modify the interior in any way» (ni modificar el interior de ningún modo).5 Una visita en sueños a otra isla llega al mismo fin por otro camino. En la página de la wiki sobre el personaje que gestiona los sueños, la sección de New Leaf dice que en un sueño «any changes will not be saved and items cannot be brought back to the real world» (ningún cambio se guarda y los objetos no pueden traerse al mundo real), y la sección de New Horizons dice que sus servicios «work the same as they do in New Leaf» (funcionan igual que en New Leaf). Subir un sueño le da al anfitrión un vale canjeable por 5.000 bayas (Dream Bell Exchange Ticket), y otro por cada actualización.32 Según mi lectura, es el tipo de visita más seguro de este artículo para una app infantil: el visitante recorre una copia y no puede cambiar nada que se conserve, y al anfitrión se le premia por compartir.
3. Habbo, Stardew, Final Fantasy XIV, Club Penguin y de dónde salió el modelo
Habbo: la habitación es el producto, y el producto se vende
El propio centro de ayuda de Habbo enuncia con claridad las reglas de propiedad y de visita. «You can own 200 rooms.» (Puedes tener 200 habitaciones.)33 Los suelos y las paredes son permanentes una vez aplicados: «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.» (El papel pintado y el suelo quedan pegados: una vez puestos, no se pueden recoger; si quieres cambiar el aspecto de tu habitación, puedes poner otros nuevos.)33 Los visitantes no pueden tocar: «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.» (No puedes soltar ni manipular muebles en las habitaciones de otro Habbo salvo que seas miembro de un grupo y el dueño de ese grupo te haya permitido participar en la construcción de esa habitación.)18
La economía de muebles gira en torno a la compra. «To buy furni you need credits, diamonds or duckets.» (Para comprar muebles necesitas créditos, diamantes o duckets.)18 El Builders Club presta muebles hasta un límite que sube 250 por cada mes de suscripción, incluye guardar distribuciones de habitación personalizadas en el editor de planos y promete «Furni limits never go down.» (los límites de muebles nunca bajan).34 La página de definiciones de muebles describe muebles de campaña retenidos «for 4-12 months in order to leave an ample window for traders to build their businesses around them» (de 4 a 12 meses para dejar a los comerciantes un margen amplio para montar su negocio en torno a ellos), rarezas que «will never be re-released» (nunca se volverán a lanzar), rarezas que se compran y luego se abren «to reveal another, random rare furni» (para revelar otro mueble raro al azar), y los LTD, «a special type of rare, which comes in limited quantities» (un tipo especial de rareza que viene en cantidades limitadas).17 Intercambiar exige un pase de intercambio, y «There is no guide to what items of furni are worth» (no hay ninguna guía de lo que valen los muebles).35 Habbo llega a limitar el azar dentro de las habitaciones: «Placing more than three chance elements will disable all randomiser functions in the room.» (Colocar más de tres elementos de azar desactiva todas las funciones aleatorias de la habitación.)36
Las páginas de Habbo no dan la cuadrícula, las alturas de apilado ni un límite de muebles por habitación; la búsqueda del centro de ayuda de «furni», «stack» y «floor plan» no devolvió ningún artículo que lo haga.37 Los números que se citan salen de Nitro, un cliente de terceros de código abierto. Las constantes de su editor de planos permiten hasta 64 tiles por eje y un esquema de alturas de 27 pasos, como citó del mismo archivo el artículo de estructuras de esta serie; mis notas anteriores añaden, de ese cliente, una herramienta de altura de apilado de 0 a 40 en pasos de 0,01, que no volví a leer para este artículo.3839 Toma las tres cifras como del cliente, no de Sulake.
Según mi lectura, Habbo muestra en qué se convierte el ciclo de amueblado cuando el catálogo es el negocio. Su regla de visitas es la que hay que copiar; su economía (escasez a propósito, contenidos aleatorios, valor de intercambio) es la que hay que rechazar.
Stardew Valley: un catálogo que se compra una vez y, después, muebles gratis
La página Furniture de la Stardew Valley Wiki, revisión 193159, lista 718 filas de objetos en 26 secciones, 615 nombres distintos. Esos son mis recuentos de las filas de la página; la sección de pósteres de películas usa otro marcado y la omití, y «distintos» une en uno un objeto que aparece en dos secciones.4016 La página Wallpaper, revisión 193801, muestra 137 papeles pintados (123 en el catálogo, 12 fuera de él, 2 inobtenibles), y la página Flooring, revisión 190285, 97 suelos, ambos contados a partir de los iconos de las páginas, no de los archivos de datos del juego.404142
El catálogo crece de dos maneras a la vez. Robin y el carrito ambulante «offer a random selection of furniture each day they are open» (ofrecen una selección aleatoria de muebles cada día que abren). «After the first Farmhouse upgrade, Robin also offers the Furniture Catalogue for sale» (tras la primera mejora de la granja, Robin también vende el Catálogo de muebles), a 200.000g según la tabla de catálogos de la página, y una vez colocado vende por 0g los muebles que lista «in unlimited quantity» (en cantidad ilimitada). 278 filas de la página Furniture nombran el Catálogo de muebles como fuente.1640 Las excepciones de la página siguen siendo excepciones: «Some furniture can be obtained only by donating items to the Museum» (algunos muebles solo se obtienen donando objetos al Museo), o en festivales, el casino y otras fuentes.16 Así que un hito de juego y una compra grande en la moneda del propio juego acaban con la escasez de lo que lista el catálogo, y solo de eso.
La respuesta a la colocación es por tile: «Furniture will display a green square on tiles where it can be placed. The tile will turn red if the furniture cannot be placed.» (El mueble muestra un cuadrado verde en los tiles donde puede colocarse; el tile se vuelve rojo si no puede colocarse.)16 El papel pintado es un gesto para una superficie: los papeles pintados «cover the whole room they’re placed in» (cubren toda la habitación en que se ponen), y para poner uno «the character must be facing up by its wall» (el personaje debe estar mirando hacia arriba junto a su pared); son «single-use and do not stack» (de un solo uso y no se apilan).41 La casa de la granja mide 10 por 7 por dentro antes de las mejoras, en tiles de 16 pixeles, como citó de la wiki el artículo de estructuras.39
Final Fantasy XIV: un tope que también es un presupuesto de fotogramas
Las notas del parche 7.5 en The Lodestone de Square Enix subieron todos los límites de vivienda. Los muebles de interior pasaron de 100 a 150 en apartamentos y habitaciones privadas, de 200 a 300 en cabañas, de 300 a 450 en casas y de 400 a 600 en mansiones; los de exterior, de 20 a 40, de 30 a 60 y de 40 a 80.7 Las mismas notas dan la razón con sus propias palabras: «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.» (En pantalla pueden mostrarse a la vez hasta 400 muebles; si hay más, los que están en otra planta que tu personaje dejan de mostrarse, empezando por los pequeños y más lejanos.)7 Un tope es a la vez un presupuesto de diseño y un presupuesto de renderizado.
Las notas añaden también «Furnishings from the FFXIV Furnishing Design Contest» (muebles del concurso de diseño de muebles de FFXIV): un concurso de la comunidad cuyos diseños ganadores se convirtieron en muebles en el parche.7 Esa es la forma segura de un concurso: los jugadores hacen cosas, y el estudio las juzga y las publica.
Los tamaños de las parcelas no están en este artículo. La guía de vivienda de Square Enix devolvió HTTP 404 el 5 de octubre de 2026, y no probé ninguna otra página oficial, así que FFXIV aporta límites de objetos sacados de las notas de The Lodestone y nada más.7
Club Penguin: un «me gusta» al día y un total que nunca baja
Todos los datos de Club Penguin de aquí son de una sola fuente. Las entradas archivadas del blog oficial que cita la Club Penguin Wiki devolvieron HTTP 429 desde la Wayback Machine dos veces el 5 de octubre de 2026, así que no pude comprobarlas.43
That Penguin Game reproduce lo que presenta como las páginas de ayuda del juego; no verifiqué esa procedencia. Su página «Your Igloo»: «You can Like any igloo design once every day!» (¡puedes darle «me gusta» a cualquier diseño de iglú una vez al día!). Cada diseño «earns its own individual Likes» (gana sus propios «me gusta»), que se suman al Grand Total, y «Likes are permanent, so your Grand Total Likes will never decrease, even if you delete an igloo design!» (los «me gusta» son permanentes, así que tu total general nunca bajará, aunque borres un diseño de iglú). La pestaña Popular ordena los iglús por Grand Total Likes, y un iglú se abre a «Everyone» (todos) o solo a «Friends» (amigos).19
La Club Penguin Wiki dice que «igloos have a limit preventing more than 99 units of furniture being placed at once» (los iglús tienen un límite que impide colocar más de 99 muebles a la vez), que la mayoría de los muebles tienen un límite de propiedad de 99 de cada tipo, y que un dueño puede decorar su propio iglú «but not other player’s igloos» (pero no los iglús de otros jugadores).8 Decorar era una ventaja de la suscripción: desde el 1 de noviembre de 2005, los jugadores sin suscripción podían tener iglú pero no amueblarlo, y desde el 26 de julio de 2012 recibieron 6 muebles gratis, un objeto de suelo, cuatro objetos normales y uno de pared.438
La historia de los concursos de iglús según la wiki: el primero se anunció en el número 9 del periódico del juego, publicado el 15 de diciembre de 2005, con un ganador premiado con 5.000 monedas. Los concursos posteriores anunciaban a sus ganadores y finalistas entre una y cuatro semanas después de la convocatoria, siempre con monedas y a veces con muebles. Desde el concurso de Halloween de 2008, los ganadores los elegían personajes, y sus comentarios se publicaban junto a los iglús; desde 2009, un botón en el iglú lo inscribía; el último concurso se celebró en diciembre de 2012. Un ejemplo, el Ye Olde Igloo Contest de 2008, pagó 25.000 monedas a cada uno de diez ganadores y 15.000 a veinte finalistas.44
Los Sims: las personas estaban ahí para puntuar la casa
El modelo de cuadrícula y catálogo tiene un relato de origen, y es un relato de puntuación. Mi fuente es una sola entrevista: Will Wright con Tristan Donovan, publicada por Game Developer el 23 de mayo de 2011. No encontré ninguna charla grabada de Wright de 1999 o 2000 sobre el modo construcción.45
Sobre la inspiración: «one of the original things that was a really inspiration for The Sims was this book, A Pattern Language, by Christopher Alexander.» (una de las inspiraciones originales de The Sims fue el libro A Pattern Language, de Christopher Alexander). Sobre la puntuación: «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.» (En cierto sentido, al principio quería que The Sims fuera un juego de arquitectura que analizara esos patrones; las personas de The Sims, en origen, solo estaban ahí para puntuar la arquitectura.) Sobre el nombre: «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.» (mi nombre original era Doll House, casa de muñecas; hicimos pruebas de mercado y vimos que no funcionaba bien entre los hombres). Sobre los objetos: «Everything we put in the world is advertising» (todo lo que poníamos en el mundo era publicidad), un modelo que él remonta a los rastros de feromonas de SimAnt.45
The Sims Wiki, una wiki de fans y una sola fuente, describe la pantalla publicada. El modo compra permite a los jugadores «purchase items from an object catalog and place them on the current lot» (comprar objetos de un catálogo y colocarlos en el solar actual); The Sims y The Sims 2 ordenaban ese catálogo por la función del objeto; y los tiles de la huella del objeto que se sostiene se ven verdes donde puede ir y rojos donde no. La wiki asocia esa frase del verde y el rojo a The Sims 2 y The Sims 3, así que no la afirmo para el original de 2000.46 La puntuación se quedó dentro de los Sims como necesidad, Habitación en el primer juego y Entorno en el segundo, que «analyzes the design and content of the room that the Sim is currently standing in» (analiza el diseño y el contenido de la habitación en la que está el Sim): las habitaciones pequeñas, la falta de luz y las cosas sucias o rotas la bajan.47
Según mi lectura, cada juego de este artículo es esa misma pantalla con otro presupuesto: un catálogo, una cuadrícula del tamaño del paso de una persona, una huella que se pone verde o roja, y un juez.
Los topes, uno al lado de otro
Los límites abarcan de uno a cincuenta, del dormitorio de Emerald a una mansión de FFXIV, pero no cuentan lo mismo: el de FFXIV es un límite de colocación en interior listado por tipo de vivienda, el de Animal Crossing es por habitación, el de Club Penguin por iglú, el de Emerald por base o por dormitorio, y el de Kiradex por planta. Solo los números de FFXIV y de Emerald salen del texto o del código del propio editor.247581
4. El oficio, como reglas con números
Estas son las reglas que respaldan las mediciones, cada una con el rango en que se apoya. Donde un número es aritmética mía o una elección mía, la fila lo dice. «Celda» significa la celda de caminata de 16 pixeles, que es también el tile de Kiradex.227
| Elemento | Regla | Fuente |
|---|---|---|
| Tope de colocación | Limita lo que muestra una habitación, por habitación, contando los objetos de pared. | Emerald 16 por base, 12 en el dormitorio; New Horizons 150 por habitación «including wall and ceiling-mounted furniture» (incluidos los muebles de pared y de techo); FFXIV de 150 a 600 en interiores según el tamaño de la vivienda; Club Penguin 99 (una sola fuente de fans) |
| Tope de propiedad | Deja que el jugador posea más de lo que cabe, para que colocar sea elegir. | Emerald 150 en propiedad en ocho compartimentos frente a 16 colocadas; Club Penguin 99 de cada tipo en propiedad (fuente de fans) |
| Tope frente al suelo | En una habitación 2D sin capa de pared ni de techo, quédate por debajo de un objeto por cada tres celdas de suelo (mi umbral, elegido para que Emerald quede justo por debajo); las superficies y las piezas que se pisan lo estiran. | Emerald 16 frente a una media de 60,2 celdas transitables, 0,27; New Horizons 150 en una habitación de 6 por 6 son 4,2 por tile, posible solo con colocación en pared, techo y superficies (mi aritmética) |
| Superficies | Haz que sostener una pieza pequeña sea una propiedad de una celda, para que un escritorio añada suelo para un muñeco. | Emerald: 18 decoraciones sostienen piezas pequeñas, 14 sostienen grandes, y 45 decoraciones sprite necesitan una |
| Celda de la cuadrícula | Dimensiona la cuadrícula al ancho del fotograma o de la celda del personaje; ve más fino solo si las piezas pueden desplazarse poco a poco y el arte lo permite. | El fotograma del jugador de Emerald, 1 por 2 celdas de 16 pixeles; Stardew tiles de 16 pixeles; New Horizons medios tiles |
| Comprobación de colocación | Hazle una pregunta a cada celda cubierta (suelo, pared, superficie; vacía; no en la celda de llegada ni en la del anfitrión) y muestra la respuesta celda por celda. | CanPlaceDecoration de Emerald para las preguntas por celda, aunque rechaza la celda de partida del jugador solo para un tile con un tipo de capa no normal; las celdas de llegada y del anfitrión son regla de Kiradex (7.1); Stardew cuadrado verde o rojo por tile; The Sims 2 y 3 huella verde o roja (wiki de fans) |
| Camino | Comprueba que una caminata sobreviva a cada colocación (la aportación del encargo). | CanPlaceDecoration de Emerald no comprueba ningún camino, y mantiene libre la celda en la que estaba el jugador solo de un tile con un tipo de capa no normal; las páginas de Stardew y de los Sims que se leen aquí describen una respuesta por tile y no dicen nada, ni a favor ni en contra, sobre caminos; el encargo añade la caminata |
| Papel pintado y suelo | Uno por habitación, cambiado con un gesto, reversible. | Stardew cubre «the whole room» (toda la habitación) desde la pared; New Horizons por habitación más una pared de acento; los de Habbo son permanentes y solo se reemplazan |
| Tamaño del catálogo | Lo bastante grande como para que un estilo sea una elección. | Stardew 137 papeles pintados y 97 suelos (mis recuentos de iconos de la wiki); New Horizons 262 y 215; New Horizons 2.076 muebles a la versión 3.0.2 |
| Puntuación | Desglosa las fuentes, fija el día, sube el listón con la casa, nunca castigues la ausencia. | Academia de Interiorismo Feliz: la mayoría de los domingos; B, A, S; S de 15.000 a 90.000; 1.000 a los 6, 10, 15 y 20 objetos; serie, conjunto, categoría, color (tablas de fans, sin cita); la página de la casa de la wiki, que no nombra ningún juego, dice que una casa descuidada durante al menos una semana se llena de cucarachas, y la tabla de la Academia de New Horizons resta 2.500 por cucaracha, una penalización que esta regla rechaza |
| Crecimiento del catálogo | Para una app para mayores de 9 años, crece jugando: un estante ganado más un catálogo que se abre al llegar a un hito. Nunca por venta aleatoria ni escasa. | Emerald 90 de 120 vendidas, 24 nunca vendidas, otras dos por 6.000 y 8.000 de ceniza; Stardew surtido diario aleatorio y, tras la primera mejora, un catálogo de 200.000g cuyos muebles listados cuestan 0g, con exclusivas del Museo, de los festivales y de otras fuentes fuera de él; las rarezas, los muebles sorpresa y los LTD de Habbo como contraejemplo |
| Visitas | Los visitantes miran y no tocan; una marca por visitante y por día; el total del anfitrión nunca baja. | Los visitantes de Animal Crossing no pueden «modify the interior in any way» (modificar el interior de ningún modo); los de Habbo no pueden soltar ni mover muebles sin permisos; Club Penguin un «me gusta» por diseño y por día, el Grand Total nunca baja (una sola fuente de fans) |
| Almacenamiento | Un objeto colocado son unos pocos bytes: tipo, celda, orientación. | Emerald: un byte de id y un byte de posición, 32 bytes por base |
Fuentes: secciones 1 a 3 y sus notas.256781916414033181746141511
Tres de ellas merecen una frase cada una.
El tope es un presupuesto para la vista, y a veces para la GPU. Los 16 de Emerald son más o menos una cuarta parte del suelo de una base. FFXIV dice abiertamente que, pasados 400 muebles en pantalla, deja de dibujar algunos.27 Para una app de teléfono la segunda razón es real, pero según mi lectura es la primera la que decide el número: un tope es lo que convierte un estante en una composición, que es la razón que dio el artículo del mundo del 3 de octubre para elegir dieciséis.10
La regla de camino es la aportación del encargo. CanPlaceDecoration de Emerald vigila como mucho una celda, aquella en la que estabas al abrir el menú, y nunca pregunta si la puerta sigue llegando a la computadora.4 Las páginas de Stardew y de los Sims que leí describen una huella coloreada por tile; no dicen si alguno de los dos juegos comprueba además un camino, y no seguí buscando, así que este artículo no afirma nada sobre ellos en ningún sentido.1646 Una habitación que visitan otras personas necesita resolver esa pregunta, porque un visitante que no puede llegar a la exposición no tiene nada que mirar.
Desbloquear jugando es el extremo defendible de la cuestión del catálogo para una app infantil. Es mi lectura, no asesoramiento legal: un ciclo de decoración que se compra, que es aleatorio o que es escaso carga con preguntas de cajas de botín y de presión que una app de colección no necesita. El estante ganado de Emerald muestra un ciclo de habitación que no necesita nada de eso, y el catálogo de Stardew, comprado una vez en la moneda del propio juego tras un hito de juego, muestra cómo acabar con la escasez de todo lo que lista.141617
5. A la manera de Apple: un modelo que se sincroniza, un arrastre que se ajusta, una cuadrícula que VoiceOver puede usar
Una pantalla de amueblado en iOS necesita tres cosas: un registro por cada pieza colocada que se sincronice por iCloud, una forma de arrastrar una pieza a una celda y una forma de hacer lo mismo sin ver ni tocar. Todo lo que sigue sale de páginas de la documentación de Apple guardadas como JSON el 5 de octubre de 2026, con títulos, declaraciones, resúmenes y plataformas extraídos por un script.48 Nada de esto se compiló ni se ejecutó para este artículo, y ningún coste de los que siguen está medido.
El registro: SwiftData, con la forma que pide CloudKit
@Model «Converts a Swift class into a stored model that’s managed by SwiftData» (convierte una clase de Swift en un modelo almacenado gestionado por SwiftData), disponible desde iOS 17.0.49 SwiftData puede imponer unicidad con #Unique, que «Specifies the key-paths that SwiftData uses to enforce the uniqueness of model instances» (especifica las key paths que SwiftData usa para imponer la unicidad de las instancias del modelo), desde iOS 18.0.50 Una pieza colocada parece un uso natural: una pieza por celda.
La sincronización con CloudKit lo descarta. La guía de Apple para sincronizar SwiftData dice que el framework «does include a small number of features that CloudKit doesn’t support natively, such as unique constraints and nonoptional relationships» (incluye unas pocas funciones que CloudKit no admite de forma nativa, como las restricciones de unicidad y las relaciones no opcionales), y que «CloudKit requires all relationships to be optional.» (CloudKit exige que todas las relaciones sean opcionales).22 Los modelos de Kiradex ya tienen esa forma. El comentario de CardCopy dice «every property has a default and nothing is unique, for CloudKit» (cada propiedad tiene un valor por defecto y nada es único, por CloudKit), y PriceHistory está «Shaped for CloudKit like CollectionEntry: defaults everywhere, nothing unique» (con la forma que pide CloudKit, como CollectionEntry: valores por defecto en todo y nada único), con un pliegue que elige el mismo ganador en cada dispositivo cuando dos dispositivos crean el mismo historial.5152
Así que la unicidad que importa, una pieza por celda, tiene que imponerse en código: una función pura que se ejecuta en cada lectura, resuelve las piezas de dos dispositivos en una misma celda con el mismo ganador en todas partes y devuelve la perdedora a la bandeja. Una celda no es lo único que dos dispositivos pueden romper juntos. Dos ediciones que pasan cada regla en su propio teléfono pueden fallar juntas, así que la función tiene que reconstruir la habitación pasando por toda la comprobación de colocación, no solo por la prueba de solapamiento. El encargo de la sección 7 la especifica.
El arrastre: draggable, un destino de soltado y la celda bajo el dedo
draggable(_:) «Activates this view as the source of a drag and drop operation» (activa esta vista como origen de una operación de arrastrar y soltar) para una carga Transferable, desde iOS 16.0.53 dropDestination(for:action:isTargeted:) recibe los elementos soltados y un CGPoint, que su página describe como «the drop location in this view’s coordinate space» (el punto donde se suelta, en el espacio de coordenadas de esta vista), también desde iOS 16.0.54 Convertir ese punto en una celda es aritmética: resta el origen del mapa y divide entre el tamaño del tile en puntos.
Un hallazgo que mis notas anteriores no tenían. La página guardada de dropDestination(for:action:isTargeted:) indica iOS 27.2 como la versión que lo declara obsoleto, con el mensaje «Use dropDestination(for:isEnabled:action:) with an action that takes a DropSession parameter instead.» (usa en su lugar dropDestination(for:isEnabled:action:) con una action que reciba un parámetro DropSession).54 La acción del reemplazo recibe una DropSession, «A description of a drop that is in progress» (la descripción de un soltado en curso), en lugar de un punto.54 No guardé la página de DropSession, así que si lleva una ubicación en el espacio de coordenadas de la vista está sin leer, y el encargo nombra las dos formas.
Para mover una pieza que ya está en la habitación, DragGesture es «A dragging motion that invokes an action as the drag-event sequence changes» (un movimiento de arrastre que invoca una acción a medida que cambia la secuencia de eventos de arrastre) (iOS 13.0), y SpatialTapGesture es «A gesture that recognizes one or more taps and reports their location» (un gesto que reconoce uno o más toques e informa de su ubicación) (iOS 16.0): toca para seleccionar una pieza, arrastra para moverla celda a celda.5556
Si el punto de soltado se convierte limpiamente en celdas de tile bajo la cámara de Kiradex no está probado. RealityKit dibuja la habitación con un número entero de pixeles del dispositivo por texel, y el overlay de SwiftUI que recibe el soltado se superpone a ella; la aritmética es la misma que ya hace el ajuste de la cámara, pero nadie ha soltado nada sobre ella todavía.10
La cuadrícula sin tocar: VoiceOver
Una cuadrícula de muebles se presta mal a recorrerse deslizando elemento por elemento, así que el diseño le da a VoiceOver sus propios verbos:
accessibilityElement(children:)«Creates a new accessibility element, or modifies theAccessibilityChildBehaviorof the existing accessibility element» (crea un elemento de accesibilidad nuevo o modifica elAccessibilityChildBehaviordel existente) (iOS 13.0), así que una pieza de varias celdas es un solo elemento, no seis.57accessibilityAction(named:_:)añade una acción con nombre; «Actions allow assistive technologies, such as the VoiceOver, to interact with the view by invoking the action» (las acciones permiten que las tecnologías de asistencia, como VoiceOver, interactúen con la vista invocando la acción) (iOS 16.0). Mover a la izquierda, Mover a la derecha, Mover arriba, Mover abajo, Girar y Guardar son una acción cada una.58accessibilityAdjustableAction(_:)gestiona el deslizamiento hacia arriba y hacia abajo como unAccessibilityAdjustmentDirection(iOS 13.0), adecuado para ir pasando por papeles pintados o suelos.59accessibilityRotor(_:entries:)crea «an Accessibility Rotor with the specified user-visible label» (un rotor de accesibilidad con la etiqueta visible indicada) (iOS 16.0), así que un rotor «Muebles» puede saltar entre las piezas de la habitación.60AccessibilityNotification.Announcementes «A notification that an app posts when it needs to convey an announcement to an assistive app» (una notificación que publica una app cuando necesita transmitir un aviso a una app de asistencia) (iOS 17.0): cada movimiento rechazado se dice en voz alta, con su motivo.61
Una prueba de UI puede entonces auditar la pantalla con XCUIApplication.performAccessibilityAudit(for:_:), listado para iOS 17.0; la página guardada no tiene resumen e indica Xcode 16.3 para la ruta de este módulo.62 Auditar es todo lo que hace. En las cabeceras de XCUIAutomation instaladas con Xcode 27.0, la auditoría «Runs an accessibility audit on the current view» (ejecuta una auditoría de accesibilidad sobre la vista actual). Las mismas cabeceras añaden XCUIVoiceOverService, desde iOS 27.0, que «Provides programmatic control of VoiceOver for UI testing» (ofrece control programático de VoiceOver para pruebas de UI): enciende y apaga VoiceOver, mueve el foco hacia adelante, hacia atrás, hacia dentro y hacia fuera de los contenedores, y devuelve lo que VoiceOver dice del elemento enfocado. Una búsqueda en todas las cabeceras del framework no encuentra ninguna llamada que ejecute una acción personalizada con nombre, gire un rotor o lea un aviso, así que una prueba de UI no puede pulsar Mover a la izquierda o Guardar como lo hace un usuario de VoiceOver.63 El encargo prueba directamente los manejadores de esas acciones, comprueba las etiquetas habladas con el servicio de VoiceOver y deja las acciones, el rotor y los avisos a una persona con VoiceOver activado.
Lo que cuesta
Sin medir. Una casa amueblada son como mucho 16 registros pequeños en cada una de dos plantas. Si las piezas colocadas se unen a la única malla de objetos que el motor ya construye para los muebles de la forja, un cambio implica reconstruir esa malla; nada de esto se ha perfilado en un teléfono.39
6. El caso de estudio: los interiores de Kiradex hoy
Kiradex es una app de colección de cartas para iPhone con un pequeño pueblo de pixeles, Kiradex World, donde cada coleccionista tiene una casa de dos plantas y el pueblo tiene un salón de exposición. Todo lo de esta sección se leyó en el repositorio de la app el 5 de octubre de 2026, sin ejecutar ni cambiar nada: los interiores se analizaron con un script, y los documentos y los modelos se leyeron como texto.964
Qué cambió desde el artículo de estructuras
El artículo de estructuras del 3 de octubre decía que interiors.py dibuja la habitación, la planta de arriba y el salón «each 14 by 11, with a two-row wall band» (cada uno de 14 por 11, con una franja de pared de dos filas).39 Era cierto cuando se escribió. Ese mismo día, la compilación 26 de TestFlight trajo el kit de interiores: «Rooms sixteen wide with a three-row wall band (cornice, face, wainscot)» (habitaciones de dieciséis de ancho con una franja de pared de tres filas: cornisa, paño y zócalo), muebles con un ritmo de 32 pixeles, las piezas adosadas a la pared dibujadas como suelo y las exentas como objetos por detrás de los cuales camina el coleccionista.65 Hoy la forja dibuja room y room-up a 16 por 12 celdas y el salón a 16 por 13, cada uno con una franja de tres filas: cornisa, paño y zócalo.964 La compilación 26 cae entre la compilación 23 que describe el artículo de estructuras y la compilación 35 que describe su anexo de la tarde, así que los dos textos aciertan sobre sus compilaciones.3965
Los muebles de la forja
scripts/forge/interiors.py nombra 23 piezas en su tabla PIECES, cada una con un ancho y un alto en celdas y un indicador de si es exenta.9
| Tipo | Piezas y huellas (celdas, ancho por alto) |
|---|---|
| Adosadas a la pared, dibujadas en el suelo (9) | librero 5 por 2; ropero 2 por 2; encimera, fregadero y estufa 1 por 1 cada uno; chimenea 2 por 2; escalera y escalera de bajada 2 por 3 cada una; pilar 1 por 3 |
| Exentas, exportadas como objetos con los que se ordena al coleccionista en profundidad (14) | cama y cama de rosas 2 por 3 cada una; mesita de noche 1 por 1; mesa 2 por 2; silla en cuatro orientaciones, 1 por 1 cada una; sofá 3 por 2; banco 2 por 1; planta 1 por 2; baúl, caja y barril 1 por 1 cada uno |
Analizado a partir de PIECES con measure_kiradex_interiors.py; el archivo nunca se importa ni se ejecuta.9
Una pieza cubre de 1 a 10 celdas, 3,04 de media, frente a las de 1 a 9 y 2,43 de Emerald.92 Los dibujos distintos son menos que los nombres: las cuatro sillas son un mismo dibujo en cuatro orientaciones, las dos camas son dos variantes, las dos escaleras dos direcciones, y la encimera, el fregadero y la estufa son una encimera de tres tipos.9
El docstring del archivo y su tabla no coinciden. El docstring fija la convención como «furniture on the 16-pixel grid in a 32-pixel rhythm, every piece at least two tiles on one axis» (muebles sobre la cuadrícula de 16 pixeles con un ritmo de 32 pixeles, cada pieza de al menos dos tiles en un eje).64 En la tabla, 11 de las 23 son de 1 por 1: las cuatro sillas, la encimera, el fregadero, la estufa, la mesita de noche, el baúl, la caja y el barril.9 El ritmo se cumple en las piezas grandes y no en las pequeñas. Es una diferencia entre un comentario y el código dentro de un mismo archivo, scripts/forge/interiors.py, y el encargo conserva las piezas pequeñas, porque una habitación solo con piezas de dos tiles no tendría sillas.
El paño de la pared tiene su propio vocabulario, en letras: un cuadro p, un reloj k, una ventana N, una ventana con cortinas K, un estandarte n, un aplique l, y W donde cuelga el tablero de pared. Los suelos son tablas o, baldosas t, mármol s y una alfombra r que se dibuja como un nine-slice a partir de sus vecinas. Hay dos estilos de pared, el yeso con entramado de madera de la casa y la piedra labrada del salón, elegidos por interior a través de FACES.64
Las habitaciones tal como están creadas
| Mapa | Tamaño | Celdas de suelo | Piezas (movibles) | Suelo bajo las piezas | Suelo libre | Puntos que viste la app |
|---|---|---|---|---|---|---|
room |
16 por 12 | 125 | 14 (13) | 25 | 100 | estante 5 celdas, vitrina 2, escritorio 2; llegada, escalera, anfitrión |
room-up |
16 por 12 | 125 | 12 (11) | 27 | 98 | tablero de pared 3 celdas, escritorio 2; llegada en la escalera |
hall |
16 por 13 | 144 | 6 (4) | 8 | 128 tras 8 pedestales | 8 pedestales |
Las movibles excluyen la escalera y los pilares. De measure_kiradex_interiors.py.9
El punto host lleva en el archivo el comentario «where the owner stands when you visit» (donde está el dueño cuando lo visitas).64 El check() de la forja ya rechaza un punto de estante, vitrina, escritorio o pedestal sobre la letra equivocada, un warp que no esté en una puerta o en una escalera, una celda de llegada, escalera o anfitrión que no sea transitable, y dos objetos exportados en una misma celda. Sus límites más estrechos importan para el encargo. No tiene comprobación de letra para los puntos del tablero de pared, y su bucle de solapamiento lee solo los objetos exportados, las piezas exentas, así que una pieza adosada a la pared dibujada en el suelo nunca entra en él. No comprueba que la puerta llegue a cada punto.64
La regla de camino, aplicada a las habitaciones de hoy
Escribí un script que reconstruye las letras exportadas igual que lo hace export() y camina en cuatro direcciones desde la llegada de cada planta sobre las letras transitables de la forja, otsrUD.20 En las distribuciones de hoy, la caminata llega a la escalera y al anfitrión abajo, y a la escalera arriba. Las celdas que están justo delante de los puntos de exposición son otra historia:
- Abajo, las cinco celdas frontales del estante: dos están bajo el barril y la caja, tres se alcanzan.
- Las dos celdas frontales de la vitrina se alcanzan las dos.
- Las dos celdas frontales del escritorio: una está bajo la silla arrimada a él, una se alcanza.
- Arriba, el escritorio está igual, una de dos.
- Arriba, las tres celdas frontales del tablero de pared están bajo la cama y la mesita de noche. No se alcanza ninguna.20
Así que una regla que exigiera alcanzar la celda frontal de cada punto fallaría en cuatro de los grupos vestidos de la forja en las dos plantas (el estante y el escritorio de abajo, el escritorio y el tablero de pared de arriba), siete celdas frontales bloqueadas en total, y una regla que exija que cada grupo vestido tenga una celda frontal alcanzable falla en un grupo: el tablero de pared de arriba. El encargo usa la forma por grupo y arregla el tablero en la redistribución inicial.
El script también probó piezas extra en room. Una pieza exenta extra tiene 733 colocaciones que pasan las reglas de celda; 44 de ellas dejan un objetivo aislado, y todas lo hacen cubriendo la propia celda objetivo. Dos piezas extra, cada una lejos de todos los objetivos y sin solaparse, dan 229.891 parejas, y 713 de ellas dejan un objetivo aislado sin cubrirlo: una cama en (9,3) y una mesita de noche en (6,4), por ejemplo, cierran el hueco que hay delante de la vitrina.20 Esas 713 son lo que una comprobación por celda deja pasar y una caminata atrapa. Son también lo que dos teléfonos pueden construir entre los dos: cada pieza por sí sola deja todos los objetivos alcanzables, así que cada una pasa la caminata en su propio dispositivo, y la pareja solo falla una vez que las dos se han sincronizado (7.7).66 No llevé la búsqueda más allá de dos piezas extra; con dieciséis, cuántas distribuciones aprobaría una comprobación por celda y rechazaría una caminata está sin medir.
El coleccionista frente a la cuadrícula
La celda del sprite del coleccionista mide 32 por 40 pixeles, con 7 pixeles por encima de la figura y 2 por debajo, así que la figura mide unos 31 pixeles de alto, y la celda tiene 2 tiles de ancho y 2,5 de alto, frente al fotograma de 1 por 2 de Emerald. WORLD.md lo describe como «a 30-pixel figure in a 32 × 40 cell» (una figura de 30 pixeles en una celda de 32 × 40).2767 El ancho de la propia figura no se midió. Leo la celda como la razón por la que la forja dibuja sus muebles con un ritmo de 32 pixeles sobre una cuadrícula de 16: la celda del coleccionista tiene dos tiles de ancho.
Lo que no hacen las habitaciones
La lista honesta del artículo de estructuras sigue valiendo para la casa: «Rooms have no wallpaper or floor choice and no placeable furniture; the house is dressed from the collection and nothing else.» (Las habitaciones no permiten elegir papel pintado ni suelo, ni tienen muebles colocables; la casa se viste con la colección y con nada más.)39 La app viste los puntos con nombre a partir de la colección (carpetas en el estante, cartas en la vitrina, cintas y pines en el tablero, cartas en los pedestales del salón), y la forja coloca cada mueble.6439
El servidor todavía no puede guardar una habitación. Su módulo de habitaciones dice: «Everything here is in memory; a room empties when its last collector leaves and nothing of them is kept.» (Todo aquí está en memoria; una habitación se vacía cuando se va su último coleccionista y no se conserva nada de ellos.)68 Así que visitar hoy la casa de otro coleccionista es visitar un mapa, y las visitas de solo lectura a la disposición real de un coleccionista necesitan que el servidor guarde una distribución.
Dónde están escritas las reglas de la habitación
El artículo del mundo del 3 de octubre publicó las reglas de la habitación: «a furnishing cap of sixteen» (un tope de dieciséis muebles); «visits are read-only, a like is once a day, and the room’s total never decreases» (las visitas son de solo lectura, el «me gusta» es una vez al día y el total de la habitación nunca baja); y «A report arrives every Sunday grading the room, with its point sources listed» (cada domingo llega un informe que califica la habitación, con sus fuentes de puntos desglosadas).10 Esas reglas no están en el documento de diseño de la app. La sección 4 de docs/WORLD.md enumera la tienda de monedas («clothes, hats, backpacks, card-display frames and emotes», ropa, sombreros, mochilas, marcos para exponer cartas y gestos) y cosméticos bloqueados por nivel «that cannot be bought» (que no se pueden comprar), y no dice nada de muebles, topes, «me gusta» ni de un informe dominical.67 Las reglas viven en la nota de investigación docs/research/pixel-art/06-collecting-and-hubs.md, sección 5.3, que además pide que la carta sea «a pixel object that appears on the doormat» (un objeto de pixeles que aparece en el felpudo), «a stamp on their passport per room visited, with ranks at 30 / 100 / 500» (un sello en su pasaporte por cada habitación visitada, con rangos en 30 / 100 / 500) y, en la sección 5.7, que los objetos de mecenas sean «never a bigger furnishing cap» (nunca un tope de muebles mayor).69 Este artículo las da por decididas porque las publicó el artículo del mundo, y la primera tarea de mantenimiento del encargo es copiarlas en WORLD.md. El mismo párrafo del artículo del mundo dice también «Patron flair stays on the name-plate and the room skin» (los distintivos de mecenas se quedan en la placa con el nombre y en el aspecto de la habitación).10 El encargo no da por decidido el aspecto de la habitación: lo reabre como decisión de Blake (7.5).
La semana ya existe
Las misiones semanales rotan según la semana del calendario en Quest.current, el tema del salón es el título de la misión de la semana, y las notas de prototipos preguntan a los testers por un «Weekly reset on your calendar’s week» (reinicio semanal según la semana de tu calendario).7071 Una carta de los domingos no necesita un reloj nuevo, aunque lleva su propia clave, la fecha del domingo, por una razón que da el apartado 7.4.
7. El encargo: qué construye Kiradex y qué comprobaciones debe pasar
Esto es un encargo, no un informe de trabajo publicado: nada de lo que sigue existe todavía en la app. Está escrito como un diff contra lo que midió la sección 6: las 23 piezas de la forja, dos plantas de casa de 16 por 12 y un salón de 16 por 13, los puntos vestidos, un servidor que no guarda nada, un almacén de SwiftData sincronizado por CloudKit, el reloj de las misiones semanales y las reglas de la habitación que el artículo del mundo ya publicó.96810 Cada elemento conserva una mecánica medida más arriba y lo dibuja todo con la forja, la paleta y las palabras propias de Kiradex. Ningún elemento nombra a una criatura, un lugar de ningún juego ni una función de una franquicia, y nada en una habitación se lanza, se atrapa, se invoca ni se monta, así que nada se parece a los pasos reivindicados de las patentes de métodos de juego que describe el artículo del mundo; es mi lectura, no asesoramiento legal.10 Las coordenadas son las de la forja, x hacia la derecha e y hacia abajo desde la celda superior izquierda. Los números de esta sección (las ocho iniciales, la tabla de puntuación, los umbrales del grado de la casa, el calendario de desbloqueos) son propuestas mías, no hechos.
7.1 Colocación por celda, con el vocabulario propio de la forja
Un modo Organizar en la casa. Las piezas colocables son 20 de las 23 de la forja: todas salvo stairs, stairs_down y pillar, que siguen formando parte de la distribución. Las cuatro sillas se convierten en un solo tipo con orientación, así que las 20 piezas son 17 tipos de suelo. El cuadro, el reloj, el estandarte y el aplique del paño de la pared se convierten en cuatro objetos de pared colocables, lo que da 21 tipos a partir de la forja de hoy; las ventanas y el hueco de la escalera siguen siendo arquitectura. La sección 7.5 añade tres piezas nuevas (una mesa de exposición, un biombo y un objeto de pared de flor prensada), con lo que el total llega a 24.72 Una pieza colocada es (kind, x, y, facing) en su celda superior izquierda sobre el mapa de letras de la planta, la misma forma que ya usa ROOM_FURNITURE.964
Las reglas, celda por celda. Las cinco primeras son la pregunta por celda de Emerald reformulada para las letras de Kiradex; la sexta es la aportación del encargo, una comprobación que la función de colocación de Emerald no hace.4
- Una pieza exenta necesita que cada celda cubierta sea suelo (
o,t,sor) sin ninguna otra pieza encima. - Una pieza adosada a la pared (librero, ropero, encimera, fregadero, estufa, chimenea) necesita su fila superior sobre la franja de pared, donde la forja ya las pone: la chimenea en y = 1, ocupando el paño y el zócalo, y el resto en y = 2, sobre el zócalo.64
- Un objeto de pared necesita una celda de paño (
A) en la fila 1 que no sea una ventana ni el hueco de la escalera. - Ninguna pieza sobre la celda de llegada, las dos celdas de la puerta (la forja dibuja la puerta con dos celdas de ancho en la pared inferior), las celdas transitables de la escalera o la celda del anfitrión.
- El librero lleva consigo sus cinco puntos de estante, porque los puntos son relativos a la pieza, así que mover el estante mueve las carpetas. La vitrina
cy el escritoriodsiguen siendo letras fijas en este encargo. - La regla de camino. Después de la colocación, una caminata en cuatro direcciones sobre celdas transitables desde la llegada todavía tiene que alcanzar la celda de la escalera, la del anfitrión y al menos una celda justo delante de cada grupo vestido: el estante, la vitrina, el escritorio, el tablero de pared. Una pieza que rompe la caminata se rechaza, y el rechazo nombra lo que dejaría aislado.
Cada una de las dos piezas naranjas pasa las reglas de celda; juntas tapian la vitrina, y solo la caminata de la regla 6 lo detecta.2420
Por qué la forma por grupo. En las distribuciones de hoy, la celda que está delante de un punto suele ser una pieza: el barril y la caja bajo dos de las cinco celdas frontales del estante, una silla en cada escritorio, y la cama y la mesita de noche bajo las tres del tablero.20 La forja ya habla en parte este idioma: check() rechaza solapamientos entre objetos exentos y puntos de estante, vitrina, escritorio y pedestal sobre la letra equivocada.64 El jugador recibe esas reglas extendidas a cada huella, incluidas las piezas adosadas a la pared, y a las celdas del tablero de pared, más la caminata.
Criterios de aceptación.
- Una prueba unitaria aplica las seis reglas a room.json: cada uno de los 24 tipos (los 21 de la forja de hoy y los tres que añade 7.5) se acepta en una celda y se rechaza en una celda por cada regla que le corresponde.
- La regla de camino se cumple en las dos plantas iniciales que se entregan (7.2), y una prueba fija que el tablero de arriba tiene una celda frontal alcanzada.
- Una prueba de propiedades coloca secuencias legales aleatorias de hasta 16 piezas en room y room-up y comprueba tras cada paso que la caminata desde la llegada alcanza la escalera, el anfitrión y una celda frontal de cada grupo vestido.
- Una prueba de regresión coloca la cama en (9,3) y la mesita de noche en (6,4) en room y comprueba que la segunda se rechaza con un mensaje que nombra la vitrina.20
- Una captura del modo Organizar en el simulador del iPhone 18 Pro Max muestra la huella de una pieza sostenida teñida celda por celda, una legal y otra ilegal.
- El check() de la forja se cumple en cada distribución que puede producir la app: la prueba exporta la distribución colocada como ROOM_FURNITURE y le pasa la comprobación de la forja, en solo lectura. Como esa comprobación lee solo los objetos exportados y no tiene comprobación de letra para el tablero de pared, la misma prueba comprueba también, con el validador propio del encargo, que no hay dos huellas colocadas que compartan una celda, incluidas las piezas adosadas a la pared, y que los tres puntos del tablero de pared están sobre las celdas W del tablero en el mapa creado.64
7.2 El tope: dieciséis por planta, habitaciones iniciales con ocho
Qué. 16 piezas colocadas por mapa de planta, room y room-up cada uno, objetos de pared incluidos, igual que New Horizons cuenta los objetos de pared y de techo dentro de sus 150.5 Lo que viste la colección (carpetas en el estante, cartas en la vitrina, cintas y pines en el tablero) nunca cuenta: el tope presupuesta muebles, y la colección es lo importante. La propiedad no tiene tope por esto; un coleccionista puede poseer más de lo que cabe, como permite Emerald con espacio para 150 en propiedad frente a 16 colocadas.2
Los números. 16 frente a 125 celdas de suelo son 0,13 por celda, la mitad del 0,27 de Emerald, lo que encaja con piezas que miden de media 3,04 celdas frente a las 2,43 de Emerald y con un coleccionista cuya celda tiene dos tiles de ancho (mi aritmética).9227 La room inicial de la forja ya tiene 13 piezas movibles y room-up 11, así que un coleccionista nuevo que llegara con 13 de 16 tendría tres elecciones por delante.9 La propuesta: entregar cada planta inicial con 8 piezas movibles, elegidas en la forja. Abajo se queda el librero, porque lleva los puntos del estante; arriba se queda una cama, y la redistribución deja libre al menos una celda delante del tablero de pared, cosa que hoy no ocurre con ninguna. Las piezas retiradas van a la bandeja del coleccionista en vez de desaparecer, así que 8 huecos por planta son del coleccionista desde el primer día.20 Las piezas iniciales se crean con ids fijos para que dos dispositivos que arrancan en frío creen los mismos registros, no dos juegos (7.7).
Ciego al mecenazgo. La línea de la nota de investigación se mantiene: los objetos de mecenas son «never a bigger furnishing cap» (nunca un tope de muebles mayor).69
Criterios de aceptación. Una prueba unitaria coloca 16 piezas y comprueba que la 17.ª se rechaza con un mensaje que nombra el tope; una prueba de que las carpetas, cartas, cintas y pines en los puntos vestidos no cambian la cuenta; una prueba de que cada nivel de mecenas ve un tope de 16; una prueba de que las dos plantas iniciales cargan con 8 piezas movibles y cumplen la regla de camino.
7.3 Papel pintado y suelo
Qué. Por mapa de planta, un estilo de pared y un estilo de suelo, cada uno cambiado en el modo Organizar con un toque, gratis y reversible: el gesto único para una superficie de Stardew y la elección por habitación de New Horizons, no la permanencia de Habbo.41533 Los estilos no cuentan para los 16.
El vocabulario que existe. Dos paños de pared (plaster y blocks), tres suelos (tablas o, baldosas t, mármol s) y la alfombra.64 La forja dibuja por reglas a partir de rampas de paleta con nombre, así que un estilo es un dibujante y una rampa. El primer juego son los 2 paños en 3 rampas cada uno y los 3 suelos en 2 rampas cada uno: 6 estilos de pared y 6 de suelo, todos dibujados por la forja, nada pintado a mano. Llegan más jugando (7.5).
Cómo se entrega. La forja exporta cada estilo como celdas de atlas junto a las de la propia habitación, y la app intercambia los índices de suelo de las celdas de pared y de las celdas de suelo; la alfombra conserva su nine-slice.
Criterios de aceptación. Una captura de room en cada estilo de pared y cada estilo de suelo, 12 en total; una comprobación de paleta de que cada pixel de cada estilo es un índice de la paleta de la forja; una prueba de que cambiar un estilo deja intactas las piezas colocadas y los puntos vestidos.
7.4 La carta de los domingos: una puntuación semanal con cada fuente impresa
Qué. Una vez por semana, en la primera apertura a partir de la medianoche del domingo, hora local, aparece en el felpudo una carta (un objeto en la celda de llegada) que califica la casa tal como está. Una carta por domingo, con la fecha de ese domingo en hora local como clave. La semana del tablón de misiones no puede ser la clave: Quest.current toma el intervalo weekOfYear del calendario, que empieza en el día en que empiece la semana del calendario, así que una clave semanal y la regla del domingo podrían no coincidir.70 Saltarse una semana no cuesta nada. La carta imprime cada línea de fuente con sus puntos, y después el total y el grado de la casa. El nombre es propio de Kiradex, la nota del curador por ahora, nunca el nombre del juego del que toma el ritmo.
Fuentes. La forma es la de la Academia de Interiorismo Feliz tal como la tabula Nookipedia (umbrales por cantidad, una bonificación por conjunto, una bonificación por color); los números son míos, y la colección entra en ella.6 Los topes son por mapa de planta, como los 16.
| Fuente | Puntos | Tope | Qué toma prestado |
|---|---|---|---|
| Cada pieza colocada | 100 | 16 piezas por planta | los umbrales por cantidad |
| Una planta amueblada: 6, 10 y 16 piezas | 500 en cada uno | 1.500 por planta | 1.000 a los 6, 10, 15 y 20 objetos |
| Un juego: 4 o más piezas de un mismo conjunto de la forja en una planta | 200 por pieza | 16 piezas por planta | 4 o más de una misma serie |
| Una rampa: el 70 % de las piezas de la planta y sus dos superficies, pared y suelo, en una misma familia de rampa | 100 por pieza colocada en la planta | 16 por planta | 70 % de un mismo color |
| Una rampa al 90 % (sustituye a la línea del 70 %) | 300 por pieza colocada en la planta | 16 por planta | 90 % de un mismo color |
| El estante: los 5 sitios para carpetas llenos con la colección | 500 | una vez | los escritorios de Emerald que sostienen muñecos |
| La vitrina: cada uno de sus 2 sitios tiene una carta | 300 cada uno | 600 | |
| El tablero: cada una de sus 3 celdas tiene un pin, un sello o una cinta | 100 cada una | 300 | |
| Deducciones | ninguna | la regla de camino ya rechaza una habitación bloqueada |
Propuesta. Cada línea se puede calcular a partir de la habitación local y de la colección.
La puntuación más alta que puede dar esta tabla es 23.600, calculada línea por línea para las dos plantas con 16 piezas y todas las bonificaciones cumplidas; las líneas de juego y de rampa suponen un conjunto y una familia de rampa lo bastante grandes para las dieciséis, así que es una cota superior, no una distribución que alguien haya dibujado. Una planta inicial con 8 piezas, antes de conjuntos, rampas o puntos, puntúa 1.300.21
En lo alto de la escala, la composición (conjuntos y rampas) vale más que la cantidad, que es justo para lo que sirve un tope.2421
La carta califica la casa en tres grados, y cada umbral es la puntuación que la propia tabla le da a una casa de referencia: 4.500 para las dos plantas con 10 piezas y el estante lleno; 7.600 para las dos plantas con 16 piezas y el estante, la vitrina y el tablero llenos; y 14.000 para esa misma casa con un juego de 8 y el 70 % en una rampa en cada planta. Una casa inicial, las dos plantas con 8, puntúa 2.600, por debajo del primer grado.21 Los tres números son propuesta mía; Blake fija los definitivos antes de que se publique la carta. A diferencia de los de la Academia, no suben, porque la forma de la casa nunca cambia (ver Fuera de este encargo, más abajo).6 Un grado de la casa no es una cinta. Las cintas que la app ya guarda vienen de los coleccionistas del pueblo y se almacenan como plaza.ribbons; esas son las cintas que muestra el tablero (sección 6).73 El grado de la casa se imprime en la carta y se guarda como un número (7.5), y nunca va al tablero.
Lo que la puntuación nunca lee. El nivel de mecenas, las monedas, las compras, los «me gusta», nada sobre otro jugador, ni un aspecto de habitación de mecenas. Cada línea se puede calcular a partir de la habitación local y de la colección, así que un coleccionista puede ver exactamente por qué sacó lo que sacó. Si el aspecto de habitación de mecenas se publica, se dibuja sobre el estilo de pared normal de la planta y no es en sí un estilo de pared: la planta conserva ese estilo normal para la puntuación, así que las líneas de rampa cuentan las mismas piezas y superficies con el aspecto puesto o quitado (7.5).
Cambio en la forja. PIECES gana una etiqueta set, dibujada como material a juego; los primeros conjuntos son las piezas existentes agrupadas por el material con que están dibujadas.
Criterios de aceptación. Una función pura Score.week(room:collection:) con una prueba unitaria por cada línea: una planta con 5, 6, 10 y 16 piezas; un juego de 3 y otro de 4; un 69 %, 70 %, 89 % y 90 % en una rampa; un estante con 4 y con 5 carpetas. Una prueba de que el máximo es 23.600. Una prueba de que las tres casas de referencia puntúan 4.500, 7.600 y 14.000 y obtienen el primer, segundo y tercer grado de la casa, y de que la casa inicial, con 2.600, no obtiene ninguno. Una prueba de que alcanzar un grado de la casa no añade nada a plaza.ribbons ni al tablero. Una prueba de que la carta de un domingo se genera una sola vez (la misma fecha de domingo dos veces da una carta, el domingo siguiente otra), y de que un calendario cuya semana empieza el lunes produce las mismas claves. Una prueba de que dos perfiles que solo difieren en el nivel de mecenas obtienen puntuaciones idénticas. Una captura de UI de la carta en el felpudo un domingo, con un argumento de lanzamiento que fija la fecha.
7.5 Desbloquear jugando, nunca comprando
Qué. El catálogo que posee un coleccionista se deriva del juego. Tres de sus seis entradas existen hoy: los niveles y los pines, derivados de la colección sincronizada, y los sellos de misión, registrados solo en el dispositivo. Las otras tres necesitan contadores nuevos, cada uno con nombre y sincronizado:
- Niveles. La curva de WORLD.md es
level = floor(sqrt(XP / 40)) + 1.67 Un tipo o un estilo en cada nivel del 2 al 20, y después cada dos niveles, igual que WORLD.md ya bloquea los cosméticos «that cannot be bought» (que no se pueden comprar).67 Disponible hoy, derivado de la colección sincronizada: la app calcula la experiencia y el nivel a partir de ella, «so every device agrees without anything being stored» (para que todos los dispositivos coincidan sin guardar nada).74 - Pines. Cada pin desbloquea una pieza con nombre: Full Set una mesa de exposición, Vintage un reloj, Across the Sea un biombo. La primera y la última son piezas nuevas de la forja.67 Disponible hoy, derivado de la colección sincronizada con el mismo cálculo.74
- Misiones semanales. Cada misión semanal completada añade una copia de una pieza básica: una silla, una planta, una caja.70 Registrado hoy, pero solo en el dispositivo: los sellos viven en
@AppStorage("quests.stamps"), que es UserDefaults, no el almacén sincronizado, así que pasan aPlayRecord(abajo) antes de que ninguna pieza dependa de ellos.7375 - Pasos. Una caminata larga, una pieza que cuesta muchos pasos, igual que la silla de cristal de Emerald cuesta 6.000 de ceniza recogida paso a paso. El saco de Emerald no muestra ningún contador, y su taller indica lo que falta solo cuando el jugador vuelve a él; aquí la propuesta es un contador que se mantiene visible en la tarjeta de la pieza en la bandeja, pasos caminados frente a pasos necesarios.2815 Una flor prensada de la planta del alféizar es una propuesta aparte, un objeto de pared cuyo desbloqueo fija el encargo de Honrar los viejos juegos de Pokémon sin tomarlos prestados, con la planta creciendo una etapa cada 256 pasos, quedándose en flor durante 1.024 pasos y soltando después una flor, y no el contador de este punto. Nuevo: la app no lleva hoy ninguna cuenta de pasos, así que esto necesita
stepsWalked.73 - Visitas. Los rangos del pasaporte en 30, 100 y 500 habitaciones visitadas desbloquean cada uno un estilo.69 Nuevo: hoy nada registra una visita, ni en el dispositivo ni en el servidor, así que esto necesita
roomsVisited, los ids de los anfitriones.7368 - La carta. La primera vez que un coleccionista alcanza cada grado de la casa, desbloquea una pieza. Nuevo: los grados de la casa solo existen en este encargo (7.4), así que esto necesita
letterTier, el grado de la casa más alto alcanzado.
Diff del modelo. Los sellos de misión y los tres contadores nuevos viven en un modelo sincronizado, PlayRecord, un registro por dispositivo, con la misma forma que los demás de la app para CloudKit (7.7). El catálogo lee el registro de cada dispositivo: los pasos se suman, los sellos y los anfitriones visitados se unen, y gana el grado de la casa más alto. El dispositivo guarda el uid de su propio registro bajo una clave @AppStorage, en el mismo espacio de nombres de UserDefaults que plaza.id, el id del dispositivo en la plaza.7375 Cada dispositivo escribe solo su propio registro, así que dos dispositivos nunca editan el mismo y no hace falta ninguna regla de fusión. Eso solo se cumple mientras el puntero se quede en un dispositivo, y una copia de seguridad restaurada en un segundo teléfono se llevaría el puntero consigo (mi lectura; no se probó ninguna restauración). Así que el registro lleva una marca de dispositivo, writer, y la regla es: un dispositivo restaurado crea un registro nuevo cuando el registro de su puntero lo escribió otro dispositivo. El registro antiguo se queda, y el catálogo lo sigue leyendo. Qué valor sirve como marca que una copia de seguridad no lleve a un teléfono nuevo no queda resuelto en este encargo; la prueba fija la regla. En el primer arranque tras el cambio, el dispositivo copia su lista quests.stamps en su registro una vez.
Lo que se rechaza. Ningún mueble ni estilo como compra dentro de la app, ningún precio en monedas para muebles, ningún mueble aleatorio de ningún tipo, ninguna pieza de cantidad limitada y ningún intercambio de muebles: los muebles sorpresa, las rarezas y los valores de intercambio de Habbo son el contraejemplo.1735 Mi lectura: una app para mayores de 9 años cuyo ciclo de decoración se compra o es aleatorio carga con preguntas de cajas de botín y de presión que la app de colección no necesita, y desbloquear jugando las evita. La única excepción de pago que permite la nota de investigación es «one room skin» (un aspecto de habitación) para los mecenas, y el artículo del mundo lo nombró: «Patron flair stays on the name-plate and the room skin» (los distintivos de mecenas se quedan en la placa con el nombre y en el aspecto de la habitación).6910 La misma frase fija el límite: los distintivos de mecenas «never touches a pedestal slot or a judging bonus» (nunca tocan un hueco de pedestal ni una bonificación de calificación).10 Este encargo reabre el aspecto como decisión de Blake en vez de darlo por resuelto. Si lo mantiene, el aspecto es una capa visual superpuesta, no un estilo de pared. La planta conserva el estilo de pared normal que eligió el coleccionista, el aspecto se dibuja encima, y la puntuación lee solo el estilo normal, así que las líneas de rampa de 7.4 cuentan las mismas piezas y superficies, sobre el mismo denominador, con el aspecto puesto o quitado. Sacar la pared del recuento de la rampa, en cambio, no sería neutral, porque la proporción cuenta las superficies además de las piezas. Una planta de 16 piezas, con 15 de ellas y el estilo de suelo en una misma rampa y la pared fuera de ella, son 16 de 18, un 88,9 %, en la línea del 70 % por 1.600 puntos, 100 por cada una de las 16 piezas colocadas, incluida la que está fuera de la rampa; si se saca la pared, son 16 de 17, un 94,1 %, en la línea del 90 % por 4.800, 300 por cada una de las 16, una bonificación de calificación de 3.200 por el aspecto de pago.76 La prueba de abajo excluye el aspecto por su nombre.
Criterios de aceptación. Una prueba unitaria de que el catálogo en propiedad es una función pura de la XP, los pines, los sellos de misión, los pasos caminados, las habitaciones visitadas y el grado de la casa, y no cambia con nada más; una prueba de que los PlayRecord de dos dispositivos dan el mismo catálogo leídos en cualquier orden (pasos sumados, sellos y anfitriones unidos, el grado de la casa más alto); una prueba de que la lista quests.stamps existente de un dispositivo se copia en su registro una vez y nunca dos; una prueba de que un dispositivo cuyo puntero nombra un registro con el writer de otro dispositivo crea un registro nuevo, deja el antiguo sin cambios y sigue contando los dos; una prueba de que ningún identificador de producto de StoreKit ni ningún artículo de la tienda de monedas se corresponde con un tipo de mueble o un estilo, con una excepción con nombre: si Blake mantiene el aspecto de habitación de mecenas, su producto se corresponde con exactamente una capa superpuesta y con ningún estilo de pared, y aplicarlo deja sin cambios el estilo de pared que puntúa en la planta; una prueba de que una planta puntúa lo mismo, línea por línea, y obtiene el mismo grado de la casa con el aspecto puesto y quitado, ejecutada en cada límite de umbral: 5, 6, 10 y 16 piezas, 69 %, 70 %, 89 % y 90 % en una rampa, cada caso con la pared normal dentro de la familia de rampa y fuera de ella, y casas con un punto por debajo de cada umbral de grado de la casa y justo en él; una prueba de instantánea de la bandeja del catálogo en el nivel 1 (solo el juego inicial) y en el nivel 20.
7.6 Visitas: solo lectura, un «me gusta» al día, un total que nunca baja
Qué. Un visitante entra en la casa de un anfitrión por su puerta, usando los warps de habitación que el pueblo ya tiene para las casas de sus propios coleccionistas,39 y ve las piezas colocadas, los estilos y los puntos vestidos del anfitrión. El visitante puede caminar y decir frases preestablecidas, y no puede mover, llevarse ni añadir nada: la regla de Habbo, y el fin al que llega el sueño de New Horizons al no conservar nada de lo que cambia un visitante.1832 Un «me gusta» en la puerta cuenta una vez por visitante, por anfitrión y por día local, y el total del anfitrión nunca baja, ni siquiera cuando redistribuye: la regla de Club Penguin, según su única fuente de fans.19 Visitar le da al visitante un sello en el pasaporte, que el dispositivo del visitante añade a roomsVisited en su PlayRecord (7.5).69
Diff del servidor. El servidor de hoy no guarda nada.68 Las visitas necesitan dos registros pequeños por jugador. El primero es la distribución de la casa: como mucho 32 piezas colocadas en dos plantas, cada una con tipo, x, y y orientación, más dos ids de estilo por planta. Como JSON compacto con claves con nombre, el nombre de tipo propuesto más largo en cada hueco e ids de estilo de 16 caracteres, son 1.974 bytes, menos de 2 KB; como cuádruplas de números sin más serían 385 (mi cálculo; la base entera de Emerald ocupa 32 bytes).7211 El segundo es un total de «me gusta» con el conjunto de visitantes del día. Ninguno de los dos guarda datos personales más allá del alias del jugador. El servidor valida una distribución con las mismas seis reglas antes de guardarla, así que un cliente modificado no puede guardar una habitación ilegal. Los contadores de juego de 7.5 (sellos de misión, pasos caminados, habitaciones visitadas, el grado de la casa) no son registros del servidor: se sincronizan por el iCloud del propio coleccionista en PlayRecord, y el servidor nunca los lee.
Criterios de aceptación. Pruebas del servidor: se rechaza una distribución con un solapamiento, un camino bloqueado o una 17.ª pieza en una planta; se rechaza un mensaje de mover o colocar de un visitante en la habitación de un anfitrión; dos «me gusta» de un mismo visitante en un mismo día cuentan una vez y un «me gusta» al día siguiente cuenta; un anfitrión que vacía la habitación conserva el total. Un recorrido con dos simuladores: el dispositivo A organiza, el dispositivo B visita y ve las mismas piezas en las mismas celdas, con una captura de cada uno.
7.7 El modelo y la pantalla en iOS 26
SwiftData. Dos modelos, con la misma forma que los demás de la app para CloudKit: valores por defecto en todo, nada único, y un uid con un UUID asignado en init, como el que llevan Profile, PriceHistory y CardCopy.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 }
}
Los estilos de pared y de suelo viven como cadenas en Profile, junto a lookData.77 Ningún #Unique y ninguna relación obligatoria, porque CloudKit no admite ninguna de las dos cosas.22 La exclusividad de celda, el tope y la caminata se imponen en código, con una sola función. RoomLayout.repair(_:) se ejecuta en cada lectura. Ordena las piezas sincronizadas de una planta por uid, en orden ascendente, y reconstruye la planta a partir de su arquitectura fija (el mapa de letras, la escalera y los pilares), añadiendo cada pieza en ese orden solo si la comprobación de colocación completa de 7.1 la acepta frente a las piezas ya aceptadas: las reglas de celda (así que nada de solapamientos), el tope de 16 y la regla de camino. Una pieza que la comprobación rechaza vuelve a la bandeja. Todos los dispositivos ordenan los mismos registros de la misma manera, así que todos reconstruyen la misma habitación, y cuando dos piezas chocan, gana el uid menor, la regla que PriceBook ya usa para elegir uno de los historiales de precios de dos dispositivos.52 El orden es por uid, no por la hora de colocación, porque una hora sale del reloj de cada teléfono. El solapamiento no es el único conflicto que pueden crear dos teléfonos. Una cama en (9,3) colocada en un teléfono y una mesita de noche en (6,4) en otro pasan cada una la comprobación completa en su propio dispositivo, y juntas dejan aisladas las dos celdas que hay delante de la vitrina; la reconstrucción conserva la de uid menor y devuelve la otra.2066 Como quitar una pieza nunca corta un camino, una planta que ya es legal pasa la reconstrucción sin cambios en cualquier orden (razonamiento mío; las pruebas de aceptación lo fijan). Las piezas iniciales de 7.2 son el único caso en que dos dispositivos crean registros sin que actúe un jugador, así que cada una recibe un uid fijo a partir de su planta y su hueco, de starter.room.1 a starter.room-up.8, en lugar de uno aleatorio: dos dispositivos que arrancan en frío crean los mismos dieciséis uid, no dieciséis parejas que la reconstrucción repartiría entre la planta y la bandeja. Antes de reconstruir, repair une en uno los registros que comparten uid, igual que ModelContext.profile() ya une los perfiles duplicados que deja la sincronización en el de uid menor.77 Cuando dos copias no coinciden, porque un dispositivo movió su pieza inicial antes de que el otro arrancara por primera vez, la unión conserva la copia que está fuera de su celda inicial, y entre dos copias movidas, la de fila menor y después la de columna menor (propuesta mía). Si guardar una pieza borra su registro, una pieza inicial guardada en un teléfono vuelve cuando un segundo teléfono arranca en frío; este encargo no resuelve ese caso.
Colocación. El modo Organizar superpone una bandeja de SwiftUI a la RealityView de la habitación. Un elemento de la bandeja es draggable con su tipo como carga Transferable; la vista de la habitación es un destino de soltado.53 En iOS 26, dropDestination(for:action:isTargeted:) le pasa a la acción el punto de soltado en las coordenadas de la vista, y el punto se convierte en una celda con la escala de pixel entero conocida de la cámara: cell = floor((point - mapOrigin) / tileSizeInPoints).54 Como la página de Apple lista esa forma como obsoleta en iOS 27.2, el encargo construye también la forma con DropSession y lee la ubicación de la sesión, si la lleva; esa página no se ha leído.54 Una pieza colocada se selecciona con SpatialTapGesture y se mueve con DragGesture, ajustándose celda a celda, con su huella teñida por celda como Stardew tiñe sus tiles.565516
VoiceOver. En el modo Organizar, cada pieza colocada es un elemento de accesibilidad, por ejemplo Sofá, tres por dos, columna 9, fila 8, con las acciones con nombre Mover a la izquierda, Mover a la derecha, Mover arriba, Mover abajo, Girar (solo sillas) y Guardar.5758 Un rotor llamado «Muebles» lista las piezas de la habitación.60 La acción Colocar de un elemento de la bandeja pone la pieza en la celda legal más cercana a la llegada y la enfoca. Los estilos de pared y de suelo son elementos ajustables: desliza hacia arriba y hacia abajo para ir pasando.59 Cada rechazo se dice como un aviso, por ejemplo No se puede mover: el sofá dejaría aislado el estante.61 Las reglas de 7.1 son una sola función, así que la voz y el tacto nunca pueden discrepar.
Criterios de aceptación. Una prueba unitaria de que repair resuelve un solapamiento entre dos dispositivos de la misma manera en cualquier orden. La regresión de fusión entre dos dispositivos, ejecutada con los dos registros en los dos órdenes de entrada: en room tal como la crea hoy la forja, el dispositivo A coloca una cama en (9,3) y el dispositivo B una mesita de noche en (6,4); cada colocación pasa sola la comprobación completa; tras sincronizarse las dos, repair devuelve la misma habitación para los dos órdenes, conserva la pieza de uid menor, pone la otra en la bandeja con un mensaje que nombra la vitrina, y la caminata desde la llegada sigue alcanzando las dos celdas que hay delante de la vitrina; con los dos uid intercambiados, se conserva la otra pieza.66 Una prueba de que repair deja sin cambios una planta legal de 16 piezas, con sus registros barajados en varios órdenes. Una prueba de que 17 piezas sincronizadas en una planta, legales en conjunto salvo por el tope, vuelven como 16, con el uid mayor en la bandeja. Una prueba de que dos dispositivos que arrancan en frío, creando cada uno las piezas iniciales, se sincronizan en un registro por celda inicial, 8 por planta, sin nada en la bandeja, en cualquier orden de sincronización; y de que una pieza inicial movida en un dispositivo antes de que arranque el otro se queda donde se movió. Una prueba de UI que arrastra un elemento de la bandeja a una celda y encuentra una PlacedPiece en esa celda. Pruebas unitarias de los manejadores de las acciones de VoiceOver, llamados directamente sobre el modelo de Organizar, no a través de VoiceOver: Colocar pone una silla en la celda legal más cercana a la llegada; Mover a la izquierda, Mover a la derecha, Mover arriba y Mover abajo la mueven una celda cada una o la rechazan con un motivo; Girar va cambiando su orientación; Guardar la devuelve a la bandeja; y cada rechazo produce el texto del aviso que publicará la pantalla. En un simulador de iOS 27, una prueba de UI que activa VoiceOver a través de XCUIVoiceOverService, mueve el foco a una pieza colocada y comprueba su etiqueta hablada, como Sofá, tres por dos, columna 9, fila 8.63 Una auditoría del modo Organizar con performAccessibilityAudit que no informe de ningún problema.62 Una comprobación manual en un dispositivo con VoiceOver activado, registrada con su fecha y su compilación, porque ninguna llamada de XCUIAutomation ejecuta una acción personalizada, gira un rotor o lee un aviso: colocar una silla desde la bandeja, moverla en las cuatro direcciones con las acciones, girarla, guardarla, saltar entre piezas con el rotor Muebles y oír el aviso de cada movimiento rechazado. Antes de todo esto, una prueba exploratoria: soltar una carga sobre la habitación en el simulador con la escala real de la cámara y registrar la celda calculada frente a la celda que queda bajo el dedo, porque esa conversión no está probada.
7.8 Mantenimiento
- WORLD.md recibe las reglas de la habitación, con los números de este encargo, para que el documento de diseño diga lo que publicó el artículo del mundo.6710
- El docstring y la tabla de
interiors.pyse ponen de acuerdo de una forma o de otra: o el docstring dice que las piezas pequeñas son la excepción, o las piezas pequeñas se vuelven a dibujar a dos tiles. El encargo las conserva.9
Fuera de este encargo
- Apilar más allá de los puntos propios del estante: ninguna pieza sobre una mesa, ninguna superficie de muñeco sobre escritorio. La idea de las superficies es el siguiente paso, una vez probados el tope y la caminata.
- Piezas que hacen algo al pisarlas: nada de alfombras con sonido, ni muelles, ni toboganes.
- Colocación por media celda. La cuadrícula se queda en celdas enteras de 16 pixeles.
- Amueblar el salón de exposición. Sus pedestales siguen siendo de la exposición semanal.
- Un concurso de amueblado. El salón semanal es el concurso, juzgado con sus propias reglas.
- Planos: la forma de la casa no cambia.
- Visitas a desconocidos fuera de una plaza compartida, y cualquier clasificación de habitaciones más allá del total propio del anfitrión.
Nunca, en el amueblado
- Ningún vocabulario de franquicia para nada de esto: ni la base, ni la computadora de decorar, ni la Academia, ni el mezclado de datos, ni el nombre de ninguna decoración. Solo las palabras de Kiradex. Los juegos se nombran en este artículo como hechos sobre obras publicadas, no como funciones.
- Ninguna pieza dibujada a partir de la decoración de un juego: ni muñecos ni cojines de criaturas, nada con forma de bola, ni pósteres de criaturas, ni una alfombra con nombre de movimiento. Las piezas de la forja son muebles domésticos, y así se quedan.
- Ninguna criatura en ninguna habitación. Las plantas son plantas.
- Ningún mueble comprado, aleatorio o limitado (7.5).
- Nada en una habitación se apunta, se lanza, se atrapa, se invoca, se suelta para combatir ni se monta.
- Nada de código ni de datos de las descompilaciones en la app ni en la forja. El código descompilado es para estudiar y medir; las reglas de arriba están reformuladas en los términos propios de Kiradex.
Criterios de aceptación. Un grep del catálogo de cadenas, de los nombres de PIECES de la forja y de las tablas del servidor con una lista de palabras construida a partir del vocabulario de franquicia del punto 1, más «decoration», «doll», «Happy Home» y «Academy», no devuelve nada.
Conclusiones clave
Si dibujas el arte
- Dibuja los muebles al ancho del fotograma o de la celda del personaje. El fotograma del jugador de Emerald tiene una celda de 16 pixeles de ancho y sus decoraciones miden de media 2,43 celdas; el coleccionista de Kiradex ocupa una celda de dos tiles de ancho y sus piezas miden de media 3,04.2729
- Haz un catálogo de piezas sobre todo pequeñas con unas cuantas anclas grandes: 71 de las 120 decoraciones de Emerald ocupan una celda, y sus escritorios y alfombras de 3 por 3 son las anclas sobre las que se apoyan las pequeñas.224
- Dibuja papeles pintados y suelos a partir de reglas y rampas, para que un estilo sea un dibujante y una paleta, no un cuadro nuevo: dos paños de pared en tres rampas y tres suelos en dos rampas le dan a Kiradex seis de cada.64
Si construyes el motor
- Guarda una pieza colocada como tipo, celda y orientación. Emerald guarda una en dos bytes, una base en 32.1112
- Comprueba la colocación por celda y después camina. La comprobación por celda de Emerald nunca pregunta si la puerta sigue llegando a algo; en la planta baja de Kiradex, 713 de 229.891 parejas legales de piezas extra dejan aislados la escalera, el anfitrión o una exposición sin cubrirlos.420
- Con la sincronización de CloudKit, SwiftData no puede imponer una restricción de unicidad, así que una pieza por celda es una función pura de reparación que elige el mismo ganador en cada dispositivo. Haz que reconstruya la habitación pasando por toda la comprobación de colocación, caminata incluida, en un orden fijo: dos ediciones que pasan cada una en su propio teléfono pueden dejar aislada una exposición entre las dos.225266
- Dale a VoiceOver verbos, no una cuadrícula que recorrer deslizando: acciones de movimiento con nombre, un rotor de piezas, un aviso para cada rechazo.586061
Si diseñas el ciclo
- Pon tope a lo que se coloca, no a lo que se posee: Emerald coloca 16 y guarda 150. El tope es la composición.2
- Puntúa en un día fijo con cada fuente desglosada, sube el listón solo cuando crece la casa y nunca castigues una semana perdida: la página de la casa de la wiki, que no nombra ningún juego, dice que una casa descuidada durante al menos una semana se llena de cucarachas, y la tabla de la Academia de New Horizons resta 2.500 por cucaracha.56
- Haz crecer el catálogo jugando. Emerald nunca vende por dinero 24 de sus 120 decoraciones y vende otras dos solo por ceniza recogida caminando; Stardew, tras la primera mejora, vende un catálogo de 200.000g que después vende por 0g los muebles que lista; y los muebles escasos y aleatorios de Habbo son el contraejemplo para una app infantil.14151617
- Los visitantes miran, no tocan y dejan un «me gusta» al día sobre un total que nunca baja.51819
Preguntas frecuentes
¿Cuántos objetos debería poder colocar un jugador en una habitación?
Los suficientes para componer, y pocos como para tener que elegir. Pokémon Emerald pone un tope de 16 decoraciones colocadas en una base y de 12 en el dormitorio, más o menos una cuarta parte de las 60,2 celdas transitables de una base media. Animal Crossing: New Horizons permite 150 por habitación, contando los objetos de pared y de techo, según Nookipedia, y Final Fantasy XIV permite de 150 a 600 en interiores según el tamaño de la vivienda desde el parche 7.5. Para una habitación 2D sin capa de pared ni de techo, mi umbral es un tope por debajo de un objeto por cada tres celdas de suelo, y el 0,27 de Emerald queda justo por debajo; los 16 que se proponen para Kiradex son 0,13 por celda de suelo.2579
¿Cómo funciona el sistema de decoración de Pokémon Emerald?
Son datos. 120 decoraciones llevan cada una una categoría, una forma de 1 a 9 celdas, un precio y uno de cinco permisos (suelo sólido, suelo pisable, detrás, pared o sprite). CanPlaceDecoration comprueba cada celda cubierta: suelo liso, ningún objeto y, en la celda en la que estaba el jugador, ningún tile con un tipo de capa no normal; celdas de pared para los pósteres; una celda que sostenga para los muñecos y los cojines, pequeña o grande para la mayoría y grande para un muñeco de 1 por 2. 18 decoraciones ofrecen celdas que sostienen piezas pequeñas: siete escritorios, tres ladrillos, un neumático y siete alfombras. Las decoraciones colocadas se guardan como un byte de id y un byte de posición cada una.2411
¿Cómo puntúa una habitación la Academia de Interiorismo Feliz?
Según las tablas de Nookipedia, que no citan ninguna fuente para New Horizons: una evaluación por correo la mayoría de los domingos por la mañana, rangos B, A y S, un umbral de la S que sube de 15.000 a 90.000 a medida que crece la casa, 1.000 puntos al llegar a 6, 10, 15 y 20 objetos en una habitación, bonificaciones por objeto por series, conjuntos, categorías, un color dominante y feng shui, y deducciones por cucarachas, basura y objetos mirando a una pared. Los puntos por objeto son un esbozo en la wiki.6
¿Puede SwiftData imponer un objeto por celda de la cuadrícula con la sincronización de CloudKit?
No con #Unique. La guía de Apple para sincronizar SwiftData incluye las restricciones de unicidad entre las funciones «that CloudKit doesn’t support natively» (que CloudKit no admite de forma nativa), y CloudKit exige que todas las relaciones sean opcionales. Dale un valor por defecto a cada propiedad, no hagas nada único y resuelve las piezas de dos dispositivos en una misma celda con una función pura que se ejecuta en cada lectura y elige el mismo ganador en cada dispositivo. Haz que esa función reconstruya la habitación en un orden fijo pasando por la comprobación de colocación completa, no solo por la prueba de solapamiento, porque dos ediciones legales por separado pueden romper una regla juntas.225166
¿Cómo se hace accesible para VoiceOver una cuadrícula de muebles con arrastrar y soltar?
Haz que cada pieza colocada sea un elemento de accesibilidad con su tamaño y su celda en la etiqueta, dale acciones con nombre para moverse una celda en cada dirección, girar y guardar, añade un rotor que liste las piezas de la habitación y anuncia cada movimiento rechazado con su motivo. accessibilityAction(named:_:), accessibilityRotor(_:entries:) y AccessibilityNotification.Announcement de Apple cubren cada parte, y performAccessibilityAudit comprueba la pantalla en una prueba de UI. La auditoría no pulsa las acciones con nombre, y en Xcode 27.0 ninguna llamada de XCUIAutomation lo hace, así que prueba directamente los manejadores de las acciones y comprueba a mano las acciones, el rotor y los avisos con VoiceOver activado.5860616263
¿Debería un juego infantil vender muebles?
Mi lectura es que no, para una app con clasificación de 9+: un ciclo de decoración que se compra, que es aleatorio o que es escaso carga con preguntas de cajas de botín y de presión que el juego no necesita. Emerald nunca vende por dinero 24 de sus 120 decoraciones (son premios, canjes por puntos de batalla y regalos) y vende otras dos solo por ceniza recogida caminando, y una vez hecha la primera mejora de la casa, Stardew vende un Catálogo de muebles por 200.000g que después vende por 0g los muebles que lista, aunque algunas piezas siguen saliendo solo del Museo, de los festivales y de otras fuentes. La economía de Habbo, basada en la compra, con rarezas y muebles sorpresa aleatorios, muestra el otro extremo.14151617
¿Por qué los visitantes de estos juegos tienen acceso de solo lectura?
Según mi lectura, porque la habitación es la expresión del anfitrión. Los visitantes de Animal Crossing no pueden «modify the interior in any way» (modificar el interior de ningún modo), los de Habbo no pueden soltar ni mover muebles sin los permisos del dueño, y los dueños de Club Penguin pueden decorar su propio iglú «but not other player’s igloos» (pero no los iglús de otros jugadores). Lo que reciben los visitantes a cambio es una marca que cuenta: el «me gusta» por diseño y por día de Club Penguin, sobre un Grand Total que nunca baja.518819
Relacionado en este sitio: Estructuras en pixel art: casas, salones e interiores en el iPhone construyó los interiores que amuebla este encargo, y su sección de interiores describe las habitaciones de 14 por 11 que sustituyó la compilación 26; Mundos de pixel art en el iPhone es donde se publicaron por primera vez el tope de dieciséis, las visitas de solo lectura, el «me gusta» diario y el informe de los domingos; Personas en pixel art: personajes y un creador en el iPhone trata del coleccionista cuyo ancho marca el ritmo de los muebles; Distribución de pueblos en pixel art: de Pueblo Paleta a Pelican Town, medida mide el pueblo en el que están las casas; Movimiento en pixel art: caminatas, cámaras y puertas en el iPhone trata de la caminata y de las puertas por las que entra un visitante; y Rutas en pixel art: conexiones de mapas y distritos en el iPhone trata de las tierras más allá del pueblo.
Fuentes
-
pret,
pokeemerald/include/constants/global.h(SECRET_BASES_COUNT 20,DECOR_MAX_SECRET_BASE 16,DECOR_MAX_PLAYERS_HOUSE 12), commit731ad5b(1 de octubre de 2026), leído el 5 de octubre de 2026, https://github.com/pret/pokeemerald/blob/master/include/constants/global.h. ↩↩↩↩↩ -
Medición del autor, 5 de octubre de 2026:
measure_emerald_decor.pyen la carpeta de evidencias del autor para este artículo, con la salida guardada comomeasure_emerald_decor.out, ejecutado sobre un clon superficial depokeemeraldde pret en el commit731ad5b. Lee los topes deinclude/constants/global.h; las 120 decoraciones (sin contarDECOR_NONE) con categoría, forma, permiso y precio desrc/data/decoration/header.h; los arrays de inventario por categoría deinclude/global.h; el byte de comportamiento de cada metatile de decoración dedata/tilesets/secondary/secret_base/metatile_attributes.bin; y cada una de las 24 distribuciones de base y el dormitorio dedata/layouts/layouts.jsony sumap.bin, contando las celdas transitables a partir de los bits de colisión. Celdas por decoración a partir de los nombres de forma; tope sobre la media de celdas transitables 16 / 60,2 = 0,27. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
pret,
pokeemerald/src/data/decoration/header.h(gDecorations[]: nombre, permiso, forma, categoría, precio y tiles de cada decoración; entrada 0DECOR_NONE), commit731ad5b, leído el 5 de octubre de 2026, https://github.com/pret/pokeemerald/blob/master/src/data/decoration/header.h. ↩↩↩↩ -
pret,
pokeemerald/src/decoration.c(CanPlaceDecoration,DecorationItemsMenuAction_AttemptPlace,isPlayerRoom,gText_CantPlaceInRoom; las comprobaciones de celda que sostiene para las decoraciones sprite), commit731ad5b, leído el 5 de octubre de 2026, https://github.com/pret/pokeemerald/blob/master/src/decoration.c. En el caso sprite, una decoración de 1 por 2 necesitaMetatileBehavior_HoldsLargeDecorationy cualquier otra admite una celda que sostiene pequeña o grande;IsntInitialPositionrechaza la celda de partida del jugador solo cuando el tile de la decoración en ella tiene un tipo de capa distinto deMETATILE_LAYER_TYPE_NORMAL. Que nada en la función compruebe un camino es la lectura que hace el autor de ella. ↩↩↩↩↩↩↩↩↩↩ -
Nookipedia, «Player house» (topes por habitación: 24 en Wild World, 64 en City Folk, 48 en New Leaf, 150 en New Horizons «including wall and ceiling-mounted furniture»; la tabla de ampliaciones de New Horizons con los tamaños de las habitaciones; «only the main room can be expanded in size»; la pared de acento desde la 2.0; los visitantes no pueden «modify the interior in any way»; un jugador que descuida su casa «for at least one week» la encuentra infestada de cucarachas), descargado y guardado el 5 de octubre de 2026 como
nook-player-house.htmly.txten la carpeta de evidencias de las habitaciones, https://nookipedia.com/wiki/Player_house. Los 4,2 objetos por tile son aritmética del autor (150 / 36). ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Nookipedia, «Happy Home Academy» (la evaluación del domingo; los rangos B, A y S por ampliación; las bonificaciones y deducciones de puntos de New Horizons; «This section is a stub» para los puntos por objeto de New Horizons; la nota de la tabla de recompensas «Includes data sourced from the Data Spreadsheet for Animal Crossing New Horizons»), descargado y guardado el 5 de octubre de 2026 como
nook-hha.htmly.txt, https://nookipedia.com/wiki/Happy_Home_Academy. Las tablas de bonificaciones y deducciones no llevan cita en la página. ↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Square Enix, The Lodestone, notas del parche 7.5 de Final Fantasy XIV (actualizadas el 13 de mayo de 2026; los límites de muebles de interior y de exterior antes y después en la sección de vivienda; la nota de visualización de 400 muebles; «Furnishings from the FFXIV Furnishing Design Contest have been added»), descargadas y guardadas el 5 de octubre de 2026 como
ffxiv-patch-7-5.htmly.txt, https://eu.finalfantasyxiv.com/lodestone/topics/detail/9beb8a7b5c46944cd80ed92b2b8e972395fbea80/. La guía de juego de vivienda, https://na.finalfantasyxiv.com/lodestone/playguide/contentsguide/housing/, devolvió HTTP 404 ese mismo día; los tamaños de parcela no tienen fuente en este artículo. ↩↩↩↩↩↩↩↩↩↩ -
Club Penguin Wiki (Fandom), «Furniture» (el límite de propiedad de 99 unidades para la mayoría de los muebles; «igloos have a limit preventing more than 99 units of furniture being placed at once»; los dueños decoran su propio iglú «but not other player’s igloos»; los seis objetos gratis para no suscriptores del 26 de julio de 2012), leído mediante la API de MediaWiki de la wiki y guardado el 5 de octubre de 2026 como
cp-fandom-furniture.htmly.txt, https://clubpenguin.fandom.com/wiki/Furniture. Una sola fuente. ↩↩↩↩↩↩ -
Medición del autor, 5 de octubre de 2026:
measure_kiradex_interiors.pyen la carpeta de evidencias de las habitaciones, salidameasure_kiradex_interiors.out, que analizascripts/forge/interiors.pydel repositorio de Kiradex con el móduloastde Python (el archivo nunca se importa ni se ejecuta): las 23 entradas dePIECEScon ancho, alto e indicador de exenta; los mapas de letrasROOM,ROOM_UPyHALLcon sus listas de muebles y sus puntos; las celdas de suelo contadas como las letraso t s r; las piezas movibles excluyenstairs,stairs_downypillar. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Blake Crosley, «Pixel-Art Worlds on iPhone: What the 16-Bit Masters Knew», blakecrosley.com, 3 de octubre de 2026 (las reglas de la habitación: «a furnishing cap of sixteen», visitas de solo lectura, un «me gusta» una vez al día, un total que nunca baja, un informe dominical «with its point sources listed»; en el mismo párrafo, «Patron flair stays on the name-plate and the room skin»; las patentes nombradas en la demanda de Palworld; el ajuste de cámara de pixeles del dispositivo por texel), https://blakecrosley.com/blog/pixel-art-world-on-iphone. ↩↩↩↩↩↩↩↩↩↩
-
pret,
pokeemerald/include/global.h(u8 decorations[DECOR_MAX_SECRET_BASE]yu8 decorationPositions[DECOR_MAX_SECRET_BASE]en el registro de la base secreta; los arrays de inventario de decoraciones por categoría en la partida), commit731ad5b, leído el 5 de octubre de 2026, https://github.com/pret/pokeemerald/blob/master/include/global.h. ↩↩↩↩↩↩↩ -
pret,
pokeemerald/src/secret_base.c(posiciones de las decoraciones leídas con x en el nibble alto e y en el bajo), commit731ad5b, leído el 5 de octubre de 2026, https://github.com/pret/pokeemerald/blob/master/src/secret_base.c. ↩↩↩ -
pret,
pokeemerald/include/decoration.h(enum DecorationPermissioncon el comentario «The nomenclature here describes collision and placement permissions, in that order.»;enum DecorationShape, conDECORSHAPE_3x1yDECORSHAPE_1x3marcados como sin usar), commit731ad5b, leído el 5 de octubre de 2026, https://github.com/pret/pokeemerald/blob/master/include/decoration.h. ↩↩↩ -
Medición del autor, 5 de octubre de 2026:
measure_emerald_sources.pyen la carpeta de evidencias de las habitaciones, salidameasure_emerald_sources.out, que busca en pokeemerald731ad5bcada constanteDECOR_en las listaspokemartdecorationdedata/maps/*/scripts.inc, en el script del rincón de premios, en la tabla de canjes de la instalación de combate desrc/data/battle_frontier/battle_frontier_exchange_corner.hy en el primer argumento degivedecorationyadddecorationen cualquier parte bajodata/: 90 vendidas por dinero en cinco tiendas, 3 del mostrador de premios, 15 por puntos de batalla, 10 entregadas por script, 24 nunca vendidas por dinero, 6 en ninguna de esas. Dos de las seis son la pareja del taller de vidrio (nota 15); las otras cuatro, tres muñecos legendarios y otro muñeco, no se rastrearon. ↩↩↩↩↩↩↩↩ -
pret,
pokeemerald/data/maps/Route113_GlassWorkshop/scripts.inc(PRETTY_CHAIR_PRICE, 6000,PRETTY_DESK_PRICE, 8000, pagados deVAR_ASH_GATHER_COUNT;Route113_GlassWorkshop_EventScript_NotEnoughAshy_NotEnoughAshForItemrestan la cuenta del precio y muestran la diferencia como pasos que faltan por caminar; una búsqueda ensrc,dataeincludeencuentraVAR_ASH_GATHER_COUNTusada solo ahí y enfield_tasks.c, aparte de su definición) ypokeemerald/src/field_tasks.c(una unidad de ceniza por paso entre la hierba con ceniza mientras se lleva el saco, hasta 9999), commit731ad5b, leído el 5 de octubre de 2026, https://github.com/pret/pokeemerald/blob/master/data/maps/Route113_GlassWorkshop/scripts.inc y https://github.com/pret/pokeemerald/blob/master/src/field_tasks.c. ↩↩↩↩↩↩↩ -
Stardew Valley Wiki, «Furniture», revisión 193159 (Robin y el carrito 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 fila del Catálogo de muebles en la tabla de catálogos, vendido en la carpintería (Carpenter’s Shop) por 200.000g; «Some furniture can be obtained only by donating items to the Museum», festivales, el casino y otras fuentes; los cuadrados de colocación verdes y rojos), descargado y guardado el 5 de octubre de 2026 como
sdv-furniture.htmly.txt, https://stardewvalleywiki.com/Furniture. ↩↩↩↩↩↩↩↩↩↩↩ -
Sulake, Habbo Help Center, «Furni Definitions» (muebles de campaña retenidos «4-12 months» para los comerciantes, rarezas que «will never be re-released», muebles raros sorpresa, LTD «in limited quantities»), el cuerpo del artículo guardado el 5 de octubre de 2026 en
habbo-articles.txten la carpeta de evidencias de las habitaciones, https://help.habbo.com/hc/en-us/articles/360011621699-Furni-Definitions. ↩↩↩↩↩↩↩ -
Sulake, Habbo Help Center, «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»), el cuerpo del artículo guardado el 5 de octubre de 2026 en
habbo-articles.txt, https://help.habbo.com/hc/en-us/articles/360011512940-What-is-Furni. ↩↩↩↩↩↩↩ -
That Penguin Game, «Your Igloo» (una reproducción de las páginas de ayuda de Club Penguin; su procedencia no se verificó: «You can Like any igloo design once every day!»; «me gusta» individuales y Grand Total Likes; «Likes are permanent, so your Grand Total Likes will never decrease, even if you delete an igloo design!»; los ajustes Everyone y Friends), descargado y guardado el 5 de octubre de 2026 como
tpg-your-igloo.htmly.txt, https://thatpenguingame.com/club-penguin-help/game-help/your-igloo/. Una sola fuente. ↩↩↩↩↩↩ -
Medición del autor, 5 de octubre de 2026:
measure_path_rule.py, guardado junto al borrador del artículo, salidameasure_path_rule.outypath_rule.json. Analizascripts/forge/interiors.pydel repositorio de Kiradex conast, reconstruye las letras exportadas como haceexport(), camina en cuatro direcciones desde la llegada de cada planta sobreotsrUD(el conjunto transitable delcheck()de la forja) e informa de la escalera, el anfitrión y la celda frontal de cada punto vestido (la primera celda recta hacia el sur pasado el estante y la franja de pared). Después prueba, enroom, cada colocación de una pieza exenta extra (10 dibujos: las sillas una vez, las camas una vez) sobre suelo libre lejos de las celdas de llegada, escalera y anfitrión (733 colocaciones; 44 dejan aislado un objetivo, todas cubriéndolo), y cada pareja sin solapamiento de piezas extra lejos de todos los objetivos (689 colocaciones individuales, 229.891 parejas; 713 dejan aislado un objetivo). ↩↩↩↩↩↩↩↩↩↩ -
Cálculo del autor, 5 de octubre de 2026:
score_max.pyenfigures/de la carpeta del borrador, salidascore_max.outyscore_max.json: la tabla de puntuación del encargo sumada para dos plantas con 16 piezas, cada línea en su tope (3.200 + 3.000 + 6.400 + 9.600 + 500 + 600 + 300 = 23.600), y una planta con 8 piezas sin líneas de conjunto, rampa ni puntos (800 + 500 = 1.300). El mismo script puntúa con las líneas de la propia tabla las tres casas de referencia que fijan los umbrales propuestos de grado de la casa: las dos plantas con 10 piezas y el estante lleno, 4.500; las dos plantas con 16 piezas y el estante, la vitrina y el tablero llenos, 7.600; esa casa más un juego de 8 y el 70 % en una rampa en cada planta, 14.000; y la casa inicial, las dos plantas con 8, 2.600. ↩↩↩↩ -
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 la documentación guardado el 5 de octubre de 2026 como
apple-swiftdata-cloudkit-sync.htmly.txt, https://developer.apple.com/documentation/swiftdata/syncing-model-data-across-a-persons-devices. ↩↩↩↩↩↩ -
pret,
pokeemerald/src/new_game.c(NewGameInitDatallama aClearDecorationInventories()) ypokeemerald/src/decoration_inventory.c(ClearDecorationInventorypone cada ranura de cada categoría aDECOR_NONE), commit731ad5b, leído el 5 de octubre de 2026, https://github.com/pret/pokeemerald/blob/master/src/new_game.c. ↩ -
Figuras del autor, 5 de octubre de 2026:
make_figures.pyenfigures/de la carpeta del borrador, que leesrc/data/decoration/header.hde pokeemerald731ad5b, los topes tal como se citan en las notas 1, 5, 8 y 7,path_rule.jsonyscore_max.json, comprueba cada total contra las mediciones anteriores y escribeemerald-decor-sizes.svg,caps.svg,room-path-rule.svgyscore-sources.svg. Las clases de huella (1 celda, 2 celdas, de 4 a 6, 8 o 9) agrupan las formas por celdas cubiertas. Paleta comprobada con el validador de dataviz; sin arte de ningún juego. ↩↩↩↩↩ -
pret,
pokeemerald/include/constants/metatile_behaviors.h(los comportamientosMB_SECRET_BASE_*,MB_SLIDE_SOUTH,MB_HOLDS_SMALL_DECORATION,MB_HOLDS_LARGE_DECORATION), commit731ad5b, leído el 5 de octubre de 2026, https://github.com/pret/pokeemerald/blob/master/include/constants/metatile_behaviors.h. ↩ -
pret,
pokeemerald/data/layouts/layouts.json(las 24 distribucionesLAYOUT_SECRET_BASE_*y las segundas plantas de las dos casas del jugador, con anchos y altos) y elmap.binde cada distribución, commit731ad5b, leído el 5 de octubre de 2026, https://github.com/pret/pokeemerald/blob/master/data/layouts/layouts.json. Los rangos de ancho, alto y área son del autor a partir de la salida de la medición. ↩ -
Medición del autor, 5 de octubre de 2026:
measure_character_cell.pyen la carpeta de evidencias de las habitaciones, salidameasure_character_cell.out, que lee las cabeceras PNG degraphics/object_events/pics/people/brendan/walking.png(144 por 32) ydecorating.png(16 por 32) de pokeemerald, y la celda (32 por 40),figureTop(7) yunderFeet(2) enKiradex/Resources/World/characters.jsondel repositorio de Kiradex. El script mide la celda y la altura de la figura (31 pixeles), no el ancho de la figura dibujada. ↩↩↩↩↩ -
pret,
pokeemerald/src/data/items.h(ITEM_SOOT_SACK,.fieldUseFunc = ItemUseOutOfBattle_CannotUse) ypokeemerald/src/data/text/item_descriptions.h(sSootSackDesc, una descripción fija de tres líneas), commit731ad5b, leído el 5 de octubre de 2026, https://github.com/pret/pokeemerald/blob/master/src/data/items.h. ↩↩ -
Nookipedia, «Furniture» (tamaños «ranging from 1.0×0.5» hasta 3 por 3; empujar de medio tile en medio tile; los tipos de muebles de New Horizons y la decoración de techo desde la 2.0; 2.076 muebles a la versión 3.0.2, 1.074 añadidos en actualizaciones; una serie de «around 10 furniture items, as well as a matching wallpaper and flooring»), descargado y guardado el 5 de octubre de 2026 como
nook-furniture.htmly.txt, https://nookipedia.com/wiki/Furniture. ↩↩↩↩ -
Nookipedia, «Wallpaper» (262 papeles pintados en New Horizons a la versión 1.9.0), descargado y guardado el 5 de octubre de 2026 como
nook-wallpaper.htmly.txt, https://nookipedia.com/wiki/Wallpaper. ↩ -
Nookipedia, «Flooring» (215 en New Horizons), descargado y guardado el 5 de octubre de 2026 como
nook-flooring.htmly.txt, https://nookipedia.com/wiki/Flooring. ↩ -
Nookipedia, «Luna» (la sección de New Leaf: «any changes will not be saved and items cannot be brought back to the real world»; la sección de New Horizons: sus servicios «work the same as they do in New Leaf», y un vale canjeable por 5.000 bayas (Dream Bell Exchange Ticket) por cada subida), descargado y guardado el 5 de octubre de 2026 como
nook-luna.htmly.txt, https://nookipedia.com/wiki/Luna. ↩↩ -
Sulake, Habbo Help Center, «Rooms» («You can own 200 rooms.»; «Wallpaper and flooring are stuck down»), descargado y guardado el 5 de octubre de 2026 como
habbo-rooms.htmly.txt, https://help.habbo.com/hc/en-us/articles/360011512640-Rooms. ↩↩↩↩ -
Sulake, Habbo Help Center, «What is Builders Club?» (el límite de muebles «increased by 250» cada mes de suscripción; guardar distribuciones de habitación personalizadas en el editor de planos) y «What can I buy in Habbo?» («Furni limits never go down.»), los cuerpos de los artículos guardados el 5 de octubre de 2026 en
habbo-articles.txt, https://help.habbo.com/hc/en-us/articles/360011621659-What-is-Builders-Club y https://help.habbo.com/hc/en-us/articles/360011620599-What-can-I-buy-in-Habbo. ↩ -
Sulake, Habbo Help Center, «Player to player trading in Habbo» (hace falta un pase de intercambio; «There is no guide to what items of furni are worth»), el cuerpo del artículo guardado el 5 de octubre de 2026 en
habbo-articles.txt, https://help.habbo.com/hc/en-us/articles/4408726781842-Player-to-player-trading-in-Habbo. ↩↩ -
Sulake, Habbo Help Center, «Guidelines on user created games in Habbo» («Placing more than three chance elements will disable all randomiser functions in the room.»), el cuerpo del artículo guardado el 5 de octubre de 2026 en
habbo-articles.txt, https://help.habbo.com/hc/en-us/articles/360011513060-Guidelines-on-user-created-games-in-Habbo. ↩ -
Sulake, API de búsqueda del Habbo Help Center, conjuntos de resultados para «furni», «stack» y «floor plan», guardados el 5 de octubre de 2026 como
habbo-search-furni,habbo-search-stackyhabbo-search-floorplan(.htmly.txt) en la carpeta de evidencias de las habitaciones; ninguno indica un tamaño de cuadrícula, una altura de apilado ni un límite de muebles por habitación. ↩ -
billsonnn,
nitro-react/src/components/floorplan-editor/common/Constants.ts(MAX_NUM_TILE_PER_AXIS = 64,HEIGHT_SCHEME = 'x0123456789abcdefghijklmnopq', 27 pasos de altura después de laxvacía), un cliente de Habbo de terceros y de código abierto, tal como se citó en el artículo de estructuras el 3 de octubre de 2026, https://github.com/billsonnn/nitro-react/blob/main/src/components/floorplan-editor/common/Constants.ts. El rango de la herramienta de altura de apilado (de 0 a 40 en pasos de 0,01) sale de mis notas anteriores, leído del mismo cliente y no vuelto a leer el 5 de octubre de 2026. ↩ -
Blake Crosley, «Pixel-Art Structures: Houses, Halls and Interiors on iPhone», blakecrosley.com, 3 de octubre de 2026 (los interiores «each 14 by 11, with a two-row wall band»; las compilaciones 22, 23 y, en el anexo de la tarde, 35; «Rooms have no wallpaper or floor choice and no placeable furniture; the house is dressed from the collection and nothing else»; los warps
room:npc-…; la malla de objetos; la casa de la granja de Stardew, «10×7» por dentro, nota 54; las constantes de Nitro, nota 62), https://blakecrosley.com/blog/pixel-art-structures-on-iphone. ↩↩↩↩↩↩↩↩ -
Medición del autor, 5 de octubre de 2026:
measure_sdv_catalogue.pyen la carpeta de evidencias de las habitaciones, salidameasure_sdv_catalogue.out: filas de muebles contadas por sección a partir del enlace con el nombre de cada fila en la página Furniture guardada (rev. 193159), omitiendo la sección de pósteres de películas, cuyas filas usan otro marcado, y las secciones References, History y Exploits; papeles pintados y suelos contados como iconos distintos en las páginas Wallpaper (rev. 193801) y Flooring (rev. 190285) guardadas; filas con el Catálogo de muebles como fuente contadas por su enlace. Recuentos de filas e iconos de la wiki, no de los archivos de datos del juego. ↩↩↩↩ -
Stardew Valley Wiki, «Wallpaper», revisión 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»), descargado y guardado el 5 de octubre de 2026 como
sdv-wallpaper.htmly.txt, https://stardewvalleywiki.com/Wallpaper. ↩↩↩↩ -
Stardew Valley Wiki, «Flooring», revisión 190285, descargado y guardado el 5 de octubre de 2026 como
sdv-flooring.htmly.txt, https://stardewvalleywiki.com/Flooring. ↩ -
Club Penguin Wiki (Fandom), «Igloo» (la historia: 1 de noviembre de 2005, iglús para jugadores sin suscripción, que «were unable to decorate them with furniture»; 26 de julio de 2012, la nueva experiencia de iglú y «a set of six items available without membership»), leído mediante la API de MediaWiki y guardado el 5 de octubre de 2026 como
cp-fandom-igloo.htmly.txt, https://clubpenguin.fandom.com/wiki/Igloo. Las entradas archivadas del blog oficial que cita devolvieron HTTP 429 desde la Wayback Machine dos veces el 5 de octubre de 2026. Una sola fuente. ↩↩ -
Club Penguin Wiki (Fandom), «Igloo Contests» (el primer concurso en el número 9, 15 de diciembre de 2005, un ganador con 5.000 monedas; los ganadores «After one to four weeks»; jueces personajes desde el concurso de Halloween de 2008; el botón de inscripción desde 2009; el último concurso en diciembre de 2012; los diez ganadores con 25.000 monedas y los veinte finalistas con 15.000 del Ye Olde Igloo Contest de 2008), leído mediante la API de MediaWiki y guardado el 5 de octubre de 2026 como
cp-fandom-contests.htmly.txt, https://clubpenguin.fandom.com/wiki/Igloo_Contests. Una sola fuente. ↩ -
Tristan Donovan, «The Replay Interviews: Will Wright», Game Developer, 23 de mayo de 2011, descargado y guardado el 5 de octubre de 2026 como
gd-replay-wright.htmly.txt, https://www.gamedeveloper.com/business/the-replay-interviews-will-wright. No se encontró ninguna charla grabada de Wright de 1999 o 2000 sobre el modo construcción. ↩↩ -
The Sims Wiki (Fandom), «Buy mode» («purchase items from an object catalog and place them on the current lot»; la ordenación por función en The Sims y The Sims 2; la frase de la huella verde y roja, asociada en la página a The Sims 2 y The Sims 3), leído mediante la API de MediaWiki y guardado el 5 de octubre de 2026 como
sims-fandom-buymode.htmly.txt, https://sims.fandom.com/wiki/Buy_mode. Una sola fuente. ↩↩↩ -
The Sims Wiki (Fandom), «Environment» (la necesidad Habitación y Entorno, que «analyzes the design and content of the room that the Sim is currently standing in»), leído mediante la API de MediaWiki y guardado el 5 de octubre de 2026 como
sims-fandom-environment.htmly.txt, https://sims.fandom.com/wiki/Environment. Una sola fuente. ↩ -
Extracción del autor, 5 de octubre de 2026:
measure_apple_docs.pyen la carpeta de evidencias de las habitaciones, salidameasure_apple_docs.out: título, declaración, resumen y plataformas de cada página JSON de la documentación de Apple guardada. Los campos de obsolescencia citados paradropDestination(for:action:isTargeted:)se leyeron del mismo JSON guardado. ↩ -
Apple Developer Documentation,
Model()(macro de SwiftData; «Converts a Swift class into a stored model that’s managed by SwiftData»; iOS 17.0), JSON guardado el 5 de octubre de 2026 comoapple-swiftdata-model.htmly.txt, https://developer.apple.com/documentation/swiftdata/model(). ↩ -
Apple Developer Documentation,
Unique(_:)(macro de SwiftData; «Specifies the key-paths that SwiftData uses to enforce the uniqueness of model instances»; iOS 18.0), JSON guardado el 5 de octubre de 2026 comoapple-swiftdata-unique.htmly.txt, https://developer.apple.com/documentation/swiftdata/unique(_:). ↩ -
Repositorio de Kiradex,
Kiradex/Models/CardCopy.swift(comentario de documentación: «every property has a default and nothing is unique, for CloudKit»), leído el 5 de octubre de 2026. ↩↩↩ -
Repositorio de Kiradex,
Kiradex/Models/PriceHistory.swift(comentario de documentación: «Shaped for CloudKit likeCollectionEntry: defaults everywhere, nothing unique»;PriceBookune los historiales de dos dispositivos «into the one with the smallestuid»), leído el 5 de octubre de 2026. ↩↩↩↩ -
Apple Developer Documentation,
draggable(_:)(SwiftUI; «Activates this view as the source of a drag and drop operation»; una cargaTransferable; iOS 16.0), JSON guardado el 5 de octubre de 2026 comoapple-swiftui-draggable.htmly.txt, https://developer.apple.com/documentation/swiftui/view/draggable(_:). ↩↩ -
Apple Developer Documentation,
dropDestination(for:action:isTargeted:)(SwiftUI; una acción de tipo([T], CGPoint) -> Bool, cuyo segundo parámetro es «the drop location in this view’s coordinate space»; iOS 16.0; la entrada de plataformas para iOS indicadeprecatedAt27.2 con el mensaje «UsedropDestination(for:isEnabled:action:)with anactionthat takes aDropSessionparameter instead.»; la referencia aDropSession, «A description of a drop that is in progress»), JSON guardado el 5 de octubre de 2026 comoapple-swiftui-dropdestination.htmly.txt, https://developer.apple.com/documentation/swiftui/view/dropdestination(for:action:istargeted:). ↩↩↩↩↩ -
Apple Developer Documentation,
DragGesture(SwiftUI; «A dragging motion that invokes an action as the drag-event sequence changes»; iOS 13.0), JSON guardado el 5 de octubre de 2026 comoapple-swiftui-draggesture.htmly.txt, https://developer.apple.com/documentation/swiftui/draggesture. ↩↩ -
Apple Developer Documentation,
SpatialTapGesture(SwiftUI; «A gesture that recognizes one or more taps and reports their location»; iOS 16.0), JSON guardado el 5 de octubre de 2026 comoapple-swiftui-spatialtap.htmly.txt, https://developer.apple.com/documentation/swiftui/spatialtapgesture. ↩↩ -
Apple Developer Documentation,
accessibilityElement(children:)(SwiftUI; iOS 13.0), JSON guardado el 5 de octubre de 2026 comoapple-swiftui-accessibilityelement.htmly.txt, https://developer.apple.com/documentation/swiftui/view/accessibilityelement(children:). ↩↩ -
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 guardado el 5 de octubre de 2026 comoapple-swiftui-accessibilityaction-named.htmly.txt, https://developer.apple.com/documentation/swiftui/view/accessibilityaction(named:_:). ↩↩↩↩ -
Apple Developer Documentation,
accessibilityAdjustableAction(_:)(SwiftUI; un manejador que recibe unAccessibilityAdjustmentDirection; iOS 13.0), JSON guardado el 5 de octubre de 2026 comoapple-swiftui-adjustable.htmly.txt, https://developer.apple.com/documentation/swiftui/view/accessibilityadjustableaction(_:). ↩↩ -
Apple Developer Documentation,
accessibilityRotor(_:entries:)(SwiftUI; «Create an Accessibility Rotor with the specified user-visible label»; iOS 16.0), JSON guardado el 5 de octubre de 2026 comoapple-swiftui-accessibilityrotor.htmly.txt, https://developer.apple.com/documentation/swiftui/view/accessibilityrotor(_:entries:). ↩↩↩↩ -
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 guardado el 5 de octubre de 2026 comoapple-swiftui-accessibilitynotification.htmly.txt, https://developer.apple.com/documentation/accessibility/accessibilitynotification/announcement. ↩↩↩↩ -
Apple Developer Documentation,
performAccessibilityAudit(for:_:)(XCUIAutomation,XCUIApplication; iOS 17.0; el JSON indica Xcode 16.3 y no tiene resumen), JSON guardado el 5 de octubre de 2026 comoapple-xctest-accessibilityaudit.htmly.txt, https://developer.apple.com/documentation/xcuiautomation/xcuiapplication/performaccessibilityaudit(for:_:). ↩↩↩ -
Apple, cabeceras del framework XCUIAutomation en Xcode 27.0 (build 27A266a), plataforma iPhone Simulator, leídas el 5 de octubre de 2026:
XCUIApplication.h(performAccessibilityAuditWithAuditTypes:issueHandler:error:, «Runs an accessibility audit on the current view»);XCUIVoiceOverService.h(«Provides programmatic control of VoiceOver for UI testing»; activar, desactivar, mover hacia adelante, hacia atrás, hacia dentro y hacia fuera, y lo que se está diciendo; iOS 27.0);XCUIDevice.h(la propiedadvoiceOverService, iOS 27.0). Una búsqueda en todas las cabeceras del framework de acciones personalizadas, rotores y avisos no encontró ninguno. ↩↩↩ -
Repositorio de Kiradex,
scripts/forge/interiors.py(el docstring del módulo, que incluye «every piece at least two tiles on one axis»; los mapas de letrasROOM,ROOM_UPyHALL, las listas de muebles, los puntos y los warps; el comentario dehost«where the owner stands when you visit»;PIECES,FACES,EXPORT_LETTERS,export()ycheck(), cuyas comprobaciones de puntos cubren los puntos de llegada, escalera, anfitrión, estante, vitrina, escritorio y pedestal y no el tablero de pared, y cuyo bucle de solapamiento leedata["objects"], las piezas exentas exportadas), leído el 5 de octubre de 2026, nunca ejecutado. ↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Repositorio de Kiradex,
docs/TestFlight.md, punto 46 («Build 26: the interior kit. Rooms sixteen wide with a three-row wall band (cornice, face, wainscot)»), leído el 5 de octubre de 2026. La compilación no tiene fecha en el archivo; cae entre la compilación 23 y la 35, que el artículo de estructuras fecha ambas el 3 de octubre de 2026. ↩↩ -
Cálculo del autor, 5 de octubre de 2026:
merge_regression.pyenfigures/de la carpeta del borrador, salidamerge_regression.out. Enroomtal como la crea la forja (13 piezas movibles, leídas depath_rule.jsony descripts/forge/interiors.pydel repositorio de Kiradex conast), una cama en (9,3) sola y una mesita de noche en (6,4) sola pasan cada una las reglas de celda, el tope y la caminata; las dos juntas dejan aisladas (7,3) y (8,3), las dos celdas que hay delante de la vitrina. Una reparación que ordena las dos poruidy añade cada una pasando por la comprobación completa conserva eluidmenor y devuelve el otro, con el mismo resultado para los dos órdenes de entrada y para las dos asignaciones deuid. Que cada una de las 713 parejas que aíslan sea legal pieza por pieza se deduce demeasure_path_rule.out: ninguna colocación individual lejos de los objetivos deja uno aislado. ↩↩↩↩↩ -
Repositorio de Kiradex,
docs/WORLD.md(sección 4: la tienda de monedas con «clothes, hats, backpacks, card-display frames and emotes»,level = floor(sqrt(XP / 40)) + 1, cosméticos bloqueados por nivel «that cannot be bought», los pines, entre ellos Full Set, Vintage y Across the Sea; el coleccionista como «a 30-pixel figure in a 32 × 40 cell»), leído el 5 de octubre de 2026; se buscaron sixteen, cap, decoration, furnishing, Sunday, once a day y read-only, y ninguno enuncia una regla de la habitación. ↩↩↩↩↩↩ -
Repositorio de Kiradex,
server/app/rooms.py(docstring del módulo: «Everything here is in memory; a room empties when its last collector leaves and nothing of them is kept.»), leído el 5 de octubre de 2026. ↩↩↩↩ -
Repositorio de Kiradex,
docs/research/pixel-art/06-collecting-and-hubs.md, sección 5.3 («Rooms: a budget, a Sunday letter, and a like that never goes down»: el tope de 16, la carta de los domingos como «a pixel object that appears on the doormat», visitas de solo lectura, un «me gusta» una vez por visitante y por día, «a stamp on their passport per room visited, with ranks at 30 / 100 / 500») y sección 5.7 (los objetos de mecenas incluyen «one room skin» y son «never a bigger furnishing cap»), leído el 5 de octubre de 2026. ↩↩↩↩↩ -
Repositorio de Kiradex,
Kiradex/World/Quests.swift(Quest.current(on:calendar:), con clave en el intervaloweekOfYeardel calendario, que empieza en el primer día de la semana del propio calendario) yKiradex/World/HallView.swift(el comentario «The week’s theme is the week’s quest», y el tema leído como el título de la misión semanal), leído el 5 de octubre de 2026. ↩↩↩ -
Repositorio de Kiradex,
docs/PROTOTYPES.md(la pregunta a los testers del prototipo de misiones semanales: «Weekly reset on your calendar’s week: say if it feels wrong.»), leído el 5 de octubre de 2026. ↩ -
Cálculo del autor, 5 de octubre de 2026:
layout_size.pyenfigures/de la carpeta del borrador, salidalayout_size.out: el recuento de tipos, 21 de la forja de hoy (17 tipos de suelo y 4 objetos de pared) y 3 nuevos de la sección 7.5, 24 en total; la distribución de casa guardada (dos plantas, 16 piezas cada una con tipo, x, y y orientación, dos ids de estilo por planta) como JSON compacto con claves con nombre, con cada tipo puesto al nombre propuesto más largo (pressed_flower, 14 caracteres) y cada id de estilo a 16 caracteres, 1.974 bytes; lo mismo con cada tipo rellenado a 16 caracteres, 2.038 bytes; cuádruplas de enteros sin más para 32 piezas, 385 bytes. ↩↩ -
Repositorio de Kiradex,
Kiradex/World/PlazaStage.swift(@AppStorage("plaza.id"), «Who this device is to the plaza»;@AppStorage("quests.stamps"), los sellos de misión como una lista unida por comas, que también leenQuestBoardViewyMeView;@AppStorage("plaza.ribbons"), «Ribbons from the town’s collectors»), leído el 5 de octubre de 2026; una búsqueda en el código Swift de la app de una cuenta de pasos guardada o de un registro de habitaciones visitadas no encontró nada, como tampoco una búsqueda en la app y el servidor de un podómetro, un tipo de recuento de pasos o un pasaporte (los únicosstepsson trayectos de caminata enTileMap.swiftyPlazaRig.swift). ↩↩↩↩↩ -
Repositorio de Kiradex,
Kiradex/Models/Progression.swift(el comentario de documentación deProgression: la experiencia, el nivel y los pines son «worked out from the collection as it is, so every device agrees without anything being stored»), leído el 5 de octubre de 2026. ↩↩ -
Apple Developer Documentation,
AppStorage(SwiftUI; «A property wrapper type that reflects a value from UserDefaults»; iOS 14.0), JSON guardado el 5 de octubre de 2026 comoapple-swiftui-appstorage.htmly.txt, https://developer.apple.com/documentation/swiftui/appstorage. ↩↩ -
Cálculo del autor, 5 de octubre de 2026:
skin_denominator.pyenfigures/de la carpeta del borrador, salidaskin_denominator.out, a partir de las líneas de rampa del encargo: una planta de 16 piezas, con 15 de ellas y el estilo de suelo en una misma familia de rampa y la pared fuera de ella, son 16 de 18 (88,9 %), 1.600 puntos en la línea del 70 %; sacando la pared de la proporción son 16 de 17 (94,1 %), 4.800 puntos en la línea del 90 %, 3.200 más. ↩ -
Repositorio de Kiradex,
Kiradex/Models/Profile.swift(var lookData: Data = Data()en el perfil sincronizado;var uid: String = "", asignado aUUID().uuidStringeninit(handle:), igual quePriceHistoryyCardCopytambién llevan unuid;ModelContext.profile(), líneas 224 a 237, obtiene los perfiles ordenados poruid, conserva el primero y borra el resto, y el comentario lo llama una unión en el uid menor), leído el 5 de octubre de 2026. ↩↩↩