085 役目を交換する砦：5段階教材
必要: Python3.11以上、Pyxel2.9.9、GUI/OpenGL対応PC。インストール時はネット接続。
ZIPを全展開し、元ゲームとは別の場所で実行します。仮想環境は各PCで作り直します。
Windows: py -3 -m venv .venv
         .venv\Scripts\python.exe -m pip install -r requirements.txt
         .venv\Scripts\python.exe 01_bodies.py
macOS/Linux: python3 -m venv .venv
             .venv/bin/python -m pip install -r requirements.txt
             .venv/bin/python 01_bodies.py
ファイル名を02〜05へ変えて進みます。各.pyは一つだけでも独立実行できます。

左右は合法行動の一覧選択、Zで確定。地図の直接移動ではありません。
04/05はEで敵番へ、05はXで一手戻る。R初期化、Esc終了。毎回操作キーを全部離します。
01移動、02役交換と盾範囲、03無反撃の攻撃練習、04原作B、05原作B＋Undo。
味方の二行動はチーム全体で共有。名前/HP/位置は役交換で変わりません。
画面はBのみ。A/C、交換なし比較、日本語字形、原作のファイル保存/表紙/確認画面は省略。

標準ライブラリ検査: python -B -m unittest -v test_stages.py
PYXEL085_ORIGINALへ原作085ディレクトリを指定すると直接原作比較を実行。未指定は任意1件をskip。
qa/source_fixture.json.gzは原作SHA付きの23694候補遷移。3砦×交換あり/なし×48本の有限系列で訪れた状態の合法分岐で、全到達状態・全履歴の網羅ではありません。
qa/results.json、qa/REVIEW.md、qa/screens、qa/logsに検査記録。qa/verify_freeze.pyで配布SHAを確認できます。
確認例: python 04_enemy_turn.py --headless-smoke --demo-checkpoint --screenshot 新しい画像.png
既存フォルダー内の新しい.pngだけ受け付けます。既存画像は上書きしません。通常起動に確認フラグは不要です。
改造後に自動デモが合わない場合は確認フラグなしで遊び、元のファイルと比べます。

ModuleNotFoundErrorなら実行と同じPythonでpip install。画面にはGUI/OpenGLが必要。入力が反応しなければ全キーを離すかR。終了後は05ならX、ほかはR。
原文LICENSE.txt/同一LICENSEとNoto/Pyxelの権利文書を保持。教材は標準文字/図形だけでNoto字形データを読みません。
検査はクラウドLinuxの合成入力と実Pyxel描画です。Windows/macOS実機、OSキー入力、音声実聴、ブラウザー、人の理解度・面白さは未確認です。

CLI出力先の互換修正（既存教材の最小修正版）:
--screenshot の相対パスは、コマンドを実行した作業ディレクトリを基準にします。
教材ファイルを別のフォルダーへ移動・改名しても同じです。既存フォルダー内の新しい.pngを検証してから絶対パスへ変換し、Pyxelを読み込みます。絶対パス指定と既存ファイルの上書き拒否は維持しています。
ゲームの状態・操作・描画・ルール・学習例は変更していません。修正は各段階のCLI末尾の1行だけです。
再現: python -B qa/relative_output_check.py 新しい確認先
別々の日本語・空白入りフォルダーから単独ファイルを起動し、相対/絶対出力と上書き拒否を検査します。
追加記録はqa/compat_cli/。従来のqa/results.json・画像・ログは当時の記録として保持しています。
CP932省略時読込の強化検査: python -B qa/compat_cli/simulate_cp932_default.py
これはクラウドLinux上の読込既定値の模擬で、Windows実機検証ではありません。
