Files
roll20-character-sheets/Draw Steel/draw-steel.html
T
Zen-Raven c373434fe6 Bugfix
- Fixed Advance and Ride abilities so that they are shown as move actions and not maneuvers.
2026-03-24 10:18:47 -07:00

6896 lines
324 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<div class="sheet-header">
<!-- Header Start -->
<h1 class="title">
<img
src="https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Draw%20Steel/images/powered_by_draw_steel.webp"
alt="Powered By Draw Steel"
style="height: 60px"
/>
</h1>
<label class="sheet-options-checkbox-label" for="sheet-options-checkbox"></label>
<input id="sheet-options-checkbox" class="sheet-options-checkbox" type="checkbox" />
<div class="sheet-panel sheet-options-toggle">
<!-- Options Panel -->
<div class="sheet-panel-box import-panel">
<div>
<span data-i18n="whisper-gm"></span>
<select name="attr_wtype">
<option value="" data-i18n="never-whisper-roll" selected></option>
<option value="?{Whisper?|Public Roll,|Whisper Roll,/w gm }" data-i18n="query-whisper-roll"></option>
<option value="/w gm " data-i18n="always-whisper-roll"></option>
</select>
<hr>
<div>
<input id="options-calculate-damage" name="attr_options_calculate_damage" type="checkbox" value="1" />
<label for="options-calculate-damage" data-i18n="options-calculate-damage"></label>
</div>
<hr>
<div>
<input id="options-show-director-screen" name="attr_show_director_screen" type="checkbox" value="1" />
<label for="options-show-director-screen" data-i18n="options-show-director-screen"></label>
</div>
</div>
<div>
<h5 data-i18n="player-options-title"></h5>
<div>
<input id="growing-resource-checkbox" name="attr_has_growing_resource" class="npc-checkbox" type="checkbox" />
<label for="growing-resource-checkbox" data-i18n="growing-resource-checkbox"></label>
</div>
<div class="resource-selector-container">
<input type="hidden" class="main-resource-state" name="attr_growing_resource_type" value="custom" />
<div class="selector-row">
<select name="attr_growing_resource_type">
<option value="custom" data-i18n="growing-resource-custom"></option>
<option value="furyberserker" data-i18n="fury-berserker"></option>
<option value="furyreaver" data-i18n="fury-reaver"></option>
<option value="furystormwight" data-i18n="fury-stormwight"></option>
<option value="nullchronokinetic" data-i18n="null-chronokinetic"></option>
<option value="nullcryokinetic" data-i18n="null-cryokinetic"></option>
<option value="nullmetakinetic" data-i18n="null-metakinetic"></option>
</select>
</div>
<div class="selector-row stormwight-only">
<label data-i18n="kit"></label>
<select name="attr_stormwight_growing_resource_type">
<option value="" selected></option>
<option value="boren" data-i18n="boren"></option>
<option value="corven" data-i18n="corven"></option>
<option value="raden" data-i18n="raden"></option>
<option value="vuken" data-i18n="vuken"></option>
</select>
</div>
</div>
<hr>
<div class="grid-span-full">
<h5 data-i18n="npc-options-title"></h5>
</div>
<div>
<input id="npc-checkbox" name="attr_is_npc" class="npc-checkbox" type="checkbox" />
<label for="npc-checkbox" data-i18n="npc-toggle"></label>
</div>
<div>
<input id="npc-has-villain-actions" name="attr_villain_action_show" class="npc-checkbox" type="checkbox" value="1" />
<label for="npc-has-villain-actions" data-i18n="has-villain-actions"></label>
</div>
</div>
</div>
<div class="sheet-panel-box import-panel">
<div class="grid-span-full">
<h5 data-i18n="import">Import</h5>
</div>
<div>
<p data-i18n="import-warning1">Paste the contents of the Forge Steel data export (*.ds-hero file) into the text box below, then click 'Import'.</p>
<p class="text-warning" data-i18n="import-warning2">This will overwrite attributes on this sheet. This cannot be undone.</p>
<p class="text-warning" data-i18n="import-warning3">The import feature is a work in progress. Check for mistakes.</p>
</div>
<div>
<textarea name="attr_forgesteel_json" style="width: 100%;"></textarea>
<button type="action" name="act_import" data-i18n="import-player">Import Player</button>
<button type="action" name="act_importmonster" data-i18n="import-monster">Import Monster</button>
</div>
</div>
</div>
</div>
<!-- Header End -->
<input type="hidden" class="npc-checkbox" name="attr_is_npc" />
<input type="hidden" id="director-screen-toggle" name="attr_show_director_screen" />
<!-- Director Screen-->
<div class="sheet-panel director-screen-panel minimizable">
<div class="minimize-control">
<input id="director-screen-minimize-checkbox" class="minimize" type="checkbox" checked />
<label for="director-screen-minimize-checkbox" data-i18n="director-screen"></label>
</div>
<!-- Conditions -->
<details>
<summary><span data-i18n="conditions"></span></summary>
<p class="director-section-text" data-i18n="conditions-desc"></p>
<div class="director-rules-container">
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="bleeding"></span>
<span class="director-rule-desc" data-i18n="bleeding-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="dazed"></span>
<span class="director-rule-desc" data-i18n="dazed-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="frightened"></span>
<span class="director-rule-desc" data-i18n="frightened-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="grabbed"></span>
<span class="director-rule-desc" data-i18n="grabbed-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="prone"></span>
<span class="director-rule-desc" data-i18n="prone-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="restrained"></span>
<span class="director-rule-desc" data-i18n="restrained-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="slowed"></span>
<span class="director-rule-desc" data-i18n="slowed-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="taunted"></span>
<span class="director-rule-desc" data-i18n="taunted-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="weakened"></span>
<span class="director-rule-desc" data-i18n="weakened-desc"></span>
</div>
</div>
</details>
<!-- Basics -->
<details>
<summary><span data-i18n="basics"></span></summary>
<div class="director-rules-container">
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="characteristics-scores"></span>
<span class="director-rule-desc" data-i18n="characteristics-scores-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="natural-19-20"></span>
<span class="director-rule-desc" data-i18n="natural-19-20-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="power-roll-director"></span>
<span class="director-rule-desc" data-i18n="power-roll-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="recovery"></span>
<span class="director-rule-desc" data-i18n="recovery-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="respites"></span>
<span class="director-rule-desc" data-i18n="respites-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="skill"></span>
<span class="director-rule-desc" data-i18n="skill-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="victories-director"></span>
<span class="director-rule-desc" data-i18n="victories-desc"></span>
</div>
<h5 data-i18n="edges-and-banes"></h5>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="edge-director"></span>
<span class="director-rule-desc" data-i18n="edge-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="double-edge-director"></span>
<span class="director-rule-desc" data-i18n="double-edge-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="bane-director"></span>
<span class="director-rule-desc" data-i18n="bane-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="double-bane-director"></span>
<span class="director-rule-desc" data-i18n="double-bane-desc"></span>
</div>
<p class="director-section-text" data-i18n="edges-and-banes-desc"></p>
<h5 data-i18n="hero-tokens"></h5>
<p class="director-section-text" data-i18n="hero-tokens-desc"></p>
</div>
</details>
<!-- Combat -->
<details>
<summary><span data-i18n="combat"></span></summary>
<div class="director-rules-container">
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="combat-turn"></span>
<span class="director-rule-desc" data-i18n="combat-turn-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="triggered-action-director"></span>
<span class="director-rule-desc" data-i18n="triggered-action-desc"></span>
</div>
<h5 data-i18n="main-actions"></h5>
<p class="director-section-text" data-i18n="main-actions-desc"></p>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="charge-director"></span>
<span class="director-rule-desc" data-i18n="charge-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="defend-director"></span>
<span class="director-rule-desc" data-i18n="defend-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="free-strike-director"></span>
<span class="director-rule-desc" data-i18n="free-strike-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="heal-director"></span>
<span class="director-rule-desc" data-i18n="heal-desc"></span>
</div>
<h5 data-i18n="move-actions"></h5>
<p class="director-section-text" data-i18n="move-actions-desc"></p>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="advance-director"></span>
<span class="director-rule-desc" data-i18n="advance-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="disengage-director"></span>
<span class="director-rule-desc" data-i18n="disengage-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="ride-director"></span>
<span class="director-rule-desc" data-i18n="ride-desc"></span>
</div>
<h5 data-i18n="maneuvers"></h5>
<p class="director-section-text" data-i18n="maneuvers-desc"></p>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="aid-attack-director"></span>
<span class="director-rule-desc" data-i18n="aid-attack-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="catch-breath-director"></span>
<span class="director-rule-desc" data-i18n="catch-breath-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="escape-grab-director"></span>
<span class="director-rule-desc" data-i18n="escape-grab-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="grab-director"></span>
<span class="director-rule-desc" data-i18n="grab-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="hide-director"></span>
<span class="director-rule-desc" data-i18n="hide-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="knockback-director"></span>
<span class="director-rule-desc" data-i18n="knockback-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="stand-up-director"></span>
<span class="director-rule-desc" data-i18n="stand-up-desc"></span>
</div>
<h5 data-i18n="combat-glossary"></h5>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="critical-hit-director"></span>
<span class="director-rule-desc" data-i18n="critical-hit-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="stand-up-director"></span>
<span class="director-rule-desc" data-i18n="stand-up-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="critical-hit-director"></span>
<span class="director-rule-desc" data-i18n="critical-hit-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="concealment"></span>
<span class="director-rule-desc" data-i18n="concealment-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="cover"></span>
<span class="director-rule-desc" data-i18n="cover-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="damage-immunity"></span>
<span class="director-rule-desc" data-i18n="damage-immunity-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="damage-weakness"></span>
<span class="director-rule-desc" data-i18n="damage-weakness-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="dying-director"></span>
<span class="director-rule-desc" data-i18n="dying-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="eot-director"></span>
<span class="director-rule-desc" data-i18n="eot-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="flanking"></span>
<span class="director-rule-desc" data-i18n="flanking-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="high-ground"></span>
<span class="director-rule-desc" data-i18n="high-ground-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="line-of-effect"></span>
<span class="director-rule-desc" data-i18n="line-of-effect-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="opportunity-attack-director"></span>
<span class="director-rule-desc" data-i18n="opportunity-attack-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="saving-throws"></span>
<span class="director-rule-desc" data-i18n="saving-throws-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="stamina-director"></span>
<span class="director-rule-desc" data-i18n="stamina-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="surges-director"></span>
<span class="director-rule-desc" data-i18n="surges-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="winded-director"></span>
<span class="director-rule-desc" data-i18n="winded-desc"></span>
</div>
<h5 data-i18n="size-and-space"></h5>
<p data-i18n="size-and-space-desc"></p>
</div>
</details>
<!-- Movement -->
<details>
<summary><span data-i18n="movement"></span></summary>
<div class="director-rules-container">
<p class="director-section-text" data-i18n="movement-desc"></p>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="climb"></span>
<span class="director-rule-desc" data-i18n="climb-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="crawl"></span>
<span class="director-rule-desc" data-i18n="crawl-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="difficult-terrain"></span>
<span class="director-rule-desc" data-i18n="difficult-terrain-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="jump-director"></span>
<span class="director-rule-desc" data-i18n="jump-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="teleport"></span>
<span class="director-rule-desc" data-i18n="teleport-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="shifting"></span>
<span class="director-rule-desc" data-i18n="shifting-desc"></span>
</div>
<h5 data-i18n="forced-movement"></h5>
<p class="director-section-text" data-i18n="forced-movement-desc"></p>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="push-x"></span>
<span class="director-rule-desc" data-i18n="push-x-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="pull-x"></span>
<span class="director-rule-desc" data-i18n="pull-x-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="slide-x"></span>
<span class="director-rule-desc" data-i18n="slide-x-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="vertical"></span>
<span class="director-rule-desc" data-i18n="vertical-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="big-vs-little"></span>
<span class="director-rule-desc" data-i18n="big-vs-little-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="breaking-objects"></span>
<span class="director-rule-desc" data-i18n="breaking-objects-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="slamming-into-creatures"></span>
<span class="director-rule-desc" data-i18n="slamming-into-creatures-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="slamming-into-objects"></span>
<span class="director-rule-desc" data-i18n="slamming-into-objects-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="stability-director"></span>
<span class="director-rule-desc" data-i18n="stability-desc"></span>
</div>
</div>
</details>
<!-- Area of Effect -->
<details>
<summary><span data-i18n="areas-of-effect"></span></summary>
<div class="director-rules-container">
<p class="director-section-text" data-i18n="areas-of-effect-desc"></p>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="aura"></span>
<span class="director-rule-desc" data-i18n="aura-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="burst"></span>
<span class="director-rule-desc" data-i18n="burst-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="cube"></span>
<span class="director-rule-desc" data-i18n="cube-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="line"></span>
<span class="director-rule-desc" data-i18n="line-desc"></span>
</div>
<div class="director-rule-item">
<span class="director-rule-name" data-i18n="wall-director"></span>
<span class="director-rule-desc" data-i18n="wall-desc"></span>
</div>
</div>
</details>
</div>
<!-- Character Sheet Start -->
<div class="sheet-body">
<!-- Header Panel -->
<label data-i18n="initiative"></label><button type="roll" value="@{wtype} &amp;{template:simpleroll} {{rolltitle=1d10}} {{roll=[[ [[1d10]][1d10]]]}} {{name=Initiative}} {{charactername=@{character_name}}}" data-i18n-title="initiative-title" class="btn ui-draggable"></button>
<button class="startcombat-button" type="action" data-i18n-title="startcombat-title" name="act_startcombat" data-i18n="startcombat"></button>
<button class="endcombat-button" type="action" data-i18n-title="endcombat-title" name="act_endcombat" data-i18n="endcombat"></button>
<button class="respite-button" type="action" data-i18n-title="respite-title" name="act_respite" data-i18n="respite"></button>
<div class="sheet-panel header-panel">
<div class="sheet-panel-box profile-panel">
<div class="name-input-group">
<input type="text" name="attr_character_name" title="Macro: @{NAME|character_name}" />
<label class="sublabel" data-i18n="character-name"></label>
</div>
<div class="ancestry-input-group">
<input type="text" class="input-md" name="attr_ancestry" title="Macro: @{NAME|ancestry}" />
<label class="sublabel" data-i18n="ancestry"></label>
</div>
<div class="class-input-group">
<input type="text" class="input-md" name="attr_class" title="Macro: @{NAME|class}" />
<label class="sublabel" data-i18n="class"></label>
</div>
<div class="career-input-group">
<input type="text" class="input-md" name="attr_career" title="Macro: @{NAME|career}" />
<label class="sublabel" data-i18n="career"></label>
</div>
<div class="subclass-input-group">
<input type="text" class="input-md" name="attr_subclass" title="Macro: @{NAME|subclass}" />
<label class="sublabel" data-i18n="subclass"></label>
</div>
</div>
<div class="sheet-panel-box progress-panel">
<div class="victories-input-group">
<h5 data-i18n="victories"></h5>
<span name="attr_victories" class="victory-count" title="Macro: @{NAME|victories}"></span>
<div class="progressbox-group">
<input id="victories-checkbox-1" type="checkbox" value="1" name="attr_victories" />
<label class="progressbox" for="victories-checkbox-1"></label>
<input id="victories-checkbox-2" type="checkbox" value="2" name="attr_victories" />
<label class="progressbox" for="victories-checkbox-2"></label>
<input id="victories-checkbox-3" type="checkbox" value="3" name="attr_victories" />
<label class="progressbox" for="victories-checkbox-3"></label>
<input id="victories-checkbox-4" type="checkbox" value="4" name="attr_victories" />
<label class="progressbox" for="victories-checkbox-4"></label>
<input id="victories-checkbox-5" type="checkbox" value="5" name="attr_victories" />
<label class="progressbox" for="victories-checkbox-5"></label>
<input id="victories-checkbox-6" type="checkbox" value="6" name="attr_victories" />
<label class="progressbox" for="victories-checkbox-6"></label>
<input id="victories-checkbox-7" type="checkbox" value="7" name="attr_victories" />
<label class="progressbox" for="victories-checkbox-7"></label>
<input id="victories-checkbox-8" type="checkbox" value="8" name="attr_victories" />
<label class="progressbox" for="victories-checkbox-8"></label>
<input id="victories-checkbox-9" type="checkbox" value="9" name="attr_victories" />
<label class="progressbox" for="victories-checkbox-9"></label>
<input id="victories-checkbox-10" type="checkbox" value="10" name="attr_victories" />
<label class="progressbox" for="victories-checkbox-10"></label>
<input id="victories-checkbox-11" type="checkbox" value="11" name="attr_victories" />
<label class="progressbox" for="victories-checkbox-11"></label>
<input id="victories-checkbox-12" type="checkbox" value="12" name="attr_victories" />
<label class="progressbox" for="victories-checkbox-12"></label>
<input id="victories-checkbox-13" type="checkbox" value="13" name="attr_victories" />
<label class="progressbox" for="victories-checkbox-13"></label>
<input id="victories-checkbox-14" type="checkbox" value="14" name="attr_victories" />
<label class="progressbox" for="victories-checkbox-14"></label>
<input id="victories-checkbox-15" type="checkbox" value="15" name="attr_victories" />
<label class="progressbox" for="victories-checkbox-15"></label>
</div>
</div>
<div class="level-input-group">
<h5 data-i18n="level"></h5>
<input type="number" name="attr_level" title="Macro: @{NAME|level}" />
</div>
<div class="wealth-input-group">
<label data-i18n="wealth"></label>
<input type="number" class="input-md" name="attr_wealth" title="Macro: @{NAME|wealth}" />
</div>
<div class="renown-input-group">
<label data-i18n="renown"></label>
<input type="number" class="input-md" name="attr_renown" title="Macro: @{NAME|renown}" />
</div>
<div class="experience-input-group">
<label data-i18n="experience"></label>
<input type="number" class="input-md" name="attr_experience" title="Macro: @{NAME|experience}" />
</div>
</div>
</div>
<!-- Stats Panel -->
<div class="sheet-panel stats-panel minimizable">
<div class="minimize-control">
<input id="stats-minimize-checkbox" class="minimize" type="checkbox" name="attr_stats-minimize-checkbox" checked />
<label for="stats-minimize-checkbox" data-i18n="characteristics"></label>
</div>
<div class="stat-dashboard minimize-ignore">
<div class="dashboard-characteristics minimize-ignore">
<div class="dashboard-stat-group characteristic-input-group">
<label data-characteristic="might" data-i18n="might" data-i18n-title="characteristic-roll-tooltip">Might</label>
<input type="number" name="attr_might" title="Macro: @{NAME|might}" />
</div>
<div class="dashboard-stat-group characteristic-input-group">
<label data-characteristic="agility" data-i18n="agility" data-i18n-title="characteristic-roll-tooltip">Agility</label>
<input type="number" name="attr_agility" title="Macro: @{NAME|agilitiy}" />
</div>
<div class="dashboard-stat-group characteristic-input-group">
<label data-characteristic="reason" data-i18n="reason" data-i18n-title="characteristic-roll-tooltip">Reason</label>
<input type="number" name="attr_reason" title="Macro: @{NAME|reason}"/>
</div>
<div class="dashboard-stat-group characteristic-input-group">
<label data-characteristic="intuition" data-i18n="intuition" data-i18n-title="characteristic-roll-tooltip">Intuition</label>
<input type="number" name="attr_intuition" title="Macro: @{NAME|intuition}" />
</div>
<div class="dashboard-stat-group characteristic-input-group">
<label data-characteristic="presence" data-i18n="presence" data-i18n-title="characteristic-roll-tooltip">Presence</label>
<input type="number" name="attr_presence" title="Macro: @{NAME|presence}" />
</div>
</div>
<div class="dashboard-stamina minimize-ignore">
<div class="dashboard-stat-group">
<label data-i18n="stamina">Stamina</label>
<input type="number" name="attr_stamina" />
</div>
<div class="stamina-temporary-input-group">
<input type="number" class="input-md" name="attr_stamina_temporary" title="Macro: @{NAME|stamina_temporary}" />
<label class="sublabel" data-i18n="stamina-temporary">Temporary</label>
</div>
</div>
<div class="dashboard-recoveries minimize-ignore">
<div class="dashboard-stat-group recovery-input-group">
<label data-characteristic="recoveries" data-i18n="recoveries" data-i18n-title="recoveries-tooltip">Recoveries</label>
<input type="number" name="attr_recoveries" title="Macro: @{NAME|recoveries}" />
</div>
</div>
<div class="dashboard-resource minimize-ignore">
<div class="dashboard-stat-group resource-input-group">
<label data-characteristic="resource" data-i18n="resource" data-i18n-title="resource-tooltip">Heroic Resource</label>
<input type="number" name="attr_resource" title="Macro: @{NAME|resource}" />
</div>
</div>
<div class="dashboard-surges minimize-ignore">
<div class="dashboard-stat-group">
<label data-characteristic="surges" data-i18n="surges">Surges</label>
<div class="surges-input-group">
<label data-characteristic="surges-damage" data-i18n="surges-damage" data-i18n-title="surges-damage-tooltip">Damage</label>
<span class="pipe-separator">|</span>
<label data-characteristic="surges-potency" data-i18n="surges-potency" data-i18n-title="surges-potency-tooltip">Potency</label>
</div>
<input type="number" name="attr_surges" title="Macro: @{NAME|surges}" />
</div>
</div>
</div>
<!-- Movement -->
<div class="movement">
<div class="movement-input-group">
<input type="text" class="input-md" name="attr_size" title="Macro: @{NAME|size}" />
<label class="sublabel" data-i18n="size"></label>
</div>
<div class="movement-input-group">
<input type="number" class="input-md" name="attr_speed" title="Macro: @{NAME|speed}" />
<label class="sublabel" data-i18n="speed"></label>
</div>
<div class="movement-input-group">
<input type="number" class="input-md" name="attr_disengage" title="Macro: @{NAME|disengage}" />
<label class="sublabel" data-i18n="disengage"></label>
</div>
<div class="movement-input-group">
<input type="number" class="input-md" name="attr_stability" title="Macro: @{NAME|stability}" />
<label class="sublabel" data-i18n="stability"></label>
</div>
</div>
<!-- Stamina -->
<div class="stamina-panel">
<div class="stamina-temp-max-group">
<div>
<div class="stamina-winded-input-group minimize-ignore">
<label class="sublabel" data-i18n="winded"></label>
<div>
<span class="sublabel" name="attr_stamina_winded" title="Macro: @{NAME|stamina_winded}"></span>
</div>
</div>
<div class="stamina-dying-input-group minimize-ignore">
<label class="sublabel" data-i18n="dying"></label>
<div>
0 to <span class="sublabel" name="attr_stamina_dead" title="Macro: @{NAME|stamina_dead}"></span></div>
</div>
</div><div class="stamina-max-input-group">
<input type="number" class="input-stamina minimize-ignore" name="attr_stamina_max" title="Macro: @{NAME|stamina_max}">
<label class="sublabel minimize-ignore" data-i18n="stamina-max"></label>
</div>
</div>
</div>
<!-- Recoveries -->
<div class="recoveries-panel">
<div class="recovery-amount-input-group">
<input type="number" class="input-md" name="attr_recovery_amount" title="Macro: @{NAME|recovery_amount}" />
<label class="sublabel" data-i18n="recovery-amount"></label>
</div>
<div class="recoveries-max-input-group">
<input type="number" class="input-md" name="attr_recoveries_max" title="Macro: @{NAME|recoveries_max}" />
<label class="sublabel" data-i18n="recoveries-max"></label>
</div>
</div>
<!-- Heroic Resource Name -->
<div class="resource-panel">
<div class="resource-name-input-group">
<input type="text" class="input-md" name="attr_resource_name" data-i18n-placeholder="resource-name-placeholder" title="Macro: @{NAME|resource_name}" />
<label class="sublabel" for="attr_resource_amount" data-i18n="resource-amount">Amount</label><input type="text" id="attr_resource_amount" class="input-md" name="attr_resource_amount" placeholder="1d3" title="Macro: @{NAME|resource_amount}" />
</div>
</div>
<!-- Surges -->
<div class="surges-panel">
<label class="sublabel" data-i18n="one-surge"></label>
<span data-i18n="damage"></span>
<input type="number" class="input-md" name="attr_surge_damage" title="Macro: @{NAME|surge_damage}" />
<label class="sublabel" data-i18n="two-surges"></label>
<span data-i18n="potency-one"></span>
</div>
<!-- Growing Resource Fury/Null -->
<input type="hidden" class="has-resource-toggle" name="attr_has_growing_resource" value="0" />
<div class="growing-resource minimize-ignore">
<h5 class="panel-title" data-i18n="growing-resource"></h5>
<input type="hidden" class="row-toggle-2" name="attr_growingresource_show_2" value="1" />
<input type="hidden" class="row-toggle-4" name="attr_growingresource_show_4" value="1" />
<input type="hidden" class="row-toggle-6" name="attr_growingresource_show_6" value="1" />
<input type="hidden" class="row-toggle-8" name="attr_growingresource_show_8" value="1" />
<input type="hidden" class="row-toggle-10" name="attr_growingresource_show_10" value="1" />
<input type="hidden" class="row-toggle-12" name="attr_growingresource_show_12" value="1" />
<div class="resource-container sheet-panel-box minimize-ignore">
<input type="checkbox" class="ability-edit" id="ability-edit" name="attr_growing_resource_edit" />
<div class="growing-resource-grid">
<div class="grid-header">
<span class="header-label" name="attr_resource_name"></span>
<span class="header-benefit" data-i18n="benefit"></span>
</div>
<div class="resource-row tier-2">
<div class="display-mode">
<span class="row-label" name="attr_growingresource_2_label"></span>
<span class="row-text" name="attr_growingresource_2_text"></span>
</div>
<div class="edit-mode">
<input type="text" name="attr_growingresource_2_label" />
<textarea name="attr_growingresource_2_text"></textarea>
</div>
</div>
<div class="resource-row tier-4">
<div class="display-mode">
<span class="row-label" name="attr_growingresource_4_label"></span>
<span class="row-text" name="attr_growingresource_4_text"></span>
</div>
<div class="edit-mode">
<input type="text" name="attr_growingresource_4_label" />
<textarea name="attr_growingresource_4_text"></textarea>
</div>
</div>
<div class="resource-row tier-6">
<div class="display-mode">
<span class="row-label" name="attr_growingresource_6_label"></span>
<span class="row-text" name="attr_growingresource_6_text"></span>
</div>
<div class="edit-mode">
<input type="text" name="attr_growingresource_6_label" />
<textarea name="attr_growingresource_6_text"></textarea>
</div>
</div>
<div class="resource-row tier-8">
<div class="display-mode">
<span class="row-label" name="attr_growingresource_8_label"></span>
<span class="row-text" name="attr_growingresource_8_text"></span>
</div>
<div class="edit-mode">
<input type="text" name="attr_growingresource_8_label" />
<textarea name="attr_growingresource_8_text"></textarea>
</div>
</div>
<div class="resource-row tier-10">
<div class="display-mode">
<span class="row-label" name="attr_growingresource_10_label"></span>
<span class="row-text" name="attr_growingresource_10_text"></span>
</div>
<div class="edit-mode">
<input type="text" name="attr_growingresource_10_label" />
<textarea name="attr_growingresource_10_text"></textarea>
</div>
</div>
<div class="resource-row tier-12">
<div class="display-mode">
<span class="row-label" name="attr_growingresource_12_label"></span>
<span class="row-text" name="attr_growingresource_12_text"></span>
</div>
<div class="edit-mode">
<input type="text" name="attr_growingresource_12_label" />
<textarea name="attr_growingresource_12_text"></textarea>
</div>
</div>
</div>
</div>
</div>
<!-- Potencies -->
<div class="potencies sheet-panel-box">
<h5 class="panel-title" data-i18n="potencies"></h5>
<div class="potency-input-group">
<label data-i18n="potency-strong"></label>
<input type="number" class="input-md" name="attr_potency_strong" title="Macro: @{NAME|potency_strong}" />
</div>
<div class="potency-input-group">
<label data-i18n="potency-average"></label>
<input type="number" class="input-md" name="attr_potency_average" title="Macro: @{NAME|potency_average}" />
</div>
<div class="potency-input-group">
<label data-i18n="potency-weak"></label>
<input type="number" class="input-md" name="attr_potency_weak" title="Macro: @{NAME|potency_weak}" />
</div>
</div>
<!-- Immunity and Weakness-->
<div class="damage-mod-panel sheet-panel-box">
<label><span data-i18n="immunity"></span></label>
<input type="text" class="input-md" name="attr_immunity" title="Macro: @{NAME|immunity}" />
<label><span data-i18n="weakness"></span></label>
<input type="text" class="input-md" name="attr_weakness" title="Macro: @{NAME|weakness}" />
</div>
<!-- Heroic Resource Description -->
<div class="resource-description-panel sheet-panel-box">
<textarea data-i18n-placeholder="resource-description-placeholder" name="attr_resource_description" title="Macro: @{NAME|resource_description}"></textarea>
</div>
<!-- Conditions -->
<div class="conditions-panel sheet-panel-box">
<h5 class="panel-title" data-i18n="conditions"></h5>
<fieldset class="repeating_conditions">
<input type="text" name="attr_condition_name" data-i18n-placeholder="condition" title="Macro: @{NAME|repeating_conditions_<id>_condition_name}" />
<div>
<input type="radio" name="attr_end" value="eot" title="Macro: @{NAME|repeating_conditions_<id>_end}" />
<label data-i18n="eot"></label>
</div>
<div>
<input type="radio" name="attr_end" value="save-ends" title="Macro: @{NAME|repeating_conditions_<id>_end}" />
<label data-i18n="save-ends"></label>
</div>
</fieldset>
<div class="savethrow-input-group">
<p data-i18n="save-ends-eq"></p>
<input type="text" class="input-md" name="attr_savethrow" data-i18n-placeholder="savethrow-placeholder" />
<p data-i18n="save-ends-desc"></p>
<label>1d10:</label><button type="roll" value="@{wtype} &amp;{template:simpleroll} {{rolltitle=1d10}} {{roll=[[ [[1d10]][1d10]]]}} {{name=Saving throw: rolling a @{savethrow} or higher removes effect}} {{charactername=@{character_name}}}" data-i18n-title="initiative-title" class="btn ui-draggable"></button>
</div>
<div class="bleed-dying-input-group">
<p data-i18n="bleeding-dying"></p>
<label data-i18n="d6-level"></label><button type="roll" value="@{wtype} &amp;{template:simpleroll} {{rolltitle=1d6+@{level}}} {{roll=[[1d6[1d6] + @{level}[level]]]}} {{name=Bleeding or Dying}} {{charactername=@{character_name}}}" data-i18n-title="bleeding-dying-title" class="btn ui-draggable"></button>
</div>
</div>
</div>
<!-- Biography Panel-->
<div class="sheet-panel biography-panel minimizable">
<div class="minimize-control">
<input id="biography-minimize-checkbox" class="minimize" type="checkbox" checked />
<label for="biography-minimize-checkbox" data-i18n="biography"></label>
</div>
<div class="sheet-panel-box career-panel">
<h5 class="panel-title" data-i18n="career"></h5>
<input type="text" name="attr_career" title="Macro: @{NAME|career}" />
<label class="sublabel" data-i18n="career-benefit"></label>
<textarea name="attr_career_benefit" spellcheck="false" title="Macro: @{NAME|career_benefit}" ></textarea>
<label class="sublabel" data-i18n="career-incident"></label>
<textarea name="attr_career_incident" spellcheck="false" title="Macro: @{NAME|career_incident}" ></textarea>
</div>
<div class="sheet-panel-box complication-panel">
<h5 class="panel-title" data-i18n="complication"></h5>
<input type="text" name="attr_complication" title="Macro: @{NAME|complication}" />
<label class="sublabel" data-i18n="complication-benefit"></label>
<textarea name="attr_complication_benefit" spellcheck="false" title="Macro: @{NAME|complication_benefit}" ></textarea>
<label class="sublabel" data-i18n="complication-drawback"></label>
<textarea name="attr_complication_drawback" spellcheck="false" title="Macro: @{NAME|complication_drawback}" ></textarea>
</div>
<div class="sheet-panel-box culture-panel">
<h5 class="panel-title" data-i18n="culture"></h5>
<label class="sublabel" data-i18n="culture-environment"></label>
<label class="sublabel" data-i18n="culture-organization"></label>
<label class="sublabel" data-i18n="culture-upbringing"></label>
<input type="text" name="attr_culture_environment" title="Macro: @{NAME|culture_environment}" />
<input type="text" name="attr_culture_organization" title="Macro: @{NAME|culture_organization}" />
<input type="text" name="attr_culture_upbringing" title="Macro: @{NAME|culture_upbringing}" />
<textarea name="attr_culture_environment_description" spellcheck="false" title="Macro: @{NAME|culture_environment_description}" ></textarea>
<textarea name="attr_culture_organization_description" spellcheck="false" title="Macro: @{NAME|culture_organization_description}" ></textarea>
<textarea name="attr_culture_upbringing_description" spellcheck="false" title="Macro: @{NAME|culture_upbringing_description}" ></textarea>
</div>
</div>
<!-- Skills and Languages Panel-->
<div class="sheet-panel skills-languages-panel minimizable">
<div class="minimize-control">
<input id="skills-languages-minimize-checkbox" class="minimize" type="checkbox" checked />
<label for="skills-languages-minimize-checkbox" data-i18n="skills-languages"></label>
</div>
<div class="skills-panel">
<h5 class="panel-title" data-i18n="skills"></h5>
<label data-i18n="crafting"></label>
<input type="text" name="attr_skills_crafting" title="Macro: @{NAME|skills_crafting}" />
<label data-i18n="exploration"></label>
<input type="text" name="attr_skills_exploration" title="Macro: @{NAME|skills_exploration}" />
<label data-i18n="interpersonal"></label>
<input type="text" name="attr_skills_interpersonal" title="Macro: @{NAME|skills_interpersonal}" />
<label data-i18n="intrigue"></label>
<input type="text" name="attr_skills_intrigue" title="Macro: @{NAME|skills_intrigue}" />
<label data-i18n="lore"></label>
<input type="text" name="attr_skills_lore" title="Macro: @{NAME|skills_lore}" />
</div>
<div class="languages-panel">
<h5 class="panel-title" data-i18n="languages"></h5>
<input type="text" data-i18n-placeholder="caelian" name="attr_languages" title="Macro: @{NAME|languages}" />
</div>
</div>
<!-- Features Panel-->
<div class="sheet-panel features-panel minimizable">
<div class="minimize-control">
<input id="features-minimize-checkbox" class="minimize" type="checkbox" checked />
<label for="features-minimize-checkbox" data-i18n="features"></label>
</div>
<!-- Class Features Panel -->
<div class="sheet-panel-box class-panel">
<h5 class="panel-title" data-i18n="class-features"></h5>
<fieldset class="repeating_classfeatures">
<input class="ability-edit" type="checkbox" id="ability-edit" />
<div class="feature-accordion card-edit">
<input type="text" name="attr_classfeature_name" title="Macro: @{NAME|repeating_classfeatures_<id>_classfeature_name}" />
<textarea name="attr_classfeature_description" title="Macro: @{NAME|repeating_classfeatures_<id>_classfeature_description}"></textarea>
</div>
<div class="feature-accordion">
<div class="class-feature-header">
<button class="feature-button" type="action" data-i18n-title="feature-share" name="act_classfeatureshare">
<!-- speech balloon -->
&#128172;
</button>
<label><span name="attr_classfeature_name"></span>:</label>
<span name="attr_classfeature_description"></span>
</div>
</div>
</fieldset>
</div>
<!-- Ancestry Features Panel -->
<div class="sheet-panel-box ancestry-panel">
<h5 class="panel-title" data-i18n="ancestry-traits"></h5>
<fieldset class="repeating_ancestrytraits">
<input class="ability-edit" type="checkbox" id="ability-edit" />
<div class="feature-accordion card-edit">
<input type="text" name="attr_ancestrytrait_name" title="Macro: @{NAME|repeating_ancestrytraits_<id>_ancestrytrait_name}"/>
<textarea name="attr_ancestrytrait_description" title="Macro: @{NAME|repeating_ancestrytraits_<id>_ancestrytrait_description}"></textarea>
</div>
<div class="feature-accordion">
<div class="anc-feature-header">
<button class="feature-button" type="action" data-i18n-title="feature-share" name="act_ancfeatureshare">
<!-- speech balloon -->
&#128172;
</button>
<label><span name="attr_ancestrytrait_name"></span>:</label>
<span name="attr_ancestrytrait_description"></span>
</div>
</div>
</fieldset>
</div>
<!-- Equipment and Modifiers Panel -->
<div class="sheet-panel-box modifiers-panel">
<div class="modifiers-title">
<h5 class="panel-title" data-i18n="equipment-modifiers"></h5>
<span data-i18n="kit"></span>
<label><input type="checkbox" name="attr_kit" /></label>
</div>
<div class="modifiers">
<div class="modifier-card">
<input type="text" class="modifier-name" data-i18n-placeholder="modifier-name" name="attr_modifier_name" />
<div class="kit-weapon-armor-group">
<div class="kit-weapon-input-group">
<input type="text" class="kit-weapon" name="attr_kit_weapon" />
<label class="sublabel" data-i18n="weapon-implement"></label>
</div>
<div class="kit-armor-input-group">
<input type="text" class="kit-armor" name="attr_kit_armor" />
<label class="sublabel" data-i18n="armor"></label>
</div>
</div>
<div class="kit-input-group">
<div class="kit-speed-group">
<input type="number" class="kit-speed" name="attr_kit_speed" value="0" />
<label class="sublabel" data-i18n="speed"></label>
</div>
<div class="kit-disengage-group">
<input type="number" class="kit-disengage" name="attr_kit_disengage" value="0" />
<label class="sublabel" data-i18n="disengage"></label>
</div>
<div class="kit-stamina-group">
<input type="number" class="kit-stamina" name="attr_kit_stamina" value="0" />
<label class="sublabel" data-i18n="stamina"></label>
</div>
<div class="kit-stability-group">
<input type="number" class="kit-stability" name="attr_kit_stability" value="0" />
<label class="sublabel" data-i18n="stability"></label>
</div>
<div class="kit-melee-distance-group">
<input type="number" class="kit-melee-distance" name="attr_kit_melee_distance" value="0" />
<label class="sublabel" data-i18n="melee-dist"></label>
</div>
<div class="kit-ranged-distance-group">
<input type="number" class="kit-ranged-distance" name="attr_kit_ranged_distance" value="0" />
<label class="sublabel" data-i18n="ranged-dist"></label>
</div>
</div>
<div class="kit-damage">
<div class="kit-melee-damage-group">
<label class="kit-damage-label" data-i18n="melee-weapon-damage"></label>
<div class="kit-melee-damage">
<div class="kit-melee-damage-1-input-group">
<input type="number" class="kit-melee-damage-1" name="attr_kit_melee_damage_1" value="0" />
<label class="sublabel">≤11</label>
</div>
<div class="kit-melee-damage-2-input-group">
<input type="number" class="kit-melee-damage-2" name="attr_kit_melee_damage_2" value="0" />
<label class="sublabel">12-16</label>
</div>
<div class="kit-melee-damage-3-input-group">
<input type="number" class="kit-melee-damage-3" name="attr_kit_melee_damage_3" value="0" />
<label class="sublabel">17+</label>
</div>
</div>
</div>
<div class="kit-ranged-damage-group">
<label class="kit-damage-label" data-i18n="ranged-weapon-damage"></label>
<div class="kit-ranged-damage">
<div class="kit-ranged-damage-1-input-group">
<input type="number" class="kit-ranged-damage-1" name="attr_kit_ranged_damage_1" value="0" />
<label class="sublabel">≤11</label>
</div>
<div class="kit-ranged-damage-2-input-group">
<input type="number" class="kit-ranged-damage-2" name="attr_kit_ranged_damage_2" value="0" />
<label class="sublabel">12-16</label>
</div>
<div class="kit-ranged-damage-3-input-group">
<input type="number" class="kit-ranged-damage-3" name="attr_kit_ranged_damage_3" value="0" />
<label class="sublabel">17+</label>
</div>
</div>
</div>
</div>
</div>
<div class="modifier-effect">
<label class="kit-damage-label" data-i18n="effect"></label>
<textarea name="attr_modifier_description"></textarea>
</div>
<div class="other-modifiers">
<div class="other-modifiers-forcemove-group">
<input type="number" class="other-modifiers-forcemove" name="attr_forcemove" value="0" />
<label class="sublabel" data-i18n="forcemove"></label>
</div>
<div class="other-modifiers-mag-psi-group">
<input type="number" class="other-modifiers-mag-psi" name="attr_mag_psi_dam" value="0" />
<label class="sublabel" data-i18n="mag-psi-dam"></label>
</div>
<div class="other-modifiers-fire-dam-group">
<input type="number" class="other-modifiers-fire-dam" name="attr_fire_dam" value="0" />
<label class="sublabel" data-i18n="fire-dam"></label>
</div>
<div class="other-modifiers-sanct-weap-group">
<input type="number" class="other-modifiers-sanct-weap" name="attr_sanct_weap" value="0" />
<label class="sublabel" data-i18n="sanct-weap"></label>
</div>
</div>
</div>
</div>
<!-- Perks Panel -->
<div class="sheet-panel-box perks-panel">
<h5 class="panel-title" data-i18n="perks"></h5>
<fieldset class="repeating_perks">
<input class="ability-edit" type="checkbox" id="ability-edit" />
<div class="feature-accordion card-edit">
<input type="text" name="attr_perk_name" />
<textarea name="attr_perk_description"></textarea>
</div>
<div class="feature-accordion">
<div class="perk-feature-header">
<button class="feature-button" type="action" data-i18n-title="feature-share" name="act_perkfeatureshare">
<!-- speech balloon -->
&#128172;
</button>
<label><span name="attr_perk_name"></span>:</label>
<span name="attr_perk_description"></span>
</div>
</div>
</fieldset>
</div>
<!-- Titles Panel -->
<div class="sheet-panel-box titles-panel">
<h5 class="panel-title" data-i18n="titles"></h5>
<fieldset class="repeating_titles">
<input class="ability-edit" type="checkbox" id="ability-edit" />
<div class="feature-accordion card-edit">
<input type="text" name="attr_title_name" />
<textarea name="attr_title_description"></textarea>
</div>
<div class="feature-accordion">
<div class="title-feature-header">
<button class="feature-button" type="action" data-i18n-title="feature-share" name="act_titlefeatureshare">
<!-- speech balloon -->
&#128172;
</button>
<label><span name="attr_title_name"></span>:</label>
<span name="attr_title_description"></span>
</div>
</div>
</fieldset>
</div>
</div>
<!-- Abilities Panel-->
<div class="sheet-panel abilities-panel minimizable">
<div class="minimize-control">
<input id="abilities-minimize-checkbox" class="minimize" type="checkbox" checked />
<label for="abilities-minimize-checkbox" data-i18n="abilities"></label>
</div>
<!-- Ability Type Tabs -->
<input type="hidden" class="sheet-tabstoggle" name="attr_abilitiesTab" value="action" />
<div class="abilities-buttons">
<button type="action" name="act_action" class="sheet-button-action" data-i18n="main-action"></button>
<button type="action" name="act_maneuver" class="sheet-button-maneuver" data-i18n="maneuver"></button>
<button type="action" name="act_triggered" class="sheet-button-triggered" data-i18n="triggered-action"></button>
<button type="action" name="act_noaction" class="sheet-button-noaction" data-i18n="no-action-trait"></button>
<button type="action" name="act_move" class="sheet-button-move" data-i18n="move-action"></button>
</div>
<!-- Main Action Abilities -->
<div class="sheet-action">
<!-- Main Actions: repeating_abilities -->
<h2 data-i18n="main-actions"></h2>
<fieldset class="repeating_abilities">
<input class="ability-edit" type="checkbox" id="ability-edit" />
<div class="ability-card card-edit">
<input type="text" class="ability-name" data-i18n-placeholder="ability-name" name="attr_ability_name" />
<select class="ability-subtype-selector" name="attr_ability_subtype">
<option value="normal-ability" selected data-i18n="normal-ability"></option>
<option value="signature-ability" data-i18n="signature-ability"></option>
<option value="heroic-ability" data-i18n="heroic-ability"></option>
</select>
<div class="ability-heroic-cost grid-span-full">
<label><span data-i18n="ability-cost"></span>:</label>
<input type="number" placeholder="3" name="attr_ability_cost" />
</div>
<div class="ability-details grid-span-full">
<input type="text" class="ability-description" data-i18n-placeholder="ability-description" name="attr_ability_description" />
<input type="text" class="npc-ability-keywords" data-i18n-placeholder="keywords" name="attr_ability_keywords" />
<select class="ability-type" name="attr_ability_type">
<option value="no-action" selected data-i18n="no-action"></option>
<option value="main-action" data-i18n="main-action"></option>
<option value="maneuver" data-i18n="maneuver"></option>
<option value="free-maneuver" data-i18n="free-maneuver"></option>
<option value="move-action" data-i18n="move-action"></option>
<option value="triggered-action" data-i18n="triggered-action"></option>
<option value="free-triggered-action" data-i18n="free-triggered-action"></option>
</select>
<input type="text" class="ability-distance" data-i18n-placeholder="distance" name="attr_ability_distance" />
<input type="text" class="ability-target" data-i18n-placeholder="target" name="attr_ability_target" />
<textarea class="ability-trigger triggered-show grid-span-full" data-i18n-placeholder="trigger" name="attr_ability_trigger" spellcheck="false"></textarea>
<div class="power-roll">
<div class="power-roll-mods">
<input type="checkbox" name="attr_has_power_roll" />
<label data-i18n="power-roll"></label>
<span>+</span>
<select class="ability-type" name="attr_ability_characteristic">
<option value="might" data-i18n="might"></option>
<option value="agility" data-i18n="agility"></option>
<option value="reason" data-i18n="reason"></option>
<option value="intuition" data-i18n="intuition"></option>
<option value="presence" data-i18n="presence"></option>
</select>
<!-- <input type="checkbox" name="attr_has_potency" /> -->
<!-- <label data-i18n="potency"></label> -->
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_pre_effect" />
<label data-i18n="pre-effect"></label>
<textarea class="ability-pre-effect grid-span-full" data-i18n-placeholder="pre-effect" name="attr_ability_pre_effect" spellcheck="false"></textarea>
</div>
</div>
<div class="tier-row tier-1">
<label class="sublabel">≤ 11</label>
<input type="text" class="power-roll-tier-effect" name="attr_ability_tier_1" />
<!-- <div class="potency-tier-1"> -->
<!-- <select class="ability-type" name="attr_potency_characteristic"> -->
<!-- <option value="" ></option> -->
<!-- <option value="M" data-i18n="M" selected></option> -->
<!-- <option value="A" data-i18n="A"></option> -->
<!-- <option value="R" data-i18n="R"></option> -->
<!-- <option value="I" data-i18n="I"></option> -->
<!-- <option value="P" data-i18n="P"></option> -->
<!-- </select> -->
<!-- &lt; [weak] -->
<!-- <input type="text" class="power-roll-tier-effect" name="attr_potency_tier_1" /> -->
<!-- </div> -->
</div>
<div class="tier-row tier-2">
<label class="sublabel">12-16</label>
<input type="text" class="power-roll-tier-effect" name="attr_ability_tier_2" />
<!-- <div class="potency-tier-2"> -->
<!-- <select class="ability-type" name="attr_potency_characteristic"> -->
<!-- <option value="" ></option> -->
<!-- <option value="M" data-i18n="M" selected></option> -->
<!-- <option value="A" data-i18n="A"></option> -->
<!-- <option value="R" data-i18n="R"></option> -->
<!-- <option value="I" data-i18n="I"></option> -->
<!-- <option value="P" data-i18n="P"></option> -->
<!-- </select> -->
<!-- &lt; [average] -->
<!-- <input type="text" class="power-roll-tier-effect" name="attr_potency_tier_2" /> -->
<!-- </div> -->
</div>
<div class="tier-row tier-3">
<label class="sublabel">17+</label>
<input type="text" class="power-roll-tier-effect" name="attr_ability_tier_3" />
<!-- <div class="potency-tier-3"> -->
<!-- <select class="ability-type" name="attr_potency_characteristic"> -->
<!-- <option value="" ></option> -->
<!-- <option value="M" data-i18n="M" selected></option> -->
<!-- <option value="A" data-i18n="A"></option> -->
<!-- <option value="R" data-i18n="R"></option> -->
<!-- <option value="I" data-i18n="I"></option> -->
<!-- <option value="P" data-i18n="P"></option> -->
<!-- </select> -->
<!-- &lt; [strong] -->
<!-- <input type="text" class="power-roll-tier-effect" name="attr_potency_tier_3" /> -->
<!-- </div> -->
</div>
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_effect" />
<label data-i18n="effect"></label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="effect" name="attr_ability_effect" spellcheck="false"></textarea>
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_spend" />
<label data-i18n="spend"></label>
<div class="grid-span-full">
<label data-i18n="ability-cost"></label>
<input type="text" name="attr_ability_spend_cost" />
</div>
<textarea class="ability-malice" data-i18n-placeholder="spend" name="attr_ability_spend" spellcheck="false"></textarea>
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_custom" />
<label data-i18n="custom"></label>
<div class="grid-span-full">
<label data-i18n="label"></label>
<input type="text" data-i18n-placeholder="label" name="attr_ability_custom_label" />
</div>
<textarea class="ability-custom" data-i18n-placeholder="custom-text" name="attr_ability_custom" spellcheck="false"></textarea>
</div>
</div>
</div>
<div class="ability-card card-display">
<button class="ability-share-button" type="action" data-i18n-title="ability-share" name="act_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_ability_name"></span>
<input id="ability-subtype-selector" type="hidden" name="attr_ability_subtype" />
<div class="ability-subtype heroic-show">
<span data-i18n="ability-cost"></span>:&nbsp;<span name="attr_ability_cost"></span>
</div>
<span class="ability-subtype subtype-hide" name="attr_ability_subtype" data-i18n-dynamic></span>
<div class="ability-details details-hide grid-span-full">
<span class="ability-description" name="attr_ability_description"></span>
<input type="hidden" name="attr_ability_type" value="main-action"/>
<span class="npc-ability-keywords" name="attr_ability_keywords"></span>
<div class="ability-type"><span name="attr_ability_type" data-i18n-dynamic></span></div>
<div class="ability-distance">&#128208;<span name="attr_ability_distance" ></span></div>
<div class="ability-target">&#127919;<span name="attr_ability_target" ></span></div>
<div class="ability-trigger grid-span-full">
<label><span data-i18n="trigger"></span>:</label>
<span name="attr_ability_trigger"></span>
</div>
</div>
<input type="hidden" name="attr_has_pre_effect" />
<div class="ability-pre-effect grid-span-full">
<label><span data-i18n="pre-effect"></span>:</label>
<span class="ability-pre-effect" name="attr_ability_pre_effect"></span>
</div>
<input type="hidden" name="attr_has_power_roll" />
<div class="power-roll">
<div class="power-roll-mods">
<button type="action" data-i18n-title="power-roll-share" name="act_power-roll-share">
<!-- Dice pic -->
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
</button>
<label>2d10</label>
<span>+</span>
<span class="power-roll-characteristic" data-i18n-dynamic name="attr_ability_characteristic" ></span>
</div>
<label class="sublabel">≤ 11</label>
<span class="power-roll-tier-effect" name="attr_ability_tier_1" ></span>
<label class="sublabel">12-16</label>
<span class="power-roll-tier-effect" name="attr_ability_tier_2" ></span>
<label class="sublabel">17+</label>
<span class="power-roll-tier-effect" name="attr_ability_tier_3" ></span>
</div>
<input type="hidden" name="attr_has_effect" />
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_ability_effect"></span>
</div>
<input type="hidden" name="attr_has_spend" />
<div class="npc-ability-malice grid-span-full">
<label><span data-i18n="spend"></span>&nbsp;<span name="attr_ability_spend_cost"></span>:</label>
<span class="ability-malice" name="attr_ability_spend"></span>
</div>
<input type="hidden" name="attr_has_custom" />
<div class="npc-ability-custom grid-span-full">
<label><span name="attr_ability_custom_label"></span>:</label>
<span class="ability-custom" name="attr_ability_custom"></span>
</div>
</div>
</fieldset>
<!-- Standard Abilities -->
<h5 class="panel-title" data-i18n="standard-main-actions"></h5>
<div class="standard-abilities">
<!-- Melee Free Strike Ability -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="melee-free-strike" name="attr_melee_free_strike_name" data-i18n="melee-free-strike" spellcheck="false"></textarea>
<div class="ability-details grid-span-full">
<textarea class="ability-effect" data-i18n-placeholder="melee-free-strike-keywords" name="attr_melee_free_strike_keywords" data-i18n="melee-free-strike-keywords" spellcheck="false"></textarea>
<input type="hidden" name="attr_melee_free_strike_type" value="main-action" />
<div class="ability-type">
<span data-i18n="main-action"></span>
</div>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="melee-one" name="attr_melee_free_strike_distance" data-i18n="melee-one" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="one-creature-object" name="attr_melee_free_strike_target" data-i18n="one-creature-object" spellcheck="false"></textarea>
<input type="hidden" name="attr_melee_free_strike_has_power_roll" value="on" />
<div class="power-roll">
<div class="power-roll-mods">
<label data-i18n="power-roll"></label>
<span>+</span>
<select class="power-roll-characteristic" name="attr_melee_free_strike_characteristic">
<option value="might" data-i18n="might"></option>
<option value="agility" data-i18n="agility"></option>
<option value="reason" data-i18n="reason"></option>
<option value="intuition" data-i18n="intuition"></option>
<option value="presence" data-i18n="presence"></option>
</select>
</div>
<label class="sublabel">≤11</label>
<textarea class="ability-effect" data-i18n-placeholder="melee-free-strike-tier1" name="attr_melee_free_strike_tier_1" data-i18n="melee-free-strike-tier1" spellcheck="false"></textarea>
<label class="sublabel">12-16</label>
<textarea class="ability-effect" data-i18n-placeholder="melee-free-strike-tier2" name="attr_melee_free_strike_tier_2" data-i18n="melee-free-strike-tier2" spellcheck="false"></textarea>
<label class="sublabel">17+</label>
<textarea class="ability-effect" data-i18n-placeholder="melee-free-strike-tier3" name="attr_melee_free_strike_tier_3" data-i18n="melee-free-strike-tier3" spellcheck="false"></textarea>
</div>
</div>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_melee_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_melee_free_strike_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" name="attr_melee_free_strike_keywords"></span>
<span class="ability-type" data-i18n="main-action"></span>
<span class="ability-distance" name="attr_melee_free_strike_distance" ></span>
<span class="ability-target" name="attr_melee_free_strike_target" ></span>
<div class="power-roll">
<div class="power-roll-mods">
<label>2d10</label>
<span>+</span>
<span class="power-roll-characteristic" data-i18n-dynamic name="attr_melee_free_strike_characteristic" ></span>
<button type="action" data-i18n-title="power-roll-share" name="act_melee_power_roll_share">
<!-- Dice pic -->
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
</button>
</div>
<label class="sublabel">≤ 11</label>
<span class="power-roll-tier-effect" name="attr_melee_free_strike_tier_1" ></span>
<label class="sublabel">12-16</label>
<span type="text" class="power-roll-tier-effect" name="attr_melee_free_strike_tier_2" ></span>
<label class="sublabel">17+</label>
<span type="text" class="power-roll-tier-effect" name="attr_melee_free_strike_tier_3" ></span>
</div>
</div>
</div>
</div>
<!-- Ranged Free Strike Ability -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="ranged-free-strike" name="attr_ranged_free_strike_name" data-i18n="ranged-free-strike" spellcheck="false"></textarea>
<div class="ability-details grid-span-full">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="ranged-free-strike-keywords" name="attr_ranged_free_strike_keywords" data-i18n="ranged-free-strike-keywords" spellcheck="false"></textarea>
<input type="hidden" name="attr_ranged_free_strike_type" value="main-action" />
<div class="ability-type">
<span data-i18n="main-action"></span>
</div>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="ranged-five" name="attr_ranged_free_strike_distance" data-i18n="ranged-five" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="one-creature-object" name="attr_ranged_free_strike_target" data-i18n="one-creature-object" spellcheck="false"></textarea>
<input type="hidden" name="attr_ranged_free_strike_has_power_roll" value="on" />
<div class="power-roll">
<div class="power-roll-mods">
<label data-i18n="power-roll"></label>
<span>+</span>
<select class="power-roll-characteristic" name="attr_ranged_free_strike_characteristic">
<option value="might" data-i18n="might"></option>
<option value="agility" data-i18n="agility"></option>
<option value="reason" data-i18n="reason"></option>
<option value="intuition" data-i18n="intuition"></option>
<option value="presence" data-i18n="presence"></option>
</select>
</div>
<label class="sublabel">≤11</label>
<textarea class="ability-effect" data-i18n-placeholder="ranged-free-strike-tier1" name="attr_ranged_free_strike_tier_1" data-i18n="ranged-free-strike-tier1" spellcheck="false"></textarea>
<label class="sublabel">12-16</label>
<textarea class="ability-effect" data-i18n-placeholder="ranged-free-strike-tier2" name="attr_ranged_free_strike_tier_2" data-i18n="ranged-free-strike-tier2" spellcheck="false"></textarea>
<label class="sublabel">17+</label>
<textarea class="ability-effect" data-i18n-placeholder="ranged-free-strike-tier3" name="attr_ranged_free_strike_tier_3" data-i18n="ranged-free-strike-tier3" spellcheck="false"></textarea>
</div>
</div>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_ranged_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_ranged_free_strike_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" name="attr_ranged_free_strike_keywords"></span>
<span class="ability-type" data-i18n="main-action"></span>
<span class="ability-distance" name="attr_ranged_free_strike_distance" ></span>
<span class="ability-target" name="attr_ranged_free_strike_target" ></span>
<div class="power-roll">
<div class="power-roll-mods">
<label>2d10</label>
<span>+</span>
<span class="power-roll-characteristic" data-i18n-dynamic name="attr_ranged_free_strike_characteristic" ></span>
<button type="action" data-i18n-title="power-roll-share" name="act_ranged_power_roll_share">
<!-- Dice pic -->
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
</button>
</div>
<label class="sublabel">≤ 11</label>
<span class="power-roll-tier-effect" name="attr_ranged_free_strike_tier_1" ></span>
<label class="sublabel">12-16</label>
<span type="text" class="power-roll-tier-effect" name="attr_ranged_free_strike_tier_2" ></span>
<label class="sublabel">17+</label>
<span type="text" class="power-roll-tier-effect" name="attr_ranged_free_strike_tier_3" ></span>
</div>
</div>
</div>
</div>
<!-- Charge Main Action -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="charge" name="attr_charge_name" data-i18n="charge" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="charge-keywords" name="attr_charge_keywords" value="" />
<input type="hidden" name="attr_charge_type" value="Main Action" />
<textarea class="ability-effect grid-span-full" data-i18n="charge-effect" name="attr_charge_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_charge_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_charge_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" name="attr_charge_keywords"></span>
<span class="ability-type" data-i18n="main-action"></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_charge_effect"></span>
</div>
</div>
</div>
</div>
<!-- Defend Main Action -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-name grid-span-full" data-i18n-placeholder="defend" name="attr_defend_name" data-i18n="defend" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="defend-keywords" name="attr_defend_keywords" value="" />
<input type="hidden" name="attr_defend_type" value="Main Action" />
<textarea class="ability-effect grid-span-full" data-i18n="defend-effect" name="attr_defend_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_defend_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_defend_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" data-i18n-placeholder="defend" name="attr_defend_keywords"></span>
<span class="ability-type" data-i18n="main-action"></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_defend_effect"></span>
</div>
</div>
</div>
</div>
<!-- Heal Main Action -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="heal" name="attr_heal_name" data-i18n="heal" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="heal-keywords" name="attr_heal_keywords" value="" />
<input type="hidden" name="attr_heal_type" value="Main Action" />
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="melee-one" name="attr_heal_distance" data-i18n="melee-one" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="one-creature" name="attr_heal_target" data-i18n="one-creature" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n="heal-effect" name="attr_heal_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_heal_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_heal_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" name="attr_heal_keywords"></span>
<span class="ability-type" data-i18n="main-action"></span>
<span class="ability-distance read-ability-distance" name="attr_heal_distance" ></span>
<span class="ability-target read-ability-target" name="attr_heal_target" ></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_heal_effect"></span>
</div>
</div>
</div>
</div>
<!-- Convert Main Action -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="convert" name="attr_convert_name" data-i18n="convert" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="convert-keywords" name="attr_convert_keywords" value="" />
<input type="hidden" name="attr_convert_type" value="Main Action" />
<textarea class="ability-effect grid-span-full" data-i18n="convert-effect" name="attr_convert_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_convert_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_convert_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" data-i18n-placeholder="convert" name="attr_convert_keywords"></span>
<span class="ability-type" data-i18n="main-action"></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_convert_effect"></span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Maneuver Abilities -->
<div class="sheet-maneuver">
<!-- Maneuvers: repeating_maneuvers -->
<h2 data-i18n="maneuvers"></h2>
<fieldset class="repeating_maneuvers">
<input class="ability-edit" type="checkbox" id="ability-edit" />
<div class="ability-card card-edit">
<input type="text" class="ability-name" data-i18n-placeholder="ability-name" name="attr_maneuver_name" />
<select class="ability-subtype-selector" name="attr_maneuver_subtype">
<option value="normal-ability" selected data-i18n="normal-ability"></option>
<option value="signature-ability" data-i18n="signature-ability"></option>
<option value="heroic-ability" data-i18n="heroic-ability"></option>
</select>
<div class="ability-heroic-cost grid-span-full">
<label><span data-i18n="ability-cost"></span>:</label>
<input type="number" placeholder="3" name="attr_maneuver_cost" />
</div>
<div class="ability-details grid-span-full">
<input type="text" class="ability-description" data-i18n-placeholder="ability-description" name="attr_maneuver_description" />
<input type="text" class="npc-ability-keywords" data-i18n-placeholder="keywords" name="attr_maneuver_keywords" />
<select class="ability-type" name="attr_maneuver_type">
<option value="maneuver" data-i18n="maneuver" selected></option>
<option value="free-maneuver" data-i18n="free-maneuver"></option>
</select>
<input type="text" class="ability-distance" data-i18n-placeholder="distance" name="attr_maneuver_distance" />
<input type="text" class="ability-target" data-i18n-placeholder="target" name="attr_maneuver_target" />
<textarea class="ability-trigger triggered-show grid-span-full" data-i18n-placeholder="trigger" name="attr_maneuver_trigger" spellcheck="false"></textarea>
<div class="power-roll">
<div class="power-roll-mods">
<input type="checkbox" name="attr_has_power_roll" />
<label data-i18n="power-roll"></label>
<span>+</span>
<select class="ability-type" name="attr_maneuver_characteristic">
<option value="might" data-i18n="might"></option>
<option value="agility" data-i18n="agility"></option>
<option value="reason" data-i18n="reason"></option>
<option value="intuition" data-i18n="intuition"></option>
<option value="presence" data-i18n="presence"></option>
</select>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_pre_effect" />
<label data-i18n="pre-effect"></label>
<textarea class="ability-pre-effect grid-span-full" data-i18n-placeholder="pre-effect" name="attr_maneuver_pre_effect" spellcheck="false"></textarea>
</div>
</div>
<label class="sublabel">≤ 11</label>
<input type="text" class="power-roll-tier-effect" name="attr_maneuver_tier_1" />
<label class="sublabel">12-16</label>
<input type="text" class="power-roll-tier-effect" name="attr_maneuver_tier_2" />
<label class="sublabel">17+</label>
<input type="text" class="power-roll-tier-effect" name="attr_maneuver_tier_3" />
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_effect" />
<label data-i18n="effect"></label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="effect" name="attr_maneuver_effect" spellcheck="false"></textarea>
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_spend" />
<label data-i18n="spend"></label>
<div class="grid-span-full">
<label data-i18n="ability-cost"></label>
<input type="text" name="attr_maneuver_spend_cost" />
</div>
<textarea class="ability-malice" data-i18n-placeholder="spend" name="attr_maneuver_spend" spellcheck="false"></textarea>
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_custom" />
<label data-i18n="custom"></label>
<div class="grid-span-full">
<label data-i18n="label"></label>
<input type="text" data-i18n-placeholder="label" name="attr_maneuver_custom_label" />
</div>
<textarea class="ability-custom" data-i18n-placeholder="custom-text" name="attr_maneuver_custom" spellcheck="false"></textarea>
</div>
</div>
</div>
<div class="ability-card card-display">
<button class="ability-share-button" type="action" data-i18n-title="ability-share" name="act_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_maneuver_name"></span>
<input id="ability-subtype-selector" type="hidden" name="attr_maneuver_subtype" />
<div class="ability-subtype heroic-show">
<span data-i18n="ability-cost"></span>:&nbsp;<span name="attr_maneuver_cost"></span>
</div>
<span class="ability-subtype subtype-hide" name="attr_maneuver_subtype" data-i18n-dynamic></span>
<div class="ability-details details-hide grid-span-full">
<span class="ability-description" name="attr_maneuver_description"></span>
<input type="hidden" name="attr_maneuver_type" value="maneuver" />
<span class="npc-ability-keywords" name="attr_maneuver_keywords"></span>
<div class="ability-type"><span name="attr_maneuver_type" data-i18n-dynamic></span></div>
<div class="ability-distance">&#128208;<span name="attr_maneuver_distance" ></span></div>
<div class="ability-target">&#127919;<span name="attr_maneuver_target" ></span></div>
<div class="ability-trigger grid-span-full">
<label><span data-i18n="trigger"></span>:</label>
<span name="attr_maneuver_trigger"></span>
</div>
</div>
<input type="hidden" name="attr_has_pre_effect" />
<div class="ability-pre-effect grid-span-full">
<label><span data-i18n="pre-effect"></span>:</label>
<span class="ability-pre-effect" name="attr_maneuver_pre_effect"></span>
</div>
<input type="hidden" name="attr_has_power_roll" />
<div class="power-roll">
<div class="power-roll-mods">
<button type="action" data-i18n-title="power-roll-share" name="act_power-roll-share">
<!-- Dice pic -->
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
</button>
<label>2d10</label>
<span>+</span>
<span class="power-roll-characteristic" data-i18n-dynamic name="attr_maneuver_characteristic" ></span>
</div>
<label class="sublabel">≤ 11</label>
<span class="power-roll-tier-effect" name="attr_maneuver_tier_1" ></span>
<label class="sublabel">12-16</label>
<span class="power-roll-tier-effect" name="attr_maneuver_tier_2" ></span>
<label class="sublabel">17+</label>
<span class="power-roll-tier-effect" name="attr_maneuver_tier_3" ></span>
</div>
<input type="hidden" name="attr_has_effect" />
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_maneuver_effect"></span>
</div>
<input type="hidden" name="attr_has_spend" />
<div class="npc-ability-malice grid-span-full">
<label><span data-i18n="spend"></span>&nbsp;<span name="attr_maneuver_spend_cost"></span>:</label>
<span class="ability-malice" name="attr_maneuver_spend"></span>
</div>
<input type="hidden" name="attr_has_custom" />
<div class="npc-ability-custom grid-span-full">
<label><span name="attr_maneuver_custom_label"></span>:</label>
<span class="ability-custom" name="attr_maneuver_custom"></span>
</div>
</div>
</fieldset>
<!-- Standard Maneuvers -->
<h5 class="panel-title" data-i18n="standard-maneuvers"></h5>
<div class="standard-abilities">
<!-- Knockback -->
<div class="standard-abilities-item">
<input type="hidden" name="attr_knockback_type" value="maneuver" />
<input type="hidden" name="attr_knockback_has_power_roll" value="on" />
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<div class="ability-details grid-span-full">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="knockback" data-i18n="knockback" name="attr_knockback_name" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="keywords" data-i18n="knockback-keywords" name="attr_knockback_keywords" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" data-i18n="melee-one" name="attr_knockback_distance" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" data-i18n="one-creature" name="attr_knockback_target" spellcheck="false"></textarea>
<div class="power-roll">
<div class="power-roll-mods">
<label data-i18n="power-roll"></label>
<span>+</span>
<select class="ability-type" name="attr_knockback_characteristic">
<option value="might" data-i18n="might"></option>
<option value="intuition" data-i18n="intuition"></option>
</select>
</div>
<label class="sublabel">≤ 11</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="knockback-tier1" data-i18n="knockback-tier1" name="attr_knockback_tier_1" spellcheck="false"></textarea>
<label class="sublabel">12-16</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="knockback-tier2" data-i18n="knockback-tier2" name="attr_knockback_tier_2" spellcheck="false"></textarea>
<label class="sublabel">17+</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="knockback-tier3" data-i18n="knockback-tier3" name="attr_knockback_tier_3" spellcheck="false"></textarea>
</div>
<textarea class="ability-effect grid-span-full" data-i18n="knockback-effect" name="attr_knockback_effect" spellcheck="false"></textarea>
</div>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_knockback_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" data-i18n-placeholder="Knockback" name="attr_knockback_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" data-i18n-placeholder="knockback-keywords" name="attr_knockback_keywords"></span>
<span class="ability-type" data-i18n="maneuver"></span>
<span class="ability-distance" data-i18n-placeholder="Distance" name="attr_knockback_distance" ></span>
<span class="ability-target" data-i18n-placeholder="Target" name="attr_knockback_target" ></span>
<div class="power-roll">
<div class="power-roll-mods">
<label>2d10</label>
<span>+</span>
<span class="power-roll-characteristic" data-i18n-dynamic name="attr_knockback_characteristic" ></span>
<button type="action" data-i18n-title="power-roll-share" name="act_knockback_power_roll_share">
<!-- Dice pic -->
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
</button>
</div>
<label class="sublabel">≤ 11</label>
<span class="power-roll-tier-effect" data-i18n-placeholder="Tier 1 effect" name="attr_knockback_tier_1" ></span>
<label class="sublabel">12-16</label>
<span type="text" class="power-roll-tier-effect" data-i18n-placeholder="Tier 2 effect" name="attr_knockback_tier_2" ></span>
<label class="sublabel">17+</label>
<span type="text" class="power-roll-tier-effect" data-i18n-placeholder="Tier 3 effect" name="attr_knockback_tier_3" ></span>
</div>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_knockback_effect"></span>
</div>
</div>
</div>
</div>
<!-- Grab -->
<div class="standard-abilities-item">
<input type="hidden" name="attr_grab_type" value="maneuver" />
<input type="hidden" name="attr_grab_has_power_roll" value="on" />
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<div class="ability-details grid-span-full">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="grab" data-i18n="grab" name="attr_grab_name" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="keywords" data-i18n="grab-keywords" name="attr_grab_keywords" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" data-i18n="melee-one" name="attr_grab_distance" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" data-i18n="one-creature" name="attr_grab_target" spellcheck="false"></textarea>
<div class="power-roll">
<div class="power-roll-mods">
<label data-i18n="power-roll"></label>
<span>+</span>
<select class="ability-type" name="attr_grab_characteristic">
<option value="might" data-i18n="might"></option>
<option value="intuition" data-i18n="intuition"></option>
</select>
</div>
<label class="sublabel">≤ 11</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="grab-tier1" data-i18n="grab-tier1" name="attr_grab_tier_1" spellcheck="false"></textarea>
<label class="sublabel">12-16</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="grab-tier2" data-i18n="grab-tier2" name="attr_grab_tier_2" spellcheck="false"></textarea>
<label class="sublabel">17+</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="grab-tier3" data-i18n="grab-tier3" name="attr_grab_tier_3" spellcheck="false"></textarea>
</div>
<textarea class="ability-effect grid-span-full" data-i18n="grab-effect" name="attr_grab_effect" spellcheck="false"></textarea>
</div>
</div>
<div class="ability-card card-display">
<button type="action" data-i18n-title="ability-share" name="act_grab_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" data-i18n-placeholder="Grab" name="attr_grab_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" data-i18n-placeholder="grab-keywords" name="attr_grab_keywords"></span>
<span class="ability-type" data-i18n="maneuver"></span>
<span class="ability-distance" data-i18n-placeholder="Distance" name="attr_grab_distance" ></span>
<span class="ability-target" data-i18n-placeholder="Target" name="attr_grab_target" ></span>
<div class="power-roll">
<div class="power-roll-mods">
<label>2d10</label>
<span>+</span>
<span class="power-roll-characteristic" data-i18n-dynamic name="attr_grab_characteristic" ></span>
<button type="action" data-i18n-title="power-roll-share" name="act_grab_power_roll_share">
<!-- Dice pic -->
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
</button>
</div>
<label class="sublabel">≤ 11</label>
<span class="power-roll-tier-effect" name="attr_grab_tier_1" ></span>
<label class="sublabel">12-16</label>
<span type="text" class="power-roll-tier-effect" name="attr_grab_tier_2" ></span>
<label class="sublabel">17+</label>
<span type="text" class="power-roll-tier-effect" name="attr_grab_tier_3" ></span>
</div>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_grab_effect"></span>
</div>
</div>
</div>
</div>
<!-- Escape Grab -->
<div class="standard-abilities-item">
<input type="hidden" name="attr_escape_grab_type" value="maneuver" />
<input type="hidden" name="attr_escape_grab_has_power_roll" value="on" />
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<div class="ability-details grid-span-full">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="escape-grab" data-i18n="escape-grab" name="attr_escape_grab_name" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" data-i18n="self" name="attr_escape_grab_distance" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" data-i18n="self" name="attr_escape_grab_target" spellcheck="false"></textarea>
<div class="power-roll">
<div class="power-roll-mods">
<label data-i18n="power-roll"></label>
<span>+</span>
<select class="ability-type" name="attr_escape_grab_characteristic">
<option value="might" data-i18n="might"></option>
<option value="agility" data-i18n="agility"></option>
</select>
</div>
<label class="sublabel">≤ 11</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="escape-grab-tier1" data-i18n="escape-grab-tier1" name="attr_escape_grab_tier_1" spellcheck="false"></textarea>
<label class="sublabel">12-16</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="escape-grab-tier2" data-i18n="escape-grab-tier2" name="attr_escape_grab_tier_2" spellcheck="false"></textarea>
<label class="sublabel">17+</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="escape-grab-tier3" data-i18n="escape-grab-tier3" name="attr_escape_grab_tier_3" spellcheck="false"></textarea>
</div>
<textarea class="ability-effect grid-span-full" data-i18n="escape-grab-effect" name="attr_escape_grab_effect" spellcheck="false"></textarea>
</div>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_escape_grab_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" data-i18n-placeholder="Escape Grab" name="attr_escape_grab_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" data-i18n-placeholder="escape-grab-keywords" name="attr_escape_grab_keywords"></span>
<span class="ability-type" data-i18n="maneuver"></span>
<span class="ability-distance" data-i18n-placeholder="Distance" name="attr_escape_grab_distance" ></span>
<span class="ability-target" data-i18n-placeholder="Target" name="attr_escape_grab_target" ></span>
<div class="power-roll">
<div class="power-roll-mods">
<label>2d10</label>
<span>+</span>
<span class="power-roll-characteristic" data-i18n-dynamic name="attr_escape_grab_characteristic" ></span>
<button type="action" data-i18n-title="power-roll-share" name="act_escape_grab_power_roll_share">
<!-- Dice pic -->
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
</button>
</div>
<label class="sublabel">≤ 11</label>
<span class="power-roll-tier-effect" data-i18n-placeholder="Tier 1 effect" name="attr_escape_grab_tier_1" ></span>
<label class="sublabel">12-16</label>
<span type="text" class="power-roll-tier-effect" data-i18n-placeholder="Tier 2 effect" name="attr_escape_grab_tier_2" ></span>
<label class="sublabel">17+</label>
<span type="text" class="power-roll-tier-effect" data-i18n-placeholder="Tier 3 effect" name="attr_escape_grab_tier_3" ></span>
</div>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_escape_grab_effect"></span>
</div>
</div>
</div>
</div>
<!-- Claw Dirt Maneuver -->
<div class="standard-abilities-item">
<input type="hidden" name="attr_claw_dirt_type" value="maneuver" />
<input type="hidden" name="attr_claw_dirt_has_power_roll" value="on" />
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<div class="ability-details grid-span-full">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="claw-dirt" data-i18n="claw-dirt" name="attr_claw_dirt_name" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" data-i18n="self" name="attr_claw_dirt_distance" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" data-i18n="self" name="attr_claw_dirt_target" spellcheck="false"></textarea>
<div class="power-roll">
<div class="power-roll-mods">
<label data-i18n="power-roll"></label>
<span>+</span>
<select class="ability-type" name="attr_claw_dirt_characteristic">
<option value="might" data-i18n="might"></option>
</select>
</div>
<label class="sublabel">≤ 11</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="claw-dirt-tier1" data-i18n="claw-dirt-tier1" name="attr_claw_dirt_tier_1" spellcheck="false"></textarea>
<label class="sublabel">12-16</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="claw-dirt-tier2" data-i18n="claw-dirt-tier2" name="attr_claw_dirt_tier_2" spellcheck="false"></textarea>
<label class="sublabel">17+</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="claw-dirt-tier3" data-i18n="claw-dirt-tier3" name="attr_claw_dirt_tier_3" spellcheck="false"></textarea>
</div>
</div>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_claw_dirt_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_claw_dirt_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" name="attr_claw_dirt_keywords"></span>
<span class="ability-type" data-i18n="maneuver"></span>
<span class="ability-distance" name="attr_claw_dirt_distance" ></span>
<span class="ability-target" name="attr_claw_dirt_target" ></span>
<div class="power-roll">
<div class="power-roll-mods">
<label>2d10</label>
<span>+</span>
<span class="power-roll-characteristic" data-i18n-dynamic name="attr_claw_dirt_characteristic" ></span>
<button type="action" data-i18n-title="power-roll-share" name="act_claw_dirt_power_roll_share">
<!-- Dice pic -->
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
</button>
</div>
<label class="sublabel">≤ 11</label>
<span class="power-roll-tier-effect" name="attr_claw_dirt_tier_1" ></span>
<label class="sublabel">12-16</label>
<span class="power-roll-tier-effect" name="attr_claw_dirt_tier_2" ></span>
<label class="sublabel">17+</label>
<span class="power-roll-tier-effect" name="attr_claw_dirt_tier_3" ></span>
</div>
<span class="ability-effect grid-span-full" name="attr_claw_dirt_effect"></span>
</div>
</div>
</div>
<!-- Aid Attack -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="aid-attack" name="attr_aid_attack_name" data-i18n="aid-attack" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="heal-keywords" name="attr_aid_attack_keywords" value="" />
<input type="hidden" name="attr_aid_attack_type" value="maneuver" />
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" name="attr_aid_attack_distance" data-i18n="melee-one" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" name="attr_aid_attack_target" data-i18n="one-enemy" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n="aid-attack-effect" name="attr_aid_attack_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_aid_attack_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" data-i18n-placeholder="Aid Attack" name="attr_aid_attack_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" data-i18n-placeholder="aid-attack-keywords" name="attr_aid_attack_keywords"></span>
<span class="ability-type" data-i18n="maneuver"></span>
<span class="ability-distance" data-i18n-placeholder="Distance" name="attr_aid_attack_distance" ></span>
<span class="ability-target" data-i18n-placeholder="Target" name="attr_aid_attack_target" ></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_aid_attack_effect"></span>
</div>
</div>
</div>
</div>
<!-- Catch Breath -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="catch-breath" name="attr_catch_breath_name" data-i18n="catch-breath" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="catch-breath-keywords" name="attr_catch_breath_keywords" value="" />
<input type="hidden" name="attr_catch_breath_type" value="maneuver" />
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" name="attr_catch_breath_distance" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" name="attr_catch_breath_target" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n="catch-breath-effect" name="attr_catch_breath_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_catch_breath_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" data-i18n-placeholder="Catch Breath" name="attr_catch_breath_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" name="attr_catch_breath_keywords"></span>
<span class="ability-type" data-i18n="maneuver"></span>
<span class="ability-distance" name="attr_catch_breath_distance" ></span>
<span class="ability-target" name="attr_catch_breath_target" ></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_catch_breath_effect"></span>
</div>
</div>
</div>
</div>
<!-- Hide Maneuver -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="hide" name="attr_hide_name" data-i18n="hide" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="hide-keywords" name="attr_hide_keywords" value="" />
<input type="hidden" name="attr_hide_type" value="maneuver" />
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" name="attr_hide_distance" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" name="attr_hide_target" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n="hide-effect" name="attr_hide_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_hide_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_hide_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" name="attr_hide_keywords"></span>
<span class="ability-type" data-i18n="maneuver"></span>
<span class="ability-distance" name="attr_hide_distance" ></span>
<span class="ability-target" name="attr_hide_target" ></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_hide_effect"></span>
</div>
</div>
</div>
</div>
<!-- Search Maneuver -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="search" name="attr_search_name" data-i18n="search" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="search-keywords" name="attr_search_keywords" value="" />
<input type="hidden" name="attr_search_type" value="maneuver" />
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" name="attr_search_distance" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" name="attr_search_target" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n="search-effect" name="attr_search_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_search_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_search_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" name="attr_search_keywords"></span>
<span class="ability-type" data-i18n="maneuver"></span>
<span class="ability-distance" name="attr_search_distance" ></span>
<span class="ability-target" name="attr_search_target" ></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_search_effect"></span>
</div>
</div>
</div>
</div>
<!-- Stand Up -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="stand-up" name="attr_standup_name" data-i18n="stand-up" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="stand-up-keywords" name="attr_standup_keywords" value="" />
<input type="hidden" name="attr_standup_type" value="maneuver" />
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" name="attr_standup_distance" data-i18n="self-melee-one" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" name="attr_standup_target" data-i18n="self-one-creature" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n="stand-up-effect" name="attr_standup_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_standup_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_standup_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" name="attr_standup_keywords"></span>
<span class="ability-type" data-i18n="maneuver"></span>
<span class="ability-distance" name="attr_standup_distance" ></span>
<span class="ability-target" name="attr_standup_target" ></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_standup_effect"></span>
</div>
</div>
</div>
</div>
<!-- Use Consumable -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="consumable" name="attr_consumable_name" data-i18n="consumable" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="consumable-keywords" name="attr_consumable_keywords" value="" />
<input type="hidden" name="attr_consumable_type" value="maneuver" />
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" name="attr_consumable_distance" data-i18n="self-melee-one" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" name="attr_consumable_target" data-i18n="self-one-creature" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n="consumable-effect" name="attr_consumable_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_consumable_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_consumable_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" name="attr_consumable_keywords"></span>
<span class="ability-type" data-i18n="maneuver"></span>
<span class="ability-distance" name="attr_consumable_distance" ></span>
<span class="ability-target" name="attr_consumable_target" ></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_consumable_effect"></span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Triggered Abilities-->
<div class="sheet-triggered">
<h2 data-i18n="triggered"></h2>
<!-- Triggered: repeating_triggered -->
<fieldset class="repeating_triggered">
<input class="ability-edit" type="checkbox" id="ability-edit" />
<div class="ability-card card-edit">
<input type="text" class="ability-name" data-i18n-placeholder="ability-name" name="attr_triggered_name" />
<select class="ability-subtype-selector" name="attr_triggered_subtype">
<option value="normal-ability" selected data-i18n="normal-ability"></option>
<option value="signature-ability" data-i18n="signature-ability"></option>
<option value="heroic-ability" data-i18n="heroic-ability"></option>
</select>
<div class="ability-heroic-cost grid-span-full">
<label><span data-i18n="ability-cost"></span>:</label>
<input type="number" placeholder="3" name="attr_triggered_cost" />
</div>
<div class="ability-details grid-span-full">
<input type="text" class="ability-description" data-i18n-placeholder="ability-description" name="attr_triggered_description" />
<input type="text" class="npc-ability-keywords" data-i18n-placeholder="keywords" name="attr_triggered_keywords" />
<select class="ability-type" name="attr_triggered_type">
<option value="triggered-action" data-i18n="triggered-action" selected></option>
<option value="free-triggered-action" data-i18n="free-triggered-action"></option>
</select>
<input type="text" class="ability-distance" data-i18n-placeholder="distance" name="attr_triggered_distance" />
<input type="text" class="ability-target" data-i18n-placeholder="target" name="attr_triggered_target" />
<textarea class="ability-trigger triggered-show grid-span-full" data-i18n-placeholder="trigger" name="attr_triggered_trigger" spellcheck="false"></textarea>
<div class="power-roll">
<div class="power-roll-mods">
<input type="checkbox" name="attr_has_power_roll" />
<label data-i18n="power-roll"></label>
<span>+</span>
<select class="ability-type" name="attr_triggered_characteristic">
<option value="might" data-i18n="might"></option>
<option value="agility" data-i18n="agility"></option>
<option value="reason" data-i18n="reason"></option>
<option value="intuition" data-i18n="intuition"></option>
<option value="presence" data-i18n="presence"></option>
</select>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_pre_effect" />
<label data-i18n="pre-effect"></label>
<textarea class="ability-pre-effect grid-span-full" data-i18n-placeholder="pre-effect" name="attr_triggered_pre_effect" spellcheck="false"></textarea>
</div>
</div>
<label class="sublabel">≤ 11</label>
<input type="text" class="power-roll-tier-effect" name="attr_triggered_tier_1" />
<label class="sublabel">12-16</label>
<input type="text" class="power-roll-tier-effect" name="attr_triggered_tier_2" />
<label class="sublabel">17+</label>
<input type="text" class="power-roll-tier-effect" name="attr_triggered_tier_3" />
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_effect" />
<label data-i18n="effect"></label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="effect" name="attr_triggered_effect" spellcheck="false"></textarea>
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_spend" />
<label data-i18n="spend"></label>
<div class="grid-span-full">
<label data-i18n="ability-cost"></label>
<input type="text" name="attr_triggered_spend_cost" />
</div>
<textarea class="ability-malice" data-i18n-placeholder="spend" name="attr_triggered_spend" spellcheck="false"></textarea>
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_custom" />
<label data-i18n="custom"></label>
<div class="grid-span-full">
<label data-i18n="label"></label>
<input type="text" data-i18n-placeholder="label" name="attr_triggered_custom_label" />
</div>
<textarea class="ability-custom" data-i18n-placeholder="custom-text" name="attr_triggered_custom" spellcheck="false"></textarea>
</div>
</div>
</div>
<div class="ability-card card-display">
<button class="ability-share-button" type="action" data-i18n-title="ability-share" name="act_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_triggered_name"></span>
<input id="ability-subtype-selector" type="hidden" name="attr_triggered_subtype" />
<div class="ability-subtype heroic-show">
<span data-i18n="ability-cost"></span>:&nbsp;<span name="attr_triggered_cost"></span>
</div>
<span class="ability-subtype subtype-hide" name="attr_triggered_subtype" data-i18n-dynamic></span>
<div class="ability-details details-hide grid-span-full">
<span class="ability-description" name="attr_triggered_description"></span>
<input type="hidden" name="attr_triggered_type" value="triggered-action" />
<span class="npc-ability-keywords" name="attr_triggered_keywords"></span>
<div class="ability-type"><span name="attr_triggered_type" data-i18n-dynamic></span></div>
<div class="ability-distance">&#128208;<span name="attr_triggered_distance" ></span></div>
<div class="ability-target">&#127919;<span name="attr_triggered_target" ></span></div>
<div class="ability-trigger grid-span-full">
<label><span data-i18n="trigger"></span>:</label>
<span name="attr_triggered_trigger"></span>
</div>
</div>
<input type="hidden" name="attr_has_pre_effect" />
<div class="ability-pre-effect grid-span-full">
<label><span data-i18n="pre-effect"></span>:</label>
<span class="ability-pre-effect" name="attr_triggered_pre_effect"></span>
</div>
<input type="hidden" name="attr_has_power_roll" />
<div class="power-roll">
<div class="power-roll-mods">
<button type="action" data-i18n-title="power-roll-share" name="act_power-roll-share">
<!-- Dice pic -->
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
</button>
<label>2d10</label>
<span>+</span>
<span class="power-roll-characteristic" data-i18n-dynamic name="attr_triggered_characteristic" ></span>
</div>
<label class="sublabel">≤ 11</label>
<span class="power-roll-tier-effect" name="attr_triggered_tier_1" ></span>
<label class="sublabel">12-16</label>
<span class="power-roll-tier-effect" name="attr_triggered_tier_2" ></span>
<label class="sublabel">17+</label>
<span class="power-roll-tier-effect" name="attr_triggered_tier_3" ></span>
</div>
<input type="hidden" name="attr_has_effect" />
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_triggered_effect"></span>
</div>
<input type="hidden" name="attr_has_spend" />
<div class="npc-ability-malice grid-span-full">
<label><span data-i18n="spend"></span>&nbsp;<span name="attr_triggered_spend_cost"></span>:</label>
<span class="ability-malice" name="attr_triggered_spend"></span>
</div>
<input type="hidden" name="attr_has_custom" />
<div class="npc-ability-custom grid-span-full">
<label><span name="attr_triggered_custom_label"></span>:</label>
<span class="ability-custom" name="attr_triggered_custom"></span>
</div>
</div>
</fieldset>
<!-- Standard Triggered Abilities -->
<h5 class="panel-title" data-i18n="standard-triggers"></h5>
<div class="standard-abilities">
<!-- Opportunity Attack -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="opportunity-attack" data-i18n="opportunity-attack" name="attr_opportunity_attack_name" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="opportunity-attack-keywords" name="attr_opportunity_attack_keywords" value="" />
<input type="hidden" name="attr_opportunity_attack_type" value="free-triggered-action" />
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="trigger" data-i18n="opportunity-attack-trigger" name="attr_opportunity_attack_trigger" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="effect" data-i18n="opportunity-attack-effect" name="attr_opportunity_attack_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_opportunity_attack_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" data-i18n-placeholder="Opportunity Attack" name="attr_opportunity_attack_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" data-i18n-placeholder="Opportunity Attack" name="attr_opportunity_attack_keywords"></span>
<span class="ability-type" data-i18n="free-triggered-action"></span>
<div class="ability-trigger grid-span-full">
<label><span data-i18n="trigger"></span>:</label>
<span class="ability-trigger" name="attr_opportunity_attack_trigger"></span>
</div>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_opportunity_attack_effect"></span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- No-Actions Abilities -->
<div class="sheet-noaction">
<h2 data-i18n="no-action-trait"></h2>
<!-- No Actions/Traits: repeating_noaction -->
<fieldset class="repeating_noaction">
<input class="ability-edit" type="checkbox" id="ability-edit" />
<div class="ability-card card-edit">
<input type="text" class="ability-name" data-i18n-placeholder="ability-name" name="attr_noaction_name" />
<select class="ability-subtype-selector" name="attr_noaction_subtype">
<option value="normal-ability" selected data-i18n="normal-ability"></option>
<option value="signature-ability" data-i18n="signature-ability"></option>
<option value="heroic-ability" data-i18n="heroic-ability"></option>
</select>
<div class="ability-heroic-cost grid-span-full">
<label><span data-i18n="ability-cost"></span>:</label>
<input type="number" placeholder="3" name="attr_noaction_cost" />
</div>
<div class="ability-details grid-span-full">
<input type="text" class="ability-description" data-i18n-placeholder="ability-description" name="attr_noaction_description" />
<input type="text" class="npc-ability-keywords" data-i18n-placeholder="keywords" name="attr_noaction_keywords" />
<select class="ability-type" name="attr_ability_type">
<option value="no-action" selected data-i18n="no-action"></option>
</select>
<input type="text" class="ability-distance" data-i18n-placeholder="distance" name="attr_noaction_distance" />
<input type="text" class="ability-target" data-i18n-placeholder="target" name="attr_noaction_target" />
<textarea class="ability-trigger triggered-show grid-span-full" data-i18n-placeholder="trigger" name="attr_noaction_trigger" spellcheck="false"></textarea>
<div class="power-roll">
<div class="power-roll-mods">
<input type="checkbox" name="attr_has_power_roll" />
<label data-i18n="power-roll"></label>
<span>+</span>
<select class="ability-type" name="attr_noaction_characteristic">
<option value="might" data-i18n="might"></option>
<option value="agility" data-i18n="agility"></option>
<option value="reason" data-i18n="reason"></option>
<option value="intuition" data-i18n="intuition"></option>
<option value="presence" data-i18n="presence"></option>
</select>
</div>
<label class="sublabel">≤ 11</label>
<input type="text" class="power-roll-tier-effect" name="attr_noaction_tier_1" />
<label class="sublabel">12-16</label>
<input type="text" class="power-roll-tier-effect" name="attr_noaction_tier_2" />
<label class="sublabel">17+</label>
<input type="text" class="power-roll-tier-effect" name="attr_noaction_tier_3" />
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_effect" />
<label data-i18n="effect"></label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="effect" name="attr_noaction_effect" spellcheck="false"></textarea>
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_spend" />
<label data-i18n="spend"></label>
<div class="grid-span-full">
<label data-i18n="ability-cost"></label>
<input type="text" name="attr_noaction_spend_cost" />
</div>
<textarea class="ability-malice" data-i18n-placeholder="spend" name="attr_noaction_spend" spellcheck="false"></textarea>
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_custom" />
<label data-i18n="custom"></label>
<div class="grid-span-full">
<label data-i18n="label"></label>
<input type="text" data-i18n-placeholder="label" name="attr_noaction_custom_label" />
</div>
<textarea class="ability-custom" data-i18n-placeholder="custom-text" name="attr_noaction_custom" spellcheck="false"></textarea>
</div>
</div>
</div>
<div class="ability-card card-display">
<button class="ability-share-button" type="action" data-i18n-title="ability-share" name="act_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_noaction_name"></span>
<input id="ability-subtype-selector" type="hidden" name="attr_noaction_subtype" />
<div class="ability-subtype heroic-show">
<span data-i18n="ability-cost"></span>:&nbsp;<span name="attr_noaction_cost"></span>
</div>
<span class="ability-subtype subtype-hide" name="attr_noaction_subtype" data-i18n-dynamic></span>
<div class="ability-details details-hide grid-span-full">
<span class="ability-description" name="attr_noaction_description"></span>
<input type="hidden" name="attr_noaction_type" value="no-action" />
<span class="npc-ability-keywords" name="attr_noaction_keywords"></span>
<div class="ability-type"><span name="attr_noaction_type" data-i18n-dynamic></span></div>
<div class="ability-distance">&#128208;<span name="attr_noaction_distance" ></span></div>
<div class="ability-target">&#127919;<span name="attr_noaction_target" ></span></div>
<div class="ability-trigger grid-span-full">
<label><span data-i18n="trigger"></span>:</label>
<span name="attr_noaction_trigger"></span>
</div>
</div>
<input type="hidden" name="attr_has_power_roll" />
<div class="power-roll">
<div class="power-roll-mods">
<button type="action" data-i18n-title="power-roll-share" name="act_power-roll-share">
<!-- Dice pic -->
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
</button>
<label>2d10</label>
<span>+</span>
<span class="power-roll-characteristic" data-i18n-dynamic name="attr_noaction_characteristic" ></span>
</div>
<label class="sublabel">≤ 11</label>
<span class="power-roll-tier-effect" name="attr_noaction_tier_1" ></span>
<label class="sublabel">12-16</label>
<span class="power-roll-tier-effect" name="attr_noaction_tier_2" ></span>
<label class="sublabel">17+</label>
<span class="power-roll-tier-effect" name="attr_noaction_tier_3" ></span>
</div>
<input type="hidden" name="attr_has_effect" />
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_noaction_effect"></span>
</div>
<input type="hidden" name="attr_has_spend" />
<div class="npc-ability-malice grid-span-full">
<label><span data-i18n="spend"></span>&nbsp;<span name="attr_noaction_spend_cost"></span>:</label>
<span class="ability-malice" name="attr_noaction_spend"></span>
</div>
<input type="hidden" name="attr_has_custom" />
<div class="npc-ability-custom grid-span-full">
<label><span name="attr_noaction_custom_label"></span>:</label>
<span class="ability-custom" name="attr_noaction_custom"></span>
</div>
</div>
</fieldset>
<!-- Standard Abilities -->
<h5 class="panel-title" data-i18n="standard-noaction-trait"></h5>
<div class="standard-abilities">
<!-- Jump Move -->
<div class="standard-abilities-item">
<input type="hidden" name="attr_jump_type" value="no-action" />
<input type="hidden" name="attr_jump_has_power_roll" value="on" />
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<div class="ability-details grid-span-full">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="jump" data-i18n="jump" name="attr_jump_name" spellcheck="false"></textarea>
<div class="power-roll">
<div class="power-roll-mods">
<label data-i18n="power-roll"></label>
<span>+</span>
<select class="ability-type" name="attr_jump_characteristic">
<option value="might" data-i18n="might"></option>
<option value="agility" data-i18n="agility"></option>
</select>
</div>
<label class="sublabel">≤ 11</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="jump-tier1" data-i18n="jump-tier1" name="attr_jump_tier_1" spellcheck="false"></textarea>
<label class="sublabel">12-16</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="jump-tier2" data-i18n="jump-tier2" name="attr_jump_tier_2" spellcheck="false"></textarea>
<label class="sublabel">17+</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="jump-tier3" data-i18n="jump-tier3" name="attr_jump_tier_3" spellcheck="false"></textarea>
</div>
<textarea class="ability-effect grid-span-full" data-i18n="jump-effect" name="attr_jump_effect" spellcheck="false"></textarea>
</div>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_jump_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_jump_name"></span>
<div class="ability-details grid-span-full">
<div class="power-roll">
<div class="power-roll-mods">
<label>2d10</label>
<span>+</span>
<span class="power-roll-characteristic" data-i18n-dynamic name="attr_jump_characteristic" ></span>
<button type="action" data-i18n-title="power-roll-share" name="act_jump_power_roll_share">
<!-- Dice pic -->
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
</button>
</div>
<label class="sublabel">≤ 11</label>
<span class="power-roll-tier-effect" name="attr_jump_tier_1" ></span>
<label class="sublabel">12-16</label>
<span type="text" class="power-roll-tier-effect" name="attr_jump_tier_2" ></span>
<label class="sublabel">17+</label>
<span type="text" class="power-roll-tier-effect" name="attr_jump_tier_3" ></span>
</div>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_jump_effect"></span>
</div>
</div>
</div>
</div>
<!-- Climb Creature Maneuver -->
<div class="standard-abilities-item">
<input type="hidden" name="attr_climb_creature_type" value="no-action" />
<input type="hidden" name="attr_climb_creature_has_power_roll" value="on" />
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<div class="ability-details grid-span-full">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="climb-creature" data-i18n="climb-creature" name="attr_climb_creature_name" spellcheck="false"></textarea>
<div class="power-roll">
<div class="power-roll-mods">
<label data-i18n="power-roll"></label>
<span>+</span>
<select class="ability-type" name="attr_climb_creature_characteristic">
<option value="might" data-i18n="might"></option>
<option value="agility" data-i18n="agility"></option>
</select>
</div>
<label class="sublabel">≤ 11</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="climb-creature-tier1" data-i18n="climb-creature-tier1" name="attr_climb_creature_tier_1" spellcheck="false"></textarea>
<label class="sublabel">12-16</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="climb-creature-tier2" data-i18n="climb-creature-tier2" name="attr_climb_creature_tier_2" spellcheck="false"></textarea>
<label class="sublabel">17+</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="climb-creature-tier3" data-i18n="climb-creature-tier3" name="attr_climb_creature_tier_3" spellcheck="false"></textarea>
</div>
<textarea class="ability-effect grid-span-full" data-i18n="climb-creature-effect" name="attr_climb_creature_effect" spellcheck="false"></textarea>
</div>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_climb_creature_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_climb_creature_name"></span>
<div class="ability-details grid-span-full">
<div class="power-roll">
<div class="power-roll-mods">
<label>2d10</label>
<span>+</span>
<span class="power-roll-characteristic" data-i18n-dynamic name="attr_climb_creature_characteristic" ></span>
<button type="action" data-i18n-title="power-roll-share" name="act_climb_creature_power_roll_share">
<!-- Dice pic -->
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
</button>
</div>
<label class="sublabel">≤ 11</label>
<span class="power-roll-tier-effect" name="attr_climb_creature_tier_1" ></span>
<label class="sublabel">12-16</label>
<span type="text" class="power-roll-tier-effect" name="attr_climb_creature_tier_2" ></span>
<label class="sublabel">17+</label>
<span type="text" class="power-roll-tier-effect" name="attr_climb_creature_tier_3" ></span>
</div>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_climb_creature_effect"></span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Move Abilities -->
<div class="sheet-move">
<h2 data-i18n="move-actions"></h2>
<!-- Moves: repeating_moves -->
<fieldset class="repeating_moves">
<input class="ability-edit" type="checkbox" id="ability-edit" />
<div class="ability-card card-edit">
<input type="text" class="ability-name" data-i18n-placeholder="ability-name" name="attr_moves_name" />
<select class="ability-subtype-selector" name="attr_moves_subtype">
<option value="normal-ability" selected data-i18n="normal-ability"></option>
<option value="signature-ability" data-i18n="signature-ability"></option>
<option value="heroic-ability" data-i18n="heroic-ability"></option>
</select>
<div class="ability-heroic-cost grid-span-full">
<label><span data-i18n="ability-cost"></span>:</label>
<input type="number" placeholder="3" name="attr_moves_cost" />
</div>
<div class="ability-details grid-span-full">
<input type="text" class="ability-description" data-i18n-placeholder="ability-description" name="attr_moves_description" />
<input type="text" class="npc-ability-keywords" data-i18n-placeholder="keywords" name="attr_moves_keywords" />
<input type="hidden" name="attr_moves_type" value="move-action" />
<span class="ability-type" data-i18n="move-action"></span>
<input type="text" class="ability-distance" data-i18n-placeholder="distance" name="attr_moves_distance" />
<input type="text" class="ability-target" data-i18n-placeholder="target" name="attr_moves_target" />
<textarea class="ability-trigger triggered-show grid-span-full" data-i18n-placeholder="trigger" name="attr_moves_trigger" spellcheck="false"></textarea>
<div class="power-roll">
<div class="power-roll-mods">
<input type="checkbox" name="attr_has_power_roll" />
<label data-i18n="power-roll"></label>
<span>+</span>
<select class="ability-type" name="attr_moves_characteristic">
<option value="might" data-i18n="might"></option>
<option value="agility" data-i18n="agility"></option>
<option value="reason" data-i18n="reason"></option>
<option value="intuition" data-i18n="intuition"></option>
<option value="presence" data-i18n="presence"></option>
</select>
</div>
<label class="sublabel">≤ 11</label>
<input type="text" class="power-roll-tier-effect" name="attr_moves_tier_1" />
<label class="sublabel">12-16</label>
<input type="text" class="power-roll-tier-effect" name="attr_moves_tier_2" />
<label class="sublabel">17+</label>
<input type="text" class="power-roll-tier-effect" name="attr_moves_tier_3" />
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_effect" />
<label data-i18n="effect"></label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="effect" name="attr_moves_effect" spellcheck="false"></textarea>
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_spend" />
<label data-i18n="spend"></label>
<div class="grid-span-full">
<label data-i18n="ability-cost"></label>
<input type="text" name="attr_moves_spend_cost" />
</div>
<textarea class="ability-malice" data-i18n-placeholder="spend" name="attr_moves_spend" spellcheck="false"></textarea>
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_custom" />
<label data-i18n="custom"></label>
<div class="grid-span-full">
<label data-i18n="label"></label>
<input type="text" data-i18n-placeholder="label" name="attr_moves_custom_label" />
</div>
<textarea class="ability-custom" data-i18n-placeholder="custom-text" name="attr_moves_custom" spellcheck="false"></textarea>
</div>
</div>
</div>
<div class="ability-card card-display">
<button class="ability-share-button" type="action" data-i18n-title="ability-share" name="act_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_moves_name"></span>
<input id="ability-subtype-selector" type="hidden" name="attr_moves_subtype" />
<div class="ability-subtype heroic-show">
<span data-i18n="ability-cost"></span>:&nbsp;<span name="attr_moves_cost"></span>
</div>
<span class="ability-subtype subtype-hide" name="attr_moves_subtype" data-i18n-dynamic></span>
<div class="ability-details details-hide grid-span-full">
<span class="ability-description" name="attr_moves_description"></span>
<input type="hidden" name="attr_moves_type" value="move-action" />
<span class="npc-ability-keywords" name="attr_moves_keywords"></span>
<div class="ability-type"><span name="attr_moves_type" data-i18n-dynamic></span></div>
<div class="ability-distance">&#128208;<span name="attr_moves_distance" ></span></div>
<div class="ability-target">&#127919;<span name="attr_moves_target" ></span></div>
<div class="ability-trigger grid-span-full">
<label><span data-i18n="trigger"></span>:</label>
<span name="attr_moves_trigger"></span>
</div>
</div>
<input type="hidden" name="attr_has_power_roll" />
<div class="power-roll">
<div class="power-roll-mods">
<button type="action" data-i18n-title="power-roll-share" name="act_power-roll-share">
<!-- Dice pic -->
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
</button>
<label>2d10</label>
<span>+</span>
<span class="power-roll-characteristic" data-i18n-dynamic name="attr_moves_characteristic" ></span>
</div>
<label class="sublabel">≤ 11</label>
<span class="power-roll-tier-effect" name="attr_moves_tier_1" ></span>
<label class="sublabel">12-16</label>
<span class="power-roll-tier-effect" name="attr_moves_tier_2" ></span>
<label class="sublabel">17+</label>
<span class="power-roll-tier-effect" name="attr_moves_tier_3" ></span>
</div>
<input type="hidden" name="attr_has_effect" />
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_moves_effect"></span>
</div>
<input type="hidden" name="attr_has_spend" />
<div class="npc-ability-malice grid-span-full">
<label><span data-i18n="spend"></span>&nbsp;<span name="attr_moves_spend_cost"></span>:</label>
<span class="ability-malice" name="attr_moves_spend"></span>
</div>
<input type="hidden" name="attr_has_custom" />
<div class="npc-ability-custom grid-span-full">
<label><span name="attr_moves_custom_label"></span>:</label>
<span class="ability-custom" name="attr_moves_custom"></span>
</div>
</div>
</fieldset>
<!-- Standard Moves -->
<h5 class="panel-title" data-i18n="standard-move-actions"></h5>
<div class="standard-abilities">
<!-- Advance Move Action -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="advance" name="attr_advance_name" data-i18n="advance" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="advance-keywords" name="attr_advance_keywords" value="" />
<input type="hidden" name="attr_advance_type" value="move-action" />
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" name="attr_advance_distance" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" name="attr_advance_target" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n="advance-effect" name="attr_advance_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_advance_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_advance_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" name="attr_advance_keywords"></span>
<span class="ability-type" data-i18n="move-action"></span>
<span class="ability-distance" name="attr_advance_distance" ></span>
<span class="ability-target" name="attr_advance_target" ></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_advance_effect"></span>
</div>
</div>
</div>
</div>
<!--Disengage Move Action -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="disengage" name="attr_disengage_name" data-i18n="disengage" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="disengage-keywords" name="attr_disengage_keywords" value="" />
<input type="hidden" name="attr_disengage_type" value="move-action" />
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" name="attr_disengage_distance" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" name="attr_disengage_target" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n="disengage-effect" name="attr_disengage_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_disengage_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_disengage_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords read-ability-keywords" name="attr_disengage_keywords"></span>
<span class="ability-type" data-i18n="move-action"></span>
<span class="ability-distance" name="attr_disengage_distance" ></span>
<span class="ability-target" name="attr_disengage_target" ></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_disengage_effect"></span>
</div>
</div>
</div>
</div>
<!-- Ride Move Action -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="ride" name="attr_ride_name" data-i18n="ride" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="ride-keywords" name="attr_ride_keywords" value="" />
<input type="hidden" name="attr_ride_type" value="move-action" />
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" name="attr_ride_distance" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" name="attr_ride_target" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n="ride-effect" name="attr_ride_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_ride_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_ride_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" name="attr_ride_keywords"></span>
<span class="ability-type" data-i18n="move-action"></span>
<span class="ability-distance" name="attr_ride_distance" ></span>
<span class="ability-target" name="attr_ride_target" ></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_ride_effect"></span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Inventory Panel -->
<div class="sheet-panel inventory-panel minimizable">
<div class="minimize-control">
<input id="inventory-minimize-checkbox" class="minimize" type="checkbox" checked />
<label for="inventory-minimize-checkbox" data-i18n="inventory"></label>
</div>
<!-- Trinkets -->
<div class="sheet-panel-box trinket-panel">
<h5 class="panel-title" data-i18n="trinkets"></h5>
<fieldset class="repeating_trinkets">
<input class="ability-edit" type="checkbox" id="ability-edit" />
<div class="feature-accordion card-edit">
<input type="text" name="attr_trinket_name" />
<textarea name="attr_trinket_description"></textarea>
</div>
<div class="feature-accordion">
<div class="trinket-header">
<label><span name="attr_trinket_name"></span>:</label>
<span name="attr_trinket_description"></span>
</div>
</div>
</fieldset>
</div>
<!-- Consumables -->
<div class="sheet-panel-box consumable-panel">
<h5 class="panel-title" data-i18n="consumables"></h5>
<fieldset class="repeating_consumables">
<input class="ability-edit" type="checkbox" id="ability-edit" />
<div class="feature-accordion card-edit">
<input type="text" name="attr_consumable_name" />
<textarea name="attr_consumable_description"></textarea>
</div>
<div class="feature-accordion">
<div class="consumable-header">
<label><span name="attr_consumable_name"></span>:</label>
<span name="attr_consumable_description"></span>
</div>
</div>
</fieldset>
</div>
<!-- Leveled Treasures -->
<div class="sheet-panel-box level-treasure-panel">
<h5 class="panel-title" data-i18n="level-treasure"></h5>
<div class="carry-checks">
<span class="carry-label" data-i18n="carry-three-safely">carry three safely:</span>
<label><input type="checkbox" name="attr_carry_1" /></label>
<label><input type="checkbox" name="attr_carry_2" /></label>
<label><input type="checkbox" name="attr_carry_3" /></label>
</div>
<fieldset class="repeating_leveltreasure">
<input class="ability-edit" type="checkbox" id="ability-edit" />
<div class="feature-accordion card-edit">
<input type="text" name="attr_leveltreasure_name" />
<textarea name="attr_leveltreasure_description"></textarea>
</div>
<div class="feature-accordion">
<div class="leveltreasure-header">
<label><span name="attr_leveltreasure_name"></span>:</label>
<span name="attr_leveltreasure_description"></span>
</div>
</div>
</fieldset>
</div>
</div>
<!-- Projects Panel -->
<div class="sheet-panel projects-panel minimizable">
<div class="minimize-control">
<input id="projects-minimize-checkbox" class="minimize" type="checkbox" checked />
<label for="projects-minimize-checkbox" data-i18n="projects"></label>
</div>
<fieldset class="repeating_projects">
<input type="text" data-i18n-placeholder="project-name" name="attr_project_name" />
<input type="text" data-i18n-placeholder="assigned-hero-follower" name="attr_project_assigned" />
<input type="text" data-i18n-placeholder="characteristic" name="attr_project_characteristic" />
<div class="project-goal-input-group">
<input type="number" name="attr_project_goal" />
/
<input type="number" name="attr_project_goal_max" />
</div>
</fieldset>
</div>
<!-- Notes Panel -->
<div class="sheet-panel notes-panel minimizable">
<div class="minimize-control">
<input id="notes-minimize-checkbox" class="minimize" type="checkbox" checked />
<label for="notes-minimize-checkbox" data-i18n="notes"></label>
</div>
<textarea name="attr_notes_description"></textarea>
</div>
</div>
<!-- NPC Sheet View -->
<div class="npc-sheet-body">
<label class="npc-edit-icon" for="npc-edit-toggle">p</label><input class="npc-edit-toggle" type="checkbox" id="npc-edit-toggle" />
<!-- NPC Edit Form -->
<div class="npc-edit">
<div class="npc-edit-group npc-edit-text">
<label data-i18n="character-name" for="attr_character_name"></label>
<input type="text" id="attr_character_name" name="attr_character_name" />
<label data-i18n="level" for="attr_level"></label>
<input type="text" id="attr_level" name="attr_level" />
<label data-i18n="npc-role" for="attr_npc_role"></label>
<input type="text" id="attr_npc_role" name="attr_npc_role" />
<label data-i18n="keywords" for="attr_npc_keywords"></label>
<input type="text" id="attr_npc_keywords" name="attr_npc_keywords" />
<label data-i18n="encounter-value-abbr" for="attr_npc_EV"></label>
<input type="text" id="attr_npc_EV" name="attr_npc_EV" />
</div>
<div class="npc-edit-group npc-edit-stats">
<label data-i18n="size" for="attr_size"></label>
<input type="text" id="attr_size" name="attr_size" />
<label data-i18n="speed" for="attr_speed"></label>
<input type="number" id="attr_speed" name="attr_speed" />
<label data-i18n="stamina" for="attr_stamina"></label>
<input type="number" id="attr_stamina" name="attr_stamina" />
<label data-i18n="stability" for="attr_stability"></label>
<input type="number" id="attr_stability" name="attr_stability" />
<label data-i18n="free-strike" for="attr_npc_freestrike"></label>
<input type="number" id="attr_npc_freestrike" name="attr_npc_freestrike" />
</div>
<div class="npc-edit-group npc-edit-text">
<label data-i18n="immunity" for="attr_immunity"></label>
<input type="text" id="attr_immunity" name="attr_immunity" />
<label data-i18n="weakness" for="attr_weakness"></label>
<input type="text" id="attr_weakness" name="attr_weakness" />
<label data-i18n="movement" for="attr_npc_movement"></label>
<input type="text" id="attr_npc_movement" name="attr_npc_movement" />
<label data-i18n="with-captain" for="attr_npc_with_captain"></label>
<input type="text" id="attr_npc_with_captain" name="attr_npc_with_captain" />
</div>
<div class="npc-edit-group npc-edit-stats">
<label data-i18n="might" for="attr_might"></label>
<input type="number" id="attr_might" name="attr_might" />
<label data-i18n="agility" for="attr_agility"></label>
<input type="number" id="attr_agility" name="attr_agility" />
<label data-i18n="reason" for="attr_reason"></label>
<input type="number" id="attr_reason" name="attr_reason" />
<label data-i18n="intuition" for="attr_intuition"></label>
<input type="number" id="attr_intuition" name="attr_intuition" />
<label data-i18n="presence" for="attr_presence"></label>
<input type="number" id="attr_presence" name="attr_presence" />
</div>
<div class="npc-edit-group npc-edit-text">
<label data-i18n="villain-toggle" for="attr_villain_action_show"></label>
<input type="checkbox" id="attr_villain_action_show" name="attr_villain_action_show" value="1" />
</div>
</div>
<!-- NPC Display -->
<div class="npc-display">
<div class="npc-header-panel npc-panel">
<div class="npc-name"><span name="attr_character_name"></span></div>
<div class="npc-level"><span data-i18n="level"></span>&nbsp;<span name="attr_level"></span>&nbsp;<span name="attr_npc_role"></span></div>
<div><span name="attr_npc_keywords"></span></div>
<div><span data-i18n="encounter-value-abbr"></span>&nbsp;<span name="attr_npc_EV"></span></div>
</div>
<div class="npc-stats-panel npc-panel">
<div class="npc-stat">
<span name="attr_size"></span>
<label class="sublabel" data-i18n="size"></label>
</div>
<div class="npc-stat">
<span name="attr_speed"></span>
<label class="sublabel" data-i18n="speed"></label>
</div>
<div class="npc-stat">
<span name="attr_stamina"></span>
<label class="sublabel" data-i18n="stamina"></label>
</div>
<div class="npc-stat">
<span name="attr_stability"></span>
<label class="sublabel" data-i18n="stability"></label>
</div>
<div class="npc-stat">
<span name="attr_npc_freestrike"></span>
<label class="sublabel" data-i18n="free-strike"></label>
</div>
</div>
<div class="npc-skills-panel npc-panel" >
<div>
<label data-i18n="immunity"></label>:
<span name="attr_immunity"></span>
</div>
<div>
<label data-i18n="weakness"></label>:
<span name="attr_weakness"></span>
</div>
<div>
<label data-i18n="movement"></label>:
<span name="attr_npc_movement"></span>
</div>
<div>
<label data-i18n="with-captain"></label>:
<span name="attr_npc_with_captain"></span>
</div>
</div>
<div class="npc-marip-panel npc-panel">
<div class="npc-characteristic-input-group">
<label data-characteristic="might" data-i18n="might"></label>
<span name="attr_might"></span>
</div>
<div class="npc-characteristic-input-group">
<label data-characteristic="agility" data-i18n="agility"></label>
<span name="attr_agility"></span>
</div>
<div class="npc-characteristic-input-group">
<label data-characteristic="reason" data-i18n="reason"></label>
<span name="attr_reason"></span>
</div>
<div class="npc-characteristic-input-group">
<label data-characteristic="intuition" data-i18n="intuition"></label>
<span name="attr_intuition"></span>
</div>
<div class="npc-characteristic-input-group">
<label data-characteristic="presence" data-i18n="presence"></label>
<span name="attr_presence"></span>
</div>
</div>
</div>
<div class="npc-conditions npc-panel">
<h5 class="panel-title" data-i18n="conditions"></h5>
<fieldset class="repeating_conditions">
<input type="text" name="attr_condition_name" data-i18n-placeholder="condition" />
<div>
<input type="radio" name="attr_end" value="eot" />
<label data-i18n="eot"></label>
</div>
<div>
<input type="radio" name="attr_end" value="save-ends" />
<label data-i18n="save-ends"></label>
</div>
</fieldset>
<div class="savethrow-input-group">
<p data-i18n="save-ends-eq"></p>
<p>6</p>
<p data-i18n="save-ends-desc"></p>
<label>1d10:</label><button type="roll" value="@{wtype} &amp;{template:simpleroll} {{rolltitle=1d10}} {{roll=[[ [[1d10]][1d10]]]}} {{name=Saving throw: rolling a @{savethrow} or higher removes effect}} {{charactername=@{character_name}}}" data-i18n-title="initiative-title" class="btn ui-draggable"></button>
</div>
<div class="bleed-dying-input-group">
<p data-i18n="bleeding-dying"></p>
<label data-i18n="d6-level"></label><button type="roll" value="@{wtype} &amp;{template:simpleroll} {{rolltitle=1d6+@{level}}} {{roll=[[1d6[1d6] + @{level}[level]]]}} {{name=Bleeding or Dying}} {{charactername=@{character_name}}}" data-i18n-title="bleeding-dying-title" class="btn ui-draggable"></button>
</div>
</div>
<!-- NPC Abilities -->
<div class="npc-abilities-panel">
<!-- NPC Ability Type Tabs -->
<input type="hidden" class="sheet-tabstoggle" name="attr_npcabilitiesTab" value="npcabilities" />
<div class="abilities-buttons">
<button type="action" name="act_npcabilities" class="sheet-button-npcabilities" data-i18n="npc-abilities"></button>
<button type="action" name="act_malice" class="sheet-button-malice" data-i18n="faction-malice"></button>
<button type="action" name="act_villainaction" class="sheet-button-villainaction" data-i18n="villain-action"></button>
</div>
<div class="sheet-npcabilities">
<h2 data-i18n="statblock-abilities"></h2>
<fieldset class="repeating_npcabilities">
<input class="ability-edit" type="checkbox" id="ability-edit" />
<div class="ability-card card-edit">
<input type="text" class="ability-name" data-i18n-placeholder="ability-name" name="attr_ability_name" />
<select class="ability-subtype-selector" name="attr_ability_subtype">
<option value="normal-ability" selected data-i18n="normal-ability"></option>
<option value="signature-ability" data-i18n="signature-ability"></option>
<option value="villain-ability" data-i18n="villain-ability"></option>
<option value="solo-monster" data-i18n="solo-monster"></option>
<option value="trait" data-i18n="trait"></option>
<option value="malice-ability" data-i18n="malice-ability"></option>
<option value="malice-trait" data-i18n="malice-trait"></option>
</select>
<div class="npc-ability-solo-monster grid-span-full">
<label><span data-i18n="solo-monster-entry-title"></span>&nbsp;1</label>
<input type="text" name="attr_ability_solo_1_name" />
<textarea class="grid-span-full" data-i18n-placeholder="solo-monster-entry-text" name="attr_ability_solo_1_text" spellcheck="false"></textarea>
<label><span data-i18n="solo-monster-entry-title"></span>&nbsp;2</label>
<input type="text" name="attr_ability_solo_2_name" />
<textarea class="grid-span-full" data-i18n-placeholder="solo-monster-entry-text" name="attr_ability_solo_2_text" spellcheck="false"></textarea>
</div>
<div class="npc-ability-malice-cost grid-span-full">
<label><span data-i18n="malice-cost"></span>:</label>
<input type="number" placeholder="3" name="attr_ability_malice_cost" />
</div>
<textarea class="npc-ability-trait grid-span-full" data-i18n-placeholder="trait" name="attr_ability_trait"></textarea>
<div class="ability-details grid-span-full">
<input type="text" class="npc-ability-keywords" data-i18n-placeholder="keywords" name="attr_ability_keywords" />
<select class="ability-type" name="attr_ability_type">
<option value="no-action" selected data-i18n="no-action"></option>
<option value="main-action" data-i18n="main-action"></option>
<option value="maneuver" data-i18n="maneuver"></option>
<option value="free-maneuver" data-i18n="free-maneuver"></option>
<option value="move-action" data-i18n="move-action"></option>
<option value="triggered-action" data-i18n="triggered-action"></option>
<option value="free-triggered-action" data-i18n="free-triggered-action"></option>
</select>
<input type="text" class="ability-distance" data-i18n-placeholder="distance" name="attr_ability_distance" />
<input type="text" class="ability-target" data-i18n-placeholder="target" name="attr_ability_target" />
<textarea class="ability-trigger triggered-show grid-span-full" data-i18n-placeholder="trigger" name="attr_ability_trigger" spellcheck="false"></textarea>
<div class="power-roll">
<div class="power-roll-mods">
<input type="checkbox" name="attr_has_power_roll" />
<label data-i18n="power-roll"></label>
<span>+</span>
<input type="text" class="power-roll-characteristic" name="attr_ability_characteristic" />
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_pre_effect" />
<label data-i18n="pre-effect"></label>
<textarea class="ability-pre-effect grid-span-full" data-i18n-placeholder="pre-effect" name="attr_ability_pre_effect" spellcheck="false"></textarea>
</div>
</div>
<label class="sublabel">≤ 11</label>
<input type="text" class="power-roll-tier-effect" name="attr_ability_tier_1" />
<label class="sublabel">12-16</label>
<input type="text" class="power-roll-tier-effect" name="attr_ability_tier_2" />
<label class="sublabel">17+</label>
<input type="text" class="power-roll-tier-effect" name="attr_ability_tier_3" />
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_effect" />
<label data-i18n="effect"></label>
<textarea class="ability-effect" data-i18n-placeholder="effect" name="attr_ability_effect" spellcheck="false"></textarea>
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_special" />
<label data-i18n="special"></label>
<textarea class="ability-special" data-i18n-placeholder="special" name="attr_ability_special" spellcheck="false"></textarea>
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_malice" />
<label data-i18n="malice"></label>
<div class="grid-span-full">
<label data-i18n="malice-cost"></label>
<input type="text" name="attr_ability_cost" />
</div>
<textarea class="ability-malice" data-i18n-placeholder="malice" name="attr_ability_malice" spellcheck="false"></textarea>
</div>
</div>
</div>
<div class="ability-card card-display">
<button class="ability-share-button" type="action" data-i18n-title="ability-share" name="act_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_ability_name"></span>
<input id="ability-subtype-selector" type="hidden" name="attr_ability_subtype" />
<div class="ability-subtype malice-show">
<span name="attr_ability_malice_cost"></span>&nbsp;<span data-i18n="malice"></span>
</div>
<span class="ability-subtype subtype-hide" name="attr_ability_subtype" data-i18n-dynamic></span>
<span class="trait-show grid-span-full" name="attr_ability_trait"></span>
<div class="solo-monster-show grid-span-full">
<div>
<label><span name="attr_ability_solo_1_name"></span>:</label><span name="attr_ability_solo_1_text"></span>
</div>
<div>
<label><span name="attr_ability_solo_2_name"></span>:</label><span name="attr_ability_solo_2_text"></span>
</div>
</div>
<div class="ability-details details-hide grid-span-full">
<input type="hidden" name="attr_ability_type" />
<span class="npc-ability-keywords" name="attr_ability_keywords"></span>
<div class="ability-type"><span name="attr_ability_type" data-i18n-dynamic></span></div>
<div class="ability-distance">&#128208;<span name="attr_ability_distance" ></span></div>
<div class="ability-target">&#127919;<span name="attr_ability_target" ></span></div>
<div class="ability-trigger grid-span-full">
<label><span data-i18n="trigger"></span>:</label>
<span name="attr_ability_trigger"></span>
</div>
</div>
<input type="hidden" name="attr_has_pre_effect" />
<div class="ability-pre-effect grid-span-full">
<label data-i18n="pre-effect"></label>:
<span class="ability-pre-effect" name="attr_ability_pre_effect"></span>
</div>
<input type="hidden" name="attr_has_power_roll" />
<div class="power-roll">
<div class="power-roll-mods">
<button type="action" data-i18n-title="power-roll-share" name="act_power-roll-share">
<!-- Dice pic -->
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
</button>
<label>2d10</label>
<span>+</span>
<span class="power-roll-characteristic" name="attr_ability_characteristic" ></span>
</div>
<label class="sublabel">≤ 11</label>
<span class="power-roll-tier-effect" name="attr_ability_tier_1" ></span>
<label class="sublabel">12-16</label>
<span class="power-roll-tier-effect" name="attr_ability_tier_2" ></span>
<label class="sublabel">17+</label>
<span class="power-roll-tier-effect" name="attr_ability_tier_3" ></span>
</div>
<input type="hidden" name="attr_has_special" />
<div class="npc-ability-special grid-span-full">
<label data-i18n="special"></label>:
<span class="ability-special" name="attr_ability_special"></span>
</div>
<input type="hidden" name="attr_has_effect" />
<div class="ability-effect grid-span-full">
<label data-i18n="effect"></label>:
<span class="ability-effect" name="attr_ability_effect"></span>
</div>
<input type="hidden" name="attr_has_malice" />
<div class="npc-ability-malice grid-span-full">
<label><span name="attr_ability_cost"></span>&nbsp;<span data-i18n="malice"></span>:</label>
<span class="ability-malice" name="attr_ability_malice"></span>
</div>
</div>
</fieldset>
</div>
<div class="sheet-malice">
<h2 data-i18n="malice-abilities"></h2>
<fieldset class="repeating_malice">
<input class="ability-edit" type="checkbox" id="ability-edit" />
<div class="ability-card card-edit">
<input type="text" class="ability-name" data-i18n-placeholder="ability-name" name="attr_ability_name" />
<select class="ability-subtype-selector" name="attr_ability_subtype">
<option value="malice-ability" data-i18n="malice-ability"></option>
<option value="malice-trait" data-i18n="malice-trait"></option>
</select>
<div class="npc-ability-malice-cost grid-span-full">
<label><span data-i18n="malice-cost"></span>:</label>
<input type="number" placeholder="3" name="attr_ability_malice_cost" />
</div>
<textarea class="npc-ability-trait grid-span-full" data-i18n-placeholder="trait" name="attr_ability_trait"></textarea>
<div class="ability-details grid-span-full">
<input type="text" class="npc-ability-keywords" data-i18n-placeholder="keywords" name="attr_ability_keywords" />
<select class="ability-type" name="attr_ability_type">
<option value="no-action" selected data-i18n="no-action"></option>
<option value="main-action" data-i18n="main-action"></option>
<option value="maneuver" data-i18n="maneuver"></option>
<option value="free-maneuver" data-i18n="free-maneuver"></option>
<option value="move-action" data-i18n="move-action"></option>
<option value="triggered-action" data-i18n="triggered-action"></option>
<option value="free-triggered-action" data-i18n="free-triggered-action"></option>
</select>
<input type="text" class="ability-distance" data-i18n-placeholder="distance" name="attr_ability_distance" />
<input type="text" class="ability-target" data-i18n-placeholder="target" name="attr_ability_target" />
<textarea class="ability-trigger triggered-show grid-span-full" data-i18n-placeholder="trigger" name="attr_ability_trigger" spellcheck="false"></textarea>
<div class="power-roll">
<div class="power-roll-mods">
<input type="checkbox" name="attr_has_power_roll" />
<label data-i18n="power-roll"></label>
<span>+</span>
<input type="text" class="power-roll-characteristic" name="attr_ability_characteristic" />
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_pre_effect" />
<label data-i18n="pre-effect"></label>
<textarea class="ability-pre-effect grid-span-full" data-i18n-placeholder="pre-effect" name="attr_ability_pre_effect" spellcheck="false"></textarea>
</div>
</div>
<label class="sublabel">≤ 11</label>
<input type="text" class="power-roll-tier-effect" name="attr_ability_tier_1" />
<label class="sublabel">12-16</label>
<input type="text" class="power-roll-tier-effect" name="attr_ability_tier_2" />
<label class="sublabel">17+</label>
<input type="text" class="power-roll-tier-effect" name="attr_ability_tier_3" />
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_effect" />
<label data-i18n="effect"></label>
<textarea class="ability-effect" data-i18n-placeholder="effect" name="attr_ability_effect" spellcheck="false"></textarea>
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_special" />
<label data-i18n="special"></label>
<textarea class="ability-special" data-i18n-placeholder="special" name="attr_ability_special" spellcheck="false"></textarea>
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_malice" />
<label data-i18n="malice"></label>
<div class="grid-span-full">
<label data-i18n="malice-cost"></label>
<input type="text" name="attr_ability_cost" />
</div>
<textarea class="ability-malice" data-i18n-placeholder="malice" name="attr_ability_malice" spellcheck="false"></textarea>
</div>
</div>
</div>
<div class="ability-card card-display">
<button class="ability-share-button" type="action" data-i18n-title="ability-share" name="act_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_ability_name"></span>
<input id="ability-subtype-selector" type="hidden" name="attr_ability_subtype" />
<div class="ability-subtype malice-show">
<span name="attr_ability_malice_cost"></span>&nbsp;<span data-i18n="malice"></span>
</div>
<span class="ability-subtype subtype-hide" name="attr_ability_subtype" data-i18n-dynamic></span>
<span class="trait-show grid-span-full" name="attr_ability_trait"></span>
<div class="solo-monster-show grid-span-full">
<div>
<label><span name="attr_ability_solo_1_name"></span>:</label><span name="attr_ability_solo_1_text"></span>
</div>
<div>
<label><span name="attr_ability_solo_2_name"></span>:</label><span name="attr_ability_solo_2_text"></span>
</div>
</div>
<div class="ability-details details-hide grid-span-full">
<input type="hidden" name="attr_ability_type" />
<span class="npc-ability-keywords" name="attr_ability_keywords"></span>
<div class="ability-type"><span name="attr_ability_type" data-i18n-dynamic></span></div>
<div class="ability-distance">&#128208;<span name="attr_ability_distance" ></span></div>
<div class="ability-target">&#127919;<span name="attr_ability_target" ></span></div>
<div class="ability-trigger grid-span-full">
<label><span data-i18n="trigger"></span>:</label>
<span name="attr_ability_trigger"></span>
</div>
</div>
<input type="hidden" name="attr_has_pre_effect" />
<div class="ability-pre-effect grid-span-full">
<label data-i18n="pre-effect"></label>:
<span class="ability-pre-effect" name="attr_ability_pre_effect"></span>
</div>
<input type="hidden" name="attr_has_power_roll" />
<div class="power-roll">
<div class="power-roll-mods">
<button type="action" data-i18n-title="power-roll-share" name="act_power-roll-share">
<!-- Dice pic -->
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
</button>
<label>2d10</label>
<span>+</span>
<span class="power-roll-characteristic" name="attr_ability_characteristic" ></span>
</div>
<label class="sublabel">≤ 11</label>
<span class="power-roll-tier-effect" name="attr_ability_tier_1" ></span>
<label class="sublabel">12-16</label>
<span class="power-roll-tier-effect" name="attr_ability_tier_2" ></span>
<label class="sublabel">17+</label>
<span class="power-roll-tier-effect" name="attr_ability_tier_3" ></span>
</div>
<input type="hidden" name="attr_has_special" />
<div class="npc-ability-special grid-span-full">
<label data-i18n="special"></label>:
<span class="ability-special" name="attr_ability_special"></span>
</div>
<input type="hidden" name="attr_has_effect" />
<div class="ability-effect grid-span-full">
<label data-i18n="effect"></label>:
<span class="ability-effect" name="attr_ability_effect"></span>
</div>
<input type="hidden" name="attr_has_malice" />
<div class="npc-ability-malice grid-span-full">
<label><span name="attr_ability_cost"></span>&nbsp;<span data-i18n="malice"></span>:</label>
<span class="ability-malice" name="attr_ability_malice"></span>
</div>
</div>
</fieldset>
<!-- Basic Malice -->
<h5 class="panel-title" data-i18n="basic-malice"></h5>
<div class="standard-abilities">
<!-- Brutal Effectiveness -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit" />
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" name="attr_brutaleffect_name" data-i18n="brutal-effect-name" />
<select class="ability-subtype-selector" name="attr_brutaleffect_subtype">
<option value="malice-trait" data-i18n="malice-trait"></option>
</select>
<div class="npc-ability-malice-cost grid-span-full">
<label><span data-i18n="malice-cost"></span>:</label>
<input type="number" name="attr_brutaleffect_malice_cost" value="3" />
</div>
<input type="hidden" name="attr_brutaleffect_type" value="no-action" />
<textarea class="npc-ability-trait grid-span-full" name="attr_brutaleffect_trait" data-i18n="brutal-effect-trait" />
</div>
<div class="ability-card card-display">
<button class="ability-share-button" type="action" data-i18n-title="ability-share" name="act_brutaleffect_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_brutaleffect_name"></span>
<input id="ability-subtype-selector" type="hidden" name="attr_brutaleffect_subtype" />
<div class="ability-subtype">
<span name="attr_brutaleffect_malice_cost"></span>&nbsp;<span data-i18n="malice"></span>
</div>
<span class="ability-subtype subtype-hide" name="attr_brutaleffect_subtype" data-i18n-dynamic></span>
<span class="grid-span-full" name="attr_brutaleffect_trait"></span>
</div>
</div>
<!-- Malicious Strike -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit" />
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" name="attr_maliciousstrike_name" data-i18n="malicious-strike-name" />
<select class="ability-subtype-selector" name="attr_maliciousstrike_subtype">
<option value="malice-trait" data-i18n="malice-trait"></option>
</select>
<div class="npc-ability-malice-cost grid-span-full">
<label><span data-i18n="malice-cost"></span>:</label>
<input type="number" name="attr_maliciousstrike_malice_cost" value="5" />
</div>
<input type="hidden" name="attr_maliciousstrike_type" value="no-action" />
<textarea class="npc-ability-trait grid-span-full" name="attr_maliciousstrike_trait" data-i18n="malicious-strike-trait" />
</div>
<div class="ability-card card-display">
<button class="ability-share-button" type="action" data-i18n-title="ability-share" name="act_maliciousstrike_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_maliciousstrike_name"></span>
<input id="ability-subtype-selector" type="hidden" name="attr_maliciousstrike_subtype" />
<div class="ability-subtype">
<span name="attr_maliciousstrike_malice_cost"></span>+&nbsp;<span data-i18n="malice"></span>
</div>
<span class="ability-subtype subtype-hide" name="attr_maliciousstrike_subtype" data-i18n-dynamic></span>
<span class="grid-span-full" name="attr_maliciousstrike_trait"></span>
</div>
</div>
</div>
</div>
<input type="hidden" name="attr_villain_action_show" value = "0" />
<div class="sheet-villainaction">
<h2 data-i18n="villain-action"></h2>
<fieldset class="repeating_villainaction">
<input class="ability-edit" type="checkbox" id="ability-edit" />
<div class="ability-card card-edit">
<input type="text" class="ability-name" data-i18n-placeholder="ability-name" name="attr_ability_name" />
<select class="ability-subtype-selector" name="attr_ability_subtype">
<option value="villain-ability" data-i18n="villain-ability"></option>
</select>
<div class="npc-ability-malice-cost grid-span-full">
<label><span data-i18n="malice-cost"></span>:</label>
<input type="number" placeholder="3" name="attr_ability_malice_cost" />
</div>
<textarea class="npc-ability-trait grid-span-full" data-i18n-placeholder="trait" name="attr_ability_trait"></textarea>
<div class="ability-details grid-span-full">
<input type="text" class="npc-ability-keywords" data-i18n-placeholder="keywords" name="attr_ability_keywords" />
<select class="ability-type" name="attr_ability_type">
<option value="no-action" selected data-i18n="no-action"></option>
<option value="main-action" data-i18n="main-action"></option>
<option value="maneuver" data-i18n="maneuver"></option>
<option value="free-maneuver" data-i18n="free-maneuver"></option>
<option value="move-action" data-i18n="move-action"></option>
<option value="triggered-action" data-i18n="triggered-action"></option>
<option value="free-triggered-action" data-i18n="free-triggered-action"></option>
</select>
<input type="text" class="ability-distance" data-i18n-placeholder="distance" name="attr_ability_distance" />
<input type="text" class="ability-target" data-i18n-placeholder="target" name="attr_ability_target" />
<textarea class="ability-trigger triggered-show grid-span-full" data-i18n-placeholder="trigger" name="attr_ability_trigger" spellcheck="false"></textarea>
<div class="power-roll">
<div class="power-roll-mods">
<input type="checkbox" name="attr_has_power_roll" />
<label data-i18n="power-roll"></label>
<span>+</span>
<input type="text" class="power-roll-characteristic" name="attr_ability_characteristic" />
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_pre_effect" />
<label data-i18n="pre-effect"></label>
<textarea class="ability-pre-effect grid-span-full" data-i18n-placeholder="pre-effect" name="attr_ability_pre_effect" spellcheck="false"></textarea>
</div>
</div>
<label class="sublabel">≤ 11</label>
<input type="text" class="power-roll-tier-effect" name="attr_ability_tier_1" />
<label class="sublabel">12-16</label>
<input type="text" class="power-roll-tier-effect" name="attr_ability_tier_2" />
<label class="sublabel">17+</label>
<input type="text" class="power-roll-tier-effect" name="attr_ability_tier_3" />
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_effect" />
<label data-i18n="effect"></label>
<textarea class="ability-effect" data-i18n-placeholder="effect" name="attr_ability_effect" spellcheck="false"></textarea>
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_special" />
<label data-i18n="special"></label>
<textarea class="ability-special" data-i18n-placeholder="special" name="attr_ability_special" spellcheck="false"></textarea>
</div>
<div class="ability-toggle-group">
<input type="checkbox" name="attr_has_malice" />
<label data-i18n="malice"></label>
<div class="grid-span-full">
<label data-i18n="malice-cost"></label>
<input type="text" name="attr_ability_cost" />
</div>
<textarea class="ability-malice" data-i18n-placeholder="malice" name="attr_ability_malice" spellcheck="false"></textarea>
</div>
</div>
</div>
<div class="ability-card card-display">
<button class="ability-share-button" type="action" data-i18n-title="ability-share" name="act_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_ability_name"></span>
<input id="ability-subtype-selector" type="hidden" name="attr_ability_subtype" />
<div class="ability-subtype malice-show">
<span name="attr_ability_malice_cost"></span>&nbsp;<span data-i18n="malice"></span>
</div>
<span class="ability-subtype subtype-hide" name="attr_ability_subtype" data-i18n-dynamic></span>
<span class="trait-show grid-span-full" name="attr_ability_trait"></span>
<div class="solo-monster-show grid-span-full">
<div>
<label><span name="attr_ability_solo_1_name"></span>:</label><span name="attr_ability_solo_1_text"></span>
</div>
<div>
<label><span name="attr_ability_solo_2_name"></span>:</label><span name="attr_ability_solo_2_text"></span>
</div>
</div>
<div class="ability-details details-hide grid-span-full">
<input type="hidden" name="attr_ability_type" />
<span class="npc-ability-keywords" name="attr_ability_keywords"></span>
<div class="ability-type"><span name="attr_ability_type" data-i18n-dynamic></span></div>
<div class="ability-distance">&#128208;<span name="attr_ability_distance" ></span></div>
<div class="ability-target">&#127919;<span name="attr_ability_target" ></span></div>
<div class="ability-trigger grid-span-full">
<label><span data-i18n="trigger"></span>:</label>
<span name="attr_ability_trigger"></span>
</div>
</div>
<input type="hidden" name="attr_has_pre_effect" />
<div class="ability-pre-effect grid-span-full">
<label data-i18n="pre-effect"></label>:
<span class="ability-pre-effect" name="attr_ability_pre_effect"></span>
</div>
<input type="hidden" name="attr_has_power_roll" />
<div class="power-roll">
<div class="power-roll-mods">
<button type="action" data-i18n-title="power-roll-share" name="act_power-roll-share">
<!-- Dice pic -->
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
</button>
<label>2d10</label>
<span>+</span>
<span class="power-roll-characteristic" name="attr_ability_characteristic" ></span>
</div>
<label class="sublabel">≤ 11</label>
<span class="power-roll-tier-effect" name="attr_ability_tier_1" ></span>
<label class="sublabel">12-16</label>
<span class="power-roll-tier-effect" name="attr_ability_tier_2" ></span>
<label class="sublabel">17+</label>
<span class="power-roll-tier-effect" name="attr_ability_tier_3" ></span>
</div>
<input type="hidden" name="attr_has_special" />
<div class="npc-ability-special grid-span-full">
<label data-i18n="special"></label>:
<span class="ability-special" name="attr_ability_special"></span>
</div>
<input type="hidden" name="attr_has_effect" />
<div class="ability-effect grid-span-full">
<label data-i18n="effect"></label>:
<span class="ability-effect" name="attr_ability_effect"></span>
</div>
<input type="hidden" name="attr_has_malice" />
<div class="npc-ability-malice grid-span-full">
<label><span name="attr_ability_cost"></span>&nbsp;<span data-i18n="malice"></span>:</label>
<span class="ability-malice" name="attr_ability_malice"></span>
</div>
</div>
</fieldset>
</div>
<!-- Standard NPC Ability Type Tabs -->
<h5 class="panel-title" data-i18n="standard-abilities"></h5>
<input type="hidden" class="sheet-tabstoggle" name="attr_abilitiesTab" value="action" />
<div class="abilities-buttons">
<button type="action" name="act_action" class="sheet-button-action" data-i18n="main-action"></button>
<button type="action" name="act_maneuver" class="sheet-button-maneuver" data-i18n="maneuver"></button>
<button type="action" name="act_triggered" class="sheet-button-triggered" data-i18n="triggered-action"></button>
<button type="action" name="act_noaction" class="sheet-button-noaction" data-i18n="no-action-trait"></button>
<button type="action" name="act_move" class="sheet-button-move" data-i18n="move-action"></button>
</div>
<div class="sheet-action">
<h2 data-i18n="standard-main-actions"></h2>
<!-- Standard Abilities -->
<div class="standard-abilities">
<!-- Free Strike Main Action -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" name="attr_freestrike_name" data-i18n="free-strike" />
<input type="hidden" name="attr_freestrike_type" value="main-action" />
<textarea class="ability-effect" name="attr_freestrike_effect" data-i18n="free-strike-effect" />
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_freestrike_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_freestrike_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" name="attr_freestrike_keywords"></span>
<span class="ability-type" data-i18n="main-action"></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_freestrike_effect"></span>
</div>
</div>
</div>
</div>
<!-- Charge Main Action -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="charge" name="attr_charge_name" data-i18n="charge" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="charge-keywords" name="attr_charge_keywords" value="" />
<input type="hidden" name="attr_charge_type" value="Main Action" />
<textarea class="ability-effect grid-span-full" data-i18n="charge-effect" name="attr_charge_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_charge_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_charge_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" name="attr_charge_keywords"></span>
<span class="ability-type" data-i18n="main-action"></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_charge_effect"></span>
</div>
</div>
</div>
</div>
<!-- Defend Main Action -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-name grid-span-full" data-i18n-placeholder="defend" name="attr_defend_name" data-i18n="defend" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="defend-keywords" name="attr_defend_keywords" value="" />
<input type="hidden" name="attr_defend_type" value="Main Action" />
<textarea class="ability-effect grid-span-full" data-i18n="defend-effect" name="attr_defend_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_defend_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" data-i18n-placeholder="Defend" name="attr_defend_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" data-i18n-placeholder="defend" name="attr_defend_keywords"></span>
<span class="ability-type" data-i18n="main-action"></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_defend_effect"></span>
</div>
</div>
</div>
</div>
<!-- Convert Main Action -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="convert" name="attr_convert_name" data-i18n="convert" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="convert-keywords" name="attr_convert_keywords" value="" />
<input type="hidden" name="attr_convert_type" value="Main Action" />
<textarea class="ability-effect grid-span-full" data-i18n="convert-effect" name="attr_convert_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_convert_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" data-i18n-placeholder="Convert" name="attr_convert_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" data-i18n-placeholder="convert" name="attr_convert_keywords"></span>
<span class="ability-type" data-i18n="main-action"></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_convert_effect"></span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Maneuver Abilities -->
<div class="sheet-maneuver">
<!-- Maneuvers: repeating_maneuvers -->
<h2 data-i18n="standard-maneuvers"></h2>
<!-- Standard Maneuvers -->
<div class="standard-abilities">
<!-- Knockback -->
<div class="standard-abilities-item">
<input type="hidden" name="attr_knockback_type" value="maneuver" />
<input type="hidden" name="attr_knockback_has_power_roll" value="on" />
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<div class="ability-details grid-span-full">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="knockback" data-i18n="knockback" name="attr_knockback_name" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="keywords" data-i18n="knockback-keywords" name="attr_knockback_keywords" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" data-i18n="melee-one" name="attr_knockback_distance" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" data-i18n="one-creature" name="attr_knockback_target" spellcheck="false"></textarea>
<div class="power-roll">
<div class="power-roll-mods">
<label data-i18n="power-roll"></label>
<span>+</span>
<select class="ability-type" name="attr_knockback_characteristic">
<option value="might" data-i18n="might"></option>
<option value="intuition" data-i18n="intuition"></option>
</select>
</div>
<label class="sublabel">≤ 11</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="knockback-tier1" data-i18n="knockback-tier1" name="attr_knockback_tier_1" spellcheck="false"></textarea>
<label class="sublabel">12-16</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="knockback-tier2" data-i18n="knockback-tier2" name="attr_knockback_tier_2" spellcheck="false"></textarea>
<label class="sublabel">17+</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="knockback-tier3" data-i18n="knockback-tier3" name="attr_knockback_tier_3" spellcheck="false"></textarea>
</div>
<textarea class="ability-effect grid-span-full" data-i18n="knockback-effect" name="attr_knockback_effect" spellcheck="false"></textarea>
</div>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_knockback_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" data-i18n-placeholder="Knockback" name="attr_knockback_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" data-i18n-placeholder="knockback-keywords" name="attr_knockback_keywords"></span>
<span class="ability-type" data-i18n="maneuver"></span>
<span class="ability-distance" data-i18n-placeholder="Distance" name="attr_knockback_distance" ></span>
<span class="ability-target" data-i18n-placeholder="Target" name="attr_knockback_target" ></span>
<div class="power-roll">
<div class="power-roll-mods">
<label>2d10</label>
<span>+</span>
<span class="power-roll-characteristic" data-i18n-dynamic name="attr_knockback_characteristic" ></span>
<button type="action" data-i18n-title="power-roll-share" name="act_knockback_power_roll_share">
<!-- Dice pic -->
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
</button>
</div>
<label class="sublabel">≤ 11</label>
<span class="power-roll-tier-effect" data-i18n-placeholder="Tier 1 effect" name="attr_knockback_tier_1" ></span>
<label class="sublabel">12-16</label>
<span type="text" class="power-roll-tier-effect" data-i18n-placeholder="Tier 2 effect" name="attr_knockback_tier_2" ></span>
<label class="sublabel">17+</label>
<span type="text" class="power-roll-tier-effect" data-i18n-placeholder="Tier 3 effect" name="attr_knockback_tier_3" ></span>
</div>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_knockback_effect"></span>
</div>
</div>
</div>
</div>
<!-- Grab -->
<div class="standard-abilities-item">
<input type="hidden" name="attr_grab_type" value="maneuver" />
<input type="hidden" name="attr_grab_has_power_roll" value="on" />
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<div class="ability-details grid-span-full">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="grab" data-i18n="grab" name="attr_grab_name" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="keywords" data-i18n="grab-keywords" name="attr_grab_keywords" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" data-i18n="melee-one" name="attr_grab_distance" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" data-i18n="one-creature" name="attr_grab_target" spellcheck="false"></textarea>
<div class="power-roll">
<div class="power-roll-mods">
<label data-i18n="power-roll"></label>
<span>+</span>
<select class="ability-type" name="attr_grab_characteristic">
<option value="might" data-i18n="might"></option>
<option value="intuition" data-i18n="intuition"></option>
</select>
</div>
<label class="sublabel">≤ 11</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="grab-tier1" data-i18n="grab-tier1" name="attr_grab_tier_1" spellcheck="false"></textarea>
<label class="sublabel">12-16</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="grab-tier2" data-i18n="grab-tier2" name="attr_grab_tier_2" spellcheck="false"></textarea>
<label class="sublabel">17+</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="grab-tier3" data-i18n="grab-tier3" name="attr_grab_tier_3" spellcheck="false"></textarea>
</div>
<textarea class="ability-effect grid-span-full" data-i18n="grab-effect" name="attr_grab_effect" spellcheck="false"></textarea>
</div>
</div>
<div class="ability-card card-display">
<button type="action" data-i18n-title="ability-share" name="act_grab_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" data-i18n-placeholder="Grab" name="attr_grab_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" data-i18n-placeholder="grab-keywords" name="attr_grab_keywords"></span>
<span class="ability-type" data-i18n="maneuver"></span>
<span class="ability-distance" data-i18n-placeholder="Distance" name="attr_grab_distance" ></span>
<span class="ability-target" data-i18n-placeholder="Target" name="attr_grab_target" ></span>
<div class="power-roll">
<div class="power-roll-mods">
<label>2d10</label>
<span>+</span>
<span class="power-roll-characteristic" data-i18n-dynamic name="attr_grab_characteristic" ></span>
<button type="action" data-i18n-title="power-roll-share" name="act_grab_power_roll_share">
<!-- Dice pic -->
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
</button>
</div>
<label class="sublabel">≤ 11</label>
<span class="power-roll-tier-effect" name="attr_grab_tier_1" ></span>
<label class="sublabel">12-16</label>
<span type="text" class="power-roll-tier-effect" name="attr_grab_tier_2" ></span>
<label class="sublabel">17+</label>
<span type="text" class="power-roll-tier-effect" name="attr_grab_tier_3" ></span>
</div>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_grab_effect"></span>
</div>
</div>
</div>
</div>
<!-- Escape Grab -->
<div class="standard-abilities-item">
<input type="hidden" name="attr_escape_grab_type" value="maneuver" />
<input type="hidden" name="attr_escape_grab_has_power_roll" value="on" />
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<div class="ability-details grid-span-full">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="escape-grab" data-i18n="escape-grab" name="attr_escape_grab_name" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" data-i18n="self" name="attr_escape_grab_distance" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" data-i18n="self" name="attr_escape_grab_target" spellcheck="false"></textarea>
<div class="power-roll">
<div class="power-roll-mods">
<label data-i18n="power-roll"></label>
<span>+</span>
<select class="ability-type" name="attr_escape_grab_characteristic">
<option value="might" data-i18n="might"></option>
<option value="agility" data-i18n="agility"></option>
</select>
</div>
<label class="sublabel">≤ 11</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="escape-grab-tier1" data-i18n="escape-grab-tier1" name="attr_escape_grab_tier_1" spellcheck="false"></textarea>
<label class="sublabel">12-16</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="escape-grab-tier2" data-i18n="escape-grab-tier2" name="attr_escape_grab_tier_2" spellcheck="false"></textarea>
<label class="sublabel">17+</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="escape-grab-tier3" data-i18n="escape-grab-tier3" name="attr_escape_grab_tier_3" spellcheck="false"></textarea>
</div>
<textarea class="ability-effect grid-span-full" data-i18n="escape-grab-effect" name="attr_escape_grab_effect" spellcheck="false"></textarea>
</div>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_escape_grab_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" data-i18n-placeholder="Escape Grab" name="attr_escape_grab_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" data-i18n-placeholder="knockback-keywords" name="attr_escape_grab_keywords"></span>
<span class="ability-type" data-i18n="maneuver"></span>
<span class="ability-distance" data-i18n-placeholder="Distance" name="attr_escape_grab_distance" ></span>
<span class="ability-target" data-i18n-placeholder="Target" name="attr_escape_grab_target" ></span>
<div class="power-roll">
<div class="power-roll-mods">
<label>2d10</label>
<span>+</span>
<span class="power-roll-characteristic" data-i18n-dynamic name="attr_escape_grab_characteristic" ></span>
<button type="action" data-i18n-title="power-roll-share" name="act_escape_grab_power_roll_share">
<!-- Dice pic -->
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
</button>
</div>
<label class="sublabel">≤ 11</label>
<span class="power-roll-tier-effect" data-i18n-placeholder="Tier 1 effect" name="attr_escape_grab_tier_1" ></span>
<label class="sublabel">12-16</label>
<span type="text" class="power-roll-tier-effect" data-i18n-placeholder="Tier 2 effect" name="attr_escape_grab_tier_2" ></span>
<label class="sublabel">17+</label>
<span type="text" class="power-roll-tier-effect" data-i18n-placeholder="Tier 3 effect" name="attr_escape_grab_tier_3" ></span>
</div>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_escape_grab_effect"></span>
</div>
</div>
</div>
</div>
<!-- Claw Dirt Maneuver -->
<div class="standard-abilities-item">
<input type="hidden" name="attr_claw_dirt_type" value="maneuver" />
<input type="hidden" name="attr_claw_dirt_has_power_roll" value="on" />
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<div class="ability-details grid-span-full">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="claw-dirt" data-i18n="claw-dirt" name="attr_claw_dirt_name" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" data-i18n="self" name="attr_claw_dirt_distance" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" data-i18n="self" name="attr_claw_dirt_target" spellcheck="false"></textarea>
<div class="power-roll">
<div class="power-roll-mods">
<label data-i18n="power-roll"></label>
<span>+</span>
<select class="ability-type" name="attr_claw_dirt_characteristic">
<option value="might" data-i18n="might"></option>
</select>
</div>
<label class="sublabel">≤ 11</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="claw-dirt-tier1" data-i18n="claw-dirt-tier1" name="attr_claw_dirt_tier_1" spellcheck="false"></textarea>
<label class="sublabel">12-16</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="claw-dirt-tier2" data-i18n="claw-dirt-tier2" name="attr_claw_dirt_tier_2" spellcheck="false"></textarea>
<label class="sublabel">17+</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="claw-dirt-tier3" data-i18n="claw-dirt-tier3" name="attr_claw_dirt_tier_3" spellcheck="false"></textarea>
</div>
</div>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_claw_dirt_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_claw_dirt_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" name="attr_claw_dirt_keywords"></span>
<span class="ability-type" data-i18n="maneuver"></span>
<span class="ability-distance" name="attr_claw_dirt_distance" ></span>
<span class="ability-target" name="attr_claw_dirt_target" ></span>
<div class="power-roll">
<div class="power-roll-mods">
<label>2d10</label>
<span>+</span>
<span class="power-roll-characteristic" data-i18n-dynamic name="attr_claw_dirt_characteristic" ></span>
<button type="action" data-i18n-title="power-roll-share" name="act_claw_dirt_power_roll_share">
<!-- Dice pic -->
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
</button>
</div>
<label class="sublabel">≤ 11</label>
<span class="power-roll-tier-effect" name="attr_claw_dirt_tier_1" ></span>
<label class="sublabel">12-16</label>
<span class="power-roll-tier-effect" name="attr_claw_dirt_tier_2" ></span>
<label class="sublabel">17+</label>
<span class="power-roll-tier-effect" name="attr_claw_dirt_tier_3" ></span>
</div>
<span class="ability-effect grid-span-full" name="attr_claw_dirt_effect"></span>
</div>
</div>
</div>
<!-- Aid Attack -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="aid-attack" name="attr_aid_attack_name" data-i18n="aid-attack" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="heal-keywords" name="attr_aid_attack_keywords" value="" />
<input type="hidden" name="attr_aid_attack_type" value="maneuver" />
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" name="attr_aid_attack_distance" data-i18n="melee-one" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" name="attr_aid_attack_target" data-i18n="one-enemy" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n="aid-attack-effect" name="attr_aid_attack_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_aid_attack_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" data-i18n-placeholder="Aid Attack" name="attr_aid_attack_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" data-i18n-placeholder="aid-attack-keywords" name="attr_aid_attack_keywords"></span>
<span class="ability-type" data-i18n="maneuver"></span>
<span class="ability-distance" data-i18n-placeholder="Distance" name="attr_aid_attack_distance" ></span>
<span class="ability-target" data-i18n-placeholder="Target" name="attr_aid_attack_target" ></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_aid_attack_effect"></span>
</div>
</div>
</div>
</div>
<!-- Catch Breath -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="catch-breath" name="attr_catch_breath_name" data-i18n="catch-breath" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="catch-breath-keywords" name="attr_catch_breath_keywords" value="" />
<input type="hidden" name="attr_catch_breath_type" value="maneuver" />
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" name="attr_catch_breath_distance" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" name="attr_catch_breath_target" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n="catch-breath-effect" name="attr_catch_breath_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_catch_breath_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" data-i18n-placeholder="Catch Breath" name="attr_catch_breath_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" name="attr_catch_breath_keywords"></span>
<span class="ability-type" data-i18n="maneuver"></span>
<span class="ability-distance" name="attr_catch_breath_distance" ></span>
<span class="ability-target" name="attr_catch_breath_target" ></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_catch_breath_effect"></span>
</div>
</div>
</div>
</div>
<!-- Hide Maneuver -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="hide" name="attr_hide_name" data-i18n="hide" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="hide-keywords" name="attr_hide_keywords" value="" />
<input type="hidden" name="attr_hide_type" value="maneuver" />
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" name="attr_hide_distance" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" name="attr_hide_target" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n="hide-effect" name="attr_hide_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_hide_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_hide_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" name="attr_hide_keywords"></span>
<span class="ability-type" data-i18n="maneuver"></span>
<span class="ability-distance" name="attr_hide_distance" ></span>
<span class="ability-target" name="attr_hide_target" ></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_hide_effect"></span>
</div>
</div>
</div>
</div>
<!-- Search Maneuver -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="search" name="attr_search_name" data-i18n="search" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="search-keywords" name="attr_search_keywords" value="" />
<input type="hidden" name="attr_search_type" value="maneuver" />
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" name="attr_search_distance" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" name="attr_search_target" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n="search-effect" name="attr_search_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_search_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_search_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" name="attr_search_keywords"></span>
<span class="ability-type" data-i18n="maneuver"></span>
<span class="ability-distance" name="attr_search_distance" ></span>
<span class="ability-target" name="attr_search_target" ></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_search_effect"></span>
</div>
</div>
</div>
</div>
<!-- Stand Up -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="stand-up" name="attr_standup_name" data-i18n="stand-up" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="stand-up-keywords" name="attr_standup_keywords" value="" />
<input type="hidden" name="attr_standup_type" value="maneuver" />
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" name="attr_standup_distance" data-i18n="self-melee-one" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" name="attr_standup_target" data-i18n="self-one-creature" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n="stand-up-effect" name="attr_standup_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_standup_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_standup_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" name="attr_standup_keywords"></span>
<span class="ability-type" data-i18n="maneuver"></span>
<span class="ability-distance" name="attr_standup_distance" ></span>
<span class="ability-target" name="attr_standup_target" ></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_standup_effect"></span>
</div>
</div>
</div>
</div>
<!-- Use Consumable -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="consumable" name="attr_consumable_name" data-i18n="consumable" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="consumable-keywords" name="attr_consumable_keywords" value="" />
<input type="hidden" name="attr_consumable_type" value="maneuver" />
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" name="attr_consumable_distance" data-i18n="self-melee-one" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" name="attr_consumable_target" data-i18n="self-one-creature" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n="consumable-effect" name="attr_consumable_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_consumable_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_consumable_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" name="attr_consumable_keywords"></span>
<span class="ability-type" data-i18n="maneuver"></span>
<span class="ability-distance" name="attr_consumable_distance" ></span>
<span class="ability-target" name="attr_consumable_target" ></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_consumable_effect"></span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sheet-triggered">
<h2 data-i18n="standard-triggers"></h2>
<!-- Standard Triggers -->
<div class="standard-abilities">
<!-- Opportunity Attack -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="opportunity-attack" data-i18n="opportunity-attack" name="attr_opportunity_attack_name" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="opportunity-attack-keywords" name="attr_opportunity_attack_keywords" value="" />
<input type="hidden" name="attr_opportunity_attack_type" value="free-triggered-action" />
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="trigger" data-i18n="opportunity-attack-trigger" name="attr_opportunity_attack_trigger" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="effect" data-i18n="opportunity-attack-effect" name="attr_opportunity_attack_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_opportunity_attack_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" data-i18n-placeholder="Opportunity Attack" name="attr_opportunity_attack_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" data-i18n-placeholder="Opportunity Attack" name="attr_opportunity_attack_keywords"></span>
<span class="ability-type" data-i18n="free-triggered-action"></span>
<div class="ability-trigger grid-span-full">
<label><span data-i18n="trigger"></span>:</label>
<span class="ability-trigger" name="attr_opportunity_attack_trigger"></span>
</div>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_opportunity_attack_effect"></span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sheet-noaction">
<h2 data-i18n="standard-noaction-trait"></h2>
<!-- Standard Abilities -->
<div class="standard-abilities">
<!-- Climb Creature Maneuver -->
<div class="standard-abilities-item">
<input type="hidden" name="attr_climb_creature_type" value="no-action" />
<input type="hidden" name="attr_climb_creature_has_power_roll" value="on" />
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<div class="ability-details grid-span-full">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="climb-creature" data-i18n="climb-creature" name="attr_climb_creature_name" spellcheck="false"></textarea>
<div class="power-roll">
<div class="power-roll-mods">
<label data-i18n="power-roll"></label>
<span>+</span>
<select class="ability-type" name="attr_climb_creature_characteristic">
<option value="might" data-i18n="might"></option>
<option value="agility" data-i18n="agility"></option>
</select>
</div>
<label class="sublabel">≤ 11</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="climb-creature-tier1" data-i18n="climb-creature-tier1" name="attr_climb_creature_tier_1" spellcheck="false"></textarea>
<label class="sublabel">12-16</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="climb-creature-tier2" data-i18n="climb-creature-tier2" name="attr_climb_creature_tier_2" spellcheck="false"></textarea>
<label class="sublabel">17+</label>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="climb-creature-tier3" data-i18n="climb-creature-tier3" name="attr_climb_creature_tier_3" spellcheck="false"></textarea>
</div>
<textarea class="ability-effect grid-span-full" data-i18n="climb-creature-effect" name="attr_climb_creature_effect" spellcheck="false"></textarea>
</div>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_climb_creature_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_climb_creature_name"></span>
<div class="ability-details grid-span-full">
<div class="power-roll">
<div class="power-roll-mods">
<label>2d10</label>
<span>+</span>
<span class="power-roll-characteristic" data-i18n-dynamic name="attr_climb_creature_characteristic" ></span>
<button type="action" data-i18n-title="power-roll-share" name="act_climb_creature_power_roll_share">
<!-- Dice pic -->
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
<img src="https://game-icons.net/icons/ffffff/000000/1x1/skoll/d10.svg" alt="Roll Dice" style="width:32px; height:32px;">
</button>
</div>
<label class="sublabel">≤ 11</label>
<span class="power-roll-tier-effect" name="attr_climb_creature_tier_1" ></span>
<label class="sublabel">12-16</label>
<span type="text" class="power-roll-tier-effect" name="attr_climb_creature_tier_2" ></span>
<label class="sublabel">17+</label>
<span type="text" class="power-roll-tier-effect" name="attr_climb_creature_tier_3" ></span>
</div>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_climb_creature_effect"></span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sheet-move">
<h2 data-i18n="standard-move-actions"></h2>
<!-- Standard Moves -->
<div class="standard-abilities">
<!-- Advance Move Action -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="advance" name="attr_advance_name" data-i18n="advance" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="advance-keywords" name="attr_advance_keywords" value="" />
<input type="hidden" name="attr_advance_type" value="maneuver" />
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" name="attr_advance_distance" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" name="attr_advance_target" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n="advance-effect" name="attr_advance_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_advance_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_advance_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" name="attr_advance_keywords"></span>
<span class="ability-type" data-i18n="move-action"></span>
<span class="ability-distance" name="attr_advance_distance" ></span>
<span class="ability-target" name="attr_advance_target" ></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_advance_effect"></span>
</div>
</div>
</div>
</div>
<!--Disengage Move Action -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="disengage" name="attr_disengage_name" data-i18n="disengage" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="disengage-keywords" name="attr_disengage_keywords" value="" />
<input type="hidden" name="attr_disengage_type" value="move-action" />
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" name="attr_disengage_distance" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" name="attr_disengage_target" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n="disengage-effect" name="attr_disengage_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_disengage_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_disengage_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords read-ability-keywords" name="attr_disengage_keywords"></span>
<span class="ability-type" data-i18n="move-action"></span>
<span class="ability-distance" name="attr_disengage_distance" ></span>
<span class="ability-target" name="attr_disengage_target" ></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_disengage_effect"></span>
</div>
</div>
</div>
</div>
<!-- Ride Move Action -->
<div class="standard-abilities-item">
<input class="ability-edit" type="checkbox" id="ability-edit"/>
<div class="ability-card card-edit">
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="ride" name="attr_ride_name" data-i18n="ride" spellcheck="false"></textarea>
<input type="hidden" class="ability-keywords" data-i18n-placeholder="ride-keywords" name="attr_ride_keywords" value="" />
<input type="hidden" name="attr_ride_type" value="maneuver" />
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="distance" name="attr_ride_distance" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n-placeholder="target" name="attr_ride_target" data-i18n="self" spellcheck="false"></textarea>
<textarea class="ability-effect grid-span-full" data-i18n="ride-effect" name="attr_ride_effect" spellcheck="false"></textarea>
</div>
<div class="ability-card card-display">
<button type="action" class="ability-share-button" data-i18n-title="ability-share" name="act_ride_share">
<!-- speech balloon -->
&#128172;
</button>
<span class="ability-name" name="attr_ride_name"></span>
<div class="ability-details grid-span-full">
<span class="ability-keywords" name="attr_ride_keywords"></span>
<span class="ability-type" data-i18n="move-action"></span>
<span class="ability-distance" name="attr_ride_distance" ></span>
<span class="ability-target" name="attr_ride_target" ></span>
<div class="ability-effect grid-span-full">
<label><span data-i18n="effect"></span>:</label>
<span class="ability-effect" name="attr_ride_effect"></span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Disclaimer -->
<div class="disclaimer">
<span data-i18n="disclaimer"></span>
</div>
<!-- Power Roll Roll Template and Ability Template combined -->
<rolltemplate class="sheet-rolltemplate-powerrollability">
<div class="sheet-roll-container">
<div class="character-name">
{{charactername}}
</div>
<div class="header">
{{name}}
</div>
<div class="subtype">
{{subtype}}
</div>
<div class="section">
{{#description}}
<div class="description">
{{description}}
</div>
{{/description}}
{{#rollTotal() hasTrait 1}}
<div class="trait">
{{trait}}
</div>
{{/rollTotal() hasTrait 1}}
{{#rollTotal() hasSolo 1}}
<div class="effect-block">
<div class="effect-label">{{solo1name}}</span>:</div>
<div class="effect-text">{{solo1text}}</div>
</div>
<div class="effect-block">
<div class="effect-label">{{solo2name}}</span>:</div>
<div class="effect-text">{{solo2text}}</div>
</div>
{{/rollTotal() hasSolo 1}}
</div>
<div class="meta-row">
<div class="keywords">{{keywords}}</div>
<div class="action-type">{{type}}</div>
</div>
<div class="action-row">
<div class="distance">
{{#distance}}
<!-- triangle-ruler -->
&#128208;{{distance}}
{{/distance}}
</div>
<div class="target">
{{#target}}
<!-- bullseye -->
&#127919;{{target}}
{{/target}}
</div>
</div>
{{#rollTotal() hasTrigger 1}}
<div class="effect-block">
<div class="effect-label"><span data-i18n="trigger"></span>:</div>
<div class="effect-text">{{trigger}}</div>
</div>
{{/rollTotal() hasTrigger 1}}
{{#rollTotal() hasPreEffect 1}}
<div class="effect-block">
<div class="effect-label"><span data-i18n="pre-effect"></span>:</div>
<div class="effect-text">{{pre_effect}}</div>
</div>
{{/rollTotal() hasPreEffect 1}}
{{#rollTotal() hasPowerRoll 1}}
<div class="stat-row">
<div class="roll-label">{{powerRoll}}:</div>
<span class="roll-formula">2d10 + {{characteristic}}</span>
</div>
<div class="roll-column1">
<div class="powerroll-2d10">
<label>2d10:</label> {{2d10}}
</div>
<div class="powerroll-characteristic">
<label><span data-i18n="{{characteristic}}"></span>:</label> {{characteristicValue}}
</div>
{{#rollGreater() bonus 0}}
<div class="powerroll-bonus-penalty">
<label><span data-i18n="bonus"></span>:</label> {{bonus}}
</div>
{{/rollGreater() bonus 0}}
{{#rollLess() bonus 0}}
<div class="powerroll-bonus-penalty">
<label><span data-i18n="penalty"></span>:</label> {{bonus}}
</div>
{{/rollLess() bonus 0}}
</div>
<div class="roll-column2">
<div class="powerroll-total">
<label><span data-i18n="power-roll-total"></span>:</label> {{total}}
</div>
<div class="powerroll-tier">
<label><span data-i18n="tier"></span>:</label> {{computed::tier}}
</div>
</div>
{{#rollTotal() computed::isDoubleEdge 1}}
<div class="powerroll-edge-bane" data-i18n="double-edge"></div>
{{/rollTotal() computed::isDoubleEdge 1}}
{{#rollGreater() edgeBane 0}}
<div class="powerroll-edge-bane" data-i18n="edge"></div>
{{/rollGreater() edgeBane 0}}
{{#rollLess() edgeBane 0}}
<div class="powerroll-edge-bane" data-i18n="bane"></div>
{{/rollLess() edgeBane 0}}
{{#rollTotal() computed::isDoubleBane 1}}
<div class="powerroll-edge-bane" data-i18n="double-bane"></div>
{{/rollTotal() computed::isDoubleBane 1}}
{{#rollGreater() 2d10 18}}
<div class="powerroll-crit" data-i18n="critical-hit"></div>
{{/rollGreater() 2d10 18}}
<div class="tiers">
<span class="range">≤ 11</span>
<span class="damage">{{tier1}}</span>
<span class="range">1216</span>
<span class="damage">{{tier2}}</span>
<span class="range">17+</span>
<span class="damage">{{tier3}}</span>
</div>
{{/rollTotal() hasPowerRoll 1}}
{{#rollTotal() hasSpecial 1}}
<div class="effect-block">
<div class="effect-label"><span data-i18n="special"></span>:</div>
<div class="effect-text">{{special}}</div>
</div>
{{/rollTotal() hasSpecial 1}}
{{#rollTotal() hasEffect 1}}
<div class="effect-block">
<div class="effect-label"><span data-i18n="effect"></span>:</div>
<div class="effect-text">{{effect}}</div>
</div>
{{/rollTotal() hasEffect 1}}
{{#rollTotal() hasMalprop 1}}
<div class="effect-block">
<div class="effect-label">{{malpropcost}}&nbsp;<span data-i18n="malice"></span>:</div>
<div class="effect-text">{{malprop}}</div>
</div>
{{/rollTotal() hasMalprop 1}}
{{#rollTotal() hasSpend 1}}
<div class="effect-block">
<div class="effect-label"><span data-i18n="spend"></span>&nbsp;{{spendcost}}:</div>
<div class="effect-text">{{spend}}</div>
</div>
{{/rollTotal() hasSpend 1}}
{{#rollTotal() hasCustom 1}}
<div class="effect-block">
<div class="effect-label">{{customlabel}}:</div>
<div class="effect-text">{{custom}}</div>
</div>
{{/rollTotal() hasCustom 1}}
</div>
</rolltemplate>
<!-- Power Roll Roll Template -->
<rolltemplate class="sheet-rolltemplate-powerroll">
<div class="sheet-roll-container">
<div class="character-name">
{{charactername}}
</div>
<div class="header">
{{name}}
</div>
<div class="roll-column1">
<div class="powerroll-2d10">
<label>2d10:</label> {{2d10}}
</div>
<div class="powerroll-characteristic">
<label><span data-i18n="{{characteristic}}"></span>:</label> {{characteristicValue}}
</div>
{{#rollGreater() bonus 0}}
<div class="powerroll-bonus-penalty">
<label><span data-i18n="bonus"></span>:</label> {{bonus}}
</div>
{{/rollGreater() bonus 0}}
{{#rollLess() bonus 0}}
<div class="powerroll-bonus-penalty">
<label><span data-i18n="penalty"></span>:</label> {{bonus}}
</div>
{{/rollLess() bonus 0}}
</div>
<div class="roll-column2">
<div class="powerroll-total">
<label><span data-i18n="power-roll-total"></span>:</label> {{total}}
</div>
<div class="powerroll-tier">
<label><span data-i18n="tier"></span>:</label> {{computed::tier}}
</div>
</div>
{{#rollTotal() computed::isDoubleEdge 1}}
<div class="powerroll-edge-bane" data-i18n="double-edge"></div>
{{/rollTotal() computed::isDoubleEdge 1}}
{{#rollGreater() edgeBane 0}}
<div class="powerroll-edge-bane" data-i18n="edge"></div>
{{/rollGreater() edgeBane 0}}
{{#rollLess() edgeBane 0}}
<div class="powerroll-edge-bane" data-i18n="bane"></div>
{{/rollLess() edgeBane 0}}
{{#rollTotal() computed::isDoubleBane 1}}
<div class="powerroll-edge-bane" data-i18n="double-bane"></div>
{{/rollTotal() computed::isDoubleBane 1}}
{{#rollGreater() 2d10 18}}
<div class="powerroll-crit" data-i18n="critical-hit"></div>
{{/rollGreater() 2d10 18}}
</div>
</rolltemplate>
<!-- Ability Roll Template -->
<rolltemplate class="sheet-rolltemplate-ability">
<div class="sheet-roll-container">
<div class="header">{{name}}</div>
<div class="description">{{description}}</div>
<div class="meta-row">
<div class="keywords">{{keywords}}</div>
<div class="action-type">{{type}}</div>
</div>
<div class="action-row">
{{#rollTotal() hasDistance 1}}
<div class="distance">
<!-- triangle-ruler -->
&#128208;{{distance}}
</div>
{{/rollTotal() hasDistance 1}}
{{#rollTotal() hasTarget 1}}
<div class="target">
<!-- bullseye -->
&#127919;{{target}}
</div>
{{/rollTotal() hasTarget 1}}
</div>
{{#rollTotal() hasTrigger 1}}
<div class="effect-block">
<div class="effect-label"><span data-i18n="trigger"></span>:</div>
<div class="effect-text">{{trigger}}</div>
</div>
{{/rollTotal() hasTrigger 1}}
{{#rollTotal() hasPowerRoll 1}}
<div class="stat-row">
<div class="roll-label">{{powerRoll}}:</div>
<span class="roll-formula">2d10 + {{characteristic}}</span>
</div>
<div class="tiers">
<div class="tier">
<span class="range">≤ 11</span>
<span class="damage">{{tier1}}</span>
</div>
<div class="tier">
<span class="range">1216</span>
<span class="damage">{{tier2}}</span>
</div>
<div class="tier">
<span class="range">17+</span>
<span class="damage">{{tier3}}</span>
</div>
</div>
{{/rollTotal() hasPowerRoll 1}}
{{#rollTotal() hasEffect 1}}
<div class="effect-block">
<div class="effect-label"><span data-i18n="effect"></span>:</div>
<div class="effect-text">{{effect}}</div>
</div>
{{/rollTotal() hasEffect 1}}
</div>
</rolltemplate>
<!-- Monster Ability Roll Template -->
<rolltemplate class="sheet-rolltemplate-monsterability">
<div class="sheet-roll-container">
<div class="character-name">
{{charactername}}
</div>
<div class="header">
{{name}}
</div>
<div class="subtype">
{{subtype}}
</div>
<div class="section">
{{#description}}
<div class="description">
{{description}}
</div>
{{/description}}
{{#rollTotal() hasTrait 1}}
<div class="trait">
{{trait}}
</div>
{{/rollTotal() hasTrait 1}}
{{#rollTotal() hasSolo 1}}
<div class="effect-block">
<div class="effect-label">{{solo1name}}</span>:</div>
<div class="effect-text">{{solo1text}}</div>
</div>
<div class="effect-block">
<div class="effect-label">{{solo2name}}</span>:</div>
<div class="effect-text">{{solo2text}}</div>
</div>
{{/rollTotal() hasSolo 1}}
</div>
<div class="meta-row">
<div class="keywords">{{keywords}}</div>
<div class="action-type">{{type}}</div>
</div>
<div class="action-row">
<div class="distance">
{{#distance}}
<!-- triangle-ruler -->
&#128208;{{distance}}
{{/distance}}
</div>
<div class="target">
{{#target}}
<!-- bullseye -->
&#127919;{{target}}
{{/target}}
</div>
</div>
{{#rollTotal() hasTrigger 1}}
<div class="effect-block">
<div class="effect-label"><span data-i18n="trigger"></span>:</div>
<div class="effect-text">{{trigger}}</div>
</div>
{{/rollTotal() hasTrigger 1}}
{{#rollTotal() hasPreEffect 1}}
<div class="effect-block">
<div class="effect-label"><span data-i18n="pre-effect"></span>:</div>
<div class="effect-text">{{pre_effect}}</div>
</div>
{{/rollTotal() hasPreEffect 1}}
{{#rollTotal() hasPowerRoll 1}}
<div class="stat-row">
<div class="roll-label">{{powerRoll}}:</div>
<span class="roll-formula">2d10 + {{characteristic}}</span>
</div>
<div class="tiers">
<span class="range">≤ 11</span>
<span class="damage">{{tier1}}</span>
<span class="range">1216</span>
<span class="damage">{{tier2}}</span>
<span class="range">17+</span>
<span class="damage">{{tier3}}</span>
</div>
{{/rollTotal() hasPowerRoll 1}}
{{#rollTotal() hasSpecial 1}}
<div class="effect-block">
<div class="effect-label"><span data-i18n="special"></span>:</div>
<div class="effect-text">{{special}}</div>
</div>
{{/rollTotal() hasSpecial 1}}
{{#rollTotal() hasEffect 1}}
<div class="effect-block">
<div class="effect-label"><span data-i18n="effect"></span>:</div>
<div class="effect-text">{{effect}}</div>
</div>
{{/rollTotal() hasEffect 1}}
{{#rollTotal() hasMalprop 1}}
<div class="effect-block">
<div class="effect-label">{{malpropcost}}&nbsp;<span data-i18n="malice"></span>:</div>
<div class="effect-text">{{malprop}}</div>
</div>
{{/rollTotal() hasMalprop 1}}
{{#rollTotal() hasSpend 1}}
<div class="effect-block">
<div class="effect-label"><span data-i18n="spend"></span>&nbsp;{{spendcost}}:</div>
<div class="effect-text">{{spend}}</div>
</div>
{{/rollTotal() hasSpend 1}}
{{#rollTotal() hasCustom 1}}
<div class="effect-block">
<div class="effect-label">{{customlabel}}:</div>
<div class="effect-text">{{custom}}</div>
</div>
{{/rollTotal() hasCustom 1}}
</div>
</rolltemplate>
<!-- Ability Power Roll -->
<rolltemplate class="sheet-rolltemplate-simpleroll">
<div class="sheet-roll-container">
<div class="character-name">{{charactername}}</div>
<div class="header">
{{name}}
</div>
<div class="powerroll-2d10">
<label>{{rolltitle}}:</label> {{roll}}
</div>
{{#rollTotal() hasTier 1}}
<div class="powerroll-tier">
<label><span data-i18n="tier"></span>
{{#rollLess() roll 12}}
<span>1 (&le;11)</span>
{{/rollLess() roll 12}}
{{#rollBetween() roll 12 16}}
<span>2 (12-16)</span>
{{/rollBetween() roll 12 16}}
{{#rollGreater() roll 16}}
<span>3 (17+)</span>
{{/rollGreater() roll 16}}
</label>
</div>
{{/rollTotal() hasTier 1}}
</div>
</rolltemplate>
<!-- Sheet Workers -->
<script type="text/worker">
// Sheet version used to deal with major changes
const version = "1.3";
/**
** Sheet Utilities
**/
/**
* Removes all rows from a given repeating section.
* @param {string} sectionName The name of the section (e.g., 'abilities', 'modifiers').
*/
async function clearRepeatingSection(sectionName) {
try {
const rowIDs = await getSectionIDsAsync(sectionName);
// Create an array of promises for each row removal.
const removalPromises = rowIDs.map(id =>
removeRepeatingRow(`repeating_${sectionName}_${id}`)
);
// Execute all removals concurrently.
await Promise.all(removalPromises);
} catch (error) {
console.error(`Failed to clear repeating section "${sectionName}":`, error);
}
}
/**
* Sets the Active Character ID
*/
function setActiveCharacterId(id) {
const ocid = getActiveCharacterId();
const data = {
id: '0',
type: 'setActiveCharacter',
data: id,
};
if (self.dispatchEvent) {
const event = new CustomEvent('message');
event.data = data;
self.dispatchEvent(event);
}
else {
self.onmessage({ data });
}
return ocid;
}
/**
* Async workaround for getAttrs
*/
function getAttrsAsync(props) {
const acid = getActiveCharacterId();
let ocid = null;
return new Promise((resolve, reject) => {
ocid = setActiveCharacterId(acid);
try {
getAttrs(props, (values) => resolve(values));
}
catch {
reject();
}
}).finally(() => {
setActiveCharacterId(ocid);
});
}
/**
* Async workaround for setAttrs
*/
function setAttrsAsync(props) {
const acid = getActiveCharacterId();
let ocid = null;
return new Promise((resolve, reject) => {
ocid = setActiveCharacterId(acid);
try {
setAttrs(props, undefined, (values) => resolve(values));
}
catch {
reject();
}
}).finally(() => {
setActiveCharacterId(ocid);
});
}
/**
* Async workaround for getSectionIDs
*/
function getSectionIDsAsync(sectionName) {
const acid = getActiveCharacterId();
let ocid = null;
return new Promise((resolve, reject) => {
ocid = setActiveCharacterId(acid);
try {
getSectionIDs(sectionName, (values) => resolve(values));
}
catch {
reject();
}
}).finally(() => {
setActiveCharacterId(ocid);
});
}
/**
**Tab switching in Ability Panel
**/
// Tab Button list and event listener
const buttonlist = ["action", "maneuver", "triggered","noaction","move"];
buttonlist.forEach(button => {
on(`clicked:${button}`, function() {
setAttrs({
abilitiesTab: button
});
});
});
// NPC tab button list and event listener
const npcbuttonlist = ["npcabilities", "malice", "villainaction"];
npcbuttonlist.forEach(button => {
on(`clicked:${button}`, function() {
setAttrs({
npcabilitiesTab: button
});
});
});
/**
** Roll Template Functions
**/
const ROLLTEMPLATES = {
DISPLAY: 'monsterability',
POWERROLL: 'powerroll',
ABILITYROLL: 'powerrollability',
SIMPLE: 'simpleroll',
}
/**
** Processes two sources of information and constructs the roll string used by Roll20. Then it executes the roll.
** @param {string} templateName The template to be used for the roll
** @param {Array<Object>} directMap A dictionary of rolltemplate keys and their values.
** @param {Array<Object>} rollValueMap A dictionary of rolltemplate keys and their values that will be added as inline rolls.
** @param {boolean} isPowerRoll (optional) True if the roll will contain a power roll
**/
async function buildRoll (templateName, directMap, rollValueMap, isPowerRoll = false) {
console.log('~~~ buildRoll ~~~');
// Check that we have the bare minimum information needed for a roll
if (!templateName || !directMap) {
console.log('Could not build roll: missing data');
return;
}
// Translation helper
const getKeys = (keys) => keys.reduce((acc, k) => {
acc[k] = getTranslationByKey(k) || k;
return acc;
}, {});
const t = getKeys([
'power-roll', 'edge-or-bane', 'no-edge-or-bane', 'double-edge',
'edge', 'bane', 'double-bane', 'bonus-or-penalty'
]);
// Setup the template for the roll
let rollString = `@{wtype}&{template:${templateName}} {{charactername=@{character_name}}} `;
let powerroll = '';
// Check if we need to add the extra information for a power roll.
if (isPowerRoll && rollValueMap) {
const charValue = rollValueMap.characteristicValue;
if (charValue === undefined || charValue === null) {
console.log('Could not build roll: no characteristic value specified');
return;
}
const STATNAMES = ['might', 'agility', 'reason', 'intuition', 'presence'];
const characteristicTranslation = getTranslationByKey(directMap.characteristic) || directMap.characteristic;
const name = !directMap.name ? `{{name=${characteristicTranslation} ${t['power-roll']}}} `: '';
rollString += [
'[[ [[2d10cs>11cf<0]][2d10]',
`+ [[${rollValueMap.characteristicValue}[${characteristicTranslation}]]][${characteristicTranslation}]`,
`+ [[?{${t['edge-or-bane']}|${t['no-edge-or-bane']},0|${t['double-edge']},0[${t['double-edge']}]|${t['edge']},2[${t['edge']}]|${t['bane']},-2[${t['bane']}]|${t['double-bane']},0[${t['double-bane']}]} ]][${t['edge-or-bane']}]`,
`+ [[?{${t['bonus-or-penalty']}|0}]][${t['bonus-or-penalty']}] ]]`,
`{{2d10=$[[0]]}} {{edgeBane=$[[2]]}} {{bonus=$[[3]]}} {{total=$[[4]]}}`,
`{{isDoubleEdge=[[0]]}} {{isDoubleBane=[[0]]}} {{tier=[[0]]}}`,
name
].join(' ');
}
// Mapping Attributes
const directEntries = Object.entries(directMap)
.filter(([_, v]) => v)
.map(([k, v]) => `{{${k}=${v}}}`);
const valueEntries = Object.entries(rollValueMap)
.filter(([k, v]) => v === 1 || k === 'characteristicValue')
.map(([k, v]) => `{{${k}=[[${v}]]}}`);
rollString += ` ${directEntries.join(' ')} ${valueEntries.join(' ')}`;
startRoll(rollString, ({rollId, results}) => {
if (!isPowerRoll) {
return finishRoll(rollId);
}
// Logic for Tier Calculation
const expr = results.edgeBane.expression;
const isDoubleEdge = expr.includes(`[${t['double-edge']}]`) ? 1 : 0;
const isDoubleBane = expr.includes(`[${t['double-bane']}]`) ? 1 : 0;
const total = results.total.result;
const tierBase = total >= 17 ? 3 : (total >= 12 ? 2 : 1);
const tierMod = isDoubleEdge ? 1 : (isDoubleBane ? -1 : 0);
const tier = Math.max(1, Math.min(3, tierBase + tierMod));
finishRoll(rollId, { isDoubleEdge, isDoubleBane, tier });
});
}
/**
** Basic Power Roll
** Constructs and rolls a power roll using the powerroll template
** @param {string} characteristic The characteristic to use for the roll.
** @param {string} abilityName (optional) The name of the ability invoking the roll.
**/
async function rollPower(characteristic) {
console.log("~~~ rollPower ~~~");
// Get the characteristic and populate the translations for use in the roll.
const attrs = await getAttrsAsync([characteristic]);
const characteristicValue = attrs[characteristic];
buildRoll(ROLLTEMPLATES.POWERROLL, {characteristic},{characteristicValue}, true);
}
/**
** Simple Roll to display Recovery use
** And adjust automatically in sheet
**/
async function rollRecovery() {
console.log("~~~ rollRecovery ~~~");
// Get the recovery amount and populate the translations for use in the roll.
const attrs = await getAttrsAsync(['stamina_max', 'recovery_amount', 'stamina', 'recoveries']);
const max = parseInt(attrs.stamina_max) || 0;
const current = parseInt(attrs.stamina) || 0;
const amount = parseInt(attrs.recovery_amount) || 0;
const available = parseInt(attrs.recoveries) || 0;
if (available <= 0) {
console.log("No recoveries remaining.");
//insert logic to let player know they don't have recoveries
return;
}
const rollTemplate = `@{wtype}&{template:${ROLLTEMPLATES.SIMPLE}} {{charactername=@{character_name}}} {{name=Recovery}} {{rolltitle=Stamina Gain}} {{roll=[[${amount}]]}}`;
startRoll(rollTemplate, (results) => {
// Calculate new values: Add recovery to current stamina (cap at max) and subtract 1 recovery.
const newStamina = Math.min(max, current + amount);
const newRecoveries = Math.max(0, available - 1);
setAttrs({
stamina: newStamina,
recoveries: newRecoveries
});
finishRoll(results.rollId);
});
}
/**
** Simple Roll to display Heroic Resource gain
** And adjust automatically in sheet
**/
async function rollResource() {
console.log("~~~ rollResource ~~~");
// Get the resource name and resource amount.
const attrs = await getAttrsAsync(['resource', 'resource_name', 'resource_amount']);
const current = parseInt(attrs.resource) || 0;
const name = attrs.resource_name || "Resource";
const gainExpr = attrs.resource_amount || "?{d3 or number|0}";
const rollTemplate = `@{wtype}&{template:${ROLLTEMPLATES.SIMPLE}} {{charactername=@{character_name}}} {{name=${name} ^{roll-resource-gain}}} {{rolltitle=${name}}} {{roll=[[${gainExpr}]]}}`;
startRoll(rollTemplate, ({ rollId, results }) => {
const gain = results.roll.result || 0;
setAttrs({ resource: current + gain });
finishRoll(rollId);
});
}
/**
* Surge Rolling Logic
* Handles both Damage and Potency surges use.
* @param {string} type either 'damage' or 'potency'
**/
async function rollSurge(type = 'damage') {
console.log(`~~~ rollSurge: ${type} ~~~`);
const attrs = await getAttrsAsync(["surges", "surge_damage"]);
const available = parseInt(attrs.surges) || 0;
const damagePerSurge = parseInt(attrs.surge_damage) || 0;
if (type === 'damage' && available > 0) {
const query = `?{How many?|1|2|3}`;
const template = `@{wtype}&{template:${ROLLTEMPLATES.SIMPLE}} {{charactername=@{character_name}}} {{name=^{roll-surge-damage}}} {{rolltitle=[[${query}]]}} {{roll=[[([[${query}]]*${damagePerSurge})]] ^{surges-damage}}}`;
startRoll(template, ({ rollId, results }) => {
const used = results.rolltitle.result || 0;
if (used <= available) {
setAttrs({ surges: available - used });
}
finishRoll(rollId);
});
} else if (type === 'potency' && available >= 2) {
const template = `@{wtype}&{template:${ROLLTEMPLATES.SIMPLE}} {{charactername=@{character_name}}} {{name=^{roll-surge-damage}}} {{rolltitle=[[2]]}} {{roll=^{roll-surge-potency-desc}}}`;
startRoll(template, ({ rollId }) => {
setAttrs({ surges: available - 2 });
finishRoll(rollId);
});
}
}
/**
** Displays a feature using the monsterability template
** @param {string} name The feature's name.
** @param {string} subtitle A subtitle for the feature, usually the source (Class, Perk, etc).
** @param {string} description The feature's description.
**/
function featureDisplay(name, subtitle, description) {
console.log('~~~ featureDisplay ~~~');
const roll = [
`@{wtype}&{template:${ROLLTEMPLATES.DISPLAY}}`,
'{{charactername=@{character_name}}}',
'{{name=' + name + '}}',
'{{trait=' + description + '}}',
'{{subtype=' + subtitle + '}}',
'{{hasTrait=[[1]]}}',
].join(' ');
startRoll(roll, ({ rollId }) => finishRoll(rollId));
}
/**
** Ability Sharing Handler
**/
async function handleAbilityShare(prefix, abilityPrefix, isPowerRoll = false) {
console.log('~~~ handleAbilityShare ~~~', prefix, abilityPrefix, isPowerRoll);
// 1. Define all possible ability attributes across both player and NPC sections.
const allAbilityAttributeNames = [
'name', 'cost', 'description', 'keywords',
'type', 'distance', 'target', 'trigger',
'characteristic', 'tier_1', 'tier_2', 'tier_3', 'effect',
'subtype', 'malice_cost', 'trait',
'solo_1_name', 'solo_1_text', 'solo_2_name', 'solo_2_text',
'special', 'malice', 'spend', 'custom', 'spend_cost', 'custom_label',
'pre_effect'
];
const allAbilityToggles = [
'has_power_roll', 'has_effect', 'has_special', 'has_malice',
'has_spend', 'has_custom', 'has_pre_effect'
];
const abPrefix = abilityPrefix ? `${abilityPrefix}_` : '';
// 2. Define the character-level attributes needed for both.
const globalAttrsToGet = prefix === 'repeating_npcabilities'
? [] // Monster abilities need nothing
: ['resource_name','kit_melee_damage_1','kit_melee_damage_2','kit_melee_damage_3','kit_ranged_damage_1','kit_ranged_damage_2','kit_ranged_damage_3', 'mag_psi_dam', 'sanct_weap' ]; // Player abilities need resource names and kit damage info
const characteristics = isPowerRoll ? ['might', 'agility', 'reason', 'intuition', 'presence'] : [];
// 3. Construct the full list of attributes to fetch.
const attrsToFetch = [
...globalAttrsToGet,
...characteristics,
...allAbilityAttributeNames.map(x => `${prefix}_${abPrefix}${x}`),
...allAbilityToggles.map(x => `${prefix}_${x}`),
'options_calculate_damage',
];
const attrs = await getAttrsAsync(attrsToFetch);
// 4. Execute the custom logic (player or monster specific)
const { directMap, rollValueMap } = getAbilityMaps(attrs, prefix, abPrefix);
// 5. Call the shared roll function
const template = isPowerRoll ? ROLLTEMPLATES.ABILITYROLL : ROLLTEMPLATES.DISPLAY;
const roll = buildRoll(template, directMap, rollValueMap, isPowerRoll);
}
const NPC_ABILITIES = ["repeating_npcabilities", "repeating_malice", "repeating_villainaction"];
/**
* Helper to handle the complex damage calculation logic
*/
function getTierDamage(attrs, prefix, abilityPrefix, keywords) {
const rawTiers = [
attrs[`${prefix}_${abilityPrefix}tier_1`] || '',
attrs[`${prefix}_${abilityPrefix}tier_2`] || '',
attrs[`${prefix}_${abilityPrefix}tier_3`] || ''
];
if (attrs['options_calculate_damage'] !== "1" || !rawTiers[0]) {
return rawTiers;
}
let kit = [];
let otherDamage = "";
const weapon = getTranslationByKey('weapon');
// Kit Calculation
if (keywords.includes(weapon)) {
const isMelee = keywords.includes(getTranslationByKey('melee'));
const type = isMelee ? 'melee' : 'ranged';
kit = [
parseInt(attrs[`kit_${type}_damage_1`]) || 0,
parseInt(attrs[`kit_${type}_damage_2`]) || 0,
parseInt(attrs[`kit_${type}_damage_3`]) || 0
];
if (attrs['sanct_weap']) {
otherDamage += `+${attrs['sanct_weap']}[${getTranslationByKey('sanct-weap')}]`;
}
}
// Magic/Psionic Calculation
const magPsiDam = attrs['mag_psi_dam'];
if (magPsiDam) {
['psionic', 'magic'].forEach(key => {
if (keywords.includes(getTranslationByKey(key))) {
otherDamage += `+${magPsiDam}[${getTranslationByKey(key)}]`;
}
});
}
return rawTiers.map((val, i) => damageCalculation(val, kit[i] || 0, otherDamage));
}
/**
* Creates the attribute maps needed to build an ability sharing roll.
* @param {Array<Object>} Character and ability attributes.
* @param {string} The name of the repeating ability (e.g "repeating_abilities").
* @param {string} The prefix used for the for the attribute (e.g "ability").
* @returns {Array<Object>, Array<Object>} Two arrays containing maps of the roll
* template elements and their respective values. The first contains plain text,
* the second contains inline rolls.
*/
function getAbilityMaps(attrs, prefix, abilityPrefix) {
console.log('~~~ getAbilityMaps ~~~');
const base = `${prefix}_${abilityPrefix}`;
const subtypeVal = attrs[`${base}subtype`] || '';
const isNpc = NPC_ABILITIES.some(p => prefix.startsWith(p));
let subtype = '', characteristic = '', characteristicValue = 0, hasEffect = 0;
// Core Branching Logic (NPC vs Player)
if (isNpc) {
if (subtypeVal.includes('malice')) {
subtype = `${attrs[`${base}malice_cost`]} ${getTranslationByKey('malice')}`;
} else {
subtype = getTranslationByKey(subtypeVal) || '';
}
characteristic = 'modifiers';
characteristicValue = parseInt(attrs[`${base}characteristic`]) || 0;
hasEffect = attrs[`${prefix}_has_effect`] === 'on' ? 1 : 0;
} else {
const resName = attrs.resource_name || getTranslationByKey('resource-name-placeholder');
const cost = attrs[`${base}cost`];
subtype = (cost && cost !== '0') ? `(${cost} ${resName})` : '';
characteristic = getTranslationByKey(attrs[`${base}characteristic`]) || '';
characteristicValue = attrs[attrs[`${base}characteristic`]] || 0;
hasEffect = attrs[`${base}effect`] ? 1 : 0;
}
// Keywords and Damage
const keywordsRaw = attrs[`${base}keywords`] || '';
const keywordsArr = keywordsRaw.split(',').map(k => k.trim());
const [tier1, tier2, tier3] = getTierDamage(attrs, prefix, abilityPrefix, keywordsArr);
// Build the directMap - these will be transformed into a {{key=value}} format.
const directMap = {
name: attrs[`${base}name`],
subtype,
characteristic,
tier1, tier2, tier3,
type: attrs[`${base}type`] === 'no-action' ? '' : getTranslationByKey(attrs[`${base}type`]),
keywords: keywordsRaw,
description: attrs[`${base}description`] || '',
distance: attrs[`${base}distance`] || '',
target: attrs[`${base}target`] || '',
trigger: attrs[`${base}trigger`] || '',
special: attrs[`${base}special`] || '',
effect: attrs[`${base}effect`] || '',
pre_effect: attrs[`${base}pre_effect`] || '',
malprop: attrs[`${base}malice`] || '',
malpropcost: attrs[`${base}cost`] || '',
solo1name: attrs[`${base}solo_1_name`] || '',
solo1text: attrs[`${base}solo_1_text`] || '',
solo2name: attrs[`${base}solo_2_name`] || '',
solo2text: attrs[`${base}solo_2_text`] || '',
customlabel: attrs[`${base}custom_label`] || '',
custom: attrs[`${base}custom`] || '',
spend: attrs[`${base}spend`] || '',
spendcost: attrs[`${base}spend_cost`] || '',
powerRoll: attrs[`${prefix}_has_power_roll`] === 'on' ? getTranslationByKey('power-roll') : ''
};
//Build the rollValueMap - these will be transformed into a {{key=[[value]]}} format.
const rollValueMap = {
hasTrait: (subtypeVal.includes('trait') || !isNpc) && attrs[`${base}trait`] ? 1 : 0,
hasSolo: subtypeVal.includes('solo') ? 1 : 0,
hasTrigger: attrs[`${base}type`]?.includes('triggered') && attrs[`${base}trigger`] ? 1 : 0,
hasPowerRoll: attrs[`${prefix}_has_power_roll`] === 'on' ? 1 : 0,
hasSpecial: attrs[`${prefix}_has_special`] === 'on' ? 1 : 0,
hasEffect: hasEffect,
hasPreEffect: attrs[`${prefix}_has_pre_effect`] === 'on' ? 1 : 0,
hasMalprop: attrs[`${prefix}_has_malice`] === 'on' ? 1 : 0,
hasSpend: attrs[`${prefix}_has_spend`] === 'on' ? 1 : 0,
hasCustom: attrs[`${prefix}_has_custom`] === 'on' ? 1 : 0,
characteristicValue
};
return { directMap, rollValueMap };
}
/**
** Adds inline Damage and Potency Calculations for tier effects
** @param {string} tierEffect The raw tier effect text.
** @param {int} kit Kit damage for the specific tier
** @param {int} other Other damage
** @returns {string} Altered tier effect for roll template
**/
function damageCalculation(tierEffect, kit = 0, other = 0) {
if (!tierEffect) return '';
console.log('~~~ damageCalculation ~~~');
// Create a reference for the characteristics that is translated into the language being used by the sheet
const charMap = {
[getTranslationByKey("M")]: { macro: '@{might}', label: getTranslationByKey('might') },
[getTranslationByKey("A")]: { macro: '@{agility}', label: getTranslationByKey('agility') },
[getTranslationByKey("R")]: { macro: '@{reason}', label: getTranslationByKey('reason') },
[getTranslationByKey("I")]: { macro: '@{intuition}', label: getTranslationByKey('intuition') },
[getTranslationByKey("P")]: { macro: '@{presence}', label: getTranslationByKey('presence') }
};
const charList = Object.keys(charMap).join('');
// Separate Damage from Effects
const [rawDamage, ...rest] = tierEffect.split(';');
let effectSection = rest.length ? ';' + rest.join(';') : '';
const orTrans = getTranslationByKey("damage-calc-or");
/**
* Tier effects typically use one of the following formats:
* <baseDamage> + <characteristic> <damageType> damage; <added effects>
* <baseDamage> + <characteristic> or <characteristic> <damageType> damage; <added effects>
* <baseDamage> <damageType> damage; <added effects>
* <effects>
*
* REGEX to get characteristics from the tier effect:
* ^(\d+) : (Group 1) Base Damage - Required.
* (?: : Start Optional non-capturing group for the "+" section.
* \s*\+\s* : Match "+" with flexible spacing.
* ( : (Group 2) The Characteristic Block.
* [charList] : Start with one valid letter.
* (?:[\s,]+(?:${orTrans}\s+)?[${charList}])* : Match additional letters with commas/or.
* )
* )? : End Optional group (the "?" makes "3 damage" work).
*/
const damageRegex = new RegExp(`^(\\d+)(?:\\s*\\+\\s*([${charList}](?:[\\s,]+(?:${orTrans}\\s+)?[${charList}])*))?`, "");
const match = rawDamage.trim().match(damageRegex);
if (!match) return tierEffect;
// baseDamage contains the damage number, characteristicsRaw contains any matched characteristics
const baseDamage = match[1];
const characteristicsRaw = match[2];
let damageCalc = [baseDamage];
let processedChars = [];
// Parse Characteristics if they exist
if (characteristicsRaw) {
// Extract localized letters found in the string
const charLetters = characteristicsRaw.match(new RegExp(`[${charList}]`, "g"));
charLetters.forEach(letter => {
const entry = charMap[letter.toUpperCase()];
if (entry) {
processedChars.push(`${entry.macro}[${entry.label}]`);
}
});
if (processedChars.length > 1) {
damageCalc.push(`+ {${processedChars.join(', ')}}kh1`);
} else if (processedChars.length === 1) {
damageCalc.push(`+ ${processedChars[0]}`);
}
}
// Add External Modifiers
if (kit) damageCalc.push(`+ ${kit}[${getTranslationByKey('kit')}]`);
if (other) damageCalc.push(other);
// Extract Damage Type & Potency replacements
const matchedText = match[0];
const damageType = rawDamage.trim().substring(matchedText.length).trim();
['weak', 'average', 'strong'].forEach(p => {
const trans = getTranslationByKey(`potency-${p}`);
const trigger = `[${trans.toLowerCase()}]`;
const replacement = `[[@{potency_${p}}[${trans}]]]`;
effectSection = effectSection.split(trigger).join(replacement);
});
return `[[${damageCalc.join(' ')}]] ${damageType}${effectSection}`.trim();
}
/**
** Event Handlers
**/
// Handlers for repeating sections
// Maps the repeating section name to its 'type' argument
const repeatingHandlers = {
'maneuvers': 'maneuver',
'triggered': 'triggered',
'noaction': 'noaction',
'moves': 'moves',
'abilities': 'ability',
'npcabilities': 'ability',
'malice': 'ability',
'villainaction': 'ability'
};
for (const [section, type] of Object.entries(repeatingHandlers)) {
const repeatingSection = `repeating_${section}`;
// Share button
on(`clicked:${repeatingSection}:share`, async (event) => {
handleAbilityShare(repeatingSection, type);
});
// Power roll button
on(`clicked:${repeatingSection}:power-roll-share`, async (event) => {
handleAbilityShare(repeatingSection, type, true);
});
}
// Handlers for simple, non-repeating actions
// Maps the action name to a boolean indicating if it has a power roll
const simpleActionHandlers = {
'knockback': true,
'grab': true,
'escape_grab': true,
'claw_dirt': true,
'jump': true,
'climb_creature': true,
'advance': false,
'disengage': false,
'ride': false,
'charge': false,
'defend': false,
'heal': false,
'convert': false,
'aid_attack': false,
'catch_breath': false,
'hide': false,
'search': false,
'standup': false,
'consumable': false,
'opportunity_attack': false,
'freestrike': false,
'brutaleffect': false,
'maliciousstrike': false
};
for (const [action, hasPowerRoll] of Object.entries(simpleActionHandlers)) {
// Share button (all actions have this)
on(`clicked:${action}_share`, async (event) => {
handleAbilityShare(action, '');
});
// Power roll button (only if hasPowerRoll is true)
if (hasPowerRoll) {
on(`clicked:${action}_power_roll_share`, async (event) => {
handleAbilityShare(action, '', true);
});
}
}
// Handlers for free strikes (special mapping)
// Maps the button trigger name to the ability name
const freeStrikeHandlers = {
'melee': 'melee_free_strike',
'ranged': 'ranged_free_strike'
};
for (const [trigger, ability] of Object.entries(freeStrikeHandlers)) {
// Share button
on(`clicked:${trigger}_share`, async (event) => {
handleAbilityShare(ability, '');
});
// Power roll button
on(`clicked:${trigger}_power_roll_share`, async (event) => {
handleAbilityShare(ability, '', true);
});
}
// NPC Characteristic Power Rolls
$20('.npc-characteristic-input-group > label').on('click', (e) => {
const characteristic = e.htmlAttributes['data-characteristic'];
rollPower(characteristic);
});
// Player Characteristic Power Rolls
$20('.characteristic-input-group > label').on('click', (e) => {
const characteristic = e.htmlAttributes['data-characteristic'];
rollPower(characteristic);
});
// Recovery Simple Roll
$20('.recovery-input-group > label').on('click', (e) => {
rollRecovery();
});
// Heroic Resource Simple Roll
$20('.resource-input-group > label').on('click', (e) => {
rollResource();
});
// Damage Surges Simple Roll
$20('.surges-input-group > label[data-characteristic="surges-damage"]').on('click', (e) => {
rollSurge('damage');
});
// Potency Surges Simple Roll
$20('.surges-input-group > label[data-characteristic="surges-potency"]').on('click', (e) => {
rollSurge('potency');
});
// Show or Hide Villain Action tab
on("change:npc_role", function() {
showVillainAction();
});
// Growing Resource Table
on("change:stats-minimize-checkbox change:resource change:level", function(eventInfo) {
showGrowingResource();
});
// Winded Calculation
on("change:stamina_max", function() {
calculateWinded();
});
// Surge and Potency Calculation
on("change:might change:agility change:reason change:intuition change:presence", function() {
calculateSurgePotency();
});
// Start Combat Calculation
on("clicked:startcombat", function() {
calculateStartCombat();
});
// End Combat Calculation
on("clicked:endcombat", function() {
calculateEndCombat();
});
// Respite Calculation
on("clicked:respite", function() {
calculateRespite();
});
on("change:growing_resource_type change:stormwight_growing_resource_type", () => {
updateGrowingResource();
});
// Configuration map for feature sharing
// Maps the trigger event to its specific attribute names and translation key
const featureShareHandlers = {
'repeating_classfeatures:classfeatureshare': {
section: 'classfeatures',
field: 'classfeature',
transKey: 'class-features'
},
'repeating_ancestrytraits:ancfeatureshare': {
section: 'ancestrytraits',
field: 'ancestrytrait',
transKey: 'ancestry-traits'
},
'repeating_perks:perkfeatureshare': {
section: 'perks',
field: 'perk',
transKey: 'perks'
},
'repeating_titles:titlefeatureshare': {
section: 'titles',
field: 'title',
transKey: 'titles'
}
};
// Creates event listeners for sending feature information to chat
for (const [trigger, config] of Object.entries(featureShareHandlers)) {
on(`clicked:${trigger}`, async (event) => {
// Dynamically build the attribute names from the config
const nameAttr = `repeating_${config.section}_${config.field}_name`;
const descAttr = `repeating_${config.section}_${config.field}_description`;
const attrs = await getAttrsAsync([nameAttr, descAttr]);
const subtitle = getTranslationByKey(config.transKey);
featureDisplay(attrs[nameAttr], subtitle, attrs[descAttr]);
});
}
/**
* SHEET FUNCTIONS
*/
// Toggle for villain actions
function showVillainAction() {
console.log('~~~ showVillainAction ~~~');
getAttrs(["npc_role"], function(values) {
if (values["npc_role"]) {
let role = (values["npc_role"] || "").toLowerCase();
let showVillain = (role === "leader" || role === "solo") ? "1" : "0";
setAttrs({
"villain_action_show": showVillain
});
}
});
}
/**
* Updates the visibility of the heroic resource table based on
* current resource count and character level.
*/
function showGrowingResource() {
console.log('~~~ showGrowingResource ~~~');
const attributes = ["is_npc","stats-minimize-checkbox", "resource", "level"];
getAttrs(attributes, (values) => {
if (values["is_npc"] === "on") {
return;
}
const isMinimized = values["stats-minimize-checkbox"] === "on";
const resource = parseInt(values.resource) || 0;
const level = parseInt(values.level) || 0;
// Define thresholds and their level requirements
const thresholds = [
{ val: 2, lvl: 1 },
{ val: 4, lvl: 1 },
{ val: 6, lvl: 1 },
{ val: 8, lvl: 4 },
{ val: 10, lvl: 7 },
{ val: 12, lvl: 10 }
];
const updateObj = {};
thresholds.forEach(t => {
const attrName = `growingresource_show_${t.val}`;
if (!isMinimized) {
// If not minimized, show everything
updateObj[attrName] = "1";
} else {
// Otherwise, check both resource count and level requirement
const meetsRequirement = resource >= t.val && level >= t.lvl;
updateObj[attrName] = meetsRequirement ? "1" : "0";
}
});
setAttrs(updateObj);
});
}
// Calculates winded and dead values from stamina max
function calculateWinded() {
console.log('~~~ calculateWinded ~~~');
getAttrs(["stamina_max"], function(values) {
let staminaMax = parseInt(values.stamina_max)||0;
let winded = Math.floor(staminaMax/2);
let dead = winded * -1;
setAttrs({
"stamina_winded": winded,
"stamina_dead": dead,
});
});
}
// Picks highest characteristic and calculates potencies and surge damage from it.
function calculateSurgePotency() {
console.log('~~~ calculateSurgeDamage ~~~');
getAttrs(["might", "agility", "reason", "intuition", "presence"], function(attrs) {
let highest = 0;
for(const val of Object.values(attrs)) {
const num = parseInt(val) || 0;
highest = Math.max(highest, num);
}
setAttrs({
"surge_damage": highest,
"potency_strong": highest,
"potency_average": highest - 1,
"potency_weak": highest - 2,
});
});
}
// Adds victories to heroic resources at start of combat
function calculateStartCombat() {
console.log('~~~ calculateStartCombat ~~~');
getAttrs(["victories"], function(values) {
let victories = parseInt(values.victories)||0;
setAttrs({
"resource": victories
});
});
}
// Resets heroic resources, surges, and temp stamina after combat
function calculateEndCombat() {
console.log('~~~ calculateEndCombat ~~~');
getAttrs(["resource", "surges", "stamina_temporary"], function(values) {
let resource = parseInt(values.resource)||0;
let surges = parseInt(values.surges)||0;
let stamina_temporary = parseInt(values.stamina_temporary)||0;
setAttrs({
"resource": 0,
"surges": 0,
"stamina_temporary": 0
});
});
}
// Converts Victories to XP and resets character sheet for Respite
function calculateRespite() {
console.log('~~~ calculateRespite ~~~');
getAttrs(["stamina_max", "recoveries_max", "victories", "experience"], function(values) {
let stamina_max = parseInt(values.stamina_max)||0;
let recoveries_max = parseInt(values.recoveries_max)||0;
let victories = parseInt(values.victories)||0;
let experience = parseInt(values.experience)||0;
setAttrs({
"stamina": stamina_max,
"recoveries": recoveries_max,
"experience": experience + victories,
"victories": 0,
});
});
}
// Updates the Growing Resources Table when the options are changed
async function updateGrowingResource() {
console.log('~~~ updateGrowingResource ~~~');
// Get current selector values
const attrs = await getAttrsAsync(['growing_resource_type', 'stormwight_growing_resource_type']);
const mainType = attrs.growing_resource_type;
const stormType = attrs.stormwight_growing_resource_type;
// Identify the subclass prefix for translation keys
// If it's Stormwight, use the sub-selector; otherwise, strip prefixes like "fury" or "null"
let subClassKey = '';
if (mainType === 'furystormwight') {
subClassKey = stormType; // e.g., "raden"
} else if (mainType !== 'custom') {
// Strips "fury" or "null" from "furyberserker" -> "berserker"
subClassKey = mainType.replace(/^(fury|null)/, '');
}
// Define the levels/tiers we are filling
const tiers = [
{ num: 2, word: 'two' },
{ num: 4, word: 'four' },
{ num: 6, word: 'six' },
{ num: 8, word: 'eight' },
{ num: 10, word: 'ten' },
{ num: 12, word: 'twelve' }
];
const updateObj = {};
// Populate the Table
tiers.forEach(tier => {
const labelAttr = `growingresource_${tier.num}_label`;
const textAttr = `growingresource_${tier.num}_text`;
if (!subClassKey) {
// Reset fields if 'custom' or no Stormwight type selected
updateObj[labelAttr] = tier.num.toString();
updateObj[textAttr] = "";
return;
}
// Handle Labels (Tiers 8-12 have extra level requirements)
if (tier.num >= 8) {
updateObj[labelAttr] = getTranslationByKey(`${tier.word}-label`) || tier.num.toString();
} else {
updateObj[labelAttr] = tier.num.toString();
}
// Handle Benefits (Lookup translation key: subclass-word-ben)
const benefitKey = `${subClassKey}-${tier.word}-ben`;
updateObj[textAttr] = getTranslationByKey(benefitKey) || "";
});
setAttrs(updateObj);
}
/**
** Import from Forge Steel Start
**/
/**
* Processes a feature to unpack its children if it's a container type.
* @param {object} feature The feature to process.
* @param {number} level The character's level.
* @returns {Array<object>|null} An array of child features, or null if it's not a container.
*/
function unpackFeature(feature, level) {
switch (feature.type) {
case 'Choice':
case 'Perk':
return feature.data.selected;
case 'Domain':
// A domain provides both a "DomainChoice" feature and its level-based features.
const selectedDomains = feature.data.selected;
const domainChoices = selectedDomains.map(d => ({ ...d, type: 'DomainChoice' }));
const domainFeatures = selectedDomains
.flatMap(d => d.featuresByLevel)
.filter(fbl => fbl.level <= level)
.flatMap(fbl => fbl.features);
return [...domainChoices, ...domainFeatures];
case 'Kit':
// A kit provides a "KitStats" object and its specific features.
return feature.data.selected.flatMap(kit => [
{ ...kit, type: 'KitStats', features: undefined }, // Main stats object
...kit.features, // Individual features from the kit
]);
case 'Multiple Features':
return feature.data.features;
default:
// This is not a container feature that needs unpacking.
return null;
}
}
/**
* Iteratively flattens a nested array of features into a single-level array.
* This is more robust than recursion as it avoids stack overflow errors.
* @param {Array<object>} initialFeatures The initial array of features.
* @param {number} level The character's level, for filtering level-dependent features.
* @returns {Array<object>} A new, flattened array of all active features.
*/
function getFeatures(forgesteelData) {
const { ancestry, career, class: characterClass, culture, features: rootFeatures } = forgesteelData;
const level = characterClass.level;
// Helper to extract features that are filtered by level.
const getFeaturesByLevel = (featureList) => featureList
.filter(item => item.level <= level)
.flatMap(item => item.features);
// 1. Collect all features from various sources into one initial list.
const initialFeatures = [
...rootFeatures,
...ancestry.features,
...career.features,
...getFeaturesByLevel(characterClass.featuresByLevel),
...characterClass.subclasses
.filter(sc => sc.selected)
.flatMap(sc => getFeaturesByLevel(sc.featuresByLevel)),
culture.environment,
culture.organization,
culture.upbringing,
].filter(Boolean); // Filter out any null or undefined entries.
// 2. Iteratively process the features to flatten them.
const flattenedFeatures = [];
const queue = [...initialFeatures]; // A work-list of features to process.
while (queue.length > 0) {
const currentFeature = queue.shift(); // Get the next feature to process.
const children = unpackFeature(currentFeature, level);
if (children) {
// If it was a container, add its children to the front of the queue to be processed next.
queue.unshift(...children);
} else {
// If it was a simple feature, add it to our final list.
flattenedFeatures.push(currentFeature);
}
}
console.log(flattenedFeatures);
return flattenedFeatures;
}
// Configuration mapping ability usage types to sheet section details.
const ABILITY_TYPE_MAP = {
'Main Action': { section: 'abilities', prefix: 'ability', type: 'main-action' },
'Triggered Action': { section: 'triggered', prefix: 'triggered', type: 'triggered-action' },
'Maneuver': { section: 'maneuvers', prefix: 'maneuver', type: 'maneuver' },
'Move Action': { section: 'moves', prefix: 'moves', type: 'move-action' },
'Villain Action': { section: 'npcabilities', prefix: 'ability', type: 'no-action' },
'default': { section: 'noaction', prefix: 'noaction', type: 'no-action' }
};
/**
* A collection of feature types used in Forge Steel files.
* Used for importing features and abilities from Forge Steel.
*/
const FEATURE_TYPES = {
BONUS: 'Bonus',
KIT_STATS: 'KitStats',
SIZE: 'Size',
DOMAIN_CHOICE: 'DomainChoice',
SPEED: 'Speed',
DAMAGE_MODIFIER: 'Damage Modifier',
HEROIC_RESOURCE: 'Heroic Resource',
SKILL_CHOICE: 'Skill Choice',
LANGUAGE_CHOICE: 'Language Choice',
PERK: 'Perk',
TEXT: 'Text',
ABILITY: 'Ability',
CLASS_ABILITY: 'Class Ability',
CHARACTERISTIC_BONUS: 'Characteristic Bonus',
MALICE_ABILITY: 'Malice Ability',
CONDITION_IMMUNITY: 'Condition Immunity',
};
/**
* A list of all possible damage types in the system.
* Used for processing Damage Modifiers (Immunity, Weakness)
*/
const DAMAGE_TYPES = [
'Acid', 'Cold', 'Corruption', 'Fire', 'Holy', 'Lightning',
'Poison', 'Psychic', 'Sonic',
];
/**
* Skill and their respective skill groups.
* Used to sort imported skills into their respective categories.
*/
const SKILL_GROUPS = {
crafting: ['Alchemy', 'Architecture', 'Blacksmithing', 'Carpentry', 'Cooking', 'Fletching', 'Forgery', 'Jewelry', 'Mechanics', 'Tailoring'],
exploration: ['Climb', 'Drive', 'Endurance', 'Gymnastics', 'Heal', 'Jump', 'Lift', 'Navigate', 'Ride', 'Swim'],
interpersonal: ['Brag', 'Empathize', 'Flirt', 'Gamble', 'Handle Animals', 'Interrogate', 'Intimidate', 'Lead', 'Lie', 'Music', 'Perform', 'Persuade', 'Read Person'],
intrigue: ['Alertness', 'Conceal Object', 'Disguise', 'Eavesdrop', 'Escape Artist', 'Hide', 'Pick Lock', 'Pick Pocket', 'Sabotage', 'Search', 'Sneak', 'Track'],
lore: ['Criminal Underworld', 'Culture', 'History', 'Magic', 'Monsters', 'Nature', 'Psionics', 'Religion', 'Rumors', 'Society', 'Strategy', 'Timescape'],
};
/**
* Calculates a combat statistic (like speed, disengage, stability) by summing its
* base value, bonuses from features, and the maximum value from equipped kits.
* @param {Array<Object>} features - The character's list of features.
* @param {string} statName - The name of the stat to calculate (e.g., 'Speed').
* @param {number} baseValue - The starting base value for the stat.
* @returns {number} The calculated total for the combat statistic.
*/
const calculateCombatStat = (features, statName, baseValue = 0) => {
// Sum bonuses from features of type 'Bonus' that match the stat name.
const bonusFromFeatures = features
.filter(f => f.type === FEATURE_TYPES.BONUS && f.data.field === statName)
.reduce((sum, f) => sum + f.data.value, 0);
// Find the highest bonus from all equipped kits for this stat.
const bonusFromKits = Math.max(
0, // Ensures we don't get -Infinity if there are no kits.
...features
.filter(f => f.type === FEATURE_TYPES.KIT_STATS)
.map(f => f[statName.toLowerCase()] || 0)
);
console.log(statName + ':' + baseValue + ' ' + bonusFromFeatures + ' ' + bonusFromKits);
return baseValue + bonusFromFeatures + bonusFromKits;
};
/**
** Calculates modified stat based on character features.
** @param {string} statName - The name of the stat being processed.
** @param {number} baseValue - The starting speed value.
** @param {number} level - The character's level.
** @param {Object} characteristics - Key-value pair used for characteristic based calculations.
** @param {Array} features - The array of feature objects.
**/
const calculateModifiedStat = (statName, baseValue, level, characteristics, features) => {
//Calculate the current echelon multiplier
const echelon = Math.ceil(level / 3);
// Find the bonuses from features
const bonusFromFeatures = features
.filter(f => f.type === FEATURE_TYPES.BONUS && f.data.field === statName)
.reduce((acc, feature) => {
const d = feature.data;
// Static base value
let featureSum = d.value;
// Level-based scaling - If there's already a value, we're dealing with Stamina so the per level value is only applied after the first level
featureSum ? featureSum += (d.valuePerLevel * (level - 1)) : featureSum += (d.valuePerLevel * level);
// Echelon-based scaling
featureSum += (d.valuePerEchelon * echelon);
// Characteristic-based scaling (e.g., Null Speed, Inescapable Wrath)
if (d.valueCharacteristics && d.valueCharacteristics.length > 0) {
d.valueCharacteristics.forEach(charName => {
const charValue = characteristics[charName.toLowerCase()] || 0;
featureSum += (charValue * d.valueCharacteristicMultiplier);
});
}
return acc + featureSum;
}, 0);
// Find the kit bonuses. This should eventually be replaced with something better.
const bonusFromKits = Math.max(
0, // Ensures we don't get -Infinity if there are no kits.
...features
.filter(f => f.type === FEATURE_TYPES.KIT_STATS)
.map(f => f[statName.toLowerCase()] || 0)
);
return baseValue + bonusFromFeatures + bonusFromKits;
};
/**
* Generates a comma-separated string of damage resistances or weaknesses.
* @param {Array<Object>} features - The character's list of features.
* @param {number} level - The character's current level.
* @param {string} modifierType - The type of modifier to look for ('Immunity' or 'Weakness').
* @returns {string} A formatted string of damage modifiers (e.g., "Fire 5, Cold 2").
*/
const getDamageModifiers = (features, level, modifierType) => {
const damageModifiers = features
.filter(f => f.type === FEATURE_TYPES.DAMAGE_MODIFIER)
.flatMap(f => f.data.modifiers);
return DAMAGE_TYPES
.map(damageType => {
const amount = damageModifiers
.filter(m => m.damageType === damageType && m.type === modifierType)
.reduce((sum, m) => sum + (m.value + ((level - 1) * m.valuePerLevel)), 0);
return { damageType, amount };
})
.filter(({ amount }) => amount > 0) // Only include modifiers with a value.
.map(({ damageType, amount }) => `${damageType} ${amount}`)
.join(', ');
};
/**
* Calculates characteristics by summing its base value and bonuses
* from features.
* @param {Array<Object>} features - The character's list of features.
* @param {string} statName - The name of the characteristic to calculate (e.g., 'Agility').
* @param {number} baseValue - The starting base value for the characteristic.
* @returns {number} The calculated total for the characteristic.
*/
const calculateCharacteristic = (features, statName, baseValue = 0) => {
// Sum bonuses from features of type 'Bonus' that match the stat name.
const bonusFromFeatures = features
.filter(f => f.type === FEATURE_TYPES.CHARACTERISTIC_BONUS && f.data.characteristic === statName)
.reduce((sum, f) => sum + f.data.value, 0);
return baseValue + bonusFromFeatures;
};
/**
* Extracts and joins selected skills from a specific skill group.
* @param {Array<Object>} features - The character's list of features.
* @param {Array<string>} skillGroup - An array of skill names to filter by.
* @returns {string} A comma-separated string of the selected skills in that group.
*/
const getSkillsByGroup = (features, skillGroup) => {
return features
.filter(f => f.type === FEATURE_TYPES.SKILL_CHOICE)
.flatMap(f => f.data.selected)
.filter(skill => skillGroup.includes(skill))
.sort()
.join(', ');
};
/**
* Extracts Class abilities from the import data.
* Constructs a list of ability ids and the pulls them from the full list in the import data.
* @param {Array<Object>} forgesteelData - The import data object.
* @param <String> abilityIds - The ability id to look for.
* @returns {Array<Object>} The ability data for the found ability.
*/
function extractClassAbility(forgesteelData, abilityId) {
const ability = forgesteelData.class.abilities.find(x => x.id === abilityId);
console.log(`Found Ability ${abilityId}`, ability);
return ability;
}
/*
* Extracts ancestry features from the import data
*/
const extractAncestryFeatures = (data) => {
const features = data.features;
let result = [];
features.forEach(feature => {
// Handle nested features
if (feature.type === "Multiple Features") {
feature.data.features.forEach(subFeature => {
// We only want the text-based description
if (subFeature.type === "Text") {
result.push({
id: subFeature.id,
name: subFeature.name,
description: subFeature.description
});
}
});
} else if (feature.type === "Choice" && feature.data.selected) {
// Handle selected features
feature.data.selected.forEach(selection => {
result.push({
id: selection.id,
name: selection.name,
description: selection.description
});
});
} else {
//Everything else
result.push({
id: feature.id,
name: feature.name,
description: feature.description
});
}
});
console.log(result);
return result;
};
/*
* Parses kit information from features.
*/
const parseKits = (allFeatures) => {
return allFeatures
.filter(f => f.type === FEATURE_TYPES.KIT_STATS)
.reduce((acc, kit) => ({
modifier_name: acc.modifier_name ? `${acc.modifier_name} | ${kit.name}` : kit.name,
kit_weapon: acc.kit_weapon ? `${acc.kit_weapon}, ${kit.weapon.join(', ')}` : kit.weapon.join(', '),
kit_armor: acc.kit_armor ? `${acc.kit_armor}, ${kit.armor.join(', ')}` : kit.armor.join(', '),
kit_speed: Math.max(acc.kit_speed || 0, parseInt(kit.speed || 0)),
kit_disengage: Math.max(acc.kit_disengage || 0, parseInt(kit.disengage || 0)),
kit_stamina: Math.max(acc.kit_stamina || 0, parseInt(kit.stamina || 0)),
kit_stability: Math.max(acc.kit_stability || 0, parseInt(kit.stability || 0)),
kit_melee_distance: Math.max(acc.kit_melee_distance || 0, parseInt(kit.meleeDistance || 0)),
kit_ranged_distance: Math.max(acc.kit_ranged_distance || 0, parseInt(kit.rangedDistance || 0)),
// Note: These overwrite if multiple kits exist; consider if sheet supports multiple kit dmg
kit_melee_damage_1: kit.meleeDamage?.tier1,
kit_melee_damage_2: kit.meleeDamage?.tier2,
kit_melee_damage_3: kit.meleeDamage?.tier3,
modifier_description: acc.modifier_description ? `${acc.modifier_description}\n\n${kit.description}` : kit.description
}), {});
};
/*
* Parses repeating sections.
*/
const parseRepeatingSection = (features, prefix, nameAttr, descAttr) => {
return features.reduce((acc, f) => {
const id = generateRowID();
acc[`repeating_${prefix}_${id}_${nameAttr}`] = f.name;
acc[`repeating_${prefix}_${id}_${descAttr}`] = f.description || f.data?.description || '';
return acc;
}, {});
};
/**
* Processes an array of features and returns a unique,
* comma-separated string of condition immunities.
* @param {Array} allFeatures - The array of feature objects from the import.
* @returns {string} - A comma-separated list (e.g., "Slowed, Blinded").
*/
function getConditionImmunities(allFeatures) {
console.log('~~~ getConditionImmunities ~~~');
// Filter for "Condition Immunity" types
// Map to the conditions array inside 'data'
// Flatten the arrays into a single list of strings
const immunityList = allFeatures
.filter(feature => feature.type === FEATURE_TYPES.CONDITION_IMMUNITY)
.flatMap(feature => feature.data?.conditions || []);
// Use a Set to remove any potential duplicates from multiple features
const uniqueImmunities = [...new Set(immunityList)];
// Return as a formatted string
return uniqueImmunities.join(', ');
}
/*
* Loads Forge Steel data from attr_forgesteel_json and returns the parsed JSON.
*/
async function loadForgeSteelData() {
try {
const { forgesteel_json } = await getAttrsAsync(['forgesteel_json']);
if (!forgesteel_json) {
console.warn('Import data is empty. Aborting.');
return;
}
console.log('Loading Data');
return JSON.parse(forgesteel_json);
} catch (error) {
console.error("Failed to import Forge Steel data. Please ensure the JSON is valid.", error);
return;
}
}
/**
* Helper to parse Solo/Ajax monster traits into specific sheet fields
*/
const parseSoloTrait = (description) => {
const parts = description.trim().split('\n');
const parsePart = (part) => {
// Removes markdown bolding and splits key from value
const clean = (part || '').replace(/\* \*\*/g, '').replace(/\*\*/g, '');
const splitIndex = clean.indexOf(' ');
return {
name: clean.substring(0, splitIndex).trim(),
text: clean.substring(splitIndex).trim()
};
};
const first = parsePart(parts[0]);
const second = parsePart(parts[1]);
return {
ability_subtype: 'solo-monster',
ability_solo_1_name: first.name,
ability_solo_1_text: first.text,
ability_solo_2_name: second.name,
ability_solo_2_text: second.text
};
};
// --- Import Player Event Listener ---
on('clicked:import', async () => {
try {
// Get the raw JSON string from the character sheet attributes.
const data = await loadForgeSteelData();
if (!data) { return };
// Check that the data is for a player
if (data.hasOwnProperty('class')) {
importPlayer(data);
}
} catch (error) {
console.error("Failed to import character data.", error);
}
});
// --- Import Monster Event Listener ---
on('clicked:importmonster', async () => {
try {
// Get the raw JSON string from the character sheet attributes.
const data = await loadForgeSteelData();
if (!data) { return };
// Check if the data is for a single monster or a monster group
if (data.hasOwnProperty('role')) {
importMonster(data, []);
} else if (data.hasOwnProperty('monsters')) {
// iterate through the monsters and add them to a list.
let queryString = `!{{template:default}}{{ask=![[?{${getTranslationByKey('import-monster')}|${getTranslationByKey('import-select-prompt')},-1`;
for (const [index, monster] of data.monsters.entries()) {
queryString += '|' + monster.name + ', ' + index.toString();
}
queryString += '}]]}}';
// Use a roll to provide the user with an choice of the monsters in the
const results = await startRoll(queryString);
finishRoll( results.rollId );
const choice = results.results.ask.result;
if (parseInt(choice) < 0) {
console.log('Invalid monster selection');
return;
}
await importMonster(data.monsters[choice], data.malice);
console.log(data.monsters[choice].name);
}
} catch (error) {
console.error("Failed to import monster data.", error);
}
});
/**
* Imports player data from a loaded JSON file
* @param {object} data the loaded and validated JSON file
**/
async function importPlayer(data) {
console.log('~~~ importPlayer ~~~');
if (!data) {
console.log('No Player Data Found');
return;
}
const {
name: character_name,
ancestry,
career,
state,
culture,
complication,
} = data;
const characterClass = data.class
// Collate all features from different sources into one array for easier processing.
const allFeatures = getFeatures(data);
const level = characterClass.level;
// CORE CHARACTER INFORMATION
const subclass = [
...characterClass.subclasses.filter(sc => sc.selected).map(sc => sc.name),
...allFeatures.filter(f => f.type === FEATURE_TYPES.DOMAIN_CHOICE).map(f => f.name),
].join(', ');
// Primary characteristics (attributes).
const baseStats = characterClass.characteristics.reduce((acc, i) => ({ ...acc, [i.characteristic]:i.value }), {});
const characteristics = ['Might', 'Agility', 'Reason', 'Intuition', 'Presence'].reduce((acc, s) => {
acc[s.toLowerCase()] = calculateCharacteristic(allFeatures, s, baseStats[s]);
return acc;
}, {});
// DERIVED & COMBAT STATISTICS
const baseSpeed = allFeatures.find(f => f.type === FEATURE_TYPES.SPEED)?.data.speed ?? 5;
// Stamina
const stamina_max = calculateModifiedStat('Stamina', 0, level, characteristics ,allFeatures);
// Recoveries
const recoveries_max = allFeatures
.filter(f => f.type === FEATURE_TYPES.BONUS && f.data.field === 'Recoveries')
.reduce((sum, f) => sum + f.data.value, 0);
const recoveries = parseInt(recoveries_max) - parseInt(state.recoveriesUsed);
// HEROIC RESOURCES
const resFeature = allFeatures.find(f => f.type === FEATURE_TYPES.HEROIC_RESOURCE);
const resGains = resFeature?.data?.gains || [];
// BIOGRAPHICAL INFORMATION
let careertext = '';
for (feature of career.features) {
if (feature.type.includes("Choice")) {
careertext = careertext + `${feature.name}: ${feature.data.selected.join(', ')}\n`;
} else if (feature.type === "Perk") {
careertext = careertext + `${feature.name}: ${feature.data.selected[0].name}\n`;
} else {
careertext = careertext + `${feature.name}: +${feature.data.value}\n`;
}
}
const career_benefit = careertext;
const career_incident = career.incitingIncidents.selected ? `${career.incitingIncidents.selected.name}\n${career.incitingIncidents.selected.description}` : '';
// SKILLS & LANGUAGES
const skills_crafting = getSkillsByGroup(allFeatures, SKILL_GROUPS.crafting);
const skills_exploration = getSkillsByGroup(allFeatures, SKILL_GROUPS.exploration);
const skills_interpersonal = getSkillsByGroup(allFeatures, SKILL_GROUPS.interpersonal);
const skills_intrigue = getSkillsByGroup(allFeatures, SKILL_GROUPS.intrigue);
const skills_lore = getSkillsByGroup(allFeatures, SKILL_GROUPS.lore);
const languages = [
...culture.language.data.selected,
...allFeatures.filter(f => f.type === FEATURE_TYPES.LANGUAGE_CHOICE).flatMap(f => f.data.selected),
].sort().join(', ');
// REPEATING SECTIONS (Kits, Perks, Abilities, etc.)
const kits = parseKits(allFeatures);
// Process perks, ancestry traits, features, and abilities.
const perks = parseRepeatingSection(
allFeatures.filter(f => f.id.startsWith('perk-') && f.type === FEATURE_TYPES.TEXT),
'perks', 'perk_name', 'perk_description'
);
const ancestryFeatures = parseRepeatingSection(
extractAncestryFeatures(data.ancestry).filter(f => f.description),
'ancestrytraits', 'ancestrytrait_name', 'ancestrytrait_description'
);
const classFeatures = allFeatures
.filter(f => f.type === FEATURE_TYPES.TEXT && (!f.id.startsWith('perk-') && !f.id.startsWith(ancestry.name.toLowerCase())))
.reduce((acc, f) => {
const id = generateRowID();
acc[`repeating_classfeatures_${id}_classfeature_name`] = f.name;
acc[`repeating_classfeatures_${id}_classfeature_description`] = f.description;
return acc;
}, {});
const abilityFeatures = allFeatures
.filter(f => f.type === FEATURE_TYPES.ABILITY)
.reduce((acc, f) => ({ ...acc, ...processAbility(f.data.ability) }), {});
const classAbilities = allFeatures
.filter(f => f.type === FEATURE_TYPES.CLASS_ABILITY)
.flatMap(f => f.data.selectedIDs)
.reduce((acc, id) => {
const abilityData = extractClassAbility(data, id);
return { ...acc, ...processAbility(abilityData) };
}, {});
const immunity = [
getDamageModifiers(allFeatures, level, 'Immunity'),
getConditionImmunities(allFeatures),
].filter(Boolean).join(', ');
// ATTRIBUTE MAPPING
const newAttrs = {
forgesteel_json: '', // Clear the import field.
// Core Info
character_name: data.name,
ancestry: ancestry.name,
class: characterClass.name,
career: career.name,
subclass,
victories: state.victories,
level,
wealth: calculateCombatStat(allFeatures, 'Wealth', state.wealth),
renown: calculateCombatStat(allFeatures, 'Renown', state.renown),
experience: state.xp,
...characteristics,
// Derived Stats
size: `${allFeatures.find(f => f.type === FEATURE_TYPES.SIZE)?.data.size.value ?? 1}${allFeatures.find(f => f.type === FEATURE_TYPES.SIZE)?.data.size.mod ?? 'M'}`,
speed: calculateModifiedStat('Speed', baseSpeed, level, characteristics ,allFeatures),
disengage: calculateModifiedStat('Disengage', 1, level, characteristics ,allFeatures),
stability: calculateCombatStat(allFeatures, 'Stability', 0),
stamina_max,
stamina: parseInt(stamina_max) - parseInt(state.staminaDamage || 0),
recoveries,
recoveries_max,
recovery_amount: Math.floor(stamina_max / 3),
surges: state.surges,
immunity,
weakness: getDamageModifiers(allFeatures, level, 'Weakness'),
resource: resFeature?.value || '',
resource_name: resFeature?.name || '',
resource_amount: resGains.find(g => g.tag === "start")?.value || '1d3',
resource_description: resGains.map(g => `+${g.value}: ${g.trigger}`).join('\n'),
// Biography
career_benefit,
career_incident,
complication: complication?.name ?? '',
complication_benefit: complication?.features[0]?.description ?? '',
complication_drawback: complication?.features[1]?.description ?? '',
culture_environment: culture.environment.name,
culture_environment_description: culture.environment.description,
culture_organization: culture.organization.name,
culture_organization_description: culture.organization.description,
culture_upbringing: culture.upbringing.name,
culture_upbringing_description: culture.upbringing.description,
// Skills & Languages
skills_crafting,
skills_exploration,
skills_interpersonal,
skills_intrigue,
skills_lore,
languages,
// Spread in kits and repeating section data
...kits,
...perks,
...ancestryFeatures,
...classFeatures,
...abilityFeatures,
...classAbilities,
};
// Clear existing repeating sections before adding new data.
const sectionsToClear = ['modifiers', 'perks', 'ancestrytraits', 'classfeatures', 'abilities', 'noaction', 'maneuvers', 'triggered', 'moves', 'conditions'];
await Promise.all(sectionsToClear.map(s => clearRepeatingSection(s)));
// Set the new attributes on the character sheet.
await setAttrsAsync(newAttrs);
//Last bit of character sheet setup
calculateWinded();
calculateSurgePotency();
console.log('Character import successful!', newAttrs);
}
/**
* Imports monster data from a loaded JSON file
* @param {object} data the loaded and validated JSON file
**/
async function importMonster(data, malice) {
console.log('~~~ importMonster ~~~');
if (!data) {
console.log('No Monster Data Found');
return;
}
const {
name, level, characteristics, keywords, role: dataRole,
size: dataSize, speed: dataSpeed, stability, stamina,
features, encounterValue, withCaptain, freeStrikeDamage
} = data;
// STATS & CORE INFO
const findCharacteristic = (name) => characteristics.find(c => c.characteristic === name)?.value || 0;
const roleString = `${dataRole.organization}${dataRole.type === 'No Role' ? '' : ` ${dataRole.type}`}`;
const sizeString = `${dataSize?.value ?? 1}${dataSize?.mod ?? 'M'}`;
// REPEATING ABILITIES
const traits = features
.filter(f => f.type === FEATURE_TYPES.TEXT)
.reduce((acc, f) => {
const id = generateRowID();
const prefix = `repeating_npcabilities_${id}`;
acc[`${prefix}_ability_name`] = f.name;
if (f.name === 'Solo Monster' || f.name === 'Ajax') {
const soloFields = parseSoloTrait(f.description);
Object.keys(soloFields).forEach(key => acc[`${prefix}_${key}`] = soloFields[key]);
} else {
acc[`${prefix}_ability_subtype`] = 'trait';
acc[`${prefix}_ability_trait`] = f.description;
}
return acc;
}, {});
const abilityFeatures = data.features
.filter(f => f.type === FEATURE_TYPES.ABILITY)
.reduce((acc, f) => ({ ...acc, ...processMonsterAbility(f.data.ability) }), {});
const maliceFeatures = malice ? importMalice(malice) : [];
const minionTag = roleString.includes('Minion') ? getTranslationByKey('minion-text') : '';
// ATTRIBUTE MAPPING
const newAttrs = {
forgesteel_json: '', // Clear the import field.
is_npc: 'on',
// Core Info
character_name: name,
level: level,
npc_role: roleString,
npc_keywords: keywords.join(', '),
npc_EV: `${encounterValue} ${minionTag}`.trim(),
// Stats
size: sizeString,
speed: dataSpeed.value ?? 5,
stamina,
stability,
npc_freestrike: freeStrikeDamage,
immunity: getDamageModifiers(data.features, 1, 'Immunity'),
weakness: getDamageModifiers(data.features, 1, 'Weakness'),
npc_movement: dataSpeed.modes?.join(', ') ?? '',
npc_with_captain: withCaptain,
// Characteristics
might: findCharacteristic('Might'),
agility: findCharacteristic('Agility'),
reason: findCharacteristic('Reason'),
intuition: findCharacteristic('Intuition'),
presence: findCharacteristic('Presence'),
// Spread in repeating section data
...traits,
...abilityFeatures,
...maliceFeatures,
};
// Clear existing repeating sections before adding new data.
await Promise.all([
clearRepeatingSection('npcabilities'),
clearRepeatingSection('malice'),
clearRepeatingSection('villainaction')
]);
// Set the new attributes on the character sheet.
await setAttrsAsync(newAttrs);
console.log('Monster import successful!', newAttrs);
}
/**
* ABILITY CORE PROCESSOR
* Handles the shared logic for processing both PC and NPC abilities.
*
* Processes ability data into a flat object for setting repeating section attributes.
* @param {object} abilityData The JSON object for a single ability.
* @returns {object} An object of attribute keys and values for setAttrs.
*/
function _processAbilityCore(abilityData, isNPC = false) {
console.log('~~~ processAbilityCore ```');
const id = generateRowID();
//console.log(abilityData);
const { type: usageData, sections, cost: rawCost, name, description, keywords, target } = abilityData;
// Configuration & Naming
const usage = usageData.usage;
const config = ABILITY_TYPE_MAP[usage] || ABILITY_TYPE_MAP.default;
// Determine Section & Prefix
let section = config.section;
let attrPrefix = config.prefix; // usually 'ability' or 'classfeature'
let subtype = 'normal-ability';
// NPC-specific routing
if (isNPC) {
attrPrefix = 'ability'; // NPCs almost always use 'ability' suffix
if (usage === 'Villain Action') {
section = 'villainaction';
subtype = 'villain-ability';
} else if (parseInt(rawCost) > 0) {
section = 'malice';
subtype = 'malice-ability';
} else {
section = 'npcabilities';
}
}
const cost = rawCost === 'signature' ? 'signature' : (parseInt(rawCost) || 0);
if (cost === 'signature') subtype = 'signature-ability';
else if (!isNPC && cost > 0) subtype = 'heroic-ability';
// Distance Formatting (Universal Logic)
const dist = abilityData.distance?.[0];
let distanceStr = '';
if (dist) {
if (['Melee', 'Ranged', 'Self'].includes(dist.type)) {
distanceStr = `${dist.type} ${dist.value || ''}`.trim();
} else {
const v2 = parseInt(dist.value2) > 0 ? ` x ${dist.value2}` : '';
const w = parseInt(dist.within) > 0 ? ` within ${dist.within}` : '';
distanceStr = `${dist.value || ''}${v2} ${dist.type}${w}`.trim();
}
}
// Effect and Power Roll extraction
const powerRoll = sections.find(s => s.type === 'roll');
const special = sections.find(s => s.type === 'text' && s.text.startsWith('**Special:**'));
const malice = sections.find(s => s.type === 'field' && ['Spend', 'Malice'].includes(s.name));
const custom = sections.find(s => s.type === 'field' && ['Persist', 'Mark Benefit', 'Strained'].includes(s.name))
let effectText = sections
.filter(s => s.type === 'text')
// Filter out the special text to avoid double-entry for NPCs
.filter(s => !(isNPC && s.text?.startsWith('**Special:**')))
.map(s => s.name ? `${s.name} ${s.value}: ${s.effect}` : s.text)
.join('\n');
if (usageData.freeStrike) {
effectText += `${getTranslationByKey('free-strike-ability-text')}`;
}
// Build Attributes
const prefix = `repeating_${section}_${id}_${attrPrefix}`;
const attrs = {
[`${prefix}_name`]: name,
[`${prefix}_description`]: description,
[`${prefix}_type`]: isNPC ? (config.type || usage) : config.type,
[`${prefix}_subtype`]: subtype,
[`${prefix}_keywords`]: keywords.join(', '),
[`${prefix}_trigger`]: usageData.trigger ?? '',
[`${prefix}_distance`]: distanceStr,
[`${prefix}_target`]: target,
[`${prefix}_effect`]: effectText,
[`repeating_${section}_${id}_has_effect`]: effectText ? 'on' : 0,
[`repeating_${section}_${id}_has_power_roll`]: powerRoll ? 'on' : 0,
};
if (custom) {
attrs[`repeating_${section}_${id}_has_custom`] = 'on';
attrs[`${prefix}_custom_label`] = `${custom.name}${parseInt(custom.value) > 0 ? ' ' + custom.value : ''}`;
attrs[`${prefix}_custom`] = custom.effect;
}
if (isNPC) {
attrs[`${prefix}_malice_cost`] = cost || 0;
} else {
attrs[`${prefix}_cost`] = parseInt(rawCost) || 0;
}
if (powerRoll) {
const char = isNPC ? powerRoll.roll.bonus : powerRoll.roll.characteristic[0].toLowerCase();
attrs[`${prefix}_characteristic`] = char;
attrs[`${prefix}_tier_1`] = powerRoll.roll.tier1;
attrs[`${prefix}_tier_2`] = powerRoll.roll.tier2;
attrs[`${prefix}_tier_3`] = powerRoll.roll.tier3;
}
if (isNPC && special) {
attrs[`repeating_${section}_${id}_has_special`] = 'on';
attrs[`${prefix}_special`] = special.text.replace('**Special:** ', '');
}
if (isNPC && malice) {
attrs[`repeating_${section}_${id}_has_malice`] = 'on';
attrs[`${prefix}_cost`] = malice.value; // Map Spend value
attrs[`${prefix}_malice`] = malice.effect;
}
return attrs;
}
/**
* PUBLIC EXPORTS
*/
const processAbility = (data) => _processAbilityCore(data, false);
const processMonsterAbility = (data) => _processAbilityCore(data, true);
function processMaliceAbility(abilityData) {
console.log('~~~ processMaliceAbility ~~~');
// Determine ability type and get configuration.
const usage = 'no-action';
const subtype = 'malice-trait';
const cost = abilityData.data.cost ? abilityData.data.cost : parseInt(abilityData.data.cost) || 0;
const prefix = 'malice';
const id = generateRowID();
// Extract and format primary data fields.
const effect = abilityData.data.sections.map(item => {
// Check if the item is a dictionary (object) and not null
if (typeof item === 'object' && item !== null) {
// Format the object into a readable string
return `\nTier 1: ${item.tier1}\n` +
`Tier 2: ${item.tier2}\n` +
`Tier 3: ${item.tier3}\n`;
}
// If it's already a string, just return it
return item;
}).join('\n');
const special = abilityData.data.sections.find(s => s.type === 'text' && s.text.startsWith('**Special:**'));
// 4. Assemble the final attribute object.
const attributes = {
[`repeating_${prefix}_${id}_ability_name`]: abilityData.name,
[`repeating_${prefix}_${id}_ability_description`]: abilityData.description,
[`repeating_${prefix}_${id}_ability_type`]: usage,
[`repeating_${prefix}_${id}_ability_subtype`]: subtype,
[`repeating_${prefix}_${id}_ability_malice_cost`]: cost,
[`repeating_${prefix}_${id}_has_effect`]: effect ? 'on' : 0,
[`repeating_${prefix}_${id}_ability_effect`]: effect,
};
if (special) {
Object.assign(attributes, {
[`repeating_${prefix}_${id}_has_special`]: 'on',
[`repeating_${prefix}_${id}_ability_special`]: special.text.replace('**Special:** ', ''),
});
}
return attributes;
}
function importMalice(maliceData) {
console.log('~~~ importMalice ~~~');
if (maliceData === undefined || maliceData.length === 0) {
return [];
}
const maliceFeatures = maliceData.reduce((acc, f) => {
if (f.type === FEATURE_TYPES.MALICE_ABILITY) {
return {...acc, ...processMonsterAbility(f.data.ability)};
} else
{
return {...acc, ...processMaliceAbility(f)};
}
},[]);
console.log(maliceFeatures);
return maliceFeatures;
}
/**
** Import End
**/
/**
** Versioning
**/
/**
** Upgrades the sheet to changes present in version 1
** - Ensures 'has_power_roll' and new 'has_effect' checkboxes are appropriately changed
**/
const upgradeToV1 = () => {
console.log('~~~ upgradeToV1 ~~~');
const abilitySections = {
'repeating_abilities': 'ability',
'repeating_maneuvers': 'maneuver',
'repeating_triggered': 'triggered',
'repeating_noaction': 'noaction',
'repeating_moves': 'moves',
};
const updateEffectsAndPowerRoll = (section, prefix) => {
console.log('~~~ updateEffectsAndPowerRoll ' + section + ' ~~~');
getSectionIDs(section, function(ids) {
if (ids.length === 0) {
return;
}
let effectArray = [];
let defaultValue = 'on';
let fieldArray = [];
let update = {};
for (id of ids) {
fieldArray.push(section + '_' + id + '_' + prefix + '_effect');
fieldArray.push(section + '_' + id + '_' + prefix + '_cost');
let propName = section + '_' + id + '_has_power_roll';
fieldArray.push(propName);
update[propName] = defaultValue;
}
getAttrs(fieldArray, function(values) {
for(var i = 0; i < ids.length; i++) {
update[section + '_' + ids[i] + '_has_effect'] = values[section + '_' + ids[i] + '_' + prefix + '_effect'] ? 'on' : '';
update[section + '_' + ids[i] + '_' + prefix + '_subtype'] = values[section + '_' + ids[i] + '_' + prefix + '_cost'] ? 'heroic-ability' : 'normal-ability';
}
Object.assign(update, values);
setAttrs(update);
});
});
};
for (const [section, prefix] of Object.entries(abilitySections)) {
updateEffectsAndPowerRoll(section, prefix);
}
};
/**
** Converts the old repeating kits to the new single static one.
** Updated in v1.2
**/
const convertRepeatingKits = () => {
console.log('~~~ convertRepeatingKits ~~~');
getSectionIDs('repeating_modifiers', function(ids) {
if (ids.length === 0) {
return;
}
let fieldArray = [];
let newAttrs = {};
// Get the list of fields for retrieval
for (id of ids) {
fieldArray.push('repeating_modifiers_' + id + '_modifier_name');
fieldArray.push('repeating_modifiers_' + id + '_kit_weapon');
fieldArray.push('repeating_modifiers_' + id + '_kit_armor');
fieldArray.push('repeating_modifiers_' + id + '_kit_speed');
fieldArray.push('repeating_modifiers_' + id + '_kit_disengage');
fieldArray.push('repeating_modifiers_' + id + '_kit_stamina');
fieldArray.push('repeating_modifiers_' + id + '_kit_stability');
fieldArray.push('repeating_modifiers_' + id + '_kit_melee_distance');
fieldArray.push('repeating_modifiers_' + id + '_kit_ranged_distance');
fieldArray.push('repeating_modifiers_' + id + '_kit_melee_damage_1');
fieldArray.push('repeating_modifiers_' + id + '_kit_melee_damage_2');
fieldArray.push('repeating_modifiers_' + id + '_kit_melee_damage_3');
fieldArray.push('repeating_modifiers_' + id + '_kit_ranged_damage_1');
fieldArray.push('repeating_modifiers_' + id + '_kit_ranged_damage_2');
fieldArray.push('repeating_modifiers_' + id + '_kit_ranged_damage_3');
fieldArray.push('repeating_modifiers_' + id + '_modifier_description');
}
getAttrs(fieldArray, function(values) {
//Cycle through the ids to merge the repeating elements into the single entry
for(var i = 0; i < ids.length; i++) {
const name = values['repeating_modifiers_' + ids[i] +'_modifier_name'] || '';
const weapon = values['repeating_modifiers_' + ids[i] +'_kit_weapon'] || '';
const armor = values['repeating_modifiers_' + ids[i] +'_kit_armor'] || '';
const speed = values['repeating_modifiers_' + ids[i] +'_kit_speed'] || '';
const disengage = values['repeating_modifiers_' + ids[i] +'_kit_disengage'] || '';
const stamina = values['repeating_modifiers_' + ids[i] +'_kit_stamina'] || '';
const stability = values['repeating_modifiers_' + ids[i] +'_kit_stability'] || '';
const meleeDistance = values['repeating_modifiers_' + ids[i] +'_kit_melee_distance'] || '';
const rangedDistance = values['repeating_modifiers_' + ids[i] +'_kit_ranged_distance'] || '';
const meleeTierOne = values['repeating_modifiers_' + ids[i] +'_kit_melee_damage_1'] || '';
const meleeTierTwo = values['repeating_modifiers_' + ids[i] +'_kit_melee_damage_2'] || '';
const meleeTierThree = values['repeating_modifiers_' + ids[i] +'_kit_melee_damage_3'] || '';
const rangedTierOne = values['repeating_modifiers_' + ids[i] +'_kit_ranged_damage_1'] || '';
const rangedTierTwo = values['repeating_modifiers_' + ids[i] +'_kit_ranged_damage_2'] || '';
const rangedTierThree = values['repeating_modifiers_' + ids[i] +'_kit_ranged_damage_3'] || '';
const description = values['repeating_modifiers_' + ids[i] +'_modifier_description'] || '';
newAttrs['modifier_name'] = !newAttrs['modifier_name'] ? name : newAttrs['modifier_name'] + ' | ' + name;
newAttrs['kit_weapon'] = !newAttrs['kit_weapon'] ? weapon : newAttrs['kit_weapon'] + ', ' + weapon;
newAttrs['kit_armor'] = !newAttrs['kit_armor'] ? armor: newAttrs['kit_armor'] + ', ' + armor;
newAttrs['kit_speed'] = Math.max(newAttrs['kit_speed'] ?? 0, parseInt(speed));
newAttrs['kit_disengage'] = Math.max(newAttrs['kit_disengage'] ?? 0, parseInt(disengage));
newAttrs['kit_stamina'] = Math.max(newAttrs['kit_stamina'] ?? 0, parseInt(stamina));
newAttrs['kit_stability'] = Math.max(newAttrs['kit_stability'] ?? 0, parseInt(stability));
newAttrs['kit_melee_distance'] = Math.max(newAttrs['kit_melee_distance'] ?? 0, parseInt(meleeDistance));
newAttrs['kit_ranged_distance'] = Math.max(newAttrs['kit_ranged_distance'] ?? 0, parseInt(rangedDistance));
newAttrs['kit_melee_damage_1'] = !newAttrs['kit_melee_damage_1'] ? meleeTierOne : newAttrs['kit_melee_damage_1'];
newAttrs['kit_melee_damage_2'] = !newAttrs['kit_melee_damage_2'] ? meleeTierTwo : newAttrs['kit_melee_damage_2'];
newAttrs['kit_melee_damage_3'] = !newAttrs['kit_melee_damage_3'] ? meleeTierThree : newAttrs['kit_melee_damage_3'];
newAttrs['kit_ranged_damage_1'] = !newAttrs['kit_ranged_damage_1'] ? rangedTierOne : newAttrs['kit_ranged_damage_1'];
newAttrs['kit_ranged_damage_2'] = !newAttrs['kit_ranged_damage_2'] ? rangedTierTwo : newAttrs['kit_ranged_damage_2'];
newAttrs['kit_ranged_damage_3'] = !newAttrs['kit_ranged_damage_3'] ? rangedTierThree : newAttrs['kit_ranged_damage_3'];
newAttrs['modifier_description'] = !newAttrs['modifier_description'] ? description : newAttrs['modifier_description'] + '\n\n' + description;
}
setAttrs(newAttrs);
clearRepeatingSection('modifiers');
});
});
}
const setNewOptions = () => {
console.log('~~~ setNewOptions ~~~');
const fieldArray = ['options_calculate_damage'];
getAttrs(fieldArray, function(values) {
let newOptions = {
options_calculate_damage: '1',
}
setAttrs(newOptions);
});
}
on('sheet:opened', async () => {
console.log('****** Draw Steel Sheet Opened ******\nLatest Version:', version);
const v = await getAttrs(['sheet_version'], function (v) {
if (!v.sheet_version || v.sheet_version != version) {
console.log('****** updating to version: ' + version + ' ******');
//Check Effect and Power Roll Checkboxes as needed (v1.0)
upgradeToV1();
// Convert repeating Modifiers (v1.2)
convertRepeatingKits();
// Set new Damage Calculation option (v1.3)
setNewOptions();
//Sets the sheet's new version
setAttrs({
sheet_version: version,
});
}
});
// sheet calculations
calculateWinded();
calculateSurgePotency();
});
</script>