Skip to content

feat(koshien): 「AIを試す」で編集中スプライト+ステージを出力しグローバル変数/リストを初期化する (v2 スクリプト無しステージの初期化生成バグ修正含む) #827

Description

@smalruby3-editor-bot

背景(Epic #738

「AIを試す」(koshien-test-modal)は現在 generatePreviewCode(editingTarget, version)
編集中スプライト 1 つだけを Ruby に出力し、?player1=data:<base64> でゲームサーバー
(smalruby-koshien-web)へ渡す。

koshien AI が使う結果リスト(例 最短経路)を flyout の作成ダイアログで
「すべてのスプライトでつかう」(= グローバル) にした場合、そのリストの初期化は
ステージ側Stagedef 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.jscode.length === 0 のとき class wrap しない)、
def initialize 内の $最短経路 = [] が出力されない。

スクリプトが無くても、グローバル変数/リストの初期化(def initialize)を持つ
class Stage を生成する
よう修正する。v1 の Stage.new("Stage", lists: [...]) do end
等価な初期化を v2 でも出力すること。

受け入れ条件

  • 「AIを試す」が編集中スプライト + ステージを含むプログラムを生成する(v1 / v2)
  • グローバルリスト(例 $最短経路)を使う koshien AI が、スプライト単体送信でも
    初期化され、実行可能なコードになる
  • v2 でスクリプト無し・グローバル変数/リストありのステージが初期化コード
    class Stage + def initialize)を出力する
  • 既存のスプライトローカルリスト(@名前「このスプライトのみ」)のケースも
    引き続き動作する(スプライトの def initialize で初期化)
  • ユニットテスト追加(test/unit/lib/ruby-roundtrip/ または ruby-generator 系)

ベースブランチ

関連

Metadata

Metadata

Assignees

No one assigned

    Labels

    🤖 autopilotautopilot が処理対象にした Issue/PR(daemon が付与)

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    Status
    Close

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions