Epic: #738 / Phase P3
ゴール
ブラウザの scratch-vm 拡張(JS)が実ゲームサーバーに直接 HTTP 通信し、接続していれば本当に
ゲームを進行できるようにする。未接続なら #A の MockClient(固定値)にフォールバックする。
→ 「サーバーにつながなくても AI を作れて、つなげば実戦できる」状態。
方針: RemoteClient(ai_lib.rb の JS 移植)
KoshienClient の実装として RemoteClient を追加。tmp/smalruby-koshien/src/lib/ai_lib.rb の
HTTP プロトコルを JS(fetch)で再現する。#B のゴールデン契約テストで挙動一致を担保する。
実装するプロトコル(詳細は notes/koshien/protocol.md):
POST /api/manage/connectGame(body: name/uuid/side/code)→ 初期 api_info
POST /api/manage/turnOver?uuid= → 次ターン状態(status: completed/timeout/timeup で終了)
POST /api/move/to|setDynamite|setBomb(query: x,y,uuid)
POST /api/move/setMessage(query: msg,uuid)
GET /api/search/getMapArea?x=&y=&uuid= → 5×5 + other_player + enemy
- クライアント状態管理:
my_map マージ、x/y/goal/other_player_pos/enemy_pos、行動数/movable、ターン
calc_route/locate_objects は client 側ロジック(重み付きダイクストラ等)を JS で再現
接続判定とフォールバック
- 接続モード判定: サーバー疎通 + connectGame 成功なら
RemoteClient、失敗/未設定なら MockClient。
- ブロックメソッドは
KoshienClient インターフェース越しなので、両モードで同一コード。
CORS / ホスティング(要対処)
- 現状サーバーは
127.0.0.1:3000 固定・CORS 未対応。ブラウザから直接叩くには:
- サーバー側 CORS 許可、またはプロキシ(既存
smalruby-api の cors-proxy 等の活用検討)
- エンドポイント URL の設定方法(env / URL パラメータ / UI 設定)
- 認証/対戦相手のマッチング(2人接続前提)の扱い
- これらは設計時に詰める(別途サブタスク化の可能性)。
Definition of Done
依存
- #A(KoshienClient 抽象 + MockClient)と #B(契約テスト基盤)の完了が前提。
Epic: #738 / Phase P3
ゴール
ブラウザの scratch-vm 拡張(JS)が実ゲームサーバーに直接 HTTP 通信し、接続していれば本当に
ゲームを進行できるようにする。未接続なら #A の
MockClient(固定値)にフォールバックする。→ 「サーバーにつながなくても AI を作れて、つなげば実戦できる」状態。
方針: RemoteClient(
ai_lib.rbの JS 移植)KoshienClientの実装としてRemoteClientを追加。tmp/smalruby-koshien/src/lib/ai_lib.rbのHTTP プロトコルを JS(fetch)で再現する。#B のゴールデン契約テストで挙動一致を担保する。
実装するプロトコル(詳細は
notes/koshien/protocol.md):POST /api/manage/connectGame(body: name/uuid/side/code)→ 初期 api_infoPOST /api/manage/turnOver?uuid=→ 次ターン状態(status: completed/timeout/timeup で終了)POST /api/move/to|setDynamite|setBomb(query: x,y,uuid)POST /api/move/setMessage(query: msg,uuid)GET /api/search/getMapArea?x=&y=&uuid=→ 5×5 + other_player + enemymy_mapマージ、x/y/goal/other_player_pos/enemy_pos、行動数/movable、ターンcalc_route/locate_objectsは client 側ロジック(重み付きダイクストラ等)を JS で再現接続判定とフォールバック
RemoteClient、失敗/未設定ならMockClient。KoshienClientインターフェース越しなので、両モードで同一コード。CORS / ホスティング(要対処)
127.0.0.1:3000固定・CORS 未対応。ブラウザから直接叩くには:smalruby-apiの cors-proxy 等の活用検討)Definition of Done
RemoteClientが connectGame〜turnOver の1ゲームを実サーバー相手に完走できる依存