Roll20 APIにカスタムコマ・マーカーをサポートする新機能が追加されました。 この情報はキャンペーンノードの下に「token_markers」として保存されます。 API経由でアクセスできます
Campaign().get("token_markers");
この情報は読み取り専用です。
戻り値は、ゲーム内に現在存在する各コマ・マーカーに対応するオブジェクトを含む、文字列化されたJSON配列となります。
{
"id":59, // データベース上のマーカーID
"name":"Bane", // マーカーの名前(非一意)
"tag":"Bane::59", // トークンが実際に参照される方法
// カスタムマーカーの場合はIDを含みますが、
// デフォルトマーカーの場合は含みません。
"url":"https://s3.amazonaws.com/files.d20.io/images/59/yFnKXmhLTtbMtaq-Did1Yg/icon.png?1575153187"
// ^コマ・マーカー画像のURL
}
キャンペーン内で利用可能なコマ・マーカーを見つける方法の例を示すため、サンプルスクリプトを作成しました。
このスクリプトをゲームに追加すると、以下のコマンドが利用可能になります:
!markernamesは画像、名前、ID とともにすべてのマーカーをチャットに出力します
!markerids <name> 指定された名前に一致するマーカーをすべてチャットに表示します
!settokenmarker <string>は、指定された文字列を現在選択されているコマのマーカーリストに追加します。 この処理はコマ・マーカーが存在するかどうかを検証せず、単に提供された値をコマ・マーカーに追加するだけです。
!gettokenmarkersは、現在選択されているトークンの statusmarker 属性をチャットに出力します
on("ready", () => {
const tokenMarkers = JSON.parse(Campaign().get("token_markers"));
const getChatMessageFromTokenMarkers = markers => {
let chatMessage = '';
_.each(markers, marker => {
chatMessage += `<p><img src='${marker.url}'> ${marker.id}: ${marker.name}</p>`;
});
return chatMessage;
};
on("chat:message", msg => {
if(msg.content.split(" ")[0].toLowerCase() === '!markernames') {
let chatMessage = getChatMessageFromTokenMarkers(tokenMarkers);
sendChat("コマ・マーカー", chatMessage);
} else if(msg.content.split(" ")[0].toLowerCase() === '!markerids') {
const markerName = msg.content.split(" ")[1].toLowerCase();
let results = [];
_.each(tokenMarkers, marker => {
if(marker.name.toLowerCase() === markerName) results.push(marker);
});
log(results);
let chatMessage = getChatMessageFromTokenMarkers(results);
chatMessage = chatMessage || '一致するコマ・マーカーが見つかりませんでした'
sendChat("コマ・マーカー", chatMessage);
} else if(msg.content.split(" ")[0].toLowerCase() === '!settokenmarker') {
const markerName = msg.content.split(" ")[1].toLowerCase();
if (!msg.selected && msg.selected[0]._type == "graphic") return;
obj = getObj(msg.selected[0]._type, msg.selected[0]._id);
currentMarkers = obj.get("statusmarkers").split(',');
currentMarkers.push(markerName);
obj.set("statusmarkers", currentMarkers.join(','));
} else if(msg.content.split(" ")[0].toLowerCase() === '!gettokenmarkers') {
if (!msg.selected) return;
if (msg.selected[0]._type !== "graphic") return;
obj = getObj(msg.selected[0]._type, msg.selected[0]._id);
currentMarkers = obj.get("statusmarkers");
sendChat("コマ・マーカー", currentMarkers);
});
});
});