Files
roll20-character-sheets/everyday_heroes/everyday.html
T
2024-06-03 13:15:14 -04:00

6249 lines
486 KiB
HTML

<input name="attr_sheet_version" value="0" type="hidden" title="@{sheet_version}"/>
<input name="attr_sheet_state" value="settings" type="hidden" title="@{sheet_state}"/>
<input name="attr_collapsed" value="" type="hidden" title="@{collapsed}"/>
<div class="compendium-drop-target npcs vehicles places">
<input name="attr_drop_name" accept="Name" value="" type="hidden" title="@{drop_name}"/>
<input name="attr_drop_data" accept="data" value="" type="hidden" title="@{drop_data}"/>
<main id="main"><!-- sectionName:everyday -->
<input name="attr_everyday_tab" value="nav-tabs-everyday--settings" type="hidden" title="@{everyday_tab}"/>
<div class="tabs tabs--everyday">
<nav class="tabs__header tabs--everyday__header">
<ul class="tabs__nav-list">
<li class="tabs__nav-item">
<button class="tabs__button tabs--everyday__button tabs--everyday__button--core" name="act_nav-tabs-everyday--core" data-container-button="everyday" data-button="core" data-i18n="tabs-everyday-core" type="action" data-container-tab="everyday" data-tab="core">
</button>
</li>
<li class="tabs__nav-item">
<button class="tabs__button tabs--everyday__button tabs--everyday__button--plans-tricks" name="act_nav-tabs-everyday--plans-tricks" data-container-button="everyday" data-button="plans-tricks" data-i18n="tabs-everyday-plans-tricks" type="action" data-container-tab="everyday" data-tab="plans-tricks">
</button>
</li>
<li class="tabs__nav-item">
<button class="tabs__button tabs--everyday__button tabs--everyday__button--persona" name="act_nav-tabs-everyday--persona" data-container-button="everyday" data-button="persona" data-i18n="tabs-everyday-persona" type="action" data-container-tab="everyday" data-tab="persona">
</button>
</li>
<li class="tabs__nav-item">
<button class="tabs__button tabs--everyday__button tabs--everyday__button--npc uppercase" name="act_nav-tabs-everyday--npc" data-container-button="everyday" data-button="npc" data-i18n="tabs-everyday-npc" type="action" data-container-tab="everyday" data-tab="npc">
</button>
</li>
<li class="tabs__nav-item">
<button class="tabs__button tabs--everyday__button tabs--everyday__button--vehicle" name="act_nav-tabs-everyday--vehicle" data-container-button="everyday" data-button="vehicle" data-i18n="tabs-everyday-vehicle" type="action" data-container-tab="everyday" data-tab="vehicle">
</button>
</li>
<li class="tabs__nav-item">
<button class="tabs__button tabs--everyday__button tabs--everyday__button--place" name="act_nav-tabs-everyday--place" data-container-button="everyday" data-button="place" data-i18n="tabs-everyday-place" type="action" data-container-tab="everyday" data-tab="place">
</button>
</li>
<li class="tabs__nav-item">
<button class="tabs__button tabs--everyday__button tabs--everyday__button--settings material-icons" name="act_nav-tabs-everyday--settings" data-container-button="everyday" data-button="settings" type="action" data-container-tab="everyday" data-tab="settings">settings
</button>
</li>
</ul>
</nav>
<div class="tabs__body tabs--everyday__body">
<article class="tabs__container tabs--everyday__container tabs--everyday__container--core" data-container-tab="everyday" data-tab="core">
<div class="heroID heroID--front float-effect">
<div class="caution-tape heroID__header">
<div class="caution-tape__content heroID__title">
<input class="heroID__title" name="attr_character_name" type="text" title="@{character_name}"/>
</div>
</div>
<div class="heroID__pic"><img class="character-avatar" name="attr_character_avatar" data-i18n-alt="character avatar" title="@{character_avatar}"/><img class="character-token" name="attr_character_token" data-i18n-alt="character token" title="@{character_token}"/>
</div>
<div class="heroID__info">
<label class="input-label class text form-label"><span class="form-label__span input-label__text" data-i18n=" class"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_character_class" type="text" title="@{character_class}"/>
</label>
<label class="input-label archetype text form-label"><span class="form-label__span input-label__text" data-i18n=" archetype"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_character_archetype" type="text" title="@{character_archetype}"/>
</label>
<label class="input-label background text form-label"><span class="form-label__span input-label__text" data-i18n="background"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_background" type="text" title="@{background}"/>
</label>
<label class="input-label profession text form-label"><span class="form-label__span input-label__text" data-i18n="profession"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_profession" type="text" title="@{profession}"/>
</label>
<label class="input-label level number form-label"><span class="form-label__span input-label__text" data-i18n=" level"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_character_level" type="number" title="@{character_level}"/>
</label>
<label class="input-label wealth number form-label"><span class="form-label__span input-label__text" data-i18n="wealth"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_wealth" type="number" title="@{wealth}"/>
</label>
<label class="input-label speed number form-label"><span class="form-label__span input-label__text" data-i18n=" speed"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_character_speed" type="number" title="@{character_speed}"/>
</label>
<label class="input-label stacked heroID__label languages form-label stacked form-label--textarea"><span class="form-label__span form-label--textarea__span" data-i18n="languages"></span>
<div class="adaptive adaptive--text form-label__input form-label--textarea__input recess-effect"><span class="adaptive--text__span" name="attr_character_languages" title="@{character_languages}"></span>
<textarea class="adaptive--text__textarea" name="attr_character_languages" title="@{character_languages}"></textarea>
</div>
</label>
</div>
</div>
<section class="section section--layout section--ability-skill float-effect section--fill">
<div class="section__content">
<div class="section--ability-skill__abilities">
<div class="ability-display strength">
<button class="roller" name="roll_strength" data-i18n="strength" value="@{strength_action}" type="roll">
</button>
<button name="act_strength-action" hidden="" type="action">
</button>
<input name="attr_strength_action" type="hidden" title="@{strength_action}"/><span class="ability-display__save-label" data-i18n="save"></span>
<input class="plus-control" name="attr_strength_mod" value="0" hidden="" type="hidden" title="@{strength_mod}"/><span class="ability-display__mod circle thick-border plus-display" name="attr_strength_mod" title="@{strength_mod}"></span>
<input class="thin-border recess-effect ability-display__score" name="attr_strength" value="10" type="number" title="@{strength}"/>
<div class="ability-display__save thin-border recess-effect">
<div class="fill-left prof-display">
<input class="float-effect circle fill-left__radio" name="attr_strength_save_proficiency" value="0" type="hidden" title="@{strength_save_proficiency}"/>
<input class="float-effect circle fill-left__radio" name="attr_strength_save_proficiency" value="1" type="checkbox" title="@{strength_save_proficiency}"/>
</div>
<button class="roller--mod-display roller" name="roll_strength_save" value="@{strength_save_action}" type="roll">
<input class="plus-control" name="attr_strength_save" value="0" hidden="" type="hidden" title="@{strength_save}"/><span class="plus-display" name="attr_strength_save" title="@{strength_save}"></span>
</button>
<button name="act_strength-save-action" hidden="" type="action">
</button>
<input name="attr_strength_save_action" type="hidden" title="@{strength_save_action}"/>
</div>
</div>
<div class="ability-display dexterity">
<button class="roller" name="roll_dexterity" data-i18n="dexterity" value="@{dexterity_action}" type="roll">
</button>
<button name="act_dexterity-action" hidden="" type="action">
</button>
<input name="attr_dexterity_action" type="hidden" title="@{dexterity_action}"/>
<input class="plus-control" name="attr_dexterity_mod" value="0" hidden="" type="hidden" title="@{dexterity_mod}"/><span class="ability-display__mod circle thick-border plus-display" name="attr_dexterity_mod" title="@{dexterity_mod}"></span>
<input class="thin-border recess-effect ability-display__score" name="attr_dexterity" value="10" type="number" title="@{dexterity}"/>
<div class="ability-display__save thin-border recess-effect">
<div class="fill-left prof-display">
<input class="float-effect circle fill-left__radio" name="attr_dexterity_save_proficiency" value="0" type="hidden" title="@{dexterity_save_proficiency}"/>
<input class="float-effect circle fill-left__radio" name="attr_dexterity_save_proficiency" value="1" type="checkbox" title="@{dexterity_save_proficiency}"/>
</div>
<button class="roller--mod-display roller" name="roll_dexterity_save" value="@{dexterity_save_action}" type="roll">
<input class="plus-control" name="attr_dexterity_save" value="0" hidden="" type="hidden" title="@{dexterity_save}"/><span class="plus-display" name="attr_dexterity_save" title="@{dexterity_save}"></span>
</button>
<button name="act_dexterity-save-action" hidden="" type="action">
</button>
<input name="attr_dexterity_save_action" type="hidden" title="@{dexterity_save_action}"/>
</div>
</div>
<div class="ability-display constitution">
<button class="roller" name="roll_constitution" data-i18n="constitution" value="@{constitution_action}" type="roll">
</button>
<button name="act_constitution-action" hidden="" type="action">
</button>
<input name="attr_constitution_action" type="hidden" title="@{constitution_action}"/>
<input class="plus-control" name="attr_constitution_mod" value="0" hidden="" type="hidden" title="@{constitution_mod}"/><span class="ability-display__mod circle thick-border plus-display" name="attr_constitution_mod" title="@{constitution_mod}"></span>
<input class="thin-border recess-effect ability-display__score" name="attr_constitution" value="10" type="number" title="@{constitution}"/>
<div class="ability-display__save thin-border recess-effect">
<div class="fill-left prof-display">
<input class="float-effect circle fill-left__radio" name="attr_constitution_save_proficiency" value="0" type="hidden" title="@{constitution_save_proficiency}"/>
<input class="float-effect circle fill-left__radio" name="attr_constitution_save_proficiency" value="1" type="checkbox" title="@{constitution_save_proficiency}"/>
</div>
<button class="roller--mod-display roller" name="roll_constitution_save" value="@{constitution_save_action}" type="roll">
<input class="plus-control" name="attr_constitution_save" value="0" hidden="" type="hidden" title="@{constitution_save}"/><span class="plus-display" name="attr_constitution_save" title="@{constitution_save}"></span>
</button>
<button name="act_constitution-save-action" hidden="" type="action">
</button>
<input name="attr_constitution_save_action" type="hidden" title="@{constitution_save_action}"/>
</div>
</div>
<div class="ability-display intelligence">
<button class="roller" name="roll_intelligence" data-i18n="intelligence" value="@{intelligence_action}" type="roll">
</button>
<button name="act_intelligence-action" hidden="" type="action">
</button>
<input name="attr_intelligence_action" type="hidden" title="@{intelligence_action}"/>
<input class="plus-control" name="attr_intelligence_mod" value="0" hidden="" type="hidden" title="@{intelligence_mod}"/><span class="ability-display__mod circle thick-border plus-display" name="attr_intelligence_mod" title="@{intelligence_mod}"></span>
<input class="thin-border recess-effect ability-display__score" name="attr_intelligence" value="10" type="number" title="@{intelligence}"/>
<div class="ability-display__save thin-border recess-effect">
<div class="fill-left prof-display">
<input class="float-effect circle fill-left__radio" name="attr_intelligence_save_proficiency" value="0" type="hidden" title="@{intelligence_save_proficiency}"/>
<input class="float-effect circle fill-left__radio" name="attr_intelligence_save_proficiency" value="1" type="checkbox" title="@{intelligence_save_proficiency}"/>
</div>
<button class="roller--mod-display roller" name="roll_intelligence_save" value="@{intelligence_save_action}" type="roll">
<input class="plus-control" name="attr_intelligence_save" value="0" hidden="" type="hidden" title="@{intelligence_save}"/><span class="plus-display" name="attr_intelligence_save" title="@{intelligence_save}"></span>
</button>
<button name="act_intelligence-save-action" hidden="" type="action">
</button>
<input name="attr_intelligence_save_action" type="hidden" title="@{intelligence_save_action}"/>
</div>
</div>
<div class="ability-display wisdom">
<button class="roller" name="roll_wisdom" data-i18n="wisdom" value="@{wisdom_action}" type="roll">
</button>
<button name="act_wisdom-action" hidden="" type="action">
</button>
<input name="attr_wisdom_action" type="hidden" title="@{wisdom_action}"/>
<input class="plus-control" name="attr_wisdom_mod" value="0" hidden="" type="hidden" title="@{wisdom_mod}"/><span class="ability-display__mod circle thick-border plus-display" name="attr_wisdom_mod" title="@{wisdom_mod}"></span>
<input class="thin-border recess-effect ability-display__score" name="attr_wisdom" value="10" type="number" title="@{wisdom}"/>
<div class="ability-display__save thin-border recess-effect">
<div class="fill-left prof-display">
<input class="float-effect circle fill-left__radio" name="attr_wisdom_save_proficiency" value="0" type="hidden" title="@{wisdom_save_proficiency}"/>
<input class="float-effect circle fill-left__radio" name="attr_wisdom_save_proficiency" value="1" type="checkbox" title="@{wisdom_save_proficiency}"/>
</div>
<button class="roller--mod-display roller" name="roll_wisdom_save" value="@{wisdom_save_action}" type="roll">
<input class="plus-control" name="attr_wisdom_save" value="0" hidden="" type="hidden" title="@{wisdom_save}"/><span class="plus-display" name="attr_wisdom_save" title="@{wisdom_save}"></span>
</button>
<button name="act_wisdom-save-action" hidden="" type="action">
</button>
<input name="attr_wisdom_save_action" type="hidden" title="@{wisdom_save_action}"/>
</div>
</div>
<div class="ability-display charisma">
<button class="roller" name="roll_charisma" data-i18n="charisma" value="@{charisma_action}" type="roll">
</button>
<button name="act_charisma-action" hidden="" type="action">
</button>
<input name="attr_charisma_action" type="hidden" title="@{charisma_action}"/>
<input class="plus-control" name="attr_charisma_mod" value="0" hidden="" type="hidden" title="@{charisma_mod}"/><span class="ability-display__mod circle thick-border plus-display" name="attr_charisma_mod" title="@{charisma_mod}"></span>
<input class="thin-border recess-effect ability-display__score" name="attr_charisma" value="10" type="number" title="@{charisma}"/>
<div class="ability-display__save thin-border recess-effect">
<div class="fill-left prof-display">
<input class="float-effect circle fill-left__radio" name="attr_charisma_save_proficiency" value="0" type="hidden" title="@{charisma_save_proficiency}"/>
<input class="float-effect circle fill-left__radio" name="attr_charisma_save_proficiency" value="1" type="checkbox" title="@{charisma_save_proficiency}"/>
</div>
<button class="roller--mod-display roller" name="roll_charisma_save" value="@{charisma_save_action}" type="roll">
<input class="plus-control" name="attr_charisma_save" value="0" hidden="" type="hidden" title="@{charisma_save}"/><span class="plus-display" name="attr_charisma_save" title="@{charisma_save}"></span>
</button>
<button name="act_charisma-save-action" hidden="" type="action">
</button>
<input name="attr_charisma_save_action" type="hidden" title="@{charisma_save_action}"/>
</div>
</div>
</div>
<div class="section--ability-skill__skills recess-effect">
<button class="roller" name="roll_acrobatics" value="@{acrobatics_action}" type="roll"><span class="capitalize" data-i18n="acrobatics"></span>
</button>
<button name="act_acrobatics-action" hidden="" type="action">
</button>
<input name="attr_acrobatics_action" type="hidden" title="@{acrobatics_action}"/>
<input class="plus-control" name="attr_acrobatics" value="0" hidden="" type="hidden" title="@{acrobatics}"/><span class="skill-mod plus-display" name="attr_acrobatics" title="@{acrobatics}"></span>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_acrobatics_proficiency" value="0" type="hidden" title="@{acrobatics_proficiency}"/>
<input class="circle fill-left__radio" name="attr_acrobatics_proficiency" value="1" type="checkbox" title="@{acrobatics_proficiency}"/>
<input class="circle fill-left__radio" name="attr_acrobatics_proficiency" value="2" type="checkbox" title="@{acrobatics_proficiency}"/>
</div>
<button class="roller" name="roll_arts_and_crafts" value="@{arts_and_crafts_action}" type="roll"><span class="capitalize" data-i18n="arts and crafts"></span>
</button>
<button name="act_arts-and-crafts-action" hidden="" type="action">
</button>
<input name="attr_arts_and_crafts_action" type="hidden" title="@{arts_and_crafts_action}"/>
<input class="plus-control" name="attr_arts_and_crafts" value="0" hidden="" type="hidden" title="@{arts_and_crafts}"/><span class="skill-mod plus-display" name="attr_arts_and_crafts" title="@{arts_and_crafts}"></span>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_arts_and_crafts_proficiency" value="0" type="hidden" title="@{arts_and_crafts_proficiency}"/>
<input class="circle fill-left__radio" name="attr_arts_and_crafts_proficiency" value="1" type="checkbox" title="@{arts_and_crafts_proficiency}"/>
<input class="circle fill-left__radio" name="attr_arts_and_crafts_proficiency" value="2" type="checkbox" title="@{arts_and_crafts_proficiency}"/>
</div>
<button class="roller" name="roll_athletics" value="@{athletics_action}" type="roll"><span class="capitalize" data-i18n="athletics"></span>
</button>
<button name="act_athletics-action" hidden="" type="action">
</button>
<input name="attr_athletics_action" type="hidden" title="@{athletics_action}"/>
<input class="plus-control" name="attr_athletics" value="0" hidden="" type="hidden" title="@{athletics}"/><span class="skill-mod plus-display" name="attr_athletics" title="@{athletics}"></span>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_athletics_proficiency" value="0" type="hidden" title="@{athletics_proficiency}"/>
<input class="circle fill-left__radio" name="attr_athletics_proficiency" value="1" type="checkbox" title="@{athletics_proficiency}"/>
<input class="circle fill-left__radio" name="attr_athletics_proficiency" value="2" type="checkbox" title="@{athletics_proficiency}"/>
</div>
<button class="roller" name="roll_computers" value="@{computers_action}" type="roll"><span class="capitalize" data-i18n="computers"></span>
</button>
<button name="act_computers-action" hidden="" type="action">
</button>
<input name="attr_computers_action" type="hidden" title="@{computers_action}"/>
<input class="plus-control" name="attr_computers" value="0" hidden="" type="hidden" title="@{computers}"/><span class="skill-mod plus-display" name="attr_computers" title="@{computers}"></span>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_computers_proficiency" value="0" type="hidden" title="@{computers_proficiency}"/>
<input class="circle fill-left__radio" name="attr_computers_proficiency" value="1" type="checkbox" title="@{computers_proficiency}"/>
<input class="circle fill-left__radio" name="attr_computers_proficiency" value="2" type="checkbox" title="@{computers_proficiency}"/>
</div>
<button class="roller" name="roll_deception" value="@{deception_action}" type="roll"><span class="capitalize" data-i18n="deception"></span>
</button>
<button name="act_deception-action" hidden="" type="action">
</button>
<input name="attr_deception_action" type="hidden" title="@{deception_action}"/>
<input class="plus-control" name="attr_deception" value="0" hidden="" type="hidden" title="@{deception}"/><span class="skill-mod plus-display" name="attr_deception" title="@{deception}"></span>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_deception_proficiency" value="0" type="hidden" title="@{deception_proficiency}"/>
<input class="circle fill-left__radio" name="attr_deception_proficiency" value="1" type="checkbox" title="@{deception_proficiency}"/>
<input class="circle fill-left__radio" name="attr_deception_proficiency" value="2" type="checkbox" title="@{deception_proficiency}"/>
</div>
<button class="roller" name="roll_endurance" value="@{endurance_action}" type="roll"><span class="capitalize" data-i18n="endurance"></span>
</button>
<button name="act_endurance-action" hidden="" type="action">
</button>
<input name="attr_endurance_action" type="hidden" title="@{endurance_action}"/>
<input class="plus-control" name="attr_endurance" value="0" hidden="" type="hidden" title="@{endurance}"/><span class="skill-mod plus-display" name="attr_endurance" title="@{endurance}"></span>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_endurance_proficiency" value="0" type="hidden" title="@{endurance_proficiency}"/>
<input class="circle fill-left__radio" name="attr_endurance_proficiency" value="1" type="checkbox" title="@{endurance_proficiency}"/>
<input class="circle fill-left__radio" name="attr_endurance_proficiency" value="2" type="checkbox" title="@{endurance_proficiency}"/>
</div>
<button class="roller" name="roll_insight" value="@{insight_action}" type="roll"><span class="capitalize" data-i18n="insight"></span>
</button>
<button name="act_insight-action" hidden="" type="action">
</button>
<input name="attr_insight_action" type="hidden" title="@{insight_action}"/>
<input class="plus-control" name="attr_insight" value="0" hidden="" type="hidden" title="@{insight}"/><span class="skill-mod plus-display" name="attr_insight" title="@{insight}"></span>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_insight_proficiency" value="0" type="hidden" title="@{insight_proficiency}"/>
<input class="circle fill-left__radio" name="attr_insight_proficiency" value="1" type="checkbox" title="@{insight_proficiency}"/>
<input class="circle fill-left__radio" name="attr_insight_proficiency" value="2" type="checkbox" title="@{insight_proficiency}"/>
</div>
<button class="roller" name="roll_intimidation" value="@{intimidation_action}" type="roll"><span class="capitalize" data-i18n="intimidation"></span>
</button>
<button name="act_intimidation-action" hidden="" type="action">
</button>
<input name="attr_intimidation_action" type="hidden" title="@{intimidation_action}"/>
<input class="plus-control" name="attr_intimidation" value="0" hidden="" type="hidden" title="@{intimidation}"/><span class="skill-mod plus-display" name="attr_intimidation" title="@{intimidation}"></span>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_intimidation_proficiency" value="0" type="hidden" title="@{intimidation_proficiency}"/>
<input class="circle fill-left__radio" name="attr_intimidation_proficiency" value="1" type="checkbox" title="@{intimidation_proficiency}"/>
<input class="circle fill-left__radio" name="attr_intimidation_proficiency" value="2" type="checkbox" title="@{intimidation_proficiency}"/>
</div>
<button class="roller" name="roll_investigation" value="@{investigation_action}" type="roll"><span class="capitalize" data-i18n="investigation"></span>
</button>
<button name="act_investigation-action" hidden="" type="action">
</button>
<input name="attr_investigation_action" type="hidden" title="@{investigation_action}"/>
<input class="plus-control" name="attr_investigation" value="0" hidden="" type="hidden" title="@{investigation}"/><span class="skill-mod plus-display" name="attr_investigation" title="@{investigation}"></span>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_investigation_proficiency" value="0" type="hidden" title="@{investigation_proficiency}"/>
<input class="circle fill-left__radio" name="attr_investigation_proficiency" value="1" type="checkbox" title="@{investigation_proficiency}"/>
<input class="circle fill-left__radio" name="attr_investigation_proficiency" value="2" type="checkbox" title="@{investigation_proficiency}"/>
</div>
<button class="roller" name="roll_mechanics" value="@{mechanics_action}" type="roll"><span class="capitalize" data-i18n="mechanics"></span>
</button>
<button name="act_mechanics-action" hidden="" type="action">
</button>
<input name="attr_mechanics_action" type="hidden" title="@{mechanics_action}"/>
<input class="plus-control" name="attr_mechanics" value="0" hidden="" type="hidden" title="@{mechanics}"/><span class="skill-mod plus-display" name="attr_mechanics" title="@{mechanics}"></span>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_mechanics_proficiency" value="0" type="hidden" title="@{mechanics_proficiency}"/>
<input class="circle fill-left__radio" name="attr_mechanics_proficiency" value="1" type="checkbox" title="@{mechanics_proficiency}"/>
<input class="circle fill-left__radio" name="attr_mechanics_proficiency" value="2" type="checkbox" title="@{mechanics_proficiency}"/>
</div>
<button class="roller" name="roll_medicine" value="@{medicine_action}" type="roll"><span class="capitalize" data-i18n="medicine"></span>
</button>
<button name="act_medicine-action" hidden="" type="action">
</button>
<input name="attr_medicine_action" type="hidden" title="@{medicine_action}"/>
<input class="plus-control" name="attr_medicine" value="0" hidden="" type="hidden" title="@{medicine}"/><span class="skill-mod plus-display" name="attr_medicine" title="@{medicine}"></span>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_medicine_proficiency" value="0" type="hidden" title="@{medicine_proficiency}"/>
<input class="circle fill-left__radio" name="attr_medicine_proficiency" value="1" type="checkbox" title="@{medicine_proficiency}"/>
<input class="circle fill-left__radio" name="attr_medicine_proficiency" value="2" type="checkbox" title="@{medicine_proficiency}"/>
</div>
<button class="roller" name="roll_natural_science" value="@{natural_science_action}" type="roll"><span class="capitalize" data-i18n="natural science"></span>
</button>
<button name="act_natural-science-action" hidden="" type="action">
</button>
<input name="attr_natural_science_action" type="hidden" title="@{natural_science_action}"/>
<input class="plus-control" name="attr_natural_science" value="0" hidden="" type="hidden" title="@{natural_science}"/><span class="skill-mod plus-display" name="attr_natural_science" title="@{natural_science}"></span>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_natural_science_proficiency" value="0" type="hidden" title="@{natural_science_proficiency}"/>
<input class="circle fill-left__radio" name="attr_natural_science_proficiency" value="1" type="checkbox" title="@{natural_science_proficiency}"/>
<input class="circle fill-left__radio" name="attr_natural_science_proficiency" value="2" type="checkbox" title="@{natural_science_proficiency}"/>
</div>
<button class="roller" name="roll_perception" value="@{perception_action}" type="roll"><span class="capitalize" data-i18n="perception"></span>
</button>
<button name="act_perception-action" hidden="" type="action">
</button>
<input name="attr_perception_action" type="hidden" title="@{perception_action}"/>
<input class="plus-control" name="attr_perception" value="0" hidden="" type="hidden" title="@{perception}"/><span class="skill-mod plus-display" name="attr_perception" title="@{perception}"></span>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_perception_proficiency" value="0" type="hidden" title="@{perception_proficiency}"/>
<input class="circle fill-left__radio" name="attr_perception_proficiency" value="1" type="checkbox" title="@{perception_proficiency}"/>
<input class="circle fill-left__radio" name="attr_perception_proficiency" value="2" type="checkbox" title="@{perception_proficiency}"/>
</div>
<button class="roller" name="roll_performance" value="@{performance_action}" type="roll"><span class="capitalize" data-i18n="performance"></span>
</button>
<button name="act_performance-action" hidden="" type="action">
</button>
<input name="attr_performance_action" type="hidden" title="@{performance_action}"/>
<input class="plus-control" name="attr_performance" value="0" hidden="" type="hidden" title="@{performance}"/><span class="skill-mod plus-display" name="attr_performance" title="@{performance}"></span>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_performance_proficiency" value="0" type="hidden" title="@{performance_proficiency}"/>
<input class="circle fill-left__radio" name="attr_performance_proficiency" value="1" type="checkbox" title="@{performance_proficiency}"/>
<input class="circle fill-left__radio" name="attr_performance_proficiency" value="2" type="checkbox" title="@{performance_proficiency}"/>
</div>
<button class="roller" name="roll_persuasion" value="@{persuasion_action}" type="roll"><span class="capitalize" data-i18n="persuasion"></span>
</button>
<button name="act_persuasion-action" hidden="" type="action">
</button>
<input name="attr_persuasion_action" type="hidden" title="@{persuasion_action}"/>
<input class="plus-control" name="attr_persuasion" value="0" hidden="" type="hidden" title="@{persuasion}"/><span class="skill-mod plus-display" name="attr_persuasion" title="@{persuasion}"></span>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_persuasion_proficiency" value="0" type="hidden" title="@{persuasion_proficiency}"/>
<input class="circle fill-left__radio" name="attr_persuasion_proficiency" value="1" type="checkbox" title="@{persuasion_proficiency}"/>
<input class="circle fill-left__radio" name="attr_persuasion_proficiency" value="2" type="checkbox" title="@{persuasion_proficiency}"/>
</div>
<button class="roller" name="roll_security" value="@{security_action}" type="roll"><span class="capitalize" data-i18n="security"></span>
</button>
<button name="act_security-action" hidden="" type="action">
</button>
<input name="attr_security_action" type="hidden" title="@{security_action}"/>
<input class="plus-control" name="attr_security" value="0" hidden="" type="hidden" title="@{security}"/><span class="skill-mod plus-display" name="attr_security" title="@{security}"></span>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_security_proficiency" value="0" type="hidden" title="@{security_proficiency}"/>
<input class="circle fill-left__radio" name="attr_security_proficiency" value="1" type="checkbox" title="@{security_proficiency}"/>
<input class="circle fill-left__radio" name="attr_security_proficiency" value="2" type="checkbox" title="@{security_proficiency}"/>
</div>
<button class="roller" name="roll_sleight_of_hand" value="@{sleight_of_hand_action}" type="roll"><span class="capitalize" data-i18n="sleight of hand"></span>
</button>
<button name="act_sleight-of-hand-action" hidden="" type="action">
</button>
<input name="attr_sleight_of_hand_action" type="hidden" title="@{sleight_of_hand_action}"/>
<input class="plus-control" name="attr_sleight_of_hand" value="0" hidden="" type="hidden" title="@{sleight_of_hand}"/><span class="skill-mod plus-display" name="attr_sleight_of_hand" title="@{sleight_of_hand}"></span>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_sleight_of_hand_proficiency" value="0" type="hidden" title="@{sleight_of_hand_proficiency}"/>
<input class="circle fill-left__radio" name="attr_sleight_of_hand_proficiency" value="1" type="checkbox" title="@{sleight_of_hand_proficiency}"/>
<input class="circle fill-left__radio" name="attr_sleight_of_hand_proficiency" value="2" type="checkbox" title="@{sleight_of_hand_proficiency}"/>
</div>
<button class="roller" name="roll_social_sciences" value="@{social_sciences_action}" type="roll"><span class="capitalize" data-i18n="social sciences"></span>
</button>
<button name="act_social-sciences-action" hidden="" type="action">
</button>
<input name="attr_social_sciences_action" type="hidden" title="@{social_sciences_action}"/>
<input class="plus-control" name="attr_social_sciences" value="0" hidden="" type="hidden" title="@{social_sciences}"/><span class="skill-mod plus-display" name="attr_social_sciences" title="@{social_sciences}"></span>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_social_sciences_proficiency" value="0" type="hidden" title="@{social_sciences_proficiency}"/>
<input class="circle fill-left__radio" name="attr_social_sciences_proficiency" value="1" type="checkbox" title="@{social_sciences_proficiency}"/>
<input class="circle fill-left__radio" name="attr_social_sciences_proficiency" value="2" type="checkbox" title="@{social_sciences_proficiency}"/>
</div>
<button class="roller" name="roll_stealth" value="@{stealth_action}" type="roll"><span class="capitalize" data-i18n="stealth"></span>
</button>
<button name="act_stealth-action" hidden="" type="action">
</button>
<input name="attr_stealth_action" type="hidden" title="@{stealth_action}"/>
<input class="plus-control" name="attr_stealth" value="0" hidden="" type="hidden" title="@{stealth}"/><span class="skill-mod plus-display" name="attr_stealth" title="@{stealth}"></span>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_stealth_proficiency" value="0" type="hidden" title="@{stealth_proficiency}"/>
<input class="circle fill-left__radio" name="attr_stealth_proficiency" value="1" type="checkbox" title="@{stealth_proficiency}"/>
<input class="circle fill-left__radio" name="attr_stealth_proficiency" value="2" type="checkbox" title="@{stealth_proficiency}"/>
</div>
<button class="roller" name="roll_streetwise" value="@{streetwise_action}" type="roll"><span class="capitalize" data-i18n="streetwise"></span>
</button>
<button name="act_streetwise-action" hidden="" type="action">
</button>
<input name="attr_streetwise_action" type="hidden" title="@{streetwise_action}"/>
<input class="plus-control" name="attr_streetwise" value="0" hidden="" type="hidden" title="@{streetwise}"/><span class="skill-mod plus-display" name="attr_streetwise" title="@{streetwise}"></span>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_streetwise_proficiency" value="0" type="hidden" title="@{streetwise_proficiency}"/>
<input class="circle fill-left__radio" name="attr_streetwise_proficiency" value="1" type="checkbox" title="@{streetwise_proficiency}"/>
<input class="circle fill-left__radio" name="attr_streetwise_proficiency" value="2" type="checkbox" title="@{streetwise_proficiency}"/>
</div>
<button class="roller" name="roll_survival" value="@{survival_action}" type="roll"><span class="capitalize" data-i18n="survival"></span>
</button>
<button name="act_survival-action" hidden="" type="action">
</button>
<input name="attr_survival_action" type="hidden" title="@{survival_action}"/>
<input class="plus-control" name="attr_survival" value="0" hidden="" type="hidden" title="@{survival}"/><span class="skill-mod plus-display" name="attr_survival" title="@{survival}"></span>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_survival_proficiency" value="0" type="hidden" title="@{survival_proficiency}"/>
<input class="circle fill-left__radio" name="attr_survival_proficiency" value="1" type="checkbox" title="@{survival_proficiency}"/>
<input class="circle fill-left__radio" name="attr_survival_proficiency" value="2" type="checkbox" title="@{survival_proficiency}"/>
</div>
<button class="roller" name="roll_vehicles" value="@{vehicles_action}" type="roll"><span class="capitalize" data-i18n="vehicles"></span>
</button>
<button name="act_vehicles-action" hidden="" type="action">
</button>
<input name="attr_vehicles_action" type="hidden" title="@{vehicles_action}"/>
<input class="plus-control" name="attr_vehicles" value="0" hidden="" type="hidden" title="@{vehicles}"/><span class="skill-mod plus-display" name="attr_vehicles" title="@{vehicles}"></span>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_vehicles_proficiency" value="0" type="hidden" title="@{vehicles_proficiency}"/>
<input class="circle fill-left__radio" name="attr_vehicles_proficiency" value="1" type="checkbox" title="@{vehicles_proficiency}"/>
<input class="circle fill-left__radio" name="attr_vehicles_proficiency" value="2" type="checkbox" title="@{vehicles_proficiency}"/>
</div>
</div>
</div>
</section>
<section class="section section--layout section--defense float-effect section--fill">
<div class="section__content">
<div class="health">
<div class="health--hp">
<label class="input-label stacked health-hp__max"><span class="input-label__text" data-i18n="max"></span>
<input class="input-label__input" name="attr_hp_max" type="number" title="@{hp|max}"/>
</label>
<label class="input-label stacked health-hp__temp"><span class="input-label__text" data-i18n="temp"></span>
<input class="input-label__input" name="attr_temporary_hp" type="number" title="@{temporary_hp}"/>
</label>
<label class="input-label stacked health-hp__current"><span class="input-label__text" data-i18n="current"></span>
<input class="input-label__input" name="attr_hp" type="number" title="@{hp}"/>
</label>
<div class="health-hp__dice input-label">
<button class="roller" name="roll_hit_dice" data-i18n="hit dice" value="@{hit_dice_action}" type="roll">
</button>
<button name="act_hit-dice-action" hidden="" type="action">
</button>
<input name="attr_hit_dice_action" type="hidden" title="@{hit_dice_action}"/>
<input name="attr_hit_dice" type="number" title="@{hit_dice}"/><span class="input-label__slash">/</span>
<input name="attr_hit_dice_max" value="1" type="number" title="@{hit_dice|max}"/>
<select name="attr_hit_dice_size" value="8" title="@{hit_dice_size}">
<option data-i18n="d6" value="6">
</option>
<option data-i18n="d8" value="8">
</option>
<option data-i18n="d10" value="10">
</option>
<option data-i18n="d12" value="12">
</option>
</select>
</div>
</div>
<div class="health--death">
<button class="roller" name="roll_death_save" data-i18n="death saves" value="@{death_save_action}" type="roll">
</button>
<button name="act_death-save-action" hidden="" type="action">
</button>
<input name="attr_death_save_action" type="hidden" title="@{death_save_action}"/>
<div class="input-label"><span data-i18n="success"></span>
<div class="fill-left">
<input class="fill-left__radio" name="attr_death_success" value="0" type="hidden" title="@{death_success}"/>
<input class="fill-left__radio" name="attr_death_success" value="1" type="checkbox" title="@{death_success}"/>
<input class="fill-left__radio" name="attr_death_success" value="2" type="checkbox" title="@{death_success}"/>
<input class="fill-left__radio" name="attr_death_success" value="3" type="checkbox" title="@{death_success}"/>
</div>
</div>
<div class="input-label"><span data-i18n="fail"></span>
<div class="fill-left">
<input class="fill-left__radio" name="attr_death_fail" value="0" type="hidden" title="@{death_fail}"/>
<input class="fill-left__radio" name="attr_death_fail" value="1" type="checkbox" title="@{death_fail}"/>
<input class="fill-left__radio" name="attr_death_fail" value="2" type="checkbox" title="@{death_fail}"/>
<input class="fill-left__radio" name="attr_death_fail" value="3" type="checkbox" title="@{death_fail}"/>
</div>
</div>
</div>
</div>
<div class="bonuses">
<div class="input-label stacked proficiency"><span data-i18n="proficiency bonus"></span>
<input class="plus-control" name="attr_proficiency" value="2" hidden="" type="hidden" title="@{proficiency}"/><span class="input-label__input plus-display" name="attr_proficiency" type="number" value="2" title="@{proficiency}"></span>
</div>
<label class="input-label stacked defense"><span class="input-label__text" data-i18n="defense"></span>
<input class="input-label__input" name="attr_defense" type="number" title="@{defense}"/>
</label>
<div class="input-label stacked initiative">
<button class="roller" name="roll_initiative" data-i18n="initiative" value="@{initiative_action}" type="roll">
</button>
<button name="act_initiative-action" hidden="" type="action">
</button>
<input name="attr_initiative_action" type="hidden" title="@{initiative_action}"/>
<input class="plus-control" name="attr_initiative" value="0" hidden="" type="hidden" title="@{initiative}"/><span class="input-label__input plus-display" name="attr_initiative" type="number" value="0" readonly="" title="@{initiative}"></span>
</div>
<label class="input-label stacked passive-perception"><span class="input-label__text" data-i18n="passive perception"></span>
<input class="input-label__input" name="attr_passive_perception" type="number" value="10" readonly="" title="@{passive_perception}"/>
</label>
</div>
<div class="points">
<div class="points__pools">
<label class="input-label stacked genius"><span class="input-label__text" data-i18n="genius"></span>
<input class="input-label__input" name="attr_genius" type="number" title="@{genius}"/>
</label>
<label class="input-label stacked focus"><span class="input-label__text" data-i18n="focus"></span>
<input class="input-label__input" name="attr_focus" type="number" title="@{focus}"/>
</label>
<label class="input-label stacked influence"><span class="input-label__text" data-i18n="influence"></span>
<input class="input-label__input" name="attr_influence" type="number" title="@{influence}"/>
</label>
</div>
<div class="points__inspiration">
<label class="input-label stacked inspiration"><span class="input-label__text" data-i18n="inspiration"></span>
<input class="input-label__input" name="attr_inspiration" type="number" title="@{inspiration}"/>
</label>
</div>
</div>
</div>
</section>
<div class="equipment-prof__container">
<h2 class="equipment-prof__header">Equipment Proficiencies</h2>
<div class="equipment-prof__radioInput">
<div class="equipment-prof__tiers equipment-prof__basic">
<div class="input-label">
<h5 data-i18n="basic"></h5>
<input name="attr_proficiency_basic" value="1" checked="" type="checkbox" title="@{proficiency_basic}"/>
</div>
</div>
<div class="equipment-prof__tiers equipment-prof__basic tickmark requires-basic equipment-prof__tier1Line prof__visibility"></div>
<div class="equipment-prof__tiers requires-basic">
<div class="input-label">
<h5 data-i18n="advanced"></h5>
<input name="attr_proficiency_advanced" value="1" type="checkbox" title="@{proficiency_advanced}"/>
</div>
</div>
<div class="equipment-prof__tiers requires-basic">
<div class="input-label">
<h5 data-i18n="historical"></h5>
<input name="attr_proficiency_historical" value="1" type="checkbox" title="@{proficiency_historical}"/>
</div>
</div>
<div class="equipment-prof__tiers requires-basic">
<div class="input-label">
<h5 data-i18n="improvised"></h5>
<input name="attr_proficiency_improvised" value="1" type="checkbox" title="@{proficiency_improvised}"/>
</div>
</div>
<div class="equipment-prof__tiers equipment-prof__basic requires-advanced equipment-prof__tier2Line prof__visibility"></div>
<div class="equipment-prof__tiers requires-advanced">
<div class="input-label">
<h5 data-i18n="military"></h5>
<input name="attr_proficiency_military" value="1" type="checkbox" title="@{proficiency_military}"/>
</div>
</div>
<div> </div>
<div></div>
</div>
<div class="equipment-prof__misc equipment-prof__miscFormat repeating-section-container">
<h3 class="prof-misc__fontColor">Miscellaneous Proficiencies</h3>
<button class="repcontrol-button repcontrol-button--add" name="act_add-equipmemt-prof-misc" type="action">
</button>
<fieldset class="repeating_equipmemt-prof-misc">
<div class="float-effect item-head">
<input name="attr_misc-proficiency" type="text" title="@{repeating_equipmemt-prof-misc_$X_misc-proficiency}"/>
</div>
</fieldset>
</div>
</div>
<section class="section section__shadow section--armor collapse-container item-head-container section--has-header">
<div class="section--layout">
<h2 class="section__header" data-i18n="armor">
</h2>
<div class="section__content">
<input class="collapse" name="attr_armor_collapse" value="1" type="checkbox" title="@{armor_collapse}"/>
<div class="float-effect item-head">
<input name="attr_armor_name" data-i18n-placeholder="armor name" type="text" title="@{armor_name}"/>
<label class="input-label form-label"><span class="uppercase form-label__span input-label__text" data-i18n="av"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_armor_value" type="number" title="@{armor_value}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="bulk"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_armor_bulk" type="number" title="@{armor_bulk}"/>
</label>
</div>
<section class="section section--layout expanded description section--fill">
<div class="section__content">
<div class="flex-box flex-column half-gap">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="properties"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_armor_properties" type="text" title="@{armor_properties}"/>
</label>
<div class="adaptive adaptive--text underlined"><span class="adaptive--text__span" name="attr_armor_description" title="@{armor_description}"></span>
<textarea class="adaptive--text__textarea" name="attr_armor_description" title="@{armor_description}"></textarea>
</div>
</div>
</div>
</section>
</div>
</div>
</section>
<section class="section section__shadow section--weapons repeating-section-container section--has-header">
<div class="section--layout">
<h2 class="section__header" data-i18n="weapons">
</h2>
<div class="section__content">
<button class="repcontrol-button repcontrol-button--add" name="act_add-weapons" type="action">
</button>
<fieldset class="repeating_weapons">
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_weapons_$X_collapse}"/>
<div class="float-effect item-head">
<button class="roller" name="roll_attack_roll" type="roll" value="@{attack_action}">
</button>
<button name="act_attack-action" hidden="" type="action">
</button>
<input name="attr_attack_action" type="hidden" title="@{repeating_weapons_$X_attack_action}"/>
<input class="border-value--control" name="attr_name_only" hidden="" value="" type="hidden" title="@{repeating_weapons_$X_name_only}"/>
<input name="attr_name" type="text" data-i18n-placeholder="weapon name" title="@{repeating_weapons_$X_name}"/>
<input class="display-value-control" name="attr_bonus_calc" hidden="" value="" type="hidden" title="@{repeating_weapons_$X_bonus_calc}"/>
<div class="input-label form-label controlled-display">
<input name="attr_total_translation" value="total" type="hidden" title="@{repeating_weapons_$X_total_translation}"/><span class="form-label__span input-label__text" name="attr_total_translation" data-i18n-dynamic="" title="@{repeating_weapons_$X_total_translation}"></span>
<input class="border-control--invert" name="attr_damage_1_disable" hidden="" value="1" checked="" type="checkbox" title="@{repeating_weapons_$X_damage_1_disable}"/><span class="form-label__input recess-effect input-label__input" name="attr_bonus_calc" title="@{repeating_weapons_$X_bonus_calc}"></span>
</div>
<input class="display-control--invert" name="attr_damage_1_disable" hidden="" value="1" type="checkbox" title="@{repeating_weapons_$X_damage_1_disable}"/>
<div class="input-label form-label controlled-display"><span class="form-label__span input-label__text" name="attr_damage_label" data-i18n="Damage" title="@{repeating_weapons_$X_damage_label}"></span><span class="form-label__input recess-effect input-label__input" name="attr_total_damage" title="@{repeating_weapons_$X_total_damage}"></span>
</div>
</div>
<section class="section section--layout expanded description section--fill">
<div class="section__content">
<div class="flex-box flex-column half-gap">
<input name="attr_attack_disable" value="1" type="hidden" title="@{repeating_weapons_$X_attack_disable}"/>
<input name="attr_save_disable" value="1" type="hidden" title="@{repeating_weapons_$X_save_disable}"/>
<input name="attr_damage_1_disable" value="1" type="hidden" title="@{repeating_weapons_$X_damage_1_disable}"/>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_attack_disable" value="1" type="checkbox" title="@{repeating_weapons_$X_attack_disable}" checked="checked"/>
<h3 data-i18n="attack"></h3>
<div class="expanded attack flex-box flex-wrap half-gap justify-space-around">
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="ability"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_attack_ability" title="@{repeating_weapons_$X_attack_ability}">
<option value="">
</option>
<option value="@{strength_mod}" data-i18n="strength abbreviation">
</option>
<option value="@{dexterity_mod}" data-i18n="dexterity abbreviation">
</option>
<option value="@{constitution_mod}" data-i18n="constitution abbreviation">
</option>
<option value="@{intelligence_mod}" data-i18n="intelligence abbreviation">
</option>
<option value="@{wisdom_mod}" data-i18n="wisdom abbreviation">
</option>
<option value="@{charisma_mod}" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="crit on"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_threshold" type="number" value="20" title="@{repeating_weapons_$X_critical_threshold}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="bonus"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_attack_bonus" type="number" title="@{repeating_weapons_$X_attack_bonus}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="pv"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_penetration" type="number" title="@{repeating_weapons_$X_penetration}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_damage_1_disable" value="1" type="checkbox" title="@{repeating_weapons_$X_damage_1_disable}" checked="checked"/>
<h3 data-i18n="damage 1"></h3>
<div class="expanded damage 1 flex-box flex-wrap half-gap justify-space-around">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="damage 1"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_1" type="text" title="@{repeating_weapons_$X_damage_1}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="custom crit"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_1" type="text" title="@{repeating_weapons_$X_critical_1}"/>
</label>
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="ability"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_damage_ability_1" title="@{repeating_weapons_$X_damage_ability_1}">
<option value="">
</option>
<option value="@{strength_mod}" data-i18n="strength abbreviation">
</option>
<option value="@{dexterity_mod}" data-i18n="dexterity abbreviation">
</option>
<option value="@{constitution_mod}" data-i18n="constitution abbreviation">
</option>
<option value="@{intelligence_mod}" data-i18n="intelligence abbreviation">
</option>
<option value="@{wisdom_mod}" data-i18n="wisdom abbreviation">
</option>
<option value="@{charisma_mod}" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="type"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_type_1" type="text" title="@{repeating_weapons_$X_damage_type_1}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_damage_2_disable" value="1" type="checkbox" title="@{repeating_weapons_$X_damage_2_disable}" checked="checked"/>
<h3 data-i18n="damage 2"></h3>
<div class="expanded damage 2 flex-box flex-wrap half-gap justify-space-around">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="damage 2"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_2" type="text" title="@{repeating_weapons_$X_damage_2}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="custom crit"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_2" type="text" title="@{repeating_weapons_$X_critical_2}"/>
</label>
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="ability"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_damage_ability_2" title="@{repeating_weapons_$X_damage_ability_2}">
<option value="">
</option>
<option value="@{strength_mod}" data-i18n="strength abbreviation">
</option>
<option value="@{dexterity_mod}" data-i18n="dexterity abbreviation">
</option>
<option value="@{constitution_mod}" data-i18n="constitution abbreviation">
</option>
<option value="@{intelligence_mod}" data-i18n="intelligence abbreviation">
</option>
<option value="@{wisdom_mod}" data-i18n="wisdom abbreviation">
</option>
<option value="@{charisma_mod}" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="type"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_type_2" type="text" title="@{repeating_weapons_$X_damage_type_2}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_save_disable" value="1" type="checkbox" title="@{repeating_weapons_$X_save_disable}" checked="checked"/>
<h3 data-i18n="save"></h3>
<div class="expanded save flex-box flex-wrap half-gap justify-space-around">
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="save type"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_save_type" title="@{repeating_weapons_$X_save_type}">
<option value="">
</option>
<option value="strength save" data-i18n="strength abbreviation">
</option>
<option value="dexterity save" data-i18n="dexterity abbreviation">
</option>
<option value="constitution save" data-i18n="constitution abbreviation">
</option>
<option value="intelligence save" data-i18n="intelligence abbreviation">
</option>
<option value="wisdom save" data-i18n="wisdom abbreviation">
</option>
<option value="charisma save" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="based on"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_save_basis" title="@{repeating_weapons_$X_save_basis}">
<option value="" data-i18n="static">
</option>
<option value="@{strength_mod}" data-i18n="strength abbreviation">
</option>
<option value="@{dexterity_mod}" data-i18n="dexterity abbreviation">
</option>
<option value="@{constitution_mod}" data-i18n="constitution abbreviation">
</option>
<option value="@{intelligence_mod}" data-i18n="intelligence abbreviation">
</option>
<option value="@{wisdom_mod}" data-i18n="wisdom abbreviation">
</option>
<option value="@{charisma_mod}" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="bonus"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_dc_bonus" type="number" title="@{repeating_weapons_$X_dc_bonus}"/>
</label>
</div>
</div>
<div class="flex-box flex-wrap half-gap justify-center">
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="weapon type"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_type" value="" title="@{repeating_weapons_$X_type}">
<option value="0" data-i18n="not proficient">
</option>
<option value="@{proficiency_basic}" data-i18n="basic">
</option>
<option value="@{proficiency_advanced}" data-i18n="advanced">
</option>
<option value="@{proficiency_historical}" data-i18n="historical">
</option>
<option value="@{proficiency_improvised}" data-i18n="improvised">
</option>
<option value="@{proficiency_military}" data-i18n="military">
</option>
<option value="1" data-i18n="misc proficiency">
</option>
<option value="2" data-i18n="misc expertise">
</option>
</select>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="range"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_range" type="text" title="@{repeating_weapons_$X_range}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="reload"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_reload" type="text" title="@{repeating_weapons_$X_reload}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="rounds"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_rounds" type="text" title="@{repeating_weapons_$X_rounds}"/>
</label>
<label class="input-label stacked flex-span-all form-label stacked form-label--textarea"><span class="form-label__span form-label--textarea__span" data-i18n="properties"></span>
<div class="adaptive adaptive--text form-label__input form-label--textarea__input recess-effect"><span class="adaptive--text__span" name="attr_properties" title="@{repeating_weapons_$X_properties}"></span>
<textarea class="adaptive--text__textarea" name="attr_properties" type="text" title="@{repeating_weapons_$X_properties}"></textarea>
</div>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="item bulk"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_item_bulk" type="number" title="@{repeating_weapons_$X_item_bulk}"/>
</label>
</div>
<div class="adaptive adaptive--text underlined"><span class="adaptive--text__span" name="attr_description" title="@{repeating_weapons_$X_description}"></span>
<textarea class="adaptive--text__textarea" name="attr_description" title="@{repeating_weapons_$X_description}"></textarea>
</div>
</div>
</div>
</section>
</fieldset>
</div>
</div>
</section>
<section class="section section__shadow talents repeating-section-container section--has-header">
<div class="section--layout">
<h2 class="section__header" data-i18n="talents and feats">
</h2>
<div class="section__content">
<button class="repcontrol-button repcontrol-button--add" name="act_add-ability" type="action">
</button>
<fieldset class="repeating_ability">
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_ability_$X_collapse}"/>
<div class="float-effect item-head">
<input name="attr_name" data-i18n-placeholder="ability name" type="text" title="@{repeating_ability_$X_name}"/>
<input class="display-control" name="attr_type" hidden="" value="talent" type="checkbox" title="@{repeating_ability_$X_type}"/>
<label class="input-label controlled-display form-label"><span class="form-label__span input-label__text" data-i18n="level"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_level" type="number" title="@{repeating_ability_$X_level}"/>
</label>
<label class="input-label type form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="type"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_type" value="feat" title="@{repeating_ability_$X_type}">
<option value="feat" data-i18n="feat" selected="">
</option>
<option value="talent" data-i18n="talent">
</option>
<option value="other" data-i18n="other">
</option>
</select>
</label>
</div>
<section class="section section--layout expanded section--fill">
<div class="section__content">
<input class="display-control" name="attr_type" value="feat" hidden="" checked="" type="checkbox" title="@{repeating_ability_$X_type}"/>
<div class="controlled-display feat-info">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="prerequisite"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_prerequisite" type="text" title="@{repeating_ability_$X_prerequisite}"/>
</label>
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="feat type"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_feat_type" title="@{repeating_ability_$X_feat_type}">
<option value="minor" data-i18n="minor" selected="">
</option>
<option value="major" data-i18n="major">
</option>
<option value="multiclass" data-i18n="multiclass">
</option>
</select>
</label>
</div>
<div class="adaptive adaptive--text description"><span class="adaptive--text__span" name="attr_description" title="@{repeating_ability_$X_description}"></span>
<textarea class="adaptive--text__textarea" name="attr_description" title="@{repeating_ability_$X_description}"></textarea>
</div>
</div>
</section>
</fieldset>
</div>
</div>
</section>
<section class="section section__shadow section--equipment repeating-section-container section--has-header">
<div class="section--layout">
<h2 class="section__header" data-i18n="equipment">
</h2>
<div class="section__content">
<div class="input-label form-label bulk-display"><span class="form-label__span" data-i18n="bulk"></span>
<input class="recess-effect form-label__input" name="attr_carried_bulk" readonly="" type="number" title="@{carried_bulk}"/><span class="slash form-label__span">/</span>
<input class="recess-effect form-label__input" name="attr_carried_bulk_max" value="5" readonly="" type="number" title="@{carried_bulk|max}"/>
</div>
<button class="repcontrol-button repcontrol-button--add" name="act_add-equipment" type="action">
</button>
<fieldset class="repeating_equipment">
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_equipment_$X_collapse}"/>
<div class="float-effect item-head">
<input class="name" name="attr_name" data-i18n-placeholder="item name" type="text" title="@{repeating_equipment_$X_name}"/>
<label class="input-label qty form-label"><span class="form-label__span input-label__text" data-i18n="quantity abbreviation"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_quantity" type="number" title="@{repeating_equipment_$X_quantity}"/>
</label>
<label class="input-label bulk form-label"><span class="form-label__span input-label__text" data-i18n="bulk"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_bulk" type="number" title="@{repeating_equipment_$X_bulk}"/>
</label>
</div>
<section class="section section--layout expanded description section--fill">
<div class="section__content">
<div class="adaptive adaptive--text"><span class="adaptive--text__span" name="attr_description" title="@{repeating_equipment_$X_description}"></span>
<textarea class="adaptive--text__textarea" name="attr_description" data-i18n-placeholder="item description" title="@{repeating_equipment_$X_description}"></textarea>
</div>
</div>
</section>
</fieldset>
</div>
</div>
</section>
</article>
<article class="tabs__container tabs--everyday__container tabs--everyday__container--plans-tricks" data-container-tab="everyday" data-tab="plans-tricks">
<section class="section section__shadow section--plans repeating-section-container section--has-header">
<div class="section--layout">
<h2 class="section__header" data-i18n="plans">
</h2>
<div class="section__content">
<button class="repcontrol-button repcontrol-button--add" name="act_add-plans" type="action">
</button>
<fieldset class="repeating_plans">
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_plans_$X_collapse}"/>
<div class="float-effect item-head">
<button class="roller" name="roll_roll" value="@{action}" type="roll">
</button>
<button name="act_action" hidden="" type="action">
</button>
<input name="attr_action" type="hidden" title="@{repeating_plans_$X_action}"/>
<input name="attr_name" data-i18n-placeholder="plan name" type="text" title="@{repeating_plans_$X_name}"/>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="level abbreviation"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_level" type="number" title="@{repeating_plans_$X_level}"/>
</label>
</div>
<section class="section section--layout expanded section--fill">
<div class="section__content">
<div class="flex-box flex-wrap half-gap">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="action"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_prep_action" type="text" title="@{repeating_plans_$X_prep_action}"/>
</label>
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="duration"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_duration" type="text" title="@{repeating_plans_$X_duration}"/>
</label>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_attack_disable" value="1" type="checkbox" title="@{repeating_plans_$X_attack_disable}" checked="checked"/>
<h3 data-i18n="attack"></h3>
<div class="expanded attack flex-box flex-wrap half-gap justify-space-around">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="crit on"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_threshold" type="number" value="20" title="@{repeating_plans_$X_critical_threshold}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="bonus"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_attack_bonus" type="number" title="@{repeating_plans_$X_attack_bonus}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="pv"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_penetration" type="number" title="@{repeating_plans_$X_penetration}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_damage_1_disable" value="1" type="checkbox" title="@{repeating_plans_$X_damage_1_disable}" checked="checked"/>
<h3 data-i18n="damage 1"></h3>
<div class="expanded damage 1 flex-box flex-wrap half-gap justify-space-around">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="damage 1"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_1" type="text" title="@{repeating_plans_$X_damage_1}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="custom crit"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_1" type="text" title="@{repeating_plans_$X_critical_1}"/>
</label>
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="ability"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_damage_ability_1" title="@{repeating_plans_$X_damage_ability_1}">
<option value="">
</option>
<option value="@{strength_mod}" data-i18n="strength abbreviation">
</option>
<option value="@{dexterity_mod}" data-i18n="dexterity abbreviation">
</option>
<option value="@{constitution_mod}" data-i18n="constitution abbreviation">
</option>
<option value="@{intelligence_mod}" data-i18n="intelligence abbreviation">
</option>
<option value="@{wisdom_mod}" data-i18n="wisdom abbreviation">
</option>
<option value="@{charisma_mod}" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="type"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_type_1" type="text" title="@{repeating_plans_$X_damage_type_1}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_damage_2_disable" value="1" type="checkbox" title="@{repeating_plans_$X_damage_2_disable}" checked="checked"/>
<h3 data-i18n="damage 2"></h3>
<div class="expanded damage 2 flex-box flex-wrap half-gap justify-space-around">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="damage 2"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_2" type="text" title="@{repeating_plans_$X_damage_2}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="custom crit"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_2" type="text" title="@{repeating_plans_$X_critical_2}"/>
</label>
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="ability"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_damage_ability_2" title="@{repeating_plans_$X_damage_ability_2}">
<option value="">
</option>
<option value="@{strength_mod}" data-i18n="strength abbreviation">
</option>
<option value="@{dexterity_mod}" data-i18n="dexterity abbreviation">
</option>
<option value="@{constitution_mod}" data-i18n="constitution abbreviation">
</option>
<option value="@{intelligence_mod}" data-i18n="intelligence abbreviation">
</option>
<option value="@{wisdom_mod}" data-i18n="wisdom abbreviation">
</option>
<option value="@{charisma_mod}" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="type"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_type_2" type="text" title="@{repeating_plans_$X_damage_type_2}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_save_disable" value="1" type="checkbox" title="@{repeating_plans_$X_save_disable}" checked="checked"/>
<h3 data-i18n="save"></h3>
<div class="expanded save flex-box flex-wrap half-gap justify-space-around">
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="save type"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_save_type" title="@{repeating_plans_$X_save_type}">
<option value="">
</option>
<option value="strength save" data-i18n="strength abbreviation">
</option>
<option value="dexterity save" data-i18n="dexterity abbreviation">
</option>
<option value="constitution save" data-i18n="constitution abbreviation">
</option>
<option value="intelligence save" data-i18n="intelligence abbreviation">
</option>
<option value="wisdom save" data-i18n="wisdom abbreviation">
</option>
<option value="charisma save" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="based on"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_save_basis" title="@{repeating_plans_$X_save_basis}">
<option value="" data-i18n="static">
</option>
<option value="@{strength_mod}" data-i18n="strength abbreviation">
</option>
<option value="@{dexterity_mod}" data-i18n="dexterity abbreviation">
</option>
<option value="@{constitution_mod}" data-i18n="constitution abbreviation">
</option>
<option value="@{intelligence_mod}" data-i18n="intelligence abbreviation">
</option>
<option value="@{wisdom_mod}" data-i18n="wisdom abbreviation">
</option>
<option value="@{charisma_mod}" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="bonus"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_dc_bonus" type="number" title="@{repeating_plans_$X_dc_bonus}"/>
</label>
</div>
</div>
<div class="headed-textarea">
<h3 data-i18n="description"></h3>
<div class="adaptive adaptive--text form-label__input form-label--textarea__input form-label__no-label recess-effect"><span class="adaptive--text__span" name="attr_description" title="@{repeating_plans_$X_description}"></span>
<textarea class="adaptive--text__textarea" name="attr_description" title="@{repeating_plans_$X_description}"></textarea>
</div>
</div>
<div class="headed-textarea collapse-container">
<input class="collapse collapse-arrow" name="attr_collapse_3" value="1" type="checkbox" title="@{repeating_plans_$X_collapse_3}" checked="checked"/>
<h3 data-i18n="level 3"></h3>
<div class="adaptive adaptive--text expanded form-label__input form-label--textarea__input form-label__no-label recess-effect"><span class="adaptive--text__span" name="attr_level_3_effect" title="@{repeating_plans_$X_level_3_effect}"></span>
<textarea class="adaptive--text__textarea" name="attr_level_3_effect" title="@{repeating_plans_$X_level_3_effect}"></textarea>
</div>
</div>
<div class="headed-textarea collapse-container">
<input class="collapse collapse-arrow" name="attr_collapse_5" value="1" type="checkbox" title="@{repeating_plans_$X_collapse_5}" checked="checked"/>
<h3 data-i18n="level 5"></h3>
<div class="adaptive adaptive--text expanded form-label__input form-label--textarea__input form-label__no-label recess-effect"><span class="adaptive--text__span" name="attr_level_5_effect" title="@{repeating_plans_$X_level_5_effect}"></span>
<textarea class="adaptive--text__textarea" name="attr_level_5_effect" title="@{repeating_plans_$X_level_5_effect}"></textarea>
</div>
</div>
<div class="headed-textarea collapse-container">
<input class="collapse collapse-arrow" name="attr_collapse_7" value="1" type="checkbox" title="@{repeating_plans_$X_collapse_7}" checked="checked"/>
<h3 data-i18n="level 7"></h3>
<div class="adaptive adaptive--text expanded form-label__input form-label--textarea__input form-label__no-label recess-effect"><span class="adaptive--text__span" name="attr_level_7_effect" title="@{repeating_plans_$X_level_7_effect}"></span>
<textarea class="adaptive--text__textarea" name="attr_level_7_effect" title="@{repeating_plans_$X_level_7_effect}"></textarea>
</div>
</div>
<div class="headed-textarea collapse-container">
<input class="collapse collapse-arrow" name="attr_collapse_9" value="1" type="checkbox" title="@{repeating_plans_$X_collapse_9}" checked="checked"/>
<h3 data-i18n="level 9"></h3>
<div class="adaptive adaptive--text expanded form-label__input form-label--textarea__input form-label__no-label recess-effect"><span class="adaptive--text__span" name="attr_level_9_effect" title="@{repeating_plans_$X_level_9_effect}"></span>
<textarea class="adaptive--text__textarea" name="attr_level_9_effect" title="@{repeating_plans_$X_level_9_effect}"></textarea>
</div>
</div>
</div>
</section>
</fieldset>
</div>
</div>
</section>
<section class="section section__shadow section--tricks repeating-section-container section--has-header">
<div class="section--layout">
<h2 class="section__header" data-i18n="tricks">
</h2>
<div class="section__content">
<button class="repcontrol-button repcontrol-button--add" name="act_add-tricks" type="action">
</button>
<fieldset class="repeating_tricks">
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_tricks_$X_collapse}"/>
<div class="float-effect item-head">
<button class="roller" name="roll_roll" value="@{action}" type="roll">
</button>
<button name="act_action" hidden="" type="action">
</button>
<input name="attr_action" type="hidden" title="@{repeating_tricks_$X_action}"/>
<input name="attr_name" data-i18n-placeholder="trick name" type="text" title="@{repeating_tricks_$X_name}"/>
</div>
<section class="section section--layout expanded section--fill">
<div class="section__content">
<div class="flex-box flex-wrap half-gap">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="action"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_prep_action" type="text" title="@{repeating_tricks_$X_prep_action}"/>
</label>
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="duration"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_duration" type="text" title="@{repeating_tricks_$X_duration}"/>
</label>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_attack_disable" value="1" type="checkbox" title="@{repeating_tricks_$X_attack_disable}" checked="checked"/>
<h3 data-i18n="attack"></h3>
<div class="expanded attack flex-box flex-wrap half-gap justify-space-around">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="crit on"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_threshold" type="number" value="20" title="@{repeating_tricks_$X_critical_threshold}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="bonus"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_attack_bonus" type="number" title="@{repeating_tricks_$X_attack_bonus}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="pv"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_penetration" type="number" title="@{repeating_tricks_$X_penetration}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_damage_1_disable" value="1" type="checkbox" title="@{repeating_tricks_$X_damage_1_disable}" checked="checked"/>
<h3 data-i18n="damage 1"></h3>
<div class="expanded damage 1 flex-box flex-wrap half-gap justify-space-around">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="damage 1"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_1" type="text" title="@{repeating_tricks_$X_damage_1}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="custom crit"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_1" type="text" title="@{repeating_tricks_$X_critical_1}"/>
</label>
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="ability"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_damage_ability_1" title="@{repeating_tricks_$X_damage_ability_1}">
<option value="">
</option>
<option value="@{strength_mod}" data-i18n="strength abbreviation">
</option>
<option value="@{dexterity_mod}" data-i18n="dexterity abbreviation">
</option>
<option value="@{constitution_mod}" data-i18n="constitution abbreviation">
</option>
<option value="@{intelligence_mod}" data-i18n="intelligence abbreviation">
</option>
<option value="@{wisdom_mod}" data-i18n="wisdom abbreviation">
</option>
<option value="@{charisma_mod}" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="type"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_type_1" type="text" title="@{repeating_tricks_$X_damage_type_1}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_damage_2_disable" value="1" type="checkbox" title="@{repeating_tricks_$X_damage_2_disable}" checked="checked"/>
<h3 data-i18n="damage 2"></h3>
<div class="expanded damage 2 flex-box flex-wrap half-gap justify-space-around">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="damage 2"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_2" type="text" title="@{repeating_tricks_$X_damage_2}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="custom crit"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_2" type="text" title="@{repeating_tricks_$X_critical_2}"/>
</label>
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="ability"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_damage_ability_2" title="@{repeating_tricks_$X_damage_ability_2}">
<option value="">
</option>
<option value="@{strength_mod}" data-i18n="strength abbreviation">
</option>
<option value="@{dexterity_mod}" data-i18n="dexterity abbreviation">
</option>
<option value="@{constitution_mod}" data-i18n="constitution abbreviation">
</option>
<option value="@{intelligence_mod}" data-i18n="intelligence abbreviation">
</option>
<option value="@{wisdom_mod}" data-i18n="wisdom abbreviation">
</option>
<option value="@{charisma_mod}" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="type"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_type_2" type="text" title="@{repeating_tricks_$X_damage_type_2}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_save_disable" value="1" type="checkbox" title="@{repeating_tricks_$X_save_disable}" checked="checked"/>
<h3 data-i18n="save"></h3>
<div class="expanded save flex-box flex-wrap half-gap justify-space-around">
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="save type"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_save_type" title="@{repeating_tricks_$X_save_type}">
<option value="">
</option>
<option value="strength save" data-i18n="strength abbreviation">
</option>
<option value="dexterity save" data-i18n="dexterity abbreviation">
</option>
<option value="constitution save" data-i18n="constitution abbreviation">
</option>
<option value="intelligence save" data-i18n="intelligence abbreviation">
</option>
<option value="wisdom save" data-i18n="wisdom abbreviation">
</option>
<option value="charisma save" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="based on"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_save_basis" title="@{repeating_tricks_$X_save_basis}">
<option value="" data-i18n="static">
</option>
<option value="@{strength_mod}" data-i18n="strength abbreviation">
</option>
<option value="@{dexterity_mod}" data-i18n="dexterity abbreviation">
</option>
<option value="@{constitution_mod}" data-i18n="constitution abbreviation">
</option>
<option value="@{intelligence_mod}" data-i18n="intelligence abbreviation">
</option>
<option value="@{wisdom_mod}" data-i18n="wisdom abbreviation">
</option>
<option value="@{charisma_mod}" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="bonus"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_dc_bonus" type="number" title="@{repeating_tricks_$X_dc_bonus}"/>
</label>
</div>
</div>
<div class="headed-textarea">
<h3 data-i18n="description"></h3>
<div class="adaptive adaptive--text form-label__input form-label--textarea__input form-label__no-label recess-effect"><span class="adaptive--text__span" name="attr_description" title="@{repeating_tricks_$X_description}"></span>
<textarea class="adaptive--text__textarea" name="attr_description" title="@{repeating_tricks_$X_description}"></textarea>
</div>
</div>
</div>
</section>
</fieldset>
</div>
</div>
</section>
</article>
<article class="tabs__container tabs--everyday__container tabs--everyday__container--persona" data-container-tab="everyday" data-tab="persona">
<div class="heroID heroID--back">
<div class="caution-tape heroID__header">
<div class="caution-tape__content heroID__title">
<input class="heroID__title" name="attr_character_name" type="text" title="@{character_name}"/>
</div>
</div>
<div class="heroID__pic recess-effect"><img class="character-avatar" name="attr_character_avatar" data-i18n-alt="character avatar" title="@{character_avatar}"/><img class="character-token" name="attr_character_token" data-i18n-alt="character token" title="@{character_token}"/>
</div>
<div class="heroID__info">
<label class="input-label weight text form-label"><span class="form-label__span input-label__text" data-i18n="weight"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_weight" type="text" title="@{weight}"/>
</label>
<label class="input-label skin text form-label"><span class="form-label__span input-label__text" data-i18n="skin"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_skin" type="text" title="@{skin}"/>
</label>
<label class="input-label height text form-label"><span class="form-label__span input-label__text" data-i18n="height"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_height" type="text" title="@{height}"/>
</label>
<label class="input-label eyes text form-label"><span class="form-label__span input-label__text" data-i18n="eyes"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_eyes" type="text" title="@{eyes}"/>
</label>
<label class="input-label hair text form-label"><span class="form-label__span input-label__text" data-i18n="hair"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_hair" type="text" title="@{hair}"/>
</label>
<label class="input-label age number form-label"><span class="form-label__span input-label__text" data-i18n="age"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_age" type="number" title="@{age}"/>
</label>
<label class="input-label marital status text form-label"><span class="form-label__span input-label__text" data-i18n="marital status"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_marital_status" type="text" title="@{marital_status}"/>
</label>
<label class="input-label preferred pronouns text form-label"><span class="form-label__span input-label__text" data-i18n="preferred pronouns"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_preferred_pronouns" type="text" title="@{preferred_pronouns}"/>
</label>
</div>
</div>
<section class="section section--layout section--persona section--fill section--has-header">
<h2 class="section__header" data-i18n="persona">
</h2>
<div class="section__content">
<label class="input-label stacked rounded-container form-label stacked form-label--textarea"><span class="form-label__span form-label--textarea__span" data-i18n="motivations" role="heading" aria-level="3"></span>
<div class="adaptive adaptive--text form-label__input form-label--textarea__input recess-effect"><span class="adaptive--text__span" name="attr_motivations" title="@{motivations}"></span>
<textarea class="adaptive--text__textarea" name="attr_motivations" title="@{motivations}"></textarea>
</div>
</label>
<label class="input-label stacked rounded-container form-label stacked form-label--textarea"><span class="form-label__span form-label--textarea__span" data-i18n="attachments" role="heading" aria-level="3"></span>
<div class="adaptive adaptive--text form-label__input form-label--textarea__input recess-effect"><span class="adaptive--text__span" name="attr_attachments" title="@{attachments}"></span>
<textarea class="adaptive--text__textarea" name="attr_attachments" title="@{attachments}"></textarea>
</div>
</label>
<label class="input-label stacked rounded-container form-label stacked form-label--textarea"><span class="form-label__span form-label--textarea__span" data-i18n="beliefs" role="heading" aria-level="3"></span>
<div class="adaptive adaptive--text form-label__input form-label--textarea__input recess-effect"><span class="adaptive--text__span" name="attr_beliefs" title="@{beliefs}"></span>
<textarea class="adaptive--text__textarea" name="attr_beliefs" title="@{beliefs}"></textarea>
</div>
</label>
<label class="input-label stacked form-label--textarea--one-line form-label stacked form-label--textarea"><span class="form-label__span form-label--textarea__span" data-i18n="ancestry" role="heading" aria-level="3"></span>
<div class="adaptive adaptive--text form-label__input form-label--textarea__input recess-effect"><span class="adaptive--text__span" name="attr_ancestry" title="@{ancestry}"></span>
<textarea class="adaptive--text__textarea" name="attr_ancestry" title="@{ancestry}"></textarea>
</div>
</label>
<label class="input-label stacked form-label--textarea--one-line form-label stacked form-label--textarea"><span class="form-label__span form-label--textarea__span" data-i18n="quirks" role="heading" aria-level="3"></span>
<div class="adaptive adaptive--text form-label__input form-label--textarea__input recess-effect"><span class="adaptive--text__span" name="attr_quirks" title="@{quirks}"></span>
<textarea class="adaptive--text__textarea" name="attr_quirks" title="@{quirks}"></textarea>
</div>
</label>
<label class="input-label stacked form-label--textarea--one-line form-label stacked form-label--textarea"><span class="form-label__span form-label--textarea__span" data-i18n="virtues" role="heading" aria-level="3"></span>
<div class="adaptive adaptive--text form-label__input form-label--textarea__input recess-effect"><span class="adaptive--text__span" name="attr_virtues" title="@{virtues}"></span>
<textarea class="adaptive--text__textarea" name="attr_virtues" title="@{virtues}"></textarea>
</div>
</label>
<label class="input-label stacked form-label--textarea--one-line form-label stacked form-label--textarea"><span class="form-label__span form-label--textarea__span" data-i18n="flaws" role="heading" aria-level="3"></span>
<div class="adaptive adaptive--text form-label__input form-label--textarea__input recess-effect"><span class="adaptive--text__span" name="attr_flaws" title="@{flaws}"></span>
<textarea class="adaptive--text__textarea" name="attr_flaws" title="@{flaws}"></textarea>
</div>
</label>
<label class="input-label stacked form-label--textarea--one-line form-label stacked form-label--textarea"><span class="form-label__span form-label--textarea__span" data-i18n="role" role="heading" aria-level="3"></span>
<div class="adaptive adaptive--text form-label__input form-label--textarea__input recess-effect"><span class="adaptive--text__span" name="attr_role" title="@{role}"></span>
<textarea class="adaptive--text__textarea" name="attr_role" title="@{role}"></textarea>
</div>
</label>
</div>
</section>
<section class="section section__shadow section--notes repeating-section-container section--has-header">
<div class="section--layout">
<h2 class="section__header" data-i18n="notes">
</h2>
<div class="section__content">
<button class="repcontrol-button repcontrol-button--add" name="act_add-notes" type="action">
</button>
<fieldset class="repeating_notes">
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_notes_$X_collapse}"/>
<div class="float-effect item-head">
<input name="attr_name" data-i18n-placeholder="note name" type="text" title="@{repeating_notes_$X_name}"/>
<input name="attr_date" data-i18n-placeholder="date" type="text" title="@{repeating_notes_$X_date}"/>
</div>
<section class="section section--layout expanded section--fill">
<div class="section__content">
<div class="adaptive adaptive--text"><span class="adaptive--text__span" name="attr_description" title="@{repeating_notes_$X_description}"></span>
<textarea class="adaptive--text__textarea" name="attr_description" data-i18n-placeholder="event description" title="@{repeating_notes_$X_description}"></textarea>
</div>
</div>
</section>
</fieldset>
</div>
</div>
</section>
</article>
<article class="tabs__container tabs--everyday__container tabs--everyday__container--npc" data-container-tab="everyday" data-tab="npc">
<div class="statblock">
<input name="attr_statblock_view_mode" value="edit" type="hidden" title="@{statblock_view_mode}"/>
<button class="material-icons statblock-edit-control" name="act_statblock-edit" type="action">edit
</button>
<section class="statblock__row statblock__edit statblock__header flex-box half-gap"><!-- attributes: "{}" -->
<input name="attr_character_name" role="heading" aria-level="1" type="text" title="@{character_name}"/>
<label class="input-label cr"><span class="uppercase input-label__text" data-i18n="cr"></span>
<input class="input-label__input" name="attr_cr" type="text" title="@{cr}"/>
</label>
</section>
<section class="statblock__row statblock__view statblock__header flex-box half-gap"><!-- attributes: "{}" --><span name="attr_character_name" role="heading" aria-level="1" title="@{character_name}"></span>
<input class="display-value-control" name="attr_cr" value="" type="hidden" title="@{cr}"/>
<div class="input-label controlled-display"><span class="uppercase" data-i18n="cr"></span><span name="attr_cr" title="@{cr}"></span>
</div>
</section>
<section class="statblock__row statblock__edit"><!-- attributes: "{}" -->
<div class="flex-box half-gap">
<input class="underlined" name="attr_size" type="text" value="medium" data-i18n-placeholder="size" title="@{size}"/>
<input class="underlined" name="attr_creature_type" type="text" data-i18n-placeholder="type (subtype)" title="@{creature_type}"/>
</div>
<div class="statblock__subrow flex-box half-gap">
<div class="input-label input-label--button">
<button class="statblock__row__header roller" name="roll_initiative" data-i18n="initiative" value="@{initiative_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_initiative" type="number" title="@{initiative}"/>
</div>
<button name="act_initiative-action" hidden="" type="action">
</button>
<input name="attr_initiative_action" type="hidden" title="@{initiative_action}"/>
</div>
<div class="statblock__subrow flex-box half-gap flex-wrap">
<label class="input-label flex-wrap"><span class="statblock__row__header input-label__text" data-i18n="defense"></span>
<input class="underlined input-label__input" name="attr_defense" type="number" title="@{defense}"/>
</label>
</div>
<div class="statblock__subrow flex-box half-gap flex-wrap">
<label class="input-label flex-wrap"><span class="statblock__row__header input-label__text" data-i18n="hit points"></span>
<input class="underlined input-label__input" name="attr_hp" type="number" title="@{hp}"/>
</label>
<input class="parentheses--surround--full underlined" name="attr_hit_dice_expression" type="text" data-i18n-placeholder="xdy + z" title="@{hit_dice_expression}"/>
</div>
<div class="statblock__subrow flex-box half-gap flex-wrap">
<label class="input-label flex-wrap"><span class="statblock__row__header input-label__text" data-i18n="armor"></span>
<input class="underlined input-label__input" name="attr_armor_name" type="text" title="@{armor_name}"/>
</label>
<label class="input-label flex-wrap"><span class="uppercase input-label__text" data-i18n="av"></span>
<input class="underlined input-label__input" name="attr_armor_value" type="number" title="@{armor_value}"/>
</label>
<input class="underlined" name="attr_armor_properties" type="text" data-i18n-placeholder="properties" title="@{armor_properties}"/>
</div>
<div class="statblock__subrow flex-box half-gap flex-wrap">
<label class="input-label flex-wrap"><span class="statblock__row__header input-label__text" data-i18n="speed"></span>
<input class="underlined input-label__input" name="attr_speed" type="text" title="@{speed}"/>
</label>
</div>
<div class="statblock__subrow statblock__ability-scores flex-box justify-space-around half-gap flex-wrap">
<div class="score">
<h4 class="statblock__row__header" data-i18n="strength abbreviation"></h4>
<input class="underlined" name="attr_strength" value="10" type="number" title="@{strength}"/>
<button class="roller--mod-display roller" name="roll_strength" value="@{strength_action}" type="roll">
<input class="plus-control" name="attr_strength_mod" value="0" hidden="" type="hidden" title="@{strength_mod}"/><span class="plus-display" name="attr_strength_mod" title="@{strength_mod}"></span>
</button>
<button name="act_strength-action" hidden="" type="action">
</button>
<input name="attr_strength_action" type="hidden" title="@{strength_action}"/>
</div>
<div class="score">
<h4 class="statblock__row__header" data-i18n="dexterity abbreviation"></h4>
<input class="underlined" name="attr_dexterity" value="10" type="number" title="@{dexterity}"/>
<button class="roller--mod-display roller" name="roll_dexterity" value="@{dexterity_action}" type="roll">
<input class="plus-control" name="attr_dexterity_mod" value="0" hidden="" type="hidden" title="@{dexterity_mod}"/><span class="plus-display" name="attr_dexterity_mod" title="@{dexterity_mod}"></span>
</button>
<button name="act_dexterity-action" hidden="" type="action">
</button>
<input name="attr_dexterity_action" type="hidden" title="@{dexterity_action}"/>
</div>
<div class="score">
<h4 class="statblock__row__header" data-i18n="constitution abbreviation"></h4>
<input class="underlined" name="attr_constitution" value="10" type="number" title="@{constitution}"/>
<button class="roller--mod-display roller" name="roll_constitution" value="@{constitution_action}" type="roll">
<input class="plus-control" name="attr_constitution_mod" value="0" hidden="" type="hidden" title="@{constitution_mod}"/><span class="plus-display" name="attr_constitution_mod" title="@{constitution_mod}"></span>
</button>
<button name="act_constitution-action" hidden="" type="action">
</button>
<input name="attr_constitution_action" type="hidden" title="@{constitution_action}"/>
</div>
<div class="score">
<h4 class="statblock__row__header" data-i18n="intelligence abbreviation"></h4>
<input class="underlined" name="attr_intelligence" value="10" type="number" title="@{intelligence}"/>
<button class="roller--mod-display roller" name="roll_intelligence" value="@{intelligence_action}" type="roll">
<input class="plus-control" name="attr_intelligence_mod" value="0" hidden="" type="hidden" title="@{intelligence_mod}"/><span class="plus-display" name="attr_intelligence_mod" title="@{intelligence_mod}"></span>
</button>
<button name="act_intelligence-action" hidden="" type="action">
</button>
<input name="attr_intelligence_action" type="hidden" title="@{intelligence_action}"/>
</div>
<div class="score">
<h4 class="statblock__row__header" data-i18n="wisdom abbreviation"></h4>
<input class="underlined" name="attr_wisdom" value="10" type="number" title="@{wisdom}"/>
<button class="roller--mod-display roller" name="roll_wisdom" value="@{wisdom_action}" type="roll">
<input class="plus-control" name="attr_wisdom_mod" value="0" hidden="" type="hidden" title="@{wisdom_mod}"/><span class="plus-display" name="attr_wisdom_mod" title="@{wisdom_mod}"></span>
</button>
<button name="act_wisdom-action" hidden="" type="action">
</button>
<input name="attr_wisdom_action" type="hidden" title="@{wisdom_action}"/>
</div>
<div class="score">
<h4 class="statblock__row__header" data-i18n="charisma abbreviation"></h4>
<input class="underlined" name="attr_charisma" value="10" type="number" title="@{charisma}"/>
<button class="roller--mod-display roller" name="roll_charisma" value="@{charisma_action}" type="roll">
<input class="plus-control" name="attr_charisma_mod" value="0" hidden="" type="hidden" title="@{charisma_mod}"/><span class="plus-display" name="attr_charisma_mod" title="@{charisma_mod}"></span>
</button>
<button name="act_charisma-action" hidden="" type="action">
</button>
<input name="attr_charisma_action" type="hidden" title="@{charisma_action}"/>
</div>
</div>
<div class="statblock__subrow statblock__saves flex-box half-gap flex-wrap">
<h4 class="statblock__row__header" data-i18n="saves"></h4>
<div class="input-label input-label--button">
<button class="roller" name="roll_strength_save" lass="statblock__row__header" data-i18n="strength" value="@{strength_save_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_strength_save" type="number" title="@{strength_save}"/>
</div>
<button name="act_strength-save-action" hidden="" type="action">
</button>
<input name="attr_strength_save_action" type="hidden" title="@{strength_save_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_dexterity_save" lass="statblock__row__header" data-i18n="dexterity" value="@{dexterity_save_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_dexterity_save" type="number" title="@{dexterity_save}"/>
</div>
<button name="act_dexterity-save-action" hidden="" type="action">
</button>
<input name="attr_dexterity_save_action" type="hidden" title="@{dexterity_save_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_constitution_save" lass="statblock__row__header" data-i18n="constitution" value="@{constitution_save_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_constitution_save" type="number" title="@{constitution_save}"/>
</div>
<button name="act_constitution-save-action" hidden="" type="action">
</button>
<input name="attr_constitution_save_action" type="hidden" title="@{constitution_save_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_intelligence_save" lass="statblock__row__header" data-i18n="intelligence" value="@{intelligence_save_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_intelligence_save" type="number" title="@{intelligence_save}"/>
</div>
<button name="act_intelligence-save-action" hidden="" type="action">
</button>
<input name="attr_intelligence_save_action" type="hidden" title="@{intelligence_save_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_wisdom_save" lass="statblock__row__header" data-i18n="wisdom" value="@{wisdom_save_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_wisdom_save" type="number" title="@{wisdom_save}"/>
</div>
<button name="act_wisdom-save-action" hidden="" type="action">
</button>
<input name="attr_wisdom_save_action" type="hidden" title="@{wisdom_save_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_charisma_save" lass="statblock__row__header" data-i18n="charisma" value="@{charisma_save_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_charisma_save" type="number" title="@{charisma_save}"/>
</div>
<button name="act_charisma-save-action" hidden="" type="action">
</button>
<input name="attr_charisma_save_action" type="hidden" title="@{charisma_save_action}"/>
</div>
<div class="statblock__subrow statblock__skills flex-box half-gap flex-wrap">
<h4 class="statblock__row__header" data-i18n="skills"></h4>
<div class="input-label input-label--button">
<button class="roller" name="roll_acrobatics" data-i18n="acrobatics" lass="statblock__row__header" value="@{acrobatics_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_acrobatics" type="number" title="@{acrobatics}"/>
</div>
<button name="act_acrobatics-action" hidden="" type="action">
</button>
<input name="attr_acrobatics_action" type="hidden" title="@{acrobatics_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_arts_and_crafts" data-i18n="arts and crafts" lass="statblock__row__header" value="@{arts_and_crafts_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_arts_and_crafts" type="number" title="@{arts_and_crafts}"/>
</div>
<button name="act_arts-and-crafts-action" hidden="" type="action">
</button>
<input name="attr_arts_and_crafts_action" type="hidden" title="@{arts_and_crafts_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_athletics" data-i18n="athletics" lass="statblock__row__header" value="@{athletics_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_athletics" type="number" title="@{athletics}"/>
</div>
<button name="act_athletics-action" hidden="" type="action">
</button>
<input name="attr_athletics_action" type="hidden" title="@{athletics_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_computers" data-i18n="computers" lass="statblock__row__header" value="@{computers_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_computers" type="number" title="@{computers}"/>
</div>
<button name="act_computers-action" hidden="" type="action">
</button>
<input name="attr_computers_action" type="hidden" title="@{computers_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_deception" data-i18n="deception" lass="statblock__row__header" value="@{deception_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_deception" type="number" title="@{deception}"/>
</div>
<button name="act_deception-action" hidden="" type="action">
</button>
<input name="attr_deception_action" type="hidden" title="@{deception_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_endurance" data-i18n="endurance" lass="statblock__row__header" value="@{endurance_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_endurance" type="number" title="@{endurance}"/>
</div>
<button name="act_endurance-action" hidden="" type="action">
</button>
<input name="attr_endurance_action" type="hidden" title="@{endurance_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_insight" data-i18n="insight" lass="statblock__row__header" value="@{insight_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_insight" type="number" title="@{insight}"/>
</div>
<button name="act_insight-action" hidden="" type="action">
</button>
<input name="attr_insight_action" type="hidden" title="@{insight_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_intimidation" data-i18n="intimidation" lass="statblock__row__header" value="@{intimidation_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_intimidation" type="number" title="@{intimidation}"/>
</div>
<button name="act_intimidation-action" hidden="" type="action">
</button>
<input name="attr_intimidation_action" type="hidden" title="@{intimidation_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_investigation" data-i18n="investigation" lass="statblock__row__header" value="@{investigation_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_investigation" type="number" title="@{investigation}"/>
</div>
<button name="act_investigation-action" hidden="" type="action">
</button>
<input name="attr_investigation_action" type="hidden" title="@{investigation_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_mechanics" data-i18n="mechanics" lass="statblock__row__header" value="@{mechanics_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_mechanics" type="number" title="@{mechanics}"/>
</div>
<button name="act_mechanics-action" hidden="" type="action">
</button>
<input name="attr_mechanics_action" type="hidden" title="@{mechanics_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_medicine" data-i18n="medicine" lass="statblock__row__header" value="@{medicine_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_medicine" type="number" title="@{medicine}"/>
</div>
<button name="act_medicine-action" hidden="" type="action">
</button>
<input name="attr_medicine_action" type="hidden" title="@{medicine_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_natural_science" data-i18n="natural science" lass="statblock__row__header" value="@{natural_science_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_natural_science" type="number" title="@{natural_science}"/>
</div>
<button name="act_natural-science-action" hidden="" type="action">
</button>
<input name="attr_natural_science_action" type="hidden" title="@{natural_science_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_perception" data-i18n="perception" lass="statblock__row__header" value="@{perception_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_perception" type="number" title="@{perception}"/>
</div>
<button name="act_perception-action" hidden="" type="action">
</button>
<input name="attr_perception_action" type="hidden" title="@{perception_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_performance" data-i18n="performance" lass="statblock__row__header" value="@{performance_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_performance" type="number" title="@{performance}"/>
</div>
<button name="act_performance-action" hidden="" type="action">
</button>
<input name="attr_performance_action" type="hidden" title="@{performance_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_persuasion" data-i18n="persuasion" lass="statblock__row__header" value="@{persuasion_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_persuasion" type="number" title="@{persuasion}"/>
</div>
<button name="act_persuasion-action" hidden="" type="action">
</button>
<input name="attr_persuasion_action" type="hidden" title="@{persuasion_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_security" data-i18n="security" lass="statblock__row__header" value="@{security_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_security" type="number" title="@{security}"/>
</div>
<button name="act_security-action" hidden="" type="action">
</button>
<input name="attr_security_action" type="hidden" title="@{security_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_sleight_of_hand" data-i18n="sleight of hand" lass="statblock__row__header" value="@{sleight_of_hand_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_sleight_of_hand" type="number" title="@{sleight_of_hand}"/>
</div>
<button name="act_sleight-of-hand-action" hidden="" type="action">
</button>
<input name="attr_sleight_of_hand_action" type="hidden" title="@{sleight_of_hand_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_social_sciences" data-i18n="social sciences" lass="statblock__row__header" value="@{social_sciences_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_social_sciences" type="number" title="@{social_sciences}"/>
</div>
<button name="act_social-sciences-action" hidden="" type="action">
</button>
<input name="attr_social_sciences_action" type="hidden" title="@{social_sciences_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_stealth" data-i18n="stealth" lass="statblock__row__header" value="@{stealth_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_stealth" type="number" title="@{stealth}"/>
</div>
<button name="act_stealth-action" hidden="" type="action">
</button>
<input name="attr_stealth_action" type="hidden" title="@{stealth_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_streetwise" data-i18n="streetwise" lass="statblock__row__header" value="@{streetwise_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_streetwise" type="number" title="@{streetwise}"/>
</div>
<button name="act_streetwise-action" hidden="" type="action">
</button>
<input name="attr_streetwise_action" type="hidden" title="@{streetwise_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_survival" data-i18n="survival" lass="statblock__row__header" value="@{survival_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_survival" type="number" title="@{survival}"/>
</div>
<button name="act_survival-action" hidden="" type="action">
</button>
<input name="attr_survival_action" type="hidden" title="@{survival_action}"/>
<div class="input-label input-label--button">
<button class="roller" name="roll_vehicles" data-i18n="vehicles" lass="statblock__row__header" value="@{vehicles_action}" type="roll">
</button>
<input class="underlined input-label__input" name="attr_vehicles" type="number" title="@{vehicles}"/>
</div>
<button name="act_vehicles-action" hidden="" type="action">
</button>
<input name="attr_vehicles_action" type="hidden" title="@{vehicles_action}"/>
</div>
<div class="statblock__subrow statblock__senses"><span class="statblock__row__header" data-i18n="senses"></span>
<input class="underlined" name="attr_senses" value="" type="text" title="@{senses}"/>
<label class="input-label"><span class="statblock__row__header input-label__text" data-i18n="passive perception"></span>
<input class="underlined input-label__input" name="attr_passive_perception" type="number" title="@{passive_perception}"/>
</label>
</div>
<div class="statblock__subrow statblock__roles"><span class="statblock__row__header" data-i18n="roles"></span>
<div class="adaptive adaptive--input"><span class="adaptive--input__span" name="attr_roles" title="@{roles}"></span>
<input class="underlined adaptive--input__input" name="attr_roles" type="text" value="" title="@{roles}"/>
</div>
</div>
<div class="statblock__subrow statblock__equipment"><span class="statblock__row__header" data-i18n="equipment"></span>
<div class="adaptive adaptive--input"><span class="adaptive--input__span" name="attr_equipment" title="@{equipment}"></span>
<input class="underlined adaptive--input__input" name="attr_equipment" type="text" value="" title="@{equipment}"/>
</div>
</div>
</section>
<section class="statblock__row statblock__view"><!-- attributes: "{}" -->
<div class="flex-box half-gap"><span name="attr_size" type="text" value="medium" data-i18n-placeholder="size" title="@{size}">medium</span><span name="attr_creature_type" type="text" data-i18n-placeholder="type (subtype)" title="@{creature_type}"></span>
</div>
<div class="statblock__subrow flex-box half-gap">
<div class="input-label input-label--button">
<button class="statblock__row__header roller" name="roll_initiative" data-i18n="initiative" value="@{initiative_action}" type="roll">
</button>
<button name="act_initiative-action" hidden="" type="action">
</button>
<input name="attr_initiative_action" type="hidden" title="@{initiative_action}"/>
<input class="plus-control" name="attr_initiative" value="0" hidden="" type="hidden" title="@{initiative}"/><span class="plus-display" name="attr_initiative" value="0" title="@{initiative}"></span>
</div>
</div>
<input class="display-value-control" name="attr_defense" value="" type="hidden" title="@{defense}"/>
<div class="statblock__subrow flex-box half-gap flex-wrap controlled-display">
<div class="input-label flex-wrap"><span class="input-label__span statblock__row__header" data-i18n="defense"></span><span class="input-label__input" name="attr_defense" type="number" title="@{defense}"></span>
</div>
</div>
<input class="display-value-control" name="attr_hp" value="" type="hidden" title="@{hp}"/>
<div class="statblock__subrow flex-box half-gap flex-wrap controlled-display">
<div class="input-label flex-wrap"><span class="input-label__span statblock__row__header" data-i18n="hit points"></span><span class="input-label__input" name="attr_hp" type="number" title="@{hp}"></span>
</div><span class="parentheses--surround--full" name="attr_hit_dice_expression" type="text" data-i18n-placeholder="xdy + z" title="@{hit_dice_expression}"></span>
</div>
<input class="display-value-control" name="attr_armor_name" value="" type="hidden" title="@{armor_name}"/>
<div class="statblock__subrow flex-box half-gap flex-wrap controlled-display">
<div class="input-label flex-wrap"><span class="input-label__span statblock__row__header" data-i18n="armor"></span><span class="input-label__input" name="attr_armor_name" type="text" title="@{armor_name}"></span>
</div>
<div class="input-label flex-wrap"><span class="uppercasefalse input-label__span" data-i18n="av"></span><span class="input-label__input" name="attr_armor_value" type="number" title="@{armor_value}"></span>
</div><span name="attr_armor_properties" type="text" data-i18n-placeholder="properties" title="@{armor_properties}"></span>
</div>
<input class="display-value-control" name="attr_speed" value="" type="hidden" title="@{speed}"/>
<div class="statblock__subrow flex-box half-gap flex-wrap controlled-display">
<div class="input-label flex-wrap"><span class="input-label__span statblock__row__header" data-i18n="speed"></span><span class="input-label__input" name="attr_speed" type="text" title="@{speed}"></span>
</div>
</div>
<div class="statblock__subrow statblock__ability-scores flex-box justify-space-around half-gap flex-wrap">
<div class="score">
<h4 class="statblock__row__header" data-i18n="strength abbreviation"></h4><span name="attr_strength" title="@{strength}"></span>
<button class="roller--mod-display roller" name="roll_strength" value="@{strength_action}" type="roll">
<input class="plus-control" name="attr_strength_mod" value="0" hidden="" type="hidden" title="@{strength_mod}"/><span class="plus-display" name="attr_strength_mod" title="@{strength_mod}"></span>
</button>
<button name="act_strength-action" hidden="" type="action">
</button>
<input name="attr_strength_action" type="hidden" title="@{strength_action}"/>
</div>
<div class="score">
<h4 class="statblock__row__header" data-i18n="dexterity abbreviation"></h4><span name="attr_dexterity" title="@{dexterity}"></span>
<button class="roller--mod-display roller" name="roll_dexterity" value="@{dexterity_action}" type="roll">
<input class="plus-control" name="attr_dexterity_mod" value="0" hidden="" type="hidden" title="@{dexterity_mod}"/><span class="plus-display" name="attr_dexterity_mod" title="@{dexterity_mod}"></span>
</button>
<button name="act_dexterity-action" hidden="" type="action">
</button>
<input name="attr_dexterity_action" type="hidden" title="@{dexterity_action}"/>
</div>
<div class="score">
<h4 class="statblock__row__header" data-i18n="constitution abbreviation"></h4><span name="attr_constitution" title="@{constitution}"></span>
<button class="roller--mod-display roller" name="roll_constitution" value="@{constitution_action}" type="roll">
<input class="plus-control" name="attr_constitution_mod" value="0" hidden="" type="hidden" title="@{constitution_mod}"/><span class="plus-display" name="attr_constitution_mod" title="@{constitution_mod}"></span>
</button>
<button name="act_constitution-action" hidden="" type="action">
</button>
<input name="attr_constitution_action" type="hidden" title="@{constitution_action}"/>
</div>
<div class="score">
<h4 class="statblock__row__header" data-i18n="intelligence abbreviation"></h4><span name="attr_intelligence" title="@{intelligence}"></span>
<button class="roller--mod-display roller" name="roll_intelligence" value="@{intelligence_action}" type="roll">
<input class="plus-control" name="attr_intelligence_mod" value="0" hidden="" type="hidden" title="@{intelligence_mod}"/><span class="plus-display" name="attr_intelligence_mod" title="@{intelligence_mod}"></span>
</button>
<button name="act_intelligence-action" hidden="" type="action">
</button>
<input name="attr_intelligence_action" type="hidden" title="@{intelligence_action}"/>
</div>
<div class="score">
<h4 class="statblock__row__header" data-i18n="wisdom abbreviation"></h4><span name="attr_wisdom" title="@{wisdom}"></span>
<button class="roller--mod-display roller" name="roll_wisdom" value="@{wisdom_action}" type="roll">
<input class="plus-control" name="attr_wisdom_mod" value="0" hidden="" type="hidden" title="@{wisdom_mod}"/><span class="plus-display" name="attr_wisdom_mod" title="@{wisdom_mod}"></span>
</button>
<button name="act_wisdom-action" hidden="" type="action">
</button>
<input name="attr_wisdom_action" type="hidden" title="@{wisdom_action}"/>
</div>
<div class="score">
<h4 class="statblock__row__header" data-i18n="charisma abbreviation"></h4><span name="attr_charisma" title="@{charisma}"></span>
<button class="roller--mod-display roller" name="roll_charisma" value="@{charisma_action}" type="roll">
<input class="plus-control" name="attr_charisma_mod" value="0" hidden="" type="hidden" title="@{charisma_mod}"/><span class="plus-display" name="attr_charisma_mod" title="@{charisma_mod}"></span>
</button>
<button name="act_charisma-action" hidden="" type="action">
</button>
<input name="attr_charisma_action" type="hidden" title="@{charisma_action}"/>
</div>
</div>
<div class="statblock__subrow statblock__saves flex-box half-gap flex-wrap">
<h4 class="statblock__row__header" data-i18n="saves"></h4>
<input class="display-value-control" name="attr_strength_save" value="" type="hidden" title="@{strength_save}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_strength_save" data-i18n="strength save" value="@{strength_save_action}" type="roll">
</button>
<button name="act_strength-save-action" hidden="" type="action">
</button>
<input name="attr_strength_save_action" type="hidden" title="@{strength_save_action}"/>
<input class="plus-control" name="attr_strength_save" value="0" hidden="" type="hidden" title="@{strength_save}"/><span class="input-label__input plus-display" name="attr_strength_save" title="@{strength_save}"></span>
</div>
<input class="display-value-control" name="attr_dexterity_save" value="" type="hidden" title="@{dexterity_save}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_dexterity_save" data-i18n="dexterity save" value="@{dexterity_save_action}" type="roll">
</button>
<button name="act_dexterity-save-action" hidden="" type="action">
</button>
<input name="attr_dexterity_save_action" type="hidden" title="@{dexterity_save_action}"/>
<input class="plus-control" name="attr_dexterity_save" value="0" hidden="" type="hidden" title="@{dexterity_save}"/><span class="input-label__input plus-display" name="attr_dexterity_save" title="@{dexterity_save}"></span>
</div>
<input class="display-value-control" name="attr_constitution_save" value="" type="hidden" title="@{constitution_save}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_constitution_save" data-i18n="constitution save" value="@{constitution_save_action}" type="roll">
</button>
<button name="act_constitution-save-action" hidden="" type="action">
</button>
<input name="attr_constitution_save_action" type="hidden" title="@{constitution_save_action}"/>
<input class="plus-control" name="attr_constitution_save" value="0" hidden="" type="hidden" title="@{constitution_save}"/><span class="input-label__input plus-display" name="attr_constitution_save" title="@{constitution_save}"></span>
</div>
<input class="display-value-control" name="attr_intelligence_save" value="" type="hidden" title="@{intelligence_save}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_intelligence_save" data-i18n="intelligence save" value="@{intelligence_save_action}" type="roll">
</button>
<button name="act_intelligence-save-action" hidden="" type="action">
</button>
<input name="attr_intelligence_save_action" type="hidden" title="@{intelligence_save_action}"/>
<input class="plus-control" name="attr_intelligence_save" value="0" hidden="" type="hidden" title="@{intelligence_save}"/><span class="input-label__input plus-display" name="attr_intelligence_save" title="@{intelligence_save}"></span>
</div>
<input class="display-value-control" name="attr_wisdom_save" value="" type="hidden" title="@{wisdom_save}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_wisdom_save" data-i18n="wisdom save" value="@{wisdom_save_action}" type="roll">
</button>
<button name="act_wisdom-save-action" hidden="" type="action">
</button>
<input name="attr_wisdom_save_action" type="hidden" title="@{wisdom_save_action}"/>
<input class="plus-control" name="attr_wisdom_save" value="0" hidden="" type="hidden" title="@{wisdom_save}"/><span class="input-label__input plus-display" name="attr_wisdom_save" title="@{wisdom_save}"></span>
</div>
<input class="display-value-control" name="attr_charisma_save" value="" type="hidden" title="@{charisma_save}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_charisma_save" data-i18n="charisma save" value="@{charisma_save_action}" type="roll">
</button>
<button name="act_charisma-save-action" hidden="" type="action">
</button>
<input name="attr_charisma_save_action" type="hidden" title="@{charisma_save_action}"/>
<input class="plus-control" name="attr_charisma_save" value="0" hidden="" type="hidden" title="@{charisma_save}"/><span class="input-label__input plus-display" name="attr_charisma_save" title="@{charisma_save}"></span>
</div>
</div>
<div class="statblock__subrow statblock__skills flex-box half-gap flex-wrap">
<h4 class="statblock__row__header" data-i18n="skills"></h4>
<input class="display-value-control" name="attr_acrobatics" value="" type="hidden" title="@{acrobatics}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_acrobatics" data-i18n="acrobatics" value="@{acrobatics_action}" type="roll">
</button>
<button name="act_acrobatics-action" hidden="" type="action">
</button>
<input name="attr_acrobatics_action" type="hidden" title="@{acrobatics_action}"/>
<input class="plus-control" name="attr_acrobatics" value="0" hidden="" type="hidden" title="@{acrobatics}"/><span class="input-label__input plus-display" name="attr_acrobatics" title="@{acrobatics}"></span>
</div>
<input class="display-value-control" name="attr_arts_and_crafts" value="" type="hidden" title="@{arts_and_crafts}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_arts_and_crafts" data-i18n="arts and crafts" value="@{arts_and_crafts_action}" type="roll">
</button>
<button name="act_arts-and-crafts-action" hidden="" type="action">
</button>
<input name="attr_arts_and_crafts_action" type="hidden" title="@{arts_and_crafts_action}"/>
<input class="plus-control" name="attr_arts_and_crafts" value="0" hidden="" type="hidden" title="@{arts_and_crafts}"/><span class="input-label__input plus-display" name="attr_arts_and_crafts" title="@{arts_and_crafts}"></span>
</div>
<input class="display-value-control" name="attr_athletics" value="" type="hidden" title="@{athletics}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_athletics" data-i18n="athletics" value="@{athletics_action}" type="roll">
</button>
<button name="act_athletics-action" hidden="" type="action">
</button>
<input name="attr_athletics_action" type="hidden" title="@{athletics_action}"/>
<input class="plus-control" name="attr_athletics" value="0" hidden="" type="hidden" title="@{athletics}"/><span class="input-label__input plus-display" name="attr_athletics" title="@{athletics}"></span>
</div>
<input class="display-value-control" name="attr_computers" value="" type="hidden" title="@{computers}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_computers" data-i18n="computers" value="@{computers_action}" type="roll">
</button>
<button name="act_computers-action" hidden="" type="action">
</button>
<input name="attr_computers_action" type="hidden" title="@{computers_action}"/>
<input class="plus-control" name="attr_computers" value="0" hidden="" type="hidden" title="@{computers}"/><span class="input-label__input plus-display" name="attr_computers" title="@{computers}"></span>
</div>
<input class="display-value-control" name="attr_deception" value="" type="hidden" title="@{deception}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_deception" data-i18n="deception" value="@{deception_action}" type="roll">
</button>
<button name="act_deception-action" hidden="" type="action">
</button>
<input name="attr_deception_action" type="hidden" title="@{deception_action}"/>
<input class="plus-control" name="attr_deception" value="0" hidden="" type="hidden" title="@{deception}"/><span class="input-label__input plus-display" name="attr_deception" title="@{deception}"></span>
</div>
<input class="display-value-control" name="attr_endurance" value="" type="hidden" title="@{endurance}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_endurance" data-i18n="endurance" value="@{endurance_action}" type="roll">
</button>
<button name="act_endurance-action" hidden="" type="action">
</button>
<input name="attr_endurance_action" type="hidden" title="@{endurance_action}"/>
<input class="plus-control" name="attr_endurance" value="0" hidden="" type="hidden" title="@{endurance}"/><span class="input-label__input plus-display" name="attr_endurance" title="@{endurance}"></span>
</div>
<input class="display-value-control" name="attr_insight" value="" type="hidden" title="@{insight}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_insight" data-i18n="insight" value="@{insight_action}" type="roll">
</button>
<button name="act_insight-action" hidden="" type="action">
</button>
<input name="attr_insight_action" type="hidden" title="@{insight_action}"/>
<input class="plus-control" name="attr_insight" value="0" hidden="" type="hidden" title="@{insight}"/><span class="input-label__input plus-display" name="attr_insight" title="@{insight}"></span>
</div>
<input class="display-value-control" name="attr_intimidation" value="" type="hidden" title="@{intimidation}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_intimidation" data-i18n="intimidation" value="@{intimidation_action}" type="roll">
</button>
<button name="act_intimidation-action" hidden="" type="action">
</button>
<input name="attr_intimidation_action" type="hidden" title="@{intimidation_action}"/>
<input class="plus-control" name="attr_intimidation" value="0" hidden="" type="hidden" title="@{intimidation}"/><span class="input-label__input plus-display" name="attr_intimidation" title="@{intimidation}"></span>
</div>
<input class="display-value-control" name="attr_investigation" value="" type="hidden" title="@{investigation}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_investigation" data-i18n="investigation" value="@{investigation_action}" type="roll">
</button>
<button name="act_investigation-action" hidden="" type="action">
</button>
<input name="attr_investigation_action" type="hidden" title="@{investigation_action}"/>
<input class="plus-control" name="attr_investigation" value="0" hidden="" type="hidden" title="@{investigation}"/><span class="input-label__input plus-display" name="attr_investigation" title="@{investigation}"></span>
</div>
<input class="display-value-control" name="attr_mechanics" value="" type="hidden" title="@{mechanics}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_mechanics" data-i18n="mechanics" value="@{mechanics_action}" type="roll">
</button>
<button name="act_mechanics-action" hidden="" type="action">
</button>
<input name="attr_mechanics_action" type="hidden" title="@{mechanics_action}"/>
<input class="plus-control" name="attr_mechanics" value="0" hidden="" type="hidden" title="@{mechanics}"/><span class="input-label__input plus-display" name="attr_mechanics" title="@{mechanics}"></span>
</div>
<input class="display-value-control" name="attr_medicine" value="" type="hidden" title="@{medicine}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_medicine" data-i18n="medicine" value="@{medicine_action}" type="roll">
</button>
<button name="act_medicine-action" hidden="" type="action">
</button>
<input name="attr_medicine_action" type="hidden" title="@{medicine_action}"/>
<input class="plus-control" name="attr_medicine" value="0" hidden="" type="hidden" title="@{medicine}"/><span class="input-label__input plus-display" name="attr_medicine" title="@{medicine}"></span>
</div>
<input class="display-value-control" name="attr_natural_science" value="" type="hidden" title="@{natural_science}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_natural_science" data-i18n="natural science" value="@{natural_science_action}" type="roll">
</button>
<button name="act_natural-science-action" hidden="" type="action">
</button>
<input name="attr_natural_science_action" type="hidden" title="@{natural_science_action}"/>
<input class="plus-control" name="attr_natural_science" value="0" hidden="" type="hidden" title="@{natural_science}"/><span class="input-label__input plus-display" name="attr_natural_science" title="@{natural_science}"></span>
</div>
<input class="display-value-control" name="attr_perception" value="" type="hidden" title="@{perception}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_perception" data-i18n="perception" value="@{perception_action}" type="roll">
</button>
<button name="act_perception-action" hidden="" type="action">
</button>
<input name="attr_perception_action" type="hidden" title="@{perception_action}"/>
<input class="plus-control" name="attr_perception" value="0" hidden="" type="hidden" title="@{perception}"/><span class="input-label__input plus-display" name="attr_perception" title="@{perception}"></span>
</div>
<input class="display-value-control" name="attr_performance" value="" type="hidden" title="@{performance}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_performance" data-i18n="performance" value="@{performance_action}" type="roll">
</button>
<button name="act_performance-action" hidden="" type="action">
</button>
<input name="attr_performance_action" type="hidden" title="@{performance_action}"/>
<input class="plus-control" name="attr_performance" value="0" hidden="" type="hidden" title="@{performance}"/><span class="input-label__input plus-display" name="attr_performance" title="@{performance}"></span>
</div>
<input class="display-value-control" name="attr_persuasion" value="" type="hidden" title="@{persuasion}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_persuasion" data-i18n="persuasion" value="@{persuasion_action}" type="roll">
</button>
<button name="act_persuasion-action" hidden="" type="action">
</button>
<input name="attr_persuasion_action" type="hidden" title="@{persuasion_action}"/>
<input class="plus-control" name="attr_persuasion" value="0" hidden="" type="hidden" title="@{persuasion}"/><span class="input-label__input plus-display" name="attr_persuasion" title="@{persuasion}"></span>
</div>
<input class="display-value-control" name="attr_security" value="" type="hidden" title="@{security}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_security" data-i18n="security" value="@{security_action}" type="roll">
</button>
<button name="act_security-action" hidden="" type="action">
</button>
<input name="attr_security_action" type="hidden" title="@{security_action}"/>
<input class="plus-control" name="attr_security" value="0" hidden="" type="hidden" title="@{security}"/><span class="input-label__input plus-display" name="attr_security" title="@{security}"></span>
</div>
<input class="display-value-control" name="attr_sleight_of_hand" value="" type="hidden" title="@{sleight_of_hand}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_sleight_of_hand" data-i18n="sleight of hand" value="@{sleight_of_hand_action}" type="roll">
</button>
<button name="act_sleight-of-hand-action" hidden="" type="action">
</button>
<input name="attr_sleight_of_hand_action" type="hidden" title="@{sleight_of_hand_action}"/>
<input class="plus-control" name="attr_sleight_of_hand" value="0" hidden="" type="hidden" title="@{sleight_of_hand}"/><span class="input-label__input plus-display" name="attr_sleight_of_hand" title="@{sleight_of_hand}"></span>
</div>
<input class="display-value-control" name="attr_social_sciences" value="" type="hidden" title="@{social_sciences}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_social_sciences" data-i18n="social sciences" value="@{social_sciences_action}" type="roll">
</button>
<button name="act_social-sciences-action" hidden="" type="action">
</button>
<input name="attr_social_sciences_action" type="hidden" title="@{social_sciences_action}"/>
<input class="plus-control" name="attr_social_sciences" value="0" hidden="" type="hidden" title="@{social_sciences}"/><span class="input-label__input plus-display" name="attr_social_sciences" title="@{social_sciences}"></span>
</div>
<input class="display-value-control" name="attr_stealth" value="" type="hidden" title="@{stealth}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_stealth" data-i18n="stealth" value="@{stealth_action}" type="roll">
</button>
<button name="act_stealth-action" hidden="" type="action">
</button>
<input name="attr_stealth_action" type="hidden" title="@{stealth_action}"/>
<input class="plus-control" name="attr_stealth" value="0" hidden="" type="hidden" title="@{stealth}"/><span class="input-label__input plus-display" name="attr_stealth" title="@{stealth}"></span>
</div>
<input class="display-value-control" name="attr_streetwise" value="" type="hidden" title="@{streetwise}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_streetwise" data-i18n="streetwise" value="@{streetwise_action}" type="roll">
</button>
<button name="act_streetwise-action" hidden="" type="action">
</button>
<input name="attr_streetwise_action" type="hidden" title="@{streetwise_action}"/>
<input class="plus-control" name="attr_streetwise" value="0" hidden="" type="hidden" title="@{streetwise}"/><span class="input-label__input plus-display" name="attr_streetwise" title="@{streetwise}"></span>
</div>
<input class="display-value-control" name="attr_survival" value="" type="hidden" title="@{survival}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_survival" data-i18n="survival" value="@{survival_action}" type="roll">
</button>
<button name="act_survival-action" hidden="" type="action">
</button>
<input name="attr_survival_action" type="hidden" title="@{survival_action}"/>
<input class="plus-control" name="attr_survival" value="0" hidden="" type="hidden" title="@{survival}"/><span class="input-label__input plus-display" name="attr_survival" title="@{survival}"></span>
</div>
<input class="display-value-control" name="attr_vehicles" value="" type="hidden" title="@{vehicles}"/>
<div class="input-label controlled-display">
<button class="input-label__span roller" name="roll_vehicles" data-i18n="vehicles" value="@{vehicles_action}" type="roll">
</button>
<button name="act_vehicles-action" hidden="" type="action">
</button>
<input name="attr_vehicles_action" type="hidden" title="@{vehicles_action}"/>
<input class="plus-control" name="attr_vehicles" value="0" hidden="" type="hidden" title="@{vehicles}"/><span class="input-label__input plus-display" name="attr_vehicles" title="@{vehicles}"></span>
</div>
</div>
<div class="statblock__subrow statblock__senses flex-box half-gap"><span class="statblock__row__header" data-i18n="senses"></span>
<input class="display-value-control" name="attr_senses" value="" type="hidden" title="@{senses}"/><span name="attr_senses" title="@{senses}"></span>
<div class="input-label half-gap"><span data-i18n="passive perception"></span><span name="attr_passive_perception" title="@{passive_perception}"></span>
</div>
</div>
<input class="display-value-control" name="attr_roles" value="" type="hidden" title="@{roles}"/>
<div class="statblock__subrow statblock__roles flex-box half-gap controlled-display"><span class="statblock__row__header" data-i18n="roles"></span><span name="attr_roles" title="@{roles}"></span>
</div>
<input class="display-value-control" name="attr_equipment" value="" type="hidden" title="@{equipment}"/>
<div class="statblock__subrow statblock__equipment flex-box half-gap controlled-display"><span class="statblock__row__header" data-i18n="equipment"></span><span name="attr_equipment" title="@{equipment}"></span>
</div>
</section>
<section class="statblock__row statblock__edit collapse-container"><!-- attributes: "{&quot;class&quot;:&quot;test-class statblock__edit&quot;}" -->
<input name="attr_npc_not_genius" value="0" type="hidden" title="@{npc_not_genius}"/>
<input class="collapse" name="attr_npc_not_genius" value="1" type="checkbox" title="@{npc_not_genius}" checked="checked"/>
<div class="statblock__subrow"><span class="statblock__row__header" data-i18n="genius"></span></div>
<div class="statblock__subrow flex-box half-gap expanded">
<label class="input-label"><span class="statblock__row__header input-label__text" data-i18n="level"></span>
<input class="underlined input-label__input" name="attr_genius_level" type="number" title="@{genius_level}"/>
</label>
<label class="input-label"><span class="statblock__row__header input-label__text" data-i18n="points"></span>
<input class="underlined input-label__input" name="attr_genius" type="number" title="@{genius}"/>
</label>
<label class="input-label"><span class="uppercase statblock__row__header input-label__text" data-i18n="dc"></span>
<input class="underlined input-label__input" name="attr_plan_dc" type="number" title="@{plan_dc}"/>
</label>
</div>
<div class="statblock__subrow repeating-section-container expanded">
<button class="repcontrol-button repcontrol-button--add" name="act_add-plans" type="action">
</button>
<fieldset class="repeating_plans">
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_plans_$X_collapse}"/>
<div class="float-effect item-head">
<button class="roller" name="roll_roll" value="@{action}" type="roll">
</button>
<button name="act_action" hidden="" type="action">
</button>
<input name="attr_action" type="hidden" title="@{repeating_plans_$X_action}"/>
<input name="attr_name" data-i18n-placeholder="plan name" type="text" title="@{repeating_plans_$X_name}"/>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="level abbreviation"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_level" type="number" title="@{repeating_plans_$X_level}"/>
</label>
</div>
<section class="section section--layout expanded section--fill">
<div class="section__content">
<div class="flex-box flex-wrap half-gap">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="action"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_prep_action" type="text" title="@{repeating_plans_$X_prep_action}"/>
</label>
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="duration"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_duration" type="text" title="@{repeating_plans_$X_duration}"/>
</label>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_attack_disable" value="1" type="checkbox" title="@{repeating_plans_$X_attack_disable}" checked="checked"/>
<h3 data-i18n="attack"></h3>
<div class="expanded attack flex-box flex-wrap half-gap justify-space-around">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="crit on"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_threshold" type="number" value="20" title="@{repeating_plans_$X_critical_threshold}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="bonus"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_attack_bonus" type="number" title="@{repeating_plans_$X_attack_bonus}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="pv"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_penetration" type="number" title="@{repeating_plans_$X_penetration}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_damage_1_disable" value="1" type="checkbox" title="@{repeating_plans_$X_damage_1_disable}" checked="checked"/>
<h3 data-i18n="damage 1"></h3>
<div class="expanded damage 1 flex-box flex-wrap half-gap justify-space-around">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="damage 1"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_1" type="text" title="@{repeating_plans_$X_damage_1}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="custom crit"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_1" type="text" title="@{repeating_plans_$X_critical_1}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="type"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_type_1" type="text" title="@{repeating_plans_$X_damage_type_1}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_damage_2_disable" value="1" type="checkbox" title="@{repeating_plans_$X_damage_2_disable}" checked="checked"/>
<h3 data-i18n="damage 2"></h3>
<div class="expanded damage 2 flex-box flex-wrap half-gap justify-space-around">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="damage 2"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_2" type="text" title="@{repeating_plans_$X_damage_2}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="custom crit"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_2" type="text" title="@{repeating_plans_$X_critical_2}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="type"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_type_2" type="text" title="@{repeating_plans_$X_damage_type_2}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_save_disable" value="1" type="checkbox" title="@{repeating_plans_$X_save_disable}" checked="checked"/>
<h3 data-i18n="save"></h3>
<div class="expanded save flex-box flex-wrap half-gap justify-space-around">
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="save type"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_save_type" title="@{repeating_plans_$X_save_type}">
<option value="">
</option>
<option value="strength save" data-i18n="strength abbreviation">
</option>
<option value="dexterity save" data-i18n="dexterity abbreviation">
</option>
<option value="constitution save" data-i18n="constitution abbreviation">
</option>
<option value="intelligence save" data-i18n="intelligence abbreviation">
</option>
<option value="wisdom save" data-i18n="wisdom abbreviation">
</option>
<option value="charisma save" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="bonus"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_dc_bonus" type="number" title="@{repeating_plans_$X_dc_bonus}"/>
</label>
</div>
</div>
<div class="headed-textarea">
<h3 data-i18n="description"></h3>
<div class="adaptive adaptive--text form-label__input form-label--textarea__input form-label__no-label recess-effect"><span class="adaptive--text__span" name="attr_description" title="@{repeating_plans_$X_description}"></span>
<textarea class="adaptive--text__textarea" name="attr_description" title="@{repeating_plans_$X_description}"></textarea>
</div>
</div>
<div class="headed-textarea collapse-container">
<input class="collapse collapse-arrow" name="attr_collapse_3" value="1" type="checkbox" title="@{repeating_plans_$X_collapse_3}" checked="checked"/>
<h3 data-i18n="level 3"></h3>
<div class="adaptive adaptive--text expanded form-label__input form-label--textarea__input form-label__no-label recess-effect"><span class="adaptive--text__span" name="attr_level_3_effect" title="@{repeating_plans_$X_level_3_effect}"></span>
<textarea class="adaptive--text__textarea" name="attr_level_3_effect" title="@{repeating_plans_$X_level_3_effect}"></textarea>
</div>
</div>
<div class="headed-textarea collapse-container">
<input class="collapse collapse-arrow" name="attr_collapse_5" value="1" type="checkbox" title="@{repeating_plans_$X_collapse_5}" checked="checked"/>
<h3 data-i18n="level 5"></h3>
<div class="adaptive adaptive--text expanded form-label__input form-label--textarea__input form-label__no-label recess-effect"><span class="adaptive--text__span" name="attr_level_5_effect" title="@{repeating_plans_$X_level_5_effect}"></span>
<textarea class="adaptive--text__textarea" name="attr_level_5_effect" title="@{repeating_plans_$X_level_5_effect}"></textarea>
</div>
</div>
<div class="headed-textarea collapse-container">
<input class="collapse collapse-arrow" name="attr_collapse_7" value="1" type="checkbox" title="@{repeating_plans_$X_collapse_7}" checked="checked"/>
<h3 data-i18n="level 7"></h3>
<div class="adaptive adaptive--text expanded form-label__input form-label--textarea__input form-label__no-label recess-effect"><span class="adaptive--text__span" name="attr_level_7_effect" title="@{repeating_plans_$X_level_7_effect}"></span>
<textarea class="adaptive--text__textarea" name="attr_level_7_effect" title="@{repeating_plans_$X_level_7_effect}"></textarea>
</div>
</div>
<div class="headed-textarea collapse-container">
<input class="collapse collapse-arrow" name="attr_collapse_9" value="1" type="checkbox" title="@{repeating_plans_$X_collapse_9}" checked="checked"/>
<h3 data-i18n="level 9"></h3>
<div class="adaptive adaptive--text expanded form-label__input form-label--textarea__input form-label__no-label recess-effect"><span class="adaptive--text__span" name="attr_level_9_effect" title="@{repeating_plans_$X_level_9_effect}"></span>
<textarea class="adaptive--text__textarea" name="attr_level_9_effect" title="@{repeating_plans_$X_level_9_effect}"></textarea>
</div>
</div>
</div>
</section>
</fieldset>
</div>
</section>
<input class="display-value-control" name="attr_genius_level" value="" type="hidden" title="@{genius_level}"/>
<section class="controlled-display statblock__row statblock__view collapse-container" style="display:none;"><!-- attributes: "{&quot;class&quot;:&quot;test-class statblock__edit&quot;}" -->
</section>
<section class="statblock__row statblock__edit statblock__genius collapse-container statblock__view">
</section>
<input class="display-value-control" name="attr_genius_level" value="" type="hidden" title="@{genius_level}"/>
<section class="controlled-display statblock__row statblock__view statblock__genius collapse-container statblock__view">
<div class="statblock__subrow">
<div class="flex-box half-gap"><span class="statblock__row__header" data-i18n="genius"></span>
<div class="input-label"><span class="input-label__span statblock__row__header" data-i18n="level"></span><span name="attr_genius_level" title="@{genius_level}"></span>
</div>
<div class="input-label"><span class="input-label__span statblock__row__header" data-i18n="points"></span><span name="attr_genius" title="@{genius}"></span>
</div>
<div class="input-label"><span class="input-label__span statblock__row__header" data-i18n="dc"></span><span name="attr_plan_dc" title="@{plan_dc}"></span>
</div>
</div><span class="locked-fieldset inline-fieldset" hidden=""></span>
<fieldset class="repeating_plans">
<button class="roller" name="roll_roll" value="@{action}" type="roll"><span name="attr_name" title="@{repeating_plans_$X_name}"></span>
</button>
<button name="act_action" hidden="" type="action">
</button>
<input name="attr_action" type="hidden" title="@{repeating_plans_$X_action}"/>
</fieldset>
</div>
</section>
<section class="statblock__row statblock__edit collapse-container statblock__edit"><!-- attributes: "{&quot;class&quot;:&quot;statblock__edit&quot;}" -->
<input name="attr_npc_not_focus" value="0" type="hidden" title="@{npc_not_focus}"/>
<input class="collapse" name="attr_npc_not_focus" value="1" type="checkbox" title="@{npc_not_focus}" checked="checked"/>
<div class="statblock__subrow"><span class="statblock__row__header" data-i18n="focus"></span></div>
<div class="statblock__subrow flex-box half-gap expanded">
<label class="input-label"><span class="statblock__row__header input-label__text" data-i18n="level"></span>
<input class="underlined input-label__input" name="attr_focus_level" type="number" title="@{focus_level}"/>
</label>
<label class="input-label"><span class="statblock__row__header input-label__text" data-i18n="points"></span>
<input class="underlined input-label__input" name="attr_focus" type="number" title="@{focus}"/>
</label>
<label class="input-label"><span class="uppercase statblock__row__header input-label__text" data-i18n="dc"></span>
<input class="underlined input-label__input" name="attr_trick_dc" type="number" title="@{trick_dc}"/>
</label>
</div>
<div class="statblock__subrow repeating-section-container expanded">
<button class="repcontrol-button repcontrol-button--add" name="act_add-tricks" type="action">
</button>
<fieldset class="repeating_tricks">
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_tricks_$X_collapse}"/>
<div class="float-effect item-head">
<button class="roller" name="roll_roll" value="@{action}" type="roll">
</button>
<button name="act_action" hidden="" type="action">
</button>
<input name="attr_action" type="hidden" title="@{repeating_tricks_$X_action}"/>
<input name="attr_name" data-i18n-placeholder="trick name" type="text" title="@{repeating_tricks_$X_name}"/>
</div>
<section class="section section--layout expanded section--fill">
<div class="section__content">
<div class="flex-box flex-wrap half-gap">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="action"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_prep_action" type="text" title="@{repeating_tricks_$X_prep_action}"/>
</label>
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="duration"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_duration" type="text" title="@{repeating_tricks_$X_duration}"/>
</label>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_attack_disable" value="1" type="checkbox" title="@{repeating_tricks_$X_attack_disable}" checked="checked"/>
<h3 data-i18n="attack"></h3>
<div class="expanded attack flex-box flex-wrap half-gap justify-space-around">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="crit on"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_threshold" type="number" value="20" title="@{repeating_tricks_$X_critical_threshold}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="bonus"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_attack_bonus" type="number" title="@{repeating_tricks_$X_attack_bonus}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="pv"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_penetration" type="number" title="@{repeating_tricks_$X_penetration}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_damage_1_disable" value="1" type="checkbox" title="@{repeating_tricks_$X_damage_1_disable}" checked="checked"/>
<h3 data-i18n="damage 1"></h3>
<div class="expanded damage 1 flex-box flex-wrap half-gap justify-space-around">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="damage 1"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_1" type="text" title="@{repeating_tricks_$X_damage_1}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="custom crit"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_1" type="text" title="@{repeating_tricks_$X_critical_1}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="type"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_type_1" type="text" title="@{repeating_tricks_$X_damage_type_1}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_damage_2_disable" value="1" type="checkbox" title="@{repeating_tricks_$X_damage_2_disable}" checked="checked"/>
<h3 data-i18n="damage 2"></h3>
<div class="expanded damage 2 flex-box flex-wrap half-gap justify-space-around">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="damage 2"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_2" type="text" title="@{repeating_tricks_$X_damage_2}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="custom crit"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_2" type="text" title="@{repeating_tricks_$X_critical_2}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="type"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_type_2" type="text" title="@{repeating_tricks_$X_damage_type_2}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_save_disable" value="1" type="checkbox" title="@{repeating_tricks_$X_save_disable}" checked="checked"/>
<h3 data-i18n="save"></h3>
<div class="expanded save flex-box flex-wrap half-gap justify-space-around">
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="save type"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_save_type" title="@{repeating_tricks_$X_save_type}">
<option value="">
</option>
<option value="strength save" data-i18n="strength abbreviation">
</option>
<option value="dexterity save" data-i18n="dexterity abbreviation">
</option>
<option value="constitution save" data-i18n="constitution abbreviation">
</option>
<option value="intelligence save" data-i18n="intelligence abbreviation">
</option>
<option value="wisdom save" data-i18n="wisdom abbreviation">
</option>
<option value="charisma save" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="bonus"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_dc_bonus" type="number" title="@{repeating_tricks_$X_dc_bonus}"/>
</label>
</div>
</div>
<div class="headed-textarea">
<h3 data-i18n="description"></h3>
<div class="adaptive adaptive--text form-label__input form-label--textarea__input form-label__no-label recess-effect"><span class="adaptive--text__span" name="attr_description" title="@{repeating_tricks_$X_description}"></span>
<textarea class="adaptive--text__textarea" name="attr_description" title="@{repeating_tricks_$X_description}"></textarea>
</div>
</div>
</div>
</section>
</fieldset>
</div>
</section>
<input class="display-value-control" name="attr_focus_level" value="" type="hidden" title="@{focus_level}"/>
<section class="controlled-display statblock__row statblock__view collapse-container statblock__edit" style="display:none;"><!-- attributes: "{&quot;class&quot;:&quot;statblock__edit&quot;}" -->
</section>
<section class="statblock__row statblock__edit statblock__focus collapse-container statblock__view">
</section>
<input class="display-value-control" name="attr_focus_level" value="" type="hidden" title="@{focus_level}"/>
<section class="controlled-display statblock__row statblock__view statblock__focus collapse-container statblock__view">
<div class="statblock__subrow">
<div class="flex-box half-gap"><span class="statblock__row__header" data-i18n="focus"></span>
<div class="input-label"><span class="input-label__span statblock__row__header" data-i18n="level"></span><span name="attr_focus_level" title="@{focus_level}"></span>
</div>
<div class="input-label"><span class="input-label__span statblock__row__header" data-i18n="points"></span><span name="attr_focus" title="@{focus}"></span>
</div>
<div class="input-label"><span class="input-label__span statblock__row__header" data-i18n="dc"></span><span name="attr_plan_dc" title="@{plan_dc}"></span>
</div>
</div><span class="locked-fieldset inline-fieldset" hidden=""></span>
<fieldset class="repeating_tricks">
<button class="roller" name="roll_roll" value="@{action}" type="roll"><span name="attr_name" title="@{repeating_tricks_$X_name}"></span>
</button>
<button name="act_action" hidden="" type="action">
</button>
<input name="attr_action" type="hidden" title="@{repeating_tricks_$X_action}"/>
</fieldset>
</div>
</section>
<section class="statblock__row statblock__edit collapse-container statblock__edit"><!-- attributes: "{}" -->
<input name="attr_npc_not_influence" value="0" type="hidden" title="@{npc_not_influence}"/>
<input class="collapse" name="attr_npc_not_influence" value="1" type="checkbox" title="@{npc_not_influence}" checked="checked"/>
<div class="statblock__subrow"><span class="statblock__row__header" data-i18n="influence"></span></div>
<div class="statblock__subrow flex-box half-gap expanded">
<label class="input-label"><span class="statblock__row__header input-label__text" data-i18n="level"></span>
<input class="underlined input-label__input" name="attr_influence_level" type="number" title="@{influence_level}"/>
</label>
<label class="input-label"><span class="statblock__row__header input-label__text" data-i18n="points"></span>
<input class="underlined input-label__input" name="attr_influence" type="number" title="@{influence}"/>
</label>
<label class="input-label"><span class="uppercase statblock__row__header input-label__text" data-i18n="dc"></span>
<input class="underlined input-label__input" name="attr_influence_trick_dc" type="number" title="@{influence_trick_dc}"/>
</label>
</div>
<div class="statblock__subrow repeating-section-container expanded">
<button class="repcontrol-button repcontrol-button--add" name="act_add-influence-tricks" type="action">
</button>
<fieldset class="repeating_influence-tricks">
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_influence-tricks_$X_collapse}"/>
<div class="float-effect item-head">
<button class="roller" name="roll_roll" value="@{action}" type="roll">
</button>
<button name="act_action" hidden="" type="action">
</button>
<input name="attr_action" type="hidden" title="@{repeating_influence-tricks_$X_action}"/>
<input name="attr_name" data-i18n-placeholder="influence trick name" type="text" title="@{repeating_influence-tricks_$X_name}"/>
</div>
<section class="section section--layout expanded section--fill">
<div class="section__content">
<div class="flex-box flex-wrap half-gap">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="action"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_prep_action" type="text" title="@{repeating_influence-tricks_$X_prep_action}"/>
</label>
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="duration"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_duration" type="text" title="@{repeating_influence-tricks_$X_duration}"/>
</label>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_attack_disable" value="1" type="checkbox" title="@{repeating_influence-tricks_$X_attack_disable}" checked="checked"/>
<h3 data-i18n="attack"></h3>
<div class="expanded attack flex-box flex-wrap half-gap justify-space-around">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="crit on"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_threshold" type="number" value="20" title="@{repeating_influence-tricks_$X_critical_threshold}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="bonus"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_attack_bonus" type="number" title="@{repeating_influence-tricks_$X_attack_bonus}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="pv"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_penetration" type="number" title="@{repeating_influence-tricks_$X_penetration}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_damage_1_disable" value="1" type="checkbox" title="@{repeating_influence-tricks_$X_damage_1_disable}" checked="checked"/>
<h3 data-i18n="damage 1"></h3>
<div class="expanded damage 1 flex-box flex-wrap half-gap justify-space-around">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="damage 1"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_1" type="text" title="@{repeating_influence-tricks_$X_damage_1}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="custom crit"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_1" type="text" title="@{repeating_influence-tricks_$X_critical_1}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="type"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_type_1" type="text" title="@{repeating_influence-tricks_$X_damage_type_1}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_damage_2_disable" value="1" type="checkbox" title="@{repeating_influence-tricks_$X_damage_2_disable}" checked="checked"/>
<h3 data-i18n="damage 2"></h3>
<div class="expanded damage 2 flex-box flex-wrap half-gap justify-space-around">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="damage 2"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_2" type="text" title="@{repeating_influence-tricks_$X_damage_2}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="custom crit"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_2" type="text" title="@{repeating_influence-tricks_$X_critical_2}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="type"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_type_2" type="text" title="@{repeating_influence-tricks_$X_damage_type_2}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_save_disable" value="1" type="checkbox" title="@{repeating_influence-tricks_$X_save_disable}" checked="checked"/>
<h3 data-i18n="save"></h3>
<div class="expanded save flex-box flex-wrap half-gap justify-space-around">
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="save type"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_save_type" title="@{repeating_influence-tricks_$X_save_type}">
<option value="">
</option>
<option value="strength save" data-i18n="strength abbreviation">
</option>
<option value="dexterity save" data-i18n="dexterity abbreviation">
</option>
<option value="constitution save" data-i18n="constitution abbreviation">
</option>
<option value="intelligence save" data-i18n="intelligence abbreviation">
</option>
<option value="wisdom save" data-i18n="wisdom abbreviation">
</option>
<option value="charisma save" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="bonus"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_dc_bonus" type="number" title="@{repeating_influence-tricks_$X_dc_bonus}"/>
</label>
</div>
</div>
<div class="headed-textarea">
<h3 data-i18n="description"></h3>
<div class="adaptive adaptive--text form-label__input form-label--textarea__input form-label__no-label recess-effect"><span class="adaptive--text__span" name="attr_description" title="@{repeating_influence-tricks_$X_description}"></span>
<textarea class="adaptive--text__textarea" name="attr_description" title="@{repeating_influence-tricks_$X_description}"></textarea>
</div>
</div>
</div>
</section>
</fieldset>
</div>
</section>
<input class="display-value-control" name="attr_influence_level" value="" type="hidden" title="@{influence_level}"/>
<section class="controlled-display statblock__row statblock__view collapse-container statblock__edit" style="display:none;"><!-- attributes: "{}" -->
</section>
<section class="statblock__row statblock__edit statblock__influence collapse-container statblock__view">
</section>
<input class="display-value-control" name="attr_influence_level" value="" type="hidden" title="@{influence_level}"/>
<section class="controlled-display statblock__row statblock__view statblock__influence collapse-container statblock__view">
<div class="statblock__subrow">
<div class="flex-box half-gap"><span class="statblock__row__header" data-i18n="influence"></span>
<div class="input-label"><span class="input-label__span statblock__row__header" data-i18n="level"></span><span name="attr_influence_level" title="@{influence_level}"></span>
</div>
<div class="input-label"><span class="input-label__span statblock__row__header" data-i18n="points"></span><span name="attr_influence" title="@{influence}"></span>
</div>
<div class="input-label"><span class="input-label__span statblock__row__header" data-i18n="dc"></span><span name="attr_plan_dc" title="@{plan_dc}"></span>
</div>
</div><span class="locked-fieldset inline-fieldset" hidden=""></span>
<fieldset class="repeating_influence-tricks">
<button class="roller" name="roll_roll" value="@{action}" type="roll"><span name="attr_name" title="@{repeating_influence-tricks_$X_name}"></span>
</button>
<button name="act_action" hidden="" type="action">
</button>
<input name="attr_action" type="hidden" title="@{repeating_influence-tricks_$X_action}"/>
</fieldset>
</div>
</section>
</div>
<div class="actions-container">
<section class="section--npc-traits repeating-section-container">
<h3 class="section__header" data-i18n="traits"></h3>
<button class="repcontrol-button repcontrol-button--add" name="act_add-traits" type="action">
</button>
<fieldset class="repeating_traits">
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_traits_$X_collapse}"/>
<div class="float-effect item-head">
<button name="roll_roll" value="@{template_start} {{title=@{name}}} {{description=@{description}}}" type="roll">
</button>
<input name="attr_name" value="" data-i18n-placeholder="trait name" type="text" title="@{repeating_traits_$X_name}"/>
</div>
<section class="section section--layout expanded section--fill">
<div class="section__content">
<div class="adaptive adaptive--text"><span class="adaptive--text__span" name="attr_description" title="@{repeating_traits_$X_description}"></span>
<textarea class="underlined adaptive--text__textarea" name="attr_description" title="@{repeating_traits_$X_description}"></textarea>
</div>
</div>
</section>
<section class="section section--layout collapsed description controlled-display section--fill">
<div class="section__content">
<div class="content-row-gap"><span name="attr_description" title="@{repeating_traits_$X_description}"></span>
</div>
</div>
</section>
</fieldset>
</section>
<section class="section--npc-traits section--npc-actions repeating-section-container">
<h3 class="section__header" data-i18n="bonus actions"></h3>
<button class="repcontrol-button repcontrol-button--add" name="act_add-bonus-actions" type="action">
</button>
<fieldset class="repeating_bonus-actions">
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_bonus-actions_$X_collapse}"/>
<div class="float-effect item-head">
<button class="roller" name="roll_attack_roll" type="roll" value="@{attack_action}">
</button>
<button name="act_attack-action" hidden="" type="action">
</button>
<input name="attr_attack_action" type="hidden" title="@{repeating_bonus-actions_$X_attack_action}"/>
<input class="border-value--control" name="attr_name_only" hidden="" value="" type="hidden" title="@{repeating_bonus-actions_$X_name_only}"/>
<input name="attr_name" type="text" data-i18n-placeholder="weapon name" title="@{repeating_bonus-actions_$X_name}"/>
<input class="display-value-control" name="attr_bonus_calc" hidden="" value="" type="hidden" title="@{repeating_bonus-actions_$X_bonus_calc}"/>
<div class="input-label form-label controlled-display">
<input name="attr_total_translation" value="total" type="hidden" title="@{repeating_bonus-actions_$X_total_translation}"/><span class="form-label__span input-label__text" name="attr_total_translation" data-i18n-dynamic="" title="@{repeating_bonus-actions_$X_total_translation}"></span>
<input class="border-control--invert" name="attr_damage_1_disable" hidden="" value="1" checked="" type="checkbox" title="@{repeating_bonus-actions_$X_damage_1_disable}"/><span class="form-label__input recess-effect input-label__input" name="attr_bonus_calc" title="@{repeating_bonus-actions_$X_bonus_calc}"></span>
</div>
<input class="display-control--invert" name="attr_damage_1_disable" hidden="" value="1" type="checkbox" title="@{repeating_bonus-actions_$X_damage_1_disable}"/>
<div class="input-label form-label controlled-display"><span class="form-label__span input-label__text" name="attr_damage_label" data-i18n="Damage" title="@{repeating_bonus-actions_$X_damage_label}"></span><span class="form-label__input recess-effect input-label__input" name="attr_total_damage" title="@{repeating_bonus-actions_$X_total_damage}"></span>
</div>
</div>
<section class="section section--layout expanded description section--fill">
<div class="section__content">
<div class="content-row-gap">
<input name="attr_attack_disable" value="1" type="hidden" title="@{repeating_bonus-actions_$X_attack_disable}"/>
<input name="attr_save_disable" value="1" type="hidden" title="@{repeating_bonus-actions_$X_save_disable}"/>
<input name="attr_damage_1_disable" value="1" type="hidden" title="@{repeating_bonus-actions_$X_damage_1_disable}"/>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_attack_disable" value="1" type="checkbox" title="@{repeating_bonus-actions_$X_attack_disable}" checked="checked"/>
<h3 data-i18n="attack"></h3>
<div class="expanded attack flex-box flex-wrap half-gap justify-space-around">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="crit on"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_threshold" type="number" value="20" title="@{repeating_bonus-actions_$X_critical_threshold}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="bonus"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_attack_bonus" type="number" title="@{repeating_bonus-actions_$X_attack_bonus}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="pv"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_penetration" type="number" title="@{repeating_bonus-actions_$X_penetration}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_damage_1_disable" value="1" type="checkbox" title="@{repeating_bonus-actions_$X_damage_1_disable}" checked="checked"/>
<h3 data-i18n="damage 1"></h3>
<div class="expanded damage 1 flex-box flex-wrap half-gap justify-space-around">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="damage 1"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_1" type="text" title="@{repeating_bonus-actions_$X_damage_1}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="custom crit"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_1" type="text" title="@{repeating_bonus-actions_$X_critical_1}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="type"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_type_1" type="text" title="@{repeating_bonus-actions_$X_damage_type_1}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_damage_2_disable" value="1" type="checkbox" title="@{repeating_bonus-actions_$X_damage_2_disable}" checked="checked"/>
<h3 data-i18n="damage 2"></h3>
<div class="expanded damage 2 flex-box flex-wrap half-gap justify-space-around">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="damage 2"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_2" type="text" title="@{repeating_bonus-actions_$X_damage_2}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="custom crit"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_2" type="text" title="@{repeating_bonus-actions_$X_critical_2}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="type"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_type_2" type="text" title="@{repeating_bonus-actions_$X_damage_type_2}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_save_disable" value="1" type="checkbox" title="@{repeating_bonus-actions_$X_save_disable}" checked="checked"/>
<h3 data-i18n="save"></h3>
<div class="expanded save flex-box flex-wrap half-gap justify-space-around">
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="save type"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_save_type" title="@{repeating_bonus-actions_$X_save_type}">
<option value="">
</option>
<option value="strength save" data-i18n="strength abbreviation">
</option>
<option value="dexterity save" data-i18n="dexterity abbreviation">
</option>
<option value="constitution save" data-i18n="constitution abbreviation">
</option>
<option value="intelligence save" data-i18n="intelligence abbreviation">
</option>
<option value="wisdom save" data-i18n="wisdom abbreviation">
</option>
<option value="charisma save" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="bonus"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_dc_bonus" type="number" title="@{repeating_bonus-actions_$X_dc_bonus}"/>
</label>
</div>
</div>
<div class="section-select flex-box half-gap flex-wrap">
<label class="input-label form-label" style="flex:1 1 0;"><span class="form-label__span input-label__text" data-i18n="range"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_range" type="text" style="width:100px" title="@{repeating_bonus-actions_$X_range}"/>
</label>
<label class="input-label form-label" style="flex:1 1 0;"><span class="form-label__span input-label__text" data-i18n="targets"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_targets" type="text" style="width:100px" title="@{repeating_bonus-actions_$X_targets}"/>
</label>
</div>
<div class="adaptive adaptive--text underlined"><span class="adaptive--text__span" name="attr_description" title="@{repeating_bonus-actions_$X_description}"></span>
<textarea class="adaptive--text__textarea" name="attr_description" title="@{repeating_bonus-actions_$X_description}"></textarea>
</div>
</div>
</div>
</section>
<input class="display-value-control" name="attr_description" hidden="" value="" type="hidden" title="@{repeating_bonus-actions_$X_description}"/>
<section class="section section--layout collapsed description controlled-display section--fill">
<div class="section__content">
<div class="content-row-gap"><span name="attr_description" title="@{repeating_bonus-actions_$X_description}"></span>
</div>
</div>
</section>
</fieldset>
</section>
<section class="section--npc-traits section--npc-actions repeating-section-container">
<h3 class="section__header" data-i18n="reactions"></h3>
<button class="repcontrol-button repcontrol-button--add" name="act_add-reactions" type="action">
</button>
<fieldset class="repeating_reactions">
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_reactions_$X_collapse}"/>
<div class="float-effect item-head">
<button class="roller" name="roll_attack_roll" type="roll" value="@{attack_action}">
</button>
<button name="act_attack-action" hidden="" type="action">
</button>
<input name="attr_attack_action" type="hidden" title="@{repeating_reactions_$X_attack_action}"/>
<input class="border-value--control" name="attr_name_only" hidden="" value="" type="hidden" title="@{repeating_reactions_$X_name_only}"/>
<input name="attr_name" type="text" data-i18n-placeholder="weapon name" title="@{repeating_reactions_$X_name}"/>
<input class="display-value-control" name="attr_bonus_calc" hidden="" value="" type="hidden" title="@{repeating_reactions_$X_bonus_calc}"/>
<div class="input-label form-label controlled-display">
<input name="attr_total_translation" value="total" type="hidden" title="@{repeating_reactions_$X_total_translation}"/><span class="form-label__span input-label__text" name="attr_total_translation" data-i18n-dynamic="" title="@{repeating_reactions_$X_total_translation}"></span>
<input class="border-control--invert" name="attr_damage_1_disable" hidden="" value="1" checked="" type="checkbox" title="@{repeating_reactions_$X_damage_1_disable}"/><span class="form-label__input recess-effect input-label__input" name="attr_bonus_calc" title="@{repeating_reactions_$X_bonus_calc}"></span>
</div>
<input class="display-control--invert" name="attr_damage_1_disable" hidden="" value="1" type="checkbox" title="@{repeating_reactions_$X_damage_1_disable}"/>
<div class="input-label form-label controlled-display"><span class="form-label__span input-label__text" name="attr_damage_label" data-i18n="Damage" title="@{repeating_reactions_$X_damage_label}"></span><span class="form-label__input recess-effect input-label__input" name="attr_total_damage" title="@{repeating_reactions_$X_total_damage}"></span>
</div>
</div>
<section class="section section--layout expanded description section--fill">
<div class="section__content">
<div class="content-row-gap">
<input name="attr_attack_disable" value="1" type="hidden" title="@{repeating_reactions_$X_attack_disable}"/>
<input name="attr_save_disable" value="1" type="hidden" title="@{repeating_reactions_$X_save_disable}"/>
<input name="attr_damage_1_disable" value="1" type="hidden" title="@{repeating_reactions_$X_damage_1_disable}"/>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_attack_disable" value="1" type="checkbox" title="@{repeating_reactions_$X_attack_disable}" checked="checked"/>
<h3 data-i18n="attack"></h3>
<div class="expanded attack flex-box flex-wrap half-gap justify-space-around">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="crit on"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_threshold" type="number" value="20" title="@{repeating_reactions_$X_critical_threshold}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="bonus"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_attack_bonus" type="number" title="@{repeating_reactions_$X_attack_bonus}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="pv"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_penetration" type="number" title="@{repeating_reactions_$X_penetration}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_damage_1_disable" value="1" type="checkbox" title="@{repeating_reactions_$X_damage_1_disable}" checked="checked"/>
<h3 data-i18n="damage 1"></h3>
<div class="expanded damage 1 flex-box flex-wrap half-gap justify-space-around">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="damage 1"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_1" type="text" title="@{repeating_reactions_$X_damage_1}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="custom crit"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_1" type="text" title="@{repeating_reactions_$X_critical_1}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="type"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_type_1" type="text" title="@{repeating_reactions_$X_damage_type_1}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_damage_2_disable" value="1" type="checkbox" title="@{repeating_reactions_$X_damage_2_disable}" checked="checked"/>
<h3 data-i18n="damage 2"></h3>
<div class="expanded damage 2 flex-box flex-wrap half-gap justify-space-around">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="damage 2"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_2" type="text" title="@{repeating_reactions_$X_damage_2}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="custom crit"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_2" type="text" title="@{repeating_reactions_$X_critical_2}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="type"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_type_2" type="text" title="@{repeating_reactions_$X_damage_type_2}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_save_disable" value="1" type="checkbox" title="@{repeating_reactions_$X_save_disable}" checked="checked"/>
<h3 data-i18n="save"></h3>
<div class="expanded save flex-box flex-wrap half-gap justify-space-around">
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="save type"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_save_type" title="@{repeating_reactions_$X_save_type}">
<option value="">
</option>
<option value="strength save" data-i18n="strength abbreviation">
</option>
<option value="dexterity save" data-i18n="dexterity abbreviation">
</option>
<option value="constitution save" data-i18n="constitution abbreviation">
</option>
<option value="intelligence save" data-i18n="intelligence abbreviation">
</option>
<option value="wisdom save" data-i18n="wisdom abbreviation">
</option>
<option value="charisma save" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="bonus"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_dc_bonus" type="number" title="@{repeating_reactions_$X_dc_bonus}"/>
</label>
</div>
</div>
<div class="section-select flex-box half-gap flex-wrap">
<label class="input-label form-label" style="flex:1 1 0;"><span class="form-label__span input-label__text" data-i18n="range"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_range" type="text" style="width:100px" title="@{repeating_reactions_$X_range}"/>
</label>
<label class="input-label form-label" style="flex:1 1 0;"><span class="form-label__span input-label__text" data-i18n="targets"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_targets" type="text" style="width:100px" title="@{repeating_reactions_$X_targets}"/>
</label>
</div>
<div class="adaptive adaptive--text underlined"><span class="adaptive--text__span" name="attr_description" title="@{repeating_reactions_$X_description}"></span>
<textarea class="adaptive--text__textarea" name="attr_description" title="@{repeating_reactions_$X_description}"></textarea>
</div>
</div>
</div>
</section>
<input class="display-value-control" name="attr_description" hidden="" value="" type="hidden" title="@{repeating_reactions_$X_description}"/>
<section class="section section--layout collapsed description controlled-display section--fill">
<div class="section__content">
<div class="content-row-gap"><span name="attr_description" title="@{repeating_reactions_$X_description}"></span>
</div>
</div>
</section>
</fieldset>
</section>
<section class="section--npc-traits section--npc-actions repeating-section-container">
<h3 class="section__header" data-i18n="actions"></h3>
<button class="repcontrol-button repcontrol-button--add" name="act_add-action" type="action">
</button>
<fieldset class="repeating_action">
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_action_$X_collapse}"/>
<div class="float-effect item-head">
<button class="roller" name="roll_attack_roll" type="roll" value="@{attack_action}">
</button>
<button name="act_attack-action" hidden="" type="action">
</button>
<input name="attr_attack_action" type="hidden" title="@{repeating_action_$X_attack_action}"/>
<input class="border-value--control" name="attr_name_only" hidden="" value="" type="hidden" title="@{repeating_action_$X_name_only}"/>
<input name="attr_name" type="text" data-i18n-placeholder="weapon name" title="@{repeating_action_$X_name}"/>
<input class="display-value-control" name="attr_bonus_calc" hidden="" value="" type="hidden" title="@{repeating_action_$X_bonus_calc}"/>
<div class="input-label form-label controlled-display">
<input name="attr_total_translation" value="total" type="hidden" title="@{repeating_action_$X_total_translation}"/><span class="form-label__span input-label__text" name="attr_total_translation" data-i18n-dynamic="" title="@{repeating_action_$X_total_translation}"></span>
<input class="border-control--invert" name="attr_damage_1_disable" hidden="" value="1" checked="" type="checkbox" title="@{repeating_action_$X_damage_1_disable}"/><span class="form-label__input recess-effect input-label__input" name="attr_bonus_calc" title="@{repeating_action_$X_bonus_calc}"></span>
</div>
<input class="display-control--invert" name="attr_damage_1_disable" hidden="" value="1" type="checkbox" title="@{repeating_action_$X_damage_1_disable}"/>
<div class="input-label form-label controlled-display"><span class="form-label__span input-label__text" name="attr_damage_label" data-i18n="Damage" title="@{repeating_action_$X_damage_label}"></span><span class="form-label__input recess-effect input-label__input" name="attr_total_damage" title="@{repeating_action_$X_total_damage}"></span>
</div>
</div>
<section class="section section--layout expanded description section--fill">
<div class="section__content">
<div class="content-row-gap">
<input name="attr_attack_disable" value="1" type="hidden" title="@{repeating_action_$X_attack_disable}"/>
<input name="attr_save_disable" value="1" type="hidden" title="@{repeating_action_$X_save_disable}"/>
<input name="attr_damage_1_disable" value="1" type="hidden" title="@{repeating_action_$X_damage_1_disable}"/>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_attack_disable" value="1" type="checkbox" title="@{repeating_action_$X_attack_disable}" checked="checked"/>
<h3 data-i18n="attack"></h3>
<div class="expanded attack flex-box flex-wrap half-gap justify-space-around">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="crit on"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_threshold" type="number" value="20" title="@{repeating_action_$X_critical_threshold}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="bonus"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_attack_bonus" type="number" title="@{repeating_action_$X_attack_bonus}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="pv"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_penetration" type="number" title="@{repeating_action_$X_penetration}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_damage_1_disable" value="1" type="checkbox" title="@{repeating_action_$X_damage_1_disable}" checked="checked"/>
<h3 data-i18n="damage 1"></h3>
<div class="expanded damage 1 flex-box flex-wrap half-gap justify-space-around">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="damage 1"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_1" type="text" title="@{repeating_action_$X_damage_1}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="custom crit"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_1" type="text" title="@{repeating_action_$X_critical_1}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="type"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_type_1" type="text" title="@{repeating_action_$X_damage_type_1}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_damage_2_disable" value="1" type="checkbox" title="@{repeating_action_$X_damage_2_disable}" checked="checked"/>
<h3 data-i18n="damage 2"></h3>
<div class="expanded damage 2 flex-box flex-wrap half-gap justify-space-around">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="damage 2"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_2" type="text" title="@{repeating_action_$X_damage_2}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="custom crit"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_2" type="text" title="@{repeating_action_$X_critical_2}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="type"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_type_2" type="text" title="@{repeating_action_$X_damage_type_2}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_save_disable" value="1" type="checkbox" title="@{repeating_action_$X_save_disable}" checked="checked"/>
<h3 data-i18n="save"></h3>
<div class="expanded save flex-box flex-wrap half-gap justify-space-around">
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="save type"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_save_type" title="@{repeating_action_$X_save_type}">
<option value="">
</option>
<option value="strength save" data-i18n="strength abbreviation">
</option>
<option value="dexterity save" data-i18n="dexterity abbreviation">
</option>
<option value="constitution save" data-i18n="constitution abbreviation">
</option>
<option value="intelligence save" data-i18n="intelligence abbreviation">
</option>
<option value="wisdom save" data-i18n="wisdom abbreviation">
</option>
<option value="charisma save" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="bonus"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_dc_bonus" type="number" title="@{repeating_action_$X_dc_bonus}"/>
</label>
</div>
</div>
<div class="section-select flex-box half-gap flex-wrap">
<label class="input-label form-label" style="flex:1 1 0;"><span class="form-label__span input-label__text" data-i18n="range"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_range" type="text" style="width:100px" title="@{repeating_action_$X_range}"/>
</label>
<label class="input-label form-label" style="flex:1 1 0;"><span class="form-label__span input-label__text" data-i18n="targets"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_targets" type="text" style="width:100px" title="@{repeating_action_$X_targets}"/>
</label>
</div>
<div class="adaptive adaptive--text underlined"><span class="adaptive--text__span" name="attr_description" title="@{repeating_action_$X_description}"></span>
<textarea class="adaptive--text__textarea" name="attr_description" title="@{repeating_action_$X_description}"></textarea>
</div>
</div>
</div>
</section>
<input class="display-value-control" name="attr_description" hidden="" value="" type="hidden" title="@{repeating_action_$X_description}"/>
<section class="section section--layout collapsed description controlled-display section--fill">
<div class="section__content">
<div class="content-row-gap"><span name="attr_description" title="@{repeating_action_$X_description}"></span>
</div>
</div>
</section>
</fieldset>
</section>
</div>
</article>
<article class="tabs__container tabs--everyday__container tabs--everyday__container--vehicle" data-container-tab="everyday" data-tab="vehicle">
<div class="heroID heroID--vehicle">
<div class="caution-tape heroID__header">
<div class="caution-tape__content heroID__title">
<input name="attr_character_name" type="text" title="@{character_name}"/>
<button class="roller" name="roll_crash" data-i18n="crash!" role="heading" aria-level="2" value="@{crash_action}" type="roll">
</button>
<button name="act_crash-action" hidden="" type="action">
</button>
<input name="attr_crash_action" type="hidden" title="@{crash_action}"/>
</div>
</div>
<div class="heroID__info">
<div class="heroID__pic heroID__pic--vehicle"><img class="character-avatar" name="attr_character_avatar" data-i18n-alt="character avatar" title="@{character_avatar}"/><img class="character-token" name="attr_character_token" data-i18n-alt="character token" title="@{character_token}"/>
</div>
<div class="flex-box normal-gap flex-wrap justify-space-around heroID--vehicle__inputs">
<div class="flex-box form-label strength">
<div class="input-label input-label--button form-label">
<button class="form-label__span roller" name="roll_strength_save" data-i18n="strength abbreviation" value="@{strength_save_action}" type="roll">
</button>
<input class="form-label__input recess-effect input-label__input" name="attr_strength_save" type="number" title="@{strength_save}"/>
</div>
<button name="act_strength-save-action" hidden="" type="action">
</button>
<input name="attr_strength_save_action" type="hidden" title="@{strength_save_action}"/>
</div>
<div class="flex-box form-label dexterity">
<div class="input-label input-label--button form-label">
<button class="form-label__span roller" name="roll_dexterity_save" data-i18n="dexterity abbreviation" value="@{dexterity_save_action}" type="roll">
</button>
<input class="form-label__input recess-effect input-label__input" name="attr_dexterity_save" type="number" title="@{dexterity_save}"/>
</div>
<button name="act_dexterity-save-action" hidden="" type="action">
</button>
<input name="attr_dexterity_save_action" type="hidden" title="@{dexterity_save_action}"/>
</div>
<div class="flex-box form-label constitution">
<div class="input-label input-label--button form-label">
<button class="form-label__span roller" name="roll_constitution_save" data-i18n="constitution abbreviation" value="@{constitution_save_action}" type="roll">
</button>
<input class="form-label__input recess-effect input-label__input" name="attr_constitution_save" type="number" title="@{constitution_save}"/>
</div>
<button name="act_constitution-save-action" hidden="" type="action">
</button>
<input name="attr_constitution_save_action" type="hidden" title="@{constitution_save_action}"/>
</div>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="top speed"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_top_speed" type="number" title="@{top_speed}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="pax"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_pax" type="number" title="@{pax}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="price level"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_price_level" type="number" title="@{price_level}"/>
</label>
<label class="input-label form-label"><span class="uppercase form-label__span input-label__text" data-i18n="av"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_armor_value" type="number" title="@{armor_value}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="properties"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_properties" type="text" title="@{properties}"/>
</label>
</div>
<div class="flex-box normal-gap flex-wrap justify-space-around heroID--vehicle__damage">
<div class="heroID--vehicle__contests flex-box half-gap justify-space-around flex-wrap">
<h3 class="grunge-text" data-i18n="contests"></h3>
<button class="roller" name="roll_vehicle_speed" data-i18n="speed" value="@{vehicle_speed_action}" type="roll">
</button>
<button name="act_vehicle-speed-action" hidden="" type="action">
</button>
<input name="attr_vehicle_speed_action" type="hidden" title="@{vehicle_speed_action}"/>
<button class="roller" name="roll_vehicle_maneuverability" data-i18n="maneuverability" value="@{vehicle_maneuverability_action}" type="roll">
</button>
<button name="act_vehicle-maneuverability-action" hidden="" type="action">
</button>
<input name="attr_vehicle_maneuverability_action" type="hidden" title="@{vehicle_maneuverability_action}"/>
</div>
<div class="damage-content flex-box">
<button class="roller" name="roll_damage_levels" role="heading" aria-level="3" data-i18n="damage levels" value="@{damage_levels_action}" type="roll">
</button>
<button name="act_damage-levels-action" hidden="" type="action">
</button>
<input name="attr_damage_levels_action" type="hidden" title="@{damage_levels_action}"/>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="body"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_body" type="number" title="@{body}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="control"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_control" type="number" title="@{control}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="power"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_power" type="number" title="@{power}"/>
</label>
<div class="flex-box half-gap">
<h3 class="grunge-text" data-i18n="blown tires"></h3>
<label class="input-label form-label"><span></span>
<input class="form-label__input recess-effect input-label__input" name="attr_blown_tires" type="checkbox" value="1" title="@{blown_tires}"/>
</label>
</div>
</div>
</div>
</div>
</div>
<div class="expansive-section">
<div class="float-effect expansive-content">
<div class="repeating-section-container">
<h2 data-i18n="crew"></h2>
<button class="repcontrol-button repcontrol-button--add" name="act_add-crew" type="action">
</button>
<fieldset class="repeating_crew">
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_crew_$X_collapse}"/>
<div class="float-effect item-head">
<input name="attr_name" data-i18n-placeholder="crew member name" type="text" title="@{repeating_crew_$X_name}"/>
</div>
<section class="section section--layout expanded section--fill">
<div class="section__content">
<div class="flex-box flex-wrap half-gap justify-space-around">
<label class="input-label type form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="position"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_position" value="" title="@{repeating_crew_$X_position}">
<option value="" data-i18n="passenger">
</option>
<option value="driver" data-i18n="driver">
</option>
<option value="gunner" data-i18n="gunner">
</option>
</select>
</label>
</div>
</div>
</section>
</fieldset>
</div>
</div>
<div class="float-effect expansive-content">
<div class="repeating-section-container">
<h2 data-i18n="weapons"></h2>
<button class="repcontrol-button repcontrol-button--add" name="act_add-weapons" type="action">
</button>
<fieldset class="repeating_weapons">
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_weapons_$X_collapse}"/>
<div class="float-effect item-head">
<button class="roller" name="roll_attack_roll" type="roll" value="@{attack_action}">
</button>
<button name="act_attack-action" hidden="" type="action">
</button>
<input name="attr_attack_action" type="hidden" title="@{repeating_weapons_$X_attack_action}"/>
<input class="border-value--control" name="attr_name_only" hidden="" value="" type="hidden" title="@{repeating_weapons_$X_name_only}"/>
<input name="attr_name" type="text" data-i18n-placeholder="weapon name" title="@{repeating_weapons_$X_name}"/>
<input class="display-value-control" name="attr_bonus_calc" hidden="" value="" type="hidden" title="@{repeating_weapons_$X_bonus_calc}"/>
<div class="input-label form-label controlled-display">
<input name="attr_total_translation" value="total" type="hidden" title="@{repeating_weapons_$X_total_translation}"/><span class="form-label__span input-label__text" name="attr_total_translation" data-i18n-dynamic="" title="@{repeating_weapons_$X_total_translation}"></span>
<input class="border-control--invert" name="attr_damage_1_disable" hidden="" value="1" checked="" type="checkbox" title="@{repeating_weapons_$X_damage_1_disable}"/><span class="form-label__input recess-effect input-label__input" name="attr_bonus_calc" title="@{repeating_weapons_$X_bonus_calc}"></span>
</div>
<input class="display-control--invert" name="attr_damage_1_disable" hidden="" value="1" type="checkbox" title="@{repeating_weapons_$X_damage_1_disable}"/>
<div class="input-label form-label controlled-display"><span class="form-label__span input-label__text" name="attr_damage_label" data-i18n="Damage" title="@{repeating_weapons_$X_damage_label}"></span><span class="form-label__input recess-effect input-label__input" name="attr_total_damage" title="@{repeating_weapons_$X_total_damage}"></span>
</div>
</div>
<section class="section section--layout expanded description section--fill">
<div class="section__content">
<div class="flex-box flex-column half-gap">
<input name="attr_attack_disable" value="1" type="hidden" title="@{repeating_weapons_$X_attack_disable}"/>
<input name="attr_save_disable" value="1" type="hidden" title="@{repeating_weapons_$X_save_disable}"/>
<input name="attr_damage_1_disable" value="1" type="hidden" title="@{repeating_weapons_$X_damage_1_disable}"/>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_attack_disable" value="1" type="checkbox" title="@{repeating_weapons_$X_attack_disable}" checked="checked"/>
<h3 data-i18n="attack"></h3>
<div class="expanded attack flex-box flex-wrap half-gap justify-space-around">
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="ability"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_attack_ability" title="@{repeating_weapons_$X_attack_ability}">
<option value="">
</option>
<option value="@{strength_mod}" data-i18n="strength abbreviation">
</option>
<option value="@{dexterity_mod}" data-i18n="dexterity abbreviation">
</option>
<option value="@{constitution_mod}" data-i18n="constitution abbreviation">
</option>
<option value="@{intelligence_mod}" data-i18n="intelligence abbreviation">
</option>
<option value="@{wisdom_mod}" data-i18n="wisdom abbreviation">
</option>
<option value="@{charisma_mod}" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="crit on"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_threshold" type="number" value="20" title="@{repeating_weapons_$X_critical_threshold}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="bonus"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_attack_bonus" type="number" title="@{repeating_weapons_$X_attack_bonus}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="pv"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_penetration" type="number" title="@{repeating_weapons_$X_penetration}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_damage_1_disable" value="1" type="checkbox" title="@{repeating_weapons_$X_damage_1_disable}" checked="checked"/>
<h3 data-i18n="damage 1"></h3>
<div class="expanded damage 1 flex-box flex-wrap half-gap justify-space-around">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="damage 1"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_1" type="text" title="@{repeating_weapons_$X_damage_1}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="custom crit"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_1" type="text" title="@{repeating_weapons_$X_critical_1}"/>
</label>
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="ability"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_damage_ability_1" title="@{repeating_weapons_$X_damage_ability_1}">
<option value="">
</option>
<option value="@{strength_mod}" data-i18n="strength abbreviation">
</option>
<option value="@{dexterity_mod}" data-i18n="dexterity abbreviation">
</option>
<option value="@{constitution_mod}" data-i18n="constitution abbreviation">
</option>
<option value="@{intelligence_mod}" data-i18n="intelligence abbreviation">
</option>
<option value="@{wisdom_mod}" data-i18n="wisdom abbreviation">
</option>
<option value="@{charisma_mod}" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="type"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_type_1" type="text" title="@{repeating_weapons_$X_damage_type_1}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_damage_2_disable" value="1" type="checkbox" title="@{repeating_weapons_$X_damage_2_disable}" checked="checked"/>
<h3 data-i18n="damage 2"></h3>
<div class="expanded damage 2 flex-box flex-wrap half-gap justify-space-around">
<label class="input-label flex-min-content form-label"><span class="form-label__span input-label__text" data-i18n="damage 2"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_2" type="text" title="@{repeating_weapons_$X_damage_2}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="custom crit"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_critical_2" type="text" title="@{repeating_weapons_$X_critical_2}"/>
</label>
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="ability"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_damage_ability_2" title="@{repeating_weapons_$X_damage_ability_2}">
<option value="">
</option>
<option value="@{strength_mod}" data-i18n="strength abbreviation">
</option>
<option value="@{dexterity_mod}" data-i18n="dexterity abbreviation">
</option>
<option value="@{constitution_mod}" data-i18n="constitution abbreviation">
</option>
<option value="@{intelligence_mod}" data-i18n="intelligence abbreviation">
</option>
<option value="@{wisdom_mod}" data-i18n="wisdom abbreviation">
</option>
<option value="@{charisma_mod}" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="type"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_damage_type_2" type="text" title="@{repeating_weapons_$X_damage_type_2}"/>
</label>
</div>
</div>
<div class="collapse-container attack enable-container">
<input class="collapse collapse-arrow" name="attr_save_disable" value="1" type="checkbox" title="@{repeating_weapons_$X_save_disable}" checked="checked"/>
<h3 data-i18n="save"></h3>
<div class="expanded save flex-box flex-wrap half-gap justify-space-around">
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="save type"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_save_type" title="@{repeating_weapons_$X_save_type}">
<option value="">
</option>
<option value="strength save" data-i18n="strength abbreviation">
</option>
<option value="dexterity save" data-i18n="dexterity abbreviation">
</option>
<option value="constitution save" data-i18n="constitution abbreviation">
</option>
<option value="intelligence save" data-i18n="intelligence abbreviation">
</option>
<option value="wisdom save" data-i18n="wisdom abbreviation">
</option>
<option value="charisma save" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="based on"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_save_basis" title="@{repeating_weapons_$X_save_basis}">
<option value="" data-i18n="static">
</option>
<option value="@{strength_mod}" data-i18n="strength abbreviation">
</option>
<option value="@{dexterity_mod}" data-i18n="dexterity abbreviation">
</option>
<option value="@{constitution_mod}" data-i18n="constitution abbreviation">
</option>
<option value="@{intelligence_mod}" data-i18n="intelligence abbreviation">
</option>
<option value="@{wisdom_mod}" data-i18n="wisdom abbreviation">
</option>
<option value="@{charisma_mod}" data-i18n="charisma abbreviation">
</option>
</select>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="bonus"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_dc_bonus" type="number" title="@{repeating_weapons_$X_dc_bonus}"/>
</label>
</div>
</div>
<div class="flex-box flex-wrap half-gap justify-center">
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="weapon type"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_type" value="" title="@{repeating_weapons_$X_type}">
<option value="0" data-i18n="not proficient">
</option>
<option value="@{proficiency_basic}" data-i18n="basic">
</option>
<option value="@{proficiency_advanced}" data-i18n="advanced">
</option>
<option value="@{proficiency_historical}" data-i18n="historical">
</option>
<option value="@{proficiency_improvised}" data-i18n="improvised">
</option>
<option value="@{proficiency_military}" data-i18n="military">
</option>
<option value="1" data-i18n="misc proficiency">
</option>
<option value="2" data-i18n="misc expertise">
</option>
</select>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="range"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_range" type="text" title="@{repeating_weapons_$X_range}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="reload"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_reload" type="text" title="@{repeating_weapons_$X_reload}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="rounds"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_rounds" type="text" title="@{repeating_weapons_$X_rounds}"/>
</label>
<label class="input-label stacked flex-span-all form-label stacked form-label--textarea"><span class="form-label__span form-label--textarea__span" data-i18n="properties"></span>
<div class="adaptive adaptive--text form-label__input form-label--textarea__input recess-effect"><span class="adaptive--text__span" name="attr_properties" title="@{repeating_weapons_$X_properties}"></span>
<textarea class="adaptive--text__textarea" name="attr_properties" type="text" title="@{repeating_weapons_$X_properties}"></textarea>
</div>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="item bulk"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_item_bulk" type="number" title="@{repeating_weapons_$X_item_bulk}"/>
</label>
</div>
<div class="adaptive adaptive--text underlined"><span class="adaptive--text__span" name="attr_description" title="@{repeating_weapons_$X_description}"></span>
<textarea class="adaptive--text__textarea" name="attr_description" title="@{repeating_weapons_$X_description}"></textarea>
</div>
</div>
</div>
</section>
</fieldset>
</div>
</div>
</div>
</article>
<article class="tabs__container tabs--everyday__container tabs--everyday__container--place" data-container-tab="everyday" data-tab="place">
<div class="heroID heroID--place">
<div class="caution-tape heroID__header">
<div class="caution-tape__content heroID__title">
<input name="attr_character_name" type="text" title="@{character_name}"/>
</div>
</div>
<div class="heroID__info">
<div class="heroID--place__details">
<div class="heroID__pic"><img class="character-avatar" name="attr_character_avatar" data-i18n-alt="character avatar" title="@{character_avatar}"/><img class="character-token" name="attr_character_token" data-i18n-alt="character token" title="@{character_token}"/>
</div>
<label class="input-label stacked form-label stacked form-label--textarea"><span class="form-label__span form-label--textarea__span" data-i18n="location"></span>
<div class="adaptive adaptive--text form-label__input form-label--textarea__input recess-effect"><span class="adaptive--text__span" name="attr_location_details" title="@{location_details}"></span>
<textarea class="adaptive--text__textarea" name="attr_location_details" title="@{location_details}"></textarea>
</div>
</label>
</div>
<div class="heroID--place__inputs grid half-gap">
<div class="flex-box justify-space-between half-gap">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="place level"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_place_level" type="number" title="@{place_level}"/>
</label>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="price level"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_price_level" type="number" title="@{price_level}"/>
</label>
</div>
<label class="input-label stacked form-label stacked form-label--textarea"><span class="form-label__span form-label--textarea__span" data-i18n="notes"></span>
<div class="adaptive adaptive--text form-label__input form-label--textarea__input recess-effect"><span class="adaptive--text__span" name="attr_location_notes" title="@{location_notes}"></span>
<textarea class="adaptive--text__textarea" name="attr_location_notes" title="@{location_notes}"></textarea>
</div>
</label>
<div class="overflow-container">
<div class="overflow-content float-effect repeating-section-container">
<h2 class="section__header" data-i18n="stored equipment"></h2>
<button class="repcontrol-button repcontrol-button--add" name="act_add-equipment" type="action">
</button>
<fieldset class="repeating_equipment">
<input class="collapse" name="attr_collapse" value="1" type="checkbox" title="@{repeating_equipment_$X_collapse}"/>
<div class="float-effect item-head">
<input class="name" name="attr_name" data-i18n-placeholder="item name" type="text" title="@{repeating_equipment_$X_name}"/>
<label class="input-label qty form-label"><span class="form-label__span input-label__text" data-i18n="quantity abbreviation"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_quantity" type="number" title="@{repeating_equipment_$X_quantity}"/>
</label>
<label class="input-label bulk form-label"><span class="form-label__span input-label__text" data-i18n="bulk"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_bulk" type="number" title="@{repeating_equipment_$X_bulk}"/>
</label>
</div>
<section class="section section--layout expanded description section--fill">
<div class="section__content">
<div class="adaptive adaptive--text"><span class="adaptive--text__span" name="attr_description" title="@{repeating_equipment_$X_description}"></span>
<textarea class="adaptive--text__textarea" name="attr_description" data-i18n-placeholder="item description" title="@{repeating_equipment_$X_description}"></textarea>
</div>
</div>
</section>
</fieldset>
</div>
</div>
</div>
</div>
</div>
</article>
<article class="tabs__container tabs--everyday__container tabs--everyday__container--settings" data-container-tab="everyday" data-tab="settings">
<section class="section section--layout section--fill">
<div class="section__content">
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="sheet type"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_sheet_type" title="@{sheet_type}">
<option data-i18n="pc" value="pc" selected="">
</option>
<option data-i18n="npc" value="npc">
</option>
<option data-i18n="vehicle" value="vehicle">
</option>
<option data-i18n="place" value="place">
</option>
</select>
</label>
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="whisper rolls"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_whisper" title="@{whisper}">
<option data-i18n="never" value="" selected="">
</option>
<option data-i18n="ask" value="ask">
</option>
<option data-i18n="always" value="/w gm ">
</option>
</select>
</label>
<label class="input-label form-label form-label--select"><span class="form-label__span input-label__text" data-i18n="roll"></span>
<select class="form-label__input recess-effect input-label__input" name="attr_roll_type" title="@{roll_type}">
<option value="2d20kh1" data-i18n="with advantage">
</option>
<option value="1d20" data-i18n="normally" selected="">
</option>
<option value="2d20kl1" data-i18n="with disadvantage">
</option>
<option value="?{Roll|Disadvantage,2d20kl1|Normally,1d20|Advantage,2d20kh1}" data-i18n="query">
</option>
</select>
</label>
<div class="mods">
<h3 data-i18n="skill modifiers"></h3>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="initiative"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_initiative_bonus" type="number" title="@{initiative_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_initiative_proficiency" value="0" type="hidden" title="@{initiative_proficiency}"/>
<input class="circle fill-left__radio" name="attr_initiative_proficiency" value="1" type="checkbox" title="@{initiative_proficiency}"/>
<input class="circle fill-left__radio" name="attr_initiative_proficiency" value="2" type="checkbox" title="@{initiative_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="death save"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_death_save_bonus" type="number" title="@{death_save_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_death_save_proficiency" value="0" type="hidden" title="@{death_save_proficiency}"/>
<input class="circle fill-left__radio" name="attr_death_save_proficiency" value="1" type="checkbox" title="@{death_save_proficiency}"/>
<input class="circle fill-left__radio" name="attr_death_save_proficiency" value="2" type="checkbox" title="@{death_save_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="acrobatics"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_acrobatics_bonus" type="number" title="@{acrobatics_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_acrobatics_proficiency" value="0" type="hidden" title="@{acrobatics_proficiency}"/>
<input class="circle fill-left__radio" name="attr_acrobatics_proficiency" value="1" type="checkbox" title="@{acrobatics_proficiency}"/>
<input class="circle fill-left__radio" name="attr_acrobatics_proficiency" value="2" type="checkbox" title="@{acrobatics_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="arts and crafts"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_arts_and_crafts_bonus" type="number" title="@{arts_and_crafts_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_arts_and_crafts_proficiency" value="0" type="hidden" title="@{arts_and_crafts_proficiency}"/>
<input class="circle fill-left__radio" name="attr_arts_and_crafts_proficiency" value="1" type="checkbox" title="@{arts_and_crafts_proficiency}"/>
<input class="circle fill-left__radio" name="attr_arts_and_crafts_proficiency" value="2" type="checkbox" title="@{arts_and_crafts_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="athletics"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_athletics_bonus" type="number" title="@{athletics_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_athletics_proficiency" value="0" type="hidden" title="@{athletics_proficiency}"/>
<input class="circle fill-left__radio" name="attr_athletics_proficiency" value="1" type="checkbox" title="@{athletics_proficiency}"/>
<input class="circle fill-left__radio" name="attr_athletics_proficiency" value="2" type="checkbox" title="@{athletics_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="computers"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_computers_bonus" type="number" title="@{computers_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_computers_proficiency" value="0" type="hidden" title="@{computers_proficiency}"/>
<input class="circle fill-left__radio" name="attr_computers_proficiency" value="1" type="checkbox" title="@{computers_proficiency}"/>
<input class="circle fill-left__radio" name="attr_computers_proficiency" value="2" type="checkbox" title="@{computers_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="deception"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_deception_bonus" type="number" title="@{deception_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_deception_proficiency" value="0" type="hidden" title="@{deception_proficiency}"/>
<input class="circle fill-left__radio" name="attr_deception_proficiency" value="1" type="checkbox" title="@{deception_proficiency}"/>
<input class="circle fill-left__radio" name="attr_deception_proficiency" value="2" type="checkbox" title="@{deception_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="endurance"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_endurance_bonus" type="number" title="@{endurance_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_endurance_proficiency" value="0" type="hidden" title="@{endurance_proficiency}"/>
<input class="circle fill-left__radio" name="attr_endurance_proficiency" value="1" type="checkbox" title="@{endurance_proficiency}"/>
<input class="circle fill-left__radio" name="attr_endurance_proficiency" value="2" type="checkbox" title="@{endurance_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="insight"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_insight_bonus" type="number" title="@{insight_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_insight_proficiency" value="0" type="hidden" title="@{insight_proficiency}"/>
<input class="circle fill-left__radio" name="attr_insight_proficiency" value="1" type="checkbox" title="@{insight_proficiency}"/>
<input class="circle fill-left__radio" name="attr_insight_proficiency" value="2" type="checkbox" title="@{insight_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="intimidation"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_intimidation_bonus" type="number" title="@{intimidation_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_intimidation_proficiency" value="0" type="hidden" title="@{intimidation_proficiency}"/>
<input class="circle fill-left__radio" name="attr_intimidation_proficiency" value="1" type="checkbox" title="@{intimidation_proficiency}"/>
<input class="circle fill-left__radio" name="attr_intimidation_proficiency" value="2" type="checkbox" title="@{intimidation_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="investigation"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_investigation_bonus" type="number" title="@{investigation_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_investigation_proficiency" value="0" type="hidden" title="@{investigation_proficiency}"/>
<input class="circle fill-left__radio" name="attr_investigation_proficiency" value="1" type="checkbox" title="@{investigation_proficiency}"/>
<input class="circle fill-left__radio" name="attr_investigation_proficiency" value="2" type="checkbox" title="@{investigation_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="mechanics"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_mechanics_bonus" type="number" title="@{mechanics_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_mechanics_proficiency" value="0" type="hidden" title="@{mechanics_proficiency}"/>
<input class="circle fill-left__radio" name="attr_mechanics_proficiency" value="1" type="checkbox" title="@{mechanics_proficiency}"/>
<input class="circle fill-left__radio" name="attr_mechanics_proficiency" value="2" type="checkbox" title="@{mechanics_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="medicine"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_medicine_bonus" type="number" title="@{medicine_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_medicine_proficiency" value="0" type="hidden" title="@{medicine_proficiency}"/>
<input class="circle fill-left__radio" name="attr_medicine_proficiency" value="1" type="checkbox" title="@{medicine_proficiency}"/>
<input class="circle fill-left__radio" name="attr_medicine_proficiency" value="2" type="checkbox" title="@{medicine_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="natural science"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_natural_science_bonus" type="number" title="@{natural_science_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_natural_science_proficiency" value="0" type="hidden" title="@{natural_science_proficiency}"/>
<input class="circle fill-left__radio" name="attr_natural_science_proficiency" value="1" type="checkbox" title="@{natural_science_proficiency}"/>
<input class="circle fill-left__radio" name="attr_natural_science_proficiency" value="2" type="checkbox" title="@{natural_science_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="perception"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_perception_bonus" type="number" title="@{perception_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_perception_proficiency" value="0" type="hidden" title="@{perception_proficiency}"/>
<input class="circle fill-left__radio" name="attr_perception_proficiency" value="1" type="checkbox" title="@{perception_proficiency}"/>
<input class="circle fill-left__radio" name="attr_perception_proficiency" value="2" type="checkbox" title="@{perception_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="performance"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_performance_bonus" type="number" title="@{performance_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_performance_proficiency" value="0" type="hidden" title="@{performance_proficiency}"/>
<input class="circle fill-left__radio" name="attr_performance_proficiency" value="1" type="checkbox" title="@{performance_proficiency}"/>
<input class="circle fill-left__radio" name="attr_performance_proficiency" value="2" type="checkbox" title="@{performance_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="persuasion"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_persuasion_bonus" type="number" title="@{persuasion_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_persuasion_proficiency" value="0" type="hidden" title="@{persuasion_proficiency}"/>
<input class="circle fill-left__radio" name="attr_persuasion_proficiency" value="1" type="checkbox" title="@{persuasion_proficiency}"/>
<input class="circle fill-left__radio" name="attr_persuasion_proficiency" value="2" type="checkbox" title="@{persuasion_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="security"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_security_bonus" type="number" title="@{security_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_security_proficiency" value="0" type="hidden" title="@{security_proficiency}"/>
<input class="circle fill-left__radio" name="attr_security_proficiency" value="1" type="checkbox" title="@{security_proficiency}"/>
<input class="circle fill-left__radio" name="attr_security_proficiency" value="2" type="checkbox" title="@{security_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="sleight of hand"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_sleight_of_hand_bonus" type="number" title="@{sleight_of_hand_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_sleight_of_hand_proficiency" value="0" type="hidden" title="@{sleight_of_hand_proficiency}"/>
<input class="circle fill-left__radio" name="attr_sleight_of_hand_proficiency" value="1" type="checkbox" title="@{sleight_of_hand_proficiency}"/>
<input class="circle fill-left__radio" name="attr_sleight_of_hand_proficiency" value="2" type="checkbox" title="@{sleight_of_hand_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="social sciences"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_social_sciences_bonus" type="number" title="@{social_sciences_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_social_sciences_proficiency" value="0" type="hidden" title="@{social_sciences_proficiency}"/>
<input class="circle fill-left__radio" name="attr_social_sciences_proficiency" value="1" type="checkbox" title="@{social_sciences_proficiency}"/>
<input class="circle fill-left__radio" name="attr_social_sciences_proficiency" value="2" type="checkbox" title="@{social_sciences_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="stealth"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_stealth_bonus" type="number" title="@{stealth_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_stealth_proficiency" value="0" type="hidden" title="@{stealth_proficiency}"/>
<input class="circle fill-left__radio" name="attr_stealth_proficiency" value="1" type="checkbox" title="@{stealth_proficiency}"/>
<input class="circle fill-left__radio" name="attr_stealth_proficiency" value="2" type="checkbox" title="@{stealth_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="streetwise"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_streetwise_bonus" type="number" title="@{streetwise_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_streetwise_proficiency" value="0" type="hidden" title="@{streetwise_proficiency}"/>
<input class="circle fill-left__radio" name="attr_streetwise_proficiency" value="1" type="checkbox" title="@{streetwise_proficiency}"/>
<input class="circle fill-left__radio" name="attr_streetwise_proficiency" value="2" type="checkbox" title="@{streetwise_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="survival"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_survival_bonus" type="number" title="@{survival_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_survival_proficiency" value="0" type="hidden" title="@{survival_proficiency}"/>
<input class="circle fill-left__radio" name="attr_survival_proficiency" value="1" type="checkbox" title="@{survival_proficiency}"/>
<input class="circle fill-left__radio" name="attr_survival_proficiency" value="2" type="checkbox" title="@{survival_proficiency}"/>
</div>
</div>
<div class="flex-box half-gap justify-space-between">
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="vehicles"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_vehicles_bonus" type="number" title="@{vehicles_bonus}"/>
</label>
<div class="fill-left prof-display expertise-display">
<input class="circle fill-left__radio" name="attr_vehicles_proficiency" value="0" type="hidden" title="@{vehicles_proficiency}"/>
<input class="circle fill-left__radio" name="attr_vehicles_proficiency" value="1" type="checkbox" title="@{vehicles_proficiency}"/>
<input class="circle fill-left__radio" name="attr_vehicles_proficiency" value="2" type="checkbox" title="@{vehicles_proficiency}"/>
</div>
</div>
<label class="input-label form-label"><span class="form-label__span input-label__text" data-i18n="passive perception"></span>
<input class="form-label__input recess-effect input-label__input" name="attr_passive_perception_bonus" type="number" title="@{passive_perception_bonus}"/>
</label>
</div>
</div>
</section>
</article>
</div>
</div>
</main>
</div>
<input name="attr_template_start" value="@{whisper}&{template:everyday} {{character_name=@{character_name}}} {{character_id=@{character_id}}}" type="hidden" title="@{template_start}"/>
<rolltemplate class="sheet-rolltemplate-everyday">
<div class="template everyday">
<div class="header">
<div class="caution-tape">
<div class="caution-tape__content">{{#title}}
<h2>{{title}}</h2>{{/title}}
</div>
</div>
<div class="caution-tape__content--solid">{{#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>
</div>
<div class="content">{{#roll}}
<div class="template-row">
<div class="input-label form-label flex-box">
<div class="input-label__span form-label__span">{{#roll_name}}
<h4 class="input-label__span form-label__span">{{roll_name}}</h4>{{/roll_name}}{{^roll_name}}
<h4 class="input-label__span form-label__span" data-i18n="roll"></h4>{{/roll_name}}
</div>
<div class="input-label__input flex-box justify-center form-label__input recess-effect">{{roll}}</div>
</div>
</div>{{/roll}}{{#dc}}
<div class="template-row">
<div class="input-label form-label flex-box">
<div class="input-label__span form-label__span">{{#save_type}}
<h4 class="input-label__span form-label__span">{{save_type}}</h4>{{/save_type}}{{^save_type}}
<h4 class="input-label__span form-label__span" data-i18n="save"></h4>{{/save_type}}
</div>
<div class="input-label__input form-label__input recess-effect flex-box justify-center">{{dc}}</div>
</div>
</div>{{/dc}}{{#damage_1}}
<div class="template-row">
<div class="input-label form-label flex-box">
<div class="input-label__span form-label__span">{{#damage_1_type}}
<h4 class="input-label__span form-label__span">{{damage_1_type}}</h4>{{/damage_1_type}}{{^damage_1_type}}
<h4 class="input-label__span form-label__span" data-i18n="damage"></h4>{{/damage_1_type}}
</div>
<div class="input-label__input form-label__input recess-effect flex-box justify-center">{{damage_1}}{{#rollWasCrit() roll}}{{#critical_damage_1}}+ {{critical_damage_1}}{{/critical_damage_1}}{{/rollWasCrit() roll}}
</div>
</div>
</div>{{/damage_1}}{{#damage_2}}
<div class="template-row">
<div class="input-label form-label flex-box">
<div class="input-label__span form-label__span">{{#damage_2_type}}
<h4 class="input-label__span form-label__span">{{damage_2_type}}</h4>{{/damage_2_type}}{{^damage_2_type}}
<h4 class="input-label__span form-label__span" data-i18n="damage"></h4>{{/damage_2_type}}
</div>
<div class="input-label__input form-label__input recess-effect flex-box justify-center">{{damage_2}}{{#rollWasCrit() roll}}{{#critical_damage_2}}+ {{critical_damage_2}}{{/critical_damage_2}}{{/rollWasCrit() roll}}
</div>
</div>
</div>{{/damage_2}}{{#type}}
<div class="template-row">
<div class="input-label form-label flex-box">
<h4 class="input-label__span form-label__span" data-i18n="type"></h4><span class="capitalize input-label__input form-label__input recess-effect flex-box justify-center">{{type}}</span>
</div>
</div>{{/type}}{{#penetration}}
<div class="template-row">
<div class="input-label form-label flex-box">
<h4 class="input-label__span form-label__span" data-i18n="penetration"></h4><span class="capitalize input-label__input form-label__input recess-effect flex-box justify-center">{{penetration}}</span>
</div>
</div>{{/penetration}}{{#range}}
<div class="template-row">
<div class="input-label form-label flex-box">
<h4 class="input-label__span form-label__span" data-i18n="range"></h4><span class="capitalize input-label__input form-label__input recess-effect flex-box justify-center">{{range}}</span>
</div>
</div>{{/range}}{{#reload}}
<div class="template-row">
<div class="input-label form-label flex-box">
<h4 class="input-label__span form-label__span" data-i18n="reload"></h4><span class="capitalize input-label__input form-label__input recess-effect flex-box justify-center">{{reload}}</span>
</div>
</div>{{/reload}}{{#rounds}}
<div class="template-row">
<div class="input-label form-label flex-box">
<h4 class="input-label__span form-label__span" data-i18n="rounds"></h4><span class="capitalize input-label__input form-label__input recess-effect flex-box justify-center">{{rounds}}</span>
</div>
</div>{{/rounds}}{{#properties}}
<div class="input-label form-label flex-box flex-column form-label--textarea">
<h4 class="input-label__span form-label__span form-label--textarea__span" data-i18n="properties"></h4>
<p class="form-label__input input-label__input form-label__input form-label--textarea__input recess-effect">{{properties}}</p>
</div>{{/properties}}{{#description}}
<p class="template-description recess-effect">{{description}}</p>{{/description}}
</div>
</div>
</rolltemplate>
<script type="text/worker">//# sourceURL=everyday-heroes.js
const k = (function(){
const kFuncs = {};
const cascades = {"attr_character_name":{"name":"character_name","type":"text","defaultValue":"","affects":[],"triggeredFuncs":["setActionCalls"],"listenerFunc":"accessSheet","listener":"change:character_name"},"attr_sheet_version":{"name":"sheet_version","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_sheet_state":{"name":"sheet_state","type":"hidden","defaultValue":"settings","triggeredFuncs":[],"affects":[]},"attr_collapsed":{"name":"collapsed","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_drop_name":{"triggeredFuncs":["handleCompendiumDrop"],"name":"drop_name","listener":"change:drop_name","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","affects":[]},"attr_drop_data":{"name":"drop_data","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_everyday_tab":{"name":"everyday_tab","type":"hidden","defaultValue":"nav-tabs-everyday--settings","triggeredFuncs":[],"affects":[]},"act_nav-tabs-everyday--core":{"triggeredFuncs":["kSwitchTab"],"name":"nav-tabs-everyday--core","listener":"clicked:nav-tabs-everyday--core","listenerFunc":"accessSheet","type":"action"},"act_nav-tabs-everyday--plans-tricks":{"triggeredFuncs":["kSwitchTab"],"name":"nav-tabs-everyday--plans-tricks","listener":"clicked:nav-tabs-everyday--plans-tricks","listenerFunc":"accessSheet","type":"action"},"act_nav-tabs-everyday--persona":{"triggeredFuncs":["kSwitchTab"],"name":"nav-tabs-everyday--persona","listener":"clicked:nav-tabs-everyday--persona","listenerFunc":"accessSheet","type":"action"},"act_nav-tabs-everyday--npc":{"triggeredFuncs":["kSwitchTab"],"name":"nav-tabs-everyday--npc","listener":"clicked:nav-tabs-everyday--npc","listenerFunc":"accessSheet","type":"action"},"act_nav-tabs-everyday--vehicle":{"triggeredFuncs":["kSwitchTab"],"name":"nav-tabs-everyday--vehicle","listener":"clicked:nav-tabs-everyday--vehicle","listenerFunc":"accessSheet","type":"action"},"act_nav-tabs-everyday--place":{"triggeredFuncs":["kSwitchTab"],"name":"nav-tabs-everyday--place","listener":"clicked:nav-tabs-everyday--place","listenerFunc":"accessSheet","type":"action"},"act_nav-tabs-everyday--settings":{"triggeredFuncs":["kSwitchTab"],"name":"nav-tabs-everyday--settings","listener":"clicked:nav-tabs-everyday--settings","listenerFunc":"accessSheet","type":"action"},"attr_character_avatar":{"name":"character_avatar","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_character_token":{"name":"character_token","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_character_class":{"name":"character_class","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_character_archetype":{"name":"character_archetype","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_background":{"name":"background","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_profession":{"name":"profession","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_character_level":{"affects":["proficiency"],"name":"character_level","listener":"change:character_level","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_wealth":{"name":"wealth","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_character_speed":{"name":"character_speed","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_character_languages":{"name":"character_languages","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_strength-action":{"triggeredFuncs":["rollMod"],"name":"strength-action","listener":"clicked:strength-action","listenerFunc":"accessSheet","type":"action"},"attr_strength_action":{"name":"strength_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_strength_mod":{"type":"hidden","name":"strength_mod","defaultValue":0,"triggeredFuncs":[],"affects":["athletics","carried_bulk_max","strength_save"],"calculation":"calcMod","listener":"change:strength_mod","listenerFunc":"accessSheet"},"attr_strength":{"affects":["strength_mod"],"name":"strength","listener":"change:strength","listenerFunc":"accessSheet","type":"number","defaultValue":10,"triggeredFuncs":[]},"attr_strength_save_proficiency":{"affects":["strength_save"],"name":"strength_save_proficiency","listener":"change:strength_save_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"attr_strength_save":{"type":"hidden","name":"strength_save","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSave","listener":"change:strength_save","listenerFunc":"accessSheet"},"act_strength-save-action":{"triggeredFuncs":["rollBasic"],"name":"strength-save-action","listener":"clicked:strength-save-action","listenerFunc":"accessSheet","type":"action"},"attr_strength_save_action":{"name":"strength_save_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_dexterity-action":{"triggeredFuncs":["rollMod"],"name":"dexterity-action","listener":"clicked:dexterity-action","listenerFunc":"accessSheet","type":"action"},"attr_dexterity_action":{"name":"dexterity_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_dexterity_mod":{"type":"hidden","name":"dexterity_mod","defaultValue":0,"triggeredFuncs":[],"affects":["acrobatics","sleight_of_hand","stealth","vehicles","initiative","dexterity_save"],"calculation":"calcMod","listener":"change:dexterity_mod","listenerFunc":"accessSheet"},"attr_dexterity":{"affects":["dexterity_mod"],"name":"dexterity","listener":"change:dexterity","listenerFunc":"accessSheet","type":"number","defaultValue":10,"triggeredFuncs":[]},"attr_dexterity_save_proficiency":{"affects":["dexterity_save"],"name":"dexterity_save_proficiency","listener":"change:dexterity_save_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"attr_dexterity_save":{"type":"hidden","name":"dexterity_save","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSave","listener":"change:dexterity_save","listenerFunc":"accessSheet"},"act_dexterity-save-action":{"triggeredFuncs":["rollBasic"],"name":"dexterity-save-action","listener":"clicked:dexterity-save-action","listenerFunc":"accessSheet","type":"action"},"attr_dexterity_save_action":{"name":"dexterity_save_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_constitution-action":{"triggeredFuncs":["rollMod"],"name":"constitution-action","listener":"clicked:constitution-action","listenerFunc":"accessSheet","type":"action"},"attr_constitution_action":{"name":"constitution_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_constitution_mod":{"type":"hidden","name":"constitution_mod","defaultValue":0,"triggeredFuncs":[],"affects":["endurance","constitution_save"],"calculation":"calcMod","listener":"change:constitution_mod","listenerFunc":"accessSheet"},"attr_constitution":{"affects":["constitution_mod"],"name":"constitution","listener":"change:constitution","listenerFunc":"accessSheet","type":"number","defaultValue":10,"triggeredFuncs":[]},"attr_constitution_save_proficiency":{"affects":["constitution_save"],"name":"constitution_save_proficiency","listener":"change:constitution_save_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"attr_constitution_save":{"type":"hidden","name":"constitution_save","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSave","listener":"change:constitution_save","listenerFunc":"accessSheet"},"act_constitution-save-action":{"triggeredFuncs":["rollBasic"],"name":"constitution-save-action","listener":"clicked:constitution-save-action","listenerFunc":"accessSheet","type":"action"},"attr_constitution_save_action":{"name":"constitution_save_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_intelligence-action":{"triggeredFuncs":["rollMod"],"name":"intelligence-action","listener":"clicked:intelligence-action","listenerFunc":"accessSheet","type":"action"},"attr_intelligence_action":{"name":"intelligence_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_intelligence_mod":{"type":"hidden","name":"intelligence_mod","defaultValue":0,"triggeredFuncs":[],"affects":["computers","investigation","mechanics","medicine","natural_science","security","social_sciences","intelligence_save"],"calculation":"calcMod","listener":"change:intelligence_mod","listenerFunc":"accessSheet"},"attr_intelligence":{"affects":["intelligence_mod"],"name":"intelligence","listener":"change:intelligence","listenerFunc":"accessSheet","type":"number","defaultValue":10,"triggeredFuncs":[]},"attr_intelligence_save_proficiency":{"affects":["intelligence_save"],"name":"intelligence_save_proficiency","listener":"change:intelligence_save_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"attr_intelligence_save":{"type":"hidden","name":"intelligence_save","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSave","listener":"change:intelligence_save","listenerFunc":"accessSheet"},"act_intelligence-save-action":{"triggeredFuncs":["rollBasic"],"name":"intelligence-save-action","listener":"clicked:intelligence-save-action","listenerFunc":"accessSheet","type":"action"},"attr_intelligence_save_action":{"name":"intelligence_save_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_wisdom-action":{"triggeredFuncs":["rollMod"],"name":"wisdom-action","listener":"clicked:wisdom-action","listenerFunc":"accessSheet","type":"action"},"attr_wisdom_action":{"name":"wisdom_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_wisdom_mod":{"type":"hidden","name":"wisdom_mod","defaultValue":0,"triggeredFuncs":[],"affects":["arts_and_crafts","insight","perception","streetwise","survival","wisdom_save"],"calculation":"calcMod","listener":"change:wisdom_mod","listenerFunc":"accessSheet"},"attr_wisdom":{"affects":["wisdom_mod"],"name":"wisdom","listener":"change:wisdom","listenerFunc":"accessSheet","type":"number","defaultValue":10,"triggeredFuncs":[]},"attr_wisdom_save_proficiency":{"affects":["wisdom_save"],"name":"wisdom_save_proficiency","listener":"change:wisdom_save_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"attr_wisdom_save":{"type":"hidden","name":"wisdom_save","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSave","listener":"change:wisdom_save","listenerFunc":"accessSheet"},"act_wisdom-save-action":{"triggeredFuncs":["rollBasic"],"name":"wisdom-save-action","listener":"clicked:wisdom-save-action","listenerFunc":"accessSheet","type":"action"},"attr_wisdom_save_action":{"name":"wisdom_save_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_charisma-action":{"triggeredFuncs":["rollMod"],"name":"charisma-action","listener":"clicked:charisma-action","listenerFunc":"accessSheet","type":"action"},"attr_charisma_action":{"name":"charisma_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_charisma_mod":{"type":"hidden","name":"charisma_mod","defaultValue":0,"triggeredFuncs":[],"affects":["deception","intimidation","performance","persuasion","charisma_save"],"calculation":"calcMod","listener":"change:charisma_mod","listenerFunc":"accessSheet"},"attr_charisma":{"affects":["charisma_mod"],"name":"charisma","listener":"change:charisma","listenerFunc":"accessSheet","type":"number","defaultValue":10,"triggeredFuncs":[]},"attr_charisma_save_proficiency":{"affects":["charisma_save"],"name":"charisma_save_proficiency","listener":"change:charisma_save_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"attr_charisma_save":{"type":"hidden","name":"charisma_save","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSave","listener":"change:charisma_save","listenerFunc":"accessSheet"},"act_charisma-save-action":{"triggeredFuncs":["rollBasic"],"name":"charisma-save-action","listener":"clicked:charisma-save-action","listenerFunc":"accessSheet","type":"action"},"attr_charisma_save_action":{"name":"charisma_save_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_acrobatics-action":{"triggeredFuncs":["rollBasic"],"name":"acrobatics-action","listener":"clicked:acrobatics-action","listenerFunc":"accessSheet","type":"action"},"attr_acrobatics_action":{"name":"acrobatics_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_acrobatics":{"type":"hidden","name":"acrobatics","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSkill","listener":"change:acrobatics","listenerFunc":"accessSheet"},"attr_acrobatics_proficiency":{"affects":["acrobatics"],"name":"acrobatics_proficiency","listener":"change:acrobatics_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"act_arts-and-crafts-action":{"triggeredFuncs":["rollBasic"],"name":"arts-and-crafts-action","listener":"clicked:arts-and-crafts-action","listenerFunc":"accessSheet","type":"action"},"attr_arts_and_crafts_action":{"name":"arts_and_crafts_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_arts_and_crafts":{"type":"hidden","name":"arts_and_crafts","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSkill","listener":"change:arts_and_crafts","listenerFunc":"accessSheet"},"attr_arts_and_crafts_proficiency":{"affects":["arts_and_crafts"],"name":"arts_and_crafts_proficiency","listener":"change:arts_and_crafts_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"act_athletics-action":{"triggeredFuncs":["rollBasic"],"name":"athletics-action","listener":"clicked:athletics-action","listenerFunc":"accessSheet","type":"action"},"attr_athletics_action":{"name":"athletics_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_athletics":{"type":"hidden","name":"athletics","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSkill","listener":"change:athletics","listenerFunc":"accessSheet"},"attr_athletics_proficiency":{"affects":["athletics"],"name":"athletics_proficiency","listener":"change:athletics_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"act_computers-action":{"triggeredFuncs":["rollBasic"],"name":"computers-action","listener":"clicked:computers-action","listenerFunc":"accessSheet","type":"action"},"attr_computers_action":{"name":"computers_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_computers":{"type":"hidden","name":"computers","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSkill","listener":"change:computers","listenerFunc":"accessSheet"},"attr_computers_proficiency":{"affects":["computers"],"name":"computers_proficiency","listener":"change:computers_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"act_deception-action":{"triggeredFuncs":["rollBasic"],"name":"deception-action","listener":"clicked:deception-action","listenerFunc":"accessSheet","type":"action"},"attr_deception_action":{"name":"deception_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_deception":{"type":"hidden","name":"deception","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSkill","listener":"change:deception","listenerFunc":"accessSheet"},"attr_deception_proficiency":{"affects":["deception"],"name":"deception_proficiency","listener":"change:deception_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"act_endurance-action":{"triggeredFuncs":["rollBasic"],"name":"endurance-action","listener":"clicked:endurance-action","listenerFunc":"accessSheet","type":"action"},"attr_endurance_action":{"name":"endurance_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_endurance":{"type":"hidden","name":"endurance","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSkill","listener":"change:endurance","listenerFunc":"accessSheet"},"attr_endurance_proficiency":{"affects":["endurance"],"name":"endurance_proficiency","listener":"change:endurance_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"act_insight-action":{"triggeredFuncs":["rollBasic"],"name":"insight-action","listener":"clicked:insight-action","listenerFunc":"accessSheet","type":"action"},"attr_insight_action":{"name":"insight_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_insight":{"type":"hidden","name":"insight","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSkill","listener":"change:insight","listenerFunc":"accessSheet"},"attr_insight_proficiency":{"affects":["insight"],"name":"insight_proficiency","listener":"change:insight_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"act_intimidation-action":{"triggeredFuncs":["rollBasic"],"name":"intimidation-action","listener":"clicked:intimidation-action","listenerFunc":"accessSheet","type":"action"},"attr_intimidation_action":{"name":"intimidation_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_intimidation":{"type":"hidden","name":"intimidation","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSkill","listener":"change:intimidation","listenerFunc":"accessSheet"},"attr_intimidation_proficiency":{"affects":["intimidation"],"name":"intimidation_proficiency","listener":"change:intimidation_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"act_investigation-action":{"triggeredFuncs":["rollBasic"],"name":"investigation-action","listener":"clicked:investigation-action","listenerFunc":"accessSheet","type":"action"},"attr_investigation_action":{"name":"investigation_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_investigation":{"type":"hidden","name":"investigation","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSkill","listener":"change:investigation","listenerFunc":"accessSheet"},"attr_investigation_proficiency":{"affects":["investigation"],"name":"investigation_proficiency","listener":"change:investigation_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"act_mechanics-action":{"triggeredFuncs":["rollBasic"],"name":"mechanics-action","listener":"clicked:mechanics-action","listenerFunc":"accessSheet","type":"action"},"attr_mechanics_action":{"name":"mechanics_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_mechanics":{"type":"hidden","name":"mechanics","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSkill","listener":"change:mechanics","listenerFunc":"accessSheet"},"attr_mechanics_proficiency":{"affects":["mechanics"],"name":"mechanics_proficiency","listener":"change:mechanics_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"act_medicine-action":{"triggeredFuncs":["rollBasic"],"name":"medicine-action","listener":"clicked:medicine-action","listenerFunc":"accessSheet","type":"action"},"attr_medicine_action":{"name":"medicine_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_medicine":{"type":"hidden","name":"medicine","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSkill","listener":"change:medicine","listenerFunc":"accessSheet"},"attr_medicine_proficiency":{"affects":["medicine"],"name":"medicine_proficiency","listener":"change:medicine_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"act_natural-science-action":{"triggeredFuncs":["rollBasic"],"name":"natural-science-action","listener":"clicked:natural-science-action","listenerFunc":"accessSheet","type":"action"},"attr_natural_science_action":{"name":"natural_science_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_natural_science":{"type":"hidden","name":"natural_science","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSkill","listener":"change:natural_science","listenerFunc":"accessSheet"},"attr_natural_science_proficiency":{"affects":["natural_science"],"name":"natural_science_proficiency","listener":"change:natural_science_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"act_perception-action":{"triggeredFuncs":["rollBasic"],"name":"perception-action","listener":"clicked:perception-action","listenerFunc":"accessSheet","type":"action"},"attr_perception_action":{"name":"perception_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_perception":{"type":"hidden","name":"perception","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":["passive_perception"],"calculation":"calcSkill","listener":"change:perception","listenerFunc":"accessSheet"},"attr_perception_proficiency":{"affects":["perception"],"name":"perception_proficiency","listener":"change:perception_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"act_performance-action":{"triggeredFuncs":["rollBasic"],"name":"performance-action","listener":"clicked:performance-action","listenerFunc":"accessSheet","type":"action"},"attr_performance_action":{"name":"performance_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_performance":{"type":"hidden","name":"performance","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSkill","listener":"change:performance","listenerFunc":"accessSheet"},"attr_performance_proficiency":{"affects":["performance"],"name":"performance_proficiency","listener":"change:performance_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"act_persuasion-action":{"triggeredFuncs":["rollBasic"],"name":"persuasion-action","listener":"clicked:persuasion-action","listenerFunc":"accessSheet","type":"action"},"attr_persuasion_action":{"name":"persuasion_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_persuasion":{"type":"hidden","name":"persuasion","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSkill","listener":"change:persuasion","listenerFunc":"accessSheet"},"attr_persuasion_proficiency":{"affects":["persuasion"],"name":"persuasion_proficiency","listener":"change:persuasion_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"act_security-action":{"triggeredFuncs":["rollBasic"],"name":"security-action","listener":"clicked:security-action","listenerFunc":"accessSheet","type":"action"},"attr_security_action":{"name":"security_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_security":{"type":"hidden","name":"security","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSkill","listener":"change:security","listenerFunc":"accessSheet"},"attr_security_proficiency":{"affects":["security"],"name":"security_proficiency","listener":"change:security_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"act_sleight-of-hand-action":{"triggeredFuncs":["rollBasic"],"name":"sleight-of-hand-action","listener":"clicked:sleight-of-hand-action","listenerFunc":"accessSheet","type":"action"},"attr_sleight_of_hand_action":{"name":"sleight_of_hand_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_sleight_of_hand":{"type":"hidden","name":"sleight_of_hand","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSkill","listener":"change:sleight_of_hand","listenerFunc":"accessSheet"},"attr_sleight_of_hand_proficiency":{"affects":["sleight_of_hand"],"name":"sleight_of_hand_proficiency","listener":"change:sleight_of_hand_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"act_social-sciences-action":{"triggeredFuncs":["rollBasic"],"name":"social-sciences-action","listener":"clicked:social-sciences-action","listenerFunc":"accessSheet","type":"action"},"attr_social_sciences_action":{"name":"social_sciences_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_social_sciences":{"type":"hidden","name":"social_sciences","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSkill","listener":"change:social_sciences","listenerFunc":"accessSheet"},"attr_social_sciences_proficiency":{"affects":["social_sciences"],"name":"social_sciences_proficiency","listener":"change:social_sciences_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"act_stealth-action":{"triggeredFuncs":["rollBasic"],"name":"stealth-action","listener":"clicked:stealth-action","listenerFunc":"accessSheet","type":"action"},"attr_stealth_action":{"name":"stealth_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_stealth":{"type":"hidden","name":"stealth","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSkill","listener":"change:stealth","listenerFunc":"accessSheet"},"attr_stealth_proficiency":{"affects":["stealth"],"name":"stealth_proficiency","listener":"change:stealth_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"act_streetwise-action":{"triggeredFuncs":["rollBasic"],"name":"streetwise-action","listener":"clicked:streetwise-action","listenerFunc":"accessSheet","type":"action"},"attr_streetwise_action":{"name":"streetwise_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_streetwise":{"type":"hidden","name":"streetwise","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSkill","listener":"change:streetwise","listenerFunc":"accessSheet"},"attr_streetwise_proficiency":{"affects":["streetwise"],"name":"streetwise_proficiency","listener":"change:streetwise_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"act_survival-action":{"triggeredFuncs":["rollBasic"],"name":"survival-action","listener":"clicked:survival-action","listenerFunc":"accessSheet","type":"action"},"attr_survival_action":{"name":"survival_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_survival":{"type":"hidden","name":"survival","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSkill","listener":"change:survival","listenerFunc":"accessSheet"},"attr_survival_proficiency":{"affects":["survival"],"name":"survival_proficiency","listener":"change:survival_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"act_vehicles-action":{"triggeredFuncs":["rollBasic"],"name":"vehicles-action","listener":"clicked:vehicles-action","listenerFunc":"accessSheet","type":"action"},"attr_vehicles_action":{"name":"vehicles_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_vehicles":{"type":"hidden","name":"vehicles","defaultValue":0,"triggeredFuncs":["controlNPCViewRows"],"affects":[],"calculation":"calcSkill","listener":"change:vehicles","listenerFunc":"accessSheet"},"attr_vehicles_proficiency":{"affects":["vehicles"],"name":"vehicles_proficiency","listener":"change:vehicles_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"attr_hp_max":{"name":"hp_max","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_temporary_hp":{"name":"temporary_hp","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_hp":{"name":"hp","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[],"calculation":"calcNPCHP"},"act_hit-dice-action":{"triggeredFuncs":["rollHitDice"],"name":"hit-dice-action","listener":"clicked:hit-dice-action","listenerFunc":"accessSheet","type":"action"},"attr_hit_dice_action":{"name":"hit_dice_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_hit_dice":{"name":"hit_dice","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_hit_dice_max":{"name":"hit_dice_max","type":"number","defaultValue":1,"triggeredFuncs":[],"affects":[]},"attr_hit_dice_size":{"name":"hit_dice_size","type":"select","defaultValue":8,"triggeredFuncs":[],"affects":[]},"act_death-save-action":{"triggeredFuncs":["rollDeath"],"name":"death-save-action","listener":"clicked:death-save-action","listenerFunc":"accessSheet","type":"action"},"attr_death_save_action":{"name":"death_save_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_death_success":{"name":"death_success","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_death_fail":{"name":"death_fail","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_proficiency":{"type":"hidden","name":"proficiency","defaultValue":2,"triggeredFuncs":[],"affects":[],"calculation":"calcProf"},"attr_defense":{"name":"defense","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_initiative-action":{"triggeredFuncs":["rollBasic"],"name":"initiative-action","listener":"clicked:initiative-action","listenerFunc":"accessSheet","type":"action"},"attr_initiative_action":{"name":"initiative_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_initiative":{"type":"hidden","name":"initiative","defaultValue":0,"triggeredFuncs":[],"affects":[],"calculation":"calcInitiative"},"attr_passive_perception":{"calculation":"calcPassive","name":"passive_perception","type":"number","defaultValue":10,"triggeredFuncs":[],"affects":[]},"attr_genius":{"name":"genius","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_focus":{"name":"focus","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_influence":{"name":"influence","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_inspiration":{"name":"inspiration","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_proficiency_basic":{"affects":["repeating_weapons_$X_attack"],"triggeredFuncs":["profDisplay"],"name":"proficiency_basic","listener":"change:proficiency_basic","listenerFunc":"accessSheet","type":"checkbox","defaultValue":1},"attr_proficiency_advanced":{"triggeredFuncs":["profDisplay"],"name":"proficiency_advanced","listener":"change:proficiency_advanced","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"affects":[]},"attr_proficiency_historical":{"name":"proficiency_historical","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_proficiency_improvised":{"name":"proficiency_improvised","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_proficiency_military":{"name":"proficiency_military","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_add-equipmemt-prof-misc":{"listenerFunc":"addItem","name":"add-equipmemt-prof-misc","listener":"clicked:add-equipmemt-prof-misc","type":"action"},"attr_repeating_equipmemt-prof-misc_$X_misc-proficiency":{"name":"repeating_equipmemt-prof-misc_$X_misc-proficiency","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_armor_collapse":{"name":"armor_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_armor_name":{"name":"armor_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_armor_value":{"name":"armor_value","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_armor_bulk":{"affects":["carried_bulk"],"name":"armor_bulk","listener":"change:armor_bulk","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_armor_properties":{"name":"armor_properties","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_armor_description":{"name":"armor_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_add-weapons":{"listenerFunc":"addItem","name":"add-weapons","listener":"clicked:add-weapons","type":"action"},"fieldset_repeating_weapons":{"name":"repeating_weapons","type":"fieldset"},"attr_repeating_weapons_$X_collapse":{"name":"repeating_weapons_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_repeating_weapons_$X_attack-action":{"triggeredFuncs":["rollAttack"],"name":"repeating_weapons_$X_attack-action","listener":"clicked:repeating_weapons:attack-action","listenerFunc":"accessSheet","type":"action"},"attr_repeating_weapons_$X_attack_action":{"name":"repeating_weapons_$X_attack_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapons_$X_name_only":{"calculation":"calcWeaponNameDisplay","name":"repeating_weapons_$X_name_only","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapons_$X_name":{"name":"repeating_weapons_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapons_$X_bonus_calc":{"name":"repeating_weapons_$X_bonus_calc","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[],"calculation":"calcAttackBonus"},"attr_repeating_weapons_$X_total_translation":{"name":"repeating_weapons_$X_total_translation","type":"hidden","defaultValue":"total","triggeredFuncs":[],"affects":[]},"attr_repeating_weapons_$X_damage_1_disable":{"name":"repeating_weapons_$X_damage_1_disable","type":"checkbox","defaultValue":1,"triggeredFuncs":[],"affects":["repeating_weapons_$X_total_damage","repeating_weapons_$X_name_only"],"listener":"change:repeating_weapons:damage_1_disable","listenerFunc":"accessSheet"},"attr_repeating_weapons_$X_damage_label":{"name":"repeating_weapons_$X_damage_label","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapons_$X_total_damage":{"calculation":"calcAttackDamage","name":"repeating_weapons_$X_total_damage","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapons_$X_attack_disable":{"affects":["repeating_weapons_$X_bonus_calc","repeating_weapons_$X_name_only"],"name":"repeating_weapons_$X_attack_disable","listener":"change:repeating_weapons:attack_disable","listenerFunc":"accessSheet","type":"hidden","defaultValue":1,"triggeredFuncs":[]},"attr_repeating_weapons_$X_save_disable":{"affects":["repeating_weapons_$X_bonus_calc","repeating_weapons_$X_name_only"],"name":"repeating_weapons_$X_save_disable","listener":"change:repeating_weapons:save_disable","listenerFunc":"accessSheet","type":"hidden","defaultValue":1,"triggeredFuncs":[]},"attr_repeating_weapons_$X_attack_ability":{"affects":["repeating_weapons_$X_bonus_calc"],"name":"repeating_weapons_$X_attack_ability","listener":"change:repeating_weapons:attack_ability","listenerFunc":"accessSheet","type":"select","defaultValue":"","triggeredFuncs":[]},"attr_repeating_weapons_$X_critical_threshold":{"name":"repeating_weapons_$X_critical_threshold","type":"number","defaultValue":20,"triggeredFuncs":[],"affects":[]},"attr_repeating_weapons_$X_attack_bonus":{"affects":["repeating_weapons_$X_bonus_calc"],"name":"repeating_weapons_$X_attack_bonus","listener":"change:repeating_weapons:attack_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_repeating_weapons_$X_penetration":{"name":"repeating_weapons_$X_penetration","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_weapons_$X_damage_1":{"affects":["repeating_weapons_$X_total_damage"],"name":"repeating_weapons_$X_damage_1","listener":"change:repeating_weapons:damage_1","listenerFunc":"accessSheet","type":"text","defaultValue":"","triggeredFuncs":[]},"attr_repeating_weapons_$X_critical_1":{"name":"repeating_weapons_$X_critical_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapons_$X_damage_ability_1":{"affects":["repeating_weapons_$X_total_damage"],"name":"repeating_weapons_$X_damage_ability_1","listener":"change:repeating_weapons:damage_ability_1","listenerFunc":"accessSheet","type":"select","defaultValue":"","triggeredFuncs":[]},"attr_repeating_weapons_$X_damage_type_1":{"affects":["repeating_weapons_$X_total_damage"],"name":"repeating_weapons_$X_damage_type_1","listener":"change:repeating_weapons:damage_type_1","listenerFunc":"accessSheet","type":"text","defaultValue":"","triggeredFuncs":[]},"attr_repeating_weapons_$X_damage_2_disable":{"name":"repeating_weapons_$X_damage_2_disable","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_weapons_$X_damage_2":{"name":"repeating_weapons_$X_damage_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapons_$X_critical_2":{"name":"repeating_weapons_$X_critical_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapons_$X_damage_ability_2":{"name":"repeating_weapons_$X_damage_ability_2","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapons_$X_damage_type_2":{"name":"repeating_weapons_$X_damage_type_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapons_$X_save_type":{"name":"repeating_weapons_$X_save_type","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapons_$X_save_basis":{"affects":["repeating_weapons_$X_bonus_calc"],"name":"repeating_weapons_$X_save_basis","listener":"change:repeating_weapons:save_basis","listenerFunc":"accessSheet","type":"select","defaultValue":"","triggeredFuncs":[]},"attr_repeating_weapons_$X_dc_bonus":{"affects":["repeating_weapons_$X_bonus_calc"],"name":"repeating_weapons_$X_dc_bonus","listener":"change:repeating_weapons:dc_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_repeating_weapons_$X_type":{"affects":["repeating_weapons_$X_bonus_calc"],"name":"repeating_weapons_$X_type","listener":"change:repeating_weapons:type","listenerFunc":"accessSheet","type":"select","defaultValue":"","triggeredFuncs":[]},"attr_repeating_weapons_$X_range":{"name":"repeating_weapons_$X_range","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapons_$X_reload":{"name":"repeating_weapons_$X_reload","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapons_$X_rounds":{"name":"repeating_weapons_$X_rounds","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapons_$X_properties":{"name":"repeating_weapons_$X_properties","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_weapons_$X_item_bulk":{"affects":["carried_bulk"],"name":"repeating_weapons_$X_item_bulk","listener":"change:repeating_weapons:item_bulk","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_repeating_weapons_$X_description":{"name":"repeating_weapons_$X_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_add-ability":{"listenerFunc":"addItem","name":"add-ability","listener":"clicked:add-ability","type":"action"},"attr_repeating_ability_$X_collapse":{"name":"repeating_ability_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_ability_$X_name":{"name":"repeating_ability_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_ability_$X_type":{"name":"repeating_ability_$X_type","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_ability_$X_level":{"name":"repeating_ability_$X_level","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_ability_$X_prerequisite":{"name":"repeating_ability_$X_prerequisite","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_ability_$X_feat_type":{"name":"repeating_ability_$X_feat_type","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_ability_$X_description":{"name":"repeating_ability_$X_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_carried_bulk":{"calculation":"calcBulk","name":"carried_bulk","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_carried_bulk_max":{"calculation":"calcBulkMax","name":"carried_bulk_max","type":"number","defaultValue":5,"triggeredFuncs":[],"affects":[]},"act_add-equipment":{"listenerFunc":"addItem","name":"add-equipment","listener":"clicked:add-equipment","type":"action"},"attr_repeating_equipment_$X_collapse":{"name":"repeating_equipment_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_equipment_$X_name":{"name":"repeating_equipment_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_equipment_$X_quantity":{"affects":["carried_bulk"],"name":"repeating_equipment_$X_quantity","listener":"change:repeating_equipment:quantity","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_repeating_equipment_$X_bulk":{"affects":["carried_bulk"],"name":"repeating_equipment_$X_bulk","listener":"change:repeating_equipment:bulk","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_repeating_equipment_$X_description":{"name":"repeating_equipment_$X_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_add-plans":{"listenerFunc":"addItem","name":"add-plans","listener":"clicked:add-plans","type":"action"},"attr_repeating_plans_$X_collapse":{"name":"repeating_plans_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_repeating_plans_$X_action":{"triggeredFuncs":["rollPlanTrick"],"name":"repeating_plans_$X_action","listener":"clicked:repeating_plans:action","listenerFunc":"accessSheet","type":"action"},"attr_repeating_plans_$X_action":{"name":"repeating_plans_$X_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_name":{"name":"repeating_plans_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_level":{"triggeredFuncs":["displayLevelDetails"],"name":"repeating_plans_$X_level","listener":"change:repeating_plans:level","listenerFunc":"accessSheet","type":"number","defaultValue":0,"affects":[]},"attr_repeating_plans_$X_prep_action":{"name":"repeating_plans_$X_prep_action","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_duration":{"name":"repeating_plans_$X_duration","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_attack_disable":{"name":"repeating_plans_$X_attack_disable","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_critical_threshold":{"name":"repeating_plans_$X_critical_threshold","type":"number","defaultValue":20,"triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_attack_bonus":{"name":"repeating_plans_$X_attack_bonus","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_penetration":{"name":"repeating_plans_$X_penetration","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_damage_1_disable":{"name":"repeating_plans_$X_damage_1_disable","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_damage_1":{"name":"repeating_plans_$X_damage_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_critical_1":{"name":"repeating_plans_$X_critical_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_damage_ability_1":{"name":"repeating_plans_$X_damage_ability_1","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_damage_type_1":{"name":"repeating_plans_$X_damage_type_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_damage_2_disable":{"name":"repeating_plans_$X_damage_2_disable","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_damage_2":{"name":"repeating_plans_$X_damage_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_critical_2":{"name":"repeating_plans_$X_critical_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_damage_ability_2":{"name":"repeating_plans_$X_damage_ability_2","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_damage_type_2":{"name":"repeating_plans_$X_damage_type_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_save_disable":{"name":"repeating_plans_$X_save_disable","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_save_type":{"name":"repeating_plans_$X_save_type","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_save_basis":{"name":"repeating_plans_$X_save_basis","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_dc_bonus":{"name":"repeating_plans_$X_dc_bonus","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_description":{"name":"repeating_plans_$X_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_collapse_3":{"name":"repeating_plans_$X_collapse_3","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_level_3_effect":{"name":"repeating_plans_$X_level_3_effect","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_collapse_5":{"name":"repeating_plans_$X_collapse_5","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_level_5_effect":{"name":"repeating_plans_$X_level_5_effect","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_collapse_7":{"name":"repeating_plans_$X_collapse_7","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_level_7_effect":{"name":"repeating_plans_$X_level_7_effect","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_collapse_9":{"name":"repeating_plans_$X_collapse_9","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_plans_$X_level_9_effect":{"name":"repeating_plans_$X_level_9_effect","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_add-tricks":{"listenerFunc":"addItem","name":"add-tricks","listener":"clicked:add-tricks","type":"action"},"attr_repeating_tricks_$X_collapse":{"name":"repeating_tricks_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_repeating_tricks_$X_action":{"triggeredFuncs":["rollPlanTrick"],"name":"repeating_tricks_$X_action","listener":"clicked:repeating_tricks:action","listenerFunc":"accessSheet","type":"action"},"attr_repeating_tricks_$X_action":{"name":"repeating_tricks_$X_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_tricks_$X_name":{"name":"repeating_tricks_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_tricks_$X_prep_action":{"name":"repeating_tricks_$X_prep_action","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_tricks_$X_duration":{"name":"repeating_tricks_$X_duration","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_tricks_$X_attack_disable":{"name":"repeating_tricks_$X_attack_disable","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_tricks_$X_critical_threshold":{"name":"repeating_tricks_$X_critical_threshold","type":"number","defaultValue":20,"triggeredFuncs":[],"affects":[]},"attr_repeating_tricks_$X_attack_bonus":{"name":"repeating_tricks_$X_attack_bonus","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_tricks_$X_penetration":{"name":"repeating_tricks_$X_penetration","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_tricks_$X_damage_1_disable":{"name":"repeating_tricks_$X_damage_1_disable","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_tricks_$X_damage_1":{"name":"repeating_tricks_$X_damage_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_tricks_$X_critical_1":{"name":"repeating_tricks_$X_critical_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_tricks_$X_damage_ability_1":{"name":"repeating_tricks_$X_damage_ability_1","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_tricks_$X_damage_type_1":{"name":"repeating_tricks_$X_damage_type_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_tricks_$X_damage_2_disable":{"name":"repeating_tricks_$X_damage_2_disable","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_tricks_$X_damage_2":{"name":"repeating_tricks_$X_damage_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_tricks_$X_critical_2":{"name":"repeating_tricks_$X_critical_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_tricks_$X_damage_ability_2":{"name":"repeating_tricks_$X_damage_ability_2","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_tricks_$X_damage_type_2":{"name":"repeating_tricks_$X_damage_type_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_tricks_$X_save_disable":{"name":"repeating_tricks_$X_save_disable","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_tricks_$X_save_type":{"name":"repeating_tricks_$X_save_type","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_tricks_$X_save_basis":{"name":"repeating_tricks_$X_save_basis","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_tricks_$X_dc_bonus":{"name":"repeating_tricks_$X_dc_bonus","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_tricks_$X_description":{"name":"repeating_tricks_$X_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_weight":{"name":"weight","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_skin":{"name":"skin","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_height":{"name":"height","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_eyes":{"name":"eyes","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_hair":{"name":"hair","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_age":{"name":"age","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_marital_status":{"name":"marital_status","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_preferred_pronouns":{"name":"preferred_pronouns","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_motivations":{"name":"motivations","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_attachments":{"name":"attachments","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_beliefs":{"name":"beliefs","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_ancestry":{"name":"ancestry","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_quirks":{"name":"quirks","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_virtues":{"name":"virtues","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_flaws":{"name":"flaws","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_role":{"name":"role","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_add-notes":{"listenerFunc":"addItem","name":"add-notes","listener":"clicked:add-notes","type":"action"},"attr_repeating_notes_$X_collapse":{"name":"repeating_notes_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_notes_$X_name":{"name":"repeating_notes_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_notes_$X_date":{"name":"repeating_notes_$X_date","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_notes_$X_description":{"name":"repeating_notes_$X_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_statblock_view_mode":{"name":"statblock_view_mode","type":"hidden","defaultValue":"edit","triggeredFuncs":[],"affects":[]},"act_statblock-edit":{"triggeredFuncs":["toggleEditDisplay"],"name":"statblock-edit","listener":"clicked:statblock-edit","listenerFunc":"accessSheet","type":"action"},"attr_cr":{"affects":["experience"],"name":"cr","listener":"change:cr","listenerFunc":"accessSheet","type":"text","defaultValue":"","triggeredFuncs":[]},"attr_size":{"name":"size","type":"text","defaultValue":"medium","triggeredFuncs":[],"affects":[]},"attr_creature_type":{"name":"creature_type","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_hit_dice_expression":{"affects":["hp"],"name":"hit_dice_expression","listener":"change:hit_dice_expression","listenerFunc":"accessSheet","type":"text","defaultValue":"","triggeredFuncs":[]},"attr_speed":{"name":"speed","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_senses":{"name":"senses","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_roles":{"name":"roles","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_equipment":{"name":"equipment","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_npc_not_genius":{"calculation":"calcNPCPlanCheckbox","triggeredFuncs":["controlNPCViewRows"],"name":"npc_not_genius","listener":"change:npc_not_genius","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"affects":[]},"attr_genius_level":{"affects":["npc_not_genius"],"triggeredFuncs":["controlNPCViewRows"],"name":"genius_level","listener":"change:genius_level","listenerFunc":"accessSheet","type":"number","defaultValue":0},"attr_plan_dc":{"name":"plan_dc","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_npc_not_focus":{"calculation":"calcNPCPlanCheckbox","triggeredFuncs":["controlNPCViewRows"],"name":"npc_not_focus","listener":"change:npc_not_focus","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"affects":[]},"attr_focus_level":{"affects":["npc_not_focus"],"triggeredFuncs":["controlNPCViewRows"],"name":"focus_level","listener":"change:focus_level","listenerFunc":"accessSheet","type":"number","defaultValue":0},"attr_trick_dc":{"name":"trick_dc","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_npc_not_influence":{"calculation":"calcNPCPlanCheckbox","triggeredFuncs":["controlNPCViewRows"],"name":"npc_not_influence","listener":"change:npc_not_influence","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"affects":[]},"attr_influence_level":{"affects":["npc_not_influence"],"triggeredFuncs":["controlNPCViewRows"],"name":"influence_level","listener":"change:influence_level","listenerFunc":"accessSheet","type":"number","defaultValue":0},"attr_influence_trick_dc":{"name":"influence_trick_dc","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_add-influence-tricks":{"listenerFunc":"addItem","name":"add-influence-tricks","listener":"clicked:add-influence-tricks","type":"action"},"attr_repeating_influence-tricks_$X_collapse":{"name":"repeating_influence-tricks_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_repeating_influence-tricks_$X_action":{"triggeredFuncs":["rollPlanTrick"],"name":"repeating_influence-tricks_$X_action","listener":"clicked:repeating_influence-tricks:action","listenerFunc":"accessSheet","type":"action"},"attr_repeating_influence-tricks_$X_action":{"name":"repeating_influence-tricks_$X_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_influence-tricks_$X_name":{"name":"repeating_influence-tricks_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_influence-tricks_$X_prep_action":{"name":"repeating_influence-tricks_$X_prep_action","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_influence-tricks_$X_duration":{"name":"repeating_influence-tricks_$X_duration","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_influence-tricks_$X_attack_disable":{"name":"repeating_influence-tricks_$X_attack_disable","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_influence-tricks_$X_critical_threshold":{"name":"repeating_influence-tricks_$X_critical_threshold","type":"number","defaultValue":20,"triggeredFuncs":[],"affects":[]},"attr_repeating_influence-tricks_$X_attack_bonus":{"name":"repeating_influence-tricks_$X_attack_bonus","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_influence-tricks_$X_penetration":{"name":"repeating_influence-tricks_$X_penetration","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_influence-tricks_$X_damage_1_disable":{"name":"repeating_influence-tricks_$X_damage_1_disable","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_influence-tricks_$X_damage_1":{"name":"repeating_influence-tricks_$X_damage_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_influence-tricks_$X_critical_1":{"name":"repeating_influence-tricks_$X_critical_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_influence-tricks_$X_damage_type_1":{"name":"repeating_influence-tricks_$X_damage_type_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_influence-tricks_$X_damage_2_disable":{"name":"repeating_influence-tricks_$X_damage_2_disable","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_influence-tricks_$X_damage_2":{"name":"repeating_influence-tricks_$X_damage_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_influence-tricks_$X_critical_2":{"name":"repeating_influence-tricks_$X_critical_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_influence-tricks_$X_damage_type_2":{"name":"repeating_influence-tricks_$X_damage_type_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_influence-tricks_$X_save_disable":{"name":"repeating_influence-tricks_$X_save_disable","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_influence-tricks_$X_save_type":{"name":"repeating_influence-tricks_$X_save_type","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_influence-tricks_$X_dc_bonus":{"name":"repeating_influence-tricks_$X_dc_bonus","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_influence-tricks_$X_description":{"name":"repeating_influence-tricks_$X_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_add-traits":{"listenerFunc":"addItem","name":"add-traits","listener":"clicked:add-traits","type":"action"},"attr_repeating_traits_$X_collapse":{"name":"repeating_traits_$X_collapse","type":"checkbox","defaultValue":0,"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","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_add-bonus-actions":{"listenerFunc":"addItem","name":"add-bonus-actions","listener":"clicked:add-bonus-actions","type":"action"},"fieldset_repeating_bonus-actions":{"name":"repeating_bonus-actions","type":"fieldset"},"attr_repeating_bonus-actions_$X_collapse":{"name":"repeating_bonus-actions_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_repeating_bonus-actions_$X_attack-action":{"triggeredFuncs":["rollAttack"],"name":"repeating_bonus-actions_$X_attack-action","listener":"clicked:repeating_bonus-actions:attack-action","listenerFunc":"accessSheet","type":"action"},"attr_repeating_bonus-actions_$X_attack_action":{"name":"repeating_bonus-actions_$X_attack_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_bonus-actions_$X_name_only":{"calculation":"calcWeaponNameDisplay","name":"repeating_bonus-actions_$X_name_only","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_bonus-actions_$X_name":{"name":"repeating_bonus-actions_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_bonus-actions_$X_bonus_calc":{"name":"repeating_bonus-actions_$X_bonus_calc","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[],"calculation":"calcAttackBonus"},"attr_repeating_bonus-actions_$X_total_translation":{"name":"repeating_bonus-actions_$X_total_translation","type":"hidden","defaultValue":"total","triggeredFuncs":[],"affects":[]},"attr_repeating_bonus-actions_$X_damage_1_disable":{"name":"repeating_bonus-actions_$X_damage_1_disable","type":"checkbox","defaultValue":1,"triggeredFuncs":[],"affects":["repeating_bonus-actions_$X_total_damage","repeating_bonus-actions_$X_name_only"],"listener":"change:repeating_bonus-actions:damage_1_disable","listenerFunc":"accessSheet"},"attr_repeating_bonus-actions_$X_damage_label":{"name":"repeating_bonus-actions_$X_damage_label","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_bonus-actions_$X_total_damage":{"calculation":"calcAttackDamage","name":"repeating_bonus-actions_$X_total_damage","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_bonus-actions_$X_attack_disable":{"affects":["repeating_bonus-actions_$X_bonus_calc","repeating_bonus-actions_$X_name_only"],"name":"repeating_bonus-actions_$X_attack_disable","listener":"change:repeating_bonus-actions:attack_disable","listenerFunc":"accessSheet","type":"hidden","defaultValue":1,"triggeredFuncs":[]},"attr_repeating_bonus-actions_$X_save_disable":{"affects":["repeating_bonus-actions_$X_bonus_calc","repeating_bonus-actions_$X_name_only"],"name":"repeating_bonus-actions_$X_save_disable","listener":"change:repeating_bonus-actions:save_disable","listenerFunc":"accessSheet","type":"hidden","defaultValue":1,"triggeredFuncs":[]},"attr_repeating_bonus-actions_$X_critical_threshold":{"name":"repeating_bonus-actions_$X_critical_threshold","type":"number","defaultValue":20,"triggeredFuncs":[],"affects":[]},"attr_repeating_bonus-actions_$X_attack_bonus":{"affects":["repeating_bonus-actions_$X_bonus_calc"],"name":"repeating_bonus-actions_$X_attack_bonus","listener":"change:repeating_bonus-actions:attack_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_repeating_bonus-actions_$X_penetration":{"name":"repeating_bonus-actions_$X_penetration","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_bonus-actions_$X_damage_1":{"affects":["repeating_bonus-actions_$X_total_damage"],"name":"repeating_bonus-actions_$X_damage_1","listener":"change:repeating_bonus-actions:damage_1","listenerFunc":"accessSheet","type":"text","defaultValue":"","triggeredFuncs":[]},"attr_repeating_bonus-actions_$X_critical_1":{"name":"repeating_bonus-actions_$X_critical_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_bonus-actions_$X_damage_type_1":{"affects":["repeating_bonus-actions_$X_total_damage"],"name":"repeating_bonus-actions_$X_damage_type_1","listener":"change:repeating_bonus-actions:damage_type_1","listenerFunc":"accessSheet","type":"text","defaultValue":"","triggeredFuncs":[]},"attr_repeating_bonus-actions_$X_damage_2_disable":{"name":"repeating_bonus-actions_$X_damage_2_disable","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_bonus-actions_$X_damage_2":{"name":"repeating_bonus-actions_$X_damage_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_bonus-actions_$X_critical_2":{"name":"repeating_bonus-actions_$X_critical_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_bonus-actions_$X_damage_type_2":{"name":"repeating_bonus-actions_$X_damage_type_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_bonus-actions_$X_save_type":{"name":"repeating_bonus-actions_$X_save_type","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_bonus-actions_$X_dc_bonus":{"affects":["repeating_bonus-actions_$X_bonus_calc"],"name":"repeating_bonus-actions_$X_dc_bonus","listener":"change:repeating_bonus-actions:dc_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_repeating_bonus-actions_$X_range":{"name":"repeating_bonus-actions_$X_range","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_bonus-actions_$X_targets":{"name":"repeating_bonus-actions_$X_targets","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_bonus-actions_$X_description":{"name":"repeating_bonus-actions_$X_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_add-reactions":{"listenerFunc":"addItem","name":"add-reactions","listener":"clicked:add-reactions","type":"action"},"fieldset_repeating_reactions":{"name":"repeating_reactions","type":"fieldset"},"attr_repeating_reactions_$X_collapse":{"name":"repeating_reactions_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_repeating_reactions_$X_attack-action":{"triggeredFuncs":["rollAttack"],"name":"repeating_reactions_$X_attack-action","listener":"clicked:repeating_reactions:attack-action","listenerFunc":"accessSheet","type":"action"},"attr_repeating_reactions_$X_attack_action":{"name":"repeating_reactions_$X_attack_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_reactions_$X_name_only":{"calculation":"calcWeaponNameDisplay","name":"repeating_reactions_$X_name_only","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_reactions_$X_name":{"name":"repeating_reactions_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_reactions_$X_bonus_calc":{"name":"repeating_reactions_$X_bonus_calc","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[],"calculation":"calcAttackBonus"},"attr_repeating_reactions_$X_total_translation":{"name":"repeating_reactions_$X_total_translation","type":"hidden","defaultValue":"total","triggeredFuncs":[],"affects":[]},"attr_repeating_reactions_$X_damage_1_disable":{"name":"repeating_reactions_$X_damage_1_disable","type":"checkbox","defaultValue":1,"triggeredFuncs":[],"affects":["repeating_reactions_$X_total_damage","repeating_reactions_$X_name_only"],"listener":"change:repeating_reactions:damage_1_disable","listenerFunc":"accessSheet"},"attr_repeating_reactions_$X_damage_label":{"name":"repeating_reactions_$X_damage_label","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_reactions_$X_total_damage":{"calculation":"calcAttackDamage","name":"repeating_reactions_$X_total_damage","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_reactions_$X_attack_disable":{"affects":["repeating_reactions_$X_bonus_calc","repeating_reactions_$X_name_only"],"name":"repeating_reactions_$X_attack_disable","listener":"change:repeating_reactions:attack_disable","listenerFunc":"accessSheet","type":"hidden","defaultValue":1,"triggeredFuncs":[]},"attr_repeating_reactions_$X_save_disable":{"affects":["repeating_reactions_$X_bonus_calc","repeating_reactions_$X_name_only"],"name":"repeating_reactions_$X_save_disable","listener":"change:repeating_reactions:save_disable","listenerFunc":"accessSheet","type":"hidden","defaultValue":1,"triggeredFuncs":[]},"attr_repeating_reactions_$X_critical_threshold":{"name":"repeating_reactions_$X_critical_threshold","type":"number","defaultValue":20,"triggeredFuncs":[],"affects":[]},"attr_repeating_reactions_$X_attack_bonus":{"affects":["repeating_reactions_$X_bonus_calc"],"name":"repeating_reactions_$X_attack_bonus","listener":"change:repeating_reactions:attack_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_repeating_reactions_$X_penetration":{"name":"repeating_reactions_$X_penetration","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_reactions_$X_damage_1":{"affects":["repeating_reactions_$X_total_damage"],"name":"repeating_reactions_$X_damage_1","listener":"change:repeating_reactions:damage_1","listenerFunc":"accessSheet","type":"text","defaultValue":"","triggeredFuncs":[]},"attr_repeating_reactions_$X_critical_1":{"name":"repeating_reactions_$X_critical_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_reactions_$X_damage_type_1":{"affects":["repeating_reactions_$X_total_damage"],"name":"repeating_reactions_$X_damage_type_1","listener":"change:repeating_reactions:damage_type_1","listenerFunc":"accessSheet","type":"text","defaultValue":"","triggeredFuncs":[]},"attr_repeating_reactions_$X_damage_2_disable":{"name":"repeating_reactions_$X_damage_2_disable","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_reactions_$X_damage_2":{"name":"repeating_reactions_$X_damage_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_reactions_$X_critical_2":{"name":"repeating_reactions_$X_critical_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_reactions_$X_damage_type_2":{"name":"repeating_reactions_$X_damage_type_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_reactions_$X_save_type":{"name":"repeating_reactions_$X_save_type","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_reactions_$X_dc_bonus":{"affects":["repeating_reactions_$X_bonus_calc"],"name":"repeating_reactions_$X_dc_bonus","listener":"change:repeating_reactions:dc_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_repeating_reactions_$X_range":{"name":"repeating_reactions_$X_range","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_reactions_$X_targets":{"name":"repeating_reactions_$X_targets","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_reactions_$X_description":{"name":"repeating_reactions_$X_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_add-action":{"listenerFunc":"addItem","name":"add-action","listener":"clicked:add-action","type":"action"},"fieldset_repeating_action":{"name":"repeating_action","type":"fieldset"},"attr_repeating_action_$X_collapse":{"name":"repeating_action_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_repeating_action_$X_attack-action":{"triggeredFuncs":["rollAttack"],"name":"repeating_action_$X_attack-action","listener":"clicked:repeating_action:attack-action","listenerFunc":"accessSheet","type":"action"},"attr_repeating_action_$X_attack_action":{"name":"repeating_action_$X_attack_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_name_only":{"calculation":"calcWeaponNameDisplay","name":"repeating_action_$X_name_only","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_name":{"name":"repeating_action_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_bonus_calc":{"name":"repeating_action_$X_bonus_calc","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[],"calculation":"calcAttackBonus"},"attr_repeating_action_$X_total_translation":{"name":"repeating_action_$X_total_translation","type":"hidden","defaultValue":"total","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_damage_1_disable":{"name":"repeating_action_$X_damage_1_disable","type":"checkbox","defaultValue":1,"triggeredFuncs":[],"affects":["repeating_action_$X_total_damage","repeating_action_$X_name_only"],"listener":"change:repeating_action:damage_1_disable","listenerFunc":"accessSheet"},"attr_repeating_action_$X_damage_label":{"name":"repeating_action_$X_damage_label","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_total_damage":{"calculation":"calcAttackDamage","name":"repeating_action_$X_total_damage","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_attack_disable":{"affects":["repeating_action_$X_bonus_calc","repeating_action_$X_name_only"],"name":"repeating_action_$X_attack_disable","listener":"change:repeating_action:attack_disable","listenerFunc":"accessSheet","type":"hidden","defaultValue":1,"triggeredFuncs":[]},"attr_repeating_action_$X_save_disable":{"affects":["repeating_action_$X_bonus_calc","repeating_action_$X_name_only"],"name":"repeating_action_$X_save_disable","listener":"change:repeating_action:save_disable","listenerFunc":"accessSheet","type":"hidden","defaultValue":1,"triggeredFuncs":[]},"attr_repeating_action_$X_critical_threshold":{"name":"repeating_action_$X_critical_threshold","type":"number","defaultValue":20,"triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_attack_bonus":{"affects":["repeating_action_$X_bonus_calc"],"name":"repeating_action_$X_attack_bonus","listener":"change:repeating_action:attack_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_repeating_action_$X_penetration":{"name":"repeating_action_$X_penetration","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_damage_1":{"affects":["repeating_action_$X_total_damage"],"name":"repeating_action_$X_damage_1","listener":"change:repeating_action:damage_1","listenerFunc":"accessSheet","type":"text","defaultValue":"","triggeredFuncs":[]},"attr_repeating_action_$X_critical_1":{"name":"repeating_action_$X_critical_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_damage_type_1":{"affects":["repeating_action_$X_total_damage"],"name":"repeating_action_$X_damage_type_1","listener":"change:repeating_action:damage_type_1","listenerFunc":"accessSheet","type":"text","defaultValue":"","triggeredFuncs":[]},"attr_repeating_action_$X_damage_2_disable":{"name":"repeating_action_$X_damage_2_disable","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_damage_2":{"name":"repeating_action_$X_damage_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_critical_2":{"name":"repeating_action_$X_critical_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_damage_type_2":{"name":"repeating_action_$X_damage_type_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_save_type":{"name":"repeating_action_$X_save_type","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_dc_bonus":{"affects":["repeating_action_$X_bonus_calc"],"name":"repeating_action_$X_dc_bonus","listener":"change:repeating_action:dc_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_repeating_action_$X_range":{"name":"repeating_action_$X_range","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_targets":{"name":"repeating_action_$X_targets","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_description":{"name":"repeating_action_$X_description","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_crash-action":{"triggeredFuncs":["rollVehicleCrash"],"name":"crash-action","listener":"clicked:crash-action","listenerFunc":"accessSheet","type":"action"},"attr_crash_action":{"name":"crash_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_top_speed":{"name":"top_speed","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_pax":{"name":"pax","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_price_level":{"name":"price_level","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_properties":{"name":"properties","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_vehicle-speed-action":{"triggeredFuncs":["rollVehicleContest"],"name":"vehicle-speed-action","listener":"clicked:vehicle-speed-action","listenerFunc":"accessSheet","type":"action"},"attr_vehicle_speed_action":{"name":"vehicle_speed_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_vehicle-maneuverability-action":{"triggeredFuncs":["rollVehicleContest"],"name":"vehicle-maneuverability-action","listener":"clicked:vehicle-maneuverability-action","listenerFunc":"accessSheet","type":"action"},"attr_vehicle_maneuverability_action":{"name":"vehicle_maneuverability_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_damage-levels-action":{"triggeredFuncs":["rollVehicleDamageSave"],"name":"damage-levels-action","listener":"clicked:damage-levels-action","listenerFunc":"accessSheet","type":"action"},"attr_damage_levels_action":{"name":"damage_levels_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_body":{"calculation":"calcVehicleDamage","name":"body","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_control":{"calculation":"calcVehicleDamage","name":"control","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_power":{"calculation":"calcVehicleDamage","name":"power","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_blown_tires":{"affects":["power","control"],"name":"blown_tires","listener":"change:blown_tires","listenerFunc":"accessSheet","type":"checkbox","defaultValue":0,"triggeredFuncs":[]},"act_add-crew":{"listenerFunc":"addItem","name":"add-crew","listener":"clicked:add-crew","type":"action"},"attr_repeating_crew_$X_collapse":{"name":"repeating_crew_$X_collapse","type":"checkbox","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_repeating_crew_$X_name":{"name":"repeating_crew_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_crew_$X_position":{"name":"repeating_crew_$X_position","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_location_details":{"name":"location_details","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_place_level":{"name":"place_level","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_location_notes":{"name":"location_notes","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_sheet_type":{"triggeredFuncs":["filterNav","valueInit","statblockRowSetup"],"name":"sheet_type","listener":"change:sheet_type","listenerFunc":"accessSheet","type":"select","defaultValue":"","affects":[]},"attr_whisper":{"triggeredFuncs":[],"name":"whisper","listener":"change:whisper","listenerFunc":"accessSheet","type":"select","defaultValue":"","affects":[]},"attr_roll_type":{"name":"roll_type","type":"select","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_initiative_bonus":{"affects":["initiative"],"name":"initiative_bonus","listener":"change:initiative_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_initiative_proficiency":{"affects":["initiative"],"name":"initiative_proficiency","listener":"change:initiative_proficiency","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"attr_death_save_bonus":{"name":"death_save_bonus","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_death_save_proficiency":{"name":"death_save_proficiency","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_acrobatics_bonus":{"affects":["acrobatics"],"name":"acrobatics_bonus","listener":"change:acrobatics_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_arts_and_crafts_bonus":{"affects":["arts_and_crafts"],"name":"arts_and_crafts_bonus","listener":"change:arts_and_crafts_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_athletics_bonus":{"affects":["athletics"],"name":"athletics_bonus","listener":"change:athletics_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_computers_bonus":{"affects":["computers"],"name":"computers_bonus","listener":"change:computers_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_deception_bonus":{"affects":["deception"],"name":"deception_bonus","listener":"change:deception_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_endurance_bonus":{"affects":["endurance"],"name":"endurance_bonus","listener":"change:endurance_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_insight_bonus":{"affects":["insight"],"name":"insight_bonus","listener":"change:insight_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_intimidation_bonus":{"affects":["intimidation"],"name":"intimidation_bonus","listener":"change:intimidation_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_investigation_bonus":{"affects":["investigation"],"name":"investigation_bonus","listener":"change:investigation_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_mechanics_bonus":{"affects":["mechanics"],"name":"mechanics_bonus","listener":"change:mechanics_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_medicine_bonus":{"affects":["medicine"],"name":"medicine_bonus","listener":"change:medicine_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_natural_science_bonus":{"affects":["natural_science"],"name":"natural_science_bonus","listener":"change:natural_science_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_perception_bonus":{"affects":["perception"],"name":"perception_bonus","listener":"change:perception_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_performance_bonus":{"affects":["performance"],"name":"performance_bonus","listener":"change:performance_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_persuasion_bonus":{"affects":["persuasion"],"name":"persuasion_bonus","listener":"change:persuasion_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_security_bonus":{"affects":["security"],"name":"security_bonus","listener":"change:security_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_sleight_of_hand_bonus":{"affects":["sleight_of_hand"],"name":"sleight_of_hand_bonus","listener":"change:sleight_of_hand_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_social_sciences_bonus":{"affects":["social_sciences"],"name":"social_sciences_bonus","listener":"change:social_sciences_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_stealth_bonus":{"affects":["stealth"],"name":"stealth_bonus","listener":"change:stealth_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_streetwise_bonus":{"affects":["streetwise"],"name":"streetwise_bonus","listener":"change:streetwise_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_survival_bonus":{"affects":["survival"],"name":"survival_bonus","listener":"change:survival_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_vehicles_bonus":{"affects":["vehicles"],"name":"vehicles_bonus","listener":"change:vehicles_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_passive_perception_bonus":{"affects":["passive_perception"],"name":"passive_perception_bonus","listener":"change:passive_perception_bonus","listenerFunc":"accessSheet","type":"number","defaultValue":0,"triggeredFuncs":[]},"attr_template_start":{"name":"template_start","type":"hidden","defaultValue":"@{whisper}&{template:everyday} {{character_name=@{character_name}}} {{character_id=@{character_id}}}","triggeredFuncs":[],"affects":[]}};
kFuncs.cascades = cascades;
const repeatingSectionDetails = [{"section":"repeating_equipmemt-prof-misc","fields":["misc-proficiency"]},{"section":"repeating_weapons","fields":["collapse","attack_action","name_only","name","bonus_calc","total_translation","damage_1_disable","damage_label","total_damage","attack_disable","save_disable","attack_ability","critical_threshold","attack_bonus","penetration","damage_1","critical_1","damage_ability_1","damage_type_1","damage_2_disable","damage_2","critical_2","damage_ability_2","damage_type_2","save_type","save_basis","dc_bonus","type","range","reload","rounds","properties","item_bulk","description"]},{"section":"repeating_ability","fields":["collapse","name","type","level","prerequisite","feat_type","description"]},{"section":"repeating_equipment","fields":["collapse","name","quantity","bulk","description"]},{"section":"repeating_plans","fields":["collapse","action","name","level","prep_action","duration","attack_disable","critical_threshold","attack_bonus","penetration","damage_1_disable","damage_1","critical_1","damage_ability_1","damage_type_1","damage_2_disable","damage_2","critical_2","damage_ability_2","damage_type_2","save_disable","save_type","save_basis","dc_bonus","description","collapse_3","level_3_effect","collapse_5","level_5_effect","collapse_7","level_7_effect","collapse_9","level_9_effect"]},{"section":"repeating_tricks","fields":["collapse","action","name","prep_action","duration","attack_disable","critical_threshold","attack_bonus","penetration","damage_1_disable","damage_1","critical_1","damage_ability_1","damage_type_1","damage_2_disable","damage_2","critical_2","damage_ability_2","damage_type_2","save_disable","save_type","save_basis","dc_bonus","description"]},{"section":"repeating_notes","fields":["collapse","name","date","description"]},{"section":"repeating_influence-tricks","fields":["collapse","action","name","prep_action","duration","attack_disable","critical_threshold","attack_bonus","penetration","damage_1_disable","damage_1","critical_1","damage_type_1","damage_2_disable","damage_2","critical_2","damage_type_2","save_disable","save_type","dc_bonus","description"]},{"section":"repeating_traits","fields":["collapse","name","description"]},{"section":"repeating_bonus-actions","fields":["collapse","attack_action","name_only","name","bonus_calc","total_translation","damage_1_disable","damage_label","total_damage","attack_disable","save_disable","critical_threshold","attack_bonus","penetration","damage_1","critical_1","damage_type_1","damage_2_disable","damage_2","critical_2","damage_type_2","save_type","dc_bonus","range","targets","description"]},{"section":"repeating_reactions","fields":["collapse","attack_action","name_only","name","bonus_calc","total_translation","damage_1_disable","damage_label","total_damage","attack_disable","save_disable","critical_threshold","attack_bonus","penetration","damage_1","critical_1","damage_type_1","damage_2_disable","damage_2","critical_2","damage_type_2","save_type","dc_bonus","range","targets","description"]},{"section":"repeating_action","fields":["collapse","attack_action","name_only","name","bonus_calc","total_translation","damage_1_disable","damage_label","total_damage","attack_disable","save_disable","critical_threshold","attack_bonus","penetration","damage_1","critical_1","damage_type_1","damage_2_disable","damage_2","critical_2","damage_type_2","save_type","dc_bonus","range","targets","description"]},{"section":"repeating_crew","fields":["collapse","name","position"]}];
kFuncs.repeatingSectionDetails = repeatingSectionDetails;
const persistentTabs = ["everyday_tab"];
kFuncs.persistentTabs = persistentTabs;
/**
* The K-scaffold provides several variables to allow your scripts to tap into its information flow.
* @namespace Sheetworkers.Variables
*/
/**
* This stores the name of your sheet for use in the logging functions {@link log} and {@link debug}. Accessible by `k.sheetName`
* @memberof Variables
* @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`
* @memberof Variables
* @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.
* @memberof Variables
* @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 = '1.0.0';
const kscaffoldPUGVersion = '1.0.0';
/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
/*jshint -W014,-W084,-W030,-W033*/
/**
* These are utility functions that are not directly related to Roll20 systems. They provide easy methods for everything from processing text and numbers to querying the user for input.
* @namespace Sheetworkers.Utilities
* @alias Utilities
*/
/**
* Replaces problem characters to use a string as a regex
* @memberof Utilities
* @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.
* @memberof Utilities
* @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){
const convertVal = +val;
if(def !== undefined && isNaN(def)){
throw(`K-scaffold Error: invalid default for value(). Default: ${def}`);
}
return convertVal === 0 ?
convertVal :
(+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.
* @memberof Utilities
* @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`
* @memberof Utilities
* @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.
* @memberof Utilities
* @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
* @memberof Utilities
* @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).
* @memberof Utilities
* @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 form 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.
* @memberof Utilities
* @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.
* @memberof Utilities
* @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.
* @memberof Utilities
* @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.warn(`%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.warn(`%c${kFuncs.sheetName} DEBUG| ${m}: ${msg[m]}`,"background-color:tan;color:red;");
}else{
console.warn(`%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.
* @memberof Utilities
* @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}`]);
sections[section] = orderSection(attributes.attributes[`_reporder_${section}`],sections[section]);
});
};
kFuncs.orderSections = orderSections;
/**
* Orders a single ID array.
* @memberof Utilities
* @param {string[]} repOrder - Array of IDs in the order they are in on the sheet.
* @param {string[]} IDs - Array of IDs to be ordered. Aka the default ID Array passed to the getSectionIDs callback
* @returns {string[]} - The ordered id array
*/
const orderSection = function(repOrder,IDs=[]){
const idArr = [...repOrder.filter(v => v),...IDs.filter(id => !repOrder.includes(id.toLowerCase()))];
return idArr;
};
kFuncs.orderSection = orderSection;
/**
* Splits a comma delimited string into an array
* @memberof Utilities
* @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;
// Roll escape functions for passing data in action button calls. Base64 encodes/decodes the data.
const RE = {
chars: {
'"': '%quot;',
',': '%comma;',
':': '%colon;',
'}': '%rcub;',
'{': '%lcub;',
},
escape(data) {
return typeof data === 'object' ?
`KDATA${btoa(JSON.stringify(data))}` :
`KSTRING${btoa(data)}`;
},
unescape(string) {
const isData = typeof string === 'string' &&
(
string.startsWith('KDATA') ||
string.startsWith('KSTRING')
);
return isData ?
(
string.startsWith('KDATA') ?
JSON.parse(atob(string.replace(/^KDATA/,''))) :
atob(string.replace(/^KSTRING/,''))
) :
string;
}
};
/**
* Encodes data in Base64. This is useful for passing roll information to action buttons called from roll buttons.
* @function
* @param {string|object|any[]} data - The data that you want to Base64 encode
* @returns {string} - The encoded data
* @memberof! Utilities
*/
const escape = RE.escape;
/**
* Decodes Base64 encoded strings that were created by the K-scaffold
* @function
* @param {string|object|any[]} string - The string of encoded data to decode. If this is not a string, or is not a string that was encoded by the K-scaffold, it will be returned as is.
* @returns {string|object|any[]}
* @memberof! Utilities
*/
const unescape = RE.unescape;
Object.assign(kFuncs,{escape,unescape});/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
/*jshint -W014,-W084,-W030,-W033*/
//# Attribute Obj Proxy handler
const createAttrProxy = function(attrs,sections,casc){
//creates a proxy for the attributes object so that values can be worked with more easily.
const getCascObj = function(event){
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];
k.debug({[cascName]:cascObj});
if(event && cascObj){
if(event.previousValue){
cascObj.previousValue = event.previousValue;
}else if(event.originalRollId){
cascObj.originalRollId = event.originalRollId;
cascObj.rollData = RE.unescape(event.originalRollId);
}
}
return cascObj || {};
};
const triggerFunctions = function(obj){
if(obj.triggeredFuncs && obj.triggeredFuncs.length){
debug(`triggering functions for ${obj.name}`);
obj.triggeredFuncs && obj.triggeredFuncs.forEach(func=>funcs[func] ?
funcs[func]({trigger:obj,attributes,sections,casc}) :
debug(`!!!Warning!!! no function named ${func} found. Triggered function not called for ${obj.name}`,true));
}
};
const initialFunction = function(obj){
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){
Object.values(allHandlers).forEach((handler)=>{
handler({trigger,attributes,sections,casc});
});
};
const processChange = function({event,trigger}){
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');
if(Array.isArray(trigger.affects)){
attributes.queue.push(...trigger.affects);
}
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`);
}
}
attributes.set();
};
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 {callback,vocal} = arguments[0] ? arguments[0] : {};
if(sections && casc && attributes.queue.length){
const triggerName = attributes.queue.shift();
const trigger = getCascObj({sourceAttribute:triggerName});
processChange({trigger,attributes,sections,casc});
}else{
debug({updates:obj.updates});
const 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}`)
){
if(sections && casc){
const trigger = getCascObj({sourceAttribute:prop});
if(Array.isArray(trigger.affects)){
attributes.queue.push(...trigger.affects);
}
}
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()];
});
}
};
const attributes = new Proxy(attrTarget,attrHandler);
return attributes;
};
/**
* 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.
* @memberof Utilities
* @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;
/**
* Function that sets up the action calls used in the roller mixin.
* @memberof Sheetworkers
* @param {object} attributes - The attribute values of the character
* @param {object[]} sections - All the repeating section IDs
*/
const setActionCalls = function({attributes,sections}){
actionAttributes.forEach((base)=>{
let [section,,field] = k.parseTriggerName(base);
let fieldAction = field.replace(/_/g,'-');
if(section){
sections[section].forEach((id)=>{
attributes[`${section}_${id}_${field}`] = `%{${attributes.character_name}|${section}_${id}_${fieldAction}}`;
});
}else{
attributes[`${field}`] = `%{${attributes.character_name}|${fieldAction}}`;
}
});
};
funcs.setActionCalls = setActionCalls;
kFuncs.setActionCalls = setActionCalls;
/**
* Function to call a function previously registered to the funcs object. May not be used that much in actual sheets, but very useful when writing unit tests for your sheet. Either returns the function or null if no function exists.
* @memberof Sheetworkers
* @param {string} funcName - The name of the function to invoke.
* @param {...any} args - The arguments to call the function with.
* @returns {function|null}
* @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;/**@namespace Sheetworkers */
/*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});
}
});
}
k.debug({openHandlers});
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).
* @memberof Sheetworkers
* @param {Roll20Event} event - The Roll20 event object
* @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){
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);
}else if(key){//for non repeating attributes do this logic
expandNormal(memo,key,cascade,sections);
}
return memo;
},{});
};
const expandRepeating = function(memo,key,cascade,sections){
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*/
/**
* These are functions that provide K-scaffold aliases for the basic Roll20 sheetworker functions. These functions also provide many additional features on top of the standard Roll20 sheetworkers.
* @namespace Sheetworkers.Sheetworker Aliases
*/
/**
* 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.
* @memberof Sheetworker Aliases
* @name setSectionOrder
* @param {string} section - The name of the section, with or without `repeating_`
* @param {string[]} order - Array of ids describing the desired order of the section.
* @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.
* @memberof Sheetworker Aliases
* @name removeRepeatingRow
* @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.
* @memberof Sheetworker Aliases
* @name getAttrs
* @param {string[]} [props=baseGet] - Array of attribute names to get the value of. Defaults to {@link baseGet} if not passed.
* @param {function(attributesProxy)} 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.
* @memberof Sheetworker Aliases
* @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 casc = expandCascade(cascades,sections);
const attributes = createAttrProxy(values,sections,casc);
orderSections(attributes,sections);
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.
* @memberof Sheetworker Aliases
* @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.
* @memberof Sheetworker Aliases
* @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.
* @memberof Sheetworker Aliases
* @name generateRowID
* @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 = {};
/**
* The array of attribute names that the k-scaffold gets by default. Does not incude repeating attributes.
* @memberof Variables
* @var
* @type {array}
*/
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.
/**
* Function to add a repeating section when the add button of a customControlFieldset or inlineFieldset is clicked.
* @memberof Sheetworkers
* @param {object} event - The R20 event object
*/
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){
if(trigger.addFuncs){
trigger.addFuncs.forEach((funcName) => {
if(funcs[funcName]){
funcs[funcName]({attributes,sections,casc,trigger});
}
});
}
if(Array.isArray(trigger.affects)){
attributes.queue.push(...trigger.affects);
}
}
attributes.set({attributes,sections,casc});
}
});
};
funcs.addItem = addItem;/**
* 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.
* @memberof Sheetworkers
* @param {Object} trigger - The trigger object
* @param {object} attributes - The attribute values of the character
*/
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
* @memberof Sheetworkers
* @param {object} attributes - The attribute values of the character
*/
const kTabOnOpen = function({trigger,attributes,sections,casc}){
if(typeof persistentTabs === 'undefined') return;
persistentTabs.forEach((tabInput) => {
const pseudoTrigger = {name:attributes[tabInput]};
kSwitchTab({trigger:pseudoTrigger, attributes});
});
};
registerFuncs({ kTabOnOpen },{type:['opener']});
return kFuncs;
}());
const actionAttributes = ["strength_action","strength_save_action","dexterity_action","dexterity_save_action","constitution_action","constitution_save_action","intelligence_action","intelligence_save_action","wisdom_action","wisdom_save_action","charisma_action","charisma_save_action","acrobatics_action","arts_and_crafts_action","athletics_action","computers_action","deception_action","endurance_action","insight_action","intimidation_action","investigation_action","mechanics_action","medicine_action","natural_science_action","perception_action","performance_action","persuasion_action","security_action","sleight_of_hand_action","social_sciences_action","stealth_action","streetwise_action","survival_action","vehicles_action","hit_dice_action","death_save_action","initiative_action","repeating_weapons_$X_attack_action","repeating_plans_$X_action","repeating_tricks_$X_action","repeating_influence-tricks_$X_action","repeating_bonus-actions_$X_attack_action","repeating_reactions_$X_attack_action","repeating_action_$X_attack_action","crash_action","vehicle_speed_action","vehicle_maneuverability_action","damage_levels_action"];const abilities = ["strength","dexterity","constitution","intelligence","wisdom","charisma"];const skills = {"acrobatics":"dexterity","arts and crafts":"wisdom","athletics":"strength","computers":"intelligence","deception":"charisma","endurance":"constitution","insight":"wisdom","intimidation":"charisma","investigation":"intelligence","mechanics":"intelligence","medicine":"intelligence","natural science":"intelligence","perception":"wisdom","performance":"charisma","persuasion":"charisma","security":"intelligence","sleight of hand":"dexterity","social sciences":"intelligence","stealth":"dexterity","streetwise":"wisdom","survival":"wisdom","vehicles":"dexterity"};const sheetTypes = {"pc":["core","persona","plans-tricks"],"npc":["npc"],"vehicle":["vehicle"],"place":["place"]};const persona = {"textareas":["motivations","attachments","beliefs"],"inputs":["ancestry","quirks","virtues","flaws","role"]};const vehicle = {"abilityScores":["strength","dexterity","constitution"],"inputs":[{"name":"attr_top_speed","type":"number","class":"form-label__input recess-effect input-label__input","title":"@{top_speed}"},{"name":"attr_pax","type":"number","class":"form-label__input recess-effect input-label__input","title":"@{pax}"},{"name":"attr_price_level","type":"number","class":"form-label__input recess-effect input-label__input","title":"@{price_level}"},{"name":"attr_armor_value","type":"number","class":"form-label__input recess-effect input-label__input","title":"@{armor_value}"},{"name":"attr_properties","type":"text","class":"form-label__input recess-effect input-label__input","title":"@{properties}"}],"damage":{"levels":["body","control","power"]}};const npc = {"subheader":[{"name":"attr_size","type":"span","value":"medium","data-i18n-placeholder":"size","title":"@{size}"},{"name":"attr_creature_type","type":"span","data-i18n-placeholder":"type (subtype)","title":"@{creature_type}"}],"basicStats":[[{"name":"defense","type":"number"}],[{"name":"hp","data-i18n":"hit points","type":"number","trigger":{"calculation":"calcNPCHP","name":"hp"}},{"name":"attr_hit_dice_expression","type":"span","class":"parentheses--surround--full","data-i18n-placeholder":"xdy + z","trigger":{"affects":["hp"],"name":"hit_dice_expression","listener":"change:hit_dice_expression","listenerFunc":"accessSheet","type":"text","defaultValue":"","triggeredFuncs":[]},"title":"@{hit_dice_expression}"}],[{"name":"armor name","type":"text","data-i18n":"armor"},{"name":"armor value","type":"number","data-i18n":"av","spanClass":"uppercase"},{"name":"attr_armor_properties","type":"span","data-i18n-placeholder":"properties","title":"@{armor_properties}"}],[{"name":"speed","type":"text"}]]};const statblockRowControls = {"saves":["strength_save","dexterity_save","constitution_save","intelligence_save","wisdom_save","charisma_save"],"skills":["acrobatics","arts_and_crafts","athletics","computers","deception","endurance","insight","intimidation","investigation","mechanics","medicine","natural_science","perception","performance","persuasion","security","sleight_of_hand","social_sciences","stealth","streetwise","survival","vehicles"],"genius":["genius_level","npc_not_genius"],"focus":["focus_level","npc_not_focus"],"influence":["influence_level","npc_not_influence"]};const proficiencies = ["basic","advanced","historical","improvised","military"];const specialCategories = {};const itemCategories = ["Equipment","Feats","Plans","Weapons","Tricks","Talents","Ability","Bonus-Actions","Reactions"];const maxAttr = ["hp"];const sectionLookup = {};k.sheetName = 'Everyday Heroes';
k.version = 1.7;
/**
* Assembles the roll string from the roll object
* @param {object} rollObj - object describing the roll
* @param {string} [rollStart = '@{template_start}'] - The string to start the roll with.
* @returns {string}
*/
const assembleRoll = (rollObj, rollStart = "@{template_start}") => {
return Object.entries(rollObj).reduce((str, [field, content]) => {
return (str += content ? ` {{${field}=${content}}}` : "");
}, `${rollStart}`);
};
/**
* Executes the roll. Uses a callback if any computations are required.
* @param {object} rollObj - Object describing the roll fields to be used
* @param {object} attributes - The character attributes
* @param {object[]} sections - The sections array
* @returns {Promise<object[]>} - Resolves to array with index 0 being the roll results object and index 1 being the computeObj with success/panics precalculated.
*/
const executeRoll = async ({ rollObj, customString }) => {
const rollString = assembleRoll(rollObj, customString);
const roll = await startRoll(rollString);
const computeObj = {};
return [roll, computeObj];
};
/**
* Gets the proper d20 value to use based on user preference.
* @param {attributesProxy} attributes - The k-scaffold attributes object
* @returns {promise<string>}
*/
const getD20 = (attributes) =>
attributes.roll_type.startsWith('?{') ?
queryD20(attributes) :
// using the pseudo query here as we have to await a roll on both sides of the ternary or the character sheet will lose connection to it's active state.
k.pseudoQuery(attributes.roll_type);
const queryD20 = (attributes) => {
const prompt = k.capitalize(getTranslationByKey('roll'));
const string = attributes.roll_type.replace(/\?\{Roll\||\}/g,'').split('|').reduce((str,opt) => {
const [s,v] = opt.split(',');
str+=`|${k.capitalize(getTranslationByKey(s.toLowerCase()))},${v}`
return str;
},`${prompt}`);
return k.extractQueryResult(string);
}/**
* Gets the crew to use for the roll if applicable.
* @param {attributesProxy} attributes - Attributes proxy from the K-scaffold
* @returns {Promise<string>}
*/
const getCrew = (attributes,sections) => {
const query = sections.repeating_crew
.filter(id => attributes[`repeating_crew_${id}_position`] === 'gunner')
.map(id => attributes[`repeating_crew_${id}_name`]);
if(!query.length){
return k.pseudoQuery('');
}else if(query.length === 1){
return k.pseudoQuery(query[0]);
}else{
return k.extractQueryResult(`${getTranslationByKey('crew query')}|${query.join('|')}`);
}
};/**
* assembles the information required by all attack/save type rolls (weapons, plans, tricks, etc). Will create and assign the roll.
* @param {string} row - The row information for the button that was clicked. This is the concatenation of the section name and the row ID joined by an `_`.
* @param {object} rollObj - The rollObj to work on. Is NOT mutated in place. Sending a rollObj with keys that this function is meant to assign will result in the rollObj keys overwriting the key/value pairs generated by the function.
* @param {attributesProxy} attributes - The K-scaffold attributes object.
*/
const assembleAttackObj = async (row, rollObj, attributes,sections) => {
const protoObj = {};
const d20 = await getD20(attributes);
const charName = await (
attributes.sheet_type === 'vehicle' ?
getCrew(attributes,sections) :
k.pseudoQuery('')
);
const charRef = charName ?
`${charName}|` :
'';
const profAdd = attributes.sheet_type === 'npc' ?
'' :
` + [[${
/repeating_(?:weapon|action)/.test(row)
?
(
(
attributes[`${row}_type`] ?
attributes[`${row}_type`].replace(/@\{/,`@{${charRef}`) :
0
) ||
0
) :
1
} * @{proficiency}]][${k.capitalize(getTranslationByKey("proficiency"))}]`;
if (!attributes[`${row}_attack_disable`]) {
let attr = '';
let abiAdd = '';
if(attributes.sheet_type !== 'npc'){
if(/plan|trick/.test(row)){
attr = /plan/.test('row') ?
'intelligence' :
'charisma';
abiAdd = ` + @{${charRef}|${attr}_mod}[${k.capitalize(
getTranslationByKey(`${attr.replace(/_mod/, "")} abbreviation`)
)}]`;
}else{
attr = attributes[`${row}_attack_ability`].replace(/@\{|\}/g, "");
abiAdd = attributes[`${row}_attack_ability`]
? ` + ${attributes[`${row}_attack_ability`].replace(/@\{/,`@{${charRef}`)}[${k.capitalize(
getTranslationByKey(`${attr.replace(/_mod/, "")} abbreviation`)
)}]`
: "";
}
}
const bonusAdd = attributes[`${row}_attack_bonus`]
? ` + ${attributes[`${row}_attack_bonus`]}[${k.capitalize(
getTranslationByKey("bonus")
)}]`
: "";
protoObj.roll = `[[${d20}cs>${
attributes[`${row}_critical_threshold`]
}${abiAdd}${profAdd}${bonusAdd}]]`;
protoObj.roll_name = `^{attack}`;
}
[1, 2].forEach((n) => {
if (!attributes[`${row}_damage_${n}_disable`]) {
const abi = attributes[`${row}_damage_ability_${n}`]
? ` + ${attributes[`${row}_damage_ability_${n}`].replace(/@\{/,`@{${charRef}`)}`
: "";
protoObj[`damage_${n}`] = attributes[`${row}_damage_${n}`]
? `[[${attributes[`${row}_damage_${n}`]}${abi}]]`
: `[[0${abi}]]`;
protoObj[`damage_${n}_type`] = attributes[`${row}_damage_type_${n}`];
protoObj[`critical_damage_${n}`] = attributes[`${row}_critical_${n}`]
? `[[${attributes[`${row}_critical_${n}`]}]]`
: attributes[`${row}_damage_${n}`]
? `[[${attributes[`${row}_damage_${n}`]}]]`
: "";
}
});
debugger;
if (!attributes[`${row}_save_disable`]) {
const [,npcDCType] = row.match(/repeating_([^_]+)/) || [];
const npcDCAttr = `${npcDCType.replace(/s$/,'')}_dc`;
const saveBasis =
attributes.sheet_type === "npc"
? (
/plan|trick/.test(npcDCAttr) ?
attributes[npcDCAttr] :
0
) :
`8 + ${attributes[`${row}_save_basis`] || 0}`;
protoObj.dc = `[[${saveBasis}${profAdd} + ${
attributes[`${row}_dc_bonus`]
}]]`;
protoObj.save_type = attributes[`${row}_save_type`];
}
return { ...protoObj, ...rollObj };
};/**
* Rolls basic rolls that just use an attribute named the same as the roll button
* @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 rollBasic = async function({trigger,attributes,sections,casc}){
const [section,rowID,buttonName] = k.parseTriggerName(trigger.name);
const attrName = buttonName.replace(/-action/,'').replace(/-/g,'_');
const attrForTrans = attrName.replace(/-|_/g,' ');
let d20 = await (getD20(attributes));
if(attributes.sheet_type === 'vehicle'){
if(attrName.startsWith('dexterity')){
d20 = applyDamageMods(d20,'control',attributes);
}else if(attrName.startsWith('strength')){
d20 = applyDamageMods(d20,'power',attributes);
}else if(attrName.startsWith('constitution')){
d20 = applyDamageMods(d20,'body',attributes);
}
}
const rollObj = {
roll:`[[${d20} + @{${attrName}}[${getTranslationByKey(attrForTrans)}]${attrName === 'initiative' ? '&{tracker}':''}]]`,
title: `^{${attrForTrans}}`
};
const [roll,computeObj] = await executeRoll({rollObj});
finishRoll(roll.rollId);
};
k.registerFuncs({rollBasic});/**
* Rolls basic rolls that use an attribute named the same as the roll button with `_mod` appended to it.
* @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 rollMod = async function({trigger,attributes,sections,casc}){
const [section,rowID,buttonName] = k.parseTriggerName(trigger.name);
const attrName = buttonName.replace(/-action/,'').replace(/-/g,'_');
const attrForTrans = attrName.replace(/-|_/g,' ');
const d20 = await (getD20(attributes));
const rollObj = {
roll:`[[${d20} + @{${attrName}_mod}[${getTranslationByKey(attrForTrans)}]]]`,
title: `^{${attrForTrans}}`
};
const [roll,computeObj] = await executeRoll({rollObj});
finishRoll(roll.rollId);
};
k.registerFuncs({rollMod});
/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
/*jshint -W014,-W084,-W030,-W033*/
const handleCompendiumDrop = function ({ attributes, sections, casc }) {
clearDropAttributes();
let data = parseDropData(attributes.drop_data, attributes, sections, casc);
if (!data) return;
k.debug({ data });
compendiumLookup({
origBlock: data,
attributes, sections, casc,
callback: async (lookupObj) => {
k.debug({ 'threat data': lookupObj });
await processDropData({ data: lookupObj, attributes, sections, casc });
k.debug('Drop processing complete');
const updateKeys = Object.keys(attributes.updates);
const iterateQueue = [...attributes.queue];
iterateQueue.forEach((q,i) =>{
if(updateKeys.includes(q)){
const qI = attributes.queue.indexOf(q);
attributes.queue.splice(qI,1);
}
});
k.setActionCalls({attributes,sections});
if(attributes.sheet_type === 'npc'){
statblockRowSetup({attributes,sections,casc});
}
attributes.set();
}
});
};
k.registerFuncs({ handleCompendiumDrop });
const parseDropData = function (drop_data, attributes, sections, casc) {
k.debug('parsing drop data');
k.debug({ drop_data: `"${drop_data}"` });
try {
let data = JSON.parse(drop_data);
data = Object.entries(data)
.reduce((memo, [key, val]) => {
if (val) {
if (typeof val === 'string' && val.startsWith('[{')) {
val = JSON.parse(val);
}
memo[key] = val;
}
return memo;
}, {});
return processSpecialCategories(data, attributes, sections, casc);
} catch (err) {
k.debug({ 'Invalid Drop Data! Drop aborted. Error:': err, drop_data }, true);
return false;
}
};
const clearSheet = function (attributes, sections, casc) {
Object.entries(sections).forEach(([section, idArray]) => {
idArray.forEach((id) => {
k.removeRepeatingRow(`${section}_${id}`, attributes, sections);
});
});
Object.keys(attributes.attributes).forEach((attr) => {
if (casc[`attr_${attr}`]) {
attributes[attr] = casc[`attr_${attr}`].defaultValue || '';
}
})
};
const clearDropAttributes = function () {
k.setAttrs({ drop_name: '', drop_data: '' });
};
const processDropData = function ({ data, attributes, sections, casc, section = '' }) {
section = section ? `${section}_` : '';
const worker = async (queue) => {
let [key, val] = queue.shift();
try {
let setKey = key.replace(/^(?:data-)?cs(?:list)?-/, '');
if (typeof val === 'string' && val.startsWith('[{')) {
val = JSON.parse(val);
}
if (!Array.isArray(val) && (key.startsWith('cs-') || key.startsWith('data-cs-'))) {
await k.pseudoQuery();
attributes[`${section}${setKey}`] = val;
attributes.queue.push(`${section}${setKey}`);
if (maxAttr.includes(setKey)) {
attributes[`${section}${setKey}_max`] = val;
attributes.queue.push(`${section}${setKey}_max`);
}
} else if (Array.isArray(val) && key.startsWith('data-')) {
let lookupKey = key.replace(/data-(?:cs(?:list)?-)?/, '');
if (repeatProcessors[lookupKey]) {
k.debug(`processing ${lookupKey}`);
await repeatProcessors[lookupKey](lookupKey, val, attributes, sections, casc);
} else if (key.startsWith('data-cslist-')) {
await k.pseudoQuery();
attributes[`${section}${setKey}`] = val.map((o) => o.name).join(', ');
} else if (key === 'data-content') {
await k.pseudoQuery();
attributes[`${section}description`] = val.reduce((textArr, content) => {
if (content.heading) {
textArr.push(content.heading);
}
if (content.content) {
let text = /list/.test(content.type) ? `• ${content.content}` : content.content;
textArr.push(text);
}
return textArr;
}, []).join('\n')
.replace(/\n{2,}/, '\n')
.replace(/\n+$/, '');
}
}
} catch (err) {
k.debug({ [`Invalid JSON entered for ${key} on ${data.display_name}`]: err, JSON: val });
}
if (queue.length) {
return worker(queue);
} else {
return true;
}
};
return worker(Object.entries(data));
};
/**
* Does the basic prepwork for repeating section drops by creating the rowID and grabbing the item to work on. Passes the selected itemObj and the created section details to the callback function
* @param {string} lookupKey
* @param {array} arr
* @param {object} sections
* @param {function} callback
*/
const repeatWorker = async function (lookupKey, arr, sections, casc, callback) {
const type = sectionLookup[lookupKey] || lookupKey.toLowerCase();
const worker = async (queue) => {
const itemObj = queue.shift();
itemObj['data-cs-collapse'] = 1;
const section = k.generateRowID(type, sections);
addRowToCasc(section, casc);
await callback(itemObj, section);
if (queue.length) {
return worker(queue);
} else {
return true;
}
};
return await worker([...arr]);
}
/**
* Adds the cascade objects for the indicated row to the casc object.
* @param {string} section - The row information (repeating section, and rowID)
* @param {object} casc - The cascade object for this particular character
* @param {number|string} [previousValue] - What to set the previous value to
*/
const addRowToCasc = function (section, casc, previousValue) {
k.debug(`Adding ${section} to cascades`);
const match = section.match(/(.+?_.+?)_(.+)/);
match.shift();
const [repSection, rowID] = match;
k.debug({ repSection, rowID });
Object
.entries(k.cascades)
.forEach(([key, obj]) => {
if (key.startsWith(`attr_${repSection}`)) {
const newObj = { ...obj };
newObj.name = newObj.name.replace(/\$X/, rowID)
const newKey = key.replace(/\$X/, rowID);
newObj.previousValue = previousValue === undefined ?
newObj.defaultValue :
previousValue;
newObj.affects = newObj.affects.map(a => a.replace(/\$X/, rowID));
casc[newKey] = newObj;
k.debug({ [`casc[${newKey}]`]: casc[newKey] });
}
});
};/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
/*jshint -W014,-W084,-W030,-W033*/
//Initiate a compendium lookup
//Start of the actual compendium lookup functions
//Function to initiate the lookup. Parses the statblock to figure out what needs to be looked up in the compendium, and what attribute should be filtered for based on the category.
//ARGUMENTS
//statblock (object): base object dropped from the compendium
//callback (function): A function that will use the parsed compendium lookup data to finish the drag and drop of the item
//The callback function receives the parsed statblock as an argument
const compendiumLookup = function({queue, callback, origBlock, attributes, sections, casc, pass = 0}) {
pass++;
origBlock = origBlock || queue[0];
queue = queue || [origBlock];
let searchArray = [];
queue.forEach((statblock)=>{
searchArray = itemCategories.reduce((m, type) => {//Construct an array of items to search for.
let searchType = specialCategories[type] || type;
const typeObj = statblock[`data-${type}`];
delete statblock[`data-${type}`];
statblock[`data-${type.toLowerCase()}`] = statblock[`data-${type.toLowerCase()}`] ||
typeObj;
if (statblock[`data-${type.toLowerCase()}`]){
let searchNames = statblock[`data-${type.toLowerCase()}`].map((obj) => obj.name || obj['data-cs-name'] || '')
.join('|')
.replace(/\|{2,}/g,'')
.replace(/\|$/,'');
if(searchNames.length > 0){
let searchString = `Category:${searchType} data-cs-name:${searchNames}`;
m.push(searchString);
}
}
return m;
}, searchArray);
k.debug({searchArray});
if(searchArray.length){
lookupBurndown(statblock, searchArray, callback, origBlock, attributes, sections, casc,pass);
}else{
callback(origBlock);
}
});
};
//Actually queries the compendium to get details on the items in each category using the searchArray assembled in compendiumLookup
//ARGUMENTS
//statblock (object): the original object dropped from the compendium
//callback (function): A function that will use the parsed compendium lookup data to finish the drag and drop of the item
//The callback function receives the parsed statblock as an argument
const lookupBurndown = function(statblock, searchArray, callback, origBlock, attributes, sections, casc,pass) {
getCompendiumQuery(searchArray, (dataArr) => {
k.debug({dataArr});
const expansionIDs = dataArr
.reduce( (arr,obj)=>{
arr.push(k.value(obj.data.Expansion));
return arr;
},[])
.sort((a,b) => b - a);
itemCategories.forEach((oCategory) => {
const category = statblock[`data-${oCategory}`] ?
oCategory :
oCategory.toLowerCase();
if (statblock[`data-${category}`]) {
origBlock[`data-${category}`] = statblock[`data-${category}`].map((obj) => {
const fullItem = getItemDetails(obj, dataArr, expansionIDs);
fullItem['data-cs-name'] = fullItem['data-cs-name'] || fullItem.name;
return fullItem;
});
}
});
const queue = additionalLookups(statblock,origBlock);
if(queue.length /*&& pass < 2*/){
compendiumLookup({queue,callback,origBlock, attributes, sections, casc,pass});
}else{
callback(origBlock);
}
});
};
const additionalLookups = function(statblock,origBlock){
return Object.entries(statblock).reduce((memo,[prop,arr])=>{
if(prop.startsWith('data-') && Array.isArray(arr)){
let nestedData = arr.reduce((m,obj)=>{
Object.entries(obj).forEach(([nProp,nVal])=>{
/*commented code shouldn't be needed
if(
nProp.startsWith('data-') &&
typeof nVal === 'string' &&
nVal.startsWith('[{')
){
try{
let jArr = JSON.parse(nVal);
if(Array.isArray(jArr)){
jArr = jArr.map((o)=>{
o.datasource = obj['cs-name'] || obj.Category;
if(!o.datasource){
delete o.datasource;
}
return o;
});
origBlock[nProp] = origBlock[nProp] ?
[...origBlock[nProp],...jArr] :
[...jArr];
m.data[nProp] = jArr;
m.nested = true;
}
}catch(err){
//if the parse failed, do nothing
}
}else */
if(nProp === 'data-features'){
try{
if(typeof nVal === 'string'){
k.debug('string data-feature detected');
nVal = JSON.parse(nVal);
}
nVal.forEach((feature)=>{
if(!origBlock[`data-${feature.category}`] || origBlock[`data-${feature.category}`].every((o)=>o['data-cs-name'].toLowerCase() !== feature.name.toLowerCase())){
m.nested = true;
m.data[`data-${feature.category}`] = m.data[`data-${feature.category}`] || [];
m.data[`data-${feature.category}`].push({'data-cs-name':feature.name});
}
});
}catch(err){
k.debug({[`Invalid data-feature on ${obj['data-cs-name']}`]:err,'data-feature':nVal},true);
}
}
});
return m;
},{data:{},nested:false});
if(nestedData && nestedData.nested){
memo.push(nestedData.data);
}
}
return memo;
},[]);
};
//Finds the compendium item that most precisely matches the needs of the compendium item based on expansion ID and name property.
//If nothing matches based on expansion ID, simply returns the first item with appropriate name property.
//ARGUMENTS
//itemObj (object): the data on the Item to return that is included in the base statblock
//dataArr (array): The compendium items that were returned from getCompendiumQuery
const getItemDetails = function(itemObj, dataArr, expansionIDs) {
let objName = itemObj['data-cs-name'] || itemObj.name;
let compendiumObj;
expansionIDs.find((id) => {
compendiumObj = dataArr.find((dataObj) => k.value(dataObj.data.Expansion) === id &&
dataObj.data['data-cs-name'] === objName);
if (compendiumObj) {
return true;
} else {
return false;
}
});
if (!compendiumObj) { //If we didn't find an object matching the expansion pathways and the object name, just find the first item with a matching name
compendiumObj = dataArr.find((dataObj) =>
dataObj.data['data-cs-name'] === objName);
if (!compendiumObj) { //If there still isn't a matching compendium object, return the original Item
return itemObj;
}
}
Object.keys(compendiumObj.data).forEach((key) => {
itemObj[key] = itemObj[key] || compendiumObj.data[key];
});
return itemObj;
};/**
* Handles dropping of repeating section items that need no special handling. Provided as part of the compendium infrastructure as it is useful for nearly any project and can serve as a template for more specific drop functions.
* @param {string} lookupKey - The section name
* @param {object[]} arr - Array of data to parse
* @param {attributesProxy} attributes - The attributes for the character
* @param {object} sections - The object with keys equal to repeating section names and values of arrays of repeating ids
* @param {object} casc - The cascade object
* @param {array} sectionsToQuery - sections that need further user input before drop completes
*/
const basicDrop = (lookupKey,arr,attributes,sections,casc,sectionsToQuery) => {
return repeatWorker(lookupKey,arr,sections,casc,async (itemObj,section)=>{
await processDropData({data:itemObj,attributes,sections,casc,sectionsToQuery,section});
});
};/**
* Does all the generic handling for NPC type dropped items (e.g. Antagonists in Scion and Threats in TCF)
* @param {object} data - the data received from the drop
* @param {AttributesProxy} attributes - The attributes object from the K-scaffold
* @param {object} sections - The sections object form the k-scaffold
* @param {object} casc - The cascade object form the k-scaffold
*/
const npcHandler = (data,attributes,sections,casc) => {
clearSheet(attributes,sections,casc);
attributes.sheet_type = data.Category.toLowerCase().replace(/s$/,'');
attributes.queue.push('sheet_type');
attributes.character_name = data['data-cs-name'];
const tokenObj = {
width:70,
height:70,
};
setDefaultToken(tokenObj);
k.callFunc('kSwitchTab',{trigger:{name:`nav-tabs-everyday--${attributes.sheet_type}`},attributes});
};
/**
* Handles processing necessary for dropping feats/talents
* @param {string} lookupKey - The section name
* @param {object[]} arr - Array of data to parse
* @param {attributesProxy} attributes - The attributes for the character
* @param {object} sections - The object with keys equal to repeating section names and values of arrays of repeating ids
* @param {object} casc - The cascade object
* @param {array} sectionsToQuery - sections that need further user input before drop completes
*/
const featTalentDrop = (lookupKey,arr,attributes,sections,casc,sectionsToQuery) => {
return repeatWorker('ability',arr,sections,casc,async (itemObj,section)=>{
await processDropData({data:itemObj,attributes,sections,casc,sectionsToQuery,section});
});
};/**
* Handles processing necessary for dropping feats/talents
* @param {string} lookupKey - The section name
* @param {object[]} arr - Array of data to parse
* @param {attributesProxy} attributes - The attributes for the character
* @param {object} sections - The object with keys equal to repeating section names and values of arrays of repeating ids
* @param {object} casc - The cascade object
* @param {array} sectionsToQuery - sections that need further user input before drop completes
*/
const actionDrop = (lookupKey,arr,attributes,sections,casc,sectionsToQuery) => {
const trueKey = lookupKey.toLowerCase() === 'actions' ?
'action' :
lookupKey.toLowerCase().replace(/\s+/g,'-');
return repeatWorker(trueKey,arr,sections,casc,async (itemObj,section)=>{
if(itemObj['data-cs-attack_ability'] || itemObj['data-cs-attack_bonus']){
itemObj['data-cs-attack_disable'] = 0;
}
[1,2].forEach(n =>{
if(itemObj['data-cs-damage_1']){
itemObj['data-cs-damage_1_disable'] = 0;
}
})
if(itemObj['data-cs-save_type']){
itemObj['data-cs-save_disable'] = 0;
}
await processDropData({data:itemObj,attributes,sections,casc,sectionsToQuery,section});
});
};/**
* handles drops for armor
* @param {string} lookupKey - The section name
* @param {object[]} arr - Array of data to parse
* @param {attributesProxy} attributes - The attributes for the character
* @param {object} sections - The object with keys equal to repeating section names and values of arrays of repeating ids
* @param {object} casc - The cascade object
* @param {array} sectionsToQuery - sections that need further user input before drop completes
*/
const armorDrop = async (lookupKey,arr,attributes,sections,casc,sectionsToQuery) => {
await Promise.all(
arr.map(async item => {
Object.entries(item).forEach(([key,val])=>{
if(
key.startsWith('data-cs-') &&
!key.startsWith('data-cs-armor_')
){
const propName = key.replace(/data-cs-/,'data-cs-armor_');
item[propName] = val;
delete item[key];
}
})
await processDropData({data:item,attributes,sections,casc,sectionsToQuery})
})
);
};/**
* Lookup for what specific drop function to use for a given drop type. Note that the key is the part after `data-` if it is in another compendium item (e.g. in a Monster), or is the same as the Compendium category (minus anything after a space).
* @var
*/
const repeatProcessors = {
// NPC repeating sections
Actions:actionDrop,
actions:actionDrop,
'Bonus Actions':actionDrop,
'bonus-actions':actionDrop,
'Influence-Tricks':actionDrop,
'influence-tricks':actionDrop,
Reactions:actionDrop,
reactions:actionDrop,
Traits:actionDrop,
traits:actionDrop,
// PC and all character repeating sections
Equipment:basicDrop,
equipment:basicDrop,
Plans:actionDrop,
plans:actionDrop,
Tricks:actionDrop,
tricks:actionDrop,
Talents:featTalentDrop,
talents:featTalentDrop,
Feats:featTalentDrop,
feats:featTalentDrop,
Weapons:actionDrop,
weapons:actionDrop,
// Non Repeating special drops
Armor:armorDrop,
armor:armorDrop
};/**
* Does the system specific handling for specialized drop categories.
* @param {object} data - the data received from the drop
* @param {AttributesProxy} attributes - The attributes object from the K-scaffold
* @param {object} sections - The sections object form the k-scaffold
* @param {object} casc - The cascade object form the k-scaffold
* @returns {object|[]} - The manipulated data object
*/
const processSpecialCategories = (data,attributes,sections,casc) => {
if(
data.Category !== 'NPCs' &&
data.Category !== 'Useful Places' &&
data.Category !== 'Vehicles'
){
let category = data.Category;
// Handling for vehicle modifications
if(/vehicle modifications/i.test(category)){
category = 'weapons';
}
data = {[`data-${category}`]:[data]};
if(data[`data-${category}`]['data-features']){
data[category]['data-features'].forEach((feature)=>{
let cat = k.capitalize(feature.category);
data[`data-${cat}`] = data[`data-${cat}`] || [];
data[`data-${cat}`].push({name:feature.name});
});
}
}else{
if(data.Category === 'Useful Places'){
data.Category = 'Places';
}
npcHandler(data,attributes,sections,casc);
}
return data;
};/**
* Updates the sheet to version 1.2
* @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 x1_2 = function({trigger,attributes,sections,casc}){
if(!attributes.sheet_version){
// update the action display to properly use the weapon name/dc/attack/damage complexities
sections.repeating_action.forEach(id => {
attributes[`repeating_action_${id}_name_only`] = calcWeaponNameDisplay({trigger:{name:`repeating_action_${id}_name_only`},attributes,sections,casc});
attributes[`repeating_action_${id}_bonus_calc`] = calcAttackBonus({trigger:{name:`repeating_action_${id}_bonus_calc`},attributes,sections,casc})
});
// Update the proficiency
attributes.proficiency = calcProf({attributes,sections,casc})
}
};
// While this is an update function, it runs as an opener because I forgot to set the initial version of the sheet and so the update detection doesn't work. All future update functions should run as updaters though.
k.registerFuncs({'1.2':x1_2},{type:['opener']});/**
* Initializes attribute values based on the selected sheet type.
* @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 valueInit = function({trigger,attributes,sections,casc}){
const valuesToInit = [
...abilities.map((abi) => `${abi}_save`),
...Object.keys(skills).map(skill => skill.replace(/\s+/g,'_'))
];
valuesToInit.forEach(attrName => {
attributes.updates[attrName] = attributes.sheet_type === 'npc' ?
'' :
k.callFunc(casc[`attr_${attrName}`].calculation,{trigger:{name:attrName},attributes,sections,casc});
})
};
k.registerFuncs({valueInit});
/**
* Does the initial setting of attributes shared between pc and npc.
* @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 valueSetup = function({trigger,attributes,sections,casc}){
if(!attributes.sheet_version){
abilities.forEach((abi) => {
attributes[`${abi}_mod`] = calcMod({trigger:{name:`${abi}_mod`},attributes,sections,casc})
},[]);
valueInit({trigger,attributes,sections,casc});
}
};
k.registerFuncs({valueSetup},{type:['opener']});
/**
* Controls the displayed level of plans and traits based on the current level of the plan/trait.
* @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 displayLevelDetails = function({trigger,attributes,sections,casc}){
const [section,rowID,attrName] = k.parseTriggerName(trigger.name);
const row = `${section}_${rowID}`;
[3,5,7,9].forEach(lvl =>
attributes[`${row}_collapse_${lvl}`] = attributes[`${row}_level`] >= lvl ?
0 :
1
)
};
k.registerFuncs({displayLevelDetails});/**
* Rolls for the plan/trick information
* @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 rollPlanTrick = async function ({ trigger, attributes, sections, casc }) {
const [section, rowID] = k.parseTriggerName(trigger.name);
const row = `${section}_${rowID}`;
const fullDescription = !/trick/.test(section) ?
[3, 5, 7, 9].reduce((text, num) => {
if (
!attributes[`${row}_collapse_${num}`] &&
attributes[`${row}_level_${num}_effect`]
) {
text += `${text ? "\n" : ""}**^{Level ${num}}**\n${
attributes[`${row}_level_${num}_effect`]
}`;
}
return text;
}, attributes[`${row}_description`]) :
attributes[`${row}_description`];
const rollObj = await assembleAttackObj(
row,
{
title: attributes[`${row}_name`],
description: fullDescription,
},
attributes,
sections
);
const [roll, computeObj] = await executeRoll({ rollObj });
finishRoll(roll.rollId);
};
k.registerFuncs({ rollPlanTrick });
/**
* Function that calculates the modifier for ability scores
* @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 calcMod = function({trigger,attributes,sections,casc}){
const abiName = trigger.name.replace(/_mod/,'');
return Math.floor((attributes[abiName] - 10) / 2);
};
k.registerFuncs({calcMod});/**
* Calculates an ability's save
* @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 calcSave = function({trigger,attributes,sections,casc}){
if(attributes.sheet_type === 'npc') return attributes[trigger.name];
const abiName = trigger.name.replace(/save/,'mod');
const profName = `${trigger.name}_proficiency`;
return attributes[abiName] + attributes[profName] * attributes.proficiency;
};
k.registerFuncs({calcSave});/**
* Calculates a skill modifier
* @param {object} trigger - The trigger that caused the function to be called
* @param {object} attributes - The attribute values of the character
* @param {object[]} sections - All the repeating section IDs
* @param {object} casc - Expanded cascade object
*/
const calcSkill = function({trigger,attributes,sections,casc}){
if(attributes.sheet_type !== 'pc') return;
const abiName = `${skills[trigger.name.replace(/_/g,' ')]}_mod`;
const profName = `${trigger.name}_proficiency`;
return attributes[abiName] + attributes[profName] * attributes.proficiency + attributes[`${trigger.name}_bonus`];
};
k.registerFuncs({calcSkill});/**
* Function that calculates the initiative bonus for the character
* @param {object} trigger - The trigger that caused the function to be called
* @param {object} attributes - The attribute values of the character
* @param {object[]} sections - All the repeating section IDs
* @param {object} casc - Expanded cascade object
*/
const calcInitiative = function({trigger,attributes,sections,casc}){
return attributes.dexterity_mod + attributes.initiative_proficiency*attributes.proficiency + attributes.initiative_bonus;
};
k.registerFuncs({calcInitiative});/**
* Function to calculate the passive version of a skill
* @param {object} trigger - The trigger that caused the function to be called
* @param {object} attributes - The attribute values of the character
* @param {object[]} sections - All the repeating section IDs
* @param {object} casc - Expanded cascade object
*/
const calcPassive = function({trigger,attributes,sections,casc}){
const tot = 10 + attributes.perception + attributes.passive_perception_bonus;
return tot;
};
k.registerFuncs({calcPassive});/**
* Function to calculate the proficiency for the character
* @param {object} trigger - The trigger that caused the function to be called
* @param {object} attributes - The attribute values of the character
* @param {object[]} sections - All the repeating section IDs
* @param {object} casc - Expanded cascade object
*/
const calcProf = function({trigger,attributes,sections,casc}){
return 2 + Math.floor((attributes.character_level - 1)/4)
};
k.registerFuncs({calcProf});/**
* Calculates the amount of bulk currently carried based on the items entered in the equipment section.
* @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 calcBulk = function({trigger,attributes,sections,casc}){
const bulk = sections.repeating_equipment.reduce((total,id) => {
const row = `repeating_equipment_${id}`;
return total + attributes[`${row}_bulk`]*attributes[`${row}_quantity`];
},attributes.armor_bulk) +
sections.repeating_weapons.reduce((total,id) => {
const row = `repeating_weapons_${id}`;
return total + attributes[`${row}_item_bulk`];
},0);
return bulk;
};
k.registerFuncs({calcBulk});/**
* Calculates the maximum bulk that the character can carry
* @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 calcBulkMax = function({trigger,attributes,sections,casc}){
return 5 + attributes.strength_mod;
};
k.registerFuncs({calcBulkMax});/**
* Function that calculates the modifier for attack bonuses
* @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 calcAttackBonus = function ({ trigger, attributes, sections, casc }) {
const [section, rowID, attrName] = k.parseTriggerName(trigger.name);
const row = `${section}_${rowID}`;
if(attributes[`${row}_attack_disable`] && !attributes[`${row}_save_disable`]){
return calcSaveTotal(row,attributes,sections,casc);
}else if(!attributes[`${row}_attack_disable`]){
return calcAttackTotal(row,attributes,sections,casc);
}else{
return '';
}
};
k.registerFuncs({ calcAttackBonus });
const calcSaveTotal = (row,attributes,sections,casc) => {
const abiValue = attributes.sheet_type === 'vehicle' ?
0 :
evalAttrCall(attributes[`${row}_save_basis`],attributes);
const profValue = attributes.sheet_type === 'vehicle' || !attributes[`${row}_save_basis`] ?
0 :
evalAttrCall(attributes[`${row}_type`],attributes) * attributes.proficiency;
const bonusVal = evalAttrCall(attributes[`${row}_dc_bonus`],attributes)
const baseVal = attributes[`${row}_save_basis`] ?
8:
0;
const totVal = baseVal + abiValue + profValue + bonusVal;
attributes[`${row}_total_translation`] = 'DC';
return totVal;
};
const calcAttackTotal = (row,attributes,sections,casc) => {
const abiValue = attributes.sheet_type === 'vehicle' ?
0 :
evalAttrCall(attributes[`${row}_attack_ability`],attributes);
const profValue = attributes.sheet_type === 'vehicle' ?
0 :
evalAttrCall(attributes[`${row}_type`],attributes) * attributes.proficiency;
const bonusVal = evalAttrCall(attributes[`${row}_attack_bonus`],attributes)
const totValue = (
abiValue +
bonusVal +
profValue
);
attributes[`${row}_total_translation`] = 'total';
return totValue >= 0 ?
`+ ${totValue}` :
totValue;
};
const evalAttrCall = (call,attributes,defValue = 0) => {
if(typeof call !== 'string') return call || defValue;
const attrName = call.replace(/@\{|\}/g,'');
const attrVal = attributes[attrName];
if(typeof attrVal === 'string'){
attrVal.replace(/@\{.+?\}/g,(match,name) => {
return evalAttrCall(match,attributes,defValue);
});
}
return attrVal ?
eval(attrVal) :
defValue;
};/**
* Function that calculates the modifier for attack bonuses
* @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 calcAttackDamage = function ({ trigger, attributes, sections, casc }) {
const [section, rowID, attrName] = k.parseTriggerName(trigger.name);
const row = `${section}_${rowID}`;
if(attributes[`${row}_damage_1_disable`]) return '';
const damage1 = attributes[`${row}_damage_1`];
const ability = evalAttrCall(
attributes[`${row}_damage_ability_1`],
attributes
);
const abiAdd = (
attributes.sheet_type === "npc" ||
!attributes[`${row}_damage_ability_1`] ||
attributes.sheet_type === 'vehicle'
) ? "" : ` + ${ability}`;
const totalDamageVal = `${damage1}${abiAdd}`;
return totalDamageVal;
};
k.registerFuncs({ calcAttackDamage });
/**
* Calculates whether the weapon header should only show the name.
* @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 calcWeaponNameDisplay = function({trigger,attributes,sections,casc}){
const [section,rowID] = k.parseTriggerName(trigger.name);
const row = `${section}_${rowID}`;
return (
attributes[`${row}_attack_disable`] &&
attributes[`${row}_save_disable`] &&
attributes[`${row}_damage_1_disable`] ?
'' :
'display'
);
};
k.registerFuncs({calcWeaponNameDisplay});/**
* Function to roll death saves and apply the success/fail from the result.
* @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 rollDeath = async function({trigger,attributes,sections,casc}){
const bonus = attributes.death_save_bonus;
const proficiency = attributes.proficiency * attributes.death_save_proficiency;
const d20 = await (getD20(attributes));
const rollObj = {
title:'^{death save}',
roll: `[[${d20}${bonus || proficiency ? `+ ${bonus + proficiency}` : ''}]]`
};
const [roll,computeObj] = await executeRoll({rollObj});
finishRoll(roll.rollId);
if(roll.results.roll.dice[0] === 20){
attributes.death_success = 0;
attributes.death_fail = 0;
attributes.hp = attributes.hp <= 0 ?
1 :
attributes.hp;
}else if(roll.results.roll.result >= 10){
if(attributes.death_success < 3){
attributes.death_success += 1;
}
}else{
if(attributes.death_fail < 3){
attributes.death_fail += roll.results.roll.dice[0] === 1?
2 :
1;
}
}
attributes.set();
};
k.registerFuncs({rollDeath});/**
* Function that will roll hit dice for a player
* @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 rollHitDice = async function({trigger,attributes,sections,casc}){
const rollObj = {
title: '^{hit dice}',
roll: attributes.hit_dice > 0 ?
`[[1d${attributes.hit_dice_size} + @{constitution_mod}[${k.capitalize(getTranslationByKey('constitution abbreviation'))}]]]`:
`^{no dice available}`
};
const [roll, computeObj] = await executeRoll({rollObj});
finishRoll(roll.rollId);
const result = roll.results.roll ?
roll.results.roll.result :
0;
if(attributes.hit_dice > 0){
attributes.hit_dice--;
attributes.hp = Math.min(attributes.hp_max,attributes.hp + result);
}
attributes.set();
};
k.registerFuncs({rollHitDice});/**
* Function to roll initiative and send the result to the turn order.
* @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 rollInitiative = function({trigger,attributes,sections,casc}){
};
k.registerFuncs({rollInitiative});/**
* This function sets visibility of equipment proficiencies based on hiearchy
* stemming from Basic Equipment proficiency.
*
* @param {object} trigger
* @param {attributesProxy} attributes
* @param {object} sections
* @param {object} casc
*/
const profDisplay = function({trigger,attributes,sections,casc}){
['basic','advanced'].forEach(typ => {
const requireTarget = `.requires-${typ}`;
if(attributes[`proficiency_${typ}`]){
$20(requireTarget).removeClass('prof__visibility');
}else{
$20(requireTarget).addClass('prof__visibility');
}
});
// resets all proficiencies when basic proficiency is unchecked
if (!attributes['proficiency_basic']){
k.setAttrs({proficiency_advanced: 0});
k.setAttrs({proficiency_historical: 0});
k.setAttrs({proficiency_improvised: 0});
k.setAttrs({proficiency_military: 0});
$20('.requires-advanced').addClass('prof__visibility');
}
// resets military proficincy when Advanced is unchecked
if (!attributes['proficiency_advanced']) {
k.setAttrs({proficiency_military: 0});
$20('.requires-advanced').addClass('prof__visibility');
}
};
k.registerFuncs({profDisplay},{type:['opener']});/**
* Function that calculates the equipment proficiency bonus for the character
* @param {object} trigger - The trigger that caused the function to be called
* @param {object} attributes - The attribute values of the character
* @param {object[]} sections - All the repeating section IDs
* @param {object} casc - Expanded cascade object
*/
const calcBonus = function({trigger,attributes,sections,casc}){
const charLevel = attributes.character_level;
return 2 + (charLevel - 1) / 4; // formula for equipment proficiency bonus per level
};
k.registerFuncs({calcBonus});/**
* Rolls for weapon attacks
* @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 rollAttack = async function ({ trigger, attributes, sections, casc }) {
const [section, rowID] = k.parseTriggerName(trigger.name);
const row = `${section}_${rowID}`;
const rollObj = await assembleAttackObj(
row,
{
title: attributes[`${row}_name`],
type: attributes[`${row}_type`] ?
`^{${attributes[`${row}_type`].replace(/@\{|\}|proficiency_/g,'')}}` :
'^{not proficient}',
penetration: attributes[`${row}_penetration`],
range: attributes[`${row}_range`],
reload: attributes[`${row}_reload`],
rounds: attributes[`${row}_rounds`],
properties: attributes[`${row}_properties`],
},
attributes,
sections
);
if(/action/i.test(section)){
rollObj.description = attributes[`${row}_description`];
}
if(attributes.sheet_type === 'npc'){
delete rollObj.type;
}
const [roll, compteObj] = await executeRoll({ rollObj });
finishRoll(roll.rollId);
};
k.registerFuncs({ rollAttack });
const modes = ['view','edit'];
/**
* Toggles the display of edit/view modes of the NPC sheet and adjust the display mode attribute.
* @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 toggleEditDisplay = function({trigger,attributes,sections,casc}){
const inactiveMode = modes.find(m => m!== attributes.statblock_view_mode);
attributes.statblock_view_mode = inactiveMode;
displayNPCMode({attributes});
};
k.registerFuncs({toggleEditDisplay});
/**
* Actually triggers the display of the NPC modes
* @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 displayNPCMode = function({trigger,attributes,sections,casc}){
const inactiveMode = modes.find(m => m!== attributes.statblock_view_mode);
$20(`.statblock__${inactiveMode}`).removeClass('disabled');
$20(`.statblock__${attributes.statblock_view_mode}`).addClass('disabled');
};
k.registerFuncs({displayNPCMode},{type:['opener']});/**
* Calculates the NPC's hp based on the hit dice entered. If the hit dice cannot be parsed, returns undefined (k-scaffold will not set the attribute);
* @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 calcNPCHP = function({trigger,attributes,sections,casc}){
if(attributes.sheet_type !== 'npc') return undefined;
if(attributes.hit_dice_expression === '') return 0;
try{
let [,dieNum=0,dieSize=0,mod=0] = /^(?:\s*(\d+)d(\d+)\s*)?(?:([\-\+]\s*\d+)\s*)?$/.exec(attributes.hit_dice_expression);
mod = mod.replace(/\s/g,'').replace(/\+(\d+)/,'$1') * 1;
const hp = Math.floor(dieNum * ((dieSize*1 + 1) / 2) + mod);
attributes.hp_max = hp;
return hp;
}catch(err){
// return undefined if not a valid hit die
return;
}
};
k.registerFuncs({calcNPCHP});/**
* Controls the display of each statblock row that should only be displayed if there is relevant information in them.
* @param {object} trigger - The trigger that caused the function to be called
* @param {object} attributes - The attribute values of the character
* @param {object[]} sections - All the repeating section IDs
* @param {object} casc - Expanded cascade object
*/
const controlNPCViewRows = function({trigger,attributes,sections,casc}){
if(attributes.sheet_type !== 'npc') return;
const [targ,checkArray] = Object.entries(statblockRowControls).find(([key,arr]) => arr.includes(trigger.name));
const isActive = checkArray.some(attrName => attributes.updates.hasOwnProperty(attrName) ?
attributes.updates[attrName] !== '' :
attributes.attributes[attrName] !== '');
const action = isActive ?
'removeClass' :
'addClass';
$20(`.statblock__${targ}`)[action]('disabled--row');
};
k.registerFuncs({controlNPCViewRows});
/**
* Runs at sheet open to setup the display of conditionally active statblock rows.
* @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 statblockRowSetup = function({trigger,attributes,sections,casc}){
if(attributes.sheet_type !== 'npc') return;
Object.values(statblockRowControls).forEach(arr => {
controlNPCViewRows({trigger:{name:arr[0]},attributes,sections,casc});
});
};
k.registerFuncs({statblockRowSetup},{type:['opener']});/**
* Sets the npc plan/genius/trick checkbox displays
* @param {object} trigger - The trigger that caused the function to be called
* @param {object} attributes - The attribute values of the character
* @param {object[]} sections - All the repeating section IDs
* @param {object} casc - Expanded cascade object
*/
const calcNPCPlanCheckbox = function({trigger,attributes,sections,casc}){
const checkType = trigger.name.replace(/npc_not_/,'');
return attributes[`${checkType}_level`] ?
0 :
1;
};
k.registerFuncs({calcNPCPlanCheckbox});
/**
* Applies the damage modifications for vehicle checks.
* @param {string} d20 - the current d20 expression
* @param {string} attrName - The name of the attribute to calculate
* @param {attributesProxy} attributes - The K-scaffold attributes object
* @returns {string} - The completed d20.
*/
const applyDamageMods = (d20,damageAttr,attributes) => {
let mod = attributes[damageAttr] ?
` - 2[${k.capitalize(getTranslationByKey('damage'))}]` :
'';
return `${d20}${mod}`;
};/**
* Rolls vehicle contests using a designated driver character to get the vehicle skill mod.
* @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 rollVehicleContest = async function({trigger,attributes,sections,casc}){
const [section,rowID,buttonName] = k.parseTriggerName(trigger.name);
const contestName = buttonName.replace(/-action/,'').replace(/-/g,'_').replace(/vehicle_/,'');
const attrLookup = {
speed:'strength_mod',
maneuverability:'dexterity_mod'
};
const attrName = attrLookup[contestName];
const attrForTrans = attrName
.replace(/_mod/,'')
.replace(/-|_/g,' ');
let d20 = await (getD20(attributes));
const driverID = sections.repeating_crew.find(id => attributes[`repeating_crew_${id}_position`] === 'driver');
const driverName = attributes[`repeating_crew_${driverID}_name`]
const driverCall = attrName !== 'consitution_mod' &&driverID ?
` + @{${driverName}|vehicles}[${k.capitalize(getTranslationByKey('vehicles'))}]` :
'';
const rollObj = {
roll:`[[${d20}${driverCall} + @{${attrName}}[${k.capitalize(getTranslationByKey(attrForTrans))}]]]`,
title: `^{${contestName} contest}`
};
const [roll,computeObj] = await executeRoll({rollObj});
finishRoll(roll.rollId);
};
k.registerFuncs({rollVehicleContest});/**
* Calculates the vehicle damage taking into account the blown tires status
* @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 calcVehicleDamage = function({trigger,attributes,sections,casc}){
return attributes.blown_tires ?
Math.min(attributes[trigger.name] + 2,3) :
Math.max(0,attributes[trigger.name] - 2);
};
k.registerFuncs({calcVehicleDamage});
/**
* Filters the navigation buttons that are displayed based on the selected character type.
* @param {object} attributes - The attribute values of the character
*/
const filterNav = function({attributes}){
const validButtons = ['settings',...sheetTypes[attributes.sheet_type]];
const notString = validButtons.map(button =>
`.tabs--everyday__button--${button}`
).join(',');
$20('.tabs--everyday__button').addClass('disabled');
$20(notString).removeClass('disabled');
};
k.registerFuncs({filterNav},{type:['opener']});
</script>