スクリプトエディタ
ゲームのスクリプトを編集するには、そのゲームの「部屋詳細ページ」にある「Modスクリプト」リンクをクリックしてください(このリンクは、「チャットログ」や「ゲームのコピー/拡張」などのオプションが表示されている場所と同じ場所にあります)。以下の機能がいくつか表示されます:
- 上部に並んだタブのリスト。ゲームの整理を容易にするため、1つのゲームに複数のスクリプトを設定することができます。なお、すべてのスクリプトは依然として同じコンテキストで実行されるため、複数のスクリプトが同時に同じ値を上書きしようとすると、意図しない結果が生じる可能性がある点に注意してください。
- スクリプトコードエディタ。このエディタを使用することも、お好みの外部エディタでスクリプトを編集してから、ここに貼り付けることもできます。
- 下部に配置されたMod出力コンソール(下図参照)。
「スクリプトを保存」ボタンをクリックするたびに、ゲームのサンドボックスが再起動されます(stateオブジェクトやRoll20オブジェクトに永続化されていないメモリ内のデータはすべて失われます)。これは、新しいスクリプトを追加する場合、スクリプトを削除する場合、またはスクリプトの有効化/無効化を切り替える場合にも当てはまります。
Mod出力コンソール
Mod Output Consoleは、スクリプトを覗き込むための「窓」のようなものです。 Modスクリプトはサンドボックス内で実行されるため、実行中はスクリプトの結果やエラーに関する情報を確認するために、スクリプトに直接アクセスすることはできません。 Mod Output Console は、この情報をサンドボックス外で表示するため、スクリプトを編集しながらその内容を確認することができます。すべてのlog()コマンドがここに表示されるほか、スクリプトの実行中に発生したエラーもすべて表示されます。詳細については、「スクリプトのデバッグ」に関する記事をご覧ください。
Mod Script サンドボックス v1.5 専用です。可能な限り、エラーメッセージにはコンテキストオブジェクトが含まれるため、どのRoll20オブジェクトが関係していたか(タイプと ID)を確認できます。
リアクティブスクリプト:イベントを監視し、オブジェクトを変更する
Modスクリプトの最初の(そして最も単純な)使い方は、卓上での変化に反応し、変化したオブジェクトに対して追加の機能で対応することです。この種のスクリプトは、ゲーム中に発生するイベントを監視する複数の関数で構成されています。すると、それらのイベント中に渡されるオブジェクトを修正し、卓上において起こることを変更します。
on("change:graphic", function(obj) {
obj.set({
left: obj.get("left") + 70
});
});
ご覧のとおり、change:graphicイベントが発生するたびに実行される、シンプルなon関数を作成しました。この関数には、グラフィックオブジェクトobj が渡されます。変更を加えるには、set関数を使ってobjを修正するだけです。変更したプロパティはすべて検知され、卓上で反映されます。
必ず set および get を使用してオブジェクトの現在の値を設定・取得する必要があります。そうしないと、変更内容が保存されません。(詳しくは「オブジェクト」 リファレンスを参照してください。そこには、オブジェクトの種類とそのプロパティの一覧、および すべてのイベント および各イベントに渡される引数については、「オブジェクト」のリファレンスを参照してください。)
プロアクティブスクリプト:ユーザーの介入なしに処理を実行する
ユーザーイベントへの反応に加え、Modスクリプトでは、プレイヤーからの特定のイベントとは関係なく、自動的に処理を行うこともできます。例えば、マップ上を行き来しながらパトロールするコマを考えてみましょう。
注:この種のスクリプトはユーザーの操作に依存しませんが、ゲーム用のModスクリプトは、少なくとも1人がゲームに接続している場合にのみ実行されます。
on("ready", function() {
// ゲームが完全に読み込まれたことを確認するため、ready イベントが発生するまで待機します。
//パトロールコマへの参照を取得する。
var patroltoken = findObjs({_type: "graphic", name: "Guard A"})[0]; //ゲーム内に「Guard A」というコマが存在することを確認しています。
var direction = -1*70; // 70ピクセル左へ移動する。
var stepstaken = 0; //現在の方向で歩いた歩数は?
setInterval(function() {
if(stepstaken > 3) {
//進行方向を切り替える!
direction = direction * -1; //進む方向を「反転」させる
stepstaken = 0; //歩数を0にリセットする。
}
patroltoken.set("left", patroltoken.get("left") + direction); //歩く!
stepstaken++;
}, 5000); // 5秒ごとにアクションを実行する
});
非同期関数に関する論文
一部の値はすぐには利用できません。 「bio」、「notes」、「gmnotes」、「character_defaulttoken」などのキャラクターおよびハンドアウト用フィールドでは、get() メソッドに対してコールバックを指定する必要があります:
character.get("bio", function(bio) {
log(bio);
});
sendChatにはオプションのコールバックを渡すことができるため、チャットロール結果をチャットに投稿する代わりに、スクリプトに返すことができます。 onSheetWorkerCompleted は、現在のシート開発者のスタックが処理を完了した後に実行されます。
Mod Script サンドボックス v1.5 専用です。 character.createToken は、_defaulttoken を非同期で取得する必要があるため、非同期です。生成されたグラフィックは、戻り値として返されるのではなく、コールバックに渡されます。
「prevonchange」イベントには、それらの非同期フィールドのテキストは含まれていないことに注意してください。以前のBLOB値が必要な場合は、ご自身でキャッシュしてください。