← Todos os Posts

Cômodos em pixel art: grades de móveis, limites e pontuação

Um cômodo decorado em Pokémon Emerald são dezesseis coisas numa grade de células de 16 pixels. O código descompilado limita a base de um jogador a 16 decorações colocadas e o quarto a 12, e guarda até 20 bases no save, a sua e as de outros jogadores.12 O catálogo tem 120 decorações em oito categorias: 35 bonecos, 23 enfeites, 18 tapetes, 10 pôsteres, 10 almofadas, 9 escrivaninhas, 9 cadeiras e 6 plantas. 71 delas ocupam uma única célula, a média é de 2,43 células, e 18 são superfícies que sustentam as pequenas.23 Uma base mede de 44 a 81 células por onde se pode andar, 60,2 em média, então o limite equivale a cerca de um quarto do piso. A colocação é uma pergunta que cada célula coberta responde, e nada na função de colocação verifica se sobra um caminho.24 Três jogos posteriores deste post rodam esse modelo com outros orçamentos: 150 itens por cômodo em Animal Crossing: New Horizons, segundo a Nookipedia, com uma carta de domingo que avalia o cômodo; de 150 a 600 em interiores em Final Fantasy XIV desde o Patch 7.5, conforme o tipo de moradia; 99 num iglu de Club Penguin, segundo uma única fonte de fãs.5678 Meu app, o Kiradex, tem cômodos que a sua forja de arte mobília com um vocabulário de 23 peças, nenhuma das quais o jogador consegue mover. Este post mede o cânone, enuncia as regras com seus números, leva tudo para SwiftData e SwiftUI, e termina com o briefing de um sistema de mobília que o Kiradex ainda não construiu: um limite de 16 por andar, uma regra de caminho que a função de colocação de Emerald não tem, uma pontuação semanal com cada ponto discriminado e um catálogo desbloqueado só jogando.910

Resumo

  • Dezesseis é um orçamento de composição, não um limite de armazenamento. Emerald coloca 16 decorações numa base e 12 no quarto, mas tem espaço para 150 decorações possuídas em oito compartimentos por categoria, então o jogador pode ter mais do que cabe. Cada decoração colocada custa dois bytes, um id e uma posição com x e y como nibbles, o que põe o layout inteiro de uma base em 32 bytes.111122
  • As regras moram no piso. Emerald tem cinco permissões de colocação (piso, piso por onde se passa, atrás, parede e sobre uma superfície). As células de cima de uma escrivaninha levam um comportamento que deixa uma decoração pequena ficar em cima delas, então, com a escrivaninha no lugar, dá para pôr um boneco nela. 18 decorações sustentam coisas pequenas e 14 sustentam coisas grandes. O quarto só aceita bonecos e almofadas.1324
  • Os limites sobem com a plataforma, e um deles também é um orçamento de quadro. Animal Crossing permite 24 itens por cômodo em Wild World, 64 em City Folk, 48 em New Leaf e 150 em New Horizons, segundo a Nookipedia. Final Fantasy XIV aumentou os limites internos pela metade no Patch 7.5, para de 150 a 600, e as notas acrescentam que, acima de 400 móveis na tela, os de outro andar deixam de ser desenhados.57
  • Uma pontuação tem fontes discriminadas, um dia fixo e uma régua que sobe com a casa. A tabela da Happy Home Academy na Nookipedia paga 1.000 pontos ao chegar a 6, 10, 15 e 20 itens num cômodo, mais bônus de série, conjunto, categoria, cor e feng shui, e sobe o limiar do S de 15.000 para 90.000 à medida que a casa cresce. A página não cita fonte para esses números de New Horizons.6
  • Catálogos crescem por compra, por jogo ou pelos dois. Em Emerald, 90 das 120 decorações são vendidas por dinheiro, 24 nunca são vendidas (prêmios, pontos de batalha e presentes), e mais duas custam 6.000 e 8.000 de cinza coletada passo a passo. Stardew vende um estoque diário aleatório; depois da primeira reforma da casa, Robin também vende o Catálogo de Móveis (Furniture Catalogue) por 200.000g, que passa a vender por 0g e em quantidade ilimitada os móveis que lista, embora algumas peças ainda venham só do Museu, de festivais e de outras fontes. Habbo vende móveis, e parte deles é escassa ou aleatória de propósito.14151617
  • Visitantes olham e não mexem. Um visitante em Animal Crossing pode usar os móveis da casa de outro jogador, mas não pode “modify the interior in any way” (modificar o interior de forma alguma). Visitantes do Habbo não podem largar nem mover móveis sem os direitos do dono. Club Penguin permite uma curtida por design por dia, e o seu Grand Total (total geral) “will never decrease” (nunca vai diminuir), segundo uma cópia de fãs das suas páginas de ajuda.51819
  • O que isso dá ao Kiradex. Um briefing, não um recurso lançado: colocação por célula para 20 das 23 peças da forja; uma regra de caminho da porta até a escada, o anfitrião e uma célula frontal de cada grupo de exposição, verificada por uma caminhada; 16 peças por andar, com os cômodos iniciais entregues com 8; seis papéis de parede e seis pisos desenhados pela forja; uma carta de domingo com cada fonte de pontos impressa (23.600 no máximo); um catálogo desbloqueado jogando, a partir dos níveis e broches que existem hoje, derivado da coleção sincronizada, dos carimbos de missão que o app registra no aparelho e de três novos contadores sincronizados para passos, visitas a cômodos e a faixa da casa na carta; visitas somente leitura assim que o servidor puder guardar um layout; um modelo SwiftData sem restrição de unicidade, porque a sincronização com o CloudKit não consegue impor uma; e colocação por arrasto que o VoiceOver consegue fazer sem toque.9202122

1. Emerald: dezesseis coisas numa grade, medidas no código

A menor versão completa desse gênero é o sistema de decoração de Pokémon Ruby, Sapphire e Emerald, e quase tudo nele é dado. Eu o li na descompilação de Emerald feita pelo pret, no commit 731ad5b (de 1º de outubro de 2026), com dois scripts que analisam o código e nunca rodam o jogo: um para o catálogo, os limites, as superfícies de apoio e os tamanhos das salas, e outro para a origem de cada decoração. As saídas deles estão salvas ao lado.214 Cada número desta seção vem dessas duas saídas ou do arquivo-fonte que uma nota indica.

Os limites

Três constantes definem os limites. DECOR_MAX_SECRET_BASE vale 16, DECOR_MAX_PLAYERS_HOUSE vale 12 e SECRET_BASES_COUNT vale 20, o número de bases que o save guarda: a sua e as recebidas de outros jogadores.12 O limite do que você coloca fica separado do limite do que você possui. O save guarda 150 decorações possuídas em compartimentos por categoria: 10 escrivaninhas, 10 cadeiras, 10 plantas, 30 enfeites, 30 tapetes, 10 pôsteres, 40 bonecos e 10 almofadas.112 Então o jogador pode possuir mais do que um cômodo comporta (um jogo novo começa com todos os compartimentos vazios), e escolher o que entra é o jogo.23

Uma decoração colocada custa dois bytes. Uma base guarda decorations[16], um id cada, e decorationPositions[16], um byte cada, com x no nibble alto e y no baixo, então uma base é endereçada como uma grade de no máximo 16 por 16 células, e o layout inteiro de uma base cabe em 32 bytes.1112 Leio esse tamanho como o motivo de o save conseguir guardar vinte bases, a sua e as de outros jogadores.

gDecorations[] tem 121 entradas. A entrada 0, DECOR_NONE, é um slot vazio que reaproveita os dados da escrivaninha pequena, o que deixa 120 decorações com ids de 1 a 120.32 Por categoria, são 35 bonecos, 23 enfeites, 18 tapetes, 10 pôsteres, 10 almofadas, 9 escrivaninhas, 9 cadeiras e 6 plantas.2 Por formato, em células, são 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, e uma de 2 por 4 e outra de 4 por 2. O cabeçalho também declara 3 por 1 e 1 por 3, que nenhuma decoração usa. Uma decoração cobre de 1 a 9 células, 2,43 em média.213 Contando o slot vazio como decoração, como faziam minhas notas anteriores para o post sobre estruturas, dá 72 peças de uma célula e 19 de piso sólido; sem ele, os números são 71 e 18.2

Gráfico de barras horizontais empilhadas das 120 decorações de Emerald por categoria, cada barra dividida por quantas células de 16 pixels a decoração cobre: bonecos 35 (25 de uma célula, 10 de duas); enfeites 23 (9 de uma, 9 de duas, 1 de quatro a seis, 4 de oito ou nove); tapetes 18 (11 de uma, 7 de oito ou nove); pôsteres 10 (5 e 5); almofadas 10, todas de uma célula; escrivaninhas 9 (2 de uma, 3 de quatro a seis, 4 de oito ou nove); cadeiras 9, todas de uma célula; plantas 6 (3 de duas, 3 de quatro a seis).

A maior parte do catálogo de Emerald ocupa uma célula; as peças grandes são as escrivaninhas, os tapetes de 3 por 3 e alguns enfeites.243

Os preços na tabela vão de 500 pelos tapetes mais baratos a 10.000 pelos enfeites e bonecos mais caros. Três têm preço 0, dois escudos e um enfeite de vidro, e os três são prêmios.23

Cinco permissões, e superfícies que são dados

Cada decoração carrega uma de cinco permissões. O cabeçalho as nomeia como “collision and placement permissions, in that order” (permissões de colisão e de colocação, nessa ordem).13 Por contagem:

Permissão O que significa Decorações
Piso sólido bloqueia a passagem, fica no piso 18: as 9 escrivaninhas, 9 enfeites
Piso de passagem dá para passar por cima, fica no piso 37: os 18 tapetes, as 9 cadeiras, 10 enfeites
Piso de fundo bloqueia, e sua fileira de cima pode ficar sobre a parede do fundo 10: as 6 plantas, 4 enfeites
Parede pendurada na parede do fundo 10: os 10 pôsteres
Sprite uma figura que fica sobre uma superfície 45: os 35 bonecos, as 10 almofadas

Contagens de measure_emerald_decor.py sobre src/data/decoration/header.h.2

A parte mais engenhosa é que uma superfície é uma propriedade de uma célula, não um trecho de código. Cada decoração é desenhada a partir de metatiles, e cada metatile leva um byte de comportamento. Dezoito decorações têm células com o comportamento MB_HOLDS_SMALL_DECORATION: 7 das 9 escrivaninhas, 3 tijolos, um pneu e 7 tapetes. Catorze têm MB_HOLDS_LARGE_DECORATION: as mesmas 7 escrivaninhas e 7 tapetes.2 Um boneco de 1 por 2 precisa de uma célula “grande” embaixo; qualquer outro boneco ou almofada aceita uma célula “pequena” ou “grande”.4 Então, assim que uma escrivaninha é colocada, o piso ganha células novas que respondem “sim” a um boneco, e a mesma função de colocação cuida dos dois casos. É assim que 16 itens fazem um cômodo parecer cheio: 45 dos 120, os sprites, ficam sobre 18 peças que servem de superfície.2

Algumas decorações também fazem algo. Oito tapetes musicais tocam um som quando pisados; um tapete de pulo, um giratório e um de brilho fazem o que o nome diz; três balões e uma bola de lama estouram; há uma porta quebrável, um escorregador e um enfeite de areia. Cada um é um comportamento nos metatiles da decoração (MB_SECRET_BASE_SOUND_MAT, _JUMP_MAT, _SPIN_MAT, _GLITTER_MAT, _BALLOON, _BREAKABLE_DOOR, MB_SLIDE_SOUTH, _SAND_ORNAMENT), lido do arquivo de atributos do tileset da base secreta.225

A colocação é uma pergunta que cada célula responde

CanPlaceDecoration, em src/decoration.c, percorre as células que a decoração em mãos cobriria e faz uma pergunta a cada uma. Peças de piso e de piso de passagem precisam de piso comum (MB_NORMAL) sob cada célula; só a tábua sólida pode cobrir um buraco. Nenhum objeto pode estar na célula. A peça pode cobrir a célula em que o jogador estava ao abrir o menu só com um tile do tipo de camada normal; a função a recusa ali quando o próprio tile dela nessa célula tem qualquer outro tipo de camada. Uma peça de piso de fundo precisa de piso sob todas as fileiras menos a de cima, que pode ficar sobre a parede norte. Uma peça de parede precisa que todas as células sejam parede norte. Um sprite precisa de uma célula de apoio embaixo.4 No quarto, o menu recusa todas as categorias exceto bonecos e almofadas: DecorationItemsMenuAction_AttemptPlace mostra gText_CantPlaceInRoom quando isPlayerRoom está ativo.4

Nada em CanPlaceDecoration verifica se sobra um caminho. A única proteção que a função dá à caminhada é aquela regra condicional sobre a célula em que você estava. Na minha leitura dessa função, um jogador pode cercar o computador da base com escrivaninhas e o jogo deixa.4 Volto a isso no briefing, porque um cômodo que outras pessoas visitam precisa da verificação que essa função não faz.

As salas contra as quais o limite é medido

Os 24 layouts de base são seis estilos em quatro tamanhos cada. Medidos com as paredes a partir de cada map.bin, têm de 7 a 17 células de largura e de 7 a 17 de profundidade, de 99 células (11 por 9) a 196 (14 por 14), com as compridas e estreitas em 7 por 16, 10 por 17 e 17 por 8.226 As células por onde se anda, lidas dos bits de colisão de cada layout, vão de 44 a 81, 60,2 em média.2 O limite de 16 é 0,27 do piso caminhável de uma base média.2 O quarto, o segundo andar das duas casas do jogador, mede 9 por 8 com 54 células caminháveis, e seu limite é 12.21

O piso sozinho exagera o aperto, porque muitos dos 16 são tapetes por onde se passa ou bonecos em pé sobre escrivaninhas. O limite orça a composição, não o piso.

A célula contra o personagem

A folha de caminhada do jogador mede 144 por 32 pixels, nove quadros de 16 por 32, então o quadro do personagem tem uma célula de largura e duas de altura na grade de metatiles de 16 pixels. A pose de decorar é um único quadro de 16 por 32.27 A célula da grade é a largura do quadro, e cada decoração é dimensionada nessa unidade.

Como o catálogo cresce

O script de origens procurou cada constante de decoração nos scripts de lojas, prêmios e presentes. 90 das 120 são vendidas por dinheiro em cinco lojas. Três são trocas no balcão de prêmios, quinze são trocadas por pontos de batalha e dez são dadas por um script: de novo os três itens do balcão de prêmios, duas barracas por terminar uma casa de quebra-cabeças, um enfeite do andar de cima de um museu, dois escudos do anfitrião da instalação de batalha e dois bonecos de moradores. Vinte e quatro são conquistadas e nunca vendidas por dinheiro.14

Mais duas se compram andando. Uma oficina de vidro troca uma cadeira por 6.000 e uma escrivaninha por 8.000 de cinza, e a cinza é coletada a uma unidade por passo no capim coberto de cinza enquanto o jogador carrega o saco, até 9.999 (VAR_ASH_GATHER_COUNT).15 Leio esse par como a versão mais pura de desbloqueio jogando no cânone: nenhum dinheiro troca de mãos, só passos. O saco não mostra contador. Seu uso no campo é a função dos itens que não podem ser usados, e sua descrição é um texto fixo sobre coletar e guardar cinza vulcânica.28 Fora o próprio contador de passos, só o script da oficina lê o valor: quando falta cinza, ele subtrai do preço o que foi coletado e informa a diferença ao jogador como um número de passos que ainda faltam andar.15

Quatro decorações, três bonecos lendários e mais um boneco, não aparecem em nenhum script de loja, prêmio ou presente que a busca cobriu. Talvez cheguem por troca ou por um recurso de conexão; não as rastreei, e as contagens de 90 vendidas e 24 só conquistáveis se apoiam numa busca nos scripts de lojas, prêmios e presentes, com essas quatro sem rastrear.14

O que Emerald ensina

Um sistema de decoração são três tabelas e uma função: uma linha de catálogo por peça (permissão, formato, categoria, preço, metatiles), um layout cujas células dizem o que são (piso, parede norte, buraco), um inventário possuído maior que o limite de colocação, e uma verificação de colocação que faz uma pergunta a cada célula coberta. Superfícies são células que respondem “sim” a uma peça menor. O limite conta peças colocadas e nada mais. A lacuna é a caminhada: a função de colocação verifica células, nunca caminhos.

2. Animal Crossing: 150 itens e uma carta no domingo

Esta seção se apoia na Nookipedia, uma wiki de fãs, lida e salva em 5 de outubro de 2026; não procurei os números da própria Nintendo. Onde a wiki não cita nada, eu aviso.56

O limite e os cômodos

Todo jogo da série limita os itens de um cômodo, e o limite foi crescendo. A Nookipedia dá 24 “furniture and clothing items” (móveis e roupas) por cômodo em Wild World, 64 em City Folk e 48 em 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.” (No máximo 150 itens podem ser colocados em cada cômodo da casa, incluindo móveis de parede e de teto.)5

Os cômodos de New Horizons, pela tabela de ampliações da mesma página: a barraca mede 4 por 4; a casa, 6 por 6; a ampliação do cômodo principal o deixa em 8 por 8; os cômodos dos fundos, da esquerda e da direita medem 6 por 6 cada; o segundo andar e o porão, 10 por 6. “Unlike previous games, only the main room can be expanded in size, as all other rooms have a fixed size.” (Diferente dos jogos anteriores, só o cômodo principal pode ser ampliado, porque todos os outros têm tamanho fixo.)5 Com 150 itens num cômodo de 6 por 6, dá 4,2 itens por tile de piso, o que só funciona porque paredes, tetos e o tampo de outros móveis recebem itens sem gastar piso (minha aritmética a partir dos dois números).529

Os móveis ocupam “a size in tiles that it takes up when placed, ranging from 1.0×0.5” (um tamanho em tiles ao serem colocados, de 1.0×0.5) até 3 por 3, e em New Horizons “can also now be pushed in half-tile increments” (agora também podem ser empurrados de meio em meio tile).29 New Horizons os divide em utensílios domésticos, itens diversos que vão no piso ou sobre uma superfície, peças de parede e decoração de teto, que chegou na versão 2.0.29 Dos jogos cuja grade de colocação este post lê (as células de Emerald, os tiles de Stardew e os de New Horizons), só New Horizons move móveis por menos de um tile inteiro. Não li a grade de colocação de FFXIV, e os passos mais finos citados para o Habbo são alturas de empilhamento de um cliente de terceiros (seção 3).

O catálogo

Na versão 3.0.2, a Nookipedia conta 2.076 móveis em New Horizons, 1.074 deles adicionados em atualizações. Uma série são “around 10 furniture items, as well as a matching wallpaper and flooring” (uns 10 móveis, mais um papel de parede e um piso combinando).29 A wiki conta 262 papéis de parede na versão 1.9.0 e 215 pisos.3031 Papel de parede e piso mudam por cômodo, e a versão 2.0 acrescentou uma parede de destaque: “a second wall covering can be applied to single wall in the room” (um segundo revestimento pode ser aplicado a uma única parede do cômodo).5

A Happy Home Academy

A metade da pontuação é a parte que o Kiradex pega emprestada. Nookipedia: a Academy “sends an evaluation by mail most Sunday mornings, which cannot be disabled” (manda uma avaliação pelo correio na maioria das manhãs de domingo, e isso não pode ser desativado). A nota é B, A ou S, e o limiar do S sobe a cada ampliação: 15.000 para a primeira casa, 23.000 depois da ampliação do cômodo principal, depois 35.000, 47.000, 60.000, 75.000 e 90.000 com o porão.6

Os bônus de New Horizons como a wiki os tabula:

Critério Pontos
6, 10, 15 e 20 móveis num cômodo 1.000 em cada limiar
Itens da sorte 777 por item
Móveis de parede 400 por item, no máximo três
4 ou mais itens de uma mesma série 1.000 por item
Um conjunto de móveis completo 800 por item
3 ou mais itens de uma mesma categoria 500 por item
70% ou mais dos itens de um cômodo numa só cor 200 por item
90% ou mais numa só cor 600 por item
Feng shui vermelho, verde ou amarelo 500
Baratas menos 2.500 cada
Itens que não são móveis no piso menos 1 cada
Lixo no piso menos 500 cada
Itens direcionais virados para uma parede menos 300 cada

Nookipedia, “Happy Home Academy”, as tabelas de New Horizons, salvas em 5 de outubro de 2026; sem citação na página.6

Esses números são os menos certos desta seção. As tabelas de bônus e de deduções não têm citação. A tabela de recompensas logo abaixo diz que “Includes data sourced from the Data Spreadsheet for Animal Crossing New Horizons” (inclui dados da planilha de dados de Animal Crossing New Horizons), compilada por colaboradores nomeados, e a seção de pontos por item de New Horizons diz “This section is a stub” (esta seção é um esboço).6 Então a aritmética é uma reconstrução de fãs. O briefing no fim pega emprestado o formato dela (fontes discriminadas, limiares de quantidade, bônus de conjunto e de cor, um dia fixo) e nenhum dos seus números.

Duas escolhas ali importam para qualquer app que queira uma pontuação semanal do cômodo. A régua sobe com a casa, então um cômodo maior não é uma nota máxima mais fácil. E a carta chega num dia fixo, na maioria das manhãs de domingo, e o jogador não pode desligá-la.6 Ausência não sai de graça: a página da casa diz que um jogador que larga a casa “for at least one week” (por pelo menos uma semana) a encontra infestada de baratas, e a tabela acima tira 2.500 pontos por barata.56 O briefing fica com o dia fixo e descarta a penalidade.

Visitas

Em todos os jogos da série, segundo a wiki, “a player may enter any other player’s house freely” (um jogador pode entrar livremente na casa de qualquer outro). Pode usar os móveis, mas não pode largar nem pegar itens “or modify the interior in any way” (nem modificar o interior de forma alguma).5 Uma visita em sonho a outra ilha chega ao mesmo fim por outro caminho. Na página da wiki sobre a personagem que cuida dos sonhos, a seção de New Leaf diz que num sonho “any changes will not be saved and items cannot be brought back to the real world” (nenhuma mudança é salva e itens não podem ser trazidos para o mundo real), e a seção de New Horizons diz que os serviços dela “work the same as they do in New Leaf” (funcionam do mesmo jeito que em New Leaf). Publicar um sonho rende ao anfitrião um vale trocável por 5.000 Bells (Dream Bell Exchange Ticket), e outro a cada atualização.32 Na minha leitura, é o tipo de visita mais seguro deste post para um app infantil: o visitante anda por uma cópia e não muda nada que fique guardado, e o anfitrião é recompensado por compartilhar.

3. Habbo, Stardew, Final Fantasy XIV, Club Penguin, e de onde veio o modelo

Habbo: o cômodo é o produto, e o produto é vendido

A própria central de ajuda do Habbo diz com clareza as regras de posse e de visita. “You can own 200 rooms.” (Você pode ter 200 quartos.)33 Pisos e paredes são permanentes depois de 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.” (Papel de parede e piso ficam colados: depois de colocados, não dá para recolher; se quiser mudar o visual do quarto, você pode colocar novos.)33 Visitantes não podem mexer: “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.” (Você não pode largar nem mexer em mobis nos quartos de outro Habbo, a menos que seja membro de um grupo e o dono desse grupo tenha liberado você para participar da construção do quarto.)18

A economia de móveis gira em torno da compra. “To buy furni you need credits, diamonds or duckets.” (Para comprar mobis você precisa de créditos, diamantes ou duckets.)18 O Builders Club empresta móveis até um limite que sobe 250 a cada mês de assinatura, inclui salvar layouts de quarto personalizados no editor de planta e promete “Furni limits never go down.” (os limites de mobis nunca diminuem).34 A página de definições de mobis descreve móveis de campanha segurados “for 4-12 months in order to leave an ample window for traders to build their businesses around them” (por 4 a 12 meses para dar aos negociantes uma janela ampla para montar seus negócios em torno deles), raros que “will never be re-released” (nunca serão relançados), raros quebráveis comprados e depois quebrados “to reveal another, random rare furni” (para revelar outro mobi raro aleatório) e os LTDs, “a special type of rare, which comes in limited quantities” (um tipo especial de raro, que vem em quantidade limitada).17 Negociar exige um passe de troca, e “There is no guide to what items of furni are worth” (não existe guia do quanto valem os mobis).35 O Habbo chega a limitar o acaso dentro dos quartos: “Placing more than three chance elements will disable all randomiser functions in the room.” (Colocar mais de três elementos de acaso desativa todas as funções aleatórias do quarto.)36

As páginas do próprio Habbo não dão a grade, as alturas de empilhamento nem um limite de móveis por quarto; a busca da central de ajuda por “furni”, “stack” e “floor plan” não retornou nenhum artigo que dê.37 Os números que circulam vêm do Nitro, um cliente de terceiros de código aberto. As constantes do seu editor de planta permitem até 64 tiles por eixo e um esquema de alturas de 27 passos, como o post sobre estruturas desta série citou do mesmo arquivo; minhas notas anteriores acrescentam, desse cliente, uma ferramenta de altura de pilha de 0 a 40 em passos de 0,01, que não reli para este post.3839 Trate os três como do cliente, não da Sulake.

Na minha leitura, o Habbo mostra no que o ciclo de mobília se transforma quando o catálogo é o negócio. A regra de visita dele é a que vale copiar; a economia (escassez de propósito, conteúdo aleatório, valor de troca) é a que vale recusar.

Stardew Valley: um catálogo comprado uma vez, depois móveis de graça

A página Furniture da Stardew Valley Wiki, revisão 193159, lista 718 linhas de itens em 26 seções, 615 nomes distintos. Essas são minhas contagens das linhas da página; a seção de pôsteres de filmes usa outra marcação e foi pulada, e “distintos” junta num só um item listado em duas seções.4016 A página Wallpaper, revisão 193801, mostra 137 papéis de parede (123 no catálogo, 12 fora dele, 2 inobteníveis), e a página Flooring, revisão 190285, 97 pisos, ambos contados pelos ícones das páginas, não pelos arquivos de dados do jogo.404142

O catálogo cresce de dois jeitos ao mesmo tempo. Robin e a Carroça de Viagem “offer a random selection of furniture each day they are open” (oferecem uma seleção aleatória de móveis em cada dia que abrem). “After the first Farmhouse upgrade, Robin also offers the Furniture Catalogue for sale” (depois da primeira reforma da casa da fazenda, Robin também vende o Catálogo de Móveis), a 200.000g na tabela de catálogos da página, e, depois de colocado, ele vende por 0g os móveis que lista “in unlimited quantity” (em quantidade ilimitada). 278 linhas da página Furniture citam o Catálogo de Móveis como fonte.1640 As exceções da página continuam exceções: “Some furniture can be obtained only by donating items to the Museum” (alguns móveis só podem ser obtidos doando itens ao Museu), ou em festivais, no cassino e em outras fontes.16 Então um marco de jogo e uma compra grande na moeda do próprio jogo acabam com a escassez do que o catálogo lista, e só disso.

O retorno de colocação é 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.” (O móvel mostra um quadrado verde nos tiles onde pode ser colocado; o tile fica vermelho se não puder.)16 Papel de parede é um gesto para uma superfície: os papéis de parede “cover the whole room they’re placed in” (cobrem o cômodo inteiro em que são colocados), e para colocar um “the character must be facing up by its wall” (o personagem precisa estar virado para cima, junto à parede); são “single-use and do not stack” (de uso único e não empilham).41 A casa da fazenda mede 10 por 7 por dentro antes das reformas, em tiles de 16 pixels, como o post sobre estruturas citou da wiki.39

Final Fantasy XIV: um limite que também é orçamento de quadro

As notas do Patch 7.5 no The Lodestone, da Square Enix, aumentaram todos os limites de moradia. Os móveis internos passaram de 100 para 150 em apartamentos e câmaras privadas, de 200 para 300 em chalés, de 300 para 450 em casas e de 400 para 600 em mansões; os externos, de 20 para 40, de 30 para 60 e de 40 para 80.7 As mesmas notas dão o motivo com as próprias palavras: “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.” (Até 400 móveis podem ser exibidos na tela ao mesmo tempo; se houver mais, os que estão num andar diferente do seu personagem deixam de ser exibidos, começando pelos pequenos e mais distantes.)7 Um limite é, ao mesmo tempo, orçamento de design e orçamento de renderização.

As notas também acrescentam “Furnishings from the FFXIV Furnishing Design Contest” (móveis do concurso de design de móveis de FFXIV): um concurso da comunidade cujos designs vencedores viraram móveis no patch.7 Esse é o formato seguro de concurso: os jogadores criam, o estúdio julga e lança.

Tamanhos de terreno não estão neste post. O guia de moradia da Square Enix retornou HTTP 404 em 5 de outubro de 2026, e não tentei nenhuma outra página oficial, então FFXIV contribui com limites de itens tirados das notas do Lodestone e mais nada.7

Club Penguin: uma curtida por dia e um total que nunca cai

Todo fato sobre Club Penguin aqui é de uma única fonte. Os posts arquivados do blog oficial que a Club Penguin Wiki cita retornaram HTTP 429 da Wayback Machine duas vezes em 5 de outubro de 2026, então não consegui conferi-los.43

That Penguin Game reproduz o que apresenta como as páginas de ajuda do jogo; não verifiquei essa procedência. A página “Your Igloo” de lá: “You can Like any igloo design once every day!” (você pode curtir qualquer design de iglu uma vez por dia!). Cada design “earns its own individual Likes” (ganha as próprias curtidas), que se somam no Grand Total, e “Likes are permanent, so your Grand Total Likes will never decrease, even if you delete an igloo design!” (curtidas são permanentes, então seu total geral nunca vai diminuir, mesmo se você apagar um design de iglu!). A aba Popular ordena os iglus pelo Grand Total Likes, e um iglu abre para “Everyone” (todos) ou só para “Friends” (amigos).19

A Club Penguin Wiki diz que “igloos have a limit preventing more than 99 units of furniture being placed at once” (iglus têm um limite que impede colocar mais de 99 móveis ao mesmo tempo), que a maioria dos móveis tem limite de posse de 99 de cada tipo, e que um dono pode decorar o próprio iglu “but not other player’s igloos” (mas não os iglus de outros jogadores).8 Decorar era um benefício da assinatura: a partir de 1º de novembro de 2005, jogadores sem assinatura podiam ter iglu mas não mobiliá-lo, e a partir de 26 de julho de 2012 ganharam 6 móveis grátis, um item de piso, quatro itens comuns e um de parede.438

A história dos concursos de iglu segundo a wiki: o primeiro foi anunciado na edição 9 do jornal do jogo, publicada em 15 de dezembro de 2005, com um vencedor premiado com 5.000 moedas. Concursos posteriores anunciavam vencedores e finalistas de uma a quatro semanas depois da chamada, sempre com moedas e às vezes com móveis. A partir do concurso de Halloween de 2008, personagens escolhiam os vencedores e os comentários deles saíam junto com os iglus; a partir de 2009, um botão no iglu fazia a inscrição; o último concurso foi em dezembro de 2012. Um exemplo, o Ye Olde Igloo Contest de 2008, pagou 25.000 moedas a cada um de dez vencedores e 15.000 a vinte finalistas.44

The Sims: as pessoas estavam lá para pontuar a casa

O modelo de grade e catálogo tem uma história de origem, e é uma história de pontuação. Minha fonte é uma única entrevista: Will Wright com Tristan Donovan, publicada pela Game Developer em 23 de maio de 2011. Não encontrei nenhuma palestra gravada de Wright de 1999 ou 2000 sobre o modo construção.45

Sobre a inspiração: “one of the original things that was a really inspiration for The Sims was this book, A Pattern Language, by Christopher Alexander.” (uma das inspirações originais de The Sims foi o livro A Pattern Language, de Christopher Alexander). Sobre a pontuação: “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.” (De certa forma, eu queria que The Sims fosse originalmente um jogo de arquitetura que analisasse esses padrões; as pessoas de The Sims, no início, estavam lá só para pontuar a arquitetura.) Sobre o nome: “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.” (meu nome original era Doll House, casa de bonecas; fizemos testes de mercado e vimos que o nome não pegava bem com o público masculino). Sobre os objetos: “Everything we put in the world is advertising” (tudo o que colocamos no mundo é publicidade), um modelo que ele remonta às trilhas de feromônio de SimAnt.45

The Sims Wiki, uma wiki de fãs e uma única fonte, descreve a tela lançada. O modo compra deixa os jogadores “purchase items from an object catalog and place them on the current lot” (comprar itens de um catálogo de objetos e colocá-los no lote atual); The Sims e The Sims 2 ordenavam esse catálogo pela função do objeto; e os tiles da área ocupada pelo objeto em mãos ficam verdes onde ele pode ir e vermelhos onde não pode. A wiki associa essa frase do verde e vermelho a The Sims 2 e The Sims 3, então não a afirmo para o original de 2000.46 A pontuação ficou dentro dos Sims como necessidade, Room no primeiro jogo e Environment no segundo, que “analyzes the design and content of the room that the Sim is currently standing in” (analisa o design e o conteúdo do cômodo em que o Sim está): cômodos pequenos, pouca luz e coisas sujas ou quebradas a derrubam.47

Na minha leitura, cada jogo deste post é essa mesma tela com outro orçamento: um catálogo, uma grade do tamanho do passo de uma pessoa, uma área ocupada que fica verde ou vermelha, e um juiz.

Os limites, lado a lado

Gráfico de barras horizontais intitulado Placed-item limits (limites de itens colocados), cada barra rotulada com o que o seu limite conta e colorida pela fonte: o limite de colocação interna de Final Fantasy XIV por tipo de moradia, das notas do Patch 7.5 no The Lodestone (mansão 600, antes 400; casa 450, antes 300; chalé 300, antes 200; apartamento ou câmara privada 150, antes 100); Animal Crossing por cômodo, da Nookipedia (New Horizons 150, City Folk 64, New Leaf 48, Wild World 24); Club Penguin por iglu, 99, de uma única wiki de fãs; Emerald, do código descompilado (uma base 16, o quarto 12); e os 16 por andar propostos para o Kiradex.

Os limites vão de um a cinquenta, do quarto de Emerald a uma mansão de FFXIV, mas não contam a mesma coisa: o de FFXIV é um limite de colocação interna listado por tipo de moradia, o de Animal Crossing é por cômodo, o de Club Penguin por iglu, o de Emerald por base ou quarto, e o do Kiradex por andar. Só os números de FFXIV e de Emerald vêm do texto ou do código do próprio publisher.247581

4. O ofício, como regras com números

Estas são as regras que as medições sustentam, cada uma com a faixa em que se apoia. Onde um número é aritmética minha ou escolha minha, a linha diz. “Célula” quer dizer a célula de caminhada de 16 pixels, que também é o tile do Kiradex.227

Elemento Regra Fonte
Limite de colocação Limite o que um cômodo mostra, por cômodo, contando os itens de parede. Emerald 16 por base, 12 no quarto; New Horizons 150 por cômodo “including wall and ceiling-mounted furniture” (incluindo móveis de parede e de teto); FFXIV de 150 a 600 em interiores conforme o tamanho da moradia; Club Penguin 99 (uma única fonte de fãs)
Limite de posse Deixe o jogador possuir mais do que cabe, para que colocar seja escolher. Emerald 150 possuídas em oito compartimentos contra 16 colocadas; Club Penguin 99 de cada tipo possuídos (fonte de fãs)
Limite contra o piso Num cômodo 2D sem camada de parede nem de teto, fique abaixo de um item a cada três células de piso (meu limiar, escolhido para que Emerald fique logo abaixo dele); superfícies e peças por onde se passa o esticam. Emerald 16 contra uma média de 60,2 células caminháveis, 0,27; New Horizons 150 num cômodo de 6 por 6 dá 4,2 por tile, possível só com colocação em parede, teto e superfícies (minha aritmética)
Superfícies Faça de sustentar uma peça pequena uma propriedade da célula, para que uma escrivaninha acrescente piso para um boneco. Emerald: 18 decorações sustentam peças pequenas, 14 sustentam grandes, e 45 decorações sprite precisam de uma
Célula da grade Dimensione a grade pela largura do quadro ou da célula do personagem; vá mais fino só se as peças puderem ser ajustadas aos poucos e a arte permitir. O quadro do jogador de Emerald, 1 por 2 células de 16 pixels; Stardew tiles de 16 pixels; New Horizons meio tile
Verificação de colocação Faça uma pergunta a cada célula coberta (piso, parede, superfície; vazia; não na célula de chegada nem na do anfitrião) e mostre a resposta célula por célula. CanPlaceDecoration de Emerald para as perguntas por célula, embora recuse a célula inicial do jogador só para um tile com tipo de camada não normal; as células de chegada e do anfitrião são regra do Kiradex (7.1); Stardew quadrado verde ou vermelho por tile; The Sims 2 e 3 área ocupada verde ou vermelha (wiki de fãs)
Caminho Verifique se uma caminhada sobrevive a cada colocação (o acréscimo do briefing). CanPlaceDecoration de Emerald não verifica caminho nenhum, e mantém a célula em que o jogador estava livre só de um tile com tipo de camada não normal; as páginas de Stardew e dos Sims lidas aqui descrevem retorno por tile e não dizem nada, nem a favor nem contra, sobre caminhos; o briefing acrescenta a caminhada
Papel de parede e piso Um por cômodo, trocado com um gesto, reversível. Stardew cobre “the whole room” (o cômodo inteiro) a partir da parede; New Horizons por cômodo mais uma parede de destaque; os do Habbo são permanentes, só substituíveis
Tamanho do catálogo Grande o bastante para que um estilo seja uma escolha. Stardew 137 papéis de parede e 97 pisos (minhas contagens de ícones da wiki); New Horizons 262 e 215; New Horizons 2.076 móveis na versão 3.0.2
Pontuação Discrimine as fontes, fixe o dia, suba a régua com a casa, nunca puna a ausência. Happy Home Academy: a maioria dos domingos; B, A, S; S de 15.000 a 90.000; 1.000 aos 6, 10, 15 e 20 itens; série, conjunto, categoria, cor (tabelas de fãs, sem citação); a página da casa da wiki, que não nomeia nenhum jogo, diz que uma casa largada por pelo menos uma semana se enche de baratas, e a tabela da HHA de New Horizons desconta 2.500 por barata, uma penalidade que esta regra recusa
Crescimento do catálogo Num app 9+, cresça jogando: uma prateleira conquistada mais um catálogo que abre num marco. Nunca por venda aleatória ou escassa. Emerald 90 de 120 vendidas, 24 nunca vendidas, mais duas por 6.000 e 8.000 de cinza; Stardew estoque diário aleatório, depois da primeira reforma um catálogo de 200.000g cujos móveis listados custam 0g, com exclusivos do Museu, de festivais e de outras fontes fora dele; os raros, os quebráveis e os LTDs do Habbo como contraexemplo
Visitas Visitantes olham e não mexem; uma marca por visitante por dia; o total do anfitrião nunca cai. Visitantes de Animal Crossing não podem “modify the interior in any way” (modificar o interior de forma alguma); visitantes do Habbo não podem largar nem mover móveis sem direitos; Club Penguin uma curtida por design por dia, Grand Total nunca diminui (uma única fonte de fãs)
Armazenamento Um item colocado são poucos bytes: tipo, célula, orientação. Emerald: um byte de id e um byte de posição, 32 bytes por base

Fontes: seções 1 a 3 e suas notas.256781916414033181746141511

Três delas merecem uma frase cada.

O limite é um orçamento para o olho, e às vezes para a GPU. Os 16 de Emerald são cerca de um quarto do piso de uma base. FFXIV diz com todas as letras que, passados 400 móveis na tela, deixa de desenhar alguns.27 Para um app de celular o segundo motivo é real, mas na minha leitura é o primeiro que decide o número: um limite é o que transforma uma prateleira numa composição, que foi o motivo que o post sobre mundos de 3 de outubro deu para escolher dezesseis.10

A regra de caminho é o acréscimo do briefing. CanPlaceDecoration de Emerald protege no máximo uma célula, aquela em que você estava ao abrir o menu, e nunca pergunta se a porta ainda alcança o computador.4 As páginas de Stardew e dos Sims que li descrevem uma área ocupada colorida por tile; não dizem se algum dos dois jogos também verifica um caminho, e não procurei mais, então este post não afirma nada sobre eles em nenhum sentido.1646 Um cômodo que outras pessoas visitam precisa dessa pergunta respondida, porque um visitante que não alcança a exposição não tem o que olhar.

Desbloquear jogando é o lado defensável da questão do catálogo para um app infantil. Essa é a minha leitura, não orientação jurídica: um ciclo de decoração comprado, aleatório ou escasso atrai questões de loot box e de pressão de que um app de colecionáveis não precisa. A prateleira conquistada de Emerald mostra um ciclo de cômodo que não precisa de nada disso, e o catálogo de Stardew, comprado uma vez na moeda do próprio jogo depois de um marco de jogo, mostra como acabar com a escassez de tudo o que ele lista.141617

5. Do jeito da Apple: um modelo que sincroniza, um arrasto que encaixa, uma grade que o VoiceOver consegue usar

Uma tela de mobília no iOS precisa de três coisas: um registro para cada peça colocada que sincronize pelo iCloud, um jeito de arrastar uma peça para uma célula e um jeito de fazer o mesmo sem visão nem toque. Tudo abaixo vem de páginas da documentação da Apple salvas como JSON em 5 de outubro de 2026, com títulos, declarações, resumos e plataformas extraídos por um script.48 Nada aqui foi compilado nem executado para este post, e nenhum custo abaixo foi medido.

O registro: SwiftData, no formato que o CloudKit pede

@Model “Converts a Swift class into a stored model that’s managed by SwiftData” (converte uma classe Swift num modelo armazenado gerenciado pelo SwiftData), disponível a partir do iOS 17.0.49 O SwiftData consegue impor unicidade com #Unique, que “Specifies the key-paths that SwiftData uses to enforce the uniqueness of model instances” (especifica as key paths que o SwiftData usa para impor a unicidade das instâncias do modelo), a partir do iOS 18.0.50 Uma peça colocada parece um uso natural: uma peça por célula.

A sincronização com o CloudKit descarta isso. O guia da Apple para sincronizar SwiftData diz que o framework “does include a small number of features that CloudKit doesn’t support natively, such as unique constraints and nonoptional relationships” (inclui alguns recursos que o CloudKit não suporta nativamente, como restrições de unicidade e relacionamentos não opcionais), e que “CloudKit requires all relationships to be optional.” (o CloudKit exige que todos os relacionamentos sejam opcionais).22 Os modelos do Kiradex já têm esse formato. O comentário de CardCopy diz “every property has a default and nothing is unique, for CloudKit” (toda propriedade tem um valor padrão e nada é único, por causa do CloudKit), e PriceHistory é “Shaped for CloudKit like CollectionEntry: defaults everywhere, nothing unique” (moldado para o CloudKit como CollectionEntry: padrões em tudo e nada único), com uma fusão que escolhe o mesmo vencedor em todo aparelho quando dois aparelhos criam o mesmo histórico.5152

Então a unicidade que importa, uma peça por célula, tem de ser imposta em código: uma função pura que roda a cada leitura, resolve peças de dois aparelhos numa mesma célula com o mesmo vencedor em todo lugar e devolve a perdedora para a bandeja. Uma célula não é a única coisa que dois aparelhos podem quebrar juntos. Duas edições que passam em todas as regras cada uma no seu celular podem falhar juntas, então a função tem de reconstruir o cômodo passando pela verificação de colocação inteira, não só pelo teste de sobreposição. O briefing da seção 7 a especifica.

O arrasto: draggable, um destino de soltura e a célula sob o dedo

draggable(_:) “Activates this view as the source of a drag and drop operation” (ativa esta view como origem de uma operação de arrastar e soltar) para um payload Transferable, a partir do iOS 16.0.53 dropDestination(for:action:isTargeted:) recebe os itens soltos e um CGPoint, que a sua página descreve como “the drop location in this view’s coordinate space” (o local da soltura no espaço de coordenadas desta view), também a partir do iOS 16.0.54 Converter esse ponto numa célula é aritmética: subtraia a origem do mapa e divida pelo tamanho do tile em pontos.

Um achado que minhas notas anteriores não tinham. A página salva de dropDestination(for:action:isTargeted:) lista o iOS 27.2 como a versão que o torna obsoleto, com a mensagem “Use dropDestination(for:isEnabled:action:) with an action that takes a DropSession parameter instead.” (em vez disso, use dropDestination(for:isEnabled:action:) com uma action que receba um parâmetro DropSession).54 A action do substituto recebe uma DropSession, “A description of a drop that is in progress” (a descrição de uma soltura em andamento), em vez de um ponto.54 Não salvei a página de DropSession, então se ela traz uma localização no espaço de coordenadas da view continua sem leitura, e o briefing nomeia as duas formas.

Para mover uma peça que já está no cômodo, DragGesture é “A dragging motion that invokes an action as the drag-event sequence changes” (um movimento de arrasto que dispara uma ação conforme muda a sequência de eventos de arrasto) (iOS 13.0), e SpatialTapGesture é “A gesture that recognizes one or more taps and reports their location” (um gesto que reconhece um ou mais toques e informa onde foram) (iOS 16.0): toque para selecionar uma peça, arraste para movê-la célula por célula.5556

Se o ponto de soltura se converte direitinho em células de tile sob a câmera do Kiradex não foi testado. O cômodo é desenhado pelo RealityKit com um número inteiro de pixels do aparelho por texel, e o overlay de SwiftUI que recebe a soltura fica por cima dele; a aritmética é a mesma que o ajuste da câmera já faz, mas ninguém soltou nada nele ainda.10

A grade sem toque: VoiceOver

Uma grade de móveis combina mal com deslizar elemento por elemento, então o design dá ao VoiceOver os próprios verbos:

  • accessibilityElement(children:) “Creates a new accessibility element, or modifies the AccessibilityChildBehavior of the existing accessibility element” (cria um novo elemento de acessibilidade ou modifica o AccessibilityChildBehavior do existente) (iOS 13.0), então uma peça de várias células é um elemento só, não seis.57
  • accessibilityAction(named:_:) acrescenta uma ação nomeada; “Actions allow assistive technologies, such as the VoiceOver, to interact with the view by invoking the action” (ações permitem que tecnologias assistivas, como o VoiceOver, interajam com a view invocando a ação) (iOS 16.0). Mover para a esquerda, Mover para a direita, Mover para cima, Mover para baixo, Girar e Guardar são uma ação cada.58
  • accessibilityAdjustableAction(_:) trata o deslizar para cima e para baixo como um AccessibilityAdjustmentDirection (iOS 13.0), bom para alternar um papel de parede ou um piso.59
  • accessibilityRotor(_:entries:) cria “an Accessibility Rotor with the specified user-visible label” (um rotor de acessibilidade com o rótulo visível indicado) (iOS 16.0), então um rotor “Móveis” pode pular entre as peças do cômodo.60
  • AccessibilityNotification.Announcement é “A notification that an app posts when it needs to convey an announcement to an assistive app” (uma notificação que um app publica quando precisa passar um anúncio a um app assistivo) (iOS 17.0): todo movimento recusado é falado, com o motivo.61

Um teste de UI pode então auditar a tela com XCUIApplication.performAccessibilityAudit(for:_:), listado para o iOS 17.0; a página salva não tem resumo e lista o Xcode 16.3 para o caminho deste módulo.62 Auditar é tudo o que ele faz. Nos headers do XCUIAutomation instalados com o Xcode 27.0, a auditoria “Runs an accessibility audit on the current view” (roda uma auditoria de acessibilidade na view atual). Os mesmos headers acrescentam XCUIVoiceOverService, a partir do iOS 27.0, que “Provides programmatic control of VoiceOver for UI testing” (oferece controle programático do VoiceOver para testes de UI): liga e desliga o VoiceOver, move o foco para a frente, para trás, para dentro e para fora de contêineres, e devolve o que o VoiceOver fala do elemento em foco. Uma busca em todos os headers do framework não encontra nenhuma chamada que execute uma ação personalizada nomeada, gire um rotor ou leia um anúncio, então um teste de UI não consegue apertar Mover para a esquerda ou Guardar como faz um usuário de VoiceOver.63 O briefing testa os handlers dessas ações diretamente, confere os rótulos falados com o serviço do VoiceOver e deixa as ações, o rotor e os anúncios para uma pessoa com o VoiceOver ligado.

Quanto custa

Não medido. Uma casa mobiliada são no máximo 16 registros pequenos em cada um dos dois andares. Se as peças colocadas entrarem na malha única de objetos que o motor já monta para os móveis da forja, uma mudança implica reconstruir essa malha; nada disso foi perfilado num celular.39

6. O estudo de caso: os interiores do Kiradex hoje

O Kiradex é um app de colecionar cartas para iPhone com uma pequena cidade em pixel art, Kiradex World, onde cada colecionador tem uma casa de dois andares e a cidade tem um salão de exposição. Tudo nesta seção foi lido no repositório do app em 5 de outubro de 2026, sem rodar nem mudar nada: os interiores foram analisados com um script, e os documentos e modelos foram lidos como texto.964

O que mudou desde o post sobre estruturas

O post sobre estruturas de 3 de outubro dizia que interiors.py desenha o cômodo, o andar de cima e o salão “each 14 by 11, with a two-row wall band” (cada um com 14 por 11, com uma faixa de parede de duas fileiras).39 Era verdade quando foi escrito. No mesmo dia, a build 26 do TestFlight trouxe o kit de interiores: “Rooms sixteen wide with a three-row wall band (cornice, face, wainscot)” (cômodos de dezesseis de largura com uma faixa de parede de três fileiras: cornija, face e lambri), móveis num ritmo de 32 pixels, peças encostadas na parede desenhadas como chão e as soltas como objetos atrás dos quais o colecionador passa.65 Hoje a forja desenha room e room-up com 16 por 12 células e o salão com 16 por 13, cada um com uma faixa de três fileiras: cornija, face e lambri.964 A build 26 fica entre a build 23 que o post sobre estruturas descreve e a build 35 que o adendo da noite descreve, então os dois textos estão certos sobre as suas builds.3965

Os móveis da forja

scripts/forge/interiors.py nomeia 23 peças na tabela PIECES, cada uma com largura e altura em células e uma flag que diz se fica solta.9

Tipo Peças e áreas ocupadas (células, larg. por alt.)
Encostadas na parede, desenhadas no chão (9) estante de livros 5 por 2; guarda-roupa 2 por 2; bancada, pia e fogão 1 por 1 cada; lareira 2 por 2; escada e escada de descida 2 por 3 cada; pilar 1 por 3
Soltas, exportadas como objetos com que o colecionador é ordenado em profundidade (14) cama e cama de rosas 2 por 3 cada; criado-mudo 1 por 1; mesa 2 por 2; cadeira em quatro orientações, 1 por 1 cada; sofá 3 por 2; banco 2 por 1; planta 1 por 2; baú, caixote e barril 1 por 1 cada

Analisado a partir de PIECES por measure_kiradex_interiors.py; o arquivo nunca é importado nem executado.9

Uma peça cobre de 1 a 10 células, 3,04 em média, contra 1 a 9 e 2,43 em Emerald.92 Os desenhos distintos são menos que os nomes: as quatro cadeiras são um desenho em quatro orientações, as duas camas são duas variantes, as duas escadas duas direções, e a bancada, a pia e o fogão são uma bancada em três tipos.9

A docstring do arquivo e a tabela dele não batem. A docstring define a convenção como “furniture on the 16-pixel grid in a 32-pixel rhythm, every piece at least two tiles on one axis” (móveis na grade de 16 pixels num ritmo de 32 pixels, cada peça com pelo menos dois tiles num eixo).64 Na tabela, 11 das 23 são 1 por 1: as quatro cadeiras, a bancada, a pia, o fogão, o criado-mudo, o baú, o caixote e o barril.9 O ritmo vale para as peças grandes e não para as pequenas. É uma diferença entre um comentário e o código dentro de um mesmo arquivo, scripts/forge/interiors.py, e o briefing mantém as peças pequenas, porque um cômodo só com peças de dois tiles não teria cadeiras.

A face da parede tem vocabulário próprio, em letras: um quadro p, um relógio k, uma janela N, uma janela com cortina K, um estandarte n, uma arandela l e W onde fica pendurado o painel de parede. Os pisos são tábuas o, ladrilhos t, mármore s e um tapete r que se desenha como nine-slice a partir dos vizinhos. Há dois estilos de parede, o reboco com enxaimel da casa e a pedra lavrada do salão, escolhidos por interior via FACES.64

Os cômodos como foram criados

Mapa Tamanho Células de piso Peças (móveis) Piso sob as peças Piso livre Pontos que o app preenche
room 16 por 12 125 14 (13) 25 100 prateleira 5 células, vitrine 2, escrivaninha 2; chegada, escada, anfitrião
room-up 16 por 12 125 12 (11) 27 98 painel de parede 3 células, escrivaninha 2; chegada na escada
hall 16 por 13 144 6 (4) 8 128 depois de 8 pedestais 8 pedestais

As móveis excluem a escada e os pilares. De measure_kiradex_interiors.py.9

O ponto host tem no arquivo o comentário “where the owner stands when you visit” (onde o dono fica quando você visita).64 O check() da forja já recusa um ponto de prateleira, vitrine, escrivaninha ou pedestal na letra errada, um warp que não esteja numa porta ou numa escada, uma célula de chegada, escada ou anfitrião que não seja caminhável, e dois objetos exportados numa mesma célula. Os limites mais estreitos dele importam para o briefing. Ele não tem verificação de letra para os pontos do painel de parede, e o seu loop de sobreposição lê só os objetos exportados, as peças soltas, então uma peça encostada na parede desenhada no chão nunca entra nele. Não verifica se a porta alcança cada ponto.64

A regra de caminho, aplicada aos cômodos de hoje

Escrevi um script que reconstrói as letras exportadas como export() faz e caminha em quatro direções a partir da chegada de cada andar pelas letras caminháveis da forja, otsrUD.20 Nos layouts de hoje, a caminhada alcança a escada e o anfitrião embaixo, e a escada em cima. As células logo à frente dos pontos de exposição são outra história:

  • Embaixo, as cinco células frontais da prateleira: duas estão sob o barril e o caixote, três são alcançadas.
  • As duas células frontais da vitrine são alcançadas.
  • As duas células frontais da escrivaninha: uma está sob a cadeira encostada nela, uma é alcançada.
  • Em cima, a escrivaninha é igual, uma de duas.
  • Em cima, as três células frontais do painel de parede estão sob a cama e o criado-mudo. Nenhuma é alcançada.20

Então uma regra de que a célula frontal de cada ponto seja alcançável falharia em quatro dos grupos preenchidos da forja nos dois andares (a prateleira e a escrivaninha embaixo, a escrivaninha e o painel de parede em cima), sete células frontais bloqueadas no total, e uma regra de que cada grupo preenchido tenha uma célula frontal alcançável falha em um grupo: o painel de parede de cima. O briefing usa a forma por grupo e conserta o painel no rearranjo inicial.

O script também testou peças extras em room. Uma peça solta extra tem 733 colocações que passam nas regras de célula; 44 delas isolam um alvo, e todas fazem isso cobrindo a própria célula do alvo. Duas peças extras, cada uma longe de todos os alvos e sem se sobrepor, formam 229.891 pares, e 713 deles isolam um alvo sem cobri-lo: uma cama em (9,3) e um criado-mudo em (6,4), por exemplo, fecham o bolsão na frente da vitrine de vidro.20 Esses 713 são o que uma verificação por célula deixa passar e uma caminhada pega. São também o que dois celulares podem construir juntos: cada peça sozinha deixa todos os alvos alcançados, então cada uma passa na caminhada no próprio aparelho, e o par só falha depois que os dois sincronizam (7.7).66 Não levei a busca além de duas peças extras; com dezesseis, quantos layouts uma verificação por célula aprovaria e uma caminhada recusaria não foi medido.

O colecionador contra a grade

A célula do sprite do colecionador mede 32 por 40 pixels, com 7 pixels acima da figura e 2 abaixo, então a figura tem cerca de 31 pixels de altura, e a célula tem 2 tiles de largura e 2,5 de altura, contra o quadro de 1 por 2 de Emerald. O WORLD.md o descreve como “a 30-pixel figure in a 32 × 40 cell” (uma figura de 30 pixels numa célula de 32 × 40).2767 A largura da própria figura não foi medida. Leio a célula como o motivo de a forja desenhar os móveis num ritmo de 32 pixels sobre uma grade de 16: a célula do colecionador tem dois tiles de largura.

O que os cômodos não fazem

A lista honesta do post sobre estruturas continua valendo para a casa: “Rooms have no wallpaper or floor choice and no placeable furniture; the house is dressed from the collection and nothing else.” (Os cômodos não têm escolha de papel de parede nem de piso, nem móveis posicionáveis; a casa é montada com a coleção e com mais nada.)39 O app preenche os pontos nomeados com a coleção (fichários na prateleira, cartas na vitrine, fitas e broches no painel, cartas nos pedestais do salão), e a forja coloca cada móvel.6439

O servidor ainda não consegue guardar um cômodo. O módulo de salas dele diz: “Everything here is in memory; a room empties when its last collector leaves and nothing of them is kept.” (Tudo aqui fica em memória; uma sala esvazia quando sai o último colecionador e nada deles é guardado.)68 Então visitar hoje a casa de outro colecionador é visitar um mapa, e visitas somente leitura ao arranjo real de um colecionador precisam que o servidor guarde um layout.

Onde as regras do cômodo estão escritas

O post sobre mundos de 3 de outubro publicou as regras de cômodo: “a furnishing cap of sixteen” (um limite de dezesseis móveis); “visits are read-only, a like is once a day, and the room’s total never decreases” (visitas são somente leitura, a curtida é uma vez por dia e o total do cômodo nunca diminui); e “A report arrives every Sunday grading the room, with its point sources listed” (todo domingo chega um relatório que avalia o cômodo, com as fontes de pontos discriminadas).10 Essas regras não estão no documento de design do app. A seção 4 de docs/WORLD.md lista a loja de moedas (“clothes, hats, backpacks, card-display frames and emotes”, roupas, chapéus, mochilas, molduras para expor cartas e emotes) e cosméticos travados por nível “that cannot be bought” (que não podem ser comprados), e não diz nada sobre móveis, limites, curtidas ou um relatório de domingo.67 As regras moram na nota de pesquisa docs/research/pixel-art/06-collecting-and-hubs.md, seção 5.3, que também pede que a carta seja “a pixel object that appears on the doormat” (um objeto em pixel art que aparece no capacho), “a stamp on their passport per room visited, with ranks at 30 / 100 / 500” (um carimbo no passaporte por cômodo visitado, com patentes em 30 / 100 / 500) e, na seção 5.7, que itens de apoiador sejam “never a bigger furnishing cap” (nunca um limite de móveis maior).69 Este post as trata como decididas porque o post sobre mundos as publicou, e o primeiro item de arrumação do briefing é copiá-las para o WORLD.md. O mesmo parágrafo do post sobre mundos também diz “Patron flair stays on the name-plate and the room skin” (os enfeites de apoiador ficam na plaquinha com o nome e na skin do cômodo).10 O briefing não trata a skin do cômodo como decidida: ele a reabre como decisão do Blake (7.5).

A semana já existe

As missões semanais giram pela semana do calendário em Quest.current, o tema do salão é o título da missão da semana, e as notas de protótipo perguntam aos testers sobre um “Weekly reset on your calendar’s week” (reinício semanal pela semana do seu calendário).7071 Uma carta de domingo não precisa de relógio novo, embora use chave própria, a data do domingo, por um motivo que o item 7.4 explica.

7. O briefing: o que o Kiradex constrói e as verificações que precisa passar

Isto é um briefing, não um relato de trabalho lançado: nada abaixo existe ainda no app. Está escrito como um diff contra o que a seção 6 mediu: as 23 peças da forja, dois andares de casa de 16 por 12 e um salão de 16 por 13, os pontos preenchidos, um servidor que não guarda nada, um armazenamento SwiftData sincronizado pelo CloudKit, o relógio das missões semanais e as regras de cômodo que o post sobre mundos já publicou.96810 Cada elemento mantém uma mecânica medida acima e desenha tudo com a forja, a paleta e as palavras do próprio Kiradex. Nenhum elemento nomeia uma criatura, um lugar de qualquer jogo ou um recurso de franquia, e nada num cômodo é arremessado, capturado, invocado ou montado, então nada se parece com os passos reivindicados das patentes de método de jogo que o post sobre mundos descreve; essa é a minha leitura, não orientação jurídica.10 As coordenadas são as da forja, x para a direita e y para baixo a partir da célula do canto superior esquerdo. Os números desta seção (as oito iniciais, a tabela de pontuação, os limiares das faixas da casa, o cronograma de desbloqueios) são propostas minhas, não fatos.

7.1 Colocação por célula, no vocabulário da própria forja

Um modo Arrumar na casa. As peças posicionáveis são 20 das 23 da forja: todas menos stairs, stairs_down e pillar, que continuam fazendo parte do layout. As quatro cadeiras viram um só tipo com orientação, então as 20 peças são 17 tipos de piso. O quadro, o relógio, o estandarte e a arandela da face da parede viram quatro itens de parede posicionáveis, o que dá 21 tipos a partir da forja de hoje; janelas e a abertura da escada continuam sendo arquitetura. A seção 7.5 acrescenta três peças novas (uma mesa de exposição, um biombo e um item de parede de flor prensada), o que leva o total a 24.72 Uma peça colocada é (kind, x, y, facing) na sua célula superior esquerda no mapa de letras do andar, o mesmo formato que ROOM_FURNITURE já usa.964

As regras, célula por célula. As cinco primeiras são a pergunta por célula de Emerald reescrita para as letras do Kiradex; a sexta é o acréscimo do briefing, uma verificação que a função de colocação de Emerald não faz.4

  1. Uma peça solta precisa que cada célula coberta seja piso (o, t, s ou r) sem nenhuma outra peça em cima.
  2. Uma peça encostada na parede (estante de livros, guarda-roupa, bancada, pia, fogão, lareira) precisa da sua fileira de cima na faixa de parede, onde a forja já as coloca: a lareira em y = 1, atravessando a face e o lambri, e o resto em y = 2, no lambri.64
  3. Um item de parede precisa de uma célula de face (A) na fileira 1 que não seja janela nem a abertura da escada.
  4. Nenhuma peça na célula de chegada, nas duas células da porta (a forja desenha a porta com duas células de largura na parede de baixo), nas células caminháveis da escada ou na célula do anfitrião.
  5. A estante de livros leva consigo os seus cinco pontos de prateleira, já que os pontos são relativos à peça, então mover a prateleira move os fichários. A vitrine de vidro c e a escrivaninha d continuam sendo letras fixas neste briefing.
  6. A regra de caminho. Depois da colocação, uma caminhada em quatro direções pelas células caminháveis a partir da chegada ainda precisa alcançar a célula da escada, a célula do anfitrião e pelo menos uma célula logo à frente de cada grupo preenchido: a prateleira, a vitrine, a escrivaninha, o painel de parede. Uma peça que quebra a caminhada é recusada, e a recusa diz o que ela isolaria.

Uma grade de 16 por 12 do térreo do Kiradex como a forja o cria hoje, em células e sem arte: a faixa de parede de três fileiras no alto, a estante de livros e a vitrine de vidro encostadas nela, as células da escada no canto superior direito, a porta embaixo; o piso que a chegada alcança em branco; as peças soltas da forja em cinza; a chegada, a escada e o anfitrião marcados com A, S e H; as células frontais da prateleira, da vitrine e da escrivaninha marcadas como alcançadas, ou riscadas onde há um barril, um caixote ou uma cadeira em cima; e, desenhados por cima em laranja, uma cama em (9,3) e um criado-mudo em (6,4), com contorno nas seis células na frente da vitrine que o par isola.

Cada uma das duas peças laranja passa nas regras de célula; juntas, elas fecham a vitrine, e só a caminhada da regra 6 percebe.2420

Por que a forma por grupo. Nos layouts de hoje, a célula na frente de um ponto muitas vezes é uma peça: o barril e o caixote sob duas das cinco células frontais da prateleira, uma cadeira em cada escrivaninha, e a cama e o criado-mudo sob todas as três do painel.20 A forja já fala parte dessa língua: check() recusa sobreposições entre objetos soltos e pontos de prateleira, vitrine, escrivaninha e pedestal na letra errada.64 O jogador recebe essas regras estendidas a toda área ocupada, inclusive das peças encostadas na parede, e às células do painel de parede, mais a caminhada.

Critérios de aceitação. - Um teste unitário roda as seis regras em room.json: cada um dos 24 tipos (os 21 da forja de hoje e os três que o 7.5 acrescenta) é aceito numa célula e recusado numa célula para cada regra que se aplica a ele. - A regra de caminho passa nos dois andares iniciais entregues (7.2), e um teste fixa que o painel de cima tem uma célula frontal alcançada. - Um teste de propriedades coloca sequências legais aleatórias de até 16 peças em room e room-up e verifica após cada passo que a caminhada a partir da chegada alcança a escada, o anfitrião e uma célula frontal de cada grupo preenchido. - Um teste de regressão coloca a cama em (9,3) e o criado-mudo em (6,4) em room e verifica que o segundo é recusado com uma mensagem que nomeia a vitrine.20 - Uma captura do modo Arrumar no simulador do iPhone 18 Pro Max mostra a área ocupada de uma peça em mãos tingida célula por célula, uma legal e uma ilegal. - O check() da forja passa em todo layout que o app consegue produzir: o teste exporta o layout colocado como ROOM_FURNITURE e roda a verificação da forja sobre ele, somente leitura. Como essa verificação lê só os objetos exportados e não tem verificação de letra para o painel de parede, o mesmo teste também verifica, com o validador do próprio briefing, que nenhuma das áreas ocupadas colocadas divide uma célula, inclusive as das peças encostadas na parede, e que os três pontos do painel de parede ficam sobre as células W do painel no mapa criado.64

7.2 O limite: dezesseis por andar, cômodos iniciais com oito

O quê. 16 peças colocadas por mapa de andar, room e room-up cada um, itens de parede incluídos, assim como New Horizons conta itens de parede e de teto nos seus 150.5 O que a coleção preenche (fichários na prateleira, cartas na vitrine, fitas e broches no painel) nunca conta: o limite orça móveis, e a coleção é o objetivo. A posse não é limitada por ele; um colecionador pode possuir mais do que cabe, como permite o espaço de Emerald para 150 possuídas contra 16 colocadas.2

Os números. 16 contra 125 células de piso dá 0,13 por célula, metade dos 0,27 de Emerald, o que combina com peças que cobrem em média 3,04 células contra as 2,43 de Emerald e com um colecionador cuja célula tem dois tiles de largura (minha aritmética).9227 O room inicial da forja já tem 13 peças móveis e o room-up, 11, então um colecionador novo chegando com 13 de 16 teria três escolhas pela frente.9 A proposta: entregar cada andar inicial com 8 peças móveis, escolhidas na forja. Embaixo fica a estante de livros, já que ela leva os pontos de prateleira; em cima fica uma cama, e o rearranjo libera pelo menos uma célula na frente do painel de parede, o que nenhuma célula está hoje. As peças retiradas vão para a bandeja do colecionador em vez de sumir, então 8 vagas por andar são do colecionador desde o primeiro dia.20 As peças iniciais são criadas com ids fixos, para que dois aparelhos abrindo a frio criem os mesmos registros, não dois conjuntos (7.7).

Indiferente ao apoio. A linha da nota de pesquisa vale: itens de apoiador são “never a bigger furnishing cap” (nunca um limite de móveis maior).69

Critérios de aceitação. Um teste unitário coloca 16 peças e verifica que a 17ª é recusada com uma mensagem que nomeia o limite; um teste de que fichários, cartas, fitas e broches nos pontos preenchidos não mudam a contagem; um teste de que todo nível de apoiador vê um limite de 16; um teste de que os dois andares iniciais carregam com 8 peças móveis e passam na regra de caminho.

7.3 Papel de parede e piso

O quê. Por mapa de andar, um estilo de parede e um estilo de piso, cada um trocado no modo Arrumar com um toque, de graça e reversível: o gesto único para uma superfície de Stardew e a escolha por cômodo de New Horizons, não a permanência do Habbo.41533 Estilos não contam para os 16.

O vocabulário que existe. Duas faces de parede (plaster e blocks), três pisos (tábuas o, ladrilhos t, mármore s) e o tapete.64 A forja desenha por regras a partir de rampas de paleta nomeadas, então um estilo é um desenhista e uma rampa. O primeiro conjunto são as 2 faces em 3 rampas cada e os 3 pisos em 2 rampas cada: 6 estilos de parede e 6 de piso, todos desenhados pela forja, nada pintado à mão. Mais estilos chegam jogando (7.5).

Como é entregue. A forja exporta cada estilo como células de atlas ao lado das do próprio cômodo, e o app troca os índices de chão das células de parede e das células de piso; o tapete mantém o seu nine-slice.

Critérios de aceitação. Uma captura de room em cada estilo de parede e cada estilo de piso, 12 no total; uma verificação de paleta de que cada pixel de cada estilo é um índice da paleta da forja; um teste de que trocar um estilo deixa intactas as peças colocadas e os pontos preenchidos.

7.4 A carta de domingo: uma pontuação semanal com cada fonte impressa

O quê. Uma vez por semana, na primeira abertura a partir da meia-noite de domingo no horário local, uma carta aparece no capacho (um objeto na célula de chegada) avaliando a casa como ela está. Uma carta por domingo, com a data daquele domingo no horário local como chave. A semana do quadro de missões não pode ser a chave: Quest.current usa o intervalo weekOfYear do calendário, que começa no dia em que começa a semana do calendário, então uma chave semanal e a regra do domingo poderiam discordar.70 Uma semana perdida não custa nada. A carta imprime cada linha de fonte com os seus pontos, depois o total e a faixa da casa. O nome é do próprio Kiradex, a nota do curador por enquanto, nunca o nome do jogo de onde vem o ritmo.

Fontes. O formato é o da Happy Home Academy como a Nookipedia o tabula (limiares de quantidade, um bônus de conjunto, um bônus de cor); os números são meus, e a coleção entra nela.6 Os limites são por mapa de andar, como os 16.

Fonte Pontos Limite O que pega emprestado
Cada peça colocada 100 16 peças por andar os limiares de quantidade
Um andar mobiliado: 6, 10 e 16 peças 500 em cada 1.500 por andar 1.000 aos 6, 10, 15 e 20 itens
Um jogo: 4 ou mais peças de um mesmo conjunto da forja num andar 200 por peça 16 peças por andar 4 ou mais de uma mesma série
Uma rampa: 70% das peças do andar e as suas duas superfícies, parede e piso, numa mesma família de rampa 100 por peça colocada no andar 16 por andar 70% numa só cor
Uma rampa a 90% (substitui a linha dos 70%) 300 por peça colocada no andar 16 por andar 90% numa só cor
A prateleira: os 5 lugares de fichário preenchidos com a coleção 500 uma vez as escrivaninhas de Emerald que sustentam bonecos
A vitrine: cada um dos seus 2 lugares tem uma carta 300 cada 600
O painel: cada uma das suas 3 células tem um broche, um carimbo ou uma fita 100 cada 300
Deduções nenhuma a regra de caminho já recusa um cômodo bloqueado

Proposta. Cada linha pode ser calculada a partir do cômodo local e da coleção.

A maior pontuação que esta tabela pode dar é 23.600, calculada linha por linha para os dois andares com 16 peças e todos os bônus cumpridos; as linhas de jogo e de rampa supõem um conjunto e uma família de rampa grandes o bastante para as dezesseis, então é um limite superior, não um layout que alguém tenha desenhado. Um andar inicial com 8 peças, antes de conjuntos, rampas ou pontos, faz 1.300.21

Gráfico de barras horizontais das fontes de pontos da carta de domingo no máximo para os dois andares: cada peça colocada 3.200; um andar mobiliado com 6, 10 e 16 peças 3.000; um jogo 6.400; uma rampa a 90% 9.600; a prateleira cheia 500; a vitrine 600; o painel 300; 23.600 no total.

No topo da escala, composição (conjuntos e rampas) vale mais do que quantidade, e é para isso que serve um limite.2421

A carta avalia a casa em três faixas, e cada limiar é a pontuação que a própria tabela dá a uma casa de referência: 4.500 para os dois andares com 10 peças e a prateleira cheia; 7.600 para os dois andares com 16 peças e a prateleira, a vitrine e o painel cheios; e 14.000 para essa casa com um jogo de 8 e 70% numa rampa em cada andar. Uma casa inicial, os dois andares com 8, faz 2.600, abaixo da primeira faixa.21 Os três números são proposta minha; o Blake define os finais antes de a carta ser lançada. Diferente dos da Academy, eles não sobem, porque o formato da casa nunca muda (veja Fora deste briefing, abaixo).6 Uma faixa da casa não é uma fita. As fitas que o app já guarda vêm dos colecionadores da cidade e são armazenadas como plaza.ribbons; são essas as fitas que o painel mostra (seção 6).73 A faixa da casa é impressa na carta e guardada como um número (7.5), e nunca vai para o painel.

O que a pontuação nunca lê. Nível de apoiador, moedas, compras, curtidas, nada sobre outro jogador, nem uma skin de cômodo de apoiador. Cada linha pode ser calculada a partir do cômodo local e da coleção, então um colecionador vê exatamente por que tirou o que tirou. Se a skin de cômodo de apoiador for lançada, ela é desenhada sobre o estilo de parede comum do andar e não é, ela mesma, um estilo de parede: o andar mantém esse estilo comum para a pontuação, então as linhas de rampa contam as mesmas peças e superfícies com a skin ligada ou desligada (7.5).

Mudança na forja. PIECES ganha uma tag set, desenhada como material combinando; os primeiros conjuntos são as peças existentes agrupadas pelo material em que são desenhadas.

Critérios de aceitação. Uma função pura Score.week(room:collection:) com um teste unitário para cada linha: um andar com 5, 6, 10 e 16 peças; um jogo de 3 e um de 4; 69%, 70%, 89% e 90% numa rampa; uma prateleira com 4 e com 5 fichários. Um teste de que o máximo é 23.600. Um teste de que as três casas de referência fazem 4.500, 7.600 e 14.000 e ganham a primeira, a segunda e a terceira faixa da casa, e de que a casa inicial, com 2.600, não ganha nenhuma. Um teste de que alcançar uma faixa da casa não acrescenta nada a plaza.ribbons nem ao painel. Um teste de que a carta de um domingo é gerada uma vez (a mesma data de domingo duas vezes dá uma carta, o domingo seguinte outra), e de que um calendário cuja semana começa na segunda produz as mesmas chaves. Um teste de que dois perfis que diferem só no nível de apoiador recebem pontuações idênticas. Uma captura de UI da carta no capacho num domingo, com um argumento de inicialização que define a data.

7.5 Desbloquear jogando, nunca comprando

O quê. O catálogo que um colecionador possui é derivado do jogo. Três das suas seis entradas existem hoje: níveis e broches, derivados da coleção sincronizada, e carimbos de missão, registrados só no aparelho. As outras três precisam de contadores novos, cada um nomeado e sincronizado:

  • Níveis. A curva do WORLD.md é level = floor(sqrt(XP / 40)) + 1.67 Um tipo ou estilo em cada nível de 2 a 20, depois a cada dois níveis, do jeito que o WORLD.md já trava cosméticos “that cannot be bought” (que não podem ser comprados).67 Disponível hoje, derivado da coleção sincronizada: o app calcula experiência e nível a partir dela, “so every device agrees without anything being stored” (para que todo aparelho concorde sem que nada seja armazenado).74
  • Broches. Cada broche desbloqueia uma peça nomeada: Full Set uma mesa de exposição, Vintage um relógio, Across the Sea um biombo. A primeira e a última são peças novas da forja.67 Disponível hoje, derivado da coleção sincronizada pelo mesmo cálculo.74
  • Missões semanais. Cada missão semanal concluída acrescenta uma cópia de uma peça básica: uma cadeira, uma planta, um caixote.70 Registrado hoje, mas só no aparelho: os carimbos ficam em @AppStorage("quests.stamps"), que é UserDefaults, não o armazenamento sincronizado, então eles passam para PlayRecord (abaixo) antes que qualquer peça dependa deles.7375
  • Passos. Uma caminhada longa, uma peça que custa uma contagem grande de passos, como a cadeira de vidro de Emerald custa 6.000 de cinza coletada passo a passo. O saco de Emerald não mostra contador, e a oficina só informa o que falta quando o jogador volta lá; a proposta aqui é um contador que fica visível no card da peça na bandeja, passos andados contra passos necessários.2815 Uma flor prensada da planta no peitoril é uma proposta à parte, um item de parede cujo desbloqueio é definido no briefing de Como homenagear os velhos jogos de Pokémon sem tomar nada emprestado, com a planta crescendo um estágio a cada 256 passos, ficando em flor por 1.024 passos e depois soltando uma flor, e não pelo contador deste item. Novo: o app não guarda contagem de passos hoje, então isso precisa de stepsWalked.73
  • Visitas. As patentes do passaporte em 30, 100 e 500 cômodos visitados desbloqueiam um estilo cada.69 Novo: hoje nada registra uma visita, nem no aparelho nem no servidor, então isso precisa de roomsVisited, os ids dos anfitriões.7368
  • A carta. Na primeira vez que um colecionador alcança cada faixa da casa, desbloqueia uma peça. Novo: as faixas da casa só existem neste briefing (7.4), então isso precisa de letterTier, a faixa da casa mais alta alcançada.

Diff do modelo. Os carimbos de missão e os três contadores novos ficam num modelo sincronizado, PlayRecord, um registro por aparelho, no mesmo formato dos outros do app para o CloudKit (7.7). O catálogo lê o registro de cada aparelho: passos são somados, carimbos e anfitriões visitados são unidos, e vale a faixa da casa mais alta. O aparelho guarda o uid do próprio registro sob uma chave @AppStorage, no mesmo namespace de UserDefaults que plaza.id, o id do aparelho na praça.7375 Cada aparelho escreve só o próprio registro, então dois aparelhos nunca editam o mesmo e não é preciso regra de fusão. Isso só vale enquanto o ponteiro ficar num aparelho só, e um backup restaurado num segundo celular levaria o ponteiro junto (minha leitura; nenhuma restauração foi testada). Então o registro carrega um marcador de aparelho, writer, e a regra é: um aparelho restaurado cria um registro novo quando o registro do seu ponteiro foi escrito por outro aparelho. O registro antigo fica, e o catálogo continua lendo ele. Que valor serve de marcador que um backup não leva para um celular novo não está resolvido neste briefing; o teste fixa a regra. Na primeira abertura depois da mudança, o aparelho copia a sua lista quests.stamps para o seu registro uma vez.

O que é recusado. Nenhum móvel ou estilo como compra no app, nenhum preço em moedas para móveis, nenhum móvel aleatório de nenhum tipo, nenhuma peça de quantidade limitada e nenhuma troca de móveis: os quebráveis, os raros e os valores de troca do Habbo são o contraexemplo.1735 Minha leitura: um app 9+ cujo ciclo de decoração é comprado ou aleatório atrai questões de loot box e de pressão de que o app de colecionáveis não precisa, e desbloquear jogando as evita. A única exceção paga que a nota de pesquisa permite é “one room skin” (uma skin de cômodo) para apoiadores, e o post sobre mundos a nomeou: “Patron flair stays on the name-plate and the room skin” (os enfeites de apoiador ficam na plaquinha com o nome e na skin do cômodo).6910 A mesma frase define o limite: os enfeites de apoiador “never touches a pedestal slot or a judging bonus” (nunca tocam uma vaga de pedestal nem um bônus de avaliação).10 Este briefing reabre a skin como decisão do Blake em vez de tratá-la como resolvida. Se ele a mantiver, a skin é uma sobreposição visual, não um estilo de parede. O andar mantém o estilo de parede comum que o colecionador escolheu, a skin é desenhada por cima, e a pontuação lê só o estilo comum, então as linhas de rampa do 7.4 contam as mesmas peças e superfícies, sobre o mesmo denominador, com a skin ligada ou desligada. Tirar a parede da contagem da rampa, por outro lado, não seria neutro, porque a proporção conta superfícies além de peças. Um andar de 16 peças, com 15 delas e o estilo de piso numa mesma rampa e a parede fora dela, dá 16 de 18, 88,9%, na linha dos 70% por 1.600 pontos, 100 por cada uma das 16 peças colocadas, inclusive a que está fora da rampa; tirando a parede, dá 16 de 17, 94,1%, na linha dos 90% por 4.800, 300 por cada uma das 16, um bônus de avaliação de 3.200 pela skin paga.76 O teste abaixo exclui a skin pelo nome.

Critérios de aceitação. Um teste unitário de que o catálogo possuído é uma função pura de XP, broches, carimbos de missão, passos andados, cômodos visitados e faixa da casa, e não muda com mais nada; um teste de que os PlayRecord de dois aparelhos dão o mesmo catálogo lidos em qualquer ordem (passos somados, carimbos e anfitriões unidos, a faixa da casa mais alta); um teste de que a lista quests.stamps existente de um aparelho é copiada para o seu registro uma vez e nunca duas; um teste de que um aparelho cujo ponteiro aponta para um registro com o writer de outro aparelho cria um registro novo, deixa o antigo inalterado e continua contando os dois; um teste de que nenhum identificador de produto do StoreKit e nenhum item da loja de moedas corresponde a um tipo de móvel ou a um estilo, com uma exceção nomeada: se o Blake mantiver a skin de cômodo de apoiador, o produto dela corresponde a exatamente uma sobreposição e a nenhum estilo de parede, e aplicá-la deixa inalterado o estilo de parede que pontua no andar; um teste de que um andar pontua igual, linha por linha, e ganha a mesma faixa da casa com a skin ligada e desligada, rodado em cada fronteira de limiar: 5, 6, 10 e 16 peças, 69%, 70%, 89% e 90% numa rampa, cada caso com a parede comum dentro da família de rampa e fora dela, e casas um ponto abaixo de cada limiar de faixa da casa e exatamente nele; um teste de snapshot da bandeja do catálogo no nível 1 (só o conjunto inicial) e no nível 20.

7.6 Visitas: somente leitura, uma curtida por dia, um total que nunca cai

O quê. Um visitante entra na casa de um anfitrião pela porta, usando os warps de cômodo que a cidade já tem para as casas dos próprios colecionadores,39 e vê as peças colocadas, os estilos e os pontos preenchidos do anfitrião. O visitante pode andar e dizer falas prontas, e não pode mover, levar nem acrescentar nada: a regra do Habbo, e o fim a que o sonho de New Horizons chega ao não guardar nada que um visitante mude.1832 Uma curtida na porta conta uma vez por visitante, por anfitrião e por dia local, e o total do anfitrião nunca diminui, nem quando ele rearruma: a regra de Club Penguin, segundo a sua única fonte de fãs.19 Visitar dá ao visitante um carimbo no passaporte, que o aparelho do visitante acrescenta a roomsVisited no seu PlayRecord (7.5).69

Diff do servidor. O servidor de hoje não guarda nada.68 Visitas precisam de dois registros pequenos por jogador. O primeiro é o layout da casa: no máximo 32 peças colocadas em dois andares, cada uma com tipo, x, y e orientação, mais dois ids de estilo por andar. Como JSON compacto com chaves nomeadas, o nome de tipo proposto mais longo em cada vaga e ids de estilo de 16 caracteres, são 1.974 bytes, menos de 2 KB; como quádruplas de números puros seriam 385 (meu cálculo; a base inteira de Emerald tem 32 bytes).7211 O segundo é um total de curtidas com o conjunto de visitantes do dia. Nenhum dos dois guarda dados pessoais além do apelido do jogador. O servidor valida um layout com as mesmas seis regras antes de guardá-lo, então um cliente modificado não consegue guardar um cômodo ilegal. Os contadores de jogo do 7.5 (carimbos de missão, passos andados, cômodos visitados, a faixa da casa) não são registros do servidor: sincronizam pelo iCloud do próprio colecionador em PlayRecord, e o servidor nunca os lê.

Critérios de aceitação. Testes de servidor: um layout com sobreposição, caminho bloqueado ou 17ª peça num andar é recusado; uma mensagem de mover ou colocar de um visitante no cômodo de um anfitrião é recusada; duas curtidas de um visitante num mesmo dia contam uma vez e uma curtida no dia seguinte conta; um anfitrião que esvazia o cômodo mantém o total. Um percurso com dois simuladores: o aparelho A arruma, o aparelho B visita e vê as mesmas peças nas mesmas células, com uma captura de cada um.

7.7 O modelo e a tela no iOS 26

SwiftData. Dois modelos, no mesmo formato dos outros do app para o CloudKit: padrões em tudo, nada único e um uid definido como UUID no init, como o que Profile, PriceHistory e CardCopy têm.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 }
}

Estilos de parede e de piso ficam como strings em Profile, ao lado de lookData.77 Nenhum #Unique e nenhum relacionamento obrigatório, porque o CloudKit não suporta nenhum dos dois.22 Exclusividade de célula, o limite e a caminhada são impostos em código, por uma única função. RoomLayout.repair(_:) roda a cada leitura. Ela ordena as peças sincronizadas de um andar por uid, em ordem crescente, e reconstrói o andar a partir da sua arquitetura fixa (o mapa de letras, a escada e os pilares), acrescentando cada peça nessa ordem só se a verificação de colocação completa do 7.1 a aceitar contra as peças já aceitas: as regras de célula (portanto nada de sobreposição), o limite de 16 e a regra de caminho. Uma peça que a verificação recusa volta para a bandeja. Todo aparelho ordena os mesmos registros do mesmo jeito, então todo aparelho reconstrói o mesmo cômodo, e onde duas peças conflitam vence o uid menor, a regra que PriceBook já usa para escolher um dos históricos de preço de dois aparelhos.52 A ordem é por uid, não por horário de colocação, porque um horário vem do relógio de cada celular. Sobreposição não é o único conflito que dois celulares conseguem criar. Uma cama em (9,3) colocada num celular e um criado-mudo em (6,4) noutro passam, cada um, na verificação completa no próprio aparelho, e juntos isolam as duas células na frente da vitrine; a reconstrução fica com o de uid menor e devolve o outro.2066 Como tirar uma peça nunca corta um caminho, um andar que já é legal passa pela reconstrução sem mudanças em qualquer ordem (raciocínio meu; os critérios de aceitação fixam isso). As peças iniciais do 7.2 são o único lugar em que dois aparelhos criam registros sem que um jogador aja, então cada uma recebe um uid fixo a partir do seu andar e da sua vaga, de starter.room.1 a starter.room-up.8, em vez de um aleatório: dois aparelhos que abrem a frio criam os mesmos dezesseis uid, não dezesseis pares que a reconstrução dividiria entre o andar e a bandeja. Antes de reconstruir, repair funde num só os registros que compartilham um uid, do jeito que ModelContext.profile() já funde os perfis duplicados que a sincronização deixa no de uid menor.77 Quando duas cópias discordam, porque um aparelho moveu a sua peça inicial antes de o outro abrir pela primeira vez, a fusão fica com a cópia que está fora da sua célula inicial, e entre duas cópias movidas, com a de fileira menor, depois a de coluna menor (proposta minha). Se guardar uma peça apaga o registro dela, uma peça inicial guardada num celular volta quando um segundo celular abre a frio; este briefing não resolve esse caso.

Colocação. O modo Arrumar sobrepõe uma bandeja de SwiftUI à RealityView do cômodo. Um item da bandeja é draggable com o seu tipo como payload Transferable; a view do cômodo é um destino de soltura.53 No iOS 26, dropDestination(for:action:isTargeted:) entrega à action o ponto de soltura nas coordenadas da view, e o ponto vira uma célula pela escala de pixel inteiro conhecida da câmera: cell = floor((point - mapOrigin) / tileSizeInPoints).54 Como a página da Apple lista essa forma como obsoleta no iOS 27.2, o briefing também implementa a forma com DropSession e lê a localização da sessão, se ela tiver uma; essa página não foi lida.54 Uma peça colocada é selecionada com SpatialTapGesture e movida com DragGesture, encaixando célula por célula, com a área ocupada tingida por célula como o Stardew tinge os seus tiles.565516

VoiceOver. No modo Arrumar, cada peça colocada é um elemento de acessibilidade, por exemplo Sofá, três por dois, coluna 9, linha 8, com as ações nomeadas Mover para a esquerda, Mover para a direita, Mover para cima, Mover para baixo, Girar (só cadeiras) e Guardar.5758 Um rotor chamado “Móveis” lista as peças do cômodo.60 A ação Colocar de um item da bandeja põe a peça na célula legal mais próxima da chegada e a coloca em foco. Estilos de parede e de piso são elementos ajustáveis: deslize para cima e para baixo para alternar.59 Toda recusa é falada como anúncio, por exemplo Não dá para mover: o sofá isolaria a prateleira.61 As regras do 7.1 são uma única função, então voz e toque nunca podem discordar.

Critérios de aceitação. Um teste unitário de que repair resolve uma sobreposição entre dois aparelhos do mesmo jeito em qualquer ordem. A regressão de fusão entre dois aparelhos, rodada com os dois registros nas duas ordens de entrada: em room como a forja o cria hoje, o aparelho A coloca uma cama em (9,3) e o aparelho B um criado-mudo em (6,4); cada colocação passa sozinha na verificação completa; depois que os dois sincronizam, repair devolve o mesmo cômodo nas duas ordens, fica com a peça de uid menor, põe a outra na bandeja com uma mensagem que nomeia a vitrine, e a caminhada a partir da chegada ainda alcança as duas células na frente da vitrine; com os dois uid trocados, a outra peça é a que fica.66 Um teste de que repair deixa inalterado um andar legal de 16 peças, com os registros embaralhados em várias ordens. Um teste de que 17 peças sincronizadas num andar, legais juntas exceto pelo limite, voltam como 16, com o uid maior na bandeja. Um teste de que dois aparelhos abrindo a frio, cada um criando as peças iniciais, sincronizam para um registro por célula inicial, 8 por andar, sem nada na bandeja, em qualquer ordem de sincronização; e de que uma peça inicial movida num aparelho antes de o outro abrir fica onde foi movida. Um teste de UI que arrasta um item da bandeja para uma célula e encontra uma PlacedPiece nessa célula. Testes unitários dos handlers das ações do VoiceOver, chamados diretamente no modelo do modo Arrumar, não pelo VoiceOver: Colocar põe uma cadeira na célula legal mais próxima da chegada; Mover para a esquerda, Mover para a direita, Mover para cima e Mover para baixo a movem uma célula cada ou recusam com um motivo; Girar alterna a orientação; Guardar a devolve para a bandeja; e toda recusa produz o texto de anúncio que a tela vai publicar. Num simulador de iOS 27, um teste de UI que liga o VoiceOver via XCUIVoiceOverService, move o foco para uma peça colocada e verifica o rótulo falado, como Sofá, três por dois, coluna 9, linha 8.63 Uma auditoria do modo Arrumar com performAccessibilityAudit que não aponte problemas.62 Uma verificação manual num aparelho com o VoiceOver ligado, registrada com data e build, porque nenhuma chamada do XCUIAutomation executa uma ação personalizada, gira um rotor ou lê um anúncio: colocar uma cadeira a partir da bandeja, movê-la nas quatro direções com as ações, girá-la, guardá-la, pular entre peças com o rotor Móveis e ouvir o anúncio de cada movimento recusado. Antes de tudo isso, um spike: soltar um payload no cômodo no simulador com a escala real da câmera e registrar a célula calculada contra a célula sob o dedo, já que esse mapeamento não foi testado.

7.8 Arrumação

  • O WORLD.md recebe as regras de cômodo, com os números deste briefing, para que o documento de design diga o que o post sobre mundos publicou.6710
  • A docstring e a tabela de interiors.py passam a concordar, de um jeito ou de outro: ou a docstring diz que as peças pequenas são a exceção, ou as peças pequenas são redesenhadas com dois tiles. O briefing as mantém.9

Fora deste briefing

  • Empilhamento além dos pontos da própria prateleira: nenhuma peça sobre uma mesa, nenhuma superfície de boneco em escrivaninha. A ideia das superfícies é o próximo passo depois que o limite e a caminhada estiverem comprovados.
  • Peças que agem quando pisadas: nada de tapetes com som, molas ou escorregadores.
  • Colocação em meia célula. A grade fica em células inteiras de 16 pixels.
  • Mobiliar o salão de exposição. Os pedestais continuam sendo da exposição semanal.
  • Um concurso de mobília. O salão semanal é o concurso, julgado pelas próprias regras.
  • Plantas baixas: o formato da casa não muda.
  • Visitas a desconhecidos fora de uma praça compartilhada, e qualquer ranking de cômodos além do total do próprio anfitrião.

Nunca, na mobília

  1. Nenhum vocabulário de franquia em nada disso: nem a base, nem o computador de decorar, nem a Academy, nem a mistura de registros, nem o nome de nenhuma decoração. Só palavras do Kiradex. Os jogos são nomeados neste post como fatos sobre obras publicadas, não como recursos.
  2. Nenhuma peça desenhada a partir de uma decoração de jogo: nada de bonecos ou almofadas de criaturas, nada em formato de bola, nada de pôsteres de criaturas, nenhum tapete com nome de golpe. As peças da forja são móveis domésticos, e continuam assim.
  3. Nenhuma criatura em nenhum cômodo. Plantas são plantas.
  4. Nenhum móvel comprado, aleatório ou limitado (7.5).
  5. Nada num cômodo é mirado, arremessado, capturado, invocado, solto para lutar ou montado.
  6. Nenhum código ou dado das descompilações no app ou na forja. O código descompilado é para estudo e medição; as regras acima estão reescritas nos termos do próprio Kiradex.

Critérios de aceitação. Um grep do catálogo de strings, dos nomes de PIECES da forja e das tabelas do servidor com uma lista de palavras montada a partir do vocabulário de franquia do item 1, mais “decoration”, “doll”, “Happy Home” e “Academy”, não retorna nada.

Principais conclusões

Se você desenha a arte

  • Desenhe os móveis na largura do quadro ou da célula do personagem. O quadro do jogador de Emerald tem uma célula de 16 pixels de largura e as decorações dele cobrem em média 2,43 células; o colecionador do Kiradex fica numa célula de dois tiles de largura e as peças cobrem em média 3,04.2729
  • Faça um catálogo de peças quase todas pequenas com algumas âncoras grandes: 71 das 120 decorações de Emerald ocupam uma célula, e as escrivaninhas e os tapetes de 3 por 3 são as âncoras em que as pequenas ficam.224
  • Desenhe papéis de parede e pisos a partir de regras e rampas, para que um estilo seja um desenhista e uma paleta, não uma pintura nova: duas faces de parede em três rampas e três pisos em duas rampas dão ao Kiradex seis de cada.64

Se você constrói o motor

  • Guarde uma peça colocada como tipo, célula e orientação. Emerald guarda uma em dois bytes, uma base em 32.1112
  • Verifique a colocação por célula e depois caminhe. A verificação por célula de Emerald nunca pergunta se a porta ainda alcança alguma coisa; no térreo do Kiradex, 713 de 229.891 pares legais de peças extras isolam a escada, o anfitrião ou uma exposição sem cobri-los.420
  • Com sincronização pelo CloudKit, o SwiftData não consegue impor uma restrição de unicidade, então uma peça por célula vira uma função pura de reparo que escolhe o mesmo vencedor em todo aparelho. Faça ela reconstruir o cômodo passando pela verificação de colocação inteira, caminhada incluída, numa ordem fixa: duas edições que passam cada uma no seu celular podem isolar uma exposição juntas.225266
  • Dê ao VoiceOver verbos, não uma grade para percorrer deslizando: ações de movimento nomeadas, um rotor de peças, um anúncio para cada recusa.586061

Se você projeta o ciclo

  • Limite o que é colocado, não o que é possuído: Emerald coloca 16 e guarda 150. O limite é a composição.2
  • Pontue num dia fixo com cada fonte discriminada, suba a régua só quando a casa cresce e nunca puna uma semana perdida: a página da casa da wiki, que não nomeia nenhum jogo, diz que uma casa largada por pelo menos uma semana se enche de baratas, e a tabela da HHA de New Horizons desconta 2.500 por barata.56
  • Faça o catálogo crescer jogando. Emerald nunca vende por dinheiro 24 das suas 120 decorações e vende mais duas só por cinza coletada andando, o Stardew, depois da primeira reforma, vende um catálogo de 200.000g que passa a vender por 0g os móveis que lista, e os móveis escassos e aleatórios do Habbo são o contraexemplo para um app infantil.14151617
  • Visitantes olham, não mexem e deixam uma curtida por dia num total que nunca cai.51819

Perguntas frequentes

Quantos itens um jogador deveria poder colocar num cômodo?

O bastante para compor, pouco o bastante para escolher. Pokémon Emerald limita uma base a 16 decorações colocadas e o quarto a 12, cerca de um quarto das 60,2 células caminháveis de uma base média. Animal Crossing: New Horizons permite 150 por cômodo, contando itens de parede e de teto, segundo a Nookipedia, e Final Fantasy XIV permite de 150 a 600 em interiores conforme o tamanho da moradia desde o Patch 7.5. Para um cômodo 2D sem camada de parede nem de teto, meu limiar é um limite abaixo de um item a cada três células de piso, e os 0,27 de Emerald ficam logo abaixo disso; os 16 propostos para o Kiradex dão 0,13 por célula de piso.2579

Como funciona o sistema de decoração de Pokémon Emerald?

São dados. Cada uma das 120 decorações tem uma categoria, um formato de 1 a 9 células, um preço e uma de cinco permissões (piso sólido, piso de passagem, fundo, parede ou sprite). CanPlaceDecoration verifica cada célula coberta: piso comum, nenhum objeto e, na célula em que o jogador estava, nenhum tile com tipo de camada não normal; células de parede para os pôsteres; uma célula de apoio para bonecos e almofadas, pequena ou grande para a maioria e grande para um boneco de 1 por 2. 18 decorações oferecem células de apoio pequenas: sete escrivaninhas, três tijolos, um pneu e sete tapetes. As decorações colocadas são guardadas como um byte de id e um byte de posição cada.2411

Como a Happy Home Academy pontua um cômodo?

Pelas tabelas da Nookipedia, que não citam fonte para New Horizons: uma avaliação pelo correio na maioria das manhãs de domingo, notas B, A e S, um limiar de S que sobe de 15.000 para 90.000 conforme a casa cresce, 1.000 pontos em cada um dos limiares de 6, 10, 15 e 20 itens num cômodo, bônus por item de séries, conjuntos, categorias, cor dominante e feng shui, e deduções por baratas, lixo e itens virados para a parede. Os pontos por item são um esboço na wiki.6

O SwiftData consegue impor um item por célula da grade com sincronização pelo CloudKit?

Não com #Unique. O guia da Apple para sincronizar SwiftData lista as restrições de unicidade entre os recursos “that CloudKit doesn’t support natively” (que o CloudKit não suporta nativamente), e o CloudKit exige que todo relacionamento seja opcional. Dê um valor padrão a toda propriedade, não deixe nada único e resolva peças de dois aparelhos numa mesma célula numa função pura que roda a cada leitura e escolhe o mesmo vencedor em todo aparelho. Faça essa função reconstruir o cômodo numa ordem fixa passando pela verificação de colocação completa, não só pelo teste de sobreposição, porque duas edições legais cada uma podem quebrar uma regra juntas.225166

Como tornar uma grade de móveis com arrastar e soltar acessível ao VoiceOver?

Faça de cada peça colocada um elemento de acessibilidade com o tamanho e a célula no rótulo, dê a ela ações nomeadas para mover uma célula em cada direção, girar e guardar, acrescente um rotor que liste as peças do cômodo e anuncie cada movimento recusado com o motivo. accessibilityAction(named:_:), accessibilityRotor(_:entries:) e AccessibilityNotification.Announcement, da Apple, cobrem cada parte, e performAccessibilityAudit verifica a tela num teste de UI. A auditoria não aperta as ações nomeadas, e no Xcode 27.0 nenhuma chamada do XCUIAutomation faz isso, então teste os handlers das ações diretamente e confira as ações, o rotor e os anúncios à mão com o VoiceOver ligado.5860616263

Um jogo infantil deveria vender móveis?

Minha leitura é que não, para um app com classificação 9+: um ciclo de decoração comprado, aleatório ou escasso atrai questões de loot box e de pressão de que o jogo não precisa. Emerald nunca vende por dinheiro 24 das suas 120 decorações (são prêmios, trocas por pontos de batalha e presentes) e vende mais duas só por cinza coletada andando, e, feita a primeira reforma da casa, o Stardew vende um Catálogo de Móveis por 200.000g que passa a vender por 0g os móveis que lista, embora algumas peças ainda venham só do Museu, de festivais e de outras fontes. A economia do Habbo, baseada em compra, com raros e quebráveis aleatórios, mostra o outro extremo.14151617

Por que os visitantes desses jogos têm acesso somente leitura?

Na minha leitura, porque o cômodo é a expressão do anfitrião. Visitantes de Animal Crossing não podem “modify the interior in any way” (modificar o interior de forma alguma), visitantes do Habbo não podem largar nem mover móveis sem os direitos do dono, e donos em Club Penguin podem decorar o próprio iglu “but not other player’s igloos” (mas não os iglus de outros jogadores). O que os visitantes ganham em troca é uma marca que conta: a curtida por design por dia de Club Penguin, num Grand Total que nunca diminui.518819

Relacionado neste site: Estruturas em pixel art: casas, salões e interiores no iPhone construiu os interiores que este briefing mobília, e a sua seção de interiores descreve os cômodos de 14 por 11 que a build 26 substituiu; Mundos em pixel art no iPhone é onde o limite de dezesseis, as visitas somente leitura, a curtida diária e o relatório de domingo foram publicados primeiro; Pessoas em pixel art: personagens e um criador no iPhone trata do colecionador cuja largura define o ritmo dos móveis; Layout de cidades em pixel art: de Pallet a Pelican Town, medido mede a cidade em que as casas ficam; Movimento em pixel art: caminhadas, câmeras e portas no iPhone trata da caminhada e das portas por onde um visitante entra; e Rotas em pixel art: conexões de mapas e distritos no iPhone trata das terras além da cidade.

Fontes


  1. pret, pokeemerald/include/constants/global.h (SECRET_BASES_COUNT 20, DECOR_MAX_SECRET_BASE 16, DECOR_MAX_PLAYERS_HOUSE 12), commit 731ad5b (1º de outubro de 2026), lido em 5 de outubro de 2026, https://github.com/pret/pokeemerald/blob/master/include/constants/global.h. ↩↩↩↩↩

  2. Medição do autor, 5 de outubro de 2026: measure_emerald_decor.py na pasta de evidências do autor para este post, saída salva como measure_emerald_decor.out, rodado num clone raso do pokeemerald do pret no commit 731ad5b. Lê os limites de include/constants/global.h; as 120 decorações (sem DECOR_NONE) com categoria, formato, permissão e preço de src/data/decoration/header.h; os arrays de inventário por categoria de include/global.h; o byte de comportamento de cada metatile de decoração de data/tilesets/secondary/secret_base/metatile_attributes.bin; e cada um dos 24 layouts de base e o quarto de data/layouts/layouts.json e o seu map.bin, contando as células caminháveis pelos bits de colisão. Células por decoração a partir dos nomes de formato; limite sobre a média de células caminháveis 16 / 60,2 = 0,27. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  3. pret, pokeemerald/src/data/decoration/header.h (gDecorations[]: nome, permissão, formato, categoria, preço e tiles de cada decoração; entrada 0 DECOR_NONE), commit 731ad5b, lido em 5 de outubro de 2026, https://github.com/pret/pokeemerald/blob/master/src/data/decoration/header.h. ↩↩↩↩

  4. pret, pokeemerald/src/decoration.c (CanPlaceDecoration, DecorationItemsMenuAction_AttemptPlace, isPlayerRoom, gText_CantPlaceInRoom; as verificações de célula de apoio para decorações sprite), commit 731ad5b, lido em 5 de outubro de 2026, https://github.com/pret/pokeemerald/blob/master/src/decoration.c. No caso sprite, uma decoração de 1 por 2 precisa de MetatileBehavior_HoldsLargeDecoration e qualquer outra aceita uma célula de apoio pequena ou grande; IsntInitialPosition recusa a célula inicial do jogador só quando o tile da decoração ali tem um tipo de camada diferente de METATILE_LAYER_TYPE_NORMAL. Que nada na função verifique um caminho é a leitura do autor. ↩↩↩↩↩↩↩↩↩↩

  5. Nookipedia, “Player house” (limites por cômodo: 24 em Wild World, 64 em City Folk, 48 em New Leaf, 150 em New Horizons “including wall and ceiling-mounted furniture”; a tabela de ampliações de New Horizons com os tamanhos dos cômodos; “only the main room can be expanded in size”; a parede de destaque a partir da 2.0; visitantes não podem “modify the interior in any way”; um jogador que larga a casa “for at least one week” a encontra infestada de baratas), baixado e salvo em 5 de outubro de 2026 como nook-player-house.html e .txt na pasta de evidências dos cômodos, https://nookipedia.com/wiki/Player_house. Os 4,2 itens por tile são aritmética do autor (150 / 36). ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  6. Nookipedia, “Happy Home Academy” (a avaliação de domingo; as notas B, A e S por ampliação; os bônus e as deduções de pontos de New Horizons; “This section is a stub” para os pontos por item de New Horizons; a nota da tabela de recompensas “Includes data sourced from the Data Spreadsheet for Animal Crossing New Horizons”), baixado e salvo em 5 de outubro de 2026 como nook-hha.html e .txt, https://nookipedia.com/wiki/Happy_Home_Academy. As tabelas de bônus e de deduções não têm citação na página. ↩↩↩↩↩↩↩↩↩↩↩↩↩

  7. Square Enix, The Lodestone, notas do Patch 7.5 de Final Fantasy XIV (atualizadas em 13 de maio de 2026; os limites de móveis internos e externos antes e depois na seção Housing; a observação sobre exibição de 400 móveis; “Furnishings from the FFXIV Furnishing Design Contest have been added”), baixadas e salvas em 5 de outubro de 2026 como ffxiv-patch-7-5.html e .txt, https://eu.finalfantasyxiv.com/lodestone/topics/detail/9beb8a7b5c46944cd80ed92b2b8e972395fbea80/. O guia de moradia, https://na.finalfantasyxiv.com/lodestone/playguide/contentsguide/housing/, retornou HTTP 404 no mesmo dia; tamanhos de terreno não têm fonte neste post. ↩↩↩↩↩↩↩↩↩↩

  8. Club Penguin Wiki (Fandom), “Furniture” (o limite de posse de 99 unidades para a maioria dos móveis; “igloos have a limit preventing more than 99 units of furniture being placed at once”; donos decoram o próprio iglu “but not other player’s igloos”; os seis itens grátis para não assinantes de 26 de julho de 2012), lido pela API MediaWiki da wiki e salvo em 5 de outubro de 2026 como cp-fandom-furniture.html e .txt, https://clubpenguin.fandom.com/wiki/Furniture. Fonte única. ↩↩↩↩↩↩

  9. Medição do autor, 5 de outubro de 2026: measure_kiradex_interiors.py na pasta de evidências dos cômodos, saída measure_kiradex_interiors.out, que analisa scripts/forge/interiors.py do repositório do Kiradex com o módulo ast do Python (o arquivo nunca é importado nem executado): as 23 entradas de PIECES com largura, altura e flag de peça solta; os mapas de letras ROOM, ROOM_UP e HALL com as listas de móveis e os pontos; células de piso contadas como as letras o t s r; peças móveis excluem stairs, stairs_down e pillar. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  10. Blake Crosley, “Pixel-Art Worlds on iPhone: What the 16-Bit Masters Knew”, blakecrosley.com, 3 de outubro de 2026 (as regras de cômodo: “a furnishing cap of sixteen”, visitas somente leitura, uma curtida por dia, um total que nunca diminui, um relatório de domingo “with its point sources listed”; no mesmo parágrafo, “Patron flair stays on the name-plate and the room skin”; as patentes citadas no processo de Palworld; o ajuste de câmera de pixels do aparelho por texel), https://blakecrosley.com/blog/pixel-art-world-on-iphone. ↩↩↩↩↩↩↩↩↩↩

  11. pret, pokeemerald/include/global.h (u8 decorations[DECOR_MAX_SECRET_BASE] e u8 decorationPositions[DECOR_MAX_SECRET_BASE] no registro da base secreta; os arrays de inventário de decorações por categoria no save), commit 731ad5b, lido em 5 de outubro de 2026, https://github.com/pret/pokeemerald/blob/master/include/global.h. ↩↩↩↩↩↩↩

  12. pret, pokeemerald/src/secret_base.c (posições das decorações lidas com x no nibble alto e y no baixo), commit 731ad5b, lido em 5 de outubro de 2026, https://github.com/pret/pokeemerald/blob/master/src/secret_base.c. ↩↩↩

  13. pret, pokeemerald/include/decoration.h (enum DecorationPermission com o comentário “The nomenclature here describes collision and placement permissions, in that order.”; enum DecorationShape, com DECORSHAPE_3x1 e DECORSHAPE_1x3 marcados como não usados), commit 731ad5b, lido em 5 de outubro de 2026, https://github.com/pret/pokeemerald/blob/master/include/decoration.h. ↩↩↩

  14. Medição do autor, 5 de outubro de 2026: measure_emerald_sources.py na pasta de evidências dos cômodos, saída measure_emerald_sources.out, que procura no pokeemerald 731ad5b cada constante DECOR_ nas listas pokemartdecoration de data/maps/*/scripts.inc, no script do canto de prêmios, na tabela de trocas da instalação de batalha em src/data/battle_frontier/battle_frontier_exchange_corner.h e no primeiro argumento de givedecoration e adddecoration em qualquer lugar sob data/: 90 vendidas por dinheiro em cinco lojas, 3 do balcão de prêmios, 15 por pontos de batalha, 10 dadas por script, 24 nunca vendidas por dinheiro, 6 em nenhum desses. Duas das seis são o par da oficina de vidro (nota 15); as outras quatro, três bonecos lendários e mais um boneco, não foram rastreadas. ↩↩↩↩↩↩↩↩

  15. pret, pokeemerald/data/maps/Route113_GlassWorkshop/scripts.inc (PRETTY_CHAIR_PRICE, 6000, PRETTY_DESK_PRICE, 8000, pagos de VAR_ASH_GATHER_COUNT; Route113_GlassWorkshop_EventScript_NotEnoughAsh e _NotEnoughAshForItem subtraem a contagem do preço e mostram a diferença como passos que ainda faltam andar; uma busca em src, data e include encontra VAR_ASH_GATHER_COUNT usada só ali e em field_tasks.c, além da sua definição) e pokeemerald/src/field_tasks.c (uma unidade de cinza por passo no capim com cinza enquanto o saco é carregado, até 9999), commit 731ad5b, lido em 5 de outubro de 2026, https://github.com/pret/pokeemerald/blob/master/data/maps/Route113_GlassWorkshop/scripts.inc e https://github.com/pret/pokeemerald/blob/master/src/field_tasks.c. ↩↩↩↩↩↩↩

  16. Stardew Valley Wiki, “Furniture”, revisão 193159 (Robin e a Carroça de Viagem “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”; a linha do Catálogo de Móveis na tabela de catálogos, vendido na Carpintaria (Carpenter’s Shop) por 200.000g; “Some furniture can be obtained only by donating items to the Museum”, festivais, o cassino e outras fontes; os quadrados de colocação verdes e vermelhos), baixado e salvo em 5 de outubro de 2026 como sdv-furniture.html e .txt, https://stardewvalleywiki.com/Furniture. ↩↩↩↩↩↩↩↩↩↩↩

  17. Sulake, Habbo Help Center, “Furni Definitions” (móveis de campanha segurados “4-12 months” para os negociantes, raros que “will never be re-released”, raros quebráveis, LTDs “in limited quantities”), o corpo do artigo salvo em 5 de outubro de 2026 em habbo-articles.txt na pasta de evidências dos cômodos, https://help.habbo.com/hc/en-us/articles/360011621699-Furni-Definitions. ↩↩↩↩↩↩↩

  18. 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”), o corpo do artigo salvo em 5 de outubro de 2026 em habbo-articles.txt, https://help.habbo.com/hc/en-us/articles/360011512940-What-is-Furni. ↩↩↩↩↩↩↩

  19. That Penguin Game, “Your Igloo” (uma reprodução das páginas de ajuda de Club Penguin; a procedência não foi verificada: “You can Like any igloo design once every day!”; curtidas individuais e Grand Total Likes; “Likes are permanent, so your Grand Total Likes will never decrease, even if you delete an igloo design!”; as opções Everyone e Friends), baixado e salvo em 5 de outubro de 2026 como tpg-your-igloo.html e .txt, https://thatpenguingame.com/club-penguin-help/game-help/your-igloo/. Fonte única. ↩↩↩↩↩↩

  20. Medição do autor, 5 de outubro de 2026: measure_path_rule.py, guardado ao lado do rascunho do post, saída measure_path_rule.out e path_rule.json. Analisa scripts/forge/interiors.py do repositório do Kiradex com ast, reconstrói as letras exportadas como export() faz, caminha em quatro direções a partir da chegada de cada andar por otsrUD (o conjunto caminhável do check() da forja) e informa a escada, o anfitrião e a célula frontal de cada ponto preenchido (a primeira célula reta para o sul depois da prateleira e da faixa de parede). Depois testa, em room, cada colocação de uma peça solta extra (10 desenhos: cadeiras uma vez, camas uma vez) em piso livre longe das células de chegada, escada e anfitrião (733 colocações; 44 isolam um alvo, todas cobrindo-o), e cada par sem sobreposição de peças extras longe de todos os alvos (689 colocações individuais, 229.891 pares; 713 isolam um alvo). ↩↩↩↩↩↩↩↩↩↩

  21. Cálculo do autor, 5 de outubro de 2026: score_max.py em figures/ da pasta do rascunho, saída score_max.out e score_max.json: a tabela de pontuação do briefing somada para dois andares com 16 peças, cada linha no seu limite (3.200 + 3.000 + 6.400 + 9.600 + 500 + 600 + 300 = 23.600), e um andar com 8 peças sem linhas de conjunto, rampa ou pontos (800 + 500 = 1.300). O mesmo script pontua, com as linhas da própria tabela, as três casas de referência que definem os limiares propostos de faixa da casa: os dois andares com 10 peças e a prateleira cheia, 4.500; os dois andares com 16 peças e a prateleira, a vitrine e o painel cheios, 7.600; essa casa mais um jogo de 8 e 70% numa rampa em cada andar, 14.000; e a casa inicial, os dois andares com 8, 2.600. ↩↩↩↩

  22. Apple Developer Documentation, “Syncing model data across a person’s devices” (SwiftData; “does include a small number of features that CloudKit doesn’t support natively, such as unique constraints and nonoptional relationships”; “CloudKit requires all relationships to be optional”), JSON da documentação salvo em 5 de outubro de 2026 como apple-swiftdata-cloudkit-sync.html e .txt, https://developer.apple.com/documentation/swiftdata/syncing-model-data-across-a-persons-devices. ↩↩↩↩↩↩

  23. pret, pokeemerald/src/new_game.c (NewGameInitData chama ClearDecorationInventories()) e pokeemerald/src/decoration_inventory.c (ClearDecorationInventory define cada slot de cada categoria como DECOR_NONE), commit 731ad5b, lido em 5 de outubro de 2026, https://github.com/pret/pokeemerald/blob/master/src/new_game.c. ↩

  24. Figuras do autor, 5 de outubro de 2026: make_figures.py em figures/ da pasta do rascunho, que lê src/data/decoration/header.h do pokeemerald 731ad5b, os limites como citados nas notas 1, 5, 8 e 7, path_rule.json e score_max.json, confere cada total com as medições acima e gera emerald-decor-sizes.svg, caps.svg, room-path-rule.svg e score-sources.svg. As classes de área ocupada (1 célula, 2 células, 4 a 6, 8 ou 9) agrupam os formatos por células cobertas. Paleta verificada com o validador de dataviz; nenhuma arte de jogo. ↩↩↩↩↩

  25. pret, pokeemerald/include/constants/metatile_behaviors.h (os comportamentos MB_SECRET_BASE_*, MB_SLIDE_SOUTH, MB_HOLDS_SMALL_DECORATION, MB_HOLDS_LARGE_DECORATION), commit 731ad5b, lido em 5 de outubro de 2026, https://github.com/pret/pokeemerald/blob/master/include/constants/metatile_behaviors.h. ↩

  26. pret, pokeemerald/data/layouts/layouts.json (os 24 layouts LAYOUT_SECRET_BASE_* e os segundos andares das duas casas do jogador, com larguras e alturas) e o map.bin de cada layout, commit 731ad5b, lido em 5 de outubro de 2026, https://github.com/pret/pokeemerald/blob/master/data/layouts/layouts.json. As faixas de largura, altura e área são do autor, a partir da saída da medição. ↩

  27. Medição do autor, 5 de outubro de 2026: measure_character_cell.py na pasta de evidências dos cômodos, saída measure_character_cell.out, que lê os cabeçalhos PNG de graphics/object_events/pics/people/brendan/walking.png (144 por 32) e decorating.png (16 por 32) do pokeemerald, e a célula (32 por 40), figureTop (7) e underFeet (2) em Kiradex/Resources/World/characters.json do repositório do Kiradex. O script mede a célula e a altura da figura (31 pixels), não a largura da figura desenhada. ↩↩↩↩↩

  28. pret, pokeemerald/src/data/items.h (ITEM_SOOT_SACK, .fieldUseFunc = ItemUseOutOfBattle_CannotUse) e pokeemerald/src/data/text/item_descriptions.h (sSootSackDesc, uma descrição fixa de três linhas), commit 731ad5b, lido em 5 de outubro de 2026, https://github.com/pret/pokeemerald/blob/master/src/data/items.h. ↩↩

  29. Nookipedia, “Furniture” (tamanhos “ranging from 1.0×0.5” até 3 por 3; empurrar de meio em meio tile; os tipos de móveis de New Horizons e a decoração de teto a partir da 2.0; 2.076 móveis na versão 3.0.2, 1.074 adicionados em atualizações; uma série de “around 10 furniture items, as well as a matching wallpaper and flooring”), baixado e salvo em 5 de outubro de 2026 como nook-furniture.html e .txt, https://nookipedia.com/wiki/Furniture. ↩↩↩↩

  30. Nookipedia, “Wallpaper” (262 papéis de parede em New Horizons na versão 1.9.0), baixado e salvo em 5 de outubro de 2026 como nook-wallpaper.html e .txt, https://nookipedia.com/wiki/Wallpaper. ↩

  31. Nookipedia, “Flooring” (215 em New Horizons), baixado e salvo em 5 de outubro de 2026 como nook-flooring.html e .txt, https://nookipedia.com/wiki/Flooring. ↩

  32. Nookipedia, “Luna” (a seção de New Leaf: “any changes will not be saved and items cannot be brought back to the real world”; a seção de New Horizons: os serviços dela “work the same as they do in New Leaf”, e um vale trocável por 5.000 Bells (Dream Bell Exchange Ticket) a cada publicação), baixado e salvo em 5 de outubro de 2026 como nook-luna.html e .txt, https://nookipedia.com/wiki/Luna. ↩↩

  33. Sulake, Habbo Help Center, “Rooms” (“You can own 200 rooms.”; “Wallpaper and flooring are stuck down”), baixado e salvo em 5 de outubro de 2026 como habbo-rooms.html e .txt, https://help.habbo.com/hc/en-us/articles/360011512640-Rooms. ↩↩↩↩

  34. Sulake, Habbo Help Center, “What is Builders Club?” (o limite de mobis “increased by 250” a cada mês de assinatura; salvar layouts de quarto personalizados no editor de planta) e “What can I buy in Habbo?” (“Furni limits never go down.”), os corpos dos artigos salvos em 5 de outubro de 2026 em habbo-articles.txt, https://help.habbo.com/hc/en-us/articles/360011621659-What-is-Builders-Club e https://help.habbo.com/hc/en-us/articles/360011620599-What-can-I-buy-in-Habbo. ↩

  35. Sulake, Habbo Help Center, “Player to player trading in Habbo” (é preciso um passe de troca; “There is no guide to what items of furni are worth”), o corpo do artigo salvo em 5 de outubro de 2026 em habbo-articles.txt, https://help.habbo.com/hc/en-us/articles/4408726781842-Player-to-player-trading-in-Habbo. ↩↩

  36. 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.”), o corpo do artigo salvo em 5 de outubro de 2026 em habbo-articles.txt, https://help.habbo.com/hc/en-us/articles/360011513060-Guidelines-on-user-created-games-in-Habbo. ↩

  37. Sulake, API de busca do Habbo Help Center, conjuntos de resultados para “furni”, “stack” e “floor plan”, salvos em 5 de outubro de 2026 como habbo-search-furni, habbo-search-stack e habbo-search-floorplan (.html e .txt) na pasta de evidências dos cômodos; nenhum informa tamanho de grade, altura de empilhamento ou limite de mobis por quarto. ↩

  38. billsonnn, nitro-react/src/components/floorplan-editor/common/Constants.ts (MAX_NUM_TILE_PER_AXIS = 64, HEIGHT_SCHEME = 'x0123456789abcdefghijklmnopq', 27 passos de altura depois do x vazio), um cliente de Habbo de terceiros e de código aberto, como citado no post sobre estruturas em 3 de outubro de 2026, https://github.com/billsonnn/nitro-react/blob/main/src/components/floorplan-editor/common/Constants.ts. A faixa da ferramenta de altura de pilha (de 0 a 40 em passos de 0,01) vem das minhas notas anteriores, lida do mesmo cliente e não relida em 5 de outubro de 2026. ↩

  39. Blake Crosley, “Pixel-Art Structures: Houses, Halls and Interiors on iPhone”, blakecrosley.com, 3 de outubro de 2026 (os interiores “each 14 by 11, with a two-row wall band”; as builds 22, 23 e, no adendo da noite, 35; “Rooms have no wallpaper or floor choice and no placeable furniture; the house is dressed from the collection and nothing else”; os warps room:npc-…; a malha de objetos; a casa da fazenda do Stardew, “10×7” por dentro, nota 54; as constantes do Nitro, nota 62), https://blakecrosley.com/blog/pixel-art-structures-on-iphone. ↩↩↩↩↩↩↩↩

  40. Medição do autor, 5 de outubro de 2026: measure_sdv_catalogue.py na pasta de evidências dos cômodos, saída measure_sdv_catalogue.out: linhas de móveis contadas por seção pelo link com o nome de cada linha na página Furniture salva (rev. 193159), pulando a seção de pôsteres de filmes, cujas linhas usam outra marcação, e as seções References, History e Exploits; papéis de parede e pisos contados como ícones distintos nas páginas Wallpaper (rev. 193801) e Flooring (rev. 190285) salvas; linhas com o Catálogo de Móveis como fonte contadas pelo link dele. Contagens de linhas e ícones da wiki, não dos arquivos de dados do jogo. ↩↩↩↩

  41. Stardew Valley Wiki, “Wallpaper”, revisão 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”), baixado e salvo em 5 de outubro de 2026 como sdv-wallpaper.html e .txt, https://stardewvalleywiki.com/Wallpaper. ↩↩↩↩

  42. Stardew Valley Wiki, “Flooring”, revisão 190285, baixado e salvo em 5 de outubro de 2026 como sdv-flooring.html e .txt, https://stardewvalleywiki.com/Flooring. ↩

  43. Club Penguin Wiki (Fandom), “Igloo” (a história: 1º de novembro de 2005, iglus para jogadores sem assinatura, que “were unable to decorate them with furniture”; 26 de julho de 2012, a nova experiência de iglu e “a set of six items available without membership”), lido pela API MediaWiki e salvo em 5 de outubro de 2026 como cp-fandom-igloo.html e .txt, https://clubpenguin.fandom.com/wiki/Igloo. Os posts arquivados do blog oficial que ela cita retornaram HTTP 429 da Wayback Machine duas vezes em 5 de outubro de 2026. Fonte única. ↩↩

  44. Club Penguin Wiki (Fandom), “Igloo Contests” (o primeiro concurso na edição 9, 15 de dezembro de 2005, um vencedor com 5.000 moedas; vencedores “After one to four weeks”; personagens como jurados a partir do concurso de Halloween de 2008; o botão de inscrição a partir de 2009; o último concurso em dezembro de 2012; os dez vencedores com 25.000 moedas e os vinte finalistas com 15.000 do Ye Olde Igloo Contest de 2008), lido pela API MediaWiki e salvo em 5 de outubro de 2026 como cp-fandom-contests.html e .txt, https://clubpenguin.fandom.com/wiki/Igloo_Contests. Fonte única. ↩

  45. Tristan Donovan, “The Replay Interviews: Will Wright”, Game Developer, 23 de maio de 2011, baixado e salvo em 5 de outubro de 2026 como gd-replay-wright.html e .txt, https://www.gamedeveloper.com/business/the-replay-interviews-will-wright. Não foi encontrada nenhuma palestra gravada de Wright de 1999 ou 2000 sobre o modo construção. ↩↩

  46. The Sims Wiki (Fandom), “Buy mode” (“purchase items from an object catalog and place them on the current lot”; a ordenação por função em The Sims e The Sims 2; a frase da área ocupada verde e vermelha, associada na página a The Sims 2 e The Sims 3), lido pela API MediaWiki e salvo em 5 de outubro de 2026 como sims-fandom-buymode.html e .txt, https://sims.fandom.com/wiki/Buy_mode. Fonte única. ↩↩↩

  47. The Sims Wiki (Fandom), “Environment” (a necessidade Room e Environment, que “analyzes the design and content of the room that the Sim is currently standing in”), lido pela API MediaWiki e salvo em 5 de outubro de 2026 como sims-fandom-environment.html e .txt, https://sims.fandom.com/wiki/Environment. Fonte única. ↩

  48. Extração do autor, 5 de outubro de 2026: measure_apple_docs.py na pasta de evidências dos cômodos, saída measure_apple_docs.out: título, declaração, resumo e plataformas de cada página JSON da documentação da Apple salva. Os campos de obsolescência citados para dropDestination(for:action:isTargeted:) foram lidos do mesmo JSON salvo. ↩

  49. Apple Developer Documentation, Model() (macro do SwiftData; “Converts a Swift class into a stored model that’s managed by SwiftData”; iOS 17.0), JSON salvo em 5 de outubro de 2026 como apple-swiftdata-model.html e .txt, https://developer.apple.com/documentation/swiftdata/model(). ↩

  50. Apple Developer Documentation, Unique(_:) (macro do SwiftData; “Specifies the key-paths that SwiftData uses to enforce the uniqueness of model instances”; iOS 18.0), JSON salvo em 5 de outubro de 2026 como apple-swiftdata-unique.html e .txt, https://developer.apple.com/documentation/swiftdata/unique(_:). ↩

  51. Repositório do Kiradex, Kiradex/Models/CardCopy.swift (comentário de documentação: “every property has a default and nothing is unique, for CloudKit”), lido em 5 de outubro de 2026. ↩↩↩

  52. Repositório do Kiradex, Kiradex/Models/PriceHistory.swift (comentário de documentação: “Shaped for CloudKit like CollectionEntry: defaults everywhere, nothing unique”; PriceBook funde os históricos de dois aparelhos “into the one with the smallest uid”), lido em 5 de outubro de 2026. ↩↩↩↩

  53. Apple Developer Documentation, draggable(_:) (SwiftUI; “Activates this view as the source of a drag and drop operation”; um payload Transferable; iOS 16.0), JSON salvo em 5 de outubro de 2026 como apple-swiftui-draggable.html e .txt, https://developer.apple.com/documentation/swiftui/view/draggable(_:). ↩↩

  54. Apple Developer Documentation, dropDestination(for:action:isTargeted:) (SwiftUI; uma action do tipo ([T], CGPoint) -> Bool, cujo segundo parâmetro é “the drop location in this view’s coordinate space”; iOS 16.0; a entrada de plataformas para iOS lista deprecatedAt 27.2 com a mensagem “Use dropDestination(for:isEnabled:action:) with an action that takes a DropSession parameter instead.”; a referência a DropSession, “A description of a drop that is in progress”), JSON salvo em 5 de outubro de 2026 como apple-swiftui-dropdestination.html e .txt, https://developer.apple.com/documentation/swiftui/view/dropdestination(for:action:istargeted:). ↩↩↩↩↩

  55. Apple Developer Documentation, DragGesture (SwiftUI; “A dragging motion that invokes an action as the drag-event sequence changes”; iOS 13.0), JSON salvo em 5 de outubro de 2026 como apple-swiftui-draggesture.html e .txt, https://developer.apple.com/documentation/swiftui/draggesture. ↩↩

  56. Apple Developer Documentation, SpatialTapGesture (SwiftUI; “A gesture that recognizes one or more taps and reports their location”; iOS 16.0), JSON salvo em 5 de outubro de 2026 como apple-swiftui-spatialtap.html e .txt, https://developer.apple.com/documentation/swiftui/spatialtapgesture. ↩↩

  57. Apple Developer Documentation, accessibilityElement(children:) (SwiftUI; iOS 13.0), JSON salvo em 5 de outubro de 2026 como apple-swiftui-accessibilityelement.html e .txt, https://developer.apple.com/documentation/swiftui/view/accessibilityelement(children:). ↩↩

  58. Apple Developer Documentation, accessibilityAction(named:_:) (SwiftUI; “Actions allow assistive technologies, such as the VoiceOver, to interact with the view by invoking the action”; iOS 16.0), JSON salvo em 5 de outubro de 2026 como apple-swiftui-accessibilityaction-named.html e .txt, https://developer.apple.com/documentation/swiftui/view/accessibilityaction(named:_:). ↩↩↩↩

  59. Apple Developer Documentation, accessibilityAdjustableAction(_:) (SwiftUI; um handler que recebe um AccessibilityAdjustmentDirection; iOS 13.0), JSON salvo em 5 de outubro de 2026 como apple-swiftui-adjustable.html e .txt, https://developer.apple.com/documentation/swiftui/view/accessibilityadjustableaction(_:). ↩↩

  60. Apple Developer Documentation, accessibilityRotor(_:entries:) (SwiftUI; “Create an Accessibility Rotor with the specified user-visible label”; iOS 16.0), JSON salvo em 5 de outubro de 2026 como apple-swiftui-accessibilityrotor.html e .txt, https://developer.apple.com/documentation/swiftui/view/accessibilityrotor(_:entries:). ↩↩↩↩

  61. Apple Developer Documentation, AccessibilityNotification.Announcement (Accessibility; “A notification that an app posts when it needs to convey an announcement to an assistive app”; iOS 17.0), JSON salvo em 5 de outubro de 2026 como apple-swiftui-accessibilitynotification.html e .txt, https://developer.apple.com/documentation/accessibility/accessibilitynotification/announcement. ↩↩↩↩

  62. Apple Developer Documentation, performAccessibilityAudit(for:_:) (XCUIAutomation, XCUIApplication; iOS 17.0; o JSON lista o Xcode 16.3 e não tem resumo), JSON salvo em 5 de outubro de 2026 como apple-xctest-accessibilityaudit.html e .txt, https://developer.apple.com/documentation/xcuiautomation/xcuiapplication/performaccessibilityaudit(for:_:). ↩↩↩

  63. Apple, headers do framework XCUIAutomation no Xcode 27.0 (build 27A266a), plataforma iPhone Simulator, lidos em 5 de outubro 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”; ligar, desligar, mover para a frente, para trás, para dentro e para fora, e a fala atual; iOS 27.0); XCUIDevice.h (a propriedade voiceOverService, iOS 27.0). Uma busca em todos os headers do framework por ações personalizadas, rotores e anúncios não encontrou nada. ↩↩↩

  64. Repositório do Kiradex, scripts/forge/interiors.py (a docstring do módulo, incluindo “every piece at least two tiles on one axis”; os mapas de letras ROOM, ROOM_UP e HALL, as listas de móveis, os pontos e os warps; o comentário de host “where the owner stands when you visit”; PIECES, FACES, EXPORT_LETTERS, export() e check(), cujas verificações de pontos cobrem chegada, escada, anfitrião, prateleira, vitrine, escrivaninha e pedestal e não o painel de parede, e cujo loop de sobreposição lê data["objects"], as peças soltas exportadas), lido em 5 de outubro de 2026, nunca executado. ↩↩↩↩↩↩↩↩↩↩↩↩↩

  65. Repositório do Kiradex, docs/TestFlight.md, item 46 (“Build 26: the interior kit. Rooms sixteen wide with a three-row wall band (cornice, face, wainscot)”), lido em 5 de outubro de 2026. A build não tem data no arquivo; fica entre a build 23 e a 35, que o post sobre estruturas data ambas de 3 de outubro de 2026. ↩↩

  66. Cálculo do autor, 5 de outubro de 2026: merge_regression.py em figures/ da pasta do rascunho, saída merge_regression.out. Em room como a forja o cria (13 peças móveis, lidas de path_rule.json e de scripts/forge/interiors.py do repositório do Kiradex com ast), uma cama em (9,3) sozinha e um criado-mudo em (6,4) sozinho passam cada um nas regras de célula, no limite e na caminhada; os dois juntos isolam (7,3) e (8,3), as duas células na frente da vitrine. Um reparo que ordena os dois por uid e acrescenta cada um pela verificação completa fica com o uid menor e devolve o outro, com o mesmo resultado nas duas ordens de entrada e nas duas atribuições de uid. Que cada um dos 713 pares que isolam seja legal peça por peça decorre de measure_path_rule.out: nenhuma colocação individual longe dos alvos isola algum. ↩↩↩↩↩

  67. Repositório do Kiradex, docs/WORLD.md (seção 4: a loja de moedas com “clothes, hats, backpacks, card-display frames and emotes”, level = floor(sqrt(XP / 40)) + 1, cosméticos travados por nível “that cannot be bought”, os broches, entre eles Full Set, Vintage e Across the Sea; o colecionador como “a 30-pixel figure in a 32 × 40 cell”), lido em 5 de outubro de 2026; buscado por sixteen, cap, decoration, furnishing, Sunday, once a day e read-only, e nenhum deles enuncia uma regra de cômodo. ↩↩↩↩↩↩

  68. Repositório do Kiradex, server/app/rooms.py (docstring do módulo: “Everything here is in memory; a room empties when its last collector leaves and nothing of them is kept.”), lido em 5 de outubro de 2026. ↩↩↩↩

  69. Repositório do Kiradex, docs/research/pixel-art/06-collecting-and-hubs.md, seção 5.3 (“Rooms: a budget, a Sunday letter, and a like that never goes down”: o limite de 16, a carta de domingo como “a pixel object that appears on the doormat”, visitas somente leitura, uma curtida por visitante por dia, “a stamp on their passport per room visited, with ranks at 30 / 100 / 500”) e seção 5.7 (itens de apoiador incluem “one room skin” e são “never a bigger furnishing cap”), lido em 5 de outubro de 2026. ↩↩↩↩↩

  70. Repositório do Kiradex, Kiradex/World/Quests.swift (Quest.current(on:calendar:), com chave no intervalo weekOfYear do calendário, que começa no primeiro dia da semana do próprio calendário) e Kiradex/World/HallView.swift (o comentário “The week’s theme is the week’s quest”, e o tema lido como o título da missão semanal), lido em 5 de outubro de 2026. ↩↩↩

  71. Repositório do Kiradex, docs/PROTOTYPES.md (a pergunta aos testers do protótipo de missões semanais: “Weekly reset on your calendar’s week: say if it feels wrong.”), lido em 5 de outubro de 2026. ↩

  72. Cálculo do autor, 5 de outubro de 2026: layout_size.py em figures/ da pasta do rascunho, saída layout_size.out: a contagem de tipos, 21 da forja de hoje (17 tipos de piso e 4 itens de parede) e 3 novos na seção 7.5, 24 no total; o layout de casa guardado (dois andares, 16 peças cada com tipo, x, y e orientação, dois ids de estilo por andar) como JSON compacto com chaves nomeadas, com cada tipo definido como o nome proposto mais longo (pressed_flower, 14 caracteres) e cada id de estilo com 16 caracteres, 1.974 bytes; o mesmo com cada tipo preenchido até 16 caracteres, 2.038 bytes; quádruplas de inteiros puros para 32 peças, 385 bytes. ↩↩

  73. Repositório do Kiradex, Kiradex/World/PlazaStage.swift (@AppStorage("plaza.id"), “Who this device is to the plaza”; @AppStorage("quests.stamps"), os carimbos de missão como uma lista separada por vírgulas, também lida por QuestBoardView e MeView; @AppStorage("plaza.ribbons"), “Ribbons from the town’s collectors”), lido em 5 de outubro de 2026; uma busca no código Swift do app por uma contagem de passos guardada ou por um registro de cômodos visitados não encontrou nada, assim como uma busca no app e no servidor por um pedômetro, um tipo de contagem de passos ou um passaporte (os únicos steps são trajetos de caminhada em TileMap.swift e PlazaRig.swift). ↩↩↩↩↩

  74. Repositório do Kiradex, Kiradex/Models/Progression.swift (o comentário de documentação de Progression: experiência, nível e broches são “worked out from the collection as it is, so every device agrees without anything being stored”), lido em 5 de outubro de 2026. ↩↩

  75. Apple Developer Documentation, AppStorage (SwiftUI; “A property wrapper type that reflects a value from UserDefaults”; iOS 14.0), JSON salvo em 5 de outubro de 2026 como apple-swiftui-appstorage.html e .txt, https://developer.apple.com/documentation/swiftui/appstorage. ↩↩

  76. Cálculo do autor, 5 de outubro de 2026: skin_denominator.py em figures/ da pasta do rascunho, saída skin_denominator.out, a partir das linhas de rampa do briefing: um andar de 16 peças, com 15 delas e o estilo de piso numa mesma família de rampa e a parede fora dela, dá 16 de 18 (88,9%), 1.600 pontos na linha dos 70%; tirando a parede da proporção, dá 16 de 17 (94,1%), 4.800 pontos na linha dos 90%, 3.200 a mais. ↩

  77. Repositório do Kiradex, Kiradex/Models/Profile.swift (var lookData: Data = Data() no perfil sincronizado; var uid: String = "", definido como UUID().uuidString em init(handle:), como PriceHistory e CardCopy também têm um uid; ModelContext.profile(), linhas 224 a 237, busca os perfis ordenados por uid, mantém o primeiro e apaga o resto, e o comentário chama isso de fusão no menor uid), lido em 5 de outubro de 2026. ↩↩↩

Artigos relacionados

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

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

80 min de leitura

Pixel-Art Routes: Map Connections and Districts on iPhone

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

110 min de leitura

Prepare seu app para o iPhone Duo: um exemplo prático

Como preparar e enviar um app para o iPhone Duo: o carimbo do SDK que ativa o layout, um app real em cada pose, capturas…

55 min de leitura