TurboWarp カスタム拡張

状態を、動きに変える。

Temporary Variablesを安全なJavaScript風の条件式で読み取り、条件が falseからtrueへ、またはtrueからfalseへ変化したときだけbroadcastします。

condition state == "ready"
state = "ready" true
register watcher conditional broadcast…
false → true broadcast

紙芝居DSL 4.0集約ランタイム

集約された式ブロックも、このリファレンスを使います

集約ランタイムのパレットでRuntime Expression見出し直下の ドキュメントボタンを押します。条件式、動的broadcast、式の構文、上限、エラー時の動作は このガイドの説明どおりです。集約時に加わるのは拡張機能別の名前空間と識別アイコンです。

01 · はじめに

3ステップで準備完了。

Runtime ExpressionはTurboWarpのTemporary Variables拡張が提供するランタイム変数を 読み取ります。2つの拡張を読み込み、プロジェクトで使っている変数名を条件式に書きます。

1

Temporary Variablesを読み込む

最初にTurboWarpのTemporary Variables拡張を追加します。 そのランタイム変数が条件式の入力になります。

2

Runtime Expressionを読み込む

dist/runtime-expression.jsをカスタム拡張として追加し、確認画面で サンドボックス化せずに拡張機能を実行するを有効にします。

3

条件式を書く

stateのように変数名をそのまま書けます。空白や日本語を含む名前は vars["現在の状態"]と書きます。

サンドボックス外での実行が必要です。 Temporary Variablesの読み取りとbroadcastハットの開始にはTurboWarp VMへの直接アクセスが 必要です。信頼できる配布元の拡張ファイルだけを読み込んでください。

バージョン固定の拡張URL
https://cdn.jsdelivr.net/npm/@kubohiroya/turbowarp-runtime-expression@0.4.0/dist/runtime-expression.js

02 · 真偽値レポーター

今の状態を、安全に判定。

conditionブロックは制限された式を解析し、参照されたランタイム変数を読み、真偽値を 返します。evalnew Functionは使用しません。

conditionブロックを実行したときの流れ
ランタイム値 state = "ready"
score = 12
制限付きパーサー state == "ready" && score > 10
true 真偽値の結果

スクリプトの実行条件にする

condition
state == "ready" && lives > 0

返された真偽値を「もし」ブロックの条件としてそのまま使えます。

変数が存在しないか調べる

condition
nextScene === undefined

存在しないランタイム変数はundefinedとして読み取られます。

どんな変数名でも使う

condition
vars["current state"] == "ready"
&& vars["得点"] >= 10

vars["名前"]の形なら、空白やUnicodeを含む名前を扱えます。

03 · 条件付きBroadcast

値ではなく、変化をbroadcast。

名前付きの監視を一度登録すると、最初の結果を記憶し、VMの各フレームで参照値を確認します。 真偽値がfalseとtrueの間を移動したときだけメッセージを送ります。

状態の変化と送られるメッセージ
false 準備未完了
false → true true時のメッセージをbroadcast
true → false false時のメッセージをbroadcast
true 準備完了
false → false と true → true では何も送りません
出来事 Runtime Expressionの動作
登録 最初の状態を記憶するため一度評価します。メッセージは送りません。
参照している値が変化 次のフレームで再評価します。関係のない変数は無視します。
判定結果が変化 その遷移に対応するtrue時またはfalse時のメッセージを送ります。
同じIDを再登録 以前の監視と記憶状態を新しい登録で一括して置き換えます。
正のタイムアウトが満了 通知せずに監視を削除します。0以下はタイムアウトなしです。
登録解除/プロジェクト開始・停止 監視を削除します。存在しないIDの登録解除は何もしません。

1フレームでは最終状態を1回

次のVMフレームまでに複数回更新されてもまとめて扱います。そのフレームでの最終値だけを 確認するため、途中状態のメッセージが大量に送られることを防ぎます。

IDが操作用の名前

level-readyのように変わらないIDを付けます。同じIDを使って、あとから監視を 置き換えたり、登録解除したりできます。

04 · Composition API

Scratchブロックなしで、同じ評価器を使う。

状態を管理するアプリケーションは純粋な評価器を直接importできます。Scratch、DOM、 network、storage、Temporary Variablesを読み取りません。

TypeScript / ESM
import {createRuntimeExpressionComposition} from
  '@kubohiroya/turbowarp-runtime-expression/composition';

const expressions = createRuntimeExpressionComposition();
const ready = expressions.evaluateCondition(
  'state === "ready" && score >= 10',
  {state: 'ready', score: 10}
);

expressions.releaseAll();

fail-closedな入力

ownかつenumerableなstring、有限number、booleanだけを許可します。未知または不正な値は安定したエラーになります。

上限付きで再利用可能

制限付きparserと上限付きcacheを共有します。releaseAll()で式を解放した後も同じinstanceを再利用できます。

05 · 条件式の言語

意図的に、見慣れた書き方だけ。

JavaScriptの比較や計算に似ていますが、JavaScriptそのものではありません。 ランタイム変数から値を計算する、短く明確な条件式にしてください。

使用できるもの

  • 有限数、引用符付き文字列、truefalsenullundefined
  • !、単項+-
  • + - * / %
  • == != === !== < <= > >=
  • 短絡評価する&&||
  • 丸括弧と厳密なvars["名前"]参照

使用できないもの

  • 代入と更新
  • 関数やメソッドの呼び出し
  • 一般的なプロパティ参照とオプショナルチェーン
  • new、配列、オブジェクトリテラル
  • テンプレート文字列
  • 組み込みの長さ・トークン数・入れ子上限を超える式
score >= 10 state !== "paused" !gameOver coins % 2 == 0 a && (b || c)

06 · トラブルシューティング

思った判定にならないとき。

よくある原因は拡張の読み込み順、文字列の引用符、プロジェクトの開始・停止による監視解除です。 まず次の項目を確認してください。

「Temporary Variables」エラー

条件判定や監視登録を実行する前に、Temporary Variables拡張を読み込んでください。

文字の比較が合わない

state == "ready"のように文字列を引用符で囲みます。引用符のない readyは別の変数名として扱われます。

登録直後にメッセージが来ない

正常な動作です。登録時は最初の結果を通知せず記憶します。falseとtrueの間を変化させると メッセージが送られます。

開始・停止後に監視されない

プロジェクトの開始と停止では全登録が解除されます。起動用スクリプトから監視を再登録して ください。

変数名に空白や日本語がある

vars["current state"]vars["得点"]のように、厳密な参照形式を 使用します。

構文エラーになる

式を1つの比較まで短くし、引用符と丸括弧を確認してから、論理条件を1つずつ戻します。