mirror of
https://github.com/Nighthawk42/roll20-character-sheets.git
synced 2026-08-30 11:42:29 +00:00
3735 lines
276 KiB
HTML
3735 lines
276 KiB
HTML
|
|
<input name="attr_sheet_version" value="0" type="hidden" title="@{sheet_version}"/>
|
|
<input name="attr_sheet_state" value="settings" type="hidden" title="@{sheet_state}"/>
|
|
<input name="attr_collapsed" value="" type="hidden" title="@{collapsed}"/>
|
|
<main id="main"><!-- sectionName:backbone -->
|
|
<input name="attr_backbone_tab" value="nav-tabs-backbone--settings" type="hidden" title="@{backbone_tab}"/>
|
|
<div class="tabs tabs--backbone">
|
|
<nav class="tabs__header tabs--backbone__header">
|
|
<ul class="tabs__container flex-box flex-wrap justify-center condition-summary half-gap" data-container-tab="backbone" data-tab="pc">
|
|
<input class="display-control" name="attr_bewildered" value="1" hidden="" type="checkbox" title="@{bewildered}"/>
|
|
<li class="condition-item--bewildered condition-item flex-box tiny-gap">
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_bewildered" value="1" hidden="" type="checkbox" title="@{bewildered}"/><span class="basic-border" data-i18n="bewildered"></span>
|
|
</label><span class="tooltip-display" data-i18n="bewildered-description"></span>
|
|
</div>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-track-bewildered" type="action" title="%{decrement-track-bewildered}">-
|
|
</button>
|
|
<input class="underlined" name="attr_track_bewildered" type="number" title="@{track_bewildered}"/>
|
|
<button class="input-control--button" name="act_increment-track-bewildered" type="action" title="%{increment-track-bewildered}">+
|
|
</button>
|
|
</div>
|
|
</li>
|
|
<input class="display-control" name="attr_bleeding" value="1" hidden="" type="checkbox" title="@{bleeding}"/>
|
|
<li class="condition-item--bleeding condition-item flex-box tiny-gap">
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_bleeding" value="1" hidden="" type="checkbox" title="@{bleeding}"/><span class="basic-border" data-i18n="bleeding"></span>
|
|
</label><span class="tooltip-display" data-i18n="bleeding-description"></span>
|
|
</div>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-track-bleeding" type="action" title="%{decrement-track-bleeding}">-
|
|
</button>
|
|
<input class="underlined" name="attr_track_bleeding" type="number" title="@{track_bleeding}"/>
|
|
<button class="input-control--button" name="act_increment-track-bleeding" type="action" title="%{increment-track-bleeding}">+
|
|
</button>
|
|
</div>
|
|
</li>
|
|
<input class="display-control" name="attr_blinded" value="1" hidden="" type="checkbox" title="@{blinded}"/>
|
|
<li class="condition-item--blinded condition-item flex-box tiny-gap">
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_blinded" value="1" hidden="" type="checkbox" title="@{blinded}"/><span class="basic-border" data-i18n="blinded"></span>
|
|
</label><span class="tooltip-display" data-i18n="blinded-description"></span>
|
|
</div>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-track-blinded" type="action" title="%{decrement-track-blinded}">-
|
|
</button>
|
|
<input class="underlined" name="attr_track_blinded" type="number" title="@{track_blinded}"/>
|
|
<button class="input-control--button" name="act_increment-track-blinded" type="action" title="%{increment-track-blinded}">+
|
|
</button>
|
|
</div>
|
|
</li>
|
|
<input class="display-control" name="attr_burned" value="1" hidden="" type="checkbox" title="@{burned}"/>
|
|
<li class="condition-item--burned condition-item flex-box tiny-gap">
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_burned" value="1" hidden="" type="checkbox" title="@{burned}"/><span class="basic-border" data-i18n="burned"></span>
|
|
</label><span class="tooltip-display" data-i18n="burned-description"></span>
|
|
</div>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-track-burned" type="action" title="%{decrement-track-burned}">-
|
|
</button>
|
|
<input class="underlined" name="attr_track_burned" type="number" title="@{track_burned}"/>
|
|
<button class="input-control--button" name="act_increment-track-burned" type="action" title="%{increment-track-burned}">+
|
|
</button>
|
|
</div>
|
|
</li>
|
|
<input class="display-control" name="attr_confused" value="1" hidden="" type="checkbox" title="@{confused}"/>
|
|
<li class="condition-item--confused condition-item flex-box tiny-gap">
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_confused" value="1" hidden="" type="checkbox" title="@{confused}"/><span class="basic-border" data-i18n="confused"></span>
|
|
</label><span class="tooltip-display" data-i18n="confused-description"></span>
|
|
</div>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-track-confused" type="action" title="%{decrement-track-confused}">-
|
|
</button>
|
|
<input class="underlined" name="attr_track_confused" type="number" title="@{track_confused}"/>
|
|
<button class="input-control--button" name="act_increment-track-confused" type="action" title="%{increment-track-confused}">+
|
|
</button>
|
|
</div>
|
|
</li>
|
|
<input class="display-control" name="attr_deafened" value="1" hidden="" type="checkbox" title="@{deafened}"/>
|
|
<li class="condition-item--deafened condition-item flex-box tiny-gap">
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_deafened" value="1" hidden="" type="checkbox" title="@{deafened}"/><span class="basic-border" data-i18n="deafened"></span>
|
|
</label><span class="tooltip-display" data-i18n="deafened-description"></span>
|
|
</div>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-track-deafened" type="action" title="%{decrement-track-deafened}">-
|
|
</button>
|
|
<input class="underlined" name="attr_track_deafened" type="number" title="@{track_deafened}"/>
|
|
<button class="input-control--button" name="act_increment-track-deafened" type="action" title="%{increment-track-deafened}">+
|
|
</button>
|
|
</div>
|
|
</li>
|
|
<input class="display-control" name="attr_incapacitated" value="1" hidden="" type="checkbox" title="@{incapacitated}"/>
|
|
<li class="condition-item--incapacitated condition-item flex-box tiny-gap">
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_incapacitated" value="1" hidden="" type="checkbox" title="@{incapacitated}"/><span class="basic-border" data-i18n="incapacitated"></span>
|
|
</label><span class="tooltip-display" data-i18n="incapacitated-description"></span>
|
|
</div>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-track-incapacitated" type="action" title="%{decrement-track-incapacitated}">-
|
|
</button>
|
|
<input class="underlined" name="attr_track_incapacitated" type="number" title="@{track_incapacitated}"/>
|
|
<button class="input-control--button" name="act_increment-track-incapacitated" type="action" title="%{increment-track-incapacitated}">+
|
|
</button>
|
|
</div>
|
|
</li>
|
|
<input class="display-control" name="attr_infuriated" value="1" hidden="" type="checkbox" title="@{infuriated}"/>
|
|
<li class="condition-item--infuriated condition-item flex-box tiny-gap">
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_infuriated" value="1" hidden="" type="checkbox" title="@{infuriated}"/><span class="basic-border" data-i18n="infuriated"></span>
|
|
</label><span class="tooltip-display" data-i18n="infuriated-description"></span>
|
|
</div>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-track-infuriated" type="action" title="%{decrement-track-infuriated}">-
|
|
</button>
|
|
<input class="underlined" name="attr_track_infuriated" type="number" title="@{track_infuriated}"/>
|
|
<button class="input-control--button" name="act_increment-track-infuriated" type="action" title="%{increment-track-infuriated}">+
|
|
</button>
|
|
</div>
|
|
</li>
|
|
<input class="display-control" name="attr_intoxicated" value="1" hidden="" type="checkbox" title="@{intoxicated}"/>
|
|
<li class="condition-item--intoxicated condition-item flex-box tiny-gap">
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_intoxicated" value="1" hidden="" type="checkbox" title="@{intoxicated}"/><span class="basic-border" data-i18n="intoxicated"></span>
|
|
</label><span class="tooltip-display" data-i18n="intoxicated-description"></span>
|
|
</div>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-track-intoxicated" type="action" title="%{decrement-track-intoxicated}">-
|
|
</button>
|
|
<input class="underlined" name="attr_track_intoxicated" type="number" title="@{track_intoxicated}"/>
|
|
<button class="input-control--button" name="act_increment-track-intoxicated" type="action" title="%{increment-track-intoxicated}">+
|
|
</button>
|
|
</div>
|
|
</li>
|
|
<input class="display-control" name="attr_plagued" value="1" hidden="" type="checkbox" title="@{plagued}"/>
|
|
<li class="condition-item--plagued condition-item flex-box tiny-gap">
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_plagued" value="1" hidden="" type="checkbox" title="@{plagued}"/><span class="basic-border" data-i18n="plagued"></span>
|
|
</label><span class="tooltip-display" data-i18n="plagued-description"></span>
|
|
</div>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-track-plagued" type="action" title="%{decrement-track-plagued}">-
|
|
</button>
|
|
<input class="underlined" name="attr_track_plagued" type="number" title="@{track_plagued}"/>
|
|
<button class="input-control--button" name="act_increment-track-plagued" type="action" title="%{increment-track-plagued}">+
|
|
</button>
|
|
</div>
|
|
</li>
|
|
<input class="display-control" name="attr_poisoned" value="1" hidden="" type="checkbox" title="@{poisoned}"/>
|
|
<li class="condition-item--poisoned condition-item flex-box tiny-gap">
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_poisoned" value="1" hidden="" type="checkbox" title="@{poisoned}"/><span class="basic-border" data-i18n="poisoned"></span>
|
|
</label><span class="tooltip-display" data-i18n="poisoned-description"></span>
|
|
</div>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-track-poisoned" type="action" title="%{decrement-track-poisoned}">-
|
|
</button>
|
|
<input class="underlined" name="attr_track_poisoned" type="number" title="@{track_poisoned}"/>
|
|
<button class="input-control--button" name="act_increment-track-poisoned" type="action" title="%{increment-track-poisoned}">+
|
|
</button>
|
|
</div>
|
|
</li>
|
|
<input class="display-control" name="attr_panicked" value="1" hidden="" type="checkbox" title="@{panicked}"/>
|
|
<li class="condition-item--panicked condition-item flex-box tiny-gap">
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_panicked" value="1" hidden="" type="checkbox" title="@{panicked}"/><span class="basic-border" data-i18n="panicked"></span>
|
|
</label><span class="tooltip-display" data-i18n="panicked-description"></span>
|
|
</div>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-track-panicked" type="action" title="%{decrement-track-panicked}">-
|
|
</button>
|
|
<input class="underlined" name="attr_track_panicked" type="number" title="@{track_panicked}"/>
|
|
<button class="input-control--button" name="act_increment-track-panicked" type="action" title="%{increment-track-panicked}">+
|
|
</button>
|
|
</div>
|
|
</li>
|
|
<input class="display-control" name="attr_sleeping" value="1" hidden="" type="checkbox" title="@{sleeping}"/>
|
|
<li class="condition-item--sleeping condition-item flex-box tiny-gap">
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_sleeping" value="1" hidden="" type="checkbox" title="@{sleeping}"/><span class="basic-border" data-i18n="sleeping"></span>
|
|
</label><span class="tooltip-display" data-i18n="sleeping-description"></span>
|
|
</div>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-track-sleeping" type="action" title="%{decrement-track-sleeping}">-
|
|
</button>
|
|
<input class="underlined" name="attr_track_sleeping" type="number" title="@{track_sleeping}"/>
|
|
<button class="input-control--button" name="act_increment-track-sleeping" type="action" title="%{increment-track-sleeping}">+
|
|
</button>
|
|
</div>
|
|
</li>
|
|
<input class="display-control" name="attr_spellbound" value="1" hidden="" type="checkbox" title="@{spellbound}"/>
|
|
<li class="condition-item--spellbound condition-item flex-box tiny-gap">
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_spellbound" value="1" hidden="" type="checkbox" title="@{spellbound}"/><span class="basic-border" data-i18n="spellbound"></span>
|
|
</label><span class="tooltip-display" data-i18n="spellbound-description"></span>
|
|
</div>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-track-spellbound" type="action" title="%{decrement-track-spellbound}">-
|
|
</button>
|
|
<input class="underlined" name="attr_track_spellbound" type="number" title="@{track_spellbound}"/>
|
|
<button class="input-control--button" name="act_increment-track-spellbound" type="action" title="%{increment-track-spellbound}">+
|
|
</button>
|
|
</div>
|
|
</li>
|
|
<input class="display-control" name="attr_wounded" value="1" hidden="" type="checkbox" title="@{wounded}"/>
|
|
<li class="condition-item--wounded condition-item flex-box tiny-gap">
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_wounded" value="1" hidden="" type="checkbox" title="@{wounded}"/><span class="basic-border" data-i18n="wounded"></span>
|
|
</label><span class="tooltip-display" data-i18n="wounded-description"></span>
|
|
</div>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-track-wounded" type="action" title="%{decrement-track-wounded}">-
|
|
</button>
|
|
<input class="underlined" name="attr_track_wounded" type="number" title="@{track_wounded}"/>
|
|
<button class="input-control--button" name="act_increment-track-wounded" type="action" title="%{increment-track-wounded}">+
|
|
</button>
|
|
</div>
|
|
</li>
|
|
<input class="display-control" name="attr_comatose" value="1" hidden="" type="checkbox" title="@{comatose}"/>
|
|
<li class="condition-item--comatose condition-item flex-box tiny-gap">
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_comatose" value="1" hidden="" type="checkbox" title="@{comatose}"/><span class="basic-border" data-i18n="comatose"></span>
|
|
</label><span class="tooltip-display" data-i18n="comatose-description"></span>
|
|
</div>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-track-comatose" type="action" title="%{decrement-track-comatose}">-
|
|
</button>
|
|
<input class="underlined" name="attr_track_comatose" type="number" title="@{track_comatose}"/>
|
|
<button class="input-control--button" name="act_increment-track-comatose" type="action" title="%{increment-track-comatose}">+
|
|
</button>
|
|
</div>
|
|
</li>
|
|
<input class="display-control" name="attr_death" value="1" hidden="" type="checkbox" title="@{death}"/>
|
|
<li class="condition-item--death condition-item flex-box tiny-gap">
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_death" value="1" hidden="" type="checkbox" title="@{death}"/><span class="basic-border" data-i18n="death"></span>
|
|
</label><span class="tooltip-display" data-i18n="death-description"></span>
|
|
</div>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-track-death" type="action" title="%{decrement-track-death}">-
|
|
</button>
|
|
<input class="underlined" name="attr_track_death" type="number" title="@{track_death}"/>
|
|
<button class="input-control--button" name="act_increment-track-death" type="action" title="%{increment-track-death}">+
|
|
</button>
|
|
</div>
|
|
</li>
|
|
<input class="display-control" name="attr_in_extremis" value="1" hidden="" type="checkbox" title="@{in_extremis}"/>
|
|
<li class="condition-item--in extremis condition-item flex-box tiny-gap">
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_in_extremis" value="1" hidden="" type="checkbox" title="@{in_extremis}"/><span class="basic-border" data-i18n="in extremis"></span>
|
|
</label><span class="tooltip-display" data-i18n="in extremis-description"></span>
|
|
</div>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-track-in-extremis" type="action" title="%{decrement-track-in-extremis}">-
|
|
</button>
|
|
<input class="underlined" name="attr_track_in_extremis" type="number" title="@{track_in_extremis}"/>
|
|
<button class="input-control--button" name="act_increment-track-in-extremis" type="action" title="%{increment-track-in-extremis}">+
|
|
</button>
|
|
</div>
|
|
</li>
|
|
<input class="display-control" name="attr_prone" value="1" hidden="" type="checkbox" title="@{prone}"/>
|
|
<li class="condition-item--prone condition-item flex-box tiny-gap">
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_prone" value="1" hidden="" type="checkbox" title="@{prone}"/><span class="basic-border" data-i18n="prone"></span>
|
|
</label><span class="tooltip-display" data-i18n="prone-description"></span>
|
|
</div>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-track-prone" type="action" title="%{decrement-track-prone}">-
|
|
</button>
|
|
<input class="underlined" name="attr_track_prone" type="number" title="@{track_prone}"/>
|
|
<button class="input-control--button" name="act_increment-track-prone" type="action" title="%{increment-track-prone}">+
|
|
</button>
|
|
</div>
|
|
</li>
|
|
<input class="display-control" name="attr_restrained" value="1" hidden="" type="checkbox" title="@{restrained}"/>
|
|
<li class="condition-item--restrained condition-item flex-box tiny-gap">
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_restrained" value="1" hidden="" type="checkbox" title="@{restrained}"/><span class="basic-border" data-i18n="restrained"></span>
|
|
</label><span class="tooltip-display" data-i18n="restrained-description"></span>
|
|
</div>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-track-restrained" type="action" title="%{decrement-track-restrained}">-
|
|
</button>
|
|
<input class="underlined" name="attr_track_restrained" type="number" title="@{track_restrained}"/>
|
|
<button class="input-control--button" name="act_increment-track-restrained" type="action" title="%{increment-track-restrained}">+
|
|
</button>
|
|
</div>
|
|
</li>
|
|
<input class="display-control" name="attr_unconscious" value="1" hidden="" type="checkbox" title="@{unconscious}"/>
|
|
<li class="condition-item--unconscious condition-item flex-box tiny-gap">
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_unconscious" value="1" hidden="" type="checkbox" title="@{unconscious}"/><span class="basic-border" data-i18n="unconscious"></span>
|
|
</label><span class="tooltip-display" data-i18n="unconscious-description"></span>
|
|
</div>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-track-unconscious" type="action" title="%{decrement-track-unconscious}">-
|
|
</button>
|
|
<input class="underlined" name="attr_track_unconscious" type="number" title="@{track_unconscious}"/>
|
|
<button class="input-control--button" name="act_increment-track-unconscious" type="action" title="%{increment-track-unconscious}">+
|
|
</button>
|
|
</div>
|
|
</li>
|
|
</ul>
|
|
<ul class="best-worst-toggle flex-box half-gap flex-wrap">
|
|
<li class="no-list">
|
|
<label class="text-check" title="@{roll_state}">
|
|
<input name="attr_roll_state" value="2d20kh1" hidden="" type="radio" title="@{roll_state}"/><span class="basic-border" data-i18n="best-of-two"></span>
|
|
</label>
|
|
</li>
|
|
<li class="no-list">
|
|
<label class="text-check" title="@{roll_state}">
|
|
<input name="attr_roll_state" value="1d20" hidden="" checked="" type="radio" title="@{roll_state}"/><span class="basic-border" data-i18n="normal"></span>
|
|
</label>
|
|
</li>
|
|
<li class="no-list">
|
|
<label class="text-check" title="@{roll_state}">
|
|
<input name="attr_roll_state" value="2d20kl1" hidden="" type="radio" title="@{roll_state}"/><span class="basic-border" data-i18n="worst-of-two"></span>
|
|
</label>
|
|
</li>
|
|
<li class="no-list">
|
|
<label class="text-check" title="@{roll_state}">
|
|
<input name="attr_roll_state" value="1D20" hidden="" type="radio" title="@{roll_state}"/><span class="basic-border" data-i18n="take time"></span>
|
|
</label>
|
|
</li>
|
|
</ul>
|
|
<input name="attr_whisper" value=" " type="hidden" title="@{whisper}"/>
|
|
<ul class="no-list flex-box half-gap flex-wrap">
|
|
<li>
|
|
<button class="tabs__button tabs--backbone__button tabs--backbone__button--pc" name="act_nav-tabs-backbone--pc" data-container-button="backbone" data-button="pc" data-i18n="tabs-backbone-pc" type="action" title="%{nav-tabs-backbone--pc}" data-container-tab="backbone" data-tab="pc">
|
|
</button>
|
|
</li>
|
|
<li>
|
|
<button class="tabs__button tabs--backbone__button tabs--backbone__button--npc" name="act_nav-tabs-backbone--npc" data-container-button="backbone" data-button="npc" data-i18n="tabs-backbone-npc" type="action" title="%{nav-tabs-backbone--npc}" data-container-tab="backbone" data-tab="npc">
|
|
</button>
|
|
</li>
|
|
<li>
|
|
<button class="tabs__button tabs--backbone__button tabs--backbone__button--settings pictos" name="act_nav-tabs-backbone--settings" data-container-button="backbone" data-button="settings" type="action" title="%{nav-tabs-backbone--settings}" data-container-tab="backbone" data-tab="settings">y
|
|
</button>
|
|
</li>
|
|
</ul>
|
|
</nav>
|
|
<div class="tabs__body tabs--backbone__body">
|
|
<article class="tabs__container tabs--backbone__container tabs--backbone__container--pc" data-container-tab="backbone" data-tab="pc" id="pc">
|
|
<aside class="pc-conditions sidebar sidebar--left conditions-sidebar fresh" id="pc-conditions">
|
|
<button class="sidebar-toggle sidebar--right fresh" name="act_condition-display" type="action" title="%{condition-display}">
|
|
</button>
|
|
<h4 data-i18n="conditions"></h4>
|
|
<div class="flex-box flex-wrap justify-center">
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_bewildered" value="1" hidden="" type="checkbox" title="@{bewildered}"/><span class="basic-border" data-i18n="bewildered"></span>
|
|
</label><span class="tooltip-display" data-i18n="bewildered-description"></span>
|
|
</div>
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_bleeding" value="1" hidden="" type="checkbox" title="@{bleeding}"/><span class="basic-border" data-i18n="bleeding"></span>
|
|
</label><span class="tooltip-display" data-i18n="bleeding-description"></span>
|
|
</div>
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_blinded" value="1" hidden="" type="checkbox" title="@{blinded}"/><span class="basic-border" data-i18n="blinded"></span>
|
|
</label><span class="tooltip-display" data-i18n="blinded-description"></span>
|
|
</div>
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_burned" value="1" hidden="" type="checkbox" title="@{burned}"/><span class="basic-border" data-i18n="burned"></span>
|
|
</label><span class="tooltip-display" data-i18n="burned-description"></span>
|
|
</div>
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_confused" value="1" hidden="" type="checkbox" title="@{confused}"/><span class="basic-border" data-i18n="confused"></span>
|
|
</label><span class="tooltip-display" data-i18n="confused-description"></span>
|
|
</div>
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_deafened" value="1" hidden="" type="checkbox" title="@{deafened}"/><span class="basic-border" data-i18n="deafened"></span>
|
|
</label><span class="tooltip-display" data-i18n="deafened-description"></span>
|
|
</div>
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_incapacitated" value="1" hidden="" type="checkbox" title="@{incapacitated}"/><span class="basic-border" data-i18n="incapacitated"></span>
|
|
</label><span class="tooltip-display" data-i18n="incapacitated-description"></span>
|
|
</div>
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_infuriated" value="1" hidden="" type="checkbox" title="@{infuriated}"/><span class="basic-border" data-i18n="infuriated"></span>
|
|
</label><span class="tooltip-display" data-i18n="infuriated-description"></span>
|
|
</div>
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_intoxicated" value="1" hidden="" type="checkbox" title="@{intoxicated}"/><span class="basic-border" data-i18n="intoxicated"></span>
|
|
</label><span class="tooltip-display" data-i18n="intoxicated-description"></span>
|
|
</div>
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_plagued" value="1" hidden="" type="checkbox" title="@{plagued}"/><span class="basic-border" data-i18n="plagued"></span>
|
|
</label><span class="tooltip-display" data-i18n="plagued-description"></span>
|
|
</div>
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_poisoned" value="1" hidden="" type="checkbox" title="@{poisoned}"/><span class="basic-border" data-i18n="poisoned"></span>
|
|
</label><span class="tooltip-display" data-i18n="poisoned-description"></span>
|
|
</div>
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_panicked" value="1" hidden="" type="checkbox" title="@{panicked}"/><span class="basic-border" data-i18n="panicked"></span>
|
|
</label><span class="tooltip-display" data-i18n="panicked-description"></span>
|
|
</div>
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_sleeping" value="1" hidden="" type="checkbox" title="@{sleeping}"/><span class="basic-border" data-i18n="sleeping"></span>
|
|
</label><span class="tooltip-display" data-i18n="sleeping-description"></span>
|
|
</div>
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_spellbound" value="1" hidden="" type="checkbox" title="@{spellbound}"/><span class="basic-border" data-i18n="spellbound"></span>
|
|
</label><span class="tooltip-display" data-i18n="spellbound-description"></span>
|
|
</div>
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_wounded" value="1" hidden="" type="checkbox" title="@{wounded}"/><span class="basic-border" data-i18n="wounded"></span>
|
|
</label><span class="tooltip-display" data-i18n="wounded-description"></span>
|
|
</div>
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_comatose" value="1" hidden="" type="checkbox" title="@{comatose}"/><span class="basic-border" data-i18n="comatose"></span>
|
|
</label><span class="tooltip-display" data-i18n="comatose-description"></span>
|
|
</div>
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_death" value="1" hidden="" type="checkbox" title="@{death}"/><span class="basic-border" data-i18n="death"></span>
|
|
</label><span class="tooltip-display" data-i18n="death-description"></span>
|
|
</div>
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_in_extremis" value="1" hidden="" type="checkbox" title="@{in_extremis}"/><span class="basic-border" data-i18n="in extremis"></span>
|
|
</label><span class="tooltip-display" data-i18n="in extremis-description"></span>
|
|
</div>
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_prone" value="1" hidden="" type="checkbox" title="@{prone}"/><span class="basic-border" data-i18n="prone"></span>
|
|
</label><span class="tooltip-display" data-i18n="prone-description"></span>
|
|
</div>
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_restrained" value="1" hidden="" type="checkbox" title="@{restrained}"/><span class="basic-border" data-i18n="restrained"></span>
|
|
</label><span class="tooltip-display" data-i18n="restrained-description"></span>
|
|
</div>
|
|
<div class="condition-holder">
|
|
<label class="text-check tooltip--control">
|
|
<input name="attr_unconscious" value="1" hidden="" type="checkbox" title="@{unconscious}"/><span class="basic-border" data-i18n="unconscious"></span>
|
|
</label><span class="tooltip-display" data-i18n="unconscious-description"></span>
|
|
</div>
|
|
</div>
|
|
</aside>
|
|
<section class="span-all" id="character-info">
|
|
<div>
|
|
<label class="input-label"><span class="input-label__text" data-i18n="name" role="heading" aria-level="2"></span>
|
|
<input class="underlined input-label__input" name="attr_character_name" type="text" title="@{character_name}"/>
|
|
</label>
|
|
<label class="input-label"><span class="input-label__text" data-i18n="age" role="heading" aria-level="2"></span>
|
|
<input class="underlined text-center input-label__input" name="attr_age" type="text" title="@{age}"/>
|
|
</label>
|
|
<label class="input-label"><span class="input-label__text" data-i18n="gender" role="heading" aria-level="2"></span>
|
|
<input class="underlined text-center input-label__input" name="attr_gender" type="text" title="@{gender}"/>
|
|
</label>
|
|
</div>
|
|
<div>
|
|
<label class="input-label"><span class="input-label__text" data-i18n="origin" role="heading" aria-level="2"></span>
|
|
<input class="underlined input-label__input" name="attr_origin" type="text" title="@{origin}"/>
|
|
</label>
|
|
<label class="input-label"><span class="input-label__text" data-i18n="dialect" role="heading" aria-level="2"></span>
|
|
<input class="underlined input-label__input" name="attr_dialect" type="text" title="@{dialect}"/>
|
|
</label>
|
|
<label class="input-label"><span class="input-label__text" data-i18n="level" role="heading" aria-level="2"></span>
|
|
<input class="underlined input-label__input" name="attr_level" type="number" title="@{level}"/>
|
|
</label>
|
|
<label class="input-label"><span class="input-label__text" data-i18n="archetype" role="heading" aria-level="2"></span>
|
|
<input class="underlined input-label__input" name="attr_archetype" type="text" title="@{archetype}"/>
|
|
</label>
|
|
<label class="input-label"><span class="input-label__text" data-i18n="ideals" role="heading" aria-level="2"></span>
|
|
<input class="underlined input-label__input" name="attr_ideals" type="text" title="@{ideals}"/>
|
|
</label>
|
|
<label class="input-label"><span class="input-label__text" data-i18n="fortune" role="heading" aria-level="2"></span>
|
|
<input class="underlined input-label__input" name="attr_fortune" type="text" title="@{fortune}"/>
|
|
</label>
|
|
</div>
|
|
</section>
|
|
<section data-i18n-aria-label="basic stats" id="basic-stats">
|
|
<div class="characteristics">
|
|
<h2 data-i18n="characteristics"></h2>
|
|
<div class="even-flow">
|
|
<div class="stat-container aptitude">
|
|
<label class="input-label stacked center no-gap"><span class="input-label__text" data-i18n="aptitude-abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="input-label__input" name="attr_aptitude" type="number" title="@{aptitude}"/>
|
|
</label>
|
|
</div>
|
|
<div class="stat-container athletics">
|
|
<label class="input-label stacked center no-gap"><span class="input-label__text" data-i18n="athletics-abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="input-label__input" name="attr_athletics" type="number" title="@{athletics}"/>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="even-flow">
|
|
<div class="stat-container charisma">
|
|
<label class="input-label stacked center no-gap"><span class="input-label__text" data-i18n="charisma-abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="input-label__input" name="attr_charisma" type="number" title="@{charisma}"/>
|
|
</label>
|
|
</div>
|
|
<div class="stat-container logic">
|
|
<label class="input-label stacked center no-gap"><span class="input-label__text" data-i18n="logic-abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="input-label__input" name="attr_logic" type="number" title="@{logic}"/>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="even-flow">
|
|
<div class="stat-container wisdom">
|
|
<label class="input-label stacked center no-gap"><span class="input-label__text" data-i18n="wisdom-abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="input-label__input" name="attr_wisdom" type="number" title="@{wisdom}"/>
|
|
</label>
|
|
</div>
|
|
<div class="stat-container size">
|
|
<label class="input-label stacked center no-gap"><span class="input-label__text" data-i18n="size-abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="input-label__input" name="attr_size" type="number" title="@{size}"/>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="even-flow">
|
|
<div class="stat-container stamina">
|
|
<label class="input-label stacked center no-gap"><span class="input-label__text" data-i18n="stamina-abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="input-label__input" name="attr_stamina" type="number" title="@{stamina}"/>
|
|
</label>
|
|
</div>
|
|
<div class="stat-container willpower">
|
|
<label class="input-label stacked center no-gap"><span class="input-label__text" data-i18n="willpower-abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="input-label__input" name="attr_willpower" type="number" title="@{willpower}"/>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="attributes">
|
|
<h2 data-i18n="attributes"></h2>
|
|
<div class="even-flow">
|
|
<div class="stat-container vigilance">
|
|
<div class="input-label input-label--button stacked center no-gap">
|
|
<button class="roller" name="roll_vigilance" data-i18n="vigilance" role="heading" aria-level="3" value="@{vigilance_action}" title="%{vigilance}" type="roll">
|
|
</button>
|
|
<input class="underlined input-label__input" name="attr_vigilance_goal" value="11" type="number" title="@{vigilance_goal}"/>
|
|
</div>
|
|
<button name="act_vigilance-action" hidden="" type="action" title="%{vigilance-action}">
|
|
</button>
|
|
<input name="attr_vigilance_action" type="hidden" title="@{vigilance_action}"/>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<div class="plus-container">
|
|
<input class="plus-control" name="attr_vigilance" value="0" type="hidden" title="@{vigilance}"/><span class="plus-display" name="attr_vigilance" title="@{vigilance}">0</span>
|
|
</div><span class="parentheses">)</span>
|
|
</div>
|
|
</div>
|
|
<div class="stat-container build">
|
|
<div class="input-label input-label--button stacked center no-gap">
|
|
<button class="roller" name="roll_build" data-i18n="build" role="heading" aria-level="3" value="@{build_action}" title="%{build}" type="roll">
|
|
</button>
|
|
<input class="underlined input-label__input" name="attr_build_goal" value="11" type="number" title="@{build_goal}"/>
|
|
</div>
|
|
<button name="act_build-action" hidden="" type="action" title="%{build-action}">
|
|
</button>
|
|
<input name="attr_build_action" type="hidden" title="@{build_action}"/>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<div class="plus-container">
|
|
<input class="plus-control" name="attr_build" value="0" type="hidden" title="@{build}"/><span class="plus-display" name="attr_build" title="@{build}">0</span>
|
|
</div><span class="parentheses">)</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="even-flow">
|
|
<div class="stat-container intuition">
|
|
<div class="input-label input-label--button stacked center no-gap">
|
|
<button class="roller" name="roll_intuition" data-i18n="intuition" role="heading" aria-level="3" value="@{intuition_action}" title="%{intuition}" type="roll">
|
|
</button>
|
|
<input class="underlined input-label__input" name="attr_intuition_goal" value="11" type="number" title="@{intuition_goal}"/>
|
|
</div>
|
|
<button name="act_intuition-action" hidden="" type="action" title="%{intuition-action}">
|
|
</button>
|
|
<input name="attr_intuition_action" type="hidden" title="@{intuition_action}"/>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<div class="plus-container">
|
|
<input class="plus-control" name="attr_intuition" value="0" type="hidden" title="@{intuition}"/><span class="plus-display" name="attr_intuition" title="@{intuition}">0</span>
|
|
</div><span class="parentheses">)</span>
|
|
</div>
|
|
</div>
|
|
<div class="stat-container reflex">
|
|
<div class="input-label input-label--button stacked center no-gap">
|
|
<button class="roller" name="roll_reflex" data-i18n="reflex" role="heading" aria-level="3" value="@{reflex_action}" title="%{reflex}" type="roll">
|
|
</button>
|
|
<input class="underlined input-label__input" name="attr_reflex_goal" value="11" type="number" title="@{reflex_goal}"/>
|
|
</div>
|
|
<button name="act_reflex-action" hidden="" type="action" title="%{reflex-action}">
|
|
</button>
|
|
<input name="attr_reflex_action" type="hidden" title="@{reflex_action}"/>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<div class="plus-container">
|
|
<input class="plus-control" name="attr_reflex" value="0" type="hidden" title="@{reflex}"/><span class="plus-display" name="attr_reflex" title="@{reflex}">0</span>
|
|
</div><span class="parentheses">)</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="armor-movement collapse-container">
|
|
<input class="collapse" name="attr_armor-collapse" value="1" type="checkbox" title="@{armor-collapse}" checked="checked"/>
|
|
<h2 data-i18n="armor-movement"></h2>
|
|
<div class="stat-container armor circle">
|
|
<label class="input-label stacked center no-gap"><span class="input-label__text" data-i18n="armor abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="input-label__input" type="number" name="attr_armor" value="0" title="@{armor}"/>
|
|
</label>
|
|
</div>
|
|
<div class="stat-container movement circle">
|
|
<label class="input-label stacked center no-gap"><span class="input-label__text" data-i18n="movement rate abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="input-label__input" type="number" name="attr_movement_rate" title="@{movement_rate}"/>
|
|
</label>
|
|
</div>
|
|
<div class="stat-container sprint circle">
|
|
<label class="input-label stacked center no-gap"><span class="input-label__text" data-i18n="sprint speed abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="input-label__input" type="number" name="attr_sprint_speed" title="@{sprint_speed}"/>
|
|
</label>
|
|
</div>
|
|
<div class="headed-textarea armor-details collapse-container tiny-gap">
|
|
<div class="flex-box half-gap" style="width:100%">
|
|
<input class="flex-min-content underlined" name="attr_armor_name" value="" data-i18n-placeholder="equipped armor" type="text" title="@{armor_name}"/>
|
|
<button class="control-button" name="act_unequip-armor" data-i18n="unequip" type="action" title="%{unequip-armor}">
|
|
</button>
|
|
</div>
|
|
<div class="adaptive adaptive--text expanded"><span class="adaptive--text__span" name="attr_armor_details" title="@{armor_details}"></span>
|
|
<textarea class="boxed underlined--light adaptive--text__textarea" name="attr_armor_details" title="@{armor_details}"></textarea>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
<section data-i18n-aria-label="combat stats" id="combat-stats">
|
|
<div class="health-container">
|
|
<div class="stat-container health">
|
|
<div class="input-label input-label--button stacked center">
|
|
<button class="roller" name="roll_health" data-i18n="health" role="heading" aria-level="3" value="@{health_action}" title="%{health}" type="roll">
|
|
</button>
|
|
<input class="input-label__input" name="attr_health" type="number" title="@{health}"/>
|
|
</div>
|
|
<button name="act_health-action" hidden="" type="action" title="%{health-action}">
|
|
</button>
|
|
<input name="attr_health_action" type="hidden" title="@{health_action}"/>
|
|
</div>
|
|
<div class="stat-container health max">
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="maximum" role="heading" aria-level="3"></span>
|
|
<input class="input-label__input" name="attr_health_max" type="number" title="@{health|max}"/>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="health-container">
|
|
<div class="stat-container resolve">
|
|
<div class="input-label input-label--button stacked center">
|
|
<button class="roller" name="roll_resolve" data-i18n="resolve" role="heading" aria-level="3" value="@{resolve_action}" title="%{resolve}" type="roll">
|
|
</button>
|
|
<input class="input-label__input" name="attr_resolve" type="number" title="@{resolve}"/>
|
|
</div>
|
|
<button name="act_resolve-action" hidden="" type="action" title="%{resolve-action}">
|
|
</button>
|
|
<input name="attr_resolve_action" type="hidden" title="@{resolve_action}"/>
|
|
</div>
|
|
<div class="stat-container resolve max">
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="maximum" role="heading" aria-level="3"></span>
|
|
<input class="input-label__input" name="attr_resolve_max" type="number" title="@{resolve|max}"/>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="luck-container">
|
|
<h3 data-i18n="luck"></h3>
|
|
<label class="input-label"><span class="input-label__text" data-i18n="odd"></span>
|
|
<input class="input-label__input" name="attr_luck" type="radio" value="odd" title="@{luck}"/>
|
|
</label>
|
|
<label class="input-label"><span class="input-label__text" data-i18n="even"></span>
|
|
<input class="input-label__input" name="attr_luck" type="radio" value="even" title="@{luck}"/>
|
|
</label>
|
|
<button class="roller" name="roll_luck" role="heading" aria-level="3" value="@{luck_action}" title="%{luck}" type="roll">
|
|
</button>
|
|
<button name="act_luck-action" hidden="" type="action" title="%{luck-action}">
|
|
</button>
|
|
<input name="attr_luck_action" type="hidden" title="@{luck_action}"/>
|
|
</div>
|
|
<div class="adrenaline-container input-label">
|
|
<label for="adrenaline">
|
|
<h3 data-i18n="adrenaline"></h3>
|
|
</label>
|
|
<div class="parens-holder adrenaline"><span class="parentheses large-parentheses">(</span>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-adrenaline" type="action" title="%{decrement-adrenaline}">-
|
|
</button>
|
|
<input name="attr_adrenaline" id="adrenaline" type="number" title="@{adrenaline}"/>
|
|
<button class="input-control--button" name="act_increment-adrenaline" type="action" title="%{increment-adrenaline}">+
|
|
</button>
|
|
</div><span class="parentheses large-parentheses">)</span>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
<section class="tall-2" aria-label="skills" id="skills">
|
|
<div class="basic-skills">
|
|
<div>
|
|
<h2 data-i18n="basic-skills" style="column-span:all;" id="basic-skills"></h2>
|
|
<div class="input-label"><span class="input-label__text" data-i18n="skill points"></span>
|
|
<div class="input-controls">
|
|
<button class="input-control--button" name="act_decrement-skill-points" type="action" title="%{decrement-skill-points}">-
|
|
</button>
|
|
<input class="underlined" name="attr_skill_points" type="number" title="@{skill_points}"/>
|
|
<button class="input-control--button" name="act_increment-skill-points" type="action" title="%{increment-skill-points}">+
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="skill-container">
|
|
<div class="skill-assess skill-row">
|
|
<button class="roller" name="roll_assess" role="heading" aria-level="3" data-i18n="assess" value="@{assess_action}" title="%{assess}" type="roll">
|
|
</button>
|
|
<button name="act_assess-action" hidden="" type="action" title="%{assess-action}">
|
|
</button>
|
|
<input name="attr_assess_action" type="hidden" title="@{assess_action}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_assess_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{assess_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_assess_proficiency" value="0" data-value="+0" type="radio" title="@{assess_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_assess_proficiency" value="1" data-value="+1" type="radio" title="@{assess_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_assess_proficiency" value="2" data-value="+2" type="radio" title="@{assess_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_assess_proficiency" value="3" data-value="+3" type="radio" title="@{assess_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_assess_proficiency" value="4" data-value="+4" type="radio" title="@{assess_proficiency}"/>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="+wisdom abbreviation"></span>
|
|
<input class="input-label__input" name="attr_wisdom" type="number" readonly="readonly" title="@{wisdom}"/>
|
|
</label><span class="parentheses">)</span>
|
|
</div>
|
|
<input class="mastery" name="attr_assess_mastery" value="1" type="checkbox" title="@{assess_mastery}"/>
|
|
</div>
|
|
<div class="skill-deceive skill-row">
|
|
<button class="roller" name="roll_deceive" role="heading" aria-level="3" data-i18n="deceive" value="@{deceive_action}" title="%{deceive}" type="roll">
|
|
</button>
|
|
<button name="act_deceive-action" hidden="" type="action" title="%{deceive-action}">
|
|
</button>
|
|
<input name="attr_deceive_action" type="hidden" title="@{deceive_action}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_deceive_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{deceive_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_deceive_proficiency" value="0" data-value="+0" type="radio" title="@{deceive_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_deceive_proficiency" value="1" data-value="+1" type="radio" title="@{deceive_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_deceive_proficiency" value="2" data-value="+2" type="radio" title="@{deceive_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_deceive_proficiency" value="3" data-value="+3" type="radio" title="@{deceive_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_deceive_proficiency" value="4" data-value="+4" type="radio" title="@{deceive_proficiency}"/>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="+charisma abbreviation"></span>
|
|
<input class="input-label__input" name="attr_charisma" type="number" readonly="readonly" title="@{charisma}"/>
|
|
</label><span class="parentheses">)</span>
|
|
</div>
|
|
<input class="mastery" name="attr_deceive_mastery" value="1" type="checkbox" title="@{deceive_mastery}"/>
|
|
</div>
|
|
<div class="skill-deduce skill-row">
|
|
<button class="roller" name="roll_deduce" role="heading" aria-level="3" data-i18n="deduce" value="@{deduce_action}" title="%{deduce}" type="roll">
|
|
</button>
|
|
<button name="act_deduce-action" hidden="" type="action" title="%{deduce-action}">
|
|
</button>
|
|
<input name="attr_deduce_action" type="hidden" title="@{deduce_action}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_deduce_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{deduce_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_deduce_proficiency" value="0" data-value="+0" type="radio" title="@{deduce_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_deduce_proficiency" value="1" data-value="+1" type="radio" title="@{deduce_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_deduce_proficiency" value="2" data-value="+2" type="radio" title="@{deduce_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_deduce_proficiency" value="3" data-value="+3" type="radio" title="@{deduce_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_deduce_proficiency" value="4" data-value="+4" type="radio" title="@{deduce_proficiency}"/>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="+logic abbreviation"></span>
|
|
<input class="input-label__input" name="attr_logic" type="number" readonly="readonly" title="@{logic}"/>
|
|
</label><span class="parentheses">)</span>
|
|
</div>
|
|
<input class="mastery" name="attr_deduce_mastery" value="1" type="checkbox" title="@{deduce_mastery}"/>
|
|
</div>
|
|
<div class="skill-disguise skill-row">
|
|
<button class="roller" name="roll_disguise" role="heading" aria-level="3" data-i18n="disguise" value="@{disguise_action}" title="%{disguise}" type="roll">
|
|
</button>
|
|
<button name="act_disguise-action" hidden="" type="action" title="%{disguise-action}">
|
|
</button>
|
|
<input name="attr_disguise_action" type="hidden" title="@{disguise_action}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_disguise_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{disguise_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_disguise_proficiency" value="0" data-value="+0" type="radio" title="@{disguise_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_disguise_proficiency" value="1" data-value="+1" type="radio" title="@{disguise_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_disguise_proficiency" value="2" data-value="+2" type="radio" title="@{disguise_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_disguise_proficiency" value="3" data-value="+3" type="radio" title="@{disguise_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_disguise_proficiency" value="4" data-value="+4" type="radio" title="@{disguise_proficiency}"/>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="+charisma abbreviation"></span>
|
|
<input class="input-label__input" name="attr_charisma" type="number" readonly="readonly" title="@{charisma}"/>
|
|
</label><span class="parentheses">)</span>
|
|
</div>
|
|
<input class="mastery" name="attr_disguise_mastery" value="1" type="checkbox" title="@{disguise_mastery}"/>
|
|
</div>
|
|
<div class="skill-encrypt skill-row">
|
|
<button class="roller" name="roll_encrypt" role="heading" aria-level="3" data-i18n="encrypt" value="@{encrypt_action}" title="%{encrypt}" type="roll">
|
|
</button>
|
|
<button name="act_encrypt-action" hidden="" type="action" title="%{encrypt-action}">
|
|
</button>
|
|
<input name="attr_encrypt_action" type="hidden" title="@{encrypt_action}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_encrypt_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{encrypt_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_encrypt_proficiency" value="0" data-value="+0" type="radio" title="@{encrypt_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_encrypt_proficiency" value="1" data-value="+1" type="radio" title="@{encrypt_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_encrypt_proficiency" value="2" data-value="+2" type="radio" title="@{encrypt_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_encrypt_proficiency" value="3" data-value="+3" type="radio" title="@{encrypt_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_encrypt_proficiency" value="4" data-value="+4" type="radio" title="@{encrypt_proficiency}"/>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="+logic abbreviation"></span>
|
|
<input class="input-label__input" name="attr_logic" type="number" readonly="readonly" title="@{logic}"/>
|
|
</label><span class="parentheses">)</span>
|
|
</div>
|
|
<input class="mastery" name="attr_encrypt_mastery" value="1" type="checkbox" title="@{encrypt_mastery}"/>
|
|
</div>
|
|
<div class="skill-first aid skill-row">
|
|
<button class="roller" name="roll_first_aid" role="heading" aria-level="3" data-i18n="first aid" value="@{first_aid_action}" title="%{first_aid}" type="roll">
|
|
</button>
|
|
<button name="act_first-aid-action" hidden="" type="action" title="%{first-aid-action}">
|
|
</button>
|
|
<input name="attr_first_aid_action" type="hidden" title="@{first_aid_action}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_first_aid_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{first_aid_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_first_aid_proficiency" value="0" data-value="+0" type="radio" title="@{first_aid_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_first_aid_proficiency" value="1" data-value="+1" type="radio" title="@{first_aid_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_first_aid_proficiency" value="2" data-value="+2" type="radio" title="@{first_aid_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_first_aid_proficiency" value="3" data-value="+3" type="radio" title="@{first_aid_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_first_aid_proficiency" value="4" data-value="+4" type="radio" title="@{first_aid_proficiency}"/>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="+wisdom abbreviation"></span>
|
|
<input class="input-label__input" name="attr_wisdom" type="number" readonly="readonly" title="@{wisdom}"/>
|
|
</label><span class="parentheses">)</span>
|
|
</div>
|
|
<input class="mastery" name="attr_first_aid_mastery" value="1" type="checkbox" title="@{first_aid_mastery}"/>
|
|
</div>
|
|
<div class="skill-hide skill-row">
|
|
<button class="roller" name="roll_hide" role="heading" aria-level="3" data-i18n="hide" value="@{hide_action}" title="%{hide}" type="roll">
|
|
</button>
|
|
<button name="act_hide-action" hidden="" type="action" title="%{hide-action}">
|
|
</button>
|
|
<input name="attr_hide_action" type="hidden" title="@{hide_action}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_hide_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{hide_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_hide_proficiency" value="0" data-value="+0" type="radio" title="@{hide_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_hide_proficiency" value="1" data-value="+1" type="radio" title="@{hide_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_hide_proficiency" value="2" data-value="+2" type="radio" title="@{hide_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_hide_proficiency" value="3" data-value="+3" type="radio" title="@{hide_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_hide_proficiency" value="4" data-value="+4" type="radio" title="@{hide_proficiency}"/>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="+wisdom abbreviation"></span>
|
|
<input class="input-label__input" name="attr_wisdom" type="number" readonly="readonly" title="@{wisdom}"/>
|
|
</label><span class="parentheses">)</span>
|
|
</div>
|
|
<input class="mastery" name="attr_hide_mastery" value="1" type="checkbox" title="@{hide_mastery}"/>
|
|
</div>
|
|
<div class="skill-legerdemain skill-row">
|
|
<button class="roller" name="roll_legerdemain" role="heading" aria-level="3" data-i18n="legerdemain" value="@{legerdemain_action}" title="%{legerdemain}" type="roll">
|
|
</button>
|
|
<button name="act_legerdemain-action" hidden="" type="action" title="%{legerdemain-action}">
|
|
</button>
|
|
<input name="attr_legerdemain_action" type="hidden" title="@{legerdemain_action}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_legerdemain_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{legerdemain_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_legerdemain_proficiency" value="0" data-value="+0" type="radio" title="@{legerdemain_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_legerdemain_proficiency" value="1" data-value="+1" type="radio" title="@{legerdemain_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_legerdemain_proficiency" value="2" data-value="+2" type="radio" title="@{legerdemain_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_legerdemain_proficiency" value="3" data-value="+3" type="radio" title="@{legerdemain_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_legerdemain_proficiency" value="4" data-value="+4" type="radio" title="@{legerdemain_proficiency}"/>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="+aptitude abbreviation"></span>
|
|
<input class="input-label__input" name="attr_aptitude" type="number" readonly="readonly" title="@{aptitude}"/>
|
|
</label><span class="parentheses">)</span>
|
|
</div>
|
|
<input class="mastery" name="attr_legerdemain_mastery" value="1" type="checkbox" title="@{legerdemain_mastery}"/>
|
|
</div>
|
|
<div class="skill-locksmith skill-row">
|
|
<button class="roller" name="roll_locksmith" role="heading" aria-level="3" data-i18n="locksmith" value="@{locksmith_action}" title="%{locksmith}" type="roll">
|
|
</button>
|
|
<button name="act_locksmith-action" hidden="" type="action" title="%{locksmith-action}">
|
|
</button>
|
|
<input name="attr_locksmith_action" type="hidden" title="@{locksmith_action}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_locksmith_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{locksmith_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_locksmith_proficiency" value="0" data-value="+0" type="radio" title="@{locksmith_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_locksmith_proficiency" value="1" data-value="+1" type="radio" title="@{locksmith_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_locksmith_proficiency" value="2" data-value="+2" type="radio" title="@{locksmith_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_locksmith_proficiency" value="3" data-value="+3" type="radio" title="@{locksmith_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_locksmith_proficiency" value="4" data-value="+4" type="radio" title="@{locksmith_proficiency}"/>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="+aptitude abbreviation"></span>
|
|
<input class="input-label__input" name="attr_aptitude" type="number" readonly="readonly" title="@{aptitude}"/>
|
|
</label><span class="parentheses">)</span>
|
|
</div>
|
|
<input class="mastery" name="attr_locksmith_mastery" value="1" type="checkbox" title="@{locksmith_mastery}"/>
|
|
</div>
|
|
<div class="skill-nurse (ment) skill-row">
|
|
<button class="roller" name="roll_nurse_(ment)" role="heading" aria-level="3" data-i18n="nurse (ment)" value="@{nurse_(ment)_action}" title="%{nurse_(ment)}" type="roll">
|
|
</button>
|
|
<button name="act_nurse-(ment)-action" hidden="" type="action" title="%{nurse-(ment)-action}">
|
|
</button>
|
|
<input name="attr_nurse_(ment)_action" type="hidden" title="@{nurse_(ment)_action}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_nurse_(ment)_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{nurse_(ment)_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_nurse_(ment)_proficiency" value="0" data-value="+0" type="radio" title="@{nurse_(ment)_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_nurse_(ment)_proficiency" value="1" data-value="+1" type="radio" title="@{nurse_(ment)_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_nurse_(ment)_proficiency" value="2" data-value="+2" type="radio" title="@{nurse_(ment)_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_nurse_(ment)_proficiency" value="3" data-value="+3" type="radio" title="@{nurse_(ment)_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_nurse_(ment)_proficiency" value="4" data-value="+4" type="radio" title="@{nurse_(ment)_proficiency}"/>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="+logic abbreviation"></span>
|
|
<input class="input-label__input" name="attr_logic" type="number" readonly="readonly" title="@{logic}"/>
|
|
</label><span class="parentheses">)</span>
|
|
</div>
|
|
<input class="mastery" name="attr_nurse_(ment)_mastery" value="1" type="checkbox" title="@{nurse_(ment)_mastery}"/>
|
|
</div>
|
|
<div class="skill-nurse (phys) skill-row">
|
|
<button class="roller" name="roll_nurse_(phys)" role="heading" aria-level="3" data-i18n="nurse (phys)" value="@{nurse_(phys)_action}" title="%{nurse_(phys)}" type="roll">
|
|
</button>
|
|
<button name="act_nurse-(phys)-action" hidden="" type="action" title="%{nurse-(phys)-action}">
|
|
</button>
|
|
<input name="attr_nurse_(phys)_action" type="hidden" title="@{nurse_(phys)_action}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_nurse_(phys)_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{nurse_(phys)_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_nurse_(phys)_proficiency" value="0" data-value="+0" type="radio" title="@{nurse_(phys)_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_nurse_(phys)_proficiency" value="1" data-value="+1" type="radio" title="@{nurse_(phys)_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_nurse_(phys)_proficiency" value="2" data-value="+2" type="radio" title="@{nurse_(phys)_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_nurse_(phys)_proficiency" value="3" data-value="+3" type="radio" title="@{nurse_(phys)_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_nurse_(phys)_proficiency" value="4" data-value="+4" type="radio" title="@{nurse_(phys)_proficiency}"/>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="+logic abbreviation"></span>
|
|
<input class="input-label__input" name="attr_logic" type="number" readonly="readonly" title="@{logic}"/>
|
|
</label><span class="parentheses">)</span>
|
|
</div>
|
|
<input class="mastery" name="attr_nurse_(phys)_mastery" value="1" type="checkbox" title="@{nurse_(phys)_mastery}"/>
|
|
</div>
|
|
<div class="skill-persuade skill-row">
|
|
<button class="roller" name="roll_persuade" role="heading" aria-level="3" data-i18n="persuade" value="@{persuade_action}" title="%{persuade}" type="roll">
|
|
</button>
|
|
<button name="act_persuade-action" hidden="" type="action" title="%{persuade-action}">
|
|
</button>
|
|
<input name="attr_persuade_action" type="hidden" title="@{persuade_action}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_persuade_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{persuade_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_persuade_proficiency" value="0" data-value="+0" type="radio" title="@{persuade_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_persuade_proficiency" value="1" data-value="+1" type="radio" title="@{persuade_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_persuade_proficiency" value="2" data-value="+2" type="radio" title="@{persuade_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_persuade_proficiency" value="3" data-value="+3" type="radio" title="@{persuade_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_persuade_proficiency" value="4" data-value="+4" type="radio" title="@{persuade_proficiency}"/>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="+charisma abbreviation"></span>
|
|
<input class="input-label__input" name="attr_charisma" type="number" readonly="readonly" title="@{charisma}"/>
|
|
</label><span class="parentheses">)</span>
|
|
</div>
|
|
<input class="mastery" name="attr_persuade_mastery" value="1" type="checkbox" title="@{persuade_mastery}"/>
|
|
</div>
|
|
<div class="skill-research skill-row">
|
|
<button class="roller" name="roll_research" role="heading" aria-level="3" data-i18n="research" value="@{research_action}" title="%{research}" type="roll">
|
|
</button>
|
|
<button name="act_research-action" hidden="" type="action" title="%{research-action}">
|
|
</button>
|
|
<input name="attr_research_action" type="hidden" title="@{research_action}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_research_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{research_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_research_proficiency" value="0" data-value="+0" type="radio" title="@{research_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_research_proficiency" value="1" data-value="+1" type="radio" title="@{research_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_research_proficiency" value="2" data-value="+2" type="radio" title="@{research_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_research_proficiency" value="3" data-value="+3" type="radio" title="@{research_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_research_proficiency" value="4" data-value="+4" type="radio" title="@{research_proficiency}"/>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="+logic abbreviation"></span>
|
|
<input class="input-label__input" name="attr_logic" type="number" readonly="readonly" title="@{logic}"/>
|
|
</label><span class="parentheses">)</span>
|
|
</div>
|
|
<input class="mastery" name="attr_research_mastery" value="1" type="checkbox" title="@{research_mastery}"/>
|
|
</div>
|
|
<div class="skill-ride/steer skill-row">
|
|
<button class="roller" name="roll_ride/steer" role="heading" aria-level="3" data-i18n="ride/steer" value="@{ride/steer_action}" title="%{ride/steer}" type="roll">
|
|
</button>
|
|
<button name="act_ride/steer-action" hidden="" type="action" title="%{ride/steer-action}">
|
|
</button>
|
|
<input name="attr_ride/steer_action" type="hidden" title="@{ride/steer_action}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_ride/steer_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{ride/steer_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_ride/steer_proficiency" value="0" data-value="+0" type="radio" title="@{ride/steer_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_ride/steer_proficiency" value="1" data-value="+1" type="radio" title="@{ride/steer_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_ride/steer_proficiency" value="2" data-value="+2" type="radio" title="@{ride/steer_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_ride/steer_proficiency" value="3" data-value="+3" type="radio" title="@{ride/steer_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_ride/steer_proficiency" value="4" data-value="+4" type="radio" title="@{ride/steer_proficiency}"/>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="+athletics abbreviation"></span>
|
|
<input class="input-label__input" name="attr_athletics" type="number" readonly="readonly" title="@{athletics}"/>
|
|
</label><span class="parentheses">)</span>
|
|
</div>
|
|
<input class="mastery" name="attr_ride/steer_mastery" value="1" type="checkbox" title="@{ride/steer_mastery}"/>
|
|
</div>
|
|
<div class="skill-search skill-row">
|
|
<button class="roller" name="roll_search" role="heading" aria-level="3" data-i18n="search" value="@{search_action}" title="%{search}" type="roll">
|
|
</button>
|
|
<button name="act_search-action" hidden="" type="action" title="%{search-action}">
|
|
</button>
|
|
<input name="attr_search_action" type="hidden" title="@{search_action}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_search_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{search_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_search_proficiency" value="0" data-value="+0" type="radio" title="@{search_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_search_proficiency" value="1" data-value="+1" type="radio" title="@{search_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_search_proficiency" value="2" data-value="+2" type="radio" title="@{search_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_search_proficiency" value="3" data-value="+3" type="radio" title="@{search_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_search_proficiency" value="4" data-value="+4" type="radio" title="@{search_proficiency}"/>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="+wisdom abbreviation"></span>
|
|
<input class="input-label__input" name="attr_wisdom" type="number" readonly="readonly" title="@{wisdom}"/>
|
|
</label><span class="parentheses">)</span>
|
|
</div>
|
|
<input class="mastery" name="attr_search_mastery" value="1" type="checkbox" title="@{search_mastery}"/>
|
|
</div>
|
|
<div class="skill-sneak skill-row">
|
|
<button class="roller" name="roll_sneak" role="heading" aria-level="3" data-i18n="sneak" value="@{sneak_action}" title="%{sneak}" type="roll">
|
|
</button>
|
|
<button name="act_sneak-action" hidden="" type="action" title="%{sneak-action}">
|
|
</button>
|
|
<input name="attr_sneak_action" type="hidden" title="@{sneak_action}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_sneak_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{sneak_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_sneak_proficiency" value="0" data-value="+0" type="radio" title="@{sneak_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_sneak_proficiency" value="1" data-value="+1" type="radio" title="@{sneak_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_sneak_proficiency" value="2" data-value="+2" type="radio" title="@{sneak_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_sneak_proficiency" value="3" data-value="+3" type="radio" title="@{sneak_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_sneak_proficiency" value="4" data-value="+4" type="radio" title="@{sneak_proficiency}"/>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="+athletics abbreviation"></span>
|
|
<input class="input-label__input" name="attr_athletics" type="number" readonly="readonly" title="@{athletics}"/>
|
|
</label><span class="parentheses">)</span>
|
|
</div>
|
|
<input class="mastery" name="attr_sneak_mastery" value="1" type="checkbox" title="@{sneak_mastery}"/>
|
|
</div>
|
|
<div class="skill-stunt skill-row">
|
|
<button class="roller" name="roll_stunt" role="heading" aria-level="3" data-i18n="stunt" value="@{stunt_action}" title="%{stunt}" type="roll">
|
|
</button>
|
|
<button name="act_stunt-action" hidden="" type="action" title="%{stunt-action}">
|
|
</button>
|
|
<input name="attr_stunt_action" type="hidden" title="@{stunt_action}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_stunt_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{stunt_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_stunt_proficiency" value="0" data-value="+0" type="radio" title="@{stunt_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_stunt_proficiency" value="1" data-value="+1" type="radio" title="@{stunt_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_stunt_proficiency" value="2" data-value="+2" type="radio" title="@{stunt_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_stunt_proficiency" value="3" data-value="+3" type="radio" title="@{stunt_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_stunt_proficiency" value="4" data-value="+4" type="radio" title="@{stunt_proficiency}"/>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="+athletics abbreviation"></span>
|
|
<input class="input-label__input" name="attr_athletics" type="number" readonly="readonly" title="@{athletics}"/>
|
|
</label><span class="parentheses">)</span>
|
|
</div>
|
|
<input class="mastery" name="attr_stunt_mastery" value="1" type="checkbox" title="@{stunt_mastery}"/>
|
|
</div>
|
|
<div class="skill-survive skill-row">
|
|
<button class="roller" name="roll_survive" role="heading" aria-level="3" data-i18n="survive" value="@{survive_action}" title="%{survive}" type="roll">
|
|
</button>
|
|
<button name="act_survive-action" hidden="" type="action" title="%{survive-action}">
|
|
</button>
|
|
<input name="attr_survive_action" type="hidden" title="@{survive_action}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_survive_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{survive_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_survive_proficiency" value="0" data-value="+0" type="radio" title="@{survive_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_survive_proficiency" value="1" data-value="+1" type="radio" title="@{survive_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_survive_proficiency" value="2" data-value="+2" type="radio" title="@{survive_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_survive_proficiency" value="3" data-value="+3" type="radio" title="@{survive_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_survive_proficiency" value="4" data-value="+4" type="radio" title="@{survive_proficiency}"/>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="+wisdom abbreviation"></span>
|
|
<input class="input-label__input" name="attr_wisdom" type="number" readonly="readonly" title="@{wisdom}"/>
|
|
</label><span class="parentheses">)</span>
|
|
</div>
|
|
<input class="mastery" name="attr_survive_mastery" value="1" type="checkbox" title="@{survive_mastery}"/>
|
|
</div>
|
|
<div class="skill-threaten skill-row">
|
|
<button class="roller" name="roll_threaten" role="heading" aria-level="3" data-i18n="threaten" value="@{threaten_action}" title="%{threaten}" type="roll">
|
|
</button>
|
|
<button name="act_threaten-action" hidden="" type="action" title="%{threaten-action}">
|
|
</button>
|
|
<input name="attr_threaten_action" type="hidden" title="@{threaten_action}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_threaten_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{threaten_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_threaten_proficiency" value="0" data-value="+0" type="radio" title="@{threaten_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_threaten_proficiency" value="1" data-value="+1" type="radio" title="@{threaten_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_threaten_proficiency" value="2" data-value="+2" type="radio" title="@{threaten_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_threaten_proficiency" value="3" data-value="+3" type="radio" title="@{threaten_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_threaten_proficiency" value="4" data-value="+4" type="radio" title="@{threaten_proficiency}"/>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="+charisma abbreviation"></span>
|
|
<input class="input-label__input" name="attr_charisma" type="number" readonly="readonly" title="@{charisma}"/>
|
|
</label><span class="parentheses">)</span>
|
|
</div>
|
|
<input class="mastery" name="attr_threaten_mastery" value="1" type="checkbox" title="@{threaten_mastery}"/>
|
|
</div>
|
|
<div class="skill-tinker skill-row">
|
|
<button class="roller" name="roll_tinker" role="heading" aria-level="3" data-i18n="tinker" value="@{tinker_action}" title="%{tinker}" type="roll">
|
|
</button>
|
|
<button name="act_tinker-action" hidden="" type="action" title="%{tinker-action}">
|
|
</button>
|
|
<input name="attr_tinker_action" type="hidden" title="@{tinker_action}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_tinker_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{tinker_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_tinker_proficiency" value="0" data-value="+0" type="radio" title="@{tinker_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_tinker_proficiency" value="1" data-value="+1" type="radio" title="@{tinker_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_tinker_proficiency" value="2" data-value="+2" type="radio" title="@{tinker_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_tinker_proficiency" value="3" data-value="+3" type="radio" title="@{tinker_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_tinker_proficiency" value="4" data-value="+4" type="radio" title="@{tinker_proficiency}"/>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="+aptitude abbreviation"></span>
|
|
<input class="input-label__input" name="attr_aptitude" type="number" readonly="readonly" title="@{aptitude}"/>
|
|
</label><span class="parentheses">)</span>
|
|
</div>
|
|
<input class="mastery" name="attr_tinker_mastery" value="1" type="checkbox" title="@{tinker_mastery}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="combat-skills">
|
|
<h2 data-i18n="combat skills"></h2>
|
|
<div class="skill-melee skill-row">
|
|
<button class="roller" name="roll_melee" role="heading" aria-level="3" data-i18n="melee" value="@{melee_action}" title="%{melee}" type="roll">
|
|
</button>
|
|
<button name="act_melee-action" hidden="" type="action" title="%{melee-action}">
|
|
</button>
|
|
<input name="attr_melee_action" type="hidden" title="@{melee_action}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_melee_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{melee_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_melee_proficiency" value="0" data-value="+0" type="radio" title="@{melee_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_melee_proficiency" value="1" data-value="+1" type="radio" title="@{melee_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_melee_proficiency" value="2" data-value="+2" type="radio" title="@{melee_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_melee_proficiency" value="3" data-value="+3" type="radio" title="@{melee_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_melee_proficiency" value="4" data-value="+4" type="radio" title="@{melee_proficiency}"/>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="+athletics abbreviation"></span>
|
|
<input class="input-label__input" name="attr_athletics" type="number" readonly="readonly" title="@{athletics}"/>
|
|
</label><span class="parentheses">)</span>
|
|
</div>
|
|
<input class="mastery" name="attr_melee_mastery" value="1" type="checkbox" title="@{melee_mastery}"/>
|
|
</div>
|
|
<div class="skill-ranged skill-row">
|
|
<button class="roller" name="roll_ranged" role="heading" aria-level="3" data-i18n="ranged" value="@{ranged_action}" title="%{ranged}" type="roll">
|
|
</button>
|
|
<button name="act_ranged-action" hidden="" type="action" title="%{ranged-action}">
|
|
</button>
|
|
<input name="attr_ranged_action" type="hidden" title="@{ranged_action}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_ranged_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{ranged_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_ranged_proficiency" value="0" data-value="+0" type="radio" title="@{ranged_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_ranged_proficiency" value="1" data-value="+1" type="radio" title="@{ranged_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_ranged_proficiency" value="2" data-value="+2" type="radio" title="@{ranged_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_ranged_proficiency" value="3" data-value="+3" type="radio" title="@{ranged_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_ranged_proficiency" value="4" data-value="+4" type="radio" title="@{ranged_proficiency}"/>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<label class="input-label stacked"><span class="input-label__text" data-i18n="+aptitude abbreviation"></span>
|
|
<input class="input-label__input" name="attr_aptitude" type="number" readonly="readonly" title="@{aptitude}"/>
|
|
</label><span class="parentheses">)</span>
|
|
</div>
|
|
<input class="mastery" name="attr_ranged_mastery" value="1" type="checkbox" title="@{ranged_mastery}"/>
|
|
</div>
|
|
</div>
|
|
<div class="specialty-skills repeating-container">
|
|
<h2 class="header" data-i18n="specialty skills"></h2>
|
|
<button class="repcontrol-button repcontrol-button--add" name="act_add-specialty" type="action" title="%{add-specialty}">
|
|
</button>
|
|
<fieldset class="repeating_specialty">
|
|
<button class="dicefontd20 roller" name="roll_roll" role="heading" aria-level="3" value="@{action}" title="%{repeating_specialty_$X_roll}" type="roll">
|
|
</button>
|
|
<button name="act_action" hidden="" type="action" title="%{repeating_specialty_$X_action}">
|
|
</button>
|
|
<input name="attr_action" type="hidden" title="@{repeating_specialty_$X_action}"/>
|
|
<input class="underlined skill-name" name="attr_name" type="text" title="@{repeating_specialty_$X_name}"/>
|
|
<div class="fill-left proficiency">
|
|
<input class="fill-left__radio" name="attr_proficiency" value="-1" data-value="-1" checked="" type="radio" title="@{repeating_specialty_$X_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_proficiency" value="0" data-value="+0" type="radio" title="@{repeating_specialty_$X_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_proficiency" value="1" data-value="+1" type="radio" title="@{repeating_specialty_$X_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_proficiency" value="2" data-value="+2" type="radio" title="@{repeating_specialty_$X_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_proficiency" value="3" data-value="+3" type="radio" title="@{repeating_specialty_$X_proficiency}"/>
|
|
<input class="fill-left__radio" name="attr_proficiency" value="4" data-value="+4" type="radio" title="@{repeating_specialty_$X_proficiency}"/>
|
|
</div>
|
|
<select name="attr_characteristic" title="@{repeating_specialty_$X_characteristic}">
|
|
<option value="" data-i18n="select" selected=""></option>
|
|
<option value="aptitude" data-i18n="aptitude abbreviation"></option>
|
|
<option value="athletics" data-i18n="athletics abbreviation"></option>
|
|
<option value="charisma" data-i18n="charisma abbreviation"></option>
|
|
<option value="logic" data-i18n="logic abbreviation"></option>
|
|
<option value="wisdom" data-i18n="wisdom abbreviation"></option>
|
|
<option value="size" data-i18n="size abbreviation"></option>
|
|
<option value="stamina" data-i18n="stamina abbreviation"></option>
|
|
<option value="willpower" data-i18n="willpower abbreviation"></option>
|
|
</select>
|
|
<input class="mastery" name="attr_undefined_mastery" value="1" type="checkbox" title="@{repeating_specialty_$X_undefined_mastery}"/>
|
|
</fieldset>
|
|
</div>
|
|
</section>
|
|
<section class="tall-2" id="gear">
|
|
<div class="coin">
|
|
<h2 data-i18n="coin & assets"></h2>
|
|
<label class="input-label"><span class="input-label__text" data-i18n="credit"></span>
|
|
<input class="underlined input-label__input" name="attr_credit" type="number" title="@{credit}"/>
|
|
</label>
|
|
<label class="input-label"><span class="input-label__text" data-i18n="coin"></span>
|
|
<input class="underlined input-label__input" name="attr_coin" type="number" title="@{coin}"/>
|
|
</label>
|
|
<label class="input-label"><span class="input-label__text" data-i18n="badge"></span>
|
|
<input class="underlined input-label__input" name="attr_badge" type="text" title="@{badge}"/>
|
|
</label>
|
|
<div class="input-label"><span class="input-label__text" data-i18n="clothes"></span>
|
|
<div class="adaptive adaptive--input input-label__input"><span class="adaptive--input__span" name="attr_clothes" title="@{clothes}"></span>
|
|
<input class="underlined adaptive--input__input" name="attr_clothes" title="@{clothes}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="repeating-container equipped">
|
|
<div class="flex header center">
|
|
<h2 data-i18n="equipped gear"></h2>
|
|
<input class="over-equip-control" name="attr_overburdened" value="1" hidden="" type="checkbox" title="@{overburdened}"/>
|
|
<div class="input-label input-label--dual"><span data-i18n="item slots"></span>
|
|
<input class="underlined" name="attr_item_slots" type="number" readonly="" title="@{item_slots}"/><!-- separatorObj:{} --><span class="slash h2">/</span>
|
|
<input class="underlined" name="attr_item_slots_max" type="number" title="@{item_slots|max}"/>
|
|
</div>
|
|
</div>
|
|
<button class="repcontrol-button repcontrol-button--add" name="act_add-equipped" type="action" title="%{add-equipped}">
|
|
</button>
|
|
<fieldset class="repeating_equipped">
|
|
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_equipped_$X_collapse}"/>
|
|
<div class="flex-box half-gap span-all align-items-center">
|
|
<input name="attr_equipped" value="1" checked="" type="checkbox" title="@{repeating_equipped_$X_equipped}"/>
|
|
<input class="underlined flex-min-content" name="attr_name" type="text" title="@{repeating_equipped_$X_name}"/>
|
|
<div class="input-label input-label--dual collapse-container"><span data-i18n="uses"></span>
|
|
<input class="underlined" name="attr_uses" type="number" title="@{repeating_equipped_$X_uses}"/><!-- separatorObj:{"class":"expanded"} --><span class="slash h2 expanded">/</span>
|
|
<input class="underlined expanded" name="attr_uses_max" type="number" title="@{repeating_equipped_$X_uses|max}"/>
|
|
</div>
|
|
<button class="roller" name="roll_roll" value="@{action}" title="%{repeating_equipped_$X_roll}" type="roll">
|
|
</button>
|
|
<button name="act_action" hidden="" type="action" title="%{repeating_equipped_$X_action}">
|
|
</button>
|
|
<input name="attr_action" type="hidden" title="@{repeating_equipped_$X_action}"/>
|
|
</div>
|
|
<label class="input-label expanded skill"><span class="input-label__text" data-i18n="skill"></span>
|
|
<select class="underlined input-label__input" name="attr_skill" title="@{repeating_equipped_$X_skill}">
|
|
<option value="" data-i18n="select one" selected=""></option>
|
|
<option value="assess" data-i18n="assess"></option>
|
|
<option value="deceive" data-i18n="deceive"></option>
|
|
<option value="deduce" data-i18n="deduce"></option>
|
|
<option value="disguise" data-i18n="disguise"></option>
|
|
<option value="encrypt" data-i18n="encrypt"></option>
|
|
<option value="first_aid" data-i18n="first aid"></option>
|
|
<option value="hide" data-i18n="hide"></option>
|
|
<option value="legerdemain" data-i18n="legerdemain"></option>
|
|
<option value="locksmith" data-i18n="locksmith"></option>
|
|
<option value="nurse_(ment)" data-i18n="nurse (ment)"></option>
|
|
<option value="nurse_(phys)" data-i18n="nurse (phys)"></option>
|
|
<option value="persuade" data-i18n="persuade"></option>
|
|
<option value="research" data-i18n="research"></option>
|
|
<option value="ride/steer" data-i18n="ride/steer"></option>
|
|
<option value="search" data-i18n="search"></option>
|
|
<option value="sneak" data-i18n="sneak"></option>
|
|
<option value="stunt" data-i18n="stunt"></option>
|
|
<option value="survive" data-i18n="survive"></option>
|
|
<option value="threaten" data-i18n="threaten"></option>
|
|
<option value="tinker" data-i18n="tinker"></option>
|
|
<option value="melee" data-i18n="melee"></option>
|
|
<option value="ranged" data-i18n="ranged"></option>
|
|
</select>
|
|
</label>
|
|
<div class="flex-box justify-center span-all half-gap expanded">
|
|
<label class="input-label"><span class="input-label__text" data-i18n="uses slot"></span>
|
|
<input class="underlined input-label__input" name="attr_uses_slot" type="checkbox" value="1" checked="" title="@{repeating_equipped_$X_uses_slot}"/>
|
|
</label>
|
|
<label class="input-label"><span class="input-label__text" data-i18n="size"></span>
|
|
<select class="underlined input-label__input" name="attr_item_size" title="@{repeating_equipped_$X_item_size}">
|
|
<option value="" data-i18n="select size" selected=""></option>
|
|
<option value="small" data-i18n="small"></option>
|
|
<option value="medium" data-i18n="medium"></option>
|
|
<option value="large" data-i18n="large"></option>
|
|
</select>
|
|
</label>
|
|
</div>
|
|
<div class="adaptive adaptive--text description expanded"><span class="adaptive--text__span" name="attr_description" title="@{repeating_equipped_$X_description}"></span>
|
|
<textarea class="boxed adaptive--text__textarea" name="attr_description" title="@{repeating_equipped_$X_description}"></textarea>
|
|
</div>
|
|
</fieldset>
|
|
</div>
|
|
<div class="repeating-container stored">
|
|
<h2 class="header" data-i18n="stored gear"></h2>
|
|
<button class="repcontrol-button repcontrol-button--add" name="act_add-stored" type="action" title="%{add-stored}">
|
|
</button>
|
|
<fieldset class="repeating_stored">
|
|
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_stored_$X_collapse}"/>
|
|
<div class="flex-box span-all half-gap">
|
|
<input class="equipped" name="attr_equipped" value="1" type="checkbox" title="@{repeating_stored_$X_equipped}"/>
|
|
<input class="underlined flex-min-content" name="attr_name" type="text" title="@{repeating_stored_$X_name}"/>
|
|
<select class="underlined" name="attr_type" title="@{repeating_stored_$X_type}">
|
|
<option value="" data-i18n="select"></option>
|
|
<option value="gear" data-i18n="gear"></option>
|
|
<option value="armor" data-i18n="armor"></option>
|
|
<option value="weapon" data-i18n="weapon"></option>
|
|
</select>
|
|
<input class="section-control" name="attr_type" value="weapon" hidden="" type="checkbox" title="@{repeating_stored_$X_type}"/>
|
|
<label class="input-label wear section-display"><span class="input-label__text" data-i18n="wear" role="heading" aria-level="4"></span>
|
|
<input class="underlined input-label__input" name="attr_wear" type="number" title="@{repeating_stored_$X_wear}"/>
|
|
</label>
|
|
</div>
|
|
<input class="section-control" name="attr_type" value="weapon" hidden="" type="checkbox" title="@{repeating_stored_$X_type}"/>
|
|
<div class="section-display expanded weapon-section">
|
|
<label class="input-label"><span class="input-label__text" data-i18n="skill"></span>
|
|
<select class="underlined input-label__input" name="attr_skill" title="@{repeating_stored_$X_skill}">
|
|
<option value="" data-i18n="select one" selected=""></option>
|
|
<option value="assess" data-i18n="assess"></option>
|
|
<option value="deceive" data-i18n="deceive"></option>
|
|
<option value="deduce" data-i18n="deduce"></option>
|
|
<option value="disguise" data-i18n="disguise"></option>
|
|
<option value="encrypt" data-i18n="encrypt"></option>
|
|
<option value="first_aid" data-i18n="first aid"></option>
|
|
<option value="hide" data-i18n="hide"></option>
|
|
<option value="legerdemain" data-i18n="legerdemain"></option>
|
|
<option value="locksmith" data-i18n="locksmith"></option>
|
|
<option value="nurse_(ment)" data-i18n="nurse (ment)"></option>
|
|
<option value="nurse_(phys)" data-i18n="nurse (phys)"></option>
|
|
<option value="persuade" data-i18n="persuade"></option>
|
|
<option value="research" data-i18n="research"></option>
|
|
<option value="ride/steer" data-i18n="ride/steer"></option>
|
|
<option value="search" data-i18n="search"></option>
|
|
<option value="sneak" data-i18n="sneak"></option>
|
|
<option value="stunt" data-i18n="stunt"></option>
|
|
<option value="survive" data-i18n="survive"></option>
|
|
<option value="threaten" data-i18n="threaten"></option>
|
|
<option value="tinker" data-i18n="tinker"></option>
|
|
<option value="melee" data-i18n="melee"></option>
|
|
<option value="ranged" data-i18n="ranged"></option>
|
|
</select>
|
|
</label>
|
|
<label class="input-label blitz"><span class="input-label__text" data-i18n="properties" role="heading" aria-level="4"></span>
|
|
<input class="underlined input-label__input" name="attr_properties" type="text" title="@{repeating_stored_$X_properties}"/>
|
|
</label>
|
|
<div class="input-label input-label--dual damage"><span data-i18n="damage" role="heading" aria-level="4"></span>
|
|
<input class="underlined" name="attr_damage" type="text" title="@{repeating_stored_$X_damage}"/><span class="slash">+</span>
|
|
<select class="underlined" name="attr_damage_characteristic" title="@{repeating_stored_$X_damage_characteristic}">
|
|
<option value="" data-i18n="select one" selected=""></option>
|
|
<option value="aptitude" data-i18n="aptitude"></option>
|
|
<option value="athletics" data-i18n="athletics"></option>
|
|
<option value="charisma" data-i18n="charisma"></option>
|
|
<option value="logic" data-i18n="logic"></option>
|
|
<option value="wisdom" data-i18n="wisdom"></option>
|
|
<option value="size" data-i18n="size"></option>
|
|
<option value="stamina" data-i18n="stamina"></option>
|
|
<option value="willpower" data-i18n="willpower"></option>
|
|
</select>
|
|
</div>
|
|
<label class="input-label range"><span class="input-label__text" data-i18n="range" role="heading" aria-level="4"></span>
|
|
<input class="underlined input-label__input" name="attr_range" type="text" title="@{repeating_stored_$X_range}"/>
|
|
</label>
|
|
</div>
|
|
<input class="section-control" name="attr_type" value="gear" hidden="" type="checkbox" title="@{repeating_stored_$X_type}"/>
|
|
<div class="section-display expanded gear">
|
|
<div class="input-label input-label--dual"><span data-i18n="uses"></span>
|
|
<input class="underlined" name="attr_uses" type="number" title="@{repeating_stored_$X_uses}"/><!-- separatorObj:{} --><span class="slash h2">/</span>
|
|
<input class="underlined" name="attr_uses_max" type="number" title="@{repeating_stored_$X_uses|max}"/>
|
|
</div>
|
|
<label class="input-label expanded skill"><span class="input-label__text" data-i18n="skill"></span>
|
|
<select class="underlined input-label__input" name="attr_skill" title="@{repeating_stored_$X_skill}">
|
|
<option value="" data-i18n="select one" selected=""></option>
|
|
<option value="assess" data-i18n="assess"></option>
|
|
<option value="deceive" data-i18n="deceive"></option>
|
|
<option value="deduce" data-i18n="deduce"></option>
|
|
<option value="disguise" data-i18n="disguise"></option>
|
|
<option value="encrypt" data-i18n="encrypt"></option>
|
|
<option value="first_aid" data-i18n="first aid"></option>
|
|
<option value="hide" data-i18n="hide"></option>
|
|
<option value="legerdemain" data-i18n="legerdemain"></option>
|
|
<option value="locksmith" data-i18n="locksmith"></option>
|
|
<option value="nurse_(ment)" data-i18n="nurse (ment)"></option>
|
|
<option value="nurse_(phys)" data-i18n="nurse (phys)"></option>
|
|
<option value="persuade" data-i18n="persuade"></option>
|
|
<option value="research" data-i18n="research"></option>
|
|
<option value="ride/steer" data-i18n="ride/steer"></option>
|
|
<option value="search" data-i18n="search"></option>
|
|
<option value="sneak" data-i18n="sneak"></option>
|
|
<option value="stunt" data-i18n="stunt"></option>
|
|
<option value="survive" data-i18n="survive"></option>
|
|
<option value="threaten" data-i18n="threaten"></option>
|
|
<option value="tinker" data-i18n="tinker"></option>
|
|
<option value="melee" data-i18n="melee"></option>
|
|
<option value="ranged" data-i18n="ranged"></option>
|
|
</select>
|
|
</label>
|
|
</div>
|
|
<input class="section-control" name="attr_type" value="armor" hidden="" type="checkbox" title="@{repeating_stored_$X_type}"/>
|
|
<div class="section-display expanded gear">
|
|
<label class="input-label"><span class="input-label__text" data-i18n="armor bonus"></span>
|
|
<input class="underlined input-label__input" name="attr_armor_bonus" type="number" title="@{repeating_stored_$X_armor_bonus}"/>
|
|
</label>
|
|
</div>
|
|
<div class="flex-box justify-center span-all half-gap expanded">
|
|
<label class="input-label"><span class="input-label__text" data-i18n="uses slot"></span>
|
|
<input class="underlined input-label__input" name="attr_uses_slot" type="checkbox" value="1" checked="" title="@{repeating_stored_$X_uses_slot}"/>
|
|
</label>
|
|
<label class="input-label"><span class="input-label__text" data-i18n="size"></span>
|
|
<select class="underlined input-label__input" name="attr_item_size" title="@{repeating_stored_$X_item_size}">
|
|
<option value="" data-i18n="select size" selected=""></option>
|
|
<option value="small" data-i18n="small"></option>
|
|
<option value="medium" data-i18n="medium"></option>
|
|
<option value="large" data-i18n="large"></option>
|
|
</select>
|
|
</label>
|
|
</div>
|
|
<div class="adaptive adaptive--text description expanded"><span class="adaptive--text__span" name="attr_description" title="@{repeating_stored_$X_description}"></span>
|
|
<textarea class="boxed adaptive--text__textarea" name="attr_description" title="@{repeating_stored_$X_description}"></textarea>
|
|
</div>
|
|
</fieldset>
|
|
</div>
|
|
</section>
|
|
<section class="repeating-container" id="weapons">
|
|
<h2 class="header" data-i18n="equipped weapons"></h2>
|
|
<button class="repcontrol-button repcontrol-button--add" name="act_add-weapon" type="action" title="%{add-weapon}">
|
|
</button>
|
|
<fieldset class="repeating_weapon">
|
|
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_weapon_$X_collapse}"/>
|
|
<div class="flex-box span-all half-gap">
|
|
<input class="equipped" name="attr_equipped" value="1" checked="" type="checkbox" title="@{repeating_weapon_$X_equipped}"/>
|
|
<input class="underlined flex-min-content" name="attr_name" type="text" title="@{repeating_weapon_$X_name}"/>
|
|
<label class="input-label" clas="wear"><span class="input-label__text" data-i18n="wear" role="heading" aria-level="4"></span>
|
|
<input class="underlined input-label__input" name="attr_wear" type="number" title="@{repeating_weapon_$X_wear}"/>
|
|
</label>
|
|
<button class="roller" name="roll_roll" value="@{action}" title="%{repeating_weapon_$X_roll}" type="roll">
|
|
</button>
|
|
<button name="act_action" hidden="" type="action" title="%{repeating_weapon_$X_action}">
|
|
</button>
|
|
<input name="attr_action" type="hidden" title="@{repeating_weapon_$X_action}"/>
|
|
</div>
|
|
<input class="section-control" name="attr_type" value="weapon" hidden="" type="checkbox" title="@{repeating_weapon_$X_type}"/>
|
|
<div class="section-display expanded weapon-section">
|
|
<label class="input-label"><span class="input-label__text" data-i18n="skill"></span>
|
|
<select class="underlined input-label__input" name="attr_skill" title="@{repeating_weapon_$X_skill}">
|
|
<option value="" data-i18n="select one" selected=""></option>
|
|
<option value="assess" data-i18n="assess"></option>
|
|
<option value="deceive" data-i18n="deceive"></option>
|
|
<option value="deduce" data-i18n="deduce"></option>
|
|
<option value="disguise" data-i18n="disguise"></option>
|
|
<option value="encrypt" data-i18n="encrypt"></option>
|
|
<option value="first_aid" data-i18n="first aid"></option>
|
|
<option value="hide" data-i18n="hide"></option>
|
|
<option value="legerdemain" data-i18n="legerdemain"></option>
|
|
<option value="locksmith" data-i18n="locksmith"></option>
|
|
<option value="nurse_(ment)" data-i18n="nurse (ment)"></option>
|
|
<option value="nurse_(phys)" data-i18n="nurse (phys)"></option>
|
|
<option value="persuade" data-i18n="persuade"></option>
|
|
<option value="research" data-i18n="research"></option>
|
|
<option value="ride/steer" data-i18n="ride/steer"></option>
|
|
<option value="search" data-i18n="search"></option>
|
|
<option value="sneak" data-i18n="sneak"></option>
|
|
<option value="stunt" data-i18n="stunt"></option>
|
|
<option value="survive" data-i18n="survive"></option>
|
|
<option value="threaten" data-i18n="threaten"></option>
|
|
<option value="tinker" data-i18n="tinker"></option>
|
|
<option value="melee" data-i18n="melee"></option>
|
|
<option value="ranged" data-i18n="ranged"></option>
|
|
</select>
|
|
</label>
|
|
<label class="input-label blitz"><span class="input-label__text" data-i18n="properties" role="heading" aria-level="4"></span>
|
|
<input class="underlined input-label__input" name="attr_properties" type="text" title="@{repeating_weapon_$X_properties}"/>
|
|
</label>
|
|
<div class="input-label input-label--dual damage"><span data-i18n="damage" role="heading" aria-level="4"></span>
|
|
<input class="underlined" name="attr_damage" type="text" title="@{repeating_weapon_$X_damage}"/><span class="slash">+</span>
|
|
<select class="underlined" name="attr_damage_characteristic" title="@{repeating_weapon_$X_damage_characteristic}">
|
|
<option value="" data-i18n="select one" selected=""></option>
|
|
<option value="aptitude" data-i18n="aptitude"></option>
|
|
<option value="athletics" data-i18n="athletics"></option>
|
|
<option value="charisma" data-i18n="charisma"></option>
|
|
<option value="logic" data-i18n="logic"></option>
|
|
<option value="wisdom" data-i18n="wisdom"></option>
|
|
<option value="size" data-i18n="size"></option>
|
|
<option value="stamina" data-i18n="stamina"></option>
|
|
<option value="willpower" data-i18n="willpower"></option>
|
|
</select>
|
|
</div>
|
|
<label class="input-label range"><span class="input-label__text" data-i18n="range" role="heading" aria-level="4"></span>
|
|
<input class="underlined input-label__input" name="attr_range" type="text" title="@{repeating_weapon_$X_range}"/>
|
|
</label>
|
|
</div>
|
|
<div class="flex-box justify-center span-all half-gap expanded">
|
|
<label class="input-label"><span class="input-label__text" data-i18n="uses slot"></span>
|
|
<input class="underlined input-label__input" name="attr_uses_slot" type="checkbox" value="1" checked="" title="@{repeating_weapon_$X_uses_slot}"/>
|
|
</label>
|
|
<label class="input-label"><span class="input-label__text" data-i18n="size"></span>
|
|
<select class="underlined input-label__input" name="attr_item_size" title="@{repeating_weapon_$X_item_size}">
|
|
<option value="" data-i18n="select size" selected=""></option>
|
|
<option value="small" data-i18n="small"></option>
|
|
<option value="medium" data-i18n="medium"></option>
|
|
<option value="large" data-i18n="large"></option>
|
|
</select>
|
|
</label>
|
|
</div>
|
|
<div class="adaptive adaptive--text description expanded"><span class="adaptive--text__span" name="attr_description" title="@{repeating_weapon_$X_description}"></span>
|
|
<textarea class="boxed adaptive--text__textarea" name="attr_description" title="@{repeating_weapon_$X_description}"></textarea>
|
|
</div>
|
|
</fieldset>
|
|
<div class="flex-box gap flex-wrap justify-center">
|
|
<div class="ammo-container flex-box half-gap align-items-center">
|
|
<input class="underlined container-name" name="attr_container_1" type="text" data-i18n-placeholder="ammo container" title="@{container_1}"/>
|
|
<div class="parens-holder"><span class="parentheses large-parentheses">(</span>
|
|
<div class="flex-box stacked center">
|
|
<input class="underlined" name="attr_ammo_1" type="number" title="@{ammo_1}"/>
|
|
<input class="ammo-type" name="attr_ammo_type_1" data-i18n-placeholder="type" type="text" title="@{ammo_type_1}"/>
|
|
</div><span class="parentheses large-parentheses">)</span>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses large-parentheses">(</span>
|
|
<div class="flex-box stacked center">
|
|
<input class="underlined" name="attr_ammo_2" type="number" title="@{ammo_2}"/>
|
|
<input class="ammo-type" name="attr_ammo_type_2" data-i18n-placeholder="type" type="text" title="@{ammo_type_2}"/>
|
|
</div><span class="parentheses large-parentheses">)</span>
|
|
</div>
|
|
</div>
|
|
<div class="ammo-container flex-box half-gap align-items-center">
|
|
<input class="underlined container-name" name="attr_container_2" type="text" data-i18n-placeholder="ammo container" title="@{container_2}"/>
|
|
<div class="parens-holder"><span class="parentheses large-parentheses">(</span>
|
|
<div class="flex-box stacked center">
|
|
<input class="underlined" name="attr_ammo_3" type="number" title="@{ammo_3}"/>
|
|
<input class="ammo-type" name="attr_ammo_type_3" data-i18n-placeholder="type" type="text" title="@{ammo_type_3}"/>
|
|
</div><span class="parentheses large-parentheses">)</span>
|
|
</div>
|
|
<div class="parens-holder"><span class="parentheses large-parentheses">(</span>
|
|
<div class="flex-box stacked center">
|
|
<input class="underlined" name="attr_ammo_4" type="number" title="@{ammo_4}"/>
|
|
<input class="ammo-type" name="attr_ammo_type_4" data-i18n-placeholder="type" type="text" title="@{ammo_type_4}"/>
|
|
</div><span class="parentheses large-parentheses">)</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
<section class="repeating-container" id="archetype">
|
|
<h2 class="header" data-i18n="abilities"></h2>
|
|
<button class="repcontrol-button repcontrol-button--add" name="act_add-ability" type="action" title="%{add-ability}">
|
|
</button>
|
|
<fieldset class="repeating_ability">
|
|
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_ability_$X_collapse}"/>
|
|
<div class="span-all flex-box half-gap flex-wrap">
|
|
<button class="roller" name="roll_roll" value="@{action}" title="%{repeating_ability_$X_roll}" type="roll">
|
|
</button>
|
|
<button name="act_action" hidden="" type="action" title="%{repeating_ability_$X_action}">
|
|
</button>
|
|
<input name="attr_action" type="hidden" title="@{repeating_ability_$X_action}"/>
|
|
<input class="underlined flex-min-content" name="attr_name" data-i18n-placeholder="name" type="text" title="@{repeating_ability_$X_name}"/>
|
|
<label class="input-label"><span class="input-label__text" data-i18n="skill"></span>
|
|
<select class="underlined input-label__input" name="attr_skill" title="@{repeating_ability_$X_skill}">
|
|
<option value="" data-i18n="select one" selected=""></option>
|
|
<option value="assess" data-i18n="assess"></option>
|
|
<option value="deceive" data-i18n="deceive"></option>
|
|
<option value="deduce" data-i18n="deduce"></option>
|
|
<option value="disguise" data-i18n="disguise"></option>
|
|
<option value="encrypt" data-i18n="encrypt"></option>
|
|
<option value="first_aid" data-i18n="first aid"></option>
|
|
<option value="hide" data-i18n="hide"></option>
|
|
<option value="legerdemain" data-i18n="legerdemain"></option>
|
|
<option value="locksmith" data-i18n="locksmith"></option>
|
|
<option value="nurse_(ment)" data-i18n="nurse (ment)"></option>
|
|
<option value="nurse_(phys)" data-i18n="nurse (phys)"></option>
|
|
<option value="persuade" data-i18n="persuade"></option>
|
|
<option value="research" data-i18n="research"></option>
|
|
<option value="ride/steer" data-i18n="ride/steer"></option>
|
|
<option value="search" data-i18n="search"></option>
|
|
<option value="sneak" data-i18n="sneak"></option>
|
|
<option value="stunt" data-i18n="stunt"></option>
|
|
<option value="survive" data-i18n="survive"></option>
|
|
<option value="threaten" data-i18n="threaten"></option>
|
|
<option value="tinker" data-i18n="tinker"></option>
|
|
<option value="melee" data-i18n="melee"></option>
|
|
<option value="ranged" data-i18n="ranged"></option>
|
|
</select>
|
|
</label>
|
|
</div>
|
|
<div class="headed-textarea expanded">
|
|
<h4 data-i18n="description"></h4>
|
|
<div class="adaptive adaptive--text"><span class="adaptive--text__span" name="attr_description" title="@{repeating_ability_$X_description}"></span>
|
|
<textarea class="boxed adaptive--text__textarea" name="attr_description" title="@{repeating_ability_$X_description}"></textarea>
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
</section>
|
|
<section class="repeating-container" id="favorable-traits">
|
|
<h3 class="header" data-i18n="favorable traits"></h3>
|
|
<button class="repcontrol-button repcontrol-button--add" name="act_add-favorable" type="action" title="%{add-favorable}">
|
|
</button>
|
|
<fieldset class="repeating_favorable">
|
|
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_favorable_$X_collapse}"/>
|
|
<input class="underlined" name="attr_name" type="text" title="@{repeating_favorable_$X_name}"/>
|
|
<div class="adaptive adaptive--text expanded"><span class="adaptive--text__span" name="attr_description" title="@{repeating_favorable_$X_description}"></span>
|
|
<textarea class="boxed adaptive--text__textarea" name="attr_description" title="@{repeating_favorable_$X_description}"></textarea>
|
|
</div>
|
|
</fieldset>
|
|
</section>
|
|
<section class="repeating-container" id="unfavorable-traits">
|
|
<h3 class="header" data-i18n="unfavorable traits"></h3>
|
|
<button class="repcontrol-button repcontrol-button--add" name="act_add-unfavorable" type="action" title="%{add-unfavorable}">
|
|
</button>
|
|
<fieldset class="repeating_unfavorable">
|
|
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_unfavorable_$X_collapse}"/>
|
|
<input class="underlined" name="attr_name" type="text" title="@{repeating_unfavorable_$X_name}"/>
|
|
<div class="adaptive adaptive--text expanded"><span class="adaptive--text__span" name="attr_description" title="@{repeating_unfavorable_$X_description}"></span>
|
|
<textarea class="boxed adaptive--text__textarea" name="attr_description" title="@{repeating_unfavorable_$X_description}"></textarea>
|
|
</div>
|
|
</fieldset>
|
|
</section>
|
|
<section id="backstory">
|
|
<div class="headed-textarea">
|
|
<h2 data-i18n="backstory"></h2>
|
|
<div class="adaptive adaptive--text"><span class="adaptive--text__span" name="attr_backstory" title="@{backstory}"></span>
|
|
<textarea class="boxed adaptive--text__textarea" name="attr_backstory" title="@{backstory}"></textarea>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
<section id="notes">
|
|
<div class="headed-textarea">
|
|
<h2 data-i18n="notes"></h2>
|
|
<div class="adaptive adaptive--text"><span class="adaptive--text__span" name="attr_notes" title="@{notes}"></span>
|
|
<textarea class="boxed adaptive--text__textarea" name="attr_notes" title="@{notes}"></textarea>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</article>
|
|
<article class="tabs__container tabs--backbone__container tabs--backbone__container--npc" data-container-tab="backbone" data-tab="npc" id="npc">
|
|
<section class="half-gap align-items-end" id="npc-header">
|
|
<input class="underlined" name="attr_character_name" value="" role="heading" aria-level="2" type="text" title="@{character_name}"/>
|
|
<div class="input-label input-label--dual"><span class="uppercase" data-i18n="difficulty level abbreviation"></span>
|
|
<input class="underlined" type="number" name="attr_difficulty_size" title="@{difficulty_size}"/><!-- separatorObj:{} --><span class="slash h2">/</span>
|
|
<input class="underlined" type="number" name="attr_difficulty_level" title="@{difficulty_level}"/>
|
|
</div>
|
|
</section>
|
|
<section class="tiny-gap npc-separator" id="npc-stats">
|
|
<div class="attributes flex-box half-gap justify-space-around flex-wrap">
|
|
<div class="stat-container vigilance">
|
|
<div class="input-label input-label--button stacked center no-gap">
|
|
<button class="roller" name="roll_vigilance" data-i18n="vigilance" role="heading" aria-level="3" value="@{vigilance_action}" title="%{vigilance}" type="roll">
|
|
</button>
|
|
<input class="underlined input-label__input" name="attr_vigilance_goal" value="11" type="number" title="@{vigilance_goal}"/>
|
|
</div>
|
|
<button name="act_vigilance-action" hidden="" type="action" title="%{vigilance-action}">
|
|
</button>
|
|
<input name="attr_vigilance_action" type="hidden" title="@{vigilance_action}"/>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<div class="plus-container">
|
|
<input class="plus-control" name="attr_vigilance" value="0" type="hidden" title="@{vigilance}"/><span class="plus-display" name="attr_vigilance" title="@{vigilance}">0</span>
|
|
</div><span class="parentheses">)</span>
|
|
</div>
|
|
</div>
|
|
<div class="stat-container build">
|
|
<div class="input-label input-label--button stacked center no-gap">
|
|
<button class="roller" name="roll_build" data-i18n="build" role="heading" aria-level="3" value="@{build_action}" title="%{build}" type="roll">
|
|
</button>
|
|
<input class="underlined input-label__input" name="attr_build_goal" value="11" type="number" title="@{build_goal}"/>
|
|
</div>
|
|
<button name="act_build-action" hidden="" type="action" title="%{build-action}">
|
|
</button>
|
|
<input name="attr_build_action" type="hidden" title="@{build_action}"/>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<div class="plus-container">
|
|
<input class="plus-control" name="attr_build" value="0" type="hidden" title="@{build}"/><span class="plus-display" name="attr_build" title="@{build}">0</span>
|
|
</div><span class="parentheses">)</span>
|
|
</div>
|
|
</div>
|
|
<div class="stat-container intuition">
|
|
<div class="input-label input-label--button stacked center no-gap">
|
|
<button class="roller" name="roll_intuition" data-i18n="intuition" role="heading" aria-level="3" value="@{intuition_action}" title="%{intuition}" type="roll">
|
|
</button>
|
|
<input class="underlined input-label__input" name="attr_intuition_goal" value="11" type="number" title="@{intuition_goal}"/>
|
|
</div>
|
|
<button name="act_intuition-action" hidden="" type="action" title="%{intuition-action}">
|
|
</button>
|
|
<input name="attr_intuition_action" type="hidden" title="@{intuition_action}"/>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<div class="plus-container">
|
|
<input class="plus-control" name="attr_intuition" value="0" type="hidden" title="@{intuition}"/><span class="plus-display" name="attr_intuition" title="@{intuition}">0</span>
|
|
</div><span class="parentheses">)</span>
|
|
</div>
|
|
</div>
|
|
<div class="stat-container reflex">
|
|
<div class="input-label input-label--button stacked center no-gap">
|
|
<button class="roller" name="roll_reflex" data-i18n="reflex" role="heading" aria-level="3" value="@{reflex_action}" title="%{reflex}" type="roll">
|
|
</button>
|
|
<input class="underlined input-label__input" name="attr_reflex_goal" value="11" type="number" title="@{reflex_goal}"/>
|
|
</div>
|
|
<button name="act_reflex-action" hidden="" type="action" title="%{reflex-action}">
|
|
</button>
|
|
<input name="attr_reflex_action" type="hidden" title="@{reflex_action}"/>
|
|
<div class="parens-holder"><span class="parentheses">(</span>
|
|
<div class="plus-container">
|
|
<input class="plus-control" name="attr_reflex" value="0" type="hidden" title="@{reflex}"/><span class="plus-display" name="attr_reflex" title="@{reflex}">0</span>
|
|
</div><span class="parentheses">)</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="armor-movement flex-box half-gap justify-space-around flex-wrap">
|
|
<div class="overlay-content">
|
|
<div class="health max circle basic-border ratio1-1"></div>
|
|
<label class="input-label stacked center no-gap overlaid-content"><span class="input-label__text" data-i18n="health" role="heading" aria-level="3"></span>
|
|
<input class="input-label__input" type="number" name="attr_health_max" title="@{health|max}"/>
|
|
</label>
|
|
</div>
|
|
<div class="overlay-content">
|
|
<div class="resolve max circle basic-border ratio1-1"></div>
|
|
<label class="input-label stacked center no-gap overlaid-content"><span class="input-label__text" data-i18n="resolve" role="heading" aria-level="3"></span>
|
|
<input class="input-label__input" type="number" name="attr_resolve_max" title="@{resolve|max}"/>
|
|
</label>
|
|
</div>
|
|
<div class="overlay-content">
|
|
<div class="armor circle basic-border ratio1-1"></div>
|
|
<label class="input-label stacked center no-gap overlaid-content"><span class="input-label__text" data-i18n="armor abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="input-label__input" type="number" name="attr_armor" title="@{armor}"/>
|
|
</label>
|
|
</div>
|
|
<div class="overlay-content">
|
|
<div class="movement rate circle basic-border ratio1-1"></div>
|
|
<label class="input-label stacked center no-gap overlaid-content"><span class="input-label__text" data-i18n="movement rate abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="input-label__input" type="number" name="attr_movement_rate" title="@{movement_rate}"/>
|
|
</label>
|
|
</div>
|
|
<div class="overlay-content">
|
|
<div class="sprint speed circle basic-border ratio1-1"></div>
|
|
<label class="input-label stacked center no-gap overlaid-content"><span class="input-label__text" data-i18n="sprint speed abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="input-label__input" type="number" name="attr_sprint_speed" title="@{sprint_speed}"/>
|
|
</label>
|
|
</div>
|
|
<div class="overlay-content">
|
|
<div class="adrenaline circle basic-border ratio1-1"></div>
|
|
<label class="input-label stacked center no-gap overlaid-content"><span class="input-label__text" data-i18n="adrenaline abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="input-label__input" type="number" name="attr_adrenaline" title="@{adrenaline}"/>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="characteristics half-gap justify-space-between">
|
|
<label class="input-label no-gap"><span class="input-label__text" data-i18n="aptitude-abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="underlined input-label__input" name="attr_aptitude" type="number" title="@{aptitude}"/>
|
|
</label>
|
|
<label class="input-label no-gap"><span class="input-label__text" data-i18n="athletics-abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="underlined input-label__input" name="attr_athletics" type="number" title="@{athletics}"/>
|
|
</label>
|
|
<label class="input-label no-gap"><span class="input-label__text" data-i18n="charisma-abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="underlined input-label__input" name="attr_charisma" type="number" title="@{charisma}"/>
|
|
</label>
|
|
<label class="input-label no-gap"><span class="input-label__text" data-i18n="logic-abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="underlined input-label__input" name="attr_logic" type="number" title="@{logic}"/>
|
|
</label>
|
|
<label class="input-label no-gap"><span class="input-label__text" data-i18n="wisdom-abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="underlined input-label__input" name="attr_wisdom" type="number" title="@{wisdom}"/>
|
|
</label>
|
|
<label class="input-label no-gap"><span class="input-label__text" data-i18n="size-abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="underlined input-label__input" name="attr_size" type="number" title="@{size}"/>
|
|
</label>
|
|
<label class="input-label no-gap"><span class="input-label__text" data-i18n="stamina-abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="underlined input-label__input" name="attr_stamina" type="number" title="@{stamina}"/>
|
|
</label>
|
|
<label class="input-label no-gap"><span class="input-label__text" data-i18n="willpower-abbreviation" role="heading" aria-level="3"></span>
|
|
<input class="underlined input-label__input" name="attr_willpower" type="number" title="@{willpower}"/>
|
|
</label>
|
|
</div>
|
|
</section>
|
|
<div class="collapse-container">
|
|
<input class="collapse" name="attr_npc_skills" value="1" type="checkbox" title="@{npc_skills}"/>
|
|
<section class="collapse-container npc-skill-container" aria-labelledby="npc-skill-header" id="npc-skill">
|
|
<h3 data-i18n="skills" id="npc-skill-header"></h3>
|
|
<div class="npc-assess-container input-label collapse-container avoid-break">
|
|
<button class="roller" name="roll_assess" role="heading" aria-level="3" data-i18n="assess" value="@{assess_action}" title="%{assess}" type="roll">
|
|
</button>
|
|
<button name="act_assess-action" hidden="" type="action" title="%{assess-action}">
|
|
</button>
|
|
<input name="attr_assess_action" type="hidden" title="@{assess_action}"/>
|
|
<div class="plus-containercollapsed">
|
|
<input class="plus-control" name="attr_assess" value="" type="hidden" title="@{assess}"/><span class="plus-display collapsed" name="attr_assess" title="@{assess}"></span>
|
|
</div>
|
|
<input class="expanded underlined" name="attr_assess" type="number" title="@{assess}"/>
|
|
</div>
|
|
<div class="npc-deceive-container input-label collapse-container avoid-break">
|
|
<button class="roller" name="roll_deceive" role="heading" aria-level="3" data-i18n="deceive" value="@{deceive_action}" title="%{deceive}" type="roll">
|
|
</button>
|
|
<button name="act_deceive-action" hidden="" type="action" title="%{deceive-action}">
|
|
</button>
|
|
<input name="attr_deceive_action" type="hidden" title="@{deceive_action}"/>
|
|
<div class="plus-containercollapsed">
|
|
<input class="plus-control" name="attr_deceive" value="" type="hidden" title="@{deceive}"/><span class="plus-display collapsed" name="attr_deceive" title="@{deceive}"></span>
|
|
</div>
|
|
<input class="expanded underlined" name="attr_deceive" type="number" title="@{deceive}"/>
|
|
</div>
|
|
<div class="npc-deduce-container input-label collapse-container avoid-break">
|
|
<button class="roller" name="roll_deduce" role="heading" aria-level="3" data-i18n="deduce" value="@{deduce_action}" title="%{deduce}" type="roll">
|
|
</button>
|
|
<button name="act_deduce-action" hidden="" type="action" title="%{deduce-action}">
|
|
</button>
|
|
<input name="attr_deduce_action" type="hidden" title="@{deduce_action}"/>
|
|
<div class="plus-containercollapsed">
|
|
<input class="plus-control" name="attr_deduce" value="" type="hidden" title="@{deduce}"/><span class="plus-display collapsed" name="attr_deduce" title="@{deduce}"></span>
|
|
</div>
|
|
<input class="expanded underlined" name="attr_deduce" type="number" title="@{deduce}"/>
|
|
</div>
|
|
<div class="npc-disguise-container input-label collapse-container avoid-break">
|
|
<button class="roller" name="roll_disguise" role="heading" aria-level="3" data-i18n="disguise" value="@{disguise_action}" title="%{disguise}" type="roll">
|
|
</button>
|
|
<button name="act_disguise-action" hidden="" type="action" title="%{disguise-action}">
|
|
</button>
|
|
<input name="attr_disguise_action" type="hidden" title="@{disguise_action}"/>
|
|
<div class="plus-containercollapsed">
|
|
<input class="plus-control" name="attr_disguise" value="" type="hidden" title="@{disguise}"/><span class="plus-display collapsed" name="attr_disguise" title="@{disguise}"></span>
|
|
</div>
|
|
<input class="expanded underlined" name="attr_disguise" type="number" title="@{disguise}"/>
|
|
</div>
|
|
<div class="npc-encrypt-container input-label collapse-container avoid-break">
|
|
<button class="roller" name="roll_encrypt" role="heading" aria-level="3" data-i18n="encrypt" value="@{encrypt_action}" title="%{encrypt}" type="roll">
|
|
</button>
|
|
<button name="act_encrypt-action" hidden="" type="action" title="%{encrypt-action}">
|
|
</button>
|
|
<input name="attr_encrypt_action" type="hidden" title="@{encrypt_action}"/>
|
|
<div class="plus-containercollapsed">
|
|
<input class="plus-control" name="attr_encrypt" value="" type="hidden" title="@{encrypt}"/><span class="plus-display collapsed" name="attr_encrypt" title="@{encrypt}"></span>
|
|
</div>
|
|
<input class="expanded underlined" name="attr_encrypt" type="number" title="@{encrypt}"/>
|
|
</div>
|
|
<div class="npc-first-aid-container input-label collapse-container avoid-break">
|
|
<button class="roller" name="roll_first_aid" role="heading" aria-level="3" data-i18n="first aid" value="@{first_aid_action}" title="%{first_aid}" type="roll">
|
|
</button>
|
|
<button name="act_first-aid-action" hidden="" type="action" title="%{first-aid-action}">
|
|
</button>
|
|
<input name="attr_first_aid_action" type="hidden" title="@{first_aid_action}"/>
|
|
<div class="plus-containercollapsed">
|
|
<input class="plus-control" name="attr_first_aid" value="" type="hidden" title="@{first_aid}"/><span class="plus-display collapsed" name="attr_first_aid" title="@{first_aid}"></span>
|
|
</div>
|
|
<input class="expanded underlined" name="attr_first_aid" type="number" title="@{first_aid}"/>
|
|
</div>
|
|
<div class="npc-hide-container input-label collapse-container avoid-break">
|
|
<button class="roller" name="roll_hide" role="heading" aria-level="3" data-i18n="hide" value="@{hide_action}" title="%{hide}" type="roll">
|
|
</button>
|
|
<button name="act_hide-action" hidden="" type="action" title="%{hide-action}">
|
|
</button>
|
|
<input name="attr_hide_action" type="hidden" title="@{hide_action}"/>
|
|
<div class="plus-containercollapsed">
|
|
<input class="plus-control" name="attr_hide" value="" type="hidden" title="@{hide}"/><span class="plus-display collapsed" name="attr_hide" title="@{hide}"></span>
|
|
</div>
|
|
<input class="expanded underlined" name="attr_hide" type="number" title="@{hide}"/>
|
|
</div>
|
|
<div class="npc-legerdemain-container input-label collapse-container avoid-break">
|
|
<button class="roller" name="roll_legerdemain" role="heading" aria-level="3" data-i18n="legerdemain" value="@{legerdemain_action}" title="%{legerdemain}" type="roll">
|
|
</button>
|
|
<button name="act_legerdemain-action" hidden="" type="action" title="%{legerdemain-action}">
|
|
</button>
|
|
<input name="attr_legerdemain_action" type="hidden" title="@{legerdemain_action}"/>
|
|
<div class="plus-containercollapsed">
|
|
<input class="plus-control" name="attr_legerdemain" value="" type="hidden" title="@{legerdemain}"/><span class="plus-display collapsed" name="attr_legerdemain" title="@{legerdemain}"></span>
|
|
</div>
|
|
<input class="expanded underlined" name="attr_legerdemain" type="number" title="@{legerdemain}"/>
|
|
</div>
|
|
<div class="npc-locksmith-container input-label collapse-container avoid-break">
|
|
<button class="roller" name="roll_locksmith" role="heading" aria-level="3" data-i18n="locksmith" value="@{locksmith_action}" title="%{locksmith}" type="roll">
|
|
</button>
|
|
<button name="act_locksmith-action" hidden="" type="action" title="%{locksmith-action}">
|
|
</button>
|
|
<input name="attr_locksmith_action" type="hidden" title="@{locksmith_action}"/>
|
|
<div class="plus-containercollapsed">
|
|
<input class="plus-control" name="attr_locksmith" value="" type="hidden" title="@{locksmith}"/><span class="plus-display collapsed" name="attr_locksmith" title="@{locksmith}"></span>
|
|
</div>
|
|
<input class="expanded underlined" name="attr_locksmith" type="number" title="@{locksmith}"/>
|
|
</div>
|
|
<div class="npc-nurse-ment-container input-label collapse-container avoid-break">
|
|
<button class="roller" name="roll_nurse_(ment)" role="heading" aria-level="3" data-i18n="nurse (ment)" value="@{nurse_(ment)_action}" title="%{nurse_(ment)}" type="roll">
|
|
</button>
|
|
<button name="act_nurse-(ment)-action" hidden="" type="action" title="%{nurse-(ment)-action}">
|
|
</button>
|
|
<input name="attr_nurse_(ment)_action" type="hidden" title="@{nurse_(ment)_action}"/>
|
|
<div class="plus-containercollapsed">
|
|
<input class="plus-control" name="attr_nurse_(ment)" value="" type="hidden" title="@{nurse_(ment)}"/><span class="plus-display collapsed" name="attr_nurse_(ment)" title="@{nurse_(ment)}"></span>
|
|
</div>
|
|
<input class="expanded underlined" name="attr_nurse_(ment)" type="number" title="@{nurse_(ment)}"/>
|
|
</div>
|
|
<div class="npc-nurse-phys-container input-label collapse-container avoid-break">
|
|
<button class="roller" name="roll_nurse_(phys)" role="heading" aria-level="3" data-i18n="nurse (phys)" value="@{nurse_(phys)_action}" title="%{nurse_(phys)}" type="roll">
|
|
</button>
|
|
<button name="act_nurse-(phys)-action" hidden="" type="action" title="%{nurse-(phys)-action}">
|
|
</button>
|
|
<input name="attr_nurse_(phys)_action" type="hidden" title="@{nurse_(phys)_action}"/>
|
|
<div class="plus-containercollapsed">
|
|
<input class="plus-control" name="attr_nurse_(phys)" value="" type="hidden" title="@{nurse_(phys)}"/><span class="plus-display collapsed" name="attr_nurse_(phys)" title="@{nurse_(phys)}"></span>
|
|
</div>
|
|
<input class="expanded underlined" name="attr_nurse_(phys)" type="number" title="@{nurse_(phys)}"/>
|
|
</div>
|
|
<div class="npc-persuade-container input-label collapse-container avoid-break">
|
|
<button class="roller" name="roll_persuade" role="heading" aria-level="3" data-i18n="persuade" value="@{persuade_action}" title="%{persuade}" type="roll">
|
|
</button>
|
|
<button name="act_persuade-action" hidden="" type="action" title="%{persuade-action}">
|
|
</button>
|
|
<input name="attr_persuade_action" type="hidden" title="@{persuade_action}"/>
|
|
<div class="plus-containercollapsed">
|
|
<input class="plus-control" name="attr_persuade" value="" type="hidden" title="@{persuade}"/><span class="plus-display collapsed" name="attr_persuade" title="@{persuade}"></span>
|
|
</div>
|
|
<input class="expanded underlined" name="attr_persuade" type="number" title="@{persuade}"/>
|
|
</div>
|
|
<div class="npc-research-container input-label collapse-container avoid-break">
|
|
<button class="roller" name="roll_research" role="heading" aria-level="3" data-i18n="research" value="@{research_action}" title="%{research}" type="roll">
|
|
</button>
|
|
<button name="act_research-action" hidden="" type="action" title="%{research-action}">
|
|
</button>
|
|
<input name="attr_research_action" type="hidden" title="@{research_action}"/>
|
|
<div class="plus-containercollapsed">
|
|
<input class="plus-control" name="attr_research" value="" type="hidden" title="@{research}"/><span class="plus-display collapsed" name="attr_research" title="@{research}"></span>
|
|
</div>
|
|
<input class="expanded underlined" name="attr_research" type="number" title="@{research}"/>
|
|
</div>
|
|
<div class="npc-ridesteer-container input-label collapse-container avoid-break">
|
|
<button class="roller" name="roll_ride/steer" role="heading" aria-level="3" data-i18n="ride/steer" value="@{ride/steer_action}" title="%{ride/steer}" type="roll">
|
|
</button>
|
|
<button name="act_ride/steer-action" hidden="" type="action" title="%{ride/steer-action}">
|
|
</button>
|
|
<input name="attr_ride/steer_action" type="hidden" title="@{ride/steer_action}"/>
|
|
<div class="plus-containercollapsed">
|
|
<input class="plus-control" name="attr_ride/steer" value="" type="hidden" title="@{ride/steer}"/><span class="plus-display collapsed" name="attr_ride/steer" title="@{ride/steer}"></span>
|
|
</div>
|
|
<input class="expanded underlined" name="attr_ride/steer" type="number" title="@{ride/steer}"/>
|
|
</div>
|
|
<div class="npc-search-container input-label collapse-container avoid-break">
|
|
<button class="roller" name="roll_search" role="heading" aria-level="3" data-i18n="search" value="@{search_action}" title="%{search}" type="roll">
|
|
</button>
|
|
<button name="act_search-action" hidden="" type="action" title="%{search-action}">
|
|
</button>
|
|
<input name="attr_search_action" type="hidden" title="@{search_action}"/>
|
|
<div class="plus-containercollapsed">
|
|
<input class="plus-control" name="attr_search" value="" type="hidden" title="@{search}"/><span class="plus-display collapsed" name="attr_search" title="@{search}"></span>
|
|
</div>
|
|
<input class="expanded underlined" name="attr_search" type="number" title="@{search}"/>
|
|
</div>
|
|
<div class="npc-sneak-container input-label collapse-container avoid-break">
|
|
<button class="roller" name="roll_sneak" role="heading" aria-level="3" data-i18n="sneak" value="@{sneak_action}" title="%{sneak}" type="roll">
|
|
</button>
|
|
<button name="act_sneak-action" hidden="" type="action" title="%{sneak-action}">
|
|
</button>
|
|
<input name="attr_sneak_action" type="hidden" title="@{sneak_action}"/>
|
|
<div class="plus-containercollapsed">
|
|
<input class="plus-control" name="attr_sneak" value="" type="hidden" title="@{sneak}"/><span class="plus-display collapsed" name="attr_sneak" title="@{sneak}"></span>
|
|
</div>
|
|
<input class="expanded underlined" name="attr_sneak" type="number" title="@{sneak}"/>
|
|
</div>
|
|
<div class="npc-stunt-container input-label collapse-container avoid-break">
|
|
<button class="roller" name="roll_stunt" role="heading" aria-level="3" data-i18n="stunt" value="@{stunt_action}" title="%{stunt}" type="roll">
|
|
</button>
|
|
<button name="act_stunt-action" hidden="" type="action" title="%{stunt-action}">
|
|
</button>
|
|
<input name="attr_stunt_action" type="hidden" title="@{stunt_action}"/>
|
|
<div class="plus-containercollapsed">
|
|
<input class="plus-control" name="attr_stunt" value="" type="hidden" title="@{stunt}"/><span class="plus-display collapsed" name="attr_stunt" title="@{stunt}"></span>
|
|
</div>
|
|
<input class="expanded underlined" name="attr_stunt" type="number" title="@{stunt}"/>
|
|
</div>
|
|
<div class="npc-survive-container input-label collapse-container avoid-break">
|
|
<button class="roller" name="roll_survive" role="heading" aria-level="3" data-i18n="survive" value="@{survive_action}" title="%{survive}" type="roll">
|
|
</button>
|
|
<button name="act_survive-action" hidden="" type="action" title="%{survive-action}">
|
|
</button>
|
|
<input name="attr_survive_action" type="hidden" title="@{survive_action}"/>
|
|
<div class="plus-containercollapsed">
|
|
<input class="plus-control" name="attr_survive" value="" type="hidden" title="@{survive}"/><span class="plus-display collapsed" name="attr_survive" title="@{survive}"></span>
|
|
</div>
|
|
<input class="expanded underlined" name="attr_survive" type="number" title="@{survive}"/>
|
|
</div>
|
|
<div class="npc-threaten-container input-label collapse-container avoid-break">
|
|
<button class="roller" name="roll_threaten" role="heading" aria-level="3" data-i18n="threaten" value="@{threaten_action}" title="%{threaten}" type="roll">
|
|
</button>
|
|
<button name="act_threaten-action" hidden="" type="action" title="%{threaten-action}">
|
|
</button>
|
|
<input name="attr_threaten_action" type="hidden" title="@{threaten_action}"/>
|
|
<div class="plus-containercollapsed">
|
|
<input class="plus-control" name="attr_threaten" value="" type="hidden" title="@{threaten}"/><span class="plus-display collapsed" name="attr_threaten" title="@{threaten}"></span>
|
|
</div>
|
|
<input class="expanded underlined" name="attr_threaten" type="number" title="@{threaten}"/>
|
|
</div>
|
|
<div class="npc-tinker-container input-label collapse-container avoid-break">
|
|
<button class="roller" name="roll_tinker" role="heading" aria-level="3" data-i18n="tinker" value="@{tinker_action}" title="%{tinker}" type="roll">
|
|
</button>
|
|
<button name="act_tinker-action" hidden="" type="action" title="%{tinker-action}">
|
|
</button>
|
|
<input name="attr_tinker_action" type="hidden" title="@{tinker_action}"/>
|
|
<div class="plus-containercollapsed">
|
|
<input class="plus-control" name="attr_tinker" value="" type="hidden" title="@{tinker}"/><span class="plus-display collapsed" name="attr_tinker" title="@{tinker}"></span>
|
|
</div>
|
|
<input class="expanded underlined" name="attr_tinker" type="number" title="@{tinker}"/>
|
|
</div>
|
|
</section>
|
|
<section class="collapse-container npc-skill-container" aria-labelledby="npc-combat-header" id="npc-combat">
|
|
<h3 data-i18n="combat skills" id="npc-combat-header"></h3>
|
|
<div class="npc-melee-container input-label collapse-container avoid-break">
|
|
<button class="roller" name="roll_melee" role="heading" aria-level="3" data-i18n="melee" value="@{melee_action}" title="%{melee}" type="roll">
|
|
</button>
|
|
<button name="act_melee-action" hidden="" type="action" title="%{melee-action}">
|
|
</button>
|
|
<input name="attr_melee_action" type="hidden" title="@{melee_action}"/>
|
|
<div class="plus-containercollapsed">
|
|
<input class="plus-control" name="attr_melee" value="" type="hidden" title="@{melee}"/><span class="plus-display collapsed" name="attr_melee" title="@{melee}"></span>
|
|
</div>
|
|
<input class="expanded underlined" name="attr_melee" type="number" title="@{melee}"/>
|
|
</div>
|
|
<div class="npc-ranged-container input-label collapse-container avoid-break">
|
|
<button class="roller" name="roll_ranged" role="heading" aria-level="3" data-i18n="ranged" value="@{ranged_action}" title="%{ranged}" type="roll">
|
|
</button>
|
|
<button name="act_ranged-action" hidden="" type="action" title="%{ranged-action}">
|
|
</button>
|
|
<input name="attr_ranged_action" type="hidden" title="@{ranged_action}"/>
|
|
<div class="plus-containercollapsed">
|
|
<input class="plus-control" name="attr_ranged" value="" type="hidden" title="@{ranged}"/><span class="plus-display collapsed" name="attr_ranged" title="@{ranged}"></span>
|
|
</div>
|
|
<input class="expanded underlined" name="attr_ranged" type="number" title="@{ranged}"/>
|
|
</div>
|
|
</section>
|
|
</div>
|
|
<section class="npc-weapons npc-separator repeating-container" aria-labelledby="npc-weapon-header" id="npc-weapons">
|
|
<h3 data-i18n="attacks"></h3>
|
|
<button class="repcontrol-button repcontrol-button--add" name="act_add-weapon" type="action" title="%{add-weapon}">
|
|
</button>
|
|
<fieldset class="repeating_weapon">
|
|
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_weapon_$X_collapse}"/>
|
|
<div class="collapsed flex-box flex-wrap half-gap">
|
|
<button class="flex-box half-gap roller" name="roll_roll" value="@{action}" title="%{repeating_weapon_$X_roll}" type="roll"><span name="attr_skill" data-i18n-dynamic="" title="@{repeating_weapon_$X_skill}"></span><span name="attr_name" title="@{repeating_weapon_$X_name}"></span>
|
|
</button>
|
|
<button name="act_action" hidden="" type="action" title="%{repeating_weapon_$X_action}">
|
|
</button>
|
|
<input name="attr_action" type="hidden" title="@{repeating_weapon_$X_action}"/>
|
|
<input class="empty-hider" name="attr_damage" value="" type="hidden" title="@{repeating_weapon_$X_damage}"/>
|
|
<div class="flex-box tiny-gap"><span name="attr_damage" title="@{repeating_weapon_$X_damage}"></span><span data-i18n="damage-abbreviation"></span>
|
|
</div>
|
|
<input class="empty-hider" name="attr_range" value="" type="hidden" title="@{repeating_weapon_$X_range}"/>
|
|
<div class="flex-box tiny-gap"><span data-i18n="range"></span><span name="attr_range" title="@{repeating_weapon_$X_range}"></span>
|
|
</div>
|
|
</div>
|
|
<div class="expanded">
|
|
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_weapon_$X_collapse}"/>
|
|
<div class="flex-box span-all half-gap">
|
|
<input class="equipped" name="attr_equipped" value="1" checked="" type="checkbox" title="@{repeating_weapon_$X_equipped}"/>
|
|
<input class="underlined flex-min-content" name="attr_name" type="text" title="@{repeating_weapon_$X_name}"/>
|
|
<label class="input-label" clas="wear"><span class="input-label__text" data-i18n="wear" role="heading" aria-level="4"></span>
|
|
<input class="underlined input-label__input" name="attr_wear" type="number" title="@{repeating_weapon_$X_wear}"/>
|
|
</label>
|
|
<button class="roller" name="roll_roll" value="@{action}" title="%{repeating_weapon_$X_roll}" type="roll">
|
|
</button>
|
|
<button name="act_action" hidden="" type="action" title="%{repeating_weapon_$X_action}">
|
|
</button>
|
|
<input name="attr_action" type="hidden" title="@{repeating_weapon_$X_action}"/>
|
|
</div>
|
|
<input class="section-control" name="attr_type" value="weapon" hidden="" type="checkbox" title="@{repeating_weapon_$X_type}"/>
|
|
<div class="section-display expanded weapon-section">
|
|
<label class="input-label"><span class="input-label__text" data-i18n="skill"></span>
|
|
<select class="underlined input-label__input" name="attr_skill" title="@{repeating_weapon_$X_skill}">
|
|
<option value="" data-i18n="select one" selected=""></option>
|
|
<option value="assess" data-i18n="assess"></option>
|
|
<option value="deceive" data-i18n="deceive"></option>
|
|
<option value="deduce" data-i18n="deduce"></option>
|
|
<option value="disguise" data-i18n="disguise"></option>
|
|
<option value="encrypt" data-i18n="encrypt"></option>
|
|
<option value="first_aid" data-i18n="first aid"></option>
|
|
<option value="hide" data-i18n="hide"></option>
|
|
<option value="legerdemain" data-i18n="legerdemain"></option>
|
|
<option value="locksmith" data-i18n="locksmith"></option>
|
|
<option value="nurse_(ment)" data-i18n="nurse (ment)"></option>
|
|
<option value="nurse_(phys)" data-i18n="nurse (phys)"></option>
|
|
<option value="persuade" data-i18n="persuade"></option>
|
|
<option value="research" data-i18n="research"></option>
|
|
<option value="ride/steer" data-i18n="ride/steer"></option>
|
|
<option value="search" data-i18n="search"></option>
|
|
<option value="sneak" data-i18n="sneak"></option>
|
|
<option value="stunt" data-i18n="stunt"></option>
|
|
<option value="survive" data-i18n="survive"></option>
|
|
<option value="threaten" data-i18n="threaten"></option>
|
|
<option value="tinker" data-i18n="tinker"></option>
|
|
<option value="melee" data-i18n="melee"></option>
|
|
<option value="ranged" data-i18n="ranged"></option>
|
|
</select>
|
|
</label>
|
|
<label class="input-label blitz"><span class="input-label__text" data-i18n="properties" role="heading" aria-level="4"></span>
|
|
<input class="underlined input-label__input" name="attr_properties" type="text" title="@{repeating_weapon_$X_properties}"/>
|
|
</label>
|
|
<div class="input-label input-label--dual damage"><span data-i18n="damage" role="heading" aria-level="4"></span>
|
|
<input class="underlined" name="attr_damage" type="text" title="@{repeating_weapon_$X_damage}"/><span class="slash">+</span>
|
|
<select class="underlined" name="attr_damage_characteristic" title="@{repeating_weapon_$X_damage_characteristic}">
|
|
<option value="" data-i18n="select one" selected=""></option>
|
|
<option value="aptitude" data-i18n="aptitude"></option>
|
|
<option value="athletics" data-i18n="athletics"></option>
|
|
<option value="charisma" data-i18n="charisma"></option>
|
|
<option value="logic" data-i18n="logic"></option>
|
|
<option value="wisdom" data-i18n="wisdom"></option>
|
|
<option value="size" data-i18n="size"></option>
|
|
<option value="stamina" data-i18n="stamina"></option>
|
|
<option value="willpower" data-i18n="willpower"></option>
|
|
</select>
|
|
</div>
|
|
<label class="input-label range"><span class="input-label__text" data-i18n="range" role="heading" aria-level="4"></span>
|
|
<input class="underlined input-label__input" name="attr_range" type="text" title="@{repeating_weapon_$X_range}"/>
|
|
</label>
|
|
</div>
|
|
<div class="flex-box justify-center span-all half-gap expanded">
|
|
<label class="input-label"><span class="input-label__text" data-i18n="uses slot"></span>
|
|
<input class="underlined input-label__input" name="attr_uses_slot" type="checkbox" value="1" checked="" title="@{repeating_weapon_$X_uses_slot}"/>
|
|
</label>
|
|
<label class="input-label"><span class="input-label__text" data-i18n="size"></span>
|
|
<select class="underlined input-label__input" name="attr_item_size" title="@{repeating_weapon_$X_item_size}">
|
|
<option value="" data-i18n="select size" selected=""></option>
|
|
<option value="small" data-i18n="small"></option>
|
|
<option value="medium" data-i18n="medium"></option>
|
|
<option value="large" data-i18n="large"></option>
|
|
</select>
|
|
</label>
|
|
</div>
|
|
<div class="adaptive adaptive--text description"><span class="adaptive--text__span" name="attr_description" title="@{repeating_weapon_$X_description}"></span>
|
|
<textarea class="boxed adaptive--text__textarea" name="attr_description" title="@{repeating_weapon_$X_description}"></textarea>
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
</section>
|
|
<section class="npc-abilities npc-separator repeating-container" aria-labelledby="npc-ability-header" id="npc-abilities">
|
|
<h3 data-i18n="abilities"></h3>
|
|
<button class="repcontrol-button repcontrol-button--add" name="act_add-ability" type="action" title="%{add-ability}">
|
|
</button>
|
|
<fieldset class="repeating_ability">
|
|
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_ability_$X_collapse}"/>
|
|
<div class="collapsed inline">
|
|
<button class="inline-flex-box half-gap roller" name="roll_roll" value="@{action}" title="%{repeating_ability_$X_roll}" type="roll"><span name="attr_type" data-i18n-dynamic="" title="@{repeating_ability_$X_type}"></span><span name="attr_name" title="@{repeating_ability_$X_name}"></span>
|
|
</button>
|
|
<button name="act_action" hidden="" type="action" title="%{repeating_ability_$X_action}">
|
|
</button>
|
|
<input name="attr_action" type="hidden" title="@{repeating_ability_$X_action}"/><span class="inline-description" name="attr_description" title="@{repeating_ability_$X_description}"></span>
|
|
</div>
|
|
<div class="expanded">
|
|
<div class="span-all flex-box half-gap flex-wrap">
|
|
<button class="roller" name="roll_roll" value="@{action}" title="%{repeating_ability_$X_roll}" type="roll">
|
|
</button>
|
|
<button name="act_action" hidden="" type="action" title="%{repeating_ability_$X_action}">
|
|
</button>
|
|
<input name="attr_action" type="hidden" title="@{repeating_ability_$X_action}"/>
|
|
<select class="underlined" name="attr_type" title="@{repeating_ability_$X_type}">
|
|
<option value="" data-i18n="select one"></option>
|
|
<option value="action" data-i18n="action"></option>
|
|
<option value="blitz" data-i18n="blitz"></option>
|
|
<option value="counter" data-i18n="counter"></option>
|
|
<option value="passive" data-i18n="passive"></option>
|
|
</select>
|
|
<input class="underlined flex-min-content" name="attr_name" data-i18n-placeholder="name" type="text" title="@{repeating_ability_$X_name}"/>
|
|
<label class="input-label"><span class="input-label__text" data-i18n="skill"></span>
|
|
<select class="underlined input-label__input" name="attr_skill" title="@{repeating_ability_$X_skill}">
|
|
<option value="" data-i18n="select one" selected=""></option>
|
|
<option value="assess" data-i18n="assess"></option>
|
|
<option value="deceive" data-i18n="deceive"></option>
|
|
<option value="deduce" data-i18n="deduce"></option>
|
|
<option value="disguise" data-i18n="disguise"></option>
|
|
<option value="encrypt" data-i18n="encrypt"></option>
|
|
<option value="first_aid" data-i18n="first aid"></option>
|
|
<option value="hide" data-i18n="hide"></option>
|
|
<option value="legerdemain" data-i18n="legerdemain"></option>
|
|
<option value="locksmith" data-i18n="locksmith"></option>
|
|
<option value="nurse_(ment)" data-i18n="nurse (ment)"></option>
|
|
<option value="nurse_(phys)" data-i18n="nurse (phys)"></option>
|
|
<option value="persuade" data-i18n="persuade"></option>
|
|
<option value="research" data-i18n="research"></option>
|
|
<option value="ride/steer" data-i18n="ride/steer"></option>
|
|
<option value="search" data-i18n="search"></option>
|
|
<option value="sneak" data-i18n="sneak"></option>
|
|
<option value="stunt" data-i18n="stunt"></option>
|
|
<option value="survive" data-i18n="survive"></option>
|
|
<option value="threaten" data-i18n="threaten"></option>
|
|
<option value="tinker" data-i18n="tinker"></option>
|
|
<option value="melee" data-i18n="melee"></option>
|
|
<option value="ranged" data-i18n="ranged"></option>
|
|
</select>
|
|
</label>
|
|
</div>
|
|
<div class="headed-textarea">
|
|
<h4 data-i18n="description"></h4>
|
|
<div class="adaptive adaptive--text"><span class="adaptive--text__span" name="attr_description" title="@{repeating_ability_$X_description}"></span>
|
|
<textarea class="boxed adaptive--text__textarea" name="attr_description" title="@{repeating_ability_$X_description}"></textarea>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
</section>
|
|
<section class="npc-gear" aria-labelledby="npc-gear-header" id="npc-gear">
|
|
<h3 data-i18n="items"></h3>
|
|
<div class="adaptive adaptive--text"><span class="adaptive--text__span" name="attr_npc_items" title="@{npc_items}"></span>
|
|
<textarea class="boxed adaptive--text__textarea" name="attr_npc_items" title="@{npc_items}"></textarea>
|
|
</div>
|
|
</section>
|
|
</article>
|
|
<article class="tabs__container tabs--backbone__container tabs--backbone__container--settings" data-container-tab="backbone" data-tab="settings" id="settings">
|
|
<h1 data-i18n="settings"></h1>
|
|
<label class="input-label"><span class="input-label__text" data-i18n="character type"></span>
|
|
<select class="underlined input-label__input" name="attr_character_type" title="@{character_type}">
|
|
<option data-i18n="pc" value="pc" selected=""></option>
|
|
<option data-i18n="npc" value="npc"></option>
|
|
</select>
|
|
</label>
|
|
<label class="input-label"><span class="input-label__text" data-i18n="whisper rolls to gm"></span>
|
|
<select class="underlined input-label__input" name="attr_whisper" title="@{whisper}">
|
|
<option data-i18n="never" value="" selected=""></option>
|
|
<option data-i18n="always" value="/w gm "></option>
|
|
</select>
|
|
</label>
|
|
</article>
|
|
</div>
|
|
</div>
|
|
</main>
|
|
<rolltemplate class="sheet-rolltemplate-backbone">
|
|
<div class="template backbone">
|
|
<div class="image-border"></div>
|
|
<div class="sheet-content stacked center flex-box half-gap">{{#character_name}}{{#character_id}}
|
|
<h4 class="character_name">[{{character_name}}](http://journal.roll20.net/character/{{character_id}})</h4>{{/character_id}}{{^character_id}}
|
|
<h4 class="character_name">{{character_name}}</h4>{{/character_id}}{{/character_name}}{{#roll}}
|
|
<div class="flex-box results half-gap stacked center"><span class="result">{{#pure_success}}<span class="pure-success"></span>{{/pure_success}}{{computed::roll}}</span>{{#title}}
|
|
<h2>{{title}}</h2>{{/title}}
|
|
</div>{{/roll}}{{#luck}}
|
|
<div class="flex-box results half-gap stacked center center">{{#rollTotal() computed::luck 1}}<span class="result result--is-crit">{{luck}}</span>{{/rollTotal() computed::luck 1}}{{#rollTotal() computed::luck 0}}<span class="result result--is-fumble">{{luck}}</span>{{/rollTotal() computed::luck 0}}
|
|
</div>{{/luck}}
|
|
<div class="header flex-box stacked center flex-wrap">{{#roll_name}}
|
|
<h3 class="title align-self-start">{{roll_name}}</h3>{{/roll_name}}
|
|
</div>{{#luck}}
|
|
<div class="flex-box results half-gap stacked center center">{{#rollTotal() computed::luck 1}}
|
|
<h3 class="result" data-i18n="lucky-message"></h3>{{/rollTotal() computed::luck 1}}{{#rollTotal() computed::luck 0}}
|
|
<h3 class="result" data-i18n="unlucky-message"></h3>{{/rollTotal() computed::luck 0}}
|
|
</div>{{/luck}}{{#damage}}
|
|
<div class="flex-box space-between results half-gap column-reverse">{{#damage_type}}
|
|
<h3>{{damage_type}}</h3>{{/damage_type}}{{^damage_type}}
|
|
<h3 data-i18n="damage"></h3>{{/damage_type}}<span class="result">{{computed::damage}}</span>
|
|
</div>{{/damage}}{{#description}}
|
|
<div class="description flex-box stacked center align-self-stretch">
|
|
<p style="text-align:left">{{description}}</p>
|
|
</div>{{/description}}
|
|
</div>
|
|
</div>
|
|
</rolltemplate>
|
|
<input name="attr_template_start" value="@{whisper}&{template:backbone} {{character_name=@{character_name}}} {{character_id=@{character_id}}}" type="hidden" title="@{template_start}"/>
|
|
<script type="text/worker">
|
|
const k = (function(){
|
|
const kFuncs = {};
|
|
|
|
const cascades = {"attr_character_name":{"name":"character_name","type":"text","defaultValue":"","affects":[],"triggeredFuncs":["setActionCalls"],"listenerFunc":"accessSheet","listener":"change:character_name"},"attr_sheet_version":{"name":"sheet_version","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_sheet_state":{"name":"sheet_state","type":"hidden","defaultValue":"settings","triggeredFuncs":[],"affects":[]},"attr_collapsed":{"name":"collapsed","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_backbone_tab":{"name":"backbone_tab","type":"hidden","defaultValue":"nav-tabs-backbone--settings","triggeredFuncs":[],"affects":[]},"attr_bewildered":{"triggeredFuncs":["resetCondition"],"name":"bewildered","listener":"change:bewildered","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-bewildered":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-bewildered","listener":"clicked:decrement-track-bewildered","listenerFunc":"accessSheet","type":"action"},"attr_track_bewildered":{"name":"track_bewildered","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-bewildered":{"triggeredFuncs":["incrementInput"],"name":"increment-track-bewildered","listener":"clicked:increment-track-bewildered","listenerFunc":"accessSheet","type":"action"},"attr_bleeding":{"triggeredFuncs":["resetCondition"],"name":"bleeding","listener":"change:bleeding","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-bleeding":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-bleeding","listener":"clicked:decrement-track-bleeding","listenerFunc":"accessSheet","type":"action"},"attr_track_bleeding":{"name":"track_bleeding","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-bleeding":{"triggeredFuncs":["incrementInput"],"name":"increment-track-bleeding","listener":"clicked:increment-track-bleeding","listenerFunc":"accessSheet","type":"action"},"attr_blinded":{"triggeredFuncs":["resetCondition"],"name":"blinded","listener":"change:blinded","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-blinded":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-blinded","listener":"clicked:decrement-track-blinded","listenerFunc":"accessSheet","type":"action"},"attr_track_blinded":{"name":"track_blinded","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-blinded":{"triggeredFuncs":["incrementInput"],"name":"increment-track-blinded","listener":"clicked:increment-track-blinded","listenerFunc":"accessSheet","type":"action"},"attr_burned":{"triggeredFuncs":["resetCondition"],"name":"burned","listener":"change:burned","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-burned":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-burned","listener":"clicked:decrement-track-burned","listenerFunc":"accessSheet","type":"action"},"attr_track_burned":{"name":"track_burned","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-burned":{"triggeredFuncs":["incrementInput"],"name":"increment-track-burned","listener":"clicked:increment-track-burned","listenerFunc":"accessSheet","type":"action"},"attr_confused":{"triggeredFuncs":["resetCondition"],"name":"confused","listener":"change:confused","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-confused":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-confused","listener":"clicked:decrement-track-confused","listenerFunc":"accessSheet","type":"action"},"attr_track_confused":{"name":"track_confused","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-confused":{"triggeredFuncs":["incrementInput"],"name":"increment-track-confused","listener":"clicked:increment-track-confused","listenerFunc":"accessSheet","type":"action"},"attr_deafened":{"triggeredFuncs":["resetCondition"],"name":"deafened","listener":"change:deafened","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-deafened":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-deafened","listener":"clicked:decrement-track-deafened","listenerFunc":"accessSheet","type":"action"},"attr_track_deafened":{"name":"track_deafened","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-deafened":{"triggeredFuncs":["incrementInput"],"name":"increment-track-deafened","listener":"clicked:increment-track-deafened","listenerFunc":"accessSheet","type":"action"},"attr_incapacitated":{"triggeredFuncs":["resetCondition"],"name":"incapacitated","listener":"change:incapacitated","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-incapacitated":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-incapacitated","listener":"clicked:decrement-track-incapacitated","listenerFunc":"accessSheet","type":"action"},"attr_track_incapacitated":{"name":"track_incapacitated","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-incapacitated":{"triggeredFuncs":["incrementInput"],"name":"increment-track-incapacitated","listener":"clicked:increment-track-incapacitated","listenerFunc":"accessSheet","type":"action"},"attr_infuriated":{"triggeredFuncs":["resetCondition"],"name":"infuriated","listener":"change:infuriated","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-infuriated":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-infuriated","listener":"clicked:decrement-track-infuriated","listenerFunc":"accessSheet","type":"action"},"attr_track_infuriated":{"name":"track_infuriated","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-infuriated":{"triggeredFuncs":["incrementInput"],"name":"increment-track-infuriated","listener":"clicked:increment-track-infuriated","listenerFunc":"accessSheet","type":"action"},"attr_intoxicated":{"triggeredFuncs":["resetCondition"],"name":"intoxicated","listener":"change:intoxicated","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-intoxicated":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-intoxicated","listener":"clicked:decrement-track-intoxicated","listenerFunc":"accessSheet","type":"action"},"attr_track_intoxicated":{"name":"track_intoxicated","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-intoxicated":{"triggeredFuncs":["incrementInput"],"name":"increment-track-intoxicated","listener":"clicked:increment-track-intoxicated","listenerFunc":"accessSheet","type":"action"},"attr_plagued":{"triggeredFuncs":["resetCondition"],"name":"plagued","listener":"change:plagued","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-plagued":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-plagued","listener":"clicked:decrement-track-plagued","listenerFunc":"accessSheet","type":"action"},"attr_track_plagued":{"name":"track_plagued","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-plagued":{"triggeredFuncs":["incrementInput"],"name":"increment-track-plagued","listener":"clicked:increment-track-plagued","listenerFunc":"accessSheet","type":"action"},"attr_poisoned":{"triggeredFuncs":["resetCondition"],"name":"poisoned","listener":"change:poisoned","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-poisoned":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-poisoned","listener":"clicked:decrement-track-poisoned","listenerFunc":"accessSheet","type":"action"},"attr_track_poisoned":{"name":"track_poisoned","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-poisoned":{"triggeredFuncs":["incrementInput"],"name":"increment-track-poisoned","listener":"clicked:increment-track-poisoned","listenerFunc":"accessSheet","type":"action"},"attr_panicked":{"triggeredFuncs":["resetCondition"],"name":"panicked","listener":"change:panicked","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-panicked":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-panicked","listener":"clicked:decrement-track-panicked","listenerFunc":"accessSheet","type":"action"},"attr_track_panicked":{"name":"track_panicked","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-panicked":{"triggeredFuncs":["incrementInput"],"name":"increment-track-panicked","listener":"clicked:increment-track-panicked","listenerFunc":"accessSheet","type":"action"},"attr_sleeping":{"triggeredFuncs":["resetCondition"],"name":"sleeping","listener":"change:sleeping","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-sleeping":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-sleeping","listener":"clicked:decrement-track-sleeping","listenerFunc":"accessSheet","type":"action"},"attr_track_sleeping":{"name":"track_sleeping","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-sleeping":{"triggeredFuncs":["incrementInput"],"name":"increment-track-sleeping","listener":"clicked:increment-track-sleeping","listenerFunc":"accessSheet","type":"action"},"attr_spellbound":{"triggeredFuncs":["resetCondition"],"name":"spellbound","listener":"change:spellbound","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-spellbound":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-spellbound","listener":"clicked:decrement-track-spellbound","listenerFunc":"accessSheet","type":"action"},"attr_track_spellbound":{"name":"track_spellbound","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-spellbound":{"triggeredFuncs":["incrementInput"],"name":"increment-track-spellbound","listener":"clicked:increment-track-spellbound","listenerFunc":"accessSheet","type":"action"},"attr_wounded":{"triggeredFuncs":["resetCondition"],"name":"wounded","listener":"change:wounded","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-wounded":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-wounded","listener":"clicked:decrement-track-wounded","listenerFunc":"accessSheet","type":"action"},"attr_track_wounded":{"name":"track_wounded","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-wounded":{"triggeredFuncs":["incrementInput"],"name":"increment-track-wounded","listener":"clicked:increment-track-wounded","listenerFunc":"accessSheet","type":"action"},"attr_comatose":{"triggeredFuncs":["resetCondition"],"name":"comatose","listener":"change:comatose","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-comatose":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-comatose","listener":"clicked:decrement-track-comatose","listenerFunc":"accessSheet","type":"action"},"attr_track_comatose":{"name":"track_comatose","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-comatose":{"triggeredFuncs":["incrementInput"],"name":"increment-track-comatose","listener":"clicked:increment-track-comatose","listenerFunc":"accessSheet","type":"action"},"attr_death":{"triggeredFuncs":["resetCondition"],"name":"death","listener":"change:death","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-death":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-death","listener":"clicked:decrement-track-death","listenerFunc":"accessSheet","type":"action"},"attr_track_death":{"name":"track_death","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-death":{"triggeredFuncs":["incrementInput"],"name":"increment-track-death","listener":"clicked:increment-track-death","listenerFunc":"accessSheet","type":"action"},"attr_in_extremis":{"triggeredFuncs":["resetCondition"],"name":"in_extremis","listener":"change:in_extremis","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-in-extremis":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-in-extremis","listener":"clicked:decrement-track-in-extremis","listenerFunc":"accessSheet","type":"action"},"attr_track_in_extremis":{"name":"track_in_extremis","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-in-extremis":{"triggeredFuncs":["incrementInput"],"name":"increment-track-in-extremis","listener":"clicked:increment-track-in-extremis","listenerFunc":"accessSheet","type":"action"},"attr_prone":{"triggeredFuncs":["resetCondition"],"name":"prone","listener":"change:prone","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-prone":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-prone","listener":"clicked:decrement-track-prone","listenerFunc":"accessSheet","type":"action"},"attr_track_prone":{"name":"track_prone","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-prone":{"triggeredFuncs":["incrementInput"],"name":"increment-track-prone","listener":"clicked:increment-track-prone","listenerFunc":"accessSheet","type":"action"},"attr_restrained":{"triggeredFuncs":["resetCondition"],"name":"restrained","listener":"change:restrained","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-restrained":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-restrained","listener":"clicked:decrement-track-restrained","listenerFunc":"accessSheet","type":"action"},"attr_track_restrained":{"name":"track_restrained","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-restrained":{"triggeredFuncs":["incrementInput"],"name":"increment-track-restrained","listener":"clicked:increment-track-restrained","listenerFunc":"accessSheet","type":"action"},"attr_unconscious":{"triggeredFuncs":["resetCondition"],"name":"unconscious","listener":"change:unconscious","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"act_decrement-track-unconscious":{"triggeredFuncs":["decrementInput"],"name":"decrement-track-unconscious","listener":"clicked:decrement-track-unconscious","listenerFunc":"accessSheet","type":"action"},"attr_track_unconscious":{"name":"track_unconscious","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-track-unconscious":{"triggeredFuncs":["incrementInput"],"name":"increment-track-unconscious","listener":"clicked:increment-track-unconscious","listenerFunc":"accessSheet","type":"action"},"attr_roll_state":{"name":"roll_state","type":"radio","defaultValue":"2d20kh1","triggeredFuncs":[],"affects":[]},"attr_whisper":{"name":"whisper","type":"hidden","defaultValue":" ","triggeredFuncs":["sheetTypeDisplay"],"affects":[],"listener":"change:whisper","listenerFunc":"accessSheet"},"act_nav-tabs-backbone--pc":{"triggeredFuncs":["kSwitchTab"],"navFuncs":["refreshAnimations"],"name":"nav-tabs-backbone--pc","listener":"clicked:nav-tabs-backbone--pc","listenerFunc":"accessSheet","type":"action"},"act_nav-tabs-backbone--npc":{"triggeredFuncs":["kSwitchTab"],"navFuncs":["refreshAnimations"],"name":"nav-tabs-backbone--npc","listener":"clicked:nav-tabs-backbone--npc","listenerFunc":"accessSheet","type":"action"},"act_nav-tabs-backbone--settings":{"triggeredFuncs":["kSwitchTab"],"navFuncs":["refreshAnimations"],"name":"nav-tabs-backbone--settings","listener":"clicked:nav-tabs-backbone--settings","listenerFunc":"accessSheet","type":"action"},"act_condition-display":{"triggeredFuncs":["showConditions"],"name":"condition-display","listener":"clicked:condition-display","listenerFunc":"accessSheet","type":"action"},"attr_age":{"name":"age","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_gender":{"name":"gender","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_origin":{"name":"origin","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_dialect":{"name":"dialect","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_level":{"name":"level","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_archetype":{"name":"archetype","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_ideals":{"name":"ideals","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_fortune":{"name":"fortune","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_aptitude":{"affects":["reflex_goal"],"name":"aptitude","listener":"change:aptitude","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_athletics":{"affects":["reflex_goal","movement_rate","sprint_speed","item_slots_max"],"name":"athletics","listener":"change:athletics","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_charisma":{"affects":["intuition_goal"],"name":"charisma","listener":"change:charisma","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_logic":{"affects":["vigilance_goal"],"name":"logic","listener":"change:logic","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_wisdom":{"affects":["intuition_goal"],"name":"wisdom","listener":"change:wisdom","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_size":{"affects":["build_goal","item_slots_max"],"name":"size","listener":"change:size","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_stamina":{"affects":["build_goal"],"name":"stamina","listener":"change:stamina","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_willpower":{"affects":["vigilance_goal"],"name":"willpower","listener":"change:willpower","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_vigilance_goal":{"calculation":"calcAttribute","affects":["vigilance"],"name":"vigilance_goal","listener":"change:vigilance_goal","listenerFunc":"accessSheet","type":"number","defaultValue":11,"triggeredFuncs":[]},"act_vigilance-action":{"triggeredFuncs":["rollAttribute"],"name":"vigilance-action","listener":"clicked:vigilance-action","listenerFunc":"accessSheet","type":"action"},"attr_vigilance_action":{"name":"vigilance_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_vigilance":{"calculation":"calcAttributeMod","name":"vigilance","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_build_goal":{"calculation":"calcAttribute","affects":["build"],"name":"build_goal","listener":"change:build_goal","listenerFunc":"accessSheet","type":"number","defaultValue":11,"triggeredFuncs":[]},"act_build-action":{"triggeredFuncs":["rollAttribute"],"name":"build-action","listener":"clicked:build-action","listenerFunc":"accessSheet","type":"action"},"attr_build_action":{"name":"build_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_build":{"calculation":"calcAttributeMod","name":"build","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_intuition_goal":{"calculation":"calcAttribute","affects":["intuition"],"name":"intuition_goal","listener":"change:intuition_goal","listenerFunc":"accessSheet","type":"number","defaultValue":11,"triggeredFuncs":[]},"act_intuition-action":{"triggeredFuncs":["rollAttribute"],"name":"intuition-action","listener":"clicked:intuition-action","listenerFunc":"accessSheet","type":"action"},"attr_intuition_action":{"name":"intuition_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_intuition":{"calculation":"calcAttributeMod","name":"intuition","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_reflex_goal":{"calculation":"calcAttribute","affects":["reflex"],"name":"reflex_goal","listener":"change:reflex_goal","listenerFunc":"accessSheet","type":"number","defaultValue":11,"triggeredFuncs":[]},"act_reflex-action":{"triggeredFuncs":["rollAttribute"],"name":"reflex-action","listener":"clicked:reflex-action","listenerFunc":"accessSheet","type":"action"},"attr_reflex_action":{"name":"reflex_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_reflex":{"calculation":"calcAttributeMod","name":"reflex","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_armor-collapse":{"name":"armor-collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_armor":{"name":"armor","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_movement_rate":{"calculation":"calcMovement","name":"movement_rate","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_sprint_speed":{"calculation":"calcSprint","name":"sprint_speed","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_armor_name":{"name":"armor_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_unequip-armor":{"triggeredFuncs":["equipArmor"],"name":"unequip-armor","listener":"clicked:unequip-armor","listenerFunc":"accessSheet","type":"action"},"attr_armor_details":{"name":"armor_details","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_health":{"name":"health","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_health-action":{"triggeredFuncs":["rollHealthCheck"],"name":"health-action","listener":"clicked:health-action","listenerFunc":"accessSheet","type":"action"},"attr_health_action":{"name":"health_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_health_max":{"name":"health_max","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_resolve":{"name":"resolve","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_resolve-action":{"triggeredFuncs":["rollHealthCheck"],"name":"resolve-action","listener":"clicked:resolve-action","listenerFunc":"accessSheet","type":"action"},"attr_resolve_action":{"name":"resolve_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_resolve_max":{"name":"resolve_max","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_luck":{"name":"luck","type":"radio","defaultValue":"odd","triggeredFuncs":[],"affects":[]},"act_luck-action":{"triggeredFuncs":["rollLuck"],"name":"luck-action","listener":"clicked:luck-action","listenerFunc":"accessSheet","type":"action"},"attr_luck_action":{"name":"luck_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_decrement-adrenaline":{"triggeredFuncs":["decrementInput"],"name":"decrement-adrenaline","listener":"clicked:decrement-adrenaline","listenerFunc":"accessSheet","type":"action"},"attr_adrenaline":{"name":"adrenaline","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-adrenaline":{"triggeredFuncs":["incrementInput"],"name":"increment-adrenaline","listener":"clicked:increment-adrenaline","listenerFunc":"accessSheet","type":"action"},"act_decrement-skill-points":{"triggeredFuncs":["decrementInput"],"name":"decrement-skill-points","listener":"clicked:decrement-skill-points","listenerFunc":"accessSheet","type":"action"},"attr_skill_points":{"name":"skill_points","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_increment-skill-points":{"triggeredFuncs":["incrementInput"],"name":"increment-skill-points","listener":"clicked:increment-skill-points","listenerFunc":"accessSheet","type":"action"},"act_assess-action":{"triggeredFuncs":["rollSkill"],"name":"assess-action","listener":"clicked:assess-action","listenerFunc":"accessSheet","type":"action"},"attr_assess_action":{"name":"assess_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_assess_proficiency":{"name":"assess_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_assess_mastery":{"name":"assess_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_deceive-action":{"triggeredFuncs":["rollSkill"],"name":"deceive-action","listener":"clicked:deceive-action","listenerFunc":"accessSheet","type":"action"},"attr_deceive_action":{"name":"deceive_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_deceive_proficiency":{"name":"deceive_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_deceive_mastery":{"name":"deceive_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_deduce-action":{"triggeredFuncs":["rollSkill"],"name":"deduce-action","listener":"clicked:deduce-action","listenerFunc":"accessSheet","type":"action"},"attr_deduce_action":{"name":"deduce_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_deduce_proficiency":{"name":"deduce_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_deduce_mastery":{"name":"deduce_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_disguise-action":{"triggeredFuncs":["rollSkill"],"name":"disguise-action","listener":"clicked:disguise-action","listenerFunc":"accessSheet","type":"action"},"attr_disguise_action":{"name":"disguise_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_disguise_proficiency":{"name":"disguise_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_disguise_mastery":{"name":"disguise_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_encrypt-action":{"triggeredFuncs":["rollSkill"],"name":"encrypt-action","listener":"clicked:encrypt-action","listenerFunc":"accessSheet","type":"action"},"attr_encrypt_action":{"name":"encrypt_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_encrypt_proficiency":{"name":"encrypt_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_encrypt_mastery":{"name":"encrypt_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_first-aid-action":{"triggeredFuncs":["rollSkill"],"name":"first-aid-action","listener":"clicked:first-aid-action","listenerFunc":"accessSheet","type":"action"},"attr_first_aid_action":{"name":"first_aid_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_first_aid_proficiency":{"name":"first_aid_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_first_aid_mastery":{"name":"first_aid_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_hide-action":{"triggeredFuncs":["rollSkill"],"name":"hide-action","listener":"clicked:hide-action","listenerFunc":"accessSheet","type":"action"},"attr_hide_action":{"name":"hide_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_hide_proficiency":{"name":"hide_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_hide_mastery":{"name":"hide_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_legerdemain-action":{"triggeredFuncs":["rollSkill"],"name":"legerdemain-action","listener":"clicked:legerdemain-action","listenerFunc":"accessSheet","type":"action"},"attr_legerdemain_action":{"name":"legerdemain_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_legerdemain_proficiency":{"name":"legerdemain_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_legerdemain_mastery":{"name":"legerdemain_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_locksmith-action":{"triggeredFuncs":["rollSkill"],"name":"locksmith-action","listener":"clicked:locksmith-action","listenerFunc":"accessSheet","type":"action"},"attr_locksmith_action":{"name":"locksmith_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_locksmith_proficiency":{"name":"locksmith_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_locksmith_mastery":{"name":"locksmith_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_nurse-(ment)-action":{"triggeredFuncs":["rollSkill"],"name":"nurse-(ment)-action","listener":"clicked:nurse-(ment)-action","listenerFunc":"accessSheet","type":"action"},"attr_nurse_(ment)_action":{"name":"nurse_(ment)_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_nurse_(ment)_proficiency":{"name":"nurse_(ment)_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_nurse_(ment)_mastery":{"name":"nurse_(ment)_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_nurse-(phys)-action":{"triggeredFuncs":["rollSkill"],"name":"nurse-(phys)-action","listener":"clicked:nurse-(phys)-action","listenerFunc":"accessSheet","type":"action"},"attr_nurse_(phys)_action":{"name":"nurse_(phys)_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_nurse_(phys)_proficiency":{"name":"nurse_(phys)_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_nurse_(phys)_mastery":{"name":"nurse_(phys)_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_persuade-action":{"triggeredFuncs":["rollSkill"],"name":"persuade-action","listener":"clicked:persuade-action","listenerFunc":"accessSheet","type":"action"},"attr_persuade_action":{"name":"persuade_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_persuade_proficiency":{"name":"persuade_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_persuade_mastery":{"name":"persuade_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_research-action":{"triggeredFuncs":["rollSkill"],"name":"research-action","listener":"clicked:research-action","listenerFunc":"accessSheet","type":"action"},"attr_research_action":{"name":"research_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_research_proficiency":{"name":"research_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_research_mastery":{"name":"research_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_ride/steer-action":{"triggeredFuncs":["rollSkill"],"name":"ride/steer-action","listener":"clicked:ride/steer-action","listenerFunc":"accessSheet","type":"action"},"attr_ride/steer_action":{"name":"ride/steer_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_ride/steer_proficiency":{"name":"ride/steer_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_ride/steer_mastery":{"name":"ride/steer_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_search-action":{"triggeredFuncs":["rollSkill"],"name":"search-action","listener":"clicked:search-action","listenerFunc":"accessSheet","type":"action"},"attr_search_action":{"name":"search_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_search_proficiency":{"name":"search_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_search_mastery":{"name":"search_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_sneak-action":{"triggeredFuncs":["rollSkill"],"name":"sneak-action","listener":"clicked:sneak-action","listenerFunc":"accessSheet","type":"action"},"attr_sneak_action":{"name":"sneak_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_sneak_proficiency":{"name":"sneak_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_sneak_mastery":{"name":"sneak_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_stunt-action":{"triggeredFuncs":["rollSkill"],"name":"stunt-action","listener":"clicked:stunt-action","listenerFunc":"accessSheet","type":"action"},"attr_stunt_action":{"name":"stunt_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_stunt_proficiency":{"name":"stunt_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_stunt_mastery":{"name":"stunt_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_survive-action":{"triggeredFuncs":["rollSkill"],"name":"survive-action","listener":"clicked:survive-action","listenerFunc":"accessSheet","type":"action"},"attr_survive_action":{"name":"survive_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_survive_proficiency":{"name":"survive_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_survive_mastery":{"name":"survive_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_threaten-action":{"triggeredFuncs":["rollSkill"],"name":"threaten-action","listener":"clicked:threaten-action","listenerFunc":"accessSheet","type":"action"},"attr_threaten_action":{"name":"threaten_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_threaten_proficiency":{"name":"threaten_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_threaten_mastery":{"name":"threaten_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_tinker-action":{"triggeredFuncs":["rollSkill"],"name":"tinker-action","listener":"clicked:tinker-action","listenerFunc":"accessSheet","type":"action"},"attr_tinker_action":{"name":"tinker_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_tinker_proficiency":{"name":"tinker_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_tinker_mastery":{"name":"tinker_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_melee-action":{"triggeredFuncs":["rollSkill"],"name":"melee-action","listener":"clicked:melee-action","listenerFunc":"accessSheet","type":"action"},"attr_melee_action":{"name":"melee_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_melee_proficiency":{"name":"melee_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_melee_mastery":{"name":"melee_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_ranged-action":{"triggeredFuncs":["rollSkill"],"name":"ranged-action","listener":"clicked:ranged-action","listenerFunc":"accessSheet","type":"action"},"attr_ranged_action":{"name":"ranged_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_ranged_proficiency":{"name":"ranged_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_ranged_mastery":{"name":"ranged_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_add-specialty":{"listenerFunc":"addItem","name":"add-specialty","listener":"clicked:add-specialty","type":"action"},"act_repeating_specialty_$X_action":{"triggeredFuncs":["rollSkill"],"name":"repeating_specialty_$X_action","listener":"clicked:repeating_specialty:action","listenerFunc":"accessSheet","type":"action"},"attr_repeating_specialty_$X_action":{"name":"repeating_specialty_$X_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_specialty_$X_name":{"name":"repeating_specialty_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_specialty_$X_proficiency":{"name":"repeating_specialty_$X_proficiency","type":"radio","defaultValue":-1,"triggeredFuncs":[],"affects":[]},"attr_repeating_specialty_$X_characteristic":{"name":"repeating_specialty_$X_characteristic","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_specialty_$X_undefined_mastery":{"name":"repeating_specialty_$X_undefined_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_credit":{"name":"credit","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_coin":{"name":"coin","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_badge":{"name":"badge","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_clothes":{"name":"clothes","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_overburdened":{"calculation":"calcOverburdened","name":"overburdened","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_item_slots":{"affects":["overburdened"],"calculation":"calcUsedSlots","name":"item_slots","listener":"change:item_slots","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_item_slots_max":{"affects":["overburdened"],"calculation":"calcItemSlotsMax","name":"item_slots_max","listener":"change:item_slots_max","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"act_add-equipped":{"listenerFunc":"addItem","name":"add-equipped","listener":"clicked:add-equipped","type":"action"},"attr_repeating_equipped_$X_collapse":{"name":"repeating_equipped_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_equipped_$X_equipped":{"triggeredFuncs":["equipItem"],"affects":["item_slots"],"name":"repeating_equipped_$X_equipped","listener":"change:repeating_equipped:equipped","listenerFunc":"accessSheet","type":"checkbox","defaultValue":1},"attr_repeating_equipped_$X_name":{"name":"repeating_equipped_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_equipped_$X_uses":{"name":"repeating_equipped_$X_uses","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_equipped_$X_uses_max":{"name":"repeating_equipped_$X_uses_max","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_repeating_equipped_$X_action":{"triggeredFuncs":["rollRepeating"],"name":"repeating_equipped_$X_action","listener":"clicked:repeating_equipped:action","listenerFunc":"accessSheet","type":"action"},"attr_repeating_equipped_$X_action":{"name":"repeating_equipped_$X_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_equipped_$X_skill":{"name":"repeating_equipped_$X_skill","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_equipped_$X_uses_slot":{"affects":["item_slots"],"name":"repeating_equipped_$X_uses_slot","listener":"change:repeating_equipped:uses_slot","listenerFunc":"accessSheet","type":"checkbox","defaultValue":1,"triggeredFuncs":[]},"attr_repeating_equipped_$X_item_size":{"name":"repeating_equipped_$X_item_size","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_equipped_$X_description":{"name":"repeating_equipped_$X_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_add-stored":{"listenerFunc":"addItem","name":"add-stored","listener":"clicked:add-stored","type":"action"},"attr_repeating_stored_$X_collapse":{"name":"repeating_stored_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_equipped":{"triggeredFuncs":["equipItem"],"affects":["item_slots"],"name":"repeating_stored_$X_equipped","listener":"change:repeating_stored:equipped","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0},"attr_repeating_stored_$X_name":{"name":"repeating_stored_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_type":{"name":"repeating_stored_$X_type","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_wear":{"name":"repeating_stored_$X_wear","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_skill":{"name":"repeating_stored_$X_skill","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_properties":{"name":"repeating_stored_$X_properties","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_damage":{"name":"repeating_stored_$X_damage","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_damage_characteristic":{"name":"repeating_stored_$X_damage_characteristic","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_range":{"name":"repeating_stored_$X_range","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_uses":{"name":"repeating_stored_$X_uses","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_uses_max":{"name":"repeating_stored_$X_uses_max","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_armor_bonus":{"name":"repeating_stored_$X_armor_bonus","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_uses_slot":{"affects":["item_slots"],"name":"repeating_stored_$X_uses_slot","listener":"change:repeating_stored:uses_slot","listenerFunc":"accessSheet","type":"checkbox","defaultValue":1,"triggeredFuncs":[]},"attr_repeating_stored_$X_item_size":{"name":"repeating_stored_$X_item_size","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_stored_$X_description":{"name":"repeating_stored_$X_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_add-weapon":{"listenerFunc":"addItem","name":"add-weapon","listener":"clicked:add-weapon","type":"action"},"fieldset_repeating_weapon":{"addFuncs":["addWeapon"],"name":"repeating_weapon","type":"fieldset"},"attr_repeating_weapon_$X_collapse":{"name":"repeating_weapon_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_weapon_$X_equipped":{"triggeredFuncs":["equipItem"],"affects":["item_slots"],"name":"repeating_weapon_$X_equipped","listener":"change:repeating_weapon:equipped","listenerFunc":"accessSheet","type":"checkbox","defaultValue":1},"attr_repeating_weapon_$X_name":{"name":"repeating_weapon_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapon_$X_wear":{"name":"repeating_weapon_$X_wear","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_repeating_weapon_$X_action":{"triggeredFuncs":["rollRepeating"],"name":"repeating_weapon_$X_action","listener":"clicked:repeating_weapon:action","listenerFunc":"accessSheet","type":"action"},"attr_repeating_weapon_$X_action":{"name":"repeating_weapon_$X_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapon_$X_type":{"defaultValue":"","name":"repeating_weapon_$X_type","type":"checkbox","triggeredFuncs":[],"affects":[]},"attr_repeating_weapon_$X_skill":{"name":"repeating_weapon_$X_skill","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapon_$X_properties":{"name":"repeating_weapon_$X_properties","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapon_$X_damage":{"name":"repeating_weapon_$X_damage","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapon_$X_damage_characteristic":{"name":"repeating_weapon_$X_damage_characteristic","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapon_$X_range":{"name":"repeating_weapon_$X_range","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapon_$X_uses_slot":{"affects":["item_slots"],"name":"repeating_weapon_$X_uses_slot","listener":"change:repeating_weapon:uses_slot","listenerFunc":"accessSheet","type":"checkbox","defaultValue":1,"triggeredFuncs":[]},"attr_repeating_weapon_$X_item_size":{"name":"repeating_weapon_$X_item_size","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapon_$X_description":{"name":"repeating_weapon_$X_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_container_1":{"name":"container_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_ammo_1":{"name":"ammo_1","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_ammo_type_1":{"name":"ammo_type_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_ammo_2":{"name":"ammo_2","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_ammo_type_2":{"name":"ammo_type_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_container_2":{"name":"container_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_ammo_3":{"name":"ammo_3","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_ammo_type_3":{"name":"ammo_type_3","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_ammo_4":{"name":"ammo_4","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_ammo_type_4":{"name":"ammo_type_4","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_add-ability":{"listenerFunc":"addItem","name":"add-ability","listener":"clicked:add-ability","type":"action"},"attr_repeating_ability_$X_collapse":{"name":"repeating_ability_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_repeating_ability_$X_action":{"triggeredFuncs":["rollRepeating"],"name":"repeating_ability_$X_action","listener":"clicked:repeating_ability:action","listenerFunc":"accessSheet","type":"action"},"attr_repeating_ability_$X_action":{"name":"repeating_ability_$X_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_ability_$X_name":{"name":"repeating_ability_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_ability_$X_skill":{"name":"repeating_ability_$X_skill","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_ability_$X_description":{"name":"repeating_ability_$X_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_add-favorable":{"listenerFunc":"addItem","name":"add-favorable","listener":"clicked:add-favorable","type":"action"},"attr_repeating_favorable_$X_collapse":{"name":"repeating_favorable_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_favorable_$X_name":{"name":"repeating_favorable_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_favorable_$X_description":{"name":"repeating_favorable_$X_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_add-unfavorable":{"listenerFunc":"addItem","name":"add-unfavorable","listener":"clicked:add-unfavorable","type":"action"},"attr_repeating_unfavorable_$X_collapse":{"name":"repeating_unfavorable_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_unfavorable_$X_name":{"name":"repeating_unfavorable_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_unfavorable_$X_description":{"name":"repeating_unfavorable_$X_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_backstory":{"name":"backstory","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_notes":{"name":"notes","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_difficulty_size":{"name":"difficulty_size","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_difficulty_level":{"name":"difficulty_level","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_npc_skills":{"name":"npc_skills","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_assess":{"name":"assess","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:assess","listenerFunc":"accessSheet"},"attr_deceive":{"name":"deceive","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:deceive","listenerFunc":"accessSheet"},"attr_deduce":{"name":"deduce","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:deduce","listenerFunc":"accessSheet"},"attr_disguise":{"name":"disguise","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:disguise","listenerFunc":"accessSheet"},"attr_encrypt":{"name":"encrypt","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:encrypt","listenerFunc":"accessSheet"},"attr_first_aid":{"name":"first_aid","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:first_aid","listenerFunc":"accessSheet"},"attr_hide":{"name":"hide","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:hide","listenerFunc":"accessSheet"},"attr_legerdemain":{"name":"legerdemain","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:legerdemain","listenerFunc":"accessSheet"},"attr_locksmith":{"name":"locksmith","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:locksmith","listenerFunc":"accessSheet"},"attr_nurse_(ment)":{"name":"nurse_(ment)","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:nurse_(ment)","listenerFunc":"accessSheet"},"attr_nurse_(phys)":{"name":"nurse_(phys)","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:nurse_(phys)","listenerFunc":"accessSheet"},"attr_persuade":{"name":"persuade","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:persuade","listenerFunc":"accessSheet"},"attr_research":{"name":"research","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:research","listenerFunc":"accessSheet"},"attr_ride/steer":{"name":"ride/steer","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:ride/steer","listenerFunc":"accessSheet"},"attr_search":{"name":"search","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:search","listenerFunc":"accessSheet"},"attr_sneak":{"name":"sneak","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:sneak","listenerFunc":"accessSheet"},"attr_stunt":{"name":"stunt","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:stunt","listenerFunc":"accessSheet"},"attr_survive":{"name":"survive","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:survive","listenerFunc":"accessSheet"},"attr_threaten":{"name":"threaten","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:threaten","listenerFunc":"accessSheet"},"attr_tinker":{"name":"tinker","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:tinker","listenerFunc":"accessSheet"},"attr_melee":{"name":"melee","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:melee","listenerFunc":"accessSheet"},"attr_ranged":{"name":"ranged","type":"hidden","defaultValue":"","triggeredFuncs":["displayNPCSkill"],"affects":[],"listener":"change:ranged","listenerFunc":"accessSheet"},"attr_repeating_ability_$X_type":{"name":"repeating_ability_$X_type","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_npc_items":{"name":"npc_items","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_character_type":{"triggeredFuncs":["sheetTypeDisplay"],"name":"character_type","listener":"change:character_type","listenerFunc":"accessSheet","type":"select","defaultValue":"","affects":[]},"attr_template_start":{"name":"template_start","type":"hidden","defaultValue":"@{whisper}&{template:backbone} {{character_name=@{character_name}}} {{character_id=@{character_id}}}","triggeredFuncs":[],"affects":[]}};
|
|
|
|
kFuncs.cascades = cascades;
|
|
|
|
const repeatingSectionDetails = [{"section":"repeating_specialty","fields":["action","name","proficiency","characteristic","undefined_mastery"]},{"section":"repeating_equipped","fields":["collapse","equipped","name","uses","uses_max","action","skill","uses_slot","item_size","description"]},{"section":"repeating_stored","fields":["collapse","equipped","name","type","wear","skill","properties","damage","damage_characteristic","range","uses","uses_max","armor_bonus","uses_slot","item_size","description"]},{"section":"repeating_weapon","fields":["collapse","equipped","name","wear","action","type","skill","properties","damage","damage_characteristic","range","uses_slot","item_size","description"]},{"section":"repeating_ability","fields":["collapse","action","name","skill","description","type"]},{"section":"repeating_favorable","fields":["collapse","name","description"]},{"section":"repeating_unfavorable","fields":["collapse","name","description"]}];
|
|
|
|
kFuncs.repeatingSectionDetails = repeatingSectionDetails;
|
|
/**
|
|
* This stores the name of your sheet for use in the logging functions {@link log} and {@link debug}. Accessible by `k.sheetName`
|
|
* @var
|
|
* @type {string}
|
|
*/
|
|
let sheetName = 'kScaffold Powered Sheet';
|
|
kFuncs.sheetName = sheetName;
|
|
/**
|
|
* This stores the version of your sheet for use in the logging functions{@link log} and {@link debug}. It is also stored in the sheet_version attribute on your character sheet. Accessible via `k.version`
|
|
* @var
|
|
* @type {number}
|
|
*/
|
|
let version = 0;
|
|
kFuncs.version = version;
|
|
/**
|
|
* A boolean flag that tells the script whether to enable or disable {@link debug} calls. If the version of the sheet is `0`, or an attribute named `debug_mode` is found on opening this is set to true for your entire session. Otherwise, it remains false.
|
|
* @var
|
|
* @type {boolean}
|
|
*/
|
|
let debugMode = false;
|
|
kFuncs.debugMode = debugMode;
|
|
const funcs = {};
|
|
kFuncs.funcs = funcs;
|
|
const updateHandlers = {};
|
|
const openHandlers = {};
|
|
const initialSetups = {};
|
|
const allHandlers = {};
|
|
const addFuncs = {};
|
|
|
|
const kscaffoldJSVersion = '0.0.4';
|
|
const kscaffoldPUGVersion = '0.0.4';
|
|
/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
|
|
/*jshint -W014,-W084,-W030,-W033*/
|
|
/**
|
|
* Replaces problem characters to use a string as a regex
|
|
* @param {string} text - The text to replace characters in
|
|
* @returns {string}
|
|
* @example
|
|
* const textForRegex = k.sanitizeForRegex('.some thing[with characters]');
|
|
* console.log(textForRegex);// => "\.some thing\[with characters\]"
|
|
*/
|
|
const sanitizeForRegex = function(text){
|
|
return text.replace(/\.|\||\(|\)|\[|\]|\-|\+|\?|\/|\{|\}|\^|\$|\*/g,'\\$&');
|
|
};
|
|
kFuncs.sanitizeForRegex = sanitizeForRegex;
|
|
|
|
/**
|
|
* Converts a value to a number, it\'s default value, or `0` if no default value passed.
|
|
* @param {string|number} val - Value to convert to a number
|
|
* @param {number} def - The default value, uses 0 if not passed
|
|
* @returns {number|undefined}
|
|
* @example
|
|
* const num = k.value('100');
|
|
* console.log(num);// => 100
|
|
*/
|
|
const value = function(val,def){
|
|
return (+val||def||0);
|
|
};
|
|
kFuncs.value = value;
|
|
|
|
/**
|
|
* Extracts the section (e.g. `repeating_equipment`), rowID (e.g `-;lkj098J:LKj`), and field name (e.g. `bulk`) from a repeating attribute name.
|
|
* @param {string} string - The string to parse
|
|
* @returns {array} - Array of matches. Index 0: the section name, e.g. repeating_equipment | Index 1:the row ID | index 2: The name of the attribute
|
|
* @returns {string[]}
|
|
* @example
|
|
* //Extract info from a full repeating name
|
|
* const [section,rowID,attrName] = k.parseRepeatName('repeating_equipment_-8908asdflkjZlkj23_name');
|
|
* console.log(section);// => "repeating_equipment"
|
|
* console.log(rowID);// => "-8908asdflkjZlkj23"
|
|
* console.log(attrName);// => "name"
|
|
*
|
|
* //Extract info from just a row name
|
|
* const [section,rowID,attrName] = k.parseRepeatName('repeating_equipment_-8908asdflkjZlkj23');
|
|
* console.log(section);// => "repeating_equipment"
|
|
* console.log(rowID);// => "-8908asdflkjZlkj23"
|
|
* console.log(attrName);// => undefined
|
|
*/
|
|
const parseRepeatName = function(string){
|
|
let match = string.match(/(repeating_[^_]+)_([^_]+)(?:_(.+))?/);
|
|
match.shift();
|
|
return match;
|
|
};
|
|
kFuncs.parseRepeatName = parseRepeatName;
|
|
|
|
/**
|
|
* Parses out the components of a trigger name similar to [parseRepeatName](#parserepeatname). Aliases: parseClickTrigger.
|
|
*
|
|
* Aliases: `k.parseClickTrigger`
|
|
* @param {string} string The triggerName property of the
|
|
* @returns {array} - For a repeating button named `repeating_equipment_-LKJhpoi98;lj_roll`, the array will be `['repeating_equipment','-LKJhpoi98;lj','roll']`. For a non repeating button named `roll`, the array will be `[undefined,undefined,'roll']`
|
|
* @returns {string[]}
|
|
* @example
|
|
* //Parse a non repeating trigger
|
|
* const [section,rowID,attrName] = k.parseTriggerName('clicked:some-button');
|
|
* console.log(section);// => undefined
|
|
* console.log(rowID);// => undefined
|
|
* console.log(attrName);// => "some-button"
|
|
*
|
|
* //Parse a repeating trigger
|
|
* const [section,rowID,attrName] = k.parseTriggerName('clicked:repeating_attack_-234lkjpd8fu8usadf_some-button');
|
|
* console.log(section);// => "repeating_attack"
|
|
* console.log(rowID);// => "-234lkjpd8fu8usadf"
|
|
* console.log(attrName);// => "some-button"
|
|
*
|
|
* //Parse a repeating name
|
|
* const [section,rowID,attrName] = k.parseTriggerName('repeating_attack_-234lkjpd8fu8usadf_some-button');
|
|
* console.log(section);// => "repeating_attack"
|
|
* console.log(rowID);// => "-234lkjpd8fu8usadf"
|
|
* console.log(attrName);// => "some-button"
|
|
*/
|
|
const parseTriggerName = function(string){
|
|
let match = string.replace(/^clicked:/,'').match(/(?:(repeating_[^_]+)_([^_]+)_)?(.+)/);
|
|
match.shift();
|
|
return match;
|
|
};
|
|
kFuncs.parseTriggerName = parseTriggerName;
|
|
const parseClickTrigger = parseTriggerName;
|
|
kFuncs.parseClickTrigger = parseClickTrigger;
|
|
|
|
/**
|
|
* Parses out the attribute name from the htmlattribute name.
|
|
* @param {string} string - The triggerName property of the [event](https://wiki.roll20.net/Sheet_Worker_Scripts#eventInfo_Object).
|
|
* @returns {string}
|
|
* @example
|
|
* //Parse a name
|
|
* const attrName = k.parseHtmlName('attr_attribute_1');
|
|
* console.log(attrName);// => "attribute_1"
|
|
*/
|
|
const parseHTMLName = function(string){
|
|
let match = string.match(/(?:attr|act|roll)_(.+)/);
|
|
match.shift();
|
|
return match[0];
|
|
};
|
|
kFuncs.parseHTMLName = parseHTMLName;
|
|
|
|
/**
|
|
* Capitalize each word in a string
|
|
* @param {string} string - The string to capitalize
|
|
* @returns {string}
|
|
* @example
|
|
* const capitalized = k.capitalize('a word');
|
|
* console.log(capitalized);// => "A Word"
|
|
*/
|
|
const capitalize = function(string){
|
|
return string.replace(/(?:^|\s+|\/)[a-z]/ig,(letter)=>letter.toUpperCase());
|
|
};
|
|
kFuncs.capitalize = capitalize;
|
|
|
|
/**
|
|
* Extracts a roll query result for use in later functions. Must be awaited as per [startRoll documentation](https://wiki.roll20.net/Sheet_Worker_Scripts#Roll_Parsing.28NEW.29). Stolen from [Oosh\'s Adventures with Startroll thread](https://app.roll20.net/forum/post/10346883/adventures-with-startroll).
|
|
* @param {string} query - The query should be just the text as the `?{` and `}` at the start/end of the query are added by the function.
|
|
* @returns {Promise} - Resolves to the selected value from the roll query
|
|
* @example
|
|
* const rollFunction = async function(){
|
|
* //Get the result of a choose from list query
|
|
* const queryResult = await extractQueryResult('Prompt Text Here|Option 1|Option 2');
|
|
* console.log(queryResult);//=> "Option 1" or "Option 2" depending on what the user selects
|
|
*
|
|
* //Get free from input from the user
|
|
* const freeResult = await extractQueryResult('Prompt Text Here');
|
|
* consoel.log(freeResult);// => Whatever the user entered
|
|
* }
|
|
*/
|
|
const extractQueryResult = async function(query){
|
|
debug('entering extractQueryResult');
|
|
let queryRoll = await startRoll(`!{{query=[[0[response=?{${query}}]]]}}`);
|
|
finishRoll(queryRoll.rollId);
|
|
return queryRoll.results.query.expression.replace(/^.+?response=|\]$/g,'');
|
|
};
|
|
kFuncs.extractQueryResult = extractQueryResult;
|
|
|
|
/**
|
|
* Simulates a query for ensuring that async/await works correctly in the sheetworker environment when doing conditional startRolls. E.g. if you have an if/else and only one of the conditions results in `startRoll` being called (and thus an `await`), the sheetworker environment would normally crash. Awaiting this in the condition that does not actually need to call `startRoll` will keep the environment in sync.
|
|
* @param {string|number} [value] - The value to return. Optional.
|
|
* @returns {Promise} - Resolves to the value passed to the function
|
|
* @example
|
|
* const rollFunction = async function(){
|
|
* //Get the result of a choose from list query
|
|
* const queryResult = await pseudoQuery('a value');
|
|
* console.log(queryResult);//=> "a value"
|
|
* }
|
|
*/
|
|
const pseudoQuery = async function(value){
|
|
debug('entering pseudoQuery');
|
|
let queryRoll = await startRoll(`!{{query=[[0[response=${value}]]]}}`);
|
|
finishRoll(queryRoll.rollId);
|
|
return queryRoll.results.query.expression.replace(/^.+?response=|\]$/g,'');
|
|
};
|
|
kFuncs.pseudoQuery = pseudoQuery;
|
|
|
|
/**
|
|
* An alias for console.log.
|
|
* @param {any} msg - The message can be a straight string, an object, or an array. If it is an object or array, the object will be broken down so that each key is used as a label to output followed by the value of that key. If the value of the key is an object or array, it will be output via `console.table`.
|
|
*/
|
|
const log = function(msg){
|
|
if(typeof msg === 'string'){
|
|
console.log(`%c${kFuncs.sheetName} log| ${msg}`,"background-color:#159ccf");
|
|
}else if(typeof msg === 'object'){
|
|
Object.keys(msg).forEach((m)=>{
|
|
if(typeof msg[m] === 'string'){
|
|
console.log(`%c${kFuncs.sheetName} log| ${m}: ${msg[m]}`,"background-color:#159ccf");
|
|
}else{
|
|
console.log(`%c${kFuncs.sheetName} log| ${typeof msg[m]} ${m}`,"background-color:#159ccf");
|
|
console.table(msg[m]);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
kFuncs.log = log;
|
|
|
|
/**
|
|
* Alias for console.log that only triggers when debug mode is enabled or when the sheet\'s version is `0`. Useful for entering test logs that will not pollute the console on the live sheet.
|
|
* @param {any} msg - 'See {@link k.log}
|
|
* @param {boolean} force - Pass as a truthy value to force the debug output to be output to the console regardless of debug mode.
|
|
* @returns {void}
|
|
*/
|
|
const debug = function(msg,force){
|
|
if(!kFuncs.debugMode && !force && kFuncs.version > 0) return;
|
|
if(typeof msg === 'string'){
|
|
console.log(`%c${kFuncs.sheetName} DEBUG| ${msg}`,"background-color:tan;color:red;");
|
|
}else if(typeof msg === 'object'){
|
|
Object.keys(msg).forEach((m)=>{
|
|
if(typeof msg[m] === 'string'){
|
|
console.log(`%c${kFuncs.sheetName} DEBUG| ${m}: ${msg[m]}`,"background-color:tan;color:red;");
|
|
}else{
|
|
console.log(`%c${kFuncs.sheetName} DEBUG| ${typeof msg[m]} ${m}`,"background-color:tan;color:red;font-weight:bold;");
|
|
console.table(msg[m]);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
kFuncs.debug = debug;
|
|
|
|
/**
|
|
* Orders the section id arrays for all sections in the `sections` object to match the repOrder attribute.
|
|
* @param {attributesProxy} attributes - The attributes object that must have a value for the reporder for each section.
|
|
* @param {[object]} sections - Object containing the IDs for the repeating sections, indexed by repeating section name.
|
|
*/
|
|
const orderSections = function(attributes,sections){
|
|
Object.keys(sections).forEach((section)=>{
|
|
attributes.attributes[`_reporder_${section}`] = commaArray(attributes[`_reporder_${section}`]);
|
|
orderSection(attributes.attributes[`_reporder_${section}`],sections[section]);
|
|
});
|
|
};
|
|
kFuncs.orderSections = orderSections;
|
|
|
|
/**
|
|
* Orders a single ID array.
|
|
* @param {[string]} repOrder - Array of IDs in the order they are in on the sheet.
|
|
* @param {[string]} IDs - Array of IDs to be ordered.
|
|
*/
|
|
const orderSection = function(repOrder,IDs=[]){
|
|
IDs.sort((a,b)=>{
|
|
return repOrder.indexOf(a.toLowerCase()) - repOrder.indexOf(b.toLowerCase());
|
|
});
|
|
};
|
|
kFuncs.orderSection = orderSection;
|
|
|
|
/**
|
|
* Splits a comma delimited string into an array
|
|
* @param {string} string - The string to split.
|
|
* @returns {array} - The string segments of the comma delimited list.
|
|
*/
|
|
const commaArray = function(string=''){
|
|
return string.toLowerCase().split(/\s*,\s*/);
|
|
};
|
|
kFuncs.commaArray = commaArray;/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
|
|
/*jshint -W014,-W084,-W030,-W033*/
|
|
//# Attribute Obj Proxy handler
|
|
const createAttrProxy = function(attrs){
|
|
//creates a proxy for the attributes object so that values can be worked with more easily.
|
|
const getCascObj = function(event,casc){
|
|
const eventName = event.triggerName || event.sourceAttribute;
|
|
let typePrefix = eventName.startsWith('clicked:') ?
|
|
'act_' :
|
|
event.removedInfo ?
|
|
'fieldset_' :
|
|
'attr_';
|
|
let cascName = `${typePrefix}${eventName.replace(/(?:removed|clicked):/,'')}`;
|
|
let cascObj = casc[cascName];
|
|
if(cascObj && typePrefix === 'attr_'){
|
|
cascObj.previousValue = event.previousValue;
|
|
}
|
|
return cascObj;
|
|
};
|
|
|
|
const triggerFunctions = function(obj,attributes,sections,casc){
|
|
if(obj.triggeredFuncs && obj.triggeredFuncs.length){
|
|
debug(`triggering functions for ${obj.name}`);
|
|
obj.triggeredFuncs && obj.triggeredFuncs.forEach(func=>funcs[func] ?
|
|
funcs[func]({trigger:obj,attributes,sections,casc}) :
|
|
debug(`!!!Warning!!! no function named ${func} found. Triggered function not called for ${obj.name}`,true));
|
|
}
|
|
};
|
|
|
|
const initialFunction = function(obj,attributes,sections){
|
|
if(obj.initialFunc){
|
|
debug(`initial functions for ${obj.name}`);
|
|
funcs[obj.initialFunc] ?
|
|
funcs[obj.initialFunc]({trigger:obj,attributes,sections}) :
|
|
debug(`!!!Warning!!! no function named ${obj.initialFunc} found. Initial function not called for ${obj.name}`,true);
|
|
}
|
|
};
|
|
const alwaysFunctions = function(trigger,attributes,sections,casc){
|
|
Object.values(allHandlers).forEach((handler)=>{
|
|
handler({trigger,attributes,sections,casc});
|
|
});
|
|
};
|
|
const processChange = function({event,trigger,attributes,sections,casc}){
|
|
if(event && !trigger){
|
|
debug(`${event.sourceAttribute} change detected. No trigger found`);
|
|
return;
|
|
}
|
|
if(!attributes || !sections || !casc){
|
|
debug(`!!! Insufficient arguments || attributes > ${!!attributes} | sections > ${!!sections} | casc > ${!!casc} !!!`);
|
|
return;
|
|
}
|
|
debug({trigger});
|
|
if(event){
|
|
debug('checking for initial & always functions');
|
|
alwaysFunctions(trigger,attributes,sections,casc);//Functions that should be run for all events.
|
|
initialFunction(trigger,attributes,sections,casc);//functions that should only be run if the attribute was the thing changed by the user
|
|
}
|
|
if(trigger){
|
|
debug(`processing ${trigger.name}`);
|
|
triggerFunctions(trigger,attributes,sections,casc);
|
|
if(!event && trigger.calculation && funcs[trigger.calculation]){
|
|
attributes[trigger.name] = funcs[trigger.calculation]({trigger,attributes,sections,casc});
|
|
}else if(trigger.calculation && !funcs[trigger.calculation]){
|
|
debug(`K-Scaffold Error: No function named ${trigger.calculation} found`);
|
|
}
|
|
if(Array.isArray(trigger.affects)){
|
|
attributes.queue.push(...trigger.affects);
|
|
}
|
|
}
|
|
attributes.set({attributes,sections,casc});
|
|
};
|
|
const attrTarget = {
|
|
updates:{},
|
|
attributes:{...attrs},
|
|
repOrders:{},
|
|
queue: [],
|
|
casc:{},
|
|
alwaysFunctions,
|
|
processChange,
|
|
triggerFunctions,
|
|
initialFunction,
|
|
getCascObj
|
|
};
|
|
const attrHandler = {
|
|
get:function(obj,prop){//gets the most value of the attribute.
|
|
//If it is a repeating order, returns the array, otherwise returns the update value or the original value
|
|
if(prop === 'set'){
|
|
return function(){
|
|
let {attributes,sections,casc,callback,vocal} = arguments[0] ? arguments[0] : {};
|
|
if(attributes && attributes.queue.length && sections && casc){
|
|
let triggerName = attributes.queue.shift();
|
|
let trigger = getCascObj({sourceAttribute:triggerName},casc);
|
|
attributes.processChange({trigger,attributes,sections,casc});
|
|
}else{
|
|
debug({updates:obj.updates});
|
|
let trueCallback = Object.keys(obj.repOrders).length ?
|
|
function(){
|
|
Object.entries(obj.repOrders).forEach(([section,order])=>{
|
|
_setSectionOrder(section,order,)
|
|
});
|
|
callback && callback();
|
|
}:
|
|
callback;
|
|
Object.keys(obj.updates).forEach((key)=>obj.attributes[key] = obj.updates[key]);
|
|
const update = obj.updates;
|
|
obj.updates = {};
|
|
set(update,vocal,trueCallback);
|
|
}
|
|
}
|
|
}else if(Object.keys(obj).some(key=>key===prop)){
|
|
return Reflect.get(...arguments)
|
|
}else{
|
|
let retValue;
|
|
switch(true){
|
|
case obj.repOrders.hasOwnProperty(prop):
|
|
retValue = obj.repOrders[prop];
|
|
break;
|
|
case obj.updates.hasOwnProperty(prop):
|
|
retValue = obj.updates[prop];
|
|
break;
|
|
default:
|
|
retValue = obj.attributes[prop];
|
|
break;
|
|
}
|
|
let cascRef = `attr_${prop.replace(/(repeating_[^_]+_)[^_]+/,'$1\$X')}`;
|
|
let numRetVal = +retValue;
|
|
if(!Number.isNaN(numRetVal) && retValue !== ''){
|
|
retValue = numRetVal;
|
|
}else if(cascades[cascRef] && (typeof cascades[cascRef].defaultValue === 'number' || cascades[cascRef].type === 'number')){
|
|
retValue = cascades[cascRef].defaultValue;
|
|
}
|
|
return retValue;
|
|
}
|
|
},
|
|
set:function(obj,prop,value){
|
|
//Sets the value. Also verifies that the value is a valid attribute value
|
|
//e.g. not undefined, null, or NaN
|
|
if(value || value===0 || value===''){
|
|
if(/reporder|^repeating_[^_]+$/.test(prop)){
|
|
let section = prop.replace(/_reporder_/,'');
|
|
obj.repOrders[section] = value;
|
|
}else if(`${obj.attributes}` !== `${value}` ||
|
|
(obj.updates[prop] && `${obj.updates}` !== `${value}`)
|
|
){
|
|
obj.updates[prop] = value;
|
|
}
|
|
}else{
|
|
debug(`!!!Warning: Attempted to set ${prop} to an invalid value:${value}; value not stored!!!`);
|
|
}
|
|
return true;
|
|
},
|
|
deleteProperty(obj,prop){
|
|
//removes the property from the original attributes, updates, and the reporders
|
|
Object.keys(obj).forEach((key)=>{
|
|
delete obj[key][prop.toLowerCase()];
|
|
});
|
|
}
|
|
};
|
|
return new Proxy(attrTarget,attrHandler);
|
|
};
|
|
|
|
|
|
/**
|
|
* Function that registers a function for being called via the funcs object. Returns true if the function was successfully registered, and false if it could not be registered for any reason.
|
|
* @param {object} funcObj - Object with keys that are names to register functions under and values that are functions.
|
|
* @param {object} optionsObj - Object that contains options to use for this registration.
|
|
* @param {string[]} optionsObj.type - Array that contains the types of specialized functions that apply to the functions being registered. Valid types are `"opener"`, `"updater"`, and `"default"`. `"default"` is always used, and never needs to be passed.
|
|
* @returns {boolean} - True if the registration succeeded, false if it failed.
|
|
* @example
|
|
* //Basic Registration
|
|
* const myFunc = function({trigger,attributes,sections,casc}){};
|
|
* k.registerFuncs({myFunc});
|
|
*
|
|
* //Register a function to run on sheet open
|
|
* const openFunc = function({trigger,attributes,sections,casc}){};
|
|
* k.registerFuncs({openFunc},{type:['opener']})
|
|
*
|
|
* //Register a function to run on all events
|
|
* const allFunc = function({trigger,attributes,sections,casc}){};
|
|
* k.registerFuncs({allFunc},{type:['all']})
|
|
*/
|
|
const registerFuncs = function(funcObj,optionsObj = {}){
|
|
if(typeof funcObj !== 'object' || typeof optionsObj !== 'object'){
|
|
debug(`!!!! K-scaffold error: Improper arguments to register functions !!!!`);
|
|
return false;
|
|
}
|
|
const typeArr = optionsObj.type ? ['default',...optionsObj.type] : ['default'];
|
|
const typeSwitch = {
|
|
'opener':openHandlers,
|
|
'updater':updateHandlers,
|
|
'new':initialSetups,
|
|
'all':allHandlers,
|
|
'default':funcs
|
|
};
|
|
let setState;
|
|
Object.entries(funcObj).map(([prop,value])=>{
|
|
typeArr.forEach((type)=>{
|
|
if(typeSwitch[type][prop]){
|
|
debug(`!!! Duplicate function name for ${prop} as ${type}!!!`);
|
|
setState = false;
|
|
}else if(typeof value === 'function'){
|
|
typeSwitch[type][prop] = value;
|
|
setState = setState !== false ? true : false;
|
|
}else{
|
|
debug(`!!! K-scaffold error: Function registration requires a function. Invalid value to register as ${type} !!!`);
|
|
setState = false;
|
|
}
|
|
});
|
|
});
|
|
return setState;
|
|
};
|
|
kFuncs.registerFuncs = registerFuncs;
|
|
|
|
const setActionCalls = function({attributes,sections}){
|
|
actionAttributes.forEach((base)=>{
|
|
let [section,,field] = k.parseTriggerName(base);
|
|
let fieldAction = field.replace(/_/g,'-');
|
|
if(section){
|
|
sections[section].forEach((id)=>{
|
|
attributes[`${section}_${id}_${field}`] = `%{${attributes.character_name}|${section}_${id}_${fieldAction}}`;
|
|
});
|
|
}else{
|
|
attributes[`${field}`] = `%{${attributes.character_name}|${fieldAction}}`;
|
|
}
|
|
});
|
|
};
|
|
funcs.setActionCalls = setActionCalls;
|
|
kFuncs.setActionCalls = setActionCalls;
|
|
|
|
/**
|
|
* Function to call a function previously registered to the funcs object. May not be used that much. Either returns the function or null if no function exists.
|
|
* @param {string} funcName - The name of the function to invoke.
|
|
* @param {...any} args - The arguments to call the function with.
|
|
* @returns {any}
|
|
* @example
|
|
* //Call myFunc with two arguments
|
|
* k.callFunc('myFunc','an argument','another argument');
|
|
*/
|
|
const callFunc = function(funcName,...args){
|
|
if(funcs[funcName]){
|
|
debug(`calling ${funcName}`);
|
|
return funcs[funcName](...args);
|
|
}else{
|
|
debug(`Invalid function name: ${funcName}`);
|
|
return null;
|
|
}
|
|
};
|
|
kFuncs.callFunc = callFunc;/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
|
|
/*jshint -W014,-W084,-W030,-W033*/
|
|
//Sheet Updaters and styling functions
|
|
const updateSheet = function(){
|
|
log('updating sheet');
|
|
getAllAttrs({props:['debug_mode',...baseGet],callback:(attributes,sections,casc)=>{
|
|
kFuncs.debugMode = kFuncs.debugMode || !!attributes.debug_mode;
|
|
debug({sheet_version:attributes.sheet_version});
|
|
if(!attributes.sheet_version){
|
|
Object.entries(initialSetups).forEach(([funcName,handler])=>{
|
|
if(typeof funcs[funcName] === 'function'){
|
|
debug(`running ${funcName}`);
|
|
funcs[funcName]({attributes,sections,casc});
|
|
}else{
|
|
debug(`!!!Warning!!! no function named ${funcName} found. Initial sheet setup not performed.`);
|
|
}
|
|
});
|
|
}else{
|
|
Object.entries(updateHandlers).forEach(([ver,handler])=>{
|
|
if(attributes.sheet_version < +ver){
|
|
handler({attributes,sections,casc});
|
|
}
|
|
});
|
|
}
|
|
Object.entries(openHandlers).forEach(([funcName,func])=>{
|
|
if(typeof funcs[funcName] === 'function'){
|
|
debug(`running ${funcName}`);
|
|
funcs[funcName]({attributes,sections,casc});
|
|
}else{
|
|
debug(`!!!Warning!!! no function named ${funcName} found. Sheet open handling not performed.`);
|
|
}
|
|
});
|
|
setActionCalls({attributes,sections});
|
|
attributes.sheet_version = kFuncs.version;
|
|
log(`Sheet Update applied. Current Sheet Version ${kFuncs.version}`);
|
|
attributes.set();
|
|
log('Sheet ready for use');
|
|
}});
|
|
};
|
|
|
|
const initialSetup = function(attributes,sections){
|
|
debug('Initial sheet setup');
|
|
};
|
|
|
|
/**
|
|
* This is the default listener function for attributes that the K-Scaffold uses. It utilizes the `triggerFuncs`, `listenerFunc`, `calculation`, and `affects` properties of the K-scaffold trigger object (see the Pug section of the scaffold for more details).
|
|
* @param {Roll20Event} event
|
|
* @returns {void}
|
|
* @example
|
|
* //Call from an attribute change
|
|
* on('change:an_attribute',k.accessSheet);
|
|
*/
|
|
const accessSheet = function(event){
|
|
debug({funcs:Object.keys(funcs)});
|
|
debug({event});
|
|
getAllAttrs({callback:(attributes,sections,casc)=>{
|
|
let trigger = attributes.getCascObj(event,casc);
|
|
attributes.processChange({event,trigger,attributes,sections,casc});
|
|
}});
|
|
};
|
|
funcs.accessSheet = accessSheet;/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
|
|
/*jshint -W014,-W084,-W030,-W033*/
|
|
/*
|
|
Cascade Expansion functions
|
|
*/
|
|
//Expands the repeating section templates in cascades to reflect the rows actually available
|
|
const expandCascade = function(cascade,sections,attributes){
|
|
return _.keys(cascade).reduce((memo,key)=>{//iterate through cascades and replace references to repeating attributes with correct row ids.
|
|
if(/^(?:act|attr)_repeating_/.test(key)){//If the attribute is a repeating attribute, do special logic
|
|
expandRepeating(memo,key,cascade,sections,attributes);
|
|
}else if(key){//for non repeating attributes do this logic
|
|
expandNormal(memo,key,cascade,sections);
|
|
}
|
|
return memo;
|
|
},{});
|
|
};
|
|
|
|
const expandRepeating = function(memo,key,cascade,sections,attributes){
|
|
key.replace(/((?:attr|act)_)(repeating_[^_]+)_[^_]+?_(.+)/,(match,type,section,field)=>{
|
|
(sections[section]||[]).forEach((id)=>{
|
|
memo[`${type}${section}_${id}_${field}`]=_.clone(cascade[key]);//clone the details so that each row's attributes have correct ids
|
|
memo[`${type}${section}_${id}_${field}`].name = `${section}_${id}_${field}`;
|
|
if(key.startsWith('attr_')){
|
|
memo[`${type}${section}_${id}_${field}`].affects = memo[`${type}${section}_${id}_${field}`].affects.reduce((m,affected)=>{
|
|
if(section === affected){//otherwise if the affected attribute is in the same section, simply set the affected attribute to have the same row id.
|
|
m.push(applyID(affected,id));
|
|
}else if(/repeating/.test(affected)){//If the affected attribute isn't in the same repeating section but is still a repeating attribute, add all the rows of that section
|
|
addAllRows(affected,m,sections);
|
|
}else{//otherwise the affected attribute is a non repeating attribute. Simply add it to the computed affected array
|
|
m.push(affected);
|
|
}
|
|
return m;
|
|
},[]);
|
|
}
|
|
});
|
|
});
|
|
};
|
|
|
|
const applyID = function(affected,id){
|
|
return affected.replace(/(repeating_[^_]+_)[^_]+(.+)/,`$1${id}$2`);
|
|
};
|
|
|
|
const expandNormal = function(memo,key,cascade,sections){
|
|
memo[key] = _.clone(cascade[key]);
|
|
if(key.startsWith('attr_')){
|
|
memo[key].affects = memo[key].affects || [];
|
|
memo[key].affects = memo[key].affects.reduce((m,a)=>{
|
|
if(/^repeating/.test(a)){
|
|
addAllRows(a,m,sections);
|
|
}else{
|
|
m.push(a);
|
|
}
|
|
return m;
|
|
},[]);
|
|
}
|
|
};
|
|
|
|
const addAllRows = function(affected,memo,sections){
|
|
affected.replace(/(repeating_[^_]+?)_[^_]+?_(.+)/,(match,section,field)=>{
|
|
sections[section].forEach(id=>memo.push(`${section}_${id}_${field}`));
|
|
});
|
|
};/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
|
|
/*jshint -W014,-W084,-W030,-W033*/
|
|
/**
|
|
* Alias for [setSectionOrder()](https://wiki.roll20.net/Sheet_Worker_Scripts#setSectionOrder.28.3CRepeating_Section_Name.3E.2C_.3CSection_Array.3E.2C_.3CCallback.3E.29) that allows you to use the section name in either `repeating_section` or `section` formats. Note that the Roll20 sheetworker [setSectionOrder](https://wiki.roll20.net/Sheet_Worker_Scripts#setSectionOrder.28.3CRepeating_Section_Name.3E.2C_.3CSection_Array.3E.2C_.3CCallback.3E.29) currently causes some display issues on sheets.
|
|
* @param {string} section
|
|
* @param {string[]} order
|
|
* @returns {void}
|
|
* @example
|
|
* //Set the order of a repeating_weapon section
|
|
* k.setSectionOrder('repeating_equipment',['id1','id2','id3']);
|
|
* //Can also specify the section name without the repeating_ prefix
|
|
* k.setSectionOrder('equipment',['id1','id2','id3']);
|
|
*/
|
|
const _setSectionOrder = function(section,order){
|
|
let trueSection = section.replace(/repeating_/,'');
|
|
setSectionOrder(trueSection,order);
|
|
};
|
|
kFuncs.setSectionOrder = _setSectionOrder;
|
|
|
|
/**
|
|
* Alias for [removeRepeatingRow](https://wiki.roll20.net/Sheet_Worker_Scripts#removeRepeatingRow.28_RowID_.29) that also removes the row from the current object of attribute values and array of section IDs to ensure that erroneous updates are not issued.
|
|
* @param {string} row - The row id to be removed
|
|
* @param {attributesProxy} attributes - The attribute values currently in memory
|
|
* @param {object} sections - Object that contains arrays of all the IDs in sections on the sheet indexed by repeating name.
|
|
* @returns {void}
|
|
* @example
|
|
* //Remove a repeating Row
|
|
* k.getAllAttrs({
|
|
* callback:(attributes,sections)=>{
|
|
* const rowID = sections.repeating_equipment[0];
|
|
* k.removeRepeatingRow(`repeating_equipment_${rowID}`,attributes,sections);
|
|
* console.log(sections.repeating_equipment); // => rowID no longer exists in the array.
|
|
* console.log(attributes[`repeating_equipment_${rowID}_name`]); // => undefined
|
|
* }
|
|
* })
|
|
*/
|
|
const _removeRepeatingRow = function(row,attributes,sections){
|
|
debug(`removing ${row}`);
|
|
Object.keys(attributes.attributes).forEach((key)=>{
|
|
if(key.startsWith(row)){
|
|
delete attributes[key];
|
|
}
|
|
});
|
|
let [,section,rowID] = row.match(/(repeating_[^_]+)_(.+)/,'');
|
|
sections[section] = sections[section].filter((id)=>id!==rowID);
|
|
removeRepeatingRow(row);
|
|
};
|
|
kFuncs.removeRepeatingRow = _removeRepeatingRow;
|
|
|
|
/**
|
|
* Alias for [getAttrs()](https://wiki.roll20.net/Sheet_Worker_Scripts#getAttrs.28attributeNameArray.2C_callback.29) that converts the default object of attribute values into an {@link attributesProxy} and passes that back to the callback function.
|
|
* @param {Object} args
|
|
* @param {string[]} [args.props=baseGet] - Array of attribute names to get the value of. Defaults to {@link baseGet} if not passed.
|
|
* @param {function(attributesProxy)} args.callback - The function to call after the attribute values have been gotten. An {@link attributesProxy} is passed to the callback.
|
|
* @example
|
|
* //Gets the attributes named in props.
|
|
* k.getAttrs({
|
|
* props:['attribute_1','attribute_2'],
|
|
* callback:(attributes)=>{
|
|
* //Work with the attributes as you would in a normal getAttrs, or use the superpowers of the K-scaffold attributes object like so:
|
|
* attributes.attribute_1 = 'new value';
|
|
* attributes.set();
|
|
* }
|
|
* })
|
|
*/
|
|
const _getAttrs = function({props=baseGet,callback}){
|
|
getAttrs(props,(values)=>{
|
|
const attributes = createAttrProxy(values);
|
|
callback(attributes);
|
|
});
|
|
};
|
|
kFuncs.getAttrs = _getAttrs;
|
|
|
|
/**
|
|
* Alias for [getAttrs()](https://wiki.roll20.net/Sheet_Worker_Scripts#getAttrs.28attributeNameArray.2C_callback.29) and [getSectionIDs](https://wiki.roll20.net/Sheet_Worker_Scripts#getSectionIDs.28section_name.2Ccallback.29) that combines the actions of both sheetworker functions and converts the default object of attribute values into an {@link attributesProxy}. Also gets the details on how to handle all attributes from the master {@link cascades} object and.
|
|
* @param {Object} args
|
|
* @param {string[]} [args.props=baseGet] - Array of attribute names to get the value of. Defaults to {@link baseGet} if not passed.
|
|
* @param {repeatingSectionDetails} sectionDetails - Array of details about a section to get the IDs for and attributes that need to be gotten.
|
|
* @param {function(attributesProxy,sectionObj,expandedCascade):void} args.callback - The function to call after the attribute values have been gotten. An {@link attributesProxy} is passed to the callback along with a {@link sectionObj} and {@link expandedCascade}.
|
|
* @example
|
|
* //Get every K-scaffold linked attribute on the sheet
|
|
* k.getAllAttrs({
|
|
* callback:(attributes,sections,casc)=>{
|
|
* //Work with the attributes as you please.
|
|
* attributes.some_attribute = 'a value';
|
|
* attributes.set();//Apply our change
|
|
* }
|
|
* })
|
|
*/
|
|
const getAllAttrs = function({props=baseGet,sectionDetails=repeatingSectionDetails,callback}){
|
|
getSections(sectionDetails,(repeats,sections)=>{
|
|
getAttrs([...props,...repeats],(values)=>{
|
|
const attributes = createAttrProxy(values);
|
|
orderSections(attributes,sections);
|
|
const casc = expandCascade(cascades,sections,attributes);
|
|
callback(attributes,sections,casc);
|
|
})
|
|
});
|
|
};
|
|
kFuncs.getAllAttrs = getAllAttrs;
|
|
|
|
/**
|
|
* Alias for [getSectionIDs()](https://wiki.roll20.net/Sheet_Worker_Scripts#getSectionIDs.28section_name.2Ccallback.29) that allows you to iterate through several functions at once. Also assembles an array of repeating attributes to get.
|
|
* @param {object[]} sectionDetails - Array of details about a section to get the IDs for and attributes that need to be gotten.
|
|
* @param {string} sectionDetails.section - The full name of the repeating section including the `repeating_` prefix.
|
|
* @param {string[]} sectionDetails.fields - Array of field names that need to be gotten from the repeating section
|
|
* @param {function(string[],sectionObj)} callback - The function to call once all IDs have been gotten and the array of repating attributes to get has been assembled. The callback is passed the array of repating attributes to get and a {@link sectionObj}.
|
|
* @example
|
|
* // Get some section details
|
|
* const sectionDetails = {
|
|
* {section:'repeating_equipment',fields:['name','weight','cost']},
|
|
* {section:'repeating_weapon',fields:['name','attack','damage']}
|
|
* };
|
|
* k.getSections(sectionDetails,(attributeNames,sections)=>{
|
|
* console.log(attributeNames);// => Array containing all row specific attribute names
|
|
* console.log(sections);// => Object with arrays containing the row ids. Indexed by section name (e.g. repeating_eqiupment)
|
|
* })
|
|
*/
|
|
const getSections = function(sectionDetails,callback){
|
|
let queueClone = _.clone(sectionDetails);
|
|
const worker = (queue,repeatAttrs=[],sections={})=>{
|
|
let detail = queue.shift();
|
|
getSectionIDs(detail.section,(IDs)=>{
|
|
sections[detail.section] = IDs;
|
|
IDs.forEach((id)=>{
|
|
detail.fields.forEach((f)=>{
|
|
repeatAttrs.push(`${detail.section}_${id}_${f}`);
|
|
});
|
|
});
|
|
repeatAttrs.push(`_reporder_${detail.section}`);
|
|
if(queue.length){
|
|
worker(queue,repeatAttrs,sections);
|
|
}else{
|
|
callback(repeatAttrs,sections);
|
|
}
|
|
});
|
|
};
|
|
if(!queueClone[0]){
|
|
callback([],{});
|
|
}else{
|
|
worker(queueClone);
|
|
}
|
|
};
|
|
kFuncs.getSections = getSections;
|
|
|
|
// Sets the attributes while always calling with {silent:true}
|
|
// Can be awaited to get the values returned from _setAttrs
|
|
/**
|
|
* Alias for [setAttrs()](https://wiki.roll20.net/Sheet_Worker_Scripts#setAttrs.28values.2Coptions.2Ccallback.29) that sets silently by default.
|
|
* @param {object} obj - The object containting attributes to set
|
|
* @param {boolean} [vocal=false] - Whether to set silently (default value) or not.
|
|
* @param {function()} [callback] - The callback function to invoke after the setting has been completed. No arguments are passed to the callback function.
|
|
* @example
|
|
* //Set some attributes silently
|
|
* k.setAttrs({attribute_1:'new value'})
|
|
* //Set some attributes and triggers listeners
|
|
* k.setAttrs({attribute_1:'new value',true})
|
|
* //Set some attributes and call a callback function
|
|
* k.setAttrs({attribute_1:'new value'},null,()=>{
|
|
* //Do something after the attribute is set
|
|
* })
|
|
*/
|
|
const set = function(obj,vocal=false,callback){
|
|
setAttrs(obj,{silent:!vocal},callback);
|
|
};
|
|
kFuncs.setAttrs = set;
|
|
|
|
const generateCustomID = function(string){
|
|
if(!string.startsWith('-')){
|
|
string = `-${string}`;
|
|
}
|
|
rowID = generateRowID();
|
|
let re = new RegExp(`^.{${string.length}}`);
|
|
return `${string}${rowID.replace(re,'')}`;
|
|
};
|
|
|
|
|
|
/**
|
|
* Alias for generateRowID that adds the new id to the {@link sectionObj}. Also allows for creation of custom IDs that conform to the section ID requirements.
|
|
* @param {sectionObj} sections
|
|
* @param {string} [customText] - Custom text to start the ID with. This text should not be longer than the standard repeating section ID format.
|
|
* @returns {string} - The created ID
|
|
* @example
|
|
* k.getAllAttrs({
|
|
* callback:(attributes,sections,casc)=>{
|
|
* //Create a new row ID
|
|
* const rowID = k.generateRowID('repeating_equipment',sections);
|
|
* console.log(rowID);// => -p8rg908ug0suzz
|
|
* //Create a custom row ID
|
|
* const customID = k.generateRowID('repeating_equipment',sections,'custom');
|
|
* console.log(customID);// => -custom98uadj89kj
|
|
* }
|
|
* });
|
|
*/
|
|
const _generateRowID = function(section,sections,customText){
|
|
let rowID = customText ?
|
|
generateCustomID(customText) :
|
|
generateRowID();
|
|
section = section.match(/^repeating_[^_]+$/) ?
|
|
section :
|
|
`repeating_${section}`;
|
|
sections[section] = sections[section] || [];
|
|
sections[section].push(rowID);
|
|
return `${section}_${rowID}`;
|
|
};
|
|
kFuncs.generateRowID = _generateRowID;/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
|
|
/*jshint -W014,-W084,-W030,-W033*/
|
|
const listeners = {};
|
|
const baseGet = Object.entries(cascades).reduce((memo,[attrName,detailObj])=>{
|
|
if(!/repeating/.test(attrName) && detailObj.type !== 'action'){
|
|
memo.push(detailObj.name);
|
|
}
|
|
if(detailObj.listener){
|
|
listeners[detailObj.listener] = detailObj.listenerFunc;
|
|
}
|
|
return memo;
|
|
},[]);
|
|
kFuncs.baseGet = baseGet;
|
|
const registerEventHandlers = function(){
|
|
on('sheet:opened',updateSheet);
|
|
debug({funcKeys:Object.keys(funcs),funcs});
|
|
//Roll20 change and click listeners
|
|
Object.entries(listeners).forEach(([event,funcName])=>{
|
|
if(funcs[funcName]){
|
|
on(event,funcs[funcName]);
|
|
}else{
|
|
debug(`!!!Warning!!! no function named ${funcName} found. No listener created for ${event}`,true);
|
|
}
|
|
});
|
|
log(`kScaffold Loaded`);
|
|
};
|
|
kFuncs.registerEventHandlers = registerEventHandlers;
|
|
|
|
const addItem = function(event){
|
|
let [,,section] = parseClickTrigger(event.triggerName);
|
|
section = section.replace(/add-/,'');
|
|
getAllAttrs({
|
|
callback:(attributes,sections,casc) => {
|
|
let row = _generateRowID(section,sections);
|
|
debug({row});
|
|
attributes[`${row}_name`] = '';
|
|
setActionCalls({attributes,sections});
|
|
const trigger = cascades[`fieldset_repeating_${section}`];
|
|
if(trigger && trigger.addFuncs){
|
|
trigger.addFuncs.forEach((funcName) => {
|
|
if(funcs[funcName]){
|
|
funcs[funcName]({attributes,sections,casc,trigger,newRow:row});
|
|
}
|
|
});
|
|
}
|
|
attributes.set({attributes,sections,casc});
|
|
}
|
|
});
|
|
};
|
|
funcs.addItem = addItem;
|
|
|
|
const editSection = function(event){
|
|
let [,,section] = parseClickTrigger(event.triggerName);
|
|
section = section.replace(/edit-/,'');
|
|
let target = `fieldset.repeating_${section} + .repcontainer`;
|
|
$20(target).toggleClass('ui-sortable');
|
|
$20(target).toggleClass('editmode');
|
|
};
|
|
registerFuncs({editSection});/**
|
|
* The default tab navigation function of the K-scaffold. Courtesy of Riernar. It will add `k-active-tab` to the active tab-container and `k-active-button` to the active button. You can either write your own CSS to control display of these, or use the default CSS included in `scaffold/_k.scss`. Note that `k-active-button` has no default CSS as it is assumed that you will want to style the active button to match your system.
|
|
* @param {Object} trigger - The trigger object
|
|
*/
|
|
const kSwitchTab = function ({ trigger, attributes, sections, casc }) {
|
|
const [container, tab] = (
|
|
trigger.name.match(/nav-tabs-(.+)--(.+)/) ||
|
|
[]
|
|
).slice(1);
|
|
$20(`[data-container-tab="${container}"]`).removeClass('k-active-tab');
|
|
$20(`[data-container-tab="${container}"][data-tab="${tab}"]`).addClass('k-active-tab');
|
|
$20(`[data-container-button="${container}"]`).removeClass('k-active-button');
|
|
$20(`[data-container-button="${container}"][data-button="${tab}"]`).addClass('k-active-button');
|
|
const tabInputName = `${container.replace(/\-/g,'_')}_tab`;
|
|
if(persistentTabs.indexOf(tabInputName) > -1){
|
|
attributes[tabInputName] = trigger.name;
|
|
}
|
|
if(trigger && trigger.navFuncs){
|
|
trigger.navFuncs.forEach((funcName) => {
|
|
if(funcs[funcName]){
|
|
funcs[funcName]({attributes,sections,casc,trigger});
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
registerFuncs({ kSwitchTab });
|
|
|
|
/**
|
|
* Sets persistent tabs to their last active state
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const kTabOnOpen = function({trigger,attributes,sections,casc}){
|
|
persistentTabs.forEach((tabInput) => {
|
|
const pseudoTrigger = {name:attributes[tabInput]};
|
|
kSwitchTab({trigger:pseudoTrigger, attributes});
|
|
});
|
|
};
|
|
registerFuncs({ kTabOnOpen },{type:['opener']});
|
|
return kFuncs;
|
|
}());
|
|
const actionAttributes = ["vigilance_action","build_action","intuition_action","reflex_action","health_action","resolve_action","luck_action","assess_action","deceive_action","deduce_action","disguise_action","encrypt_action","first_aid_action","hide_action","legerdemain_action","locksmith_action","nurse_(ment)_action","nurse_(phys)_action","persuade_action","research_action","ride/steer_action","search_action","sneak_action","stunt_action","survive_action","threaten_action","tinker_action","melee_action","ranged_action","repeating_specialty_$X_action","repeating_equipped_$X_action","repeating_weapon_$X_action","repeating_ability_$X_action"];const characteristics = {"aptitude":{"name":"aptitude","affects":["reflex goal"]},"athletics":{"name":"athletics","affects":["reflex goal","movement rate","sprint speed","item_slots_max"]},"charisma":{"name":"charisma","affects":["intuition goal"]},"logic":{"name":"logic","affects":["vigilance goal"]},"wisdom":{"name":"wisdom","affects":["intuition goal"]},"size":{"name":"size","affects":["build goal","item_slots_max"]},"stamina":{"name":"stamina","affects":["build goal"]},"willpower":{"name":"willpower","affects":["vigilance goal"]}};const attributesDetails = {"vigilance_goal":["logic","willpower"],"build_goal":["size","stamina"],"intuition_goal":["charisma","wisdom"],"reflex_goal":["athletics","aptitude"]};const skills = {"assess":{"name":"assess","characteristic":"wisdom"},"deceive":{"name":"deceive","characteristic":"charisma"},"deduce":{"name":"deduce","characteristic":"logic"},"disguise":{"name":"disguise","characteristic":"charisma"},"encrypt":{"name":"encrypt","characteristic":"logic"},"first aid":{"name":"first aid","characteristic":"wisdom"},"hide":{"name":"hide","characteristic":"wisdom"},"legerdemain":{"name":"legerdemain","characteristic":"aptitude"},"locksmith":{"name":"locksmith","characteristic":"aptitude"},"nurse (ment)":{"name":"nurse (ment)","characteristic":"logic"},"nurse (phys)":{"name":"nurse (phys)","characteristic":"logic"},"persuade":{"name":"persuade","characteristic":"charisma"},"research":{"name":"research","characteristic":"logic"},"ride/steer":{"name":"ride/steer","characteristic":"athletics"},"search":{"name":"search","characteristic":"wisdom"},"sneak":{"name":"sneak","characteristic":"athletics"},"stunt":{"name":"stunt","characteristic":"athletics"},"survive":{"name":"survive","characteristic":"wisdom"},"threaten":{"name":"threaten","characteristic":"charisma"},"tinker":{"name":"tinker","characteristic":"aptitude"},"melee":{"name":"melee","characteristic":"athletics"},"ranged":{"name":"ranged","characteristic":"aptitude"}};const persistentTabs = ["backbone_tab"];
|
|
k.version = 1.1;/**
|
|
* Function to calculate the raw attribute score
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const calcAttribute = function({trigger,attributes,sections,casc}){
|
|
const [charac1,charac2] = attributesDetails[trigger.name];
|
|
return 10 + attributes[charac1] + attributes[charac2];
|
|
};
|
|
k.registerFuncs({calcAttribute});
|
|
|
|
/**
|
|
* Function to calculate the attribute modifier
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const calcAttributeMod = function({trigger,attributes,sections,casc}){
|
|
const baseName = `${trigger.name}_goal`;
|
|
return attributes[baseName] - 11;
|
|
};
|
|
k.registerFuncs({calcAttributeMod});
|
|
|
|
/**
|
|
* Function to calculate the sprint speed of a character
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const calcSprint = function({trigger,attributes,sections,casc}){
|
|
return attributes.athletics * 5 + 10;
|
|
};
|
|
k.registerFuncs({calcSprint});
|
|
|
|
/**
|
|
* Function to calculate the movement speed of a character
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const calcMovement = function({trigger,attributes,sections,casc}){
|
|
return attributes.athletics * 5 + 20;
|
|
};
|
|
k.registerFuncs({calcMovement});
|
|
|
|
/**
|
|
* Calculates the maximum item slots that can be used without penalty
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const calcItemSlotsMax = function({trigger,attributes,sections,casc}){
|
|
return Math.max(
|
|
attributes.size + 3,
|
|
attributes.athletics + attributes.size + 1
|
|
);
|
|
};
|
|
k.registerFuncs({calcItemSlotsMax});
|
|
|
|
/**
|
|
* Calculates how many slots have been used based on the equipped gear and weapon sections
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const calcUsedSlots = function({trigger,attributes,sections,casc}){
|
|
const equippedIDs = [
|
|
...sections.repeating_equipped.map(id => `repeating_equipped_${id}`),
|
|
...sections.repeating_weapon.map(id => `repeating_weapon_${id}`)
|
|
];
|
|
let freeWeapons = 3;
|
|
return equippedIDs
|
|
.reduce((total,section) => {
|
|
if(
|
|
attributes[`${section}_uses_slot`] &&
|
|
(
|
|
!section.startsWith('repeating_weapon') ||
|
|
freeWeapons <= 0
|
|
)
|
|
){
|
|
total += 1;
|
|
}
|
|
if(
|
|
section.startsWith('repeating_weapon') &&
|
|
freeWeapons > 0
|
|
){
|
|
freeWeapons--;
|
|
}
|
|
return total;
|
|
},0);
|
|
};
|
|
k.registerFuncs({calcUsedSlots});
|
|
|
|
/**
|
|
* Calculates whether the character is overburdened or not, returning 1 if they are and 0 otherwise
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const calcOverburdened = function({trigger,attributes,sections,casc}){
|
|
return attributes.item_slots_max - attributes.item_slots < 0 ?
|
|
1 :
|
|
0;
|
|
};
|
|
k.registerFuncs({calcOverburdened});/**
|
|
* (un)equips armor items
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const equipArmor = function({trigger,attributes,sections,casc}){
|
|
const [section,rowID,attr] = k.parseTriggerName(trigger.name);
|
|
const row = section ?
|
|
`${section}_${rowID}` :
|
|
k.generateRowID('repeating_stored',sections);
|
|
const armorAttrs = {
|
|
equipped:{
|
|
'armor':attributes[`${row}_armor_bonus`],
|
|
'armor_name':attributes[`${row}_name`],
|
|
'armor_details':attributes[`${row}_description`],
|
|
'armor_size':attributes[`${row}_item_size`],
|
|
},
|
|
stored:{
|
|
[`${row}_armor_bonus`]:attributes.armor,
|
|
[`${row}_name`]:attributes.armor_name,
|
|
[`${row}_description`]:attributes.armor_details,
|
|
[`${row}_item_size`]:attributes.armor_size,
|
|
}
|
|
};
|
|
const actionType = section ? 'equipped' : 'stored';
|
|
const attrMap = armorAttrs[actionType];
|
|
// If we are equipping a stored armor, then store the currently equipped armor in the stored items repeating section.
|
|
if(section){
|
|
equipArmor({trigger:{name:'armor_name'},attributes,sections,casc});
|
|
}
|
|
if(
|
|
!section && attributes.armor_name
|
|
){
|
|
attrMap[`${row}_type`] = 'armor';
|
|
}
|
|
// copy the values to the target
|
|
Object.entries(attrMap)
|
|
.forEach(([key,val]) => {
|
|
if(section || val){
|
|
attributes[key] = val;
|
|
}
|
|
});
|
|
// If we equipped a stored armor, remove it from the stored gear repeating section.
|
|
if(section){
|
|
k.removeRepeatingRow(row,attributes,sections);
|
|
}else{
|
|
Object.keys(armorAttrs.equipped).forEach(
|
|
attr => attributes[attr] = ''
|
|
);
|
|
}
|
|
};
|
|
k.registerFuncs({equipArmor});
|
|
|
|
/**
|
|
* Moves gear/weapon/armor items around on the sheet equip/unequip them.
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const equipItem = function({trigger,attributes,sections,casc}){
|
|
const [section,rowID,attr] = k.parseTriggerName(trigger.name);
|
|
const row = `${section}_${rowID}`;
|
|
if(
|
|
section === 'repeating_stored' &&
|
|
attributes[`${row}_type`] === 'armor'){
|
|
equipArmor({trigger,attributes,sections,casc});
|
|
return;
|
|
}
|
|
const newSection = section === 'repeating_stored' ?
|
|
(
|
|
attributes[`${row}_type`] === 'weapon' ?
|
|
'repeating_weapon' :
|
|
'repeating_equipped'
|
|
):
|
|
'repeating_stored';
|
|
const newRow = k.generateRowID(newSection,sections);
|
|
Object.keys(casc)
|
|
.forEach(cascKey => {
|
|
if(cascKey.startsWith(`attr_${row}`)){
|
|
const attrRef = cascKey.replace(/attr_repeating_[^_]+_[^_]+_/,'');
|
|
k.debug({[attrRef]:attributes[`${row}_${attrRef}`]})
|
|
attributes[`${newRow}_${attrRef}`] = attributes[`${row}_${attrRef}`];
|
|
}
|
|
});
|
|
attributes[`${newRow}_equipped`] = newSection.endsWith('stored') ?
|
|
0 :
|
|
1;
|
|
if(section !== 'repeating_stored'){
|
|
attributes[`${newRow}_type`] = section.endsWith('equipped') ?
|
|
'gear' :
|
|
'weapon';
|
|
}else{
|
|
attributes[`${newRow}_type`] = attributes[`${newRow}_type`] || 'gear';
|
|
}
|
|
k.removeRepeatingRow(row,attributes,sections);
|
|
k.setActionCalls({attributes,sections});
|
|
};
|
|
k.registerFuncs({equipItem});
|
|
|
|
/**
|
|
* Manipulates the classes on the npc skill containers to ensure that only those with an entered value are displayed in collapsed mode
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const displayNPCSkill = function({trigger,attributes,sections,casc}){
|
|
const skill = trigger.name;
|
|
const rawSkillValue = attributes.attributes[skill];
|
|
const action = rawSkillValue ?
|
|
'removeClass' :
|
|
'addClass';
|
|
const $elem = $20(`.npc-${skill.replace(/\s+/g,'-').replace(/\(|\)|\//g,'')}-container`);
|
|
$elem[action]('expanded');
|
|
};
|
|
k.registerFuncs({displayNPCSkill});
|
|
|
|
/**
|
|
* Sets up the npc skill display based on the collected values by calling displayNPCSkill for each skill
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const NPCSkillSetup = function({trigger,attributes,sections,casc}){
|
|
Object
|
|
.keys(skills)
|
|
.forEach((skill) =>
|
|
displayNPCSkill({trigger:{name:skill},attributes,sections,casc}));
|
|
};
|
|
k.registerFuncs({NPCSkillSetup},{type:['opener']});
|
|
|
|
/**
|
|
*
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const showConditions = function({trigger,attributes,sections,casc}){
|
|
$20('#pc-conditions .sidebar-toggle,#pc-conditions').removeClass('fresh');
|
|
$20('#pc-conditions').toggleClass('active');
|
|
};
|
|
k.registerFuncs({showConditions});
|
|
|
|
/**
|
|
* Resets the tracker for a condition to 0 when the condition is turned off
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const resetCondition = function({trigger,attributes,sections,casc}){
|
|
if(attributes[trigger.name]){
|
|
attributes[`track_${trigger.name}`] = '';
|
|
}
|
|
};
|
|
k.registerFuncs({resetCondition});
|
|
|
|
/**
|
|
* Decrements the indicated input
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const decrementInput = function({trigger,attributes,sections,casc}){
|
|
const [section,rowID,buttonName] = k.parseTriggerName(trigger.name);
|
|
const attrName = buttonName.replace(/^decrement-/,'').replace(/-/g,'_');
|
|
attributes[attrName] -= 1;
|
|
};
|
|
k.registerFuncs({decrementInput});
|
|
|
|
/**
|
|
* Increments the indicated input
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const incrementInput = function({trigger,attributes,sections,casc}){
|
|
const [section,rowID,buttonName] = k.parseTriggerName(trigger.name);
|
|
const attrName = buttonName.replace(/^increment-/,'').replace(/-/g,'_');
|
|
attributes[attrName] += 1;
|
|
};
|
|
k.registerFuncs({incrementInput});
|
|
|
|
/**
|
|
* Sets the pc/npc specific button displays
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const sheetTypeDisplay = function({trigger,attributes,sections,casc}){
|
|
if(attributes.character_type === 'pc'){
|
|
$20('.tabs--backbone__button--pc').removeClass('inactive');
|
|
$20('.tabs--backbone__button--npc').addClass('inactive');
|
|
}else{
|
|
$20('.tabs--backbone__button--pc').addClass('inactive');
|
|
$20('.tabs--backbone__button--npc').removeClass('inactive');
|
|
}
|
|
};
|
|
k.registerFuncs({sheetTypeDisplay},{type:['opener']});
|
|
|
|
|
|
/**
|
|
* Handles the necessary setup for adding a weapon
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const addWeapon = function({trigger,attributes,sections,casc,newRow}){
|
|
attributes[`${newRow}_type`] = 'weapon';
|
|
};
|
|
k.registerFuncs({addWeapon});/**
|
|
*
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const rollHealthCheck = async function({trigger,attributes,sections,casc}){
|
|
const rollName = trigger.name.replace(/-action$/,'');
|
|
const statVal = attributes[rollName];
|
|
const rollObj = {
|
|
title:`^{${rollName} roll}`,
|
|
pure_success:true,
|
|
roll:`[[@{roll_state}cs<${statVal}cf>[[${statVal} + 1]]]]`
|
|
};
|
|
const roll = await executeRoll({rollObj,attributes,sections});
|
|
finishRoll(roll.rollId);
|
|
};
|
|
k.registerFuncs({rollHealthCheck});
|
|
|
|
/**
|
|
* Starts the process of rolling a basic attribute check
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const rollAttribute = async function({trigger,attributes,sections,casc}){
|
|
const rollName = trigger.name.replace(/-action$/,'');
|
|
const rollAttr = rollName.replace(/-/g,'_');
|
|
const rollTransKey = rollName.replace(/-/g,' ');
|
|
const rollObj = {
|
|
title:`^{${rollName}}`,
|
|
roll:`[[@{roll_state} + ${attributes[rollAttr]}[${k.capitalize(getTranslationByKey(rollTransKey))}]]]`
|
|
};
|
|
const roll = await executeRoll({rollObj,attributes,sections});
|
|
finishRoll(roll.rollId);
|
|
};
|
|
k.registerFuncs({rollAttribute});
|
|
|
|
/**
|
|
* Makes rolls for the repeating sections (weapons and abilities)
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const rollRepeating = async function({trigger,attributes,sections,casc}){
|
|
const [section,rowID] = k.parseTriggerName(trigger.name);
|
|
const row = `${section}_${rowID}`;
|
|
const rollName = attributes[`${row}_name`];
|
|
const skillName = attributes[`${row}_skill`];
|
|
const [modifier] = getSkillRollModifier(skillName,attributes);
|
|
const rollObj = {
|
|
title:rollName,
|
|
roll_name:`^{${skillName}}`,
|
|
roll:`[[@{roll_state}${modifier}]]]`
|
|
};
|
|
if(attributes[`${row}_damage`]){
|
|
rollObj.damage = attributes[`${row}_damage`];
|
|
if(attributes[`${row}_damage_characteristic`]){
|
|
rollObj.damage += `+ @{${attributes[`${row}_damage_characteristic`]}}[${k.capitalize(getTranslationByKey(attributes[`${row}_damage_characteristic`]))}]`;
|
|
}
|
|
rollObj.damage = `[[${rollObj.damage}]]`;
|
|
}else{
|
|
rollObj.description = attributes[`${row}_description`];
|
|
}
|
|
const roll = await executeRoll({rollObj,attributes,sections});
|
|
finishRoll(roll.rollId);
|
|
};
|
|
k.registerFuncs({rollRepeating});
|
|
|
|
const getSkillRollModifier = (rollName,attributes,row) => {
|
|
row = row ? `${row}_` : '';
|
|
const rollAttr = `${row}${rollName.replace(/-/g,'_')}`.replace(/_$/,'');
|
|
const rollTransKey = row ?
|
|
'':
|
|
rollName.replace(/-/g,' ');
|
|
const characteristicName = row ?
|
|
attributes[`${row}characteristic`] :
|
|
skills[rollTransKey].characteristic;
|
|
const characteristic = attributes[characteristicName] || 0;
|
|
const mastery = attributes[`${rollAttr}_mastery`];
|
|
const profLabel = rollTransKey ?
|
|
k.capitalize(getTranslationByKey(rollTransKey)) :
|
|
attributes[`${row}name`];
|
|
const charLabel = k.capitalize(getTranslationByKey(characteristicName));
|
|
const profBonus = attributes.roll_state === '1D20' ?
|
|
Math.max(attributes[`${rollAttr}_proficiency`] * 2, 1) :
|
|
attributes[`${rollAttr}_proficiency`];
|
|
const rollMsg = `${mastery ? 'cs>19' : ''} + ${profBonus}[${profLabel}] + ${characteristic}[${charLabel}`;
|
|
return [
|
|
rollMsg,
|
|
characteristicName,
|
|
rollTransKey];
|
|
};
|
|
|
|
/**
|
|
* Starts the process of rolling a basic skill check
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const rollSkill = async function({trigger,attributes,sections,casc}){
|
|
const [section,rowID,button] = k.parseTriggerName(trigger.name);
|
|
const row = section ?
|
|
`${section}_${rowID}` :
|
|
'';
|
|
const rollName = button.replace(/-?action$/,'');
|
|
const [modifier,,rollTransKey] = getSkillRollModifier(rollName,attributes,row);
|
|
const rollObj = {
|
|
title:section ?
|
|
attributes[`${row}_name`]:
|
|
`^{${rollTransKey}}`,
|
|
roll:`[[@{roll_state}${modifier}]]]`
|
|
};
|
|
const roll = await executeRoll({rollObj,attributes,sections});
|
|
finishRoll(roll.rollId);
|
|
};
|
|
k.registerFuncs({rollSkill});
|
|
|
|
/**
|
|
* Rolls for luck and displays `lucky` or `unlucky`
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const rollLuck = async function({trigger,attributes,sections,casc}){
|
|
const luckTarget = attributes.luck === 'odd' ?
|
|
1 :
|
|
0;
|
|
const rollObj = {
|
|
title:'^{luck}',
|
|
luck:`[[@{roll_state}]]`
|
|
};
|
|
const roll = await executeRoll({rollObj,attributes,sections});
|
|
const computeObj = {};
|
|
const rollModulus = roll.results.luck.result % 2;
|
|
computeObj.luck = rollModulus === luckTarget ?
|
|
1 :
|
|
0;
|
|
finishRoll(roll.rollId,computeObj);
|
|
};
|
|
k.registerFuncs({rollLuck});
|
|
|
|
const assembleRoll = (rollObj,attributes,sections) => {
|
|
return Object.entries(rollObj).reduce((str,[field,content])=>{
|
|
return str += ` {{${field}=${content}}}`;
|
|
},'@{template_start}');
|
|
};
|
|
|
|
/**
|
|
* Executes the roll. Uses a callback if any computations are required.
|
|
* @param {object} rollObj - Object describing the roll fields to be used
|
|
* @param {object} attributes - The character attributes
|
|
* @param {object[]} sections - The sections array
|
|
* @returns {Promise} - Resolves to the roll results object
|
|
*/
|
|
const executeRoll = async ({rollObj,attributes,sections}) => {
|
|
const rollString = assembleRoll(rollObj,attributes,sections);
|
|
return startRoll(rollString);
|
|
};/**
|
|
* Resets the fresh state for animation containers so that they do not run on reloading a page.
|
|
* @param {object} trigger - The trigger that caused the function to be called
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const refreshAnimations = function({trigger,attributes,sections,casc}){
|
|
$20('#pc-conditions .sidebar-toggle,#pc-conditions').addClass('fresh');
|
|
};
|
|
k.registerFuncs({ refreshAnimations });
|
|
k.registerEventHandlers();
|
|
|
|
</script> |