背景(Epic #738)
「AIを試す」(koshien-test-modal)は現在 generatePreviewCode(editingTarget, version) で
編集中スプライト 1 つだけを Ruby に出力し、?player1=data:<base64> でゲームサーバー
(smalruby-koshien-web)へ渡す。
koshien AI が使う結果リスト(例 最短経路)を flyout の作成ダイアログで
「すべてのスプライトでつかう」(= グローバル) にした場合、そのリストの初期化は
ステージ側(Stage の def initialize / Stage.new(lists:))に生成される。
ところがスプライト 1 つだけを送るとステージが含まれないため、$最短経路 が
未初期化(nil)のまま実行され、koshien.calc_route(result: $最短経路) が書き戻せず、
続く $最短経路[1] で落ちる。
検証: topic/koshien-epic-738 で RubyGenerator に実際の koshien AI を通し、生成 Ruby を
観察して確認済み。
- v2 生成(スプライト):
class Player1 < ::Smalruby3::Sprite
set_costumes ["costume1"]
set_sounds []
koshien.when_connect_game(name: "player1") do
koshien.calc_route(result: $最短経路) # ← $最短経路 はどこでも未初期化
koshien.move_to($最短経路[1]) # ← nil[1] で落ちる
koshien.turn_over
end
end
- 同じケースのステージ生成:
- v1:
Stage.new("Stage", ..., lists: [{ name: "最短経路" }]) do end(初期化あり)
- v2:
require "smalruby3" のみ(初期化が出ない = 後述のバグ)
やること
1. 「AIを試す」で編集中スプライト + ステージを出力する
koshien-test-modal / ruby-script-preview で、編集中スプライト単体ではなく
ステージ + 編集中スプライトの 2 ターゲットを 1 つのプログラムとして出力する
(RubyGenerator.targetsToCode([stage, editingTarget], ...) 等)。これにより
ステージがグローバル変数/リストを初期化し、スプライト単体送信でも実行可能になる。v1/v2 両対応。
2. バグ修正: v2 でスクリプトの無いステージがグローバル初期化を出力しない
現状、ステージにスクリプトが無くグローバル変数/リストだけがある場合、v2 では
class Stage 自体が生成されず(code-finisher.js は code.length === 0 のとき class wrap しない)、
def initialize 内の $最短経路 = [] が出力されない。
→ スクリプトが無くても、グローバル変数/リストの初期化(def initialize)を持つ
class Stage を生成するよう修正する。v1 の Stage.new("Stage", lists: [...]) do end と
等価な初期化を v2 でも出力すること。
受け入れ条件
ベースブランチ
関連
背景(Epic #738)
「AIを試す」(
koshien-test-modal)は現在generatePreviewCode(editingTarget, version)で編集中スプライト 1 つだけを Ruby に出力し、
?player1=data:<base64>でゲームサーバー(smalruby-koshien-web)へ渡す。
koshien AI が使う結果リスト(例
最短経路)を flyout の作成ダイアログで「すべてのスプライトでつかう」(= グローバル) にした場合、そのリストの初期化は
ステージ側(
Stageのdef initialize/Stage.new(lists:))に生成される。ところがスプライト 1 つだけを送るとステージが含まれないため、
$最短経路が未初期化(
nil)のまま実行され、koshien.calc_route(result: $最短経路)が書き戻せず、続く
$最短経路[1]で落ちる。やること
1. 「AIを試す」で編集中スプライト + ステージを出力する
koshien-test-modal/ruby-script-previewで、編集中スプライト単体ではなくステージ + 編集中スプライトの 2 ターゲットを 1 つのプログラムとして出力する
(
RubyGenerator.targetsToCode([stage, editingTarget], ...)等)。これによりステージがグローバル変数/リストを初期化し、スプライト単体送信でも実行可能になる。v1/v2 両対応。
2. バグ修正: v2 でスクリプトの無いステージがグローバル初期化を出力しない
現状、ステージにスクリプトが無くグローバル変数/リストだけがある場合、v2 では
class Stage自体が生成されず(code-finisher.jsはcode.length === 0のとき class wrap しない)、def initialize内の$最短経路 = []が出力されない。→ スクリプトが無くても、グローバル変数/リストの初期化(
def initialize)を持つclass Stageを生成するよう修正する。v1 のStage.new("Stage", lists: [...]) do endと等価な初期化を v2 でも出力すること。
受け入れ条件
$最短経路)を使う koshien AI が、スプライト単体送信でも初期化され、実行可能なコードになる
(
class Stage+def initialize)を出力する@名前「このスプライトのみ」)のケースも引き続き動作する(スプライトの
def initializeで初期化)test/unit/lib/ruby-roundtrip/またはruby-generator系)ベースブランチ
topic/koshien-epic-738(Epic feat: スモウルビー甲子園 拡張機能の本格対応(ブロック挙動 + 実サーバー通信)[Epic] #738 の一部。PR はこの epic ブランチを対象にする)関連