068 小さな博物館の夜
実装・機能検証用。人の理解や面白さは確認待ち。クラウドLinux検証、Windows/macOS実機は未確認。

起動
Python 3.10以上、Pyxel 2.9.9。Windowsではsetup.batを一度実行し、play.batで起動。
Linux/macOSはbash setup.sh、bash play.sh。同梱日本語字形を使用。
ランタイム依存はPyxelとPython標準ライブラリだけ。開発用描画変換にはPillow/ffmpegを使用。

目的
六品から四品を、二行三列の台へ置く。三人中二人が「知りたいタグ」を持ち帰れば基本達成。
種=育つ、臼=道具、碗=食、網=海、舟=移動、鈴=音。
特定の縦横隣接は両方の品へ解釈タグを加える。斜めなし、追加からの連鎖なし、基本は残る。
種+臼=食、臼+碗=くらし、網+舟=協力、舟+鈴=合図、種+碗=循環。
これは架空の町の記録が根拠。使い終わった碗で種を育てた工夫など、説明は最初から読める。
まだ観覧していない隣の品も文脈として見えるので、その組合せタグを学べる。

来客
入口は台1の左。移動はマンハッタン距離、観覧は1。費用が予算以下の未観覧展示だけを検討。
未取得の興味タグは1個2点、それ以外の新しいタグは1個1点。既取得タグは0点。
最大魅力の展示へ進み、同点は費用の小さい方、さらに台番号の小さい方。
魅力0なら退館。帰り道は係員が案内するので予算外。三人は別々に同じ展示を回る。
全員に同じタグを押し付けず、一人ごとの理解、経路、費用、退館理由を記録する。

操作
SPACE/Z 表紙から開始。矢印 台、SPACE 品候補を変更、Z 配置。
同じ品を選んでZなら収蔵庫へ戻す。別の場所に置かれた品なら移動する。
別の品がある台へ置けば交換。四品ある時、収蔵庫の品を空台へ足すことはできない。
Enter 開館。来客は約1.4秒ごとに一つの観覧/退館判断を進める。
P 停止。次の展示、費用、魅力の2点/1点内訳、既知のタグを読む。Pで復帰。
開館中/終了後のEnterは同じ配置の編集へ戻す。Xは配置一手を戻す。
開館後のXは巡回全体を取り消し、開館直前の配置へ戻す。
R 初期配置で再開、1/2/3 夜会A/B/C、B 隣接が左右だけになる比較版で再開。
S recordsへ正確な記録、F12 mediaへ実画面、M 表紙、Q 終了。
状態を切り替えた後は、押していたキーを離してから次の操作へ。

固定夜会
068-A-g1 食べる前の展示。食/くらし/合図を届ける。
068-B-g1 短い寄り道。協力/合図/循環と短い歩行予算。
068-C-g1 同じ碗の二つの話。くらし/循環/食。碗に複数の読み方を付ける。
この三つの有限bankのみ。任意seedで来客が変わるとは保証しません。

検証
python -m unittest -v。model.pyは不変状態、純粋step/forecastと明示された同点規則を実装。
solver.pyは各夜会×二規則の全5,400配置、合計32,400を列挙する。
通常テストはmedia/recordsを書き換えない。solverは専用verified記録を再生成する。
media/museum_automatic_silent.mp4は実Pyxelに自動入力した無音映像。人の試遊ではない。
詳細はQA.txt、EXPERIMENT.txt、media/timing_validation.json。
MITソースとNoto由来字形(SIL OFL 1.1)の全文ライセンスを同梱。

映像は749フレーム、30fps、24.966667秒の無音実描画。ネイティブ実操作の範囲はqa/NATIVE_QA.txt。
launch.shは開発環境用。配布先ではsetup.bat/play.batまたはsetup.sh/play.shを使います。
