이 페이지에서는 채팅 기능과 관련된 모드 스크립트에 대한 세부 사항을 설명합니다.
채팅 이벤트
채팅:메시지
새로운 채팅 메시지가 수신될 때마다 실행됩니다. 메시지의 유형이 rollresult, gmrollresult, secretrollresult 또는 supersecretrollresult인 경우, 주사위 굴림 결과에 대한 정보가 포함된 객체를 얻으려면 메시지의 내용에 대해 JSON.parse() 를 호출해야 한다는 점에 유의하십시오.
플레이어가 !로 시작하는 채팅 메시지를 입력하면, 해당 메시지의 유형은 "api" 이며 채팅창에는 표시되지 않습니다. 스크립트는 명령을 실행할 때 해당 유형을 사용합니다. sendChat() 은 채팅: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 문자열이 됩니다. |
원본롤 |
(주사위 입력 시에만) 주사위 입력의 원문. 예: 플레이어가 /r 2d10+5 화염 피해를 입력했을 때, 2d10+5 화염 피해. 이는 롤 결과 유형이 아닌 다른 유형의 메시지에 포함된 콘텐츠를 사용하는 것과 동일합니다. |
|
인라인 롤 |
콘텐츠에 인라인 롤이 포함된 경우 표시합니다. "api" 메시지에서는 역할이 콘텐츠 내에서 $[[0]], $[[1]] 등의 형태로 나타나며, 이 배열에는 구문 분석된 역할이 해당 순서대로 저장되어 있습니다. 항목에 secret: true가 포함될 수 있습니다. |
|
롤 템플릿 |
(콘텐츠에는 하나 이상의 롤 템플릿만 포함되어 있습니다) 지정된 템플릿의 이름입니다. | |
목표 |
(입력 귓속말 만) 귓속말을 받는 사람의 플레이어 ID. GM에게 표시할 이름을 사용하지 않고 귓속말을 보낸 경우(예: GM이 Riley일 때 /w Riley text 대신 /w gm text를 입력한 경우)나, 플레이어가 제어하지 않는 캐릭터에게 귓속말을 보낸 경우, 해당 값은 gm이 됩니다. |
|
대상 이름 |
(입력 귓속말 만) 귓속말을 보낸 대상인 플레이어 또는 캐릭터의 표시할 이름입니다. |
|
선택된 |
무언가가 선택되었을 때 플레이어 “api” 명령어에 표시됩니다. 각 항목은 Roll20 객체가 아닌 {_id, _type} 형태의 일반 객체입니다. 메시지가 sendChat()에서 전송된 경우에는 생략됩니다. |
|
비밀 |
false |
비밀 및 극비 등급의 주사위 굴림과 메시지에 해당합니다. |
비밀 유지 |
"공개" |
"공개", "비밀" 또는 "슈퍼". |
비밀 및 초비밀 롤은 다음 명령어를 사용합니다(두 샌드박스 버전 모두에서 사용 가능):
-
/secretroll또는/sr—유형은"secretrollresult",비밀여부는 true,비밀 수준은"secret"입니다. -
/supersecretroll또는/ssr—유형은"supersecretrollresult",비밀여부는 true,비밀 등급은"super"입니다. -
/secret또는/s뒤에 메시지를 입력합니다(예:/secret [[1d6]]) —유형은“일반”으로유지되며,비밀여부는“true”, 비밀등급은“비밀”로설정됩니다. 귓속말로 주사위를 굴리는 방식의 간결한 비밀 방식: GM은 수치를 확인하고, 주사위를 굴린 사람은 비밀 주사위 굴림이 이루어졌음을 알 수 있다. -
/supersecret또는/ss뒤에 메시지를 입력하면 —유형은"일반"으로 유지되며,비밀 수준은true,기밀 수준은"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 // 두 번째 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 //전체 주사위 결과. 복합 폭발이므로 주사위 결과는 단 하나뿐임을 유의하십시오.
}
]
}
]
],
"mods": {
"success": {
"comp":">=",
"point":6
}
},
"resultType":"sum",
"results": [
{
"v":13
}
]
}
],
"resultType":"success", // 이 경우 결과는 성공 건수입니다
"total":1 //총 성공 건수
}
채팅 이벤트 예시 (사용자 정의 주사위 유형 구현)
on("chat:message", 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 다음 중 하나일 수 있습니다:
- 어떤 문자열이든, 이 경우 해당 문자열이 메시지를 보낸 사람의 이름으로 사용됩니다. 예를 들어
"라일리" - 플레이어의 ID는
"player|-Abc123"형식으로 표기되며, 여기서-Abc123은해당 플레이어의 ID입니다. 이렇게 하면 플레이어의아바타와이름이 자동으로 적용됩니다. - 캐릭터의 ID로,
"character|-Abc123"형식으로 표기됩니다. 이렇게 하면 캐릭터의아바타와이름이 자동으로 적용됩니다.
입력 Roll20 앱에서 사용되는 것과 마찬가지로 유효한 표현식이어야 합니다. 기본 메시지를 보내려면 텍스트를 입력하거나, /roll, /em, /w, /secretroll (/sr), /supersecretroll (/ssr), /secret (/s), /supersecret (/ss) 등과 같은 슬래시 명령어를 사용하면 됩니다. 추가로:
- 캐릭터 속성은
@{CharacterName|AttributeName}형식으로 사용할 수 있습니다. - 캐릭터 능력은
%{CharacterName|AbilityName}형식으로 사용할 수 있습니다. - 플레이어가
#MacroName을입력하는 방식으로는sendChat에서매크로를 호출할 수 없습니다. 버튼을 클릭하면 매크로를 실행할 수 있습니다:[이름](! #MacroName). -
@{selected|...}는sendChat내부에서 전개되지 않습니다. 대신채팅:message핸들러에서msg.selected를읽어오세요. - 일반 메시지와 귓속말에는 아래의 HTML 태그를 포함할 수 있습니다.
/direct <msg>명령어를 사용하면 마크다운이나 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>
콜백 은 선택적인 세 번째 매개변수로, 게임에 명령을 전송하는 대신 sendChat() 호출의 결과를 전달받는 콜백 함수로 구성됩니다. 이러한 방식으로 sendChat() 을 사용하는 것은 비동기적입니다. sendChat() 명령어의 결과는 일련의 작업으로 구성된 배열이 되며, 각 개별 객체는 채팅:message 이벤트 발생 시 수신하는 객체와 동일합니다(위 내용 참조).
예를 들어, Roll20 주사위 엔진을 사용하여 주사위를 굴린 후 즉시 결과를 확인할 수 있습니다. 그런 다음 게임 내 플레이어에게 전송하기 전에 롤에 추가 수정을 가할 수 있습니다.
sendChat("Riley", "/roll 1d20+4", function(ops) {
// ops는 명령어 실행 결과로 구성된 배열이 됩니다.
var rollresult = ops[0];
//이제 채팅:메시지 이벤트가 발생했을 때와 마찬가지로 rollresult를 사용하여 작업을 수행합니다...
});
옵션 는 메시지 처리 방식을 설정하기 위한 선택적 네 번째 매개변수입니다. 옵션은 자바스크립트 객체 형태로 지정되며, 이 객체의 속성은 설정할 옵션의 이름이고, 값은 해당 옵션에 대한 설정값입니다. 일반적으로 기본값은 false이므로 값은 true로 설정됩니다.
사용 가능한 옵션:
-
noarchive– 이 설정을 true로 설정하면 메시지가 채팅 기록에 저장되지 않습니다. 이는 Mod 스크립트 버튼 메뉴나 상태 정보 등, 스토리 본편에 포함되지 않는 출력 내용에 특히 유용합니다. -
use3d– 이제 sendChat() 함수를 사용하여 3D 주사위 굴림 결과를 생성할 수 있습니다. 구문은 간단합니다:sendChat("Name", "Rolling [[3d6]]", null, {use3d: true});name 매개변수에 플레이어 ID를 전달하면(예:sendChat("player|-ABC123",...)), 해당 플레이어의 색상이 주사위에 적용됩니다. 그렇지 않으면 기본 흰색이 사용됩니다.
참고: 클라이언트는 한 번에 하나의 3D 롤 결과만 표시할 수 있으므로, 여러 개의 3D 롤을 연속으로 생성하는 것은 의미가 없습니다. 또한 3D 롤을 사용하면 양자 주사위 서버에 다소 더 많은 부하가 걸리므로, 상황에 따라 적절히 판단하여 1초 만에 100번의 3D 롤을 실행하지 않도록 주의해 주세요. 롤이 플레이어에게 중요하고 게임에 영향을 미칠 때 3D 롤을 사용하세요.
이러한 옵션을 조정하고 싶지만 콜백 매개변수(세 번째 매개변수—위 내용 참조)를 사용하지 않으려면, 해당 위치에 null을 전달하기만 하면 됩니다:
sendChat("상태", "모든 플레이어가 로그인되었습니다.", null, {noarchive:true});
모드 스크립트 명령 버튼
모드 스크립트 메시지, 매크로 및 능력에서 텍스트 채팅 서식을 적용하면 채팅창에 명령 버튼이 생성될 수 있습니다.
이를 마크다운 서식으로 수행하려면:
[공격 주사](!attackroll)
괄호 안의 텍스트는 버튼에 표시되며, 괄호 안의 부분은 실행될 명령어입니다. 일반 롤에는 무엇이든 포함시킬 수 있습니다(매크로, 능력, 쿼리 등). 다만 해당 명령어 자체는 이를 클릭한 플레이어가 실행하게 된다는 점을 명심하세요. 예를 들어, 메시지를 볼 수 있는 모든 사람이 해당 캐릭터에 접근할 수 없는 경우에는 @{Character|AC}를 포함하지 마십시오. 대신, 채팅 메시지를 보내기 전에 직접 입력하여 명령을 보낼 당시 존재했던 실제 값을 포함시키세요. 이 버튼들은 일반 메시지, 귓속말, 그리고 GM에게 보내는 귓속말에서 모두 작동합니다. 클릭 시, 클릭한 플레이어가 해당 플레이어의 playerid를 가지고 선택된 상태로 실행됩니다.
/direct는 마크다운을 무시하므로 [공격 굴림](!attackroll)은 버튼으로 변환되지 않습니다.
채팅창에 모드 스크립트 버튼 입력하기
또한 채팅창에 마크다운 구문이나 모드 스크립트 버튼을 입력하여 다른 사람들이 사용할 수 있도록 할 수도 있습니다. 채팅 파서가 해석할 것이므로, 버튼 클릭 시 속성, 쿼리 및 주사위 굴림이 확장되도록 하려면 명령어 일부를 특수 구문(HTML 엔티티)으로 입력해야 합니다:
| 캐릭터 | 교체 |
|---|---|
% |
% |
) |
) |
? |
? |
@ |
@ |
[ |
[ 또는 [
|
] |
] 또는 ]
|
{ |
{ |
} |
} |
| |
| |
, |
, |
이 샘플 버튼은 그 중 일부를 사용합니다:
[공격 주사위 굴리기](!attackroll @{target|token_id} [[1d6+?{Bonus|0}]])
실제로 모드 스크립트 버튼을 사용하여 매크로나 능력을 실행할 수 있습니다.
| 캐릭터 | 교체 |
|---|---|
<carriage return> |
|
이를 위해서는 명령어 부분의 시작에 특수 코드 ! 을 붙인 다음, #을 사용하여 매크로를 호출하거나 % (%)을 사용하여 능력을 호출하면 됩니다:
[매크로](! #MacroName)
[능력](! %{CharName|AbilityName})
참고: 현재, 사이드바의 ‘컬렉션’ 탭에 저장된 매크로를 다시 열면, 매크로 내의 HTML 엔티티가 원래 상태로 되돌아가게 됩니다. 이후 해당 매크로를 저장하면, 이러한 변경 사항도 함께 저장됩니다. 이 동작은 다음에서는 나타나지 않습니다. 능력 이나 능력 명령 버튼에서는 나타나지 않습니다.
능력 명령 버튼의 경우, 버튼을 생성하는 능력이며 해당 버튼이 참조하는 능력이 모두 같은 시트에 있다면 구문은 매우 간단합니다:
[능력](~AbilityName)