이 요리책에는 시작하는 데 도움이 될 만한 간단한 스크립트 예시가 몇 가지 수록되어 있습니다. 마음껏 가져가셔서 여러분의 캠페인에 맞게 수정하여 사용하셔도 좋습니다. 또한 ‘모드 스크립트 포럼’이 마련되어 있어, 여기서 모드 스크립팅에 대해 토론하고 커뮤니티와 스크립트를 공유할 수 있습니다.
토큰 상태 관리자
(에릭 달퀴스트 기고)
이 스크립트는 바값을 기반으로 상태 표시기를 자동으로 추가합니다. 이 스크립트는 세 개의 바 중 어느 하나를 추적하도록 설정할 수 있으며, 0과 1 사이의 임의의 비율에 대해 상태 표시기를 설정할 수 있습니다. 이 스크립트는 단일 인스턴스 내에서 여러 개의 바/토큰을 관리할 수 있습니다. 아래 예제는 1번 바를 모니터링하여, 값이 <= 50%일 때 레드 마커를 설정하고, 값이 <= 0일 때 데드 마커를 설정합니다.
/**
* 바의 현재/최대 비율에 따라 다양한 토큰 마커를 설정합니다.
*
* CONFIG 배열에는 임의의 개수의 구성 객체를 포함할 수 있습니다. 이 객체들
* 는 순서대로 처리됩니다.
*
* barId - 값을 확인할 바의 ID [1, 2, 3]
* barRatio - 상태 마커 설정을 트리거하는 바 값과 최대 값의 비율 [0 - 1]
* status - 토글할 상태 마커의 이름 [redmarker, bluemarker, greenmarker, brownmarker, purplemarker, dead]
* whenLow - 막대 값이 <일 때 마커의 상태 [비율] [true, false]
*/
var CONFIG = [
{barId: 1, barRatio: .5, status: "redmarker", whenLow: true},
{barId: 1, barRatio: 0, status: "dead", whenLow: true}
];
on("change:token", function(obj) {
CONFIG.forEach(function(opts) {
var maxValue = parseInt(obj.get("bar" + opts.barId + "_max"));
var curValue = parseInt(obj.get("bar" + opts.barId + "_value"));
log(opts.barId + ": " + curValue + "/" + maxValue);
if (!isNaN(maxValue) && !isNaN(curValue)) {
var markerName = "status_" + opts.status;
if (curValue <= (maxValue * opts.barRatio)) {
obj.set(markerName, opts.whenLow);
}
else {
obj.set(markerName, !opts.whenLow);
}
}
});
});
임시 HP 매니저
(에릭 달퀴스트 기고)
임시 체력을 자동으로 관리합니다. 토큰 바 중 하나를 임시 HP를 표시하는 데 사용하는 경우, 이 스크립트는 해당 값이 메인 HP 바에서 제거되기 전에 임시 HP 값에서 HP를 자동으로 차감할 수 있습니다.
/**
* 임시 HP가 존재할 경우 자동으로 제거합니다.
*
* 토큰의 HP가 감소하면 스크립트는
* 임시 HP가 남아 있는지 확인합니다. 만약 그런 경우라면, 그것들이 먼저 제거되고 실제 HP는
* 타격을 흡수한 임시 HP를 반영하도록 업데이트되었습니다.
*
* TEMP_BAR_ID - 임시 HP를 추적하는 데 사용되는 바 [1, 2, 3]
* HP_BAR_ID - 실제 HP를 추적하는 데 사용되는 바 [1, 2, 3]
*/
var TEMP_BAR_ID = 2;
var HP_BAR_ID = 1;
on("change:token", function(obj, prev) {
var prevHpValStr = prev["bar" + HP_BAR_ID + "_value"];
var prevHpVal = parseInt(prevHpValStr);
if (isNaN(prevHpVal)) {
log("WARN: 이전 바 " + HP_BAR_ID + "에 숫자가 포함되어 있지 않습니다: '" + prevHpValStr + "'");
return;
}
var hpValStr = obj.get("bar" + HP_BAR_ID + "_value");
var hpVal = parseInt(hpValStr);
if (isNaN(hpVal)) {
log("WARN: 바 " + HP_BAR_ID + "에 숫자가 포함되어 있지 않습니다: '" + hpValStr + "'");
return;
}
if (prevHpVal > hpVal) {
var tmpHpVal = parseInt(obj.get("bar" + TEMP_BAR_ID + "_value"));
log(prevHpVal + " - " + hpVal + " - " + tmpHpVal);
if (!isNaN(tmpHpVal)) {
var hpChange = prevHpVal - hpVal;
var remainingTmp = tmpHpVal - hpChange;
if (remainingTmp > 0) {
obj.set("bar" + TEMP_BAR_ID + "_value", remainingTmp);
obj.set("bar" + HP_BAR_ID + "_value", prevHpVal);
}
else {
var remainingHp = prevHpVal + remainingTmp;
obj.set("bar" + TEMP_BAR_ID + "_value", 0);
obj.set("bar" + HP_BAR_ID + "_value", remainingHp);
}
}
}
});
순찰 토큰
on("ready", function() {
// 캠페인이 완전히 로드되었는지 확인할 수 있도록 ready 이벤트가 발생하기까지 기다립니다.
//순찰 토큰에 대한 참조를 가져옵니다.
var patroltoken = findObjs({_type: "graphic", name: "Guard A"})[0]; //캠페인 내에 "Guard A"라는 토큰이 있다는 것을 알고 있다.
var direction = -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초마다 한 번씩 동작 수행
});