Skip to content

feat(scratch-vm): 甲子園 実ゲームサーバー通信モード(RemoteClient) #741

Description

@takaokouji

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_objectsclient 側ロジック(重み付きダイクストラ等)を 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

  • RemoteClient が connectGame〜turnOver の1ゲームを実サーバー相手に完走できる
  • 接続時=実進行 / 未接続時=MockClient フォールバックが切り替わる
  • #B の契約テストで RemoteClient の挙動がゴールデンと一致
  • CORS/エンドポイント設定の方式が決まり、編集機から実ゲームを進められる(Playwright か手動で確認)
  • lint / CI green

依存

  • #A(KoshienClient 抽象 + MockClient)と #B(契約テスト基盤)の完了が前提。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions