017 日陰の追いかけっこ

影がつながるのを待つか、短い日向を走るか。
落とし物を拾い、旗の出口へ運ぶ、３つの小さな庭です。

起動
Windows: setup.bat を一度実行 → play.bat。
Python 3.10以上が必要です。依存は Pyxel 2.9.9 のみ。
macOS/Linux: sh setup.sh → sh play.sh。
展開したこのフォルダー単独で起動できます。親フォルダー不要。
日本語・空白のあるパスを想定。WindowsバッチはASCII、引用符付き、エラー時停止。
Windows実機での動作は未検証。cp932既定文字コードの模擬検査は実施。

操作
タイトルで左右：庭を選ぶ。SPACE：開始。
矢印：歩く。SPACE+矢印：走る。斜めの速さは同じです。
P：停止／再開。R：同じ庭の最初へ。
Z：直前に入った庇へ、入った時刻・拾得状態も戻す練習。
H：２秒先の影の縁を点線で表示／非表示。
T：庭の選択へ。成功後N：次の庭。ESC：終了。
F12：開発・QA用画面と状態記録を media に保存。

世界の約束
二重の輪は恒久安全な「庇」。立ち止まっても減点も失敗もありません。
濃い影は建物から36px伸び、太陽が24秒で一周すると回ります。
人物の丸い身体全体が影に入ると安全。輪郭も安全／日向を示します。
日向では発見ゲージが毎秒25、走って動くと毎秒40増えます。
影では毎秒35下がり、庇に身体全体が入ると0になります。
100で発見、その場で停止します。ZかRでやり直せます。
建物は通れません。落とし物１枚のA、２枚のB/C。全て拾って出口へ。

３つの判断
A 一本の影：身体が影に入る感触。短い日向横断でもクリアできます。
B つながる渡り廊下：初期の向きでは急ぐと届かない。庇で待ち、影を橋に。
C 近道のまぶしさ：待って近道を使うか、下の庇を経由して回復するか。
Cの安全な遠回りを低い評価にはしません。制限時間・必須速攻メダルなし。

実装と検証
描画30Hz、純粋モデル120Hz。画面384×360、座標模型192×128を２倍表示。
移動→建物との円掃引・滑り→太陽→日陰→ゲージ→拾得→出口の順。
影は矩形と平行移動した４頂点の凸包。円が多角形の和集合に収まるか、
外周・穴の露出境界までの距離を調べます。浮動小数点許容誤差1e-7。
円周８点だけの近似ではなく、影の継ぎ目をまたぐ身体も扱います。
これは一様な影長のゲーム模型。現実の季節や太陽高度の再現ではありません。

検証再実行（このフォルダーで）
python -m unittest discover -p "test_*.py" -v
python solver.py
python experiment.py
python tools/test_portability.py
python app.py --headless --demo

メディア
media/shadows_automatic_silent.mp4：実際のPyxel描画。自動操作・無音。
A成功、Bの失敗→庇へ戻る→待って成功、Cの庇経由成功を収録。
PNGもPyxelランタイムで保存。映像は人による試遊ではありません。
動画生成だけは開発環境のPillowとffmpegを使います。ゲームには不要。

一変更比較
python app.py --baseline：太陽だけ固定。Bの建物・移動・露出・目標は同じ。
experiment.py は同じ出発時刻・経路を比較。詳細は QA.txt。

権利と未確認
オリジナルコード・図形絵：MIT（LICENSE.txt）。
同梱の日本語字形：Noto Sans CJK由来、SIL OFL（assets/NOTO-LICENSE.txt）。
技術試験と実機操作の範囲は QA.txt。人の面白さ・読みやすさの試遊は未実施。
この作品は意図的に無音。音の実聴確認済みとは記載していません。
