mirror of
https://github.com/Nighthawk42/roll20-character-sheets.git
synced 2026-08-30 03:40:32 +00:00
6138 lines
422 KiB
HTML
6138 lines
422 KiB
HTML
|
|
<input name="attr_debug_mode" value="1" type="hidden" title="@{debug_mode}"/>
|
|
<input name="attr_character_level" value="0" type="hidden" title="@{character_level}"/>
|
|
<input name="attr_strength_bonus" value="0" type="hidden" title="@{strength_bonus}"/>
|
|
<input name="attr_strength_save_bonus" value="0" type="hidden" title="@{strength_save_bonus}"/>
|
|
<input name="attr_dexterity_bonus" value="0" type="hidden" title="@{dexterity_bonus}"/>
|
|
<input name="attr_dexterity_save_bonus" value="0" type="hidden" title="@{dexterity_save_bonus}"/>
|
|
<input name="attr_constitution_bonus" value="0" type="hidden" title="@{constitution_bonus}"/>
|
|
<input name="attr_constitution_save_bonus" value="0" type="hidden" title="@{constitution_save_bonus}"/>
|
|
<input name="attr_intelligence_bonus" value="0" type="hidden" title="@{intelligence_bonus}"/>
|
|
<input name="attr_intelligence_save_bonus" value="0" type="hidden" title="@{intelligence_save_bonus}"/>
|
|
<input name="attr_wisdom_bonus" value="0" type="hidden" title="@{wisdom_bonus}"/>
|
|
<input name="attr_wisdom_save_bonus" value="0" type="hidden" title="@{wisdom_save_bonus}"/>
|
|
<input name="attr_charisma_bonus" value="0" type="hidden" title="@{charisma_bonus}"/>
|
|
<input name="attr_charisma_save_bonus" value="0" type="hidden" title="@{charisma_save_bonus}"/>
|
|
<input name="attr_athletics_bonus" value="0" type="hidden" title="@{athletics_bonus}"/>
|
|
<input name="attr_acrobatics_bonus" value="0" type="hidden" title="@{acrobatics_bonus}"/>
|
|
<input name="attr_drive_bonus" value="0" type="hidden" title="@{drive_bonus}"/>
|
|
<input name="attr_sleight_of_hand_bonus" value="0" type="hidden" title="@{sleight_of_hand_bonus}"/>
|
|
<input name="attr_stealth_bonus" value="0" type="hidden" title="@{stealth_bonus}"/>
|
|
<input name="attr_bureaucracy_bonus" value="0" type="hidden" title="@{bureaucracy_bonus}"/>
|
|
<input name="attr_computers_bonus" value="0" type="hidden" title="@{computers_bonus}"/>
|
|
<input name="attr_investigation_bonus" value="0" type="hidden" title="@{investigation_bonus}"/>
|
|
<input name="attr_life_science_bonus" value="0" type="hidden" title="@{life_science_bonus}"/>
|
|
<input name="attr_mechanics_bonus" value="0" type="hidden" title="@{mechanics_bonus}"/>
|
|
<input name="attr_physical_science_bonus" value="0" type="hidden" title="@{physical_science_bonus}"/>
|
|
<input name="attr_social_science_bonus" value="0" type="hidden" title="@{social_science_bonus}"/>
|
|
<input name="attr_streetwise_bonus" value="0" type="hidden" title="@{streetwise_bonus}"/>
|
|
<input name="attr_insight_bonus" value="0" type="hidden" title="@{insight_bonus}"/>
|
|
<input name="attr_perception_bonus" value="0" type="hidden" title="@{perception_bonus}"/>
|
|
<input name="attr_survival_bonus" value="0" type="hidden" title="@{survival_bonus}"/>
|
|
<input name="attr_deception_bonus" value="0" type="hidden" title="@{deception_bonus}"/>
|
|
<input name="attr_intimidation_bonus" value="0" type="hidden" title="@{intimidation_bonus}"/>
|
|
<input name="attr_performance_bonus" value="0" type="hidden" title="@{performance_bonus}"/>
|
|
<input name="attr_persuasion_bonus" value="0" type="hidden" title="@{persuasion_bonus}"/>
|
|
<input name="attr_passive_perception" value="10" type="hidden" title="@{passive_perception}"/>
|
|
<input name="attr_passive_insight" value="10" type="hidden" title="@{passive_insight}"/>
|
|
<input name="attr_sheet_version" type="hidden" title="@{sheet_version}"/>
|
|
<input name="attr_template_start" value="@{whisper_state} &{template:general} @{show_character_name}" type="hidden" title="@{template_start}"/>
|
|
<div class="whole compendium-drop-target npcs">
|
|
<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}"/>
|
|
<input class="master-display-controller" name="attr_master_display_controller" value="character_type:pc | sheet_view:core | advantage_state:1d20" type="hidden" title="@{master_display_controller}"/>
|
|
<div class="pc" id="pc">
|
|
<header>
|
|
<div class="name-logo-container"><img class="genefunk-logo" src="https://github.com/Roll20/roll20-character-sheets/blob/master/Genefunk%202090/Images/Gene%20Funk%20Logo.png?raw=true"/>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="character name">character name</span>
|
|
<input type="text" name="attr_character_name" title="@{character_name}"/>
|
|
</div>
|
|
</div>
|
|
<div class="character-basic-container">
|
|
<div class="input-label-container"><span class="input-label" data-i18n="class and level">class and level</span>
|
|
<input type="text" name="attr_class_level" title="@{class_level}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="genome">genome</span>
|
|
<input type="text" name="attr_genome" title="@{genome}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="cadre">cadre</span>
|
|
<input type="text" name="attr_cadre" title="@{cadre}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="experience points">experience points</span>
|
|
<input type="text" name="attr_experience_points" title="@{experience_points}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="backgrounds">backgrounds</span>
|
|
<input type="text" name="attr_backgrounds" title="@{backgrounds}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="appearance">appearance</span>
|
|
<input type="text" name="attr_appearance" title="@{appearance}"/>
|
|
</div>
|
|
</div>
|
|
<div class="toggles">
|
|
<div class="toggle-row">
|
|
<div class="bordered-checkbox core">
|
|
<input class="core" type="checkbox" value="core" name="attr_sheet_view" checked="" title="@{sheet_view}"/><span class="core" data-i18n="core"></span>
|
|
</div>
|
|
<div class="bordered-checkbox hacks">
|
|
<input class="hacks" type="checkbox" value="hacks" name="attr_sheet_view" title="@{sheet_view}"/><span class="hacks" data-i18n="hacks"></span>
|
|
</div>
|
|
<div class="bordered-checkbox settings">
|
|
<input class="settings" type="checkbox" value="settings" name="attr_sheet_view" title="@{sheet_view}"/><span class="settings pictos" contents="y">y</span>
|
|
</div>
|
|
</div>
|
|
<div class="toggle-row">
|
|
<div class="bordered-checkbox advantage">
|
|
<input class="advantage" type="checkbox" value="2d20kh1" name="attr_advantage_state" title="@{advantage_state}"/><span class="advantage" data-i18n="advantage"></span>
|
|
</div>
|
|
<div class="bordered-checkbox normal">
|
|
<input class="normal" type="checkbox" value="1d20" name="attr_advantage_state" checked="checked" title="@{advantage_state}"/><span class="normal" data-i18n="normal"></span>
|
|
</div>
|
|
<div class="bordered-checkbox disadvantage">
|
|
<input class="disadvantage" type="checkbox" value="2d20kl1" name="attr_advantage_state" title="@{advantage_state}"/><span class="disadvantage" data-i18n="disadvantage"></span>
|
|
</div>
|
|
<div class="bordered-checkbox query">
|
|
<input class="query" type="checkbox" value="?{Advantage|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}" name="attr_advantage_state" title="@{advantage_state}"/><span class="query" data-i18n="query"></span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</header>
|
|
<div class="core">
|
|
<div class="ability-skill-container">
|
|
<div class="ability-scores-container" data-i18n-aria-label="ability scores"><img class="helix-image" src="https://github.com/Roll20/roll20-character-sheets/blob/master/Genefunk%202090/Images/Helix.png?raw=true"/>
|
|
<!-- ability -->
|
|
<div class="attribute-container">
|
|
<input name="attr_strength_misc" value="" type="hidden" title="@{strength_misc}"/>
|
|
<button class="h3 roller" data-i18n="strength abbreviation" name="roll_strength" value="@{strength_action}" title="%{strength}" type="roll">
|
|
</button>
|
|
<button name="act_strength-action" hidden="" type="action" title="%{strength-action}">
|
|
</button>
|
|
<input name="attr_strength_action" type="hidden" title="@{strength_action}"/><span class="score-label" data-i18n="score">score</span>
|
|
<div class="strength calc-container score">
|
|
<input class="base-value" name="attr_base_strength" value="10" type="number" title="@{base_strength}"/>
|
|
<input class="mod-value hidden" name="attr_strength" readonly="true" value="10" type="number" title="@{strength}"/>
|
|
<input class="mod-control" name="attr_strength_modded" type="hidden" title="@{strength_modded}"/><span class="mod-value" name="attr_strength" title="@{strength}">10</span>
|
|
</div><span class="mod-label" data-i18n="mod">mod</span>
|
|
<div class="plus-containerstrength mod">
|
|
<input class="mod-control" name="attr_strength_mod_modded" value="" type="hidden" title="@{strength_mod_modded}"/>
|
|
<input class="plus-control hidden" name="attr_strength_mod" value="0" min="0" type="number" title="@{strength_mod}"/><span class="plus-displaystrength mod" name="attr_strength_mod" title="@{strength_mod}">0</span>
|
|
</div>
|
|
<button class="save-label roller" name="roll_strength_save" data-i18n="save" value="@{strength_save_action}" title="%{strength_save}" type="roll">save
|
|
</button>
|
|
<button name="act_strength-save-action" hidden="" type="action" title="%{strength-save-action}">
|
|
</button>
|
|
<input name="attr_strength_save_action" type="hidden" title="@{strength_save_action}"/>
|
|
<div class="save-label background"></div>
|
|
<label class="checkbox-container strength proficiency">
|
|
<input name="attr_strength_save_proficiency" value="@{proficiency}" type="checkbox" title="@{strength_save_proficiency}"/><span class="hexagon"></span>
|
|
</label><span class="check-label proficiency" data-i18n="proficiency abbreviation">prof</span>
|
|
<div class="plus-containerstrength save">
|
|
<input class="mod-control" name="attr_strength_save_modded" value="" type="hidden" title="@{strength_save_modded}"/>
|
|
<input class="plus-control hidden" name="attr_strength_save" value="0" min="0" type="number" title="@{strength_save}"/><span class="plus-displaystrength save" name="attr_strength_save" title="@{strength_save}">0</span>
|
|
</div>
|
|
</div>
|
|
<!-- ability -->
|
|
<div class="attribute-container">
|
|
<input name="attr_dexterity_misc" value="" type="hidden" title="@{dexterity_misc}"/>
|
|
<button class="h3 roller" data-i18n="dexterity abbreviation" name="roll_dexterity" value="@{dexterity_action}" title="%{dexterity}" type="roll">
|
|
</button>
|
|
<button name="act_dexterity-action" hidden="" type="action" title="%{dexterity-action}">
|
|
</button>
|
|
<input name="attr_dexterity_action" type="hidden" title="@{dexterity_action}"/><span class="score-label" data-i18n="score">score</span>
|
|
<div class="dexterity calc-container score">
|
|
<input class="base-value" name="attr_base_dexterity" value="10" type="number" title="@{base_dexterity}"/>
|
|
<input class="mod-value hidden" name="attr_dexterity" readonly="true" value="10" type="number" title="@{dexterity}"/>
|
|
<input class="mod-control" name="attr_dexterity_modded" type="hidden" title="@{dexterity_modded}"/><span class="mod-value" name="attr_dexterity" title="@{dexterity}">10</span>
|
|
</div><span class="mod-label" data-i18n="mod">mod</span>
|
|
<div class="plus-containerdexterity mod">
|
|
<input class="mod-control" name="attr_dexterity_mod_modded" value="" type="hidden" title="@{dexterity_mod_modded}"/>
|
|
<input class="plus-control hidden" name="attr_dexterity_mod" value="0" min="0" type="number" title="@{dexterity_mod}"/><span class="plus-displaydexterity mod" name="attr_dexterity_mod" title="@{dexterity_mod}">0</span>
|
|
</div>
|
|
<button class="save-label roller" name="roll_dexterity_save" data-i18n="save" value="@{dexterity_save_action}" title="%{dexterity_save}" type="roll">save
|
|
</button>
|
|
<button name="act_dexterity-save-action" hidden="" type="action" title="%{dexterity-save-action}">
|
|
</button>
|
|
<input name="attr_dexterity_save_action" type="hidden" title="@{dexterity_save_action}"/>
|
|
<div class="save-label background"></div>
|
|
<label class="checkbox-container dexterity proficiency">
|
|
<input name="attr_dexterity_save_proficiency" value="@{proficiency}" type="checkbox" title="@{dexterity_save_proficiency}"/><span class="hexagon"></span>
|
|
</label><span class="check-label proficiency" data-i18n="proficiency abbreviation">prof</span>
|
|
<div class="plus-containerdexterity save">
|
|
<input class="mod-control" name="attr_dexterity_save_modded" value="" type="hidden" title="@{dexterity_save_modded}"/>
|
|
<input class="plus-control hidden" name="attr_dexterity_save" value="0" min="0" type="number" title="@{dexterity_save}"/><span class="plus-displaydexterity save" name="attr_dexterity_save" title="@{dexterity_save}">0</span>
|
|
</div>
|
|
</div>
|
|
<!-- ability -->
|
|
<div class="attribute-container">
|
|
<input name="attr_constitution_misc" value="" type="hidden" title="@{constitution_misc}"/>
|
|
<button class="h3 roller" data-i18n="constitution abbreviation" name="roll_constitution" value="@{constitution_action}" title="%{constitution}" type="roll">
|
|
</button>
|
|
<button name="act_constitution-action" hidden="" type="action" title="%{constitution-action}">
|
|
</button>
|
|
<input name="attr_constitution_action" type="hidden" title="@{constitution_action}"/><span class="score-label" data-i18n="score">score</span>
|
|
<div class="constitution calc-container score">
|
|
<input class="base-value" name="attr_base_constitution" value="10" type="number" title="@{base_constitution}"/>
|
|
<input class="mod-value hidden" name="attr_constitution" readonly="true" value="10" type="number" title="@{constitution}"/>
|
|
<input class="mod-control" name="attr_constitution_modded" type="hidden" title="@{constitution_modded}"/><span class="mod-value" name="attr_constitution" title="@{constitution}">10</span>
|
|
</div><span class="mod-label" data-i18n="mod">mod</span>
|
|
<div class="plus-containerconstitution mod">
|
|
<input class="mod-control" name="attr_constitution_mod_modded" value="" type="hidden" title="@{constitution_mod_modded}"/>
|
|
<input class="plus-control hidden" name="attr_constitution_mod" value="0" min="0" type="number" title="@{constitution_mod}"/><span class="plus-displayconstitution mod" name="attr_constitution_mod" title="@{constitution_mod}">0</span>
|
|
</div>
|
|
<button class="save-label roller" name="roll_constitution_save" data-i18n="save" value="@{constitution_save_action}" title="%{constitution_save}" type="roll">save
|
|
</button>
|
|
<button name="act_constitution-save-action" hidden="" type="action" title="%{constitution-save-action}">
|
|
</button>
|
|
<input name="attr_constitution_save_action" type="hidden" title="@{constitution_save_action}"/>
|
|
<div class="save-label background"></div>
|
|
<label class="checkbox-container constitution proficiency">
|
|
<input name="attr_constitution_save_proficiency" value="@{proficiency}" type="checkbox" title="@{constitution_save_proficiency}"/><span class="hexagon"></span>
|
|
</label><span class="check-label proficiency" data-i18n="proficiency abbreviation">prof</span>
|
|
<div class="plus-containerconstitution save">
|
|
<input class="mod-control" name="attr_constitution_save_modded" value="" type="hidden" title="@{constitution_save_modded}"/>
|
|
<input class="plus-control hidden" name="attr_constitution_save" value="0" min="0" type="number" title="@{constitution_save}"/><span class="plus-displayconstitution save" name="attr_constitution_save" title="@{constitution_save}">0</span>
|
|
</div>
|
|
</div>
|
|
<!-- ability -->
|
|
<div class="attribute-container">
|
|
<input name="attr_intelligence_misc" value="" type="hidden" title="@{intelligence_misc}"/>
|
|
<button class="h3 roller" data-i18n="intelligence abbreviation" name="roll_intelligence" value="@{intelligence_action}" title="%{intelligence}" type="roll">
|
|
</button>
|
|
<button name="act_intelligence-action" hidden="" type="action" title="%{intelligence-action}">
|
|
</button>
|
|
<input name="attr_intelligence_action" type="hidden" title="@{intelligence_action}"/><span class="score-label" data-i18n="score">score</span>
|
|
<div class="intelligence calc-container score">
|
|
<input class="base-value" name="attr_base_intelligence" value="10" type="number" title="@{base_intelligence}"/>
|
|
<input class="mod-value hidden" name="attr_intelligence" readonly="true" value="10" type="number" title="@{intelligence}"/>
|
|
<input class="mod-control" name="attr_intelligence_modded" type="hidden" title="@{intelligence_modded}"/><span class="mod-value" name="attr_intelligence" title="@{intelligence}">10</span>
|
|
</div><span class="mod-label" data-i18n="mod">mod</span>
|
|
<div class="plus-containerintelligence mod">
|
|
<input class="mod-control" name="attr_intelligence_mod_modded" value="" type="hidden" title="@{intelligence_mod_modded}"/>
|
|
<input class="plus-control hidden" name="attr_intelligence_mod" value="0" min="0" type="number" title="@{intelligence_mod}"/><span class="plus-displayintelligence mod" name="attr_intelligence_mod" title="@{intelligence_mod}">0</span>
|
|
</div>
|
|
<button class="save-label roller" name="roll_intelligence_save" data-i18n="save" value="@{intelligence_save_action}" title="%{intelligence_save}" type="roll">save
|
|
</button>
|
|
<button name="act_intelligence-save-action" hidden="" type="action" title="%{intelligence-save-action}">
|
|
</button>
|
|
<input name="attr_intelligence_save_action" type="hidden" title="@{intelligence_save_action}"/>
|
|
<div class="save-label background"></div>
|
|
<label class="checkbox-container intelligence proficiency">
|
|
<input name="attr_intelligence_save_proficiency" value="@{proficiency}" type="checkbox" title="@{intelligence_save_proficiency}"/><span class="hexagon"></span>
|
|
</label><span class="check-label proficiency" data-i18n="proficiency abbreviation">prof</span>
|
|
<div class="plus-containerintelligence save">
|
|
<input class="mod-control" name="attr_intelligence_save_modded" value="" type="hidden" title="@{intelligence_save_modded}"/>
|
|
<input class="plus-control hidden" name="attr_intelligence_save" value="0" min="0" type="number" title="@{intelligence_save}"/><span class="plus-displayintelligence save" name="attr_intelligence_save" title="@{intelligence_save}">0</span>
|
|
</div>
|
|
</div>
|
|
<!-- ability -->
|
|
<div class="attribute-container">
|
|
<input name="attr_wisdom_misc" value="" type="hidden" title="@{wisdom_misc}"/>
|
|
<button class="h3 roller" data-i18n="wisdom abbreviation" name="roll_wisdom" value="@{wisdom_action}" title="%{wisdom}" type="roll">
|
|
</button>
|
|
<button name="act_wisdom-action" hidden="" type="action" title="%{wisdom-action}">
|
|
</button>
|
|
<input name="attr_wisdom_action" type="hidden" title="@{wisdom_action}"/><span class="score-label" data-i18n="score">score</span>
|
|
<div class="wisdom calc-container score">
|
|
<input class="base-value" name="attr_base_wisdom" value="10" type="number" title="@{base_wisdom}"/>
|
|
<input class="mod-value hidden" name="attr_wisdom" readonly="true" value="10" type="number" title="@{wisdom}"/>
|
|
<input class="mod-control" name="attr_wisdom_modded" type="hidden" title="@{wisdom_modded}"/><span class="mod-value" name="attr_wisdom" title="@{wisdom}">10</span>
|
|
</div><span class="mod-label" data-i18n="mod">mod</span>
|
|
<div class="plus-containerwisdom mod">
|
|
<input class="mod-control" name="attr_wisdom_mod_modded" value="" type="hidden" title="@{wisdom_mod_modded}"/>
|
|
<input class="plus-control hidden" name="attr_wisdom_mod" value="0" min="0" type="number" title="@{wisdom_mod}"/><span class="plus-displaywisdom mod" name="attr_wisdom_mod" title="@{wisdom_mod}">0</span>
|
|
</div>
|
|
<button class="save-label roller" name="roll_wisdom_save" data-i18n="save" value="@{wisdom_save_action}" title="%{wisdom_save}" type="roll">save
|
|
</button>
|
|
<button name="act_wisdom-save-action" hidden="" type="action" title="%{wisdom-save-action}">
|
|
</button>
|
|
<input name="attr_wisdom_save_action" type="hidden" title="@{wisdom_save_action}"/>
|
|
<div class="save-label background"></div>
|
|
<label class="checkbox-container wisdom proficiency">
|
|
<input name="attr_wisdom_save_proficiency" value="@{proficiency}" type="checkbox" title="@{wisdom_save_proficiency}"/><span class="hexagon"></span>
|
|
</label><span class="check-label proficiency" data-i18n="proficiency abbreviation">prof</span>
|
|
<div class="plus-containerwisdom save">
|
|
<input class="mod-control" name="attr_wisdom_save_modded" value="" type="hidden" title="@{wisdom_save_modded}"/>
|
|
<input class="plus-control hidden" name="attr_wisdom_save" value="0" min="0" type="number" title="@{wisdom_save}"/><span class="plus-displaywisdom save" name="attr_wisdom_save" title="@{wisdom_save}">0</span>
|
|
</div>
|
|
</div>
|
|
<!-- ability -->
|
|
<div class="attribute-container">
|
|
<input name="attr_charisma_misc" value="" type="hidden" title="@{charisma_misc}"/>
|
|
<button class="h3 roller" data-i18n="charisma abbreviation" name="roll_charisma" value="@{charisma_action}" title="%{charisma}" type="roll">
|
|
</button>
|
|
<button name="act_charisma-action" hidden="" type="action" title="%{charisma-action}">
|
|
</button>
|
|
<input name="attr_charisma_action" type="hidden" title="@{charisma_action}"/><span class="score-label" data-i18n="score">score</span>
|
|
<div class="charisma calc-container score">
|
|
<input class="base-value" name="attr_base_charisma" value="10" type="number" title="@{base_charisma}"/>
|
|
<input class="mod-value hidden" name="attr_charisma" readonly="true" value="10" type="number" title="@{charisma}"/>
|
|
<input class="mod-control" name="attr_charisma_modded" type="hidden" title="@{charisma_modded}"/><span class="mod-value" name="attr_charisma" title="@{charisma}">10</span>
|
|
</div><span class="mod-label" data-i18n="mod">mod</span>
|
|
<div class="plus-containercharisma mod">
|
|
<input class="mod-control" name="attr_charisma_mod_modded" value="" type="hidden" title="@{charisma_mod_modded}"/>
|
|
<input class="plus-control hidden" name="attr_charisma_mod" value="0" min="0" type="number" title="@{charisma_mod}"/><span class="plus-displaycharisma mod" name="attr_charisma_mod" title="@{charisma_mod}">0</span>
|
|
</div>
|
|
<button class="save-label roller" name="roll_charisma_save" data-i18n="save" value="@{charisma_save_action}" title="%{charisma_save}" type="roll">save
|
|
</button>
|
|
<button name="act_charisma-save-action" hidden="" type="action" title="%{charisma-save-action}">
|
|
</button>
|
|
<input name="attr_charisma_save_action" type="hidden" title="@{charisma_save_action}"/>
|
|
<div class="save-label background"></div>
|
|
<label class="checkbox-container charisma proficiency">
|
|
<input name="attr_charisma_save_proficiency" value="@{proficiency}" type="checkbox" title="@{charisma_save_proficiency}"/><span class="hexagon"></span>
|
|
</label><span class="check-label proficiency" data-i18n="proficiency abbreviation">prof</span>
|
|
<div class="plus-containercharisma save">
|
|
<input class="mod-control" name="attr_charisma_save_modded" value="" type="hidden" title="@{charisma_save_modded}"/>
|
|
<input class="plus-control hidden" name="attr_charisma_save" value="0" min="0" type="number" title="@{charisma_save}"/><span class="plus-displaycharisma save" name="attr_charisma_save" title="@{charisma_save}">0</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="right-column" data-i18n-aria-label="skills">
|
|
<div class="hexagon-label-container">
|
|
<div class="true-hexagon polygon locked">
|
|
<div class="plus-container">
|
|
<input class="mod-control" name="attr_proficiency_modded" value="" type="hidden" title="@{proficiency_modded}"/>
|
|
<input class="plus-control hidden" name="attr_proficiency" value="2" min="0" type="number" title="@{proficiency}"/><span class="plus-display" name="attr_proficiency" title="@{proficiency}">2</span>
|
|
</div>
|
|
</div>
|
|
<div class="hexagon-label"><span data-i18n="proficiency bonus">proficiency bonus</span>
|
|
</div>
|
|
</div>
|
|
<div class="skills-container">
|
|
<h4 class="strength" data-i18n="strength skills">strength skills
|
|
</h4>
|
|
<div class="athletics expertise-check-label checkbox-container"><!--affects:["athletics"] -->
|
|
<input class="prof-control" name="attr_athletics_proficiency" value="0" type="hidden" title="@{athletics_proficiency}"/>
|
|
<div class="prof-display true-hexagon polygon">
|
|
<input class="untrained" name="attr_athletics_proficiency" value="0" checked="" type="radio" title="@{athletics_proficiency}"/>
|
|
<input class="proficiency" name="attr_athletics_proficiency" value="[[@{proficiency}]]" type="radio" title="@{athletics_proficiency}"/>
|
|
</div>
|
|
<div class="expertise-display true-pentagon polygon">
|
|
<input class="expertise" name="attr_athletics_proficiency" value="[[2*@{proficiency}]]" type="radio" title="@{athletics_proficiency}"/>
|
|
<input class="proficiency" name="attr_athletics_proficiency" value="[[@{proficiency}]]" type="radio" title="@{athletics_proficiency}"/>
|
|
</div><span class="check-label proficiency" data-i18n="proficiency abbreviation">prof</span><span class="check-label expertise" data-i18n="expertise abbreviation">exp</span>
|
|
</div>
|
|
<div class="plus-container">
|
|
<input class="mod-control" name="attr_athletics_modded" value="" type="hidden" title="@{athletics_modded}"/>
|
|
<input class="plus-control hidden" name="attr_athletics" value="0" min="0" type="number" title="@{athletics}"/><span class="plus-display" name="attr_athletics" title="@{athletics}">0</span>
|
|
</div>
|
|
<button class="athletics skill-label roller" name="roll_athletics" data-i18n="athletics" value="@{athletics_action}" title="%{athletics}" type="roll">
|
|
</button>
|
|
<button name="act_athletics-action" hidden="" type="action" title="%{athletics-action}">
|
|
</button>
|
|
<input name="attr_athletics_action" type="hidden" title="@{athletics_action}"/>
|
|
<h4 class="dexterity" data-i18n="dexterity skills">dexterity skills
|
|
</h4>
|
|
<div class="acrobatics expertise-check-label checkbox-container"><!--affects:["acrobatics"] -->
|
|
<input class="prof-control" name="attr_acrobatics_proficiency" value="0" type="hidden" title="@{acrobatics_proficiency}"/>
|
|
<div class="prof-display true-hexagon polygon">
|
|
<input class="untrained" name="attr_acrobatics_proficiency" value="0" checked="" type="radio" title="@{acrobatics_proficiency}"/>
|
|
<input class="proficiency" name="attr_acrobatics_proficiency" value="[[@{proficiency}]]" type="radio" title="@{acrobatics_proficiency}"/>
|
|
</div>
|
|
<div class="expertise-display true-pentagon polygon">
|
|
<input class="expertise" name="attr_acrobatics_proficiency" value="[[2*@{proficiency}]]" type="radio" title="@{acrobatics_proficiency}"/>
|
|
<input class="proficiency" name="attr_acrobatics_proficiency" value="[[@{proficiency}]]" type="radio" title="@{acrobatics_proficiency}"/>
|
|
</div>
|
|
</div>
|
|
<div class="plus-container">
|
|
<input class="mod-control" name="attr_acrobatics_modded" value="" type="hidden" title="@{acrobatics_modded}"/>
|
|
<input class="plus-control hidden" name="attr_acrobatics" value="0" min="0" type="number" title="@{acrobatics}"/><span class="plus-display" name="attr_acrobatics" title="@{acrobatics}">0</span>
|
|
</div>
|
|
<button class="acrobatics skill-label roller" name="roll_acrobatics" data-i18n="acrobatics" value="@{acrobatics_action}" title="%{acrobatics}" type="roll">
|
|
</button>
|
|
<button name="act_acrobatics-action" hidden="" type="action" title="%{acrobatics-action}">
|
|
</button>
|
|
<input name="attr_acrobatics_action" type="hidden" title="@{acrobatics_action}"/>
|
|
<div class="drive expertise-check-label checkbox-container"><!--affects:["drive"] -->
|
|
<input class="prof-control" name="attr_drive_proficiency" value="0" type="hidden" title="@{drive_proficiency}"/>
|
|
<div class="prof-display true-hexagon polygon">
|
|
<input class="untrained" name="attr_drive_proficiency" value="0" checked="" type="radio" title="@{drive_proficiency}"/>
|
|
<input class="proficiency" name="attr_drive_proficiency" value="[[@{proficiency}]]" type="radio" title="@{drive_proficiency}"/>
|
|
</div>
|
|
<div class="expertise-display true-pentagon polygon">
|
|
<input class="expertise" name="attr_drive_proficiency" value="[[2*@{proficiency}]]" type="radio" title="@{drive_proficiency}"/>
|
|
<input class="proficiency" name="attr_drive_proficiency" value="[[@{proficiency}]]" type="radio" title="@{drive_proficiency}"/>
|
|
</div>
|
|
</div>
|
|
<div class="plus-container">
|
|
<input class="mod-control" name="attr_drive_modded" value="" type="hidden" title="@{drive_modded}"/>
|
|
<input class="plus-control hidden" name="attr_drive" value="0" min="0" type="number" title="@{drive}"/><span class="plus-display" name="attr_drive" title="@{drive}">0</span>
|
|
</div>
|
|
<button class="drive skill-label roller" name="roll_drive" data-i18n="drive" value="@{drive_action}" title="%{drive}" type="roll">
|
|
</button>
|
|
<button name="act_drive-action" hidden="" type="action" title="%{drive-action}">
|
|
</button>
|
|
<input name="attr_drive_action" type="hidden" title="@{drive_action}"/>
|
|
<div class="sleight_of_hand expertise-check-label checkbox-container"><!--affects:["sleight_of_hand"] -->
|
|
<input class="prof-control" name="attr_sleight_of_hand_proficiency" value="0" type="hidden" title="@{sleight_of_hand_proficiency}"/>
|
|
<div class="prof-display true-hexagon polygon">
|
|
<input class="untrained" name="attr_sleight_of_hand_proficiency" value="0" checked="" type="radio" title="@{sleight_of_hand_proficiency}"/>
|
|
<input class="proficiency" name="attr_sleight_of_hand_proficiency" value="[[@{proficiency}]]" type="radio" title="@{sleight_of_hand_proficiency}"/>
|
|
</div>
|
|
<div class="expertise-display true-pentagon polygon">
|
|
<input class="expertise" name="attr_sleight_of_hand_proficiency" value="[[2*@{proficiency}]]" type="radio" title="@{sleight_of_hand_proficiency}"/>
|
|
<input class="proficiency" name="attr_sleight_of_hand_proficiency" value="[[@{proficiency}]]" type="radio" title="@{sleight_of_hand_proficiency}"/>
|
|
</div>
|
|
</div>
|
|
<div class="plus-container">
|
|
<input class="mod-control" name="attr_sleight_of_hand_modded" value="" type="hidden" title="@{sleight_of_hand_modded}"/>
|
|
<input class="plus-control hidden" name="attr_sleight_of_hand" value="0" min="0" type="number" title="@{sleight_of_hand}"/><span class="plus-display" name="attr_sleight_of_hand" title="@{sleight_of_hand}">0</span>
|
|
</div>
|
|
<button class="sleight_of_hand skill-label roller" name="roll_sleight_of_hand" data-i18n="sleight of hand" value="@{sleight_of_hand_action}" title="%{sleight_of_hand}" type="roll">
|
|
</button>
|
|
<button name="act_sleight-of-hand-action" hidden="" type="action" title="%{sleight-of-hand-action}">
|
|
</button>
|
|
<input name="attr_sleight_of_hand_action" type="hidden" title="@{sleight_of_hand_action}"/>
|
|
<div class="stealth expertise-check-label checkbox-container"><!--affects:["stealth"] -->
|
|
<input class="prof-control" name="attr_stealth_proficiency" value="0" type="hidden" title="@{stealth_proficiency}"/>
|
|
<div class="prof-display true-hexagon polygon">
|
|
<input class="untrained" name="attr_stealth_proficiency" value="0" checked="" type="radio" title="@{stealth_proficiency}"/>
|
|
<input class="proficiency" name="attr_stealth_proficiency" value="[[@{proficiency}]]" type="radio" title="@{stealth_proficiency}"/>
|
|
</div>
|
|
<div class="expertise-display true-pentagon polygon">
|
|
<input class="expertise" name="attr_stealth_proficiency" value="[[2*@{proficiency}]]" type="radio" title="@{stealth_proficiency}"/>
|
|
<input class="proficiency" name="attr_stealth_proficiency" value="[[@{proficiency}]]" type="radio" title="@{stealth_proficiency}"/>
|
|
</div>
|
|
</div>
|
|
<div class="plus-container">
|
|
<input class="mod-control" name="attr_stealth_modded" value="" type="hidden" title="@{stealth_modded}"/>
|
|
<input class="plus-control hidden" name="attr_stealth" value="0" min="0" type="number" title="@{stealth}"/><span class="plus-display" name="attr_stealth" title="@{stealth}">0</span>
|
|
</div>
|
|
<button class="stealth skill-label roller" name="roll_stealth" data-i18n="stealth" value="@{stealth_action}" title="%{stealth}" type="roll">
|
|
</button>
|
|
<button name="act_stealth-action" hidden="" type="action" title="%{stealth-action}">
|
|
</button>
|
|
<input name="attr_stealth_action" type="hidden" title="@{stealth_action}"/>
|
|
<h4 class="intelligence" data-i18n="intelligence skills">intelligence skills
|
|
</h4>
|
|
<div class="bureaucracy expertise-check-label checkbox-container"><!--affects:["bureaucracy"] -->
|
|
<input class="prof-control" name="attr_bureaucracy_proficiency" value="0" type="hidden" title="@{bureaucracy_proficiency}"/>
|
|
<div class="prof-display true-hexagon polygon">
|
|
<input class="untrained" name="attr_bureaucracy_proficiency" value="0" checked="" type="radio" title="@{bureaucracy_proficiency}"/>
|
|
<input class="proficiency" name="attr_bureaucracy_proficiency" value="[[@{proficiency}]]" type="radio" title="@{bureaucracy_proficiency}"/>
|
|
</div>
|
|
<div class="expertise-display true-pentagon polygon">
|
|
<input class="expertise" name="attr_bureaucracy_proficiency" value="[[2*@{proficiency}]]" type="radio" title="@{bureaucracy_proficiency}"/>
|
|
<input class="proficiency" name="attr_bureaucracy_proficiency" value="[[@{proficiency}]]" type="radio" title="@{bureaucracy_proficiency}"/>
|
|
</div>
|
|
</div>
|
|
<div class="plus-container">
|
|
<input class="mod-control" name="attr_bureaucracy_modded" value="" type="hidden" title="@{bureaucracy_modded}"/>
|
|
<input class="plus-control hidden" name="attr_bureaucracy" value="0" min="0" type="number" title="@{bureaucracy}"/><span class="plus-display" name="attr_bureaucracy" title="@{bureaucracy}">0</span>
|
|
</div>
|
|
<button class="bureaucracy skill-label roller" name="roll_bureaucracy" data-i18n="bureaucracy" value="@{bureaucracy_action}" title="%{bureaucracy}" type="roll">
|
|
</button>
|
|
<button name="act_bureaucracy-action" hidden="" type="action" title="%{bureaucracy-action}">
|
|
</button>
|
|
<input name="attr_bureaucracy_action" type="hidden" title="@{bureaucracy_action}"/>
|
|
<div class="computers expertise-check-label checkbox-container"><!--affects:["computers"] -->
|
|
<input class="prof-control" name="attr_computers_proficiency" value="0" type="hidden" title="@{computers_proficiency}"/>
|
|
<div class="prof-display true-hexagon polygon">
|
|
<input class="untrained" name="attr_computers_proficiency" value="0" checked="" type="radio" title="@{computers_proficiency}"/>
|
|
<input class="proficiency" name="attr_computers_proficiency" value="[[@{proficiency}]]" type="radio" title="@{computers_proficiency}"/>
|
|
</div>
|
|
<div class="expertise-display true-pentagon polygon">
|
|
<input class="expertise" name="attr_computers_proficiency" value="[[2*@{proficiency}]]" type="radio" title="@{computers_proficiency}"/>
|
|
<input class="proficiency" name="attr_computers_proficiency" value="[[@{proficiency}]]" type="radio" title="@{computers_proficiency}"/>
|
|
</div>
|
|
</div>
|
|
<div class="plus-container">
|
|
<input class="mod-control" name="attr_computers_modded" value="" type="hidden" title="@{computers_modded}"/>
|
|
<input class="plus-control hidden" name="attr_computers" value="0" min="0" type="number" title="@{computers}"/><span class="plus-display" name="attr_computers" title="@{computers}">0</span>
|
|
</div>
|
|
<button class="computers skill-label roller" name="roll_computers" data-i18n="computers" value="@{computers_action}" title="%{computers}" type="roll">
|
|
</button>
|
|
<button name="act_computers-action" hidden="" type="action" title="%{computers-action}">
|
|
</button>
|
|
<input name="attr_computers_action" type="hidden" title="@{computers_action}"/>
|
|
<div class="investigation expertise-check-label checkbox-container"><!--affects:["investigation"] -->
|
|
<input class="prof-control" name="attr_investigation_proficiency" value="0" type="hidden" title="@{investigation_proficiency}"/>
|
|
<div class="prof-display true-hexagon polygon">
|
|
<input class="untrained" name="attr_investigation_proficiency" value="0" checked="" type="radio" title="@{investigation_proficiency}"/>
|
|
<input class="proficiency" name="attr_investigation_proficiency" value="[[@{proficiency}]]" type="radio" title="@{investigation_proficiency}"/>
|
|
</div>
|
|
<div class="expertise-display true-pentagon polygon">
|
|
<input class="expertise" name="attr_investigation_proficiency" value="[[2*@{proficiency}]]" type="radio" title="@{investigation_proficiency}"/>
|
|
<input class="proficiency" name="attr_investigation_proficiency" value="[[@{proficiency}]]" type="radio" title="@{investigation_proficiency}"/>
|
|
</div>
|
|
</div>
|
|
<div class="plus-container">
|
|
<input class="mod-control" name="attr_investigation_modded" value="" type="hidden" title="@{investigation_modded}"/>
|
|
<input class="plus-control hidden" name="attr_investigation" value="0" min="0" type="number" title="@{investigation}"/><span class="plus-display" name="attr_investigation" title="@{investigation}">0</span>
|
|
</div>
|
|
<button class="investigation skill-label roller" name="roll_investigation" data-i18n="investigation" value="@{investigation_action}" title="%{investigation}" type="roll">
|
|
</button>
|
|
<button name="act_investigation-action" hidden="" type="action" title="%{investigation-action}">
|
|
</button>
|
|
<input name="attr_investigation_action" type="hidden" title="@{investigation_action}"/>
|
|
<div class="life_science expertise-check-label checkbox-container"><!--affects:["life_science"] -->
|
|
<input class="prof-control" name="attr_life_science_proficiency" value="0" type="hidden" title="@{life_science_proficiency}"/>
|
|
<div class="prof-display true-hexagon polygon">
|
|
<input class="untrained" name="attr_life_science_proficiency" value="0" checked="" type="radio" title="@{life_science_proficiency}"/>
|
|
<input class="proficiency" name="attr_life_science_proficiency" value="[[@{proficiency}]]" type="radio" title="@{life_science_proficiency}"/>
|
|
</div>
|
|
<div class="expertise-display true-pentagon polygon">
|
|
<input class="expertise" name="attr_life_science_proficiency" value="[[2*@{proficiency}]]" type="radio" title="@{life_science_proficiency}"/>
|
|
<input class="proficiency" name="attr_life_science_proficiency" value="[[@{proficiency}]]" type="radio" title="@{life_science_proficiency}"/>
|
|
</div>
|
|
</div>
|
|
<div class="plus-container">
|
|
<input class="mod-control" name="attr_life_science_modded" value="" type="hidden" title="@{life_science_modded}"/>
|
|
<input class="plus-control hidden" name="attr_life_science" value="0" min="0" type="number" title="@{life_science}"/><span class="plus-display" name="attr_life_science" title="@{life_science}">0</span>
|
|
</div>
|
|
<button class="life_science skill-label roller" name="roll_life_science" data-i18n="life science" value="@{life_science_action}" title="%{life_science}" type="roll">
|
|
</button>
|
|
<button name="act_life-science-action" hidden="" type="action" title="%{life-science-action}">
|
|
</button>
|
|
<input name="attr_life_science_action" type="hidden" title="@{life_science_action}"/>
|
|
<div class="mechanics expertise-check-label checkbox-container"><!--affects:["mechanics"] -->
|
|
<input class="prof-control" name="attr_mechanics_proficiency" value="0" type="hidden" title="@{mechanics_proficiency}"/>
|
|
<div class="prof-display true-hexagon polygon">
|
|
<input class="untrained" name="attr_mechanics_proficiency" value="0" checked="" type="radio" title="@{mechanics_proficiency}"/>
|
|
<input class="proficiency" name="attr_mechanics_proficiency" value="[[@{proficiency}]]" type="radio" title="@{mechanics_proficiency}"/>
|
|
</div>
|
|
<div class="expertise-display true-pentagon polygon">
|
|
<input class="expertise" name="attr_mechanics_proficiency" value="[[2*@{proficiency}]]" type="radio" title="@{mechanics_proficiency}"/>
|
|
<input class="proficiency" name="attr_mechanics_proficiency" value="[[@{proficiency}]]" type="radio" title="@{mechanics_proficiency}"/>
|
|
</div>
|
|
</div>
|
|
<div class="plus-container">
|
|
<input class="mod-control" name="attr_mechanics_modded" value="" type="hidden" title="@{mechanics_modded}"/>
|
|
<input class="plus-control hidden" name="attr_mechanics" value="0" min="0" type="number" title="@{mechanics}"/><span class="plus-display" name="attr_mechanics" title="@{mechanics}">0</span>
|
|
</div>
|
|
<button class="mechanics skill-label roller" name="roll_mechanics" data-i18n="mechanics" value="@{mechanics_action}" title="%{mechanics}" type="roll">
|
|
</button>
|
|
<button name="act_mechanics-action" hidden="" type="action" title="%{mechanics-action}">
|
|
</button>
|
|
<input name="attr_mechanics_action" type="hidden" title="@{mechanics_action}"/>
|
|
<div class="physical_science expertise-check-label checkbox-container"><!--affects:["physical_science"] -->
|
|
<input class="prof-control" name="attr_physical_science_proficiency" value="0" type="hidden" title="@{physical_science_proficiency}"/>
|
|
<div class="prof-display true-hexagon polygon">
|
|
<input class="untrained" name="attr_physical_science_proficiency" value="0" checked="" type="radio" title="@{physical_science_proficiency}"/>
|
|
<input class="proficiency" name="attr_physical_science_proficiency" value="[[@{proficiency}]]" type="radio" title="@{physical_science_proficiency}"/>
|
|
</div>
|
|
<div class="expertise-display true-pentagon polygon">
|
|
<input class="expertise" name="attr_physical_science_proficiency" value="[[2*@{proficiency}]]" type="radio" title="@{physical_science_proficiency}"/>
|
|
<input class="proficiency" name="attr_physical_science_proficiency" value="[[@{proficiency}]]" type="radio" title="@{physical_science_proficiency}"/>
|
|
</div>
|
|
</div>
|
|
<div class="plus-container">
|
|
<input class="mod-control" name="attr_physical_science_modded" value="" type="hidden" title="@{physical_science_modded}"/>
|
|
<input class="plus-control hidden" name="attr_physical_science" value="0" min="0" type="number" title="@{physical_science}"/><span class="plus-display" name="attr_physical_science" title="@{physical_science}">0</span>
|
|
</div>
|
|
<button class="physical_science skill-label roller" name="roll_physical_science" data-i18n="physical science" value="@{physical_science_action}" title="%{physical_science}" type="roll">
|
|
</button>
|
|
<button name="act_physical-science-action" hidden="" type="action" title="%{physical-science-action}">
|
|
</button>
|
|
<input name="attr_physical_science_action" type="hidden" title="@{physical_science_action}"/>
|
|
<div class="social_science expertise-check-label checkbox-container"><!--affects:["social_science"] -->
|
|
<input class="prof-control" name="attr_social_science_proficiency" value="0" type="hidden" title="@{social_science_proficiency}"/>
|
|
<div class="prof-display true-hexagon polygon">
|
|
<input class="untrained" name="attr_social_science_proficiency" value="0" checked="" type="radio" title="@{social_science_proficiency}"/>
|
|
<input class="proficiency" name="attr_social_science_proficiency" value="[[@{proficiency}]]" type="radio" title="@{social_science_proficiency}"/>
|
|
</div>
|
|
<div class="expertise-display true-pentagon polygon">
|
|
<input class="expertise" name="attr_social_science_proficiency" value="[[2*@{proficiency}]]" type="radio" title="@{social_science_proficiency}"/>
|
|
<input class="proficiency" name="attr_social_science_proficiency" value="[[@{proficiency}]]" type="radio" title="@{social_science_proficiency}"/>
|
|
</div>
|
|
</div>
|
|
<div class="plus-container">
|
|
<input class="mod-control" name="attr_social_science_modded" value="" type="hidden" title="@{social_science_modded}"/>
|
|
<input class="plus-control hidden" name="attr_social_science" value="0" min="0" type="number" title="@{social_science}"/><span class="plus-display" name="attr_social_science" title="@{social_science}">0</span>
|
|
</div>
|
|
<button class="social_science skill-label roller" name="roll_social_science" data-i18n="social science" value="@{social_science_action}" title="%{social_science}" type="roll">
|
|
</button>
|
|
<button name="act_social-science-action" hidden="" type="action" title="%{social-science-action}">
|
|
</button>
|
|
<input name="attr_social_science_action" type="hidden" title="@{social_science_action}"/>
|
|
<div class="streetwise expertise-check-label checkbox-container"><!--affects:["streetwise"] -->
|
|
<input class="prof-control" name="attr_streetwise_proficiency" value="0" type="hidden" title="@{streetwise_proficiency}"/>
|
|
<div class="prof-display true-hexagon polygon">
|
|
<input class="untrained" name="attr_streetwise_proficiency" value="0" checked="" type="radio" title="@{streetwise_proficiency}"/>
|
|
<input class="proficiency" name="attr_streetwise_proficiency" value="[[@{proficiency}]]" type="radio" title="@{streetwise_proficiency}"/>
|
|
</div>
|
|
<div class="expertise-display true-pentagon polygon">
|
|
<input class="expertise" name="attr_streetwise_proficiency" value="[[2*@{proficiency}]]" type="radio" title="@{streetwise_proficiency}"/>
|
|
<input class="proficiency" name="attr_streetwise_proficiency" value="[[@{proficiency}]]" type="radio" title="@{streetwise_proficiency}"/>
|
|
</div>
|
|
</div>
|
|
<div class="plus-container">
|
|
<input class="mod-control" name="attr_streetwise_modded" value="" type="hidden" title="@{streetwise_modded}"/>
|
|
<input class="plus-control hidden" name="attr_streetwise" value="0" min="0" type="number" title="@{streetwise}"/><span class="plus-display" name="attr_streetwise" title="@{streetwise}">0</span>
|
|
</div>
|
|
<button class="streetwise skill-label roller" name="roll_streetwise" data-i18n="streetwise" value="@{streetwise_action}" title="%{streetwise}" type="roll">
|
|
</button>
|
|
<button name="act_streetwise-action" hidden="" type="action" title="%{streetwise-action}">
|
|
</button>
|
|
<input name="attr_streetwise_action" type="hidden" title="@{streetwise_action}"/>
|
|
<h4 class="wisdom" data-i18n="wisdom skills">wisdom skills
|
|
</h4>
|
|
<div class="insight expertise-check-label checkbox-container"><!--affects:["insight","passive_insight"] -->
|
|
<input class="prof-control" name="attr_insight_proficiency" value="0" type="hidden" title="@{insight_proficiency}"/>
|
|
<div class="prof-display true-hexagon polygon">
|
|
<input class="untrained" name="attr_insight_proficiency" value="0" checked="" type="radio" title="@{insight_proficiency}"/>
|
|
<input class="proficiency" name="attr_insight_proficiency" value="[[@{proficiency}]]" type="radio" title="@{insight_proficiency}"/>
|
|
</div>
|
|
<div class="expertise-display true-pentagon polygon">
|
|
<input class="expertise" name="attr_insight_proficiency" value="[[2*@{proficiency}]]" type="radio" title="@{insight_proficiency}"/>
|
|
<input class="proficiency" name="attr_insight_proficiency" value="[[@{proficiency}]]" type="radio" title="@{insight_proficiency}"/>
|
|
</div>
|
|
</div>
|
|
<div class="plus-container">
|
|
<input class="mod-control" name="attr_insight_modded" value="" type="hidden" title="@{insight_modded}"/>
|
|
<input class="plus-control hidden" name="attr_insight" value="0" min="0" type="number" title="@{insight}"/><span class="plus-display" name="attr_insight" title="@{insight}">0</span>
|
|
</div>
|
|
<button class="insight skill-label roller" name="roll_insight" data-i18n="insight" value="@{insight_action}" title="%{insight}" type="roll">
|
|
</button>
|
|
<button name="act_insight-action" hidden="" type="action" title="%{insight-action}">
|
|
</button>
|
|
<input name="attr_insight_action" type="hidden" title="@{insight_action}"/>
|
|
<div class="perception expertise-check-label checkbox-container"><!--affects:["perception","passive_perception"] -->
|
|
<input class="prof-control" name="attr_perception_proficiency" value="0" type="hidden" title="@{perception_proficiency}"/>
|
|
<div class="prof-display true-hexagon polygon">
|
|
<input class="untrained" name="attr_perception_proficiency" value="0" checked="" type="radio" title="@{perception_proficiency}"/>
|
|
<input class="proficiency" name="attr_perception_proficiency" value="[[@{proficiency}]]" type="radio" title="@{perception_proficiency}"/>
|
|
</div>
|
|
<div class="expertise-display true-pentagon polygon">
|
|
<input class="expertise" name="attr_perception_proficiency" value="[[2*@{proficiency}]]" type="radio" title="@{perception_proficiency}"/>
|
|
<input class="proficiency" name="attr_perception_proficiency" value="[[@{proficiency}]]" type="radio" title="@{perception_proficiency}"/>
|
|
</div>
|
|
</div>
|
|
<div class="plus-container">
|
|
<input class="mod-control" name="attr_perception_modded" value="" type="hidden" title="@{perception_modded}"/>
|
|
<input class="plus-control hidden" name="attr_perception" value="0" min="0" type="number" title="@{perception}"/><span class="plus-display" name="attr_perception" title="@{perception}">0</span>
|
|
</div>
|
|
<button class="perception skill-label roller" name="roll_perception" data-i18n="perception" value="@{perception_action}" title="%{perception}" type="roll">
|
|
</button>
|
|
<button name="act_perception-action" hidden="" type="action" title="%{perception-action}">
|
|
</button>
|
|
<input name="attr_perception_action" type="hidden" title="@{perception_action}"/>
|
|
<div class="survival expertise-check-label checkbox-container"><!--affects:["survival"] -->
|
|
<input class="prof-control" name="attr_survival_proficiency" value="0" type="hidden" title="@{survival_proficiency}"/>
|
|
<div class="prof-display true-hexagon polygon">
|
|
<input class="untrained" name="attr_survival_proficiency" value="0" checked="" type="radio" title="@{survival_proficiency}"/>
|
|
<input class="proficiency" name="attr_survival_proficiency" value="[[@{proficiency}]]" type="radio" title="@{survival_proficiency}"/>
|
|
</div>
|
|
<div class="expertise-display true-pentagon polygon">
|
|
<input class="expertise" name="attr_survival_proficiency" value="[[2*@{proficiency}]]" type="radio" title="@{survival_proficiency}"/>
|
|
<input class="proficiency" name="attr_survival_proficiency" value="[[@{proficiency}]]" type="radio" title="@{survival_proficiency}"/>
|
|
</div>
|
|
</div>
|
|
<div class="plus-container">
|
|
<input class="mod-control" name="attr_survival_modded" value="" type="hidden" title="@{survival_modded}"/>
|
|
<input class="plus-control hidden" name="attr_survival" value="0" min="0" type="number" title="@{survival}"/><span class="plus-display" name="attr_survival" title="@{survival}">0</span>
|
|
</div>
|
|
<button class="survival skill-label roller" name="roll_survival" data-i18n="survival" value="@{survival_action}" title="%{survival}" type="roll">
|
|
</button>
|
|
<button name="act_survival-action" hidden="" type="action" title="%{survival-action}">
|
|
</button>
|
|
<input name="attr_survival_action" type="hidden" title="@{survival_action}"/>
|
|
<h4 class="charisma" data-i18n="charisma skills">charisma skills
|
|
</h4>
|
|
<div class="deception expertise-check-label checkbox-container"><!--affects:["deception"] -->
|
|
<input class="prof-control" name="attr_deception_proficiency" value="0" type="hidden" title="@{deception_proficiency}"/>
|
|
<div class="prof-display true-hexagon polygon">
|
|
<input class="untrained" name="attr_deception_proficiency" value="0" checked="" type="radio" title="@{deception_proficiency}"/>
|
|
<input class="proficiency" name="attr_deception_proficiency" value="[[@{proficiency}]]" type="radio" title="@{deception_proficiency}"/>
|
|
</div>
|
|
<div class="expertise-display true-pentagon polygon">
|
|
<input class="expertise" name="attr_deception_proficiency" value="[[2*@{proficiency}]]" type="radio" title="@{deception_proficiency}"/>
|
|
<input class="proficiency" name="attr_deception_proficiency" value="[[@{proficiency}]]" type="radio" title="@{deception_proficiency}"/>
|
|
</div>
|
|
</div>
|
|
<div class="plus-container">
|
|
<input class="mod-control" name="attr_deception_modded" value="" type="hidden" title="@{deception_modded}"/>
|
|
<input class="plus-control hidden" name="attr_deception" value="0" min="0" type="number" title="@{deception}"/><span class="plus-display" name="attr_deception" title="@{deception}">0</span>
|
|
</div>
|
|
<button class="deception skill-label roller" name="roll_deception" data-i18n="deception" value="@{deception_action}" title="%{deception}" type="roll">
|
|
</button>
|
|
<button name="act_deception-action" hidden="" type="action" title="%{deception-action}">
|
|
</button>
|
|
<input name="attr_deception_action" type="hidden" title="@{deception_action}"/>
|
|
<div class="intimidation expertise-check-label checkbox-container"><!--affects:["intimidation"] -->
|
|
<input class="prof-control" name="attr_intimidation_proficiency" value="0" type="hidden" title="@{intimidation_proficiency}"/>
|
|
<div class="prof-display true-hexagon polygon">
|
|
<input class="untrained" name="attr_intimidation_proficiency" value="0" checked="" type="radio" title="@{intimidation_proficiency}"/>
|
|
<input class="proficiency" name="attr_intimidation_proficiency" value="[[@{proficiency}]]" type="radio" title="@{intimidation_proficiency}"/>
|
|
</div>
|
|
<div class="expertise-display true-pentagon polygon">
|
|
<input class="expertise" name="attr_intimidation_proficiency" value="[[2*@{proficiency}]]" type="radio" title="@{intimidation_proficiency}"/>
|
|
<input class="proficiency" name="attr_intimidation_proficiency" value="[[@{proficiency}]]" type="radio" title="@{intimidation_proficiency}"/>
|
|
</div>
|
|
</div>
|
|
<div class="plus-container">
|
|
<input class="mod-control" name="attr_intimidation_modded" value="" type="hidden" title="@{intimidation_modded}"/>
|
|
<input class="plus-control hidden" name="attr_intimidation" value="0" min="0" type="number" title="@{intimidation}"/><span class="plus-display" name="attr_intimidation" title="@{intimidation}">0</span>
|
|
</div>
|
|
<button class="intimidation skill-label roller" name="roll_intimidation" data-i18n="intimidation" value="@{intimidation_action}" title="%{intimidation}" type="roll">
|
|
</button>
|
|
<button name="act_intimidation-action" hidden="" type="action" title="%{intimidation-action}">
|
|
</button>
|
|
<input name="attr_intimidation_action" type="hidden" title="@{intimidation_action}"/>
|
|
<div class="performance expertise-check-label checkbox-container"><!--affects:["performance"] -->
|
|
<input class="prof-control" name="attr_performance_proficiency" value="0" type="hidden" title="@{performance_proficiency}"/>
|
|
<div class="prof-display true-hexagon polygon">
|
|
<input class="untrained" name="attr_performance_proficiency" value="0" checked="" type="radio" title="@{performance_proficiency}"/>
|
|
<input class="proficiency" name="attr_performance_proficiency" value="[[@{proficiency}]]" type="radio" title="@{performance_proficiency}"/>
|
|
</div>
|
|
<div class="expertise-display true-pentagon polygon">
|
|
<input class="expertise" name="attr_performance_proficiency" value="[[2*@{proficiency}]]" type="radio" title="@{performance_proficiency}"/>
|
|
<input class="proficiency" name="attr_performance_proficiency" value="[[@{proficiency}]]" type="radio" title="@{performance_proficiency}"/>
|
|
</div>
|
|
</div>
|
|
<div class="plus-container">
|
|
<input class="mod-control" name="attr_performance_modded" value="" type="hidden" title="@{performance_modded}"/>
|
|
<input class="plus-control hidden" name="attr_performance" value="0" min="0" type="number" title="@{performance}"/><span class="plus-display" name="attr_performance" title="@{performance}">0</span>
|
|
</div>
|
|
<button class="performance skill-label roller" name="roll_performance" data-i18n="performance" value="@{performance_action}" title="%{performance}" type="roll">
|
|
</button>
|
|
<button name="act_performance-action" hidden="" type="action" title="%{performance-action}">
|
|
</button>
|
|
<input name="attr_performance_action" type="hidden" title="@{performance_action}"/>
|
|
<div class="persuasion expertise-check-label checkbox-container"><!--affects:["persuasion"] -->
|
|
<input class="prof-control" name="attr_persuasion_proficiency" value="0" type="hidden" title="@{persuasion_proficiency}"/>
|
|
<div class="prof-display true-hexagon polygon">
|
|
<input class="untrained" name="attr_persuasion_proficiency" value="0" checked="" type="radio" title="@{persuasion_proficiency}"/>
|
|
<input class="proficiency" name="attr_persuasion_proficiency" value="[[@{proficiency}]]" type="radio" title="@{persuasion_proficiency}"/>
|
|
</div>
|
|
<div class="expertise-display true-pentagon polygon">
|
|
<input class="expertise" name="attr_persuasion_proficiency" value="[[2*@{proficiency}]]" type="radio" title="@{persuasion_proficiency}"/>
|
|
<input class="proficiency" name="attr_persuasion_proficiency" value="[[@{proficiency}]]" type="radio" title="@{persuasion_proficiency}"/>
|
|
</div>
|
|
</div>
|
|
<div class="plus-container">
|
|
<input class="mod-control" name="attr_persuasion_modded" value="" type="hidden" title="@{persuasion_modded}"/>
|
|
<input class="plus-control hidden" name="attr_persuasion" value="0" min="0" type="number" title="@{persuasion}"/><span class="plus-display" name="attr_persuasion" title="@{persuasion}">0</span>
|
|
</div>
|
|
<button class="persuasion skill-label roller" name="roll_persuasion" data-i18n="persuasion" value="@{persuasion_action}" title="%{persuasion}" type="roll">
|
|
</button>
|
|
<button name="act_persuasion-action" hidden="" type="action" title="%{persuasion-action}">
|
|
</button>
|
|
<input name="attr_persuasion_action" type="hidden" title="@{persuasion_action}"/>
|
|
</div>
|
|
</div>
|
|
<div class="ability-footer" data-i18n-aria-label="senses">
|
|
<div class="hexagon-label-container">
|
|
<div class="true-hexagon polygon locked">
|
|
<input class="mod-control" name="attr_passive_perception_modded" value="" type="hidden" title="@{passive_perception_modded}"/><span name="attr_passive_perception" value="10" title="@{passive_perception}">10</span>
|
|
</div>
|
|
<div class="hexagon-label"><span data-i18n="passive perception">passive perception</span>
|
|
</div>
|
|
</div>
|
|
<div class="hexagon-label-container">
|
|
<div class="true-hexagon polygon locked">
|
|
<input class="mod-control" name="attr_passive_insight_modded" value="" type="hidden" title="@{passive_insight_modded}"/><span name="attr_passive_insight" value="10" title="@{passive_insight}">10</span>
|
|
</div>
|
|
<div class="hexagon-label"><span data-i18n="passive insight">passive insight</span>
|
|
</div>
|
|
</div>
|
|
<div class="senses-container">
|
|
<h4 data-i18n="senses">senses</h4>
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_acute_olfaction" value="1" type="checkbox" title="@{acute_olfaction}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="acute olfaction">acute olfaction</span>
|
|
</label>
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_darkvision" value="1" type="checkbox" title="@{darkvision}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="darkvision">darkvision</span>
|
|
</label>
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_macrovision" value="1" type="checkbox" title="@{macrovision}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="macrovision">macrovision</span>
|
|
</label>
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_microvision" value="1" type="checkbox" title="@{microvision}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="microvision">microvision</span>
|
|
</label>
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_penetration" value="1" type="checkbox" title="@{penetration}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="penetration">penetration</span>
|
|
</label>
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_spectrum" value="1" type="checkbox" title="@{spectrum}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="spectrum">spectrum</span>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="mid-column">
|
|
<div class="armor-speed-container" data-i18n-aria-label="armor and speed">
|
|
<input name="attr_ac_formula" value="10 + @{dexterity_mod}" type="hidden" title="@{ac_formula}"/>
|
|
<input name="attr_initiative_macro" value="" type="hidden" title="@{initiative_macro}"/>
|
|
<div class="hexagon-label-container initiative">
|
|
<div class="true-hexagon polygon locked">
|
|
<div class="plus-container">
|
|
<input class="mod-control" name="attr_initiative_modded" value="" type="hidden" title="@{initiative_modded}"/>
|
|
<input class="plus-control hidden" name="attr_initiative" value="0" min="0" type="number" title="@{initiative}"/><span class="plus-display" name="attr_initiative" title="@{initiative}">0</span>
|
|
</div>
|
|
</div>
|
|
<div class="hexagon-label">
|
|
<button class="hexagon-label roller" name="roll_initiative" data-i18n="initiative" value="@{initiative_action}" content="initiative" title="%{initiative}" type="roll">initiative
|
|
</button>
|
|
<button name="act_initiative-action" hidden="" type="action" title="%{initiative-action}">
|
|
</button>
|
|
<input name="attr_initiative_action" type="hidden" title="@{initiative_action}"/>
|
|
</div>
|
|
</div>
|
|
<div class="hexagon-label-container dr">
|
|
<div class="true-hexagon polygon">
|
|
<input name="attr_damage_reduction" type="number" title="@{damage_reduction}"/>
|
|
</div>
|
|
<div class="hexagon-label"><span data-i18n="damage reduction">damage reduction</span>
|
|
</div>
|
|
</div>
|
|
<div class="hexagon-label-container speed">
|
|
<div class="true-hexagon polygon">
|
|
<input name="attr_speed" type="text" title="@{speed}"/>
|
|
</div>
|
|
<div class="hexagon-label"><span data-i18n="speed">speed</span>
|
|
</div>
|
|
</div>
|
|
<div class="hexagon-label-container ac">
|
|
<div class="true-hexagon polygon">
|
|
<input name="attr_ac" value="10" type="number" title="@{ac}"/>
|
|
</div>
|
|
<div class="hexagon-label"><span data-i18n="armor class">armor class</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="hp-resistance-container" data-i18n-aria-label="hp and resistance">
|
|
<div class="current-death">
|
|
<div class="current-health">
|
|
<h4 data-i18n="current hit points">current hit points</h4>
|
|
<input class="h2" name="attr_hp" type="number" title="@{hp}"/>
|
|
</div>
|
|
<div class="hd">
|
|
<input name="attr_hit_dice_macro" type="hidden" title="@{hit_dice_macro}"/>
|
|
<button class="h4 roller" name="roll_hit_dice" data-i18n="hit dice" value="@{hit_dice_action}" title="%{hit_dice}" type="roll">
|
|
</button>
|
|
<button name="act_hit-dice-action" hidden="" type="action" title="%{hit-dice-action}">
|
|
</button>
|
|
<input name="attr_hit_dice_action" type="hidden" title="@{hit_dice_action}"/>
|
|
<input name="attr_d8_hd" type="number" title="@{d8_hd}"/><span data-i18n="d8">d8</span>
|
|
<input name="attr_d10_hd" type="number" title="@{d10_hd}"/><span data-i18n="d10">d10</span>
|
|
<input name="attr_d12_hd" type="number" title="@{d12_hd}"/><span data-i18n="d12">d12</span>
|
|
</div>
|
|
<div class="death">
|
|
<button class="h4 roller" name="roll_death_saves" value="@{death_saves_action}" data-i18n="death saves" title="%{death_saves}" type="roll">
|
|
</button>
|
|
<button name="act_death-saves-action" hidden="" type="action" title="%{death-saves-action}">
|
|
</button>
|
|
<input name="attr_death_saves_action" type="hidden" title="@{death_saves_action}"/>
|
|
<input name="attr_death_save_modded" value="" type="hidden" title="@{death_save_modded}"/>
|
|
<input class="success-control" name="attr_death_success" value="0" type="hidden" title="@{death_success}"/>
|
|
<div class="success first checkbox-container">
|
|
<input name="attr_death_success" value="0" type="radio" title="@{death_success}"/>
|
|
<input name="attr_death_success" value="1" type="radio" title="@{death_success}"/><span class="hexagon"></span>
|
|
</div>
|
|
<div class="success second checkbox-container">
|
|
<input name="attr_death_success" value="2" type="radio" title="@{death_success}"/><span class="hexagon"></span>
|
|
</div>
|
|
<div class="success third checkbox-container">
|
|
<input name="attr_death_success" value="3" type="radio" title="@{death_success}"/><span class="hexagon"></span>
|
|
</div><span class="success" style="font-family:pictos;" data-i18n-title="Successes" title="Successes">k</span>
|
|
<input class="failure-control" name="attr_death_failure" value="0" type="hidden" title="@{death_failure}"/>
|
|
<div class="failure first checkbox-container">
|
|
<input name="attr_death_failure" value="0" type="radio" title="@{death_failure}"/>
|
|
<input name="attr_death_failure" value="1" type="radio" title="@{death_failure}"/><span class="hexagon"></span>
|
|
</div>
|
|
<div class="failure second checkbox-container">
|
|
<input name="attr_death_failure" value="2" type="radio" title="@{death_failure}"/><span class="hexagon"></span>
|
|
</div>
|
|
<div class="failure third checkbox-container">
|
|
<input name="attr_death_failure" value="3" type="radio" title="@{death_failure}"/><span class="hexagon"></span>
|
|
</div><img class="death-label failure" data-i18n-title="Failures" title="Failures" src="https://s3.amazonaws.com/files.d20.io/images/1/i-f4Y5RklihSCLNOzppdwA/max.png?1575392209"/>
|
|
</div>
|
|
</div>
|
|
<div class="hexagon-label-container max">
|
|
<div class="true-hexagon polygon">
|
|
<input name="attr_hp_max" type="number" title="@{hp|max}"/>
|
|
</div>
|
|
<div class="hexagon-label"><span data-i18n="maximum hit points">maximum hit points</span>
|
|
</div>
|
|
</div>
|
|
<div class="hexagon-label-container temp">
|
|
<div class="true-hexagon polygon">
|
|
<input name="attr_temp_hp" type="number" title="@{temp_hp}"/>
|
|
</div>
|
|
<div class="hexagon-label"><span data-i18n="temporary hit points">temporary hit points</span>
|
|
</div>
|
|
</div>
|
|
<div class="bordered-textarea resistances">
|
|
<h4 data-i18n="resistances">
|
|
</h4>
|
|
<textarea class="fixed" name="attr_resistances" title="@{resistances}"></textarea>
|
|
</div>
|
|
</div>
|
|
<div class="bordered-container action-container">
|
|
<h4 data-i18n="actions">actions
|
|
</h4>
|
|
<h5 class="name" data-i18n="name">name
|
|
</h5>
|
|
<h5 class="mod" data-i18n="mod">mod
|
|
</h5>
|
|
<h5 class="damage" data-i18n="damage">damage
|
|
</h5>
|
|
<!--repeating actions-->
|
|
<fieldset class="repeating_action">
|
|
<div class="expandable-section">
|
|
<input class="expand-control" name="attr_expand_item" value="1" type="hidden" title="@{repeating_action_$X_expand_item}"/>
|
|
<label class="expand-button">
|
|
<input name="attr_expand_item" value="1" checked="" type="checkbox" title="@{repeating_action_$X_expand_item}"/><span class="expand-state pictos">y</span>
|
|
</label>
|
|
<div class="expanded-view">
|
|
<div class="input-label-container name"><span class="input-label" data-i18n="name">name</span>
|
|
<input type="text" name="attr_name" title="@{repeating_action_$X_name}"/>
|
|
</div>
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_action_proficiency" value="@{proficiency}" type="checkbox" title="@{repeating_action_$X_action_proficiency}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="proficiency">proficiency</span>
|
|
</label>
|
|
<div class="enable-holder">
|
|
<input class="enable-controller" name="attr_attack_enable_item" value="0" type="hidden" title="@{repeating_action_$X_attack_enable_item}"/>
|
|
<div class="enable-section attack">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_attack_enable_item" value="1" type="checkbox" title="@{repeating_action_$X_attack_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="attack">attack</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container attack ability"><span class="input-label" data-i18n="attack ability">attack ability</span>
|
|
<select type="select" name="attr_attack_ability" title="@{repeating_action_$X_attack_ability}">
|
|
<option value="none" data-i18n="none" selected="">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container attack bonus"><span class="input-label" data-i18n="attack bonus">attack bonus</span>
|
|
<input type="text" name="attr_attack_bonus" title="@{repeating_action_$X_attack_bonus}"/>
|
|
</div>
|
|
<div class="input-label-container crit-range"><span class="input-label" data-i18n="crit">crit</span>
|
|
<input type="number" name="attr_crit" value="20" title="@{repeating_action_$X_crit}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_save_enable_item" value="0" type="hidden" title="@{repeating_action_$X_save_enable_item}"/>
|
|
<div class="enable-section save">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_save_enable_item" value="{{save_type=^{@{save_type}}}} @{save_macro}" type="checkbox" title="@{repeating_action_$X_save_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="save">save</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container"><span class="input-label" data-i18n="save ability">save ability</span>
|
|
<select type="select" name="attr_save_ability" title="@{repeating_action_$X_save_ability}">
|
|
<option value="none" data-i18n="none" selected="">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="save type">save type</span>
|
|
<select type="select" name="attr_save_type" title="@{repeating_action_$X_save_type}">
|
|
<option value="none" data-i18n="none" selected="">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="dc bonus">dc bonus</span>
|
|
<input type="text" name="attr_dc_bonus" title="@{repeating_action_$X_dc_bonus}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_damage_1_enable_item" value="0" type="hidden" title="@{repeating_action_$X_damage_1_enable_item}"/>
|
|
<div class="enable-section damage 1">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_damage_1_enable_item" value="{{damage_type_1=@{damage_type_1}}} @{damage_1_macro}" type="checkbox" title="@{repeating_action_$X_damage_1_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="damage 1">damage 1</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container damage 1"><span class="input-label" data-i18n="damage 1">damage 1</span>
|
|
<input type="text" name="attr_damage_1" title="@{repeating_action_$X_damage_1}"/>
|
|
</div>
|
|
<div class="input-label-container critical damage 1"><span class="input-label" data-i18n="critical damage 1">critical damage 1</span>
|
|
<input type="text" name="attr_critical_damage_1" title="@{repeating_action_$X_critical_damage_1}"/>
|
|
</div>
|
|
<div class="input-label-container damage ability 1"><span class="input-label" data-i18n="damage ability 1">damage ability 1</span>
|
|
<select type="select" name="attr_damage_ability_1" title="@{repeating_action_$X_damage_ability_1}">
|
|
<option value="none" data-i18n="none" selected="">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container damage type 1"><span class="input-label" data-i18n="damage type 1">damage type 1</span>
|
|
<input type="text" name="attr_damage_type_1" title="@{repeating_action_$X_damage_type_1}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_damage_2_enable_item" value="0" type="hidden" title="@{repeating_action_$X_damage_2_enable_item}"/>
|
|
<div class="enable-section damage 2">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_damage_2_enable_item" value="{{damage_type_2=@{damage_type_2}}} @{damage_2_macro}" type="checkbox" title="@{repeating_action_$X_damage_2_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="damage 2">damage 2</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container damage 2"><span class="input-label" data-i18n="damage 2">damage 2</span>
|
|
<input type="text" name="attr_damage_2" title="@{repeating_action_$X_damage_2}"/>
|
|
</div>
|
|
<div class="input-label-container critical damage 2"><span class="input-label" data-i18n="critical damage 2">critical damage 2</span>
|
|
<input type="text" name="attr_critical_damage_2" title="@{repeating_action_$X_critical_damage_2}"/>
|
|
</div>
|
|
<div class="input-label-container damage ability 2"><span class="input-label" data-i18n="damage ability 2">damage ability 2</span>
|
|
<select type="select" name="attr_damage_ability_2" title="@{repeating_action_$X_damage_ability_2}">
|
|
<option value="none" data-i18n="none" selected="">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container damage type 2"><span class="input-label" data-i18n="damage type 2">damage type 2</span>
|
|
<input type="text" name="attr_damage_type_2" title="@{repeating_action_$X_damage_type_2}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="input-label-container range"><span class="input-label" data-i18n="range">range</span>
|
|
<input type="text" name="attr_range" title="@{repeating_action_$X_range}"/>
|
|
</div>
|
|
<div class="input-label-container properties"><span class="input-label" data-i18n="properties">properties</span>
|
|
<input type="text" name="attr_properties" title="@{repeating_action_$X_properties}"/>
|
|
</div>
|
|
<div class="input-label-container description"><span class="input-label" data-i18n="description">description</span><!-- repeating_action_$X_ -->
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_description_in_chat" value="1" type="checkbox" title="@{repeating_action_$X_description_in_chat}"/><span class="hexagon"></span>
|
|
</div>
|
|
</label>
|
|
<textarea type="textarea" name="attr_description" title="@{repeating_action_$X_description}"></textarea>
|
|
</div>
|
|
<input class="id" name="attr_id" readonly="" value="" type="text" title="@{repeating_action_$X_id}"/>
|
|
</div>
|
|
<div class="collapsed-view">
|
|
<button class="roller" name="roll_roll" value="@{action}" title="%{repeating_action_$X_roll}" type="roll">
|
|
</button>
|
|
<button name="act_action" hidden="" type="action" title="%{repeating_action_$X_action}">
|
|
</button>
|
|
<input name="attr_action" type="hidden" title="@{repeating_action_$X_action}"/><span name="attr_name" title="@{repeating_action_$X_name}"></span><span name="attr_bonus" title="@{repeating_action_$X_bonus}"></span><span name="attr_damage_1" title="@{repeating_action_$X_damage_1}"></span>
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
</div>
|
|
<div class="mosaic-satoshi-container" data-i18n-aria-label="armor and speed">
|
|
<div class="hexagon-label-container mosaic">
|
|
<div class="true-hexagon polygon">
|
|
<input name="attr_mosaic_score" type="number" title="@{mosaic_score}"/>
|
|
</div>
|
|
<div class="hexagon-label"><span data-i18n="mosaic score">mosaic score</span>
|
|
</div>
|
|
</div>
|
|
<div class="bordered-textarea satoshi">
|
|
<h4 data-i18n="satoshi">
|
|
</h4>
|
|
<textarea class="fixed" name="attr_attr_satoshi" title="@{attr_satoshi}"></textarea>
|
|
</div>
|
|
</div>
|
|
<div class="bordered-container inventory-container">
|
|
<h4 data-i18n="equipment">equipment
|
|
</h4>
|
|
<h5 class="name" data-i18n="name">name
|
|
</h5>
|
|
<h5 class="cost" data-i18n="cost">cost
|
|
</h5>
|
|
<h5 class="quantity abbreviation" data-i18n="quantity abbreviation">quantity abbreviation
|
|
</h5>
|
|
<!--Inventory details-->
|
|
<fieldset class="repeating_equipment">
|
|
<div class="expandable-section">
|
|
<input class="expand-control" name="attr_expand_item" value="1" type="hidden" title="@{repeating_equipment_$X_expand_item}"/>
|
|
<label class="expand-button">
|
|
<input name="attr_expand_item" value="1" checked="" type="checkbox" title="@{repeating_equipment_$X_expand_item}"/><span class="expand-state pictos">y</span>
|
|
</label>
|
|
<div class="expanded-view">
|
|
<div class="input-label-container name"><span class="input-label" data-i18n="name">name</span>
|
|
<input type="text" name="attr_name" title="@{repeating_equipment_$X_name}"/>
|
|
</div>
|
|
<div class="input-label-container quantity"><span class="input-label" data-i18n="quantity">quantity</span>
|
|
<input type="text" name="attr_quantity" title="@{repeating_equipment_$X_quantity}"/>
|
|
</div>
|
|
<div class="input-label-container weight"><span class="input-label" data-i18n="weight">weight</span>
|
|
<input type="text" name="attr_weight" title="@{repeating_equipment_$X_weight}"/>
|
|
</div>
|
|
<div class="input-label-container cost"><span class="input-label" data-i18n="cost">cost</span>
|
|
<input type="text" name="attr_cost" title="@{repeating_equipment_$X_cost}"/>
|
|
</div>
|
|
<div class="input-label-container mods"><span class="input-label" data-i18n="mods">mods</span>
|
|
<input type="text" name="attr_mods" title="@{repeating_equipment_$X_mods}"/>
|
|
</div>
|
|
<div class="input-label-container description"><span class="input-label" data-i18n="description">description</span>
|
|
<textarea type="textarea" name="attr_description" title="@{repeating_equipment_$X_description}"></textarea>
|
|
</div>
|
|
<input class="id" name="attr_id" readonly="" value="" type="text" title="@{repeating_equipment_$X_id}"/>
|
|
</div>
|
|
<div class="collapsed-view"><span name="attr_name" title="@{repeating_equipment_$X_name}"></span><span name="attr_cost" title="@{repeating_equipment_$X_cost}"></span><span name="attr_quantity" title="@{repeating_equipment_$X_quantity}"></span>
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
</div>
|
|
</div>
|
|
<div class="trait-column">
|
|
<div class="bordered-container trait-container">
|
|
<h4 data-i18n="features & traits">features & traits
|
|
</h4>
|
|
<h5 class="name" data-i18n="name">name
|
|
</h5>
|
|
<h5 class="source" data-i18n="source">source
|
|
</h5>
|
|
<fieldset class="repeating_trait">
|
|
<input name="attr_attr_macro" value="{{source=@{source}}}" type="hidden" title="@{repeating_trait_$X_attr_macro}"/>
|
|
<div class="expandable-section">
|
|
<input class="expand-control" name="attr_expand_item" value="1" type="hidden" title="@{repeating_trait_$X_expand_item}"/>
|
|
<label class="expand-button">
|
|
<input name="attr_expand_item" value="1" checked="" type="checkbox" title="@{repeating_trait_$X_expand_item}"/><span class="expand-state pictos">y</span>
|
|
</label>
|
|
<div class="expanded-view">
|
|
<div class="input-label-container name"><span class="input-label" data-i18n="name">name</span>
|
|
<input type="text" name="attr_name" title="@{repeating_trait_$X_name}"/>
|
|
</div>
|
|
<div class="input-label-container source"><span class="input-label" data-i18n="source">source</span>
|
|
<input type="text" name="attr_source" title="@{repeating_trait_$X_source}"/>
|
|
</div>
|
|
<div class="input-label-container mods"><span class="input-label" data-i18n="mods">mods</span>
|
|
<input type="text" name="attr_mods" title="@{repeating_trait_$X_mods}"/>
|
|
</div>
|
|
<div class="input-label-container description"><span class="input-label" data-i18n="description">description</span><!-- repeating_trait_$X_ -->
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_description_in_chat" value="1" checked="" type="checkbox" title="@{repeating_trait_$X_description_in_chat}"/><span class="hexagon"></span>
|
|
</div>
|
|
</label>
|
|
<textarea type="textarea" name="attr_description" title="@{repeating_trait_$X_description}"></textarea>
|
|
</div>
|
|
<input class="id" name="attr_id" readonly="" value="" type="text" title="@{repeating_trait_$X_id}"/>
|
|
</div>
|
|
<div class="collapsed-view">
|
|
<button class="roller" name="roll_details" value="@{details_action}" title="%{repeating_trait_$X_details}" type="roll">
|
|
</button>
|
|
<button name="act_details-action" hidden="" type="action" title="%{repeating_trait_$X_details-action}">
|
|
</button>
|
|
<input name="attr_details_action" type="hidden" title="@{repeating_trait_$X_details_action}"/><span name="attr_name" title="@{repeating_trait_$X_name}"></span><span name="attr_source" title="@{repeating_trait_$X_source}"></span>
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="hacks">
|
|
<div class="input-label-container"><span class="input-label" data-i18n="hack ability">hack ability</span>
|
|
<select name="attr_hack_ability" type="select" title="@{hack_ability}">
|
|
<option data-i18n="none" value="none">
|
|
</option>
|
|
<option data-i18n="strength" value="strength">
|
|
</option>
|
|
<option data-i18n="dexterity" value="dexterity">
|
|
</option>
|
|
<option data-i18n="constitution" value="constitution">
|
|
</option>
|
|
<option data-i18n="intelligence" value="intelligence">
|
|
</option>
|
|
<option data-i18n="wisdom" value="wisdom">
|
|
</option>
|
|
<option data-i18n="charisma" value="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div>
|
|
<div class="hack-master-container">
|
|
<div class="hack-header pentagon-hexagon-label-container">
|
|
<div class="true-hexagon polygon">
|
|
<input name="attr_1st_level_slots" type="number" title="@{1st_level_slots}"/>
|
|
</div><span class="current label" data-i18n="current"></span>
|
|
<div class="true-pentagon polygon">
|
|
<input name="attr_1st_level_slots_max" type="number" title="@{1st_level_slots|max}"/>
|
|
</div><span class="max label" data-i18n="max"></span>
|
|
</div>
|
|
<div class="bordered-container sheet-1st-level hack-container">
|
|
<h4 data-i18n="1st level">1st level
|
|
</h4>
|
|
<fieldset class="repeating_hack">
|
|
<input name="attr_action_proficiency" value="@{proficiency}" type="hidden" title="@{repeating_hack_$X_action_proficiency}"/>
|
|
<input class="level-display" name="attr_level" value="" type="hidden" title="@{repeating_hack_$X_level}"/>
|
|
<div class="expandable-section">
|
|
<input class="expand-control" name="attr_expand_item" value="1" type="hidden" title="@{repeating_hack_$X_expand_item}"/>
|
|
<label class="expand-button">
|
|
<input name="attr_expand_item" value="1" checked="" type="checkbox" title="@{repeating_hack_$X_expand_item}"/><span class="expand-state pictos">y</span>
|
|
</label>
|
|
<div class="expanded-view">
|
|
<div class="input-label-container name"><span class="input-label" data-i18n="name">name</span>
|
|
<input type="text" name="attr_name" title="@{repeating_hack_$X_name}"/>
|
|
</div>
|
|
<div class="input-label-container level"><span class="input-label" data-i18n="level">level</span>
|
|
<input type="number" name="attr_level" title="@{repeating_hack_$X_level}"/>
|
|
</div>
|
|
<div class="input-label-container launch time"><span class="input-label" data-i18n="launch time">launch time</span>
|
|
<input type="text" name="attr_launch_time" title="@{repeating_hack_$X_launch_time}"/>
|
|
</div>
|
|
<div class="input-label-container duration"><span class="input-label" data-i18n="duration">duration</span>
|
|
<input type="text" name="attr_duration" title="@{repeating_hack_$X_duration}"/>
|
|
</div>
|
|
<div class="input-label-container hack type"><span class="input-label" data-i18n="hack type">hack type</span>
|
|
<select type="select" name="attr_hack_type" title="@{repeating_hack_$X_hack_type}">
|
|
<option value="injection" data-i18n="injection">
|
|
</option>
|
|
<option value="gadget" data-i18n="gadget">
|
|
</option>
|
|
<option value="craft tech" data-i18n="craft tech">
|
|
</option>
|
|
<option value="craft explosive" data-i18n="craft explosive">
|
|
</option>
|
|
<option value="bot" data-i18n="bot">
|
|
</option>
|
|
<option value="mind" data-i18n="mind">
|
|
</option>
|
|
<option value="software" data-i18n="software">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container source"><span class="input-label" data-i18n="source">source</span>
|
|
<input type="text" name="attr_source" title="@{repeating_hack_$X_source}"/>
|
|
</div>
|
|
<div class="enable-holder">
|
|
<input class="enable-controller" name="attr_attack_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_attack_enable_item}"/>
|
|
<div class="enable-section attack">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_attack_enable_item" value="1" type="checkbox" title="@{repeating_hack_$X_attack_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="attack">attack</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container attack ability"><span class="input-label" data-i18n="attack ability">attack ability</span>
|
|
<select type="select" name="attr_attack_ability" title="@{repeating_hack_$X_attack_ability}">
|
|
<option value="hack" data-i18n="hack" selected="">
|
|
</option>
|
|
<option value="none" data-i18n="none">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container attack bonus"><span class="input-label" data-i18n="attack bonus">attack bonus</span>
|
|
<input type="text" name="attr_attack_bonus" title="@{repeating_hack_$X_attack_bonus}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_save_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_save_enable_item}"/>
|
|
<div class="enable-section save">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_save_enable_item" value="@{save_macro}" type="checkbox" title="@{repeating_hack_$X_save_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="save">save</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container save ability"><span class="input-label" data-i18n="save ability">save ability</span>
|
|
<select type="select" name="attr_save_ability" title="@{repeating_hack_$X_save_ability}">
|
|
<option value="hack" data-i18n="hack" selected="">
|
|
</option>
|
|
<option value="none" data-i18n="none">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container save type"><span class="input-label" data-i18n="save type">save type</span>
|
|
<select type="select" name="attr_save_type" title="@{repeating_hack_$X_save_type}">
|
|
<option value="none" data-i18n="none" selected="">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container dc bonus"><span class="input-label" data-i18n="dc bonus">dc bonus</span>
|
|
<input type="text" name="attr_dc_bonus" title="@{repeating_hack_$X_dc_bonus}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_damage_1_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_damage_1_enable_item}"/>
|
|
<div class="enable-section damage 1">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_damage_1_enable_item" value="{{damage_type_1=@{damage_type_1}}} @{damage_1_macro}" type="checkbox" title="@{repeating_hack_$X_damage_1_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="damage 1">damage 1</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container damage 1"><span class="input-label" data-i18n="damage 1">damage 1</span>
|
|
<input type="text" name="attr_damage_1" title="@{repeating_hack_$X_damage_1}"/>
|
|
</div>
|
|
<div class="input-label-container critical damage 1"><span class="input-label" data-i18n="critical damage 1">critical damage 1</span>
|
|
<input type="text" name="attr_critical_damage_1" title="@{repeating_hack_$X_critical_damage_1}"/>
|
|
</div>
|
|
<div class="input-label-container damage ability 1"><span class="input-label" data-i18n="damage ability 1">damage ability 1</span>
|
|
<select type="select" name="attr_damage_ability_1" title="@{repeating_hack_$X_damage_ability_1}">
|
|
<option value="none" data-i18n="none" selected="">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container damage type 1"><span class="input-label" data-i18n="damage type 1">damage type 1</span>
|
|
<input type="text" name="attr_damage_type_1" title="@{repeating_hack_$X_damage_type_1}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_damage_2_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_damage_2_enable_item}"/>
|
|
<div class="enable-section damage 2">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_damage_2_enable_item" value="{{damage_type_2=@{damage_type_2}}} @{damage_2_macro}" type="checkbox" title="@{repeating_hack_$X_damage_2_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="damage 2">damage 2</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container damage 2"><span class="input-label" data-i18n="damage 2">damage 2</span>
|
|
<input type="text" name="attr_damage_2" title="@{repeating_hack_$X_damage_2}"/>
|
|
</div>
|
|
<div class="input-label-container critical damage 2"><span class="input-label" data-i18n="critical damage 2">critical damage 2</span>
|
|
<input type="text" name="attr_critical_damage_2" title="@{repeating_hack_$X_critical_damage_2}"/>
|
|
</div>
|
|
<div class="input-label-container damage ability 2"><span class="input-label" data-i18n="damage ability 2">damage ability 2</span>
|
|
<select type="select" name="attr_damage_ability_2" title="@{repeating_hack_$X_damage_ability_2}">
|
|
<option value="none" data-i18n="none" selected="">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container damage type 2"><span class="input-label" data-i18n="damage type 2">damage type 2</span>
|
|
<input type="text" name="attr_damage_type_2" title="@{repeating_hack_$X_damage_type_2}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="input-label-container range"><span class="input-label" data-i18n="range">range</span>
|
|
<input type="text" name="attr_range" title="@{repeating_hack_$X_range}"/>
|
|
</div>
|
|
<div class="input-label-container properties"><span class="input-label" data-i18n="properties">properties</span>
|
|
<input type="text" name="attr_properties" title="@{repeating_hack_$X_properties}"/>
|
|
</div>
|
|
<div class="input-label-container description"><span class="input-label" data-i18n="description">description</span><!-- repeating_hack_$X_ -->
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_description_in_chat" value="1" checked="" type="checkbox" title="@{repeating_hack_$X_description_in_chat}"/><span class="hexagon"></span>
|
|
</div>
|
|
</label>
|
|
<textarea type="textarea" name="attr_description" title="@{repeating_hack_$X_description}"></textarea>
|
|
</div>
|
|
<input class="id" name="attr_id" readonly="" value="" type="text" title="@{repeating_hack_$X_id}"/>
|
|
</div>
|
|
<div class="collapsed-view">
|
|
<button class="roller" name="roll_roll" value="@{action}" title="%{repeating_hack_$X_roll}" type="roll">
|
|
</button>
|
|
<button name="act_action" hidden="" type="action" title="%{repeating_hack_$X_action}">
|
|
</button>
|
|
<input name="attr_action" type="hidden" title="@{repeating_hack_$X_action}"/>
|
|
<input class="hack-type" name="attr_hack_type" value="injection" type="hidden" title="@{repeating_hack_$X_hack_type}"/><span class="name" name="attr_name" value="" title="@{repeating_hack_$X_name}"></span><span class="hack-type" name="attr_hack_type" value="" title="@{repeating_hack_$X_hack_type}"></span>
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
<div class="pseudo-control">
|
|
<button class="repcontrol_add" name="act_add-1st_hack" type="action" title="%{add-1st_hack}">
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="hack-master-container">
|
|
<div class="hack-header pentagon-hexagon-label-container">
|
|
<div class="true-hexagon polygon">
|
|
<input name="attr_2nd_level_slots" type="number" title="@{2nd_level_slots}"/>
|
|
</div><span class="current label" data-i18n="current"></span>
|
|
<div class="true-pentagon polygon">
|
|
<input name="attr_2nd_level_slots_max" type="number" title="@{2nd_level_slots|max}"/>
|
|
</div><span class="max label" data-i18n="max"></span>
|
|
</div>
|
|
<div class="bordered-container sheet-2nd-level hack-container">
|
|
<h4 data-i18n="2nd level">2nd level
|
|
</h4>
|
|
<fieldset class="repeating_hack">
|
|
<input name="attr_action_proficiency" value="@{proficiency}" type="hidden" title="@{repeating_hack_$X_action_proficiency}"/>
|
|
<input class="level-display" name="attr_level" value="" type="hidden" title="@{repeating_hack_$X_level}"/>
|
|
<div class="expandable-section">
|
|
<input class="expand-control" name="attr_expand_item" value="1" type="hidden" title="@{repeating_hack_$X_expand_item}"/>
|
|
<label class="expand-button">
|
|
<input name="attr_expand_item" value="1" checked="" type="checkbox" title="@{repeating_hack_$X_expand_item}"/><span class="expand-state pictos">y</span>
|
|
</label>
|
|
<div class="expanded-view">
|
|
<div class="input-label-container name"><span class="input-label" data-i18n="name">name</span>
|
|
<input type="text" name="attr_name" title="@{repeating_hack_$X_name}"/>
|
|
</div>
|
|
<div class="input-label-container level"><span class="input-label" data-i18n="level">level</span>
|
|
<input type="number" name="attr_level" title="@{repeating_hack_$X_level}"/>
|
|
</div>
|
|
<div class="input-label-container launch time"><span class="input-label" data-i18n="launch time">launch time</span>
|
|
<input type="text" name="attr_launch_time" title="@{repeating_hack_$X_launch_time}"/>
|
|
</div>
|
|
<div class="input-label-container duration"><span class="input-label" data-i18n="duration">duration</span>
|
|
<input type="text" name="attr_duration" title="@{repeating_hack_$X_duration}"/>
|
|
</div>
|
|
<div class="input-label-container hack type"><span class="input-label" data-i18n="hack type">hack type</span>
|
|
<select type="select" name="attr_hack_type" title="@{repeating_hack_$X_hack_type}">
|
|
<option value="injection" data-i18n="injection">
|
|
</option>
|
|
<option value="gadget" data-i18n="gadget">
|
|
</option>
|
|
<option value="craft tech" data-i18n="craft tech">
|
|
</option>
|
|
<option value="craft explosive" data-i18n="craft explosive">
|
|
</option>
|
|
<option value="bot" data-i18n="bot">
|
|
</option>
|
|
<option value="mind" data-i18n="mind">
|
|
</option>
|
|
<option value="software" data-i18n="software">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container source"><span class="input-label" data-i18n="source">source</span>
|
|
<input type="text" name="attr_source" title="@{repeating_hack_$X_source}"/>
|
|
</div>
|
|
<div class="enable-holder">
|
|
<input class="enable-controller" name="attr_attack_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_attack_enable_item}"/>
|
|
<div class="enable-section attack">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_attack_enable_item" value="1" type="checkbox" title="@{repeating_hack_$X_attack_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="attack">attack</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container attack ability"><span class="input-label" data-i18n="attack ability">attack ability</span>
|
|
<select type="select" name="attr_attack_ability" title="@{repeating_hack_$X_attack_ability}">
|
|
<option value="hack" data-i18n="hack" selected="">
|
|
</option>
|
|
<option value="none" data-i18n="none">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container attack bonus"><span class="input-label" data-i18n="attack bonus">attack bonus</span>
|
|
<input type="text" name="attr_attack_bonus" title="@{repeating_hack_$X_attack_bonus}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_save_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_save_enable_item}"/>
|
|
<div class="enable-section save">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_save_enable_item" value="@{save_macro}" type="checkbox" title="@{repeating_hack_$X_save_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="save">save</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container save ability"><span class="input-label" data-i18n="save ability">save ability</span>
|
|
<select type="select" name="attr_save_ability" title="@{repeating_hack_$X_save_ability}">
|
|
<option value="hack" data-i18n="hack" selected="">
|
|
</option>
|
|
<option value="none" data-i18n="none">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container save type"><span class="input-label" data-i18n="save type">save type</span>
|
|
<select type="select" name="attr_save_type" title="@{repeating_hack_$X_save_type}">
|
|
<option value="none" data-i18n="none" selected="">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container dc bonus"><span class="input-label" data-i18n="dc bonus">dc bonus</span>
|
|
<input type="text" name="attr_dc_bonus" title="@{repeating_hack_$X_dc_bonus}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_damage_1_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_damage_1_enable_item}"/>
|
|
<div class="enable-section damage 1">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_damage_1_enable_item" value="{{damage_type_1=@{damage_type_1}}} @{damage_1_macro}" type="checkbox" title="@{repeating_hack_$X_damage_1_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="damage 1">damage 1</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container damage 1"><span class="input-label" data-i18n="damage 1">damage 1</span>
|
|
<input type="text" name="attr_damage_1" title="@{repeating_hack_$X_damage_1}"/>
|
|
</div>
|
|
<div class="input-label-container critical damage 1"><span class="input-label" data-i18n="critical damage 1">critical damage 1</span>
|
|
<input type="text" name="attr_critical_damage_1" title="@{repeating_hack_$X_critical_damage_1}"/>
|
|
</div>
|
|
<div class="input-label-container damage ability 1"><span class="input-label" data-i18n="damage ability 1">damage ability 1</span>
|
|
<select type="select" name="attr_damage_ability_1" title="@{repeating_hack_$X_damage_ability_1}">
|
|
<option value="none" data-i18n="none" selected="">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container damage type 1"><span class="input-label" data-i18n="damage type 1">damage type 1</span>
|
|
<input type="text" name="attr_damage_type_1" title="@{repeating_hack_$X_damage_type_1}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_damage_2_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_damage_2_enable_item}"/>
|
|
<div class="enable-section damage 2">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_damage_2_enable_item" value="{{damage_type_2=@{damage_type_2}}} @{damage_2_macro}" type="checkbox" title="@{repeating_hack_$X_damage_2_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="damage 2">damage 2</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container damage 2"><span class="input-label" data-i18n="damage 2">damage 2</span>
|
|
<input type="text" name="attr_damage_2" title="@{repeating_hack_$X_damage_2}"/>
|
|
</div>
|
|
<div class="input-label-container critical damage 2"><span class="input-label" data-i18n="critical damage 2">critical damage 2</span>
|
|
<input type="text" name="attr_critical_damage_2" title="@{repeating_hack_$X_critical_damage_2}"/>
|
|
</div>
|
|
<div class="input-label-container damage ability 2"><span class="input-label" data-i18n="damage ability 2">damage ability 2</span>
|
|
<select type="select" name="attr_damage_ability_2" title="@{repeating_hack_$X_damage_ability_2}">
|
|
<option value="none" data-i18n="none" selected="">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container damage type 2"><span class="input-label" data-i18n="damage type 2">damage type 2</span>
|
|
<input type="text" name="attr_damage_type_2" title="@{repeating_hack_$X_damage_type_2}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="input-label-container range"><span class="input-label" data-i18n="range">range</span>
|
|
<input type="text" name="attr_range" title="@{repeating_hack_$X_range}"/>
|
|
</div>
|
|
<div class="input-label-container properties"><span class="input-label" data-i18n="properties">properties</span>
|
|
<input type="text" name="attr_properties" title="@{repeating_hack_$X_properties}"/>
|
|
</div>
|
|
<div class="input-label-container description"><span class="input-label" data-i18n="description">description</span><!-- repeating_hack_$X_ -->
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_description_in_chat" value="1" checked="" type="checkbox" title="@{repeating_hack_$X_description_in_chat}"/><span class="hexagon"></span>
|
|
</div>
|
|
</label>
|
|
<textarea type="textarea" name="attr_description" title="@{repeating_hack_$X_description}"></textarea>
|
|
</div>
|
|
<input class="id" name="attr_id" readonly="" value="" type="text" title="@{repeating_hack_$X_id}"/>
|
|
</div>
|
|
<div class="collapsed-view">
|
|
<button class="roller" name="roll_roll" value="@{action}" title="%{repeating_hack_$X_roll}" type="roll">
|
|
</button>
|
|
<button name="act_action" hidden="" type="action" title="%{repeating_hack_$X_action}">
|
|
</button>
|
|
<input name="attr_action" type="hidden" title="@{repeating_hack_$X_action}"/>
|
|
<input class="hack-type" name="attr_hack_type" value="injection" type="hidden" title="@{repeating_hack_$X_hack_type}"/><span class="name" name="attr_name" value="" title="@{repeating_hack_$X_name}"></span><span class="hack-type" name="attr_hack_type" value="" title="@{repeating_hack_$X_hack_type}"></span>
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
<div class="pseudo-control">
|
|
<button class="repcontrol_add" name="act_add-2nd_hack" type="action" title="%{add-2nd_hack}">
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div class="hack-master-container">
|
|
<div class="hack-header pentagon-hexagon-label-container">
|
|
<div class="true-hexagon polygon">
|
|
<input name="attr_3rd_level_slots" type="number" title="@{3rd_level_slots}"/>
|
|
</div><span class="current label" data-i18n="current"></span>
|
|
<div class="true-pentagon polygon">
|
|
<input name="attr_3rd_level_slots_max" type="number" title="@{3rd_level_slots|max}"/>
|
|
</div><span class="max label" data-i18n="max"></span>
|
|
</div>
|
|
<div class="bordered-container sheet-3rd-level hack-container">
|
|
<h4 data-i18n="3rd level">3rd level
|
|
</h4>
|
|
<fieldset class="repeating_hack">
|
|
<input name="attr_action_proficiency" value="@{proficiency}" type="hidden" title="@{repeating_hack_$X_action_proficiency}"/>
|
|
<input class="level-display" name="attr_level" value="" type="hidden" title="@{repeating_hack_$X_level}"/>
|
|
<div class="expandable-section">
|
|
<input class="expand-control" name="attr_expand_item" value="1" type="hidden" title="@{repeating_hack_$X_expand_item}"/>
|
|
<label class="expand-button">
|
|
<input name="attr_expand_item" value="1" checked="" type="checkbox" title="@{repeating_hack_$X_expand_item}"/><span class="expand-state pictos">y</span>
|
|
</label>
|
|
<div class="expanded-view">
|
|
<div class="input-label-container name"><span class="input-label" data-i18n="name">name</span>
|
|
<input type="text" name="attr_name" title="@{repeating_hack_$X_name}"/>
|
|
</div>
|
|
<div class="input-label-container level"><span class="input-label" data-i18n="level">level</span>
|
|
<input type="number" name="attr_level" title="@{repeating_hack_$X_level}"/>
|
|
</div>
|
|
<div class="input-label-container launch time"><span class="input-label" data-i18n="launch time">launch time</span>
|
|
<input type="text" name="attr_launch_time" title="@{repeating_hack_$X_launch_time}"/>
|
|
</div>
|
|
<div class="input-label-container duration"><span class="input-label" data-i18n="duration">duration</span>
|
|
<input type="text" name="attr_duration" title="@{repeating_hack_$X_duration}"/>
|
|
</div>
|
|
<div class="input-label-container hack type"><span class="input-label" data-i18n="hack type">hack type</span>
|
|
<select type="select" name="attr_hack_type" title="@{repeating_hack_$X_hack_type}">
|
|
<option value="injection" data-i18n="injection">
|
|
</option>
|
|
<option value="gadget" data-i18n="gadget">
|
|
</option>
|
|
<option value="craft tech" data-i18n="craft tech">
|
|
</option>
|
|
<option value="craft explosive" data-i18n="craft explosive">
|
|
</option>
|
|
<option value="bot" data-i18n="bot">
|
|
</option>
|
|
<option value="mind" data-i18n="mind">
|
|
</option>
|
|
<option value="software" data-i18n="software">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container source"><span class="input-label" data-i18n="source">source</span>
|
|
<input type="text" name="attr_source" title="@{repeating_hack_$X_source}"/>
|
|
</div>
|
|
<div class="enable-holder">
|
|
<input class="enable-controller" name="attr_attack_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_attack_enable_item}"/>
|
|
<div class="enable-section attack">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_attack_enable_item" value="1" type="checkbox" title="@{repeating_hack_$X_attack_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="attack">attack</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container attack ability"><span class="input-label" data-i18n="attack ability">attack ability</span>
|
|
<select type="select" name="attr_attack_ability" title="@{repeating_hack_$X_attack_ability}">
|
|
<option value="hack" data-i18n="hack" selected="">
|
|
</option>
|
|
<option value="none" data-i18n="none">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container attack bonus"><span class="input-label" data-i18n="attack bonus">attack bonus</span>
|
|
<input type="text" name="attr_attack_bonus" title="@{repeating_hack_$X_attack_bonus}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_save_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_save_enable_item}"/>
|
|
<div class="enable-section save">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_save_enable_item" value="@{save_macro}" type="checkbox" title="@{repeating_hack_$X_save_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="save">save</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container save ability"><span class="input-label" data-i18n="save ability">save ability</span>
|
|
<select type="select" name="attr_save_ability" title="@{repeating_hack_$X_save_ability}">
|
|
<option value="hack" data-i18n="hack" selected="">
|
|
</option>
|
|
<option value="none" data-i18n="none">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container save type"><span class="input-label" data-i18n="save type">save type</span>
|
|
<select type="select" name="attr_save_type" title="@{repeating_hack_$X_save_type}">
|
|
<option value="none" data-i18n="none" selected="">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container dc bonus"><span class="input-label" data-i18n="dc bonus">dc bonus</span>
|
|
<input type="text" name="attr_dc_bonus" title="@{repeating_hack_$X_dc_bonus}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_damage_1_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_damage_1_enable_item}"/>
|
|
<div class="enable-section damage 1">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_damage_1_enable_item" value="{{damage_type_1=@{damage_type_1}}} @{damage_1_macro}" type="checkbox" title="@{repeating_hack_$X_damage_1_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="damage 1">damage 1</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container damage 1"><span class="input-label" data-i18n="damage 1">damage 1</span>
|
|
<input type="text" name="attr_damage_1" title="@{repeating_hack_$X_damage_1}"/>
|
|
</div>
|
|
<div class="input-label-container critical damage 1"><span class="input-label" data-i18n="critical damage 1">critical damage 1</span>
|
|
<input type="text" name="attr_critical_damage_1" title="@{repeating_hack_$X_critical_damage_1}"/>
|
|
</div>
|
|
<div class="input-label-container damage ability 1"><span class="input-label" data-i18n="damage ability 1">damage ability 1</span>
|
|
<select type="select" name="attr_damage_ability_1" title="@{repeating_hack_$X_damage_ability_1}">
|
|
<option value="none" data-i18n="none" selected="">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container damage type 1"><span class="input-label" data-i18n="damage type 1">damage type 1</span>
|
|
<input type="text" name="attr_damage_type_1" title="@{repeating_hack_$X_damage_type_1}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_damage_2_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_damage_2_enable_item}"/>
|
|
<div class="enable-section damage 2">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_damage_2_enable_item" value="{{damage_type_2=@{damage_type_2}}} @{damage_2_macro}" type="checkbox" title="@{repeating_hack_$X_damage_2_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="damage 2">damage 2</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container damage 2"><span class="input-label" data-i18n="damage 2">damage 2</span>
|
|
<input type="text" name="attr_damage_2" title="@{repeating_hack_$X_damage_2}"/>
|
|
</div>
|
|
<div class="input-label-container critical damage 2"><span class="input-label" data-i18n="critical damage 2">critical damage 2</span>
|
|
<input type="text" name="attr_critical_damage_2" title="@{repeating_hack_$X_critical_damage_2}"/>
|
|
</div>
|
|
<div class="input-label-container damage ability 2"><span class="input-label" data-i18n="damage ability 2">damage ability 2</span>
|
|
<select type="select" name="attr_damage_ability_2" title="@{repeating_hack_$X_damage_ability_2}">
|
|
<option value="none" data-i18n="none" selected="">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container damage type 2"><span class="input-label" data-i18n="damage type 2">damage type 2</span>
|
|
<input type="text" name="attr_damage_type_2" title="@{repeating_hack_$X_damage_type_2}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="input-label-container range"><span class="input-label" data-i18n="range">range</span>
|
|
<input type="text" name="attr_range" title="@{repeating_hack_$X_range}"/>
|
|
</div>
|
|
<div class="input-label-container properties"><span class="input-label" data-i18n="properties">properties</span>
|
|
<input type="text" name="attr_properties" title="@{repeating_hack_$X_properties}"/>
|
|
</div>
|
|
<div class="input-label-container description"><span class="input-label" data-i18n="description">description</span><!-- repeating_hack_$X_ -->
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_description_in_chat" value="1" checked="" type="checkbox" title="@{repeating_hack_$X_description_in_chat}"/><span class="hexagon"></span>
|
|
</div>
|
|
</label>
|
|
<textarea type="textarea" name="attr_description" title="@{repeating_hack_$X_description}"></textarea>
|
|
</div>
|
|
<input class="id" name="attr_id" readonly="" value="" type="text" title="@{repeating_hack_$X_id}"/>
|
|
</div>
|
|
<div class="collapsed-view">
|
|
<button class="roller" name="roll_roll" value="@{action}" title="%{repeating_hack_$X_roll}" type="roll">
|
|
</button>
|
|
<button name="act_action" hidden="" type="action" title="%{repeating_hack_$X_action}">
|
|
</button>
|
|
<input name="attr_action" type="hidden" title="@{repeating_hack_$X_action}"/>
|
|
<input class="hack-type" name="attr_hack_type" value="injection" type="hidden" title="@{repeating_hack_$X_hack_type}"/><span class="name" name="attr_name" value="" title="@{repeating_hack_$X_name}"></span><span class="hack-type" name="attr_hack_type" value="" title="@{repeating_hack_$X_hack_type}"></span>
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
<div class="pseudo-control">
|
|
<button class="repcontrol_add" name="act_add-3rd_hack" type="action" title="%{add-3rd_hack}">
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="hack-master-container">
|
|
<div class="hack-header pentagon-hexagon-label-container">
|
|
<div class="true-hexagon polygon">
|
|
<input name="attr_4th_level_slots" type="number" title="@{4th_level_slots}"/>
|
|
</div><span class="current label" data-i18n="current"></span>
|
|
<div class="true-pentagon polygon">
|
|
<input name="attr_4th_level_slots_max" type="number" title="@{4th_level_slots|max}"/>
|
|
</div><span class="max label" data-i18n="max"></span>
|
|
</div>
|
|
<div class="bordered-container sheet-4th-level hack-container">
|
|
<h4 data-i18n="4th level">4th level
|
|
</h4>
|
|
<fieldset class="repeating_hack">
|
|
<input name="attr_action_proficiency" value="@{proficiency}" type="hidden" title="@{repeating_hack_$X_action_proficiency}"/>
|
|
<input class="level-display" name="attr_level" value="" type="hidden" title="@{repeating_hack_$X_level}"/>
|
|
<div class="expandable-section">
|
|
<input class="expand-control" name="attr_expand_item" value="1" type="hidden" title="@{repeating_hack_$X_expand_item}"/>
|
|
<label class="expand-button">
|
|
<input name="attr_expand_item" value="1" checked="" type="checkbox" title="@{repeating_hack_$X_expand_item}"/><span class="expand-state pictos">y</span>
|
|
</label>
|
|
<div class="expanded-view">
|
|
<div class="input-label-container name"><span class="input-label" data-i18n="name">name</span>
|
|
<input type="text" name="attr_name" title="@{repeating_hack_$X_name}"/>
|
|
</div>
|
|
<div class="input-label-container level"><span class="input-label" data-i18n="level">level</span>
|
|
<input type="number" name="attr_level" title="@{repeating_hack_$X_level}"/>
|
|
</div>
|
|
<div class="input-label-container launch time"><span class="input-label" data-i18n="launch time">launch time</span>
|
|
<input type="text" name="attr_launch_time" title="@{repeating_hack_$X_launch_time}"/>
|
|
</div>
|
|
<div class="input-label-container duration"><span class="input-label" data-i18n="duration">duration</span>
|
|
<input type="text" name="attr_duration" title="@{repeating_hack_$X_duration}"/>
|
|
</div>
|
|
<div class="input-label-container hack type"><span class="input-label" data-i18n="hack type">hack type</span>
|
|
<select type="select" name="attr_hack_type" title="@{repeating_hack_$X_hack_type}">
|
|
<option value="injection" data-i18n="injection">
|
|
</option>
|
|
<option value="gadget" data-i18n="gadget">
|
|
</option>
|
|
<option value="craft tech" data-i18n="craft tech">
|
|
</option>
|
|
<option value="craft explosive" data-i18n="craft explosive">
|
|
</option>
|
|
<option value="bot" data-i18n="bot">
|
|
</option>
|
|
<option value="mind" data-i18n="mind">
|
|
</option>
|
|
<option value="software" data-i18n="software">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container source"><span class="input-label" data-i18n="source">source</span>
|
|
<input type="text" name="attr_source" title="@{repeating_hack_$X_source}"/>
|
|
</div>
|
|
<div class="enable-holder">
|
|
<input class="enable-controller" name="attr_attack_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_attack_enable_item}"/>
|
|
<div class="enable-section attack">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_attack_enable_item" value="1" type="checkbox" title="@{repeating_hack_$X_attack_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="attack">attack</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container attack ability"><span class="input-label" data-i18n="attack ability">attack ability</span>
|
|
<select type="select" name="attr_attack_ability" title="@{repeating_hack_$X_attack_ability}">
|
|
<option value="hack" data-i18n="hack" selected="">
|
|
</option>
|
|
<option value="none" data-i18n="none">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container attack bonus"><span class="input-label" data-i18n="attack bonus">attack bonus</span>
|
|
<input type="text" name="attr_attack_bonus" title="@{repeating_hack_$X_attack_bonus}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_save_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_save_enable_item}"/>
|
|
<div class="enable-section save">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_save_enable_item" value="@{save_macro}" type="checkbox" title="@{repeating_hack_$X_save_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="save">save</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container save ability"><span class="input-label" data-i18n="save ability">save ability</span>
|
|
<select type="select" name="attr_save_ability" title="@{repeating_hack_$X_save_ability}">
|
|
<option value="hack" data-i18n="hack" selected="">
|
|
</option>
|
|
<option value="none" data-i18n="none">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container save type"><span class="input-label" data-i18n="save type">save type</span>
|
|
<select type="select" name="attr_save_type" title="@{repeating_hack_$X_save_type}">
|
|
<option value="none" data-i18n="none" selected="">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container dc bonus"><span class="input-label" data-i18n="dc bonus">dc bonus</span>
|
|
<input type="text" name="attr_dc_bonus" title="@{repeating_hack_$X_dc_bonus}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_damage_1_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_damage_1_enable_item}"/>
|
|
<div class="enable-section damage 1">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_damage_1_enable_item" value="{{damage_type_1=@{damage_type_1}}} @{damage_1_macro}" type="checkbox" title="@{repeating_hack_$X_damage_1_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="damage 1">damage 1</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container damage 1"><span class="input-label" data-i18n="damage 1">damage 1</span>
|
|
<input type="text" name="attr_damage_1" title="@{repeating_hack_$X_damage_1}"/>
|
|
</div>
|
|
<div class="input-label-container critical damage 1"><span class="input-label" data-i18n="critical damage 1">critical damage 1</span>
|
|
<input type="text" name="attr_critical_damage_1" title="@{repeating_hack_$X_critical_damage_1}"/>
|
|
</div>
|
|
<div class="input-label-container damage ability 1"><span class="input-label" data-i18n="damage ability 1">damage ability 1</span>
|
|
<select type="select" name="attr_damage_ability_1" title="@{repeating_hack_$X_damage_ability_1}">
|
|
<option value="none" data-i18n="none" selected="">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container damage type 1"><span class="input-label" data-i18n="damage type 1">damage type 1</span>
|
|
<input type="text" name="attr_damage_type_1" title="@{repeating_hack_$X_damage_type_1}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_damage_2_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_damage_2_enable_item}"/>
|
|
<div class="enable-section damage 2">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_damage_2_enable_item" value="{{damage_type_2=@{damage_type_2}}} @{damage_2_macro}" type="checkbox" title="@{repeating_hack_$X_damage_2_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="damage 2">damage 2</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container damage 2"><span class="input-label" data-i18n="damage 2">damage 2</span>
|
|
<input type="text" name="attr_damage_2" title="@{repeating_hack_$X_damage_2}"/>
|
|
</div>
|
|
<div class="input-label-container critical damage 2"><span class="input-label" data-i18n="critical damage 2">critical damage 2</span>
|
|
<input type="text" name="attr_critical_damage_2" title="@{repeating_hack_$X_critical_damage_2}"/>
|
|
</div>
|
|
<div class="input-label-container damage ability 2"><span class="input-label" data-i18n="damage ability 2">damage ability 2</span>
|
|
<select type="select" name="attr_damage_ability_2" title="@{repeating_hack_$X_damage_ability_2}">
|
|
<option value="none" data-i18n="none" selected="">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container damage type 2"><span class="input-label" data-i18n="damage type 2">damage type 2</span>
|
|
<input type="text" name="attr_damage_type_2" title="@{repeating_hack_$X_damage_type_2}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="input-label-container range"><span class="input-label" data-i18n="range">range</span>
|
|
<input type="text" name="attr_range" title="@{repeating_hack_$X_range}"/>
|
|
</div>
|
|
<div class="input-label-container properties"><span class="input-label" data-i18n="properties">properties</span>
|
|
<input type="text" name="attr_properties" title="@{repeating_hack_$X_properties}"/>
|
|
</div>
|
|
<div class="input-label-container description"><span class="input-label" data-i18n="description">description</span><!-- repeating_hack_$X_ -->
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_description_in_chat" value="1" checked="" type="checkbox" title="@{repeating_hack_$X_description_in_chat}"/><span class="hexagon"></span>
|
|
</div>
|
|
</label>
|
|
<textarea type="textarea" name="attr_description" title="@{repeating_hack_$X_description}"></textarea>
|
|
</div>
|
|
<input class="id" name="attr_id" readonly="" value="" type="text" title="@{repeating_hack_$X_id}"/>
|
|
</div>
|
|
<div class="collapsed-view">
|
|
<button class="roller" name="roll_roll" value="@{action}" title="%{repeating_hack_$X_roll}" type="roll">
|
|
</button>
|
|
<button name="act_action" hidden="" type="action" title="%{repeating_hack_$X_action}">
|
|
</button>
|
|
<input name="attr_action" type="hidden" title="@{repeating_hack_$X_action}"/>
|
|
<input class="hack-type" name="attr_hack_type" value="injection" type="hidden" title="@{repeating_hack_$X_hack_type}"/><span class="name" name="attr_name" value="" title="@{repeating_hack_$X_name}"></span><span class="hack-type" name="attr_hack_type" value="" title="@{repeating_hack_$X_hack_type}"></span>
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
<div class="pseudo-control">
|
|
<button class="repcontrol_add" name="act_add-4th_hack" type="action" title="%{add-4th_hack}">
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div class="hack-master-container">
|
|
<div class="hack-header pentagon-hexagon-label-container">
|
|
<div class="true-hexagon polygon">
|
|
<input name="attr_5th_level_slots" type="number" title="@{5th_level_slots}"/>
|
|
</div><span class="current label" data-i18n="current"></span>
|
|
<div class="true-pentagon polygon">
|
|
<input name="attr_5th_level_slots_max" type="number" title="@{5th_level_slots|max}"/>
|
|
</div><span class="max label" data-i18n="max"></span>
|
|
</div>
|
|
<div class="bordered-container sheet-5th-level hack-container">
|
|
<h4 data-i18n="5th level">5th level
|
|
</h4>
|
|
<fieldset class="repeating_hack">
|
|
<input name="attr_action_proficiency" value="@{proficiency}" type="hidden" title="@{repeating_hack_$X_action_proficiency}"/>
|
|
<input class="level-display" name="attr_level" value="" type="hidden" title="@{repeating_hack_$X_level}"/>
|
|
<div class="expandable-section">
|
|
<input class="expand-control" name="attr_expand_item" value="1" type="hidden" title="@{repeating_hack_$X_expand_item}"/>
|
|
<label class="expand-button">
|
|
<input name="attr_expand_item" value="1" checked="" type="checkbox" title="@{repeating_hack_$X_expand_item}"/><span class="expand-state pictos">y</span>
|
|
</label>
|
|
<div class="expanded-view">
|
|
<div class="input-label-container name"><span class="input-label" data-i18n="name">name</span>
|
|
<input type="text" name="attr_name" title="@{repeating_hack_$X_name}"/>
|
|
</div>
|
|
<div class="input-label-container level"><span class="input-label" data-i18n="level">level</span>
|
|
<input type="number" name="attr_level" title="@{repeating_hack_$X_level}"/>
|
|
</div>
|
|
<div class="input-label-container launch time"><span class="input-label" data-i18n="launch time">launch time</span>
|
|
<input type="text" name="attr_launch_time" title="@{repeating_hack_$X_launch_time}"/>
|
|
</div>
|
|
<div class="input-label-container duration"><span class="input-label" data-i18n="duration">duration</span>
|
|
<input type="text" name="attr_duration" title="@{repeating_hack_$X_duration}"/>
|
|
</div>
|
|
<div class="input-label-container hack type"><span class="input-label" data-i18n="hack type">hack type</span>
|
|
<select type="select" name="attr_hack_type" title="@{repeating_hack_$X_hack_type}">
|
|
<option value="injection" data-i18n="injection">
|
|
</option>
|
|
<option value="gadget" data-i18n="gadget">
|
|
</option>
|
|
<option value="craft tech" data-i18n="craft tech">
|
|
</option>
|
|
<option value="craft explosive" data-i18n="craft explosive">
|
|
</option>
|
|
<option value="bot" data-i18n="bot">
|
|
</option>
|
|
<option value="mind" data-i18n="mind">
|
|
</option>
|
|
<option value="software" data-i18n="software">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container source"><span class="input-label" data-i18n="source">source</span>
|
|
<input type="text" name="attr_source" title="@{repeating_hack_$X_source}"/>
|
|
</div>
|
|
<div class="enable-holder">
|
|
<input class="enable-controller" name="attr_attack_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_attack_enable_item}"/>
|
|
<div class="enable-section attack">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_attack_enable_item" value="1" type="checkbox" title="@{repeating_hack_$X_attack_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="attack">attack</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container attack ability"><span class="input-label" data-i18n="attack ability">attack ability</span>
|
|
<select type="select" name="attr_attack_ability" title="@{repeating_hack_$X_attack_ability}">
|
|
<option value="hack" data-i18n="hack" selected="">
|
|
</option>
|
|
<option value="none" data-i18n="none">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container attack bonus"><span class="input-label" data-i18n="attack bonus">attack bonus</span>
|
|
<input type="text" name="attr_attack_bonus" title="@{repeating_hack_$X_attack_bonus}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_save_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_save_enable_item}"/>
|
|
<div class="enable-section save">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_save_enable_item" value="@{save_macro}" type="checkbox" title="@{repeating_hack_$X_save_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="save">save</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container save ability"><span class="input-label" data-i18n="save ability">save ability</span>
|
|
<select type="select" name="attr_save_ability" title="@{repeating_hack_$X_save_ability}">
|
|
<option value="hack" data-i18n="hack" selected="">
|
|
</option>
|
|
<option value="none" data-i18n="none">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container save type"><span class="input-label" data-i18n="save type">save type</span>
|
|
<select type="select" name="attr_save_type" title="@{repeating_hack_$X_save_type}">
|
|
<option value="none" data-i18n="none" selected="">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container dc bonus"><span class="input-label" data-i18n="dc bonus">dc bonus</span>
|
|
<input type="text" name="attr_dc_bonus" title="@{repeating_hack_$X_dc_bonus}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_damage_1_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_damage_1_enable_item}"/>
|
|
<div class="enable-section damage 1">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_damage_1_enable_item" value="{{damage_type_1=@{damage_type_1}}} @{damage_1_macro}" type="checkbox" title="@{repeating_hack_$X_damage_1_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="damage 1">damage 1</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container damage 1"><span class="input-label" data-i18n="damage 1">damage 1</span>
|
|
<input type="text" name="attr_damage_1" title="@{repeating_hack_$X_damage_1}"/>
|
|
</div>
|
|
<div class="input-label-container critical damage 1"><span class="input-label" data-i18n="critical damage 1">critical damage 1</span>
|
|
<input type="text" name="attr_critical_damage_1" title="@{repeating_hack_$X_critical_damage_1}"/>
|
|
</div>
|
|
<div class="input-label-container damage ability 1"><span class="input-label" data-i18n="damage ability 1">damage ability 1</span>
|
|
<select type="select" name="attr_damage_ability_1" title="@{repeating_hack_$X_damage_ability_1}">
|
|
<option value="none" data-i18n="none" selected="">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container damage type 1"><span class="input-label" data-i18n="damage type 1">damage type 1</span>
|
|
<input type="text" name="attr_damage_type_1" title="@{repeating_hack_$X_damage_type_1}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_damage_2_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_damage_2_enable_item}"/>
|
|
<div class="enable-section damage 2">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_damage_2_enable_item" value="{{damage_type_2=@{damage_type_2}}} @{damage_2_macro}" type="checkbox" title="@{repeating_hack_$X_damage_2_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="damage 2">damage 2</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container damage 2"><span class="input-label" data-i18n="damage 2">damage 2</span>
|
|
<input type="text" name="attr_damage_2" title="@{repeating_hack_$X_damage_2}"/>
|
|
</div>
|
|
<div class="input-label-container critical damage 2"><span class="input-label" data-i18n="critical damage 2">critical damage 2</span>
|
|
<input type="text" name="attr_critical_damage_2" title="@{repeating_hack_$X_critical_damage_2}"/>
|
|
</div>
|
|
<div class="input-label-container damage ability 2"><span class="input-label" data-i18n="damage ability 2">damage ability 2</span>
|
|
<select type="select" name="attr_damage_ability_2" title="@{repeating_hack_$X_damage_ability_2}">
|
|
<option value="none" data-i18n="none" selected="">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container damage type 2"><span class="input-label" data-i18n="damage type 2">damage type 2</span>
|
|
<input type="text" name="attr_damage_type_2" title="@{repeating_hack_$X_damage_type_2}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="input-label-container range"><span class="input-label" data-i18n="range">range</span>
|
|
<input type="text" name="attr_range" title="@{repeating_hack_$X_range}"/>
|
|
</div>
|
|
<div class="input-label-container properties"><span class="input-label" data-i18n="properties">properties</span>
|
|
<input type="text" name="attr_properties" title="@{repeating_hack_$X_properties}"/>
|
|
</div>
|
|
<div class="input-label-container description"><span class="input-label" data-i18n="description">description</span><!-- repeating_hack_$X_ -->
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_description_in_chat" value="1" checked="" type="checkbox" title="@{repeating_hack_$X_description_in_chat}"/><span class="hexagon"></span>
|
|
</div>
|
|
</label>
|
|
<textarea type="textarea" name="attr_description" title="@{repeating_hack_$X_description}"></textarea>
|
|
</div>
|
|
<input class="id" name="attr_id" readonly="" value="" type="text" title="@{repeating_hack_$X_id}"/>
|
|
</div>
|
|
<div class="collapsed-view">
|
|
<button class="roller" name="roll_roll" value="@{action}" title="%{repeating_hack_$X_roll}" type="roll">
|
|
</button>
|
|
<button name="act_action" hidden="" type="action" title="%{repeating_hack_$X_action}">
|
|
</button>
|
|
<input name="attr_action" type="hidden" title="@{repeating_hack_$X_action}"/>
|
|
<input class="hack-type" name="attr_hack_type" value="injection" type="hidden" title="@{repeating_hack_$X_hack_type}"/><span class="name" name="attr_name" value="" title="@{repeating_hack_$X_name}"></span><span class="hack-type" name="attr_hack_type" value="" title="@{repeating_hack_$X_hack_type}"></span>
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
<div class="pseudo-control">
|
|
<button class="repcontrol_add" name="act_add-5th_hack" type="action" title="%{add-5th_hack}">
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="settings">
|
|
<div class="column">
|
|
<div class="bordered-container character-options">
|
|
<div>
|
|
<div class="gutter"></div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="carrying capacity modifier">carrying capacity modifier</span>
|
|
<input type="number" name="attr_carrying_capacity_modifier" value="7" title="@{carrying_capacity_modifier}"/>
|
|
</div>
|
|
<div class="input-label-container">
|
|
<div><span class="input-label" data-i18n="add initiative tiebreaker"></span>
|
|
<input type="checkbox" name="attr_initiative_tiebreaker" value="@{initiative}" checked="" title="@{initiative_tiebreaker}"/>
|
|
</div>
|
|
</div>
|
|
<div class="gutter"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="column">
|
|
<div class="bordered-container sheet-options">
|
|
<div>
|
|
<div class="gutter"></div>
|
|
<div class="grid-container">
|
|
<div class="bordered-checkbox pc-checkbox">
|
|
<input name="attr_character_type" value="pc" checked="true" type="radio" title="@{character_type}"/><span data-i18n="pc"></span>
|
|
</div>
|
|
<div class="bordered-checkbox npc-checkbox">
|
|
<input name="attr_character_type" value="npc" type="radio" title="@{character_type}"/><span data-i18n="npc"></span>
|
|
</div>
|
|
</div>
|
|
<div class="gutter"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="column">
|
|
<div class="bordered-container sheet-options">
|
|
<div>
|
|
<div class="gutter"></div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="whisper rolls to gm">whisper rolls to gm</span>
|
|
<select type="select" name="attr_whisper_state" title="@{whisper_state}">
|
|
<option value=" " data-i18n="never" selected="true">
|
|
</option>
|
|
<option value="/w gm " data-i18n="always">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container">
|
|
<div><span class="input-label" data-i18n="show character name in templates"></span>
|
|
<input type="checkbox" name="attr_show_character_name" value="{{character_name=@{character_name}}} {{character_id=@{character_id}}}" checked="" title="@{show_character_name}"/>
|
|
</div>
|
|
</div>
|
|
<div class="gutter"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="npc">
|
|
<div class="toggles">
|
|
<div class="toggle-row">
|
|
<div class="bordered-checkbox settings">
|
|
<input class="settings" type="checkbox" value="settings" name="attr_sheet_view" title="@{sheet_view}"/><span class="settings pictos" contents="y">y</span>
|
|
<input class="npc" type="checkbox" value="in-play" name="attr_sheet_view" title="@{sheet_view}"/><span class="settings pictos" contents="x">x</span>
|
|
</div>
|
|
<div class="bordered-checkbox whisper">
|
|
<input class="whisper" type="checkbox" value="/w gm " name="attr_whisper_state" title="@{whisper_state}"/><span class="whisper pictos" contents="q">q</span>
|
|
<input class="public" type="checkbox" value=" " name="attr_whisper_state" checked="" title="@{whisper_state}"/><span class="public pictos" contents="w">w</span>
|
|
</div>
|
|
<div class="bordered-checkbox advantage">
|
|
<input class="advantage" type="radio" value="2d20kh1" name="attr_advantage_state" title="@{advantage_state}"/><span class="advantage" data-i18n="advantage"></span>
|
|
</div>
|
|
<div class="bordered-checkbox normal">
|
|
<input class="normal" type="radio" value="1d20" name="attr_advantage_state" checked="checked" title="@{advantage_state}"/><span class="normal" data-i18n="normal"></span>
|
|
</div>
|
|
<div class="bordered-checkbox disadvantage">
|
|
<input class="disadvantage" type="radio" value="2d20kl1" name="attr_advantage_state" title="@{advantage_state}"/><span class="disadvantage" data-i18n="disadvantage"></span>
|
|
</div>
|
|
<div class="bordered-checkbox query">
|
|
<input class="query" type="radio" value="?{Advantage|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}" name="attr_advantage_state" title="@{advantage_state}"/><span class="query" data-i18n="query"></span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="npc-info">
|
|
<div class="statblock-section">
|
|
<input class="h2" name="attr_character_name" type="text" title="@{character_name}"/>
|
|
</div>
|
|
<div class="statblock">
|
|
<div class="settings">
|
|
<div class="import">
|
|
<div class="statblock-section">
|
|
<div class="grid-container">
|
|
<div class="bordered-checkbox import">
|
|
<input class="import-process" type="checkbox" value="import-process" name="attr_import" title="@{import}"/><span class="import-process" data-i18n="import"></span>
|
|
</div>
|
|
<div class="bordered-checkbox import-cancel">
|
|
<input class="import-cancel" type="checkbox" value="cancel" name="attr_import_cancel" title="@{import_cancel}"/><span class="import-cancel" data-i18n="cancel"></span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="statblock-section import-area">
|
|
<h4 class="import-confirm" data-i18n="confirm import, this will overwrite all data on the character"></h4>
|
|
<textarea name="attr_importer" data-i18n-placehodler="Enter the NPCs statblock here to automatically import" title="@{importer}"></textarea>
|
|
</div>
|
|
</div>
|
|
<div class="statblock-section">
|
|
<div class="grid-container">
|
|
<div class="bordered-checkbox pc-checkbox">
|
|
<input name="attr_character_type" value="pc" type="radio" title="@{character_type}"/><span data-i18n="pc"></span>
|
|
</div>
|
|
<div class="bordered-checkbox npc-checkbox">
|
|
<input name="attr_character_type" value="npc" type="radio" title="@{character_type}"/><span data-i18n="npc"></span>
|
|
</div>
|
|
<div class="bordered-checkbox import">
|
|
<input class="import" type="checkbox" value="import" name="attr_import" title="@{import}"/><span class="import" data-i18n="import"></span>
|
|
</div>
|
|
</div>
|
|
<div class="grid-container" style="margin-bottom:0.5em"></div>
|
|
</div>
|
|
<div class="statblock-section">
|
|
<div class="row">
|
|
<div class="input-label-container"><span class="input-label" data-i18n="size">size</span>
|
|
<input type="text" name="attr_size" title="@{size}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="genome">genome</span>
|
|
<input type="text" name="attr_genome" title="@{genome}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="modification">modification</span>
|
|
<input type="text" name="attr_modification" title="@{modification}"/>
|
|
</div>
|
|
<div class="input-label-container">
|
|
<button class="roller" type="roll" name="roll_initiative" data-i18n="initiative" value="@{initiative_action}" content="initiative" title="%{initiative}">
|
|
</button>
|
|
<button name="act_initiative-action" hidden="" type="action" title="%{initiative-action}">
|
|
</button>
|
|
<input name="attr_initiative_action" type="hidden" title="@{initiative_action}"/>
|
|
<input name="attr_initiative" value="0" type="number" title="@{initiative}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="statblock-section">
|
|
<div class="row">
|
|
<div class="input-label-container"><span class="input-label" data-i18n="ac">ac</span>
|
|
<input type="number" name="attr_ac" title="@{ac}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="damage reduction">damage reduction</span>
|
|
<input type="text" name="attr_damage_reduction" title="@{damage_reduction}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="hit points">hit points</span>
|
|
<input type="number" name="attr_hit_points" title="@{hit_points}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="hit dice">hit dice</span>
|
|
<input type="text" name="attr_hit_dice" title="@{hit_dice}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="speed">speed</span>
|
|
<input type="text" name="attr_speed" title="@{speed}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="statblock-section">
|
|
<div class="ability-row">
|
|
<div class="input-label-container pseudo-number"><span class="input-label" data-i18n="strength">strength</span>
|
|
<input type="text" name="attr_strength" value="10" title="@{strength}"/>
|
|
</div>
|
|
<div class="input-label-container pseudo-number"><span class="input-label" data-i18n="dexterity">dexterity</span>
|
|
<input type="text" name="attr_dexterity" value="10" title="@{dexterity}"/>
|
|
</div>
|
|
<div class="input-label-container pseudo-number"><span class="input-label" data-i18n="constitution">constitution</span>
|
|
<input type="text" name="attr_constitution" value="10" title="@{constitution}"/>
|
|
</div>
|
|
<div class="input-label-container pseudo-number"><span class="input-label" data-i18n="intelligence">intelligence</span>
|
|
<input type="text" name="attr_intelligence" value="10" title="@{intelligence}"/>
|
|
</div>
|
|
<div class="input-label-container pseudo-number"><span class="input-label" data-i18n="wisdom">wisdom</span>
|
|
<input type="text" name="attr_wisdom" value="10" title="@{wisdom}"/>
|
|
</div>
|
|
<div class="input-label-container pseudo-number"><span class="input-label" data-i18n="charisma">charisma</span>
|
|
<input type="text" name="attr_charisma" value="10" title="@{charisma}"/>
|
|
</div>
|
|
<h4 class="save-header" data-i18n="saves"></h4>
|
|
<div class="input-label-container">
|
|
<input type="number" name="attr_strength_save_base" title="@{strength_save_base}"/>
|
|
</div>
|
|
<div class="input-label-container">
|
|
<input type="number" name="attr_dexterity_save_base" title="@{dexterity_save_base}"/>
|
|
</div>
|
|
<div class="input-label-container">
|
|
<input type="number" name="attr_constitution_save_base" title="@{constitution_save_base}"/>
|
|
</div>
|
|
<div class="input-label-container">
|
|
<input type="number" name="attr_intelligence_save_base" title="@{intelligence_save_base}"/>
|
|
</div>
|
|
<div class="input-label-container">
|
|
<input type="number" name="attr_wisdom_save_base" title="@{wisdom_save_base}"/>
|
|
</div>
|
|
<div class="input-label-container">
|
|
<input type="number" name="attr_charisma_save_base" title="@{charisma_save_base}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="statblock-section">
|
|
<div class="row">
|
|
<div class="input-label-container"><span class="input-label" data-i18n="condition immunities">condition immunities</span>
|
|
<input type="text" name="attr_condition_immunities" title="@{condition_immunities}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="damage immunities">damage immunities</span>
|
|
<input type="text" name="attr_damage_immunities" title="@{damage_immunities}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="damage resistances">damage resistances</span>
|
|
<input type="text" name="attr_damage_resistances" title="@{damage_resistances}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="damage vulnerability">damage vulnerability</span>
|
|
<input type="text" name="attr_damage_vulnerability" title="@{damage_vulnerability}"/>
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="input-label-container"><span class="input-label" data-i18n="athletics">athletics</span>
|
|
<input type="number" name="attr_athletics" title="@{athletics}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="acrobatics">acrobatics</span>
|
|
<input type="number" name="attr_acrobatics" title="@{acrobatics}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="drive">drive</span>
|
|
<input type="number" name="attr_drive" title="@{drive}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="sleight of hand">sleight of hand</span>
|
|
<input type="number" name="attr_sleight_of_hand" title="@{sleight_of_hand}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="stealth">stealth</span>
|
|
<input type="number" name="attr_stealth" title="@{stealth}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="bureaucracy">bureaucracy</span>
|
|
<input type="number" name="attr_bureaucracy" title="@{bureaucracy}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="computers">computers</span>
|
|
<input type="number" name="attr_computers" title="@{computers}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="investigation">investigation</span>
|
|
<input type="number" name="attr_investigation" title="@{investigation}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="life science">life science</span>
|
|
<input type="number" name="attr_life_science" title="@{life_science}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="mechanics">mechanics</span>
|
|
<input type="number" name="attr_mechanics" title="@{mechanics}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="physical science">physical science</span>
|
|
<input type="number" name="attr_physical_science" title="@{physical_science}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="social science">social science</span>
|
|
<input type="number" name="attr_social_science" title="@{social_science}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="streetwise">streetwise</span>
|
|
<input type="number" name="attr_streetwise" title="@{streetwise}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="insight">insight</span>
|
|
<input type="number" name="attr_insight" title="@{insight}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="perception">perception</span>
|
|
<input type="number" name="attr_perception" title="@{perception}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="survival">survival</span>
|
|
<input type="number" name="attr_survival" title="@{survival}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="deception">deception</span>
|
|
<input type="number" name="attr_deception" title="@{deception}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="intimidation">intimidation</span>
|
|
<input type="number" name="attr_intimidation" title="@{intimidation}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="performance">performance</span>
|
|
<input type="number" name="attr_performance" title="@{performance}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="persuasion">persuasion</span>
|
|
<input type="number" name="attr_persuasion" title="@{persuasion}"/>
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="input-label-container"><span class="input-label" data-i18n="skill notes">skill notes</span>
|
|
<input type="text" name="attr_skill_notes" title="@{skill_notes}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="senses">senses</span>
|
|
<input type="text" name="attr_senses" title="@{senses}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="passive perception">passive perception</span>
|
|
<input type="number" name="attr_passive_perception" title="@{passive_perception}"/>
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="input-label-container"><span class="input-label" data-i18n="languages">languages</span>
|
|
<input type="text" name="attr_languages" title="@{languages}"/>
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="input-label-container"><span class="input-label" data-i18n="challenge">challenge</span>
|
|
<input type="text" name="attr_challenge" title="@{challenge}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="experience points">xp</span>
|
|
<input type="number" name="attr_experience_points" title="@{experience_points}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="statblock-section">
|
|
<div class="row">
|
|
<div class="input-label-container"><span class="input-label" data-i18n="hacker level">hacker level</span>
|
|
<input type="number" name="attr_hacker_level" title="@{hacker_level}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="hacking ability">hacking ability</span>
|
|
<select type="select" name="attr_hacking_ability" title="@{hacking_ability}">
|
|
<option selected="">
|
|
</option>
|
|
<option>
|
|
</option>
|
|
<option>
|
|
</option>
|
|
<option>
|
|
</option>
|
|
<option>
|
|
</option>
|
|
<option>
|
|
</option>
|
|
<option>
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="hack dc">hack dc</span>
|
|
<input type="number" name="attr_hack_dc" title="@{hack_dc}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="hack attack">hack attack</span>
|
|
<input type="number" name="attr_hack_attack" title="@{hack_attack}"/>
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="input-label-container"><span class="input-label" data-i18n="1st level slots">1st level slots</span>
|
|
<input type="number" name="attr_1st_level_slots" title="@{1st_level_slots}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="2nd level slots">2nd level slots</span>
|
|
<input type="number" name="attr_2nd_level_slots" title="@{2nd_level_slots}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="3rd level slots">3rd level slots</span>
|
|
<input type="number" name="attr_3rd_level_slots" title="@{3rd_level_slots}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="4th level slots">4th level slots</span>
|
|
<input type="number" name="attr_4th_level_slots" title="@{4th_level_slots}"/>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="5th level slots">5th level slots</span>
|
|
<input type="number" name="attr_5th_level_slots" title="@{5th_level_slots}"/>
|
|
</div>
|
|
</div>
|
|
<fieldset class="repeating_hack">
|
|
<input name="attr_action_proficiency" value="@{proficiency}" type="hidden" title="@{repeating_hack_$X_action_proficiency}"/>
|
|
<input class="level-display" name="attr_level" value="" type="hidden" title="@{repeating_hack_$X_level}"/>
|
|
<div class="expandable-section">
|
|
<input class="expand-control" name="attr_expand_item" value="1" type="hidden" title="@{repeating_hack_$X_expand_item}"/>
|
|
<label class="expand-button">
|
|
<input name="attr_expand_item" value="1" checked="" type="checkbox" title="@{repeating_hack_$X_expand_item}"/><span class="expand-state pictos">y</span>
|
|
</label>
|
|
<div class="expanded-view">
|
|
<div class="input-label-container name"><span class="input-label" data-i18n="name">name</span>
|
|
<input type="text" name="attr_name" title="@{repeating_hack_$X_name}"/>
|
|
</div>
|
|
<div class="input-label-container level"><span class="input-label" data-i18n="level">level</span>
|
|
<input type="number" name="attr_level" title="@{repeating_hack_$X_level}"/>
|
|
</div>
|
|
<div class="input-label-container launch time"><span class="input-label" data-i18n="launch time">launch time</span>
|
|
<input type="text" name="attr_launch_time" title="@{repeating_hack_$X_launch_time}"/>
|
|
</div>
|
|
<div class="input-label-container duration"><span class="input-label" data-i18n="duration">duration</span>
|
|
<input type="text" name="attr_duration" title="@{repeating_hack_$X_duration}"/>
|
|
</div>
|
|
<div class="input-label-container hack type"><span class="input-label" data-i18n="hack type">hack type</span>
|
|
<select type="select" name="attr_hack_type" title="@{repeating_hack_$X_hack_type}">
|
|
<option value="injection" data-i18n="injection">
|
|
</option>
|
|
<option value="gadget" data-i18n="gadget">
|
|
</option>
|
|
<option value="craft tech" data-i18n="craft tech">
|
|
</option>
|
|
<option value="craft explosive" data-i18n="craft explosive">
|
|
</option>
|
|
<option value="bot" data-i18n="bot">
|
|
</option>
|
|
<option value="mind" data-i18n="mind">
|
|
</option>
|
|
<option value="software" data-i18n="software">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container source"><span class="input-label" data-i18n="source">source</span>
|
|
<input type="text" name="attr_source" title="@{repeating_hack_$X_source}"/>
|
|
</div>
|
|
<div class="enable-holder">
|
|
<input class="enable-controller" name="attr_attack_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_attack_enable_item}"/>
|
|
<div class="enable-section attack">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_attack_enable_item" value="1" type="checkbox" title="@{repeating_hack_$X_attack_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="attack">attack</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container attack bonus"><span class="input-label" data-i18n="attack bonus">attack bonus</span>
|
|
<input type="text" name="attr_attack_bonus" title="@{repeating_hack_$X_attack_bonus}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_save_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_save_enable_item}"/>
|
|
<div class="enable-section save">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_save_enable_item" value="@{save_macro}" type="checkbox" title="@{repeating_hack_$X_save_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="save">save</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container save type"><span class="input-label" data-i18n="save type">save type</span>
|
|
<select type="select" name="attr_save_type" title="@{repeating_hack_$X_save_type}">
|
|
<option value="none" data-i18n="none" selected="">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container dc bonus"><span class="input-label" data-i18n="dc bonus">dc bonus</span>
|
|
<input type="text" name="attr_dc_bonus" title="@{repeating_hack_$X_dc_bonus}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_damage_1_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_damage_1_enable_item}"/>
|
|
<div class="enable-section damage 1">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_damage_1_enable_item" value="{{damage_type_1=@{damage_type_1}}} @{damage_1_macro}" type="checkbox" title="@{repeating_hack_$X_damage_1_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="damage 1">damage 1</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container damage 1"><span class="input-label" data-i18n="damage 1">damage 1</span>
|
|
<input type="text" name="attr_damage_1" title="@{repeating_hack_$X_damage_1}"/>
|
|
</div>
|
|
<div class="input-label-container critical damage 1"><span class="input-label" data-i18n="critical damage 1">critical damage 1</span>
|
|
<input type="text" name="attr_critical_damage_1" title="@{repeating_hack_$X_critical_damage_1}"/>
|
|
</div>
|
|
<div class="input-label-container damage type 1"><span class="input-label" data-i18n="damage type 1">damage type 1</span>
|
|
<input type="text" name="attr_damage_type_1" title="@{repeating_hack_$X_damage_type_1}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_damage_2_enable_item" value="0" type="hidden" title="@{repeating_hack_$X_damage_2_enable_item}"/>
|
|
<div class="enable-section damage 2">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_damage_2_enable_item" value="{{damage_type_2=@{damage_type_2}}} @{damage_2_macro}" type="checkbox" title="@{repeating_hack_$X_damage_2_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="damage 2">damage 2</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container damage 2"><span class="input-label" data-i18n="damage 2">damage 2</span>
|
|
<input type="text" name="attr_damage_2" title="@{repeating_hack_$X_damage_2}"/>
|
|
</div>
|
|
<div class="input-label-container critical damage 2"><span class="input-label" data-i18n="critical damage 2">critical damage 2</span>
|
|
<input type="text" name="attr_critical_damage_2" title="@{repeating_hack_$X_critical_damage_2}"/>
|
|
</div>
|
|
<div class="input-label-container damage type 2"><span class="input-label" data-i18n="damage type 2">damage type 2</span>
|
|
<input type="text" name="attr_damage_type_2" title="@{repeating_hack_$X_damage_type_2}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="input-label-container range"><span class="input-label" data-i18n="range">range</span>
|
|
<input type="text" name="attr_range" title="@{repeating_hack_$X_range}"/>
|
|
</div>
|
|
<div class="input-label-container properties"><span class="input-label" data-i18n="properties">properties</span>
|
|
<input type="text" name="attr_properties" title="@{repeating_hack_$X_properties}"/>
|
|
</div>
|
|
<div class="input-label-container description"><span class="input-label" data-i18n="description">description</span><!-- repeating_hack_$X_ -->
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_description_in_chat" value="1" checked="" type="checkbox" title="@{repeating_hack_$X_description_in_chat}"/><span class="hexagon"></span>
|
|
</div>
|
|
</label>
|
|
<textarea type="textarea" name="attr_description" title="@{repeating_hack_$X_description}"></textarea>
|
|
</div>
|
|
<input class="id" name="attr_id" readonly="" value="" type="text" title="@{repeating_hack_$X_id}"/>
|
|
</div>
|
|
<div class="collapsed-view">
|
|
<button class="roller" name="roll_roll" value="@{action}" title="%{repeating_hack_$X_roll}" type="roll">
|
|
</button>
|
|
<button name="act_action" hidden="" type="action" title="%{repeating_hack_$X_action}">
|
|
</button>
|
|
<input name="attr_action" type="hidden" title="@{repeating_hack_$X_action}"/>
|
|
<input class="hack-type" name="attr_hack_type" value="injection" type="hidden" title="@{repeating_hack_$X_hack_type}"/><span class="name" name="attr_name" value="" title="@{repeating_hack_$X_name}"></span><span class="hack-type" name="attr_hack_type" value="" title="@{repeating_hack_$X_hack_type}"></span>
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
</div>
|
|
</div>
|
|
<div class="in-play">
|
|
<div class="statblock-section">
|
|
<div class="row"><span class="italics parens" name="attr_size" title="@{size}"></span><span class="italics parens" name="attr_genome" title="@{genome}"></span>
|
|
<input class="parens-control" name="attr_modification" type="hidden" title="@{modification}"/><span class="italics parens">(</span><span class="italics parens" name="attr_modification" title="@{modification}"></span><span class="italics parens">)</span>
|
|
<button class="h4 roller" type="roll" name="roll_initiative" data-i18n="initiative" value="@{initiative_action}" content="initiative" title="%{initiative}">
|
|
</button>
|
|
<button name="act_initiative-action" hidden="" type="action" title="%{initiative-action}">
|
|
</button>
|
|
<input name="attr_initiative_action" type="hidden" title="@{initiative_action}"/>
|
|
<input class="plus-control hidden" name="attr_initiative" value="0" min="0" type="number" title="@{initiative}"/><span class="mod plus-display" name="attr_initiative" title="@{initiative}"></span>
|
|
</div>
|
|
</div>
|
|
<div class="statblock-section">
|
|
<div class="row">
|
|
<h4 data-i18n="armor class"></h4><span name="attr_ac" title="@{ac}"></span>
|
|
<input class="parens-control" name="attr_ac_notes" type="hidden" title="@{ac_notes}"/><span class="italics parens">(</span><span class="italics parens" name="attr_ac_notes" title="@{ac_notes}"></span><span class="italics parens">)</span>
|
|
</div>
|
|
<div class="row">
|
|
<h4 data-i18n="damage reduction"></h4><span name="attr_damage_reduction" title="@{damage_reduction}"></span>
|
|
</div>
|
|
<div class="row">
|
|
<h4 data-i18n="hit points"></h4><span name="attr_hp" title="@{hp}"></span>
|
|
<input class="parens-control" name="attr_hit_dice" type="hidden" title="@{hit_dice}"/><span class="italics parens">(</span><span class="italics parens" name="attr_hit_dice" title="@{hit_dice}"></span><span class="italics parens">)</span>
|
|
</div>
|
|
<div class="row">
|
|
<h4 data-i18n="speed"></h4><span name="attr_speed" title="@{speed}"></span>
|
|
</div>
|
|
</div>
|
|
<div class="statblock-section">
|
|
<div class="row">
|
|
<div class="npc-ability-label">
|
|
<button class="h4 roller" data-i18n="strength abbreviation" name="roll_strength" value="@{strength_action}" title="%{strength}" type="roll">
|
|
</button>
|
|
<button name="act_strength-action" hidden="" type="action" title="%{strength-action}">
|
|
</button>
|
|
<input name="attr_strength_action" type="hidden" title="@{strength_action}"/><span class="score" name="attr_strength"></span>
|
|
<div class="paren-container">
|
|
<input class="parens-control" name="attr_strength" value="10" type="hidden" title="@{strength}"/><span class="parens">(</span>
|
|
<input class="plus-control hidden" name="attr_strength_mod" value="0" min="0" type="number" title="@{strength_mod}"/><span class="mod plus-display" name="attr_strength_mod" title="@{strength_mod}"></span><span class="parens">)</span>
|
|
</div>
|
|
<button class="h4 save-label roller" data-i18n="save" name="roll_strength_save" value="@{strength_save_action}" title="%{strength_save}" type="roll">
|
|
</button>
|
|
<button name="act_strength-save-action" hidden="" type="action" title="%{strength-save-action}">
|
|
</button>
|
|
<input name="attr_strength_save_action" type="hidden" title="@{strength_save_action}"/>
|
|
<input class="plus-control hidden" name="attr_strength_save_base" value="0" min="0" type="number" title="@{strength_save_base}"/><span class="save plus-display" name="attr_strength_save_base" title="@{strength_save_base}"></span>
|
|
</div>
|
|
<div class="npc-ability-label">
|
|
<button class="h4 roller" data-i18n="dexterity abbreviation" name="roll_dexterity" value="@{dexterity_action}" title="%{dexterity}" type="roll">
|
|
</button>
|
|
<button name="act_dexterity-action" hidden="" type="action" title="%{dexterity-action}">
|
|
</button>
|
|
<input name="attr_dexterity_action" type="hidden" title="@{dexterity_action}"/><span class="score" name="attr_dexterity"></span>
|
|
<div class="paren-container">
|
|
<input class="parens-control" name="attr_dexterity" value="10" type="hidden" title="@{dexterity}"/><span class="parens">(</span>
|
|
<input class="plus-control hidden" name="attr_dexterity_mod" value="0" min="0" type="number" title="@{dexterity_mod}"/><span class="mod plus-display" name="attr_dexterity_mod" title="@{dexterity_mod}"></span><span class="parens">)</span>
|
|
</div>
|
|
<button class="h4 save-label roller" data-i18n="save" name="roll_dexterity_save" value="@{dexterity_save_action}" title="%{dexterity_save}" type="roll">
|
|
</button>
|
|
<button name="act_dexterity-save-action" hidden="" type="action" title="%{dexterity-save-action}">
|
|
</button>
|
|
<input name="attr_dexterity_save_action" type="hidden" title="@{dexterity_save_action}"/>
|
|
<input class="plus-control hidden" name="attr_dexterity_save_base" value="0" min="0" type="number" title="@{dexterity_save_base}"/><span class="save plus-display" name="attr_dexterity_save_base" title="@{dexterity_save_base}"></span>
|
|
</div>
|
|
<div class="npc-ability-label">
|
|
<button class="h4 roller" data-i18n="constitution abbreviation" name="roll_constitution" value="@{constitution_action}" title="%{constitution}" type="roll">
|
|
</button>
|
|
<button name="act_constitution-action" hidden="" type="action" title="%{constitution-action}">
|
|
</button>
|
|
<input name="attr_constitution_action" type="hidden" title="@{constitution_action}"/><span class="score" name="attr_constitution"></span>
|
|
<div class="paren-container">
|
|
<input class="parens-control" name="attr_constitution" value="10" type="hidden" title="@{constitution}"/><span class="parens">(</span>
|
|
<input class="plus-control hidden" name="attr_constitution_mod" value="0" min="0" type="number" title="@{constitution_mod}"/><span class="mod plus-display" name="attr_constitution_mod" title="@{constitution_mod}"></span><span class="parens">)</span>
|
|
</div>
|
|
<button class="h4 save-label roller" data-i18n="save" name="roll_constitution_save" value="@{constitution_save_action}" title="%{constitution_save}" type="roll">
|
|
</button>
|
|
<button name="act_constitution-save-action" hidden="" type="action" title="%{constitution-save-action}">
|
|
</button>
|
|
<input name="attr_constitution_save_action" type="hidden" title="@{constitution_save_action}"/>
|
|
<input class="plus-control hidden" name="attr_constitution_save_base" value="0" min="0" type="number" title="@{constitution_save_base}"/><span class="save plus-display" name="attr_constitution_save_base" title="@{constitution_save_base}"></span>
|
|
</div>
|
|
<div class="npc-ability-label">
|
|
<button class="h4 roller" data-i18n="intelligence abbreviation" name="roll_intelligence" value="@{intelligence_action}" title="%{intelligence}" type="roll">
|
|
</button>
|
|
<button name="act_intelligence-action" hidden="" type="action" title="%{intelligence-action}">
|
|
</button>
|
|
<input name="attr_intelligence_action" type="hidden" title="@{intelligence_action}"/><span class="score" name="attr_intelligence"></span>
|
|
<div class="paren-container">
|
|
<input class="parens-control" name="attr_intelligence" value="10" type="hidden" title="@{intelligence}"/><span class="parens">(</span>
|
|
<input class="plus-control hidden" name="attr_intelligence_mod" value="0" min="0" type="number" title="@{intelligence_mod}"/><span class="mod plus-display" name="attr_intelligence_mod" title="@{intelligence_mod}"></span><span class="parens">)</span>
|
|
</div>
|
|
<button class="h4 save-label roller" data-i18n="save" name="roll_intelligence_save" value="@{intelligence_save_action}" title="%{intelligence_save}" type="roll">
|
|
</button>
|
|
<button name="act_intelligence-save-action" hidden="" type="action" title="%{intelligence-save-action}">
|
|
</button>
|
|
<input name="attr_intelligence_save_action" type="hidden" title="@{intelligence_save_action}"/>
|
|
<input class="plus-control hidden" name="attr_intelligence_save_base" value="0" min="0" type="number" title="@{intelligence_save_base}"/><span class="save plus-display" name="attr_intelligence_save_base" title="@{intelligence_save_base}"></span>
|
|
</div>
|
|
<div class="npc-ability-label">
|
|
<button class="h4 roller" data-i18n="wisdom abbreviation" name="roll_wisdom" value="@{wisdom_action}" title="%{wisdom}" type="roll">
|
|
</button>
|
|
<button name="act_wisdom-action" hidden="" type="action" title="%{wisdom-action}">
|
|
</button>
|
|
<input name="attr_wisdom_action" type="hidden" title="@{wisdom_action}"/><span class="score" name="attr_wisdom"></span>
|
|
<div class="paren-container">
|
|
<input class="parens-control" name="attr_wisdom" value="10" type="hidden" title="@{wisdom}"/><span class="parens">(</span>
|
|
<input class="plus-control hidden" name="attr_wisdom_mod" value="0" min="0" type="number" title="@{wisdom_mod}"/><span class="mod plus-display" name="attr_wisdom_mod" title="@{wisdom_mod}"></span><span class="parens">)</span>
|
|
</div>
|
|
<button class="h4 save-label roller" data-i18n="save" name="roll_wisdom_save" value="@{wisdom_save_action}" title="%{wisdom_save}" type="roll">
|
|
</button>
|
|
<button name="act_wisdom-save-action" hidden="" type="action" title="%{wisdom-save-action}">
|
|
</button>
|
|
<input name="attr_wisdom_save_action" type="hidden" title="@{wisdom_save_action}"/>
|
|
<input class="plus-control hidden" name="attr_wisdom_save_base" value="0" min="0" type="number" title="@{wisdom_save_base}"/><span class="save plus-display" name="attr_wisdom_save_base" title="@{wisdom_save_base}"></span>
|
|
</div>
|
|
<div class="npc-ability-label">
|
|
<button class="h4 roller" data-i18n="charisma abbreviation" name="roll_charisma" value="@{charisma_action}" title="%{charisma}" type="roll">
|
|
</button>
|
|
<button name="act_charisma-action" hidden="" type="action" title="%{charisma-action}">
|
|
</button>
|
|
<input name="attr_charisma_action" type="hidden" title="@{charisma_action}"/><span class="score" name="attr_charisma"></span>
|
|
<div class="paren-container">
|
|
<input class="parens-control" name="attr_charisma" value="10" type="hidden" title="@{charisma}"/><span class="parens">(</span>
|
|
<input class="plus-control hidden" name="attr_charisma_mod" value="0" min="0" type="number" title="@{charisma_mod}"/><span class="mod plus-display" name="attr_charisma_mod" title="@{charisma_mod}"></span><span class="parens">)</span>
|
|
</div>
|
|
<button class="h4 save-label roller" data-i18n="save" name="roll_charisma_save" value="@{charisma_save_action}" title="%{charisma_save}" type="roll">
|
|
</button>
|
|
<button name="act_charisma-save-action" hidden="" type="action" title="%{charisma-save-action}">
|
|
</button>
|
|
<input name="attr_charisma_save_action" type="hidden" title="@{charisma_save_action}"/>
|
|
<input class="plus-control hidden" name="attr_charisma_save_base" value="0" min="0" type="number" title="@{charisma_save_base}"/><span class="save plus-display" name="attr_charisma_save_base" title="@{charisma_save_base}"></span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="statblock-section">
|
|
<div class="row">
|
|
<h4 data-i18n="skills"></h4>
|
|
<input class="skill-control" name="attr_athletics" type="hidden" title="@{athletics}"/>
|
|
<div class="skill-display">
|
|
<button class="h4 roller" name="roll_athletics" data-i18n="athletics" value="@{athletics_action}" title="%{athletics}" type="roll">
|
|
</button>
|
|
<button name="act_athletics-action" hidden="" type="action" title="%{athletics-action}">
|
|
</button>
|
|
<input name="attr_athletics_action" type="hidden" title="@{athletics_action}"/><span name="attr_athletics" title="@{athletics}"></span>
|
|
</div>
|
|
<input class="skill-control" name="attr_acrobatics" type="hidden" title="@{acrobatics}"/>
|
|
<div class="skill-display">
|
|
<button class="h4 roller" name="roll_acrobatics" data-i18n="acrobatics" value="@{acrobatics_action}" title="%{acrobatics}" type="roll">
|
|
</button>
|
|
<button name="act_acrobatics-action" hidden="" type="action" title="%{acrobatics-action}">
|
|
</button>
|
|
<input name="attr_acrobatics_action" type="hidden" title="@{acrobatics_action}"/><span name="attr_acrobatics" title="@{acrobatics}"></span>
|
|
</div>
|
|
<input class="skill-control" name="attr_drive" type="hidden" title="@{drive}"/>
|
|
<div class="skill-display">
|
|
<button class="h4 roller" name="roll_drive" data-i18n="drive" value="@{drive_action}" title="%{drive}" type="roll">
|
|
</button>
|
|
<button name="act_drive-action" hidden="" type="action" title="%{drive-action}">
|
|
</button>
|
|
<input name="attr_drive_action" type="hidden" title="@{drive_action}"/><span name="attr_drive" title="@{drive}"></span>
|
|
</div>
|
|
<input class="skill-control" name="attr_sleight_of_hand" type="hidden" title="@{sleight_of_hand}"/>
|
|
<div class="skill-display">
|
|
<button class="h4 roller" name="roll_sleight_of_hand" data-i18n="sleight of hand" value="@{sleight_of_hand_action}" title="%{sleight_of_hand}" type="roll">
|
|
</button>
|
|
<button name="act_sleight-of-hand-action" hidden="" type="action" title="%{sleight-of-hand-action}">
|
|
</button>
|
|
<input name="attr_sleight_of_hand_action" type="hidden" title="@{sleight_of_hand_action}"/><span name="attr_sleight_of_hand" title="@{sleight_of_hand}"></span>
|
|
</div>
|
|
<input class="skill-control" name="attr_stealth" type="hidden" title="@{stealth}"/>
|
|
<div class="skill-display">
|
|
<button class="h4 roller" name="roll_stealth" data-i18n="stealth" value="@{stealth_action}" title="%{stealth}" type="roll">
|
|
</button>
|
|
<button name="act_stealth-action" hidden="" type="action" title="%{stealth-action}">
|
|
</button>
|
|
<input name="attr_stealth_action" type="hidden" title="@{stealth_action}"/><span name="attr_stealth" title="@{stealth}"></span>
|
|
</div>
|
|
<input class="skill-control" name="attr_bureaucracy" type="hidden" title="@{bureaucracy}"/>
|
|
<div class="skill-display">
|
|
<button class="h4 roller" name="roll_bureaucracy" data-i18n="bureaucracy" value="@{bureaucracy_action}" title="%{bureaucracy}" type="roll">
|
|
</button>
|
|
<button name="act_bureaucracy-action" hidden="" type="action" title="%{bureaucracy-action}">
|
|
</button>
|
|
<input name="attr_bureaucracy_action" type="hidden" title="@{bureaucracy_action}"/><span name="attr_bureaucracy" title="@{bureaucracy}"></span>
|
|
</div>
|
|
<input class="skill-control" name="attr_computers" type="hidden" title="@{computers}"/>
|
|
<div class="skill-display">
|
|
<button class="h4 roller" name="roll_computers" data-i18n="computers" value="@{computers_action}" title="%{computers}" type="roll">
|
|
</button>
|
|
<button name="act_computers-action" hidden="" type="action" title="%{computers-action}">
|
|
</button>
|
|
<input name="attr_computers_action" type="hidden" title="@{computers_action}"/><span name="attr_computers" title="@{computers}"></span>
|
|
</div>
|
|
<input class="skill-control" name="attr_investigation" type="hidden" title="@{investigation}"/>
|
|
<div class="skill-display">
|
|
<button class="h4 roller" name="roll_investigation" data-i18n="investigation" value="@{investigation_action}" title="%{investigation}" type="roll">
|
|
</button>
|
|
<button name="act_investigation-action" hidden="" type="action" title="%{investigation-action}">
|
|
</button>
|
|
<input name="attr_investigation_action" type="hidden" title="@{investigation_action}"/><span name="attr_investigation" title="@{investigation}"></span>
|
|
</div>
|
|
<input class="skill-control" name="attr_life_science" type="hidden" title="@{life_science}"/>
|
|
<div class="skill-display">
|
|
<button class="h4 roller" name="roll_life_science" data-i18n="life science" value="@{life_science_action}" title="%{life_science}" type="roll">
|
|
</button>
|
|
<button name="act_life-science-action" hidden="" type="action" title="%{life-science-action}">
|
|
</button>
|
|
<input name="attr_life_science_action" type="hidden" title="@{life_science_action}"/><span name="attr_life_science" title="@{life_science}"></span>
|
|
</div>
|
|
<input class="skill-control" name="attr_mechanics" type="hidden" title="@{mechanics}"/>
|
|
<div class="skill-display">
|
|
<button class="h4 roller" name="roll_mechanics" data-i18n="mechanics" value="@{mechanics_action}" title="%{mechanics}" type="roll">
|
|
</button>
|
|
<button name="act_mechanics-action" hidden="" type="action" title="%{mechanics-action}">
|
|
</button>
|
|
<input name="attr_mechanics_action" type="hidden" title="@{mechanics_action}"/><span name="attr_mechanics" title="@{mechanics}"></span>
|
|
</div>
|
|
<input class="skill-control" name="attr_physical_science" type="hidden" title="@{physical_science}"/>
|
|
<div class="skill-display">
|
|
<button class="h4 roller" name="roll_physical_science" data-i18n="physical science" value="@{physical_science_action}" title="%{physical_science}" type="roll">
|
|
</button>
|
|
<button name="act_physical-science-action" hidden="" type="action" title="%{physical-science-action}">
|
|
</button>
|
|
<input name="attr_physical_science_action" type="hidden" title="@{physical_science_action}"/><span name="attr_physical_science" title="@{physical_science}"></span>
|
|
</div>
|
|
<input class="skill-control" name="attr_social_science" type="hidden" title="@{social_science}"/>
|
|
<div class="skill-display">
|
|
<button class="h4 roller" name="roll_social_science" data-i18n="social science" value="@{social_science_action}" title="%{social_science}" type="roll">
|
|
</button>
|
|
<button name="act_social-science-action" hidden="" type="action" title="%{social-science-action}">
|
|
</button>
|
|
<input name="attr_social_science_action" type="hidden" title="@{social_science_action}"/><span name="attr_social_science" title="@{social_science}"></span>
|
|
</div>
|
|
<input class="skill-control" name="attr_streetwise" type="hidden" title="@{streetwise}"/>
|
|
<div class="skill-display">
|
|
<button class="h4 roller" name="roll_streetwise" data-i18n="streetwise" value="@{streetwise_action}" title="%{streetwise}" type="roll">
|
|
</button>
|
|
<button name="act_streetwise-action" hidden="" type="action" title="%{streetwise-action}">
|
|
</button>
|
|
<input name="attr_streetwise_action" type="hidden" title="@{streetwise_action}"/><span name="attr_streetwise" title="@{streetwise}"></span>
|
|
</div>
|
|
<input class="skill-control" name="attr_insight" type="hidden" title="@{insight}"/>
|
|
<div class="skill-display">
|
|
<button class="h4 roller" name="roll_insight" data-i18n="insight" value="@{insight_action}" title="%{insight}" type="roll">
|
|
</button>
|
|
<button name="act_insight-action" hidden="" type="action" title="%{insight-action}">
|
|
</button>
|
|
<input name="attr_insight_action" type="hidden" title="@{insight_action}"/><span name="attr_insight" title="@{insight}"></span>
|
|
</div>
|
|
<input class="skill-control" name="attr_perception" type="hidden" title="@{perception}"/>
|
|
<div class="skill-display">
|
|
<button class="h4 roller" name="roll_perception" data-i18n="perception" value="@{perception_action}" title="%{perception}" type="roll">
|
|
</button>
|
|
<button name="act_perception-action" hidden="" type="action" title="%{perception-action}">
|
|
</button>
|
|
<input name="attr_perception_action" type="hidden" title="@{perception_action}"/><span name="attr_perception" title="@{perception}"></span>
|
|
</div>
|
|
<input class="skill-control" name="attr_survival" type="hidden" title="@{survival}"/>
|
|
<div class="skill-display">
|
|
<button class="h4 roller" name="roll_survival" data-i18n="survival" value="@{survival_action}" title="%{survival}" type="roll">
|
|
</button>
|
|
<button name="act_survival-action" hidden="" type="action" title="%{survival-action}">
|
|
</button>
|
|
<input name="attr_survival_action" type="hidden" title="@{survival_action}"/><span name="attr_survival" title="@{survival}"></span>
|
|
</div>
|
|
<input class="skill-control" name="attr_deception" type="hidden" title="@{deception}"/>
|
|
<div class="skill-display">
|
|
<button class="h4 roller" name="roll_deception" data-i18n="deception" value="@{deception_action}" title="%{deception}" type="roll">
|
|
</button>
|
|
<button name="act_deception-action" hidden="" type="action" title="%{deception-action}">
|
|
</button>
|
|
<input name="attr_deception_action" type="hidden" title="@{deception_action}"/><span name="attr_deception" title="@{deception}"></span>
|
|
</div>
|
|
<input class="skill-control" name="attr_intimidation" type="hidden" title="@{intimidation}"/>
|
|
<div class="skill-display">
|
|
<button class="h4 roller" name="roll_intimidation" data-i18n="intimidation" value="@{intimidation_action}" title="%{intimidation}" type="roll">
|
|
</button>
|
|
<button name="act_intimidation-action" hidden="" type="action" title="%{intimidation-action}">
|
|
</button>
|
|
<input name="attr_intimidation_action" type="hidden" title="@{intimidation_action}"/><span name="attr_intimidation" title="@{intimidation}"></span>
|
|
</div>
|
|
<input class="skill-control" name="attr_performance" type="hidden" title="@{performance}"/>
|
|
<div class="skill-display">
|
|
<button class="h4 roller" name="roll_performance" data-i18n="performance" value="@{performance_action}" title="%{performance}" type="roll">
|
|
</button>
|
|
<button name="act_performance-action" hidden="" type="action" title="%{performance-action}">
|
|
</button>
|
|
<input name="attr_performance_action" type="hidden" title="@{performance_action}"/><span name="attr_performance" title="@{performance}"></span>
|
|
</div>
|
|
<input class="skill-control" name="attr_persuasion" type="hidden" title="@{persuasion}"/>
|
|
<div class="skill-display">
|
|
<button class="h4 roller" name="roll_persuasion" data-i18n="persuasion" value="@{persuasion_action}" title="%{persuasion}" type="roll">
|
|
</button>
|
|
<button name="act_persuasion-action" hidden="" type="action" title="%{persuasion-action}">
|
|
</button>
|
|
<input name="attr_persuasion_action" type="hidden" title="@{persuasion_action}"/><span name="attr_persuasion" title="@{persuasion}"></span>
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<h4 data-i18n="skill notes"></h4><span name="attr_skill_notes" title="@{skill_notes}"></span>
|
|
</div>
|
|
<div class="row">
|
|
<h4 data-i18n="condition immunities"></h4><span name="attr_condition_immunities" title="@{condition_immunities}"></span>
|
|
</div>
|
|
<div class="row">
|
|
<h4 data-i18n="damage immunities"></h4><span name="attr_damage_immunities" title="@{damage_immunities}"></span>
|
|
</div>
|
|
<div class="row">
|
|
<h4 data-i18n="damage resistances"></h4><span name="attr_damage_resistances" title="@{damage_resistances}"></span>
|
|
</div>
|
|
<div class="row">
|
|
<h4 data-i18n="damage vulnerability"></h4><span name="attr_damage_vulnerability" title="@{damage_vulnerability}"></span>
|
|
</div>
|
|
<div class="row">
|
|
<h4 data-i18n="senses"></h4><span name="attr_senses" title="@{senses}"></span>
|
|
<h4 data-i18n="passive perception"></h4><span name="attr_passive_perception" title="@{passive_perception}"></span>
|
|
</div>
|
|
<div class="row">
|
|
<h4 data-i18n="languages"></h4><span name="attr_languages" title="@{languages}"></span>
|
|
</div>
|
|
<div class="row">
|
|
<h4 data-i18n="challenge"></h4><span name="attr_challenge" title="@{challenge}"></span><span class="parens">(</span><span name="attr_experience_points" title="@{experience_points}"></span><span data-i18n="xp"></span><span class="parens">)</span>
|
|
</div>
|
|
</div>
|
|
<input class="hack-display-control level1" name="attr_1st_level_slots" type="hidden" title="@{1st_level_slots}"/>
|
|
<input class="hack-display-control level2" name="attr_2nd_level_slots" type="hidden" title="@{2nd_level_slots}"/>
|
|
<input class="hack-display-control level3" name="attr_3rd_level_slots" type="hidden" title="@{3rd_level_slots}"/>
|
|
<input class="hack-display-control level4" name="attr_4th_level_slots" type="hidden" title="@{4th_level_slots}"/>
|
|
<input class="hack-display-control level5" name="attr_5th_level_slots" type="hidden" title="@{5th_level_slots}"/>
|
|
<div class="statblock-section hack-display">
|
|
<div class="row">
|
|
<h4 data-i18n="hacker level"></h4><span name="attr_hacker_level" title="@{hacker_level}"></span><span class="parens">(</span><span name="attr_hacking_ability" title="@{hacking_ability}"></span><span class="parens">)</span>
|
|
</div>
|
|
<div class="row">
|
|
<h4 data-i18n="hack dc"></h4><span class="plus-display" name="attr_hack_dc" title="@{hack_dc}"></span>
|
|
<h4 data-i18n="hack attack"></h4>
|
|
<input class="plus-control hidden" name="attr_hack_attack" hidden="" min="0" type="number" title="@{hack_attack}"/><span class="plus-display" name="attr_hack_attack" title="@{hack_attack}"></span>
|
|
</div>
|
|
<div class="level1">
|
|
<h4 data-i18n="1st level"></h4><span>(</span><span name="attr_1st_level_slots" title="@{1st_level_slots}"></span><span>):</span>
|
|
<fieldset class="repeating_hack">
|
|
<input class="button-control" name="attr_level" type="hidden" title="@{repeating_hack_$X_level}"/>
|
|
<button class="h4 roller" name="roll_roll" value="@{action}" title="%{repeating_hack_$X_roll}" type="roll"><span name="attr_name" title="@{repeating_hack_$X_name}"></span>
|
|
</button>
|
|
<button name="act_action" hidden="" type="action" title="%{repeating_hack_$X_action}">
|
|
</button>
|
|
<input name="attr_action" type="hidden" title="@{repeating_hack_$X_action}"/>
|
|
</fieldset>
|
|
</div>
|
|
<div class="level2">
|
|
<h4 data-i18n="2nd level"></h4><span>(</span><span name="attr_2nd_level_slots" title="@{2nd_level_slots}"></span><span>):</span>
|
|
<fieldset class="repeating_hack">
|
|
<input class="button-control" name="attr_level" type="hidden" title="@{repeating_hack_$X_level}"/>
|
|
<button class="h4 roller" name="roll_roll" value="@{action}" title="%{repeating_hack_$X_roll}" type="roll"><span name="attr_name" title="@{repeating_hack_$X_name}"></span>
|
|
</button>
|
|
<button name="act_action" hidden="" type="action" title="%{repeating_hack_$X_action}">
|
|
</button>
|
|
<input name="attr_action" type="hidden" title="@{repeating_hack_$X_action}"/>
|
|
</fieldset>
|
|
</div>
|
|
<div class="level3">
|
|
<h4 data-i18n="3rd level"></h4><span>(</span><span name="attr_3rd_level_slots" title="@{3rd_level_slots}"></span><span>):</span>
|
|
<fieldset class="repeating_hack">
|
|
<input class="button-control" name="attr_level" type="hidden" title="@{repeating_hack_$X_level}"/>
|
|
<button class="h4 roller" name="roll_roll" value="@{action}" title="%{repeating_hack_$X_roll}" type="roll"><span name="attr_name" title="@{repeating_hack_$X_name}"></span>
|
|
</button>
|
|
<button name="act_action" hidden="" type="action" title="%{repeating_hack_$X_action}">
|
|
</button>
|
|
<input name="attr_action" type="hidden" title="@{repeating_hack_$X_action}"/>
|
|
</fieldset>
|
|
</div>
|
|
<div class="level4">
|
|
<h4 data-i18n="4th level"></h4><span>(</span><span name="attr_4th_level_slots" title="@{4th_level_slots}"></span><span>):</span>
|
|
<fieldset class="repeating_hack">
|
|
<input class="button-control" name="attr_level" type="hidden" title="@{repeating_hack_$X_level}"/>
|
|
<button class="h4 roller" name="roll_roll" value="@{action}" title="%{repeating_hack_$X_roll}" type="roll"><span name="attr_name" title="@{repeating_hack_$X_name}"></span>
|
|
</button>
|
|
<button name="act_action" hidden="" type="action" title="%{repeating_hack_$X_action}">
|
|
</button>
|
|
<input name="attr_action" type="hidden" title="@{repeating_hack_$X_action}"/>
|
|
</fieldset>
|
|
</div>
|
|
<div class="level5">
|
|
<h4 data-i18n="5th level"></h4><span>(</span><span name="attr_5th_level_slots" title="@{5th_level_slots}"></span><span>):</span>
|
|
<fieldset class="repeating_hack">
|
|
<input class="button-control" name="attr_level" type="hidden" title="@{repeating_hack_$X_level}"/>
|
|
<button class="h4 roller" name="roll_roll" value="@{action}" title="%{repeating_hack_$X_roll}" type="roll"><span name="attr_name" title="@{repeating_hack_$X_name}"></span>
|
|
</button>
|
|
<button name="act_action" hidden="" type="action" title="%{repeating_hack_$X_action}">
|
|
</button>
|
|
<input name="attr_action" type="hidden" title="@{repeating_hack_$X_action}"/>
|
|
</fieldset>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="repeating-container">
|
|
<div class="bordered-container trait-container">
|
|
<h4 data-i18n="features & traits">features & traits
|
|
</h4>
|
|
<fieldset class="repeating_trait">
|
|
<input name="attr_attr_macro" value="{{source=@{source}}}" type="hidden" title="@{repeating_trait_$X_attr_macro}"/>
|
|
<div class="expandable-section">
|
|
<input class="expand-control" name="attr_expand_item" value="1" type="hidden" title="@{repeating_trait_$X_expand_item}"/>
|
|
<label class="expand-button">
|
|
<input name="attr_expand_item" value="1" checked="" type="checkbox" title="@{repeating_trait_$X_expand_item}"/><span class="expand-state pictos">y</span>
|
|
</label>
|
|
<div class="expanded-view">
|
|
<div class="input-label-container name"><span class="input-label" data-i18n="name">name</span>
|
|
<input type="text" name="attr_name" title="@{repeating_trait_$X_name}"/>
|
|
</div>
|
|
<div class="input-label-container description"><span class="input-label" data-i18n="description">description</span><!-- repeating_trait_$X_ -->
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_description_in_chat" value="1" checked="" type="checkbox" title="@{repeating_trait_$X_description_in_chat}"/><span class="hexagon"></span>
|
|
</div>
|
|
</label>
|
|
<textarea type="textarea" name="attr_description" title="@{repeating_trait_$X_description}"></textarea>
|
|
</div>
|
|
<input class="id" name="attr_id" readonly="" value="" type="text" title="@{repeating_trait_$X_id}"/>
|
|
</div>
|
|
<div class="collapsed-view">
|
|
<button class="roller" name="roll_details" value="@{details_action}" title="%{repeating_trait_$X_details}" type="roll"><span name="attr_name" title="@{repeating_trait_$X_name}"></span>
|
|
</button>
|
|
<button name="act_details-action" hidden="" type="action" title="%{repeating_trait_$X_details-action}">
|
|
</button>
|
|
<input name="attr_details_action" type="hidden" title="@{repeating_trait_$X_details_action}"/><span class="description" name="attr_description" title="@{repeating_trait_$X_description}"></span>
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
</div>
|
|
<div class="bordered-container action-container">
|
|
<h4 data-i18n="actions">actions
|
|
</h4>
|
|
<h5 class="name" data-i18n="name">name
|
|
</h5>
|
|
<h5 class="mod" data-i18n="mod">mod
|
|
</h5>
|
|
<h5 class="damage" data-i18n="damage">damage
|
|
</h5>
|
|
<!--repeating actions-->
|
|
<fieldset class="repeating_action">
|
|
<div class="expandable-section">
|
|
<input class="expand-control" name="attr_expand_item" value="1" type="hidden" title="@{repeating_action_$X_expand_item}"/>
|
|
<label class="expand-button">
|
|
<input name="attr_expand_item" value="1" checked="" type="checkbox" title="@{repeating_action_$X_expand_item}"/><span class="expand-state pictos">y</span>
|
|
</label>
|
|
<div class="expanded-view">
|
|
<div class="input-label-container name"><span class="input-label" data-i18n="name">name</span>
|
|
<input type="text" name="attr_name" title="@{repeating_action_$X_name}"/>
|
|
</div>
|
|
<div class="enable-holder">
|
|
<input class="enable-controller" name="attr_attack_enable_item" value="0" type="hidden" title="@{repeating_action_$X_attack_enable_item}"/>
|
|
<div class="enable-section attack">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_attack_enable_item" value="1" type="checkbox" title="@{repeating_action_$X_attack_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="attack">attack</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container attack bonus"><span class="input-label" data-i18n="attack bonus">attack bonus</span>
|
|
<input type="text" name="attr_attack_bonus" title="@{repeating_action_$X_attack_bonus}"/>
|
|
</div>
|
|
<div class="input-label-container crit-range"><span class="input-label" data-i18n="crit">crit</span>
|
|
<input type="number" name="attr_crit" value="20" title="@{repeating_action_$X_crit}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_save_enable_item" value="0" type="hidden" title="@{repeating_action_$X_save_enable_item}"/>
|
|
<div class="enable-section save">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_save_enable_item" value="{{save_type=^{@{save_type}}}} @{save_macro}" type="checkbox" title="@{repeating_action_$X_save_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="save">save</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container"><span class="input-label" data-i18n="save type">save type</span>
|
|
<select type="select" name="attr_save_type" title="@{repeating_action_$X_save_type}">
|
|
<option value="none" data-i18n="none" selected="">
|
|
</option>
|
|
<option value="strength" data-i18n="strength">
|
|
</option>
|
|
<option value="dexterity" data-i18n="dexterity">
|
|
</option>
|
|
<option value="constitution" data-i18n="constitution">
|
|
</option>
|
|
<option value="intelligence" data-i18n="intelligence">
|
|
</option>
|
|
<option value="wisdom" data-i18n="wisdom">
|
|
</option>
|
|
<option value="charisma" data-i18n="charisma">
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="input-label-container"><span class="input-label" data-i18n="dc bonus">dc bonus</span>
|
|
<input type="text" name="attr_dc_bonus" title="@{repeating_action_$X_dc_bonus}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_damage_1_enable_item" value="0" type="hidden" title="@{repeating_action_$X_damage_1_enable_item}"/>
|
|
<div class="enable-section damage 1">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_damage_1_enable_item" value="{{damage_type_1=@{damage_type_1}}} @{damage_1_macro}" type="checkbox" title="@{repeating_action_$X_damage_1_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="damage 1">damage 1</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container damage 1"><span class="input-label" data-i18n="damage 1">damage 1</span>
|
|
<input type="text" name="attr_damage_1" title="@{repeating_action_$X_damage_1}"/>
|
|
</div>
|
|
<div class="input-label-container critical damage 1"><span class="input-label" data-i18n="critical damage 1">critical damage 1</span>
|
|
<input type="text" name="attr_critical_damage_1" title="@{repeating_action_$X_critical_damage_1}"/>
|
|
</div>
|
|
<div class="input-label-container damage type 1"><span class="input-label" data-i18n="damage type 1">damage type 1</span>
|
|
<input type="text" name="attr_damage_type_1" title="@{repeating_action_$X_damage_type_1}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input class="enable-controller" name="attr_damage_2_enable_item" value="0" type="hidden" title="@{repeating_action_$X_damage_2_enable_item}"/>
|
|
<div class="enable-section damage 2">
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_damage_2_enable_item" value="{{damage_type_2=@{damage_type_2}}} @{damage_2_macro}" type="checkbox" title="@{repeating_action_$X_damage_2_enable_item}"/><span class="hexagon"></span>
|
|
</div><span data-i18n="damage 2">damage 2</span>
|
|
</label>
|
|
<div class="enabled-section">
|
|
<div class="input-label-container damage 2"><span class="input-label" data-i18n="damage 2">damage 2</span>
|
|
<input type="text" name="attr_damage_2" title="@{repeating_action_$X_damage_2}"/>
|
|
</div>
|
|
<div class="input-label-container critical damage 2"><span class="input-label" data-i18n="critical damage 2">critical damage 2</span>
|
|
<input type="text" name="attr_critical_damage_2" title="@{repeating_action_$X_critical_damage_2}"/>
|
|
</div>
|
|
<div class="input-label-container damage type 2"><span class="input-label" data-i18n="damage type 2">damage type 2</span>
|
|
<input type="text" name="attr_damage_type_2" title="@{repeating_action_$X_damage_type_2}"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="input-label-container range"><span class="input-label" data-i18n="range">range</span>
|
|
<input type="text" name="attr_range" title="@{repeating_action_$X_range}"/>
|
|
</div>
|
|
<div class="input-label-container properties"><span class="input-label" data-i18n="properties">properties</span>
|
|
<input type="text" name="attr_properties" title="@{repeating_action_$X_properties}"/>
|
|
</div>
|
|
<div class="input-label-container description"><span class="input-label" data-i18n="description">description</span><!-- repeating_action_$X_ -->
|
|
<label class="hexagon-check-label">
|
|
<div class="checkbox-container">
|
|
<input name="attr_description_in_chat" value="1" type="checkbox" title="@{repeating_action_$X_description_in_chat}"/><span class="hexagon"></span>
|
|
</div>
|
|
</label>
|
|
<textarea type="textarea" name="attr_description" title="@{repeating_action_$X_description}"></textarea>
|
|
</div>
|
|
<input class="id" name="attr_id" readonly="" value="" type="text" title="@{repeating_action_$X_id}"/>
|
|
</div>
|
|
<div class="collapsed-view">
|
|
<button class="roller" name="roll_roll" value="@{action}" title="%{repeating_action_$X_roll}" type="roll">
|
|
</button>
|
|
<button name="act_action" hidden="" type="action" title="%{repeating_action_$X_action}">
|
|
</button>
|
|
<input name="attr_action" type="hidden" title="@{repeating_action_$X_action}"/><span name="attr_name" title="@{repeating_action_$X_name}"></span><span name="attr_bonus" title="@{repeating_action_$X_bonus}"></span><span name="attr_damage_1" title="@{repeating_action_$X_damage_1}"></span>
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<rolltemplate class="sheet-rolltemplate-general">
|
|
<div class="roll-display {{#d20}}1{{/d20}}{{#damage_1}}2{{/damage_1}}{{#damage_2}}3{{/damage_2}}{{#dc}}4{{/dc}}">{{#character_name}}
|
|
<div class="character_name bordered-container">
|
|
<div class="header">
|
|
<h4>{{#character_id}}[{{character_name}}](http://journal.roll20.net/character/{{character_id}}){{/character_id}}{{^character_id}}{{character_name}}{{/character_id}}
|
|
</h4>{{^d20}}
|
|
<h5>{{rollName}}</h5>{{/d20}}
|
|
</div>
|
|
</div>{{/character_name}}{{#d20}}
|
|
<div class="true-hexagon polygon rollValue"><span>{{computed::d20}}</span>{{#rollName}}<span class="capitalize">{{rollName}}</span>{{/rollName}}{{^rollName}}<span class="capitalize" data-i18n="roll"></span>{{/rollName}}
|
|
</div>{{/d20}}{{#damage_1}}
|
|
<div class="true-hexagon polygon damage1"><span class="damage-result"><span>{{computed::damage_1}}</span>{{#rollWasCrit() d20}}<span>+</span>{{#is_custom_crit_1}}<span>{{computed::custom_critical_1}}</span>{{/is_custom_crit_1}}{{^is_custom_crit_1}}<span>{{computed::regular_critical_1}}</span>{{/is_custom_crit_1}}{{/rollWasCrit() d20}}</span>{{#damage_type_1}}<span class="capitalize">{{damage_type_1}}</span>{{/damage_type_1}}{{^damage_type_1}}<span class="capitalize" data-i18n="damage 1"></span>{{/damage_type_1}}
|
|
</div>{{/damage_1}}{{#damage_2}}
|
|
<div class="true-hexagon polygon damage2"><span>{{computed::damage_2}}</span>{{#rollWasCrit() d20}}{{#is_custom_crit_2}}<span>{{computed::custom_critical_2}}</span>{{/is_custom_crit_2}}{{^is_custom_crit_2}}<span>{{computed::regular_critical_2}}</span>{{/is_custom_crit_2}}{{/rollWasCrit() d20}}{{#damage_type_2}}<span class="capitalize">{{damage_type_2}}</span>{{/damage_type_2}}{{^damage_type_2}}<span class="capitalize" data-i18n="damage 2"></span>{{/damage_type_2}}
|
|
</div>{{/damage_2}}{{#dc}}
|
|
<div class="true-hexagon polygon save"><span>{{computed::dc}}</span>{{#save_type}}<span class="capitalize">{{save_type}}</span>{{/save_type}}{{^save_type}}<span class="capitalize" data-i18n="save"></span>{{/save_type}}
|
|
</div>{{/dc}}{{#range}}
|
|
<div class="bordered-container range">
|
|
<div class="hex-wrap-container">
|
|
<div class="shape-around hex-bottom"></div><span>{{range}}</span>
|
|
</div>
|
|
</div>{{/range}}{{#properties}}
|
|
<div class="bordered-container properties">
|
|
<div class="hex-wrap-container">
|
|
<div class="shape-around hex-bottom"></div><span>{{properties}}</span>
|
|
</div>
|
|
</div>{{/properties}}{{#description}}
|
|
<div class="bordered-container description"><span>{{description}}</span>
|
|
</div>{{/description}}
|
|
</div>
|
|
</rolltemplate>
|
|
<script type="text/worker">
|
|
const k = (function(){
|
|
const kFuncs = {};
|
|
|
|
const cascades = {"attr_character_name":{"name":"character_name","type":"text","defaultValue":"","affects":[],"triggeredFuncs":["setActionCalls"],"listenerFunc":"accessSheet","listener":"change:character_name"},"attr_debug_mode":{"name":"debug_mode","type":"hidden","defaultValue":1,"triggeredFuncs":[],"affects":[]},"attr_character_level":{"calculation":"calcLevel","affects":["proficiency"],"name":"character_level","listener":"change:character_level","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"attr_strength_bonus":{"affects":["strength_mod"],"name":"strength_bonus","listener":"change:strength_bonus","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"attr_strength_save_bonus":{"affects":["strength_save"],"name":"strength_save_bonus","listener":"change:strength_save_bonus","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"attr_dexterity_bonus":{"affects":["dexterity_mod"],"name":"dexterity_bonus","listener":"change:dexterity_bonus","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"attr_dexterity_save_bonus":{"affects":["dexterity_save"],"name":"dexterity_save_bonus","listener":"change:dexterity_save_bonus","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"attr_constitution_bonus":{"affects":["constitution_mod"],"name":"constitution_bonus","listener":"change:constitution_bonus","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"attr_constitution_save_bonus":{"affects":["constitution_save"],"name":"constitution_save_bonus","listener":"change:constitution_save_bonus","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"attr_intelligence_bonus":{"affects":["intelligence_mod"],"name":"intelligence_bonus","listener":"change:intelligence_bonus","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"attr_intelligence_save_bonus":{"affects":["intelligence_save"],"name":"intelligence_save_bonus","listener":"change:intelligence_save_bonus","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"attr_wisdom_bonus":{"affects":["wisdom_mod"],"name":"wisdom_bonus","listener":"change:wisdom_bonus","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"attr_wisdom_save_bonus":{"affects":["wisdom_save"],"name":"wisdom_save_bonus","listener":"change:wisdom_save_bonus","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"attr_charisma_bonus":{"affects":["charisma_mod"],"name":"charisma_bonus","listener":"change:charisma_bonus","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"attr_charisma_save_bonus":{"affects":["charisma_save"],"name":"charisma_save_bonus","listener":"change:charisma_save_bonus","listenerFunc":"accessSheet","type":"hidden","defaultValue":0,"triggeredFuncs":[]},"attr_athletics_bonus":{"name":"athletics_bonus","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_acrobatics_bonus":{"name":"acrobatics_bonus","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_drive_bonus":{"name":"drive_bonus","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_sleight_of_hand_bonus":{"name":"sleight_of_hand_bonus","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_stealth_bonus":{"name":"stealth_bonus","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_bureaucracy_bonus":{"name":"bureaucracy_bonus","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_computers_bonus":{"name":"computers_bonus","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_investigation_bonus":{"name":"investigation_bonus","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_life_science_bonus":{"name":"life_science_bonus","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_mechanics_bonus":{"name":"mechanics_bonus","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_physical_science_bonus":{"name":"physical_science_bonus","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_social_science_bonus":{"name":"social_science_bonus","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_streetwise_bonus":{"name":"streetwise_bonus","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_insight_bonus":{"name":"insight_bonus","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_perception_bonus":{"name":"perception_bonus","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_survival_bonus":{"name":"survival_bonus","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_deception_bonus":{"name":"deception_bonus","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_intimidation_bonus":{"name":"intimidation_bonus","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_performance_bonus":{"name":"performance_bonus","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_persuasion_bonus":{"name":"persuasion_bonus","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_passive_perception":{"name":"passive_perception","type":"hidden","defaultValue":10,"triggeredFuncs":[],"affects":[],"calculation":"passiveCalc"},"attr_passive_insight":{"name":"passive_insight","type":"hidden","defaultValue":10,"triggeredFuncs":[],"affects":[],"calculation":"passiveCalc"},"attr_sheet_version":{"name":"sheet_version","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_template_start":{"name":"template_start","type":"hidden","defaultValue":"@{whisper_state} &{template:general} @{show_character_name}","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_master_display_controller":{"calculation":"controlDisplay","name":"master_display_controller","type":"hidden","defaultValue":"character_type:pc | sheet_view:core | advantage_state:1d20","triggeredFuncs":[],"affects":[]},"attr_class_level":{"affects":["character_level"],"name":"class_level","listener":"change:class_level","listenerFunc":"accessSheet","type":"text","defaultValue":"","triggeredFuncs":[]},"attr_genome":{"affects":["character_level"],"name":"genome","listener":"change:genome","listenerFunc":"accessSheet","type":"text","defaultValue":"","triggeredFuncs":[]},"attr_cadre":{"affects":["character_level"],"name":"cadre","listener":"change:cadre","listenerFunc":"accessSheet","type":"text","defaultValue":"","triggeredFuncs":[]},"attr_experience_points":{"affects":["character_level"],"name":"experience_points","listener":"change:experience_points","listenerFunc":"accessSheet","type":"text","defaultValue":"","triggeredFuncs":[]},"attr_backgrounds":{"affects":["character_level"],"name":"backgrounds","listener":"change:backgrounds","listenerFunc":"accessSheet","type":"text","defaultValue":"","triggeredFuncs":[]},"attr_appearance":{"affects":["character_level"],"name":"appearance","listener":"change:appearance","listenerFunc":"accessSheet","type":"text","defaultValue":"","triggeredFuncs":[]},"attr_sheet_view":{"affects":["master_display_controller"],"name":"sheet_view","listener":"change:sheet_view","listenerFunc":"accessSheet","type":"checkbox","defaultValue":"core","triggeredFuncs":[]},"attr_advantage_state":{"defaultValue":"1d20","affects":["master_display_controller"],"name":"advantage_state","listener":"change:advantage_state","listenerFunc":"accessSheet","type":"checkbox","triggeredFuncs":[]},"attr_strength_misc":{"name":"strength_misc","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_strength-action":{"triggeredFuncs":["rollCheck"],"name":"strength-action","listener":"clicked:strength-action","listenerFunc":"accessSheet","type":"action"},"attr_strength_action":{"name":"strength_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_base_strength":{"affects":["strength"],"name":"base_strength","listener":"change:base_strength","listenerFunc":"accessSheet","type":"number","defaultValue":10,"triggeredFuncs":[]},"attr_strength":{"affects":["strength_mod"],"calculation":"abilityScoreCalc","name":"strength","listener":"change:strength","listenerFunc":"accessSheet","type":"number","defaultValue":10,"triggeredFuncs":[]},"attr_strength_modded":{"affects":["strength"],"name":"strength_modded","listener":"change:strength_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_strength_mod_modded":{"affects":["strength_mod"],"name":"strength_mod_modded","listener":"change:strength_mod_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_strength_mod":{"affects":["strength_save","athletics"],"calculation":"abilityModCalc","triggeredFuncs":["affectSelected"],"name":"strength_mod","listener":"change:strength_mod","listenerFunc":"accessSheet","type":"number","defaultValue":0},"act_strength-save-action":{"triggeredFuncs":["rollSave"],"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":[]},"attr_strength_save_proficiency":{"affects":["strength_save"],"defaultValue":"","name":"strength_save_proficiency","listener":"change:strength_save_proficiency","listenerFunc":"accessSheet","type":"checkbox","triggeredFuncs":[]},"attr_strength_save_modded":{"affects":["strength_save"],"name":"strength_save_modded","listener":"change:strength_save_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_strength_save":{"calculation":"saveCalc","name":"strength_save","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_dexterity_misc":{"name":"dexterity_misc","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_dexterity-action":{"triggeredFuncs":["rollCheck"],"name":"dexterity-action","listener":"clicked:dexterity-action","listenerFunc":"accessSheet","type":"action"},"attr_dexterity_action":{"name":"dexterity_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_base_dexterity":{"affects":["dexterity"],"name":"base_dexterity","listener":"change:base_dexterity","listenerFunc":"accessSheet","type":"number","defaultValue":10,"triggeredFuncs":[]},"attr_dexterity":{"affects":["dexterity_mod"],"calculation":"abilityScoreCalc","name":"dexterity","listener":"change:dexterity","listenerFunc":"accessSheet","type":"number","defaultValue":10,"triggeredFuncs":[]},"attr_dexterity_modded":{"affects":["dexterity"],"name":"dexterity_modded","listener":"change:dexterity_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_dexterity_mod_modded":{"affects":["dexterity_mod"],"name":"dexterity_mod_modded","listener":"change:dexterity_mod_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_dexterity_mod":{"affects":["dexterity_save","acrobatics","drive","sleight_of_hand","stealth","initiative"],"calculation":"abilityModCalc","triggeredFuncs":["affectSelected"],"name":"dexterity_mod","listener":"change:dexterity_mod","listenerFunc":"accessSheet","type":"number","defaultValue":0},"act_dexterity-save-action":{"triggeredFuncs":["rollSave"],"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":[]},"attr_dexterity_save_proficiency":{"affects":["dexterity_save"],"defaultValue":"","name":"dexterity_save_proficiency","listener":"change:dexterity_save_proficiency","listenerFunc":"accessSheet","type":"checkbox","triggeredFuncs":[]},"attr_dexterity_save_modded":{"affects":["dexterity_save"],"name":"dexterity_save_modded","listener":"change:dexterity_save_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_dexterity_save":{"calculation":"saveCalc","name":"dexterity_save","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_constitution_misc":{"name":"constitution_misc","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_constitution-action":{"triggeredFuncs":["rollCheck"],"name":"constitution-action","listener":"clicked:constitution-action","listenerFunc":"accessSheet","type":"action"},"attr_constitution_action":{"name":"constitution_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_base_constitution":{"affects":["constitution"],"name":"base_constitution","listener":"change:base_constitution","listenerFunc":"accessSheet","type":"number","defaultValue":10,"triggeredFuncs":[]},"attr_constitution":{"affects":["constitution_mod"],"calculation":"abilityScoreCalc","name":"constitution","listener":"change:constitution","listenerFunc":"accessSheet","type":"number","defaultValue":10,"triggeredFuncs":[]},"attr_constitution_modded":{"affects":["constitution"],"name":"constitution_modded","listener":"change:constitution_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_constitution_mod_modded":{"affects":["constitution_mod"],"name":"constitution_mod_modded","listener":"change:constitution_mod_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_constitution_mod":{"affects":["constitution_save"],"calculation":"abilityModCalc","triggeredFuncs":["affectSelected"],"name":"constitution_mod","listener":"change:constitution_mod","listenerFunc":"accessSheet","type":"number","defaultValue":0},"act_constitution-save-action":{"triggeredFuncs":["rollSave"],"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":[]},"attr_constitution_save_proficiency":{"affects":["constitution_save"],"defaultValue":"","name":"constitution_save_proficiency","listener":"change:constitution_save_proficiency","listenerFunc":"accessSheet","type":"checkbox","triggeredFuncs":[]},"attr_constitution_save_modded":{"affects":["constitution_save"],"name":"constitution_save_modded","listener":"change:constitution_save_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_constitution_save":{"calculation":"saveCalc","name":"constitution_save","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_intelligence_misc":{"name":"intelligence_misc","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_intelligence-action":{"triggeredFuncs":["rollCheck"],"name":"intelligence-action","listener":"clicked:intelligence-action","listenerFunc":"accessSheet","type":"action"},"attr_intelligence_action":{"name":"intelligence_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_base_intelligence":{"affects":["intelligence"],"name":"base_intelligence","listener":"change:base_intelligence","listenerFunc":"accessSheet","type":"number","defaultValue":10,"triggeredFuncs":[]},"attr_intelligence":{"affects":["intelligence_mod"],"calculation":"abilityScoreCalc","name":"intelligence","listener":"change:intelligence","listenerFunc":"accessSheet","type":"number","defaultValue":10,"triggeredFuncs":[]},"attr_intelligence_modded":{"affects":["intelligence"],"name":"intelligence_modded","listener":"change:intelligence_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_intelligence_mod_modded":{"affects":["intelligence_mod"],"name":"intelligence_mod_modded","listener":"change:intelligence_mod_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_intelligence_mod":{"affects":["intelligence_save","bureaucracy","computers","investigation","life_science","mechanics","physical_science","social_science","streetwise"],"calculation":"abilityModCalc","triggeredFuncs":["affectSelected"],"name":"intelligence_mod","listener":"change:intelligence_mod","listenerFunc":"accessSheet","type":"number","defaultValue":0},"act_intelligence-save-action":{"triggeredFuncs":["rollSave"],"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":[]},"attr_intelligence_save_proficiency":{"affects":["intelligence_save"],"defaultValue":"","name":"intelligence_save_proficiency","listener":"change:intelligence_save_proficiency","listenerFunc":"accessSheet","type":"checkbox","triggeredFuncs":[]},"attr_intelligence_save_modded":{"affects":["intelligence_save"],"name":"intelligence_save_modded","listener":"change:intelligence_save_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_intelligence_save":{"calculation":"saveCalc","name":"intelligence_save","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_wisdom_misc":{"name":"wisdom_misc","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_wisdom-action":{"triggeredFuncs":["rollCheck"],"name":"wisdom-action","listener":"clicked:wisdom-action","listenerFunc":"accessSheet","type":"action"},"attr_wisdom_action":{"name":"wisdom_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_base_wisdom":{"affects":["wisdom"],"name":"base_wisdom","listener":"change:base_wisdom","listenerFunc":"accessSheet","type":"number","defaultValue":10,"triggeredFuncs":[]},"attr_wisdom":{"affects":["wisdom_mod"],"calculation":"abilityScoreCalc","name":"wisdom","listener":"change:wisdom","listenerFunc":"accessSheet","type":"number","defaultValue":10,"triggeredFuncs":[]},"attr_wisdom_modded":{"affects":["wisdom"],"name":"wisdom_modded","listener":"change:wisdom_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_wisdom_mod_modded":{"affects":["wisdom_mod"],"name":"wisdom_mod_modded","listener":"change:wisdom_mod_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_wisdom_mod":{"affects":["wisdom_save","insight","perception","survival"],"calculation":"abilityModCalc","triggeredFuncs":["affectSelected"],"name":"wisdom_mod","listener":"change:wisdom_mod","listenerFunc":"accessSheet","type":"number","defaultValue":0},"act_wisdom-save-action":{"triggeredFuncs":["rollSave"],"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":[]},"attr_wisdom_save_proficiency":{"affects":["wisdom_save"],"defaultValue":"","name":"wisdom_save_proficiency","listener":"change:wisdom_save_proficiency","listenerFunc":"accessSheet","type":"checkbox","triggeredFuncs":[]},"attr_wisdom_save_modded":{"affects":["wisdom_save"],"name":"wisdom_save_modded","listener":"change:wisdom_save_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_wisdom_save":{"calculation":"saveCalc","name":"wisdom_save","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_charisma_misc":{"name":"charisma_misc","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_charisma-action":{"triggeredFuncs":["rollCheck"],"name":"charisma-action","listener":"clicked:charisma-action","listenerFunc":"accessSheet","type":"action"},"attr_charisma_action":{"name":"charisma_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_base_charisma":{"affects":["charisma"],"name":"base_charisma","listener":"change:base_charisma","listenerFunc":"accessSheet","type":"number","defaultValue":10,"triggeredFuncs":[]},"attr_charisma":{"affects":["charisma_mod"],"calculation":"abilityScoreCalc","name":"charisma","listener":"change:charisma","listenerFunc":"accessSheet","type":"number","defaultValue":10,"triggeredFuncs":[]},"attr_charisma_modded":{"affects":["charisma"],"name":"charisma_modded","listener":"change:charisma_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_charisma_mod_modded":{"affects":["charisma_mod"],"name":"charisma_mod_modded","listener":"change:charisma_mod_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_charisma_mod":{"affects":["charisma_save","deception","intimidation","performance","persuasion"],"calculation":"abilityModCalc","triggeredFuncs":["affectSelected"],"name":"charisma_mod","listener":"change:charisma_mod","listenerFunc":"accessSheet","type":"number","defaultValue":0},"act_charisma-save-action":{"triggeredFuncs":["rollSave"],"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":[]},"attr_charisma_save_proficiency":{"affects":["charisma_save"],"defaultValue":"","name":"charisma_save_proficiency","listener":"change:charisma_save_proficiency","listenerFunc":"accessSheet","type":"checkbox","triggeredFuncs":[]},"attr_charisma_save_modded":{"affects":["charisma_save"],"name":"charisma_save_modded","listener":"change:charisma_save_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_charisma_save":{"calculation":"saveCalc","name":"charisma_save","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_proficiency_modded":{"affects":["proficiency"],"name":"proficiency_modded","listener":"change:proficiency_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_proficiency":{"calculation":"calcProficiency","affects":["strength","dexterity","constitution","intelligence","wisdom","charisma","athletics","acrobatics","drive","sleight_of_hand","stealth","bureaucracy","computers","investigation","life_science","mechanics","physical_science","social_science","streetwise","insight","perception","survival","deception","intimidation","performance","persuasion"],"name":"proficiency","listener":"change:proficiency","listenerFunc":"accessSheet","type":"number","defaultValue":2,"triggeredFuncs":[]},"attr_athletics_proficiency":{"affects":["athletics"],"defaultValue":"","name":"athletics_proficiency","listener":"change:athletics_proficiency","listenerFunc":"accessSheet","type":"hidden","triggeredFuncs":[]},"attr_athletics_modded":{"affects":["athletics"],"name":"athletics_modded","listener":"change:athletics_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_athletics":{"calculation":"skillCalc","name":"athletics","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_athletics-action":{"triggeredFuncs":["rollSkill"],"name":"athletics-action","listener":"clicked:athletics-action","listenerFunc":"accessSheet","type":"action"},"attr_athletics_action":{"name":"athletics_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_acrobatics_proficiency":{"affects":["acrobatics"],"defaultValue":"","name":"acrobatics_proficiency","listener":"change:acrobatics_proficiency","listenerFunc":"accessSheet","type":"hidden","triggeredFuncs":[]},"attr_acrobatics_modded":{"affects":["acrobatics"],"name":"acrobatics_modded","listener":"change:acrobatics_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_acrobatics":{"calculation":"skillCalc","name":"acrobatics","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_acrobatics-action":{"triggeredFuncs":["rollSkill"],"name":"acrobatics-action","listener":"clicked:acrobatics-action","listenerFunc":"accessSheet","type":"action"},"attr_acrobatics_action":{"name":"acrobatics_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_drive_proficiency":{"affects":["drive"],"defaultValue":"","name":"drive_proficiency","listener":"change:drive_proficiency","listenerFunc":"accessSheet","type":"hidden","triggeredFuncs":[]},"attr_drive_modded":{"affects":["drive"],"name":"drive_modded","listener":"change:drive_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_drive":{"calculation":"skillCalc","name":"drive","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_drive-action":{"triggeredFuncs":["rollSkill"],"name":"drive-action","listener":"clicked:drive-action","listenerFunc":"accessSheet","type":"action"},"attr_drive_action":{"name":"drive_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_sleight_of_hand_proficiency":{"affects":["sleight_of_hand"],"defaultValue":"","name":"sleight_of_hand_proficiency","listener":"change:sleight_of_hand_proficiency","listenerFunc":"accessSheet","type":"hidden","triggeredFuncs":[]},"attr_sleight_of_hand_modded":{"affects":["sleight_of_hand"],"name":"sleight_of_hand_modded","listener":"change:sleight_of_hand_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_sleight_of_hand":{"calculation":"skillCalc","name":"sleight_of_hand","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_sleight-of-hand-action":{"triggeredFuncs":["rollSkill"],"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_stealth_proficiency":{"affects":["stealth"],"defaultValue":"","name":"stealth_proficiency","listener":"change:stealth_proficiency","listenerFunc":"accessSheet","type":"hidden","triggeredFuncs":[]},"attr_stealth_modded":{"affects":["stealth"],"name":"stealth_modded","listener":"change:stealth_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_stealth":{"calculation":"skillCalc","name":"stealth","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_stealth-action":{"triggeredFuncs":["rollSkill"],"name":"stealth-action","listener":"clicked:stealth-action","listenerFunc":"accessSheet","type":"action"},"attr_stealth_action":{"name":"stealth_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_bureaucracy_proficiency":{"affects":["bureaucracy"],"defaultValue":"","name":"bureaucracy_proficiency","listener":"change:bureaucracy_proficiency","listenerFunc":"accessSheet","type":"hidden","triggeredFuncs":[]},"attr_bureaucracy_modded":{"affects":["bureaucracy"],"name":"bureaucracy_modded","listener":"change:bureaucracy_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_bureaucracy":{"calculation":"skillCalc","name":"bureaucracy","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_bureaucracy-action":{"triggeredFuncs":["rollSkill"],"name":"bureaucracy-action","listener":"clicked:bureaucracy-action","listenerFunc":"accessSheet","type":"action"},"attr_bureaucracy_action":{"name":"bureaucracy_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_computers_proficiency":{"affects":["computers"],"defaultValue":"","name":"computers_proficiency","listener":"change:computers_proficiency","listenerFunc":"accessSheet","type":"hidden","triggeredFuncs":[]},"attr_computers_modded":{"affects":["computers"],"name":"computers_modded","listener":"change:computers_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_computers":{"calculation":"skillCalc","name":"computers","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_computers-action":{"triggeredFuncs":["rollSkill"],"name":"computers-action","listener":"clicked:computers-action","listenerFunc":"accessSheet","type":"action"},"attr_computers_action":{"name":"computers_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_investigation_proficiency":{"affects":["investigation"],"defaultValue":"","name":"investigation_proficiency","listener":"change:investigation_proficiency","listenerFunc":"accessSheet","type":"hidden","triggeredFuncs":[]},"attr_investigation_modded":{"affects":["investigation"],"name":"investigation_modded","listener":"change:investigation_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_investigation":{"calculation":"skillCalc","name":"investigation","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_investigation-action":{"triggeredFuncs":["rollSkill"],"name":"investigation-action","listener":"clicked:investigation-action","listenerFunc":"accessSheet","type":"action"},"attr_investigation_action":{"name":"investigation_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_life_science_proficiency":{"affects":["life_science"],"defaultValue":"","name":"life_science_proficiency","listener":"change:life_science_proficiency","listenerFunc":"accessSheet","type":"hidden","triggeredFuncs":[]},"attr_life_science_modded":{"affects":["life_science"],"name":"life_science_modded","listener":"change:life_science_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_life_science":{"calculation":"skillCalc","name":"life_science","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_life-science-action":{"triggeredFuncs":["rollSkill"],"name":"life-science-action","listener":"clicked:life-science-action","listenerFunc":"accessSheet","type":"action"},"attr_life_science_action":{"name":"life_science_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_mechanics_proficiency":{"affects":["mechanics"],"defaultValue":"","name":"mechanics_proficiency","listener":"change:mechanics_proficiency","listenerFunc":"accessSheet","type":"hidden","triggeredFuncs":[]},"attr_mechanics_modded":{"affects":["mechanics"],"name":"mechanics_modded","listener":"change:mechanics_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_mechanics":{"calculation":"skillCalc","name":"mechanics","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_mechanics-action":{"triggeredFuncs":["rollSkill"],"name":"mechanics-action","listener":"clicked:mechanics-action","listenerFunc":"accessSheet","type":"action"},"attr_mechanics_action":{"name":"mechanics_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_physical_science_proficiency":{"affects":["physical_science"],"defaultValue":"","name":"physical_science_proficiency","listener":"change:physical_science_proficiency","listenerFunc":"accessSheet","type":"hidden","triggeredFuncs":[]},"attr_physical_science_modded":{"affects":["physical_science"],"name":"physical_science_modded","listener":"change:physical_science_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_physical_science":{"calculation":"skillCalc","name":"physical_science","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_physical-science-action":{"triggeredFuncs":["rollSkill"],"name":"physical-science-action","listener":"clicked:physical-science-action","listenerFunc":"accessSheet","type":"action"},"attr_physical_science_action":{"name":"physical_science_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_social_science_proficiency":{"affects":["social_science"],"defaultValue":"","name":"social_science_proficiency","listener":"change:social_science_proficiency","listenerFunc":"accessSheet","type":"hidden","triggeredFuncs":[]},"attr_social_science_modded":{"affects":["social_science"],"name":"social_science_modded","listener":"change:social_science_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_social_science":{"calculation":"skillCalc","name":"social_science","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_social-science-action":{"triggeredFuncs":["rollSkill"],"name":"social-science-action","listener":"clicked:social-science-action","listenerFunc":"accessSheet","type":"action"},"attr_social_science_action":{"name":"social_science_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_streetwise_proficiency":{"affects":["streetwise"],"defaultValue":"","name":"streetwise_proficiency","listener":"change:streetwise_proficiency","listenerFunc":"accessSheet","type":"hidden","triggeredFuncs":[]},"attr_streetwise_modded":{"affects":["streetwise"],"name":"streetwise_modded","listener":"change:streetwise_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_streetwise":{"calculation":"skillCalc","name":"streetwise","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_streetwise-action":{"triggeredFuncs":["rollSkill"],"name":"streetwise-action","listener":"clicked:streetwise-action","listenerFunc":"accessSheet","type":"action"},"attr_streetwise_action":{"name":"streetwise_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_insight_proficiency":{"affects":["insight","passive_insight"],"defaultValue":"","name":"insight_proficiency","listener":"change:insight_proficiency","listenerFunc":"accessSheet","type":"hidden","triggeredFuncs":[]},"attr_insight_modded":{"affects":["insight"],"name":"insight_modded","listener":"change:insight_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_insight":{"calculation":"skillCalc","name":"insight","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_insight-action":{"triggeredFuncs":["rollSkill"],"name":"insight-action","listener":"clicked:insight-action","listenerFunc":"accessSheet","type":"action"},"attr_insight_action":{"name":"insight_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_perception_proficiency":{"affects":["perception","passive_perception"],"defaultValue":"","name":"perception_proficiency","listener":"change:perception_proficiency","listenerFunc":"accessSheet","type":"hidden","triggeredFuncs":[]},"attr_perception_modded":{"affects":["perception"],"name":"perception_modded","listener":"change:perception_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_perception":{"calculation":"skillCalc","name":"perception","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_perception-action":{"triggeredFuncs":["rollSkill"],"name":"perception-action","listener":"clicked:perception-action","listenerFunc":"accessSheet","type":"action"},"attr_perception_action":{"name":"perception_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_survival_proficiency":{"affects":["survival"],"defaultValue":"","name":"survival_proficiency","listener":"change:survival_proficiency","listenerFunc":"accessSheet","type":"hidden","triggeredFuncs":[]},"attr_survival_modded":{"affects":["survival"],"name":"survival_modded","listener":"change:survival_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_survival":{"calculation":"skillCalc","name":"survival","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_survival-action":{"triggeredFuncs":["rollSkill"],"name":"survival-action","listener":"clicked:survival-action","listenerFunc":"accessSheet","type":"action"},"attr_survival_action":{"name":"survival_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_deception_proficiency":{"affects":["deception"],"defaultValue":"","name":"deception_proficiency","listener":"change:deception_proficiency","listenerFunc":"accessSheet","type":"hidden","triggeredFuncs":[]},"attr_deception_modded":{"affects":["deception"],"name":"deception_modded","listener":"change:deception_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_deception":{"calculation":"skillCalc","name":"deception","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_deception-action":{"triggeredFuncs":["rollSkill"],"name":"deception-action","listener":"clicked:deception-action","listenerFunc":"accessSheet","type":"action"},"attr_deception_action":{"name":"deception_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_intimidation_proficiency":{"affects":["intimidation"],"defaultValue":"","name":"intimidation_proficiency","listener":"change:intimidation_proficiency","listenerFunc":"accessSheet","type":"hidden","triggeredFuncs":[]},"attr_intimidation_modded":{"affects":["intimidation"],"name":"intimidation_modded","listener":"change:intimidation_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_intimidation":{"calculation":"skillCalc","name":"intimidation","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_intimidation-action":{"triggeredFuncs":["rollSkill"],"name":"intimidation-action","listener":"clicked:intimidation-action","listenerFunc":"accessSheet","type":"action"},"attr_intimidation_action":{"name":"intimidation_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_performance_proficiency":{"affects":["performance"],"defaultValue":"","name":"performance_proficiency","listener":"change:performance_proficiency","listenerFunc":"accessSheet","type":"hidden","triggeredFuncs":[]},"attr_performance_modded":{"affects":["performance"],"name":"performance_modded","listener":"change:performance_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_performance":{"calculation":"skillCalc","name":"performance","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_performance-action":{"triggeredFuncs":["rollSkill"],"name":"performance-action","listener":"clicked:performance-action","listenerFunc":"accessSheet","type":"action"},"attr_performance_action":{"name":"performance_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_persuasion_proficiency":{"affects":["persuasion"],"defaultValue":"","name":"persuasion_proficiency","listener":"change:persuasion_proficiency","listenerFunc":"accessSheet","type":"hidden","triggeredFuncs":[]},"attr_persuasion_modded":{"affects":["persuasion"],"name":"persuasion_modded","listener":"change:persuasion_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_persuasion":{"calculation":"skillCalc","name":"persuasion","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_persuasion-action":{"triggeredFuncs":["rollSkill"],"name":"persuasion-action","listener":"clicked:persuasion-action","listenerFunc":"accessSheet","type":"action"},"attr_persuasion_action":{"name":"persuasion_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_passive_perception_modded":{"affects":["passive_perception"],"name":"passive_perception_modded","listener":"change:passive_perception_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_passive_insight_modded":{"affects":["passive_insight"],"name":"passive_insight_modded","listener":"change:passive_insight_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_acute_olfaction":{"name":"acute_olfaction","type":"checkbox","defaultValue":1,"triggeredFuncs":[],"affects":[]},"attr_darkvision":{"name":"darkvision","type":"checkbox","defaultValue":1,"triggeredFuncs":[],"affects":[]},"attr_macrovision":{"name":"macrovision","type":"checkbox","defaultValue":1,"triggeredFuncs":[],"affects":[]},"attr_microvision":{"name":"microvision","type":"checkbox","defaultValue":1,"triggeredFuncs":[],"affects":[]},"attr_penetration":{"name":"penetration","type":"checkbox","defaultValue":1,"triggeredFuncs":[],"affects":[]},"attr_spectrum":{"name":"spectrum","type":"checkbox","defaultValue":1,"triggeredFuncs":[],"affects":[]},"attr_ac_formula":{"affects":["ac"],"name":"ac_formula","listener":"change:ac_formula","listenerFunc":"accessSheet","type":"hidden","defaultValue":"10 + @{dexterity_mod}","triggeredFuncs":[]},"attr_initiative_macro":{"calculation":"createInitiativeMacro","name":"initiative_macro","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_initiative_modded":{"affects":["initiative"],"name":"initiative_modded","listener":"change:initiative_modded","listenerFunc":"accessSheet","type":"hidden","defaultValue":"","triggeredFuncs":[]},"attr_initiative":{"calculation":"initiativeCalc","name":"initiative","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_initiative-action":{"triggeredFuncs":["rollInitiative"],"name":"initiative-action","listener":"clicked:initiative-action","listenerFunc":"accessSheet","type":"action"},"attr_initiative_action":{"name":"initiative_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_damage_reduction":{"name":"damage_reduction","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_speed":{"name":"speed","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_ac":{"calculation":"calcAC","name":"ac","type":"number","defaultValue":10,"triggeredFuncs":[],"affects":[]},"attr_hp":{"name":"hp","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_hit_dice_macro":{"name":"hit_dice_macro","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_hit-dice-action":{"triggeredFuncs":["rollHD"],"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_d8_hd":{"name":"d8_hd","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_d10_hd":{"name":"d10_hd","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_d12_hd":{"name":"d12_hd","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_death-saves-action":{"triggeredFuncs":["rollDeath"],"name":"death-saves-action","listener":"clicked:death-saves-action","listenerFunc":"accessSheet","type":"action"},"attr_death_saves_action":{"name":"death_saves_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_death_save_modded":{"name":"death_save_modded","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_death_success":{"name":"death_success","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_death_failure":{"name":"death_failure","type":"hidden","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_hp_max":{"name":"hp_max","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_temp_hp":{"name":"temp_hp","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_resistances":{"name":"resistances","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_expand_item":{"name":"repeating_action_$X_expand_item","type":"hidden","defaultValue":1,"triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_name":{"name":"repeating_action_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_action_proficiency":{"affects":["repeating_action_$X_bonus"],"name":"repeating_action_$X_action_proficiency","listener":"change:repeating_action:action_proficiency","listenerFunc":"accessSheet","type":"checkbox","defaultValue":"@{proficiency}","triggeredFuncs":[]},"attr_repeating_action_$X_attack_enable_item":{"name":"repeating_action_$X_attack_enable_item","type":"hidden","defaultValue":"0","triggeredFuncs":[],"affects":["repeating_action_$X_bonus"],"listener":"change:repeating_action:attack_enable_item","listenerFunc":"accessSheet"},"attr_repeating_action_$X_attack_ability":{"affects":["repeating_action_$X_bonus"],"name":"repeating_action_$X_attack_ability","listener":"change:repeating_action:attack_ability","listenerFunc":"accessSheet","type":"select","defaultValue":"none","triggeredFuncs":[]},"attr_repeating_action_$X_attack_bonus":{"affects":["repeating_action_$X_bonus"],"name":"repeating_action_$X_attack_bonus","listener":"change:repeating_action:attack_bonus","listenerFunc":"accessSheet","type":"text","defaultValue":"","triggeredFuncs":[]},"attr_repeating_action_$X_crit":{"name":"repeating_action_$X_crit","type":"number","defaultValue":20,"triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_save_enable_item":{"name":"repeating_action_$X_save_enable_item","type":"hidden","defaultValue":"0","triggeredFuncs":[],"affects":["repeating_action_$X_bonus"],"listener":"change:repeating_action:save_enable_item","listenerFunc":"accessSheet"},"attr_repeating_action_$X_save_ability":{"affects":["repeating_action_$X_bonus"],"name":"repeating_action_$X_save_ability","listener":"change:repeating_action:save_ability","listenerFunc":"accessSheet","type":"select","defaultValue":"none","triggeredFuncs":[]},"attr_repeating_action_$X_save_type":{"affects":["repeating_action_$X_bonus"],"name":"repeating_action_$X_save_type","listener":"change:repeating_action:save_type","listenerFunc":"accessSheet","type":"select","defaultValue":"none","triggeredFuncs":[]},"attr_repeating_action_$X_dc_bonus":{"affects":["repeating_action_$X_bonus"],"name":"repeating_action_$X_dc_bonus","listener":"change:repeating_action:dc_bonus","listenerFunc":"accessSheet","type":"text","defaultValue":"","triggeredFuncs":[]},"attr_repeating_action_$X_damage_1_enable_item":{"name":"repeating_action_$X_damage_1_enable_item","type":"hidden","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_damage_1":{"name":"repeating_action_$X_damage_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_critical_damage_1":{"name":"repeating_action_$X_critical_damage_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_damage_ability_1":{"name":"repeating_action_$X_damage_ability_1","type":"select","defaultValue":"none","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_damage_type_1":{"name":"repeating_action_$X_damage_type_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_damage_2_enable_item":{"name":"repeating_action_$X_damage_2_enable_item","type":"hidden","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_damage_2":{"name":"repeating_action_$X_critical_damage_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_damage_ability_2":{"name":"repeating_action_$X_damage_ability_2","type":"select","defaultValue":"none","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_range":{"name":"repeating_action_$X_range","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_properties":{"name":"repeating_action_$X_properties","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_description_in_chat":{"name":"repeating_action_$X_description_in_chat","type":"checkbox","defaultValue":1,"triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_description":{"name":"repeating_action_$X_description","type":"textarea","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_id":{"name":"repeating_action_$X_id","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_repeating_action_$X_action":{"triggeredFuncs":["rollAction"],"name":"repeating_action_$X_action","listener":"clicked:repeating_action:action","listenerFunc":"accessSheet","type":"action"},"attr_repeating_action_$X_action":{"name":"repeating_action_$X_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_action_$X_bonus":{"calculation":"calcTotalBonus","name":"repeating_action_$X_bonus","type":"span","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_mosaic_score":{"name":"mosaic_score","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_attr_satoshi":{"name":"attr_satoshi","defaultValue":"","triggeredFuncs":[],"affects":[]},"fieldset_repeating_equipment":{"triggeredFuncs":["removeMods"],"name":"repeating_equipment","listener":"remove:repeating_equipment","listenerFunc":"accessSheet","type":"fieldset"},"attr_repeating_equipment_$X_expand_item":{"name":"repeating_equipment_$X_expand_item","type":"hidden","defaultValue":1,"triggeredFuncs":[],"affects":[]},"attr_repeating_equipment_$X_name":{"name":"repeating_equipment_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_equipment_$X_quantity":{"name":"repeating_equipment_$X_quantity","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_equipment_$X_weight":{"name":"repeating_equipment_$X_weight","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_equipment_$X_cost":{"name":"repeating_equipment_$X_cost","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_equipment_$X_mods":{"initialFunc":"applyMods","name":"repeating_equipment_$X_mods","listener":"change:repeating_equipment:mods","listenerFunc":"accessSheet","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_equipment_$X_description":{"name":"repeating_equipment_$X_description","type":"textarea","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_equipment_$X_id":{"name":"repeating_equipment_$X_id","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"fieldset_repeating_trait":{"triggeredFuncs":["removeMods"],"name":"repeating_trait","listener":"remove:repeating_trait","listenerFunc":"accessSheet","type":"fieldset"},"attr_repeating_trait_$X_attr_macro":{"name":"repeating_trait_$X_attr_macro","type":"hidden","defaultValue":"{{source=@{source}}}","triggeredFuncs":[],"affects":[]},"attr_repeating_trait_$X_expand_item":{"name":"repeating_trait_$X_expand_item","type":"hidden","defaultValue":1,"triggeredFuncs":[],"affects":[]},"attr_repeating_trait_$X_name":{"name":"repeating_trait_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_trait_$X_source":{"name":"repeating_trait_$X_source","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_trait_$X_mods":{"initialFunc":"applyMods","name":"repeating_trait_$X_mods","listener":"change:repeating_trait:mods","listenerFunc":"accessSheet","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_trait_$X_description_in_chat":{"name":"repeating_trait_$X_description_in_chat","type":"checkbox","defaultValue":1,"triggeredFuncs":[],"affects":[]},"attr_repeating_trait_$X_description":{"name":"repeating_trait_$X_description","type":"textarea","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_trait_$X_id":{"name":"repeating_trait_$X_id","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_repeating_trait_$X_details-action":{"triggeredFuncs":["rollAction"],"name":"repeating_trait_$X_details-action","listener":"clicked:repeating_trait:details-action","listenerFunc":"accessSheet","type":"action"},"attr_repeating_trait_$X_details_action":{"name":"repeating_trait_$X_details_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_hack_ability":{"name":"hack_ability","type":"select","defaultValue":"none","triggeredFuncs":[],"affects":[]},"attr_1st_level_slots":{"name":"1st_level_slots","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_1st_level_slots_max":{"name":"1st_level_slots_max","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"fieldset_repeating_hack":{"name":"repeating_hack","type":"fieldset"},"attr_repeating_hack_$X_action_proficiency":{"name":"repeating_hack_$X_action_proficiency","type":"hidden","defaultValue":"@{proficiency}","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_level":{"name":"repeating_hack_$X_level","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_expand_item":{"name":"repeating_hack_$X_expand_item","type":"hidden","defaultValue":1,"triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_name":{"name":"repeating_hack_$X_name","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_launch_time":{"name":"repeating_hack_$X_launch_time","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_duration":{"name":"repeating_hack_$X_duration","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_hack_type":{"name":"repeating_hack_$X_hack_type","type":"select","defaultValue":"injection","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_source":{"name":"repeating_hack_$X_source","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_attack_enable_item":{"name":"repeating_hack_$X_attack_enable_item","type":"hidden","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_attack_ability":{"name":"repeating_hack_$X_attack_ability","type":"select","defaultValue":"hack","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_attack_bonus":{"name":"repeating_hack_$X_attack_bonus","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_save_enable_item":{"name":"repeating_hack_$X_save_enable_item","type":"hidden","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_save_ability":{"name":"repeating_hack_$X_save_ability","type":"select","defaultValue":"hack","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_save_type":{"name":"repeating_hack_$X_save_type","type":"select","defaultValue":"none","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_dc_bonus":{"name":"repeating_hack_$X_dc_bonus","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_damage_1_enable_item":{"name":"repeating_hack_$X_damage_1_enable_item","type":"hidden","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_damage_1":{"name":"repeating_hack_$X_damage_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_critical_damage_1":{"name":"repeating_hack_$X_critical_damage_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_damage_ability_1":{"name":"repeating_hack_$X_damage_ability_1","type":"select","defaultValue":"none","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_damage_type_1":{"name":"repeating_hack_$X_damage_type_1","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_damage_2_enable_item":{"name":"repeating_hack_$X_damage_2_enable_item","type":"hidden","defaultValue":"0","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_damage_2":{"name":"repeating_hack_$X_damage_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_critical_damage_2":{"name":"repeating_hack_$X_critical_damage_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_damage_ability_2":{"name":"repeating_hack_$X_damage_ability_2","type":"select","defaultValue":"none","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_damage_type_2":{"name":"repeating_hack_$X_damage_type_2","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_range":{"name":"repeating_hack_$X_range","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_properties":{"name":"repeating_hack_$X_properties","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_description_in_chat":{"name":"repeating_hack_$X_description_in_chat","type":"checkbox","defaultValue":1,"triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_description":{"name":"repeating_hack_$X_description","type":"textarea","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_repeating_hack_$X_id":{"name":"repeating_hack_$X_id","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_repeating_hack_$X_action":{"triggeredFuncs":["rollAction"],"name":"repeating_hack_$X_action","listener":"clicked:repeating_hack:action","listenerFunc":"accessSheet","type":"action"},"attr_repeating_hack_$X_action":{"name":"repeating_hack_$X_action","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]},"act_add-1st_hack":{"triggeredFuncs":["addHack"],"name":"add-1st_hack","listener":"clicked:add-1st_hack","listenerFunc":"accessSheet","type":"action"},"attr_2nd_level_slots":{"name":"2nd_level_slots","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_2nd_level_slots_max":{"name":"2nd_level_slots_max","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_add-2nd_hack":{"triggeredFuncs":["addHack"],"name":"add-2nd_hack","listener":"clicked:add-2nd_hack","listenerFunc":"accessSheet","type":"action"},"attr_3rd_level_slots":{"name":"3rd_level_slots","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_3rd_level_slots_max":{"name":"3rd_level_slots_max","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_add-3rd_hack":{"triggeredFuncs":["addHack"],"name":"add-3rd_hack","listener":"clicked:add-3rd_hack","listenerFunc":"accessSheet","type":"action"},"attr_4th_level_slots":{"name":"4th_level_slots","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_4th_level_slots_max":{"name":"4th_level_slots_max","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_add-4th_hack":{"triggeredFuncs":["addHack"],"name":"add-4th_hack","listener":"clicked:add-4th_hack","listenerFunc":"accessSheet","type":"action"},"attr_5th_level_slots":{"name":"5th_level_slots","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_5th_level_slots_max":{"name":"5th_level_slots_max","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"act_add-5th_hack":{"triggeredFuncs":["addHack"],"name":"add-5th_hack","listener":"clicked:add-5th_hack","listenerFunc":"accessSheet","type":"action"},"attr_carrying_capacity_modifier":{"name":"carrying_capacity_modifier","type":"number","defaultValue":"7","triggeredFuncs":[],"affects":[]},"attr_initiative_tiebreaker":{"name":"initiative_tiebreaker","type":"checkbox","defaultValue":"@{initiative}","triggeredFuncs":[],"affects":[]},"attr_character_type":{"affects":["master_display_controller","initiative_macro"],"name":"character_type","listener":"change:character_type","listenerFunc":"accessSheet","type":"radio","defaultValue":"pc","triggeredFuncs":[]},"attr_whisper_state":{"name":"whisper_state","type":"select","defaultValue":" ","triggeredFuncs":[],"affects":["master_display_controller"],"listener":"change:whisper_state","listenerFunc":"accessSheet"},"attr_show_character_name":{"name":"show_character_name","type":"checkbox","defaultValue":"{{character_name=@{character_name}}} {{character_id=@{character_id}}}","triggeredFuncs":[],"affects":[]},"attr_import":{"defaultValue":"","triggeredFuncs":["importClicked"],"name":"import","listener":"change:import","listenerFunc":"accessSheet","type":"checkbox","affects":["master_display_controller"]},"attr_import_cancel":{"affects":["master_display_controller"],"initialFunc":"cancelImport","name":"import_cancel","listener":"change:import_cancel","listenerFunc":"accessSheet","type":"checkbox","defaultValue":"cancel","triggeredFuncs":[]},"attr_importer":{"name":"importer","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_size":{"name":"size","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_modification":{"name":"modification","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_hit_points":{"name":"hit_points","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_hit_dice":{"name":"hit_dice","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_strength_save_base":{"name":"strength_save_base","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_dexterity_save_base":{"name":"dexterity_save_base","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_constitution_save_base":{"name":"constitution_save_base","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_intelligence_save_base":{"name":"intelligence_save_base","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_wisdom_save_base":{"name":"wisdom_save_base","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_charisma_save_base":{"name":"charisma_save_base","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_condition_immunities":{"name":"condition_immunities","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_damage_immunities":{"name":"damage_immunities","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_damage_resistances":{"name":"damage_resistances","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_damage_vulnerability":{"name":"damage_vulnerability","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_skill_notes":{"name":"skill_notes","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_senses":{"name":"senses","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_languages":{"name":"languages","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_challenge":{"name":"challenge","type":"text","defaultValue":"","triggeredFuncs":[],"affects":[]},"attr_hacker_level":{"name":"hacker_level","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_hacking_ability":{"name":"hacking_ability","type":"select","triggeredFuncs":[],"affects":[]},"attr_hack_dc":{"name":"hack_dc","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_hack_attack":{"name":"hack_attack","type":"number","defaultValue":0,"triggeredFuncs":[],"affects":[]},"attr_ac_notes":{"name":"ac_notes","type":"hidden","defaultValue":"","triggeredFuncs":[],"affects":[]}};
|
|
|
|
kFuncs.cascades = cascades;
|
|
|
|
const repeatingSectionDetails = [{"section":"repeating_action","fields":["expand_item","name","action_proficiency","attack_enable_item","attack_ability","attack_bonus","crit","save_enable_item","save_ability","save_type","dc_bonus","damage_1_enable_item","damage_1","critical_damage_1","damage_ability_1","damage_type_1","damage_2_enable_item","damage_2","critical_damage_2","damage_ability_2","damage_type_2","range","properties","description_in_chat","description","id","action","bonus"]},{"section":"repeating_equipment","fields":["expand_item","name","quantity","weight","cost","mods","description","id"]},{"section":"repeating_trait","fields":["attr_macro","expand_item","name","source","mods","description_in_chat","description","id","details_action"]},{"section":"repeating_hack","fields":["action_proficiency","level","expand_item","name","launch_time","duration","hack_type","source","attack_enable_item","attack_ability","attack_bonus","save_enable_item","save_ability","save_type","dc_bonus","damage_1_enable_item","damage_1","critical_damage_1","damage_ability_1","damage_type_1","damage_2_enable_item","damage_2","critical_damage_2","damage_ability_2","damage_type_2","range","properties","description_in_chat","description","id","action"]}];
|
|
|
|
kFuncs.repeatingSectionDetails = repeatingSectionDetails;
|
|
/**
|
|
* This stores the name of your sheet for use in the logging functions {@link log} and {@link debug}. Accessible by `k.sheetName`
|
|
* @var
|
|
* @type {string}
|
|
*/
|
|
let sheetName = 'kScaffold Powered Sheet';
|
|
kFuncs.sheetName = sheetName;
|
|
/**
|
|
* This stores the version of your sheet for use in the logging functions{@link log} and {@link debug}. It is also stored in the sheet_version attribute on your character sheet. Accessible via `k.version`
|
|
* @var
|
|
* @type {number}
|
|
*/
|
|
let version = 0;
|
|
kFuncs.version = version;
|
|
/**
|
|
* A boolean flag that tells the script whether to enable or disable {@link debug} calls. If the version of the sheet is `0`, or an attribute named `debug_mode` is found on opening this is set to true for your entire session. Otherwise, it remains false.
|
|
* @var
|
|
* @type {boolean}
|
|
*/
|
|
let debugMode = false;
|
|
kFuncs.debugMode = debugMode;
|
|
const funcs = {};
|
|
kFuncs.funcs = funcs;
|
|
const updateHandlers = {};
|
|
const openHandlers = {};
|
|
const initialSetups = {};
|
|
const allHandlers = {};
|
|
const addFuncs = {};
|
|
|
|
const kscaffoldJSVersion = 0.30;
|
|
const kscaffoldPUGVersion = 0.30;
|
|
/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
|
|
/*jshint -W014,-W084,-W030,-W033*/
|
|
/**
|
|
* Replaces problem characters to use a string as a regex
|
|
* @param {string} text - The text to replace characters in
|
|
* @returns {string}
|
|
* @example
|
|
* const textForRegex = k.sanitizeForRegex('.some thing[with characters]');
|
|
* console.log(textForRegex);// => "\.some thing\[with characters\]"
|
|
*/
|
|
const sanitizeForRegex = function(text){
|
|
return text.replace(/\.|\||\(|\)|\[|\]|\-|\+|\?|\/|\{|\}|\^|\$|\*/g,'\\$&');
|
|
};
|
|
kFuncs.sanitizeForRegex = sanitizeForRegex;
|
|
|
|
/**
|
|
* Converts a value to a number, it\'s default value, or `0` if no default value passed.
|
|
* @param {string|number} val - Value to convert to a number
|
|
* @param {number} def - The default value, uses 0 if not passed
|
|
* @returns {number|undefined}
|
|
* @example
|
|
* const num = k.value('100');
|
|
* console.log(num);// => 100
|
|
*/
|
|
const value = function(val,def){
|
|
return (+val||def||0);
|
|
};
|
|
kFuncs.value = value;
|
|
|
|
/**
|
|
* Extracts the section (e.g. `repeating_equipment`), rowID (e.g `-;lkj098J:LKj`), and field name (e.g. `bulk`) from a repeating attribute name.
|
|
* @param {string} string - The string to parse
|
|
* @returns {array} - Array of matches. Index 0: the section name, e.g. repeating_equipment | Index 1:the row ID | index 2: The name of the attribute
|
|
* @returns {string[]}
|
|
* @example
|
|
* //Extract info from a full repeating name
|
|
* const [section,rowID,attrName] = k.parseRepeatName('repeating_equipment_-8908asdflkjZlkj23_name');
|
|
* console.log(section);// => "repeating_equipment"
|
|
* console.log(rowID);// => "-8908asdflkjZlkj23"
|
|
* console.log(attrName);// => "name"
|
|
*
|
|
* //Extract info from just a row name
|
|
* const [section,rowID,attrName] = k.parseRepeatName('repeating_equipment_-8908asdflkjZlkj23');
|
|
* console.log(section);// => "repeating_equipment"
|
|
* console.log(rowID);// => "-8908asdflkjZlkj23"
|
|
* console.log(attrName);// => undefined
|
|
*/
|
|
const parseRepeatName = function(string){
|
|
let match = string.match(/(repeating_[^_]+)_([^_]+)(?:_(.+))?/);
|
|
match.shift();
|
|
return match;
|
|
};
|
|
kFuncs.parseRepeatName = parseRepeatName;
|
|
|
|
/**
|
|
* Parses out the components of a trigger name similar to [parseRepeatName](#parserepeatname). Aliases: parseClickTrigger.
|
|
*
|
|
* Aliases: `k.parseClickTrigger`
|
|
* @param {string} string The triggerName property of the
|
|
* @returns {array} - For a repeating button named `repeating_equipment_-LKJhpoi98;lj_roll`, the array will be `['repeating_equipment','-LKJhpoi98;lj','roll']`. For a non repeating button named `roll`, the array will be `[undefined,undefined,'roll']`
|
|
* @returns {string[]}
|
|
* @example
|
|
* //Parse a non repeating trigger
|
|
* const [section,rowID,attrName] = k.parseTriggerName('clicked:some-button');
|
|
* console.log(section);// => undefined
|
|
* console.log(rowID);// => undefined
|
|
* console.log(attrName);// => "some-button"
|
|
*
|
|
* //Parse a repeating trigger
|
|
* const [section,rowID,attrName] = k.parseTriggerName('clicked:repeating_attack_-234lkjpd8fu8usadf_some-button');
|
|
* console.log(section);// => "repeating_attack"
|
|
* console.log(rowID);// => "-234lkjpd8fu8usadf"
|
|
* console.log(attrName);// => "some-button"
|
|
*
|
|
* //Parse a repeating name
|
|
* const [section,rowID,attrName] = k.parseTriggerName('repeating_attack_-234lkjpd8fu8usadf_some-button');
|
|
* console.log(section);// => "repeating_attack"
|
|
* console.log(rowID);// => "-234lkjpd8fu8usadf"
|
|
* console.log(attrName);// => "some-button"
|
|
*/
|
|
const parseTriggerName = function(string){
|
|
let match = string.replace(/^clicked:/,'').match(/(?:(repeating_[^_]+)_([^_]+)_)?(.+)/);
|
|
match.shift();
|
|
return match;
|
|
};
|
|
kFuncs.parseTriggerName = parseTriggerName;
|
|
const parseClickTrigger = parseTriggerName;
|
|
kFuncs.parseClickTrigger = parseClickTrigger;
|
|
|
|
/**
|
|
* Parses out the attribute name from the htmlattribute name.
|
|
* @param {string} string - The triggerName property of the [event](https://wiki.roll20.net/Sheet_Worker_Scripts#eventInfo_Object).
|
|
* @returns {string}
|
|
* @example
|
|
* //Parse a name
|
|
* const attrName = k.parseHtmlName('attr_attribute_1');
|
|
* console.log(attrName);// => "attribute_1"
|
|
*/
|
|
const parseHTMLName = function(string){
|
|
let match = string.match(/(?:attr|act|roll)_(.+)/);
|
|
match.shift();
|
|
return match[0];
|
|
};
|
|
kFuncs.parseHTMLName = parseHTMLName;
|
|
|
|
/**
|
|
* Capitalize each word in a string
|
|
* @param {string} string - The string to capitalize
|
|
* @returns {string}
|
|
* @example
|
|
* const capitalized = k.capitalize('a word');
|
|
* console.log(capitalized);// => "A Word"
|
|
*/
|
|
const capitalize = function(string){
|
|
return string.replace(/(?:^|\s+|\/)[a-z]/ig,(letter)=>letter.toUpperCase());
|
|
};
|
|
kFuncs.capitalize = capitalize;
|
|
|
|
/**
|
|
* Extracts a roll query result for use in later functions. Must be awaited as per [startRoll documentation](https://wiki.roll20.net/Sheet_Worker_Scripts#Roll_Parsing.28NEW.29). Stolen from [Oosh\'s Adventures with Startroll thread](https://app.roll20.net/forum/post/10346883/adventures-with-startroll).
|
|
* @param {string} query - The query should be just the text as the `?{` and `}` at the start/end of the query are added by the function.
|
|
* @returns {Promise} - Resolves to the selected value from the roll query
|
|
* @example
|
|
* const rollFunction = async function(){
|
|
* //Get the result of a choose from list query
|
|
* const queryResult = await extractQueryResult('Prompt Text Here|Option 1|Option 2');
|
|
* console.log(queryResult);//=> "Option 1" or "Option 2" depending on what the user selects
|
|
*
|
|
* //Get free from input from the user
|
|
* const freeResult = await extractQueryResult('Prompt Text Here');
|
|
* consoel.log(freeResult);// => Whatever the user entered
|
|
* }
|
|
*/
|
|
const extractQueryResult = async function(query){
|
|
debug('entering extractQueryResult');
|
|
let queryRoll = await startRoll(`!{{query=[[0[response=?{${query}}]]]}}`);
|
|
finishRoll(queryRoll.rollId);
|
|
return queryRoll.results.query.expression.replace(/^.+?response=|\]$/g,'');
|
|
};
|
|
kFuncs.extractQueryResult = extractQueryResult;
|
|
|
|
/**
|
|
* Simulates a query for ensuring that async/await works correctly in the sheetworker environment when doing conditional startRolls. E.g. if you have an if/else and only one of the conditions results in `startRoll` being called (and thus an `await`), the sheetworker environment would normally crash. Awaiting this in the condition that does not actually need to call `startRoll` will keep the environment in sync.
|
|
* @param {string|number} [value] - The value to return. Optional.
|
|
* @returns {Promise} - Resolves to the value passed to the function
|
|
* @example
|
|
* const rollFunction = async function(){
|
|
* //Get the result of a choose from list query
|
|
* const queryResult = await pseudoQuery('a value');
|
|
* console.log(queryResult);//=> "a value"
|
|
* }
|
|
*/
|
|
const pseudoQuery = async function(value){
|
|
debug('entering pseudoQuery');
|
|
let queryRoll = await startRoll(`!{{query=[[0[response=${value}]]]}}`);
|
|
finishRoll(queryRoll.rollId);
|
|
return queryRoll.results.query.expression.replace(/^.+?response=|\]$/g,'');
|
|
};
|
|
kFuncs.pseudoQuery = pseudoQuery;
|
|
|
|
/**
|
|
* An alias for console.log.
|
|
* @param {any} msg - The message can be a straight string, an object, or an array. If it is an object or array, the object will be broken down so that each key is used as a label to output followed by the value of that key. If the value of the key is an object or array, it will be output via `console.table`.
|
|
*/
|
|
const log = function(msg){
|
|
if(typeof msg === 'string'){
|
|
console.log(`%c${kFuncs.sheetName} log| ${msg}`,"background-color:#159ccf");
|
|
}else if(typeof msg === 'object'){
|
|
Object.keys(msg).forEach((m)=>{
|
|
if(typeof msg[m] === 'string'){
|
|
console.log(`%c${kFuncs.sheetName} log| ${m}: ${msg[m]}`,"background-color:#159ccf");
|
|
}else{
|
|
console.log(`%c${kFuncs.sheetName} log| ${typeof msg[m]} ${m}`,"background-color:#159ccf");
|
|
console.table(msg[m]);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
kFuncs.log = log;
|
|
|
|
/**
|
|
* Alias for console.log that only triggers when debug mode is enabled or when the sheet\'s version is `0`. Useful for entering test logs that will not pollute the console on the live sheet.
|
|
* @param {any} msg - 'See {@link k.log}
|
|
* @param {boolean} force - Pass as a truthy value to force the debug output to be output to the console regardless of debug mode.
|
|
* @returns {void}
|
|
*/
|
|
const debug = function(msg,force){
|
|
if(!kFuncs.debugMode && !force && kFuncs.version > 0) return;
|
|
if(typeof msg === 'string'){
|
|
console.log(`%c${kFuncs.sheetName} DEBUG| ${msg}`,"background-color:tan;color:red;");
|
|
}else if(typeof msg === 'object'){
|
|
Object.keys(msg).forEach((m)=>{
|
|
if(typeof msg[m] === 'string'){
|
|
console.log(`%c${kFuncs.sheetName} DEBUG| ${m}: ${msg[m]}`,"background-color:tan;color:red;");
|
|
}else{
|
|
console.log(`%c${kFuncs.sheetName} DEBUG| ${typeof msg[m]} ${m}`,"background-color:tan;color:red;font-weight:bold;");
|
|
console.table(msg[m]);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
kFuncs.debug = debug;
|
|
|
|
/**
|
|
* Orders the section id arrays for all sections in the `sections` object to match the repOrder attribute.
|
|
* @param {attributesProxy} attributes - The attributes object that must have a value for the reporder for each section.
|
|
* @param {[object]} sections - Object containing the IDs for the repeating sections, indexed by repeating section name.
|
|
*/
|
|
const orderSections = function(attributes,sections){
|
|
Object.keys(sections).forEach((section)=>{
|
|
attributes.attributes[`_reporder_${section}`] = commaArray(attributes[`_reporder_${section}`]);
|
|
orderSection(attributes.attributes[`_reporder_${section}`],sections[section]);
|
|
});
|
|
};
|
|
kFuncs.orderSections = orderSections;
|
|
|
|
/**
|
|
* Orders a single ID array.
|
|
* @param {[string]} repOrder - Array of IDs in the order they are in on the sheet.
|
|
* @param {[string]} IDs - Array of IDs to be ordered.
|
|
*/
|
|
const orderSection = function(repOrder,IDs=[]){
|
|
IDs.sort((a,b)=>{
|
|
return repOrder.indexOf(a.toLowerCase()) - repOrder.indexOf(b.toLowerCase());
|
|
});
|
|
};
|
|
kFuncs.orderSection = orderSection;
|
|
|
|
/**
|
|
* Splits a comma delimited string into an array
|
|
* @param {string} string - The string to split.
|
|
* @returns {array} - The string segments of the comma delimited list.
|
|
*/
|
|
const commaArray = function(string=''){
|
|
return string.toLowerCase().split(/\s*,\s*/);
|
|
};
|
|
kFuncs.commaArray = commaArray;/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
|
|
/*jshint -W014,-W084,-W030,-W033*/
|
|
//# Attribute Obj Proxy handler
|
|
const createAttrProxy = function(attrs){
|
|
//creates a proxy for the attributes object so that values can be worked with more easily.
|
|
const getCascObj = function(event,casc){
|
|
const eventName = event.triggerName || event.sourceAttribute;
|
|
let typePrefix = eventName.startsWith('clicked:') ?
|
|
'act_' :
|
|
event.removedInfo ?
|
|
'fieldset_' :
|
|
'attr_';
|
|
let cascName = `${typePrefix}${eventName.replace(/clicked:/,'')}`.replace(/fieldset_remove:/,'fieldset_');
|
|
let cascObj = casc[cascName];
|
|
debug({[cascName]:cascObj});
|
|
if(cascObj && typePrefix === 'attr_' && event){
|
|
cascObj.previousValue = event.previousValue;
|
|
}else if(cascObj && typePrefix === 'fieldset_' && event){
|
|
cascObj.removedInfo = event.removedInfo;
|
|
}
|
|
return cascObj;
|
|
};
|
|
|
|
const triggerFunctions = function(obj,attributes,sections,casc){
|
|
if(obj.triggeredFuncs && obj.triggeredFuncs.length){
|
|
debug(`triggering functions for ${obj.name}`);
|
|
obj.triggeredFuncs && obj.triggeredFuncs.forEach(func=>funcs[func] ?
|
|
funcs[func]({trigger:obj,attributes,sections,casc}) :
|
|
debug(`!!!Warning!!! no function named ${func} found. Triggered function not called for ${obj.name}`,true));
|
|
}
|
|
};
|
|
|
|
const initialFunction = function(obj,attributes,sections){
|
|
if(obj.initialFunc){
|
|
debug(`initial functions for ${obj.name}`);
|
|
funcs[obj.initialFunc] ?
|
|
funcs[obj.initialFunc]({trigger:obj,attributes,sections}) :
|
|
debug(`!!!Warning!!! no function named ${obj.initialFunc} found. Initial function not called for ${obj.name}`,true);
|
|
}
|
|
};
|
|
const alwaysFunctions = function(trigger,attributes,sections,casc){
|
|
Object.values(allHandlers).forEach((handler)=>{
|
|
handler({trigger,attributes,sections,casc});
|
|
});
|
|
};
|
|
const processChange = function({event,trigger,attributes,sections,casc}){
|
|
if(event && !trigger){
|
|
debug(`${event.sourceAttribute} change detected. No trigger found`);
|
|
return;
|
|
}
|
|
if(!attributes || !sections || !casc){
|
|
debug(`!!! Insufficient arguments || attributes > ${!!attributes} | sections > ${!!sections} | casc > ${!!casc} !!!`);
|
|
return;
|
|
}
|
|
debug({trigger});
|
|
if(event){
|
|
debug('checking for initial & always functions');
|
|
alwaysFunctions(trigger,attributes,sections,casc);//Functions that should be run for all events.
|
|
initialFunction(trigger,attributes,sections,casc);//functions that should only be run if the attribute was the thing changed by the user
|
|
}
|
|
if(trigger){
|
|
debug(`processing ${trigger.name}`);
|
|
triggerFunctions(trigger,attributes,sections,casc);
|
|
if(!event && trigger.calculation && funcs[trigger.calculation]){
|
|
attributes[trigger.name] = funcs[trigger.calculation]({trigger,attributes,sections,casc});
|
|
}else if(trigger.calculation && !funcs[trigger.calculation]){
|
|
debug(`K-Scaffold Error: No function named ${trigger.calculation} found`);
|
|
}
|
|
if(Array.isArray(trigger.affects)){
|
|
attributes.queue.push(...trigger.affects);
|
|
}
|
|
}
|
|
attributes.set({attributes,sections,casc});
|
|
};
|
|
const attrTarget = {
|
|
updates:{},
|
|
attributes:{...attrs},
|
|
repOrders:{},
|
|
queue: [],
|
|
casc:{},
|
|
alwaysFunctions,
|
|
processChange,
|
|
triggerFunctions,
|
|
initialFunction,
|
|
getCascObj
|
|
};
|
|
const attrHandler = {
|
|
get:function(obj,prop){//gets the most value of the attribute.
|
|
//If it is a repeating order, returns the array, otherwise returns the update value or the original value
|
|
if(prop === 'set'){
|
|
return function(){
|
|
let {attributes,sections,casc,callback,vocal} = arguments[0] ? arguments[0] : {};
|
|
if(attributes && attributes.queue.length && sections && casc){
|
|
let triggerName = attributes.queue.shift();
|
|
let trigger = getCascObj({sourceAttribute:triggerName},casc);
|
|
attributes.processChange({trigger,attributes,sections,casc});
|
|
}else{
|
|
debug({updates:obj.updates});
|
|
let trueCallback = Object.keys(obj.repOrders).length ?
|
|
function(){
|
|
Object.entries(obj.repOrders).forEach(([section,order])=>{
|
|
_setSectionOrder(section,order,)
|
|
});
|
|
callback && callback();
|
|
}:
|
|
callback;
|
|
Object.keys(obj.updates).forEach((key)=>obj.attributes[key] = obj.updates[key]);
|
|
const update = obj.updates;
|
|
obj.updates = {};
|
|
set(update,vocal,trueCallback);
|
|
}
|
|
}
|
|
}else if(Object.keys(obj).some(key=>key===prop)){
|
|
return Reflect.get(...arguments)
|
|
}else{
|
|
let retValue;
|
|
switch(true){
|
|
case obj.repOrders.hasOwnProperty(prop):
|
|
retValue = obj.repOrders[prop];
|
|
break;
|
|
case obj.updates.hasOwnProperty(prop):
|
|
retValue = obj.updates[prop];
|
|
break;
|
|
default:
|
|
retValue = obj.attributes[prop];
|
|
break;
|
|
}
|
|
let cascRef = `attr_${prop.replace(/(repeating_[^_]+_)[^_]+/,'$1\$X')}`;
|
|
let numRetVal = +retValue;
|
|
if(!Number.isNaN(numRetVal) && retValue !== ''){
|
|
retValue = numRetVal;
|
|
}else if(cascades[cascRef] && (typeof cascades[cascRef].defaultValue === 'number' || cascades[cascRef].type === 'number')){
|
|
retValue = cascades[cascRef].defaultValue;
|
|
}
|
|
return retValue;
|
|
}
|
|
},
|
|
set:function(obj,prop,value){
|
|
//Sets the value. Also verifies that the value is a valid attribute value
|
|
//e.g. not undefined, null, or NaN
|
|
if(value || value===0 || value===''){
|
|
if(/reporder|^repeating_[^_]+$/.test(prop)){
|
|
let section = prop.replace(/_reporder_/,'');
|
|
obj.repOrders[section] = value;
|
|
}else if(`${obj.attributes}` !== `${value}` ||
|
|
(obj.updates[prop] && `${obj.updates}` !== `${value}`)
|
|
){
|
|
obj.updates[prop] = value;
|
|
}
|
|
}else{
|
|
debug(`!!!Warning: Attempted to set ${prop} to an invalid value:${value}; value not stored!!!`);
|
|
}
|
|
return true;
|
|
},
|
|
deleteProperty(obj,prop){
|
|
//removes the property from the original attributes, updates, and the reporders
|
|
Object.keys(obj).forEach((key)=>{
|
|
delete obj[key][prop.toLowerCase()];
|
|
});
|
|
}
|
|
};
|
|
return new Proxy(attrTarget,attrHandler);
|
|
};
|
|
|
|
|
|
/**
|
|
* Function that registers a function for being called via the funcs object. Returns true if the function was successfully registered, and false if it could not be registered for any reason.
|
|
* @param {object} funcObj - Object with keys that are names to register functions under and values that are functions.
|
|
* @param {object} optionsObj - Object that contains options to use for this registration.
|
|
* @param {string[]} optionsObj.type - Array that contains the types of specialized functions that apply to the functions being registered. Valid types are `"opener"`, `"updater"`, and `"default"`. `"default"` is always used, and never needs to be passed.
|
|
* @returns {boolean} - True if the registration succeeded, false if it failed.
|
|
* @example
|
|
* //Basic Registration
|
|
* const myFunc = function({trigger,attributes,sections,casc}){};
|
|
* k.registerFuncs({myFunc});
|
|
*
|
|
* //Register a function to run on sheet open
|
|
* const openFunc = function({trigger,attributes,sections,casc}){};
|
|
* k.registerFuncs({openFunc},{type:['opener']})
|
|
*
|
|
* //Register a function to run on all events
|
|
* const allFunc = function({trigger,attributes,sections,casc}){};
|
|
* k.registerFuncs({allFunc},{type:['all']})
|
|
*/
|
|
const registerFuncs = function(funcObj,optionsObj = {}){
|
|
if(typeof funcObj !== 'object' || typeof optionsObj !== 'object'){
|
|
debug(`!!!! K-scaffold error: Improper arguments to register functions !!!!`);
|
|
return false;
|
|
}
|
|
const typeArr = optionsObj.type ? ['default',...optionsObj.type] : ['default'];
|
|
const typeSwitch = {
|
|
'opener':openHandlers,
|
|
'updater':updateHandlers,
|
|
'new':initialSetups,
|
|
'all':allHandlers,
|
|
'default':funcs
|
|
};
|
|
let setState;
|
|
Object.entries(funcObj).map(([prop,value])=>{
|
|
typeArr.forEach((type)=>{
|
|
if(typeSwitch[type][prop]){
|
|
debug(`!!! Duplicate function name for ${prop} as ${type}!!!`);
|
|
setState = false;
|
|
}else if(typeof value === 'function'){
|
|
typeSwitch[type][prop] = value;
|
|
setState = setState !== false ? true : false;
|
|
}else{
|
|
debug(`!!! K-scaffold error: Function registration requires a function. Invalid value to register as ${type} !!!`);
|
|
setState = false;
|
|
}
|
|
});
|
|
});
|
|
return setState;
|
|
};
|
|
kFuncs.registerFuncs = registerFuncs;
|
|
|
|
const setActionCalls = function({attributes,sections}){
|
|
actionAttributes.forEach((base)=>{
|
|
let [section,,field] = k.parseTriggerName(base);
|
|
let fieldAction = field.replace(/_/g,'-');
|
|
if(section){
|
|
sections[section].forEach((id)=>{
|
|
attributes[`${section}_${id}_${field}`] = `%{${attributes.character_name}|${section}_${id}_${fieldAction}}`;
|
|
});
|
|
}else{
|
|
attributes[`${field}`] = `%{${attributes.character_name}|${fieldAction}}`;
|
|
}
|
|
});
|
|
};
|
|
kFuncs.setActionCalls = setActionCalls;
|
|
|
|
/**
|
|
* Function to call a function previously registered to the funcs object. May not be used that much. Either returns the function or null if no function exists.
|
|
* @param {string} funcName - The name of the function to invoke.
|
|
* @param {...any} args - The arguments to call the function with.
|
|
* @returns {any}
|
|
* @example
|
|
* //Call myFunc with two arguments
|
|
* k.callFunc('myFunc','an argument','another argument');
|
|
*/
|
|
const callFunc = function(funcName,...args){
|
|
if(funcs[funcName]){
|
|
debug(`calling ${funcName}`);
|
|
return funcs[funcName](...args);
|
|
}else{
|
|
debug(`Invalid function name: ${funcName}`);
|
|
return null;
|
|
}
|
|
};
|
|
kFuncs.callFunc = callFunc;/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
|
|
/*jshint -W014,-W084,-W030,-W033*/
|
|
//Sheet Updaters and styling functions
|
|
const updateSheet = function(){
|
|
log('updating sheet');
|
|
getAllAttrs({props:['debug_mode',...baseGet],callback:(attributes,sections,casc)=>{
|
|
kFuncs.debugMode = kFuncs.debugMode || !!attributes.debug_mode;
|
|
debug({sheet_version:attributes.sheet_version});
|
|
if(!attributes.sheet_version){
|
|
Object.entries(initialSetups).forEach(([funcName,handler])=>{
|
|
if(typeof funcs[funcName] === 'function'){
|
|
debug(`running ${funcName}`);
|
|
funcs[funcName]({attributes,sections,casc});
|
|
}else{
|
|
debug(`!!!Warning!!! no function named ${funcName} found. Initial sheet setup not performed.`);
|
|
}
|
|
});
|
|
}else{
|
|
Object.entries(updateHandlers).forEach(([ver,handler])=>{
|
|
if(attributes.sheet_version < +ver){
|
|
handler({attributes,sections,casc});
|
|
}
|
|
});
|
|
}
|
|
Object.entries(openHandlers).forEach(([funcName,func])=>{
|
|
if(typeof funcs[funcName] === 'function'){
|
|
debug(`running ${funcName}`);
|
|
funcs[funcName]({attributes,sections,casc});
|
|
}else{
|
|
debug(`!!!Warning!!! no function named ${funcName} found. Sheet open handling not performed.`);
|
|
}
|
|
});
|
|
setActionCalls({attributes,sections});
|
|
attributes.sheet_version = kFuncs.version;
|
|
log(`Sheet Update applied. Current Sheet Version ${kFuncs.version}`);
|
|
attributes.set();
|
|
log('Sheet ready for use');
|
|
}});
|
|
};
|
|
|
|
const initialSetup = function(attributes,sections){
|
|
debug('Initial sheet setup');
|
|
};
|
|
|
|
/**
|
|
* This is the default listener function for attributes that the K-Scaffold uses. It utilizes the `triggerFuncs`, `listenerFunc`, `calculation`, and `affects` properties of the K-scaffold trigger object (see the Pug section of the scaffold for more details).
|
|
* @param {Roll20Event} event
|
|
* @returns {void}
|
|
* @example
|
|
* //Call from an attribute change
|
|
* on('change:an_attribute',k.accessSheet);
|
|
*/
|
|
const accessSheet = function(event){
|
|
debug({funcs:Object.keys(funcs)});
|
|
debug({event});
|
|
getAllAttrs({event,callback:(attributes,sections,casc)=>{
|
|
let trigger = attributes.getCascObj(event,casc);
|
|
attributes.processChange({event,trigger,attributes,sections,casc});
|
|
}});
|
|
};
|
|
funcs.accessSheet = accessSheet;/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
|
|
/*jshint -W014,-W084,-W030,-W033*/
|
|
/*
|
|
Cascade Expansion functions
|
|
*/
|
|
//Expands the repeating section templates in cascades to reflect the rows actually available
|
|
const expandCascade = function(cascade,sections,attributes){
|
|
return _.keys(cascade).reduce((memo,key)=>{//iterate through cascades and replace references to repeating attributes with correct row ids.
|
|
if(/^(?:act|attr)_repeating_/.test(key)){//If the attribute is a repeating attribute, do special logic
|
|
expandRepeating(memo,key,cascade,sections,attributes);
|
|
}else if(key){//for non repeating attributes do this logic
|
|
expandNormal(memo,key,cascade,sections);
|
|
}
|
|
return memo;
|
|
},{});
|
|
};
|
|
|
|
const expandRepeating = function(memo,key,cascade,sections,attributes){
|
|
key.replace(/((?:attr|act)_)(repeating_[^_]+)_[^_]+?_(.+)/,(match,type,section,field)=>{
|
|
(sections[section]||[]).forEach((id)=>{
|
|
memo[`${type}${section}_${id}_${field}`]=_.clone(cascade[key]);//clone the details so that each row's attributes have correct ids
|
|
memo[`${type}${section}_${id}_${field}`].name = `${section}_${id}_${field}`;
|
|
if(key.startsWith('attr_')){
|
|
memo[`${type}${section}_${id}_${field}`].affects = memo[`${type}${section}_${id}_${field}`].affects.reduce((m,affected)=>{
|
|
if(section === affected){//otherwise if the affected attribute is in the same section, simply set the affected attribute to have the same row id.
|
|
m.push(applyID(affected,id));
|
|
}else if(/repeating/.test(affected)){//If the affected attribute isn't in the same repeating section but is still a repeating attribute, add all the rows of that section
|
|
addAllRows(affected,m,sections);
|
|
}else{//otherwise the affected attribute is a non repeating attribute. Simply add it to the computed affected array
|
|
m.push(affected);
|
|
}
|
|
return m;
|
|
},[]);
|
|
}
|
|
});
|
|
});
|
|
};
|
|
|
|
const applyID = function(affected,id){
|
|
return affected.replace(/(repeating_[^_]+_)[^_]+(.+)/,`$1${id}$2`);
|
|
};
|
|
|
|
const expandNormal = function(memo,key,cascade,sections){
|
|
memo[key] = _.clone(cascade[key]);
|
|
if(key.startsWith('attr_')){
|
|
memo[key].affects = memo[key].affects || [];
|
|
memo[key].affects = memo[key].affects.reduce((m,a)=>{
|
|
if(/^repeating/.test(a)){
|
|
addAllRows(a,m,sections);
|
|
}else{
|
|
m.push(a);
|
|
}
|
|
return m;
|
|
},[]);
|
|
}
|
|
};
|
|
|
|
const addAllRows = function(affected,memo,sections){
|
|
affected.replace(/(repeating_[^_]+?)_[^_]+?_(.+)/,(match,section,field)=>{
|
|
sections[section].forEach(id=>memo.push(`${section}_${id}_${field}`));
|
|
});
|
|
};/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
|
|
/*jshint -W014,-W084,-W030,-W033*/
|
|
/**
|
|
* Alias for [setSectionOrder()](https://wiki.roll20.net/Sheet_Worker_Scripts#setSectionOrder.28.3CRepeating_Section_Name.3E.2C_.3CSection_Array.3E.2C_.3CCallback.3E.29) that allows you to use the section name in either `repeating_section` or `section` formats. Note that the Roll20 sheetworker [setSectionOrder](https://wiki.roll20.net/Sheet_Worker_Scripts#setSectionOrder.28.3CRepeating_Section_Name.3E.2C_.3CSection_Array.3E.2C_.3CCallback.3E.29) currently causes some display issues on sheets.
|
|
* @param {string} section
|
|
* @param {string[]} order
|
|
* @returns {void}
|
|
* @example
|
|
* //Set the order of a repeating_weapon section
|
|
* k.setSectionOrder('repeating_equipment',['id1','id2','id3']);
|
|
* //Can also specify the section name without the repeating_ prefix
|
|
* k.setSectionOrder('equipment',['id1','id2','id3']);
|
|
*/
|
|
const _setSectionOrder = function(section,order){
|
|
let trueSection = section.replace(/repeating_/,'');
|
|
setSectionOrder(trueSection,order);
|
|
};
|
|
kFuncs.setSectionOrder = _setSectionOrder;
|
|
|
|
/**
|
|
* Alias for [removeRepeatingRow](https://wiki.roll20.net/Sheet_Worker_Scripts#removeRepeatingRow.28_RowID_.29) that also removes the row from the current object of attribute values and array of section IDs to ensure that erroneous updates are not issued.
|
|
* @param {string} row - The row id to be removed
|
|
* @param {attributesProxy} attributes - The attribute values currently in memory
|
|
* @param {object} sections - Object that contains arrays of all the IDs in sections on the sheet indexed by repeating name.
|
|
* @returns {void}
|
|
* @example
|
|
* //Remove a repeating Row
|
|
* k.getAllAttrs({
|
|
* callback:(attributes,sections)=>{
|
|
* const rowID = sections.repeating_equipment[0];
|
|
* k.removeRepeatingRow(`repeating_equipment_${rowID}`,attributes,sections);
|
|
* console.log(sections.repeating_equipment); // => rowID no longer exists in the array.
|
|
* console.log(attributes[`repeating_equipment_${rowID}_name`]); // => undefined
|
|
* }
|
|
* })
|
|
*/
|
|
const _removeRepeatingRow = function(row,attributes,sections){
|
|
debug(`removing ${row}`);
|
|
Object.keys(attributes.attributes).forEach((key)=>{
|
|
if(key.startsWith(row)){
|
|
delete attributes[key];
|
|
}
|
|
});
|
|
let [,section,rowID] = row.match(/(repeating_[^_]+)_(.+)/,'');
|
|
sections[section] = sections[section].filter((id)=>id!==rowID);
|
|
removeRepeatingRow(row);
|
|
};
|
|
kFuncs.removeRepeatingRow = _removeRepeatingRow;
|
|
|
|
/**
|
|
* Alias for [getAttrs()](https://wiki.roll20.net/Sheet_Worker_Scripts#getAttrs.28attributeNameArray.2C_callback.29) that converts the default object of attribute values into an {@link attributesProxy} and passes that back to the callback function.
|
|
* @param {Object} args
|
|
* @param {string[]} [args.props=baseGet] - Array of attribute names to get the value of. Defaults to {@link baseGet} if not passed.
|
|
* @param {function(attributesProxy)} args.callback - The function to call after the attribute values have been gotten. An {@link attributesProxy} is passed to the callback.
|
|
* @example
|
|
* //Gets the attributes named in props.
|
|
* k.getAttrs({
|
|
* props:['attribute_1','attribute_2'],
|
|
* callback:(attributes)=>{
|
|
* //Work with the attributes as you would in a normal getAttrs, or use the superpowers of the K-scaffold attributes object like so:
|
|
* attributes.attribute_1 = 'new value';
|
|
* attributes.set();
|
|
* }
|
|
* })
|
|
*/
|
|
const _getAttrs = function({props=baseGet,callback}){
|
|
getAttrs(props,(values)=>{
|
|
const attributes = createAttrProxy(values);
|
|
callback(attributes);
|
|
});
|
|
};
|
|
kFuncs.getAttrs = _getAttrs;
|
|
|
|
/**
|
|
* Alias for [getAttrs()](https://wiki.roll20.net/Sheet_Worker_Scripts#getAttrs.28attributeNameArray.2C_callback.29) and [getSectionIDs](https://wiki.roll20.net/Sheet_Worker_Scripts#getSectionIDs.28section_name.2Ccallback.29) that combines the actions of both sheetworker functions and converts the default object of attribute values into an {@link attributesProxy}. Also gets the details on how to handle all attributes from the master {@link cascades} object and.
|
|
* @param {Object} args
|
|
* @param {string[]} [args.props=baseGet] - Array of attribute names to get the value of. Defaults to {@link baseGet} if not passed.
|
|
* @param {repeatingSectionDetails} sectionDetails - Array of details about a section to get the IDs for and attributes that need to be gotten.
|
|
* @param {function(attributesProxy,sectionObj,expandedCascade):void} args.callback - The function to call after the attribute values have been gotten. An {@link attributesProxy} is passed to the callback along with a {@link sectionObj} and {@link expandedCascade}.
|
|
* @example
|
|
* //Get every K-scaffold linked attribute on the sheet
|
|
* k.getAllAttrs({
|
|
* callback:(attributes,sections,casc)=>{
|
|
* //Work with the attributes as you please.
|
|
* attributes.some_attribute = 'a value';
|
|
* attributes.set();//Apply our change
|
|
* }
|
|
* })
|
|
*/
|
|
const getAllAttrs = function({props=baseGet,sectionDetails=repeatingSectionDetails,callback}){
|
|
getSections(sectionDetails,(repeats,sections)=>{
|
|
getAttrs([...props,...repeats],(values)=>{
|
|
const attributes = createAttrProxy(values);
|
|
orderSections(attributes,sections);
|
|
const casc = expandCascade(cascades,sections,attributes);
|
|
callback(attributes,sections,casc);
|
|
})
|
|
});
|
|
};
|
|
kFuncs.getAllAttrs = getAllAttrs;
|
|
|
|
/**
|
|
* Alias for [getSectionIDs()](https://wiki.roll20.net/Sheet_Worker_Scripts#getSectionIDs.28section_name.2Ccallback.29) that allows you to iterate through several functions at once. Also assembles an array of repeating attributes to get.
|
|
* @param {object[]} sectionDetails - Array of details about a section to get the IDs for and attributes that need to be gotten.
|
|
* @param {string} sectionDetails.section - The full name of the repeating section including the `repeating_` prefix.
|
|
* @param {string[]} sectionDetails.fields - Array of field names that need to be gotten from the repeating section
|
|
* @param {function(string[],sectionObj)} callback - The function to call once all IDs have been gotten and the array of repating attributes to get has been assembled. The callback is passed the array of repating attributes to get and a {@link sectionObj}.
|
|
* @example
|
|
* // Get some section details
|
|
* const sectionDetails = {
|
|
* {section:'repeating_equipment',fields:['name','weight','cost']},
|
|
* {section:'repeating_weapon',fields:['name','attack','damage']}
|
|
* };
|
|
* k.getSections(sectionDetails,(attributeNames,sections)=>{
|
|
* console.log(attributeNames);// => Array containing all row specific attribute names
|
|
* console.log(sections);// => Object with arrays containing the row ids. Indexed by section name (e.g. repeating_eqiupment)
|
|
* })
|
|
*/
|
|
const getSections = function(sectionDetails,callback){
|
|
let queueClone = _.clone(sectionDetails);
|
|
const worker = (queue,repeatAttrs=[],sections={})=>{
|
|
let detail = queue.shift();
|
|
getSectionIDs(detail.section,(IDs)=>{
|
|
sections[detail.section] = IDs;
|
|
IDs.forEach((id)=>{
|
|
detail.fields.forEach((f)=>{
|
|
repeatAttrs.push(`${detail.section}_${id}_${f}`);
|
|
});
|
|
});
|
|
repeatAttrs.push(`_reporder_${detail.section}`);
|
|
if(queue.length){
|
|
worker(queue,repeatAttrs,sections);
|
|
}else{
|
|
callback(repeatAttrs,sections);
|
|
}
|
|
});
|
|
};
|
|
if(!queueClone[0]){
|
|
callback([],{});
|
|
}else{
|
|
worker(queueClone);
|
|
}
|
|
};
|
|
kFuncs.getSections = getSections;
|
|
|
|
// Sets the attributes while always calling with {silent:true}
|
|
// Can be awaited to get the values returned from _setAttrs
|
|
/**
|
|
* Alias for [setAttrs()](https://wiki.roll20.net/Sheet_Worker_Scripts#setAttrs.28values.2Coptions.2Ccallback.29) that sets silently by default.
|
|
* @param {object} obj - The object containting attributes to set
|
|
* @param {boolean} [vocal=false] - Whether to set silently (default value) or not.
|
|
* @param {function()} [callback] - The callback function to invoke after the setting has been completed. No arguments are passed to the callback function.
|
|
* @example
|
|
* //Set some attributes silently
|
|
* k.setAttrs({attribute_1:'new value'})
|
|
* //Set some attributes and triggers listeners
|
|
* k.setAttrs({attribute_1:'new value',true})
|
|
* //Set some attributes and call a callback function
|
|
* k.setAttrs({attribute_1:'new value'},null,()=>{
|
|
* //Do something after the attribute is set
|
|
* })
|
|
*/
|
|
const set = function(obj,vocal=false,callback){
|
|
setAttrs(obj,{silent:!vocal},callback);
|
|
};
|
|
kFuncs.setAttrs = set;
|
|
|
|
const generateCustomID = function(string){
|
|
if(!string.startsWith('-')){
|
|
string = `-${string}`;
|
|
}
|
|
rowID = generateRowID();
|
|
let re = new RegExp(`^.{${string.length}}`);
|
|
return `${string}${rowID.replace(re,'')}`;
|
|
};
|
|
|
|
|
|
/**
|
|
* Alias for generateRowID that adds the new id to the {@link sectionObj}. Also allows for creation of custom IDs that conform to the section ID requirements.
|
|
* @param {sectionObj} sections
|
|
* @param {string} [customText] - Custom text to start the ID with. This text should not be longer than the standard repeating section ID format.
|
|
* @returns {string} - The created ID
|
|
* @example
|
|
* k.getAllAttrs({
|
|
* callback:(attributes,sections,casc)=>{
|
|
* //Create a new row ID
|
|
* const rowID = k.generateRowID('repeating_equipment',sections);
|
|
* console.log(rowID);// => -p8rg908ug0suzz
|
|
* //Create a custom row ID
|
|
* const customID = k.generateRowID('repeating_equipment',sections,'custom');
|
|
* console.log(customID);// => -custom98uadj89kj
|
|
* }
|
|
* });
|
|
*/
|
|
const _generateRowID = function(section,sections,customText){
|
|
let rowID = customText ?
|
|
generateCustomID(customText) :
|
|
generateRowID();
|
|
section = section.match(/^repeating_[^_]+$/) ?
|
|
section :
|
|
`repeating_${section}`;
|
|
sections[section] = sections[section] || [];
|
|
sections[section].push(rowID);
|
|
return `${section}_${rowID}`;
|
|
};
|
|
kFuncs.generateRowID = _generateRowID;/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
|
|
/*jshint -W014,-W084,-W030,-W033*/
|
|
const listeners = {};
|
|
const baseGet = Object.entries(cascades).reduce((memo,[attrName,detailObj])=>{
|
|
if(!/repeating/.test(attrName) && detailObj.type !== 'action'){
|
|
memo.push(detailObj.name);
|
|
}
|
|
if(detailObj.listener){
|
|
listeners[detailObj.listener] = detailObj.listenerFunc;
|
|
}
|
|
return memo;
|
|
},[]);
|
|
kFuncs.baseGet = baseGet;
|
|
const registerEventHandlers = function(){
|
|
on('sheet:opened',updateSheet);
|
|
debug({funcKeys:Object.keys(funcs),funcs});
|
|
//Roll20 change and click listeners
|
|
Object.entries(listeners).forEach(([event,funcName])=>{
|
|
if(funcs[funcName]){
|
|
on(event,funcs[funcName]);
|
|
}else{
|
|
debug(`!!!Warning!!! no function named ${funcName} found. No listener created for ${event}`,true);
|
|
}
|
|
});
|
|
log(`kScaffold Loaded`);
|
|
};
|
|
setTimeout(registerEventHandlers,0);//Delay the execution of event registration to ensure all event properties are present.
|
|
|
|
const addItem = function(event){
|
|
let [,,section] = parseClickTrigger(event.triggerName);
|
|
section = section.replace(/add-/,'');
|
|
getAllAttrs({
|
|
callback:(attributes,sections,casc) => {
|
|
let row = _generateRowID(section,sections);
|
|
debug({row});
|
|
attributes[`${row}_name`] = '';
|
|
setActionCalls({attributes,sections});
|
|
const trigger = cascades[`fieldset_repeating_${section}`];
|
|
if(trigger && trigger.addFuncs){
|
|
trigger.addFuncs.forEach((funcName) => {
|
|
if(funcs[funcName]){
|
|
funcs[funcName]({attributes,sections,casc,trigger});
|
|
}
|
|
});
|
|
}
|
|
attributes.set({attributes,sections,casc});
|
|
}
|
|
});
|
|
};
|
|
funcs.addItem = addItem;
|
|
|
|
const editSection = function(event){
|
|
let [,,section] = parseClickTrigger(event.triggerName);
|
|
section = section.replace(/edit-/,'');
|
|
let target = `fieldset.repeating_${section} + .repcontainer`;
|
|
$20(target).toggleClass('ui-sortable');
|
|
$20(target).toggleClass('editmode');
|
|
};
|
|
registerFuncs({editSection});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","athletics_action","acrobatics_action","drive_action","sleight_of_hand_action","stealth_action","bureaucracy_action","computers_action","investigation_action","life_science_action","mechanics_action","physical_science_action","social_science_action","streetwise_action","insight_action","perception_action","survival_action","deception_action","intimidation_action","performance_action","persuasion_action","initiative_action","hit_dice_action","death_saves_action","repeating_action_$X_action","repeating_trait_$X_details_action","repeating_hack_$X_action"];const skillAbilityLookup = {"athletics":"strength","acrobatics":"dexterity","drive":"dexterity","sleight_of_hand":"dexterity","stealth":"dexterity","bureaucracy":"intelligence","computers":"intelligence","investigation":"intelligence","life_science":"intelligence","mechanics":"intelligence","physical_science":"intelligence","social_science":"intelligence","streetwise":"intelligence","insight":"wisdom","perception":"wisdom","survival":"wisdom","deception":"charisma","intimidation":"charisma","performance":"charisma","persuasion":"charisma"};const dropDowns = ["repeating_action_$X_attack_ability"];
|
|
k.version = 1.1;/**
|
|
*
|
|
* @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 update1x1 = function({trigger,attributes,sections,casc}){
|
|
k.debug('Updating sheet to 1.1',true);
|
|
sections.repeating_action.forEach((id)=>{
|
|
['attack_ability','save_ability','damage_ability_1','damage_ability_2']
|
|
.forEach((attr)=>{
|
|
attributes[`repeating_action_${id}_${attr}`] =
|
|
attributes[`repeating_action_${id}_${attr}`]
|
|
.replace(/@{|}|_mod/g,'');
|
|
});
|
|
});
|
|
sections.repeating_hack.forEach((id)=>{
|
|
['attack_ability','save_ability','damage_ability_1','damage_ability_2']
|
|
.forEach((attr)=>{
|
|
attributes[`repeating_action_${id}_${attr}`] =
|
|
attributes[`repeating_action_${id}_${attr}`]
|
|
.replace(/@{|}|_mod/g,'');
|
|
});
|
|
});
|
|
};
|
|
k.registerFuncs({'1.1':update1x1},{type:['updater']});const HE = (() => {
|
|
const esRE = (s) => s.replace(/(\\|\/|\[|\]|\(|\)|\{|\}|\?|\+|\*|\||\.|\^|\$)/g,'\\$1');
|
|
const e = (s) => `&${s};`;
|
|
const entities = {
|
|
'<' : e('lt'),
|
|
'>' : e('gt'),
|
|
"'" : e('#39'),
|
|
'@' : e('#64'),
|
|
'{' : e('#123'),
|
|
'|' : e('#124'),
|
|
'}' : e('#125'),
|
|
'[' : e('#91'),
|
|
']' : e('#93'),
|
|
'"' : e('quot')
|
|
};
|
|
const re = new RegExp(`(${Object.keys(entities).map(esRE).join('|')})`,'g');
|
|
return (s) => s.replace(re, (c) => (entities[c] || c) );
|
|
})();
|
|
|
|
//Calculation Utility functions
|
|
/**
|
|
* recursively parses a macro expression to find any attribute values. Also Parses roll queries to return their first option as the result to use for calculations.
|
|
* @param {string|number} macro - The macro text to parse for contained attributes
|
|
* @param {object} attributes - the Attributes object with all character attribute values
|
|
* @param {object} sections - Sections object with all repeating section id information.
|
|
* @returns {number}
|
|
*/
|
|
const parseMacro = (macro,attributes,sections) => {
|
|
const expandedMacro = expandCalls(`${macro}`,attributes,sections);
|
|
const parsedRolls = averageRolls(expandedMacro);
|
|
// const parsedQueries = expandedMacro.replace(/\?{[^}]+?}/g,(query)=>parseQueries(expandedMacro));
|
|
const textToEval = parsedRolls;
|
|
if(/^[\s\d\+\-\/\*%\^]+$/.test(textToEval)){
|
|
return eval(textToEval);
|
|
}
|
|
return 0;
|
|
};
|
|
|
|
/**
|
|
* Averages rolls contained in a string
|
|
* @param {string} macro - The rolls to expand
|
|
*/
|
|
const averageRolls = (macro) => {
|
|
let dieText = macro;
|
|
const dieRx = /(\d+)d(\d+)/;
|
|
const inlineRx = /\[\[([\s\d\+\-\/\*%\^]+)\]\]/;
|
|
while(dieRx.test(dieText)){
|
|
dieText = dieText
|
|
.replace(dieRx,(match,numDie,dieSize)=>{
|
|
return Math.floor((numDie * (dieSize / 2 + 0.5)));
|
|
})
|
|
.replace(inlineRx,'$1');
|
|
}
|
|
while(inlineRx.test(dieText)){
|
|
dieText = dieText.replace(inlineRx,'$1');
|
|
}
|
|
return dieText;
|
|
};
|
|
|
|
/**
|
|
* Recursively replaces attribute calls with their attribute values. Replaces invalid attribute calls with `0`.
|
|
* @param {string} macro - The macro text to parse for contained attributes
|
|
* @param {object} attributes - the Attributes object with all character attribute values
|
|
* @param {object} sections - Sections object with all repeating section id information.
|
|
* @returns {number}
|
|
*/
|
|
const expandCalls = (macro,attributes,sections) => {
|
|
const attributeReg = /@{(?:([^\|}]+)\|)?([^ \|}]+)(?:\|(max))?}/ig;
|
|
return macro.replace(attributeReg,(match,charName,attrCall,max)=>{
|
|
if(
|
|
charName &&
|
|
charName.toLowerCase() !== attributes.character_name
|
|
){
|
|
return '0';
|
|
}
|
|
const [section,rowID,attrName] = parseAttributeCall(`${attrCall}${max ? '_max' :''}`,sections);
|
|
if(
|
|
attrName && (
|
|
(section && rowID) ||
|
|
!section
|
|
)
|
|
){
|
|
const attrValue = attributes[`${section ? `${section}_${rowID}_` : ''}${attrName}`];
|
|
return isNaN(attrValue) &&
|
|
attributeReg.test(attrValue) ?
|
|
expandCalls(attrValue,attributes,sections) :
|
|
`${attrValue}`;
|
|
}
|
|
return match;
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Recursively parses out roll queries, using the first value as the value to ue for the roll query. If there is no option uses 0 for that roll Query.
|
|
* @param {query} macro - The query text to parse roll queries from
|
|
* @param {string} accumulator - The string that will accumulate values;
|
|
*/
|
|
// const newParseQueries = (query,,accumulator) => {
|
|
// if(macro.startsWith('?{')){
|
|
// macro = macro.slice(2);
|
|
// return newParseQueries(macro);
|
|
// }
|
|
// let queryIndex = macro.indexOf('?{');
|
|
// queryIndex = queryIndex === -1 ?
|
|
// macro.length :
|
|
// queryIndex;
|
|
// const queryString = macro.slice(queryIndex+2,macro.length);
|
|
// accumulator += macro.slice(0,queryIndex) + newParseQueries(queryString);
|
|
// };
|
|
|
|
// const parseQueries = (macro) => {
|
|
// const queryReg = /\?{[^\|]+?(?:\|([^\|}]*)[^}]*)?}/g;
|
|
// return macro.replace(queryReg,(match,val) => {
|
|
// const valSplit = val.split(',');
|
|
// val = val ?
|
|
// HE(valSplit[1] || valSplit[0]) :
|
|
// '0';
|
|
// val = val;
|
|
// return queryReg.test(val) ?
|
|
// parseQueries(val) :
|
|
// val;
|
|
// })
|
|
// .replace(/\[\[|\]\]/g,'')
|
|
// .replace(/\[.+?\]/g,'');
|
|
// };
|
|
|
|
const parseAttributeCall = (attrName,sections) => {
|
|
let [section,rowID,attrCall] = k.parseTriggerName(attrName);
|
|
rowID = (rowID || '').replace(/^\$(.+)/,(match,index)=>{
|
|
index = +index;
|
|
return index || index === 0 ?
|
|
sections[section][index] :
|
|
index;
|
|
});
|
|
return [section,rowID,attrCall]
|
|
};
|
|
|
|
/**
|
|
* Assembles the string for the master display controller attribute.
|
|
* @param {*} param0
|
|
* @returns {string}
|
|
*/
|
|
const controlDisplay = function({trigger,attributes,sections,casc}){
|
|
k.log('controlling display');
|
|
return ['character_type','sheet_view','advantage_state','import'].map((attrName) => {
|
|
return `${attrName}:${attributes[attrName]}`;
|
|
}).join(' | ');
|
|
};
|
|
k.registerFuncs({controlDisplay});
|
|
|
|
const abilityScoreCalc = function({trigger,attributes,sections,casc}){
|
|
const ability = trigger.name.replace(/base_/,'');
|
|
const mods = parseMacro(attributes[`${ability}_modded`],attributes,sections);
|
|
k.debug({message:'parsing Ability score',ability,mods,modded:attributes[`${ability}_modded`]});
|
|
return attributes.character_type === 'pc' ?
|
|
attributes[`base_${ability}`] + mods :
|
|
undefined;
|
|
};
|
|
k.registerFuncs({abilityScoreCalc});
|
|
|
|
const abilityModCalc = function({trigger,attributes,sections,casc}){
|
|
const ability = trigger.name.replace(/_mod/,'');
|
|
const mod = Math.floor((attributes[ability] - 10) / 2);
|
|
if(ability === 'dexterity' && attributes.character_type === 'npc'){
|
|
attributes.initiative = attributes.updates.hasOwnProperty('initiative') ?
|
|
attributes.initiative :
|
|
mod;
|
|
}
|
|
return mod;
|
|
};
|
|
k.registerFuncs({abilityModCalc});
|
|
|
|
const saveCalc = function({trigger,attributes,sections,casc}){
|
|
const ability = trigger.name.replace(/_save/,'');
|
|
const proficiency = parseMacro(attributes[`${trigger.name}_proficiency`],attributes,sections);
|
|
const mods = parseMacro(attributes[`${trigger.name}_modded`],attributes,sections);
|
|
k.debug({[`${trigger.name}_proficiency`]:proficiency,[`${trigger.name}_modded`]:mods});
|
|
return attributes.character_type === 'pc' ?
|
|
attributes[`${ability}_mod`] + proficiency + mods :
|
|
undefined;
|
|
};
|
|
k.registerFuncs({saveCalc});
|
|
|
|
const skillCalc = function({trigger,attributes,sections,casc}){
|
|
const ability = `${skillAbilityLookup[trigger.name]}_mod`;
|
|
const proficiency = parseMacro(attributes[`${trigger.name}_proficiency`],attributes,sections);
|
|
const mods = parseMacro(attributes[`${trigger.name}_modded`],attributes,sections);
|
|
return attributes.character_type === 'pc' ?
|
|
attributes[ability] + proficiency + mods :
|
|
undefined;
|
|
};
|
|
k.registerFuncs({skillCalc});
|
|
|
|
const passiveCalc = function({trigger,attributes,sections,casc}){
|
|
const skill = trigger.name.replace(/passive_/,'');
|
|
return attributes.character_type === 'pc' ?
|
|
10 + attributes[skill] + parseMacro(attributes[`passive_${skill}_modded`],attributes,sections) :
|
|
undefined;
|
|
};
|
|
k.registerFuncs({passiveCalc});
|
|
|
|
const initiativeCalc = function({trigger,attributes,sections,casc}){
|
|
return attributes.character_type !== 'pc' ?
|
|
undefined :
|
|
attributes.dexterity_mod + parseMacro(attributes.initiative_modded,attributes,sections);
|
|
};
|
|
k.registerFuncs({initiativeCalc});
|
|
|
|
const calcAC = function({trigger,attributes,sections,casc}){
|
|
return attributes.character_type === 'pc' ?
|
|
parseMacro(attributes[`ac_formula`],attributes,sections) :
|
|
undefined;
|
|
};
|
|
k.registerFuncs({calcAC});
|
|
|
|
const calcLevel = function({trigger,attributes,sections,casc}){
|
|
return (attributes.class_level.match(/\d+/g) || [])
|
|
.reduce((level,classLevel)=>level += k.value(classLevel) ,0);
|
|
};
|
|
k.registerFuncs({calcLevel});
|
|
|
|
const calcProficiency = function({trigger,attributes,sections,casc}){
|
|
return Math.max(2,2 + Math.floor((attributes.character_level-1)/4));
|
|
};
|
|
k.registerFuncs({calcProficiency});
|
|
|
|
/**
|
|
* Sets the initiative Macro to the proper value for NPC vs. PC
|
|
* @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 createInitiativeMacro = function({trigger,attributes,sections,casc}){
|
|
return `@{template_start} {{rollName=^{initiative}}} {{d20=[[@{advantage_state}+${attributes.character_type === 'pc' ? '@{dexterity_mod}@{initiative_modded}' : '@{initiative}'} &{tracker}]]}}`
|
|
};
|
|
k.registerFuncs({ createInitiativeMacro },{type:['new']});
|
|
|
|
/**
|
|
* Calculates the total bonus to display for the action
|
|
* @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 calcTotalBonus = function({trigger,attributes,sections,casc}){
|
|
const [section,rowID] = k.parseTriggerName(trigger.name);
|
|
const row = `${section}_${rowID}`;
|
|
if(attributes[`${row}_attack_enable_item`]){
|
|
const ability = attributes[`${row}_attack_ability`];
|
|
const abiMod = ability !== 'none' ? attributes[`${ability}_mod`] : 0;
|
|
const mod = abiMod + parseMacro(attributes[`${row}_attack_bonus`],attributes,sections) + parseMacro(attributes[`${row}_action_proficiency`],attributes,sections);
|
|
return mod >= 0 ? `+${mod}` : mod;
|
|
}
|
|
if(attributes[`${row}_save_enable_item`]){
|
|
const ability = attributes[`${row}_save_ability`];
|
|
const abiMod = ability !== 'none' ? attributes[`${ability}_mod`] : 0;
|
|
const dcBase = ability !== 'none' ? 8 : 0;
|
|
const mod = dcBase + abiMod + parseMacro(attributes[`${row}_dc_bonus`],attributes,sections) + parseMacro(attributes[`${row}_action_proficiency`],attributes,sections);
|
|
return `DC ${mod}`;
|
|
}
|
|
};
|
|
k.registerFuncs({calcTotalBonus});const modRegex = /([+\-=].+?)\s+([^;]+)(?:;|$)/g;
|
|
|
|
/**
|
|
* A function that processes changes to mods by removing a equipment or trait item.
|
|
* @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 removeMods = function({trigger,attributes,sections,casc}){
|
|
trigger.affects = trigger.affects || [];
|
|
k.debug({trigger,attributes:attributes.attributes});
|
|
const resets = Object
|
|
.entries(trigger.removedInfo)
|
|
.reduce((memo,[key,info])=>{
|
|
if(key.endsWith('_mods')){
|
|
modReplace(info,(value,target)=>{
|
|
trigger.affects.push(target);
|
|
memo[target] = [];
|
|
if(target === 'ac'){
|
|
memo['ac_formula'] = ['10 + @{dexterity_mod}'];
|
|
}
|
|
});
|
|
}else if(key.endsWith('linked_row')){
|
|
k.removeRepeatingRow(info,attributes,sections);
|
|
}
|
|
return memo;
|
|
},{});
|
|
k.debug({trigger,resets});
|
|
if(Object.keys(resets).length){
|
|
collateModEffects(trigger,attributes,resets);
|
|
}
|
|
};
|
|
k.registerFuncs({removeMods});
|
|
|
|
// Initial Functions
|
|
/**
|
|
* Applies effects of specific mod entries to attributes
|
|
* @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 applyMods = function({trigger,attributes,sections,casc}){
|
|
//Add the mod's targets to its affects array
|
|
k.debug({trigger});
|
|
trigger.affects = [attributes[trigger.name],trigger.previousValue]
|
|
.reduce((memo,string) => {
|
|
const [affects] = modAffects(string,memo);
|
|
return affects;
|
|
},trigger.affects);
|
|
//collates all the mod effects
|
|
collateModEffects(trigger,attributes);
|
|
};
|
|
k.registerFuncs({applyMods});
|
|
|
|
const collateModEffects = function(trigger,attributes,resets = {}){
|
|
const attrCollection = Object.entries({...attributes.attributes,...attributes.updates})
|
|
.reduce( (memo,[attrName,mod]) => {
|
|
if(attrName.endsWith('_mods')){
|
|
mod.replace(modRegex,(match,value,target) => {
|
|
target = target
|
|
.toLowerCase()
|
|
.trim()
|
|
.replace(/\s+/g,'_');
|
|
k.debug({value,target});
|
|
if(value.startsWith('=') && target === 'ac'){
|
|
target = 'ac_formula';
|
|
memo[target] = [value.replace(/^=/,'')];
|
|
}else if(!value.startsWith('=')){
|
|
memo[target] = memo[target] || [];
|
|
memo[target].push(value.replace(/^\s*[=]/,''));
|
|
}
|
|
});
|
|
}
|
|
return memo;
|
|
},resets);
|
|
k.debug({attrCollection});
|
|
|
|
//Applies changes to the mod effects to the sheet
|
|
Object.entries(attrCollection).forEach(([attrName,arr]) => {
|
|
attrName = attrName.toLowerCase().replace(/\s+/g,'_');
|
|
const modName = attrName === 'ac_formula' ?
|
|
attrName :
|
|
`${attrName}_modded`;
|
|
k.debug({modName,arr,joinedArray:arr.join(' + '),[`initial attributes[${modName}]`]:attributes[modName]});
|
|
k.debug({'joined array':arr.join(' + ')});
|
|
attributes[modName] = arr.join(' + ');
|
|
k.debug({[`attributes[${modName}]`]:attributes[modName]});
|
|
trigger.affects = trigger.affects || [];
|
|
if(!trigger.affects.includes(attrName)){
|
|
trigger.affects.push(attrName);
|
|
}
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Resets the import and import cancel checkboxes.
|
|
* @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 cancelImport = function({trigger,attributes,sections,casc}){
|
|
attributes.import = 0;
|
|
attributes.import_cancel = 0;
|
|
};
|
|
k.registerFuncs({cancelImport});
|
|
|
|
//TriggeredFuncs
|
|
/**
|
|
* Function to parse all mods fields on the sheet and update the affects arrays of all attributes on the sheet. Also dynamically adds the targets of a mods field to the affected array of a trigger if that trigger is part of the mods field.
|
|
* @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 determineMods = function({trigger,attributes,sections,casc}){
|
|
Object
|
|
.entries(attributes.attributes)
|
|
.forEach(([attrName,val]) => {
|
|
if(attrName.endsWith('_mods')){
|
|
modCasc(val,sections,casc);
|
|
}
|
|
});
|
|
};
|
|
k.registerFuncs({determineMods},{type:['all']});
|
|
|
|
/**
|
|
* Updates the cascade object with additional affects based on the active mods
|
|
* @param {string} string
|
|
* @param {object[]} sections
|
|
* @param {object} casc
|
|
*/
|
|
const modCasc = function(string,sections,casc){
|
|
modReplace(string,(value,target)=>{
|
|
k.debug({value,target});
|
|
const calls = modAttributeCalls(value);
|
|
k.debug({calls});
|
|
calls.forEach((attr)=>{
|
|
if(casc[`attr_${attr}`] && !casc[`attr_${attr}`].affects.includes(target)){
|
|
casc[`attr_${attr}`].affects.push(target);
|
|
k.debug({[`casc[attr_${attr}]`]:casc[`attr_${attr}`]});
|
|
}
|
|
});
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Adds the effects of a specific mod to the affects array of a trigger.
|
|
* @param {string} string - The string to parse
|
|
* @param {Object} trigger - The trigger object to change the affects of.
|
|
* @returns {array} affects array
|
|
*/
|
|
const modAffects = function(string,trigger){
|
|
k.debug({modString:string,trigger});
|
|
trigger.affects = trigger.affects || [];
|
|
const affects = [...trigger.affects];
|
|
const newAffects = [];
|
|
modReplace(string,(value,target)=>{
|
|
k.debug({value,target});
|
|
if(!trigger.affects.includes(target) &&
|
|
modAttributeCalls(value).includes(trigger.name)
|
|
){
|
|
trigger.affects.push(target);
|
|
newAffects.push(target);
|
|
}
|
|
});
|
|
k.debug('Returning from modAffects:')
|
|
k.debug({affects,newAffects});
|
|
return [affects,newAffects];
|
|
};
|
|
|
|
/**
|
|
* Determines if an attribute is called in a mod declaration
|
|
* @param {string} value - The string value to check
|
|
* @returns {array}
|
|
*/
|
|
const modAttributeCalls = function(value){
|
|
return Array.from(value.matchAll(/@{(.+?)}/g))
|
|
.reduce((memo,matchDetails)=>{
|
|
matchDetails.shift();
|
|
memo.push(...matchDetails);
|
|
return memo;
|
|
},[]);
|
|
};
|
|
|
|
/**
|
|
* Does a string replace on the passed string using the `modRegex` variable and calls the callback function on the results.
|
|
* @param {string} string - The string to replace content in
|
|
* @param {function} callback - The function to call as a callback to the replace method. Passes the parsed value of the mod text and the target of the mod text to the callback function.
|
|
*/
|
|
const modReplace = function(string,callback){
|
|
string
|
|
.toLowerCase()
|
|
.replace(modRegex,
|
|
(match,value,target) => {
|
|
target = target.toLowerCase();
|
|
callback(value,target);
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Looks through select attributes that control what ability mods control a given attribute and adds those attributes to the trigger's `affects` array if they are affected by the trigger. Mutates the affects array in place.
|
|
* @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
|
|
*/
|
|
const affectSelected = function({trigger,attributes,sections,casc}){
|
|
trigger.affects = dropDowns.reduce((arr,drop)=>{
|
|
const [section,,attr] = k.parseTriggerName(drop);
|
|
if(section){
|
|
sections[section].forEach( rowID =>{
|
|
if(attributes[`${section}_${rowID}_${attr}`] === trigger.name){
|
|
arr.push(`${section}_${rowID}_${attr}`);
|
|
}
|
|
});
|
|
}
|
|
return arr;
|
|
},trigger.affects)
|
|
};
|
|
k.registerFuncs({affectSelected});
|
|
|
|
/**
|
|
* Creates a level appropriate hack item
|
|
* @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 addHack = function({trigger,attributes,sections,casc}){
|
|
const row = k.generateRowID('repeating_hack',sections);
|
|
attributes[`${row}_level`] = trigger.name.replace(/add-(\d+).+/,'$1');
|
|
};
|
|
k.registerFuncs({addHack});/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
|
|
/*jshint -W014,-W084,-W030,-W033*/
|
|
//Initiate a compendium lookup
|
|
const specialCategories = {
|
|
Genetic: '"Genetic Enhancements"'
|
|
};
|
|
//These categories are the part after the data- in a bestiary entry. E.g. a monster has a data-Armors JSON, but the actual compendium category is "Armor". These are converted to the proper compendium category via the categoryLookup Proxy
|
|
const itemCategories = ['Equipment','Feats','Genetic','Genetic Enhancements','Genomes','Hacks','Traits','Upgrades','Vehicles'];
|
|
|
|
//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;
|
|
if (statblock[`data-${type}`]){
|
|
let searchNames = statblock[`data-${type}`].map((obj) => obj.name || obj.display_name || '')
|
|
.join('|')
|
|
.replace(/\|{2,}/g,'')
|
|
.replace(/\|$/,'');
|
|
if(searchNames.length > 0){
|
|
let searchString = `Category:${searchType} display_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((category) => {
|
|
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.display_name.toLowerCase() !== feature.name.toLowerCase())){
|
|
m.nested = true;
|
|
m.data[`data-${feature.category}`] = m.data[`data-${feature.category}`] || [];
|
|
m.data[`data-${feature.category}`].push({display_name:feature.name});
|
|
}
|
|
});
|
|
}catch(err){
|
|
k.debug({[`Invalid data-feature on ${obj.display_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.display_name || itemObj.name;
|
|
let compendiumObj;
|
|
expansionIDs.find((id) => {
|
|
compendiumObj = dataArr.find((dataObj) => k.value(dataObj.data.Expansion) === id &&
|
|
dataObj.data.display_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.display_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;
|
|
};/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
|
|
/*jshint -W014,-W084,-W030,-W033*/
|
|
const handleCompendiumDrop = function({attributes,sections,casc}){
|
|
let data = parseDropData(attributes.drop_data);
|
|
if(!data) return;
|
|
k.debug({data});
|
|
|
|
clearDropAttributes();
|
|
compendiumLookup({
|
|
origBlock:data,
|
|
attributes,sections,casc,
|
|
callback: async (lookupObj)=>{
|
|
|
|
if(data.Category === 'NPCs' || data.Category === 'Vehicles'){
|
|
clearSheet(attributes,sections,casc);
|
|
attributes.character_type = 'npc';
|
|
attributes.sheet_view = 'in-play';
|
|
attributes.queue.push('character_type','character_name','sheet_view');
|
|
attributes.whisper_state = '/w gm ';
|
|
attributes.hp = data['data-display_hp'];
|
|
}
|
|
k.debug({parsedData:lookupObj});
|
|
const sectionsToQuery = [];
|
|
processDropData({data:lookupObj,attributes,sections,casc,sectionsToQuery});
|
|
await querySections(attributes,sectionsToQuery,sections,casc);
|
|
const protoQueue = Object.keys(attributes.updates)
|
|
.flatMap( key => {
|
|
const cascRef = key.replace(/(repeating_[^_]+)_[^_]+_(.+)/,'$1_\$X_$2');
|
|
casc[`attr_${cascRef}`] = casc[`attr_${cascRef}`] || k.cascades[`attr_${cascRef}`];
|
|
return k.cascades[`attr_${cascRef}`] ?
|
|
casc[`attr_${cascRef}`].affects
|
|
: [];
|
|
});
|
|
k.setActionCalls({attributes,sections});
|
|
attributes.queue.push(...[...new Set(protoQueue)]);
|
|
determineMods({attributes,sections,casc});
|
|
k.debug('Drop processing complete');
|
|
attributes.set({attributes,sections,casc});
|
|
}
|
|
});
|
|
};
|
|
k.registerFuncs({handleCompendiumDrop});
|
|
|
|
const querySections = (attributes,sectionsToQuery,sections,casc) => {
|
|
const modWorker = async (name,newMods,modQueue)=>{
|
|
const mod = modQueue.shift();
|
|
const translation = getTranslationByKey('mod drop options')
|
|
.replace(/\{\{1\}\}/,name);
|
|
const prompt = `${translation}|`;
|
|
const options = mod
|
|
.trim()
|
|
.split(/\s+or\s+/i);
|
|
const query = `${prompt}${options.join('|')}`;
|
|
const result = await k.extractQueryResult(query);
|
|
newMods.push(result);
|
|
if(modQueue.length){
|
|
return modWorker(name,newMods,modQueue);
|
|
}else{
|
|
return k.pseudoQuery();
|
|
}
|
|
};
|
|
const sectionWorker = async (queue)=>{
|
|
const section = queue.shift();
|
|
const mods = attributes[`${section}_mods`]
|
|
.split(/\s*;\s*/);
|
|
const newMods = [];
|
|
const name = attributes[`${section}_name`];
|
|
const queryMods = mods.reduce((memo,mod) => {
|
|
if(/\s+or\s+/i.test(mod)){
|
|
memo.push(mod);
|
|
}else{
|
|
newMods.push(mod);
|
|
}
|
|
return memo;
|
|
},[]);
|
|
await modWorker(name,newMods,queryMods);
|
|
if(queue.length){
|
|
return sectionWorker(queue);
|
|
}else{
|
|
attributes[`${section}_mods`] = newMods.join(';');
|
|
const trigger = casc[`attr_${section}_mods`];
|
|
applyMods({trigger,attributes,sections,casc});
|
|
return k.pseudoQuery();
|
|
}
|
|
};
|
|
return sectionsToQuery.length ?
|
|
sectionWorker([...sectionsToQuery]) :
|
|
k.pseudoQuery();
|
|
};
|
|
// Pseudo code for querySections
|
|
|
|
const parseDropData = function(drop_data){
|
|
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;
|
|
},{});
|
|
if(data.Category !== 'NPCs' && data.Category !== 'Genomes'){
|
|
let category = data.Category.replace(/\s.+/,'');
|
|
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});
|
|
});
|
|
}
|
|
}
|
|
return data;
|
|
}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.updates[attr] = casc[`attr_${attr}`].hasOwnProperty('defaultValue') && casc[`attr_${attr}`].defaultValue !== 0 ?
|
|
casc[`attr_${attr}`].defaultValue :
|
|
'';
|
|
}
|
|
});
|
|
};
|
|
|
|
const clearDropAttributes = function(){
|
|
k.setAttrs({drop_name:'',drop_data:''});
|
|
};
|
|
|
|
const processDropData = function({data, attributes, sections, casc,sectionsToQuery,section=''}){
|
|
const repeatProcessors = {
|
|
Hacks:dropHack,
|
|
Actions:dropHack,
|
|
Traits:dropMod,
|
|
Feats:dropMod,
|
|
Equipment:dropMod,
|
|
'Genetic Enhancements':dropMod,
|
|
'Genetic':dropMod,
|
|
Upgrades:dropMod
|
|
};
|
|
section = section ? `${section}_` : '';
|
|
const sizeLookup = {
|
|
large:140,
|
|
huge:210,
|
|
gargantuan:280
|
|
};
|
|
if(data.Category === 'NPCs'){
|
|
const tokenSize = sizeLookup[data['data-cs-size'].toLowerCase()] || 70;
|
|
const tokenObj = {
|
|
width:tokenSize,
|
|
height:tokenSize,
|
|
};
|
|
setDefaultToken(tokenObj);
|
|
attributes.character_type = 'npc';
|
|
}
|
|
const worker = (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-'))){
|
|
attributes[`${section}${setKey}`] = val;
|
|
}else if(Array.isArray(val) && key.startsWith('data-')){
|
|
let lookupKey = key.replace(/data-(?:cs(?:list)?-)?/,'');
|
|
k.debug({lookupKey});
|
|
if(repeatProcessors[lookupKey]){
|
|
repeatProcessors[lookupKey](lookupKey,val,attributes,sections,casc,sectionsToQuery);
|
|
}else if(key.startsWith('data-cslist-')){
|
|
attributes[`${section}${setKey}`] = val.map((o)=>o.name).join(', ');
|
|
}else if(key === 'data-content'){
|
|
if(section.startsWith('repeating_trait')){
|
|
debugger;
|
|
}
|
|
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+$/,'');
|
|
}else if(Array.isArray(val)){
|
|
val.forEach(v=>{
|
|
queue.push(...Object.entries(v));
|
|
})
|
|
}
|
|
}
|
|
}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));
|
|
};
|
|
|
|
const sectionLookup = {
|
|
Hacks:'hack',
|
|
Traits:'trait',
|
|
Feats:'trait',
|
|
Genomes:'trait',
|
|
Equipment:'equipment',
|
|
'Genetic Enhancements':'equipment',
|
|
'Genetic':'equipment',
|
|
Upgrades:'equipment',
|
|
Actions:'action'
|
|
};
|
|
|
|
/**
|
|
* Drops a Hack or action repeating item
|
|
* @param {string} lookupKey - The lookupKey that triggered the drop
|
|
* @param {object} arr The drop data for this item
|
|
* @param {object} attributes The attributes object from the K-Scaffold
|
|
* @param {object} sections The sections object from the K-Scaffold
|
|
* @param {object} casc The expanded cascade object from the K-Scaffold
|
|
*/
|
|
const dropHack = function(lookupKey,arr,attributes,sections,casc,sectionsToQuery){
|
|
if(!Array.isArray(arr)){
|
|
k.debug({'Invalid section details passed. Exiting. Object passed was:':arr},true);
|
|
return;
|
|
}
|
|
return repeatWorker(lookupKey,arr,sections,casc,(itemObj,section)=>{
|
|
k.debug({section,itemObj});
|
|
if(itemObj['data-cs-attack_ability'] || itemObj['data-cs-attack_bonus']){
|
|
itemObj['data-cs-attack_enable_item'] = 1;
|
|
}
|
|
if(itemObj['data-cs-save_ability'] || itemObj['data-cs-save_type'] || itemObj['data-cs-dc_bonus']){
|
|
itemObj['data-cs-save_enable_item'] = `${lookupKey === 'Actions' ? `{{save_type=^{@{save_type}}}} ` : ''}@{save_macro}`;
|
|
}
|
|
[1,2].forEach(n => {
|
|
if(itemObj[`data-cs-damage_${n}`]){
|
|
itemObj[`data-cs-damage_${n}_enable_item`] = `{{damage_type_${n}=@{damage_type_${n}}}} @{damage_${n}_macro}`;
|
|
}
|
|
});
|
|
if(itemObj.linked_section){
|
|
attributes[`${itemObj.linked_section}_linked_row`] = section;
|
|
}
|
|
processDropData({data:itemObj,attributes,sections,casc,sectionsToQuery,section});
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Drops a Trait, Genome, feat, equipment, or upgrade repeating item. Essentially anything that can have a mods field
|
|
* @param {string} lookupKey - The lookupKey that triggered the drop
|
|
* @param {object} arr The drop data for this item
|
|
* @param {object} attributes The attributes object from the K-Scaffold
|
|
* @param {object} sections The sections object from the K-Scaffold
|
|
* @param {object} casc The expanded cascade object from the K-Scaffold
|
|
*/
|
|
const dropMod = function(lookupKey,arr,attributes,sections,casc,sectionsToQuery){
|
|
if(!Array.isArray(arr)){
|
|
k.debug({'Invalid section details passed. Exiting. Object passed was:':arr},true);
|
|
return;
|
|
}
|
|
return repeatWorker(lookupKey,arr,sections,casc,(itemObj,section)=>{
|
|
|
|
//Handles parsing of mod options (e.g. a feat that grants +1 Strength or +1 Constitution)
|
|
if(itemObj['armor-dmgresist']){
|
|
itemObj['data-cs-damage_reduction'] = itemObj['armor-dmgresist'];
|
|
}
|
|
if(/equipment|upgrade/i.test(itemObj.Category)){
|
|
itemObj['data-cs-quantity'] = 1;
|
|
}
|
|
if(itemObj['data-cs-mods']){
|
|
itemObj['data-cs-mods'] = itemObj['data-cs-mods']
|
|
.replace(/(?:;|^)\s*([^;]+?(expertise|proficiency(?:\/expertise)?))/g,(match,mod,profType)=>{
|
|
const profTarget = mod
|
|
.replace(/\s+/,'_')
|
|
.replace(/(?:proficiency\/)?expertise/,'proficiency')
|
|
.toLowerCase();
|
|
if(
|
|
profType === 'proficiency' &&
|
|
(
|
|
attributes[profTarget] === 0 ||
|
|
attributes[profTarget] === ''
|
|
)
|
|
){
|
|
attributes[profTarget] = '[[@{proficiency}]]';
|
|
}else if(/expertise/.test(profType)){
|
|
attributes[profTarget] = '[[2*@{proficiency}]]';
|
|
}
|
|
return '';
|
|
})
|
|
.replace(/(?:;|^)\s*sense\s+([^;]+)(?:\s*;\s*|$)/g,(match,sense) => {
|
|
sense = sense
|
|
.trim()
|
|
.replace(/\s+/,'_')
|
|
.toLowerCase();
|
|
k.debug({sense});
|
|
attributes[sense] = 1;
|
|
return '';
|
|
})
|
|
.replace(/(?:;|^)\s*([+\-]\d+)\s+speed/g,(match,spd)=>{
|
|
spd = +spd;
|
|
attributes.speed += spd;
|
|
return '';
|
|
})
|
|
.replace(/(?:;|^)\s*([^;]+)\s+resistance/,(match,resistance) => {
|
|
attributes.resistances = attributes.resistances ?
|
|
`${attributes.resistances}, ${resistance}` :
|
|
resistance;
|
|
return '';
|
|
});
|
|
if(/ or /i.test(itemObj['data-cs-mods'])){
|
|
sectionsToQuery.push(section);
|
|
}
|
|
}
|
|
//Prepares the action data to be dropped as a repeating action on the sheet.
|
|
const actionProps = ['data-cs-damage_1','data-cs-attack_ability','data-cs-save_ability','data-cs-save_type','data-cs-dc_bonus'];
|
|
if(actionProps.some((prop)=>itemObj[prop])){
|
|
actionDropProps = [...actionProps,'data-cs-range','data-cs-properties','data-cs-damage_type_1','data-content'];
|
|
itemObj['data-Actions'] = itemObj['data-Actions'] || [];
|
|
const actionObj = actionDropProps.reduce((memo,prop)=>{
|
|
if(itemObj[prop]){
|
|
memo[prop] = itemObj[prop];
|
|
if(prop !== 'data-content'){
|
|
delete itemObj[prop];
|
|
}
|
|
}
|
|
return memo;
|
|
},{'data-cs-name':itemObj['data-cs-name']});
|
|
|
|
if(actionObj['data-cs-attack_ability']){
|
|
actionObj['data-cs-attack_ability'] = actionObj['data-cs-attack_ability'].replace(/@{|}|_mod/g,'');
|
|
}else if(itemObj['equipment-type'] && /ranged weapon/i.test(itemObj['equipment-type'])){
|
|
actionObj['data-cs-attack_ability'] = 'dexterity';
|
|
}else if(itemObj['equipment-type'] && /melee weapon/i.test(itemObj['equipment-type'])){
|
|
actionObj['data-cs-attack_ability'] = 'strength';
|
|
}
|
|
actionObj['data-cs-action_proficiency'] = '@{proficiency}';
|
|
actionObj.linked_section = section;
|
|
itemObj['data-Actions'].push(actionObj);
|
|
k.debug({Actions:itemObj['data-Actions']});
|
|
}
|
|
processDropData({data:itemObj,attributes,sections,casc,sectionsToQuery,section});
|
|
if(itemObj['data-cs-mods'] && !/\s+or\s+/.test(itemObj['data-cs-mods'])){
|
|
const trigger = casc[`attr_${section}_mods`];
|
|
k.debug({trigger});
|
|
applyMods({trigger,attributes,sections,casc});
|
|
}
|
|
});
|
|
};
|
|
|
|
/**
|
|
* 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]});
|
|
}
|
|
});
|
|
};
|
|
|
|
/**
|
|
* 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 = function(lookupKey,arr,sections,casc,callback){
|
|
const type = sectionLookup[lookupKey];
|
|
const worker = (queue)=>{
|
|
const itemObj = queue.shift();
|
|
const section = k.generateRowID(type,sections);
|
|
itemObj['data-cs-expand_item'] = 0;
|
|
addRowToCasc(section,casc);
|
|
callback(itemObj,section);
|
|
if(queue.length){
|
|
return worker(queue);
|
|
}else{
|
|
return true;
|
|
}
|
|
};
|
|
return worker([...arr]);
|
|
}/**
|
|
* If the import process has been confirmed, starts the statblock import process.
|
|
* @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 importClicked = function({trigger,attributes,sections,casc}){
|
|
//If the import textarea is empty, the import button can't progress beyond `import`
|
|
if(!attributes.importer.trim()){
|
|
attributes.import = 'import';
|
|
return;
|
|
}
|
|
//If the import has not been confirmed, abort and let the
|
|
if(trigger.previousValue !== 'import-process' && attributes.import !== 0){
|
|
return;
|
|
}
|
|
clearSheet(attributes,sections);
|
|
parseStatblock({trigger,attributes,sections,casc});
|
|
};
|
|
k.registerFuncs({importClicked});
|
|
|
|
/**
|
|
* Parses the statblock and calls out to utility functions to handle specific areas of the statblock
|
|
* @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 parseStatblock = function({trigger,attributes,sections,casc}){
|
|
const statblock = attributes.importer;
|
|
let parser = headerParser,
|
|
section = 'header',
|
|
lines = statblock
|
|
.replace(/\s*\n/g,'\n')
|
|
.replace(/[\-–—―−]/g,'-')
|
|
.split(/\n+/);
|
|
const Parsers = {//regex as strings for matching against each line to determine if we continue with the current recursive parse, or move onto a new section
|
|
'^\\s*str\\s+dex\\s+con\\s+int\\s+wis\\s+cha':abilityScoreParser,
|
|
'^\\s*(?:saves|skills|senses|languages|challenge|damage resistance)\\s+':detailParser,
|
|
'^\\s*hacking\\.\\s+':hackParser,
|
|
'^\\s*traits$':traitParser,
|
|
'^\\s*actions\\s*$':actionParser
|
|
},
|
|
setParser = (lines) => {//Tests the line and changes the parser if necessary
|
|
return !!Object.keys(Parsers).find( (regexp) => {
|
|
if(new RegExp(regexp,"i").test(lines[0])){
|
|
section = regexp;
|
|
parser = Parsers[regexp];
|
|
if(/actions|^\s*str\s+dex\s+con\s+int\s+wis\s+cha/i.test(lines[0])){//if the section is one of these, then jump to the next line (shift it out of the array)
|
|
lines.shift();
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
};
|
|
attributes.character_name = lines.shift();
|
|
trigger.affects.push(...casc.attr_character_name.affects);
|
|
while(lines.length){//while there are lines
|
|
setParser(lines);//check the line and see if the parser needs to be changed
|
|
lines = parser(lines,attributes,sections,casc);//call the parser in question, and modify attributes and lines to be what the parser returns
|
|
};
|
|
};
|
|
|
|
/**
|
|
* Process the simple regex driven statblock parsing based on the instructions passed to it in the `regexs` object from the various parser functions.
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {string} currLine - The current line to parse
|
|
* @param {object} regexs - Object with regexs as keys, and arrays of attribute names to apply the matching text to.
|
|
*/
|
|
const processRegex = function(attributes,currLine,regexs){
|
|
_.keys(regexs).find((r)=>{
|
|
if(new RegExp(r,'i').test(currLine)){
|
|
let objMatch = currLine.match(new RegExp(r,'i'));
|
|
_.each(_.range(regexs[r].length),(l)=>{
|
|
_.each(regexs[r][l],(o)=>{
|
|
attributes[o]=objMatch[l + 1]||'';
|
|
});
|
|
});
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @param {array} lines - Array of line content
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
* @returns {array} lines - Modified array of the lines to process
|
|
*/
|
|
const headerParser = function(lines,attributes,sections,casc){
|
|
const regexs = {//regexs as strings for matching against lines. the properties are arrays of what attributes (in a sub array) receive the value from each matching group
|
|
'^\\s*(medium|tiny|large|huge)\\s+(.+?)(?:\\s+\\(\\s*(.+?)\\s*\\)|$)':[['size'],['genome'],['modification']],//size and type,
|
|
'^\\s*armor\\s+class\\s+(\\d+)':[['ac']],
|
|
'^\\s*damage\\s+reduction\\s+(\\d+)':[['damage_reduction']],
|
|
'^\\s*hit\\s+points\\s+(\\d+)\\s*\\((.+?)\\)':[['hp','hp_max'],['hit_dice']],
|
|
'^\\s*speed\\s+(.+)':[['speed']]
|
|
};
|
|
processRegex(attributes,lines.shift(),regexs);
|
|
return lines;
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @param {array} lines - Array of line content
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
* @returns {array} lines - Modified array of the lines to process
|
|
*/
|
|
const abilityScoreParser = function(lines,attributes,sections,casc){
|
|
const regexs = {//regexs as strings for matching against lines. the properties are arrays of what attributes (in a sub array) receive the value from each matching group
|
|
'^\\s*(\\d+)\\s*\\(\\+?(\\-?\\d+)\\)\\s*(\\d+)\\s*\\(\\+?(\\-?\\d+)\\)\\s*(\\d+)\\s*\\(\\+?(\\-?\\d+)\\)\\s*(\\d+)\\s*\\(\\+?(\\-?\\d+)\\)\\s*(\\d+)\\s*\\(\\+?(\\-?\\d+)\\)\\s*(\\d+)\\s*\\(\\+?(\\-?\\d+)\\)':[['strength'],['strength_mod'],['dexterity'],['dexterity_mod'],['constitution'],['constitution_mod'],['intelligence'],['intelligence_mod'],['wisdom'],['wisdom_mod'],['charisma'],['charisma_mod']]
|
|
};
|
|
processRegex(attributes,lines.shift(),regexs);
|
|
return lines;
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @param {array} lines - Array of line content
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
* @returns {array} lines - Modified array of the lines to process
|
|
*/
|
|
const detailParser = function(lines,attributes,sections,casc){
|
|
const regexs = {//regexs as strings for matching against lines. the properties are arrays of what attributes (in a sub array) receive the value from each matching group
|
|
'^\\s*senses\\s+passive perception (\\d+)(?:,\\s*(.+?))?$':[['passive_perception'],['senses']],
|
|
'^\\s*damage\\s+resistance\s+(.+)':[['damage_resistance']],
|
|
'^\\s*languages\\s+(.+)':[['languages']],
|
|
'^\\s*challenge\\s+([\\d\\/]+)\\s*\\(([\\d,]+)\\s*xp\\)':[['challenge'],['experience_points']]
|
|
};
|
|
let line = assembleDetailLine(lines);
|
|
if(/^\s*skills\s+/i.test(line)){
|
|
parseSkills(attributes,line);
|
|
}else if(/^\s*senses\s+/i.test(line)){
|
|
parseSenses(attributes,line);
|
|
}else{
|
|
processRegex(attributes,line,regexs);
|
|
}
|
|
if(/^\s*challenge/i.test(line) && !/^\s*(hacking\.|actions)/i.test(lines[0])){
|
|
lines.unshift('trait');
|
|
}
|
|
return lines;
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @param {*} lines
|
|
* @param {*} line
|
|
* @returns
|
|
*/
|
|
const assembleDetailLine = function(lines,line){
|
|
line = line ? `${line} ${lines.shift()}` : lines.shift();
|
|
return /^\s*(?:saves|skills|senses|languages|challenge|damage resistance|hacking|actions)/i.test(lines[0]) ? line : assembleDetailLine(lines,line);
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @param {array} line - A specific line to parse
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const parseSkills = function(attributes,line){
|
|
line.replace(/(?:,\s*|skills\s+)(.+?)\s+\+?(\-?\d+)/ig,(match,skill,bonus)=>{
|
|
attributes[skill.replace(/\s+/,'_').toLowerCase()]=bonus;
|
|
});
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @param {array} line - A specific line to parse
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const parseSenses = function(attributes,line){
|
|
line.replace(/senses\s*(?:(.+?),\s*)?passive \s*perception\s*(\d+)(?:,\s*(.+?))?$/i,(match,senses,pp='',senses2)=>{
|
|
attributes.passive_perception = pp;
|
|
attributes.senses = [senses,senses2].filter(a=>a).join(', ');
|
|
});
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @param {array} lines - Array of line content
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
* @returns {array} lines - Modified array of the lines to process
|
|
*/
|
|
const hackParser = function(lines,attributes,sections,casc){
|
|
let line = assembleHackerDetails(lines);
|
|
line.replace(/.+?(\d+)(?:st|th|rd).+?ability is (strength|dexterity|constitution|intelligence|wisdom|charisma).+?DC\s*(\d+).+?(\-?\d+) to hit/,(match,level,ability,dc,attack)=>{
|
|
attributes.hacker_level = level;
|
|
attributes.hacking_ability = ability;
|
|
attributes.hack_dc = dc;
|
|
attributes.hack_attack = attack;
|
|
});
|
|
processHacks(lines,attributes,sections,casc);
|
|
if(/.+\./.test(lines[0])){
|
|
lines.unshift('traits')
|
|
}
|
|
return lines;
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @param {array} lines - Array of line content
|
|
* @returns {string}
|
|
*/
|
|
const assembleHackerDetails = function(lines){
|
|
let line = lines.shift();
|
|
while(!/:/.test(line) && lines.length){
|
|
line = `${line} ${lines.shift()}`;
|
|
}
|
|
return line.toLowerCase();
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @param {array} lines - Array of line content
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const processHacks = function(lines,attributes,sections,casc){
|
|
while(lines.length && !/.+\.|actions/i.test(lines[0])){
|
|
let line = assembleHackLevel(lines);
|
|
console.log({line});
|
|
line.replace(/(\d+)(st|nd|rd|th)\s+level\s*\((\d+)\s+slots?\):(.+)/,(match,level,ordinal,slots,hacks)=>{
|
|
k.debug({level,ordinal,slots,hacks});
|
|
attributes[`${level}${ordinal}_level_slots`] = slots;
|
|
attributes[`${level}${ordinal}_level_slots_max`] = slots;
|
|
hacks = hacks.trim().split(/\s*,\s*/);
|
|
hacks.forEach((hack)=>{
|
|
importHack(attributes,sections,hack,level);
|
|
});
|
|
});
|
|
}
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @param {array} lines - Array of line content
|
|
* @returns {string}
|
|
*/
|
|
const assembleHackLevel = function(lines){
|
|
let line = lines.shift();
|
|
while(lines.length && !/.+(?:\.|:)|actions/i.test(lines[0])){
|
|
line = `${line} ${lines.shift()}`;
|
|
}
|
|
return line;
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @param {*} attributes
|
|
* @param {*} hack
|
|
* @param {*} level
|
|
*/
|
|
const importHack = function(attributes,sections,hack,level){
|
|
const rowID = k.generateRowID('repeating_hack',sections);
|
|
attributes[`${rowID}_level`] = level;
|
|
attributes[`${rowID}_hack_type`] = 'injection';
|
|
attributes[`${rowID}_id`] = rowID;
|
|
attributes[`${rowID}_name`] = hack;
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @param {array} lines - Array of line content
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
* @returns {array} lines - Modified array of the lines to process
|
|
*/
|
|
const traitParser = function(lines,attributes,sections,casc){
|
|
if(/^\s*traits$/.test(lines[0])){
|
|
lines.shift();
|
|
}
|
|
let regex = /(?:.+\.|actions)\s*$/i;
|
|
do{
|
|
let line = assembleTraitDetails(lines);
|
|
importTrait(attributes,sections,line);
|
|
}while(lines.length && !regex.test(lines[0]))
|
|
return lines;
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @param {array} lines - Array of line content
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const importTrait = function(attributes,sections,line){
|
|
const rowID = k.generateRowID('repeating_trait');
|
|
line.replace(/^(.+?)\.\s*(.+)/,(match,name,description)=>{
|
|
attributes[`${rowID}_description`] = description;
|
|
attributes[`${rowID}_id`] = rowID;
|
|
attributes[`${rowID}_name`] = name;
|
|
attributes[`${rowID}_expand_item`] = 0;
|
|
});
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @param {array} lines - Array of line content
|
|
* @param {boolean} action
|
|
* @returns
|
|
*/
|
|
//collects lines to create the entire paragraph of a trait. If action is truthy, then it will parse for an action's details
|
|
const assembleTraitDetails = function(lines,action){
|
|
let line = lines.shift();
|
|
while(lines.length && !/\.\s*$/.test(line)){
|
|
line = `${line} ${lines.shift()}`;
|
|
}
|
|
return line;
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @param {array} lines - Array of line content
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
* @returns {array} lines - Modified array of the lines to process
|
|
*/
|
|
const actionParser = function(lines,attributes,sections,casc){
|
|
do{
|
|
let line = assembleTraitDetails(lines,true);
|
|
importAction(attributes,sections,line);
|
|
}while(lines.length && /^(?:.+\.).+/.test(lines[0]))
|
|
return lines;
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @param {array} lines - Array of line content
|
|
* @param {object} attributes - The attribute values of the character
|
|
* @param {object[]} sections - All the repeating section IDs
|
|
* @param {object} casc - Expanded cascade object
|
|
*/
|
|
const importAction = function(attributes,sections,line){
|
|
const rowID = k.generateRowID('repeating_action',sections);
|
|
line.replace(/^(.+?)\.\s+((?:ranged|melee)\s+weapon\s+attack:.+?(\-?\d+).+?(?:range|reach)\s+(.+?),\s*(.+?)\..+?\((.+?)\)\s*(.*?)\.\s*(.+)?|.+)/i,(match,name,details,attack,range,target,damageRoll,damageType,description)=>{
|
|
attributes[`${rowID}_id`] = rowID;
|
|
attributes[`${rowID}_name`] = name;
|
|
if(attack){
|
|
attributes[`${rowID}_attack_bonus`] = attack;
|
|
attributes[`${rowID}_bonus`] = attack;
|
|
attributes[`${rowID}_attack_enable_item`] = 1;
|
|
attributes[`${rowID}_attack_macro`] = '{{d20=[[@{advantage_state} + 0@{attack_bonus}]]}}';
|
|
}
|
|
if(damageRoll){
|
|
attributes[`${rowID}_damage_1`] = damageRoll;
|
|
attributes[`${rowID}_damage_type_1`] = damageType||'';
|
|
attributes[`${rowID}_damage_1_enable_item`] = '{{damage_type_1=@{damage_type_1}}} @{damage_1_macro}';
|
|
attributes[`${rowID}_damage_1_macro`] = `{{damage_1=[[0@{damage_1}]]}} {{regular_critical_1=[[0@{damage_1}]]}} {{is_custom_crit_1=@{critical_damage_1}}} {{custom_critical_1=[[0@{critical_damage_1}]]}}`;
|
|
}
|
|
if(description){
|
|
attributes[`${rowID}_description`] = description||'';
|
|
}else if(!attack&&!range&&!target&&!damageRoll&&!damageType){
|
|
attributes[`${rowID}_description`] = details;
|
|
}
|
|
attributes[`${rowID}_range`] = range||'';
|
|
attributes[`${rowID}_expand_item`] = 0;
|
|
});
|
|
};const rollCheck = ({trigger,attributes,sections}) => {
|
|
const ability = trigger.name.replace(/-action$/,'');
|
|
const rollObj = {
|
|
rollName:`^{${ability}}`,
|
|
d20:`[[@{advantage_state} + @{${ability}_mod}[${k.capitalize(getTranslationByKey(ability))}]]]`
|
|
};
|
|
executeRoll({rollObj});
|
|
};
|
|
k.registerFuncs({rollCheck});
|
|
|
|
const rollSave = ({trigger,attributes,sections}) => {
|
|
const save = trigger.name.replace(/-action$/,'');
|
|
const rollObj = {
|
|
rollName:`^{${save.replace(/-/,' ')}}`,
|
|
d20:`[[@{advantage_state} + @{${save.replace(/-/g,'_')}${attributes.character_type === 'npc' ? '_base' : ''}}[${k.capitalize(getTranslationByKey(save.replace(/-/,' ')))}]]]`
|
|
};
|
|
executeRoll({rollObj});
|
|
};
|
|
k.registerFuncs({rollSave});
|
|
|
|
const rollSkill = ({trigger,attributes,sections}) => {
|
|
const skill = trigger.name.replace(/-action$/,'').replace(/-/g,'_');
|
|
const rollObj = {
|
|
rollName:`^{${skill.replace(/_/g,' ')}}`,
|
|
d20:`[[@{advantage_state} + @{${skill}}[${k.capitalize(getTranslationByKey(skill.replace(/_|-/g,' ')))}]]]`
|
|
};
|
|
executeRoll({rollObj});
|
|
};
|
|
k.registerFuncs({rollSkill});
|
|
|
|
const rollInitiative = ({trigger,attributes,sections}) => {
|
|
const rollObj = {
|
|
rollName:'^{initiative}',
|
|
d20:`[[@{advantage_state} + @{initiative}[${k.capitalize(getTranslationByKey('initiative'))}]]]`
|
|
}
|
|
executeRoll({rollObj})
|
|
};
|
|
k.registerFuncs({rollInitiative});
|
|
|
|
const rollHD = async ({trigger,attributes,sections}) => {
|
|
const d8Available = attributes.d8_hd > 0 ? 1 : 0;
|
|
const d10Available = attributes.d10_hd > 0 ? 1 : 0;
|
|
const d12Available = attributes.d12_hd > 0 ? 1 : 0;
|
|
const sizes = [8,10,12].reduce((memo,size)=>{
|
|
if(attributes[`d${size}_hd`] > 0){
|
|
memo[`d${size}`] = attributes[`d${size}_hd`];
|
|
}
|
|
return memo;
|
|
},{});
|
|
const rollObj = await queryHDSize(Object.entries(sizes),{rollName:'hit dice'},attributes);
|
|
executeRoll({rollObj});
|
|
attributes.set();
|
|
};
|
|
k.registerFuncs({rollHD});
|
|
|
|
const queryHDSize = async (queue,rollObj,attributes) => {
|
|
const dice = queue.shift();
|
|
if(!dice){
|
|
rollObj.description = await k.pseudoQuery('^{no dice available}');
|
|
return rollObj;
|
|
}
|
|
const options = [...Array(dice[0]).keys()].map(k=>k + 1).join('|');
|
|
const dieNum = await k.extractQueryResult(`${getTranslationByKey(`How many ${dice[1]} do you want to use`)}|${options}`);
|
|
attributes[`${dice[1]}_hd`] -= +dieNum;
|
|
rollObj.d20 = rollObj.d20 ?
|
|
rollObj.d20 + ` + ${dieNum}${dice[1]}` :
|
|
`${dieNum}${dice[1]}`;
|
|
|
|
if(queue.length){
|
|
return queryHDSize(queue,rollObj,attributes);
|
|
}else{
|
|
rollObj.d20 = `[[${rollObj.d20}]]`;
|
|
return rollObj;
|
|
}
|
|
};
|
|
|
|
const rollDeath = async ({trigger,attributes,sections}) => {
|
|
rollObj = {
|
|
rollName:'^{death save}',
|
|
d20:'[[@{advantage_state}]]',
|
|
damage_1:'[[0[Computed Value]]]',
|
|
damage_type_1:'^{Successes}',
|
|
damage_2:'[[0[Computed Value]]]',
|
|
damage_type_2:'^{Failures}'
|
|
};
|
|
|
|
const results = await executeRoll({rollObj,finish:false});
|
|
|
|
if(results.results.d20.result < 10){
|
|
attributes.death_failure = Math.min(attributes.death_failure + 1,3);
|
|
}else{
|
|
attributes.death_success = Math.min(attributes.death_success + 1,3);
|
|
if(results.results.d20.result === 20){
|
|
attributes.hp = 1;
|
|
attributes.death_success = 0;
|
|
attributes.death_failure = 0;
|
|
}
|
|
}
|
|
const computeObj = {
|
|
damage_1:attributes.death_success,
|
|
damage_2:attributes.death_failure
|
|
};
|
|
finishRoll(results.rollId,computeObj);
|
|
attributes.set();
|
|
};
|
|
k.registerFuncs({rollDeath});
|
|
|
|
const rollAction = ({trigger,attributes,sections}) => {
|
|
const [section,rowID,button] = k.parseTriggerName(trigger.name);
|
|
const row = `${section}_${rowID}`;
|
|
const rollObj = {
|
|
rollName:attributes[`${row}_name`],
|
|
};
|
|
if(attributes[`${row}_description_in_chat`]){
|
|
rollObj.description = attributes[`${row}_description`];
|
|
}
|
|
if(/^repeating_(?:action|hack)/.test(row)){
|
|
rollObj.range = attributes[`${row}_range`];
|
|
rollObj.properties = attributes[`${row}_properties`];
|
|
}
|
|
if(attributes[`${row}_attack_enable_item`]){
|
|
rollObj.d20 = `@{advantage_state}cs>${attributes[`${row}_crit`] || 20} + ${attributes[`${row}_action_proficiency`]}[${k.capitalize(getTranslationByKey('proficiency'))}]`;
|
|
if(attributes[`${row}_attack_ability`] !== 'none'){
|
|
if(attributes[`${row}_attack_ability`] === 'hack'){
|
|
rollObj.d20 += attributes[`hack_ability`] !== 'none' ?
|
|
` + @{${attributes[`hack_ability`]}_mod}[${k.capitalize(getTranslationByKey(attributes[`hack_ability`]))}]` :
|
|
'';
|
|
}else{
|
|
rollObj.d20 += ` + @{${attributes[`${row}_attack_ability`]}_mod}[${k.capitalize(getTranslationByKey(attributes[`${row}_attack_ability`]))}]`;
|
|
}
|
|
}
|
|
if(attributes[`${row}_attack_bonus`]){
|
|
rollObj.d20 += ` + [[${attributes[`${row}_attack_bonus`]}]][${k.capitalize(getTranslationByKey('attack bonus'))}]`;
|
|
}
|
|
rollObj.d20 = `[[${rollObj.d20}]]`;
|
|
}
|
|
|
|
if(attributes[`${row}_save_enable_item`]){
|
|
rollObj.dc = '';
|
|
rollObj.save_type = `^{${attributes[`${row}_save_type`]}}`.replace(/\^\{none\}/,'');
|
|
if(attributes[`${row}_save_ability`] !== 'none'){
|
|
if(attributes[`${row}_save_ability`] === 'hack'){
|
|
rollObj.dc += attributes.character_type === 'npc' ?
|
|
`${attributes.hack_dc} + ${attributes[`${row}_dc_bonus`]}` :
|
|
(
|
|
attributes[`hack_ability`] !== 'none' ?
|
|
`8 + ${attributes[`${row}_action_proficiency`]}[${k.capitalize(getTranslationByKey('proficiency'))}] + @{${attributes[`hack_ability`]}_mod}[${k.capitalize(getTranslationByKey(attributes[`hack_ability`]))}]` :
|
|
''
|
|
);
|
|
}else{
|
|
rollObj.dc +=
|
|
`8 + ${attributes[`${row}_action_proficiency`]}[${k.capitalize(getTranslationByKey('proficiency'))}] + @{${attributes[`${row}_save_ability`]}_mod}[${k.capitalize(getTranslationByKey(attributes[`${row}_save_ability`]))}]`;
|
|
}
|
|
}
|
|
if(attributes[`${row}_dc_bonus`]){
|
|
rollObj.dc += `${rollObj.dc ? ' + ' : ''}[[${attributes[`${row}_dc_bonus`]}]][${k.capitalize(getTranslationByKey('dc bonus'))}]`;
|
|
}
|
|
rollObj.dc = `[[0${rollObj.dc}]]`;
|
|
}
|
|
|
|
[1,2].forEach(n => {
|
|
if(attributes[`${row}_damage_${n}_enable_item`]){
|
|
['damage','damage_type'].forEach(str => {
|
|
rollObj[`${str}_${n}`] = attributes[`${row}_${str}_${n}`];
|
|
});
|
|
rollObj[`custom_critical_${n}`] = attributes[`${row}_critical_damage_${n}`] ?
|
|
`[[${attributes[`${row}_critical_damage_${n}`]}]]` :
|
|
'';
|
|
if(attributes[`${row}_damage_ability_${n}`] !== 'none'){
|
|
rollObj[`damage_${n}`] += ` + @{${attributes[`${row}_damage_ability_${n}`]}_mod}[${k.capitalize(getTranslationByKey(attributes[`${row}_damage_ability_${n}`]))}]`;
|
|
}
|
|
rollObj[`damage_${n}`] = `[[0${rollObj[`damage_${n}`]}]]`;
|
|
rollObj[`regular_critical_${n}`] = `[[0${attributes[`${row}_damage_${n}`]}]]`;
|
|
}
|
|
});
|
|
executeRoll({rollObj});
|
|
};
|
|
k.registerFuncs({rollAction});
|
|
|
|
/**
|
|
* Executes the roll
|
|
* @param {Object} rollObj - The object describing the roll to be made
|
|
* @param {Boolean} [finish=true] - Whether executeRoll should invoke finishRoll
|
|
*/
|
|
const executeRoll = async ({rollObj,finish=true}) => {
|
|
const msg = assembleRoll(rollObj)
|
|
const results = await startRoll(msg);
|
|
if(finish){
|
|
finishRoll(results.rollId);
|
|
}
|
|
return results;
|
|
};
|
|
|
|
const assembleRoll = (rollObj) => {
|
|
const rollDetails = Object.entries(rollObj)
|
|
.map(([key,value]) => `{{${key}=${value}}}` )
|
|
.join(' ');
|
|
return `@{template_start} ${rollDetails}`;
|
|
};
|
|
</script>
|
|
|
|
|
|
|
|
|