Roll20のゲームスペースを一貫して操作できるよう、ユーティリティ関数が用意されています。スクリプト内のどこからでも(たとえば、任意のイベントコールバック内からでも)、ユーティリティ関数を呼び出すことができます。関数の完全なリファレンスは、「Mod Scripts: 関数ドキュメント」に掲載されています。
アンダースコア・ジェイエス
Underscore.js ライブラリ(_グローバルオブジェクトを介して)を利用することで、作業がより簡単になります。 Underscore には、_.each(オブジェクトの配列を反復処理するため)などのヘルパー関数が用意されています。詳細については、Underscoreのドキュメントをご覧ください。
伐採
log(メッセージ)
この関数を使用すると、スクリプトエディタページの「Mod出力コンソール」に出力を記録することができます。スクリプトのデバッグや、Mod サンドボックス内部で何が起きているかをより深く理解するのに役立ちます。
on("change:graphic", function(obj) {
log("オブジェクト ID: " + obj.id の変更を検知しました");
});
Mod Script サンドボックス v1.5 専用です。可能な限り、エラーメッセージには、関連するRoll20オブジェクトの名前が記載されたコンテキストオブジェクトが含まれます。例えば:
エラー:toBelow() は、Roll20 のグラフィック、テキスト、またはパスオブジェクトを引数として呼び出す必要があります。 [Roll20キャラクター -NM0tVij02hIfnoTdihc] で呼び出されました。
オブジェクトの順序付け
toFront(obj)およびtoBack(obj)
これら2つの機能は、卓上上のオブジェクトを、現在属しているレイヤーの手前(または奥)に移動させます。なお、イベントのコールバックで受け取ったオブジェクトや、getObjやfindObjs を呼び出して取得したオブジェクトなど、実際のオブジェクトを渡す必要がある点に注意してください。
toAbove(obj, target)およびtoBelow(obj, target)
Mod Script サンドボックス v1.5 専用です。スタック順において、obj をtargetの直上または直下に配置します。 target は、グラフィック、テキスト、パス、または pathv2 オブジェクト、あるいはそれらのオブジェクトの ID です。 toFrontおよびtoBackは、オブジェクトそのものを引数として受け取ります。これらの型には、toFront()、toBack()、toAbove(target)、toBelow(target) というインスタンスメソッドも備わっています。
乱数
ランダムな整数(最大値)
Roll20のサイコロと同じジェネレータを使用して、1からmaxまでの範囲のランダムな整数を返します。これはサイコロ用です。 Math.floor(Math.random() * max) + 1は、実際に振られるサイコロのサイズに対しては均等に分布しています。モジュロバイアスについては別の問題となります(整数の % n)。
Math.random()
Modスクリプト内では、通常通りMath.random()を呼び出すことができます。その結果はランダムなものになると信頼して構いません。なぜなら、JavaScriptの「デフォルト」のMath.random()は、Roll20の基盤となっている暗号学的に安全なPRNGに置き換えられているからです。したがって、Math.random()を使用している既存のスクリプトについては、その結果がコンピュータ上で得られる限り、可能な限りランダムに近いものであると理解した上で、そのまま使用することができます。
サイコロを振る場合は、randomInteger(max) を使うのが望ましい。これは、ダイスエンジンが使用しているものと同じジェネレータです。
プレイヤーはGMです
playerIsGM(プレイヤーID)
そのプレイヤーが現在GMであるかどうかを返します。再起動せずに、昇格や「プレイヤーとして再参加」の処理が行われます。 playerIsGM("API") がfalse です:スクリプトから送信されたチャットでは、プレイヤー ID「API」が使用されていますが、これはゲーム内のプレイヤーではありません。
キャラクター
setDefaultTokenForCharacter(キャラクター, トークン)
指定されたキャラクターオブジェクトのデフォルトのコマを、指定されたコマオブジェクトの詳細に設定します。両方のオブジェクトは既に存在している必要があります。これにより、キャラクターに現在関連付けられているデフォルトのコマは上書きされます。
特殊エフェクト (FX)
spawnFx(x, y, タイプ, ページID)
x,yの位置に、タイプ の短いエフェクトを生成します。 pageidを省略するか、undefined を渡した場合、デフォルトではプレイヤーが現在いるページ(Campaign オブジェクト内のplayerpageid)が使用されます。
組み込みエフェクトの場合、型は文字列であり、以下のいずれかである必要があります:beam-color、bomb-color、breath-color、bubbling-color、burn-color、burst-color、explode-color、glow-color、missile-color、nova-color、splatter-color
ここでいう「色」とは、酸、血、魅力、死、火、霜、聖、魔法、スライム、煙、水のいずれかを指します。
カスタムエフェクトの場合、typeにはそのカスタムエフェクトに対応するcustfxオブジェクトの ID を指定する必要があります。
spawnFxBetweenPoints(点1, 点2, タイプ, ページID)
spawnFx と同じように動作しますが、1つの座標ではなく、{x: 100, y: 100} という形式で2つの座標を渡します。例:spawnFxBetweenPoints({x: 100, y: 100}, {x: 400, y: 400}, "beam-acid")。ビーム、息、およびスプラッターのエフェクトが、2つの地点の間を行き来します。座標はページピクセル単位であり、グラフィックと同じ左/上の余白です。窓とドアのx/y座標は軸が反転しており、これらの座標とは異なります。
以下のエフェクトタイプでは、spawnFxの代わりに必ずspawnFxBetweenPointsを使用する必要があります:beam-color、breath-color、splatter-color
Mod Script サンドボックス v1.5 専用です。ビーム型のエフェクトが点2を直接指すようになりました(角度計算のバグが修正されました)。
spawnFxWithDefinition(x, y, definition, pageid)
x、yの位置にアドホックなカスタムエフェクトを生成します。 definition はJavaScript オブジェクトであり、JSON 文字列ではありません。その形状は、Custom FXの定義と同じです。 pageid を省略するか、undefined を渡した場合、プレイヤーの現在のページ(Campaign().get("playerpageid"))が使用されます。
音楽プレーヤーのプレイリスト
playJukeboxPlaylist(プレイリストID)
プレイリストのフォルダID(Campaignオブジェクトの_jukeboxfolderプロパティから取得)を受け取り、ゲーム内の全プレイヤーに対してそのプレイリストの再生を開始します。
stopJukeboxPlaylist()
引数は必要なく、現在再生中のプレイリストをすべて停止します。
その他
sendPing(left, top, pageid, playerid, moveAll, visibleTo)
卓上にピングを送信します(マウスボタンを押し続けるのと同じです)。 「left」と「top」はページ上のピクセル単位です。 pageid の指定が必要です。 playeridは省略可能で、4番目の引数です。これは、ping が送信されたプレイヤーを指します。これを省略するか、偽値として扱われる値を指定すると、pingは「api」(黄色)に帰属されます。
moveAllにtrue を渡すと、プレイヤーがその位置までスクロールされます。 visibleTo は、ping を表示できるユーザーを制限します。指定できるのは、1 つのプレイヤー ID、ID の配列、またはカンマ区切りの文字列です。全員にpingを送信するには、これを省略するか、"" を指定してください。
以下の例におけるsetTimeoutの遅延は、サンドボックスが再起動するとリセットされます。
on("chat:message", function(msg) {
if (msg.type !== "api" || msg.content.indexOf("!pingtest") !== 0) return;
var players = findObjs({_type: "player"});
if (players.length < 1) return;
var player1 = players[0].id;
var player2 = players.length > 1 ? players[1].id : player1;
var allPlayerIDs = players.map(function(player) { return player.id; });
var pageid = Campaign().get("playerpageid");
// pageid は 3 番目の引数、playerid は 4 番目の引数です。 null 属性は、ping を「api」に割り当てます。
sendPing(300, 300, pageid, null, true);
setTimeout(function() {
// "visibleTo" に "" を指定すると、全員にピンが送信される
sendPing(1500, 500, pageid, msg.playerid, true, "");
}, 1000);
setTimeout(function() {
sendPing(1200, 500, pageid, null, true, player1);
}, 2000);
setTimeout(function() {
sendPing(900, 100, pageid, player2, true, [player1, player2]);
}, 3000);
setTimeout(function() {
sendPing(300, 300, pageid, player1, true, allPlayerIDs.join());
}, 4000);
});
Roll20における距離とグリッドに関する補足
正方形のグリッドでは、1単位は70ピクセルです。このページの「snapping_increment」は各グリッドマスの単位数を表し、「scale_number」は1単位の距離を表し、「scale_units」は単位名(多くの場合「ft」)を表します。デフォルトの設定は、1 単位 = 5 フィート = 1 平方 = 70 ピクセルです。 GMは、1ユニットを10フィートに設定することも、1マスあたりを2ユニット(140ピクセル)に設定することもできます。
ヘックスグリッドでは、その70ピクセルの正方形は使用されません。窓やドアの位置指定ではY軸が反転していますが、グラフィックの左端や上端の位置指定では反転しません。