mirror of
https://github.com/Nighthawk42/roll20-character-sheets.git
synced 2026-08-30 19:52:29 +00:00
6401 lines
306 KiB
HTML
6401 lines
306 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">y</label>
|
||
<input id="sheet-options-checkbox" class="sheet-options-checkbox" type="checkbox" />
|
||
<div class="sheet-panel sheet-options-toggle">
|
||
<!-- Options Panel for choosing Player/NPC sheet and imports -->
|
||
<div class="sheet-panel-box">
|
||
<input id="npc-checkbox" name="attr_is_npc" class="npc-checkbox" type="checkbox" />
|
||
<label for="npc-checkbox" data-i18n="npc-toggle"></label>
|
||
<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>
|
||
</div>
|
||
<div class="sheet-panel-box">
|
||
<h4><span data-i18n="damage-autocalc">Damage Calculator</span></h4>
|
||
<label for="options-calculate-damage" data-i18n="options-calculate-damage">Automatically Calculate Damage:</label>
|
||
<input id="options-calculate-damage" name="attr_options_calculate_damage" type="checkbox" value="1" />
|
||
</div>
|
||
</div>
|
||
<div class="sheet-panel-box">
|
||
<h5 data-i18n="import"></h5>
|
||
<p data-i18n="import-warning1"></p>
|
||
<p class="text-warning" data-i18n="import-warning2"></p>
|
||
<p class="text-warning" data-i18n="import-warning3"></p>
|
||
<textarea name="attr_forgesteel_json"></textarea>
|
||
<button type="action" name="act_import" data-i18n="import-player"></button>
|
||
<button type="action" name="act_importmonster" data-i18n="import-monster"></button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Header End -->
|
||
</div>
|
||
<input type="hidden" class="npc-checkbox" name="attr_is_npc" />
|
||
<!-- 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 -->
|
||
<div class="growing-resource minimize-ignore">
|
||
<input type="checkbox" name="attr_has_growing_resource" /><label data-i18n="growing-resource-checkbox"></label>
|
||
<input type="hidden" name="attr_growingresource_show_2" />
|
||
<input type="hidden" name="attr_growingresource_show_4" />
|
||
<input type="hidden" name="attr_growingresource_show_6" />
|
||
<input type="hidden" name="attr_growingresource_show_8" />
|
||
<input type="hidden" name="attr_growingresource_show_10" />
|
||
<input type="hidden" name="attr_growingresource_show_12" />
|
||
<div class="growing-resource-selector-display">
|
||
<select class="growing-resource-selector" name="attr_growing_resource_type">
|
||
<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>
|
||
<select class="stormwight-growing-resource-selector" 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 class="growing-resource-display sheet-panel-box minimize-ignore">
|
||
<h5 class="panel-title" data-i18n="growing-resource"></h5>
|
||
<div class="berserker-growing-resource-display">
|
||
<div class="growing-resource-display-label">
|
||
<label><span data-i18n="ferocity"></span></label><label><span data-i18n="benefit"></span></label>
|
||
<label><span>2</span></label><label><span data-i18n="berserker-two-ben"></span></label>
|
||
<label><span>4</span></label><label><span data-i18n="berserker-four-ben"></span></label>
|
||
<label><span>6</span></label><label><span data-i18n="berserker-six-ben"></span></label>
|
||
<label><span data-i18n="eight-label"></span></label><label><span data-i18n="berserker-eight-ben"></span></label>
|
||
<label><span data-i18n="ten-label"></span></label><label><span data-i18n="berserker-ten-ben"></span></label>
|
||
<label><span data-i18n="twelve-label"></span></label><label><span data-i18n="berserker-twelve-ben"></span></label>
|
||
</div>
|
||
</div>
|
||
<div class="reaver-growing-resource-display">
|
||
<div class="growing-resource-display-label">
|
||
<label><span data-i18n="ferocity"></span></label><label><span data-i18n="benefit"></span></label>
|
||
<label><span>2</span></label><label><span data-i18n="reaver-two-ben"></span></label>
|
||
<label><span>4</span></label><label><span data-i18n="reaver-four-ben"></span></label>
|
||
<label><span>6</span></label><label><span data-i18n="reaver-six-ben"></span></label>
|
||
<label><span data-i18n="eight-label"></span></label><label><span data-i18n="reaver-eight-ben"></span></label>
|
||
<label><span data-i18n="ten-label"></span></label><label><span data-i18n="reaver-ten-ben"></span></label>
|
||
<label><span data-i18n="twelve-label"></span></label><label><span data-i18n="reaver-twelve-ben"></span></label>
|
||
</div>
|
||
</div>
|
||
<div class="boren-growing-resource-display">
|
||
<div class="growing-resource-display-label">
|
||
<label><span data-i18n="ferocity"></span></label><label><span data-i18n="benefit"></span></label>
|
||
<label><span>2</span></label><label><span data-i18n="boren-two-ben"></span></label>
|
||
<label><span>4</span></label><label><span data-i18n="boren-four-ben"></span></label>
|
||
<label><span>6</span></label><label><span data-i18n="boren-six-ben"></span></label>
|
||
<label><span data-i18n="eight-label"></span></label><label><span data-i18n="boren-eight-ben"></span></label>
|
||
<label><span data-i18n="ten-label"></span></label><label><span data-i18n="boren-ten-ben"></span></label>
|
||
<label><span data-i18n="twelve-label"></span></label><label><span data-i18n="boren-twelve-ben"></span></label>
|
||
</div>
|
||
</div>
|
||
<div class="corven-growing-resource-display">
|
||
<div class="growing-resource-display-label">
|
||
<label><span data-i18n="ferocity"></span></label><label><span data-i18n="benefit"></span></label>
|
||
<label><span>2</span></label><label><span data-i18n="corven-two-ben"></span></label>
|
||
<label><span>4</span></label><label><span data-i18n="corven-four-ben"></span></label>
|
||
<label><span>6</span></label><label><span data-i18n="corven-six-ben"></span></label>
|
||
<label><span data-i18n="eight-label"></span></label><label><span data-i18n="corven-eight-ben"></span></label>
|
||
<label><span data-i18n="ten-label"></span></label><label><span data-i18n="corven-ten-ben"></span></label>
|
||
<label><span data-i18n="twelve-label"></span></label><label><span data-i18n="corven-twelve-ben"></span></label>
|
||
</div>
|
||
</div>
|
||
<div class="raden-growing-resource-display">
|
||
<div class="growing-resource-display-label">
|
||
<label><span data-i18n="ferocity"></span></label><label><span data-i18n="benefit"></span></label>
|
||
<label><span>2</span></label><label><span data-i18n="raden-two-ben"></span></label>
|
||
<label><span>4</span></label><label><span data-i18n="raden-four-ben"></span></label>
|
||
<label><span>6</span></label><label><span data-i18n="raden-six-ben"></span></label>
|
||
<label><span data-i18n="eight-label"></span></label><label><span data-i18n="raden-eight-ben"></span></label>
|
||
<label><span data-i18n="ten-label"></span></label><label><span data-i18n="raden-ten-ben"></span></label>
|
||
<label><span data-i18n="twelve-label"></span></label><label><span data-i18n="raden-twelve-ben"></span></label>
|
||
</div>
|
||
</div>
|
||
<div class="vuken-growing-resource-display">
|
||
<div class="growing-resource-display-label">
|
||
<label><span data-i18n="ferocity"></span></label><label><span data-i18n="benefit"></span></label>
|
||
<label><span>2</span></label><label><span data-i18n="vuken-two-ben"></span></label>
|
||
<label><span>4</span></label><label><span data-i18n="vuken-four-ben"></span></label>
|
||
<label><span>6</span></label><label><span data-i18n="vuken-six-ben"></span></label>
|
||
<label><span data-i18n="eight-label"></span></label><label><span data-i18n="vuken-eight-ben"></span></label>
|
||
<label><span data-i18n="ten-label"></span></label><label><span data-i18n="vuken-ten-ben"></span></label>
|
||
<label><span data-i18n="twelve-label"></span></label><label><span data-i18n="vuken-twelve-ben"></span></label>
|
||
</div>
|
||
</div>
|
||
<div class="chronokinetic-growing-resource-display">
|
||
<div class="growing-resource-display-label">
|
||
<label><span data-i18n="discipline"></span></label><label><span data-i18n="benefit"></span></label>
|
||
<label><span>2</span></label><label><span data-i18n="chronokinetic-two-ben"></span></label>
|
||
<label><span>4</span></label><label><span data-i18n="chronokinetic-four-ben"></span></label>
|
||
<label><span>6</span></label><label><span data-i18n="chronokinetic-six-ben"></span></label>
|
||
<label><span data-i18n="eight-label"></span></label><label><span data-i18n="chronokinetic-eight-ben"></span></label>
|
||
<label><span data-i18n="ten-label"></span></label><label><span data-i18n="chronokinetic-ten-ben"></span></label>
|
||
<label><span data-i18n="twelve-label"></span></label><label><span data-i18n="chronokinetic-twelve-ben"></span></label>
|
||
</div>
|
||
</div>
|
||
<div class="cryokinetic-growing-resource-display">
|
||
<div class="growing-resource-display-label">
|
||
<label><span data-i18n="discipline"></span></label><label><span data-i18n="benefit"></span></label>
|
||
<label><span>2</span></label><label><span data-i18n="cryokinetic-two-ben"></span></label>
|
||
<label><span>4</span></label><label><span data-i18n="cryokinetic-four-ben"></span></label>
|
||
<label><span>6</span></label><label><span data-i18n="cryokinetic-six-ben"></span></label>
|
||
<label><span data-i18n="eight-label"></span></label><label><span data-i18n="cryokinetic-eight-ben"></span></label>
|
||
<label><span data-i18n="ten-label"></span></label><label><span data-i18n="cryokinetic-ten-ben"></span></label>
|
||
<label><span data-i18n="twelve-label"></span></label><label><span data-i18n="cryokinetic-twelve-ben"></span></label>
|
||
</div>
|
||
</div>
|
||
<div class="metakinetic-growing-resource-display">
|
||
<div class="growing-resource-display-label">
|
||
<label><span data-i18n="discipline"></span></label><label><span data-i18n="benefit"></span></label>
|
||
<label><span>2</span></label><label><span data-i18n="metakinetic-two-ben"></span></label>
|
||
<label><span>4</span></label><label><span data-i18n="metakinetic-four-ben"></span></label>
|
||
<label><span>6</span></label><label><span data-i18n="metakinetic-six-ben"></span></label>
|
||
<label><span data-i18n="eight-label"></span></label><label><span data-i18n="metakinetic-eight-ben"></span></label>
|
||
<label><span data-i18n="ten-label"></span></label><label><span data-i18n="metakinetic-ten-ben"></span></label>
|
||
<label><span data-i18n="twelve-label"></span></label><label><span data-i18n="metakinetic-twelve-ben"></span></label>
|
||
</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>_cocndition_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="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="maneuver" />
|
||
<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>
|
||
<!-- 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">
|
||
<!-- 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>
|
||
<div class="sheet-panel-box director-screen-sub-panel minimizable-conditions">
|
||
<div class="minimize-control-conditions">
|
||
<input id="director-screen-conditions-minimize-checkbox" class="minimize" type="checkbox" checked />
|
||
<label for="director-screen-conditions-minimize-checkbox" data-i18n="conditions"></label>
|
||
</div>
|
||
<h5 class="panel-title">
|
||
<span class="director-screen-sub-desc" data-i18n="conditions-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="bleeding"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="bleeding-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="dazed"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="dazed-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="frightened"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="frightened-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="grabbed"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="grabbed-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="prone"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="prone-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="restrained"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="restrained-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="slowed"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="slowed-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="taunted"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="taunted-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="weakened"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="weakened-desc"></span>
|
||
</h5>
|
||
</div>
|
||
<div class="sheet-panel-box director-screen-sub-panel minimizable-basics">
|
||
<div class="minimize-control-basics">
|
||
<input id="director-screen-basics-minimize-checkbox" class="minimize" type="checkbox" checked />
|
||
<label for="director-screen-basics-minimize-checkbox" data-i18n="basics"></label>
|
||
</div>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="characteristics-scores"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="characteristics-scores-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="natural-19-20"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="natural-19-20-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="power-roll-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="power-roll-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="recovery"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="recovery-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="respites"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="respites-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="skill"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="skill-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="victories-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="victories-desc"></span>
|
||
</h5>
|
||
<h3 class="panel-title" data-i18n="edges-and-banes"></h3>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="edge-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="edge-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="double-edge-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="double-edge-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="bane-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="bane-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="double-bane-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="double-bane-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span class="director-screen-sub-desc" data-i18n="edges-and-banes-desc"></span>
|
||
</h5>
|
||
<h3 class="panel-title" data-i18n="hero-tokens"></h3>
|
||
<h5 class="panel-title">
|
||
<span class="director-screen-sub-desc" data-i18n="hero-tokens-desc"></span>
|
||
</h5>
|
||
</div>
|
||
<div class="sheet-panel-box director-screen-sub-panel minimizable-combat">
|
||
<div class="minimize-control-combat">
|
||
<input id="director-screen-combat-minimize-checkbox" class="minimize" type="checkbox" checked />
|
||
<label for="director-screen-combat-minimize-checkbox" data-i18n="combat"></label>
|
||
</div>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="combat-turn"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="combat-turn-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="triggered-action-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="triggered-action-desc"></span>
|
||
</h5>
|
||
<h3 class="panel-title" data-i18n="main-actions"></h3>
|
||
<h5 class="panel-title">
|
||
<span class="director-screen-sub-desc" data-i18n="main-actions-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="charge-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="charge-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="defend-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="defend-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="free-strike-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="free-strike-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="heal-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="heal-desc"></span>
|
||
</h5>
|
||
<h3 class="panel-title" data-i18n="move-actions"></h3>
|
||
<h5 class="panel-title">
|
||
<span class="director-screen-sub-desc" data-i18n="move-actions-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="advance-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="advance-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="disengage-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="disengage-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="ride-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="ride-desc"></span>
|
||
</h5>
|
||
<h3 class="panel-title" data-i18n="maneuvers"></h3>
|
||
<h5 class="panel-title">
|
||
<span class="director-screen-sub-desc" data-i18n="maneuvers-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="aid-attack-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="aid-attack-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="catch-breath-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="catch-breath-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="escape-grab-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="escape-grab-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="grab-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="grab-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="hide-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="hide-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="knockback-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="knockback-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="stand-up-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="stand-up-desc"></span>
|
||
</h5>
|
||
<h3 class="panel-title" data-i18n="combat-glossary"></h3>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="critical-hit-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="critical-hit-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="concealment"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="concealment-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="cover"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="cover-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="damage-immunity"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="damage-immunity-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="damage-weakness"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="damage-weakness-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="dying-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="dying-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="eot-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="eot-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="flanking"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="flanking-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="high-ground"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="high-ground-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="line-of-effect"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="line-of-effect-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="opportunity-attack-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="opportunity-attack-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="saving-throws"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="saving-throws-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="stamina-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="stamina-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="surges-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="surges-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="winded-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="winded-desc"></span>
|
||
</h5>
|
||
<h3 class="panel-title" data-i18n="size-and-space"></h3>
|
||
<h5 class="panel-title">
|
||
<span class="director-screen-sub-desc" data-i18n="size-and-space-desc"></span>
|
||
</h5>
|
||
</div>
|
||
<div class="sheet-panel-box director-screen-sub-panel minimizable-movement">
|
||
<div class="minimize-control-movement">
|
||
<input id="director-screen-movement-minimize-checkbox" class="minimize" type="checkbox" checked />
|
||
<label for="director-screen-movement-minimize-checkbox" data-i18n="movement"></label>
|
||
</div>
|
||
<h5 class="panel-title">
|
||
<span class="director-screen-sub-desc" data-i18n="movement-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="climb"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="climb-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="crawl"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="crawl-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="difficult-terrain"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="difficult-terrain-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="jump-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="jump-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="teleport"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="teleport-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="shifting"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="shifting-desc"></span>
|
||
</h5>
|
||
<h3 class="panel-title" data-i18n="forced-movement"></h3>
|
||
<h5 class="panel-title">
|
||
<span class="director-screen-sub-desc" data-i18n="forced-movement-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="push-x"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="push-x-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="pull-x"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="pull-x-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="slide-x"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="slide-x-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="vertical"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="vertical-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="big-vs-little"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="big-vs-little-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="breaking-objects"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="breaking-objects-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="slamming-into-creatures"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="slamming-into-creatures-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="slamming-into-objects"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="slamming-into-objects-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="stability-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="stability-desc"></span>
|
||
</h5>
|
||
</div>
|
||
<div class="sheet-panel-box director-screen-sub-panel minimizable-areas-of-effect">
|
||
<div class="minimize-control-areas-of-effect">
|
||
<input id="director-screen-areas-of-effect-minimize-checkbox" class="minimize" type="checkbox" checked />
|
||
<label for="director-screen-areas-of-effect-minimize-checkbox" data-i18n="areas-of-effect"></label>
|
||
</div>
|
||
<h5 class="panel-title">
|
||
<span class="director-screen-sub-desc" data-i18n="areas-of-effect-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="aura"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="aura-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="burst"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="burst-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="cube"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="cube-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="line"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="line-desc"></span>
|
||
</h5>
|
||
<h5 class="panel-title">
|
||
<span data-i18n="wall-director"></span>
|
||
<span class="director-screen-sub-desc" data-i18n="wall-desc"></span>
|
||
</h5>
|
||
</div>
|
||
</div>
|
||
<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>
|
||
<!-- 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">
|
||
<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>
|
||
<!-- 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="maneuver" />
|
||
<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";
|
||
|
||
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;
|
||
}
|
||
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);
|
||
});
|
||
}
|
||
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);
|
||
});
|
||
}
|
||
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
|
||
**/
|
||
|
||
const buttonlist = ["action", "maneuver", "triggered","noaction","move"];
|
||
buttonlist.forEach(button => {
|
||
on(`clicked:${button}`, function() {
|
||
setAttrs({
|
||
abilitiesTab: 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;
|
||
}
|
||
// Setup the template for the roll
|
||
const template = `@{wtype}&{template:${templateName}} {{charactername=@{character_name}}} `;
|
||
|
||
let powerroll = '';
|
||
|
||
// Check if we need to add the extra information for a power roll.
|
||
if (isPowerRoll && rollValueMap) {
|
||
if (rollValueMap.characteristicValue.length < 1) {
|
||
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 powerRollTranslation = getTranslationByKey('power-roll') || 'Power Roll';
|
||
const edgeOrBaneTranslation = getTranslationByKey('edge-or-bane') || 'edge-or-bane';
|
||
const noEdgeOrBaneTranslation = getTranslationByKey('no-edge-or-bane') || 'no-edge-or-bane';
|
||
const doubleEdgeTranslation = getTranslationByKey('double-edge') || 'double-edge';
|
||
const edgeTranslation = getTranslationByKey('edge') || 'edge';
|
||
const baneTranslation = getTranslationByKey('bane') || 'bane';
|
||
const doubleBaneTranslation = getTranslationByKey('double-bane') || 'double-bane';
|
||
const bonusOrPenaltyTranslation = getTranslationByKey('bonus-or-penalty') || 'bonus-or-penalty';
|
||
const name = !directMap.name ? '{{name=' + characteristicTranslation + ` ` + powerRollTranslation + '}} ': '';
|
||
powerroll = '[[ [[2d10cs>11cf<0]][2d10] ' +
|
||
` + [[${rollValueMap.characteristicValue}[${characteristicTranslation}]]][${characteristicTranslation}] ` +
|
||
' + [[?{' +
|
||
edgeOrBaneTranslation +
|
||
`|${noEdgeOrBaneTranslation},0` +
|
||
`|${doubleEdgeTranslation},0[${doubleEdgeTranslation}]` +
|
||
`|${edgeTranslation},2[${edgeTranslation}]` +
|
||
`|${baneTranslation},-2[${baneTranslation}]` +
|
||
`|${doubleBaneTranslation},0[${doubleBaneTranslation}]` +
|
||
`}]][${edgeOrBaneTranslation}] ` +
|
||
` + [[?{${bonusOrPenaltyTranslation}|0}]][${bonusOrPenaltyTranslation}] ` +
|
||
']] ' +
|
||
'{{2d10=$[[0]]}} ' +
|
||
'{{edgeBane=$[[2]]}} ' +
|
||
'{{bonus=$[[3]]}} ' +
|
||
'{{total=$[[4]]}} ' +
|
||
`{{isDoubleEdge=[[0]]}} ` +
|
||
`{{isDoubleBane=[[0]]}} ` +
|
||
'{{tier=[[0]]}} ' +
|
||
name;
|
||
|
||
}
|
||
|
||
// Helper function to trim empty values from the roll.
|
||
const isDefined = (value) => {
|
||
// Exclude null, undefined, and empty strings
|
||
if (!value) return false;
|
||
// Specifically exclude the string '0' (for things like ability_cost = 0)
|
||
if (typeof value === 'string' && value.trim() === '0') return false;
|
||
return true;
|
||
};
|
||
|
||
// Build the roll. Starts with the template and powerroll, then adds the directMap entries and the rollValueMap entries.
|
||
const roll = template +
|
||
powerroll +
|
||
Object.entries(directMap)
|
||
.filter(([key, value]) => value)
|
||
.map(([key, value]) => `{{${key}=${value}}} `)
|
||
.join(' ') +
|
||
Object.entries(rollValueMap)
|
||
.filter(([key, value]) => value === 1 || key === 'characteristicValue')
|
||
.map(([key, value]) => `{{${key}=[[${value}]]}} `)
|
||
.join(' ');
|
||
|
||
if (isPowerRoll) {
|
||
// If we are making a power roll we need to make extra calculations to determine the tier result.
|
||
const doubleEdgeTranslation = getTranslationByKey('double-edge') || 'double-edge';
|
||
const doubleBaneTranslation = getTranslationByKey('double-bane') || 'double-bane';
|
||
|
||
startRoll(roll, ({ rollId, results }) => {
|
||
console.log('roll results', results);
|
||
// Set for toggles for Double Edge and Double Bane
|
||
const isDoubleEdge = results.edgeBane.expression === `0[${doubleEdgeTranslation}]`
|
||
? 1 : 0;
|
||
const isDoubleBane = results.edgeBane.expression === `0[${doubleBaneTranslation}]`
|
||
? 1 : 0;
|
||
|
||
// Calculate the Tier result from the roll 2-11, 12-16, 17-20
|
||
const tierBase = (() => {
|
||
if (results.total.result >= 17) {
|
||
return 3;
|
||
}
|
||
return results.total.result >= 12
|
||
? 2
|
||
: 1;
|
||
})();
|
||
const tierMod = (() => {
|
||
switch (results.edgeBane.expression) {
|
||
case `0[${doubleEdgeTranslation}]`:
|
||
return 1;
|
||
case `0[${doubleBaneTranslation}]`:
|
||
return -1;
|
||
default:
|
||
return 0;
|
||
}
|
||
})();
|
||
// Adjust the Tier result if Double Edge/Bane
|
||
const tier = Math.max(1, Math.min(3, tierBase + tierMod));
|
||
finishRoll(rollId, { isDoubleEdge, isDoubleBane, tier });
|
||
});
|
||
} else {
|
||
// Simple roll for everything else.
|
||
startRoll(roll, ({ rollId }) => finishRoll(rollId));
|
||
}
|
||
}
|
||
|
||
/**
|
||
** 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(['recovery_amount']);
|
||
const recovery_amount = attrs.recovery_amount;
|
||
|
||
buildRoll(ROLLTEMPLATES.SIMPLE, { name: "Recovery", rolltitle: "Stamina Gain", roll: `[[${recovery_amount}]]` }, {} );
|
||
}
|
||
|
||
function calculateRecoverySpent() {
|
||
console.log('~~~ calculateRecoverySpent ~~~');
|
||
getAttrs(["stamina_max", "recovery_amount", "stamina", "recoveries"], function(values) {
|
||
let stamina_max = parseInt(values.stamina_max)||0;
|
||
let recovery_amount = parseInt(values.recovery_amount)||0;
|
||
let stamina = parseInt(values.stamina)||0;
|
||
let stamina_set = Math.min(stamina_max, stamina + recovery_amount);
|
||
let recoveries = parseInt(values.recoveries)||0;
|
||
let recoveries_set = Math.max(recoveries - 1,0);
|
||
if (recoveries > 0) {
|
||
setAttrs({
|
||
"stamina": stamina_set,
|
||
"recoveries": recoveries_set
|
||
});
|
||
}
|
||
});
|
||
}
|
||
|
||
/**
|
||
** 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 resource_name = attrs.resource_name;
|
||
const resource = parseInt(attrs.resource) || 0;
|
||
const rollQuery = attrs.resource_amount ? `[[${attrs.resource_amount}]]` : `[[?{d3 or number|0}]]`;
|
||
|
||
const rollTemplate = `@{wtype}&{template:${ROLLTEMPLATES.SIMPLE}} {{charactername=@{character_name}}} {{name=${resource_name} Gain}} {{rolltitle=${resource_name}}} {{roll=${rollQuery}}}`;
|
||
|
||
startRoll(rollTemplate, ({ rollId, results }) => {
|
||
const resource_gain = results.roll.result || 0;
|
||
const resource_updated = resource + resource_gain;
|
||
|
||
setAttrs({ "resource": resource_updated });
|
||
|
||
finishRoll(rollId);
|
||
});
|
||
}
|
||
|
||
/**
|
||
** Simple Roll to apply Damage Surges
|
||
** And adjust automatically in sheet
|
||
**/
|
||
async function rollDamageSurges() {
|
||
console.log("~~~ rollDamageSurges ~~~");
|
||
// Get the necessary attributes.
|
||
const attrs = await getAttrsAsync(["surges", "surge_damage"]);
|
||
const damage = attrs.surge_damage;
|
||
const surges = parseInt(attrs.surges) || 0;
|
||
|
||
// Check to see we actually have surges to spend
|
||
if (surges > 0) {
|
||
const rollQuery = `[[?{How many?|1|2|3}]]`;
|
||
const rollTemplate = `@{wtype}&{template:${ROLLTEMPLATES.SIMPLE}} {{charactername=@{character_name}}} {{name=Using Surges for Damage}} {{rolltitle=${rollQuery}}} {{roll=Surges used for [[${rollQuery}*${damage}]] damage}}`;
|
||
|
||
startRoll(rollTemplate, ({ rollId, results }) => {
|
||
const surges_lose = results.rolltitle.result || 0;
|
||
// If we have enough, adjust the surges by the amount we just used
|
||
if (surges_lose <= surges) {
|
||
const surges_updated = surges - surges_lose;
|
||
setAttrs({ "surges": surges_updated });
|
||
}
|
||
|
||
finishRoll(rollId);
|
||
});
|
||
}
|
||
}
|
||
|
||
/**
|
||
** Simple Roll to apply Potency Surges
|
||
** And adjust automatically in sheet
|
||
**/
|
||
async function rollPotencySurges() {
|
||
console.log("~~~ rollPotencySurges ~~~");
|
||
// Get the necessary attributes.
|
||
const attrs = await getAttrsAsync(["surges"]);
|
||
const surges = parseInt(attrs.surges) || 0;
|
||
if (surges < 2) return;
|
||
|
||
const rollTemplate = `@{wtype}&{template:${ROLLTEMPLATES.SIMPLE}} {{charactername=@{character_name}}} {{name=Using Surges for Potency Increase}} {{rolltitle=[[2]]}} {{roll=Surges used to increase potency by 1}}`;
|
||
|
||
startRoll(rollTemplate, ({ rollId, results }) => {
|
||
const surges_lose = results.rolltitle.result || 0;
|
||
const surges_updated = surges - surges_lose;
|
||
|
||
setAttrs({ "surges": surges_updated });
|
||
|
||
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:monsterability}`
|
||
+ '{{charactername=@{character_name}}} '
|
||
+ '{{name=' + name + '}} '
|
||
+ '{{trait=' + description + '}} '
|
||
+ '{{subtype=' + subtitle + '}} '
|
||
+ '{{hasTrait=[[1]]}}';
|
||
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);
|
||
|
||
}
|
||
|
||
/**
|
||
* 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 ~~~');
|
||
|
||
let directMap = {};
|
||
let rollValueMap = {};
|
||
let translateMap = {};
|
||
let subtype = '';
|
||
let trait = '';
|
||
let hasTrait = 0;
|
||
let characteristic = '';
|
||
let description = '';
|
||
let powerroll = '';
|
||
let characteristicValue = '';
|
||
|
||
if (prefix === 'repeating_npcabilities') {
|
||
// NPC Ability Logic
|
||
switch(attrs[`${prefix}_${abilityPrefix}subtype`]) {
|
||
case 'signature-ability':
|
||
case 'villain-ability':
|
||
subtype = getTranslationByKey(attrs[`${prefix}_${abilityPrefix}subtype`]) || '';
|
||
break;
|
||
case 'malice-ability':
|
||
case 'malice-trait':
|
||
subtype = attrs[`${prefix}_${abilityPrefix}malice_cost`] + ' ' + getTranslationByKey('malice');
|
||
break;
|
||
}
|
||
characteristic = 'modifiers';
|
||
trait = attrs[`${prefix}_${abilityPrefix}trait`] || '';
|
||
hasTrait = attrs[`${prefix}_${abilityPrefix}subtype`].includes('trait') && trait ? 1 : 0;
|
||
hasEffect = attrs[`${prefix}_has_effect`] === 'on' ? 1 : 0;
|
||
characteristicValue = parseInt(attrs[`${prefix}_${abilityPrefix}characteristic`]) || 0;
|
||
} else {
|
||
// PLAYER Ability Logic
|
||
const resourceName = attrs.resource_name || getTranslationByKey('resource-name-placeholder');
|
||
const cost = attrs[`${prefix}_${abilityPrefix}cost`];
|
||
subtype = cost && cost !== '0' ? `(${cost} ${resourceName})` : '';
|
||
characteristic = attrs[`${prefix}_${abilityPrefix}characteristic`] ? getTranslationByKey(attrs[`${prefix}_${abilityPrefix}characteristic`]) || '' : '';
|
||
description = attrs[`${prefix}_${abilityPrefix}description`] || '';
|
||
hasTrait = 1;
|
||
hasEffect = attrs[`${prefix}_${abilityPrefix}effect`] ? 1 : 0;
|
||
characteristicValue = attrs[attrs[`${prefix}_${abilityPrefix}characteristic`]];
|
||
}
|
||
|
||
if (attrs[`${prefix}_has_power_roll`] === 'on') {
|
||
powerroll = getTranslationByKey('power-roll');
|
||
}
|
||
|
||
const melee = getTranslationByKey('melee');
|
||
const ranged = getTranslationByKey('ranged');
|
||
const weapon = getTranslationByKey('weapon');
|
||
const abilityKeywords = attrs[`${prefix}_${abilityPrefix}keywords`] ? attrs[`${prefix}_${abilityPrefix}keywords`].split(',').map(item => item.trim()) : '';
|
||
const kit = [];
|
||
let otherdamage = "";
|
||
let tier1 = "", tier2 = "", tier3 = "";
|
||
|
||
if (attrs['options_calculate_damage'] === "1" && attrs[`${prefix}_${abilityPrefix}tier_1`] && attrs[`${prefix}_${abilityPrefix}tier_2`] && attrs[`${prefix}_${abilityPrefix}tier_3`]) {
|
||
if (abilityKeywords.includes(weapon)) {
|
||
if (abilityKeywords.includes(melee)) {
|
||
kit.push(parseInt(attrs['kit_melee_damage_1']));
|
||
kit.push(parseInt(attrs['kit_melee_damage_2']));
|
||
kit.push(parseInt(attrs['kit_melee_damage_3']));
|
||
} else if (abilityKeywords.includes(ranged)) {
|
||
kit.push(parseInt(attrs['kit_ranged_damage_1']));
|
||
kit.push(parseInt(attrs['kit_ranged_damage_2']));
|
||
kit.push(parseInt(attrs['kit_ranged_damage_3']));
|
||
}
|
||
if (attrs['sanct_weap']) {
|
||
const sanctweaptrans = getTranslationByKey('sanct-weap');
|
||
otherdamage = otherdamage + '+' + attrs['sanct_weap'] + `[${sanctweaptrans}]`;
|
||
}
|
||
}
|
||
if (attrs['mag_psi_dam']) {
|
||
const psionic = getTranslationByKey('psionic');
|
||
const magic = getTranslationByKey('magic');
|
||
|
||
if (abilityKeywords.includes(psionic)) {
|
||
otherdamage = otherdamage + '+' + attrs['mag_psi_dam'] + `[${psionic}]`;
|
||
}
|
||
else if (abilityKeywords.includes(magic)) {
|
||
otherdamage = otherdamage + '+' + attrs['mag_psi_dam'] + `[${magic}]`;
|
||
}
|
||
}
|
||
tier1 = damageCalculation(attrs[`${prefix}_${abilityPrefix}tier_1`], kit[0] || 0, otherdamage);
|
||
tier2 = damageCalculation(attrs[`${prefix}_${abilityPrefix}tier_2`], kit[1] || 0, otherdamage);
|
||
tier3 = damageCalculation(attrs[`${prefix}_${abilityPrefix}tier_3`], kit[2] || 0, otherdamage);
|
||
} else {
|
||
tier1 = attrs[`${prefix}_${abilityPrefix}tier_1`] || '';
|
||
tier2 = attrs[`${prefix}_${abilityPrefix}tier_2`] || '';
|
||
tier3 = attrs[`${prefix}_${abilityPrefix}tier_3`] || '';
|
||
}
|
||
|
||
|
||
|
||
|
||
const type = attrs[`${prefix}_${abilityPrefix}type`] === 'no-action' ? '' : getTranslationByKey(attrs[`${prefix}_${abilityPrefix}type`]);
|
||
// check keywords for damage calculation
|
||
|
||
|
||
// Build the directMap - these will be transformed into a {{key=value}} format.
|
||
directMap = {
|
||
name: attrs[`${prefix}_${abilityPrefix}name`],
|
||
subtype: subtype,
|
||
trait: trait,
|
||
description: description,
|
||
type: type,
|
||
keywords: attrs[`${prefix}_${abilityPrefix}keywords`] || '',
|
||
distance: attrs[`${prefix}_${abilityPrefix}distance`] || '',
|
||
target: attrs[`${prefix}_${abilityPrefix}target`] || '',
|
||
trigger: attrs[`${prefix}_${abilityPrefix}trigger`] || '',
|
||
characteristic: characteristic,
|
||
tier1: tier1,
|
||
tier2: tier2,
|
||
tier3: tier3,
|
||
special: attrs[`${prefix}_${abilityPrefix}special`] || '',
|
||
effect: attrs[`${prefix}_${abilityPrefix}effect`] || '',
|
||
pre_effect: attrs[`${prefix}_${abilityPrefix}pre_effect`] || '',
|
||
malprop: attrs[`${prefix}_${abilityPrefix}malice`] || '',
|
||
malpropcost: attrs[`${prefix}_${abilityPrefix}cost`] || '',
|
||
solo1name: attrs[`${prefix}_${abilityPrefix}solo_1_name`] || '',
|
||
solo1text: attrs[`${prefix}_${abilityPrefix}solo_1_text`] || '',
|
||
solo2name: attrs[`${prefix}_${abilityPrefix}solo_2_name`] || '',
|
||
solo2text: attrs[`${prefix}_${abilityPrefix}solo_2_text`] || '',
|
||
customlabel: attrs[`${prefix}_${abilityPrefix}custom_label`] || '',
|
||
custom: attrs[`${prefix}_${abilityPrefix}custom`] || '',
|
||
spend: attrs[`${prefix}_${abilityPrefix}spend`] || '',
|
||
spendcost: attrs[`${prefix}_${abilityPrefix}spend_cost`] || '',
|
||
powerRoll: powerroll,
|
||
}
|
||
|
||
//Build the rollValueMap - these will be transformed into a {{key=[[value]]}} format.
|
||
rollValueMap = {
|
||
hasTrait: hasTrait,
|
||
hasSolo: attrs[`${prefix}_${abilityPrefix}subtype`] && attrs[`${prefix}_${abilityPrefix}subtype`].includes('solo') ? 1 : 0,
|
||
hasTrigger: attrs[`${prefix}_${abilityPrefix}type`].includes('triggered') && attrs[`${prefix}_${abilityPrefix}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: characteristicValue || 0,
|
||
};
|
||
|
||
return { directMap, rollValueMap };
|
||
}
|
||
|
||
|
||
/**
|
||
** Adds inline Damage Calculations for tier effects
|
||
** @param {string} tierEffect The name of the repeating ability (e.g "repeating_abilities").
|
||
** @returns {string} Altered tier effect for roll template
|
||
**/
|
||
function damageCalculation(tierEffect, kit = 0, other = 0) {
|
||
console.log('~~~ damageCalculation ~~~');
|
||
|
||
if (!tierEffect) {
|
||
return '';
|
||
}
|
||
// Damage "should" take one of the following forms:
|
||
// <baseDamage> + <characteristic> <damageType> damage; <added effects>
|
||
// <baseDamage> <damageType> damage; <added effects>
|
||
// <effects>
|
||
|
||
const might = getTranslationByKey('might');
|
||
const agility = getTranslationByKey('agility');
|
||
const reason = getTranslationByKey('reason');
|
||
const intuition = getTranslationByKey('intuition');
|
||
const presence = getTranslationByKey('presence');
|
||
const charMap = {
|
||
M: { macro: '@{might}', title: might},
|
||
A: { macro: '@{agility}', title: agility},
|
||
R: { macro: '@{reason}', title: reason},
|
||
I: { macro: '@{intuition}', title: intuition},
|
||
P: { macro: '@{presence}', title: presence},
|
||
};
|
||
|
||
// Split the tier effect at the semi colon.
|
||
const parts = tierEffect.split(';');
|
||
// The first element of parts should contain the damage. The second should have effects, if anything.
|
||
// Split the damage section it using spaces to get the individual elements.
|
||
const damageSection = parts[0].split(' ');
|
||
const effectSection = parts.length > 1 ? '; ' + parts[1] : '';
|
||
const damageBase = parseInt(damageSection[0]);
|
||
|
||
// If the first element is not a number we aren't dealing with a form we can calculate.
|
||
if (!damageBase) {
|
||
return tierEffect;
|
||
}
|
||
|
||
let damageType = [];
|
||
let damageCalc = [];
|
||
// Since the first element is the base damage, if the second should is a '+' the third should be the characteristic.
|
||
if (damageSection[1] === '+') {
|
||
if (damageSection[2] in charMap) {
|
||
damageSection[2] = charMap[damageSection[2]].macro + `[${charMap[damageSection[2]].title}]`;
|
||
damageType = damageSection.slice(3);
|
||
damageCalc = damageSection.slice(0,3);
|
||
console.log('damageType and Calc',damageType, damageCalc);
|
||
|
||
} else {
|
||
return tierEffect;
|
||
}
|
||
} else {
|
||
damageType = damageSection.slice(1);
|
||
damageCalc.push(damageSection[0]);
|
||
}
|
||
if (kit) {
|
||
//Add Kit Damage
|
||
kitTrans = getTranslationByKey('kit');
|
||
damageCalc.push('+');
|
||
damageCalc.push(kit + '[' + kitTrans + ']');
|
||
}
|
||
|
||
if (other) {
|
||
damageCalc.push(other);
|
||
}
|
||
// rebuild the tier effect String
|
||
const newTierEffect = '[[' +
|
||
damageCalc.join(' ')
|
||
+ ']]'
|
||
+ damageType.join(' ')
|
||
+ effectSection;
|
||
|
||
return newTierEffect;
|
||
}
|
||
|
||
/**
|
||
** 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'
|
||
};
|
||
|
||
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
|
||
};
|
||
|
||
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);
|
||
});
|
||
}
|
||
|
||
// Characteristic Power Rolls
|
||
$20('.npc-characteristic-input-group > label').on('click', (e) => {
|
||
const characteristic = e.htmlAttributes['data-characteristic'];
|
||
rollPower(characteristic);
|
||
});
|
||
|
||
$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();
|
||
calculateRecoverySpent();
|
||
});
|
||
|
||
// Heroic Resource Simple Roll
|
||
|
||
$20('.resource-input-group > label').on('click', (e) => {
|
||
console.log("click");
|
||
rollResource();
|
||
});
|
||
|
||
// Damage Surges Simple Roll
|
||
|
||
$20('.surges-input-group > label[data-characteristic="surges-damage"]').on('click', (e) => {
|
||
rollDamageSurges();
|
||
});
|
||
|
||
// Potency Surges Simple Roll
|
||
|
||
$20('.surges-input-group > label[data-characteristic="surges-potency"]').on('click', (e) => {
|
||
rollPotencySurges();
|
||
});
|
||
|
||
// 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'
|
||
}
|
||
};
|
||
|
||
// Loop through the map and create a generic listener for each
|
||
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);
|
||
|
||
// Use bracket notation to access the attribute values dynamically
|
||
featureDisplay(attrs[nameAttr], subtitle, attrs[descAttr]);
|
||
});
|
||
}
|
||
|
||
/*// Looking for Power Roll for Ability Card
|
||
on("change:repeating_abilities:has_power_roll", function(event) {
|
||
const repeatingId = event.sourceAttribute.match(/repeating_abilities_[^_]+/)[0];
|
||
const sourceAttr = `${repeatingId}_has_power_roll`;
|
||
const targetAttr = `${repeatingId}_show_power_roll`;
|
||
getAttrs([sourceAttr], function(values) {
|
||
const show = values[sourceAttr] === "on" ? "1" : "0";
|
||
setAttrs({
|
||
[targetAttr]: show
|
||
});
|
||
});
|
||
});
|
||
*/
|
||
|
||
// Show full Growing Resource Table whenever Characteristics is opened
|
||
on("change:stats-minimize-checkbox", function(eventInfo) {
|
||
showGrowingResource();
|
||
});
|
||
|
||
function showGrowingResource() {
|
||
console.log('~~~ showGrowingResource ~~~');
|
||
getAttrs(["stats-minimize-checkbox","resource","level"], function(values) {
|
||
let isChecked = values["stats-minimize-checkbox"] === "on";
|
||
let resource = parseInt(values.resource)||0;
|
||
let level = parseInt(values.level)||0;
|
||
if (!isChecked) {
|
||
setAttrs({
|
||
"growingresource_show_2": "1",
|
||
"growingresource_show_4": "1",
|
||
"growingresource_show_6": "1",
|
||
"growingresource_show_8": "1",
|
||
"growingresource_show_10": "1",
|
||
"growingresource_show_12": "1",
|
||
});
|
||
}
|
||
else {
|
||
let show2 = resource >= 2 ? "1" : "0";
|
||
let show4 = resource >= 4 ? "1" : "0";
|
||
let show6 = resource >= 6 ? "1" : "0";
|
||
let show8 = (resource >= 8 && level >= 4) ? "1" : "0";
|
||
let show10 = (resource >= 10 && level >= 7) ? "1" : "0";
|
||
let show12 = (resource >= 12 && level >= 10) ? "1" : "0";
|
||
setAttrs({
|
||
"growingresource_show_2": show2,
|
||
"growingresource_show_4": show4,
|
||
"growingresource_show_6": show6,
|
||
"growingresource_show_8": show8,
|
||
"growingresource_show_10": show10,
|
||
"growingresource_show_12": show12,
|
||
});
|
||
}
|
||
});
|
||
}
|
||
|
||
// Growing Resource
|
||
on("change:resource change:level", function() {
|
||
calculateGrowingResource();
|
||
});
|
||
|
||
function calculateGrowingResource() {
|
||
console.log('~~~ calculateGrowingResource ~~~');
|
||
getAttrs(["stats-minimize-checkbox","resource", "level"], function(values) {
|
||
let isChecked = values["stats-minimize-checkbox"] === "on";
|
||
|
||
if (isChecked) {
|
||
let resource = parseInt(values.resource)||0;
|
||
let level = parseInt(values.level)||0;
|
||
let show2 = resource >= 2 ? "1" : "0";
|
||
let show4 = resource >= 4 ? "1" : "0";
|
||
let show6 = resource >= 6 ? "1" : "0";
|
||
let show8 = (resource >= 8 && level >= 4) ? "1" : "0";
|
||
let show10 = (resource >= 10 && level >= 7) ? "1" : "0";
|
||
let show12 = (resource >= 12 && level >= 10) ? "1" : "0";
|
||
setAttrs({
|
||
"growingresource_show_2": show2,
|
||
"growingresource_show_4": show4,
|
||
"growingresource_show_6": show6,
|
||
"growingresource_show_8": show8,
|
||
"growingresource_show_10": show10,
|
||
"growingresource_show_12": show12,
|
||
});
|
||
}
|
||
});
|
||
}
|
||
|
||
// 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();
|
||
});
|
||
|
||
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,
|
||
});
|
||
});
|
||
}
|
||
|
||
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,
|
||
});
|
||
});
|
||
}
|
||
|
||
// Start Combat Calculation
|
||
on("clicked:startcombat", function() {
|
||
calculateStartCombat();
|
||
});
|
||
|
||
function calculateStartCombat() {
|
||
console.log('~~~ calculateStartCombat ~~~');
|
||
getAttrs(["victories"], function(values) {
|
||
let victories = parseInt(values.victories)||0;
|
||
setAttrs({
|
||
"resource": victories
|
||
});
|
||
});
|
||
}
|
||
|
||
// End Combat Calculation
|
||
on("clicked:endcombat", function() {
|
||
calculateEndCombat();
|
||
});
|
||
|
||
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
|
||
});
|
||
});
|
||
}
|
||
|
||
// Respite Calculation
|
||
on("clicked:respite", function() {
|
||
calculateRespite();
|
||
});
|
||
|
||
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,
|
||
});
|
||
});
|
||
}
|
||
|
||
|
||
/**
|
||
** 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;
|
||
}
|
||
|
||
/**
|
||
* 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);
|
||
}
|
||
}
|
||
|
||
// 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' },
|
||
};
|
||
|
||
/**
|
||
* 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 processAbility(abilityData) {
|
||
// 1. Determine ability type and get configuration.
|
||
const usage = abilityData.type.usage;
|
||
const config = ABILITY_TYPE_MAP[usage] || ABILITY_TYPE_MAP.default;
|
||
const id = generateRowID();
|
||
const cost = abilityData.cost === 'signature' ? abilityData.cost : parseInt(abilityData.cost) || 0;
|
||
|
||
let abilityTypePrefix = ""
|
||
if ((usage === "Triggered Action" || usage === "Maneuver") && abilityData.type.free === true) {
|
||
abilityTypePrefix = "free-"
|
||
}
|
||
|
||
let subtype = 'normal-ability';
|
||
if (cost === 'signature') {
|
||
subtype = 'signature-ability';
|
||
} else if (cost > 0) {
|
||
subtype = 'heroic-ability';
|
||
}
|
||
|
||
// 2. Extract and format primary data fields.
|
||
const distanceInfo = abilityData.distance?.[0];
|
||
let distance = '';
|
||
if (distanceInfo) {
|
||
const valueTwo = (parseInt(distanceInfo.value2) > 0) ? ` x ${distanceInfo.value2}` : '';
|
||
const within = (parseInt(distanceInfo.within) > 0) ? ` within ${distanceInfo.within}` : '';
|
||
const type = distanceInfo.type;
|
||
const valueOne = distanceInfo.value ? distanceInfo.value : '';
|
||
distance = (type === 'Melee' || type === 'Ranged' || type === 'Self') ? `${type} ${valueOne}`.trim() : `${valueOne}${valueTwo} ${type}${within}`;
|
||
}
|
||
|
||
const effect = abilityData.sections
|
||
.filter(s => s.type === 'text' || s.type === 'field')
|
||
.map(s => s.name ? `${s.name} ${s.value}: ${s.effect}` : s.text)
|
||
.join('\n');
|
||
|
||
// 3. Handle the conditional power roll section.
|
||
const powerRollSection = abilityData.sections.find(s => s.type === 'roll');
|
||
|
||
// 4. Assemble the final attribute object.
|
||
const attributes = {
|
||
[`repeating_${config.section}_${id}_${config.prefix}_name`]: abilityData.name,
|
||
[`repeating_${config.section}_${id}_${config.prefix}_description`]: abilityData.description,
|
||
[`repeating_${config.section}_${id}_${config.prefix}_type`]: `${abilityTypePrefix}${config.type}`,
|
||
[`repeating_${config.section}_${id}_${config.prefix}_subtype`]: subtype,
|
||
[`repeating_${config.section}_${id}_${config.prefix}_keywords`]: abilityData.keywords.join(', '),
|
||
[`repeating_${config.section}_${id}_${config.prefix}_trigger`]: abilityData.type.trigger ?? '',
|
||
[`repeating_${config.section}_${id}_${config.prefix}_distance`]: distance,
|
||
[`repeating_${config.section}_${id}_${config.prefix}_target`]: abilityData.target,
|
||
[`repeating_${config.section}_${id}_${config.prefix}_cost`]: parseInt(abilityData.cost) || 0,
|
||
[`repeating_${config.section}_${id}_${config.prefix}_effect`]: effect,
|
||
[`repeating_${config.section}_${id}_has_effect`]: effect ? 'on' : 0,
|
||
[`repeating_${config.section}_${id}_has_power_roll`]: powerRollSection ? 'on' : 0,
|
||
};
|
||
|
||
if (powerRollSection) {
|
||
Object.assign(attributes, {
|
||
[`repeating_${config.section}_${id}_${config.prefix}_characteristic`]: powerRollSection.roll.characteristic[0].toLowerCase(),
|
||
[`repeating_${config.section}_${id}_${config.prefix}_tier_1`]: powerRollSection.roll.tier1,
|
||
[`repeating_${config.section}_${id}_${config.prefix}_tier_2`]: powerRollSection.roll.tier2,
|
||
[`repeating_${config.section}_${id}_${config.prefix}_tier_3`]: powerRollSection.roll.tier3,
|
||
});
|
||
}
|
||
|
||
return attributes;
|
||
}
|
||
|
||
/**
|
||
* 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;
|
||
}
|
||
|
||
/**
|
||
* A collection of constant values used for filtering and identifying feature types.
|
||
* This prevents typos and centralizes key strings for easy updates.
|
||
*/
|
||
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',
|
||
};
|
||
|
||
/**
|
||
* A list of all possible damage types in the system.
|
||
*/
|
||
const DAMAGE_TYPES = [
|
||
'Acid', 'Cold', 'Corruption', 'Fire', 'Holy', 'Lightning',
|
||
'Poison', 'Psychic', 'Sonic',
|
||
];
|
||
|
||
/**
|
||
* An object grouping skill names by 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] || 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))
|
||
.join(', ');
|
||
};
|
||
|
||
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
|
||
});
|
||
}
|
||
});
|
||
}
|
||
|
||
// Handle the selected traits
|
||
if (feature.type === "Choice" && feature.data.selected) {
|
||
feature.data.selected.forEach(selection => {
|
||
result.push({
|
||
id: selection.id,
|
||
name: selection.name,
|
||
description: selection.description
|
||
});
|
||
});
|
||
}
|
||
});
|
||
console.log(result);
|
||
return result;
|
||
};
|
||
|
||
// --- Main Event Listener ---
|
||
|
||
on('clicked:import', async () => {
|
||
try {
|
||
// 1. DATA RETRIEVAL & PARSING
|
||
// ---------------------------
|
||
// Get the raw JSON string from the character sheet attributes.
|
||
const { forgesteel_json } = await getAttrsAsync(['forgesteel_json']);
|
||
if (!forgesteel_json) {
|
||
console.warn('Import data is empty. Aborting.');
|
||
return;
|
||
}
|
||
|
||
const data = JSON.parse(forgesteel_json);
|
||
const {
|
||
name: character_name,
|
||
ancestry,
|
||
class: characterClass,
|
||
career,
|
||
state,
|
||
culture,
|
||
complication,
|
||
} = data;
|
||
|
||
// Collate all features from different sources into one array for easier processing.
|
||
const allFeatures = getFeatures(data);
|
||
const level = characterClass.level;
|
||
|
||
|
||
// 2. 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 baseCharacteristics = characterClass.characteristics.reduce((acc,item) => { acc[item.characteristic] = item.value; return acc;}, {});
|
||
const might = calculateCharacteristic(allFeatures, 'Might', baseCharacteristics.Might);
|
||
const agility = calculateCharacteristic(allFeatures, 'Agility', baseCharacteristics.Agility);
|
||
const reason = calculateCharacteristic(allFeatures, 'Reason', baseCharacteristics.Reason);
|
||
const intuition = calculateCharacteristic(allFeatures, 'Intuition', baseCharacteristics.Intuition);
|
||
const presence = calculateCharacteristic(allFeatures, 'Presence', baseCharacteristics.Presence);
|
||
const characteristics = {
|
||
Might: might,
|
||
Agility: agility,
|
||
Reason: reason,
|
||
Intuition: intuition,
|
||
Presence: presence,
|
||
};
|
||
|
||
// 3. DERIVED & COMBAT STATISTICS
|
||
// ------------------------------
|
||
//Potency can be calculated by the helper function later
|
||
//const potency_strong = Math.max(might, agility, reason, intuition, presence);
|
||
|
||
const sizeObject = allFeatures.find(f => f.type === FEATURE_TYPES.SIZE)?.data.size ?? { value: 1, mod: 'M' };
|
||
const size = `${sizeObject.value}${sizeObject.mod ?? ''}`;
|
||
|
||
const baseSpeed = allFeatures.find(f => f.type === FEATURE_TYPES.SPEED)?.data.speed ?? 5;
|
||
const speed = calculateModifiedStat('Speed', baseSpeed, level, characteristics ,allFeatures);
|
||
const disengage = calculateModifiedStat('Disengage', 1, level, characteristics ,allFeatures);
|
||
const stability = calculateCombatStat(allFeatures, 'Stability', 0);
|
||
const wealth = calculateCombatStat(allFeatures, 'Wealth', state.wealth);
|
||
const renown = calculateCombatStat(allFeatures, 'Renown', state.renown);
|
||
|
||
// Stamina
|
||
const stamina_max = calculateModifiedStat('Stamina', 0, level, characteristics ,allFeatures);
|
||
const stamina = parseInt(stamina_max) - parseInt(state.staminaDamage);
|
||
|
||
// 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)
|
||
|
||
const immunity = getDamageModifiers(allFeatures, level, 'Immunity');
|
||
const weakness = getDamageModifiers(allFeatures, level, 'Weakness');
|
||
|
||
const resource_name = allFeatures.find(f => f.type === FEATURE_TYPES.HEROIC_RESOURCE)?.name ?? '';
|
||
const resource = allFeatures.find(f => f.type === FEATURE_TYPES.HEROIC_RESOURCE)?.value ?? '';
|
||
const resource_amount = allFeatures
|
||
.find(f => f.type === FEATURE_TYPES.HEROIC_RESOURCE).data.gains
|
||
.find(f => f.tag === "start").value ?? '1d3';
|
||
const resource_description = allFeatures
|
||
.find(f => f.type === FEATURE_TYPES.HEROIC_RESOURCE).data.gains
|
||
.map(i => `+${i.value}: ${i.trigger}`)
|
||
.join('\n');
|
||
|
||
// 4. 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}` : '';
|
||
|
||
// 5. 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.languages,
|
||
...allFeatures.filter(f => f.type === FEATURE_TYPES.LANGUAGE_CHOICE).flatMap(f => f.data.selected),
|
||
].join(', ');
|
||
|
||
// 6. REPEATING SECTIONS (Kits, Perks, Abilities, etc.)
|
||
// ----------------------------------------------------
|
||
// Process kits into a format suitable for setAttrs.
|
||
const kits = allFeatures
|
||
.filter(f => f.type === FEATURE_TYPES.KIT_STATS)
|
||
.reduce((acc, kit) => {
|
||
acc['modifier_name'] = !acc['modifier_name'] ? kit.name : acc['modifier_name'] + ' | ' + kit.name;
|
||
acc['kit_weapon'] = !acc['kit_weapon'] ? kit.weapon.join(', ') : acc['kit_weapon'] + ', ' + kit.weapon.join(', ');
|
||
acc['kit_armor'] = !acc['kit_armor'] ? kit.armor.join(', ') : acc['kit_armor'] + ', ' + kit.armor.join(', ');
|
||
acc['kit_speed'] = Math.max(acc['kit_speed'] ?? 0, parseInt(kit.speed));
|
||
acc['kit_disengage'] = Math.max(acc['kit_disengage'] ?? 0, parseInt(kit.disengage));
|
||
acc['kit_stamina'] = Math.max(acc['kit_stamina'] ?? 0, parseInt(kit.stamina));
|
||
acc['kit_stability'] = Math.max(acc['kit_stability'] ?? 0, parseInt(kit.stability));
|
||
acc['kit_melee_distance'] = Math.max(acc['kit_melee_distance'] ?? 0, parseInt(kit.meleeDistance));
|
||
acc['kit_ranged_distance'] = Math.max(acc['kit_ranged_distance'] ?? 0, parseInt(kit.rangedDistance));
|
||
if (kit.meleeDamage) {
|
||
acc['kit_melee_damage_1'] = kit.meleeDamage.tier1;
|
||
acc['kit_melee_damage_2'] = kit.meleeDamage.tier2;
|
||
acc['kit_melee_damage_3'] = kit.meleeDamage.tier3;
|
||
}
|
||
if (kit.rangedDamage) {
|
||
acc['kit_ranged_damage_1'] = kit.rangedDamage.tier1;
|
||
acc['kit_ranged_damage_2'] = kit.rangedDamage.tier2;
|
||
acc['kit_ranged_damage_3'] = kit.rangedDamage.tier3;
|
||
}
|
||
acc['modifier_description'] = !acc['modifier_description'] ? kit.description : acc['modifier_description'] + '\n\n' + kit.description;
|
||
return acc;
|
||
}, {});
|
||
|
||
// Process perks, ancestry traits, features, and abilities.
|
||
const perks = allFeatures
|
||
.filter(f => f.id.startsWith('perk-') && f.type === FEATURE_TYPES.TEXT)
|
||
.reduce((acc, f) => {
|
||
const id = generateRowID();
|
||
acc[`repeating_perks_${id}_perk_name`] = f.name;
|
||
acc[`repeating_perks_${id}_perk_description`] = f.description;
|
||
return acc; }, {});
|
||
|
||
const ancestryFeatures = extractAncestryFeatures(data.ancestry)
|
||
.filter(f => f.description)
|
||
.reduce((acc, f) => {
|
||
const id = generateRowID();
|
||
acc[`repeating_ancestrytraits_${id}_ancestrytrait_name`] = f.name;
|
||
acc[`repeating_ancestrytraits_${id}_ancestrytrait_description`] = f.description;
|
||
return acc;
|
||
}, {});
|
||
|
||
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) };
|
||
}, {});
|
||
|
||
|
||
// 7. FINAL ASSEMBLY & ATTRIBUTE SETTING
|
||
// -------------------------------------
|
||
// Consolidate all processed data into a single object for setAttrs.
|
||
const newAttrs = {
|
||
forgesteel_json: '', // Clear the import field.
|
||
// Core Info
|
||
character_name,
|
||
ancestry: ancestry.name,
|
||
class: characterClass.name,
|
||
career: career.name,
|
||
subclass,
|
||
victories: state.victories,
|
||
level,
|
||
wealth,
|
||
renown,
|
||
experience: state.xp,
|
||
// Characteristics
|
||
might,
|
||
agility,
|
||
reason,
|
||
intuition,
|
||
presence,
|
||
// Derived Stats
|
||
//potency_strong,
|
||
//potency_average: potency_strong - 1,
|
||
//potency_weak: potency_strong - 2,
|
||
size,
|
||
speed,
|
||
disengage,
|
||
stability,
|
||
stamina,
|
||
stamina_max,
|
||
stamina_winded: Math.floor(stamina_max / 2),
|
||
stamina_dead: -Math.floor(stamina_max / 2),
|
||
recoveries,
|
||
recoveries_max,
|
||
recovery_amount: Math.floor(stamina_max / 3),
|
||
surges: state.surges,
|
||
immunity,
|
||
weakness,
|
||
resource,
|
||
resource_name,
|
||
resource_amount,
|
||
resource_description,
|
||
//surge_damage: potency_strong,
|
||
// 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.
|
||
await Promise.all([
|
||
clearRepeatingSection('modifiers'),
|
||
clearRepeatingSection('perks'),
|
||
clearRepeatingSection('ancestrytraits'),
|
||
clearRepeatingSection('classfeatures'),
|
||
clearRepeatingSection('abilities'),
|
||
clearRepeatingSection('noaction'),
|
||
clearRepeatingSection('maneuvers'),
|
||
clearRepeatingSection('triggered'),
|
||
clearRepeatingSection('moves'),
|
||
]);
|
||
|
||
// 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);
|
||
|
||
} catch (error) {
|
||
console.error("Failed to import character data. Please ensure the JSON is valid.", error);
|
||
}
|
||
});
|
||
|
||
/* Monster Import */
|
||
on('clicked:importmonster', async () => {
|
||
try {
|
||
// 1. DATA RETRIEVAL & PARSING
|
||
// ---------------------------
|
||
// Get the raw JSON string from the character sheet attributes.
|
||
const { forgesteel_json } = await getAttrsAsync(['forgesteel_json']);
|
||
if (!forgesteel_json) {
|
||
console.warn('Import data is empty. Aborting.');
|
||
return;
|
||
}
|
||
|
||
const data = JSON.parse(forgesteel_json);
|
||
|
||
// 2. CORE MONSTER INFORMATION
|
||
// -----------------------------
|
||
|
||
// Primary characteristics (attributes).
|
||
const findCharacteristic = (name) => data.characteristics.find(c => c.characteristic === name)?.value || 0;
|
||
const might = findCharacteristic('Might');
|
||
const agility = findCharacteristic('Agility');
|
||
const reason = findCharacteristic('Reason');
|
||
const intuition = findCharacteristic('Intuition');
|
||
const presence = findCharacteristic('Presence');
|
||
|
||
// Keywords and Role
|
||
const keywords = data.keywords.join(', ');
|
||
const roletype = data.role.type === 'No Role' ? '' : ` ${data.role.type}`;
|
||
const role = `${data.role.organization}${roletype}`;
|
||
|
||
// Size, Speed and Movement Types
|
||
const sizeObject = data.size ?? { value: 1, mod: 'M' };
|
||
const size = `${sizeObject.value}${sizeObject.mod ?? ''}`;
|
||
const speed = data.speed.value ?? 5;
|
||
const movement = data.speed.modes.join(', ') ?? '';
|
||
|
||
// Stability and Stamina
|
||
const stability = data.stability ?? 0;
|
||
const stamina = data.stamina ?? 0;
|
||
|
||
// Immunities and Weaknesses
|
||
const immunity = getDamageModifiers(data.features, 1, 'Immunity');
|
||
const weakness = getDamageModifiers(data.features, 1, 'Weakness');
|
||
|
||
// EV, With Captain, and Free Strike Damage
|
||
const encountervalue = data.encounterValue;
|
||
const withcaptain = data.withCaptain;
|
||
const freestrike = data.freeStrikeDamage;
|
||
|
||
// 3. REPEATING ABILITIES
|
||
// ----------------------------------------------------
|
||
|
||
const traits = data.features
|
||
.filter(f => f.type === FEATURE_TYPES.TEXT)
|
||
.reduce((acc, f) => {
|
||
const id = generateRowID();
|
||
if (f.name === 'Solo Monster' || f.name === 'Ajax') {
|
||
const parts = f.description.trim().split('\n');
|
||
|
||
const firstPart = parts[0].replace('* **', '').split('** ');
|
||
const soloOne = firstPart[0];
|
||
const soloOneText = firstPart[1];
|
||
|
||
const secondPart = parts[1].replace('* **', '').split('** ');
|
||
const soloTwo = secondPart[0];
|
||
const soloTwoText = secondPart[1];
|
||
|
||
acc[`repeating_npcabilities_${id}_ability_name`] = f.name;
|
||
acc[`repeating_npcabilities_${id}_ability_subtype`] = 'solo-monster';
|
||
acc[`repeating_npcabilities_${id}_ability_solo_1_name`] = soloOne;
|
||
acc[`repeating_npcabilities_${id}_ability_solo_1_text`] = soloOneText;
|
||
acc[`repeating_npcabilities_${id}_ability_solo_2_name`] = soloTwo;
|
||
acc[`repeating_npcabilities_${id}_ability_solo_2_text`] = soloTwoText;
|
||
} else {
|
||
acc[`repeating_npcabilities_${id}_ability_name`] = f.name;
|
||
acc[`repeating_npcabilities_${id}_ability_subtype`] = 'trait';
|
||
acc[`repeating_npcabilities_${id}_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) }), {});
|
||
|
||
|
||
|
||
// 4. FINAL ASSEMBLY & ATTRIBUTE SETTING
|
||
// -------------------------------------
|
||
// Consolidate all processed data into a single object for setAttrs.
|
||
const newAttrs = {
|
||
forgesteel_json: '', // Clear the import field.
|
||
is_npc: 'on',
|
||
|
||
// Core Info
|
||
character_name: data.name,
|
||
level: data.level,
|
||
npc_role: role,
|
||
npc_keywords: keywords,
|
||
npc_EV: encountervalue,
|
||
// Stats
|
||
size,
|
||
speed,
|
||
stamina,
|
||
stability: stability,
|
||
npc_freestrike: freestrike,
|
||
|
||
immunity,
|
||
weakness,
|
||
npc_movement: movement,
|
||
npc_with_captain: withcaptain,
|
||
|
||
might,
|
||
agility,
|
||
reason,
|
||
intuition,
|
||
presence,
|
||
// Spread in repeating section data
|
||
...traits,
|
||
...abilityFeatures,
|
||
};
|
||
|
||
// Clear existing repeating sections before adding new data.
|
||
await clearRepeatingSection('npcabilities');
|
||
|
||
// Set the new attributes on the character sheet.
|
||
await setAttrsAsync(newAttrs);
|
||
|
||
console.log('Monster import successful!', newAttrs);
|
||
|
||
} catch (error) {
|
||
console.error("Failed to import monster data. Please ensure the JSON is valid.", error);
|
||
}
|
||
});
|
||
|
||
/**
|
||
* 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 processMonsterAbility(abilityData) {
|
||
// 1. Determine ability type and get configuration.
|
||
const usage = ABILITY_TYPE_MAP[abilityData.type.usage].type;
|
||
const cost = abilityData.cost === 'signature' ? abilityData.cost : parseInt(abilityData.cost) || 0;
|
||
|
||
let subtype = 'normal-ability';
|
||
if (abilityData.type.usage === 'Villain Action') {
|
||
subtype = 'villain-ability';
|
||
} else if (cost === 'signature') {
|
||
subtype = 'signature-ability';
|
||
} else if (cost > 0) {
|
||
subtype = 'malice-ability';
|
||
}
|
||
|
||
let abilityTypePrefix = ""
|
||
if ((abilityData.type.usage === "Triggered Action" || abilityData.type.usage === "Maneuver") && abilityData.type.free === true) {
|
||
abilityTypePrefix = "free-"
|
||
}
|
||
|
||
const id = generateRowID();
|
||
|
||
// 2. Extract and format primary data fields.
|
||
const distanceInfo = abilityData.distance?.[0];
|
||
const distance = distanceInfo ? `${distanceInfo.type} ${distanceInfo.value || ''}`.trim() : '';
|
||
|
||
const malice = abilityData.sections.find(s => s.type === 'field' && (s.name === 'Spend' || s.name === 'Malice'));
|
||
|
||
const effect = abilityData.sections
|
||
.filter(s => s.type === 'text' && !s.text.startsWith('**Special:**'))
|
||
.map(s => s.name ? `${s.name} ${s.value}: ${s.effect}` : s.text)
|
||
.join('\n');
|
||
|
||
const special = abilityData.sections.find(s => s.type === 'text' && s.text.startsWith('**Special:**'));
|
||
|
||
// 3. Handle the conditional power roll section.
|
||
const powerRollSection = abilityData.sections.find(s => s.type === 'roll');
|
||
// 4. Assemble the final attribute object.
|
||
const attributes = {
|
||
[`repeating_npcabilities_${id}_ability_name`]: abilityData.name,
|
||
[`repeating_npcabilities_${id}_ability_description`]: abilityData.description,
|
||
[`repeating_npcabilities_${id}_ability_type`]: `${abilityTypePrefix}${usage}`,
|
||
[`repeating_npcabilities_${id}_ability_subtype`]: subtype,
|
||
[`repeating_npcabilities_${id}_ability_keywords`]: abilityData.keywords.join(', '),
|
||
[`repeating_npcabilities_${id}_ability_trigger`]: abilityData.type.trigger ?? '',
|
||
[`repeating_npcabilities_${id}_ability_distance`]: distance,
|
||
[`repeating_npcabilities_${id}_ability_target`]: abilityData.target,
|
||
[`repeating_npcabilities_${id}_ability_malice_cost`]: cost,
|
||
[`repeating_npcabilities_${id}_has_effect`]: effect ? 'on' : 0,
|
||
[`repeating_npcabilities_${id}_ability_effect`]: effect,
|
||
[`repeating_npcabilities_${id}_has_power_roll`]: powerRollSection ? 'on' : 0,
|
||
};
|
||
|
||
if (powerRollSection) {
|
||
Object.assign(attributes, {
|
||
[`repeating_npcabilities_${id}_ability_characteristic`]: powerRollSection.roll.bonus,
|
||
[`repeating_npcabilities_${id}_ability_tier_1`]: powerRollSection.roll.tier1,
|
||
[`repeating_npcabilities_${id}_ability_tier_2`]: powerRollSection.roll.tier2,
|
||
[`repeating_npcabilities_${id}_ability_tier_3`]: powerRollSection.roll.tier3,
|
||
});
|
||
}
|
||
|
||
if (special) {
|
||
Object.assign(attributes, {
|
||
[`repeating_npcabilities_${id}_has_special`]: 'on',
|
||
[`repeating_npcabilities_${id}_ability_special`]: special.text.replace('**Special:** ', ''),
|
||
});
|
||
}
|
||
|
||
if (malice) {
|
||
Object.assign(attributes, {
|
||
[`repeating_npcabilities_${id}_has_malice`]: 'on',
|
||
[`repeating_npcabilities_${id}_ability_cost`]: malice.value,
|
||
[`repeating_npcabilities_${id}_ability_malice`]: malice.effect,
|
||
});
|
||
}
|
||
|
||
return attributes;
|
||
}
|
||
|
||
/**
|
||
** 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>
|