모드 스크립트: 고급 예제

이 요리책에는 시작하는 데 도움이 될 만한 간단한 스크립트 예시가 몇 가지 수록되어 있습니다. 마음껏 가져가셔서 여러분의 캠페인에 맞게 수정하여 사용하셔도 좋습니다. 또한 ‘모드 스크립트 포럼’이 마련되어 있어, 여기서 모드 스크립팅에 대해 토론하고 커뮤니티와 스크립트를 공유할 수 있습니다.

토큰 상태 관리자

(에릭 달퀴스트 기고)

이 스크립트는 바값을 기반으로 상태 표시기를 자동으로 추가합니다. 이 스크립트는 세 개의 바 중 어느 하나를 추적하도록 설정할 수 있으며, 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초마다 한 번씩 동작 수행
});
도움이 되었습니까?
45명 중 33명이 도움이 되었다고 했습니다.