画面レイアウト

概要

ゲーム画面全体の骨格——エリアの分割・寸法・縦横対応——を決めるドキュメントです。個別の表示要素は 別の文書が扱います: ステータスの表示は StatusArea.md、カードと枠の見た目は CardView.md、子ウィンドウは Windows.md、カードの操作と 時間経過の見せ方は CardInteraction.md です。

画面を等分するのではなく、カード寸法(205×320u)を基準に各エリアの寸法を積み上げます(1 節)。 単位は u(画面短辺 ÷ 1080)で、オプションバー・ダッシュボード・フィールド・フィルターバーの 各領域を、縦型・横型で同じ要素のままグリッドの配置換えだけで組み直します。

実装は src/game/PlayScene.ts(寸法計算は src/game/looks/PlayScreenLayout.ts)で、本書の寸法 トークンをそのまま使います(12 節)。レイアウトは HTML モック(13 節)で検証済みで、Phaser 側も 実装済みです。本書に未実装の節はありません。

1. 設計原則

2. 寸法トークン

要素 寸法 (u)
カード 205 × 320(ブリッジ版 57:89 に相当)
レーン高 352(カード + 上下 15)
カード間ギャップ 12
レーン間・外周マージン 6
エリアの区切りの帯 高さ 12(レーン間マージンの 2 倍。中央半分が区切り、上下 3 ずつは隣へかぶる)
スクロールバー 高さ 8、送られるカードの下端との間隔 3(カードの下の余白 16 の中に置く)、つまみの最小長 48
情報エリアの余白 フィールドエリア側 32、それ以外の辺 24(背景のページの縁を避ける)
フィールドエリアの最小幅 縦型 1079・横型 1085(カード 5 枚 1073 + 外周マージン。3.1 節)
オプション・フィルターボタンの間隔 20(カード間ギャップより広めに確保し、隣接ボタンの誤タップを防ぐ)
状況エリア高 縦型 128、横型 184(横型は幅が日時 1 つ分しかなく、天候名を別の段へ分けるため高い)
状況エリアの内側の余白 縦型 24×16・横型 20×16(空は四辺いっぱいに敷き、載せ物だけがこの内側)
縦型のページの上辺 24(状況エリアを外へ出して上端が画面の途中に来たので、左右と同じ縁を見せる)
ダッシュボード列幅(横型) 478(日時のフリップカード 406 + 左右パディング 20×2 + 紙の余白 32)
日時フリップカード 日数の桁(3 桁)64×88、時刻の桁 44×60、「:」の確保幅 10、桁間 2、日数と時刻の間 14(縦型・横型共通)
オプションバー高・フィルターバー高(縦型、内容量に応じた自動、共通) 約 120(アイコンボタン 88 + 上下パディング 16×2)
右サイドバー幅(横型、オプション/フィルター共有) 120(バー厚みと同じ。アイコンボタン 88 + 左右パディング 16×2)。フィールドエリアに余剰があるときだけ 2 列の 240(10.1 節)
ポートレイトカード 205 × 320(フィールドカードと同サイズ、縦型・横型共通)
キャラクター表示エリア高 余白 16 + ポートレイト 320 + ギャップ 12 + 状況アイコンの行 48 + 下の余白。縦型 444(下 48)、横型 412(下 16)
キャラクター表示エリアの内側余白 16(縦型の下だけ 48。この辺が背景のページの下端=表紙の縁に当たるため)
アイコンボタン 88 × 88(最小タップ領域。オプションボタン・フィルターボタンも共用)
地図・装備・怪我・レシピボタン 168 × 72(列の上下に 16 の余白。間隔は残りから決まる)
地図・装備・怪我・レシピボタンのアイコン 145 × 64(どれも同じ。物の大小は絵の側が持つ)
状況アイコン 48 × 48(1 行に 4 つまで。4.1.1 節)
探索ウィンドウのプログレスバー 高さ 72、幅はウィンドウ幅(フィールドエリアと同程度)から内側余白 32×2 を引いた残り

3. 情報エリア (Information Area)

フィールドエリアの左(横型)・上(縦型)にまとまっている、キャラクターエリアです。 オプションバーと状況エリアは含みません(どちらも本の外側に置きます)。

背景は 1 枚の本のページ(src/assets/ui/information_background.png)で、内訳の各エリアは自前の 背景色を持たず、このページの上に直接載ります。

中身は紙の内側に収めます(informationContent)。内訳の各エリアはこの範囲へ配置し、エリア自身の パディングはその内側でさらに効きます。余白は辺によって決め方が違います。

辺 余白 決め方
フィールドエリア側(横型は右・縦型は下) 32u 縁の幅(48u)から食い込ませる幅(16u)を引いた残り
それ以外(横型は上下・縦型は左右) 24u 縁が角でカーブしていて幅が一定でないため、絵から導かず見た目の余白として置く

この制約が次の寸法を決めています。

3.1 3 レーンとカード 5 枚は必ず確保する

フィールドエリアの 3 レーン(1080u)と、レーンに見えるカード 5 枚は、どの画面比でも必ず確保 します。 3 レーンが無いと手持ち・足元・現在地のどれかが見えず、プレイ自体が成り立ちません。 カードが 5 枚見えていないと、場に何があるかを見比べるより先に送る操作が要ります。

u は向きごとの設計寸法が縦横とも収まる最大値(= 短辺 ÷ 1080 を上限に、足りない軸のぶんだけ 縮めた値)にします(ScreenMetrics)。カードは小さくなりますが、レーンが欠けたりカードが 5 枚 見えなかったりするよりは読めます。

向き 幅 (u) 高さ (u)
縦型 1080(9:16 の基準。フィールドエリアが画面幅そのもの) 1920(オプションバー 120 + 情報エリア 600 + フィールドエリア 1080 + フィルターバー 120)
横型 1683(ダッシュボード列 478 + フィールドエリア 1085 + 右サイドバー 120) 1080(3 レーンぶん)

先に足りなくなる軸は向きで逆です。 縦型は短辺が幅なので高さが、横型は短辺が高さなので幅が 足りなくなります。9:16 より正方形に近い縦型では u が長辺 ÷ 1920 まで、16:9 より正方形に近い横型 では短辺 ÷ 1080 から長辺 ÷ 1683 まで縮みます。

カード 5 枚に要る幅は、レーンの外周マージンの内側の 1073u(カード 205×5 + ギャップ 12×4)です。 横型のフィールドエリアが 1085u なのは、左右の辺に区切りの帯がかぶる(本と右サイドバーとの境目、 7.6 節)ぶんの外周マージン 6u×2 を足すためです。縦型は右端が画面の端そのもので、レーンからはみ出した カードもそのまま見えるので、外周マージン 1 つぶん(1079u)で足り、基準の 1080u が既にこれを満たして います。

縦型と違い、横型は縮めたぶんの高さが余ります(4:3 なら 1262u)。余りは 3 レーンが背を伸ばして 吸収し、カードはレーンの中央に並びます。外に残すと、区切りの帯で囲った枠が画面の端から離れて 見えるためです。

3.2 縦長の画面の余り

キャラクターエリアは内容量ぶん(444u)だけ確保し、引き伸ばしません。 9:16 より縦長の端末で 余った高さは、オプションバーの上に余白として残し、画面外の色(COLOR.outsideScreen、Phaser の キャンバスの地の色と同じ)で塗り潰します。

スマートフォンでは画面上端に指が届きにくく、そこまで使い切る価値が薄いためです。余白は情報エリアの 外側なので、はみ出した背景のページごと塗り潰します。

3.3 情報エリアの区切り線

背景が 1 枚の紙になり、エリアごとの塗り分けが無くなったため、意味のまとまりの境目だけを線で示します。 見た目は現在地カードの右の区切り線と同じ(太さ 4u・黒 35%)です。

状況エリアとの境目には引きません。状況エリアは本の外にあり、境目は本の外側の区切りの帯 (7.6 節)が受け持つためです。

向き 位置
横型 ステータスエリアの上(キャラクター表示エリアとの境目)
縦型 ステータスエリアの左(同上)

4. キャラクターエリア (Character Area)

キャラクター表示エリアとステータスエリアで構成します。 両者は縦型では左右、横型では上下に隣接します。ステータスエリアに何をどう出すかは StatusArea.md が扱います。

4.1 キャラクター表示エリア (Character Display Area)

縦型・横型で同じ組み方です(横型は幅だけが列いっぱいに広がります)。いずれもポートレイト カードに重ねず、通常のフロー内に配置します(ボタンの仕様は 1 節の設計原則を参照)。

4.1.1 状況アイコンに何を出すか

出すのは、キャラクタの周りが今どうなっているかのうち、操作の可否を変えているものだけです。 画面を見ただけでは分からない環境の事情を、それが効いている間だけ目に見せる場所です。

どの段でどの絵を出すかは、世界の側の宣言が決めます。 段 (GameElementDefinition.md 6.4 節の stages)へ絵の識別子を 1 つ書けるようにし(situation)、その段に居る間だけ、その識別子の絵を出します。書かない段では 出ません。UI はプロパティの意味も段の意味も知らないので、出すものが増えても画面の側に足すものは ありません——ステータスエリアが status タグと alert から出し分けているのと同じ形です (StatusArea.md 1 節・2 節)。

looking_brightness:
  stages:
    - name: pitch_dark
      situation: no_road      # この段に居る間だけ、no_road の絵を出す
    - name: dim
      min: -5
      situation: too_dark_outside
    - name: bright
      min: 3                  # 書かない段では出ない

4.1.2 今の宣言で出せるもの

出しているのは、手元と視界の明るさ、身に当たっている風雨、そして屋根の下です。 明るさと風雨は 段が既にあり、sheltered は 0/1 の値へ段を足すだけで届きました。

出すもの 見る値 段(名乗る識別子) 何が変わるか
手元が暗い hand_brightness(キャラクタ) pitch_dark・dim(どちらも too_dark_for_handwork) レシピの工程と、暗いと形を損なう手作業が通らない(IlluminationSystem.md 5 節)
外が暗い looking_brightness(キャラクタ) dim(too_dark_outside) 探索と屋外の採取が通らない(同 5 節)
道が見えない looking_brightness pitch_dark(no_road) 上に加えて、陸の道を歩けない(同 5 節)
屋根の下 sheltered(キャラクタが場所から継ぐ) 1 の側(sheltered) 雨が当たらない。雨の日でも火を起こせ、雨に打たれて体温を失わない——何が変わるかを決めるのは読む側それぞれなので、ここに挙げるのは代表だけ(ContainerSystem.md 6 節)
風雨に晒されている wind_speed(キャラクタが場所から継ぐ) gale(too_stormy) 嵐の日、屋外の採取も探索も道の移動も手元の作業も通らない(ContentSkeleton.md 8.1.4 節)

4.1.3 まだ出せないものと、何が入れば出せるか

足りないのは絵ではなく、世界の側の値です。 どれも「出す形」は 4.1.1 節のまま使えます。

出したいもの 何が足りないか
暑さ・寒さ 寒い側は体が受け取る形を持ちました(キャラクタの warmth、VitalsSystem.md 8.3 節)が、寒い場所に居ることを引ける段がありません——寒さは気温と chill_point の比較で決まり、段は 1 つのプロパティの値域でしか引けないためです(下の「雨に打たれている」と同じ形の不足)。暑い側は受け取る形からありません——熱中症にあたるプロパティが無く、今の気温が動かしているのは画面の陽炎(7.5.4 節)だけで、操作の可否を何も変えていません。度合いはステータスエリアが(StatusArea.md 8 節)、暑い/寒い場所に居ることは状況アイコンが出す分担です
周囲の蚊 世界に蚊がありません。虫刺されも病気も無いので、値も段もありません。入るときは場所の側のプロパティ(core.yaml の location trait)として持つのが素直で、そのとき出すのは 4.1.1 節の 1 行の宣言だけで済みます
雨に打たれている 「守られているか」(sheltered)と「降っているか」(weather)を 2 つのプロパティが別々に持っており、段は 1 つのプロパティの値域でしか引けません。出すなら、両方から押される濡れ具合のプロパティを場所かキャラクタへ足す必要があります

4.2 ボタンの絵

地図・装備・怪我・レシピのボタンの絵は src/assets/icons/<アイコンの識別子>.png に置きます。 識別子は map・equipment・injury・recipe で、コード側への登録は要りません (src/art/iconArt.ts)。

状況アイコンも同じ置き場所と規約です(4.1.1 節)。違うのは識別子を誰が決めるかで、あちらは出るものが 世界の宣言とともに増えるため、UI ではなく段の側が名乗ります。

5. 状況エリア (Situation Area)

空を敷いた 1 本の帯で、日時と天候の名前をその上に載せます(WeatherPanel)。本の外側の 最上部——縦型はオプションバーの直下に画面幅いっぱい、横型はダッシュボード列の上端に列幅いっぱい——に 置きます。オプションバーと同じ扱いなので、角は丸めず、四辺に余白も残しません。空は四辺いっぱいに 敷き、内側の余白(縦型 24×16・横型 20×16)は載せ物だけに効きます。

高さは載せ物の分しか取りません。 空は絵として見せるものですが、日時の上に広く余らせても 情報は増えないためです。縦型は日時 1 段ぶん、横型は天候名と日時の 2 段ぶんです。

天候はアイコンではなく絵と名前で表します。 絵だけでは晴天どうしを区別できないので名前は 必ず出しますが、アイコンを添えると名前と同じことを二度言うことになるため、絵に語らせて アイコンは持ちません。名前は言語ごとの対応表の symbol_texts 節から引きます (Localization.md)。

載せ物は絵の主題(太陽・雲)を置く右上を必ず空けます。

向き 日時 天候名
縦型 窓の左下 窓の右下(下端は日時と揃える)
横型 窓の下端(左右中央) 窓の左上

横型が上下に分かれるのは、ダッシュボード列の幅(446u)が日時のフリップカード(406u)で ほぼ埋まり、名前を横に並べる余地が無いためです。そのぶん状況エリアは縦型より高くなります。

日時は押しボタンです。 押すとキャラクタ自身の子ウィンドウが開き、休息を選べます (Windows.md 4 節)。時間を進める操作の入口をここに置くのは、選んだ結果が現れるのが この時計だからです。

日時の各桁は白い紙の画像(flip_digit.png)に黒い数字を載せたもの。画像はカードの枠と同じ 生成テクスチャから組み立て、留具の穴・リング・落ち影まで描き込んである (tools/comfyui/recipes/flip_digit.json)。窓の下端に付けるので、桁の紙は絵の下側に重なります。 空の絵はここを白く抜かない約束なので(5.1 節)、明るい空でも白い紙が沈みません。

5.1 空の絵

置き場所は src/assets/weather/<天気の識別子>.png のみで、コード側への登録は要りません (src/art/weatherArt.ts)。天気の識別子は light_rain などのプロパティの値 (ClimateSystem.md 4.2 節)です。

6. オプションバー (Options Bar)

設定・図鑑・日記・メニューのアイコンボタンを置くバーです。低頻度の操作なので、 通常のフロー内で他のエリアと重ならない位置に固定します。縦型では画面最上部 (キャラクターエリアの直上)に横長バーとして置きます。高さはフィルターバーと同じ 上下パディング 16u を確保した自動サイズ(約 120u)にし、ボタンの上下の余白がフィルター バーより狭く見えないようにしています。横型ではフィールドエリア右のサイドバー上段に置き、 アイコンボタンを縦に並べます(下段はフィルターバー、サイドバーの詳細は 10 節)。ボタンの 間隔はカード間ギャップ(12u)より広い 20u とし、隣接ボタンを誤タップしにくくしています。

アイコンボタンもスロットボタンと同じ紙として扱います(4.2 節)。落ち影を持たせ、枠線は黒では なく地に合う暗い色にします(オプションバーは COLOR.paperButtonBorder、フィルターバーは藤色の地に 合わせた COLOR.filterButtonBorder)。

アイコンの絵は 4.2 節と同じ置き場所・同じ規約です(src/assets/icons/<識別子>.png)。識別子は settings・codex・diaryと、フィルターのfilter_allとワールドが名乗るもの(card_filtersの id、8.1.3 節)。どれも同じ寸法(160×160px)で持ち、UI は同じ大きさ(80×80u)で敷きます。 ボタンが正方形なので、キャンバスも正方形にします(スロットボタンの横長キャンバスと 違い、縦横で使える量が変わりません)。役割に大小は無いので、物の大小も付けません—— スロットボタンで地図と包帯の大きさを描き分けたのとは、そこだけ扱いが違います。

敷く大きさは画面によっても変えません。 ボタンが並び切らない画面でも 88u のまま並べ、はみ出した 分は送って見せます(8 節)。縮めれば全部が同時に見えますが、88u はアイコンボタンの最小タップ領域 (2 節)なので、見えることと引き換えに押せなくなります。

絵は絵文字を下絵にして作ります(tools/comfyui/emoji_page.py)。設定・料理・水のような役割は、 生成に任せると毎回ちがう物が出てきて、押す前に何のボタンか読めません。形と配置は絵文字から借り、 質感だけを Qwen Image Edit で描き直します。絵がまだ無いものは絵文字のまま(88u のボタンに対して 58u)で、絵と絵文字が混ざった状態を正常とします。

メニュー(☰)だけは絵にしません。物ではなく記号なので、質感を与える対象がありません。

7. フィールドエリア (Field Area)

カードを配置する主要な描画領域です。上から設置物レーン・アイテムレーン・ ハンドレーンの 3 レーン(各 352u 高。正方形に近い横型では、余った高さを 3 つで分け合って 高くなります——3.1 節)で構成し、各レーンは独立に横スクロールできます。 レーンに並ぶカードと枠の見た目は CardView.md、カードの操作は CardInteraction.md が扱います。

7.1 設置物レーン (Fixture Lane)

現在地の設置物(fixtures スロット)を表示します。道・木・建物・家具など、持ち歩けないものが すべてここに入ります。道も設置物の一種なので、木や建物と同じ並びに置かれます。

左端には現在地カードをピン留めし、区切り線を挟んで右に設置物を並べます。ピン留めはレーンの中身では レーンの見出しで、タップすると現在地そのものの子ウィンドウが開きます。探索はそのタブ (Windows.md 5 節)で、「探索する」は他のアクションと同じ最下段のボタンです。 横型では画面の横幅を活かし、カード 5 枚(ピン留め含む)強が視界に入ります。

道のカードは、道そのものではなく行き先の土地の名前と絵を出します。 道は「どこへ繋がっているか」 だけが意味を持ちますし、土地の景色と別々に描いた道の絵は、どの景色に載せても人の目には不自然に 映るためです。地に敷く景色は他の設置物と同じで、今いる土地のものです。

そのぶん、道であることは枠の色と、桟の中央の右向き矢印が 示します。 名前も絵も行き先のものなので、これが無いと現在地のカードや他の設置物と見分けが 付きません。先に読めるのは色のほうで、矢印は色を確かめる側です。

矢印は 22×11u で、紙の色の塗りに枠の色の縁にします。桟の色は種別で変わるので、塗り一色では 沈む組み合わせが出ます。絵文字(➡)ではなく図形で描きます——字を持たないフォントでは豆腐に なりますし、絵文字として描かれると環境ごとに色も形も変わってしまうためです。線ではなく塗り潰した 矢羽根にするのは、細い線だとカードを縮めて並べたときに何の形か読み取れなくなるからです。

持ち歩けない設置物(ヤシの木)はどのレーンへも送れないので端の操作を持ちませんが、同じレーンの 中でなら並べ替えられます。地形をどう捉えているかはプレイヤーごとに違うので、並び順はプレイヤーが 決めます。

7.1.1 外側の場所へ切り替える

現在地がそれ自体さらに別の場所の中にあるとき——海に出た筏の上、住居や避難所の中——設置物レーンは 外側の場所の設置物へ切り替えられます。切り替えなければ外側は画面から丸ごと消え、外側に置かれるもの (海区で見つけた航路・漂流物)に手が届きません。

条件は入れ子になっていることだけで、乗り物かどうかは見ません。 「場所である」ことの証は fixtures スロットを持つことなので、筏も住居も同じ1つの仕組みに乗ります。

これはつなぎです。 最終形は、1つの設置物レーンに内側と外側の設置物が一緒に並ぶことで、切り替えは そこまでの間に合わせにすぎません。

7.2 アイテムレーン (Item Lane)

現在地に落ちているアイテム(items スロット)を表示します。持ち歩けるものだけがここに入り、 下端 1/6 を押すと手持ちへ移ります(CardInteraction.md 1 節)。横型では 設置物レーンと同様にカード 5 枚分強が視界に入ります。

同種のアイテムは手持ちと同じく 1 枚のカード(スタック)にまとまり、右上の丸数字が個数を出します (CardView.md 6 節)。

レーンの中身は items スロットそのもので、どの隙間へでも落とせます。

7.3 ハンドレーン (Hand Lane)

プレイヤーの手持ち(character の hand スロット)を表示します。レーンの幅はカード 6 枚分で 頭打ちにするため、横型でレーン幅が広がってもカードは引き伸ばしません。枠の数は人物ごとに違い (characters/*.yaml の hand)、レーンに収まらない枠は隠れます。hand は固定枠スロット (SlotSystem.md 3 節)で枠の位置が動かないため、空いている枠は 破線の枠だけのカードをプレースホルダーとして常に並べます。カードは上端 1/6 を押すと アイテムレーンへ戻ります。

枠の位置が動かないこと自体に用途があります。 ハンドレーンは「持って移動できるスロット」で あると同時にワーキングスペースでもあり、かごを右端に置いたまま左側を作業用に空けておく、と いった使い方を想定しています。持ち替えのたびに札が寄ると、この置き場所の取り決めが毎回崩れます。

ただし、レーンに入り切らない札があるときだけは左へ詰めます(PlayScreenView の packToFrontIfHidden)。縦型と、幅で決まる横型(縦横比 1.0〜1.558)のレーンはカード 5 枚ぶんの 横幅しか無く(3.1 節)、一度に見えるのは 5 枠までなので、6 枠目に居るカードは送らないと見えない ためです。詰めるのは次のすべてが揃うときだけで、揃わなければ枠の位置は動きません。

これは画面の都合による場当たりの割り切りで、スロットの規定ではありません。 詰めるのは表示では なくスロットの中身そのもので、画面の都合でワールドの側を変えています——手持ちの並びが端末の幅で 変わることになりますが、承知のうえです。見た目の層だけを詰めると、枠の位置とスロットの添字がずれ、 空き枠へ落としたカードが別の枠へ入ります。レーンの幅が足りるようになれば、この処理ごと消えます。

7.4 スクロールバー

各レーンの下端に、送り具合を示す半透明のスクロールバー(src/ui/ScrollIndicator.ts)を重ねます。 どのレーンのどこへ置くかを決めるのは src/game/ui/CardLane.ts です。 端のカードを見切らせるだけでは「まだ右にカードがある」ことに気付きにくく、視界に入る枚数が少ない 縦型のハンドレーンで特に見落とされるためです。

同じバーを、送れる他の場所——スロットの子ウィンドウ(レーンそのもの)、探索ウィンドウの 発見物の枠(Windows.md)、オプションバーとフィルターバー(8 節)——にも同じ規約で 置きます。発見物の枠にはレーンのような余白が無いので、カードの下に同じ 16u を足します(そのぶん ウィンドウが縦に伸びます)。縦に送る場所には同じバーを 90 度回して立てます——縦の区切りに横の帯の 絵を回して敷くのと同じで(7.6 節)、縦向きのバーを別に持ちません。置き場所は送られる範囲の終わりの 辺から 3u で、横型の右サイドバーではサイドバーの右端がそれに当たります。

7.5 空の演出

外の様子をフィールドエリアそのものへ映します。状況エリアの窓は情報エリアの端にある小さな絵なので、 カードの並ぶ場所が映す方が早く伝わるためです。演出はそれぞれ別のものを見ています。

演出 見ているもの 映す範囲 実装
翳り・輝き ambient_brightness(明るさ) 画面全体 src/game/looks/skyTint.ts
雨 weather(天気) フィールドエリア src/game/looks/rainStyle.ts
陽炎 居る土地の ambient_temperature(気温) フィールドエリアの3レーン src/game/looks/heatHaze.ts
日の出・日の入り 太陽高度が ambient_brightness へ与える寄与 フィールドエリア src/game/view/daylight.ts

日の出・日の入りだけが境目をまたいだ瞬間に一度だけ出て、ほかは今の外の様子を映し続けます (7.5.6節)。

7.5.1 明るさは世界の環境光が決める

天気ではなく ambient_brightness を見ます。 これは太陽高度と天気の寄与を1つに畳んだ実効値で、 夜は天気によらず底へ均される(IlluminationSystem.md 9節)ので、 真夜中の快晴が明るくなるような取り違えが起きません。雨が暗いのも同じ仕組みで表せます——雨雲が陽を 遮ることは、天気から明るさへの寄与として既に書かれているので、雨の側に暗さを持たせる必要がありません。

翳りも輝きも足さない基準は曇りの正午(+11)です。そこから暗いほど青みのある翳りが濃くなり、 明るいほど暖色の輝きが強くなります。輝きは加算合成にします——普通に重ねると白く濁って、明るくならずに 褪せて見えるためです。

暗さは、光が少し減っただけで大きく効かせます。 明るさはEVスケール(同1節)なので、正午の嵐と 曇りの差は5段——底から基準までの17段の3割ほど——ですが、目にはそれ以上に暗く映るため、翳りは明るさが 下がり始めた側で速く濃くなります。

7.5.2 翳り・輝きだけは画面全体にかぶせる

外の明るさは画面の一部の性質ではありません。 フィールドエリアだけが翳っていると、暗くなったと いうより、そこだけモーダルウィンドウで操作を止められているように見えます。情報エリアもバーも 子ウィンドウも、同じ明るさで同じだけ翳らせます。雨と陽炎がフィールドエリアに留まるのとは、ここが 違います——降る雨や地面の陽炎は外の景色そのもので、映すべき場所が決まっているためです。

7.5.3 雨

雨が強いほど、多く・長く・速く・斜めになります。小雨は鉛直に近く数も少なく、大雨は少し斜めで量が 増え、嵐は更に斜めで、雨粒より長く薄い風の筋が混じります。傾きは向きだけでなく落ちる向きでも あり、筋の向きと落ちる向きは常に一致させます——斜めに降る雨が縦に伸びていると、風の向きが読めない ためです。

7.5.4 陽炎

居る土地が暑いときだけ、レーンを1枚の熱い空気ごしに見せます(Phaserの変位フィルタ)。

7.5.5 対応表はUI側が持つ

今の空を映し続ける演出は、強さの対応表がUI側にあります。WorldCodexは表示に関わる値を持たない方針 (Localization.md)で、液体の色 (LiquidContainerSystem.md 4.1節)のようにドメインが意味を持つ値でも ないためです。表に無い天気では降らせません。天気が増えても画面は壊れず、表へ足すまで降らないだけです。

7.5.6 日の出・日の入り

日が昇った・日が沈んだ瞬間に、フィールドエリアの中央で太陽と月が入れ替わります。 空が染まり、 地平線の向こうから昇る側が現れ、替わりに沈む側が沈みます。日の出のときだけ、その上に DAY 10 と 日数が出ます。 数秒で醒め、跡は残りません。

出すのは「太陽の光だけで手元の細かい作業ができるか」が切り替わった瞬間です (IlluminationSystem.md 5節)。明るさが大きく動くのは日の出と日の入り ですが、その境目のどこで演出を出すかは、遊びの側で線が引かれているところ——手元の作業ができなく なる時刻——に合わせます。刻々と変わる明るさそのもの(翳り・輝き)とは別に、「今、できることが 変わった」を一度だけ告げるのがこの演出です。

日数は左上のカレンダーと同じ数(生存日数)です。 カレンダーは0時に次の日へ繰り上がるので、 日の出のときには既にその数を出しています——それでよいものとして、揃えに行きません。日が変わったこと そのものは時計が言っていて、この演出が言うのは「その日が始まった」ことだからです。

7.6 エリアの区切り

エリアの境目には木の梁の帯(src/assets/ui/separator.png)を敷きます。敷く場所は次のとおりです。

帯は中央半分だけが区切りそのもので、上下 1/4 ずつは隣のエリアへかぶせます。 そのため帯の高さは レーン間マージン(6u)の 2 倍の 12u を取り、境目の線に対して上下対称に置きます。レーンの区切りで かぶる 3u ぶんはレーン内側のカード上下の余白(15u)に収まるので、カードには重なりません。

8. フィルターバー (Filter Bar)

フィールドエリアに表示するカードをタグで絞り込むボタン列です。ボタンはオプションボタンと同じ アイコンのみの正方形ボタン(アイコンボタン、88×88u)を再利用し、ラベルは付けません。選択中の ボタンは背景色を反転させて強調します。縦型ではフィールドエリア直下に置き、ボタンを 1 行に 並べます。横型ではオプションバーと同じ右サイドバーに同居し、サイドバー 下段でボタンを縦に並べます。ボタンの間隔はオプションバーと同じ 20u です。

ボタンは先頭が「すべて」で、残りはワールドの card_filters が並べる順に出ます(8.1 節)。

バーに収まらない分は送って見せます(レーンと同じ扱い、1 節「レーンは横スクロール」)。並ぶ向き (縦型は横、横型は縦)へドラッグとホイールで送り、送れるときだけレーンと同じスクロールバーが出ます (7.4 節)。ボタンの寸法は画面によって変えません——88u はアイコンボタンの最小タップ領域(2 節) なので、収まらないことを縮めて解決すると、押せる大きさのほうが失われます。オプションバーも同じ 仕組みに乗り、どちらのバーも数が増減したときの扱いは変わりません。

8.1 絞り込みは、今の仕事に使う札だけを残す

ボタンを選んでいる間、そのボタンが指すタグをどれも持たない札をレーンから隠します。 選んで いない間は何も隠しません。以下の子節はすべてこのラベルの下にあります。

8.1.1 ボタンは、繰り返し払う支出の系統に対応させる

フィルターの一覧は ContentSkeleton.md 3 節の系統から作り、 同じ札の集まりを指す系統は 1 つのボタンへ畳みます。 画面の側で「よく使いそうなもの」を選ぶと、 なぜその顔ぶれなのかを誰も説明できず、世界に系統が増えても追随できません。

ボタン 系統 指すタグ
食 2 食の調達・3 保存 food・roastable・hearth・preservative
水 1 水 water・hot_water・liquid_container・container_lid
火 5 火 fuel・tinder・hearth
道具 4 刃物・打撃、6 狩りの道具 tool・weapon・trap・meat_bait・plant_bait・strike_target
入れ物 7 運ぶ入れ物 container・liquid_container・container_lid
身につける 8 衣類 equippable
住まい 9 寝床・10 住居・12 家具・娯楽 bed・shelter・furnishing
遠出 11 船と海図 path・sea_route・boat・sail

8.1.2 足りないタグは、フィルターの名前ではなく物の名前で足す

指したい集まりを既存のタグで言い表せないときは、「その物が何であるか」を言うタグを足します。 足したのは、雨風をしのげる住まいであることを言う shelter(浅い洞窟)、そこで眠れることを言う bed(敷物)、得た食を保たせる 物であることを言う preservative(塩)、海を渡る乗り物であることを言う boat(筏)、里心を抑える ために据える物であることを言う furnishing(家具・娯楽)、打ちかかる相手であることを言う strike_target(的)です。いずれも ContentSkeleton.md 3 節の系統に 1 対 1 で対応します。帆(sail)と 航路(sea_route)は在っても船そのものを指す語は無く、無いままでは遠出のボタンから筏が消えます。

タグは物に付いて初めて在るもので、付ける先が無いまま名前だけを置くと、誰も正しさを確かめないまま 残ります。 寝床であることを名乗るのは寝床そのものだけで、そこへ差し込む骨組みと詰め物 (Bedding.md 1 節)は名乗りません。

こうして足したタグは、フィルターが無くても正しい宣言です(GameElementDefinition.md 4.1 節)。filter_food のようにボタンの名前を持つタグは作りません(8.1.5 節)。

8.1.3 どのボタンがどのタグを指すかは、ワールド側の card_filters が持つ

ルートキー card_filters(GameElementDefinition.md 3.1 節)に、ボタンを並べる順に書きます。recipe_categories と同じく、分類のために別の語彙を 持ち込まず、既にあるタグを指すだけにします。

card_filters:
  - id: filter_food
    icon: 🍖
    tags: [food, roastable, hearth, preservative]
  - id: filter_water
    icon: 💧
    tags: [water, hot_water, liquid_container, water_source, container_lid]

8.1.4 中身が該当する札は、自分が該当しなくても残る

入れ物は、外から開いて中を見られるスロット(GameElementDefinition.md 7.11 節の visible_slots)に該当する物が入っていれば残ります。 入れ子は辿ります——袋の中の籠の 中の干し肉でも、袋が残ります。

8.1.5 フィルター専用のタグは作らない

採るのは 8.1.3 節の「ボタン 1 つが既存のタグを複数指す」ほうです。 採らなかった のは、物の側へ filter_food のようなタグを足してボタンとタグを 1:1 にする案で、理由は次のとおりです。

採る側の弱点は、指したい集まりを既存のタグで言い表せないと成り立たないことです。そのときに 足すのは 8.1.2 節のタグで、これはフィルターが無くても正しい宣言なので、増えても負債になりません。

8.1.6 絞り込むのは設置物レーンとアイテムレーンだけ

ハンドレーンは絞り込みません。 手持ちは固定枠で枠の位置が動かないこと自体に意味があり (7.3 節)、枠の数がレーンに収まる人物なら送らずに全部見えます——隠しても短くなりません。

8.1.7 絞り込みが隠している枚数は、そのレーンに出す【確定】

そうしないと、見えている札がそのレーンの全部なのかが読めません。空になったレーンでは物を置き 忘れたのかどうかが、札が残っているレーンでは残りが何枚あるのかが、レーンを見ても分かりません。

絞り込みが 1 枚以上隠しているレーンは、隠れている枚数を出します。

枚数を言います。 「絞り込み中」とだけ言う書き方は採りません。絞り込みを選んでいること自体は ボタンの強調が言っているので、レーンが足せるのは何枚隠れているかだけです。

出どころ: #656(枚数を言う規則だけ)

8.1.8 隠れている枚数は、先頭の空き枠に重ねる

重ねるのは先頭の空き枠 1 つだけです。 空き枠は札の後ろに出るので、「この先に隠れているものが N 枚ある」と読める並びになり、札の絵にもかぶりません。空き枠が複数あっても、隠れているという事実は 1 度言えば足ります。

空き枠が 1 つも無い並び(枠数の決まったスロットが埋まっている)では、末尾の枠に重ねます。 そこが並びの終わりで、続きがあることを言う場所として最も近いためです。

8.1.9 何を1枚と数え、どのレーンに出すか

8.1.7 節から導いたもので、覆すのに人間の判断は要りません。

9. 縦型レイアウト(1080×1920u)

エリア サイズ (u)
オプションバー 1080 × 約 120(本の外、幅いっぱい)
状況エリア 1080 × 128(本の外、幅いっぱい)
キャラクターエリア 1032 × 444
フィールドエリア 1080 × 1080(レーンに使えるのは外周マージンの内側 1074u で、カード 5 枚分と余り 1u)
フィルターバー 1080 × 約 120(最下部)

画面が 9:16 より縦長の端末では、余剰の高さはオプションバーの上に余白として残します (3.2 節)。左右が 1080u ではなく 1032u なのは、背景のページの縁を避けるためです(3 節)。

10. 横型レイアウト(1920×1080u)

左にダッシュボード列、中央にフィールドエリア、右に幅 120u のサイドバー(オプション/ フィルター)を置きます。オプションバーをダッシュボード列からサイドバーへ移した分で、 フィールドエリアにカード 6 枚分の横幅(1322u)を確保できます。サイドバー幅はバー自体の厚み(アイコンボタン 88 + 左右 パディング 16×2)と同じ 120u にし、ボタン左右の余白が広くなりすぎないようにしています。

サイドバーはボタンの数では太らせません。 フィルターは下段(636u)に並び切りませんが、 列を増やして幅を広げると、その分はフィールドエリアのカードの枚数から引かれます(1 節「フィールド エリア最優先」)。並び切らない分は送って見せます(8 節)。上段のオプションバーだけは高さを内容量 (アイコンボタン 4 個で 444u)ぶん取り、残りを下段が使います。太らせる理由になるのはフィールドエリアの余剰だけ で、その規則が 10.1 節です。

エリア サイズ (u)
状況エリア 478 × 184(本の外、ダッシュボード列の幅いっぱい)
ダッシュボード列 478 × 896(状況エリアの下。上からキャラクター表示・ステータス)
ダッシュボード列の中身 446 × 848(背景のページの縁を避けた範囲)
フィールドエリア 1322 × 1080(カード 6 枚分の横幅)
右サイドバー 120 × 1080(上段: オプションバー、下段: フィルターバー)

この表は余剰が無い画面のものです。フィールドエリアがカード 6 枚より多く表示できる画面では、 サイドバーが 240u の 2 列になります(10.1 節)。

画面が 16:9 より正方形に近い端末では、この 3 列が短辺基準の u では並びません。その場合は u を 縮めて幅 1683u を確保し(3.1 節)、フィールドエリアはカード 5 枚ぶん(1085u)まで狭まります。 この帯(縦横比 1.0〜1.558)は、どの寸法でも余りがちょうど 0 です——1085u は 3.1 節の最小幅 そのもので、6 枚目は 1u も入りません。1920×1080 の 1322u が 6 枚分なのは、16:9 が最小幅より 広いぶんをフィールドエリアが吸収した結果です。

キャラクター表示エリア(412u)は固定の高さで、残りを ステータスエリアが吸収します(オプションバーがサイドバーへ移ったことで空いたスペースも この吸収分に含まれる。表示件数が可変なため、余白が見えても問題ない)。.dashboard-column は min-width: 0 を指定し、キャラクター 表示エリアなどの内容量で横幅が突っ張らないようにしている点に注意(flex: 1 な列が中身の 最小幅で止まってしまう既知の挙動の回避)。ダッシュボード列の幅は固定なので、画面が 16:9 より 横長の端末では、余剰の幅をフィールドエリアが吸収します(1 節の設計原則「フィールドエリア最優先」の とおり、広がった分はカードの表示枚数に回る)。カード 6 枚を超えた分だけは、フィールドエリアでは なくサイドバーが取ります(10.1 節)。

10.1 フィールドエリアが余らせた幅は、サイドバーへ回す【確定】

フィールドエリアがハンドレーンの枠の上限(7.3 節)より多くのカードを表示できるときに限り、超えた 分の幅をサイドバーへ回します。

上限を超えた幅は、使う相手が居ません。設置物・アイテムのレーンは送れば読めますが、手持ちは 広げても空き枠すら伸びません。1 節「フィールドエリア最優先」が効くのはここまでです。

出どころ: #656(余った幅はサイドバーへ)

10.2 回すのは 1 列(120u)で、フィルターを高さいっぱいの列にする

確定しているのは 10.1 節の 1 文だけで、回す幅と組み方は仮決めです。

画面 幅 (u) フィールドエリア (u) 枚数 広げた後 (u) 広げた後の枚数
16:9 1920 1322 6 — 広げない
約 1.96:1 2117 1519 7 1399 6
19.5:9 2340 1742 8 1622 7

19.5:9 では広げた後も 1 枚余りますが、そこから先へ回す相手がいません——フィルターは 1 列で 足りています。送る仕組み(8 節)はどちらの組み方でも残ります。 余剰の無い画面と、ボタンが 10 個を 超える世界では、これまでどおり送って見せます。

11. エリア構成まとめ

画面([縦型] 上から)
├── オプションバー(アイコンボタン×4)
├── 状況エリア(空の帯: 左下に日時フリップカード、右下に天候名)
├── キャラクターエリア
│   ├── キャラクター表示エリア
│   │   ├── 1行目: ポートレイトカード|地図・装備・怪我・レシピのボタン(縦積み)
│   │   └── 2行目: 状況アイコン(1行・左詰め)
│   └── ステータスエリア(バー×7)
├── フィールドエリア(カード 5 枚分)
│   ├── 設置物レーン(現在地ピン + 道・木・建物…)
│   ├── アイテムレーン
│   └── ハンドレーン
└── フィルターバー(アイコンボタン×9、1行)

画面([横型] 上から。左の列・フィールドエリア・右サイドバーは左右並び)
├── 左の列
│   ├── 状況エリア(空の帯: 左上に天候名、下端に日時フリップカード)
│   └── ダッシュボード列(=キャラクターエリア)
│       ├── キャラクター表示エリア(縦型と同じ組み方。幅だけが列いっぱい)
│       └── ステータスエリア(バー×7)
├── フィールドエリア(カード 5 枚分強。ハンドレーンのみ 6 枚分で頭打ちにして余白を残す)
│   ├── 設置物レーン(現在地ピン + 道・木・建物…)
│   ├── アイテムレーン
│   └── ハンドレーン
└── 右サイドバー(120u の 1 列。フィールドエリアに余剰があれば 240u の 2 列)
    ├── オプションバー(アイコンボタン×4、上段。2 列なら右の列)
    └── フィルターバー(アイコンボタン×9、下段。収まらない分は送る。2 列なら左の列で全部出る)

12. 実装

Phaser 側の実装は src/game/PlayScene.ts(エリアの寸法計算は src/game/looks/PlayScreenLayout.ts、 探索のタブは src/game/ui/ExplorationPane.ts)。本ドキュメントの u 単位の寸法トークンをそのまま 用い、向きの変更時は画面を作り直して配置し直します(開いている子ウィンドウは組み立て直されます)。 アクションで表示内容が変わったときは画面を作り直さず、レーンの中身を差し替えます。移動で現在地が 変わったときだけは、フィールドエリアだけを作り直します (移動の場面転換)。

表示する内容は src/game/view/PlayScreenView.ts が供給します。3 レーンと日時は実際のワールド状態 (現在地とそのスロットの中身・キャラクターの手持ちスロット・world の日時)から作ります。 アイテムの画像がまだ無いため、カードのアイコンは種別ごとの絵文字を仮に使っています。名前は 言語ごとの対応表(Localization.md)から引きます。状況アイコンは 4.1.1 節の宣言がまだ入っていないため、モックと同じ固定の絵文字を返すプレースホルダーのままです (PlayScreenView.conditions)。

ワールド状態そのものの保存はまだ無いため、プレイ画面はセーブデータのシードから世界を作り直して 表示します(SaveDataManagement.md)。

13. HTML モックとスクリーンショット

表示方法:スマートフォンブラウザで開くと、縦向き・横向きの切り替えに追従してレイアウトが変化します。
デスクトップブラウザでは、ウィンドウ比率を変更するか、DevTools のデバイスシミュレーターでご確認ください。

モックは領域分割と寸法の検証を目的とし、装飾はカードの角丸程度に留めています。各エリアとレーンには position:absolute のラベルを重ね、背景色を変えて境界を視認しやすくしています。

縦型 1080×1920

縦型スクリーンショット

横型 1920×1080

横型スクリーンショット