mirror of
https://github.com/Nighthawk42/roll20-character-sheets.git
synced 2026-08-30 03:40:32 +00:00
3086 lines
226 KiB
HTML
3086 lines
226 KiB
HTML
|
||
<input name="attr_template_start" value="&{template:undefined} {{character_name=@{character_name}}} {{character_id=@{character_id}}}" type="hidden" title="@{template_start}"/>
|
||
<input name="attr_collapsed" value="" type="hidden" title="@{collapsed}"/>
|
||
<main id="main">
|
||
<nav class="sheet-nav" id="main-nav">
|
||
<button class="sheet-nav__tab narrative" name="act_narrative" type="action" data-i18n="narrative sheet" data-i18n-title="navigate to the narrative tab" role="heading" aria-level="5" title="%{narrative}">
|
||
</button>
|
||
<button class="sheet-nav__tab tactics" name="act_tactics" type="action" data-i18n="tactics sheet" data-i18n-title="navigate to the tactics tab" role="heading" aria-level="5" title="%{tactics}">
|
||
</button>
|
||
<button class="sheet-nav__tab journal" name="act_journal" type="action" data-i18n="journal sheet" data-i18n-title="navigate to the journal tab" role="heading" aria-level="5" title="%{journal}">
|
||
</button>
|
||
<button class="sheet-nav__tab roster" name="act_roster" type="action" data-i18n="roster sheet" data-i18n-title="navigate to the roster tab" role="heading" aria-level="5" title="%{roster}">
|
||
</button>
|
||
<button class="pictos sheet-nav__tab settings" name="act_settings" type="action" data-i18n-title="navigate to the settings tab" role="heading" aria-level="5" title="%{settings}">y
|
||
</button>
|
||
</nav>
|
||
<input class="tabs__toggle" name="attr_sheet_state" value="settings" type="hidden" title="@{sheet_state}"/>
|
||
<article class="details character-header paper-background" id="details">
|
||
<div class="character-details">
|
||
<div class="auto">
|
||
<label class="input-label"><span class="input-label__text" data-i18n="character_name" role="heading" aria-level="5"></span>
|
||
<input class="info-label underlined input-label__input" name="attr_character_name" type="text" spellcheck="false" title="@{character_name}"/>
|
||
</label>
|
||
</div>
|
||
<div class="auto">
|
||
<label class="input-label"><span class="input-label__text" data-i18n="kin" role="heading" aria-level="5"></span>
|
||
<input class="info-label underlined input-label__input" name="attr_kin" type="text" spellcheck="false" title="@{kin}"/>
|
||
</label>
|
||
</div>
|
||
<div class="auto">
|
||
<label class="input-label"><span class="input-label__text" data-i18n="job" role="heading" aria-level="5"></span>
|
||
<input class="info-label underlined input-label__input" name="attr_job" type="text" spellcheck="false" title="@{job}"/>
|
||
</label>
|
||
<div class="color-selector">
|
||
<input class="color-control" name="attr_class" value="general" type="hidden" title="@{class}"/>
|
||
<select class="color-selector color-receiver" name="attr_class" title="@{class}">
|
||
<option value="general" data-i18n="class" selected="selected">
|
||
</option>
|
||
<option value="stalwart" data-i18n="stalwart">
|
||
</option>
|
||
<option value="vagabond" data-i18n="vagabond">
|
||
</option>
|
||
<option value="mendicant" data-i18n="mendicant">
|
||
</option>
|
||
<option value="wright" data-i18n="wright">
|
||
</option>
|
||
<option value="npc" data-i18n="npc">
|
||
</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
<div class="auto">
|
||
<label class="input-label"><span class="uppercase input-label__text" data-i18n="level" role="heading" aria-level="5"></span>
|
||
<input class="numb-label underlined input-label__input" name="attr_level" type="number" title="@{level}"/>
|
||
</label>
|
||
</div>
|
||
<div class="auto">
|
||
<label class="input-label"><span class="input-label__text" data-i18n="gender" role="heading" aria-level="5"></span>
|
||
<input class="info-label underlined input-label__input" name="attr_gender" type="text" title="@{gender}"/>
|
||
</label>
|
||
</div>
|
||
<div class="auto">
|
||
<label class="input-label"><span class="input-label__text" data-i18n="culture" role="heading" aria-level="5"></span>
|
||
<input class="info-label underlined input-label__input" name="attr_culture" type="text" title="@{culture}"/>
|
||
</label>
|
||
</div>
|
||
<div class="auto">
|
||
<label class="input-label"><span class="input-label__text" data-i18n="bond" role="heading" aria-level="5"></span>
|
||
<input class="info-label underlined input-label__input" name="attr_bond" type="text" title="@{bond}"/>
|
||
</label>
|
||
</div>
|
||
<div class="chapter-select">
|
||
<label class="input-label" style="height:26px;"><span class="uppercase input-label__text" data-i18n="chapter" role="heading" aria-level="5"></span>
|
||
<select class="input-label__input numb-label underlined chapter-select" name="attr_chapter" title="@{chapter}">
|
||
<option value="0">—</option>
|
||
<option value="1">Ⅰ</option>
|
||
<option value="2">Ⅱ</option>
|
||
<option value="3">Ⅲ</option>
|
||
<option value="4">Ⅳ</option>
|
||
</select>
|
||
</label>
|
||
</div>
|
||
</div>
|
||
<div class="desc-label center">
|
||
<input class="underlined" name="attr_short_desc" data-i18n-placeholder="brief character description" style="width:99%;" type="text" title="@{short_desc}"/>
|
||
</div>
|
||
<div class="icon-logo"><span class="icon-logo header__image"></span></div>
|
||
</article>
|
||
<article class="narrative paper-background nav-display" id="narrative">
|
||
<section id="auto-fit">
|
||
<section class="effort half-gap boxed well-padded" id="resource">
|
||
<div class="flex-box center">
|
||
<label class="input-label"><span class="bigger input-label__text" data-i18n="effort" role="heading" aria-level="3"></span>
|
||
<input class="bigger input-label__input" name="attr_effort" type="number" value="0" readonly="readonly" style="width:20%;" title="@{effort}"/>
|
||
</label>
|
||
</div>
|
||
<div class="flex-box resource">
|
||
<input class="resource-switch" name="attr_effort_max" value="3" type="hidden" title="@{effort|max}"/>
|
||
<div class="resource_2 center">
|
||
<input class="fill-left diamonds radio-zero" name="attr_effort" type="radio" value="0" title="@{effort}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_effort" type="radio" value="1" title="@{effort}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_effort" type="radio" value="2" title="@{effort}"/><span></span>
|
||
</div>
|
||
<div class="resource_3 center">
|
||
<input class="fill-left diamonds radio-zero" name="attr_effort" type="radio" value="0" title="@{effort}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_effort" type="radio" value="1" title="@{effort}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_effort" type="radio" value="2" title="@{effort}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_effort" type="radio" value="3" title="@{effort}"/><span></span>
|
||
</div>
|
||
<div class="resource_4 center">
|
||
<input class="fill-left diamonds radio-zero" name="attr_effort" type="radio" value="0" title="@{effort}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_effort" type="radio" value="1" title="@{effort}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_effort" type="radio" value="2" title="@{effort}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_effort" type="radio" value="3" title="@{effort}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_effort" type="radio" value="4" title="@{effort}"/><span></span>
|
||
</div>
|
||
<div class="resource_5 center">
|
||
<input class="fill-left diamonds radio-zero" name="attr_effort" type="radio" value="0" title="@{effort}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_effort" type="radio" value="1" title="@{effort}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_effort" type="radio" value="2" title="@{effort}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_effort" type="radio" value="3" title="@{effort}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_effort" type="radio" value="4" title="@{effort}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_effort" type="radio" value="5" title="@{effort}"/><span></span>
|
||
</div>
|
||
<div class="resource_6 center">
|
||
<input class="fill-left diamonds radio-zero" name="attr_effort" type="radio" value="0" title="@{effort}"/><span></span>
|
||
<input class="fill-left diamonds resource-small" name="attr_effort" type="radio" value="1" title="@{effort}"/><span></span>
|
||
<input class="fill-left diamonds resource-small" name="attr_effort" type="radio" value="2" title="@{effort}"/><span></span>
|
||
<input class="fill-left diamonds resource-small" name="attr_effort" type="radio" value="3" title="@{effort}"/><span></span>
|
||
<input class="fill-left diamonds resource-small" name="attr_effort" type="radio" value="4" title="@{effort}"/><span></span>
|
||
<input class="fill-left diamonds resource-small" name="attr_effort" type="radio" value="5" title="@{effort}"/><span></span>
|
||
<input class="fill-left diamonds resource-small" name="attr_effort" type="radio" value="6" title="@{effort}"/><span></span>
|
||
</div>
|
||
</div>
|
||
<div class="flex-box center">
|
||
<label class="input-label capitalize status" name="effort size" data-i18n="max effort" aria-label="5">
|
||
</label>
|
||
<select class="dropdown stat resource underlined" name="attr_effort_max" style="width:40%;" title="@{effort|max}">
|
||
<option value="2">2</option>
|
||
<option value="3" selected="selected">3</option>
|
||
<option value="4">4</option>
|
||
<option value="5">5</option>
|
||
<option value="6">6</option>
|
||
</select>
|
||
</div>
|
||
<div class="flex-box center">
|
||
<div class="flex-box">
|
||
<label class="input-label uppercase status" name="exhausted-label" data-i18n="exhausted" aria-label="5">
|
||
</label>
|
||
<input class="checkbox orange cross" name="attr_exhausted" value="1" type="checkbox" title="@{exhausted}"/>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<section class="strain half-gap boxed well-padded" id="resource">
|
||
<div class="flex-box center">
|
||
<label class="input-label"><span class="bigger input-label__text" data-i18n="strain" role="heading" aria-level="3"></span>
|
||
<input class="bigger input-label__input" name="attr_strain" type="number" value="0" readonly="readonly" style="width:20%;" title="@{strain}"/>
|
||
</label>
|
||
</div>
|
||
<div class="flex-box resource">
|
||
<input class="resource-switch" name="attr_strain_max" value="5" type="hidden" title="@{strain|max}"/>
|
||
<div class="resource_3 center">
|
||
<input class="fill-left diamonds radio-zero" name="attr_strain" type="radio" value="0" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_strain" type="radio" value="1" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_strain" type="radio" value="2" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_strain" type="radio" value="3" title="@{strain}"/><span></span>
|
||
</div>
|
||
<div class="resource_4 center">
|
||
<input class="fill-left diamonds radio-zero" name="attr_strain" type="radio" value="0" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_strain" type="radio" value="1" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_strain" type="radio" value="2" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_strain" type="radio" value="3" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_strain" type="radio" value="4" title="@{strain}"/><span></span>
|
||
</div>
|
||
<div class="resource_5 center">
|
||
<input class="fill-left diamonds radio-zero" name="attr_strain" type="radio" value="0" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_strain" type="radio" value="1" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_strain" type="radio" value="2" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_strain" type="radio" value="3" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_strain" type="radio" value="4" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds" name="attr_strain" type="radio" value="5" title="@{strain}"/><span></span>
|
||
</div>
|
||
<div class="resource_6 center">
|
||
<input class="fill-left diamonds radio-zero" name="attr_strain" type="radio" value="0" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds resource-small" name="attr_strain" type="radio" value="1" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds resource-small" name="attr_strain" type="radio" value="2" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds resource-small" name="attr_strain" type="radio" value="3" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds resource-small" name="attr_strain" type="radio" value="4" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds resource-small" name="attr_strain" type="radio" value="5" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds resource-small" name="attr_strain" type="radio" value="6" title="@{strain}"/><span></span>
|
||
</div>
|
||
<div class="resource_7 center">
|
||
<input class="fill-left diamonds resource-small radio-zero" name="attr_strain" type="radio" value="0" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds resource-smaller" name="attr_strain" type="radio" value="1" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds resource-smaller" name="attr_strain" type="radio" value="2" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds resource-smaller" name="attr_strain" type="radio" value="3" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds resource-smaller" name="attr_strain" type="radio" value="4" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds resource-smaller" name="attr_strain" type="radio" value="5" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds resource-smaller" name="attr_strain" type="radio" value="6" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds resource-smaller" name="attr_strain" type="radio" value="7" title="@{strain}"/><span></span>
|
||
</div>
|
||
<div class="resource_8 center">
|
||
<input class="fill-left diamonds resource-smaller radio-zero" name="attr_strain" type="radio" value="0" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds resource-smallerer" name="attr_strain" type="radio" value="1" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds resource-smallerer" name="attr_strain" type="radio" value="2" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds resource-smallerer" name="attr_strain" type="radio" value="3" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds resource-smallerer" name="attr_strain" type="radio" value="4" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds resource-smallerer" name="attr_strain" type="radio" value="5" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds resource-smallerer" name="attr_strain" type="radio" value="6" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds resource-smallerer" name="attr_strain" type="radio" value="7" title="@{strain}"/><span></span>
|
||
<input class="fill-left diamonds resource-smallerer" name="attr_strain" type="radio" value="8" title="@{strain}"/><span></span>
|
||
</div>
|
||
</div>
|
||
<div class="flex-box center">
|
||
<label class="input-label capitalize status" name="strain size" data-i18n="max strain" aria-label="5">
|
||
</label>
|
||
<select class="dropdown stat resource underlined" name="attr_strain_max" style="width:40%;" title="@{strain|max}">
|
||
<option value="3">3</option>
|
||
<option value="4">4</option>
|
||
<option value="5" selected="selected">5</option>
|
||
<option value="6">6</option>
|
||
<option value="7">7</option>
|
||
<option value="8">8</option>
|
||
</select>
|
||
</div>
|
||
<div class="flex-box center">
|
||
<div class="flex-box">
|
||
<label class="input-label uppercase status" name="broken-label" data-i18n="broken" aria-label="5">
|
||
</label>
|
||
<input class="checkbox black cross" name="attr_broken" value="1" type="checkbox" title="@{broken}"/>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
</section>
|
||
<div class="span-all center">
|
||
<p class="mono">Known Bug: Please double click the diamonds to select your current Effort / Strain.</p>
|
||
</div>
|
||
<section id="auto-fill">
|
||
<section class="actions" id="actions">
|
||
<h1 data-i18n="actions"></h1>
|
||
<div class="flex-box space-around">
|
||
<button class="roll-d6" name="roll_roll_charm" type="roll" value="&{template:icon} {{name=charm}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{roll_name=Action Roll}} {{hidden-calc=[[(@{charm_dice}@{curses})]]}} {{action-roll0=[[(@{charm_dice}@{curses})d6kh1sd]]}} {{action-roll1=[[2d6kl1sd]]}}" title="%{roll_charm}">
|
||
</button>
|
||
<input class="action-label uppercase bigger" name="attr_charm" value="charm" aria-level="3" data_i18n="charm" type="label" readonly="readonly" title="@{charm}"/>
|
||
<input class="autocalc" name="attr_charm_dice" disabled="true" value="(@{charm_dots}+@{charm_knack}-@{charm_burden})" aria-level="5" type="number" title="@{charm_dice}"/>
|
||
<div class="action-dots center">
|
||
<input class="fill-left dots radio-zero" name="attr_charm_dots" type="radio" value="0" checked="true" title="@{charm_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_charm_dots" type="radio" value="1" title="@{charm_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_charm_dots" type="radio" value="2" title="@{charm_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_charm_dots" type="radio" value="3" title="@{charm_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_charm_dots" type="radio" value="4" title="@{charm_dots}"/><span></span>
|
||
</div>
|
||
<div class="action-checkboxes">
|
||
<input class="checkbox magenta up" name="attr_charm_knack" value="1" type="checkbox" title="@{charm_knack}"/>
|
||
</div>
|
||
<div class="action-checkboxes">
|
||
<input class="checkbox black down" name="attr_charm_burden" value="1" type="checkbox" title="@{charm_burden}"/>
|
||
</div>
|
||
</div>
|
||
<div class="flex-box space-around">
|
||
<button class="roll-d6" name="roll_roll_command" type="roll" value="&{template:icon} {{name=command}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{roll_name=Action Roll}} {{hidden-calc=[[(@{command_dice}@{curses})]]}} {{action-roll0=[[(@{command_dice}@{curses})d6kh1sd]]}} {{action-roll1=[[2d6kl1sd]]}}" title="%{roll_command}">
|
||
</button>
|
||
<input class="action-label uppercase bigger" name="attr_command" value="command" aria-level="3" data_i18n="command" type="label" readonly="readonly" title="@{command}"/>
|
||
<input class="autocalc" name="attr_command_dice" disabled="true" value="(@{command_dots}+@{command_knack}-@{command_burden})" aria-level="5" type="number" title="@{command_dice}"/>
|
||
<div class="action-dots center">
|
||
<input class="fill-left dots radio-zero" name="attr_command_dots" type="radio" value="0" checked="true" title="@{command_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_command_dots" type="radio" value="1" title="@{command_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_command_dots" type="radio" value="2" title="@{command_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_command_dots" type="radio" value="3" title="@{command_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_command_dots" type="radio" value="4" title="@{command_dots}"/><span></span>
|
||
</div>
|
||
<div class="action-checkboxes">
|
||
<input class="checkbox magenta up" name="attr_command_knack" value="1" type="checkbox" title="@{command_knack}"/>
|
||
</div>
|
||
<div class="action-checkboxes">
|
||
<input class="checkbox black down" name="attr_command_burden" value="1" type="checkbox" title="@{command_burden}"/>
|
||
</div>
|
||
</div>
|
||
<div class="flex-box space-around">
|
||
<button class="roll-d6" name="roll_roll_endure" type="roll" value="&{template:icon} {{name=endure}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{roll_name=Action Roll}} {{hidden-calc=[[(@{endure_dice}@{curses})]]}} {{action-roll0=[[(@{endure_dice}@{curses})d6kh1sd]]}} {{action-roll1=[[2d6kl1sd]]}}" title="%{roll_endure}">
|
||
</button>
|
||
<input class="action-label uppercase bigger" name="attr_endure" value="endure" aria-level="3" data_i18n="endure" type="label" readonly="readonly" title="@{endure}"/>
|
||
<input class="autocalc" name="attr_endure_dice" disabled="true" value="(@{endure_dots}+@{endure_knack}-@{endure_burden})" aria-level="5" type="number" title="@{endure_dice}"/>
|
||
<div class="action-dots center">
|
||
<input class="fill-left dots radio-zero" name="attr_endure_dots" type="radio" value="0" checked="true" title="@{endure_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_endure_dots" type="radio" value="1" title="@{endure_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_endure_dots" type="radio" value="2" title="@{endure_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_endure_dots" type="radio" value="3" title="@{endure_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_endure_dots" type="radio" value="4" title="@{endure_dots}"/><span></span>
|
||
</div>
|
||
<div class="action-checkboxes">
|
||
<input class="checkbox magenta up" name="attr_endure_knack" value="1" type="checkbox" title="@{endure_knack}"/>
|
||
</div>
|
||
<div class="action-checkboxes">
|
||
<input class="checkbox black down" name="attr_endure_burden" value="1" type="checkbox" title="@{endure_burden}"/>
|
||
</div>
|
||
</div>
|
||
<div class="flex-box space-around">
|
||
<button class="roll-d6" name="roll_roll_excel" type="roll" value="&{template:icon} {{name=excel}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{roll_name=Action Roll}} {{hidden-calc=[[(@{excel_dice}@{curses})]]}} {{action-roll0=[[(@{excel_dice}@{curses})d6kh1sd]]}} {{action-roll1=[[2d6kl1sd]]}}" title="%{roll_excel}">
|
||
</button>
|
||
<input class="action-label uppercase bigger" name="attr_excel" value="excel" aria-level="3" data_i18n="excel" type="label" readonly="readonly" title="@{excel}"/>
|
||
<input class="autocalc" name="attr_excel_dice" disabled="true" value="(@{excel_dots}+@{excel_knack}-@{excel_burden})" aria-level="5" type="number" title="@{excel_dice}"/>
|
||
<div class="action-dots center">
|
||
<input class="fill-left dots radio-zero" name="attr_excel_dots" type="radio" value="0" checked="true" title="@{excel_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_excel_dots" type="radio" value="1" title="@{excel_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_excel_dots" type="radio" value="2" title="@{excel_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_excel_dots" type="radio" value="3" title="@{excel_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_excel_dots" type="radio" value="4" title="@{excel_dots}"/><span></span>
|
||
</div>
|
||
<div class="action-checkboxes">
|
||
<input class="checkbox magenta up" name="attr_excel_knack" value="1" type="checkbox" title="@{excel_knack}"/>
|
||
</div>
|
||
<div class="action-checkboxes">
|
||
<input class="checkbox black down" name="attr_excel_burden" value="1" type="checkbox" title="@{excel_burden}"/>
|
||
</div>
|
||
</div>
|
||
<div class="flex-box space-around">
|
||
<button class="roll-d6" name="roll_roll_sense" type="roll" value="&{template:icon} {{name=sense}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{roll_name=Action Roll}} {{hidden-calc=[[(@{sense_dice}@{curses})]]}} {{action-roll0=[[(@{sense_dice}@{curses})d6kh1sd]]}} {{action-roll1=[[2d6kl1sd]]}}" title="%{roll_sense}">
|
||
</button>
|
||
<input class="action-label uppercase bigger" name="attr_sense" value="sense" aria-level="3" data_i18n="sense" type="label" readonly="readonly" title="@{sense}"/>
|
||
<input class="autocalc" name="attr_sense_dice" disabled="true" value="(@{sense_dots}+@{sense_knack}-@{sense_burden})" aria-level="5" type="number" title="@{sense_dice}"/>
|
||
<div class="action-dots center">
|
||
<input class="fill-left dots radio-zero" name="attr_sense_dots" type="radio" value="0" checked="true" title="@{sense_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_sense_dots" type="radio" value="1" title="@{sense_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_sense_dots" type="radio" value="2" title="@{sense_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_sense_dots" type="radio" value="3" title="@{sense_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_sense_dots" type="radio" value="4" title="@{sense_dots}"/><span></span>
|
||
</div>
|
||
<div class="action-checkboxes">
|
||
<input class="checkbox magenta up" name="attr_sense_knack" value="1" type="checkbox" title="@{sense_knack}"/>
|
||
</div>
|
||
<div class="action-checkboxes">
|
||
<input class="checkbox black down" name="attr_sense_burden" value="1" type="checkbox" title="@{sense_burden}"/>
|
||
</div>
|
||
</div>
|
||
<div class="flex-box space-around">
|
||
<button class="roll-d6" name="roll_roll_smash" type="roll" value="&{template:icon} {{name=smash}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{roll_name=Action Roll}} {{hidden-calc=[[(@{smash_dice}@{curses})]]}} {{action-roll0=[[(@{smash_dice}@{curses})d6kh1sd]]}} {{action-roll1=[[2d6kl1sd]]}}" title="%{roll_smash}">
|
||
</button>
|
||
<input class="action-label uppercase bigger" name="attr_smash" value="smash" aria-level="3" data_i18n="smash" type="label" readonly="readonly" title="@{smash}"/>
|
||
<input class="autocalc" name="attr_smash_dice" disabled="true" value="(@{smash_dots}+@{smash_knack}-@{smash_burden})" aria-level="5" type="number" title="@{smash_dice}"/>
|
||
<div class="action-dots center">
|
||
<input class="fill-left dots radio-zero" name="attr_smash_dots" type="radio" value="0" checked="true" title="@{smash_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_smash_dots" type="radio" value="1" title="@{smash_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_smash_dots" type="radio" value="2" title="@{smash_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_smash_dots" type="radio" value="3" title="@{smash_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_smash_dots" type="radio" value="4" title="@{smash_dots}"/><span></span>
|
||
</div>
|
||
<div class="action-checkboxes">
|
||
<input class="checkbox magenta up" name="attr_smash_knack" value="1" type="checkbox" title="@{smash_knack}"/>
|
||
</div>
|
||
<div class="action-checkboxes">
|
||
<input class="checkbox black down" name="attr_smash_burden" value="1" type="checkbox" title="@{smash_burden}"/>
|
||
</div>
|
||
</div>
|
||
<div class="flex-box space-around">
|
||
<button class="roll-d6" name="roll_roll_sneak" type="roll" value="&{template:icon} {{name=sneak}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{roll_name=Action Roll}} {{hidden-calc=[[(@{sneak_dice}@{curses})]]}} {{action-roll0=[[(@{sneak_dice}@{curses})d6kh1sd]]}} {{action-roll1=[[2d6kl1sd]]}}" title="%{roll_sneak}">
|
||
</button>
|
||
<input class="action-label uppercase bigger" name="attr_sneak" value="sneak" aria-level="3" data_i18n="sneak" type="label" readonly="readonly" title="@{sneak}"/>
|
||
<input class="autocalc" name="attr_sneak_dice" disabled="true" value="(@{sneak_dots}+@{sneak_knack}-@{sneak_burden})" aria-level="5" type="number" title="@{sneak_dice}"/>
|
||
<div class="action-dots center">
|
||
<input class="fill-left dots radio-zero" name="attr_sneak_dots" type="radio" value="0" checked="true" title="@{sneak_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_sneak_dots" type="radio" value="1" title="@{sneak_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_sneak_dots" type="radio" value="2" title="@{sneak_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_sneak_dots" type="radio" value="3" title="@{sneak_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_sneak_dots" type="radio" value="4" title="@{sneak_dots}"/><span></span>
|
||
</div>
|
||
<div class="action-checkboxes">
|
||
<input class="checkbox magenta up" name="attr_sneak_knack" value="1" type="checkbox" title="@{sneak_knack}"/>
|
||
</div>
|
||
<div class="action-checkboxes">
|
||
<input class="checkbox black down" name="attr_sneak_burden" value="1" type="checkbox" title="@{sneak_burden}"/>
|
||
</div>
|
||
</div>
|
||
<div class="flex-box space-around">
|
||
<button class="roll-d6" name="roll_roll_study" type="roll" value="&{template:icon} {{name=study}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{roll_name=Action Roll}} {{hidden-calc=[[(@{study_dice}@{curses})]]}} {{action-roll0=[[(@{study_dice}@{curses})d6kh1sd]]}} {{action-roll1=[[2d6kl1sd]]}}" title="%{roll_study}">
|
||
</button>
|
||
<input class="action-label uppercase bigger" name="attr_study" value="study" aria-level="3" data_i18n="study" type="label" readonly="readonly" title="@{study}"/>
|
||
<input class="autocalc" name="attr_study_dice" disabled="true" value="(@{study_dots}+@{study_knack}-@{study_burden})" aria-level="5" type="number" title="@{study_dice}"/>
|
||
<div class="action-dots center">
|
||
<input class="fill-left dots radio-zero" name="attr_study_dots" type="radio" value="0" checked="true" title="@{study_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_study_dots" type="radio" value="1" title="@{study_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_study_dots" type="radio" value="2" title="@{study_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_study_dots" type="radio" value="3" title="@{study_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_study_dots" type="radio" value="4" title="@{study_dots}"/><span></span>
|
||
</div>
|
||
<div class="action-checkboxes">
|
||
<input class="checkbox magenta up" name="attr_study_knack" value="1" type="checkbox" title="@{study_knack}"/>
|
||
</div>
|
||
<div class="action-checkboxes">
|
||
<input class="checkbox black down" name="attr_study_burden" value="1" type="checkbox" title="@{study_burden}"/>
|
||
</div>
|
||
</div>
|
||
<div class="flex-box space-around">
|
||
<button class="roll-d6" name="roll_roll_tinker" type="roll" value="&{template:icon} {{name=tinker}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{roll_name=Action Roll}} {{hidden-calc=[[(@{tinker_dice}@{curses})]]}} {{action-roll0=[[(@{tinker_dice}@{curses})d6kh1sd]]}} {{action-roll1=[[2d6kl1sd]]}}" title="%{roll_tinker}">
|
||
</button>
|
||
<input class="action-label uppercase bigger" name="attr_tinker" value="tinker" aria-level="3" data_i18n="tinker" type="label" readonly="readonly" title="@{tinker}"/>
|
||
<input class="autocalc" name="attr_tinker_dice" disabled="true" value="(@{tinker_dots}+@{tinker_knack}-@{tinker_burden})" aria-level="5" type="number" title="@{tinker_dice}"/>
|
||
<div class="action-dots center">
|
||
<input class="fill-left dots radio-zero" name="attr_tinker_dots" type="radio" value="0" checked="true" title="@{tinker_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_tinker_dots" type="radio" value="1" title="@{tinker_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_tinker_dots" type="radio" value="2" title="@{tinker_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_tinker_dots" type="radio" value="3" title="@{tinker_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_tinker_dots" type="radio" value="4" title="@{tinker_dots}"/><span></span>
|
||
</div>
|
||
<div class="action-checkboxes">
|
||
<input class="checkbox magenta up" name="attr_tinker_knack" value="1" type="checkbox" title="@{tinker_knack}"/>
|
||
</div>
|
||
<div class="action-checkboxes">
|
||
<input class="checkbox black down" name="attr_tinker_burden" value="1" type="checkbox" title="@{tinker_burden}"/>
|
||
</div>
|
||
</div>
|
||
<div class="flex-box space-around">
|
||
<button class="roll-d6" name="roll_roll_traverse" type="roll" value="&{template:icon} {{name=traverse}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{roll_name=Action Roll}} {{hidden-calc=[[(@{traverse_dice}@{curses})]]}} {{action-roll0=[[(@{traverse_dice}@{curses})d6kh1sd]]}} {{action-roll1=[[2d6kl1sd]]}}" title="%{roll_traverse}">
|
||
</button>
|
||
<input class="action-label uppercase bigger" name="attr_traverse" value="traverse" aria-level="3" data_i18n="traverse" type="label" readonly="readonly" title="@{traverse}"/>
|
||
<input class="autocalc" name="attr_traverse_dice" disabled="true" value="(@{traverse_dots}+@{traverse_knack}-@{traverse_burden})" aria-level="5" type="number" title="@{traverse_dice}"/>
|
||
<div class="action-dots center">
|
||
<input class="fill-left dots radio-zero" name="attr_traverse_dots" type="radio" value="0" checked="true" title="@{traverse_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_traverse_dots" type="radio" value="1" title="@{traverse_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_traverse_dots" type="radio" value="2" title="@{traverse_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_traverse_dots" type="radio" value="3" title="@{traverse_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_traverse_dots" type="radio" value="4" title="@{traverse_dots}"/><span></span>
|
||
</div>
|
||
<div class="action-checkboxes">
|
||
<input class="checkbox magenta up" name="attr_traverse_knack" value="1" type="checkbox" title="@{traverse_knack}"/>
|
||
</div>
|
||
<div class="action-checkboxes">
|
||
<input class="checkbox black down" name="attr_traverse_burden" value="1" type="checkbox" title="@{traverse_burden}"/>
|
||
</div>
|
||
</div>
|
||
<fieldset class="repeating_action">
|
||
<div class="flex-box space-around">
|
||
<button class="roll-d6" name="roll_roll" type="roll" value="&{template:icon} {{name=@{name}}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{roll_name=Action Roll}} {{hidden-calc=[[(@{dice}@{curses})]]}} {{action-roll0=[[(@{dice}@{curses})d6kh1sd]]}} {{action-roll1=[[2d6kl1sd]]}}" title="%{repeating_action_$X_roll}">
|
||
</button>
|
||
<input class="action-label uppercase bigger" name="attr_name" aria-level="3" data-i18n-placeholder="custom" type="text" title="@{repeating_action_$X_name}"/>
|
||
<input class="autocalc" name="attr_dice" disabled="true" value="(@{dots}+@{knack}-@{burden})" aria-level="5" type="number" title="@{repeating_action_$X_dice}"/>
|
||
<div class="action-dots center">
|
||
<input class="fill-left dots radio-zero" name="attr_dots" type="radio" value="0" checked="true" title="@{repeating_action_$X_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_dots" type="radio" value="1" title="@{repeating_action_$X_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_dots" type="radio" value="2" title="@{repeating_action_$X_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_dots" type="radio" value="3" title="@{repeating_action_$X_dots}"/><span></span>
|
||
<input class="fill-left dots" name="attr_dots" type="radio" value="4" title="@{repeating_action_$X_dots}"/><span></span>
|
||
</div>
|
||
<div class="action-checkboxes">
|
||
<input class="checkbox magenta up" name="attr_knack" value="1" type="checkbox" title="@{repeating_action_$X_knack}"/>
|
||
</div>
|
||
<div class="action-checkboxes">
|
||
<input class="checkbox black down" name="attr_burden" value="1" type="checkbox" title="@{repeating_action_$X_burden}"/>
|
||
</div>
|
||
</div>
|
||
</fieldset>
|
||
<div class="hide-note">
|
||
<p class="bold capitalize" data-i18n="fortune action roll"></p>
|
||
<input class="collapse" value="0" name="attr_collapse-ambition" type="checkbox" title="@{collapse-ambition}"/>
|
||
<div class="notes expanded">
|
||
<p data-i18n="fortune reminder line 0"></p>
|
||
<p class="indent bullet" data-i18n="fortune reminder line 1"></p>
|
||
<p class="indent bullet" data-i18n="fortune reminder line 2"></p>
|
||
<p class="indent bullet" data-i18n="fortune reminder line 3"></p>
|
||
<p class="indent bullet" data-i18n="fortune reminder line 4"></p>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<section class="bond" id="bond">
|
||
<input class="h1-style-input" name="attr_bond" data-i18n-placeholder="bond" readonly="readonly" title="@{bond}"/>
|
||
<textarea class="serif emph textarea-6" name="attr_bond_flavor_text" data-i18n-placeholder="bond flavor text or description" spellcheck="false" title="@{bond_flavor_text}"></textarea>
|
||
<div class="headed-textarea">
|
||
<h3 class="headed-textarea__header" data-i18n="special ability">
|
||
</h3>
|
||
<textarea class="textarea-5 headed-textarea__textarea" name="attr_special_ability_text" data-i18n-placeholder="your special bond ability" title="@{special_ability_text}"></textarea>
|
||
</div>
|
||
<div class="headed-textarea">
|
||
<h3 class="headed-textarea__header" data-i18n="second wind">
|
||
</h3>
|
||
<textarea class="textarea-3 headed-textarea__textarea" name="attr_second_wind_text" data-i18n-placeholder="regain effort when" title="@{second_wind_text}"></textarea>
|
||
</div>
|
||
<div class="hide-note">
|
||
<p class="bold capitalize" data-i18n="additional notes"></p>
|
||
<input class="collapse" value="0" name="attr_collapse-bond" type="checkbox" title="@{collapse-bond}"/>
|
||
<div class="notes expanded">
|
||
<div class="flex-box">
|
||
<textarea class="textarea-3" name="attr_notes" data-i18n-placeholder="write anything you want here" title="@{notes}"></textarea>
|
||
<button class="roll-quote" name="roll_quote" type="roll" value="&{template:icon} {{name=additional notes}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{text=@{notes}}}" title="%{quote}">
|
||
</button>
|
||
</div>
|
||
<p data-i18n="you can find more notes in the journal tab"></p>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<section class="powers long-2" id="powers">
|
||
<h1 data-i18n="powers"></h1>
|
||
<fieldset class="repeating_power">
|
||
<div class="flex-box underlined">
|
||
<input class="h3-style-input power" name="attr_name" data-i18n-placeholder="power" type="text" title="@{repeating_power_$X_name}"/>
|
||
<input class="power" name="attr_uses" placeholder="⬧" type="number" title="@{repeating_power_$X_uses}"/>
|
||
<select class="power type" name="attr_type" title="@{repeating_power_$X_type}">
|
||
<option value="" data-i18n="NA">
|
||
</option>
|
||
<option value="/ scene" data-i18n="per scene">
|
||
</option>
|
||
<option value="/ session" data-i18n="per session">
|
||
</option>
|
||
<option value="passive" data-i18n="passive">
|
||
</option>
|
||
<option value="effort" data-i18n="effort">
|
||
</option>
|
||
<option value="strain" data-i18n="strain">
|
||
</option>
|
||
</select>
|
||
<button class="roll-quote" name="roll_quote" type="roll" value="&{template:icon} {{name=@{name}}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{summary=@{uses} @{type}}} {{effect=@{effect}}}" title="%{repeating_power_$X_quote}">
|
||
</button>
|
||
</div>
|
||
<div class="flex-box">
|
||
<textarea class="textarea-4" name="attr_effect" data-i18n-placeholder="power placeholder" title="@{repeating_power_$X_effect}"></textarea>
|
||
</div>
|
||
</fieldset>
|
||
<h3 data-i18n="gambits"></h3>
|
||
<fieldset class="repeating_gambit">
|
||
<div class="flex-box underlined">
|
||
<input class="h3-style-input power" name="attr_name" data-i18n-placeholder="power" type="text" title="@{repeating_gambit_$X_name}"/>
|
||
<input class="gambit" name="attr_uses" placeholder="⬧" type="number" title="@{repeating_gambit_$X_uses}"/>
|
||
<select class="gambit type" name="attr_type" title="@{repeating_gambit_$X_type}">
|
||
<option value="" data-i18n="NA">
|
||
</option>
|
||
<option value="/ scene" data-i18n="per scene">
|
||
</option>
|
||
<option value="/ session" data-i18n="per session">
|
||
</option>
|
||
<option value="passive" data-i18n="passive">
|
||
</option>
|
||
<option value="effort" data-i18n="effort">
|
||
</option>
|
||
<option value="strain" data-i18n="strain">
|
||
</option>
|
||
</select>
|
||
<button class="roll-quote" name="roll_quote" type="roll" value="&{template:icon} {{name=@{name}}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{summary=@{uses} @{type}}} {{effect=@{effect}}}" title="%{repeating_gambit_$X_quote}">
|
||
</button>
|
||
</div>
|
||
<div class="flex-box">
|
||
<textarea class="textarea-4" name="attr_effect" data-i18n-placeholder="gambit placeholder" title="@{repeating_gambit_$X_effect}"></textarea>
|
||
</div>
|
||
</fieldset>
|
||
</section>
|
||
<section class="ideals" id="ideals">
|
||
<h1 data-i18n="ideals"></h1>
|
||
<fieldset class="repeating_ideal">
|
||
<div class="flex-box">
|
||
<input class="checkbox magenta tick" name="attr_check" value="1" type="checkbox" title="@{repeating_ideal_$X_check}"/>
|
||
<textarea class="textarea-3" name="attr_notes" data-i18n-placeholder="write your ideal here" title="@{repeating_ideal_$X_notes}"></textarea>
|
||
<button class="roll-quote" name="roll_quote" type="roll" value="&{template:icon} {{name=ideal}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{text=@{notes}}}" title="%{repeating_ideal_$X_quote}">
|
||
</button>
|
||
</div>
|
||
</fieldset>
|
||
<div class="hide-note">
|
||
<p class="bold" data-i18n="xp reminder title"></p>
|
||
<input class="collapse" value="0" name="attr_collapse-ideals" type="checkbox" title="@{collapse-ideals}"/>
|
||
<div class="notes expanded">
|
||
<p class="indent bullet" data-i18n="xp reminder line 0"></p>
|
||
<p class="indent bullet" data-i18n="xp reminder line 1"></p>
|
||
<p class="indent bullet" data-i18n="xp reminder line 2"></p>
|
||
<p class="indent bullet" data-i18n="xp reminder line 3"></p>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<section class="burdens" id="burdens">
|
||
<h1 data-i18n="burdens"></h1>
|
||
<div class="repcol fit30 half-gap">
|
||
<fieldset class="repeating_burdens">
|
||
<div class="flex-box col center">
|
||
<input class="burden underlined capitalize short-text" name="attr_name" data-i18n-placeholder="burden" type="text" title="@{repeating_burdens_$X_name}"/>
|
||
<label class="input-label dropdown stat" style="width:100px;"><span class="capitalize smallcaps input-label__text" data-i18n="size" style="width:50px;"></span>
|
||
<select class="input-label__input" name="attr_clock-size" title="@{repeating_burdens_$X_clock-size}">
|
||
<option value="4">4</option>
|
||
<option value="6">6</option>
|
||
<option value="8">8</option>
|
||
<option value="10">10</option>
|
||
<option value="12">12</option>
|
||
</select>
|
||
</label>
|
||
<div class="clock">
|
||
<input class="clock-switch" name="attr_clock-size" value="4" type="hidden" title="@{repeating_burdens_$X_clock-size}"/>
|
||
<div class="clock_4">
|
||
<div class="clock-section" name="attr_clock" title="@{repeating_burdens_$X_clock}">
|
||
<input class="clock-radio clock-0" name="attr_bc-4" value="0" type="radio" title="@{repeating_burdens_$X_bc-4}"/>
|
||
<input class="clock-radio clock-6" name="attr_bc-4" value="6" type="radio" title="@{repeating_burdens_$X_bc-4}"/>
|
||
<input class="clock-radio clock-12" name="attr_bc-4" value="12" type="radio" title="@{repeating_burdens_$X_bc-4}"/>
|
||
<input class="clock-radio clock-18" name="attr_bc-4" value="18" type="radio" title="@{repeating_burdens_$X_bc-4}"/>
|
||
<div class="clock-face"></div>
|
||
</div>
|
||
</div>
|
||
<div class="clock_6">
|
||
<div class="clock-section" name="attr_clock" title="@{repeating_burdens_$X_clock}">
|
||
<input class="clock-radio clock-0" name="attr_bc-6" value="0" type="radio" title="@{repeating_burdens_$X_bc-6}"/>
|
||
<input class="clock-radio clock-4" name="attr_bc-6" value="4" type="radio" title="@{repeating_burdens_$X_bc-6}"/>
|
||
<input class="clock-radio clock-8" name="attr_bc-6" value="8" type="radio" title="@{repeating_burdens_$X_bc-6}"/>
|
||
<input class="clock-radio clock-12" name="attr_bc-6" value="12" type="radio" title="@{repeating_burdens_$X_bc-6}"/>
|
||
<input class="clock-radio clock-16" name="attr_bc-6" value="16" type="radio" title="@{repeating_burdens_$X_bc-6}"/>
|
||
<input class="clock-radio clock-20" name="attr_bc-6" value="20" type="radio" title="@{repeating_burdens_$X_bc-6}"/>
|
||
<div class="clock-face"></div>
|
||
</div>
|
||
</div>
|
||
<div class="clock_8">
|
||
<div class="clock-section" name="attr_clock" title="@{repeating_burdens_$X_clock}">
|
||
<input class="clock-radio clock-0" name="attr_bc-8" value="0" type="radio" title="@{repeating_burdens_$X_bc-8}"/>
|
||
<input class="clock-radio clock-3" name="attr_bc-8" value="3" type="radio" title="@{repeating_burdens_$X_bc-8}"/>
|
||
<input class="clock-radio clock-6" name="attr_bc-8" value="6" type="radio" title="@{repeating_burdens_$X_bc-8}"/>
|
||
<input class="clock-radio clock-9" name="attr_bc-8" value="9" type="radio" title="@{repeating_burdens_$X_bc-8}"/>
|
||
<input class="clock-radio clock-12" name="attr_bc-8" value="12" type="radio" title="@{repeating_burdens_$X_bc-8}"/>
|
||
<input class="clock-radio clock-15" name="attr_bc-8" value="15" type="radio" title="@{repeating_burdens_$X_bc-8}"/>
|
||
<input class="clock-radio clock-18" name="attr_bc-8" value="18" type="radio" title="@{repeating_burdens_$X_bc-8}"/>
|
||
<input class="clock-radio clock-21" name="attr_bc-8" value="21" type="radio" title="@{repeating_burdens_$X_bc-8}"/>
|
||
<div class="clock-face"></div>
|
||
</div>
|
||
</div>
|
||
<div class="clock_10">
|
||
<div class="clock-section" name="attr_clock" title="@{repeating_burdens_$X_clock}">
|
||
<input class="clock-radio clock-0" name="attr_bc-10" value="0" type="radio" title="@{repeating_burdens_$X_bc-10}"/>
|
||
<input class="clock-radio clock-2" name="attr_bc-10" value="2" type="radio" title="@{repeating_burdens_$X_bc-10}"/>
|
||
<input class="clock-radio clock-5" name="attr_bc-10" value="5" type="radio" title="@{repeating_burdens_$X_bc-10}"/>
|
||
<input class="clock-radio clock-7" name="attr_bc-10" value="7" type="radio" title="@{repeating_burdens_$X_bc-10}"/>
|
||
<input class="clock-radio clock-10" name="attr_bc-10" value="10" type="radio" title="@{repeating_burdens_$X_bc-10}"/>
|
||
<input class="clock-radio clock-12" name="attr_bc-10" value="12" type="radio" title="@{repeating_burdens_$X_bc-10}"/>
|
||
<input class="clock-radio clock-14" name="attr_bc-10" value="14" type="radio" title="@{repeating_burdens_$X_bc-10}"/>
|
||
<input class="clock-radio clock-17" name="attr_bc-10" value="17" type="radio" title="@{repeating_burdens_$X_bc-10}"/>
|
||
<input class="clock-radio clock-19" name="attr_bc-10" value="19" type="radio" title="@{repeating_burdens_$X_bc-10}"/>
|
||
<input class="clock-radio clock-22" name="attr_bc-10" value="22" type="radio" title="@{repeating_burdens_$X_bc-10}"/>
|
||
<div class="clock-face"></div>
|
||
</div>
|
||
</div>
|
||
<div class="clock_12">
|
||
<div class="clock-section" name="attr_clock" title="@{repeating_burdens_$X_clock}">
|
||
<input class="clock-radio clock-0" name="attr_bc-12" value="0" type="radio" title="@{repeating_burdens_$X_bc-12}"/>
|
||
<input class="clock-radio clock-1" name="attr_bc-12" value="1" type="radio" title="@{repeating_burdens_$X_bc-12}"/>
|
||
<input class="clock-radio clock-4" name="attr_bc-12" value="4" type="radio" title="@{repeating_burdens_$X_bc-12}"/>
|
||
<input class="clock-radio clock-6" name="attr_bc-12" value="6" type="radio" title="@{repeating_burdens_$X_bc-12}"/>
|
||
<input class="clock-radio clock-8" name="attr_bc-12" value="8" type="radio" title="@{repeating_burdens_$X_bc-12}"/>
|
||
<input class="clock-radio clock-11" name="attr_bc-12" value="11" type="radio" title="@{repeating_burdens_$X_bc-12}"/>
|
||
<input class="clock-radio clock-12" name="attr_bc-12" value="12" type="radio" title="@{repeating_burdens_$X_bc-12}"/>
|
||
<input class="clock-radio clock-13" name="attr_bc-12" value="13" type="radio" title="@{repeating_burdens_$X_bc-12}"/>
|
||
<input class="clock-radio clock-16" name="attr_bc-12" value="16" type="radio" title="@{repeating_burdens_$X_bc-12}"/>
|
||
<input class="clock-radio clock-18" name="attr_bc-12" value="18" type="radio" title="@{repeating_burdens_$X_bc-12}"/>
|
||
<input class="clock-radio clock-20" name="attr_bc-12" value="20" type="radio" title="@{repeating_burdens_$X_bc-12}"/>
|
||
<input class="clock-radio clock-23" name="attr_bc-12" value="23" type="radio" title="@{repeating_burdens_$X_bc-12}"/>
|
||
<div class="clock-face"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="flex-box center">
|
||
<p class="bold mono burden-penalty" data-i18n="-1d"></p>
|
||
<input class="burden-penalty underlined smallcaps" name="attr_penalty_1" type="text" title="@{repeating_burdens_$X_penalty_1}"/>
|
||
</div>
|
||
<div class="flex-box center">
|
||
<p class="bold mono burden-penalty" data-i18n="-1d"></p>
|
||
<input class="burden-penalty underlined smallcaps" name="attr_penalty_2" type="text" title="@{repeating_burdens_$X_penalty_2}"/>
|
||
</div>
|
||
</div>
|
||
</fieldset>
|
||
</div>
|
||
<div class="hide-note">
|
||
<p class="bold capitalize" data-i18n="burdens reminder title"></p>
|
||
<input class="collapse" value="0" name="attr_collapse-burdens" type="checkbox" title="@{collapse-burdens}"/>
|
||
<div class="notes expanded">
|
||
<p data-i18n="burdens reminder line 0"></p>
|
||
<p class="indent bullet" data-i18n="burdens reminder line 1"></p>
|
||
<p class="indent bullet" data-i18n="burdens reminder line 2"></p>
|
||
<p class="indent bullet" data-i18n="burdens reminder line 3"></p>
|
||
<p data-i18n="burdens reminder line 4"></p>
|
||
<div class="flex-box center well-padded boxed">
|
||
<label class="input-label"><span class="dust input-label__text" data-i18n="dust" role="heading" aria-level="3"></span>
|
||
<input class="info-label center dust input-label__input" name="attr_dust" type="number" value="0" title="@{dust}"/>
|
||
</label>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
</section>
|
||
</article>
|
||
<article class="tactics paper-background nav-display" id="tactics">
|
||
<section class="stats no-gap" id="auto-fit">
|
||
<div class="half-gap boxed well-padded" id="stats">
|
||
<div class="center span-all">
|
||
<h3 data-i18n="hp"></h3>
|
||
<div class="flex-box center">
|
||
<input class="bloodied-control" name="attr_bloodied" type="hidden" title="@{bloodied}"/>
|
||
<input class="underlined bloodied-receiver bigger" name="attr_hp" type="number" title="@{hp}"/>
|
||
<input class="bigger" name="attr_hp_max" value="24" readonly="readonly" type="number" title="@{hp|max}"/>
|
||
</div>
|
||
</div>
|
||
<div class="center span-all">
|
||
<div class="flex-box center">
|
||
<label class="input-label center"><span class="smallcaps bigger input-label__text" data-i18n="wounds" role="heading" aria-level="5"></span>
|
||
<input class="center bigger input-label__input" name="attr_wounds" type="number" value="0" readonly="readonly" title="@{wounds}"/>
|
||
</label>
|
||
</div>
|
||
<div class="flex-box center">
|
||
<input class="fill-left dots gore radio-zero" name="attr_wounds" type="radio" value="0" checked="true" title="@{wounds}"/><span></span>
|
||
<input class="fill-left dots gore" name="attr_wounds" type="radio" value="1" title="@{wounds}"/><span></span>
|
||
<input class="fill-left dots gore" name="attr_wounds" type="radio" value="2" title="@{wounds}"/><span></span>
|
||
<input class="fill-left dots gore" name="attr_wounds" type="radio" value="3" title="@{wounds}"/><span></span>
|
||
<input class="fill-left dots gore" name="attr_wounds" type="radio" value="4" title="@{wounds}"/><span></span>
|
||
</div>
|
||
<p class="center bold" data-i18n="rules reminder wounds"></p>
|
||
</div>
|
||
</div>
|
||
<div class="half-gap boxed well-padded" id="stats"><span class="center">
|
||
<label class="input-label center"><span class="input-label__text" data-i18n="vit" role="heading" aria-level="3"></span>
|
||
<input class="underlined bigger input-label__input" name="attr_vitality" type="number" value="6" title="@{vitality}"/>
|
||
</label>
|
||
<label class="input-label center"><span class="input-label__text" data-i18n="vigor" role="heading" aria-level="5"></span>
|
||
<input class="underlined input-label__input" name="attr_vigor" type="number" value="0" title="@{vigor}"/>
|
||
</label>
|
||
<input name="attr_vigor_max" value="24" readonly="readonly" type="hidden" title="@{vigor|max}"/></span><span class="center">
|
||
<label class="input-label center"><span class="input-label__text" data-i18n="def" role="heading" aria-level="3"></span>
|
||
<input class="underlined bigger input-label__input" name="attr_defense" type="number" value="5" title="@{defense}"/>
|
||
</label>
|
||
<label class="input-label center"><span class="input-label__text" data-i18n="armor" role="heading" aria-level="5"></span>
|
||
<input class="underlined input-label__input" name="attr_armor" type="number" value="0" title="@{armor}"/>
|
||
</label></span><span class="center">
|
||
<label class="input-label center"><span class="input-label__text" data-i18n="spd" role="heading" aria-level="3"></span>
|
||
<input class="underlined bigger input-label__input" name="attr_speed" type="number" value="4" title="@{speed}"/>
|
||
</label>
|
||
<label class="input-label center"><span class="input-label__text" data-i18n="dash" role="heading" aria-level="5"></span>
|
||
<input class="input-label__input" name="attr_dash" type="number" readonly="readonly" value="2" title="@{dash}"/>
|
||
</label></span><span class="center">
|
||
<label class="input-label center"><span class="input-label__text center" data-i18n="dmg" role="heading" aria-level="3"></span>
|
||
<select class="input-label__input damage-die underlined big" name="attr_damage-die" style="text-overflow:initial; max-width:50px;" title="@{damage-die}">
|
||
<option value="2">d2
|
||
</option>
|
||
<option value="4">d4
|
||
</option>
|
||
<option value="6" selected="selected">d6
|
||
</option>
|
||
<option value="8">d8
|
||
</option>
|
||
<option value="10">d10
|
||
</option>
|
||
<option value="12">d12
|
||
</option>
|
||
</select>
|
||
</label>
|
||
<label class="input-label center"><span class="input-label__text" data-i18n="fray" role="heading" aria-level="5"></span>
|
||
<input class="underlined input-label__input" name="attr_fray" type="number" value="2" title="@{fray}"/>
|
||
</label></span></div>
|
||
<div class="half-gap boxed well-padded" id="stats">
|
||
<h3 class="span-all" data-i18n="attacks"></h3>
|
||
<div class="center">
|
||
<div class="flex-box center">
|
||
<input class="center uppercase h3-style-input" name="attr_weapon_melee" value="melee" type="text" data-i18n-placeholder="melee weapon" aria-level="5" style="width:100%;" title="@{weapon_melee}"/>
|
||
</div>
|
||
<div class="flex-box center">
|
||
<input class="number underlined" name="attr_melee_range" type="number" value="1" title="@{melee_range}"/>
|
||
<button class="roll-d20 light" name="roll_attack_melee_light" type="roll" role="heading" value="&{template:icon} {{name=Light @{weapon_melee} Attack}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{roll_name=Attack Roll}} {{roll=[[1d20@{boons}[BOONS]]]}} {{range=[[@{melee_range}]]}} {{damage=[[1d@{damage-die}+@{fray}]]}} {{bonus_damage=[[?{Bonus Damage|0}d@{damage-die}kh1sd]]}} {{crit_damage=[[1d@{damage-die}]]}} {{miss_damage=[[@{fray}]]}}" title="%{attack_melee_light}">
|
||
</button>
|
||
<button class="roll-d20 heavy" name="roll_attack_melee_heavy" type="roll" role="heading" value="&{template:icon} {{name=Heavy @{weapon_melee} Attack}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{roll_name=Attack Roll}} {{roll=[[1d20@{boons}[BOONS]]]}} {{range=[[@{melee_range}]]}} {{damage=[[@{ratio_heavy}d@{damage-die}+@{fray}]]}} {{bonus_damage=[[?{Bonus Damage|0}d@{damage-die}kh1sd]]}} {{crit_damage=[[1d@{damage-die}]]}} {{miss_damage=[[@{fray}]]}}" title="%{attack_melee_heavy}">
|
||
</button>
|
||
</div>
|
||
</div>
|
||
<div class="center">
|
||
<div class="flex-box center">
|
||
<input class="center uppercase h3-style-input" name="attr_weapon_ranged" value="ranged" type="text" data-i18n-placeholder="ranged weapon" aria-level="5" style="width:100%;" title="@{weapon_ranged}"/>
|
||
</div>
|
||
<div class="flex-box center">
|
||
<input class="number underlined" name="attr_ranged_range" type="number" value="2" title="@{ranged_range}"/>
|
||
<button class="roll-d20 light" name="roll_attack_ranged_light" type="roll" role="heading" value="&{template:icon} {{name=Light @{weapon_ranged} Attack}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{roll_name=Attack Roll}} {{roll=[[1d20@{boons}[BOONS]]]}} {{range=[[@{ranged_range}]]}} {{damage=[[1d@{damage-die}+@{fray}]]}} {{bonus_damage=[[?{Bonus Damage|0}d@{damage-die}kh1sd]]}} {{crit_damage=[[1d@{damage-die}]]}} {{miss_damage=[[@{fray}]]}}" title="%{attack_ranged_light}">
|
||
</button>
|
||
<button class="roll-d20 heavy" name="roll_attack_ranged_heavy" type="roll" role="heading" value="&{template:icon} {{name=Heavy @{weapon_ranged} Attack}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{roll_name=Attack Roll}} {{roll=[[1d20@{boons}[BOONS]]]}} {{range=[[@{ranged_range}]]}} {{damage=[[@{ratio_heavy}d@{damage-die}+@{fray}]]}} {{bonus_damage=[[?{Bonus Damage|0}d@{damage-die}kh1sd]]}} {{crit_damage=[[1d@{damage-die}]]}} {{miss_damage=[[@{fray}]]}}" title="%{attack_ranged_heavy}">
|
||
</button>
|
||
</div>
|
||
</div>
|
||
<div class="flex-box center">
|
||
<h3 class="relative" data-i18n="save" style="top:-10px;"></h3>
|
||
</div>
|
||
<div class="center">
|
||
<div class="flex-box center">
|
||
<button class="roll-d20" name="roll_save" type="roll" role="heading" value="&{template:icon} {{name=save}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{roll=[[1d20@{boons}[BOONS]]]}} {{target=@{save_target}}}" title="%{save}">
|
||
</button>
|
||
<p class="bold" data-i18n="vs" aria-level="5"></p>
|
||
<input class="number underlined" name="attr_save_target" type="number" value="10" title="@{save_target}"/>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<section class="span-all" id="auto-fit">
|
||
<section class="job" id="jobclass">
|
||
<input class="color-control" name="attr_class" value="general" type="hidden" title="@{class}"/>
|
||
<input class="h1-style-input color-receiver" name="attr_job" data-i18n-placeholder="job" readonly="readonly" title="@{job}"/>
|
||
<textarea class="serif emph textarea-5" name="attr_job_flavor_text" data-i18n-placeholder="primary job flavor text" spellcheck="false" title="@{job_flavor_text}"></textarea>
|
||
<h3 data-i18n="secondary jobs"></h3>
|
||
<div class="repcol">
|
||
<fieldset class="repeating_jobs">
|
||
<div class="grid__2col no-gap">
|
||
<input class="color-control" name="attr_class" value="inactive" type="hidden" title="@{repeating_jobs_$X_class}"/>
|
||
<input class="h3-style-input color-receiver center job-h1-receiver" name="attr_name" data-i18n-placeholder="job" type="text" title="@{repeating_jobs_$X_name}"/>
|
||
<div class="color-selector">
|
||
<input class="color-control" name="attr_class" value="inactive" type="hidden" title="@{repeating_jobs_$X_class}"/>
|
||
<select class="color-selector color-receiver" name="attr_class" style="height:39px; width:100%;" title="@{repeating_jobs_$X_class}">
|
||
<option value="general" data-i18n="general">
|
||
</option>
|
||
<option value="stalwart" data-i18n="stalwart">
|
||
</option>
|
||
<option value="vagabond" data-i18n="vagabond">
|
||
</option>
|
||
<option value="mendicant" data-i18n="mendicant">
|
||
</option>
|
||
<option value="wright" data-i18n="wright">
|
||
</option>
|
||
<option value="inactive" data-i18n="inactive" selected="selected">
|
||
</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
<textarea class="textarea-3" name="attr_gambit" data-i18n-placeholder="job gambit desc" title="@{repeating_jobs_$X_gambit}"></textarea>
|
||
</fieldset>
|
||
</div>
|
||
</section>
|
||
<section class="class" id="jobclass">
|
||
<input class="color-control" name="attr_class" value="general" type="hidden" title="@{class}"/>
|
||
<input class="h1-style-input color-receiver" name="attr_class" data-i18n-placeholder="class" readonly="readonly" title="@{class}"/>
|
||
<textarea class="textarea-5" name="attr_class_notes" data-i18n-placeholder="class notes desc" title="@{class_notes}"></textarea>
|
||
<label class="input-label"><span class="normal input-label__text" data-i18n="special mechanic" role="heading" aria-level="3"></span>
|
||
<input class="underlined h3-style-input input-label__input" name="attr_special_mechanic" type="text" title="@{special_mechanic}"/>
|
||
</label>
|
||
<textarea class="textarea-4" name="attr_special_mechanic_desc" data-i18n-placeholder="special mechanic desc" title="@{special_mechanic_desc}"></textarea>
|
||
<div class="hide-note">
|
||
<h5 data-i18n="class resource"></h5>
|
||
<input class="collapse" value="1" name="attr_collapse-ambition" type="checkbox" title="@{collapse-ambition}"/>
|
||
<div class="notes expanded repcol fit50">
|
||
<fieldset class="repeating_class-resource">
|
||
<div class="wealth grid__3col boxed well-padded center">
|
||
<input class="h3-style-input" name="attr_number" placeholder="0" type="number" title="@{repeating_class-resource_$X_number}"/>
|
||
<p class="colon"></p>
|
||
<input class="wealth uppercase" name="attr_name" data-i18n-placeholder="resource" type="text" title="@{repeating_class-resource_$X_name}"/>
|
||
</div>
|
||
</fieldset>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
</section>
|
||
<section id="auto-fill">
|
||
<section class="traits" id="traits">
|
||
<h1 data-i18n="traits"></h1>
|
||
<div class="repcol fit50">
|
||
<fieldset class="repeating_traits">
|
||
<input class="h3-style-input underlined" name="attr_name" data-i18n-placeholder="trait" type="text" title="@{repeating_traits_$X_name}"/>
|
||
<textarea class="textarea-3" name="attr_description" data-i18n-placeholder="trait description" title="@{repeating_traits_$X_description}"></textarea>
|
||
</fieldset>
|
||
</div>
|
||
</section>
|
||
<section class="abilities long-2" id="abilities">
|
||
<h1 data-i18n="abilities"></h1>
|
||
<fieldset class="repeating_abilities">
|
||
<div class="grid__3col no-gap">
|
||
<input class="color-control" name="attr_class" value="inactive" type="hidden" title="@{repeating_abilities_$X_class}"/>
|
||
<div class="flex-box color-receiver center" style="height:39px!important;"><span class="center" style="width:39px!important; height:39px!important;">
|
||
<button class="roll-d20 center col" name="roll_use" value="&{template:icon} {{name=@{name}}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{summary=@{info-b}}} {{info=@{info-a} ⬧ @{info-c}}} {{description=@{flavor}}} {{effect=@{effects}}} {{talent=@{talent_effect}}} {{mastery_name=@{mastery_name}}} {{mastery=@{mastery_effect}}}" title="%{repeating_abilities_$X_use}" type="roll">
|
||
</button></span>
|
||
</div>
|
||
<input class="color-control" name="attr_class" value="inactive" type="hidden" title="@{repeating_abilities_$X_class}"/>
|
||
<input class="h3-style-input color-receiver center job-h1-receiver" name="attr_name" data-i18n-placeholder="ability" type="text" title="@{repeating_abilities_$X_name}"/>
|
||
<div class="color-selector">
|
||
<input class="color-control" name="attr_class" value="inactive" type="hidden" title="@{repeating_abilities_$X_class}"/>
|
||
<select class="color-selector color-receiver" name="attr_class" style="height:39px; width:100%;" title="@{repeating_abilities_$X_class}">
|
||
<option value="general" data-i18n="general">
|
||
</option>
|
||
<option value="stalwart" data-i18n="stalwart">
|
||
</option>
|
||
<option value="vagabond" data-i18n="vagabond">
|
||
</option>
|
||
<option value="mendicant" data-i18n="mendicant">
|
||
</option>
|
||
<option value="wright" data-i18n="wright">
|
||
</option>
|
||
<option value="inactive" data-i18n="inactive" selected="selected">
|
||
</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
<div class="grid___3col half-gap center">
|
||
<input class="ability-info underlined capitalize right" name="attr_info-a" type="text" title="@{repeating_abilities_$X_info-a}"/>
|
||
<input class="ability-info underlined capitalize center" name="attr_info-b" placeholder="⬧" type="text" title="@{repeating_abilities_$X_info-b}"/>
|
||
<input class="ability-info underlined capitalize left" name="attr_info-c" type="text" title="@{repeating_abilities_$X_info-c}"/>
|
||
</div>
|
||
<textarea class="serif emph small textarea-4" name="attr_flavor" data-i18n-placeholder="ability flavor" spellcheck="false" title="@{repeating_abilities_$X_flavor}"></textarea>
|
||
<textarea class="small textarea-6" name="attr_effects" data-i18n-placeholder="ability effects" title="@{repeating_abilities_$X_effects}"></textarea>
|
||
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_abilities_$X_collapse}"/>
|
||
<div class="grid__4col half-gap notes expanded"><span style="width:45px;">
|
||
<input class="checkbox talent I" name="attr_talent_1" value="1" type="checkbox" title="@{repeating_abilities_$X_talent_1}"/>
|
||
<input class="checkbox talent II" name="attr_talent_2" value="2" type="checkbox" title="@{repeating_abilities_$X_talent_2}"/></span>
|
||
<h5 class="smallcaps" data-i18n="talent" style="position:relative;left:-50%;"></h5>
|
||
<input class="checkbox magenta star" name="attr_mastery" value="1" type="checkbox" title="@{repeating_abilities_$X_mastery}"/>
|
||
<input class="h3-style-input small short-text center" name="attr_mastery_name" data-i18n-placeholder="mastery name" type="text" title="@{repeating_abilities_$X_mastery_name}"/>
|
||
<div class="flex-box boxed center span-2">
|
||
<textarea class="small textarea-4" name="attr_talent_effect" data-i18n-placeholder="talent effect" title="@{repeating_abilities_$X_talent_effect}"></textarea>
|
||
</div>
|
||
<div class="flex-box boxed center span-2">
|
||
<textarea class="small textarea-4" name="attr_mastery_effect" data-i18n-placeholder="mastery effect" title="@{repeating_abilities_$X_mastery_effect}"></textarea>
|
||
</div>
|
||
</div>
|
||
</fieldset>
|
||
<div class="hide-note">
|
||
<div class="flex-box">
|
||
<h5 data-i18n="basic abilities"></h5>
|
||
</div>
|
||
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{collapse}"/>
|
||
<div class="notes expanded">
|
||
<p class="indent bullet" data-i18n="basic abilities reminder line 0"></p>
|
||
<p class="indent bullet" data-i18n="basic abilities reminder line 1"></p>
|
||
<p class="indent bullet" data-i18n="basic abilities reminder line 2"></p>
|
||
<p class="indent bullet" data-i18n="basic abilities reminder line 3"></p>
|
||
<p class="indent bullet" data-i18n="basic abilities reminder line 4"></p>
|
||
<div class="flexbox center">
|
||
<div style="position:relative; left:40%;">
|
||
<button class="center smallcaps die" name="roll_attack_melee_light" type="roll" role="heading" aria-level="4" data-i18n="whack" value="&{template:icon} {{name=Whack!}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{range=[[3]]}} {{damage=[[1]]}}" title="%{attack_melee_light}">
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<section class="limits" id="limits">
|
||
<h1 data-i18n="limit break"></h1>
|
||
<fieldset class="repeating_limits">
|
||
<div class="grid__3col no-gap">
|
||
<input class="color-control" name="attr_class" value="inactive" type="hidden" title="@{repeating_limits_$X_class}"/>
|
||
<div class="flex-box color-receiver center" style="height:39px!important;"><span class="center" style="width:39px!important; height:39px!important;">
|
||
<button class="roll-d20 center col" name="roll_use" type="roll" value="&{template:icon} {{name=@{name}}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{summary=@{info-b}}} {{info=@{info-a} ⬧ @{info-c}}} {{description=@{flavor}}} {{effect=@{effects}}} {{mastery_name=@{mastery_name}}} {{mastery=@{mastery_effect}}}" title="%{repeating_limits_$X_use}">
|
||
</button></span>
|
||
</div>
|
||
<input class="color-control" name="attr_class" value="inactive" type="hidden" title="@{repeating_limits_$X_class}"/>
|
||
<input class="h3-style-input color-receiver center job-h1-receiver" name="attr_name" data-i18n-placeholder="limit" type="text" title="@{repeating_limits_$X_name}"/>
|
||
<div class="color-selector">
|
||
<input class="color-control" name="attr_class" value="inactive" type="hidden" title="@{repeating_limits_$X_class}"/>
|
||
<select class="color-selector color-receiver" name="attr_class" style="height:39px; width:100%;" title="@{repeating_limits_$X_class}">
|
||
<option value="general" data-i18n="general">
|
||
</option>
|
||
<option value="stalwart" data-i18n="stalwart">
|
||
</option>
|
||
<option value="vagabond" data-i18n="vagabond">
|
||
</option>
|
||
<option value="mendicant" data-i18n="mendicant">
|
||
</option>
|
||
<option value="wright" data-i18n="wright">
|
||
</option>
|
||
<option value="inactive" data-i18n="inactive" selected="selected">
|
||
</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
<div class="grid___3col half-gap center">
|
||
<input class="ability-info underlined capitalize right" name="attr_info-a" type="text" title="@{repeating_limits_$X_info-a}"/>
|
||
<input class="ability-info underlined capitalize center" name="attr_info-b" placeholder="⬧" type="text" title="@{repeating_limits_$X_info-b}"/>
|
||
<input class="ability-info underlined capitalize left" name="attr_info-c" type="text" title="@{repeating_limits_$X_info-c}"/>
|
||
</div>
|
||
<textarea class="serif emph small textarea-4" name="attr_flavor" data-i18n-placeholder="ability flavor" spellcheck="false" title="@{repeating_limits_$X_flavor}"></textarea>
|
||
<textarea class="small textarea-6" name="attr_effects" data-i18n-placeholder="ability effects" title="@{repeating_limits_$X_effects}"></textarea>
|
||
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_limits_$X_collapse}"/>
|
||
<div class="grid__2col half-gap notes expanded">
|
||
<input class="checkbox magenta star" name="attr_mastery" value="1" type="checkbox" title="@{repeating_limits_$X_mastery}"/>
|
||
<input class="h3-style-input small short-text center" name="attr_mastery_name" data-i18n-placeholder="mastery name" style="width:130%; position:relative; left:-30%;" type="text" title="@{repeating_limits_$X_mastery_name}"/>
|
||
<div class="flex-box boxed center span-2">
|
||
<textarea class="small textarea-4" name="attr_mastery_effect" data-i18n-placeholder="mastery effect" title="@{repeating_limits_$X_mastery_effect}"></textarea>
|
||
</div>
|
||
</div>
|
||
</fieldset>
|
||
<div class="resolve hide-note">
|
||
<div class="flex-box">
|
||
<label class="input-label"><span class="normal input-label__text" data-i18n="personal resolve" role="heading" aria-level="5"></span>
|
||
<input class="underlined input-label__input" name="attr_resolve_personal" type="number" title="@{resolve_personal}"/>
|
||
</label>
|
||
<label class="input-label"><span class="normal input-label__text" data-i18n="party resolve" role="heading" aria-level="5"></span>
|
||
<input class="underlined input-label__input" name="attr_resolve_party" type="number" title="@{resolve_party}"/>
|
||
</label>
|
||
</div>
|
||
<input class="collapse" value="0" name="attr_collapse-limits" type="checkbox" title="@{collapse-limits}"/>
|
||
<div class="notes expanded">
|
||
<p class="bold" data-i18n="limit break reminder line 0"></p>
|
||
<p class="indent bullet" data-i18n="limit break reminder line 1"></p>
|
||
<p class="indent bullet" data-i18n="limit break reminder line 2"></p>
|
||
<p class="indent bullet" data-i18n="limit break reminder line 3"></p>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<section class="relics long-2" id="relics">
|
||
<h1 data-i18n="relics"></h1>
|
||
<fieldset class="repeating_relics">
|
||
<div class="grid__3col no-gap">
|
||
<input class="color-control" name="attr_class" value="unequipped" type="hidden" title="@{repeating_relics_$X_class}"/>
|
||
<select class="serif color-receiver center job-h1-receiver" name="attr_level" title="@{repeating_relics_$X_level}">
|
||
<option value="0">—</option>
|
||
<option value="1">Ⅰ</option>
|
||
<option value="2">Ⅱ</option>
|
||
<option value="3">Ⅲ</option>
|
||
<option value="4">Ⅳ</option>
|
||
</select>
|
||
<input class="color-control" name="attr_class" value="unequipped" type="hidden" title="@{repeating_relics_$X_class}"/>
|
||
<input class="h3-style-input color-receiver center job-h1-receiver" name="attr_name" data-i18n-placeholder="relic" type="text" title="@{repeating_relics_$X_name}"/>
|
||
<div class="color-selector">
|
||
<input class="color-control" name="attr_class" value="unequipped" type="hidden" title="@{repeating_relics_$X_class}"/>
|
||
<select class="color-selector color-receiver" name="attr_class" style="height:39px; width:100%;" title="@{repeating_relics_$X_class}">
|
||
<option value="custom" data-i18n="custom">
|
||
</option>
|
||
<option value="heavy" data-i18n="heavy">
|
||
</option>
|
||
<option value="skirmisher" data-i18n="skirmisher">
|
||
</option>
|
||
<option value="leader" data-i18n="leader">
|
||
</option>
|
||
<option value="artillery" data-i18n="artillery">
|
||
</option>
|
||
<option value="unequipped" data-i18n="unequipped" selected="selected">
|
||
</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
<textarea class="serif emph small textarea-1" name="attr_flavor" data-i18n-placeholder="relic flavor" spellcheck="false" title="@{repeating_relics_$X_flavor}"></textarea>
|
||
<textarea class="small textarea-4" name="attr_effects" data-i18n-placeholder="relic effects" title="@{repeating_relics_$X_effects}"></textarea>
|
||
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_relics_$X_collapse}"/>
|
||
<div class="grid__3col half-gap notes expanded">
|
||
<div class="flex-box boxed well-padded center">
|
||
<label class="info-label mono capitalize" name="aspected" data-i18n="aspected" aria-label="5">
|
||
</label>
|
||
<input class="checkbox magenta tick relative" name="attr_aspected" value="1" style="top:-5px;" type="checkbox" title="@{repeating_relics_$X_aspected}"/>
|
||
</div>
|
||
<div class="flex-box boxed well-padded center">
|
||
<label class="input-label"><span class="input-label__text" data-i18n="infused dust" role="heading" aria-level="5"></span>
|
||
<input class="ability-info dust underlined input-label__input" name="attr_infused_dust" type="number" title="@{repeating_relics_$X_infused_dust}"/>
|
||
</label>
|
||
</div>
|
||
<div class="well-padded center">
|
||
<button class="roll-quote" name="roll_quote" type="roll" value="&{template:icon} {{name=@{name}}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{summary=Level @{level} @{class} Relic}} {{description=@{flavor}}} {{effect=@{effects}}}" title="%{repeating_relics_$X_quote}">
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</fieldset>
|
||
<h3 data-i18n="trophies"></h3>
|
||
<fieldset class="repeating_trophies">
|
||
<div class="flex-box underlined">
|
||
<input class="h3-style-input power" name="attr_name" data-i18n-placeholder="trophy" type="text" title="@{repeating_trophies_$X_name}"/>
|
||
<input name="attr_uses" placeholder="⬧" type="number" title="@{repeating_trophies_$X_uses}"/>
|
||
<select class="center type" name="attr_type" title="@{repeating_trophies_$X_type}">
|
||
<option value="NA" data-i18n="NA" selected="selected">
|
||
</option>
|
||
<option value="uses" data-i18n="uses">
|
||
</option>
|
||
<option value="combats" data-i18n="combats">
|
||
</option>
|
||
<option value="expeditions" data-i18n="expeditions">
|
||
</option>
|
||
<option value="unlimited" data-i18n="unlimited">
|
||
</option>
|
||
<option value="passive" data-i18n="passive">
|
||
</option>
|
||
</select>
|
||
<button class="roll-quote" name="roll_quote" type="roll" value="&{template:icon} {{name=@{name}}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{summary=@{uses} @{type}}} {{effect=@{effect}}}" title="%{repeating_trophies_$X_quote}">
|
||
</button>
|
||
</div>
|
||
<textarea class="textarea-3" name="attr_effect" data-i18n-placeholder="trophy effect" title="@{repeating_trophies_$X_effect}"></textarea>
|
||
</fieldset>
|
||
<div class="flex-box center well-padded boxed">
|
||
<label class="input-label"><span class="dust input-label__text" data-i18n="dust" role="heading" aria-level="3"></span>
|
||
<input class="info-label center dust input-label__input" name="attr_dust" type="number" value="0" title="@{dust}"/>
|
||
</label>
|
||
</div>
|
||
</section>
|
||
</section>
|
||
</article>
|
||
<article class="journal paper-background nav-display" id="journal">
|
||
<section id="auto-fit">
|
||
<div class="flex-box center well-padded boxed">
|
||
<label class="input-label"><span class="xp input-label__text" data-i18n="xp" role="heading" aria-level="3"></span>
|
||
<input class="info-label center xp bigger input-label__input" name="attr_xp" type="number" value="0" style="width:100%;" title="@{xp}"/>
|
||
</label>
|
||
<input class="underlined number" name="attr_xp_max" value="15" type="number" title="@{xp|max}"/>
|
||
<input name="attr_xp_interval" readonly="readonly" value="5" type="number" title="@{xp_interval}"/>
|
||
</div>
|
||
<div class="flex-box center well-padded boxed">
|
||
<label class="input-label"><span class="dust input-label__text" data-i18n="dust" role="heading" aria-level="3"></span>
|
||
<input class="info-label center dust input-label__input" name="attr_dust" type="number" value="0" title="@{dust}"/>
|
||
</label>
|
||
</div>
|
||
</section>
|
||
<section id="auto-fit">
|
||
<div class="span-2">
|
||
<section class="ideals" id="ideals">
|
||
<h1 data-i18n="ideals"></h1>
|
||
<fieldset class="repeating_ideal">
|
||
<div class="flex-box">
|
||
<input class="checkbox magenta tick" name="attr_check" value="1" type="checkbox" title="@{repeating_ideal_$X_check}"/>
|
||
<textarea class="textarea-3" name="attr_notes" data-i18n-placeholder="write your ideal here" title="@{repeating_ideal_$X_notes}"></textarea>
|
||
<button class="roll-quote" name="roll_quote" type="roll" value="&{template:icon} {{name=ideal}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{text=@{notes}}}" title="%{repeating_ideal_$X_quote}">
|
||
</button>
|
||
</div>
|
||
</fieldset>
|
||
<div class="hide-note">
|
||
<p class="bold" data-i18n="xp reminder title"></p>
|
||
<input class="collapse" value="0" name="attr_collapse-ideals" type="checkbox" title="@{collapse-ideals}"/>
|
||
<div class="notes expanded">
|
||
<p class="indent bullet" data-i18n="xp reminder line 0"></p>
|
||
<p class="indent bullet" data-i18n="xp reminder line 1"></p>
|
||
<p class="indent bullet" data-i18n="xp reminder line 2"></p>
|
||
<p class="indent bullet" data-i18n="xp reminder line 3"></p>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<section class="ambitions span-2 long-2" id="ambitions">
|
||
<h1 data-i18n="ambitions"></h1>
|
||
<fieldset class="repeating_ambition-personal">
|
||
<div class="flex-box row justify-end">
|
||
<div class="flex-box col no-gap">
|
||
<label class="input-label dropdown stat" style="width:100px; margin:0px;"><span class="capitalize smallcaps input-label__text" data-i18n="size" style="width:50px;"></span>
|
||
<select class="input-label__input" name="attr_clock-size" title="@{repeating_ambition-personal_$X_clock-size}">
|
||
<option value="4">4</option>
|
||
<option value="6">6</option>
|
||
<option value="8">8</option>
|
||
<option value="10">10</option>
|
||
<option value="12">12</option>
|
||
</select>
|
||
</label>
|
||
<div class="clock small-clock">
|
||
<input class="clock-switch" name="attr_clock-size" value="4" type="hidden" title="@{repeating_ambition-personal_$X_clock-size}"/>
|
||
<div class="clock_4">
|
||
<div class="clock-section" name="attr_clock" title="@{repeating_ambition-personal_$X_clock}">
|
||
<input class="clock-radio clock-0" name="attr_ac-4" value="0" type="radio" title="@{repeating_ambition-personal_$X_ac-4}"/>
|
||
<input class="clock-radio clock-6" name="attr_ac-4" value="6" type="radio" title="@{repeating_ambition-personal_$X_ac-4}"/>
|
||
<input class="clock-radio clock-12" name="attr_ac-4" value="12" type="radio" title="@{repeating_ambition-personal_$X_ac-4}"/>
|
||
<input class="clock-radio clock-18" name="attr_ac-4" value="18" type="radio" title="@{repeating_ambition-personal_$X_ac-4}"/>
|
||
<div class="clock-face"></div>
|
||
</div>
|
||
</div>
|
||
<div class="clock_6">
|
||
<div class="clock-section" name="attr_clock" title="@{repeating_ambition-personal_$X_clock}">
|
||
<input class="clock-radio clock-0" name="attr_ac-6" value="0" type="radio" title="@{repeating_ambition-personal_$X_ac-6}"/>
|
||
<input class="clock-radio clock-4" name="attr_ac-6" value="4" type="radio" title="@{repeating_ambition-personal_$X_ac-6}"/>
|
||
<input class="clock-radio clock-8" name="attr_ac-6" value="8" type="radio" title="@{repeating_ambition-personal_$X_ac-6}"/>
|
||
<input class="clock-radio clock-12" name="attr_ac-6" value="12" type="radio" title="@{repeating_ambition-personal_$X_ac-6}"/>
|
||
<input class="clock-radio clock-16" name="attr_ac-6" value="16" type="radio" title="@{repeating_ambition-personal_$X_ac-6}"/>
|
||
<input class="clock-radio clock-20" name="attr_ac-6" value="20" type="radio" title="@{repeating_ambition-personal_$X_ac-6}"/>
|
||
<div class="clock-face"></div>
|
||
</div>
|
||
</div>
|
||
<div class="clock_8">
|
||
<div class="clock-section" name="attr_clock" title="@{repeating_ambition-personal_$X_clock}">
|
||
<input class="clock-radio clock-0" name="attr_ac-8" value="0" type="radio" title="@{repeating_ambition-personal_$X_ac-8}"/>
|
||
<input class="clock-radio clock-3" name="attr_ac-8" value="3" type="radio" title="@{repeating_ambition-personal_$X_ac-8}"/>
|
||
<input class="clock-radio clock-6" name="attr_ac-8" value="6" type="radio" title="@{repeating_ambition-personal_$X_ac-8}"/>
|
||
<input class="clock-radio clock-9" name="attr_ac-8" value="9" type="radio" title="@{repeating_ambition-personal_$X_ac-8}"/>
|
||
<input class="clock-radio clock-12" name="attr_ac-8" value="12" type="radio" title="@{repeating_ambition-personal_$X_ac-8}"/>
|
||
<input class="clock-radio clock-15" name="attr_ac-8" value="15" type="radio" title="@{repeating_ambition-personal_$X_ac-8}"/>
|
||
<input class="clock-radio clock-18" name="attr_ac-8" value="18" type="radio" title="@{repeating_ambition-personal_$X_ac-8}"/>
|
||
<input class="clock-radio clock-21" name="attr_ac-8" value="21" type="radio" title="@{repeating_ambition-personal_$X_ac-8}"/>
|
||
<div class="clock-face"></div>
|
||
</div>
|
||
</div>
|
||
<div class="clock_10">
|
||
<div class="clock-section" name="attr_clock" title="@{repeating_ambition-personal_$X_clock}">
|
||
<input class="clock-radio clock-0" name="attr_ac-10" value="0" type="radio" title="@{repeating_ambition-personal_$X_ac-10}"/>
|
||
<input class="clock-radio clock-2" name="attr_ac-10" value="2" type="radio" title="@{repeating_ambition-personal_$X_ac-10}"/>
|
||
<input class="clock-radio clock-5" name="attr_ac-10" value="5" type="radio" title="@{repeating_ambition-personal_$X_ac-10}"/>
|
||
<input class="clock-radio clock-7" name="attr_ac-10" value="7" type="radio" title="@{repeating_ambition-personal_$X_ac-10}"/>
|
||
<input class="clock-radio clock-10" name="attr_ac-10" value="10" type="radio" title="@{repeating_ambition-personal_$X_ac-10}"/>
|
||
<input class="clock-radio clock-12" name="attr_ac-10" value="12" type="radio" title="@{repeating_ambition-personal_$X_ac-10}"/>
|
||
<input class="clock-radio clock-14" name="attr_ac-10" value="14" type="radio" title="@{repeating_ambition-personal_$X_ac-10}"/>
|
||
<input class="clock-radio clock-17" name="attr_ac-10" value="17" type="radio" title="@{repeating_ambition-personal_$X_ac-10}"/>
|
||
<input class="clock-radio clock-19" name="attr_ac-10" value="19" type="radio" title="@{repeating_ambition-personal_$X_ac-10}"/>
|
||
<input class="clock-radio clock-22" name="attr_ac-10" value="22" type="radio" title="@{repeating_ambition-personal_$X_ac-10}"/>
|
||
<div class="clock-face"></div>
|
||
</div>
|
||
</div>
|
||
<div class="clock_12">
|
||
<div class="clock-section" name="attr_clock" title="@{repeating_ambition-personal_$X_clock}">
|
||
<input class="clock-radio clock-0" name="attr_ac-12" value="0" type="radio" title="@{repeating_ambition-personal_$X_ac-12}"/>
|
||
<input class="clock-radio clock-1" name="attr_ac-12" value="1" type="radio" title="@{repeating_ambition-personal_$X_ac-12}"/>
|
||
<input class="clock-radio clock-4" name="attr_ac-12" value="4" type="radio" title="@{repeating_ambition-personal_$X_ac-12}"/>
|
||
<input class="clock-radio clock-6" name="attr_ac-12" value="6" type="radio" title="@{repeating_ambition-personal_$X_ac-12}"/>
|
||
<input class="clock-radio clock-8" name="attr_ac-12" value="8" type="radio" title="@{repeating_ambition-personal_$X_ac-12}"/>
|
||
<input class="clock-radio clock-11" name="attr_ac-12" value="11" type="radio" title="@{repeating_ambition-personal_$X_ac-12}"/>
|
||
<input class="clock-radio clock-12" name="attr_ac-12" value="12" type="radio" title="@{repeating_ambition-personal_$X_ac-12}"/>
|
||
<input class="clock-radio clock-13" name="attr_ac-12" value="13" type="radio" title="@{repeating_ambition-personal_$X_ac-12}"/>
|
||
<input class="clock-radio clock-16" name="attr_ac-12" value="16" type="radio" title="@{repeating_ambition-personal_$X_ac-12}"/>
|
||
<input class="clock-radio clock-18" name="attr_ac-12" value="18" type="radio" title="@{repeating_ambition-personal_$X_ac-12}"/>
|
||
<input class="clock-radio clock-20" name="attr_ac-12" value="20" type="radio" title="@{repeating_ambition-personal_$X_ac-12}"/>
|
||
<input class="clock-radio clock-23" name="attr_ac-12" value="23" type="radio" title="@{repeating_ambition-personal_$X_ac-12}"/>
|
||
<div class="clock-face"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="flex-box row center">
|
||
<textarea class="textarea-6 ambition fixed" name="attr_notes" data-i18n-placeholder="personal ambition desc" title="@{repeating_ambition-personal_$X_notes}"></textarea>
|
||
<button class="roll-quote" name="roll_quote" type="roll" value="&{template:icon} {{name=personal ambition}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{text=@{notes}}}" title="%{repeating_ambition-personal_$X_quote}">
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</fieldset>
|
||
<label class="input-label"><span class="normal input-label__text" data-i18n="group name" role="heading" aria-level="3"></span>
|
||
<input class="underlined h3-style-input center input-label__input" name="attr_group_name" type="text" data-i18n-placeholder="NA" title="@{group_name}"/>
|
||
</label>
|
||
<fieldset class="repeating_ambition-group">
|
||
<div class="flex-box row justify-end">
|
||
<div class="flex-box col no-gap">
|
||
<label class="input-label dropdown stat" style="width:100px; margin:0px;"><span class="capitalize smallcaps input-label__text" data-i18n="size" style="width:50px;"></span>
|
||
<select class="input-label__input" name="attr_clock-size" title="@{repeating_ambition-group_$X_clock-size}">
|
||
<option value="4">4</option>
|
||
<option value="6">6</option>
|
||
<option value="8">8</option>
|
||
<option value="10">10</option>
|
||
<option value="12">12</option>
|
||
</select>
|
||
</label>
|
||
<div class="clock small-clock">
|
||
<input class="clock-switch" name="attr_clock-size" value="4" type="hidden" title="@{repeating_ambition-group_$X_clock-size}"/>
|
||
<div class="clock_4">
|
||
<div class="clock-section" name="attr_clock" title="@{repeating_ambition-group_$X_clock}">
|
||
<input class="clock-radio clock-0" name="attr_ac-4" value="0" type="radio" title="@{repeating_ambition-group_$X_ac-4}"/>
|
||
<input class="clock-radio clock-6" name="attr_ac-4" value="6" type="radio" title="@{repeating_ambition-group_$X_ac-4}"/>
|
||
<input class="clock-radio clock-12" name="attr_ac-4" value="12" type="radio" title="@{repeating_ambition-group_$X_ac-4}"/>
|
||
<input class="clock-radio clock-18" name="attr_ac-4" value="18" type="radio" title="@{repeating_ambition-group_$X_ac-4}"/>
|
||
<div class="clock-face"></div>
|
||
</div>
|
||
</div>
|
||
<div class="clock_6">
|
||
<div class="clock-section" name="attr_clock" title="@{repeating_ambition-group_$X_clock}">
|
||
<input class="clock-radio clock-0" name="attr_ac-6" value="0" type="radio" title="@{repeating_ambition-group_$X_ac-6}"/>
|
||
<input class="clock-radio clock-4" name="attr_ac-6" value="4" type="radio" title="@{repeating_ambition-group_$X_ac-6}"/>
|
||
<input class="clock-radio clock-8" name="attr_ac-6" value="8" type="radio" title="@{repeating_ambition-group_$X_ac-6}"/>
|
||
<input class="clock-radio clock-12" name="attr_ac-6" value="12" type="radio" title="@{repeating_ambition-group_$X_ac-6}"/>
|
||
<input class="clock-radio clock-16" name="attr_ac-6" value="16" type="radio" title="@{repeating_ambition-group_$X_ac-6}"/>
|
||
<input class="clock-radio clock-20" name="attr_ac-6" value="20" type="radio" title="@{repeating_ambition-group_$X_ac-6}"/>
|
||
<div class="clock-face"></div>
|
||
</div>
|
||
</div>
|
||
<div class="clock_8">
|
||
<div class="clock-section" name="attr_clock" title="@{repeating_ambition-group_$X_clock}">
|
||
<input class="clock-radio clock-0" name="attr_ac-8" value="0" type="radio" title="@{repeating_ambition-group_$X_ac-8}"/>
|
||
<input class="clock-radio clock-3" name="attr_ac-8" value="3" type="radio" title="@{repeating_ambition-group_$X_ac-8}"/>
|
||
<input class="clock-radio clock-6" name="attr_ac-8" value="6" type="radio" title="@{repeating_ambition-group_$X_ac-8}"/>
|
||
<input class="clock-radio clock-9" name="attr_ac-8" value="9" type="radio" title="@{repeating_ambition-group_$X_ac-8}"/>
|
||
<input class="clock-radio clock-12" name="attr_ac-8" value="12" type="radio" title="@{repeating_ambition-group_$X_ac-8}"/>
|
||
<input class="clock-radio clock-15" name="attr_ac-8" value="15" type="radio" title="@{repeating_ambition-group_$X_ac-8}"/>
|
||
<input class="clock-radio clock-18" name="attr_ac-8" value="18" type="radio" title="@{repeating_ambition-group_$X_ac-8}"/>
|
||
<input class="clock-radio clock-21" name="attr_ac-8" value="21" type="radio" title="@{repeating_ambition-group_$X_ac-8}"/>
|
||
<div class="clock-face"></div>
|
||
</div>
|
||
</div>
|
||
<div class="clock_10">
|
||
<div class="clock-section" name="attr_clock" title="@{repeating_ambition-group_$X_clock}">
|
||
<input class="clock-radio clock-0" name="attr_ac-10" value="0" type="radio" title="@{repeating_ambition-group_$X_ac-10}"/>
|
||
<input class="clock-radio clock-2" name="attr_ac-10" value="2" type="radio" title="@{repeating_ambition-group_$X_ac-10}"/>
|
||
<input class="clock-radio clock-5" name="attr_ac-10" value="5" type="radio" title="@{repeating_ambition-group_$X_ac-10}"/>
|
||
<input class="clock-radio clock-7" name="attr_ac-10" value="7" type="radio" title="@{repeating_ambition-group_$X_ac-10}"/>
|
||
<input class="clock-radio clock-10" name="attr_ac-10" value="10" type="radio" title="@{repeating_ambition-group_$X_ac-10}"/>
|
||
<input class="clock-radio clock-12" name="attr_ac-10" value="12" type="radio" title="@{repeating_ambition-group_$X_ac-10}"/>
|
||
<input class="clock-radio clock-14" name="attr_ac-10" value="14" type="radio" title="@{repeating_ambition-group_$X_ac-10}"/>
|
||
<input class="clock-radio clock-17" name="attr_ac-10" value="17" type="radio" title="@{repeating_ambition-group_$X_ac-10}"/>
|
||
<input class="clock-radio clock-19" name="attr_ac-10" value="19" type="radio" title="@{repeating_ambition-group_$X_ac-10}"/>
|
||
<input class="clock-radio clock-22" name="attr_ac-10" value="22" type="radio" title="@{repeating_ambition-group_$X_ac-10}"/>
|
||
<div class="clock-face"></div>
|
||
</div>
|
||
</div>
|
||
<div class="clock_12">
|
||
<div class="clock-section" name="attr_clock" title="@{repeating_ambition-group_$X_clock}">
|
||
<input class="clock-radio clock-0" name="attr_ac-12" value="0" type="radio" title="@{repeating_ambition-group_$X_ac-12}"/>
|
||
<input class="clock-radio clock-1" name="attr_ac-12" value="1" type="radio" title="@{repeating_ambition-group_$X_ac-12}"/>
|
||
<input class="clock-radio clock-4" name="attr_ac-12" value="4" type="radio" title="@{repeating_ambition-group_$X_ac-12}"/>
|
||
<input class="clock-radio clock-6" name="attr_ac-12" value="6" type="radio" title="@{repeating_ambition-group_$X_ac-12}"/>
|
||
<input class="clock-radio clock-8" name="attr_ac-12" value="8" type="radio" title="@{repeating_ambition-group_$X_ac-12}"/>
|
||
<input class="clock-radio clock-11" name="attr_ac-12" value="11" type="radio" title="@{repeating_ambition-group_$X_ac-12}"/>
|
||
<input class="clock-radio clock-12" name="attr_ac-12" value="12" type="radio" title="@{repeating_ambition-group_$X_ac-12}"/>
|
||
<input class="clock-radio clock-13" name="attr_ac-12" value="13" type="radio" title="@{repeating_ambition-group_$X_ac-12}"/>
|
||
<input class="clock-radio clock-16" name="attr_ac-12" value="16" type="radio" title="@{repeating_ambition-group_$X_ac-12}"/>
|
||
<input class="clock-radio clock-18" name="attr_ac-12" value="18" type="radio" title="@{repeating_ambition-group_$X_ac-12}"/>
|
||
<input class="clock-radio clock-20" name="attr_ac-12" value="20" type="radio" title="@{repeating_ambition-group_$X_ac-12}"/>
|
||
<input class="clock-radio clock-23" name="attr_ac-12" value="23" type="radio" title="@{repeating_ambition-group_$X_ac-12}"/>
|
||
<div class="clock-face"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="flex-box row center">
|
||
<textarea class="textarea-6 ambition fixed" name="attr_notes" data-i18n-placeholder="group ambition desc" title="@{repeating_ambition-group_$X_notes}"></textarea>
|
||
<button class="roll-quote" name="roll_quote" type="roll" value="&{template:icon} {{name=group ambition}} {{character_name=@{group_name}}} {{text=@{notes}}}" title="%{repeating_ambition-group_$X_quote}">
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</fieldset>
|
||
<div class="hide-note">
|
||
<p class="bold capitalize" data-i18n="ambition action roll"></p>
|
||
<input class="collapse" value="0" name="attr_collapse-ambition" type="checkbox" title="@{collapse-ambition}"/>
|
||
<div class="notes expanded">
|
||
<p class="indent bullet" data-i18n="ambition reminder line 1"></p>
|
||
<p class="indent bullet" data-i18n="ambition reminder line 2"></p>
|
||
<p class="indent bullet" data-i18n="ambition reminder line 3"></p>
|
||
<p class="indent bullet" data-i18n="ambition reminder line 4"></p>
|
||
<p data-i18n="ambition reminder line 0"></p>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<section class="camp span-2 long-2" id="camp">
|
||
<input class="h1-style-input" name="attr_camp_name" value="camp" readonly="readonly" title="@{camp_name}"/>
|
||
<textarea class="serif emph textarea-5" name="attr_camp_description" spellcheck="false" data-i18n-placeholder="describe your camp" title="@{camp_description}"></textarea>
|
||
<h3 data-i18n="fixtures"></h3>
|
||
<fieldset class="repeating_fixtures">
|
||
<input class="h3-style-input underlined big" name="attr_name" data-i18n-placeholder="fixture" type="text" title="@{repeating_fixtures_$X_name}"/>
|
||
<textarea class="serif emph small textarea-3" name="attr_description" spellcheck="false" data-i18n-placeholder="fixture description" title="@{repeating_fixtures_$X_description}"></textarea>
|
||
<textarea class="small textarea-4" name="attr_effects" data-i18n-placeholder="fixture effects" title="@{repeating_fixtures_$X_effects}"></textarea>
|
||
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_fixtures_$X_collapse}"/>
|
||
<div class="grid___3col half-gap center notes expanded">
|
||
<input class="ability-info underlined capitalize center" name="attr_cost" data-i18n-placeholder="purchase cost" type="text" title="@{repeating_fixtures_$X_cost}"/>
|
||
<input class="ability-info underlined capitalize center" name="attr_upgrade" data-i18n-placeholder="upgrade cost" type="text" title="@{repeating_fixtures_$X_upgrade}"/>
|
||
<input class="ability-info underlined capitalize center dust" name="attr_invested" data-i18n-placeholder="total invested" type="text" title="@{repeating_fixtures_$X_invested}"/>
|
||
<textarea class="small textarea-6" name="attr_upgrades" data-i18n-placeholder="upgrade effects" title="@{repeating_fixtures_$X_upgrades}"></textarea>
|
||
</div>
|
||
</fieldset>
|
||
</section>
|
||
<section class="kin-culture span-2" id="kin-culture">
|
||
<input class="h1-style-input" name="attr_kin" data-i18n-placeholder="kin" readonly="readonly" title="@{kin}"/>
|
||
<textarea class="textarea-5" name="attr_kin_notes" data-i18n-placeholder="write about your kin" spellcheck="false" title="@{kin_notes}"></textarea>
|
||
<input class="h1-style-input" name="attr_culture" data-i18n-placeholder="culture" readonly="readonly" title="@{culture}"/>
|
||
<textarea class="textarea-5" name="attr_culture_notes" data-i18n-placeholder="write about your culture" spellcheck="false" title="@{culture_notes}"></textarea>
|
||
</section>
|
||
<section class="notes span-2" id="notes">
|
||
<h1 data-i18n="notes"></h1>
|
||
<div class="flex-box">
|
||
<textarea class="textarea-3" name="attr_notes" data-i18n-placeholder="write anything you want here" title="@{notes}"></textarea>
|
||
<button class="roll-quote" name="roll_quote" type="roll" value="&{template:icon} {{name=additional notes}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{text=@{notes}}}" title="%{quote}">
|
||
</button>
|
||
</div>
|
||
<fieldset class="repeating_additional-notes">
|
||
<div class="flex-box">
|
||
<textarea class="textarea-4" name="attr_notes" data-i18n-placeholder="write any additional notes here" title="@{repeating_additional-notes_$X_notes}"></textarea>
|
||
<button class="roll-quote" name="roll_quote" type="roll" value="&{template:icon} {{name=additional notes}} {{character_name=@{character_name}}} {{character_id=@{character_id}}} {{text=@{notes}}}" title="%{repeating_additional-notes_$X_quote}">
|
||
</button>
|
||
</div>
|
||
</fieldset>
|
||
</section>
|
||
<section class="possessions span-2" id="possessions">
|
||
<h1 data-i18n="possessions"></h1>
|
||
<fieldset class="repeating_possessions">
|
||
<textarea class="textarea-4" name="attr_items" data-i18n-placeholder="possessions textarea" title="@{repeating_possessions_$X_items}"></textarea>
|
||
</fieldset>
|
||
<h3 data-i18n="resources"></h3>
|
||
<div class="repcol">
|
||
<fieldset class="repeating_resource">
|
||
<div class="wealth grid__3col boxed center">
|
||
<input class="h3-style-input" name="attr_no" type="number" title="@{repeating_resource_$X_no}"/>
|
||
<p class="colon"></p>
|
||
<input class="wealth" name="attr_info" data-i18n-placeholder="additional resource" type="text" title="@{repeating_resource_$X_info}"/>
|
||
</div>
|
||
</fieldset>
|
||
</div>
|
||
</section>
|
||
<div class="span-2">
|
||
<section class="reminders" id="reminders">
|
||
<div class="hide-note">
|
||
<h1 data-i18n="reminders"></h1>
|
||
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{collapse}"/>
|
||
<div class="notes expanded">
|
||
<h3 data-i18n="interludes"></h3>
|
||
<p class="indent bullet" data-i18n="interlude reminder line 1"></p>
|
||
<p class="indent bullet" data-i18n="interlude reminder line 2"></p>
|
||
<p class="indent bullet" data-i18n="interlude reminder line 3"></p>
|
||
<p class="indent bullet" data-i18n="interlude reminder line 4"></p>
|
||
</div>
|
||
</div>
|
||
<p class="center smaller" data-i18n="rules reminders info line 0"></p>
|
||
</section>
|
||
</div>
|
||
</section>
|
||
</article>
|
||
<article class="roster paper-background nav-display" id="roster">
|
||
<section id="auto-fill">
|
||
<section class="npcs span-all top-margin" id="npcs">
|
||
<h1 data-i18n="foes_allies"></h1>
|
||
<div class="repcol npc">
|
||
<fieldset class="repeating_npc">
|
||
<div class="grid__3col no-gap">
|
||
<input class="color-control" name="attr_class" value="mob" type="hidden" title="@{repeating_npc_$X_class}"/>
|
||
<select class="serif color-receiver center job-h1-receiver" name="attr_chapter" title="@{repeating_npc_$X_chapter}">
|
||
<option value="0">—</option>
|
||
<option value="1">Ⅰ</option>
|
||
<option value="2">Ⅱ</option>
|
||
<option value="3">Ⅲ</option>
|
||
<option value="4">Ⅳ</option>
|
||
</select>
|
||
<input class="color-control" name="attr_class" value="mob" type="hidden" title="@{repeating_npc_$X_class}"/>
|
||
<input class="h3-style-input color-receiver center job-h1-receiver" name="attr_name" data-i18n-placeholder="npc_summon_foe" type="text" title="@{repeating_npc_$X_name}"/>
|
||
<div class="color-selector">
|
||
<input class="color-control" name="attr_class" value="mob" type="hidden" title="@{repeating_npc_$X_class}"/>
|
||
<select class="color-selector color-receiver" name="attr_class" style="height:39px; width:100%;" title="@{repeating_npc_$X_class}">
|
||
<option value="unique" data-i18n="unique">
|
||
</option>
|
||
<option value="heavy" data-i18n="heavy">
|
||
</option>
|
||
<option value="skirmisher" data-i18n="skirmisher">
|
||
</option>
|
||
<option value="leader" data-i18n="leader">
|
||
</option>
|
||
<option value="artillery" data-i18n="artillery">
|
||
</option>
|
||
<option value="mob" data-i18n="mob" selected="selected">
|
||
</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
<div class="character-details boxed well-padded">
|
||
<div class="grid__2col half-gap span-1" style="position:relative; top:-8px;">
|
||
<section class="npc half-gap" id="stats">
|
||
<label class="input-label" style="width:50%;"><span class="smallcaps input-label__text" data-i18n="hp" role="heading" aria-level="5"></span>
|
||
<input class="info-label underlined input-label__input" name="attr_hp" type="number" style="min-width:80px;" title="@{repeating_npc_$X_hp}"/>
|
||
</label>
|
||
<label class="input-label" style="width:50%;"><span class="smallcaps input-label__text" data-i18n="hp_max" role="heading" aria-level="5"></span>
|
||
<input class="info-label underlined input-label__input" name="attr_hp_max" type="number" style="min-width:80px;" title="@{repeating_npc_$X_hp|max}"/>
|
||
</label>
|
||
<label class="input-label" style="width:50%;"><span class="smallcaps input-label__text" data-i18n="def" role="heading" aria-level="5"></span>
|
||
<input class="info-label underlined input-label__input" name="attr_def" type="number" style="min-width:80px;" title="@{repeating_npc_$X_def}"/>
|
||
</label>
|
||
<label class="input-label" style="width:50%;"><span class="smallcaps input-label__text" data-i18n="vit" role="heading" aria-level="5"></span>
|
||
<input class="info-label underlined input-label__input" name="attr_vit" type="number" style="min-width:80px;" title="@{repeating_npc_$X_vit}"/>
|
||
</label>
|
||
</section>
|
||
<section class="npc half-gap" id="stats">
|
||
<label class="input-label" style="width:50%;"><span class="smallcaps input-label__text" data-i18n="spd" role="heading" aria-level="5"></span>
|
||
<input class="info-label underlined input-label__input" name="attr_spd" type="number" style="min-width:80px;" value="1" title="@{repeating_npc_$X_spd}"/>
|
||
</label>
|
||
<label class="input-label" style="width:50%;"><span class="smallcaps input-label__text" data-i18n="dash" role="heading" aria-level="5"></span>
|
||
<input class="info-label underlined input-label__input" name="attr_dash" type="number" style="min-width:80px;" value="1" title="@{repeating_npc_$X_dash}"/>
|
||
</label>
|
||
<div class="chapter-select">
|
||
<label class="input-label" style="height:26px;"><span class="smallcaps input-label__text" data-i18n="dmg" role="heading" aria-level="5"></span>
|
||
<select class="input-label__input underlined chapter-select damage-die" name="attr_damage" title="@{repeating_npc_$X_damage}">
|
||
<option value="2">d2
|
||
</option>
|
||
<option value="4" selected="selected">d4
|
||
</option>
|
||
<option value="6">d6
|
||
</option>
|
||
<option value="8">d8
|
||
</option>
|
||
<option value="10">d10
|
||
</option>
|
||
<option value="12">d12
|
||
</option>
|
||
</select>
|
||
</label>
|
||
</div>
|
||
<label class="input-label" style="width:50%;"><span class="smallcaps input-label__text" data-i18n="fray" role="heading" aria-level="5"></span>
|
||
<input class="info-label underlined input-label__input" name="attr_fray" type="number" style="min-width:80px;" value="1" title="@{repeating_npc_$X_fray}"/>
|
||
</label>
|
||
</section>
|
||
</div>
|
||
</div>
|
||
<textarea class="serif emph textarea-3" name="attr_description" data-i18n-placeholder="creature description or powers" spellcheck="false" title="@{repeating_npc_$X_description}"></textarea>
|
||
<div class="grid___3col half-gap center">
|
||
<input class="ability-info underlined capitalize right" name="attr_info-a" type="text" title="@{repeating_npc_$X_info-a}"/>
|
||
<input class="ability-info underlined capitalize center" name="attr_info-b" placeholder="⬧" type="text" title="@{repeating_npc_$X_info-b}"/>
|
||
<input class="ability-info underlined capitalize left" name="attr_info-c" type="text" title="@{repeating_npc_$X_info-c}"/>
|
||
</div>
|
||
<textarea class="textarea-4" name="attr_abilities" data-i18n-placeholder="ability text" title="@{repeating_npc_$X_abilities}"></textarea>
|
||
<div class="grid__4col half-gap">
|
||
<div class="grid__2col">
|
||
<p class="capitalize mono bold relative" data-i18n="whisper" style="left: 15px; bottom: -5px;"></p>
|
||
<input class="checkbox whisper orange tick" name="attr_whisper" value="/w gm" type="checkbox" title="@{repeating_npc_$X_whisper}"/>
|
||
</div>
|
||
<button class="relative smallcaps die" name="roll_quote" style="bottom:3px;" type="roll" role="heading" aria-level="4" data-i18n="quote" value="@{whisper} &{template:icon} {{name=@{name}}} {{character_name=@{class} (Ch. @{chapter})}} {{description=@{description}}} {{summary=@{info-b}}} {{info=@{info-a} ⬧ @{info-c}}} {{effect=@{abilities}}} {{talent=@{additional}}}" title="%{repeating_npc_$X_quote}">
|
||
</button>
|
||
<button class="relative smallcaps die" name="roll_save" style="bottom:3px;" type="roll" role="heading" aria-level="4" data-i18n="save" value="@{whisper} &{template:icon} {{name=@{name}}} {{character_name=@{class} (Ch. @{chapter})}} {{roll_name=Save}} {{roll=[[1d20@{boons}]]}} {{target=@{save_target}}}" title="%{repeating_npc_$X_save}">
|
||
</button>
|
||
<button class="relative smallcaps die" name="roll_attack" style="bottom:3px;" type="roll" role="heading" aria-level="4" data-i18n="attack" value="@{whisper} &{template:icon} {{name=@{name}}} {{character_name=@{class} (Ch. @{chapter})}} {{roll_name=Attack}} {{roll=[[1d20@{boons}]]}} {{range=[[?{Range|1}]]}} {{damage=[[?{Light / Heavy|Light,1d@{damage}+@{fray}|Heavy,@{ratio_heavy}d@{damage}+@{fray}}]]}} {{bonus_damage=[[0]]}} {{crit_damage=[[1d@{damage}]]}} {{miss_damage=[[@{fray}]]}}" title="%{repeating_npc_$X_attack}">
|
||
</button>
|
||
</div>
|
||
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_npc_$X_collapse}"/>
|
||
<div class="grid__2col half-gap notes expanded">
|
||
<div class="flex-box boxed well-padded center span-2">
|
||
<textarea class="textarea-4" name="attr_additional" data-i18n-placeholder="additional notes or abilities" title="@{repeating_npc_$X_additional}"></textarea>
|
||
</div>
|
||
<div class="grid__2col center">
|
||
<input class="h3-style-input underlined" name="attr_number" type="number" title="@{repeating_npc_$X_number}"/>
|
||
<p class="colon"></p>
|
||
</div>
|
||
<input class="h3-style-input underlined short-text" name="attr_resource" style="min-width:40px;" type="text" title="@{repeating_npc_$X_resource}"/>
|
||
</div>
|
||
</fieldset>
|
||
</div>
|
||
</section>
|
||
<section class="add-abilities long-2" id="add-abilities">
|
||
<h1 data-i18n="additional abilities"></h1>
|
||
<fieldset class="repeating_add-abilities">
|
||
<div class="grid__3col no-gap">
|
||
<input class="color-control" name="attr_class" value="inactive" type="hidden" title="@{repeating_add-abilities_$X_class}"/>
|
||
<div class="flex-box color-receiver center" style="height:39px!important;"><span class="center" style="width:39px!important; height:39px!important;">
|
||
<button class="roll-d20 center col" name="roll_use" value="&{template:icon} {{name=@{name}}} {{character_name=@{class} Ability}} {{summary=@{info-b}}} {{info=@{info-a} ⬧ @{info-c}}} {{effect=@{effects}}}" title="%{repeating_add-abilities_$X_use}" type="roll">
|
||
</button></span>
|
||
</div>
|
||
<input class="color-control" name="attr_class" value="inactive" type="hidden" title="@{repeating_add-abilities_$X_class}"/>
|
||
<input class="h3-style-input color-receiver center job-h1-receiver" name="attr_name" data-i18n-placeholder="ability" type="text" title="@{repeating_add-abilities_$X_name}"/>
|
||
<div class="color-selector">
|
||
<input class="color-control" name="attr_class" value="inactive" type="hidden" title="@{repeating_add-abilities_$X_class}"/>
|
||
<select class="color-selector color-receiver" name="attr_class" style="height:39px; width:100%;" title="@{repeating_add-abilities_$X_class}">
|
||
<option value="unique" data-i18n="unique">
|
||
</option>
|
||
<option value="heavy" data-i18n="heavy">
|
||
</option>
|
||
<option value="skirmisher" data-i18n="skirmisher">
|
||
</option>
|
||
<option value="leader" data-i18n="leader">
|
||
</option>
|
||
<option value="artillery" data-i18n="artillery">
|
||
</option>
|
||
<option value="mob" data-i18n="mob" selected="selected">
|
||
</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
<div class="grid___3col half-gap center">
|
||
<input class="ability-info underlined capitalize right" name="attr_info-a" type="text" title="@{repeating_add-abilities_$X_info-a}"/>
|
||
<input class="ability-info underlined capitalize center" name="attr_info-b" placeholder="⬧" type="text" title="@{repeating_add-abilities_$X_info-b}"/>
|
||
<input class="ability-info underlined capitalize left" name="attr_info-c" type="text" title="@{repeating_add-abilities_$X_info-c}"/>
|
||
</div>
|
||
<textarea class="small textarea-5" name="attr_effects" data-i18n-placeholder="ability effects" title="@{repeating_add-abilities_$X_effects}"></textarea>
|
||
</fieldset>
|
||
</section>
|
||
<section class="clocks" id="clocks">
|
||
<h1 data-i18n="clocks"></h1>
|
||
<fieldset class="repeating_general-clock">
|
||
<div class="grid__2col">
|
||
<div class="flex-box col no-gap">
|
||
<label class="input-label dropdown stat" style="width:100px; margin:0px;"><span class="capitalize smallcaps input-label__text" data-i18n="size" style="width:50px;"></span>
|
||
<select class="input-label__input" name="attr_size" title="@{repeating_general-clock_$X_size}">
|
||
<option value="4">4</option>
|
||
<option value="6">6</option>
|
||
<option value="8">8</option>
|
||
<option value="10">10</option>
|
||
<option value="12">12</option>
|
||
</select>
|
||
</label>
|
||
<div class="clock">
|
||
<input class="clock-switch" name="attr_size" value="4" type="hidden" title="@{repeating_general-clock_$X_size}"/>
|
||
<div class="clock_4">
|
||
<div class="clock-section" name="attr_clock" title="@{repeating_general-clock_$X_clock}">
|
||
<input class="clock-radio clock-0" name="attr_gc-4" value="0" type="radio" title="@{repeating_general-clock_$X_gc-4}"/>
|
||
<input class="clock-radio clock-6" name="attr_gc-4" value="6" type="radio" title="@{repeating_general-clock_$X_gc-4}"/>
|
||
<input class="clock-radio clock-12" name="attr_gc-4" value="12" type="radio" title="@{repeating_general-clock_$X_gc-4}"/>
|
||
<input class="clock-radio clock-18" name="attr_gc-4" value="18" type="radio" title="@{repeating_general-clock_$X_gc-4}"/>
|
||
<div class="clock-face"></div>
|
||
</div>
|
||
</div>
|
||
<div class="clock_6">
|
||
<div class="clock-section" name="attr_clock" title="@{repeating_general-clock_$X_clock}">
|
||
<input class="clock-radio clock-0" name="attr_gc-6" value="0" type="radio" title="@{repeating_general-clock_$X_gc-6}"/>
|
||
<input class="clock-radio clock-4" name="attr_gc-6" value="4" type="radio" title="@{repeating_general-clock_$X_gc-6}"/>
|
||
<input class="clock-radio clock-8" name="attr_gc-6" value="8" type="radio" title="@{repeating_general-clock_$X_gc-6}"/>
|
||
<input class="clock-radio clock-12" name="attr_gc-6" value="12" type="radio" title="@{repeating_general-clock_$X_gc-6}"/>
|
||
<input class="clock-radio clock-16" name="attr_gc-6" value="16" type="radio" title="@{repeating_general-clock_$X_gc-6}"/>
|
||
<input class="clock-radio clock-20" name="attr_gc-6" value="20" type="radio" title="@{repeating_general-clock_$X_gc-6}"/>
|
||
<div class="clock-face"></div>
|
||
</div>
|
||
</div>
|
||
<div class="clock_8">
|
||
<div class="clock-section" name="attr_clock" title="@{repeating_general-clock_$X_clock}">
|
||
<input class="clock-radio clock-0" name="attr_gc-8" value="0" type="radio" title="@{repeating_general-clock_$X_gc-8}"/>
|
||
<input class="clock-radio clock-3" name="attr_gc-8" value="3" type="radio" title="@{repeating_general-clock_$X_gc-8}"/>
|
||
<input class="clock-radio clock-6" name="attr_gc-8" value="6" type="radio" title="@{repeating_general-clock_$X_gc-8}"/>
|
||
<input class="clock-radio clock-9" name="attr_gc-8" value="9" type="radio" title="@{repeating_general-clock_$X_gc-8}"/>
|
||
<input class="clock-radio clock-12" name="attr_gc-8" value="12" type="radio" title="@{repeating_general-clock_$X_gc-8}"/>
|
||
<input class="clock-radio clock-15" name="attr_gc-8" value="15" type="radio" title="@{repeating_general-clock_$X_gc-8}"/>
|
||
<input class="clock-radio clock-18" name="attr_gc-8" value="18" type="radio" title="@{repeating_general-clock_$X_gc-8}"/>
|
||
<input class="clock-radio clock-21" name="attr_gc-8" value="21" type="radio" title="@{repeating_general-clock_$X_gc-8}"/>
|
||
<div class="clock-face"></div>
|
||
</div>
|
||
</div>
|
||
<div class="clock_10">
|
||
<div class="clock-section" name="attr_clock" title="@{repeating_general-clock_$X_clock}">
|
||
<input class="clock-radio clock-0" name="attr_gc-10" value="0" type="radio" title="@{repeating_general-clock_$X_gc-10}"/>
|
||
<input class="clock-radio clock-2" name="attr_gc-10" value="2" type="radio" title="@{repeating_general-clock_$X_gc-10}"/>
|
||
<input class="clock-radio clock-5" name="attr_gc-10" value="5" type="radio" title="@{repeating_general-clock_$X_gc-10}"/>
|
||
<input class="clock-radio clock-7" name="attr_gc-10" value="7" type="radio" title="@{repeating_general-clock_$X_gc-10}"/>
|
||
<input class="clock-radio clock-10" name="attr_gc-10" value="10" type="radio" title="@{repeating_general-clock_$X_gc-10}"/>
|
||
<input class="clock-radio clock-12" name="attr_gc-10" value="12" type="radio" title="@{repeating_general-clock_$X_gc-10}"/>
|
||
<input class="clock-radio clock-14" name="attr_gc-10" value="14" type="radio" title="@{repeating_general-clock_$X_gc-10}"/>
|
||
<input class="clock-radio clock-17" name="attr_gc-10" value="17" type="radio" title="@{repeating_general-clock_$X_gc-10}"/>
|
||
<input class="clock-radio clock-19" name="attr_gc-10" value="19" type="radio" title="@{repeating_general-clock_$X_gc-10}"/>
|
||
<input class="clock-radio clock-22" name="attr_gc-10" value="22" type="radio" title="@{repeating_general-clock_$X_gc-10}"/>
|
||
<div class="clock-face"></div>
|
||
</div>
|
||
</div>
|
||
<div class="clock_12">
|
||
<div class="clock-section" name="attr_clock" title="@{repeating_general-clock_$X_clock}">
|
||
<input class="clock-radio clock-0" name="attr_gc-12" value="0" type="radio" title="@{repeating_general-clock_$X_gc-12}"/>
|
||
<input class="clock-radio clock-1" name="attr_gc-12" value="1" type="radio" title="@{repeating_general-clock_$X_gc-12}"/>
|
||
<input class="clock-radio clock-4" name="attr_gc-12" value="4" type="radio" title="@{repeating_general-clock_$X_gc-12}"/>
|
||
<input class="clock-radio clock-6" name="attr_gc-12" value="6" type="radio" title="@{repeating_general-clock_$X_gc-12}"/>
|
||
<input class="clock-radio clock-8" name="attr_gc-12" value="8" type="radio" title="@{repeating_general-clock_$X_gc-12}"/>
|
||
<input class="clock-radio clock-11" name="attr_gc-12" value="11" type="radio" title="@{repeating_general-clock_$X_gc-12}"/>
|
||
<input class="clock-radio clock-12" name="attr_gc-12" value="12" type="radio" title="@{repeating_general-clock_$X_gc-12}"/>
|
||
<input class="clock-radio clock-13" name="attr_gc-12" value="13" type="radio" title="@{repeating_general-clock_$X_gc-12}"/>
|
||
<input class="clock-radio clock-16" name="attr_gc-12" value="16" type="radio" title="@{repeating_general-clock_$X_gc-12}"/>
|
||
<input class="clock-radio clock-18" name="attr_gc-12" value="18" type="radio" title="@{repeating_general-clock_$X_gc-12}"/>
|
||
<input class="clock-radio clock-20" name="attr_gc-12" value="20" type="radio" title="@{repeating_general-clock_$X_gc-12}"/>
|
||
<input class="clock-radio clock-23" name="attr_gc-12" value="23" type="radio" title="@{repeating_general-clock_$X_gc-12}"/>
|
||
<div class="clock-face"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="flex-box col no-gap">
|
||
<div class="flex-box row center span-all">
|
||
<input class="h3-style-input center" name="attr_name" data-i18n-placeholder="clock name" aria-level="3" type="text" title="@{repeating_general-clock_$X_name}"/>
|
||
<button class="roll-quote relative" name="roll_quote" type="roll" value="&{template:icon} {{name=@{name} clock}} {{character_name=Size @{size}}} {{text=@{notes}}}" style="left:-4px;" title="%{repeating_general-clock_$X_quote}">
|
||
</button>
|
||
</div>
|
||
<div class="flex-box row center">
|
||
<textarea class="textarea-6 ambition fixed" name="attr_notes" data-i18n-placeholder="write any notes about this clock" style="width:100%;" title="@{repeating_general-clock_$X_notes}"></textarea>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</fieldset>
|
||
</section>
|
||
<section class="reminders" id="reminders">
|
||
<div class="hide-note">
|
||
<h1 data-i18n="reminders"></h1>
|
||
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{collapse}"/>
|
||
<div class="notes expanded">
|
||
<h3 data-i18n="interludes"></h3>
|
||
<p class="indent bullet" data-i18n="interlude reminder line 1"></p>
|
||
<p class="indent bullet" data-i18n="interlude reminder line 2"></p>
|
||
<p class="indent bullet" data-i18n="interlude reminder line 3"></p>
|
||
<p class="indent bullet" data-i18n="interlude reminder line 4"></p>
|
||
</div>
|
||
</div>
|
||
<p class="center smaller" data-i18n="rules reminders info line 0"></p>
|
||
</section>
|
||
</section>
|
||
</article>
|
||
<article class="settings paper-background nav-display" id="settings">
|
||
<section class="sheet-settings top-margin" id="sheet-settings">
|
||
<h1 data-i18n="sheet settings"></h1>
|
||
<label class="input-label"><span class="capitalize input-label__text" data-i18n="camp name" role="heading" aria-level="5"></span>
|
||
<input class="underlined capitalize input-label__input" name="attr_camp_name" type="text" value="camp" data-i18n-placeholder="camp" title="@{camp_name}"/>
|
||
</label>
|
||
<label class="input-label"><span class="capitalize input-label__text" data-i18n="tactics boons_curses prompt" role="heading" aria-level="5"></span>
|
||
<input class="underlined input-label__input" name="attr_boons" type="text" value="?{Boons / Curses|NA,+0|+2D,+2d6kh1|+1D,+1d6|−1D,-1d6|−2D,-2d6kh1}" data-i18n-placeholder="?{Boons / Curses|NA,+0|+2D,+2d6kh1|+1D,+1d6|−1D,-1d6|−2D,-2d6kh1}" title="@{boons}"/>
|
||
</label>
|
||
<p class="mono macro" style="top:0px;">@{boons}</p>
|
||
<input name="attr_curses" type="hidden" value="?{Boons / Curses|NA,+0|+2D,+2|+1D,+1|−1D,-1|−2D,-2}" title="@{curses}"/>
|
||
<section class="wide-gap" id="auto-fit">
|
||
<div class="flex-box span-2">
|
||
<label class="input-label"><span class="capitalize input-label__text" data-i18n="maxhp%" role="heading" aria-level="5"></span>
|
||
<input class="underlined input-label__input" name="attr_ratio_max_hp" type="number" value="4" title="@{ratio_max_hp}"/>
|
||
</label>
|
||
<p class="mono macro">@{ratio_max_hp}</p>
|
||
</div>
|
||
<div class="flex-box span-2">
|
||
<label class="input-label"><span class="capitalize input-label__text" data-i18n="heavy%" role="heading" aria-level="5"></span>
|
||
<input class="underlined input-label__input" name="attr_ratio_heavy" type="number" value="2" title="@{ratio_heavy}"/>
|
||
</label>
|
||
<p class="mono macro">@{ratio_heavy}</p>
|
||
</div>
|
||
<div class="flex-box span-2">
|
||
<label class="input-label"><span class="capitalize input-label__text" data-i18n="bloodied%" role="heading" aria-level="5"></span>
|
||
<input class="underlined input-label__input" name="attr_ratio_bloodied" type="number" value="0.5" title="@{ratio_bloodied}"/>
|
||
</label>
|
||
<p class="mono macro">@{ratio_bloodied}</p>
|
||
</div>
|
||
<div class="flex-box span-2">
|
||
<label class="input-label"><span class="capitalize input-label__text" data-i18n="dash%" role="heading" aria-level="5"></span>
|
||
<input class="underlined input-label__input" name="attr_ratio_dash" type="number" value="0.5" title="@{ratio_dash}"/>
|
||
</label>
|
||
<p class="mono macro">@{ratio_dash}</p>
|
||
</div>
|
||
</section>
|
||
</section>
|
||
<hr/>
|
||
<section class="sheet-links top-margin" id="sheet-links">
|
||
<div class="grid__3col">
|
||
<button class="relative serif uppercase die" name="roll_github" style="bottom:3px;" type="roll" role="heading" aria-level="5" data-i18n="report an issue" value="&{template:icon} {{name=github}} {{character_name=Sheet by Seraaron}} {{roll_name=Report an issue}} {{roll=[Click here!](https://github.com/Seraaron/roll20-character-sheets/issues)}}" title="%{github}">
|
||
</button>
|
||
<div class="flex-box">
|
||
<p class="mono bold center">Sheet v0.4 for ICON v1.45</p>
|
||
</div>
|
||
<button class="relative serif uppercase die" name="roll_tipee" style="bottom:3px;" type="roll" role="heading" aria-level="5" data-i18n="send a tip" value="&{template:icon} {{name=tipeee}} {{character_name=Sheet by Seraaron}} {{roll_name=Send me a tip}} {{roll=[Click here!](https://en.tipeee.com/seraaron/)}}" title="%{tipee}">
|
||
</button>
|
||
</div>
|
||
</section>
|
||
</article>
|
||
</main>
|
||
<rolltemplate class="sheet-rolltemplate-icon">
|
||
<div class="template icon">
|
||
<div class="header">{{#name}}
|
||
<h3>{{name}}</h3>{{/name}}{{#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}}
|
||
</div>{{#roll}}
|
||
<div class="template-row">
|
||
<div class="template-col">{{#roll_name}}
|
||
<h5>{{roll_name}}</h5>{{/roll_name}}{{^roll_name}}
|
||
<h5 data-i18n="roll"></h5>{{/roll_name}}
|
||
</div>
|
||
<div class="template-col sheet-center sheet-result">{{roll}}{{#target}}<span data-i18n="vs"></span>**{{target}}**{{/target}}
|
||
</div>
|
||
</div>{{/roll}}{{#hidden-calc}}
|
||
<div class="template-row">
|
||
<div class="template-col">
|
||
<h5 data-i18n="action roll"></h5>
|
||
</div>
|
||
<div class="template-col sheet-center sheet-result">
|
||
{{#rollGreater() hidden-calc 0}}{{action-roll0}}{{/rollGreater() hidden-calc 0}}
|
||
{{#rollLess() hidden-calc 1}}{{action-roll1}}{{/rollLess() hidden-calc 1}}
|
||
</div>
|
||
</div>{{/hidden-calc}}{{#range}}
|
||
<div class="template-row">
|
||
<div class="template-col">
|
||
<h5 class="capitalize" data-i18n="range"></h5>
|
||
</div>
|
||
<div class="template-col sheet-center sheet-result">{{range}}</div>
|
||
</div>{{/range}}{{#damage}}
|
||
<div class="template-row">
|
||
<div class="template-col">
|
||
<h5 class="capitalize" data-i18n="damage"></h5>
|
||
</div>
|
||
<div class="template-col sheet-center sheet-result">{{damage}}</div>
|
||
</div>
|
||
<div class="template-row--summary">{{#rollGreater() bonus_damage 0}}{{#bonus_damage}}
|
||
<div class="template-row">
|
||
<div class="template-col sheet-center">
|
||
<h5 data-i18n="bonus dmg"></h5>
|
||
</div>
|
||
<div class="template-col sheet-center sheet-result">{{bonus_damage}}</div>
|
||
</div>{{/bonus_damage}}{{/rollGreater() bonus_damage 0}}
|
||
{{#rollGreater() roll 19}}{{#crit_damage}}
|
||
<div class="template-row">
|
||
<div class="template-col sheet-center">
|
||
<h5 data-i18n="crit dmg"></h5>
|
||
</div>
|
||
<div class="template-col sheet-center sheet-result">{{crit_damage}}</div>
|
||
</div>{{/crit_damage}}{{/rollGreater() roll 19}}{{#miss_damage}}
|
||
<div class="template-row">
|
||
<div class="template-col sheet-center">
|
||
<h5 data-i18n="miss dmg"></h5>
|
||
</div>
|
||
<div class="template-col sheet-center sheet-result">{{miss_damage}}</div>
|
||
</div>{{/miss_damage}}
|
||
</div>{{/damage}}{{#text}}
|
||
<div class="template-row template-row--text"><span class="description">{{text}}</span></div>{{/text}}{{#summary}}
|
||
<div class="template-row template-row--summary">
|
||
<div class="template-col sheet-center">
|
||
<h5>{{summary}}</h5>
|
||
</div>
|
||
</div>{{/summary}}{{#info}}
|
||
<div class="template-row template-row--summary">
|
||
<div class="template-col sheet-center">
|
||
<h5>{{info}}</h5>
|
||
</div>
|
||
</div>{{/info}}{{#description}}
|
||
<div class="template-row template-row--text"><span class="description">*{{description}}*</span></div>{{/description}}{{#effect}}
|
||
<div class="template-row template-row--text"><span class="description">**{{effect}}**</span></div>{{/effect}}{{#talent}}
|
||
<div class="template-row">
|
||
<div class="template-col">
|
||
<h4 data-i18n="talent"></h4>{{talent}}
|
||
</div>
|
||
</div>{{/talent}}{{#mastery}}
|
||
<div class="template-row">
|
||
<div class="template-col">{{#mastery_name}}
|
||
<h4>{{mastery_name}}</h4>{{mastery}}{{/mastery_name}}{{^mastery_name}}
|
||
<h4 data-i18n="mastery"></h4>{{mastery}}{{/mastery_name}}
|
||
</div>
|
||
</div>{{/mastery}}{{#allprops() character_name character_id name roll_name roll target action-roll0 action-roll1 hidden-calc damage range bonus_damage crit_damage miss_damage effect description text talent mastery_name mastery sheet-result progress max summary info}}
|
||
<div class="template-row template-row--text">
|
||
<h5>{{key}}</h5><span class="description">{{value}}</span>
|
||
</div>{{/allprops() character_name character_id name roll_name roll target action-roll0 action-roll1 hidden-calc damage range bonus_damage crit_damage miss_damage effect description text talent mastery_name mastery sheet-result progress max summary info}}
|
||
</div>
|
||
</rolltemplate>
|
||
<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_template_start":{"name":"template_start","type":"hidden","defaultValue":"&{template:undefined} {{character_name=@{character_name}}} {{character_id=@{character_id}}}","triggeredFuncs":[],"affects":[]},"attr_collapsed":{"name":"collapsed","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_narrative":{"name":"narrative","type":"action"},"act_tactics":{"name":"tactics","type":"action"},"act_journal":{"name":"journal","type":"action"},"act_roster":{"name":"roster","type":"action"},"act_settings":{"name":"settings","type":"action"},"attr_sheet_state":{"name":"sheet_state","type":"hidden","defaultValue":"settings","triggeredFuncs":[],"affects":[]},"attr_kin":{"name":"kin","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_job":{"name":"job","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_class":{"name":"class","type":"hidden","defaultValue":"general","triggeredFuncs":[],"affects":[]},"attr_level":{"name":"level","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_gender":{"name":"gender","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_culture":{"name":"culture","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_bond":{"name":"bond","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_short_desc":{"name":"short_desc","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_effort":{"name":"effort","type":"number","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_effort_max":{"name":"effort_max","type":"hidden","defaultValue":"3","triggeredFuncs":[],"affects":[]},"attr_exhausted":{"name":"exhausted","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_strain":{"name":"strain","type":"number","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_strain_max":{"name":"strain_max","type":"hidden","defaultValue":"5","triggeredFuncs":[],"affects":[]},"attr_broken":{"name":"broken","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_charm":{"name":"charm","type":"label","defaultValue":"charm","triggeredFuncs":[],"affects":[]},"attr_charm_dice":{"name":"charm_dice","type":"number","defaultValue":"(@{charm_dots}+@{charm_knack}-@{charm_burden})","triggeredFuncs":[],"affects":[]},"attr_charm_dots":{"name":"charm_dots","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_charm_knack":{"name":"charm_knack","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_charm_burden":{"name":"charm_burden","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_command":{"name":"command","type":"label","defaultValue":"command","triggeredFuncs":[],"affects":[]},"attr_command_dice":{"name":"command_dice","type":"number","defaultValue":"(@{command_dots}+@{command_knack}-@{command_burden})","triggeredFuncs":[],"affects":[]},"attr_command_dots":{"name":"command_dots","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_command_knack":{"name":"command_knack","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_command_burden":{"name":"command_burden","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_endure":{"name":"endure","type":"label","defaultValue":"endure","triggeredFuncs":[],"affects":[]},"attr_endure_dice":{"name":"endure_dice","type":"number","defaultValue":"(@{endure_dots}+@{endure_knack}-@{endure_burden})","triggeredFuncs":[],"affects":[]},"attr_endure_dots":{"name":"endure_dots","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_endure_knack":{"name":"endure_knack","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_endure_burden":{"name":"endure_burden","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_excel":{"name":"excel","type":"label","defaultValue":"excel","triggeredFuncs":[],"affects":[]},"attr_excel_dice":{"name":"excel_dice","type":"number","defaultValue":"(@{excel_dots}+@{excel_knack}-@{excel_burden})","triggeredFuncs":[],"affects":[]},"attr_excel_dots":{"name":"excel_dots","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_excel_knack":{"name":"excel_knack","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_excel_burden":{"name":"excel_burden","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_sense":{"name":"sense","type":"label","defaultValue":"sense","triggeredFuncs":[],"affects":[]},"attr_sense_dice":{"name":"sense_dice","type":"number","defaultValue":"(@{sense_dots}+@{sense_knack}-@{sense_burden})","triggeredFuncs":[],"affects":[]},"attr_sense_dots":{"name":"sense_dots","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_sense_knack":{"name":"sense_knack","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_sense_burden":{"name":"sense_burden","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_smash":{"name":"smash","type":"label","defaultValue":"smash","triggeredFuncs":[],"affects":[]},"attr_smash_dice":{"name":"smash_dice","type":"number","defaultValue":"(@{smash_dots}+@{smash_knack}-@{smash_burden})","triggeredFuncs":[],"affects":[]},"attr_smash_dots":{"name":"smash_dots","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_smash_knack":{"name":"smash_knack","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_smash_burden":{"name":"smash_burden","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_sneak":{"name":"sneak","type":"label","defaultValue":"sneak","triggeredFuncs":[],"affects":[]},"attr_sneak_dice":{"name":"sneak_dice","type":"number","defaultValue":"(@{sneak_dots}+@{sneak_knack}-@{sneak_burden})","triggeredFuncs":[],"affects":[]},"attr_sneak_dots":{"name":"sneak_dots","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_sneak_knack":{"name":"sneak_knack","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_sneak_burden":{"name":"sneak_burden","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_study":{"name":"study","type":"label","defaultValue":"study","triggeredFuncs":[],"affects":[]},"attr_study_dice":{"name":"study_dice","type":"number","defaultValue":"(@{study_dots}+@{study_knack}-@{study_burden})","triggeredFuncs":[],"affects":[]},"attr_study_dots":{"name":"study_dots","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_study_knack":{"name":"study_knack","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_study_burden":{"name":"study_burden","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_tinker":{"name":"tinker","type":"label","defaultValue":"tinker","triggeredFuncs":[],"affects":[]},"attr_tinker_dice":{"name":"tinker_dice","type":"number","defaultValue":"(@{tinker_dots}+@{tinker_knack}-@{tinker_burden})","triggeredFuncs":[],"affects":[]},"attr_tinker_dots":{"name":"tinker_dots","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_tinker_knack":{"name":"tinker_knack","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_tinker_burden":{"name":"tinker_burden","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_traverse":{"name":"traverse","type":"label","defaultValue":"traverse","triggeredFuncs":[],"affects":[]},"attr_traverse_dice":{"name":"traverse_dice","type":"number","defaultValue":"(@{traverse_dots}+@{traverse_knack}-@{traverse_burden})","triggeredFuncs":[],"affects":[]},"attr_traverse_dots":{"name":"traverse_dots","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_traverse_knack":{"name":"traverse_knack","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_traverse_burden":{"name":"traverse_burden","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_name":{"name":"repeating_action_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_dice":{"name":"repeating_action_$X_dice","type":"number","defaultValue":"(@{dots}+@{knack}-@{burden})","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_dots":{"name":"repeating_action_$X_dots","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_knack":{"name":"repeating_action_$X_knack","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_burden":{"name":"repeating_action_$X_burden","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_collapse-ambition":{"name":"collapse-ambition","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_bond_flavor_text":{"name":"bond_flavor_text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_special_ability_text":{"name":"special_ability_text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_second_wind_text":{"name":"second_wind_text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_collapse-bond":{"name":"collapse-bond","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_notes":{"name":"notes","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_power_$X_name":{"name":"repeating_power_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_power_$X_uses":{"name":"repeating_power_$X_uses","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_power_$X_type":{"name":"repeating_power_$X_type","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_power_$X_effect":{"name":"repeating_power_$X_effect","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_gambit_$X_name":{"name":"repeating_gambit_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_gambit_$X_uses":{"name":"repeating_gambit_$X_uses","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_gambit_$X_type":{"name":"repeating_gambit_$X_type","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_gambit_$X_effect":{"name":"repeating_gambit_$X_effect","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_ideal_$X_check":{"name":"repeating_ideal_$X_check","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_ideal_$X_notes":{"name":"repeating_ideal_$X_notes","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_collapse-ideals":{"name":"collapse-ideals","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_burdens_$X_name":{"name":"repeating_burdens_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_burdens_$X_clock-size":{"name":"repeating_burdens_$X_clock-size","type":"hidden","defaultValue":"4","triggeredFuncs":[],"affects":[]},"attr_repeating_burdens_$X_bc-4":{"name":"repeating_burdens_$X_bc-4","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_burdens_$X_bc-6":{"name":"repeating_burdens_$X_bc-6","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_burdens_$X_bc-8":{"name":"repeating_burdens_$X_bc-8","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_burdens_$X_bc-10":{"name":"repeating_burdens_$X_bc-10","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_burdens_$X_bc-12":{"name":"repeating_burdens_$X_bc-12","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_burdens_$X_penalty_1":{"name":"repeating_burdens_$X_penalty_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_burdens_$X_penalty_2":{"name":"repeating_burdens_$X_penalty_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_collapse-burdens":{"name":"collapse-burdens","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_dust":{"name":"dust","type":"number","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_bloodied":{"calculation":"calcBloodied","name":"bloodied","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_hp":{"affects":["bloodied"],"name":"hp","listener":"change:hp","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_hp_max":{"calculation":["calcHP"],"name":"hp_max","type":"number","defaultValue":"24","triggeredFuncs":[],"affects":[]},"attr_wounds":{"affects":["hp_max","vigor_max"],"name":"wounds","listener":"change:wounds","listenerFunc":"accessSheet","type":"number","defaultValue":"0","triggeredFuncs":[]},"attr_vitality":{"affects":["hp_max","vigor_max","bloodied"],"name":"vitality","listener":"change:vitality","listenerFunc":"accessSheet","type":"number","defaultValue":"6","triggeredFuncs":[]},"attr_vigor":{"calculation":"calcHP","name":"vigor","type":"number","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_vigor_max":{"calculation":"calcHP","name":"vigor_max","type":"hidden","defaultValue":"24","triggeredFuncs":[],"affects":[]},"attr_defense":{"name":"defense","type":"number","defaultValue":"5","triggeredFuncs":[],"affects":[]},"attr_armor":{"name":"armor","type":"number","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_speed":{"affects":["dash"],"name":"speed","listener":"change:speed","listenerFunc":"accessSheet","type":"number","defaultValue":"4","triggeredFuncs":[]},"attr_dash":{"calculation":"calcDash","name":"dash","type":"number","defaultValue":"2","triggeredFuncs":[],"affects":[]},"attr_damage-die":{"name":"damage-die","type":"select","defaultValue":"2","triggeredFuncs":[],"affects":[]},"attr_fray":{"name":"fray","type":"number","defaultValue":"2","triggeredFuncs":[],"affects":[]},"attr_weapon_melee":{"name":"weapon_melee","type":"text","defaultValue":"melee","triggeredFuncs":[],"affects":[]},"attr_melee_range":{"name":"melee_range","type":"number","defaultValue":"1","triggeredFuncs":[],"affects":[]},"attr_weapon_ranged":{"name":"weapon_ranged","type":"text","defaultValue":"ranged","triggeredFuncs":[],"affects":[]},"attr_ranged_range":{"name":"ranged_range","type":"number","defaultValue":"2","triggeredFuncs":[],"affects":[]},"attr_save_target":{"name":"save_target","type":"number","defaultValue":"10","triggeredFuncs":[],"affects":[]},"attr_job_flavor_text":{"name":"job_flavor_text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_jobs_$X_class":{"name":"repeating_jobs_$X_class","type":"hidden","defaultValue":"inactive","triggeredFuncs":[],"affects":[]},"attr_repeating_jobs_$X_name":{"name":"repeating_jobs_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_jobs_$X_gambit":{"name":"repeating_jobs_$X_gambit","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_class_notes":{"name":"class_notes","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_special_mechanic":{"name":"special_mechanic","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_special_mechanic_desc":{"name":"special_mechanic_desc","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_class-resource_$X_number":{"name":"repeating_class-resource_$X_number","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_class-resource_$X_name":{"name":"repeating_class-resource_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_traits_$X_name":{"name":"repeating_traits_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_traits_$X_description":{"name":"repeating_traits_$X_description","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_abilities_$X_class":{"name":"repeating_abilities_$X_class","type":"hidden","defaultValue":"inactive","triggeredFuncs":[],"affects":[]},"attr_repeating_abilities_$X_name":{"name":"repeating_abilities_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_abilities_$X_info-a":{"name":"repeating_abilities_$X_info-a","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_abilities_$X_info-b":{"name":"repeating_abilities_$X_info-b","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_abilities_$X_info-c":{"name":"repeating_abilities_$X_info-c","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_abilities_$X_flavor":{"name":"repeating_abilities_$X_flavor","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_abilities_$X_effects":{"name":"repeating_abilities_$X_effects","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_abilities_$X_collapse":{"name":"repeating_abilities_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_abilities_$X_talent_1":{"name":"repeating_abilities_$X_talent_1","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_abilities_$X_talent_2":{"name":"repeating_abilities_$X_talent_2","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_abilities_$X_mastery":{"name":"repeating_abilities_$X_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_abilities_$X_mastery_name":{"name":"repeating_abilities_$X_mastery_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_abilities_$X_talent_effect":{"name":"repeating_abilities_$X_talent_effect","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_abilities_$X_mastery_effect":{"name":"repeating_abilities_$X_mastery_effect","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_collapse":{"name":"collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_limits_$X_class":{"name":"repeating_limits_$X_class","type":"hidden","defaultValue":"inactive","triggeredFuncs":[],"affects":[]},"attr_repeating_limits_$X_name":{"name":"repeating_limits_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_limits_$X_info-a":{"name":"repeating_limits_$X_info-a","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_limits_$X_info-b":{"name":"repeating_limits_$X_info-b","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_limits_$X_info-c":{"name":"repeating_limits_$X_info-c","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_limits_$X_flavor":{"name":"repeating_limits_$X_flavor","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_limits_$X_effects":{"name":"repeating_limits_$X_effects","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_limits_$X_collapse":{"name":"repeating_limits_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_limits_$X_mastery":{"name":"repeating_limits_$X_mastery","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_limits_$X_mastery_name":{"name":"repeating_limits_$X_mastery_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_limits_$X_mastery_effect":{"name":"repeating_limits_$X_mastery_effect","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_resolve_personal":{"name":"resolve_personal","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_resolve_party":{"name":"resolve_party","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_collapse-limits":{"name":"collapse-limits","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_relics_$X_class":{"name":"repeating_relics_$X_class","type":"hidden","defaultValue":"unequipped","triggeredFuncs":[],"affects":[]},"attr_repeating_relics_$X_name":{"name":"repeating_relics_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_relics_$X_flavor":{"name":"repeating_relics_$X_flavor","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_relics_$X_effects":{"name":"repeating_relics_$X_effects","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_relics_$X_collapse":{"name":"repeating_relics_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_relics_$X_aspected":{"name":"repeating_relics_$X_aspected","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_relics_$X_infused_dust":{"name":"repeating_relics_$X_infused_dust","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_trophies_$X_name":{"name":"repeating_trophies_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_trophies_$X_uses":{"name":"repeating_trophies_$X_uses","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_trophies_$X_type":{"name":"repeating_trophies_$X_type","type":"select","defaultValue":"NA","triggeredFuncs":[],"affects":[]},"attr_repeating_trophies_$X_effect":{"name":"repeating_trophies_$X_effect","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_xp":{"name":"xp","type":"number","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_xp_max":{"affects":["xp_interval"],"name":"xp_max","listener":"change:xp_max","listenerFunc":"accessSheet","type":"number","defaultValue":"15","triggeredFuncs":[]},"attr_xp_interval":{"calculation":"calcInterval","name":"xp_interval","type":"number","defaultValue":"5","triggeredFuncs":[],"affects":[]},"attr_repeating_ambition-personal_$X_clock-size":{"name":"repeating_ambition-personal_$X_clock-size","type":"hidden","defaultValue":"4","triggeredFuncs":[],"affects":[]},"attr_repeating_ambition-personal_$X_ac-4":{"name":"repeating_ambition-personal_$X_ac-4","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_ambition-personal_$X_ac-6":{"name":"repeating_ambition-personal_$X_ac-6","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_ambition-personal_$X_ac-8":{"name":"repeating_ambition-personal_$X_ac-8","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_ambition-personal_$X_ac-10":{"name":"repeating_ambition-personal_$X_ac-10","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_ambition-personal_$X_ac-12":{"name":"repeating_ambition-personal_$X_ac-12","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_ambition-personal_$X_notes":{"name":"repeating_ambition-personal_$X_notes","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_group_name":{"name":"group_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_ambition-group_$X_clock-size":{"name":"repeating_ambition-group_$X_clock-size","type":"hidden","defaultValue":"4","triggeredFuncs":[],"affects":[]},"attr_repeating_ambition-group_$X_ac-4":{"name":"repeating_ambition-group_$X_ac-4","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_ambition-group_$X_ac-6":{"name":"repeating_ambition-group_$X_ac-6","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_ambition-group_$X_ac-8":{"name":"repeating_ambition-group_$X_ac-8","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_ambition-group_$X_ac-10":{"name":"repeating_ambition-group_$X_ac-10","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_ambition-group_$X_ac-12":{"name":"repeating_ambition-group_$X_ac-12","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_ambition-group_$X_notes":{"name":"repeating_ambition-group_$X_notes","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_camp_name":{"name":"camp_name","defaultValue":"camp","triggeredFuncs":[],"affects":[]},"attr_camp_description":{"name":"camp_description","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_fixtures_$X_name":{"name":"repeating_fixtures_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_fixtures_$X_description":{"name":"repeating_fixtures_$X_description","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_fixtures_$X_effects":{"name":"repeating_fixtures_$X_effects","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_fixtures_$X_collapse":{"name":"repeating_fixtures_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_fixtures_$X_cost":{"name":"repeating_fixtures_$X_cost","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_fixtures_$X_upgrade":{"name":"repeating_fixtures_$X_upgrade","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_fixtures_$X_invested":{"name":"repeating_fixtures_$X_invested","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_fixtures_$X_upgrades":{"name":"repeating_fixtures_$X_upgrades","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_kin_notes":{"name":"kin_notes","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_culture_notes":{"name":"culture_notes","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_additional-notes_$X_notes":{"name":"repeating_additional-notes_$X_notes","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_possessions_$X_items":{"name":"repeating_possessions_$X_items","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_resource_$X_no":{"name":"repeating_resource_$X_no","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_resource_$X_info":{"name":"repeating_resource_$X_info","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_npc_$X_class":{"name":"repeating_npc_$X_class","type":"hidden","defaultValue":"mob","triggeredFuncs":[],"affects":[]},"attr_repeating_npc_$X_name":{"name":"repeating_npc_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_npc_$X_hp":{"name":"repeating_npc_$X_hp","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_npc_$X_hp_max":{"name":"repeating_npc_$X_hp_max","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_npc_$X_def":{"name":"repeating_npc_$X_def","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_npc_$X_vit":{"name":"repeating_npc_$X_vit","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_npc_$X_spd":{"name":"repeating_npc_$X_spd","type":"number","defaultValue":"1","triggeredFuncs":[],"affects":[]},"attr_repeating_npc_$X_dash":{"name":"repeating_npc_$X_dash","type":"number","defaultValue":"1","triggeredFuncs":[],"affects":[]},"attr_repeating_npc_$X_damage":{"name":"repeating_npc_$X_damage","type":"select","defaultValue":"2","triggeredFuncs":[],"affects":[]},"attr_repeating_npc_$X_fray":{"name":"repeating_npc_$X_fray","type":"number","defaultValue":"1","triggeredFuncs":[],"affects":[]},"attr_repeating_npc_$X_description":{"name":"repeating_npc_$X_description","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_npc_$X_info-a":{"name":"repeating_npc_$X_info-a","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_npc_$X_info-b":{"name":"repeating_npc_$X_info-b","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_npc_$X_info-c":{"name":"repeating_npc_$X_info-c","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_npc_$X_abilities":{"name":"repeating_npc_$X_abilities","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_npc_$X_whisper":{"name":"repeating_npc_$X_whisper","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_npc_$X_collapse":{"name":"repeating_npc_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_npc_$X_additional":{"name":"repeating_npc_$X_additional","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_npc_$X_number":{"name":"repeating_npc_$X_number","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_npc_$X_resource":{"name":"repeating_npc_$X_resource","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_add-abilities_$X_class":{"name":"repeating_add-abilities_$X_class","type":"hidden","defaultValue":"inactive","triggeredFuncs":[],"affects":[]},"attr_repeating_add-abilities_$X_name":{"name":"repeating_add-abilities_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_add-abilities_$X_info-a":{"name":"repeating_add-abilities_$X_info-a","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_add-abilities_$X_info-b":{"name":"repeating_add-abilities_$X_info-b","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_add-abilities_$X_info-c":{"name":"repeating_add-abilities_$X_info-c","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_add-abilities_$X_effects":{"name":"repeating_add-abilities_$X_effects","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_general-clock_$X_size":{"name":"repeating_general-clock_$X_size","type":"hidden","defaultValue":"4","triggeredFuncs":[],"affects":[]},"attr_repeating_general-clock_$X_gc-4":{"name":"repeating_general-clock_$X_gc-4","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_general-clock_$X_gc-6":{"name":"repeating_general-clock_$X_gc-6","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_general-clock_$X_gc-8":{"name":"repeating_general-clock_$X_gc-8","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_general-clock_$X_gc-10":{"name":"repeating_general-clock_$X_gc-10","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_general-clock_$X_gc-12":{"name":"repeating_general-clock_$X_gc-12","type":"radio","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_general-clock_$X_name":{"name":"repeating_general-clock_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_general-clock_$X_notes":{"name":"repeating_general-clock_$X_notes","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_boons":{"name":"boons","type":"text","defaultValue":"?{Boons / Curses|NA,+0|+2D,+2d6kh1|+1D,+1d6|−1D,-1d6|−2D,-2d6kh1}","triggeredFuncs":[],"affects":[]},"attr_curses":{"name":"curses","type":"hidden","defaultValue":"?{Boons / Curses|NA,+0|+2D,+2|+1D,+1|−1D,-1|−2D,-2}","triggeredFuncs":[],"affects":[]},"attr_ratio_max_hp":{"affects":["hp_max","vigor_max","bloodied"],"name":"ratio_max_hp","listener":"change:ratio_max_hp","listenerFunc":"accessSheet","type":"number","defaultValue":"4","triggeredFuncs":[]},"attr_ratio_heavy":{"name":"ratio_heavy","type":"number","defaultValue":"2","triggeredFuncs":[],"affects":[]},"attr_ratio_bloodied":{"affects":["bloodied"],"name":"ratio_bloodied","listener":"change:ratio_bloodied","listenerFunc":"accessSheet","type":"number","defaultValue":"0.5","triggeredFuncs":[]},"attr_ratio_dash":{"affects":["dash"],"name":"ratio_dash","listener":"change:ratio_dash","listenerFunc":"accessSheet","type":"number","defaultValue":"0.5","triggeredFuncs":[]}};
|
||
|
||
kFuncs.cascades = cascades;
|
||
|
||
const repeatingSectionDetails = [{"section":"repeating_action","fields":["name","dice","dots","knack","burden"]},{"section":"repeating_power","fields":["name","uses","type","effect"]},{"section":"repeating_gambit","fields":["name","uses","type","effect"]},{"section":"repeating_ideal","fields":["check","notes"]},{"section":"repeating_burdens","fields":["name","clock-size","bc-4","bc-6","bc-8","bc-10","bc-12","penalty_1","penalty_2"]},{"section":"repeating_jobs","fields":["class","name","gambit"]},{"section":"repeating_class-resource","fields":["number","name"]},{"section":"repeating_traits","fields":["name","description"]},{"section":"repeating_abilities","fields":["class","name","info-a","info-b","info-c","flavor","effects","collapse","talent_1","talent_2","mastery","mastery_name","talent_effect","mastery_effect"]},{"section":"repeating_limits","fields":["class","name","info-a","info-b","info-c","flavor","effects","collapse","mastery","mastery_name","mastery_effect"]},{"section":"repeating_relics","fields":["class","level","name","flavor","effects","collapse","aspected","infused_dust"]},{"section":"repeating_trophies","fields":["name","uses","type","effect"]},{"section":"repeating_ambition-personal","fields":["clock-size","ac-4","ac-6","ac-8","ac-10","ac-12","notes"]},{"section":"repeating_ambition-group","fields":["clock-size","ac-4","ac-6","ac-8","ac-10","ac-12","notes"]},{"section":"repeating_fixtures","fields":["name","description","effects","collapse","cost","upgrade","invested","upgrades"]},{"section":"repeating_additional-notes","fields":["notes"]},{"section":"repeating_possessions","fields":["items"]},{"section":"repeating_resource","fields":["no","info"]},{"section":"repeating_npc","fields":["class","chapter","name","hp","hp_max","def","vit","spd","dash","damage","fray","description","info-a","info-b","info-c","abilities","whisper","collapse","additional","number","resource"]},{"section":"repeating_add-abilities","fields":["class","name","info-a","info-b","info-c","effects"]},{"section":"repeating_general-clock","fields":["size","gc-4","gc-6","gc-8","gc-10","gc-12","name","notes"]}];
|
||
|
||
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(typePrefix === 'attr_'){
|
||
cascObj.previousValue = event.previousValue;
|
||
}
|
||
return cascObj;
|
||
};
|
||
|
||
const triggerFunctions = function(obj,attributes,sections){
|
||
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}) :
|
||
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;
|
||
|
||
/**
|
||
* 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`);
|
||
};
|
||
setTimeout(registerEventHandlers,0);//Delay the execution of event registration to ensure all event properties are present.
|
||
|
||
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});
|
||
}
|
||
});
|
||
}
|
||
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 }) {
|
||
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;
|
||
}
|
||
}
|
||
|
||
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 = [];const sheetTypes = ["narrative","tactics","journal","roster"];const resourceNames = ["effort","strain"];const actionNames = ["charm","command","endure","excel","sense","smash","sneak","study","tinker","traverse"];
|
||
/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
|
||
/*jshint -W014,-W084,-W030,-W033*/
|
||
//Sheet Variables
|
||
//const actionAttributes = ['body','mind','spirit','initiative','repeating_skill_$x_roll','repeating_weapon_$x_roll','situational_awareness','remnant_initiative','assault_roll','strike_roll','motion_roll','repeating_remnant-weapon_$x_roll','repeating_drone_$x_assault','repeating_drone_$x_strike'];
|
||
k.sheetName = 'icon';
|
||
k.version = 0.4;/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
|
||
/*jshint -W014,-W084,-W030,-W033*/
|
||
/**
|
||
* A function to calculate the value of the base attribute mods in the system (might, finesse, resolve, insight, bearing, and weal).
|
||
*
|
||
* Also, Note that the K-scaffold passes three properties of the args object to calculation, triggered, and initial functions. We're using `trigger`, and `attributes` here, but an object containing arrays of all the row IDs of each section is also passed under the term `sections`.
|
||
*
|
||
* I've only listed the parameters of the trigger object that are relevant to this function. You can see the full parameter list in the [readme](https://github.com/Kurohyou/Roll20-Snippets/tree/main/K_Scaffold)
|
||
* @param {object} args - An object containing the trigger and attributes
|
||
* @param {object} args.trigger - The details of which attribute is being calculated.
|
||
* @param {string} args.trigger.name - The full name of the attribute, including any repeating section information (won't be applicable for this function)
|
||
* @param {object} args.attributes - The object containing the attribute values. Note that this is actually proxy for the actual attribute object that ensures values are returned correctly.
|
||
* @returns {number} - Returns the new attribute mod, which the K-scaffold's infrastructure will apply to the sheet.
|
||
*/
|
||
const calcAttributeMod = function({trigger,attributes}){
|
||
let attribute = trigger.name.replace(/_mod/,'');//extract the base attribute name from the name of the triggering attribute
|
||
let returnValue;
|
||
switch(true){//We're looking for the first expression that returns true;
|
||
case (attributes[attribute] < 4):
|
||
returnValue = -2;
|
||
break;
|
||
case (attributes[attribute] < 7):
|
||
returnValue = -1;
|
||
break;
|
||
case (attributes[attribute] < 15):
|
||
returnValue = 0;
|
||
break;
|
||
case (attributes[attribute] < 18):
|
||
returnValue = 1;
|
||
break;
|
||
case (attributes[attribute] >= 18):
|
||
returnValue = 2;
|
||
break;
|
||
default:
|
||
returnValue = 0;
|
||
break;
|
||
}
|
||
return returnValue;
|
||
};
|
||
k.registerFuncs({calcAttributeMod});//We need to register the function with the k-scaffold so that the k-scaffold's listeners can call it when needed.
|
||
|
||
const boundNumber = (value, min, max) => {
|
||
[ value, min, max ] = [ value, min, max].map(input => parseFloat(input));
|
||
if (!isNaN(value)) {
|
||
value = (!isNaN(min)) ? Math.max(value, min) : value;
|
||
value = (!isNaN(max)) ? Math.min(value, max) : value;
|
||
}
|
||
return value;
|
||
}
|
||
|
||
on('change:vigor change:vigor_max change:wounds change:vitality', () => {
|
||
getAttrs([ 'vigor', 'vigor_max' ], (attributeValues) => {
|
||
const boundValue = boundNumber(attributeValues.vigor, 0, attributeValues.vigor_max);
|
||
if (boundValue === attributeValues.vigor) {
|
||
setAttrs({ vigor: boundValue });
|
||
}
|
||
});
|
||
});
|
||
|
||
on('change:hp change:hp_max change:wounds change:vitality', () => {
|
||
getAttrs([ 'hp', 'hp_max' ], (attributeValues) => {
|
||
const boundValue = boundNumber(attributeValues.hp, 0, attributeValues.hp_max);
|
||
if (boundValue === attributeValues.hp) {
|
||
setAttrs({ hp: boundValue });
|
||
}
|
||
});
|
||
});
|
||
|
||
const calcHP = function({attributes}){
|
||
return attributes.vitality * (attributes.ratio_max_hp - attributes.wounds);
|
||
};
|
||
k.registerFuncs({calcHP});
|
||
|
||
const calcBloodied = function({attributes}){
|
||
let returnValue;
|
||
let hp_max = attributes.vitality * attributes.ratio_max_hp;
|
||
let bloodied_hp = Math.ceil(hp_max * attributes.ratio_bloodied);
|
||
switch(true){ //We're looking for the first expression that returns true;
|
||
case (attributes.hp <= bloodied_hp):
|
||
returnValue = 1;
|
||
break;
|
||
default:
|
||
returnValue = 0;
|
||
break;
|
||
}
|
||
return returnValue;
|
||
}
|
||
k.registerFuncs({calcBloodied});
|
||
|
||
const calcDash = function({attributes}){
|
||
return Math.ceil(attributes.speed * attributes.ratio_dash);
|
||
};
|
||
k.registerFuncs({calcDash});
|
||
|
||
const calcInterval = function({attributes}){
|
||
return Math.ceil(attributes.xp_max / 3);
|
||
};
|
||
k.registerFuncs({calcInterval});
|
||
|
||
// const calcPlusOne = function({attributes}){
|
||
// return attributes.number + 1;
|
||
// }
|
||
// k.registerFuncs({calcPlusOne});
|
||
|
||
// const calcMultiply = function({attributes}){
|
||
// return attributes.mult1 * attributes.mult2;
|
||
// }
|
||
// k.registerFuncs({calcMultiply});/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
|
||
/*jshint -W014,-W084,-W030,-W033*/
|
||
// Functions to update
|
||
/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
|
||
/*jshint -W014,-W084,-W030,-W033*/
|
||
/**
|
||
* A function that toggles the `.active` class on elements based on which tab of the sheet is currently selected. Note that the display changes caused by this are client side only and are not sync'd across users except when the sheet is opened by a user.
|
||
* @param {object} trigger - The trigger object as stored in the k-scaffold's cascades object.
|
||
* @param {object} attributes - The attributes object as returned from `getAllAttrs` and used in the default K-scaffold event cascade.
|
||
* @returns {void}
|
||
*/
|
||
// const navigateSheet = function({trigger,attributes}){
|
||
// let name = trigger ?
|
||
// trigger.name :
|
||
// attributes.sheet_state;//The trigger property is not passed when this function is called on sheet:opened. So, we need to get the current sheet state out of memory in that case.
|
||
// let [,,page] = k.parseTriggerName(name);//Parse out the name of the navigation button that was clicked.
|
||
// page = page.replace(/^nav-|-action$/g,'');//Remove the navigation and action button specific pieces of the button name to leave us with just the name of the button, which ideally is the same as a CSS class that we want to apply `.active` to.
|
||
// navButtons.forEach((button)=>{//iterate through all the navigation buttons. navButtons is exported to our JS by the K-scaffold.
|
||
// let element = button.replace(/-action/,'');//sanitize the button name down until we get just the target class name.
|
||
// $20(`.${element}`).removeClass('active');//Remove the active class from all elements with the indicated class (e.g. .character)
|
||
// });
|
||
// $20(`.${page}`).addClass('active');//Add .active back to the elements that we are actually navigating to. We do this outside of the loop so that we can properly handle elements that may have more than one navigation class applied to them, although we don't have any of these in this sheet setup.
|
||
// attributes.sheet_state = page;//Store the new page selection in our sheet_state attribute so that it will be remembered when the sheet is opened again.
|
||
// };
|
||
// k.registerFuncs({navigateSheet},{type:['opener']});//Register the function. Note that we are using a new argument with registerFuncs. The second object here is the options object where we can define what type of function this is. See the K-scaffold documentation for more information on the available types.
|
||
|
||
/**
|
||
* Function to control what sections of the sheet are accessible based on the type of sheet that is selected (npc vs. character). This is done by application of the `inactive` class to the element.
|
||
* @param {object} attributes - The attributes object as passed from `getAllAttrs` and used in the default K-scaffold event cascade.
|
||
* @returns {void}
|
||
*/
|
||
const displayArticles = function({attributes}){
|
||
sheetTypes.forEach((type)=>{
|
||
const action = attributes.sheet_type === type ?
|
||
'remove' ://If the type is the same as the selected sheet type, then we want to remove the inactive class.
|
||
'add';//Otherwise, we want to add it.
|
||
k.debug({action});
|
||
$20(`.${type}`)[`${action}Class`]('inactive');//Actually do the class manipulation.
|
||
});
|
||
};
|
||
k.registerFuncs({displayArticles},{type:['opener']});//This function is registered as an opener so that it will be fired every time the sheet is opened. This will ensure that the sheet is displayed always matches the selections. It will also be called in reaction to changes to the `sheet_type` attribute.
|
||
|
||
|
||
// tab script
|
||
const buttonlist = ["narrative","tactics","journal","roster","settings"];
|
||
buttonlist.forEach(button => {
|
||
on(`clicked:${button}`, function() {
|
||
setAttrs({
|
||
sheet_state: button
|
||
});
|
||
});
|
||
});/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
|
||
/*jshint -W014,-W084,-W030,-W033*/
|
||
/**
|
||
* Function that extracts the information of which roll was clicked from the name of the button.
|
||
* @param {string} string - The triggerName to be parsed
|
||
* @returns {array} - Returns an array containing the repeating section name, the row id, and the field that is referenced.
|
||
*/
|
||
const extractRollInfo = function(string){
|
||
//Get the information on which button was clicked.
|
||
const [section,id,button] = k.parseTriggerName(string);
|
||
//Convert the button name into the name of the relevant attribute (e.g. saving-throw => saving_throw). Also removes the `-action` suffix of the action button to get the raw field name.
|
||
const field = button.replace(/\-?action/,'').replace(/\-/g,'_');
|
||
return [section,id,field];
|
||
};
|
||
|
||
/**
|
||
* Function to translate our advantage query
|
||
* @returns {string}
|
||
*/
|
||
const translateAdvantageQuery = function(){
|
||
//Iterate throught the advantage options and create the translated strings.
|
||
const options = [['advantage','2d20kh1'],['normal','1d20'],['disadvantage','2d20kl1']]
|
||
.map((arr)=>{
|
||
const translated = k.capitalize(getTranslationByKey(arr[0]));
|
||
return `${translated},${arr[1]}`;
|
||
})
|
||
.join('|');
|
||
return `?{${k.capitalize(getTranslationByKey('roll with'))}|${options}}`;
|
||
};
|
||
|
||
/**
|
||
* Our function that will actually initiate the roll.
|
||
* @param {object} attributes - Our object containing the attributes needed for the roll
|
||
* @param {object} rollObj - The object containing the fields to send with the roll
|
||
* @returns {void}
|
||
*/
|
||
const initiateRoll = async function(attributes,rollObj){
|
||
if(rollObj.roll){
|
||
rollObj.roll = rollObj.roll.replace(/@\{roll_state\}/,(match)=>{
|
||
//If roll state is set to ask the user what to do, we need to assemble a translated version of the query.
|
||
if(/\?\{/.test(attributes.roll_state)){
|
||
return translateAdvantageQuery();
|
||
}else{
|
||
//Otherwise just use the roll_state
|
||
return attributes.roll_state;
|
||
}
|
||
});
|
||
}
|
||
//Assemble our completed roll string.
|
||
const message = Object.entries(rollObj)
|
||
.reduce((text,[field,content]) => {
|
||
return text += `{{${field}=${content}}}`;
|
||
},`@{template_start}`);
|
||
//Send the completed roll string to the chat parser.
|
||
const roll = await startRoll(message);
|
||
//An object to aggregate the changes that need to be made to what is displayed in the roll output.
|
||
const computeObj = {};
|
||
//If the roll contained a result, target, and roll field with an inline roll in them, then we want to compare the roll and target values to determine if the result was a success or failure.
|
||
k.debug({roll});
|
||
if(roll.results.result && roll.results.target && roll.results.roll){
|
||
computeObj.result = roll.results.roll.result >= roll.results.target ? 1 : 0;
|
||
}
|
||
//Now we finish our roll, which tells Roll20 to actually display it in chat.
|
||
finishRoll(roll.rollId,computeObj);
|
||
};
|
||
|
||
/**
|
||
* Our generic rolling function. This will be used for our simple attribute and saving throw rolls that need very little logic.
|
||
* @param {object} event - The Roll20 event object.
|
||
* @returns {void}
|
||
*/
|
||
const rollGeneric = function(event){
|
||
const[section,id,field] = extractRollInfo(event.triggerName);
|
||
const attributeRef = attributeNames.indexOf(field) > -1 ?
|
||
`${field}_mod` :
|
||
undefined;
|
||
k.getAttrs({
|
||
props:rollGet,
|
||
callback: (attributes)=>{
|
||
//object that will aggregate all the roll template fields we will need to send to chat.
|
||
const rollObj = {
|
||
name:`^{${field.replace(/_/g,' ')}}`,
|
||
roll:attributeRef ?
|
||
`[[@{roll_state} + 0@{${attributeRef}}]]` :
|
||
`[[@{roll_state}]]`,
|
||
target:`[[0@{saving_throw}]]`,
|
||
result:`[[0[computed value]]]`
|
||
};
|
||
//Send the roll.
|
||
initiateRoll(attributes,rollObj);
|
||
}
|
||
});
|
||
};
|
||
k.registerFuncs({rollGeneric});
|
||
|
||
const rollSave = function(event){
|
||
const[section,id,field] = extractRollInfo(event.triggerName);
|
||
k.getAttrs({
|
||
props:rollGet,
|
||
callback: (attributes)=>{
|
||
//object that will aggregate all the roll template fields we will need to send to chat.
|
||
const rollObj = {
|
||
name:`^{${field.replace(/_/g,' ')}}`,
|
||
roll:`[[1d20]]`,
|
||
target:`[[0@{vitality}]]`,
|
||
result:`[[0[computed value]]]`
|
||
};
|
||
//Send the roll.
|
||
initiateRoll(attributes,rollObj);
|
||
}
|
||
});
|
||
};
|
||
k.registerFuncs({rollSave});
|
||
|
||
/**
|
||
* Our attack roll function. This won't need much logic, but has a slightly different button/attribute relationship that we need to account for.
|
||
* @param {object} event - The Roll20 event object.
|
||
* @returns {void}
|
||
*/
|
||
const rollAttack = function(event){
|
||
const[section,id,field] = extractRollInfo(event.triggerName);
|
||
const row = `${section}_${id}`;
|
||
k.getAttrs({
|
||
props:[...rollGet,`${row}_type`,`${row}_damage`],
|
||
callback:(attributes)=>{
|
||
const type = attributes[`${row}_type`];
|
||
const rollObj = {
|
||
name:`@{${row}_name}`,
|
||
roll_name:'^{attack}',
|
||
roll:`[[@{roll_state} + 0@{attack_modifier}[${getTranslationByKey('attack modifier')}] + 0@{${row}_attack_bonus}[${getTranslationByKey('bonus')}] + 0@{${type}_mod}[${getTranslationByKey(type)}]]]`,
|
||
range:`@{${row}_range}`,
|
||
traits:`@{${row}_traits}`,
|
||
aspects:`@{${row}_aspects}`,
|
||
description:`@{${row}_description}`
|
||
}
|
||
if(attributes[`${row}_damage`]){
|
||
rollObj.damage = `[[@{${row}_damage}]]`;
|
||
}
|
||
initiateRoll(attributes,rollObj);
|
||
}
|
||
});
|
||
};
|
||
k.registerFuncs({rollAttack});
|
||
|
||
// - Action CRP written by Scott C.
|
||
|
||
const assembleRollField = async (attrName,attributes,sections) => {
|
||
const dice = attributes[`${attrName}_dice`];
|
||
// Ask the user for their boons/curses and convert the response to a number
|
||
const boonCurse = +(await k.extractQueryResult('Boons / Curses|NA,0|+2D,2|+1D,1|−1D,-1|−2D,-2'));
|
||
let totalDice = Math.max(0,dice + boonCurse);
|
||
let rollString = totalDice <= 0 ?
|
||
`[[2d6kl1]]` :
|
||
`[[${totalDice}d6kh1]]`;
|
||
return rollString;
|
||
}
|
||
|
||
// Converts the rollObj into a roll string.
|
||
const assembleRollString = (rollObj,rollStart = '&{template:icon}') => {
|
||
return Object.entries(rollObj)
|
||
.reduce((str,[field,value]) => {
|
||
return str + ` {{${field}=${value}}}`;
|
||
},rollStart);
|
||
}
|
||
|
||
/**
|
||
* Function to do icon rolls
|
||
* @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 iconRoll = async function({trigger,attributes,sections,casc}){
|
||
// the async tag above tells javascript that this code will pause at some point (when we use the await keyword).
|
||
// extract the section, rowID, and button from the trigger's name.
|
||
const [section,rowID,button] = k.parseTriggerName(trigger.name);
|
||
// Convert your button's name to a k-scaffold attribute name
|
||
const attrName = button.replace(/-action$/,'').replace(/-/g,'_');
|
||
// I specify my rolls with an object and then use an assembly function to convert them to roll strings. It makes this much easier to debug.
|
||
const rollObj = {
|
||
roll:await assembleRollField(attrName,attributes,sections),
|
||
num6s:'[[0[computed value]]]'
|
||
};
|
||
|
||
const rollString = assembleRollString(rollObj);
|
||
const roll = await startRoll(rollString);
|
||
// Object to aggregate our modifications to the roll results
|
||
const computeObj = {};
|
||
// Count the number of 6s rolled by the dice
|
||
computeObj.num6s = roll.results.roll.dice.reduce((total,die) => {
|
||
if(die === 6){
|
||
total++;
|
||
}
|
||
return total;
|
||
},0);
|
||
// Tell roll20 to release the roll to the chat with our changes.
|
||
finishRoll(roll.rollId,computeObj);
|
||
};
|
||
k.registerFuncs({iconRoll});
|
||
</script>
|
||
|
||
|
||
|
||
|