100 旅する修理屋 — 独立した5段階の日本語教材

01_journey.py → 02_free_trial.py → 03_ferry_repair.py → 04_town_inventory.py → 05_replay_save.py
Python 3.12 / Pyxel 2.9.9で各Pythonを単独実行。python 01_journey.py
必要ならpython -m pip install -r requirements.txt。原作model.py・画像・フォントは実行に不要。
日本語/空白の別フォルダーや別名でも同じPythonで実行できます。パスは引用符で囲みます。
LESSON.mdが本文、lessons.jsonは同じ5章、lesson_meta.jsonは原作差分と操作。

表紙で1/2/3配置、Space開始。Bは03以降の交通比較。全キーを押してから一度全部離します。
Tabで地図/町/工具。地図の左右は行先、町の左右は行動。Enter予告→離す→Enter確定→離す。
移動後は町画面なので、次の移動はTabでMAPへ戻す。Zで未修理の機構へ。
工具の上下は位相/停止位置、左右は修理法(03+)。森の1/2/3は歯車接続(04+)。
02以降の試験は120回の有効feed（通常30fpsで約4秒）。編集も試験も旅刻・材料は無料。
03以降はPASS後にEnterで予告、離してEnterで修理確定。完了前からの押しっぱなしは確定しません。
04以降はかばん二枠。満杯なら町画面の上下で置く品を選び、取得予告で確認。品はその町に残ります。
05のXは最後の意味入力を除いて再生Undo。無料編集も一決定。試験フレームや選択は履歴に入りません。
05のS/Lは起動した作業フォルダーのsave_100.json。Sは以前の同名ゲーム保存を更新します。
H説明/P停止は試験時計も止めます。同じキーを押して離して復帰。
R/M/Escは再試行/表紙/終了の確認。離してEnter確定、X取消。
コードを変えたらUTF-8保存→Escを離してEnterで終了→pythonで再実行。Rはコードを再読込しません。

原作との差: 01旅だけ、02川の無料試験、03川修理のみ、04森/生活/品/補給、05原作全モデル・Controller。
画面は780×570 ASCII。日本語字形、会話、詳細last文、原作の景色と回転演出、F12/自動PNG/GIF/ログは省略。
生活と品は数値・英語で保持。音を必要とするルールなし、教材に音出力を追加していません。
移動は辺の費用があれば許可され、帰路不足は警告。修理は修理後の帰路を残せないと拒否。
二修理・全町・二品は任意。基本目標は一修理以上をして拠点でfinish。修理なしは下見終了です。

再現用QA（出力先は未存在、親フォルダーは事前に作る）:
python -B test_stages.py
python -B qa/exercise_checks.py
python -B qa/cp932_check.py
python -B qa/reference_check.py "/path/to/original/100_traveling_repairer"
python -B qa/runtime_checks.py "/tmp/repairer_runtime_new"
python -B qa/render_boundaries.py "/tmp/repairer_edges_new"
python -B qa/verify_freeze.py

単独描画例: python 05_replay_save.py --headless-smoke --demo-checkpoint --screenshot new.png --state-json new.json
出力は呼出cwd基準でPyxel初期化前に絶対化。空文字、既存出力、拡張子違い、親なし、headlessなしはimport前に拒否。
qa/*.json、qa/frames、qa/REVIEW.mdは作者証拠。原作証拠・独立レビューとは別です。
実Pyxel Linux headlessと合成入力のみ。物理キー、Windows/macOS GUI、ブラウザー、音の実聴、人の学習効果は未確認。

LICENSEとLICENSE.txtは原作MIT全文・例外告知そのまま。各段階PythonにもMIT全文。
assets/PYXEL-LICENSE.txt、原作告知が参照するassets/NOTO-LICENSE.txtは原作と完全同一。
Noto字形そのものはASCII教材へ含めません。再配布で原作ライセンスの条件を変えないでください。
