시트 작업자 스크립트

시트 워커 스크립트 추가하기

캐릭터 시트에 시트 워커 스크립트를 추가하려면, 다음 형식을 사용하여 스크립트를 시트의 "HTML" 섹션에 추가하면 됩니다.

<스크립트 타입="text/worker">

on("change:strength", function() {

});

// ... etc

</스크립트>

시트의 템플릿에서 모든 스크립트 태그가 보안 목적으로 제거됩니다. 게임이 로드될 때, 모든 스크립트 태그가 시트의 템플릿에서 제거됩니다. 그러나 "text/worker" 유형의 스크립트 태그는 각 플레이어의 컴퓨터에서 백그라운드 워커를 생성하여 시트의 변경된 값에 응답하고 필요한 조치를 취할 수 있습니다. 모든 시트 워커 스크립트는 단일 스크립트 태그 내에 포함되어야 합니다.

기초에 대한 보다 포괄적인 예시비 프로그래머를 대상으로

<script type="text/worker">'전역' 변수 범위에 대한 경고:`` 내부에서`로 선언되었지만함수 외부에서로 선언된 변수의 범위는 현재 캐릭터 당이 아닌플레이어 당입니다. 값을 변경하면 플레이어 세션의 모든 캐릭터에 대해 변경됩니다.

가능하면 비동기적인 연쇄는 피하는 것이 일반적으로 더 좋은 방법입니다. 계산에 필요한 모든 속성을 하나의 getAttrs에서 가져오는 것이 일반적으로 더 나은 방법입니다. getAttrs -> 계산 -> setAttrs -> getAttrs -> 계산 -> setAttrs…


시트 워커 vs. 자동 계산 필드: 어떤 것을 사용해야 할까요?

이에 대한 엄격한 규칙은 없습니다. 이 두 도구 모두 같은 결과를 얻을 수 있습니다. "힘" 속성이라는 가상의 사용 사례를 살펴보겠습니다. 이 속성은 "힘 수정" 속성을 최신 상태로 유지하기 위해 사용하려고 합니다. 이 사용 사례에 대한 두 도구 간의 차이점은 다음과 같습니다.

  • 자동 계산 필드는 시트가 처음 열릴 때마다 모두 다시 계산됩니다. 반면에 시트 워커 필드는 종속 값이 변경될 때만 다시 계산됩니다. 따라서 시트 워커 옵션을 사용하는 시트는 플레이어가 열고 상호 작용하는 데 훨씬 빠릅니다.
  • 또한, 시트 워커 계산은 백그라운드 프로세스에서 실행되므로 계산이 실행되는 동안 사용자 인터페이스 지연이 발생하지 않습니다. 반면에 비활성 필드는 주 프로세스에서 실행되며, 한 번에 많은 수의 필드를 계산하는 경우(예: 수천 개의 비활성 필드를 사용하는 매우 복잡한 시트) "잠김" 또는 "지연"을 유발할 수 있습니다.
  • 자동 계산되는 힘 수정 필드는 플레이어에게 비활성화된 것처럼 보입니다. 반면에 시트 워커에 의해 업데이트되는 힘 수정 필드는 계산이 실행된 후에 수정 가능합니다(하지만 힘 값이 변경되면 입력된 값은 덮어씌워집니다). 따라서 시트 워커는 홈브루 규칙을 더 잘 지원하며, 플레이어는 힘이 변경된 후에도 수정 값만 간단히 변경할 수 있습니다. 반면에, 자동 계산 필드는 그러한 변경을 허용하지 않으므로 규칙이 더 엄격하게 '강제'됩니다.

일반적으로, 우리의 권장사항은 자동 계산 필드를 절약하여 사용하는 것입니다.최대 500에서 1,000개의 자동 계산 필드를 사용하십시오. 대부분의 계산에는 새로운 시트 작업자 기능을 사용하는 것이 좋습니다. 특히 드물게 수행해야 하는 계산에는 (예: 힘 값 (따라서 힘 수정 값)은 캐릭터가 레벨업할 때 세션 당 최대 한 번만 변경됩니다. 시트가 열릴 때마다 동일한 계산을 반복 실행할 필요가 없습니다.


시트 작업자 API

이벤트

eventInfo 객체

대부분의 이벤트는 이벤트 상황에 대한 추가 세부 정보를 제공하는eventInfo객체를 전달합니다.

속성 설명
sourceAttribute 이벤트를 트리거한 원래 속성입니다. 이 이벤트를 최초로 트리거한 속성의 전체 이름입니다 (반복 섹션에 속한 경우 RowID 포함).

참고: 전체 문자열은 소문자로 번역되었을 수 있으므로 getAttrs()에 직접 입력하기에 적합하지 않을 수 있습니다.

sourceType 이벤트를 트리거한 에이전트,플레이어또는시트 워커
previousValue 속성의 원래 값,on:change이벤트에서 속성이 변경되기 전.
newValue on:change이벤트에서 속성이 변경된 값.
removedInfo remove:repeating_groupname이벤트에서 제거된 모든 속성 값이 포함된 객체입니다.

 

change:<attribute_name>

특정 속성의 변경 사항을 듣도록 허용하거나, 반복 섹션의 경우 전체 섹션의 변경 사항을 듣도록 합니다. 매우 간단합니다:

on("change:strength change:StrengthMod change:StrengthOtherThing", function(eventInfo) {
   //Do something here
   // eventInfo.previousValue는 변경되기 전 이 이벤트를 트리거한 속성의 원래 값입니다.
   // eventInfo.newValue는 변경된 후 이 이벤트를 트리거한 속성의 현재 값입니다.
});

on("change:repeating_spells:spellname", function(eventInfo) {
   //Do something here
   // eventInfo.sourceAttribute는 원래 이 이벤트를 트리거한 
   // 속성의 전체 이름(반복 ID 포함)이지만, 
   // 전체 문자열이 소문자로 변환되었으므로 
   // 소문자를 먼저 변환하지 않고 getAttrs() 또는 다른 용도로 직접
   // 공급하는 데 적합하지 않을 수 있습니다.
});

on("change:repeating_spells", function(eventInfo) {
   // 반복_spells 섹션의 속성이 변경될 때 트리거됩니다
   // eventInfo.sourceAttribute는 원래 이 이벤트를 트리거한 속성의 전체 이름 (소문자)(반복 ID 포함) 
   //입니다. 
});

Note: All attribute names are lowercased in events. So even if you normally refer to an attribute as "Strength", use "change:strength" in the event listener.

Note: This supports the "_max" suffix in that ether "change:strength" or "change:strength_max" will fire an event, however these two variations seem to be interchangeable, in that ether or both will fire when ether "strength" or "strength_max" changes.

For attributes in repeating fields, all of the following would be triggered when the "repeating_spells_SpellName" attribute is updated: "change:repeating_spells:spellname", "change:repeating_spells", "change:spellname", "change:spellname_max". This gives you maximum flexibility in choosing what "level" of change event you want to bind your function to.

Sheetworkers can also listen for a change event of a special attribute that is modified whenever a repeating section is re-ordered.

on("change:_reporder:<sectionname>", function(eventInfo) {
   // Where <sectionname> above should be a repeating section name, such as skills or spells
});

 

remove:repeating_<groupname>

This is an event which will fire whenever a row is deleted from a repeating field section. You can also listen for a specific row to be deleted if you know its ID, such as on("remove:repeating_inventory:-ABC123")

on("remove:repeating_inventory", function(eventInfo) {
     //Fired whenever a row is removed from repeating_inventory
     // eventInfo.sourceAttribute is the full name (including ID) of the first attribute that triggered the event (you can use this to determined the ID of the row that was deleted)
});

The removed:repeating_<groupname> function's eventinfo includes a special property removedInfo that displays all of the attributes of the now removed repeating section.

on("remove:repeating_inventory", function(eventinfo) {
   console.log(eventinfo.removedInfo);
});

 

시트:열림

이 이벤트는 게임 세션에서 플레이어가 시트를 열 때마다 발생합니다. 시트 업그레이드가 필요한지 확인하는 것과 같은 작업에 유용할 것입니다.

on('sheet:opened',function(){

// 플레이어가 세션에서 시트를 처음 열 때 무언가를 수행합니다.

});

 

clicked:<button_name>

이 이벤트는 작업 버튼이 클릭될 때 트리거됩니다. 버튼의 이름은 "act_"로 시작해야합니다. 예를 들어:

<button type="action" name="act_activate">활성화!</button>

에서("clicked:activate", function() {
  console.log("활성화 버튼이 클릭되었습니다");
});

 

기능

getAttrs(attributeNameArray, callback) 비동기

getAttrs 함수는 시트에서 속성 집합의 값을 가져올 수 있게 해줍니다. "_max" 접미사는 지원되므로,getAttrs( ["Strength", "Strength_max"], func)으로 "Strength"의 현재 값과 최대 값 둘 다 가져올 수 있습니다. 함수가 비동기식이므로, 여러 개의 getAttrs 호출이 순서대로 실행될 것이라는 보장은 없습니다. 대신에 값을 계산한 후에 실행될 콜백 함수를 전달합니다. 콜백 함수는 요청한 각 속성에 대해 키-값 쌍 목록을 가진 간단한 자바스크립트 객체를 받습니다.

다음은 예입니다:

에서으로 변경합니다. ("change:strength", 함수() {
   getAttrs(["Strength", "Level"], function(values) {
      //values.Strength 및/또는 values[ "Level" ]을 사용하여 작업 수행
   });
});

반복 섹션의 값은 약간의 특별한 처리가 필요합니다. 만약 현재 반복 섹션 안에 있는 이벤트가 이미 반복 섹션 안에 있다면, 반복 그룹 이름 앞에 변수 이름을 사용하여 변수를 요청하면 이벤트가 트리거된 반복 섹션과 동일한 반복 섹션에서 값을 받게 됩니다. 예를 들어, SpellName, SpellLevel 및 SpellDamage를 모두 가진 repeating_spells 섹션이 있는 경우:

에서에 (변경:repeating_spells:spelllevel), 기능() {
   getAttrs([
      "repeating_spells_SpellDamage",
      "repeating_spells_SpellName"
    ], function(values) {
      //values.repeating_spells_SpellDamage과 values.repeating_spells_SpellName은 
//변경된 SpellLevel이 있는 반복 섹션 행에서 모두 가져올 것입니다.
   });
});

반복 섹션에 현재 있지 않은 경우 수동으로 ID를 지정하여 반복 섹션 행의 필드 값만 요청할 수도 있습니다.

getAttrs(["repeating_spells_-ABC123_SpellDamage"]...

"_reporder_repeating_<sectionname>" 속성을 getAttrs()로 요청하여 섹션에서 정렬된 모든 ID 목록을 얻을 수도 있습니다. 그러나 이는 섹션의 모든 ID 목록을 포함하지 않을 수 있음을 유의하십시오. 섹션에 포함되지 않은 목록에는 정렬된 ID 이후에 온다고 가정합니다.

 

setAttrs(values,options,callback) 비동기

values -- 이는 속성의 이름(attr_ 접두사 제외)이며 해당 속성을 설정하려는 값입니다.

options -- (선택 사항) 이는 함수에 대한 선택적 동작을 지정하는 객체입니다. 현재 유일한 옵션은 "silent"이며, 제공된 속성을 설정할 때 변경 이벤트 전파를 방지합니다.

callback -- (선택 사항) 이는 속성이 업데이트된 후에 실행되는 콜백 함수입니다.

setAttrs 함수를 사용하면 캐릭터 시트의 속성을 설정할 수 있습니다. 속성의 최대값을 설정하려면 "_max" 접미사를 사용하십시오. 예를 들어 "Strength_max"입니다.

에서로 변경 ("change:strength", 함수() {
   getAttrs(["Strength", "Level"], 함수(values) {
      setAttrs({
          StrengthMod: Math.floor(values.Strength / 2)
      });
   });
});

참고: 이 방법으로 비활성화된 입력 필드를 업데이트하려고 할 때 문제가 발생할 수 있습니다. 이 `setAttrs` 메서드를 사용하여 숨겨진 입력을 설정한 다음 비활성화된 입력을 숨겨진 요소로 설정하는 옵션이 있습니다. 이 예제에서는 will이라는 속성을 가지고 있으며, will 통계의 1/2에 기반한 판단을 계산하고 90을 초과하지 않도록 설정하려고 합니다. 아래 참조하세요.

<레이블>판단</레이블>
<입력 타입="숨김" 이름="attr_foo_judgment"="0" />
<입력 타입="숫자" 이름="attr_judgment"="@{foo_judgment}" 비활성화="true" 제목="1/2 of will rounded down, 90 max" />
에서으로 변경합니다. ("change:will", 함수() {
  getAttrs(["will"], function(values) {
    setAttrs({ foo_judgment: Math.min(90, (values.will/2)) });
  });
});

setAttrs 함수는 비동기 함수이므로 setAttrs() 호출에 대한 실제 속성이 어떤 순서로 설정될지 보장할 수 없습니다.

반복 섹션의 경우, 원본 이벤트가 반복 섹션에 있는 경우 간단한 변수 이름을 사용할 수도 있고, 어떤 이벤트에서든 ID를 포함한 전체 반복 섹션 변수 이름을 지정할 수도 있습니다.

에서로 변경합니다. ("change:repeating_spells:spelllevel", 함수() {
   getAttrs(["repeating_spells_SpellLevel", "repeating_spells_SpellName"], 함수(values) {
      setAttrs({
         repeating_spells_SpellDamage: Math.floor(values.repeating_spells_SpellLevel / 2) + 10
      });
   });
});

 

getSectionIDs(section_name,callback) 비동기

이 함수를 사용하면 주어진 반복 섹션에 현재 존재하는 ID 목록을 가져올 수 있습니다. 이는 인벤토리와 같은 것들을 계산하는 데 유용합니다. 여기에는 변수 개수의 행이 있을 수 있습니다.

에서로 ("change:repeating_inventory", 기능() {
   getSectionIDs("inventory", 기능(idarray) {
      for(var i=0; i < idarray.length; i++) {
         //IDs로 무언가 수행
      }
   });
});

참고로 GetAttrs()를 사용하여 "_reporder_repeating_<sectionname>" 속성을 요청하여 해당 섹션의 모든 ID 목록을 가져올 수 있습니다. 그러나 이에는 섹션의 모든 ID 목록이 포함되지 않을 수 있음에 유의하세요. 리스트에 없는 ID는 해당 섹션의 정렬된 ID 뒤에 온다고 가정합니다.
즉, getSectionIDs()는 모든 ID를 가져옵니다 - 그러나 사용자에게 표시되는 순서대로는 아닙니다. getAttrs("_reporder_repeating_<sectionname>", ...)은 정상적인 정렬 순서에서 벗어난 모든 ID의 목록을 반환합니다. 다음 함수를 사용하여 getSectionIDs를 대체하여 표시되는 순서대로 ID를 가져올 수 있습니다.

var getSectionIDsOrdered = function (sectionName, callback) {
  'use strict';
  getAttrs([`_reporder_${sectionName}`], function (v) {
    getSectionIDs(sectionName, function (idArray) {
      let reporderArray = v[`_reporder_${sectionName}`] v[`_reporder_${sectionName}`].toLowerCase().split(',') : [],
        ids = [...new Set(reporderArray.filter(x => idArray.includes(x)).concat(idArray))];
      callback(ids);
    });
  });
};

 

generateRowID()

A synchronous function which immediately returns a new random ID which you can use to create a new repeating section row. If you use setAttrs() and pass in the ID of a repeating section row that doesn't exist, one will be created with that ID.

Here's an example you can use to create a new row in a repeating section:

var newrowid = generateRowID();
var newrowattrs = {};
newrowattrs["repeating_inventory_" + newrowid + "_weight"] = "testnewrow";
setAttrs(newrowattrs);

 

removeRepeatingRow( RowID )

A synchronous function which will immediately remove all the attributes associated with a given RowID and then remove the row from the character sheet. The RowID should be of the format "repeating_<sectionname>_<rowid>". For example, "repeating_skills_-KbjuRmBRiJNeAJBJeh2".

Here is an example of clearing out a summary list when the original list changes:

에서로 ("change:repeating_inventory", 함수() {
   섹션 ID 가져오기("repeating_inventorysummary", 함수(idarray) {
      for(var i=0; i < idarray.length; i++) {
        반복 행 제거("repeating_inventorysummary_" + idarray[i]);
      }
   });
});

 

getTranslationByKey([key])

주어진 키와 관련된 번역 문자열을 즉시 반환하는 동기 함수입니다. 키가 없는 경우 false가 반환되고 콘솔에 표시되는 메시지에는 번역 JSON에서 찾을 수 없는 특정 키가 나열됩니다.

다음 번역 JSON에서 번역 문자열을 가져오는 데 사용할 수 있는 예제입니다.

{
    "str": "Strength",
    "dex": "Dexterity"
}
var strTranslation = getTranslationByKey('str'); // "Strength"
var dexTranslation = getTranslationByKey('dex'); // "Dexterity"
var intTranslation = getTranslationByKey('int'); // false

 

getTranslationLanguage()

사용자가 선택한 언어에 대한 2자리 언어 코드를 즉시 반환하는 동기 함수입니다.

번역 언어를 가져오는 데 사용할 수 있는 예제입니다:

var translationLang = getTranslationLanguage(); // "en" , for an account using English

 

setDefaultToken(values)

A function that allows the sheet author to determine what attributes are set on character dropped from the compendium. When setting the default token after a compendium drop, this function can set any attributes on the default token to tie in important attributes specific to that character sheet, such as attr_hit_points.

The list of token attributes that can be set by setDefaultToken are:

["bar1_value","bar1_max","bar2_value","bar2_max","bar3_value","bar3_max","aura1_square","aura1_radius","aura1_color","aura2_square","aura2_radius","aura2_color",
"tint_color","showname","showplayers_name","playersedit_name","showplayers_bar1","playersedit_bar1","showplayers_bar2","playersedit_bar2","showplayers_bar3",
"playersedit_bar3","showplayers_aura1","playersedit_aura1","showplayers_aura2","playersedit_aura2","light_radius","light_dimradius","light_angle","light_otherplayers",
"light_hassight","light_losangle","light_multiplier"]

For more information about this attributes and what they do, please see the the API Objects Page.

다음은 예입니다:

에서까지 ("sheet:compendium-drop", 기능() {
    var default_attr = {};
    default_attr["width"] = 70;
    default_attr["height"] = 70;
    default_attr["bar1_value"] = 10;
    default_attr["bar1_max"] = 15;
    setDefaultToken(default_attr);
});
도움이 되었습니까?
31명 중 17명이 도움이 되었다고 했습니다.