시트 워커 스크립트 추가하기
캐릭터 시트에 시트 워커 스크립트를 추가하려면, 간단히 다음 형식을 사용하여 시트의 "HTML" 섹션에 스크립트를 추가하면 됩니다:
<script type="text/worker"> on("change:strength", function() { }); // ... 등등 script>
스크립트 태그는 "text/worker" 유형이어야 시스템에서 적절히 처리됩니다. 게임이 로드될 때, 모든 스크립트 태그가 보안 목적으로 시트의 템플릿에서 제거됩니다. 그러나 "text/worker" 유형의 스크립트 태그는 각 플레이어의 컴퓨터에서 백그라운드 워커를 활성화하여 시트의 값이 변경될 때 대응하고 필요에 따라 조치를 취할 수 있습니다. 모든 시트 워커 스크립트를 하나의 스크립트 태그에 포함해야 합니다.
기초의 보다 포괄적인 예제 non-programmers를 위한
"global" 변수 범위에 대한 경고: 변수의 범위는 현재 플레이어 당이 아니라 캐릭터 당으로 선언된 변수에 있는 경우에 관한 경고 그 값을 변경하면 플레이어 세션의 모든 캐릭터에 대해 변경됩니다.
가능한 경우 비동기 카스케이드는 피하는 것이 더 좋은 실천 방법입니다. 계산에 필요한 모든 속성을 얻는 것이 하나의 getAttrs에서 모든 getAttrs -> 계산 -> setAttrs -> getAttrs -> 계산 -> setAttrs보다 일반적으로 더 나은 실천 방법입니다.
시트 워커 vs. 자동 계산 필드: 어떤 것을 사용해야 할까요?
이에 대한 엄격한 규칙은 없습니다. 이 두 도구 모두 동일한 기능을 수행할 수 있습니다. 가상으로 세운 '힘' 속성의 사용 사례를 살펴보면, '힘 수정' 속성을 업데이트할 때 사용할 것입니다. 이 사용 사례에 대해 두 도구 간의 차이점은 다음과 같을 것입니다:
- 자동 계산 필드는 시트가 처음 열릴 때마다 모두 재계산됩니다. 반면에 시트 워커 필드는 종속 값이 변경될 때만 다시 계산됩니다. 이는 시트 워커 옵션을 사용하는 시트가 플레이어가 열고 상호 작용하는 데 훨씬 더 빠를 것을 의미합니다.
- 또한 시트 워커 계산은 백그라운드 프로세스에서 실행되므로 계산이 진행되는 동안 사용자 인터페이스 지연이 발생하지 않습니다. 반면에 비활성화된 필드는 주 프로세스에서 실행되어 한 번에 많은 수의 필드(예: 매우 복잡한 시트를 사용하고 있는 경우 수천 개의 비활성화된 필드를 사용하는 경우)를 계산할 때 '잠금' 또는 '버벅거림'을 일으킬 수 있습니다.
- 자동 계산 '힘 수정' 필드는 플레이어에게 비활성화된 상태로 보일 것입니다. 반면에 시트 워커에서 업데이트되는 '힘 수정' 필드는 계산이 완료된 후 수정 가능할 것입니다(하지만 입력된 값은 '힘' 값이 변경될 때 덮어씁니다). 따라서 플레이어가 '힘'을 수정한 후 모드 값을 수정할 수 있으므로 시트 워커가 홈브루 규칙을 더 잘 지원할 것입니다. 반면에 자동 계산 필드는 그러한 변경을 허용하지 않으므로 규칙이 '강제'되는 경향이 있습니다.
일반적으로, 저희의 권장사항은 자동 계산 필드를 절약하십시오. 500 ~ 1,000 개의 자동 계산 필드에 예산을 할당하십시오. 대부분의 계산에는 새 시트 워커 기능을 사용하는 것을 권장합니다, 특히 드물게 수행해야 하는 계산(예: '힘' 값(따라서 '힘 수정')이 캐릭터 레벨업할 때 세션당 최대 한 번 변경됩니다. 시트가 여는 시간마다 같은 계산을 반복할 필요가 없습니다.
시트 작업자 API
이벤트
eventInfo 객체
많은 이벤트는 이벤트의 상황에 대한 추가 정보를 제공하는 'eventInfo' 객체가 전달됩니다.
속성 | 기능 |
---|---|
sourceAttribute |
이벤트를 발생시킨 원본 속성입니다. 원래 해당 이벤트를 발생시킨 속성의 전체 이름 (반복 섹션에 RowID가있을 경우 포함).
참고: 전체 문자열은 소문자로 번역되었으므로 직접 getAttrs()에 입력하는 데 적합하지 않을 수 있습니다. |
sourceType |
이벤트를 발생시킨 대상, player 또는 sheetworker
|
previousValue |
속성의 원래 값이 변경되기 전인 on:change 이벤트에서의 값입니다. |
newValue |
on:change 이벤트에서 속성이 변경된 값입니다. |
removedInfo |
remove:repeating_groupname 이벤트에서 제거된 모든 속성의 값이 들어 있는 객체. |
change:<attribute_name>
특정 속성의 변경 사항 또는 반복 섹션의 전체 섹션에서 발생하는 변경 사항을 듣기 위해 사용할 수 있습니다. 매우 간단합니다:
on("change:strength change:StrengthMod change:StrengthOtherThing", function(eventInfo) { //여기에 뭔가 처리하기 // eventInfo.previousValue 는 이 이벤트를 유발한 속성의 원래 값이 변경되기 전입니다. // eventInfo.newValue 는 이 이벤트를 유발한 속성의 현재 값으로 변경되었습니다. }); on("change:repeating_spells:spellname", function(eventInfo) { //여기에 뭔가 처리하기 // eventInfo.sourceAttribute 가 원래 이 이벤트를 유발한 속성의 전체 이름 (반복 ID 포함)입니다. // 그러나 전체 문자열이 소문자로 번역되었기 때문에 직접 getAttrs() 나 다른 용도에 사용하기에는 소스로부터 철자오류를 제거해야 합니다. }); on("change:repeating_spells", function(eventInfo) { //반복 주문 섹션의 어떤 속성이 변경될 때 트리거될 것입니다. // eventInfo.sourceAttribute 는 이 이벤트를 초기 유발한 속성의 전체 이름 (소문자 포함 반복 ID)입니다. });
참고: 모든 속성 이름은 이벤트에서 소문자로 표시됩니다. 따라서 일반적으로 "Strength"로 속성을 참조하더라도 이벤트 감지기에서 "change:strength"를 사용하세요.
참고: 이는 ether "change:strength" 또는 "change:strength_max" 를 처리하는 "_max" 접미사를 지원합니다. 두 가지 변형은 상호교환 가능하지만 "strength" 또는 "strength_max"가 변경될 때 둘 중 하나 또는 둘 다 발생할 것입니다.
반복 필드의 속성의 경우 "repeating_spells_SpellName" 속성이 업데이트될 때 다음 모두가 트리거됩니다: "change:repeating_spells:spellname", "change:repeating_spells", "change:spellname", "change:spellname_max". 이로써 어떤 "수준"의 변경 이벤트에 함수를 바인딩하고 싶은지 선택할 수 있는 최대 유연성을 제공합니다.
Sheetworkers 는 반복 섹션이 다시 정렬될 때 수정되는 특수 속성의 변경 이벤트도 듣을 수 있습니다.
on("change:_reporder:" , function(eventInfo) { //위에서 언급된은 skills 또는 spells과 같은 반복 섹션 이름이어야 합니다. });
remove:repeating_<groupname>
이것은 반복 필드 섹션에서 행이 삭제될 때마다 발생하는 이벤트입니다. ID를 알고 있다면 특정 행이 삭제될 때도 청취할 수 있습니다. 예: on("remove:repeating_inventory:-ABC123")
on("remove:repeating_inventory", function(eventInfo) { // 반복_inventory에서 행이 제거될 때마다 발생합니다. // eventInfo.sourceAttribute는 이벤트를 트리거한 첫 번째 속성의 전체 이름(ID 포함)이며(제거된 행의 ID를 알 수 있음), 이를 사용할 수 있습니다. });
함수 removed:repeating_
on("remove:repeating_inventory", function(eventinfo) { console.log(eventinfo.removedInfo); });
시트:열림
이 이벤트는 게임 세션에서 플레이어가 시트를 열 때마다 발생합니다. 필요한 시트 업그레이드를 확인하는 등의 작업에 유용할 것입니다.
on('sheet:opened',function(){ // 세션에서 플레이어가 시트를 처음 열 때 수행할 작업 });
이 이벤트는 작업 버튼이 클릭될 때 트리거됩니다. 버튼의 이름은 "act_"로 시작해야 합니다. 예를 들어:
on("clicked:activate", 함수() { console.log("활성화 버튼 클릭"); });
기능
getAttrs(attributeNameArray, callback) 비동기
getAttrs 함수를 사용하면 시트에서 일련의 속성 값을 가져올 수 있습니다. "_max" 접미사를 지원하므로 getAttrs( ["Strength", "Strength_max"], func)
는 "Strength"의 현재 값과 최대 값 모두 가져옵니다. 함수가 비동기적이라는 점에 유의하십시오. 이는 여러 getAttrs 호출이 이루어지는 순서가 반환 결과의 순서와 일치한다는 보장이 없다는 것을 의미합니다. 대신, 값이 계산된 후에 실행할 콜백 함수를 전달합니다. 콜백 함수는 요청한 각 속성에 대한 키-값 쌍 목록이 포함된 간단한 Javascript 객체를 받습니다.
다음은 예시입니다:
on("change:strength", 함수() { getAttrs(["Strength", "Level"], 함수(values) { // values.Strength 및/또는 values[ "Level" ]와 관련하여 작업 수행 }); });
반복 섹션의 값을 가져오는 경우 약간의 특별한 처리가 필요합니다. 만약 현재 반복 섹션 내부에 있는 이벤트이면, 반복 그룹 이름 앞에 변수 이름을 사용하여 요청하면 트리거된 이벤트가 발생한 동일한 반복 섹션에서 값이 반환됩니다. 예를 들어, SpellName, SpellLevel 및 SpellDamage를 갖는 repeating_spells 섹션이 있는 경우:
on("change:repeating_spells:spelllevel", 함수() { getAttrs([ "repeating_spells_SpellDamage", "repeating_spells_SpellName" ], 함수(values) { // values.repeating_spells_SpellDamage 및 values.repeating_spells_SpellName은 // 변경된 SpellLevel이 있는 같은 반복 섹션 행에서 모두 가져옵니다. }); });
그 반면에 현재 반복 섹션에 없는 경우에는 ID를 직접 지정하여 반복 섹션 행의 필드 값을 요청할 수 있습니다.
getAttrs(["repeating_spells_-ABC123_SpellDamage"]...
또한 getAttrs()를 사용하여 "_reporder_repeating_
setAttrs(values,options,callback) 비동기
values -- 이것은 속성 이름(접두사 attr_ 없음)의 속성이고 해당 속성을 설정하려는 값을 나타내는 속성입니다.
options -- (선택 사항) 이것은 함수에 대한 선택적 동작을 지정하는 객체입니다. 현재 유일한 옵션은 "silent"으로, 제공된 속성을 설정하는 변경 이벤트의 전파를 방지합니다.
callback -- (선택 사항) 이것은 설정된 속성이 업데이트된 후에 실행될 콜백 함수입니다.
setAttrs 함수를 사용하면 캐릭터 시트의 속성을 설정할 수 있습니다. 속성의 최대 값 설정에는 "_max" 접미사를 사용하십시오. 예를 들어 "Strength_max".
on("change:strength", function() { getAttrs(["Strength", "Level"], function(values) { setAttrs({ StrengthMod: Math.floor(values.Strength / 2) }); }); });
참고: 이 방법으로 비활성화된 입력 필드를 업데이트하려고하는 경우 문제가 발생할 수 있습니다. 이 'setAttrs' 방법을 사용하여 숨겨진 입력을 설정한 다음 비활성 입력을 숨겨진 요소로 설정하는 것이 한 가지 옵션입니다. 이 예에서 will이라는 속성이 있고 will stat의 1/2를 기반으로 판단을 계산하려고 합니다. 그러나 90을 초과하지 않게 하려고 합니다. 아래 참조.
<label>판단</label> <input type="hidden" name="attr_foo_judgment" value="0" /> <input type="number" name="attr_judgment" value="@{foo_judgment}" disabled="true" title="will의 1/2 반올림, 최대 90" />
on("change:will", function() { getAttrs(["will"], function(values) { setAttrs({ foo_judgment: Math.min(90, (values.will/2)) }); }); });
setAttrs는 비동기 함수이며 여러 setAttrs() 호출에 대해 실제 속성이 어떤 순서로 설정되는 지를 보장하지 않음에 유의하세요.
반복 섹션의 경우, 원본 이벤트가 반복 섹션에 있는 경우 간단한 변수 이름을 사용하거나 원본 이벤트가 있는 반복 섹션 변수 이름에 ID를 지정할 수 있습니다.
on("change:repeating_spells:spelllevel", function() { getAttrs(["repeating_spells_SpellLevel", "repeating_spells_SpellName"], function(values) { setAttrs({ repeating_spells_SpellDamage: Math.floor(values.repeating_spells_SpellLevel / 2) + 10 }); }); });
getSectionIDs(section_name,callback) 비동기
이 기능을 사용하면 현재 주어진 반복 섹션에 대해 존재하는 ID 목록을 가져올 수 있습니다. 이는 특정 행의 변수 개수가 있는 인벤토리와 같은 것을 계산하는 데 유용합니다.
on("change:repeating_inventory", function() { getSectionIDs("inventory", function(idarray) { for(var i=0; i < idarray.length; i++) { //ID로 무언가 작동 } }); });
위 설명대로 GetAttrs()를 사용하여 "_reporder_repeating_
즉, getSectionIDs()를 통해 사용자에게 표시되는 순서대로 모든 ID들을 얻을 수 있지만 순서가 지정되지 않습니다. getAttrs( "_reporder_repeating_
var getSectionIDsOrdered = function (sectionName, callback) { '엄격한 사용'; 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()
새로운 반복 섹션 행을 생성할 때 사용할 수 있는 새로운 무작위 ID를 즉시 반환하는 동기 함수입니다. setAttrs()를 사용하고 존재하지 않는 반복 섹션 행의 ID를 전달하면 해당 ID로 행이 생성됩니다.
다음은 반복 섹션에서 새로운 행을 생성하는 예시입니다:
var newrowid = generateRowID(); var newrowattrs = {}; newrowattrs["repeating_inventory_" + newrowid + "_weight"] = "testnewrow"; setAttrs(newrowattrs);
removeRepeatingRow( RowID )
특정 RowID와 관련된 모든 속성을 즉시 제거하고 캐릭터 시트에서 해당 행을 제거하는 동기 함수입니다. RowID는 "repeating_
원본 목록이 변경될 때 요약 목록을 청소하는 예시가 여기 있습니다:
on("change:repeating_inventory", function() { getSectionIDs("repeating_inventorysummary", function(idarray) { for(var i=0; i < idarray.length; i++) { removeRepeatingRow("repeating_inventorysummary_" + idarray[i]); } }); });
getTranslationByKey([key])
지정된 키와 관련된 번역 문자열을 즉시 반환하는 동기 함수입니다. 키가 존재하지 않으면 거짓이 반환되고 번역 JSON에 없는 특정 키가 나열된 콘솔 메시지가 표시됩니다.
여기 예시가 있습니다. 번역 JSON에서 번역 문자열을 가져오는 데 사용할 수 있는 예시: 다음과 같은 번역 JSON
{ "str": "힘", "dex": "민첩" }
var strTranslation = getTranslationByKey('str'); // "힘" var dexTranslation = getTranslationByKey('dex'); // "민첩" var intTranslation = getTranslationByKey('int'); // false
getTranslationLanguage()
사용자가 선택한 언어의 2자리 언어 코드를 즉시 반환하는 동기식 함수입니다.
번역 언어를 가져오는 데 사용할 수 있는 예시가 있습니다.
var translationLang = getTranslationLanguage(); // "en" , for an account using English
setDefaultToken(values)
시트 저자가 축척에서 떨어뜨린 캐릭터에 설정된 속성을 결정할 수 있게 하는 함수입니다. 축척 드롭 이후 기본 토큰을 설정할 때,이 함수를 사용하여 기본 토큰에 설정된 모든 속성을 설정할 수 있습니다. 중요한 속성을 특정 캐릭터 시트에 연결할 수 있는 속성들입니다. 예: attr_hit_points.
setDefaultToken으로 설정할 수 있는 토큰 속성 목록은 다음과 같습니다:
["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"]
이 속성 및 그들이 하는 일에 대한 추가 정보는 모드(API) 객체 페이지를 참조하세요.
다음은 예입니다:
on("sheet:compendium-drop", function() { var default_attr = {}; default_attr["width"] = 70; default_attr["height"] = 70; default_attr["bar1_value"] = 10; default_attr["bar1_max"] = 15; setDefaultToken(default_attr); });