背景・ゴール
スモウルビー甲子園拡張機能(packages/scratch-vm/src/extensions/koshien/index.js)は、AI を作って スモウルビー甲子園のゲームサーバー(tmp/smalruby-koshien/)と通信するための拡張機能。しかし現状、各ブロックは何もしない(-1 や undefined、空 Promise を返す)スタブ実装で、編集機上では意味のある挙動をしない。
この Epic で 2 段階の改良を行う:
- ブロック単体で意味のある固定値/状態変化を返す(未接続モード)
- 実ゲームサーバーに接続していれば本当にゲームを進行できる(接続モード)。未接続なら 1 の仮の値にフォールバック
過去にゲームサーバーを作ろうとした際、明確な仕様が無く実装が困難だった。今回は
実サーバーの挙動をゴールデン記録し、クライアントの整合性をテストスイートで担保することで
実現可能性を高める。
アーキテクチャ方針
ブロックの挙動を バックエンド差し替え可能 にする:
ブロックメソッド (index.js)
│
▼
KoshienClient (interface)
├── MockClient … 固定値/簡易状態(未接続時 = Part 1)
└── RemoteClient … 実ゲームサーバーへ HTTP(接続時 = Part 2)
- Part 1(固定値)は Part 2(実通信)の「未接続モード」そのもの。地続きに積み上げる。
- 通信主体はブラウザ拡張(JS)自身(編集機上で実ゲームを進行できる)。
確定事項(設計時にユーザー確認済)
- Part 2 の通信主体 = ブラウザ拡張(JS)が直接 HTTP。CORS / サーバーホスティングは Sub-C で対処。
- テスト = ゴールデン記録 + jest 契約テスト(ローカル実サーバーの挙動を fixture 化)。
- ローカルサーバー起動は開発側で用意(Ruby/gem install 可)。
サブイシュー
ゲームサーバー / プロトコルの要点
詳細リファレンスは作業ログ notes/koshien/protocol.md(git 管理外)に集約。要点:
- サーバー: Ruby + WEBrick、
127.0.0.1:3000。Game.instance Singleton 状態機械。
- ターン進行は viewer 駆動:
turnOver は viewer の turnTransition までブロック。move_to は予約で、座標確定は turnTransition 後。
- 行動数 2/ターン(move/getMapArea/setDynamite/setBomb、setMessage 除く)、move は 1/ターン。
- マップ 15×15、地形コード 0=空間/1,2=壁/3=ゴール/4=水/5=壊せる壁/-1=未探索。アイテム a-e(加点)/A-D(減点)、e=草薙剣。
- 採点: アイテム加減点 / 歩行ボーナス(+3/5マス) / ゴールボーナス(100→60) / 敵接触(-10, 剣あり+30)。
- 終了: completed / timeout / timeup。
- コーナーケースの宝庫 =
game_server/spec/(水たまり・行動数上限・無効移動・タイムアウト・ゴール後 already_finished・アイテム折半 等)。
- client の
calc_route はサーバー実装と別物(重み付きダイクストラで既知空間優先)。再現は ai_lib.rb に合わせる。
進め方
P0 理解 ✅ → P0.5 サーバー起動 → P1 (Sub-A) → P2 (Sub-B) → P3 (Sub-C)。各 Sub は独立 PR。
背景・ゴール
スモウルビー甲子園拡張機能(
packages/scratch-vm/src/extensions/koshien/index.js)は、AI を作って スモウルビー甲子園のゲームサーバー(tmp/smalruby-koshien/)と通信するための拡張機能。しかし現状、各ブロックは何もしない(-1やundefined、空 Promise を返す)スタブ実装で、編集機上では意味のある挙動をしない。この Epic で 2 段階の改良を行う:
アーキテクチャ方針
ブロックの挙動を バックエンド差し替え可能 にする:
確定事項(設計時にユーザー確認済)
サブイシュー
ゲームサーバー / プロトコルの要点
詳細リファレンスは作業ログ
notes/koshien/protocol.md(git 管理外)に集約。要点:127.0.0.1:3000。Game.instanceSingleton 状態機械。turnOverは viewer のturnTransitionまでブロック。move_toは予約で、座標確定はturnTransition後。game_server/spec/(水たまり・行動数上限・無効移動・タイムアウト・ゴール後 already_finished・アイテム折半 等)。calc_routeはサーバー実装と別物(重み付きダイクストラで既知空間優先)。再現はai_lib.rbに合わせる。進め方
P0 理解 ✅ → P0.5 サーバー起動 → P1 (Sub-A) → P2 (Sub-B) → P3 (Sub-C)。各 Sub は独立 PR。