← すべての記事

ピクセルアートの部屋:家具のグリッド、上限、採点

『ポケットモンスター エメラルド』で飾られた部屋とは、16ピクセルのセルでできたグリッドの上に置かれた16個の物のことです。逆コンパイルされたソースは、プレイヤーの秘密基地に置ける模様替えグッズを16個、寝室を12個に制限し、セーブデータには自分のものと他のプレイヤーのものを合わせて最大20の基地を保持します。12 カタログは8カテゴリ120個のグッズからなり、内訳はぬいぐるみ35、置物23、マット18、ポスター10、クッション10、机9、椅子9、植物6です。そのうち71個は1セルだけを占め、平均は2.43セル、18個は小さなグッズを載せる台になります。23 基地の歩けるセルは44から81、平均60.2なので、上限は床のおよそ4分の1にあたります。配置は、覆われる各セルが答える問いであり、配置関数のどこにも通路が残るかを確かめる処理はありません。24 本記事で取り上げる後続のゲームのうち3つが、このモデルをそれぞれ異なる予算で動かしています。Animal Crossing: New Horizonsでは1部屋150個(Nookipediaの説明による)で、日曜の手紙が部屋を採点します。Final Fantasy XIVではパッチ7.5以降、住宅の種類に応じて屋内150から600個。Club Penguinのイグルーでは99個(ファンの情報源1つによる)です。5678 私のアプリKiradexには部屋があり、アートのフォージが23種類の家具の語彙から家具を配置しますが、プレイヤーはそのどれも動かせません。本記事では原典を実測し、ルールを数字とともに示し、それをSwiftDataとSwiftUIに対応づけ、最後にKiradexがまだ作っていない家具配置システムのブリーフを示します。その中身は、1フロア16個の上限、エメラルドの配置関数にはない通路ルール、すべての得点源を列挙した週ごとのスコア、そしてプレイによってのみ解放されるカタログです。910

TL;DR

  • 16は構図の予算であって、保管の上限ではありません。 エメラルドは基地に16個、寝室に12個のグッズを置けますが、所持できるグッズはカテゴリ別の8つの枠に150個まであり、プレイヤーは置ける数より多く持てます。配置されたグッズ1個は2バイトで、IDと位置(xとyを4ビットずつ)からなり、基地のレイアウト全体が32バイトに収まります。111122
  • ルールは床に宿っています。 エメラルドには5つの配置許可(床、上を歩ける床、背後、壁、台の上)があります。机の天板のセルは小さなグッズを載せられる挙動を持つので、机を置けば、その上にぬいぐるみを置けます。小さなものを載せられるグッズは18個、大きなものを載せられるグッズは14個です。寝室に置けるのはぬいぐるみとクッションだけです。1324
  • 上限はプラットフォームとともに上がり、そのひとつはフレーム予算でもあります。 Nookipediaの説明によれば、Animal Crossingで1部屋に置けるアイテムはWild Worldで24、City Folkで64、New Leafで48、New Horizonsで150です。Final Fantasy XIVはパッチ7.5で屋内の上限を5割引き上げて150から600とし、ノートには、画面上の家具が400を超えると、別の階にある家具は描画されなくなると付記されています。57
  • スコアには列挙された得点源、決まった曜日、家とともに上がる基準があります。 Nookipediaのハッピーホームアカデミーの表は、1部屋のアイテムが6、10、15、20個に達するごとに1,000点を与え、さらにシリーズ、セット、カテゴリ、色、風水のボーナスを加え、家が大きくなるにつれてSランクの基準を15,000から90,000へ引き上げます。ページはこのNew Horizonsの数字に出典を示していません。6
  • カタログは購入、プレイ、またはその両方で増えます。 エメラルドでは120個のうち90個がお金で売られ、24個は一度も売られず(景品、バトルポイント、贈り物)、さらに2個は一歩ずつ集める6,000 ashと8,000 ash(ashは火山灰)で手に入ります。Stardewは日替わりのランダムな品揃えを売ります。最初の家の増築後は、Robinが家具カタログ(Furniture Catalogue)を200,000gで売るようになり、そのカタログは掲載された家具を0gで無制限に売りますが、博物館、お祭り、その他の入手先でしか手に入らない家具も残ります。Habboは家具を売り、その一部は意図的に希少またはランダムです。14151617
  • 訪問者は見るだけで、触れません。 Animal Crossingの訪問者は他のプレイヤーの家の家具を使えますが、「modify the interior in any way」(内装をいかなる形でも変更すること)はできません。Habboの訪問者は、オーナーの権限がなければ家具を置くことも動かすこともできません。Club Penguinでは、1つのデザインにつき1日1回いいねでき、その合計(Grand Total)は「will never decrease」(決して減らない)とされます。これはヘルプページのファンによる写し1つによるものです。51819
  • Kiradexにとっての成果。 出荷済みの機能ではなく、ブリーフです。その中身は、フォージの23種類のうち20種類をセル単位で配置すること。ドアから階段、ホスト、各展示グループの手前のセル1つまでの通路ルールを、歩いて確かめること。1フロア16個まで、最初の部屋は8個で出荷すること。フォージが描く壁紙6種類と床6種類。すべての得点源を印字した日曜の手紙(最高23,600点)。プレイで解放されるカタログで、現在利用できるレベルとピンから始め、同期されるコレクション、アプリがデバイス上に記録するクエストのスタンプ、そして歩数、部屋の訪問、手紙の家の等級という新たに同期される3つのカウンタから導くこと。サーバーがレイアウトを保存できるようになったら読み取り専用の訪問。CloudKit同期では一意制約を強制できないので、一意制約を持たないSwiftDataモデル。そして、VoiceOverで触れずに操作できるドラッグ配置です。9202122

1. エメラルド:グリッド上の16個、ソースから実測

このジャンルで最も小さな完成形は、『ポケットモンスター ルビー・サファイア』と『エメラルド』の模様替えシステムであり、そのほとんどはデータです。私はそれを、pretによるエメラルドの逆コンパイルのコミット731ad5b(2026年10月1日コミット)から、ソースを解析するだけでゲームを一度も実行しない2つのスクリプトで読み取りました。1つはカタログ、上限、台になるグッズ、部屋の広さを、もう1つは各グッズの入手先を調べるものです。出力はスクリプトの隣に保存してあります。214 本節の数字はすべて、この2つの出力か、脚注が挙げるソースファイルから取っています。

上限

3つの定数が上限を決めています。DECOR_MAX_SECRET_BASEは16、DECOR_MAX_PLAYERS_HOUSEは12、SECRET_BASES_COUNTは20で、最後のものはセーブデータが保持する基地の数、つまり自分の基地と他のプレイヤーから受け取った基地の合計です。12 置ける数の上限は、持てる数の上限とは別にあります。セーブデータはカテゴリ別の枠に150個の所持グッズを保持します。内訳は机10、椅子10、植物10、置物30、マット30、ポスター10、ぬいぐるみ40、クッション10です。112 つまりプレイヤーは部屋に収まるより多くを所持でき(新しいゲームはすべての枠が空の状態で始まります)、何を置くかを選ぶことこそがゲームなのです。23

配置されたグッズ1個は2バイトです。基地はdecorations[16]にIDを1つずつ、decorationPositions[16]に1バイトずつ保存し、上位4ビットがx、下位4ビットがyなので、基地は最大16×16セルのグリッドとして指定され、基地のレイアウト全体が32バイトに収まります。1112 私の読みでは、このサイズこそ、セーブデータが自分のものと他のプレイヤーのものを合わせて20の基地を保持できる理由です。

カタログ

gDecorations[]には121のエントリがあります。エントリ0のDECOR_NONEは小さな机のデータを流用した空きスロットなので、グッズはID 1から120の120個になります。32 カテゴリ別では、ぬいぐるみ35、置物23、マット18、ポスター10、クッション10、机9、椅子9、植物6です。2 セル単位の形では、1×1が71、1×2が22、3×3が13、2×1が5、2×2が4、3×2が3、2×4と4×2が1つずつです。ヘッダーは3×1と1×3も宣言していますが、これを使うグッズはありません。グッズ1個が覆うのは1から9セルで、平均2.43セルです。213 構造編の記事のための以前のメモのように空きスロットをグッズとして数えると、1セルのものは72、固い床のものは19になります。空きスロットを除けば71と18です。2

エメラルドの120個のグッズをカテゴリ別に示した横向きの積み上げ棒グラフ。各棒は、グッズが覆う16ピクセルのセルの数で分かれています。ぬいぐるみ35(1セル25、2セル10)、置物23(1セル9、2セル9、4から6セル1、8または9セル4)、マット18(1セル11、8または9セル7)、ポスター10(5と5)、クッション10(すべて1セル)、机9(1セル2、4から6セル3、8または9セル4)、椅子9(すべて1セル)、植物6(2セル3、4から6セル3)。

エメラルドのカタログの大半は1セルです。大きなグッズは机、3×3のマット、そしていくつかの置物です。243

表の価格は、最も安いマットの500から、最も高い置物とぬいぐるみの10,000までです。価格が0のものが3つあり、盾2つとガラスの置物1つで、3つとも景品です。23

5つの許可と、データである台

各グッズは5つの許可のうち1つを持ちます。ヘッダーはそれらを「collision and placement permissions, in that order」(衝突と配置の許可を、この順で)と呼んでいます。13 数は次のとおりです。

許可 意味 グッズ
固い床 歩行をふさぎ、床に立つ 18:机9個すべて、置物9
通れる床 上を歩け、床に立つ 37:マット18個すべて、椅子9個すべて、置物10
背後の床 ふさぎ、最上段は奥の壁にかかってよい 10:植物6個すべて、置物4
壁 奥の壁に掛ける 10:ポスター10個すべて
スプライト 台の上に立つ人形 45:ぬいぐるみ35個すべて、クッション10個すべて

src/data/decoration/header.hに対するmeasure_emerald_decor.pyの集計。2

最も巧みなのは、台がコードではなくセルの性質になっている点です。各グッズはメタタイルから描かれ、各メタタイルは挙動を表す1バイトを持っています。18個のグッズがMB_HOLDS_SMALL_DECORATIONという挙動のセルを持ちます。机9個のうち7個、レンガ3個、タイヤ1個、マット7個です。14個がMB_HOLDS_LARGE_DECORATIONを持ち、これは同じ机7個とマット7個です。2 1×2のぬいぐるみはその下に「大」のセルを必要とし、それ以外のぬいぐるみやクッションは「小」か「大」のどちらのセルにも置けます。4 つまり机を置くと、床にはぬいぐるみに対して「はい」と答える新しいセルが加わり、同じ配置関数が両方を扱います。16個で部屋がいっぱいに見えるのはこのためです。120個のうち45個のスプライトが、18個の台の上に立つのです。2

動くグッズもあります。8枚の音符マットは踏むと音を鳴らし、ジャンプマット、回転マット、きらきらマットはその名のとおりの動きをします。風船3つと泥のボールは割れます。壊せるドア、すべり台、砂の置物もあります。それぞれがグッズのメタタイルの挙動(MB_SECRET_BASE_SOUND_MAT、_JUMP_MAT、_SPIN_MAT、_GLITTER_MAT、_BALLOON、_BREAKABLE_DOOR、MB_SLIDE_SOUTH、_SAND_ORNAMENT)で、秘密基地のタイルセットの属性ファイルから読み取ったものです。225

配置は、各セルが答える問い

src/decoration.cのCanPlaceDecorationは、手に持ったグッズが覆うことになるセルを順にたどり、それぞれに問いを投げます。床と通れる床のグッズは、覆うすべてのセルの下に普通の床(MB_NORMAL)を必要とし、穴を覆えるのは固い板だけです。セルの上にオブジェクトが立っていてはいけません。メニューを開いたときにプレイヤーが立っていたセルをグッズが覆えるのは、通常のレイヤー種別のタイルの場合だけです。そのセルにかかるグッズ自身のタイルのレイヤー種別がそれ以外なら、関数はそこへの配置を拒否します。背後の床のグッズは最上段を除くすべての下に床を必要とし、最上段は北の壁にかかってかまいません。壁のグッズはすべてのセルが北の壁でなければなりません。スプライトは下に台のセルを必要とします。4 寝室では、メニューがぬいぐるみとクッション以外のすべてのカテゴリを拒否します。isPlayerRoomが立っているとき、DecorationItemsMenuAction_AttemptPlaceがgText_CantPlaceInRoomを表示するのです。4

CanPlaceDecorationには、通路が残るかを確かめる処理がどこにもありません。この関数が歩行に与える保護は、立っていたセルについてのあの条件付きのルールだけです。この関数についての私の読みでは、プレイヤーは基地のパソコンを机で囲って行けなくすることができ、ゲームはそれを許します。4 この点にはブリーフで立ち返ります。ほかの人が訪れる部屋には、この関数がしていないチェックが必要だからです。

上限の基準となる部屋

基地のレイアウト24種類は、6つのスタイルに4つのサイズずつです。各map.binから壁を含めて測ると、幅7から17セル、奥行き7から17セルで、99セル(11×9)から196セル(14×14)まであり、細長いものは7×16、10×17、17×8です。226 各レイアウトの衝突ビットから読み取った歩けるセルは44から81、平均60.2です。2 上限の16は、平均的な基地の歩ける床の0.27にあたります。2 寝室は2軒のプレイヤーの家の2階で、9×8、歩けるセルは54、上限は12です。21

床だけで見ると混み具合を大きく見積もりすぎます。16個の多くは上を歩けるマットや、机の上に立つぬいぐるみだからです。上限が予算として配分しているのは床ではなく、構図です。

キャラクターに対するセル

プレイヤーの歩行シートは144×32ピクセルで、16×32のコマが9枚です。つまりキャラクターのコマは、16ピクセルのメタタイルのグリッドで幅1セル、高さ2セルです。模様替え中のポーズは16×32のコマ1枚です。27 グリッドのセルはコマの幅であり、すべてのグッズはこの単位で寸法が決まっています。

カタログの増え方

入手先を調べるスクリプトは、ショップ、景品、贈り物のスクリプトからすべてのグッズ定数を検索しました。120個のうち90個は5つのショップでお金で売られています。3個は景品交換所の交換品、15個はバトルポイントとの交換品、10個はスクリプトで贈られます。贈られるのは、先の景品交換所の3個、からくり屋敷を攻略して得るテント2つ、博物館の上の階で得る置物1つ、バトル施設の主から得る盾2つ、住人から得るぬいぐるみ2つです。24個は手に入れるもので、お金では一度も売られません。14

さらに2個は歩くことで買います。ガラス工房は椅子を6,000 ash、机を8,000 ashと交換し、ashはプレイヤーが袋を持って灰に覆われた草むらを歩くと1歩ごとに1単位ずつ、9,999まで集まります(VAR_ASH_GATHER_COUNT)。15 私はこの2個を、原典のなかで最も純粋な「プレイによる解放」と読みます。お金は動かず、動くのは歩数だけです。袋は数を表示しません。そのフィールドでの使用処理は使えない道具のための関数で、説明文は火山灰を集めてためることについての固定の文章です。28 歩数のカウンタそのものを除けば、この数を読むのは工房のスクリプトだけです。プレイヤーの灰が足りないとき、スクリプトは集めた灰を価格から差し引き、その差を、あと何歩歩けばよいかという歩数として伝えます。15

4個のグッズ(伝説のぬいぐるみ3つと、ほかのぬいぐるみ1つ)は、検索の対象にしたどのショップ、景品、贈り物のスクリプトからも参照されていません。交換やリンク機能で届くのかもしれませんが、私は追跡していません。売られる90個と、手に入れるだけの24個という数は、ショップ、景品、贈り物のスクリプトの検索に基づくもので、この4個は未追跡のままです。14

エメラルドが教えてくれること

模様替えシステムは、3つの表と1つの関数です。グッズごとのカタログの行(許可、形、カテゴリ、価格、メタタイル)、セルがそれぞれ何であるか(床、北の壁、穴)を示すレイアウト、配置の上限より大きい所持品、そして覆われる各セルに1つの問いを投げる配置チェック。台とは、より小さなグッズに「はい」と答えるセルのことです。上限が数えるのは置かれたグッズだけです。抜けているのは歩行です。配置関数はセルを確かめても、通路は一度も確かめません。

2. Animal Crossing:150個のアイテムと日曜の手紙

本節はファンwikiのNookipediaに基づいており、2026年10月5日に閲覧して保存しました。任天堂自身の数字は探していません。wikiが何も出典を示していない箇所は、そう明記します。56

上限と部屋

シリーズのどのゲームも部屋に置けるアイテムに上限を設けており、その上限は大きくなってきました。Nookipediaによれば、1部屋の「furniture and clothing items」(家具と服のアイテム)はWild Worldで24、City Folkで64、New Leafで48です。New Horizonsについてはこうあります。「A maximum of 150 items can be placed in each room of the house, including wall and ceiling-mounted furniture.」(家の各部屋に置けるアイテムは、壁掛けや天井の家具を含めて最大150個)5

同じページの増築表によれば、New Horizonsの部屋はテントが4×4、家が6×6、メインの部屋を広げると8×8、奥と左右の部屋はそれぞれ6×6、2階と地下は10×6です。「Unlike previous games, only the main room can be expanded in size, as all other rooms have a fixed size.」(これまでの作品と違い、広げられるのはメインの部屋だけで、ほかの部屋はすべて広さが固定されている)5 6×6の部屋に150個なら床1タイルあたり4.2個になりますが、これが成り立つのは、壁、天井、ほかの家具の上が床を使わずにアイテムを受け入れるからです(2つの数字からの私の計算です)。529

家具には「a size in tiles that it takes up when placed, ranging from 1.0×0.5」(置いたときに占めるタイル単位の大きさがあり、1.0×0.5から)3×3まであり、New Horizonsでは「can also now be pushed in half-tile increments」(半タイル刻みで押せるようにもなった)とされています。29 New Horizonsは家具を、ハウスウェア、床や台の上に置く雑貨、壁掛け、そしてバージョン2.0で加わった天井の装飾に分類しています。29 本記事で配置グリッドを読んだゲーム(エメラルドのセル、Stardewのタイル、New Horizonsのタイル)のうち、家具を1タイル未満の単位で動かせるのはNew Horizonsだけです。FFXIVの配置グリッドは読んでいません。またHabboについて引かれる細かい刻みは、サードパーティのクライアントの積み重ねの高さです(第3節)。

カタログ

Nookipediaは、バージョン3.0.2の時点でNew Horizonsの家具を2,076点と数えており、そのうち1,074点はアップデートで追加されたものです。シリーズとは「around 10 furniture items, as well as a matching wallpaper and flooring」(約10点の家具と、それに合う壁紙と床)です。29 wikiはバージョン1.9.0の時点で壁紙を262点、床を215点と数えています。3031 壁紙と床は部屋ごとに変えられ、バージョン2.0ではアクセントウォールが加わりました。「a second wall covering can be applied to single wall in the room」(部屋の1面の壁に2つ目の壁紙を貼れる)というものです。5

ハッピーホームアカデミー

Kiradexが借りるのは採点の側です。Nookipediaによれば、アカデミーは「sends an evaluation by mail most Sunday mornings, which cannot be disabled」(ほとんどの日曜の朝に評価を郵送し、それを止めることはできない)とあります。ランクはB、A、Sで、Sの基準は増築のたびに上がります。最初の家で15,000、メインの部屋の増築後に23,000、続いて35,000、47,000、60,000、75,000、そして地下で90,000です。6

wikiがまとめたNew Horizonsのボーナスは次のとおりです。

基準 得点
1部屋の家具が6、10、15、20点 各しきい値で1,000
ラッキーアイテム 1点につき777
壁掛けの家具 1点につき400、最大3点
1つのシリーズから4点以上 1点につき1,000
家具のセットがそろう 1点につき800
1つのカテゴリから3点以上 1点につき500
部屋のアイテムの70%以上が1色 1点につき200
90%以上が1色 1点につき600
赤、緑、黄の風水 500
ゴキブリ 1匹につきマイナス2,500
床に置かれた家具以外のアイテム 1点につきマイナス1
床のゴミ 1点につきマイナス500
壁を向いた向きのあるアイテム 1点につきマイナス300

Nookipedia「Happy Home Academy」のNew Horizonsの表、2026年10月5日保存。ページ上に出典なし。6

これらの数字は本節で最も不確かなものです。ボーナスと減点の表には出典がありません。その下の報酬の表には「Includes data sourced from the Data Spreadsheet for Animal Crossing New Horizons」(Animal Crossing New Horizonsのデータスプレッドシートから得たデータを含む)とあり、名前の挙がった協力者がまとめたものです。New Horizonsのアイテムごとの得点の節は「This section is a stub」(この節は書きかけです)となっています。6 つまりこの計算はファンによる再構成です。最後のブリーフは、その形(列挙された得点源、数のしきい値、セットと色のボーナス、決まった曜日)を借りますが、数字は1つも借りません。

週ごとに部屋を採点したいアプリにとって、ここには重要な選択が2つあります。基準が家とともに上がるので、部屋が大きくなっても最高ランクが簡単になるわけではありません。そして手紙は決まった曜日、ほとんどの日曜の朝に届き、プレイヤーはそれを止められません。6 そこでは不在にも代償があります。家のページによれば、家を「for at least one week」(少なくとも1週間)放っておいたプレイヤーの家にはゴキブリがわき、上の表は1匹につき2,500点を差し引きます。56 ブリーフは決まった曜日を残し、罰を捨てます。

訪問

wikiの説明によれば、シリーズのどのゲームでも「a player may enter any other player’s house freely」(プレイヤーは他のプレイヤーの家に自由に入れる)とされています。家具は使えますが、アイテムを置いたり拾ったりすることも、「or modify the interior in any way」(内装をいかなる形でも変更すること)もできません。5 別の島への夢見の訪問(dream visit)は、同じ結果に別の道筋でたどり着きます。夢を取り仕切るキャラクターのwikiページでは、New Leafの節に、夢のなかでは「any changes will not be saved and items cannot be brought back to the real world」(どんな変更も保存されず、アイテムを現実の世界に持ち帰ることもできない)とあり、New Horizonsの節には、彼女のサービスは「work the same as they do in New Leaf」(New Leafと同じように機能する)とあります。夢をアップロードしたホストは5,000ベル相当の「Dream Bell Exchange Ticket」(夢のベル引換券)を受け取り、更新のたびにもう1枚受け取ります。32 私の読みでは、これは本記事のなかで子ども向けアプリにとって最も安全な訪問の形です。訪問者は複製のなかを歩き、保存されるものは何も変えられず、ホストは共有することで報われます。

3. Habbo、Stardew、Final Fantasy XIV、Club Penguin、そしてモデルの起源

Habbo:部屋が製品であり、製品は売られる

Habbo自身のヘルプセンターは、所有と訪問者のルールをはっきり述べています。「You can own 200 rooms.」(部屋は200まで所有できる)33 床と壁は一度貼ると戻せません。「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.」(壁紙と床は貼り付けられるので、一度置いたら拾い直せない。部屋の見た目を変えたいときは新しい壁紙や床を置けばよい)33 訪問者は触れられません。「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.」(グループのメンバーで、そのグループのオーナーが部屋づくりへの参加を許可していない限り、他のHabboの部屋で家具を置いたり操作したりはできない)18

家具の経済は購入が主導しています。「To buy furni you need credits, diamonds or duckets.」(家具を買うにはクレジット、ダイヤモンド、ダケッツが必要)18 Builders Clubは家具を上限まで貸し出し、その上限は会員である1か月ごとに250ずつ上がります。フロアプランエディタでの独自の部屋レイアウトの保存も含まれ、「Furni limits never go down.」(家具の上限は決して下がらない)と約束しています。34 家具の定義のページは、キャンペーン家具を「for 4-12 months in order to leave an ample window for traders to build their businesses around them」(トレーダーがそれを軸に商売を組み立てられるよう、4から12か月)出し控えること、「will never be re-released」(二度と再販されない)レア、買ってから割ると「to reveal another, random rare furni」(別のランダムなレア家具が現れる)割れるレア、そして「a special type of rare, which comes in limited quantities」(数量限定の特別な種類のレア)であるLTDを説明しています。17 取引には取引パスが必要で、「There is no guide to what items of furni are worth」(どの家具にどれだけの価値があるかの手引きはない)とされます。35 Habboは部屋のなかの偶然さえ制限しています。「Placing more than three chance elements will disable all randomiser functions in the room.」(偶然の要素を4つ以上置くと、部屋のランダム機能がすべて無効になる)36

Habbo自身のページは、グリッドも、積み重ねの高さも、1部屋あたりの家具の上限も示していません。ヘルプセンターで「furni」「stack」「floor plan」を検索しても、それを示す記事は返ってきませんでした。37 よく引かれる数字は、オープンソースのサードパーティのクライアントであるNitroのものです。そのフロアプランエディタの定数は、1軸あたり最大64タイルと27段階の高さの体系を許しており、これはこのシリーズの構造編の記事が同じファイルから引いたものです。私の以前のメモは、同じクライアントから、0から40まで0.01刻みの積み重ねの高さのツールを付け加えていますが、これは本記事のために読み直していません。3839 この3つはどれもSulakeのものではなく、クライアントのものとして扱ってください。

私の読みでは、Habboは、カタログがビジネスになったときに家具配置のループがどうなるかを示しています。訪問者のルールは真似すべきもので、経済(意図的な希少性、ランダムな中身、取引価値)は拒むべきものです。

Stardew Valley:一度買うカタログと、その後は無料の家具

Stardew Valley Wikiの家具(Furniture)のページ、リビジョン193159は、26のセクションにわたって718行のアイテムを挙げており、異なる名前は615です。これはページの行を私が数えたものです。映画ポスターのセクションは別のマークアップを使っているので飛ばし、「異なる」は2つのセクションに載ったアイテムを1つにまとめた数です。4016 壁紙のページ(リビジョン193801)は137の壁紙(カタログ内123、カタログ外12、入手不可2)を、床のページ(リビジョン190285)は97の床を示しています。どちらもゲームのデータファイルではなく、ページのアイコンから数えたものです。404142

カタログは2つの道で同時に増えます。Robinと行商人のカート(Traveling Cart)はどちらも「offer a random selection of furniture each day they are open」(営業日ごとにランダムに選んだ家具を売る)とされています。「After the first Farmhouse upgrade, Robin also offers the Furniture Catalogue for sale」(最初の家の増築後、Robinは家具カタログも売るようになる)とあり、ページのカタログの表では200,000gです。置いたカタログは、掲載している家具を0gで「in unlimited quantity」(無制限に)売ります。家具のページのうち278行が、入手先として家具カタログを挙げています。1640 ページが挙げる例外は例外のまま残ります。「Some furniture can be obtained only by donating items to the Museum」(博物館にアイテムを寄贈することでしか手に入らない家具もある)とあり、ほかにもお祭り、カジノ、その他の入手先があります。16 つまり、プレイの節目と、ゲーム内通貨での大きな買い物1回で、カタログに載っているものの希少性は終わります。終わるのはそれについてだけです。

配置のフィードバックはタイル単位です。「Furniture will display a green square on tiles where it can be placed. The tile will turn red if the furniture cannot be placed.」(家具は置けるタイルに緑の四角を表示し、置けない場合はタイルが赤くなる)16 壁紙は1つの面に1つの操作です。壁紙は「cover the whole room they’re placed in」(置いた部屋全体を覆う)もので、貼るには「the character must be facing up by its wall」(キャラクターが壁のそばで上を向いていなければならない)とされ、「single-use and do not stack」(使い切りで、スタックしない)です。41 増築前の農家の家は内側で10×7、16ピクセルのタイルで、これは構造編の記事がwikiから引いたものです。39

Final Fantasy XIV:フレーム予算でもある上限

Square EnixのLodestoneに掲載されたパッチ7.5のノートは、すべてのハウジングの上限を引き上げました。屋内の家具は、アパルトメントと個室で100から150、コテージで200から300、ハウスで300から450、マンションで400から600に、屋外の家具は20から40、30から60、40から80になりました。7 同じノートは、その理由を自らの言葉で述べています。「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.」(画面に同時に表示できる家具は400までです。400を超える家具が同時に画面に入ると、キャラクターと別の階にある家具は表示されなくなり、小さく遠いものから先に隠されます)7 上限は、デザインの予算であると同時にレンダリングの予算でもあるのです。

ノートには「Furnishings from the FFXIV Furnishing Design Contest」(FFXIV家具デザインコンテストの家具)の追加もあります。コミュニティのコンテストで、受賞したデザインがこのパッチで家具になりました。7 これはコンテストの安全な形です。プレイヤーが作り、スタジオが審査して出荷するのです。

区画の広さは本記事にはありません。Square Enixのハウジングガイドは2026年10月5日にHTTP 404を返し、ほかの公式ページは試していないので、FFXIVが本記事に提供するのはLodestoneのノートにある家具の上限だけです。7

Club Penguin:1日1回のいいねと、決して減らない合計

ここでのClub Penguinの事実はすべて単一の情報源によるものです。Club Penguin Wikiが引用している公式ブログのアーカイブ記事は、2026年10月5日にWayback MachineからHTTP 429を2回返したため、確認できませんでした。43

That Penguin Gameは、ゲームのヘルプページだとして紹介するものを再現しています。私はその出所を確認していません。その「Your Igloo」のページにはこうあります。「You can Like any igloo design once every day!」(どのイグルーのデザインにも1日1回いいねできる)各デザインは「earns its own individual Likes」(それぞれ個別のいいねを獲得し)、それが合計(Grand Total)に積み上がり、「Likes are permanent, so your Grand Total Likes will never decrease, even if you delete an igloo design!」(いいねは永続するので、イグルーのデザインを削除してもGrand Total Likesは決して減らない)とされます。Popularのタブはイグルーをいいねの合計で順位づけし、イグルーは「Everyone」(全員)か「Friends」(友だちだけ)に公開されます。19

Club Penguin Wikiによれば、「igloos have a limit preventing more than 99 units of furniture being placed at once」(イグルーには、一度に99個を超える家具を置けないようにする上限がある)とされ、ほとんどの家具には種類ごとに99個の所持上限があり、オーナーは自分のイグルーを飾れても「but not other player’s igloos」(他のプレイヤーのイグルーは飾れない)とあります。8 飾り付けは会員特典でした。2005年11月1日からは、会員でないプレイヤーもイグルーを持てましたが家具は置けず、2012年7月26日からは、床のアイテム1つ、通常のアイテム4つ、壁のアイテム1つの計6つの無料家具が与えられました。438

Wikiによるイグルーコンテストの歴史はこうです。最初のコンテストはゲーム内新聞の第9号(2005年12月15日発行)で告知され、優勝者1人に5,000コインが贈られました。その後のコンテストは募集から1から4週間後に優勝者と次点を発表し、賞品はいつもコインで、家具が付くこともありました。2008年のハロウィンのコンテストからはキャラクターが優勝者を選び、そのコメントがイグルーと一緒に掲載されました。2009年からはイグルーのボタンで応募できるようになり、最後のコンテストは2012年12月に開かれました。一例を挙げると、2008年のYe Olde Igloo Contestは優勝者10人にそれぞれ25,000コイン、次点20人に15,000コインを贈っています。44

The Sims:住人は家を採点するためにいた

グリッドとカタログのモデルには起源の物語があり、それは採点の物語です。私の情報源は1本のインタビューだけで、Game Developerが2011年5月23日に掲載した、Tristan DonovanによるWill Wrightへのインタビューです。ビルドモードについてWrightが1999年か2000年に語った記録は見つかりませんでした。45

着想について。「one of the original things that was a really inspiration for The Sims was this book, A Pattern Language, by Christopher Alexander.」(The Simsのそもそもの大きな着想源のひとつは、Christopher Alexanderの『A Pattern Language』という本だった)採点について。「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.」(ある意味で、The Simsはもともと、こうしたパターンを分析する建築のゲームにしたかった。だから当初、The Simsの住人は建築を採点するためだけにいた)名前について。「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.」(最初の名前はDoll Houseだった。テストマーケティングをしたら、その名前は男性受けがよくないとわかった)オブジェクトについて。「Everything we put in the world is advertising」(世界に置くものはすべて広告を出している)とあり、彼はこのモデルをSimAntのフェロモンの道にさかのぼらせています。45

ファンwikiで単一の情報源であるThe Sims Wikiは、出荷された画面を説明しています。購入モードではプレイヤーが「purchase items from an object catalog and place them on the current lot」(オブジェクトのカタログからアイテムを買い、現在の区画に置ける)とされ、The SimsとThe Sims 2はそのカタログを物の機能で分類していました。また、手に持ったオブジェクトの足元のタイルは、置ける場所では緑、置けない場所では赤く表示されます。wikiはこの緑と赤の一文をThe Sims 2とThe Sims 3に結びつけているので、私はそれを2000年のオリジナルについては主張しません。46 採点はSimの欲求としてSimの内側に残りました。最初の作品ではRoom、2作目ではEnvironmentで、これは「analyzes the design and content of the room that the Sim is currently standing in」(Simがいま立っている部屋のデザインと中身を分析する)ものです。狭い部屋、足りない明かり、汚れたものや壊れたものがこれを下げます。47

私の読みでは、本記事のどのゲームも、予算の違う同じ1つの画面です。カタログ、人の一歩の大きさのグリッド、緑か赤に変わる足元、そして審査員です。

上限を並べると

「配置アイテムの上限」と題した横棒グラフ。各棒には上限が何を数えるかのラベルがあり、情報源ごとに色分けされています。Final Fantasy XIVの住宅の種類ごとの屋内配置上限(LodestoneのPatch 7.5ノートより。マンション600、以前は400。ハウス450、以前は300。コテージ300、以前は200。アパルトメントまたは個室150、以前は100)。Animal Crossingの1部屋あたり(Nookipediaより。New Horizons 150、City Folk 64、New Leaf 48、Wild World 24)。Club Penguinの1イグルーあたり99(ファンwiki1つより)。エメラルド(逆コンパイルされたソースより。基地1つ16、寝室12)。そしてKiradexが提案する1フロア16。

上限はエメラルドの寝室からFFXIVのマンションまで50対1の幅がありますが、数えているものは同じではありません。FFXIVのものは住宅の種類ごとに示された屋内配置上限、Animal Crossingは1部屋ごと、Club Penguinは1イグルーごと、エメラルドは基地または寝室ごと、Kiradexは1フロアごとです。発行元自身の文章やコードから得た数字は、FFXIVとエメラルドのものだけです。247581

4. 技法を、数字つきのルールとして

以下は、測定結果が裏づけるルールを、それぞれの根拠となる範囲とともに示したものです。数字が私の計算や私の選択である場合は、その行にそう記しています。「セル」は16ピクセルの歩行セルを指し、これはKiradexのタイルでもあります。227

要素 ルール 出典
配置の上限 部屋に見せる数を部屋ごとに制限し、壁のアイテムも数える。 エメラルドは基地16、寝室12。New Horizonsは1部屋150で「including wall and ceiling-mounted furniture」(壁掛けと天井の家具を含む)。FFXIVは家の広さに応じて屋内150から600。Club Penguinは99(ファンの情報源1つ)
所持の上限 収まる数より多く所持させ、置くことが選ぶことになるようにする。 エメラルドは8つの枠に150個所持、配置は16。Club Penguinは種類ごとに99個所持(ファンの情報源)
床に対する上限 壁や天井のレイヤーがない2Dの部屋では、床3セルにつき1個未満にとどめる(私のしきい値で、エメラルドがそのすぐ下に来るよう選んだもの)。台と上を歩けるグッズがこれを広げる。 エメラルドは歩けるセルの平均60.2に対して16で0.27。New Horizonsは6×6の部屋に150で1タイルあたり4.2、壁、天井、台への配置があって初めて可能(私の計算)
台 小さなグッズを載せられることをセルの性質にし、机がぬいぐるみのための床を増やすようにする。 エメラルド:小さなものを載せるグッズ18、大きなものを載せるグッズ14、それを必要とするスプライトのグッズ45
グリッドのセル グリッドをキャラクターのコマまたはセルの幅に合わせる。それより細かくするのは、グッズを少しずつ動かせて、アートがそれを許す場合だけ。 エメラルドのプレイヤーのコマは16ピクセルのセルで1×2。Stardewは16ピクセルのタイル。New Horizonsは半タイル
配置チェック 覆われる各セルに1つの問い(床、壁、台か。空いているか。到着セルやホストのセルではないか)を投げ、答えをセルごとに示す。 セルごとの問いはエメラルドのCanPlaceDecoration。ただしプレイヤーの開始セルを拒否するのは、レイヤー種別が通常でないタイルの場合だけ。到着セルとホストのセルはKiradexのルール(7.1)。Stardewはタイルごとの緑か赤の四角。The Sims 2と3は緑か赤の足元(ファンwiki)
通路 配置のたびに歩行が残ることを確かめる(ブリーフによる追加)。 エメラルドのCanPlaceDecorationは通路を確かめず、プレイヤーが立っていたセルを空けておくのも、レイヤー種別が通常でないタイルに対してだけ。ここで読んだStardewとSimsのページはタイルごとのフィードバックを説明しており、通路についてはどちらとも述べていない。ブリーフが歩行を加える
壁紙と床 部屋ごとに1つ、1つの操作で変えられ、元に戻せる。 Stardewは壁から「the whole room」(部屋全体)を覆う。New Horizonsは部屋ごと、加えてアクセントウォール1面。Habboは永続的で、置き換えのみ
カタログの大きさ スタイルが選択になるだけの大きさ。 Stardewは壁紙137、床97(wikiのアイコンを私が数えたもの)。New Horizonsは262と215。New Horizonsの家具は3.0.2時点で2,076
スコア 得点源を列挙し、曜日を固定し、家とともに基準を上げ、不在を罰しない。 ハッピーホームアカデミー:ほとんどの日曜。B、A、S。Sは15,000から90,000。6、10、15、20個で1,000。シリーズ、セット、カテゴリ、色(ファンの表、出典なし)。ゲームを特定していないwikiの家のページは、少なくとも1週間放置した家にゴキブリがわくとし、New HorizonsのHHAの表はゴキブリ1匹につき2,500を差し引く。このルールはその罰を拒む
カタログの増え方 9+のアプリでは、プレイで増やす。手に入れる棚と、節目で開くカタログ。ランダムな販売や希少な販売では決して増やさない。 エメラルドは120個のうち90個を販売、24個は非売、さらに2個は6,000 ashと8,000 ash。Stardewは日替わりのランダムな品揃え、最初の増築後は200,000gのカタログで掲載家具が0g、博物館やお祭りなどの限定品はその外。反例としてHabboのレア、割れるレア、LTD
訪問 訪問者は見るだけで触れない。訪問者1人につき1日1つのしるし。ホストの合計は決して下がらない。 Animal Crossingの訪問者は「modify the interior in any way」(内装をいかなる形でも変更すること)ができない。Habboの訪問者は権限なしに家具を置くことも動かすこともできない。Club Penguinはデザインごとに1日1回のいいね、合計は決して減らない(ファンの情報源1つ)
保存 配置されたアイテムは数バイト:種類、セル、向き。 エメラルド:IDに1バイト、位置に1バイト、基地1つで32バイト

出典:第1節から第3節とその脚注。256781916414033181746141511

このうち3つには、ひと言ずつ添える価値があります。

上限は目のための予算であり、ときにGPUのための予算でもあります。 エメラルドの16は基地の床のおよそ4分の1です。FFXIVは、画面上の家具が400を超えると一部を描かなくなると明言しています。27 スマートフォンのアプリにとって2つ目の理由は現実のものですが、私の読みでは、数を決めるのは1つ目の理由です。上限こそが棚を構図に変えるのであり、これは10月3日の世界編の記事が16を選んだ理由として挙げたものです。10

通路ルールはブリーフによる追加です。 エメラルドのCanPlaceDecorationが守るのはせいぜい1セル、メニューを開くときに立っていたセルだけで、ドアからまだパソコンにたどり着けるかは一度も問いません。4 私が読んだStardewとSimsのページは、タイルごとに色分けされる足元を説明していますが、どちらのゲームが通路も確かめているかどうかは述べておらず、私もそれ以上は調べていないので、本記事はどちらについても何も主張しません。1646 ほかの人が訪れる部屋では、この問いに答えが必要です。展示にたどり着けない訪問者には、見るものが何もないからです。

プレイによる解放は、子ども向けアプリのカタログの問題に対して擁護できる結論です。 これは私の読みであって、法的助言ではありません。購入、ランダム、希少性による飾り付けのループは、収集アプリには不要なルートボックスや課金圧力の問題を抱え込みます。エメラルドの手に入れる棚は、そのどれも必要としない部屋のループを示しており、Stardewのカタログは、プレイの節目のあとにゲーム内通貨で一度だけ買うもので、掲載されているすべてについて希少性を終わらせる方法を示しています。141617

5. Appleのやり方:同期するモデル、吸着するドラッグ、VoiceOverで使えるグリッド

iOSの家具配置画面には3つのものが必要です。iCloudで同期される、配置された家具1つごとの記録。家具をセルへドラッグする方法。そして同じことを視覚にも触覚にも頼らずに行う方法です。以下はすべて、2026年10月5日にJSONとして保存したAppleのドキュメントページから、タイトル、宣言、概要、プラットフォームをスクリプトで抜き出したものです。48 本記事のためにビルドしたり実行したりしたものはなく、以下のコストはどれも測定していません。

記録:CloudKitに合わせて形づくったSwiftData

@Modelは「Converts a Swift class into a stored model that’s managed by SwiftData」(SwiftクラスをSwiftDataが管理する保存モデルに変換する)もので、iOS 17.0から使えます。49 SwiftDataは#Uniqueで一意性を強制でき、これは「Specifies the key-paths that SwiftData uses to enforce the uniqueness of model instances」(SwiftDataがモデルインスタンスの一意性を強制するために使うキーパスを指定する)もので、iOS 18.0からです。50 配置された家具は、1セルに1つという、いかにも自然な使い道に見えます。

CloudKit同期がそれを排除します。SwiftDataの同期についてのAppleのガイドは、このフレームワークが「does include a small number of features that CloudKit doesn’t support natively, such as unique constraints and nonoptional relationships」(一意制約や非オプショナルなリレーションシップなど、CloudKitがネイティブにはサポートしない機能を少数含んでいる)とし、「CloudKit requires all relationships to be optional.」(CloudKitはすべてのリレーションシップがオプショナルであることを求める)と述べています。22 Kiradexのモデルはすでにその形になっています。CardCopyのコメントには「every property has a default and nothing is unique, for CloudKit」(CloudKitのため、すべてのプロパティに既定値があり、一意のものはない)とあり、PriceHistoryは「Shaped for CloudKit like CollectionEntry: defaults everywhere, nothing unique」(CollectionEntryと同じくCloudKitに合わせた形:どこにも既定値、一意のものはない)とされています。2台のデバイスが同じ履歴を作ったときには、どのデバイスでも同じ勝者を選ぶ畳み込みがあります。5152

そのため、大事な一意性、つまり1セルに1つという条件は、コードで強制しなければなりません。読み込みのたびに実行され、1つのセルに乗った2台のデバイスの家具をどこでも同じ勝者に決着させ、負けた方をトレイに戻す純粋関数です。2台のデバイスが一緒に壊しうるのは1つのセルだけではありません。それぞれのスマートフォンではすべてのルールを通る2つの編集が、合わさると失敗することがあるので、この関数は重なりのテストだけでなく、配置チェック全体を通して部屋を組み立て直さなければなりません。第7節のブリーフがこれを定めます。

ドラッグ:draggable、ドロップ先、指の下のセル

draggable(_:)はTransferableのペイロードについて「Activates this view as the source of a drag and drop operation」(このビューをドラッグ&ドロップ操作の起点として有効にする)もので、iOS 16.0からです。53 dropDestination(for:action:isTargeted:)はドロップされたアイテムとCGPointを受け取り、そのページはこれを「the drop location in this view’s coordinate space」(このビューの座標空間におけるドロップ位置)と説明しています。こちらもiOS 16.0からです。54 その点をセルに対応づけるのは算数です。マップの原点を引き、タイルのポイント単位の大きさで割ります。

以前のメモにはなかった発見が1つあります。保存したdropDestination(for:action:isTargeted:)のページは、これを非推奨にするリリースとしてiOS 27.2を挙げ、「Use dropDestination(for:isEnabled:action:) with an action that takes a DropSession parameter instead.」(代わりに、DropSessionパラメータを受け取るactionを持つdropDestination(for:isEnabled:action:)を使ってください)というメッセージを添えています。54 置き換え先のactionは、点の代わりにDropSessionを受け取ります。これは「A description of a drop that is in progress」(進行中のドロップの記述)です。54 DropSessionのページは保存していないので、それがビューの座標空間での位置を持つかどうかは未読であり、ブリーフは両方の形を挙げています。

部屋にすでにある家具を動かすには、DragGestureが「A dragging motion that invokes an action as the drag-event sequence changes」(ドラッグイベントの列が変わるにつれてアクションを呼び出すドラッグ動作)で(iOS 13.0)、SpatialTapGestureが「A gesture that recognizes one or more taps and reports their location」(1回以上のタップを認識し、その位置を報告するジェスチャ)です(iOS 16.0)。タップで家具を選び、ドラッグでセル単位に動かします。5556

Kiradexのカメラのもとでドロップ点がタイルのセルにきれいに対応するかは、まだテストされていません。部屋はRealityKitで1テクセルあたり整数個のデバイスピクセルで描かれ、ドロップを受け取るSwiftUIのオーバーレイはその上に重なっています。計算はカメラのフィットがすでに行っているのと同じものですが、まだ誰もその上に何かをドロップしていません。10

触れずに扱うグリッド:VoiceOver

家具のグリッドは要素を1つずつスワイプしていくのに向かないので、設計ではVoiceOverに専用の動詞を与えます。

  • accessibilityElement(children:)は「Creates a new accessibility element, or modifies the AccessibilityChildBehavior of the existing accessibility element」(新しいアクセシビリティ要素を作るか、既存のアクセシビリティ要素のAccessibilityChildBehaviorを変更する)もので(iOS 13.0)、複数セルにまたがる家具を6つではなく1つの要素にします。57
  • accessibilityAction(named:_:)は名前付きのアクションを加えます。「Actions allow assistive technologies, such as the VoiceOver, to interact with the view by invoking the action」(アクションによって、VoiceOverなどの支援技術はアクションを呼び出してビューとやり取りできる)とあります(iOS 16.0)。左へ移動、右へ移動、上へ移動、下へ移動、回転、片付けるが、それぞれ1つのアクションです。58
  • accessibilityAdjustableAction(_:)は上下のスワイプをAccessibilityAdjustmentDirectionとして扱い(iOS 13.0)、壁紙や床を順に切り替えるのに合っています。59
  • accessibilityRotor(_:entries:)は「an Accessibility Rotor with the specified user-visible label」(指定したユーザーに見えるラベルを持つアクセシビリティローター)を作るもので(iOS 16.0)、「家具」のローターで部屋の家具のあいだを移動できます。60
  • AccessibilityNotification.Announcementは「A notification that an app posts when it needs to convey an announcement to an assistive app」(アプリが支援アプリにアナウンスを伝える必要があるときに送る通知)です(iOS 17.0)。拒否された移動はすべて、その理由とともに読み上げられます。61

そのうえでUIテストはXCUIApplication.performAccessibilityAudit(for:_:)で画面を監査できます。iOS 17.0と記載されており、保存したページには概要がなく、このモジュールパスにはXcode 16.3が挙げられています。62 これがするのは監査だけです。Xcode 27.0とともにインストールされるXCUIAutomationのヘッダーでは、この監査は「Runs an accessibility audit on the current view」(現在のビューでアクセシビリティ監査を実行する)とされています。同じヘッダーはiOS 27.0からXCUIVoiceOverServiceを加えており、これは「Provides programmatic control of VoiceOver for UI testing」(UIテストのためにVoiceOverをプログラムから制御する)ものです。VoiceOverのオンとオフを切り替え、フォーカスを前、後ろ、コンテナの内と外へ動かし、フォーカスのある要素についてVoiceOverが読み上げる内容を返します。フレームワークのすべてのヘッダーを検索しても、名前付きのカスタムアクションを実行する呼び出しも、ローターを回す呼び出しも、アナウンスを読む呼び出しも見つからないので、UIテストはVoiceOverのユーザーのように「左へ移動」や「片付ける」を押すことはできません。63 ブリーフはそれらのアクションのハンドラを直接テストし、読み上げられるラベルをVoiceOverサービスで確かめ、アクション、ローター、アナウンスは、VoiceOverをオンにした人の手に委ねます。

コスト

未測定です。家具を置いた家は、2つのフロアそれぞれに最大16個の小さな記録です。配置された家具が、エンジンがフォージの家具のためにすでに組み立てているオブジェクトのメッシュ1つに加わるなら、変更のたびにそのメッシュを組み直すことになります。どれもスマートフォンでプロファイルしていません。39

6. ケーススタディ:現在のKiradexの室内

Kiradexは、iPhone向けのカード収集アプリで、Kiradex Worldという小さなピクセルの町があります。町では各コレクターが2階建ての家を持ち、町にはショーホールがあります。本節の内容はすべて2026年10月5日にアプリのリポジトリから読み取ったもので、実行も変更もしていません。室内はスクリプトで解析し、ドキュメントとモデルはテキストとして読みました。964

構造編の記事以降に変わったこと

10月3日の構造編の記事は、interiors.pyが部屋、上の階、ホールを「each 14 by 11, with a two-row wall band」(それぞれ14×11、2行の壁帯付き)で描くと述べていました。39 書かれた時点ではそれが正しかったのです。同じ日、TestFlightのビルド26が室内キットをもたらしました。「Rooms sixteen wide with a three-row wall band (cornice, face, wainscot)」(幅16の部屋に3行の壁帯(蛇腹、壁面、腰板))、32ピクセルのリズムの家具、地面として描かれる壁付けの家具と、コレクターがその後ろを歩けるオブジェクトとして描かれる自立する家具です。65 現在のフォージはroomとroom-upを16×12セル、ホールを16×13で描き、それぞれに蛇腹、壁面、腰板の3行の壁帯があります。964 ビルド26は、構造編の記事が説明するビルド23と、その夜の追記が説明するビルド35のあいだに入るので、どちらの文章もそれぞれのビルドについては正しいのです。3965

フォージの家具

scripts/forge/interiors.pyは、PIECESの表に23種類の家具を挙げており、それぞれにセル単位の幅と高さ、自立するかどうかのフラグがあります。9

種類 家具と占有範囲(セル、幅×高さ)
壁付けで、地面に描き込まれるもの(9) 本棚5×2、衣装だんす2×2、カウンター、流し、コンロは各1×1、暖炉2×2、上り階段と下り階段は各2×3、柱1×3
自立し、コレクターと前後関係を並べ替えるオブジェクトとして書き出されるもの(14) ベッドとバラのベッドは各2×3、ナイトテーブル1×1、テーブル2×2、4方向の椅子は各1×1、ソファ3×2、ベンチ2×1、植物1×2、チェスト、木箱、樽は各1×1

measure_kiradex_interiors.pyでPIECESから解析。このファイルはインポートも実行もしていない。9

家具1つが覆うのは1から10セル、平均3.04セルで、エメラルドの1から9セル、平均2.43セルと比べられます。92 別々の絵は名前の数より少なく、4つの椅子は1つの絵の4方向、2つのベッドは2つのバリエーション、2つの階段は2つの方向、カウンター、流し、コンロは1つのカウンターの3つの種類です。9

ファイルのdocstringと表は食い違っています。docstringは慣習を「furniture on the 16-pixel grid in a 32-pixel rhythm, every piece at least two tiles on one axis」(家具は16ピクセルのグリッド上に32ピクセルのリズムで置き、どの家具も一方の軸で少なくとも2タイル)と定めています。64 表では23種類のうち11種類が1×1です。4つの椅子、カウンター、流し、コンロ、ナイトテーブル、チェスト、木箱、樽です。9 このリズムは大きな家具には当てはまり、小さな家具には当てはまりません。これは1つのファイル、scripts/forge/interiors.pyのなかのコメントとコードの違いであり、ブリーフは小さな家具を残します。2タイルの家具だけの部屋には椅子がなくなってしまうからです。

壁面には独自の語彙が文字として定められています。絵p、時計k、窓N、カーテン付きの窓K、旗n、壁付け燭台l、そして壁のボードが掛かる場所のWです。床は板o、タイルt、大理石s、そして周囲から9スライスとして自分を描くラグrです。壁のスタイルは2つあり、家の漆喰と木組み、ホールの切石で、FACESを通じて室内ごとに選ばれます。64

作られたままの部屋

マップ 広さ 床のセル 家具(動かせるもの) 家具の下の床 空いている床 アプリが飾るスポット
room 16×12 125 14(13) 25 100 棚5セル、ショーケース2、机2。到着、階段、ホスト
room-up 16×12 125 12(11) 27 98 壁のボード3セル、机2。階段での到着
hall 16×13 144 6(4) 8 台座8つを置いた後で128 台座8つ

動かせるものからは階段と柱を除く。measure_kiradex_interiors.pyより。9

hostスポットには、ファイル内で「where the owner stands when you visit」(訪れたときにオーナーが立つ場所)というコメントがあります。64 フォージのcheck()はすでに、間違った文字の上にある棚、ケース、机、台座のスポット、ドアや階段の上にないワープ、歩けない到着セル、階段のセル、ホストのセル、そして1つのセルに書き出された2つのオブジェクトを拒否します。ブリーフにとって重要なのは、その手の届かない部分です。壁のボードのスポットには文字のチェックがなく、重なりのループは書き出されたオブジェクト、つまり自立する家具だけを読むので、地面に描き込まれた壁付けの家具はそこに入りません。ドアからすべてのスポットにたどり着けるかは確かめていません。64

通路ルールを、現在の部屋で実行する

私は、書き出される文字をexport()と同じやり方で組み立て直し、各フロアの到着セルからフォージの歩ける文字otsrUDの上を4方向に歩くスクリプトを書きました。20 現在のレイアウトでは、歩行は1階で階段とホストに、2階で階段にたどり着きます。展示スポットのすぐ手前のセルについては話が別です。

  • 1階の棚の手前の5セル:2つは樽と木箱の下にあり、3つにたどり着けます。
  • ケースの手前の2セルには、どちらもたどり着けます。
  • 机の手前の2セル:1つは机に寄せた椅子の下にあり、1つにたどり着けます。
  • 2階の机も同じで、2つのうち1つです。
  • 2階の壁のボードの手前の3セルは、ベッドとナイトテーブルの下にあります。1つにもたどり着けません。20

つまり、各スポット自身の手前のセルにたどり着けることを求めるルールなら、2つのフロアにわたるフォージの飾り付けグループのうち4つ(1階の棚と机、2階の机と壁のボード)が不合格になり、ふさがれた手前のセルは合わせて7つです。各飾り付けグループに、たどり着ける手前のセルが1つあればよいとするルールなら、不合格は1つのグループ、2階の壁のボードだけです。ブリーフはグループの形を採用し、最初の部屋の配置し直しでボードを直します。

スクリプトはroomに家具を追加する場合も試しました。自立する家具を1つ追加すると、セルのルールを通る配置は733通りあり、そのうち44通りが目標を切り離しますが、そのどれもが目標のセルそのものを覆うことで切り離しています。どの目標からも離れていて互いに重ならない2つの家具を追加すると、組み合わせは229,891通りになり、そのうち713通りは目標を覆わずに切り離します。たとえば(9,3)のベッドと(6,4)のナイトテーブルは、ガラスケースの手前のくぼみを閉じてしまいます。20 この713通りこそ、セルごとのチェックが見逃し、歩行が捕まえるものです。そしてこれは、2台のスマートフォンが一緒に作り出せるものでもあります。家具1つだけならどの目標にもたどり着けるので、それぞれのデバイスでは単独で歩行を通り、2つがそろって同期されたときに初めて不合格になります(7.7)。66 追加の家具が2つを超える場合の探索は実行していません。16個のとき、セルごとのチェックが通し、歩行が拒否するレイアウトがどれだけあるかは未測定です。

グリッドに対するコレクター

コレクターのスプライトのセルは32×40ピクセルで、人物の上に7ピクセル、下に2ピクセルの余白があるので、人物の高さは約31ピクセルです。セルは幅2タイル、高さ2.5タイルで、エメラルドのコマの1×2と比べられます。WORLD.mdはこれを「a 30-pixel figure in a 32 × 40 cell」(32 × 40のセルに入った30ピクセルの人物)と説明しています。2767 人物自身の幅は測定していません。私の読みでは、フォージが16ピクセルのグリッドの上に32ピクセルのリズムで家具を描くのは、このセルのためです。コレクターのセルは幅2タイルなのです。

部屋にできないこと

構造編の記事の正直なリストは、家については今も当てはまります。「Rooms have no wallpaper or floor choice and no placeable furniture; the house is dressed from the collection and nothing else.」(部屋には壁紙や床の選択も、配置できる家具もない。家はコレクションによってのみ飾られる)39 アプリは名前の付いたスポットをコレクションで飾り(棚にはバインダー、ケースにはカード、ボードにはリボンとピン、ホールの台座にはカード)、家具はすべてフォージが配置します。6439

サーバーはまだ部屋を保持できません。そのroomsモジュールにはこうあります。「Everything here is in memory; a room empties when its last collector leaves and nothing of them is kept.」(ここにあるものはすべてメモリ上にあり、最後のコレクターが去ると部屋は空になり、彼らについては何も保持されない)68 つまり現在、ほかのコレクターの家を訪れるのはマップを訪れることであり、実際のコレクターの配置を読み取り専用で訪れるには、サーバーがレイアウトを保存する必要があります。

部屋のルールが書かれている場所

10月3日の世界編の記事は、部屋のルールを公開しました。「a furnishing cap of sixteen」(家具の上限16)、「visits are read-only, a like is once a day, and the room’s total never decreases」(訪問は読み取り専用、いいねは1日1回、部屋の合計は決して減らない)、そして「A report arrives every Sunday grading the room, with its point sources listed」(毎週日曜に、得点源を列挙して部屋を採点するレポートが届く)です。10 これらのルールはアプリの設計ドキュメントにはありません。docs/WORLD.mdの第4節はコインショップ(「clothes, hats, backpacks, card-display frames and emotes」(服、帽子、リュック、カード展示用の額、エモート))と、レベルで解放され「that cannot be bought」(買うことのできない)コスメティックを挙げていますが、家具、上限、いいね、日曜のレポートについては何も述べていません。67 ルールは調査ノートdocs/research/pixel-art/06-collecting-and-hubs.mdの5.3節にあり、そこでは手紙を「a pixel object that appears on the doormat」(玄関マットの上に現れるピクセルのオブジェクト)にすること、「a stamp on their passport per room visited, with ranks at 30 / 100 / 500」(訪れた部屋ごとにパスポートにスタンプを押し、30 / 100 / 500でランクを付ける)こと、そして5.7節では、パトロン向けアイテムを「never a bigger furnishing cap」(決して家具の上限を大きくするものではない)とすることも求めています。69 本記事は、世界編の記事が公開したことを理由にこれらを決定済みとして扱い、ブリーフの最初の整理項目は、それをWORLD.mdに写すことです。世界編の記事の同じ段落には「Patron flair stays on the name-plate and the room skin」(パトロン向けの装飾はネームプレートと部屋のスキンにとどめる)ともあります。10 ブリーフは部屋のスキンを決定済みとは扱いません。Blakeの判断として、それを開き直します(7.5)。

週はすでにある

週替わりのクエストはQuest.currentでカレンダーの週ごとに入れ替わり、ホールのテーマはその週のクエストのタイトルで、プロトタイプのノートはテスターに「Weekly reset on your calendar’s week」(カレンダーの週での週次リセット)について尋ねています。7071 日曜の手紙に新しい時計は要りません。ただし、7.4で述べる理由から、手紙は独自のキー、その日曜の日付を使います。

7. ブリーフ:Kiradexが作るものと、通るべきチェック

これはブリーフであって、出荷済みの作業の報告ではありません。以下のものはまだどれもアプリに存在しません。第6節で測定したもの、つまりフォージの23種類の家具、16×12の家の2つのフロアと16×13のホール、飾り付けスポット、何も保持しないサーバー、CloudKitで同期されるSwiftDataのストア、週替わりのクエストの時計、そして世界編の記事がすでに公開した部屋のルールに対する差分として書いています。96810 どの要素も上で測定したメカニクスを1つ受け継ぎ、すべてをKiradex自身のフォージ、パレット、言葉で描きます。どの要素もクリーチャー、どのゲームの場所、どのフランチャイズの機能の名前も出さず、部屋のなかで投げたり、捕まえたり、呼び出したり、乗ったりするものは何もないので、世界編の記事が説明するゲームの手法特許の請求項に似るものはありません。これは私の読みであって、法的助言ではありません。10 座標はフォージのもので、左上のセルからxは右へ、yは下へ進みます。本節の数字(最初の8個、スコアの表、家の等級のしきい値、解放のスケジュール)は私の提案であって、事実ではありません。

7.1 セル単位の配置を、フォージ自身の語彙で

家のなかの配置モード(Arrange)。配置できる家具はフォージの23種類のうち20種類です。stairs、stairs_down、pillarを除くすべてで、この3つはレイアウトの一部として残ります。4つの椅子は向きを持つ1つの種類になるので、20種類の家具は17の床の種類になります。壁面の絵、時計、旗、燭台は4つの配置できる壁のアイテムになり、現在のフォージから21種類になります。窓と階段の開口部は建築として残ります。7.5節で新しい家具を3つ(展示テーブル、屏風、押し花の壁のアイテム)加えるので、数は24になります。72 配置された家具は、フロアの文字マップ上の左上のセルにおける(kind, x, y, facing)で、ROOM_FURNITUREがすでに使っているのと同じ形です。964

ルールは、セルごとに次のとおりです。最初の5つはエメラルドの「セルごとの問い」をKiradexの文字に合わせて言い直したもので、6つ目はブリーフによる追加、エメラルドの配置関数がしていないチェックです。4

  1. 自立する家具は、覆うすべてのセルが床(o、t、s、r)で、ほかの家具が乗っていないことを必要とします。
  2. 壁付けの家具(本棚、衣装だんす、カウンター、流し、コンロ、暖炉)は、最上段が壁帯の上にあることを必要とします。フォージがすでに置いている位置で、暖炉はy = 1で壁面と腰板にまたがり、ほかはy = 2で腰板の上です。64
  3. 壁のアイテムは、1行目の壁面のセル(A)で、窓や階段の開口部でないものを必要とします。
  4. 到着セル、2つのドアのセル(フォージはドアを下の壁に幅2セルで描きます)、階段の歩けるセル、ホストのセルには家具を置けません。
  5. 本棚は5つの棚スポットを一緒に持ち運びます。スポットは家具に対する相対位置なので、棚を動かせばバインダーも動きます。ガラスケースcと机dは、このブリーフでは固定の文字のままです。
  6. 通路ルール。 配置のあと、到着セルから歩けるセルの上を4方向に歩いて、階段のセル、ホストのセル、そして各飾り付けグループ(棚、ケース、机、壁のボード)のすぐ手前のセルの少なくとも1つに、まだたどり着けなければなりません。歩行を壊す家具は拒否され、その拒否は何を切り離すことになるかを告げます。

フォージが現在作っているKiradexの1階を、アートなしでセルとして描いた16×12のグリッド。上部を横切る3行の壁帯、それに沿った本棚とガラスケース、右上の階段のセル、下のドア。到着セルからたどり着ける床は白、フォージの自立する家具は灰色。到着、階段、ホストはA、S、Hで示されています。棚、ケース、机の手前のセルは、たどり着けるものとして、あるいは樽、木箱、椅子が乗っているところでは×印で示されています。その上にオレンジで、(9,3)のベッドと(6,4)のナイトテーブルが描かれ、この2つが切り離すケースの手前の6つのセルが輪郭で示されています。

オレンジの2つの家具は、どちらもセルのルールを通ります。2つそろうとケースを囲い込んでしまい、それを捕まえるのはルール6の歩行だけです。2420

グループの形を採る理由。現在のレイアウトでは、スポットの手前のセルが家具であることがよくあります。棚の手前の5セルのうち2つの下には樽と木箱、各机には椅子、ボードの手前の3つすべての下にはベッドとナイトテーブルがあります。20 フォージはすでにこの言語の一部を話しています。check()は自立するオブジェクトどうしの重なりと、間違った文字の上にある棚、ケース、机、台座のスポットを拒否します。64 プレイヤーには、そのルールが壁付けの家具を含むすべての占有範囲と、壁のボードのセルにまで広げられ、さらに歩行が加わったものが与えられます。

受け入れチェック。 - 単体テストでroom.jsonに対して6つのルールを実行します。24種類(現在のフォージからの21種類と、7.5が加える3種類)のそれぞれが、1つのセルで受け入れられ、当てはまるルールごとに1つのセルで拒否されること。 - 出荷する最初の2つのフロア(7.2)の両方で通路ルールが通り、2階のボードにたどり着ける手前のセルがあることをテストで固定すること。 - プロパティテストで、roomとroom-upに最大16個の正当な配置の列をランダムに置き、各ステップのあとで、到着セルからの歩行が階段、ホスト、すべての飾り付けグループの手前のセルにたどり着くことを確認すること。 - 回帰テストで、roomの(9,3)にベッド、(6,4)にナイトテーブルを置き、2つ目がケースの名前を挙げたメッセージとともに拒否されることを確認すること。20 - iPhone 18 Pro Maxのシミュレータでの配置モードのキャプチャで、手に持った家具の占有範囲がセルごとに色付けされ、1つは正当、1つは不正であることを示すこと。 - フォージのcheck()が、アプリが作りうるすべてのレイアウトで通ること。テストは配置されたレイアウトをROOM_FURNITUREとして書き出し、フォージのチェックを読み取り専用で実行します。そのチェックは書き出されたオブジェクトしか読まず、壁のボードの文字チェックもないので、同じテストはブリーフ自身のバリデータで、壁付けの家具も含めて配置された2つの占有範囲がセルを共有しないこと、そして壁のボードの3つのスポットが、作られたマップのボードのWのセルの上にあることも確認します。64

7.2 上限:1フロア16個、最初の部屋は8個

内容。 フロアのマップごと、roomとroom-upそれぞれに16個の配置された家具。壁のアイテムも含みます。New Horizonsが150のなかに壁と天井のアイテムを数えるのと同じです。5 コレクションが飾るもの(棚のバインダー、ケースのカード、ボードのリボンとピン)は決して数えません。上限が予算として配分するのは家具であり、コレクションこそが主役です。所持はこれで制限されません。エメラルドが16個の配置に対して150個の所持を許すように、コレクターは収まる数より多くを所持できます。2

数字。 125の床セルに対して16は1セルあたり0.13で、エメラルドの0.27の半分です。家具の平均がエメラルドの2.43セルに対して3.04セルであり、コレクターのセルが幅2タイルであることに合っています(私の計算です)。9227 フォージの最初のroomにはすでに動かせる家具が13個、room-upには11個あるので、新しいコレクターが16個中13個の状態で到着すると、残る選択肢は3つです。9 提案は、最初の各フロアを、フォージで選んだ8個の動かせる家具で出荷することです。1階では棚スポットを持つ本棚を残し、2階ではベッドを残します。配置し直しでは、現在は1つもない壁のボードの手前のセルを、少なくとも1つ空けます。取り除いた家具は消えるのではなくコレクターのトレイに入るので、1フロア8枠が最初の日からコレクターのものになります。20 最初の家具は固定のIDで作られるので、2台のデバイスがまっさらな状態で起動しても、2組ではなく同じ記録ができます(7.7)。

パトロンに左右されない。 調査ノートの一文がそのまま有効です。パトロン向けアイテムは「never a bigger furnishing cap」(決して家具の上限を大きくするものではない)。69

受け入れチェック。 単体テストで16個を置き、17個目が上限の名前を挙げたメッセージとともに拒否されることを確認する。飾り付けスポット上のバインダー、カード、リボン、ピンが数を変えないことのテスト。すべてのパトロンの段階で上限が16に見えることのテスト。最初の両フロアが8個の動かせる家具で読み込まれ、通路ルールを通ることのテスト。

7.3 壁紙と床

内容。 フロアのマップごとに、壁のスタイル1つと床のスタイル1つ。それぞれ配置モードで1回のタップで変えられ、無料で、元に戻せます。Stardewの「1つの面に1つの操作」とNew Horizonsの部屋ごとの選択であって、Habboの永続性ではありません。41533 スタイルは16個には数えません。

すでにある語彙。 2つの壁面(plasterとblocks)、3つの床(板o、タイルt、大理石s)、そしてラグです。64 フォージは名前の付いたパレットのランプからルールで描くので、スタイルとは描画処理とランプの組です。最初のセットは、2つの壁面をそれぞれ3つのランプで、3つの床をそれぞれ2つのランプで描いたもので、壁のスタイル6つと床のスタイル6つになり、どれもフォージが描き、手で描くものはありません。さらにプレイで増えます(7.5)。

出荷の仕方。 フォージは各スタイルを部屋自身のセルと並べてアトラスのセルとして書き出し、アプリは壁のセルと床のセルの地面のインデックスを入れ替えます。ラグは9スライスのままです。

受け入れチェック。 各壁のスタイルと各床のスタイルでのroomのキャプチャ、合わせて12枚。すべてのスタイルのすべてのピクセルがフォージのパレットのインデックスであることのパレットチェック。スタイルを変えても配置された家具と飾り付けスポットが変わらないことのテスト。

7.4 日曜の手紙:すべての得点源を印字した週ごとのスコア

内容。 週に1回、現地時間の日曜の0時以降に初めてアプリを開いたとき、玄関マット(到着セルにあるオブジェクト)の上に手紙が現れ、その時点の家を採点します。手紙は日曜1回につき1通で、現地時間でのその日曜の日付をキーにします。クエストボードの週はキーにできません。Quest.currentはカレンダーのweekOfYearの区間を使い、その区間はカレンダーの週が始まる曜日から始まるので、週のキーと日曜のルールが食い違うおそれがあるからです。70 週を逃しても失うものはありません。手紙はすべての得点源の行をその得点とともに印字し、続いて合計と家の等級を記します。名前はKiradex独自のもので、今のところ学芸員のメモとし、リズムを借りたゲームの名前は決して使いません。

得点源。 形はNookipediaがまとめたハッピーホームアカデミーのもの(数のしきい値、セットのボーナス、色のボーナス)で、数字は私のものであり、コレクションも含まれています。6 上限は16と同じくフロアのマップごとです。

得点源 得点 上限 借りているもの
配置された家具1つごと 100 1フロア16個 数のしきい値
家具をそろえたフロア:6、10、16個 それぞれ500 1フロア1,500 6、10、15、20個で1,000
スイート:1フロアに同じフォージのセットから4個以上 1個につき200 1フロア16個 1つのシリーズから4点以上
1つのランプ:フロアの家具と、壁と床の2つの面の70%が1つのランプ系統 フロアに配置された家具1つにつき100 1フロア16 70%が1色
1つのランプで90%(70%の行に代わる) フロアに配置された家具1つにつき300 1フロア16 90%が1色
棚:5つのバインダーの場所すべてをコレクションで埋める 500 1回 ぬいぐるみを載せるエメラルドの机
ケース:2つの場所それぞれにカード それぞれ300 600
ボード:3つのセルそれぞれにピン、スタンプ、リボン それぞれ100 300
減点 なし 通路ルールがふさがれた部屋をすでに拒否している

提案。どの行も、手元の部屋とコレクションから計算できる。

この表が与えうる最高得点は23,600で、両フロアに16個ずつ置き、すべてのボーナスを満たした場合を行ごとに計算したものです。スイートとランプの行は、16個すべてをまかなえる大きさのセットとランプ系統を前提にしているので、これは上限であって、誰かが実際に描いたレイアウトではありません。セット、ランプ、スポットの前の、8個の最初のフロアは1,300点です。21

両フロアで最大にしたときの日曜の手紙の得点源を示す横棒グラフ。配置された家具1つごと3,200。6、10、16個で家具をそろえたフロア3,000。スイート6,400。1つのランプで90% 9,600。棚がいっぱい500。ケース600。ボード300。合計23,600。

尺度の上のほうでは、数よりも構図(セットとランプ)のほうが価値があります。それこそが上限の狙いです。2421

手紙は家を3つの家の等級で評価し、各しきい値は、この表自体が基準となる家に与える得点です。4,500は両フロアに10個ずつで棚がいっぱいの家、7,600は両フロアに16個ずつで棚、ケース、ボードがいっぱいの家、14,000はその家に加えて各フロアに8個のスイートと70%の1つのランプがある家です。最初の家、つまり両フロアに8個ずつの家は2,600点で、最初の等級に届きません。21 この3つの数字は私の提案で、手紙を出荷する前にBlakeが最終的な数字を決めます。アカデミーのものと違い、これらは上がりません。家の形が変わることはないからです(下の「このブリーフに含めないもの」を参照)。6 家の等級はリボンではありません。アプリがすでに保持しているリボンは町のコレクターから贈られるもので、plaza.ribbonsとして保存されています。ボードに表示されるのはそのリボンです(第6節)。73 家の等級は手紙に印字され、数値として保持され(7.5)、ボードには決して載りません。

スコアが決して読まないもの。 パトロンの段階、コイン、購入、いいね、ほかのプレイヤーに関すること、パトロン向けの部屋のスキン。どの行も手元の部屋とコレクションから計算できるので、コレクターは自分がなぜその得点を得たのかを正確に知ることができます。パトロン向けの部屋のスキンが出荷される場合、それはフロアの通常の壁のスタイルの上に描かれ、それ自体は壁のスタイルではありません。フロアは採点のためにその通常のスタイルを保つので、ランプの行はスキンのオンでもオフでも同じ家具と面を数えます(7.5)。

フォージの変更。 PIECESにsetタグを加え、同じ素材として描きます。最初のセットは、既存の家具を描かれている素材でまとめたものです。

受け入れチェック。 純粋関数Score.week(room:collection:)と、すべての行の単体テスト。5、6、10、16個のフロア。3個と4個のスイート。69%、70%、89%、90%の1つのランプ。バインダー4つと5つの棚。最高得点が23,600であることのテスト。3つの基準となる家が4,500、7,600、14,000点となり、それぞれ1つ目、2つ目、3つ目の家の等級を得て、最初の家が2,600点でどれも得ないことのテスト。家の等級に達してもplaza.ribbonsにもボードにも何も加わらないことのテスト。日曜の手紙が1回だけ生成されること(同じ日曜の日付が2回なら手紙は1通、次の日曜には別の1通)、そして週が月曜に始まるカレンダーでも同じキーになることのテスト。パトロンの段階だけが違う2つのプロフィールが同じ得点になることのテスト。日付を設定する起動引数を使った、日曜に玄関マットの上にある手紙のUIキャプチャ。

7.5 プレイによる解放、決して購入ではなく

内容。 コレクターが所持するカタログは、プレイから導かれます。6つの入力のうち3つは現在すでにあります。同期されるコレクションから導かれるレベルとピン、そしてデバイス上にだけ記録されるクエストのスタンプです。残りの3つには新しいカウンタが必要で、それぞれ名前を付けて同期します。

  • レベル。 WORLD.mdの曲線はlevel = floor(sqrt(XP / 40)) + 1です。67 レベル2から20までは毎レベル、それ以降は2レベルごとに種類かスタイルを1つ。WORLD.mdがすでにコスメティックを「that cannot be bought」(買うことのできない)ものとして制限しているのと同じやり方です。67 現在すでに利用でき、同期されるコレクションから導かれます。アプリは経験値とレベルをそこから算出しており、「so every device agrees without anything being stored」(何も保存せずにすべてのデバイスの結果が一致する)のです。74
  • ピン。 各ピンが名前の付いた家具を1つ解放します。Full Setで展示テーブル、Vintageで時計、Across the Seaで屏風。1つ目と最後のものは新しいフォージの家具です。67 現在すでに利用でき、同じ計算で同期されるコレクションから導かれます。74
  • 週替わりのクエスト。 週替わりのクエストを1つ達成するごとに、基本的な家具(椅子、植物、木箱)が1つ加わります。70 現在すでに記録されていますが、デバイス上だけです。スタンプは@AppStorage("quests.stamps")にあり、これは同期されるストアではなくUserDefaultsなので、どの家具もそれに依存する前に、スタンプをPlayRecord(後述)に移します。7375
  • 歩数。 1つの長い歩き。大きな歩数を必要とする家具で、エメラルドのガラスの椅子が一歩ずつ集める6,000 ashを必要とするのと同じです。エメラルドの袋は数を表示せず、工房が足りない分を告げるのはプレイヤーが戻ってきたときだけです。ここでの提案は、家具のトレイのカードに常に表示されるカウンタで、歩いた歩数と必要な歩数を示すものです。2815 窓辺の植物から作る押し花は別の提案で、壁のアイテムです。その解放条件はこの項目のカウンタではなく、昔のポケモンを、何も借りずに讃えるの記事のブリーフで定めています。植物は256歩ごとに1段階育ち、1,024歩のあいだ花を咲かせたあと、花を1つ落とします。新規:アプリは現在歩数を数えていないので、これにはstepsWalkedが必要です。73
  • 訪問。 パスポートのランクである30、100、500の訪問した部屋が、それぞれスタイルを1つ解放します。69 新規:現在、デバイスにもサーバーにも訪問を記録するものはないので、これにはホストのIDを持つroomsVisitedが必要です。7368
  • 手紙。 コレクターが各家の等級に初めて達したとき、家具を1つ解放します。新規:家の等級はこのブリーフ(7.4)のなかにしか存在しないので、これには到達した最も高い家の等級を持つletterTierが必要です。

モデルの差分。 クエストのスタンプと3つの新しいカウンタは、1つの同期されるモデルPlayRecordに置き、デバイスごとに1つの記録とし、アプリのほかのモデルと同じくCloudKitに合わせた形にします(7.7)。カタログはすべてのデバイスの記録を読みます。歩数は合計し、スタンプと訪問したホストは和集合をとり、最も高い家の等級を採ります。デバイスは自分の記録のuidを@AppStorageのキーに保持し、それは広場でのデバイスのIDであるplaza.idと同じUserDefaultsの名前空間に置かれます。7375 各デバイスは自分の記録だけに書き込むので、2台のデバイスが同じ記録を編集することはなく、マージのルールも要りません。ただしそれが成り立つのは、このポインタが1台のデバイスにとどまる場合だけで、2台目のスマートフォンに復元したバックアップはポインタも一緒に持ち込みます(私の読みです。復元はテストしていません)。そこで記録はデバイスのしるしwriterを持ち、ルールは次のとおりとします。復元されたデバイスは、ポインタが指す記録が別のデバイスによって書かれたものなら、新しい記録を作ります。古い記録は残り、カタログは引き続きそれも読みます。バックアップが新しいスマートフォンに持ち込まない「しるし」をどの値で作るかは、このブリーフでは決めていません。テストがルールを固定します。変更後の最初の起動時に、デバイスは自分のquests.stampsのリストを1回だけ自分の記録に写します。

拒むもの。 家具やスタイルのアプリ内課金、家具のコイン価格、あらゆる種類のランダムな家具、数量限定の家具、そして家具の取引。Habboの割れるレア、レア、取引価値が反例です。1735 私の読みでは、飾り付けのループが購入やランダムに頼る9+のアプリは、収集アプリには不要なルートボックスや課金圧力の問題を抱え込み、プレイによる解放はそれを避けられます。調査ノートが認める唯一の有料の例外はパトロン向けの「one room skin」(部屋のスキン1つ)で、世界編の記事はそれを名指ししました。「Patron flair stays on the name-plate and the room skin」(パトロン向けの装飾はネームプレートと部屋のスキンにとどめる)。6910 同じ文が限度も定めています。パトロン向けの装飾は「never touches a pedestal slot or a judging bonus」(台座の枠や審査のボーナスには決して触れない)。10 このブリーフは、スキンを決着済みとして扱うのではなく、Blakeの判断として開き直します。彼がそれを残すなら、スキンは壁のスタイルではなく、見た目のオーバーレイです。フロアはコレクターが選んだ通常の壁のスタイルを保ち、スキンはその上に描かれ、スコアは通常のスタイルだけを読むので、7.4のランプの行はスキンのオンでもオフでも、同じ分母に対して同じ家具と面を数えます。代わりに壁をランプの数から外すのは中立ではありません。割合は家具だけでなく面も数えるからです。16個の家具のうち15個と床のスタイルが1つのランプにあり、壁がその外にあるフロアは、18のうち16で88.9%となり、70%の行で1,600点、つまりランプ外の1個も含めて配置された16個それぞれに100点です。壁を外すと17のうち16で94.1%となり、90%の行で4,800点、16個それぞれに300点となって、有料のスキンに3,200点の審査ボーナスが付くことになります。76 下のテストは、スキンを名指しで切り分けます。

受け入れチェック。 所持するカタログがXP、ピン、クエストのスタンプ、歩いた歩数、訪問した部屋、家の等級の純粋関数であり、それ以外の何によっても変わらないことの単体テスト。2台のデバイスのPlayRecordが、どちらの順で読んでも同じカタログになること(歩数は合計、スタンプとホストは和集合、最も高い家の等級)のテスト。デバイスの既存のquests.stampsのリストが自分の記録に1回だけ写され、2回写されないことのテスト。ポインタが別のデバイスのwriterを持つ記録を指すデバイスが、新しい記録を作り、古い記録を変えずに残し、両方を引き続き数えることのテスト。StoreKitのプロダクトIDもコインショップのアイテムも家具の種類やスタイルに対応しないことのテストで、名前を挙げた例外を1つだけ認めます。Blakeがパトロン向けの部屋のスキンを残すなら、そのプロダクトはちょうど1つのオーバーレイに対応し、どの壁のスタイルにも対応せず、適用してもフロアの採点用の壁のスタイルは変わらないこと。フロアがスキンのオンとオフで行ごとに同じ得点になり、同じ家の等級を得ることのテストで、すべてのしきい値の境界で実行します。5、6、10、16個、69%、70%、89%、90%の1つのランプを、それぞれ通常の壁がランプ系統の内にある場合と外にある場合で、そして各家の等級のしきい値の1点下とちょうどの家で。レベル1(最初のセットのみ)とレベル20でのカタログのトレイのスナップショットテスト。

7.6 訪問:読み取り専用、1日1回のいいね、決して下がらない合計

内容。 訪問者は、町がすでに自分のコレクターたちの家に使っている部屋のワープを使って、ドアからホストの家に入り、39 ホストが配置した家具、スタイル、飾り付けスポットを見ます。訪問者は歩いたりプリセットの文を話したりはできますが、何も動かせず、取れず、加えられません。これはHabboのルールであり、New Horizonsの夢見が、訪問者の変えたものを何も残さないことでたどり着く結果でもあります。1832 ドアのいいねは、訪問者1人がホスト1人に対して現地時間の1日に1回だけ数えられ、ホストの合計は、部屋を模様替えしても決して減りません。これはClub Penguinのルールで、ファンの情報源1つによるものです。19 訪問すると訪問者はパスポートのスタンプを得て、訪問者のデバイスがそれを自分のPlayRecordのroomsVisitedに加えます(7.5)。69

サーバーの差分。 現在のサーバーは何も保持しません。68 訪問にはプレイヤーごとに2つの小さな記録が必要です。1つ目は家のレイアウトです。2つのフロアにわたって最大32個の配置された家具で、それぞれが種類、x、y、向きを持ち、加えてフロアごとに2つのスタイルIDがあります。名前付きのキーを持つコンパクトなJSONにして、すべての枠に提案中の最も長い種類名を入れ、スタイルIDを16文字にすると1,974バイトで、2 KBに収まります。数値の4つ組だけにすれば385バイトです(私の計算です。エメラルドの基地全体は32バイト)。7211 2つ目は、その日の訪問者の集合を伴ういいねの合計です。どちらもプレイヤーのハンドル以外の個人データを持ちません。サーバーはレイアウトを保存する前に同じ6つのルールで検証するので、改造したクライアントが不正な部屋を保存することはできません。7.5のプレイのカウンタ(クエストのスタンプ、歩いた歩数、訪問した部屋、家の等級)はサーバーの記録ではありません。それらはコレクター自身のiCloudを通じてPlayRecordで同期され、サーバーは決して読みません。

受け入れチェック。 サーバーのテスト。重なり、ふさがれた通路、フロアの17個目の家具を含むレイアウトが拒否されること。ホストの部屋での訪問者の移動や配置のメッセージが拒否されること。同じ訪問者の同じ日のいいね2回は1回と数えられ、翌日のいいねは数えられること。部屋を片付けたホストが合計を保つこと。2台のシミュレータでの歩行確認。デバイスAが配置し、デバイスBが訪問して同じセルに同じ家具を見ること、それぞれのキャプチャ付きで。

7.7 iOS 26でのモデルと画面

SwiftData。 アプリのほかのモデルと同じくCloudKitに合わせた形の2つのモデル。どこにも既定値があり、一意のものはなく、Profile、PriceHistory、CardCopyが持つのと同じく、initでUUIDに設定されるuidを持ちます。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 }
}

壁と床のスタイルは、lookDataの隣に、Profile上の文字列として置きます。77 #Uniqueも必須のリレーションシップもありません。CloudKitはどちらもサポートしないからです。22 セルの排他性、上限、歩行は、コードのなかの1つの関数で強制します。RoomLayout.repair(_:)は読み込みのたびに実行されます。フロアの同期された家具をuidの昇順に並べ、フロアをその固定の建築(文字マップ、階段、柱)から組み立て直し、その順に各家具を加えていきます。加えるのは、すでに受け入れた家具に対して7.1の配置チェック全体、つまりセルのルール(したがって重なりなし)、16個の上限、通路ルールがそれを受け入れる場合だけです。チェックが拒否した家具はトレイに戻ります。どのデバイスも同じ記録を同じやり方で並べるので、どのデバイスも同じ部屋を組み立て直し、2つの家具がぶつかる場合はuidの小さい方が勝ちます。これは、PriceBookが2台のデバイスの価格履歴から1つを選ぶのにすでに使っているルールです。52 順序を配置時刻ではなくuidで決めるのは、時刻がそれぞれのスマートフォン自身の時計から来るからです。2台のスマートフォンが生みうる衝突は重なりだけではありません。一方のスマートフォンで(9,3)に置いたベッドと、もう一方で(6,4)に置いたナイトテーブルは、それぞれ自分のデバイスでは配置チェック全体を通りますが、合わさるとケースの手前の2つのセルを両方とも切り離します。組み立て直しはuidの小さい方を残し、もう一方を戻します。2066 家具を取り除いても通路が切れることはないので、すでに正当なフロアは、どんな順序でも組み立て直しを変わらずに通ります(私の推論です。受け入れテストがこれを固定します)。7.2の最初の家具は、プレイヤーが何もしなくても2台のデバイスが記録を作る唯一の場所なので、それぞれにランダムなものではなく、フロアと枠から決まる固定のuid、starter.room.1からstarter.room-up.8までを与えます。まっさらな状態で起動した2台のデバイスは同じ16個のuidを作り、組み立て直しがフロアとトレイに分けてしまうような16組のペアにはなりません。repairは組み立て直す前に、同じuidを持つ記録を1つに畳み込みます。ModelContext.profile()が、同期が残す重複したプロフィールを最も小さいuidのものに畳み込んでいるのと同じやり方です。77 2つの写しが食い違う場合、つまり一方のデバイスが、もう一方が最初に起動する前に最初の家具を動かしていた場合、畳み込みは最初のセルから動いている写しを残し、2つとも動いている場合は行が小さい方、次に列が小さい方を残します(私の提案です)。家具を片付けるとその記録が削除されるのであれば、一方のスマートフォンで片付けた最初の家具は、2台目のスマートフォンがまっさらな状態で起動したときに戻ってきます。このブリーフはその場合を決着させていません。

配置。 配置モードは、部屋のRealityViewの上にSwiftUIのトレイを重ねます。トレイのアイテムは種類をTransferableのペイロードとするdraggableで、部屋のビューはドロップ先です。53 iOS 26では、dropDestination(for:action:isTargeted:)がビューの座標でのドロップ点をactionに渡し、その点はカメラの既知の整数ピクセルの倍率でセルに対応づけられます。cell = floor((point - mapOrigin) / tileSizeInPoints)です。54 Appleのページはこの形をiOS 27.2で非推奨としているので、ブリーフはDropSessionの形も作り、セッションが位置を持つならそこから読み取ります。そのページはまだ読んでいません。54 配置された家具はSpatialTapGestureで選択し、DragGestureで動かし、セル単位で吸着させ、Stardewがタイルを色付けするように、その占有範囲をセルごとに色付けします。565516

VoiceOver。 配置モードでは、配置された各家具が1つのアクセシビリティ要素になります。たとえばソファ、3×2、9列目、8行目で、名前付きのアクション「左へ移動」「右へ移動」「上へ移動」「下へ移動」「回転」(椅子のみ)「片付ける」を持ちます。5758 「家具」という名前のローターが部屋の家具を一覧にします。60 トレイのアイテムの「配置」アクションは、到着セルに最も近い正当なセルに家具を置き、そこにフォーカスを移します。壁と床のスタイルは調整可能な要素で、上下のスワイプで切り替えます。59 拒否はすべてアナウンスとして読み上げられます。たとえば移動できません:ソファが棚への道をふさぎます。61 7.1のルールは1つの関数なので、音声とタッチが食い違うことは決してありません。

受け入れチェック。 repairが2台のデバイスの重なりを、どちらの順でも同じように解決することの単体テスト。2台のデバイスのマージの回帰テストを、2つの記録の両方の入力順で実行します。フォージが現在作っているroomで、デバイスAが(9,3)にベッドを、デバイスBが(6,4)にナイトテーブルを置く。それぞれの配置は単独では配置チェック全体を通る。両方が同期されたあと、repairはどちらの順でも同じ部屋を返し、uidの小さい方の家具を残し、もう一方をケースの名前を挙げたメッセージとともにトレイに入れ、到着セルからの歩行はケースの手前の両方のセルにまだたどり着く。2つのuidを入れ替えると、もう一方の家具が残る。66 repairが16個の正当なフロアを、記録をいくつもの順序に並べ替えても変えないことのテスト。1つのフロアにある17個の同期された家具が、上限を除けば一緒に置いても正当である場合に、16個になって戻り、uidの最も大きいものがトレイに入ることのテスト。まっさらな状態で起動し、それぞれが最初の家具を作る2台のデバイスが、どちらの同期順でも、最初のセルごとに1つの記録、1フロア8個に同期され、トレイには何もないこと、そしてもう一方が起動する前に一方のデバイスで動かした最初の家具が、動かした場所にとどまることのテスト。トレイのアイテムをセルにドラッグし、そのセルにPlacedPieceがあることを確かめるUIテスト。VoiceOverを通さず、配置モデルに対して直接呼び出す、VoiceOverのアクションハンドラの単体テスト。「配置」は到着セルに最も近い正当なセルに椅子を置く。「左へ移動」「右へ移動」「上へ移動」「下へ移動」はそれぞれ1セル動かすか、理由とともに拒否する。「回転」は向きを順に切り替える。「片付ける」はトレイに戻す。そしてすべての拒否が、画面が送るアナウンスの文を生成する。iOS 27のシミュレータで、XCUIVoiceOverServiceでVoiceOverをオンにし、配置された家具にフォーカスを移して、ソファ、3×2、9列目、8行目のような読み上げラベルを確かめるUIテスト。63 配置モードをperformAccessibilityAuditで監査し、問題が報告されないこと。62 VoiceOverをオンにしたデバイスでの手動チェックを、日付とビルドとともに記録すること。XCUIAutomationには、カスタムアクションを実行し、ローターを回し、アナウンスを読む呼び出しがないからです。トレイから椅子を置き、アクションで4方向に動かし、回転させ、片付け、「家具」ローターで家具のあいだを移動し、拒否された移動ごとのアナウンスを聞きます。これらすべての前に、スパイクを1つ行います。シミュレータで、カメラの実際の倍率のもとで部屋にペイロードをドロップし、計算されたセルと指の下のセルをログに記録します。この対応づけはまだテストされていないからです。

7.8 整理項目

  • WORLD.mdに、このブリーフの数字とともに部屋のルールを入れ、設計ドキュメントが世界編の記事の公開した内容を述べるようにします。6710
  • interiors.pyのdocstringと表を、どちらかの形で一致させます。docstringが小さな家具を例外と明記するか、小さな家具を2タイルで描き直すかです。ブリーフは小さな家具を残します。9

このブリーフに含めないもの

  • 棚自身のスポットを超える積み重ね。テーブルの上に家具を置くことも、ぬいぐるみを机に載せるような台もなし。台の発想は、上限と歩行が実証されたあとの次の段階です。
  • 上を歩くと動く家具。音のマットも、ばねも、すべり台もなし。
  • 半セルの配置。グリッドは16ピクセルの整数セルのままです。
  • ショーホールの家具配置。その台座は週替わりのショーのものであり続けます。
  • 家具配置のコンテスト。週替わりのホールがコンテストであり、独自のルールで審査されます。
  • 間取り。家の形は変わりません。
  • 共有の広場の外にいる見知らぬ人への訪問と、ホスト自身の合計を超える部屋のランキング。

家具配置について、決してしないこと

  1. そのどれにもフランチャイズの語彙を使わない。基地、模様替えのパソコン、アカデミー、レコードのミックス、どのグッズの名前も使わない。Kiradex自身の言葉だけを使います。本記事でゲームの名前を挙げるのは、機能としてではなく、公開された作品についての事実としてです。
  2. ゲームのグッズをもとにした家具を描かない。クリーチャーのぬいぐるみやクッション、ボールの形をしたもの、クリーチャーのポスター、技の名前が付いたマットは描きません。フォージの家具は家庭の家具であり、そうあり続けます。
  3. どの部屋にもクリーチャーを置かない。植物は植物です。
  4. 購入、ランダム、限定の家具はなし(7.5)。
  5. 部屋のなかのものは、狙ったり、投げたり、捕まえたり、呼び出したり、戦わせるために放ったり、乗ったりしない。
  6. 逆コンパイルのコードやデータを、アプリにもフォージにも入れない。逆コンパイルされたソースは研究と測定のためのものであり、上のルールはKiradex自身の言葉で言い直したものです。

受け入れチェック。 文字列カタログ、フォージのPIECESの名前、サーバーのテーブルを、項目1のフランチャイズの語彙から作った単語リストに「decoration」「doll」「Happy Home」「Academy」を加えたもので検索し、何も返ってこないこと。

重要なポイント

アートを描く人へ

  • 家具はキャラクターのコマまたはセルの幅で描きましょう。エメラルドのプレイヤーのコマは16ピクセルのセル1つ分の幅で、グッズの平均は2.43セルです。Kiradexのコレクターは幅2タイルのセルに立ち、家具の平均は3.04セルです。2729
  • カタログは小さな家具を中心にし、大きな要の家具をいくつか加えましょう。エメラルドの120個のグッズのうち71個は1セルで、机と3×3のマットが、小さなグッズを載せる要になっています。224
  • 壁紙と床はルールとランプから描きましょう。そうすればスタイルは新しい絵ではなく、描画処理とパレットになります。2つの壁面を3つのランプで、3つの床を2つのランプで描けば、Kiradexにはそれぞれ6種類ができます。64

エンジンを作る人へ

  • 配置された家具は、種類、セル、向きとして保存しましょう。エメラルドは1個を2バイトで、基地1つを32バイトで保存しています。1112
  • 配置はセルごとに確かめ、それから歩きましょう。エメラルドのセルごとのチェックは、ドアからまだ何かにたどり着けるかを一度も問いません。Kiradexの1階では、追加の家具2つの正当な組み合わせ229,891通りのうち713通りが、覆うことなく階段、ホスト、展示のいずれかを切り離します。420
  • CloudKit同期では、SwiftDataは一意制約を強制できないので、1セルに1つという条件は、どのデバイスでも同じ勝者を選ぶ純粋な修復関数にします。その関数には、歩行を含む配置チェック全体を通して、固定の順序で部屋を組み立て直させましょう。それぞれのスマートフォンでは通る2つの編集が、一緒になると展示を切り離すことがあるからです。225266
  • VoiceOverには、スワイプでたどるグリッドではなく動詞を与えましょう。名前付きの移動アクション、家具のローター、すべての拒否に対するアナウンスです。586061

ゲームのループを設計する人へ

  • 制限するのは所持ではなく配置です。エメラルドは16個を置き、150個を保管します。上限こそが構図です。2
  • 採点は決まった曜日に、すべての得点源を列挙して行い、基準を上げるのは家が大きくなったときだけにし、逃した週を決して罰しないこと。ゲームを特定していないwikiの家のページは、少なくとも1週間放置した家にゴキブリがわくとし、New HorizonsのHHAの表はゴキブリ1匹につき2,500点を差し引きます。56
  • カタログはプレイで増やしましょう。エメラルドは120個のグッズのうち24個を一度もお金で売らず、さらに2個は歩いて集めた火山灰でしか売りません。Stardewは最初の増築後に200,000gのカタログを売り、そのカタログは掲載している家具を0gで売ります。そしてHabboの希少でランダムな家具は、子ども向けアプリにとっての反例です。14151617
  • 訪問者は見るだけで触れず、決して下がらない合計に1日1回のいいねを残します。51819

よくある質問

プレイヤーが1つの部屋に置けるアイテムはいくつにすべきですか?

構図を組めるだけの数で、選ぶ必要があるくらい少なく。『ポケットモンスター エメラルド』は基地に置けるグッズを16個、寝室を12個に制限しており、これは平均的な基地の歩けるセル60.2のおよそ4分の1です。Nookipediaの説明によれば、Animal Crossing: New Horizonsは壁と天井のアイテムを含めて1部屋150個を認めており、Final Fantasy XIVはパッチ7.5以降、家の広さに応じて屋内150から600個を認めています。壁や天井のレイヤーがない2Dの部屋については、床3セルにつき1個未満という上限が私のしきい値で、エメラルドの0.27はそのわずかに下に収まります。Kiradexが提案する16個は、床1セルあたり0.13です。2579

『ポケットモンスター エメラルド』の模様替えシステムはどう動いていますか?

データです。120個のグッズはそれぞれ、カテゴリ、1から9セルの形、価格、そして5つの許可(固い床、上を歩ける床、背後、壁、スプライト)のうち1つを持っています。CanPlaceDecorationは覆われる各セルを確かめます。普通の床であること、オブジェクトがないこと、プレイヤーが立っていたセルではレイヤー種別が通常でないタイルがないこと。ポスターには壁のセル。ぬいぐるみとクッションには台のセルで、ほとんどは小か大、1×2のぬいぐるみには大が必要です。小さな台のセルを持つグッズは18個で、机7個、レンガ3個、タイヤ1個、マット7個です。配置されたグッズは、それぞれIDと位置の1バイトずつで保存されます。2411

ハッピーホームアカデミーはどうやって部屋を採点しますか?

New Horizonsについて出典を示していないNookipediaの表によれば、ほとんどの日曜の朝に郵便で評価が届き、ランクはB、A、S、Sの基準は家が大きくなるにつれて15,000から90,000に上がり、1部屋のアイテムが6、10、15、20個に達するごとに1,000点、シリーズ、セット、カテゴリ、主となる色、風水についてアイテムごとのボーナスがあり、ゴキブリ、ゴミ、壁を向いたアイテムには減点があります。アイテムごとの得点は、wikiでは書きかけです。6

CloudKit同期のもとで、SwiftDataはグリッドの1セルに1つのアイテムを強制できますか?

#Uniqueではできません。SwiftDataの同期についてのAppleのガイドは、一意制約を「that CloudKit doesn’t support natively」(CloudKitがネイティブにはサポートしない)機能のなかに挙げており、CloudKitはすべてのリレーションシップがオプショナルであることを求めます。すべてのプロパティに既定値を与え、何も一意にせず、1つのセルに乗った2台のデバイスの家具は、読み込みのたびに実行され、どのデバイスでも同じ勝者を選ぶ純粋関数で解決しましょう。その関数には、重なりのテストだけでなく配置チェック全体を通して、固定の順序で部屋を組み立て直させます。それぞれは正当な2つの編集が、一緒になるとルールを破ることがあるからです。225166

ドラッグ&ドロップの家具グリッドをVoiceOverで使えるようにするには?

配置された各家具を、ラベルに大きさとセルを含む1つのアクセシビリティ要素にし、各方向に1セル動かす、回転する、片付けるという名前付きのアクションを与え、部屋の家具を一覧にするローターを加え、拒否されたすべての移動をその理由とともにアナウンスします。AppleのaccessibilityAction(named:_:)、accessibilityRotor(_:entries:)、AccessibilityNotification.Announcementがそれぞれの部分をまかない、performAccessibilityAuditがUIテストで画面を確かめます。監査は名前付きのアクションを押さず、Xcode 27.0ではXCUIAutomationのどの呼び出しも押さないので、アクションハンドラは直接テストし、アクション、ローター、アナウンスはVoiceOverをオンにして手で確かめましょう。5860616263

子ども向けのゲームは家具を売るべきですか?

9+と評価されたアプリについては、私の読みでは「いいえ」です。購入、ランダム、希少性に頼る飾り付けのループは、ゲームに不要なルートボックスや課金圧力の問題を抱え込みます。エメラルドは120個のグッズのうち24個を一度もお金で売らず(景品、バトルポイントとの交換品、贈り物です)、さらに2個は歩いて集めた火山灰でしか売りません。Stardewは、最初の家の増築が済むと家具カタログを200,000gで売り、そのカタログは掲載している家具を0gで売りますが、博物館、お祭り、その他の入手先でしか手に入らない家具も残ります。レアやランダムな割れるレアを伴うHabboの購入主導の経済は、その反対の端を示しています。14151617

これらのゲームで訪問者が読み取り専用なのはなぜですか?

私の読みでは、部屋はホストの表現だからです。Animal Crossingの訪問者は「modify the interior in any way」(内装をいかなる形でも変更すること)ができず、Habboの訪問者はオーナーの権限なしに家具を置くことも動かすこともできず、Club Penguinのオーナーは自分のイグルーは飾れても「but not other player’s igloos」(他のプレイヤーのイグルーは飾れない)とされます。その代わりに訪問者が得るのは、数に残るしるしです。Club Penguinの、決して減らないGrand Totalに対する、デザインごとに1日1回のいいねです。518819

このサイトの関連記事:ピクセルアートの建物:iPhoneでの家、ホール、室内は、このブリーフが家具を置く室内を作った記事で、その室内の節はビルド26が置き換えた14×11の部屋を説明しています。iPhoneでつくるピクセルアートの世界は、16個の上限、読み取り専用の訪問、1日1回のいいね、日曜のレポートが最初に公開された記事です。ピクセルアートの人物:iPhoneでのキャラクターとクリエイターは、その幅が家具のリズムを決めるコレクターを扱っています。ピクセルアートの町のレイアウト:マサラタウンからペリカンタウンまで実測は、家々が建つ町を測定しています。ピクセルアートの動き:iPhoneでの歩行、カメラ、ドアは、訪問者が通ってくる歩行とドアを扱っています。そしてピクセルアートの道路:iPhoneでのマップの接続と地区は、町の外の土地を扱っています。

出典


  1. pret、pokeemerald/include/constants/global.h(SECRET_BASES_COUNT 20、DECOR_MAX_SECRET_BASE 16、DECOR_MAX_PLAYERS_HOUSE 12)、コミット731ad5b(2026年10月1日)、2026年10月5日閲覧、https://github.com/pret/pokeemerald/blob/master/include/constants/global.h ↩↩↩↩↩

  2. 著者による測定、2026年10月5日:measure_emerald_decor.py(本記事用の著者の証拠フォルダ内)、出力はmeasure_emerald_decor.outとして保存。pretのpokeemeraldのコミット731ad5bのシャロークローンに対して実行。上限はinclude/constants/global.hから、120個のグッズ(DECOR_NONEを除く)のカテゴリ、形、許可、価格はsrc/data/decoration/header.hから、カテゴリ別の所持品の配列はinclude/global.hから、各グッズのメタタイルの挙動バイトはdata/tilesets/secondary/secret_base/metatile_attributes.binから、24の基地レイアウトと寝室のそれぞれはdata/layouts/layouts.jsonとそのmap.binから読み取り、歩けるセルは衝突ビットから数える。グッズごとのセル数は形の名前から。上限を歩けるセルの平均で割ると16 / 60.2 = 0.27。 ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  3. pret、pokeemerald/src/data/decoration/header.h(gDecorations[]:グッズごとの名前、許可、形、カテゴリ、価格、タイル。エントリ0はDECOR_NONE)、コミット731ad5b、2026年10月5日閲覧、https://github.com/pret/pokeemerald/blob/master/src/data/decoration/header.h ↩↩↩↩

  4. pret、pokeemerald/src/decoration.c(CanPlaceDecoration、DecorationItemsMenuAction_AttemptPlace、isPlayerRoom、gText_CantPlaceInRoom。スプライトのグッズに対する台のセルのチェック)、コミット731ad5b、2026年10月5日閲覧、https://github.com/pret/pokeemerald/blob/master/src/decoration.c 。スプライトの場合、1×2のグッズはMetatileBehavior_HoldsLargeDecorationを必要とし、それ以外は小か大の台のセルを受け入れる。IsntInitialPositionがプレイヤーの開始セルを拒否するのは、そこにかかるグッズのタイルのレイヤー種別がMETATILE_LAYER_TYPE_NORMAL以外の場合だけ。関数のどこにも通路を確かめる処理がないというのは、著者によるこの関数の読みである。 ↩↩↩↩↩↩↩↩↩↩

  5. Nookipedia「Player house」(部屋ごとの上限:Wild Worldで24、City Folkで64、New Leafで48、New Horizonsで「including wall and ceiling-mounted furniture」の150。New Horizonsの部屋の広さを含む増築表。「only the main room can be expanded in size」。2.0からのアクセントウォール。訪問者は「modify the interior in any way」できない。家を「for at least one week」放置したプレイヤーの家にはゴキブリがわく)、2026年10月5日に取得し、部屋編の証拠フォルダにnook-player-house.htmlと.txtとして保存、https://nookipedia.com/wiki/Player_house 。1タイルあたり4.2個は著者の計算(150 / 36)。 ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  6. Nookipedia「Happy Home Academy」(日曜の評価。増築ごとのB、A、Sの段階。New Horizonsの得点ボーナスと減点。New Horizonsのアイテムごとの得点についての「This section is a stub」。報酬の表の注記「Includes data sourced from the Data Spreadsheet for Animal Crossing New Horizons」)、2026年10月5日に取得し、nook-hha.htmlと.txtとして保存、https://nookipedia.com/wiki/Happy_Home_Academy 。ボーナスと減点の表には、ページ上で出典が付いていない。 ↩↩↩↩↩↩↩↩↩↩↩↩↩

  7. Square Enix、The Lodestone、Final Fantasy XIVパッチ7.5のノート(2026年5月13日更新。ハウジングの節にある屋内と屋外の家具の上限の変更前と変更後。400個の表示についての注記。「Furnishings from the FFXIV Furnishing Design Contest have been added」)、2026年10月5日に取得し、ffxiv-patch-7-5.htmlと.txtとして保存、https://eu.finalfantasyxiv.com/lodestone/topics/detail/9beb8a7b5c46944cd80ed92b2b8e972395fbea80/ 。ハウジングのプレイガイド https://na.finalfantasyxiv.com/lodestone/playguide/contentsguide/housing/ は同日HTTP 404を返した。区画の広さは本記事では出典を示していない。 ↩↩↩↩↩↩↩↩↩↩

  8. Club Penguin Wiki(Fandom)「Furniture」(ほとんどの家具の所持上限99。「igloos have a limit preventing more than 99 units of furniture being placed at once」。オーナーは自分のイグルーを飾れるが「but not other player’s igloos」。2012年7月26日の非会員向けの無料アイテム6つ)、wikiのMediaWiki APIを通じて読み、2026年10月5日にcp-fandom-furniture.htmlと.txtとして保存、https://clubpenguin.fandom.com/wiki/Furniture 。単一の情報源。 ↩↩↩↩↩↩

  9. 著者による測定、2026年10月5日:measure_kiradex_interiors.py(部屋編の証拠フォルダ内)、出力measure_kiradex_interiors.out。Kiradexのリポジトリのscripts/forge/interiors.pyをPythonのastで解析する(ファイルはインポートも実行もしない)。PIECESの23のエントリと、その幅、高さ、自立のフラグ。ROOM、ROOM_UP、HALLの文字マップと、その家具のリストとスポット。床のセルは文字o t s rとして数える。動かせる家具からはstairs、stairs_down、pillarを除く。 ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  10. Blake Crosley「Pixel-Art Worlds on iPhone: What the 16-Bit Masters Knew」、blakecrosley.com、2026年10月3日(部屋のルール:「a furnishing cap of sixteen」、読み取り専用の訪問、1日1回のいいね、決して減らない合計、「with its point sources listed」の日曜のレポート。同じ段落の「Patron flair stays on the name-plate and the room skin」。Palworldの訴訟で挙げられた特許。1テクセルあたりのデバイスピクセルによるカメラのフィット)、https://blakecrosley.com/blog/pixel-art-world-on-iphone ↩↩↩↩↩↩↩↩↩↩

  11. pret、pokeemerald/include/global.h(秘密基地の記録にあるu8 decorations[DECOR_MAX_SECRET_BASE]とu8 decorationPositions[DECOR_MAX_SECRET_BASE]。セーブデータにあるカテゴリ別のグッズの所持品の配列)、コミット731ad5b、2026年10月5日閲覧、https://github.com/pret/pokeemerald/blob/master/include/global.h ↩↩↩↩↩↩↩

  12. pret、pokeemerald/src/secret_base.c(グッズの位置を、上位4ビットをx、下位4ビットをyとして読む)、コミット731ad5b、2026年10月5日閲覧、https://github.com/pret/pokeemerald/blob/master/src/secret_base.c ↩↩↩

  13. pret、pokeemerald/include/decoration.h(enum DecorationPermissionとコメント「The nomenclature here describes collision and placement permissions, in that order.」。DECORSHAPE_3x1とDECORSHAPE_1x3が未使用と記されたenum DecorationShape)、コミット731ad5b、2026年10月5日閲覧、https://github.com/pret/pokeemerald/blob/master/include/decoration.h ↩↩↩

  14. 著者による測定、2026年10月5日:measure_emerald_sources.py(部屋編の証拠フォルダ内)、出力measure_emerald_sources.out。pokeemerald 731ad5bのなかで、data/maps/*/scripts.incのpokemartdecorationリスト、景品コーナーのスクリプト、src/data/battle_frontier/battle_frontier_exchange_corner.hにあるバトル施設の交換表、そしてdata/以下のあらゆる場所にあるgivedecorationとadddecorationの第1引数から、すべてのDECOR_定数を検索する。5つのショップでお金で売られるもの90、景品交換所3、バトルポイント15、スクリプトで贈られるもの10、お金で一度も売られないもの24、そのどれにもないもの6。6つのうち2つはガラス工房の組(注15)で、残りの4つ、伝説のぬいぐるみ3つとほかのぬいぐるみ1つは追跡していない。 ↩↩↩↩↩↩↩↩

  15. pret、pokeemerald/data/maps/Route113_GlassWorkshop/scripts.inc(PRETTY_CHAIR_PRICE, 6000、PRETTY_DESK_PRICE, 8000、VAR_ASH_GATHER_COUNTから支払う。Route113_GlassWorkshop_EventScript_NotEnoughAshと_NotEnoughAshForItemは価格から数を差し引き、その差をあと歩くべき歩数として表示する。src、data、includeを検索すると、VAR_ASH_GATHER_COUNTは定義を除けばそことfield_tasks.cでしか使われていない)とpokeemerald/src/field_tasks.c(袋を持っているあいだ、灰の草むらを1歩歩くごとに灰1つ、9999まで)、コミット731ad5b、2026年10月5日閲覧、https://github.com/pret/pokeemerald/blob/master/data/maps/Route113_GlassWorkshop/scripts.inc および https://github.com/pret/pokeemerald/blob/master/src/field_tasks.c ↩↩↩↩↩↩↩

  16. Stardew Valley Wiki「Furniture」、リビジョン193159(Robinと行商人のカートは「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」。カタログの表にある家具カタログの行で、大工の店(Carpenter’s Shop)で200,000g。「Some furniture can be obtained only by donating items to the Museum」、お祭り、カジノ、その他の入手先。緑と赤の配置の四角)、2026年10月5日に取得し、sdv-furniture.htmlと.txtとして保存、https://stardewvalleywiki.com/Furniture ↩↩↩↩↩↩↩↩↩↩↩

  17. Sulake、Habboヘルプセンター「Furni Definitions」(トレーダーのために「4-12 months」出し控えるキャンペーン家具、「will never be re-released」のレア、割れるレア家具、「in limited quantities」のLTD)、記事本文を2026年10月5日に部屋編の証拠フォルダのhabbo-articles.txtに保存、https://help.habbo.com/hc/en-us/articles/360011621699-Furni-Definitions ↩↩↩↩↩↩↩

  18. Sulake、Habboヘルプセンター「What is Furni?」(「To buy furni you need credits, diamonds or duckets」。「You can’t drop or manipulate furni in other Habbo’s rooms unless you’re a member of a group」)、記事本文を2026年10月5日にhabbo-articles.txtに保存、https://help.habbo.com/hc/en-us/articles/360011512940-What-is-Furni ↩↩↩↩↩↩↩

  19. That Penguin Game「Your Igloo」(Club Penguinのヘルプページの再現。その出所は確認していない。「You can Like any igloo design once every day!」。個別のいいねとGrand Total Likes。「Likes are permanent, so your Grand Total Likes will never decrease, even if you delete an igloo design!」。EveryoneとFriendsの設定)、2026年10月5日に取得し、tpg-your-igloo.htmlと.txtとして保存、https://thatpenguingame.com/club-penguin-help/game-help/your-igloo/ 。単一の情報源。 ↩↩↩↩↩↩

  20. 著者による測定、2026年10月5日:measure_path_rule.py(記事の草稿の隣に保管)、出力measure_path_rule.outとpath_rule.json。Kiradexのリポジトリのscripts/forge/interiors.pyをastで解析し、書き出される文字をexport()と同じように組み立て直し、各フロアの到着セルからotsrUD(フォージのcheck()の歩ける集合)の上を4方向に歩き、階段、ホスト、各飾り付けスポットの手前のセル(棚と壁帯を過ぎてまっすぐ南にある最初のセル)を報告する。続いてroomで、到着、階段、ホストのセルから離れた空いている床の上に、自立する追加の家具1つ(10の絵。椅子は1回、ベッドは1回)を置くすべての配置(733通り。44通りが目標を切り離し、すべて目標を覆うことによる)と、すべての目標から離れた重ならない追加の家具2つのすべての組(単独の配置689通り、組229,891通り。713通りが目標を切り離す)を試す。 ↩↩↩↩↩↩↩↩↩↩

  21. 著者による計算、2026年10月5日:草稿フォルダのfigures/にあるscore_max.py、出力score_max.outとscore_max.json。ブリーフのスコアの表を、両フロア16個で各行をその上限にして合計したもの(3,200 + 3,000 + 6,400 + 9,600 + 500 + 600 + 300 = 23,600)と、セット、ランプ、スポットの行なしで8個の1フロア(800 + 500 = 1,300)。同じスクリプトは、提案する家の等級のしきい値を決める3つの基準となる家を、表自身の行で採点する。両フロア10個で棚がいっぱいの家は4,500。両フロア16個で棚、ケース、ボードがいっぱいの家は7,600。その家に各フロアで8個のスイートと70%の1つのランプを加えたものは14,000。そして最初の家、両フロア8個は2,600。 ↩↩↩↩

  22. Appleのデベロッパドキュメント「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を2026年10月5日にapple-swiftdata-cloudkit-sync.htmlと.txtとして保存、https://developer.apple.com/documentation/swiftdata/syncing-model-data-across-a-persons-devices ↩↩↩↩↩↩

  23. pret、pokeemerald/src/new_game.c(NewGameInitDataがClearDecorationInventories()を呼ぶ)とpokeemerald/src/decoration_inventory.c(ClearDecorationInventoryは各カテゴリのすべての枠をDECOR_NONEにする)、コミット731ad5b、2026年10月5日閲覧、https://github.com/pret/pokeemerald/blob/master/src/new_game.c ↩

  24. 著者による図、2026年10月5日:草稿フォルダのfigures/にあるmake_figures.py。pokeemerald 731ad5bのsrc/data/decoration/header.h、注1、5、8、7で引用した上限、path_rule.json、score_max.jsonを読み、すべての合計を上の測定と照合して確かめ、emerald-decor-sizes.svg、caps.svg、room-path-rule.svg、score-sources.svgを書き出す。占有範囲の区分(1セル、2セル、4から6、8または9)は、形を覆うセルの数でまとめたもの。パレットはdatavizのバリデータで確認済み。ゲームのアートは使っていない。 ↩↩↩↩↩

  25. pret、pokeemerald/include/constants/metatile_behaviors.h(MB_SECRET_BASE_*の挙動、MB_SLIDE_SOUTH、MB_HOLDS_SMALL_DECORATION、MB_HOLDS_LARGE_DECORATION)、コミット731ad5b、2026年10月5日閲覧、https://github.com/pret/pokeemerald/blob/master/include/constants/metatile_behaviors.h ↩

  26. pret、pokeemerald/data/layouts/layouts.json(24のLAYOUT_SECRET_BASE_*レイアウトと2軒のプレイヤーの家の2階、その幅と高さ)と各レイアウトのmap.bin、コミット731ad5b、2026年10月5日閲覧、https://github.com/pret/pokeemerald/blob/master/data/layouts/layouts.json 。幅、高さ、面積の範囲は、測定の出力から著者が求めたもの。 ↩

  27. 著者による測定、2026年10月5日:measure_character_cell.py(部屋編の証拠フォルダ内)、出力measure_character_cell.out。pokeemeraldのgraphics/object_events/pics/people/brendan/walking.png(144×32)とdecorating.png(16×32)のPNGヘッダー、そしてKiradexのリポジトリのKiradex/Resources/World/characters.jsonにあるセル(32×40)、figureTop(7)、underFeet(2)を読む。このスクリプトが測るのはセルと人物の高さ(31ピクセル)であり、描かれた人物の幅ではない。 ↩↩↩↩↩

  28. pret、pokeemerald/src/data/items.h(ITEM_SOOT_SACK、.fieldUseFunc = ItemUseOutOfBattle_CannotUse)とpokeemerald/src/data/text/item_descriptions.h(sSootSackDesc、3行の固定の説明文)、コミット731ad5b、2026年10月5日閲覧、https://github.com/pret/pokeemerald/blob/master/src/data/items.h ↩↩

  29. Nookipedia「Furniture」(「ranging from 1.0×0.5」から3×3までの大きさ。半タイル単位で押すこと。New Horizonsの家具の種類と、2.0からの天井の装飾。3.0.2時点で2,076点の家具、うち1,074点はアップデートで追加。「around 10 furniture items, as well as a matching wallpaper and flooring」のシリーズ)、2026年10月5日に取得し、nook-furniture.htmlと.txtとして保存、https://nookipedia.com/wiki/Furniture ↩↩↩↩

  30. Nookipedia「Wallpaper」(バージョン1.9.0時点でNew Horizonsの壁紙262点)、2026年10月5日に取得し、nook-wallpaper.htmlと.txtとして保存、https://nookipedia.com/wiki/Wallpaper ↩

  31. Nookipedia「Flooring」(New Horizonsで215点)、2026年10月5日に取得し、nook-flooring.htmlと.txtとして保存、https://nookipedia.com/wiki/Flooring ↩

  32. Nookipedia「Luna」(New Leafの節:「any changes will not be saved and items cannot be brought back to the real world」。New Horizonsの節:彼女のサービスは「work the same as they do in New Leaf」、アップロードごとに5,000ベル相当のDream Bell Exchange Ticket)、2026年10月5日に取得し、nook-luna.htmlと.txtとして保存、https://nookipedia.com/wiki/Luna ↩↩

  33. Sulake、Habboヘルプセンター「Rooms」(「You can own 200 rooms.」。「Wallpaper and flooring are stuck down」)、2026年10月5日に取得し、habbo-rooms.htmlと.txtとして保存、https://help.habbo.com/hc/en-us/articles/360011512640-Rooms ↩↩↩↩

  34. Sulake、Habboヘルプセンター「What is Builders Club?」(家具の上限は会員である1か月ごとに「increased by 250」。フロアプランエディタでの独自の部屋レイアウトの保存)と「What can I buy in Habbo?」(「Furni limits never go down.」)、記事本文を2026年10月5日にhabbo-articles.txtに保存、https://help.habbo.com/hc/en-us/articles/360011621659-What-is-Builders-Club および https://help.habbo.com/hc/en-us/articles/360011620599-What-can-I-buy-in-Habbo ↩

  35. Sulake、Habboヘルプセンター「Player to player trading in Habbo」(取引パスが必要。「There is no guide to what items of furni are worth」)、記事本文を2026年10月5日にhabbo-articles.txtに保存、https://help.habbo.com/hc/en-us/articles/4408726781842-Player-to-player-trading-in-Habbo ↩↩

  36. Sulake、Habboヘルプセンター「Guidelines on user created games in Habbo」(「Placing more than three chance elements will disable all randomiser functions in the room.」)、記事本文を2026年10月5日にhabbo-articles.txtに保存、https://help.habbo.com/hc/en-us/articles/360011513060-Guidelines-on-user-created-games-in-Habbo ↩

  37. Sulake、Habboヘルプセンターの検索API、「furni」「stack」「floor plan」の結果セット、2026年10月5日に部屋編の証拠フォルダにhabbo-search-furni、habbo-search-stack、habbo-search-floorplan(.htmlと.txt)として保存。グリッドの大きさ、積み重ねの高さ、1部屋あたりの家具の上限を示すものはない。 ↩

  38. billsonnn、nitro-react/src/components/floorplan-editor/common/Constants.ts(MAX_NUM_TILE_PER_AXIS = 64、HEIGHT_SCHEME = 'x0123456789abcdefghijklmnopq'、空のxのあとに27段階の高さ)、サードパーティのオープンソースのHabboクライアント、2026年10月3日の構造編の記事での引用による、https://github.com/billsonnn/nitro-react/blob/main/src/components/floorplan-editor/common/Constants.ts 。積み重ねの高さのツールの範囲(0から40まで0.01刻み)は私の以前のメモにあるもので、同じクライアントから読み取り、2026年10月5日には読み直していない。 ↩

  39. Blake Crosley「Pixel-Art Structures: Houses, Halls and Interiors on iPhone」、blakecrosley.com、2026年10月3日(室内は「each 14 by 11, with a two-row wall band」。ビルド22、23、そして夜の追記での35。「Rooms have no wallpaper or floor choice and no placeable furniture; the house is dressed from the collection and nothing else」。room:npc-…のワープ。オブジェクトのメッシュ。Stardewの農家の家は内側で「10×7」、注54。Nitroの定数、注62)、https://blakecrosley.com/blog/pixel-art-structures-on-iphone ↩↩↩↩↩↩↩↩

  40. 著者による測定、2026年10月5日:measure_sdv_catalogue.py(部屋編の証拠フォルダ内)、出力measure_sdv_catalogue.out。保存した家具のページ(rev 193159)で、各行の名前のリンクからセクションごとに家具の行を数える。行が別のマークアップを使っている映画ポスターのセクションと、References、History、Exploitsのセクションは飛ばす。壁紙と床は、保存した壁紙のページ(rev 193801)と床のページ(rev 190285)の異なるアイコンとして数える。家具カタログを入手先とする行は、そのリンクで数える。wikiの行とアイコンの数であり、ゲームのデータファイルの数ではない。 ↩↩↩↩

  41. Stardew Valley Wiki「Wallpaper」、リビジョン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」)、2026年10月5日に取得し、sdv-wallpaper.htmlと.txtとして保存、https://stardewvalleywiki.com/Wallpaper ↩↩↩↩

  42. Stardew Valley Wiki「Flooring」、リビジョン190285、2026年10月5日に取得し、sdv-flooring.htmlと.txtとして保存、https://stardewvalleywiki.com/Flooring ↩

  43. Club Penguin Wiki(Fandom)「Igloo」(歴史:2005年11月1日、会員でないプレイヤーにもイグルー。彼らは「were unable to decorate them with furniture」。2012年7月26日、新しいイグルー体験と「a set of six items available without membership」)、MediaWiki APIを通じて読み、2026年10月5日にcp-fandom-igloo.htmlと.txtとして保存、https://clubpenguin.fandom.com/wiki/Igloo 。引用されている公式ブログのアーカイブ記事は、2026年10月5日にWayback MachineからHTTP 429を2回返した。単一の情報源。 ↩↩

  44. Club Penguin Wiki(Fandom)「Igloo Contests」(第9号、2005年12月15日の最初のコンテスト、優勝者1人に5,000コイン。優勝者の発表は「After one to four weeks」。2008年のハロウィンのコンテストからのキャラクターによる審査。2009年からの応募ボタン。2012年12月の最後のコンテスト。2008年のYe Olde Igloo Contestの優勝者10人に25,000コイン、次点20人に15,000コイン)、MediaWiki APIを通じて読み、2026年10月5日にcp-fandom-contests.htmlと.txtとして保存、https://clubpenguin.fandom.com/wiki/Igloo_Contests 。単一の情報源。 ↩

  45. Tristan Donovan「The Replay Interviews: Will Wright」、Game Developer、2011年5月23日、2026年10月5日に取得し、gd-replay-wright.htmlと.txtとして保存、https://www.gamedeveloper.com/business/the-replay-interviews-will-wright 。ビルドモードについてWrightが1999年または2000年に語った記録は見つからなかった。 ↩↩

  46. The Sims Wiki(Fandom)「Buy mode」(「purchase items from an object catalog and place them on the current lot」。The SimsとThe Sims 2での機能による分類。ページ上でThe Sims 2とThe Sims 3に結びつけられた、緑と赤の足元の一文)、MediaWiki APIを通じて読み、2026年10月5日にsims-fandom-buymode.htmlと.txtとして保存、https://sims.fandom.com/wiki/Buy_mode 。単一の情報源。 ↩↩↩

  47. The Sims Wiki(Fandom)「Environment」(RoomとEnvironmentの欲求。「analyzes the design and content of the room that the Sim is currently standing in」)、MediaWiki APIを通じて読み、2026年10月5日にsims-fandom-environment.htmlと.txtとして保存、https://sims.fandom.com/wiki/Environment 。単一の情報源。 ↩

  48. 著者による抽出、2026年10月5日:measure_apple_docs.py(部屋編の証拠フォルダ内)、出力measure_apple_docs.out。保存した各AppleドキュメントのJSONページから、タイトル、宣言、概要、プラットフォームを抜き出す。dropDestination(for:action:isTargeted:)について引用した非推奨のフィールドは、同じ保存済みJSONから読み取った。 ↩

  49. Appleのデベロッパドキュメント、Model()(SwiftDataのマクロ。「Converts a Swift class into a stored model that’s managed by SwiftData」。iOS 17.0)、JSONを2026年10月5日にapple-swiftdata-model.htmlと.txtとして保存、https://developer.apple.com/documentation/swiftdata/model() ↩

  50. Appleのデベロッパドキュメント、Unique(_:)(SwiftDataのマクロ。「Specifies the key-paths that SwiftData uses to enforce the uniqueness of model instances」。iOS 18.0)、JSONを2026年10月5日にapple-swiftdata-unique.htmlと.txtとして保存、https://developer.apple.com/documentation/swiftdata/unique(_:) ↩

  51. Kiradexのリポジトリ、Kiradex/Models/CardCopy.swift(ドキュメントコメント:「every property has a default and nothing is unique, for CloudKit」)、2026年10月5日閲覧。 ↩↩↩

  52. Kiradexのリポジトリ、Kiradex/Models/PriceHistory.swift(ドキュメントコメント:「Shaped for CloudKit like CollectionEntry: defaults everywhere, nothing unique」。PriceBookは2台のデバイスの履歴を「into the one with the smallest uid」畳み込む)、2026年10月5日閲覧。 ↩↩↩↩

  53. Appleのデベロッパドキュメント、draggable(_:)(SwiftUI。「Activates this view as the source of a drag and drop operation」。Transferableのペイロード。iOS 16.0)、JSONを2026年10月5日にapple-swiftui-draggable.htmlと.txtとして保存、https://developer.apple.com/documentation/swiftui/view/draggable(_:) ↩↩

  54. Appleのデベロッパドキュメント、dropDestination(for:action:isTargeted:)(SwiftUI。([T], CGPoint) -> Boolのaction、第2引数は「the drop location in this view’s coordinate space」。iOS 16.0。iOSのプラットフォームの項目はdeprecatedAtを27.2とし、メッセージ「Use dropDestination(for:isEnabled:action:) with an action that takes a DropSession parameter instead.」を添える。DropSessionの参照「A description of a drop that is in progress」)、JSONを2026年10月5日にapple-swiftui-dropdestination.htmlと.txtとして保存、https://developer.apple.com/documentation/swiftui/view/dropdestination(for:action:istargeted:) ↩↩↩↩↩

  55. Appleのデベロッパドキュメント、DragGesture(SwiftUI。「A dragging motion that invokes an action as the drag-event sequence changes」。iOS 13.0)、JSONを2026年10月5日にapple-swiftui-draggesture.htmlと.txtとして保存、https://developer.apple.com/documentation/swiftui/draggesture ↩↩

  56. Appleのデベロッパドキュメント、SpatialTapGesture(SwiftUI。「A gesture that recognizes one or more taps and reports their location」。iOS 16.0)、JSONを2026年10月5日にapple-swiftui-spatialtap.htmlと.txtとして保存、https://developer.apple.com/documentation/swiftui/spatialtapgesture ↩↩

  57. Appleのデベロッパドキュメント、accessibilityElement(children:)(SwiftUI。iOS 13.0)、JSONを2026年10月5日にapple-swiftui-accessibilityelement.htmlと.txtとして保存、https://developer.apple.com/documentation/swiftui/view/accessibilityelement(children:) ↩↩

  58. Appleのデベロッパドキュメント、accessibilityAction(named:_:)(SwiftUI。「Actions allow assistive technologies, such as the VoiceOver, to interact with the view by invoking the action」。iOS 16.0)、JSONを2026年10月5日にapple-swiftui-accessibilityaction-named.htmlと.txtとして保存、https://developer.apple.com/documentation/swiftui/view/accessibilityaction(named:_:) ↩↩↩↩

  59. Appleのデベロッパドキュメント、accessibilityAdjustableAction(_:)(SwiftUI。AccessibilityAdjustmentDirectionを受け取るハンドラ。iOS 13.0)、JSONを2026年10月5日にapple-swiftui-adjustable.htmlと.txtとして保存、https://developer.apple.com/documentation/swiftui/view/accessibilityadjustableaction(_:) ↩↩

  60. Appleのデベロッパドキュメント、accessibilityRotor(_:entries:)(SwiftUI。「Create an Accessibility Rotor with the specified user-visible label」。iOS 16.0)、JSONを2026年10月5日にapple-swiftui-accessibilityrotor.htmlと.txtとして保存、https://developer.apple.com/documentation/swiftui/view/accessibilityrotor(_:entries:) ↩↩↩↩

  61. Appleのデベロッパドキュメント、AccessibilityNotification.Announcement(Accessibility。「A notification that an app posts when it needs to convey an announcement to an assistive app」。iOS 17.0)、JSONを2026年10月5日にapple-swiftui-accessibilitynotification.htmlと.txtとして保存、https://developer.apple.com/documentation/accessibility/accessibilitynotification/announcement ↩↩↩↩

  62. Appleのデベロッパドキュメント、performAccessibilityAudit(for:_:)(XCUIAutomation、XCUIApplication。iOS 17.0。JSONはXcode 16.3を挙げ、概要を持たない)、JSONを2026年10月5日にapple-xctest-accessibilityaudit.htmlと.txtとして保存、https://developer.apple.com/documentation/xcuiautomation/xcuiapplication/performaccessibilityaudit(for:_:) ↩↩↩

  63. Apple、Xcode 27.0(ビルド27A266a)のXCUIAutomationフレームワークのヘッダー、iPhone Simulatorプラットフォーム、2026年10月5日閲覧:XCUIApplication.h(performAccessibilityAuditWithAuditTypes:issueHandler:error:、「Runs an accessibility audit on the current view」)。XCUIVoiceOverService.h(「Provides programmatic control of VoiceOver for UI testing」。有効化、無効化、前、後ろ、内、外への移動、現在の読み上げ。iOS 27.0)。XCUIDevice.h(voiceOverServiceプロパティ、iOS 27.0)。フレームワークのすべてのヘッダーをカスタムアクション、ローター、アナウンスで検索したが、何も見つからなかった。 ↩↩↩

  64. Kiradexのリポジトリ、scripts/forge/interiors.py(「every piece at least two tiles on one axis」を含むモジュールのdocstring。ROOM、ROOM_UP、HALLの文字マップ、家具のリスト、スポット、ワープ。hostのコメント「where the owner stands when you visit」。PIECES、FACES、EXPORT_LETTERS、export()、そしてcheck()。そのスポットのチェックは到着、階段、ホスト、棚、ショーケース、机、台座のスポットを対象とし、壁のボードは対象としない。重なりのループは書き出された自立する家具であるdata["objects"]を読む)、2026年10月5日閲覧、実行はしていない。 ↩↩↩↩↩↩↩↩↩↩↩↩↩

  65. Kiradexのリポジトリ、docs/TestFlight.md、項目46(「Build 26: the interior kit. Rooms sixteen wide with a three-row wall band (cornice, face, wainscot)」)、2026年10月5日閲覧。このビルドにはファイル内で日付がない。構造編の記事がどちらも2026年10月3日としているビルド23とビルド35のあいだに入る。 ↩↩

  66. 著者による計算、2026年10月5日:草稿フォルダのfigures/にあるmerge_regression.py、出力merge_regression.out。フォージが作ったままのroom(動かせる家具13個。path_rule.jsonと、Kiradexのリポジトリのscripts/forge/interiors.pyをastで読み取る)で、(9,3)のベッド単独と(6,4)のナイトテーブル単独はそれぞれセルのルール、上限、歩行を通るが、両方そろうと、ケースの手前の2つのセルである(7,3)と(8,3)を切り離す。2つをuidで並べ、それぞれを配置チェック全体を通して加える修復は、uidの小さい方を残してもう一方を戻し、両方の入力順でも、両方のuidの割り当てでも同じ結果になる。切り離す713の組がどれも家具1つずつでは正当であることは、measure_path_rule.outから導かれる。目標から離れた単独の配置で目標を切り離すものはない。 ↩↩↩↩↩

  67. Kiradexのリポジトリ、docs/WORLD.md(第4節:コインショップの「clothes, hats, backpacks, card-display frames and emotes」、level = floor(sqrt(XP / 40)) + 1、「that cannot be bought」のレベルで解放されるコスメティック、Full Set、Vintage、Across the Seaを含むピン。「a 30-pixel figure in a 32 × 40 cell」としてのコレクター)、2026年10月5日閲覧。sixteen、cap、decoration、furnishing、Sunday、once a day、read-onlyで検索したが、どれも部屋のルールを述べていない。 ↩↩↩↩↩↩

  68. Kiradexのリポジトリ、server/app/rooms.py(モジュールのdocstring:「Everything here is in memory; a room empties when its last collector leaves and nothing of them is kept.」)、2026年10月5日閲覧。 ↩↩↩↩

  69. Kiradexのリポジトリ、docs/research/pixel-art/06-collecting-and-hubs.md、5.3節(「Rooms: a budget, a Sunday letter, and a like that never goes down」:上限16、「a pixel object that appears on the doormat」としての日曜の手紙、読み取り専用の訪問、訪問者1人につき1日1回のいいね、「a stamp on their passport per room visited, with ranks at 30 / 100 / 500」)と5.7節(パトロン向けアイテムは「one room skin」を含み、「never a bigger furnishing cap」)、2026年10月5日閲覧。 ↩↩↩↩↩

  70. Kiradexのリポジトリ、Kiradex/World/Quests.swift(Quest.current(on:calendar:)。カレンダーのweekOfYearの区間をキーにし、その区間はカレンダー自身の週の最初の曜日から始まる)とKiradex/World/HallView.swift(コメント「The week’s theme is the week’s quest」と、週替わりのクエストのタイトルとして読まれるテーマ)、2026年10月5日閲覧。 ↩↩↩

  71. Kiradexのリポジトリ、docs/PROTOTYPES.md(週替わりのクエストのプロトタイプでのテスターへの質問「Weekly reset on your calendar’s week: say if it feels wrong.」)、2026年10月5日閲覧。 ↩

  72. 著者による計算、2026年10月5日:草稿フォルダのfigures/にあるlayout_size.py、出力layout_size.out。種類の数は、現在のフォージから21(床の種類17と壁のアイテム4)、7.5節で新たに3、合わせて24。保存する家のレイアウト(2フロア、それぞれ種類、x、y、向きを持つ家具16個、フロアごとにスタイルID 2つ)を名前付きのキーを持つコンパクトなJSONにし、すべての種類を提案中の最も長い名前(pressed_flower、14文字)に、すべてのスタイルIDを16文字にすると1,974バイト。すべての種類を16文字に埋めると2,038バイト。32個の家具の整数の4つ組だけなら385バイト。 ↩↩

  73. Kiradexのリポジトリ、Kiradex/World/PlazaStage.swift(@AppStorage("plaza.id")、「Who this device is to the plaza」。@AppStorage("quests.stamps")、コンマで連結したリストとしてのクエストのスタンプで、QuestBoardViewとMeViewからも読まれる。@AppStorage("plaza.ribbons")、「Ribbons from the town’s collectors」)、2026年10月5日閲覧。アプリのSwiftソースで、保存された歩数や訪問した部屋の記録を検索したが見つからず、アプリとサーバーで歩数計、歩数の型、パスポートを検索しても見つからなかった(stepsはTileMap.swiftとPlazaRig.swiftの歩行の経路だけ)。 ↩↩↩↩↩

  74. Kiradexのリポジトリ、Kiradex/Models/Progression.swift(Progressionのドキュメントコメント:経験値、レベル、ピンは「worked out from the collection as it is, so every device agrees without anything being stored」)、2026年10月5日閲覧。 ↩↩

  75. Appleのデベロッパドキュメント、AppStorage(SwiftUI。「A property wrapper type that reflects a value from UserDefaults」。iOS 14.0)、JSONを2026年10月5日にapple-swiftui-appstorage.htmlと.txtとして保存、https://developer.apple.com/documentation/swiftui/appstorage ↩↩

  76. 著者による計算、2026年10月5日:草稿フォルダのfigures/にあるskin_denominator.py、出力skin_denominator.out。ブリーフのランプの行から求める。16個の家具のうち15個と床のスタイルが1つのランプ系統にあり、壁がその外にある1フロアは18のうち16(88.9%)で、70%の行で1,600点。壁を割合から外すと17のうち16(94.1%)で、90%の行で4,800点、3,200点多い。 ↩

  77. Kiradexのリポジトリ、Kiradex/Models/Profile.swift(同期されるプロフィール上のvar lookData: Data = Data()。init(handle:)でUUID().uuidStringに設定されるvar uid: String = ""で、PriceHistoryとCardCopyもuidを持つ。ModelContext.profile()の224行目から237行目は、プロフィールをuid順に並べて取得し、最初のものを残して残りを削除する。コメントはこれを最小のuidへの畳み込みと呼んでいる)、2026年10月5日閲覧。 ↩↩↩

関連記事

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 分で読める

ピクセルアートの道:iPhoneでつくるマップ接続と地区

ポケモン、Stardew Valley、どうぶつの森は町と町のあいだの土地をどう作っているのか。道路、継ぎ目、ゲート、マップ画面をソースから測り、Kiradexのためのブリーフにまとめました。

87 分で読める

iPhone Duoへのアプリ対応:実例でたどる準備と提出

iPhone Duo向けにアプリを準備して提出する方法。レイアウトを切り替えるSDKスタンプ、実アプリで全ポーズを歩いた結果、スクリーンショット、App Storeのルールまで。

46 分で読める