このページでは、チャット機能に関するModスクリプトの詳細について解説します。
チャットイベント
チャット:メッセージ
新しいチャットメッセージを受信するたびにトリガーされます。なお、メッセージのタイプがrollresult、gmrollresult、secretrollresult、またはsupersecretrollresult の場合は、メッセージの内容に対してJSON.parse() を呼び出し、ダイス目の結果に関する情報が含まれたオブジェクトを取得する必要があります。
プレイヤーが「!」で始まるチャットメッセージを入力した場合、、そのメッセージのタイプは 「api」であり、チャットには表示されません。スクリプトでは、コマンドにその型が使用されます。 sendChat()もchat:message イベントを発生させますが、それらのメッセージのplayerid は 「API」となっています。
コールバックパラメータ:
| 不動産 | 既定値 | メモ |
|---|---|---|
誰 |
"" |
メッセージを送信したプレイヤーまたはキャラクターの表示名。 GMの場合、これは(GM) で終わります。投稿される名前にその接尾辞を含めたくない場合は、sendChatメソッドにwho を渡す前にその接尾辞を取り除いてください。 |
プレイヤーID |
メッセージを送信したプレイヤーのID。 sendChat()で作成されたメッセージは「API」を使用します。 |
|
タイプ |
「一般」 |
general、rollresult、gmrollresult、secretrollresult、supersecretrollresult、emote、秘話、desc、direct、api のいずれか。 |
コンテンツ |
"" |
チャットメッセージの内容。 typeがrollresult、gmrollresult、secretrollresult、またはsupersecretrollresult の場合、これはそのロールに関するデータを格納した JSON 文字列となります。 |
origロール |
(ダイスロールのみ)ロール元のテキスト。例:プレイヤーが「/r 2d10+5 火属性ダメージ」と入力した場合、「2d10+5 火属性ダメージ」となります。これは、ロール結果タイプ以外のタイプのメッセージに含まれるコンテンツを使用することと同等です。 |
|
インラインロール |
コンテンツにインラインロールが含まれている場合に表示されます。 「api」メッセージでは、ロールはコンテンツ内で $[[0]]、$[[1]] といった形式で表示され、この配列にはその順序で解析されたロールが格納されています。エントリに「secret: true」を含めることができます。 |
|
ロールテンプレート |
(コンテンツには1つ以上のロールテンプレートのみが含まれています)指定されたテンプレートの名前。 | |
ターゲット |
(入力 秘話 のみ)秘話が送信された相手のプレイヤーID。秘話が、GMの表示名を使用せずにGMに送信された場合(例:GMがRileyである場合に「/w gm テキスト」と入力する代わりに「/w Riley テキスト」と入力した場合)、またはプレイヤーが操作していないキャラクターに秘話が送信された場合、その値は「gm」となります。 |
|
ターゲット名 |
(入力 秘話 のみ)秘話が送信されたプレイヤーまたはキャラクターの表示名。 |
|
選択された |
何かが選択された際に、プレーヤーの「api」コマンドに表示される。各エントリは、Roll20 オブジェクトではなく、単純なオブジェクト{_id, _type} です。メッセージがsendChat() から送信された場合は省略されます。 |
|
隠し扉 |
false |
これは、秘密および極秘のサイコロの出目やメッセージに当てはまります。 |
秘密主義 |
"公開" |
「public」、「secret」、または「super」。 |
「Secret」および「Super-Secret」ロールでは、以下のコマンドを使用します(両方のサンドボックス版で利用可能です):
-
/secretrollまたは/sr—タイプは「secretrollresult」、secretは true、secrecyは「secret」です。 -
/supersecretrollまたは/ssr—タイプは「supersecretrollresult」、秘密はtrue、機密度は「super」です。 -
/secretまたは/sの後にメッセージを入力します(例:/secret [[1d6]])。—タイプは「general」のまま、secretは true、機密レベルは「secret」となります。 GMへの秘話ロールの簡潔な秘密形式:GMには数値が表示され、ロールをしたプレイヤーには秘密のロールが行われたことがわかる。 -
/supersecretまたは/ssの後にメッセージを入力すると、タイプは「general」のまま、secretは true、secrecy は「super」になります。
/srおよび/ssrはロールコマンドです。そんなことない!コマンド。「!」で始まるメッセージ型は 「api」です。
注: おそらく、この情報のすべてが必要になることはないでしょう。ほとんどの場合、ダイスの出目の総合的な結果だけが重要になります(最初の例の末尾を参照してください)。ただし、ダイスの出目の結果を本当に深く掘り下げたい場合には、これらすべてが提供されます。
ロール結果構造 例1
rollresult、gmrollresult、secretrollresult、またはsupersecretrollresultメッセージのcontentプロパティに対してJSON.parse を呼び出すと、次のような形式のオブジェクトが返されます(これはコマンド/roll {2d6}+5+1t[weather] Attack!の結果です)。)
{
"type":"V", //"V" = "Validated Roll" (現時点では常に "V" になります)
"rolls": [
{
"type":"G", //"G" はグループ化されたロールを示します。グループとは、ロール内の「サブロール」の連なりのようなものです。
"rolls": [
[
{
"type":"R", //"R" = "Roll"
"dice":2, // ロールしたダイスの数(2dX は 2 個のダイスを意味する)
"sides":6, //ダイスの面の数(Xd6 は 6 面を意味する)
"mods":{},
"results": [ //各ロールの結果の配列。
{
"v":1 // 最初の2d6のサイコロで1が出た
},
{
"v":5 // 2回目の2d6のサイコロで5が出た
}
]
}
]
],
"mods":{},
"resultType":"sum", //結果は(成功チェックではなく)合計値です。
"results": [
{
"v":6 // この場合、グループの総合結果(合計)です。
}
]
},
{
"type":"M", //"M" = 数学式
"expr":"+5+"
},
{
"type":"R", //"R" = ロール
"dice":1,
"table":"weather", //テーブルプロパティは、このロールがテーブルに対して行われた場合に使用されるテーブルの名前に設定されます。
"mods":{},
"sides":2, //テーブルロールの場合はおそらく無視できます。
"results": [
{
"v":0, // テーブルアイテムがロールした「値」テキストテーブルの場合、これは常に0です。
"tableidx":1, //テーブル内でロールされたアイテムのインデックス
"tableItem": { //テーブルがロールされた時点でのテーブルアイテムのオブジェクトのコピー。
"name":"rainy",
"avatar":"", //ロールオーバー可能なテーブルで画像アイコンを使用する場合、ここに画像のURLを指定します
"weight":1,
"id":"-IpzPx2j_9piP09ceyOv"
}
}
]
},
{
"type":"C", // "C" = コメント
"text":" 攻撃!"
],
"resultType":"sum", //ロール全体の結果タイプ
"total":11 // ロール全体の合計(全サブグループを含む)
}
ロール結果構造 例2
/roll {1d6!!>5}>6の結果に対する注釈付き構造(爆発による修正とターゲットの成功を表示):
{
"type":"V",
"rolls": [
{
"type":"G",
"rolls": [
[
{
"type":"R",
"dice":1,
"sides":6,
"mods": { //ダイスロールへの修正
"compounding": { //"compounding" = "爆発ダイスの複合効果 (!!)"
"comp":">=", //比較タイプ
"point":5 //比較ポイント
}
},
"results": [
{
"v":13 //総合ダイス結果これは複利爆発であるため、ダイスの結果は1つだけであることに注意してください。
}
]
}
]
],
"mods": {
"success": {
"comp":">=",
"point":6
}
},
"resultType":"sum",
"results": [
{
"v":13
}
]
}
],
"resultType":"success", // この場合、結果は成功件数です
"total":1 // 成功の総数
}
チャットイベントの例(カスタムロールタイプの実装)
on("チャット:メッセージ", function(msg) {
// プレイヤーが「!d6 3」と入力すると、4を目標値としてその数のd6を振り、判定を行います。
if (msg.type !== "api" || msg.content.indexOf("!d6 ") !== 0) return;
var numdice = parseInt(msg.content.substring(4), 10);
if (!numdice || numdice < 1) return;
var who = msg.who.replace(/ \(GM\)$/, "");
sendChat(who, "/roll " + numdice + "d6>4");
});
sendChat(speakingAs, input [,callback [, options]] )
この機能を使ってチャットメッセージを送信できます。
speakingAs は、以下のいずれかになります:
- 任意の文字列。この場合、その文字列がメッセージ送信者の名前として使用されます。例:
「ライリー」 - プレイヤーのID。
「player|-Abc123」という形式で、-Abc123はプレイヤーのIDです。これを行うと、自動的にそのプレイヤーのアバターと名前が使用されます。 - キャラクターのID。
「character|-Abc123」という形式で表記されます。これを行うと、キャラクターのアバターと名前が自動的に使用されます。
入力 は、Roll20アプリで使用されているものと同様に、有効な式である必要があります。テキストを入力して基本的なメッセージを送信するか、/roll、/em、/w、/secretroll(/sr)、/supersecretroll(/ssr)、/secret(/s)、/supersecret(/ss) などのスラッシュコマンドを使用します。加えて:
- 文字属性は、
@{CharacterName|AttributeName}という形式で使用できます。 - キャラクター技能は、「
%{CharacterName|AbilityName}」という形式で使用できます。 -
sendChatから、プレイヤーが#マクロ名と入力するのと同じ方法でマクロを呼び出すことはできません。ボタンをクリックすると、マクロを実行することができます:[名前](! #MacroName)。 -
@{selected|...}は、sendChat内では展開されません。代わりに、チャット:messageハンドラ内でmsg.selected を読み込んでください。 - 通常のメッセージやささやきには、以下のHTMLタグを含めることができます。
/direct <msg>は、MarkdownやURLの自動リンクを適用せずにメッセージを送信し、同じタグを使用できます:
<code><span><div><label><a><br><br /><p><b><i><del><strike><u><img>
<blockquote><mark><cite><small><ul><ol><li><hr><dl><dt><dd><sup>
<sub><big><pre><figure><figcaption><strong><em><table><tr><td><th>
<tbody><thead><tfoot><h1><h2><h3><h4><h5><h6>
callback は、オプションの3番目のパラメータであり、ゲームにコマンドを送信する代わりに、sendChat()の呼び出し結果を引数として受け取るコールバック関数で構成されます。この方法でsendChat()を使用すると、非同期処理となります。 sendChat()コマンドの実行結果は操作の配列となり、個々のオブジェクトは、チャット:messageイベントの際に受信するオブジェクトと全く同じものになります(上記参照)。
例えば、Roll20のダイスロールエンジンを使用してロールを実行し、その結果を即座に取得するためにこれを使用できます。その後、ロールをゲーム内のプレイヤーに送信する前に、追加の修正を加えることができます。
sendChat("Riley", "/roll 1d20+4", function(ops) {
// ops にはコマンドの実行結果が配列として格納されます。
var rollresult = ops[0];
//ここで、チャット:message イベントが発生したときと同じように、rollresult を使って何か処理を行います...
});
オプション は、メッセージの処理方法を設定するためのオプションの4番目のパラメータです。オプションは、JavaScript オブジェクトとして指定されます。このオブジェクトのプロパティは設定するオプションの名前であり、値はそれぞれの設定内容です。デフォルト値は false であるため、通常はtrue を指定します。
利用可能なオプション:
-
noarchive– メッセージがチャットログに保存されないようにするには、これを「true」に設定してください。これは、Modスクリプトのボタンメニューや状態情報など、ストーリーの一部ではない出力に対して特に有用です。 -
use3d– sendChat() 関数を使用して、3Dダイスの出目を生成できるようになりました。構文は単純で、sendChat("Name", "Rolling [[3d6]]", null, {use3d: true});となります。name パラメータにプレイヤーID(例:sendChat("player|-ABC123",...))を指定すると、そのプレイヤーの色がサイコロの色として使用されます。そうでない場合はデフォルトの白色が使用されます。
注: クライアントでは、一度に1つの3Dロール結果しか表示できないため、複数の3Dロールを連続して実行しても意味がありません。また、3Dロールを使用するとQuantumRollサーバーへの負荷が若干高まるため、状況に応じて判断し、1秒の間に100回の3Dロールを実行するようなことは避けてください。ロールがプレイヤーにとって重要であり、ゲームに大きな影響を与える場合は、3Dロールを使用してください。
これらのオプションを調整したいが、コールバックパラメータ(3番目のパラメータ――上記参照)は使用したくない場合は、その代わりに単にnullを渡せばよいです:
sendChat("Status", "すべてのプレイヤーがログインしました。", null, {noarchive:true});
Modスクリプトのコマンドボタン
テキストチャットの書式設定(Modスクリプトのメッセージ、マクロ、および技能内)により、チャット内にボタンが生成されることがあります。
Markdown 形式を使用してこれを行うには:
[攻撃ロール](!attackroll)
角括弧内のテキストはボタンに表示され、丸括弧内の部分は実行されるコマンドです。通常のロールには何でも含めることができます(マクロ、技能、クエリなど)。ただし、コマンド自体はそれをクリックしたプレイヤーによって実行されることに留意してください。たとえば、メッセージを閲覧できるすべてのユーザーがそのキャラクターにアクセスできない場合は、@{Character|AC}を記載しないでください。代わりに、チャットメッセージを送信する前に、コマンド送信時の実際の値を手動で入力してください。これらのボタンは、一般メッセージ、秘話、およびGMへの秘話で使用できます。クリックしたプレイヤーとしてクリックが実行され、そのプレイヤーのプレイヤーIDが使用され、そのプレイヤーが選択された状態になります。
/direct ではMarkdown が無視されるため、[攻撃ロール](!attackroll)はボタンにはなりません。
チャットでのModスクリプトボタンの入力
また、チャットに「Markdown構文 Mod Script」ボタンを入力して、他のユーザーが利用できるようにすることもできます。チャットパーサーによって解釈されるため、ボタンクリック時に属性・クエリ・ロールを展開させたい場合は、コマンドの一部を特別な構文(HTMLエンティティ)で入力する必要があります:
| キャラクター | 代替 |
|---|---|
% |
% |
) |
) |
? |
? |
@ |
@ |
[ |
[または [
|
] |
]または ]
|
{ |
{ |
} |
} |
| |
| |
, |
, |
このサンプルボタンはそれらのいくつかを使用しています:
[攻撃ロール](!attackroll @{target|token_id} [[1d6+?{Bonus|0}]])
実は、「Mod Script ボタン」を使って、マクロや技能を呼び出すことができます。
| キャラクター | 代替 |
|---|---|
<改行> |
|
これを行うには、コマンド部分の先頭に特別なコード「!
」を付け、その後に「#」でマクロ呼び出し、あるいは「%(%)」で機能呼び出しを追加するだけです。
[マクロ](! #MacroName)
[技能](! %{CharName|AbilityName})
注: 現時点では、サイドバーの「コレクション」タブに保存されたマクロを再度開くと、その中のHTMLエンティティが元に戻ってしまいます。その後、そのマクロを保存すると、その変更も保存されてしまいます。この挙動は、「技能」 や技能コマンドボタン内では見られません。
技能コマンドボタンについて、ボタンを作成する技能と、そのボタンが参照する技能が両方とも同じシート上にある場合、構文は非常に単純です:
[技能](~AbilityName)