mirror of
https://github.com/Nighthawk42/roll20-character-sheets.git
synced 2026-08-30 03:40:32 +00:00
- Fixed Advance and Ride abilities so that they are shown as move actions and not maneuvers.
6896 lines
324 KiB
HTML
6896 lines
324 KiB
HTML
<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} &{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} &{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} &{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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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> -->
|
||
<!-- < [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> -->
|
||
<!-- < [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> -->
|
||
<!-- < [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 -->
|
||
💬
|
||
</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>: <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">📐<span name="attr_ability_distance" ></span></div>
|
||
<div class="ability-target">🎯<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> <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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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>: <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">📐<span name="attr_maneuver_distance" ></span></div>
|
||
<div class="ability-target">🎯<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> <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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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>: <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">📐<span name="attr_triggered_distance" ></span></div>
|
||
<div class="ability-target">🎯<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> <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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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>: <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">📐<span name="attr_noaction_distance" ></span></div>
|
||
<div class="ability-target">🎯<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> <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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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>: <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">📐<span name="attr_moves_distance" ></span></div>
|
||
<div class="ability-target">🎯<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> <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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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> <span name="attr_level"></span> <span name="attr_npc_role"></span></div>
|
||
<div><span name="attr_npc_keywords"></span></div>
|
||
<div><span data-i18n="encounter-value-abbr"></span> <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} &{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} &{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> 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> 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 -->
|
||
💬
|
||
</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> <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">📐<span name="attr_ability_distance" ></span></div>
|
||
<div class="ability-target">🎯<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> <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 -->
|
||
💬
|
||
</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> <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">📐<span name="attr_ability_distance" ></span></div>
|
||
<div class="ability-target">🎯<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> <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 -->
|
||
💬
|
||
</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> <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 -->
|
||
💬
|
||
</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>+ <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 -->
|
||
💬
|
||
</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> <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">📐<span name="attr_ability_distance" ></span></div>
|
||
<div class="ability-target">🎯<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> <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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
💬
|
||
</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 -->
|
||
📐{{distance}}
|
||
{{/distance}}
|
||
</div>
|
||
<div class="target">
|
||
{{#target}}
|
||
<!-- bullseye -->
|
||
🎯{{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">12–16</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}} <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> {{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 -->
|
||
📐{{distance}}
|
||
</div>
|
||
{{/rollTotal() hasDistance 1}}
|
||
{{#rollTotal() hasTarget 1}}
|
||
<div class="target">
|
||
<!-- bullseye -->
|
||
🎯{{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">12–16</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 -->
|
||
📐{{distance}}
|
||
{{/distance}}
|
||
</div>
|
||
<div class="target">
|
||
{{#target}}
|
||
<!-- bullseye -->
|
||
🎯{{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">12–16</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}} <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> {{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 (≤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>
|