Files
TheTree_mock/docs/plans/original-completion-2026-10-02/execution/p07-01/SPEC.md
T

13 KiB
Raw Blame History

P07-01 雨と霧と自然天候 仕様(登録版 r01)

  • 状態: 登録の前の仕様。Root が main の docs/plans/original-completion-2026-10-02/execution/p07-01/SPEC.md に固定し、その commit を base_commit にして通常の登録をする。登録・下書きは実装の受入ではない。原本への加算は whole-unit の final の後だけ。出典は同じフォルダの PROVENANCE.json。
  • 前提: P04 は正式完了。ユーザーの指示(2026-10-23)「まずゲームとしての機能実装完了を優先して」「…統合試験の動作速度のチューニングを、今やるよりも機能実装の完了を優先して」により、機能の単位を先にする。P07-01 は P05-03 の人への問い(未回答)とは独立している。

1. 原本の条件(変えない)

  • 原本 docs/traceability/original/BASELINE.txt 74 行(原文): * **天候:** 雨(客足減・滞在延長)、嵐(新規客ゼロ)、マナの霧(魔法効率UP・興奮度UP)。 214 行(原文): * **上部:** 資金・マナ・資材リソース、時間・天候、世界樹ランク。
  • P07-01 の work: 雨の来客減・滞在延長、マナ霧、自然変化を実営業へ接続する。acceptance: 天候切替直前後、途中保存、自然来客の差を同条件で説明できる。
  • P07 の acceptance のうちこの単位に当たる部分: 嵐で新規入館0、雨で来客減/滞在延長。天候変化の瞬間と保存再開が一致。
  • 原子要件(P07): AR.weather.rain_arrivals(雨で客足が減る)、AR.weather.rain_stay(雨で滞在が延長する)、AR.weather.fog_magic(マナの霧で魔法効率が上がる)、AR.weather.fog_excitation(マナの霧で興奮度が上がる)、AR.weather.storm_no_arrivals(嵐で新規客がゼロになる)、AR.ui.hud_weather(上部に天候を表示する)。
  • 横断条件(P07): 原本条件とUI操作が一致、Runtimeの実利用・会計・行動へ接続、途中保存・再起動で再現、異常/境界/中断を検証、関連回帰PASS、要件別ログとソースハッシュを保存、既存代表負荷の性能回帰を計測。

2. 決定(捏造しない)

  • A13(ユーザーの決定。回答の時刻は記録に無く、Root の記録は 2026-10-23T18:07:36Z): 天候の初期仕様。問い(原文は PROVENANCE.json)の3項目に、ユーザーが「この初期仕様で進める」と答えた。
    1. 毎朝 6 時に、晴れ 60%・雨 25%・マナ霧 10%・嵐 5% で抽選する。雨は 6 時間、霧は 4 時間、嵐は 2 時間続き、その後は晴れ。開始は 6〜20 時の 30 分刻み。
    2. 雨の間は新規来客を半分にする。帰宅予定の客は、雨が止むまで滞在を延長する(最大 4 時間)。
    3. マナ霧の「魔法効率上昇」は、世界樹とマナ炉の産出を 1.2 倍にする。「興奮度上昇」は、成人確認済みの客の性欲の増加を 1.5 倍にする。
  • 出典の区分: 人が承認したのは、上の問いの3項目と、問いが詳細として示した実装案 p07-01-registration-proposal-r01/PROPOSAL.md(SHA-256 0772743a…a532)。実装案にある「切り捨て」と、下の §4 の抽選の手順・保存・移行・同時の扱いの詳細は、実装担当(Opus)の仕様の選択で、人の新しい承認として扱わない。
  • 既存の決定のまま: 嵐の新規入館 0(原本の明示。今の実装を保つ)。A06(マナの貯蔵の上限 300 と 10 分の境界)は変えない。
  • この単位で作らないもの: P07-02 の環境(採光・遮音・隠蔽・景観・清潔・騒音)、P07-03 の流行ニュース、天候の魔法以外への効果、D04 の他の値。

3. 今の実装(main 48d3b00)

  • scripts/environment/weather_timeline.gd: 種類 clear・rain・storm・mana_fog、予定の切り替え(schedule、MAX_PENDING 4096)、時刻の前進、保存と復元(VERSION 1)。確率と効果は持たない。
  • autoload/simulation_runtime.gd: 時刻の境界の最初(simulation_runtime.0_weather → _advance_weather)で天候を進める。来客の計画の受付(_operations_arrival_boundary)は、嵐の間 capacity_remaining を 0 にする。新しい客の帰りの予定は一律 planned_exit_at = 今 + 720(3109 行と guest_service.gd 131 行)、帰りの判定は 9038 行。保存される乱数の系列は RNG_STREAM_IDS(78 行〜。world・guest_spawn など9本)で、旧 save に defense の系列が無い時は world_seed から作る前例がある(1322〜1324 行)。get_weather_report は今の種類と分だけを返す。
  • scripts/mana/mana_reserve_cycle.gd: 10 分ごとの境界で、世界樹の産出 WORLD_TREE_GENERATION 20、マナ炉の産出 FURNACE_YIELD 100、上限 300(A06)。
  • scripts/guest/guest_service.gd 330〜367 行: 性欲(intimacy)の増減の計算。成人確認は guest_definition.gd の adult_verified。
  • scenes/main/main.gd: 上部の天候の表示(晴れ・雨・嵐・マナの霧)。予報は無い。
  • ゲームの中で天候を予定する経路(自然天候)は無く、試験だけが schedule を呼ぶ。雨・霧の効果は無い。

4. 挙動

  • 4.1 自然天候(A13-1):
    • 毎日 06:00 の時刻の境界で1回だけ抽選する。新しいゲームでは、開始の日の 06:00 にも抽選する。
    • 保存される乱数の系列 weather を RNG_STREAM_IDS に足して使う。
    • 種類: 0〜99 の整数を1つ引き、0〜59 晴れ、60〜84 雨、85〜94 マナの霧、95〜99 嵐。
    • 晴れ以外では、開始の時刻を 06:00〜20:00 の 30 分刻みの 29 個から1つ引く。開始の時刻に切り替え、続く時間(雨 360 分・霧 240 分・嵐 120 分)の後に晴れへ切り替える。予定は weather_timeline.schedule で行い、保存される。
    • 最も遅い終わり(20:00 開始の雨で翌 02:00)は、次の 06:00 の抽選より前なので、日をまたいで予定が重ならない。開始が 06:00 の時は、同じ境界で切り替える。
    • 抽選の結果(日、種類、開始、終わり)を出来事 WEATHER_FORECAST_DRAWN として記録する。
  • 4.2 雨の来客(A13-2): 雨の間の来客の計画の境界では、計画の新規の人数を半分(切り捨て)にする。嵐の 0 と、マナや定員の今の上限は先に効く。晴れと霧では変えない。
  • 4.3 雨の滞在(A13-2):
    • 雨の間に帰りの時刻(planned_exit_at)になった客は、帰りを、その雨の終わりの時刻か、元の帰りの予定 + 240 分の早い方まで延ばす。
    • 延長は客ごとに1回だけで、元の予定と延長の後の予定を保存する。延長の後の時刻には、天候に関わらず今の規則で帰る。
    • 嵐と霧では延ばさない。
  • 4.4 マナの霧(A13-3):
    • 魔法効率: 霧の間のマナの 10 分の境界では、世界樹の産出を floor(20 × 1.2) = 24、マナ炉の産出を floor(100 × 1.2) = 120 にする。炉の受け入れの判定(空きが産出以上)も、その境界の産出の量で行う。上限 300 は変えない。
    • 興奮度: 霧の間、adult_verified の客の性欲の増加(その計算の正の増分)を floor(増分 × 1.5) にする。減少と、成人確認の無い客は変えない。
    • 霧の外では元に戻る。
  • 4.5 嵐(原本): 今の新規入館 0 を保つ。自然天候の嵐でも同じ。
  • 4.6 上部の表示と予報(AR.ui.hud_weather):
    • 今の天候に加えて、その日の次の切り替え(種類と時刻)を出す(get_weather_report に足す)。
    • 雨・嵐・霧の時は効果を短く案内する(雨: 来客が半分・帰りを最大 4 時間延ばす、嵐: 新規来客なし、霧: マナの産出と成人客の性欲が増える)。
    • UI は今の部品のままにし、完成の見た目は求めない。
  • 4.7 同時の扱い(D05 の範囲の実装の契約):
    • 天候は今どおり時刻の境界の最初に進めるので、同じ分の来客の計画・帰りの判定・マナの境界・締めより先に効く。
    • 予定の重複・過去の時刻・上限を超えた予定は、今の weather_timeline の規則で拒む。

5. 保存と移行

  • 5.1 自然天候の状態(最後に抽選した日と、その日の予定)、系列 weather、客の延長の記録を保存する。同じ process の保存の往復と別の process の再開で同じ状態になり、抽選・延長・霧の効果を二重に行わない。
  • 5.2 旧 save(自然天候の状態と系列 weather が無い):
    • 今の天候と予定をそのまま保つ。
    • 系列 weather は world_seed から作る(defense の系列の既存の移行と同じ形)。
    • 読み込みの後の最初の 06:00 から抽選を始める。過去の日の抽選はさかのぼらない。客の延長の記録は無しとして読む。
  • 5.3 不正な天候の状態(知らない種類、範囲の外の時刻、重なる予定、延長の上限を超えた記録)は拒否し、読込の前の状態を保つ。

6. 受入条件(acceptance_baseline の本文と同じ)

  • P07-01-F1 自然天候: 毎日 06:00 に1回だけ、§4.1 の確率・開始の時刻・続く時間で天候が自然に予定され、同じ world_seed と同じ操作で同じ天候の列になる。新しいゲームの開始の日も抽選され、旧 save は §5.2 のとおり移行する。
  • P07-01-F2 雨の来客: 雨の間の来客の計画の新規の人数が、同じ条件の晴れの半分(切り捨て)になり、嵐の 0 と定員・マナの上限を壊さない。
  • P07-01-F3 雨の滞在: 雨の間に帰りの時刻になった客が、雨の終わりか元の予定 + 240 分の早い方まで1回だけ残り、その後は今の規則で帰る。嵐と霧では延びない。
  • P07-01-F4 嵐: 自然の嵐を含め、嵐の間の新規入館が 0。
  • P07-01-F5 マナの霧: 霧の間のマナの境界で世界樹 24・マナ炉 120(上限 300 のまま)、成人確認済みの客の性欲の増加が floor(×1.5) になり、霧の外と成人確認の無い客は変わらない。
  • P07-01-F6 表示と予報: ゲームの本物の Runtime と Main の上部の表示で、今の天候・次の切り替え(種類と時刻)・効果の案内が Runtime の値と一致する。
  • P07-01-F7 保存と再開: 天候の切り替えの直前・直後・途中の保存を、同じ process と別の process で読み、天候・予定・系列・来客・滞在の延長・霧の効果が同じになり、二重に効かない。旧 save は §5.2 で読め、不正な状態は §5.3 で拒否して状態を保つ。
  • P07-01-F8 回帰: 関連の回帰(狭い roster と再開の2段)と最終の S の全 roster(既存の代表負荷の性能の suite を含む)が PASS。既存の試験の期待値の変更は EXPECTATION_CHANGES.json に変更前後と根拠を一覧にする。元の失敗を保存し、未解決の試験を除いて PASS にしない。

7. 開示

  • 実装案の「切り捨て」と §4・§5 の詳細は、実装担当の選択(§2)。
  • 興奮度は性欲(intimacy)の増加に当てた。今の客の種類の多くは性欲の増加が 0 なので、霧の効果は増加が正の成人確認済みの客にだけ表れる。
  • 予報はその日の予定だけを出し、翌日以降は出さない(翌日の抽選は翌朝 06:00)。UI は今の部品のまま。Windows の実機は後。
  • 性能の調整はしない(横断条件の性能回帰の計測は、全 roster の既存の性能の suite の結果で見る)。

8. 検証

  • validation p07-weather: tools/run_p07_weather_tests.py --output {build_dir}/p07-weather-evidence。P05-02 の tools/run_p05_funds_tests.py と同じ guarded の段の手順を、この作業の中で作る。
  • 狭い roster:
    • 新しい suite tests/environment/test_p07_weather_runtime.gd(F1〜F7)。
    • 既存の tests/environment/test_runtime_weather.gd・test_weather_timeline.gd・test_weather_recovery.gd・tests/mvp/test_runtime_operations_integration.gd・tests/s2/test_runtime_operations_cycle.gd・tests/s2/test_runtime_mana_reserve.gd・tests/s2/test_mana_reserve_cycle.gd・tests/s3/test_guest_service.gd・tests/s6/test_runtime_save_lifecycle.gd・tests/s6/test_runtime_snapshot_serialization.gd・tests/ui/test_main_dashboard.gd。
    • 再開の2段: tests/environment/test_p07_weather_restart_1_write.gd(天候の途中で保存。生成ファイルは handoff だけ)と ..._2_read.gd(別の process で読む)。
  • その後: 正式の validation → 最終の S の全 roster を1回 → fresh な独立レビュー(whole-unit)。速度の調整の作業と、微小な変更ごとの全回帰はしない。