最後の一匹 / The Last Fish — Pyxel 100 / 004

尾の本物の反転をいなし、釣れた魚を持ち帰る小さな釣りゲーム。
最初の目的は5枠の魚群から2匹。得点の最大化は任意です。

起動
Windows: Python 3を入れて setup.bat を一度実行し、play.bat。
macOS / Linux: sh setup.sh を一度実行し、sh play.sh。
既存開発環境では ../../../pyxel_pilot/.venv/bin/python app.py でも起動。
依存は Pyxel 2.9.9 のみ。日本語の字形は同梱しているのでフォントの追加は不要。
日本語・空白を含む展開先に対応した引用符付きランチャーです。
UTF-8を明示して読み書きします。Windows実機での確認は未実施です。

操作
Space: 押している間は巻く、離すと緩める。
魚間: 左右またはA/Dで釣り／確定、Spaceを押し直して決定。
P: 一時停止／再開。R: 同じ魚群・同じseedで最初から。
タイトルでTab: 手作りの魚群A/B/C。結果でEnter: 次の魚群。
2匹以上を釣った後、結果でN: 別seed。既知の予兆間隔が切り替わる。
F12: media/manual_runtime.png にゲーム画面を保存。
Escでも一時停止／再開できます。独立したネイティブ入力確認で動作を確認済みです。
ウィンドウの閉じるボタンで終了してください。

読み方
魚の距離が0なら釣り上げ、100で逃走。張力100で糸が切れます。
予兆は0.8秒。前半は外向き、後半0.4秒で本物／フェイントを見分けられます。
外向きのままなら最後を短く緩める。折り返す矢印なら巻く。
本物の瞬間に3〜18フレーム続けて緩めていると疲れが増えて大きく寄ります。
長く緩めっぱなしでは逃げ、巻きっぱなしでは切れます。
巻き始めの5フレームは糸のたるみを取ります。画面に「巻き始め」と表示。
疲れは3までですが、3にすることは必須ではありません。

持ち帰り
基本点は釣れた直後に確保。連続成功の追加点は未確定です。
確定すると未確定点を保存しますが、次の魚を1枠見送ります。
失敗で失うのは未確定点だけ。最終枠後は自動で確定。
次の2枠の種類・基本点・難度を見て、続けるか確定するか選べます。
全ての魚を確実に釣れるなら全続行が最高得点です。
確定は失敗が心配なときの選択で、完璧な操作に追加の罰は設けません。

収録
日本語UI、オリジナル図形絵、音なし、純粋なモデル、16件の自動テスト、
方策比較、変更前モデル、実行時画像、約26.94秒の自動プレイ動画。
media/last_fish_auto.mp4 は画面に「自動プレイ」と表示した実際のPyxel実行録画。
人の試遊や面白さの証明ではありません。新規の人による楽しさ評価は未実施。

検証
python -m unittest discover -s tests -v
python tools/experiments.py
python tools/run_before.py   # 数値改訂前のモデルで現行UIを起動
sh capture.sh               # デスクトップで自動プレイと動画変換（ffmpegが必要）
--baseline は全ての反転を本物にする比較モード。通常版とは点数を直接比較しないでください。
review/iterations.json は各単独変更の前後状態、experiments.json は方策と出航ログ。
review/QA_NOTES.txt に確認範囲・未確認点・再現方法があります。

権利
ゲームコード・図形絵: MIT。日本語字形: Noto Sans CJK由来、SIL Open Font License。
assets/NOTO-LICENSE.txt を同梱。フォント再生成のみPillowとNoto CJKフォントが必要です。
公開名義・投稿操作は利用者が決め、手動で行ってください。
