095 忘れもの列車　1.0.2

写真の時刻と忘れものの跡を結び、持主へ返す小さな推理探索です。
固定の３事件。答えが分かったら、全ての証拠を集めずに返せます。
全員が本当のことを話します。犯人捜しや盗難の告発はありません。

起動
Windows: Python 3 を入れ、setup.bat を１回実行。その後 play.bat。
Linux/macOS: Python 3、sh setup.sh、その後 sh play.sh。
ゲーム本体の依存は Pyxel 2.9.9 と Python 標準ライブラリだけです。
Windows/macOS実機、音の実聴、人による本作の試遊は未確認です。
本作は意図的に無音です。全情報は文字・形でも確認できます。

操作
表紙: 1～3 事件、B 写真の表示比較、Space/Enter 開始。
← → 車両、Space 写真の時刻、↑ ↓ 記録の選択、Z 読む。
Tab 証拠帳。事実・発言・自分の仮説を区別します。
Enter 返却案: ← → 相手、↑ ↓ 読んだ根拠、Z 付け外し、Enter 返す。
根拠は０～２件。正しい相手なら０件でも即座に完了します。
返却案で Space は調査へ戻る。誤答には具体的な同じ反証が返ります。
X 直前の調査/根拠編集/提出を戻す。写真・車両の閲覧移動はundo対象外。
R 同事件、1～3 別事件、M 表紙、Esc 終了（変更は確認つき）。
H 説明、S 保存、L 読込、F12 PNG画面保存。
各操作の後にキーを離します。同時押しは無効。押し残しは次画面へ入りません。

ルールと目標
現在は終点２で停止中。過去０・１は写真と車内メモです。
時間を巻き戻したり、過去の物を動かすことはできません。
見つけた時刻・場所は最初から公開。写真では乗車前の人は写りません。
基本目標は一件の正しい返却。全証拠回収、無誤答、順序入力は不要。
本人が物の特徴を照合して結末が確定します。色の一致だけを所有の証明にしません。
矛盾注記は既読記録だけから出ます。注記がないことは正解の保証ではありません。
同じ相手への誤答で新しい情報を無限生成しません。減点・永久失敗はありません。
他の事件、事情を詳しく読む、早く返すのは任意です。
実在の列車や遺失物手続を案内するゲームではありません。

保存
save.json に作品ID・版・事件・状態・履歴・表示設定をUTF-8で保存。
一時ファイルから置換し、未知版や不正範囲は拒否して元ファイルを残します。
保存失敗・読込失敗は画面へ表示。R から新規開始できます。
ネイティブの画面・操作ログはmedia/native_日時/、自動動画はautomatic_日時/。
起動時のソースのコピーとSHA-256も記録。自動操作は人の試遊ではありません。

検証
python -m unittest -v test_model test_ui
python experiments.py
python tools/test_portability.py
PythonモデルはPyxel描画から独立。固定事件・乱数なし。
policy_results.json: 早期/絞った調査/事情を読む、全９実行。
comparison_results.json: 三枚並列と時刻タブは表示だけ変更。共通入力と同じ目標。
model.py の一元表が人物の三時点、証拠、写真、反証、結末を供給します。
QA.txt と NATIVE_OBSERVATIONS.txt で自動/ネイティブ/未確認を分けています。

素材
自作の図形とドット絵。日本語はNoto CJK由来の同梱ピクセル字形。
assets/NOTO-LICENSE.txt と assets/PYXEL-LICENSE.txt に全文ライセンス。
制作補助のフォント生成・動画変換にはPillow/ffmpegを使いますが通常起動に不要。
