DSL 4.0ランタイムからのメッセージに応じた動作の記述

Copyright © 2026 Hiroya Kubo. この文書はCC BY-SA 4.0で提供します。

対象: DSL 4.0の台本と、TurboWarp Editorで作るプログラムを連携する方
前提: YAML台本のsceneとaction、およびTurboWarpの「メッセージを受け取ったとき」を使えること

文書状態: 公開プレリリース4.0.0-rc.8向けガイド
実装基準: annotated tag v4.0.0-rc.8のcommit 29c0dea

この文書は4.0の正式リリースを保証するものではありません。利用するSB3に broadcastMessageAndWaitが含まれることを公開元で 確認してください。

DSL 4.0のbroadcastMessageAndWaitは、台本からTurboWarpへ処理を依頼し、その処理が終わってから台本の 次のactionへ進むための命令です。台本で表しにくいゲーム、演出、計算、機器連携などをTurboWarp側に書き、 sceneの進行順序だけを台本側で管理できます。

最初に理解する流れ

台本とTurboWarpプログラムの待ち合わせ
台本がmessageを送る一致する受信scriptを開始すべての受信scriptが終了台本の次actionへ進む

待機の単位: Stage、sprite、cloneで、この送信によって開始した受信threadをすべて待ちます。

通常の「メッセージを送る」ではなく、Scratch/TurboWarpの「メッセージを送って待つ」に相当します。 受信scriptのどれかが終わらなければ、台本も次へ進みません。

1. 台本にmessageを書く

短い形式ではmessage名を直接書きます。

scenes:
  miniGame:
    - broadcastMessageAndWait: playMiniGame
    - sound: Success
    - goto: ending

stableIdも付ける場合はobject形式を使います。

- broadcastMessageAndWait:
    stableId: play-mini-game
    message: playMiniGame

messageは空でない文字列です。TurboWarp projectに登録した名前と、大文字・小文字、空白を含めて完全に 一致させます。たとえばplayMiniGamePlayMiniGameは別の名前です。前後の空白も自動では除きません。

2. TurboWarp側に受信scriptを書く

TurboWarp Editorで、処理を担当するStageまたはspriteへ次の形のscriptを置きます。

「playMiniGame」を受け取ったとき
  ゲーム用の表示を準備する
  得点を0にする
  10秒待つ、または終了条件を待つ
  ゲーム用の表示を片付ける

Eventsカテゴリの「メッセージを受け取ったとき」でplayMiniGameを作ると、その名前がprojectのmessage登録簿へ 追加されます。YAMLに書いただけではTurboWarp側のmessageは作られません。

一つのmessageをStageと複数のspriteが受け取っても構いません。DSL 4.0ランタイムは、この送信によって開始した すべての受信scriptが終了するまで待ちます。受信時に開始したcloneのscriptも待機対象です。

3. 終了する処理として書く

受信scriptは、有限時間で最下端まで到達するようにします。

書き方 結果
数秒待ち、演出を終えてscriptを終了する 演出後に台本が次へ進む
条件を待ち、条件成立後に片付けて終了する 操作の完了後に台本が次へ進む
「ずっと」で終わらない 台本も待ち続ける
別messageを「送る」だけで自分は終了する 別message側の終了は待機対象にならない
別messageを「送って待つ」 別message側も終了してから自分が終了する

常駐処理を開始したい場合は、開始messageと停止messageを分け、その常駐threadの終了を broadcastMessageAndWaitの完了条件にしない設計にします。

4. 複数の担当へ分ける

同じmessageを、たとえば次の三つへ分担できます。

  • Stage: 背景と照明を変更する
  • MiniGame sprite: ゲーム本体を実行する
  • SoundDirector sprite: 開始音と終了音を再生する

三つの受信scriptのうち最後の一つが終了した時点で、台本の次actionが始まります。処理順が必要なら、 一つの受信script内で順番に呼ぶか、TurboWarp側でも「メッセージを送って待つ」を使います。

5. 中断とscene移動

sceneのskip、作品の停止、projectの再起動などでactionがキャンセルされると、DSL 4.0ランタイムは、その broadcastMessageAndWait呼び出しが開始した受信threadだけを停止します。ほかの処理が開始した同名messageの threadや、無関係なthreadは停止しません。キャンセル後は受信完了待ちの監視も解放されます。

受信scriptが外部装置、タイマー、独自のイベントlistenerなどを開始する場合、その後片付けはTurboWarp側の scriptまたは利用する機能拡張のライフサイクル契約に従ってください。Scratch threadの停止だけでは、外部資源が 自動的に解放されるとは限りません。

6. messageが見つからない場合

指定名がTurboWarp projectのmessage登録簿に存在しない場合、送信は行われず、actionは直ちに完了します。 登録済みでも受信scriptが一つもなければ、messageは送られますが待つthreadがないため直ちに完了します。

意図しない即時完了を防ぐため、次を確認します。

  1. Eventsカテゴリの受信hatに同じmessage名がある
  2. YAMLとTurboWarpで大文字・小文字、全角・半角、前後の空白が一致する
  3. 受信hatが、完成SB3に含まれるStageまたはspriteに置かれている
  4. 受信scriptが最後まで終了する

7. 動作確認

次の最小確認を行います。

  1. 受信scriptの先頭で変数phasestartedにする
  2. 1秒待つ
  3. phasefinishedにする
  4. 台本ではbroadcastMessageAndWait直後に別の背景または効果音を設定する
  5. 直後のactionが、phase = finishedより前に実行されないことを確認する

複数receiverを使う場合は待ち時間を変え、最も遅いreceiverが終了するまで次actionへ進まないことも確認します。

関連資料