Files
2025-11-06 16:19:34 -08:00

3072 lines
166 KiB
HTML

<div class="wrapper">
<input class="hidden" type="text" name="attr_sheet_version" value="1.0" />
<input class="hidden page-view" type="checkbox" name="attr_page_view" value="0" checked />
<input class="hidden page-view" type="checkbox" name="attr_page_view" value="1" />
<input class="hidden show-creature" type="checkbox" name="attr_show_creature" value="1" />
<nav class="small-nav">
<label for="page_view_0" data-i18n-title="view-sheet-left" title="View Left">
<span></span>
<input class="hidden page-view" type="radio" id="page_view_0" name="attr_page_view" value="0" title="@{page_view}" checked/>
</label>
<label for="page_view_1" data-i18n-title="view-sheet-right" title="View Right">
<span></span>
<input class="hidden page-view" type="radio" id="page_view_1" name="attr_page_view" value="1" title="@{page_view}" />
</label>
</nav>
<div class="show-creature-style">
<label for="show_creature" data-i18n-title="toggle-creature-sheet">
<input type="checkbox" id="show_creature" name="attr_show_creature" value="1" title="@{show_creature}" />
<span class="pc-sheet" data-i18n="player-character-abbrv">PC</span>
<span>|</span>
<span class="creature-sheet" data-i18n="creature-u">CREATURE</span>
</label>
</div>
<section class="show-pc">
<div class="col1">
<div class="col1-a">
<span class="header-left"></span>
<section class="name">
<span class="section-header kanji-text class-column-one"></span>
<span class="section-header name-style span-2" data-i18n="character-name-u">NAME</span>
<input class="span-2" type="text" name="attr_character_name" title="@{character_name}" value="" />
</section>
<section class="nickname">
<span class="class-column-one"></span>
<span class="section-header name-style span-2" data-i18n="character-nickname-u">NICKNAME</span>
<input class="span-2" type="text" name="attr_character_nickname" title="@{character_nickname}" value="" />
</section>
<section class="class">
<span class="section-header kanji-text class-column-one">階 級</span>
<span class="section-header name-style span-2" data-i18n="class-u">CLASS</span>
<input class="span-2" type="text" name="attr_class" value="" title="@{class}">
</section>
<section class="description">
<span class="section-header" data-i18n="description-abilities">Description/Abilities</span>
<textarea name="attr_description" title="@{description}"></textarea>
</section>
<section class="features">
<span class="section-header" data-i18n="features">Features</span>
<textarea name="attr_features" title="@{features}"></textarea>
</section>
<section class="texts">
<!-- TEXTS -->
<div>
<button type="roll" name="roll_dailytexts" title="%{dailytexts}" value="@{dailytexts}">
<span class="section-header texts-style" data-i18n="texts-u">TEXTS</span>
</button>
<button type="action" class="hidden" name="act_dailytexts-button"></button>
<input type="text" class="hidden" name="attr_dailytexts" value="" />
<span class="section-notes" data-i18n="texts-notes-1">Spirit +d4 times per day =</span>
<span class="nowrap">
<input type="text" class="input-width-small" name="attr_texts_per_day" value="0" title="@{texts_per_day}" />
<span style="color: initial;">/</span>
<input type="text" class="input-width-small" name="attr_texts_per_day_max" value="0" title="@{texts_per_day|max}" />
<button type="roll" name="roll_kamisvengeance" title="%{kamisvengeance}" value="@{kamisvengeance}">
<span class="kamis-style" data-i18n="kamis-vengeance">Kamis Vengeance</span>
</button>
<button type="action" class="hidden" name="act_kamisvengeance-button"></button>
<input type="text" class="hidden" name="attr_kamisvengeance" value="" />
</span>
</div>
<fieldset class="repeating_texts">
<div class="flex-row">
<span class="nowrap">
<input type="text" name="attr_name" class="input-width-large" value="" title="@{repeating_texts_$X_name}" />
<button type="roll" name="roll_test" title="%{repeating_texts_$X_test}" value="@{test}"></button>
<button type="action" class="hidden" name="act_test-button"></button>
<input type="text" class="hidden" name="attr_test" value="" />
</span>
<textarea name="attr_description" class="input-width-full" title="@{repeating_texts_$X_description}"></textarea>
</div>
</fieldset>
<div class="section-notes center" data-i18n="texts-notes-2" style="margin-inline: 15%;">Spirit DR12, or -d2 HP and no Texts for 1 hour</div>
</section>
<section class="col1-footer">
<span class="credits"></span>
<button type='roll' name='roll_senshi' title='www.slightlyrecklessgames.com/senshi' value='[www.slightlyrecklessgames.com/senshi](https://www.slightlyrecklessgames.com/senshi)'>
<span data-i18n="character-generator">Character Generator</span>
</button>
</section>
</div>
<div class="col1-b">
<section class="logo">
<div class="virtues">
<!-- VIRTUES -->
<div class="virtues-box span-all">
<button type="roll" name="roll_virtues" title="%{virtues}" value="@{virtues}">
<span class="section-header virtues-style" data-i18n="virtues-u">VIRTUES</span>
</button>
<button type="action" class="hidden" name="act_virtues-button"></button>
<input type="text" class="hidden" name="attr_virtues" value="" />
</div>
<div class="span-all">
<label>
<span class="die-style" data-i18n="die-u">DIE:</span>
<select class="input-width-small" name="attr_virtue_die" title="@{virtue_die}">
<option value="2" selected>d2</option>
<option value="4">d4</option>
<option value="6">d6</option>
</select>
</label>
<label>
<input type="text" class="input-width-small" name="attr_virtue" value="0" title="@{virtue}" />
<span>/</span>
<input type="text" class="input-width-small" name="attr_virtue_max" value="0" title="@{virtue|max}" />
</label>
</div>
</div>
</section>
<section class="swiftness">
<!-- ABILITIES -->
<button type="roll" name="roll_swiftness_test" title="%{swiftness_test}" value="@{swiftness_test}">
<span class="section-header" data-i18n="swiftness-u">SWIFTNESS</span>
</button>
<button type="action" class="hidden" name="act_swiftness_test-button"></button>
<input type="text" class="hidden" name="attr_swiftness_test" value="" />
<span class="ability-base-mod">
<select name="attr_swiftness" class="ability-input" title="@{swiftness}">
<option value="6">+6</option>
<option value="5">+5</option>
<option value="4">+4</option>
<option value="3">+3</option>
<option value="2">+2</option>
<option value="1">+1</option>
<option value="0" selected>0</option>
<option value="-1">-1</option>
<option value="-2">-2</option>
<option value="-3">-3</option>
<option value="-4">-4</option>
<option value="-5">-5</option>
<option value="-6">-6</option>
</select>
<select name="attr_swiftness_mod" class="ability-mod" title="@{swiftness_mod}">
<option value="6">+6</option>
<option value="5">+5</option>
<option value="4">+4</option>
<option value="3">+3</option>
<option value="2">+2</option>
<option value="1">+1</option>
<option value="0" selected>+0</option>
<option value="-1">-1</option>
<option value="-2">-2</option>
<option value="-3">-3</option>
<option value="-4">-4</option>
<option value="-5">-5</option>
<option value="-6">-6</option>
</select>
</span>
<!-- INITIATIVE-->
<div class="flex-inline-row">
<button type="roll" name="roll_initiative" data-i18n-title="initiative-group" title="Group Initiative | %{initiative}" value="@{initiative}">
<span data-i18n="roll-initiative">d6 Initiative</span>
</button>
<button type="action" class="hidden" name="act_initiative-button"></button>
<input type="text" class="hidden" name="attr_initiative" value="" />
<button type="roll" name="roll_initiative2" data-i18n-title="initiative-individual" title="Individual Initiative, Swiftness +d6 | %{initiative2}" value="@{initiative2}">
<span data-i18n="roll-initiative-individual">Swiftness + d6</span>
</button>
<button type="action" class="hidden" name="act_initiative2-button"></button>
<input type="text" class="hidden" name="attr_initiative2" value="" />
</div>
</section>
<section class="spirit">
<button type="roll" name="roll_spirit_test" title="%{spirit_test}" value="@{spirit_test}">
<span class="section-header" data-i18n="spirit-u">SPIRIT</span>
</button>
<button type="action" class="hidden" name="act_spirit_test-button"></button>
<input type="text" class="hidden" name="attr_spirit_test" value="" />
<span class="ability-base-mod">
<select name="attr_spirit" class="ability-input" title="@{spirit}">
<option value="6">+6</option>
<option value="5">+5</option>
<option value="4">+4</option>
<option value="3">+3</option>
<option value="2">+2</option>
<option value="1">+1</option>
<option value="0" selected>0</option>
<option value="-1">-1</option>
<option value="-2">-2</option>
<option value="-3">-3</option>
<option value="-4">-4</option>
<option value="-5">-5</option>
<option value="-6">-6</option>
</select>
<select name="attr_spirit_mod" class="ability-mod" title="@{spirit_mod}">
<option value="6">+6</option>
<option value="5">+5</option>
<option value="4">+4</option>
<option value="3">+3</option>
<option value="2">+2</option>
<option value="1">+1</option>
<option value="0" selected>+0</option>
<option value="-1">-1</option>
<option value="-2">-2</option>
<option value="-3">-3</option>
<option value="-4">-4</option>
<option value="-5">-5</option>
<option value="-6">-6</option>
</select>
</span>
</section>
<section class="vigor">
<button type="roll" name="roll_vigor_test" title="%{vigor_test}" value="@{vigor_test}">
<span class="section-header" data-i18n="vigor-u">VIGOR</span>
</button>
<button type="action" class="hidden" name="act_vigor_test-button"></button>
<input type="text" class="hidden" name="attr_vigor_test" value="" />
<span class="ability-base-mod">
<select name="attr_vigor" class="ability-input" title="@{vigor}">
<option value="6">+6</option>
<option value="5">+5</option>
<option value="4">+4</option>
<option value="3">+3</option>
<option value="2">+2</option>
<option value="1">+1</option>
<option value="0" selected>0</option>
<option value="-1">-1</option>
<option value="-2">-2</option>
<option value="-3">-3</option>
<option value="-4">-4</option>
<option value="-5">-5</option>
<option value="-6">-6</option>
</select>
<select name="attr_vigor_mod" class="ability-mod" title="@{vigor_mod}">
<option value="6">+6</option>
<option value="5">+5</option>
<option value="4">+4</option>
<option value="3">+3</option>
<option value="2">+2</option>
<option value="1">+1</option>
<option value="0" selected>+0</option>
<option value="-1">-1</option>
<option value="-2">-2</option>
<option value="-3">-3</option>
<option value="-4">-4</option>
<option value="-5">-5</option>
<option value="-6">-6</option>
</select>
</span>
</section>
<section class="resilience">
<button type="roll" name="roll_resilience_test" title="%{resilience_test}" value="@{resilience_test}">
<span class="section-header" data-i18n="resilience-u">RESILIENCE</span>
</button>
<button type="action" class="hidden" name="act_resilience_test-button"></button>
<input type="text" class="hidden" name="attr_resilience_test" value="" />
<span class="ability-base-mod">
<select name="attr_resilience" class="ability-input" title="@{resilience}">
<option value="6">+6</option>
<option value="5">+5</option>
<option value="4">+4</option>
<option value="3">+3</option>
<option value="2">+2</option>
<option value="1">+1</option>
<option value="0" selected>0</option>
<option value="-1">-1</option>
<option value="-2">-2</option>
<option value="-3">-3</option>
<option value="-4">-4</option>
<option value="-5">-5</option>
<option value="-6">-6</option>
</select>
<select name="attr_resilience_mod" class="ability-mod" title="@{resilience_mod}">
<option value="6">+6</option>
<option value="5">+5</option>
<option value="4">+4</option>
<option value="3">+3</option>
<option value="2">+2</option>
<option value="1">+1</option>
<option value="0" selected>+0</option>
<option value="-1">-1</option>
<option value="-2">-2</option>
<option value="-3">-3</option>
<option value="-4">-4</option>
<option value="-5">-5</option>
<option value="-6">-6</option>
</select>
</span>
</section>
<section class="honour">
<!-- HONOUR -->
<span class="section-header honour-style" data-i18n="honour-u">HONOUR</span>
<div class="honour-grid" title="@{honour}">
<label style="left: -18px;"><input type="radio" name="attr_honour" value="1" title="@{honour}"><span>1</span></label>
<label><input type="radio" name="attr_honour" value="2" title="@{honour}"><span>2</span></label>
<label><input type="radio" name="attr_honour" value="3" title="@{honour}"><span>3</span></label>
<label><input type="radio" name="attr_honour" value="4" title="@{honour}"><span>4</span></label>
<label><input type="radio" name="attr_honour" value="5" title="@{honour}"><span>5</span></label>
<label><input type="radio" name="attr_honour" value="6" title="@{honour}"><span>6</span></label>
<label><input type="radio" name="attr_honour" value="7" title="@{honour}"><span>7</span></label>
<label><input type="radio" name="attr_honour" value="8" title="@{honour}"><span>8</span></label>
<label><input type="radio" name="attr_honour" value="9" title="@{honour}"><span>9</span></label>
<label><input type="radio" name="attr_honour" value="10" title="@{honour}" checked /><span>10</span></label>
<label><input type="radio" name="attr_honour" value="11" title="@{honour}"><span>11</span></label>
<label><input type="radio" name="attr_honour" value="12" title="@{honour}"><span>12</span></label>
<label><input type="radio" name="attr_honour" value="13" title="@{honour}"><span>13</span></label>
<label><input type="radio" name="attr_honour" value="14" title="@{honour}"><span>14</span></label>
<label><input type="radio" name="attr_honour" value="15" title="@{honour}"><span>15</span></label>
<label><input type="radio" name="attr_honour" value="16" title="@{honour}"><span>16</span></label>
<label><input type="radio" name="attr_honour" value="17" title="@{honour}"><span>17</span></label>
<label><input type="radio" name="attr_honour" value="18" title="@{honour}"><span>18</span></label>
<label><input type="radio" name="attr_honour" value="19" title="@{honour}"><span>19</span></label>
<label><input type="radio" name="attr_honour" value="20" title="@{honour}"><span>20</span></label>
</div>
</section>
<section class="woes">
<!-- WOES -->
<span class="section-header woes-style" data-i18n="woes-u">WOES</span>
<div class="woes-grid" title="@{woes}">
<label style="bottom: -19px; right: -11px;"><input type="radio" name="attr_woes" value="0" title="@{woes}" checked /><span>0</span></label>
<label><input type="radio" name="attr_woes" value="1" title="@{woes}" /><span>1</span></label>
<label><input type="radio" name="attr_woes" value="2" title="@{woes}" /><span>2</span></label>
<label><input type="radio" name="attr_woes" value="3" title="@{woes}" /><span>3</span></label>
<label style="top: -16px; left: -5px;"><input type="radio" name="attr_woes" value="4" title="@{woes}" /><span>4</span></label>
<label style="left: -7px; top: -10px;"><input type="radio" name="attr_woes" value="5" title="@{woes}" /><span>5</span></label>
<label style="left: -11px;"><input type="radio" name="attr_woes" value="6" title="@{woes}" /><span>6</span></label>
<label><input type="radio" name="attr_woes" value="7" title="@{woes}" /><span></span></label>
</div>
</section>
</div>
</div>
<div class="col2">
<section class="weapons">
<div class="weapon-notes-style section-notes">
<label for="weapon_notes_max_damage" data-i18n-title="weapon-notes">
<input type="checkbox" id="weapon_notes_max_damage" name="attr_weapon_notes_max_damage" value="1"/>
<span data-i18n="weapon-notes-max-damage">Maximum damage</span>
</label>
<label for="weapon_notes_reroll" data-i18n-title="weapon-notes">
<input type="checkbox" id="weapon_notes_reroll" name="attr_weapon_notes_reroll" value="1"/>
<span data-i18n="weapon-notes-reroll">Reroll</span>
</label>
<label for="weapon_notes_damage_less_d6" data-i18n-title="weapon-notes">
<input type="checkbox" id="weapon_notes_damage_less_d6" name="attr_weapon_notes_damage_less_d6" value="1"/>
<span data-i18n="weapon-notes-d6">-d6 damage</span>
</label>
<label for="weapon_notes_dr_less_d4" data-i18n-title="weapon-notes">
<input type="checkbox" id="weapon_notes_dr_less_d4" name="attr_weapon_notes_dr_less_d4" value="1"/>
<span data-i18n="weapon-notes-dr">DR -4</span>
</label>
<label for="weapon_notes_no_crit_fumble" data-i18n-title="weapon-notes">
<input type="checkbox" id="weapon_notes_no_crit_fumble" name="attr_weapon_notes_no_crit_fumble" value="1"/>
<span data-i18n="weapon-notes-no-crit-fumble">No Crit/Fumble</span>
</label>
<label for="weapon_notes_auto_parry" data-i18n-title="weapon-notes">
<input type="checkbox" id="weapon_notes_auto_parry" name="attr_weapon_notes_auto_parry" value="1"/>
<span data-i18n="weapon-notes-auto-parry">Auto Parry</span>
</label>
</div>
<!-- WEAPONS -->
<div class="weapons-grid">
<span class="span-all sword-image"></span>
<span class="span-2 section-header weapon-style" data-i18n="weapons-u">WEAPONS</span>
<span></span>
<span class="span-2">
<label for="duel" data-i18n-title="duel-mode-toggle" title="Enable/Disable Dueling features">
<input type="checkbox" class="show-duel" id="duel" name="attr_duel" value="1" title="@{duel}">
<span class="dueling-style" data-i18n="dueling-u">DUELING</span>
</label>
</span>
<span class="column-header"></span>
<span class="column-header" data-i18n="damage-abbrv">DMG</span>
<span class="column-header" data-i18n="weapon-type">Type</span>
<span class="column-header" data-i18n="weapon-broken">Broken</span>
<span class="column-header" data-i18n="weapon-action">Action</span>
<input type="checkbox" class="hidden show-duel" id="duel" name="attr_duel" value="1">
<fieldset class="repeating_weapons">
<div class="weapons-grid-row">
<input type="hidden" name="attr_crit_multiplier" value="1" />
<input type="text" class="input-width-full" name="attr_name" value="" title="@{repeating_weapons_$X_name}" />
<input type="text" class="input-width-full center" name="attr_damage" value="d2" data-i18n-title="valid-input-damage" title="@{repeating_weapons_$X_damage} | example; 'd4', '1d8', '2d6+3', etc." />
<select name="attr_type" title="@{repeating_weapons_$X_type}">
<option value="@{vigor}" data-i18n="striking" selected>Striking</option>
<option value="@{spirit}" data-i18n="ranged">Ranged</option>
</select>
<input type="hidden" name="attr_type_label" value="" />
<input type="hidden" name="attr_type_label_ability" value="" />
<input type="hidden" name="attr_type_mod" value="0" />
<input type="checkbox" class="lost-broken" name="attr_broken_weapon" value="1" data-i18n-title="lost-broken" />
<label class="lost-broken">
<span data-i18n="lost-broken">Lost/Broken</span>
<input type="checkbox" class="lost-broken hidden" name="attr_broken_weapon" value="1" />
</label>
<!-- normal -->
<span class="weapon-actions normal-view">
<button type="roll" name="roll_attack" title="%{repeating_weapons_$X_attack}" value="@{attack}">
<span data-i18n="attack">Attack</span>
</button>
<button type="action" class="hidden" name="act_attack-button"></button>
<input type="text" class="hidden" name="attr_attack" value="" />
<button type="roll" name="roll_parry" title="%{repeating_weapons_$X_parry}" value="@{parry}">
<span data-i18n="parry">Parry</span>
</button>
<button type="action" class="hidden" name="act_parry-button"></button>
<input type="text" class="hidden" name="attr_parry" value="" />
</span>
<!-- dueling -->
<span class="weapon-actions dueling-view">
<button type="roll" name="roll_attack" title="%{repeating_weapons_$X_attack}" value="@{attack}">
<span data-i18n="attack">Attack</span>
</button>
<button type="roll" name="roll_guard" title="%{repeating_weapons_$X_guard}" value="@{guard}">
<span data-i18n="guard">Guard</span>
</button>
<button type="action" class="hidden" name="act_guard-button"></button>
<input type="text" class="hidden" name="attr_guard" value="" />
<button type="roll" name="roll_riposte" title="%{repeating_weapons_$X_riposte}" value="@{riposte}">
<span data-i18n="riposte">Riposte</span>
</button>
<button type="action" class="hidden" name="act_riposte-button"></button>
<input type="text" class="hidden" name="attr_riposte" value="" />
</span>
</div>
<input type="checkbox" class="weapon-type hidden" name="attr_show_ranged" value="1"/>
<div class="weapons-grid-row show-ranged">
<span class="span-4 right">
<span class="nowrap">
<input type="text" class="input-width-smallest" name="attr_ammo" value="1" title="@{repeating_weapons_$X_ammo}" />
<span style="color: initial;">/</span>
<input type="text" class="input-width-smallest" name="attr_ammo_max" value="1" title="@{repeating_weapons_$X_ammo|max}" />
</span>
<label class="nowrap" data-i18n-title="track-ammo-title">
<input type="checkbox" name="attr_track_ammo" value="1" title="@{repeating_weapons_$X_track_ammo}" />
<span class="column-header" data-i18n="track-ammo-u">TRACK</span>
</label>
</span>
</div>
</fieldset>
</div>
</section>
<section class="battle">
<!-- DEFENCE and PC DAMAGE-->
<div class="flex-inline-row">
<button type="roll" name="roll_defence" title="%{defence}" value="@{defence}">
<span class="defence-style" data-i18n="defence-u">DEFENCE</span>
</button>
<button type="action" class="hidden" name="act_defence-button"></button>
<input type="text" class="hidden" name="attr_defence" value="" />
</div>
<div class="flex-inline-row">
<button type="roll" name="roll_takedamage" title="%{takedamage}" data-i18n-title="take-damage-title" value="@{takedamage}">
<span data-i18n="damage">Damage</span>
</button>
<button type="action" class="hidden" name="act_takedamage-button"></button>
<input type="text" class="hidden" name="attr_takedamage" value="" />
<button type="roll" name="roll_takedamagenoarmour" title="%{takedamagenoarmour}" data-i18n-title="take-damage-without-armour-title" value="@{takedamagenoarmour}">
<span data-i18n="damage-without-armour">Damage(Armour N/A)</span>
</button>
<button type="action" class="hidden" name="act_takedamagenoarmour-button"></button>
<input type="text" class="hidden" name="attr_takedamagenoarmour" value="" />
</div>
<div class="flex-inline-row">
<button type="roll" name="roll_morale" title="%{morale}" value="@{morale}">
<span data-i18n="morale">Morale</span>
</button>
<button type="action" class="hidden" name="act_morale-button"></button>
<input type="text" class="hidden" name="attr_morale" value="" />
<button type="roll" name="roll_reaction" title="%{reaction}" value="@{reaction}">
<span data-i18n="reaction">Reaction</span>
</button>
<button type="action" class="hidden" name="act_reaction-button"></button>
<input type="text" class="hidden" name="attr_reaction" value="" />
</div>
<div class="flex-inline-row">
<button type="roll" name="roll_dr_test" data-i18n-title="dr-test-roll" value="@{dr_test}">
<span class="defence-style" data-i18n="dr-test">DR Test</span>
</button>
<button type="action" class="hidden" name="act_dr_test-button"></button>
<input type="text" class="hidden" name="attr_dr_test" value="" />
<button type="roll" name="roll_dice" value="&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolling-dice}}} {{roll_dice=[[0]]}} {{roll=@{dice_query2} = [[@{dice_query2}]]}} {{roll_query_footer=[&amp;nbsp;](`&amp;#64;{@{character_name_safe}|dice_query_inline_roll})}}">
<span data-i18n="roll-dice-query">Roll Dice</span>
</button>
<button type="roll" name="roll_d66" value="&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolling-dice}}} {{roll_dice=[[0]]}} {{roll=d66 = [[1d6]]}} {{roll2=[[1d6]]}} {{roll_query_footer=[&amp;nbsp;](`&amp;#64;{@{character_name_safe}|dice_query_inline_roll})}}">d66</button>
</div>
</section>
<section class="armour">
<!-- ARMOUR -->
<span class="section-header armour-style" data-i18n="armour-u">ARMOUR</span>
<input type="text" class="left input-width-full" name="attr_armour" value="" title="@{armour}" />
<span></span>
<div class="armour-tier-grid" title="@{armour_tier}">
<label for="tier0"><input type="checkbox" id="tier0" name="attr_armour_tier" value="0" title="@{armour_tier}" checked /><span>-0</span></label>
<label for="tier1"><input type="checkbox" id="tier1" name="attr_armour_tier" value="2" title="@{armour_tier}" /><span>-d2</span></label>
<label for="tier2"><input type="checkbox" id="tier2" name="attr_armour_tier" value="4" title="@{armour_tier}" /><span>-d4</span></label>
<label for="tier3"><input type="checkbox" id="tier3" name="attr_armour_tier" value="6" title="@{armour_tier}" /><span>-d6</span></label>
<input type="hidden" name="attr_armour_swift_pen" value="0" />
<input type="hidden" name="attr_armour_def_pen" value="0" />
</div>
<span class="span-3 section-notes" data-i18n="armour-notes-tier2">Tier 2. +2 DR penalty on Swiftness tests. Defence is DR+2.</span>
<label for="armour_damaged" data-i18n-title="armour-damaged-note" title="When armour is damaged penalties to Vigor and Swiftness tests are not modified.">
<input type="checkbox" id="armour_damaged" name="attr_armour_damaged" value="1" title="@{armour_damaged}" />
<span class="damaged-style" data-i18n="damaged-u">DAMAGED</span>
</label>
<span class="span-all section-notes" data-i18n="armour-notes-tier3">Tier 3. +4 DR penalty on Swiftness tests. Defence is DR+2.</span>
</section>
<section class="equipment">
<!-- EQUIPMENT-->
<label class="ryo center">
<span class="kanji-text"></span>
<input type="text" class="input-width-small" name="attr_ryo" value="0" title="@{ryo}" />
<span data-i18n="ryo-u">RYO</span>
</label>
<span class="section-notes equipment-notes" data-i18n="carrying-capacity-notes">Vigor+8 normal size items or DR+2 on Swiftness/Vigor tests</span>
<span class="section-header right equipment-style" data-i18n="equipment-u">EQUIPMENT</span>
<!-- CONSUMABLES -->
<div class="consumables">
<label class="center">
<input type="text" class="input-width-small" name="attr_food" value="0" title="@{food}" />
<span class="section-header font-special-elite" data-i18n="food">food</span>
</label>
<label class="center">
<input type="text" class="input-width-small" name="attr_water" value="0" title="@{water}" />
<span class="section-header font-special-elite" data-i18n="water">water</span>
</label>
<div class="center">
<button type="roll" name="roll_hunger" title="%{hunger}" value="@{hunger}">
<span class="font-jolly-lodger" data-i18n="hunger">Hunger</span>
</button>
<button type="action" class="hidden" name="act_hunger-button"></button>
<input type="text" class="hidden" name="attr_hunger" value="" />
</div>
</div>
<div class="span-2">
<fieldset class="repeating_equipment">
<textarea class="input-width-full" name="attr_name" title="@{repeating_equipment_$X_name}"></textarea>
<select name="attr_weight" title="@{repeating_equipment_$X_weight}">
<option value="1" data-i18n-title="weight-normal-title" data-i18n="weight-normal" selected>Normal</option>
<option value="2" data-i18n-title="weight-heavy-title" data-i18n="weight-heavy">Heavy</option>
<option value="0" data-i18n-title="weight-not-applicable-abbrv-title" data-i18n="weight-not-applicable-abbrv">N/A</option>
</select>
</fieldset>
<span class="three-columns">
<label class="right span-2">
<span class="section-header" data-i18n="carrying-capacity">Carrying Capacity</span>
<input type="text" class="input-width-small" name="attr_carrying_capacity" value="0" title="@{carrying_capacity}" readonly/>
</label>
<span class="right">
<span class="section-header-inline" data-i18n="load">Load</span>
<input type="checkbox" class="hidden warning" name="attr_load_warning" value="1" />
<input type="text" class="input-width-small" name="attr_load" value="0" title="@{load}" readonly />
</span>
</span>
</div>
</section>
<section class="tenets">
<!-- TENETS -->
<span class="section-header tenets-style" data-i18n="tenets-u">TENETS</span>
<div class="tenets-grid">
<label class="span-all center">
<input type="text" name="attr_tenets_title" value="" title="@{tenets_title}" />
</label>
<input type="text" class="input-width-medium" name="attr_tenets_1" value="" title="@{tenets_1}" />
<input type="text" class="input-width-medium" name="attr_tenets_2" value="" title="@{tenets_2}" />
<input type="text" class="input-width-medium" name="attr_tenets_3" value="" title="@{tenets_3}" />
<input type="text" class="input-width-medium" name="attr_tenets_4" value="" title="@{tenets_4}" />
<input type="text" class="input-width-medium" name="attr_tenets_5" value="" title="@{tenets_5}" />
<input type="text" class="input-width-medium" name="attr_tenets_6" value="" title="@{tenets_6}" />
</div>
<div class="right">
<button type="roll" name="roll_haiku" title="%{haiku}" value="@{haiku}">
<span class="haiku-style" data-i18n="haiku-u">HAIKU</span>
</button>
<button type="action" class="hidden" name="act_haiku-button"></button>
<input type="text" class="hidden" name="attr_haiku" value="" />
<button type="roll" name="roll_improve" title="%{improve}" value="@{improve}">
<span class="chance-style" data-i18n="roll-improve">Chance to Improve</span>
</button>
<button type="action" class="hidden" name="act_improve-button"></button>
<input type="text" class="hidden" name="attr_improve" value="" />
</div>
</section>
<section class="hp-box">
<label for="ressurection" class="resurrection vertical-text">
<input type="checkbox" id="ressurection" name="attr_resurrection" value="1" title="@{resurrection}" />
<span class="section-header" data-i18n="resurrection-u">RESURRECTION</span>
</label>
<label for="meditation" class="meditation vertical-text">
<input type="checkbox" id="meditation" name="attr_meditation" value="1" title="@{meditation}" />
<span class="section-header" data-i18n="meditation-u">MEDITATION</span>
</label>
<!-- HIT POINTS -->
<span class="hpCurrMax">
<span class="section-header span-all width-full red-background nowrap">
<span class="hit-points-style">
<span class="kanji-text" style="font-size: 1.85rem;margin-top: -3px;"></span>
<span data-i18n="hit-points-mixed-case">HiT PoINts</span>
</span>
</span>
<span class="column-header center" data-i18n="current-u">CURRENT</span>
<span class="red-background">&nbsp;</span>
<span class="column-header center" data-i18n="maximum-u">MAXIMUM</span>
<span>
<input type="checkbox" class="hidden warning" name="attr_hp_warning" value="1" />
<input type="text" class="ability-input" name="attr_hp" value="1" title="@{hp}" />
</span>
<span class="red-background">&nbsp;</span>
<input type="text" class="ability-input" name="attr_hp_max" value="1" title="@{hp|max}" />
<!-- INFECTED -->
<div class="span-all nowrap red-background width-full">
<label for="infected" class="center">
<button type="roll" name="roll_infection" title="%{infection}" value="@{infection}">
<span class="infected-style" data-i18n-title="infection-poison" data-i18n="infected-u">INFECTED</span>
</button>
<input type="checkbox" id="infected" name="attr_infected" value="1" title="@{infected}" />
</label>
<button type="action" class="hidden" name="act_infection-button"></button>
<input type="text" class="hidden" name="attr_infection" value="" />
</div>
<!-- REST -->
<div class="span-all nowrap">
<span class="center">
<button type="roll" name="roll_rest" title="%{rest}" value="@{rest}">
<span data-i18n="rest">Short/Long REST</span>
</button>
<button type="action" class="hidden" name="act_rest-button"></button>
<input type="text" class="hidden" name="attr_rest" value="" />
</span>
</div>
<!-- BROKEN roll -->
<div class="span-all nowrap">
<input type="checkbox" class="hidden broken-pc" name="attr_broken_warning" value="1"/>
<span class="broken-pc center">
<button type="roll" name="roll_broken" title="%{broken}" value="@{broken}">
<span data-i18n="broken-u">BROKEN</span>
</button>
<button type="action" class="hidden" name="act_broken-button"></button>
<input type="text" class="hidden" name="attr_broken" value="" />
</span>
</div>
</span>
<span class="seppuku">
<label for="seppuku_status" class="span-all nowrap center">
<input type="checkbox" id="seppuku_status" name="attr_seppuku_status" value="1" title="@{seppuku_status}" />
<button type="roll" name="roll_seppuku" title="%{seppuku}" value="@{seppuku}">
<span class="infected-style" data-i18n="seppuku-u">SEPPUKU</span>
</button>
</label>
<button type="action" class="hidden" name="act_seppuku-button"></button>
<input type="text" class="hidden" name="attr_seppuku" value="" />
<div class="span-all center seppuku-box">
<!-- hide these after testing -->
<button type="roll" name="roll_seppuku2" title="%{seppuku2}" value="@{seppuku2}">
<span data-i18n="seppuku-u">SEPPUKU</span>2
</button>
<button type="action" class="hidden" name="act_seppuku2-button"></button>
<input type="text" class="hidden" name="attr_seppuku2" value="" />
<button type="roll" name="roll_seppukudamage" title="%{seppukudamage}" value="@{seppukudamage}">
<span data-i18n="damage">Damage</span>
</button>
<button type="action" class="hidden" name="act_seppukudamage-button"></button>
<input type="text" class="hidden" name="attr_seppukudamage" value="" />
<button type="roll" name="roll_seppukuhonour" title="%{seppukuhonour}" value="@{seppukuhonour}">
<span data-i18n="honour-u">HONOUR</span>
</button>
<button type="action" class="hidden" name="act_seppukuhonour-button"></button>
<input type="text" class="hidden" name="attr_seppukuhonour" value="" />
<button type="roll" name="roll_seppukuhonourhalf" title="%{seppukuhonourhalf}" value="@{seppukuhonourhalf}">
<span data-i18n="honour-u">HONOUR</span> ½
</button>
<button type="action" class="hidden" name="act_seppukuhonourhalf-button"></button>
<input type="text" class="hidden" name="attr_seppukuhonourhalf" value="" />
<button type="roll" name="roll_debilitating" title="%{debilitating}" value="@{debilitating}">
<span data-i18n="debilitating-injuries">Debilitating Injuries</span>
</button>
<button type="action" class="hidden" name="act_debilitating-button"></button>
<input type="text" class="hidden" name="attr_debilitating" value="" />
</div>
</span>
</section>
<section class="legal-gutter">
<span class="legal-margin" data-i18n="legal-text">Rōnin is an independent production by Slightly Reckless Games and is not affiliated with Ockult Örtmästare Games or Stockholm Kartell. It is published under the MÖRK BORG Third Party License. ©Slightly Reckless Games. All Rights Reserved.</span>
</section>
</div>
</section>
<section class="show-creature">
<div class="col1">
<div class="col1-a">
<section class="name">
<span class="section-header kanji-text class-column-one"></span>
<span class="section-header name-style span-2" data-i18n="creature-yokai-u">CREATURE/YOKAI</span>
<input class="span-2" type="text" name="attr_character_name" title="@{character_name}" value="" />
</section>
<section class="description">
<span class="section-header" data-i18n="description-abilities">Description/Abilities</span>
<textarea name="attr_description" title="@{description}"></textarea>
</section>
<section class="features">
<span class="section-header" data-i18n="special">Special</span>
<textarea name="attr_features" title="@{features}"></textarea>
</section>
</div>
</div>
<div class="col2">
<section class="weapons">
<!-- WEAPONS -->
<div class="weapons-grid">
<span class="section-header weapon-style" data-i18n="weapons-u">WEAPONS</span>
<span class="column-header" data-i18n="damage-abbrv">DMG</span>
<span class="column-header" data-i18n="weapon-type">Type</span>
<span class="column-header" data-i18n="weapon-broken">Broken</span>
<span class="column-header" data-i18n="weapon-action">Action</span>
<input type="checkbox" class="hidden show-duel" id="duel" name="attr_duel" value="1">
<fieldset class="repeating_weapons">
<div class="weapons-grid-row">
<input type="hidden" name="attr_crit_multiplier" value="1" />
<input type="text" class="input-width-full" name="attr_name" value="" title="@{repeating_weapons_$X_name}" />
<input type="text" class="input-width-full center" name="attr_damage" value="d2" data-i18n-title="valid-input-damage" title="@{repeating_weapons_$X_damage} | example; 'd4', '1d8', '2d6+3', etc." />
<select name="attr_type" title="@{repeating_weapons_$X_type}">
<option value="@{vigor}" data-i18n="striking" selected>Striking</option>
<option value="@{spirit}" data-i18n="ranged">Ranged</option>
</select>
<input type="hidden" name="attr_type_label" value="" />
<input type="hidden" name="attr_type_label_ability" value="" />
<input type="hidden" name="attr_type_mod" value="0" />
<input type="checkbox" class="lost-broken" name="attr_broken_weapon" value="1" data-i18n-title="lost-broken" />
<label class="lost-broken">
<span data-i18n="lost-broken">Lost/Broken</span>
<input type="checkbox" class="lost-broken hidden" name="attr_broken_weapon" value="1" />
</label>
<!-- normal -->
<span class="weapon-actions center">
<button type="roll" name="roll_monsterdamage" title="%{repeating_weapons_$X_monsterdamage}" value="@{monsterdamage}">
<span data-i18n="roll-damage">Roll Damage</span>
</button>
<button type="action" class="hidden" name="act_monsterdamage-button"></button>
<input type="text" class="hidden" name="attr_monsterdamage" value="" />
</span>
</div>
<input type="checkbox" class="weapon-type hidden" name="attr_show_ranged" value="1" />
<div class="weapons-grid-row show-ranged">
<span class="span-4 right">
<span class="nowrap">
<input type="text" class="input-width-smallest" name="attr_ammo" value="1" title="@{repeating_weapons_$X_ammo}" />
<span style="color: initial;">/</span>
<input type="text" class="input-width-smallest" name="attr_ammo_max" value="1" title="@{repeating_weapons_$X_ammo|max}" />
</span>
<label class="nowrap" data-i18n-title="track-ammo-monster-title">
<input type="checkbox" name="attr_track_ammo" value="1" title="@{repeating_weapons_$X_track_ammo}" />
<span class="column-header" data-i18n="track-ammo-u">TRACK</span>
</label>
</span>
</div>
</fieldset>
</div>
</section>
<section class="battle">
<!-- DEFENCE and PC DAMAGE-->
<div class="flex-inline-row">
<button type="roll" name="roll_defence" title="%{defence}" value="@{defence}">
<span class="defence-style" data-i18n="defence-u">DEFENCE</span>
</button>
<button type="action" class="hidden" name="act_defence-button"></button>
<input type="text" class="hidden" name="attr_defence" value="" />
</div>
<div class="flex-inline-row">
<button type="roll" name="roll_takedamage" title="%{takedamage}" data-i18n-title="take-damage-title" value="@{takedamage}">
<span data-i18n="damage">Damage</span>
</button>
<button type="action" class="hidden" name="act_takedamage-button"></button>
<input type="text" class="hidden" name="attr_takedamage" value="" />
<button type="roll" name="roll_takedamagenoarmour" title="%{takedamagenoarmour}" data-i18n-title="take-damage-without-armour-title" value="@{takedamagenoarmour}">
<span data-i18n="damage-without-armour">Damage(Armour N/A)</span>
</button>
<button type="action" class="hidden" name="act_takedamagenoarmour-button"></button>
<input type="text" class="hidden" name="attr_takedamagenoarmour" value="" />
</div>
<div class="flex-inline-row">
<button type="roll" name="roll_morale" title="%{morale}" value="@{morale}">
<span data-i18n="morale">Morale</span>
</button>
<button type="action" class="hidden" name="act_morale-button"></button>
<input type="text" class="hidden" name="attr_morale" value="" />
<button type="roll" name="roll_reaction" title="%{reaction}" value="@{reaction}">
<span data-i18n="reaction">Reaction</span>
</button>
<button type="action" class="hidden" name="act_reaction-button"></button>
<input type="text" class="hidden" name="attr_reaction" value="" />
</div>
<div class="flex-inline-row">
<button type="roll" name="roll_dr_test" data-i18n-title="dr-test-roll" value="@{dr_test}">
<span class="defence-style" data-i18n="dr-test">DR Test</span>
</button>
<button type="action" class="hidden" name="act_dr_test-button"></button>
<input type="text" class="hidden" name="attr_dr_test" value="" />
<button type="roll" name="roll_dice" value="&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolling-dice}}} {{roll_dice=[[0]]}} {{roll=@{dice_query2} = [[@{dice_query2}]]}} {{roll_query_footer=[&amp;nbsp;](`&amp;#64;{@{character_name_safe}|dice_query_inline_roll})}}">
<span data-i18n="roll-dice-query">Roll Dice</span>
</button>
<button type="roll" name="roll_d66" value="&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolling-dice}}} {{roll_dice=[[0]]}} {{roll=d66 = [[1d6]]}} {{roll2=[[1d6]]}} {{roll_query_footer=[&amp;nbsp;](`&amp;#64;{@{character_name_safe}|dice_query_inline_roll})}}">d66</button>
</div>
</section>
<section class="armour">
<!-- ARMOUR -->
<span class="section-header armour-style" data-i18n="armour-u">ARMOUR</span>
<input type="text" class="left input-width-full" name="attr_armour" value="" title="@{armour}" />
<span></span>
<div class="armour-tier-grid" title="@{armour_tier}">
<label for="tier0"><input type="checkbox" id="tier0" name="attr_armour_tier" value="0" title="@{armour_tier}" checked /><span>-0</span></label>
<label for="tier1"><input type="checkbox" id="tier1" name="attr_armour_tier" value="2" title="@{armour_tier}" /><span>-d2</span></label>
<label for="tier2"><input type="checkbox" id="tier2" name="attr_armour_tier" value="4" title="@{armour_tier}" /><span>-d4</span></label>
<label for="tier3"><input type="checkbox" id="tier3" name="attr_armour_tier" value="6" title="@{armour_tier}" /><span>-d6</span></label>
<label for="tier4"><input type="checkbox" id="tier4" name="attr_armour_tier" value="8" title="@{armour_tier}" /><span>-d8</span></label>
<input type="hidden" name="attr_armour_swift_pen" value="0" />
<input type="hidden" name="attr_armour_def_pen" value="0" />
</div>
<span></span>
<label for="armour_damaged" data-i18n-title="armour-damaged-note" title="When armour is damaged penalties to Vigor and Swiftness tests are not modified.">
<input type="checkbox" id="armour_damaged" name="attr_armour_damaged" value="1" title="@{armour_damaged}" />
<span class="damaged-style" data-i18n="damaged-u">DAMAGED</span>
</label>
</section>
<section class="hp-box">
<!-- HIT POINTS -->
<span class="hpCurrMax">
<span class="section-header span-all width-full red-background nowrap">
<span class="hit-points-style">
<span class="kanji-text" style="font-size: 1.85rem;margin-top: -3px;"></span>
<span data-i18n="hit-points-mixed-case">HiT PoINts</span>
</span>
</span>
<span class="column-header center" data-i18n="current-u">CURRENT</span>
<span class="red-background">&nbsp;</span>
<span class="column-header center" data-i18n="maximum-u">MAXIMUM</span>
<span>
<input type="checkbox" class="hidden warning" name="attr_hp_warning" value="1" />
<input type="text" class="ability-input" name="attr_hp" value="1" title="@{hp}" />
</span>
<span class="red-background">&nbsp;</span>
<input type="text" class="ability-input" name="attr_hp_max" value="1" title="@{hp|max}" />
</span>
</section>
</div>
</section>
</div>
<rolltemplate class="sheet-rolltemplate-ronin">
<div class="sheet-heading-row">
{{#name}}<span class="sheet-span-all sheet-heading">{{name}}</span>{{/name}}
{{#heading}}<span class="sheet-span-all sheet-heading">{{heading}}</span>{{/heading}}
{{#subheading}}
<span class="sheet-span-all sheet-subheading">
{{subheading}}
<!-- ammo -->
{{#rollTotal() attack_track_ammo 1}}<br>{{computed::attack_ammo}}{{/rollTotal() attack_track_ammo 1}}
<!-- armour worn-->
{{#rollGreater() computed::armour_pen 0}}<span> &#11046; {{armour_worn}}</span>{{/rollGreater() computed::armour_pen 0}}
<!-- short/long rest, infection/poison labels -->
{{#rollTotal() computed::short_rest 4}}<span data-i18n="short-rest">Short Rest</span>{{/rollTotal() computed::short_rest 4}}
{{#rollTotal() computed::long_rest 6}}<span data-i18n="long-rest">Long Rest</span>{{/rollTotal() computed::long_rest 6}}
{{#rollTotal() computed::hungry 4}}<span data-i18n="hunger-thirst">Hunger/Thirst</span>{{/rollTotal() computed::hungry 4}}
{{#rollTotal() computed::infection 6}}<span data-i18n="infection-poison">Infection/Poison</span>{{/rollTotal() computed::infection 6}}
</span>
{{/subheading}}
<!-- dueling label -->
{{#rollTotal() dueling 1}}<span class="sheet-span-all sheet-subheading sheet-duel-label" data-i18n="duel-u">DUEL</span>{{/rollTotal() dueling 1}}
</div>
<div class="sheet-template-body">
<!-- generic -->
{{#roll_default}}
{{#roll}}
<div class="sheet-row">
<span class="sheet-span-all">
{{roll}}
{{#dr_final}}<span data-i18n="versus-difficulty-rating">vs DR</span>{{computed::dr_final}}{{/dr_final}}
<!-- Swiftness rolls show DR+armour -->
{{#rollGreater() computed::armour_pen 0}}
<span class="sheet-roll-detail" data-i18n-title="dr-armour-penalty" title="DR + armour">[{{computed::dr_base}}+{{computed::armour_pen}}]</span>
{{/rollGreater() computed::armour_pen 0}}
</span>
</div>
<!-- SUCCESS -->
<div class="sheet-row">
<span class="sheet-span-all">
{{#rollTotal() computed::success 1}}
<!-- crit -->
{{#rollTotal() computed::crit 1}}
{{#crit}}<span class="sheet-crit-roll" data-i18n="test-critical-success">Critical!{{computed::crit}}</span>{{/crit}}
{{/rollTotal() computed::crit 1}}
<!-- non-crit -->
{{#^rollTotal() computed::crit 1}}
<!-- show for Success, set crit=[[0]] -->
{{#success}}<span class="sheet-success-roll" data-i18n="test-successful">Success{{computed::success}}</span>{{/success}}
{{/^rollTotal() computed::crit 1}}
{{/rollTotal() computed::success 1}}
</span>
</div>
<!-- FAIL -->
<div class="sheet-row">
<span class="sheet-span-all">
{{#^rollTotal() computed::success 1}}
<!-- fumble -->
{{#rollTotal() computed::fumble 1}}
{{#fumble}}<span class="sheet-fumble-roll" data-i18n="test-critical-failure">Fumble!{{computed::fumble}}</span>{{/fumble}}
{{#texts_kamis_note}}{{texts_kamis_note}}{{/texts_kamis_note}}
{{/rollTotal() computed::fumble 1}}
<!-- non-fumble -->
{{#^rollTotal() computed::fumble 1}}
<!-- show for Fail, set fumble=[[0]] -->
{{#success}}<span class="sheet-failed-roll" data-i18n="test-failed">Fail{{computed::success}}</span>{{/success}}
{{/^rollTotal() computed::fumble 1}}
{{/^rollTotal() computed::success 1}}
</span>
</div>
{{/roll}}
{{/roll_default}}
<!-- initiative -->
{{#roll_initiative}}
{{#roll}}
<div class="sheet-row">
<span class="sheet-span-all">
{{roll}}
</span>
</div>
<!-- SUCCESS -->
<div class="sheet-row">
<span class="sheet-span-all">
{{#rollGreater() roll 3}}
<!-- show for Success, set crit=[[0]] -->
<span class="sheet-success-roll" data-i18n="test-successful">Success</span>
<span data-i18n="pc-goes">PCs go first.</span>
{{/rollGreater() roll 3}}
</span>
</div>
<!-- FAIL -->
<div class="sheet-row">
<span class="sheet-span-all">
{{#^rollGreater() roll 3}}
<!-- show for Fail, set fumble=[[0]] -->
<span class="sheet-failed-roll" data-i18n="test-failed">Fail</span>
<span data-i18n="enemy-goes">Enemies go first.</span>
{{/^rollGreater() roll 3}}
</span>
</div>
{{/roll}}
{{/roll_initiative}}
<!-- attack -->
{{#roll_attack}}
{{#roll}}
<div class="sheet-row">
<span class="sheet-span-all">
<span class="sheet-d20-roll">{{roll}}</span>
{{#dr_final}}
<span data-i18n="versus-difficulty-rating">vs DR</span>{{computed::dr_final}}
<!-- Defence and Swiftness rolls show DR+armour -->
{{#rollGreater() computed::armour_pen 0}}
<span class="sheet-roll-detail" data-i18n-title="dr-armour-penalty" title="DR + armour">[{{computed::dr_base}}+{{computed::armour_pen}}]</span>
{{/rollGreater() computed::armour_pen 0}}
{{/dr_final}}
</span>
</div>
<!-- SUCCESS -->
<div class="sheet-row">
<span class="sheet-span-all">
{{#rollTotal() computed::success 1}}
<!-- crit -->
{{#rollTotal() computed::crit 1}}
{{#crit}}<span class="sheet-crit-roll" data-i18n="test-critical-hit">Critical Hit!{{computed::crit}}</span>{{/crit}}
{{#attack_crit_note}}
{{#damage}}<span data-i18n="damage-doubled">Double Damage</span>&nbsp;=&nbsp;{{computed::damage}}{{/damage}}
<span class="sheet-description sheet-center" data-i18n="crit-attack-note">Enemy takes x2 Damage, Armour reduced 1 tier after damage.</span>
{{/attack_crit_note}}
{{/rollTotal() computed::crit 1}}
<!-- non-crit -->
{{#^rollTotal() computed::crit 1}}
<!-- show for Success, set crit=[[0]] -->
{{#success}}<span class="sheet-success-roll" data-i18n="test-successful">Success{{computed::success}}</span>{{/success}}
{{#attack_success_note}}
{{#damage}}<span data-i18n="damage">Damage</span>&nbsp;=&nbsp;{{computed::damage}}{{/damage}}
{{/attack_success_note}}
{{/^rollTotal() computed::crit 1}}
{{/rollTotal() computed::success 1}}
</span>
</div>
<!-- FAIL -->
<div class="sheet-row">
<span class="sheet-span-all">
<!-- fumble -->
{{#^rollTotal() computed::success 1}}
{{#rollTotal() computed::fumble 1}}
{{#fumble}}<span class="sheet-fumble-roll" data-i18n="test-critical-failure">Fumble!{{computed::fumble}}</span>{{/fumble}}
{{#attack_fumble_note}}<span class="sheet-block sheet-span-all" data-i18n="fumble-attack-note">Weapon is lost or broken</span>{{/attack_fumble_note}}
{{/rollTotal() computed::fumble 1}}
<!-- non-fumble -->
{{#^rollTotal() computed::fumble 1}}
<!-- show for Fail, set fumble=[[0]] -->
{{#success}}<span class="sheet-failed-roll" data-i18n="test-failed">Fail{{computed::success}}</span>{{/success}}
{{#attack_fail_note}}
<!-- {{#damagePC}}{{damagePC}}{{/damagePC}} -->
<!-- dueling -->
{{#rollTotal() dueling 1}}<span class="sheet-description sheet-center" data-i18n="fail-duel-attack-note">Enemy rolls damage.</span>{{/rollTotal() dueling 1}}
{{/attack_fail_note}}
{{/^rollTotal() computed::fumble 1}}
{{/^rollTotal() computed::success 1}}
</span>
</div>
{{/roll}}
{{/roll_attack}}
<!-- parry -->
{{#roll_parry}}
{{#roll}}
<div class="sheet-row">
<span class="sheet-span-all">
<span class="sheet-d20-roll">{{roll}}</span>
{{#dr_final}}
<span data-i18n="versus-difficulty-rating">vs DR</span>{{computed::dr_final}}
{{/dr_final}}
</span>
</div>
<!-- SUCCESS -->
<div class="sheet-row">
<span class="sheet-span-all">
{{#rollTotal() computed::success 1}}
<!-- crit -->
{{#rollTotal() computed::crit 1}}
{{#crit}}<span class="sheet-crit-roll" data-i18n="test-critical-hit">Critical Hit!{{computed::crit}}</span>{{/crit}}
{{#parry_crit_note}}
{{#damage}}<span data-i18n="damage-doubled">Double Damage</span>&nbsp;=&nbsp;{{computed::damage}}{{/damage}}
<span class="sheet-description sheet-center" data-i18n="crit-attack-note">Enemy takes x2 Damage, Armour reduced 1 tier after damage.</span>
{{/parry_crit_note}}
{{/rollTotal() computed::crit 1}}
<!-- non-crit -->
{{#^rollTotal() computed::crit 1}}
<!-- show for Success, set crit=[[0]] -->
{{#success}}<span class="sheet-success-roll" data-i18n="test-successful">Success{{computed::success}}</span>{{/success}}
{{/^rollTotal() computed::crit 1}}
{{/rollTotal() computed::success 1}}
</span>
</div>
<!-- FAIL -->
<div class="sheet-row">
<span class="sheet-span-all">
<!-- fumble -->
{{#^rollTotal() computed::success 1}}
{{#rollTotal() computed::fumble 1}}
{{#fumble}}<span class="sheet-fumble-roll" data-i18n="test-critical-failure">Fumble!{{computed::fumble}}</span>{{/fumble}}
{{#parry_fumble_note}}
{{#damagePC}}{{damagePC}} x2{{/damagePC}}
<span class="sheet-block sheet-span-all" data-i18n="fumble-parry-note">PC takes x2 Damage, Armour reduced 1 tier after damage, and weapon breaks.</span>
{{/parry_fumble_note}}
{{/rollTotal() computed::fumble 1}}
<!-- non-fumble -->
{{#^rollTotal() computed::fumble 1}}
<!-- show for Fail, set fumble=[[0]] -->
{{#success}}<span class="sheet-failed-roll" data-i18n="test-failed">Fail{{computed::success}}</span>{{/success}}
{{#parry_fail_note}}{{#damagePC}}{{damagePC}}{{/damagePC}}{{/parry_fail_note}}
{{/^rollTotal() computed::fumble 1}}
{{/^rollTotal() computed::success 1}}
</span>
</div>
{{/roll}}
{{/roll_parry}}
<!-- guard -->
{{#roll_guard}}
{{#roll}}
<div class="sheet-row">
<span class="sheet-span-all">
<span class="sheet-d20-roll">{{roll}}</span>
{{#dr_final}}
<span data-i18n="versus-difficulty-rating">vs DR</span>{{computed::dr_final}}
{{/dr_final}}
</span>
</div>
<!-- SUCCESS -->
<div class="sheet-row">
<span class="sheet-span-all">
{{#rollTotal() computed::success 1}}
<!-- crit -->
{{#rollTotal() computed::crit 1}}
{{#crit}}<span class="sheet-crit-roll" data-i18n="test-critical-hit">Critical Hit!{{computed::crit}}</span>{{/crit}}
{{#guard_crit_note}}
{{#damage}}<span data-i18n="damage-doubled">Double Damage</span>&nbsp;=&nbsp;{{computed::damage}}{{/damage}}
<span class="sheet-description sheet-center" data-i18n="crit-attack-note">Enemy takes x2 Damage, Armour reduced 1 tier after damage.</span>
{{/guard_crit_note}}
{{/rollTotal() computed::crit 1}}
<!-- non-crit -->
{{#^rollTotal() computed::crit 1}}
<!-- show for Success, set crit=[[0]] -->
{{#success}}<span class="sheet-success-roll" data-i18n="test-successful">Success{{computed::success}}</span>{{/success}}
{{#guard_success_note}}
<span class="sheet-description sheet-center" data-i18n="success-guard-note">Take no damage and gain +4 to next Attack or Riposte.</span>
{{/guard_success_note}}
{{/^rollTotal() computed::crit 1}}
{{/rollTotal() computed::success 1}}
</span>
</div>
<!-- FAIL -->
<div class="sheet-row">
<span class="sheet-span-all">
<!-- fumble -->
{{#^rollTotal() computed::success 1}}
{{#rollTotal() computed::fumble 1}}
{{#fumble}}<span class="sheet-fumble-roll" data-i18n="test-critical-failure">Fumble!{{computed::fumble}}</span>{{/fumble}}
{{#guard_fumble_note}}
{{#damagePC}}{{damagePC}} x2{{/damagePC}}
<span class="sheet-block sheet-span-all" data-i18n="fumble-parry-note">PC takes x2 Damage, Armour reduced 1 tier after damage, and weapon breaks.</span>
{{/guard_fumble_note}}
{{/rollTotal() computed::fumble 1}}
<!-- non-fumble -->
{{#^rollTotal() computed::fumble 1}}
<!-- show for Fail, set fumble=[[0]] -->
{{#success}}<span class="sheet-failed-roll" data-i18n="test-failed">Fail{{computed::success}}</span>{{/success}}
{{#guard_fail_note}}
{{#damagePChalf}}{{damagePChalf}}{{/damagePChalf}}
<span class="sheet-description sheet-center" data-i18n="fail-guard-note">Take half damage.</span>
{{/guard_fail_note}}
{{/^rollTotal() computed::fumble 1}}
{{/^rollTotal() computed::success 1}}
</span>
</div>
{{/roll}}
{{/roll_guard}}
<!-- riposte -->
{{#roll_riposte}}
{{#roll}}
<div class="sheet-row">
<span class="sheet-span-all">
<span class="sheet-d20-roll">{{roll}}</span>
{{#dr_final}}
<span data-i18n="versus-difficulty-rating">vs DR</span>{{computed::dr_final}}
{{/dr_final}}
</span>
</div>
<!-- SUCCESS -->
<div class="sheet-row">
<span class="sheet-span-all">
{{#rollTotal() computed::success 1}}
<!-- crit -->
{{#rollTotal() computed::crit 1}}
{{#crit}}<span class="sheet-crit-roll" data-i18n="test-critical-hit">Critical Hit!{{computed::crit}}</span>{{/crit}}
{{#riposte_crit_note}}<span class="sheet-description sheet-center" data-i18n="crit-defence-note">PC gains a free attack.</span>{{/riposte_crit_note}}
{{/rollTotal() computed::crit 1}}
<!-- non-crit -->
{{#^rollTotal() computed::crit 1}}
<!-- show for Success, set crit=[[0]] -->
{{#success}}<span class="sheet-success-roll" data-i18n="test-successful">Success{{computed::success}}</span>{{/success}}
{{#riposte_success_note}}
{{#damage}}<span data-i18n="damage-doubled">Double Damage</span>&nbsp;=&nbsp;{{computed::damage}}{{/damage}}
<span class="sheet-description sheet-center" data-i18n="success-riposte-note">Deal double damage</span>
{{/riposte_success_note}}
{{/^rollTotal() computed::crit 1}}
{{/rollTotal() computed::success 1}}
</span>
</div>
<!-- FAIL -->
<div class="sheet-row">
<span class="sheet-span-all">
<!-- fumble -->
{{#^rollTotal() computed::success 1}}
{{#rollTotal() computed::fumble 1}}
{{#fumble}}<span class="sheet-fumble-roll" data-i18n="test-critical-failure">Fumble!{{computed::fumble}}</span>{{/fumble}}
{{#riposte_fumble_note}}
{{#damagePC}}{{damagePC}} x2{{/damagePC}}
<span class="sheet-block sheet-span-all" data-i18n="fumble-defence-note">PC takes x2 Damage, Armour reduced 1 tier after damage.</span>
{{/riposte_fumble_note}}
{{/rollTotal() computed::fumble 1}}
<!-- non-fumble -->
{{#^rollTotal() computed::fumble 1}}
<!-- show for Fail, set fumble=[[0]] -->
{{#success}}<span class="sheet-failed-roll" data-i18n="test-failed">Fail{{computed::success}}</span>{{/success}}
{{#riposte_fail_note}}
<span class="sheet-description sheet-center" data-i18n="fail-riposte-note">You are dealt a fatal blow.</span>
{{/riposte_fail_note}}
{{/^rollTotal() computed::fumble 1}}
{{/^rollTotal() computed::success 1}}
</span>
</div>
{{/roll}}
{{/roll_riposte}}
<!-- damage -->
{{#roll_damage}}
<div class="sheet-row">
<span class="sheet-span-all">
<span data-i18n="damage-roll">Damage Roll =</span> {{roll}}
</span>
{{#rollGreater() armour_reduction 0}}
<span class="sheet-span-all">
<strong>-</strong>{{armour_worn}} <span data-i18n="armour">Armour</span> =<strong> - </strong>{{computed::armour_reduction}}
</span>
{{/rollGreater() armour_reduction 0}}
{{#^rollGreater() armour_reduction 0}}
<span class="sheet-span-all">
<span data-i18n="armour">Armour</span> =<strong> 0 or N/A </strong>
</span>
{{/^rollGreater() armour_reduction 0}}
<span class="sheet-span-all">
<strong><span data-i18n="hit-point-damage">HP Damage =</span> {{computed::damage_total}}</strong>
</span>
</div>
{{/roll_damage}}
<!-- defence -->
{{#roll_defence}}
{{#roll}}
<div class="sheet-row">
<span class="sheet-span-all">
<span class="sheet-d20-roll">{{roll}}</span>
{{#dr_final}}
<span data-i18n="versus-difficulty-rating">vs DR</span>{{computed::dr_final}}
<!-- Defence rolls show DR+armour -->
{{#rollGreater() computed::armour_pen 0}}
<span class="sheet-roll-detail" data-i18n-title="dr-armour-penalty" title="DR + armour">[{{computed::dr_base}}+{{computed::armour_pen}}]</span>
{{/rollGreater() computed::armour_pen 0}}
{{/dr_final}}
</span>
</div>
<!-- SUCCESS -->
<div class="sheet-row">
<span class="sheet-span-all">
{{#rollTotal() computed::success 1}}
<!-- crit -->
{{#rollTotal() computed::crit 1}}
{{#crit}}<span class="sheet-crit-roll" data-i18n="test-critical-success">Critical!{{computed::crit}}</span>{{/crit}}
</span>
<span class="sheet-span-all sheet-description sheet-center">
{{#defence_crit_note}}<span data-i18n="crit-defence-note">PC gains a free attack</span>{{/defence_crit_note}}
</span>
{{/rollTotal() computed::crit 1}}
<!-- non-crit -->
{{#^rollTotal() computed::crit 1}}
{{#success}}<span class="sheet-success-roll" data-i18n="test-successful">Success{{computed::success}}</span>{{/success}}
</span>
<span class="sheet-span-all sheet-description sheet-center">
{{#defence_success_note}}<span data-i18n="success-defence-note">No Damage</span>{{/defence_success_note}}
</span>
{{/^rollTotal() computed::crit 1}}
{{/rollTotal() computed::success 1}}
</span>
</div>
<!-- FAIL -->
<div class="sheet-row">
<span class="sheet-span-all">
<!-- fumble -->
{{#^rollTotal() computed::success 1}}
{{#rollTotal() computed::fumble 1}}
{{#fumble}}<span class="sheet-fumble-roll" data-i18n="test-critical-failure">Fumble!{{computed::fumble}}</span>{{/fumble}}
</span>
{{#defence_fumble_note}}
<span class="sheet-block sheet-span-all">{{#damagePC}}{{damagePC}} x2{{/damagePC}}</span>
<span class="sheet-span-all sheet-description sheet-center">
<span data-i18n="fumble-defence-note">PC takes x2 Damage, Armour reduced 1 tier after damage.</span>
</span>
{{/defence_fumble_note}}
{{/rollTotal() computed::fumble 1}}
<!-- non-fumble -->
{{#^rollTotal() computed::fumble 1}}
{{#success}}<span class="sheet-failed-roll" data-i18n="test-failed">Fail{{computed::success}}</span>{{/success}}
</span>
{{#defence_fumble_note}}
{{#damagePC}}{{damagePC}}{{/damagePC}}
{{/defence_fumble_note}}
{{/^rollTotal() computed::fumble 1}}
{{/^rollTotal() computed::success 1}}
</span>
</div>
{{/roll}}
{{/roll_defence}}
<!-- seppuku -->
{{#roll_seppuku}}
{{#roll}}
<div class="sheet-row">
<span class="sheet-span-all">
<span class="sheet-d20-roll">{{roll}}</span>
{{roll2}}
{{#dr_final}}
<span data-i18n="versus-difficulty-rating">vs DR</span>{{computed::dr_final}}
{{/dr_final}}
</span>
</div>
<!-- SUCCESS -->
{{#rollTotal() computed::success 1}}
<div class="sheet-row">
<span class="sheet-span-all">
{{#success}}<span class="sheet-success-roll" data-i18n="test-successful">Success{{computed::success}}</span>{{/success}}
</span>
</div>
{{#seppuku_success_note}}
<div class="sheet-row">
<span class="sheet-span-all sheet-description">
<span data-i18n="success-seppuku-note">If successful, the character ritually prepares themselves and their surroundings, meditating on the reasons for their act and writing a death Haiku.</span>
</span>
</div>
<div class="sheet-row">{{#menu1}}<span class="sheet-span-all">{{menu1}}</span>{{/menu1}}</div>
{{/seppuku_success_note}}
{{#seppuku2_success_note}}
<div class="sheet-row">
<span class="sheet-span-all sheet-description">
<span data-i18n="success-seppuku2-note">If successful, the character then disembowels themselves and dies.</span>
</span>
</div>
<div class="sheet-row">{{#menu2}}<span class="sheet-span-all">{{menu2}}</span>{{/menu2}}</div>
{{/seppuku2_success_note}}
{{/rollTotal() computed::success 1}}
<!-- FAIL -->
{{#^rollTotal() computed::success 1}}
<div class="sheet-row">
<span class="sheet-span-all">
{{#success}}<span class="sheet-failed-roll" data-i18n="test-failed">Fail{{computed::success}}</span>{{/success}}
</span>
</div>
<div class="sheet-row">
<span class="sheet-span-all sheet-description">
{{#seppuku_fail_note}}<span data-i18n="fail-seppuku-note">If the character fails the Spirit Test they cannot begin the ritual.</span>{{/seppuku_fail_note}}
{{#seppuku2_fail_note}}<span data-i18n="fail-seppuku2-note">If the character fails the Resilience Test, a 'second' can behead the character to complete the ritual. 1/2 the Honour Roll result. If there is no second, they suffer d8 damage and roll on the Debilitating Injuries table.</span>
</span>
</div>
<div class="sheet-row">{{#menu1}}<span class="sheet-span-all">{{menu1}}</span>{{/menu1}}</div>
{{/seppuku2_fail_note}}
{{/^rollTotal() computed::success 1}}
{{/roll}}
<!-- seppuku honour -->
{{#roll2}}
<div class="sheet-row">
<span class="sheet-span-all">{{roll2}}</span>
</div>
{{#rollTotal() resurrected 0}}
<!-- fight in Yomi -->
<div class="sheet-row">
<span class="sheet-span-all sheet-description sheet-center">
<span data-i18n="honour-note"></span>
</span>
</div>
{{/rollTotal() resurrected 0}}
{{#rollTotal() resurrected 1}}
<!-- DEAD -->
<div class="sheet-row">
<span class="sheet-span-all sheet-description sheet-center">
<span data-i18n="honour-note2"></span>
</span>
</div>
<div class="sheet-row">
<span class="sheet-span-all sheet-description sheet-center">
<span class="sheet-fumble-roll" data-i18n="broken-outcome4">Dead</span><br>
<span data-i18n="death-note">A character can only be resurrected once.</span><br>
{{#rollGreater() roll3 9}}
<span data-i18n="death-with-honour">You have died Honourably.</span> {{roll3}}
{{/rollGreater() roll3 9}}
{{#^rollGreater() roll3 9}}
<span data-i18n="death-without-honour">You have died Dishonourably.</span> {{roll3}}
{{/^rollGreater() roll3 9}}
</span>
</div>
{{/rollTotal() resurrected 1}}
{{/roll2}}
{{/roll_seppuku}}
<!-- haiku -->
{{#roll_haiku}}
{{#roll}}
<div class="sheet-row">
<span class="sheet-span-all">
<span class="sheet-d20-roll">{{roll}}</span>
{{#dr_final}}
<span data-i18n="versus-difficulty-rating">vs DR</span>{{computed::dr_final}}
{{/dr_final}}
</span>
</div>
<!-- SUCCESS -->
{{#rollTotal() computed::success 1}}
<div class="sheet-row">
<span class="sheet-span-all">
{{#success}}<span class="sheet-success-roll" data-i18n="test-successful">Success{{computed::success}}</span>{{/success}}
</span>
{{#haiku_success_note}}
<span class="sheet-span-all sheet-description sheet-center">
<span data-i18n="success-haiku-note">Regain 1 Virtue. Hidden meaning?</span>
</span>
<span class="sheet-span-all">
<span class="sheet-roll-query" data-i18n-title="roll-query">{{roll_query}}</span>
</span>
{{/haiku_success_note}}
</div>
{{/rollTotal() computed::success 1}}
<!-- FAIL -->
{{#^rollTotal() computed::success 1}}
<div class="sheet-row">
<span class="sheet-span-all">
{{#success}}<span class="sheet-failed-roll" data-i18n="test-failed">Fail{{computed::success}}</span>{{/success}}
</span>
<span class="sheet-span-all sheet-description">
{{#haiku_fail_note}}<span data-i18n="fail-haiku-note">Suffer a -1 penalty to all Spirit rolls until the end of the day.</span>{{/haiku_fail_note}}
</span>
</div>
{{/^rollTotal() computed::success 1}}
{{/roll}}
{{/roll_haiku}}
<!-- texts -->
{{#roll_texts}}
<div class="sheet-row">
<span class="sheet-span-all">
<span class="sheet-d20-roll">{{roll}}</span>
{{#dr_final}}
<span data-i18n="versus-difficulty-rating">vs DR</span>{{computed::dr_final}}
{{/dr_final}}
</span>
</div>
<!-- SUCCESS -->
{{#rollTotal() computed::success 1}}
<div class="sheet-row">
<span class="sheet-span-all">
{{#success}}<span class="sheet-success-roll" data-i18n="test-successful">Success{{computed::success}}</span>{{/success}}
</span>
</div>
{{/rollTotal() computed::success 1}}
<!-- FAIL -->
{{#^rollTotal() computed::success 1}}
<!-- fumble -->
{{#rollTotal() computed::fumble 1}}
<div class="sheet-row">
<span class="sheet-span-all">
{{#fumble}}<span class="sheet-fumble-roll" data-i18n="test-critical-failure">Fumble!{{computed::fumble}}</span>{{/fumble}}
</span>
<span class="sheet-span-all">
{{#texts_kamis_note}}{{texts_kamis_note}}{{/texts_kamis_note}}
</span>
</div>
<div class="sheet-row">
<span class="sheet-span-all sheet-description">
{{#texts_hp_note}}
<strong>-</strong>&nbsp;
<span>{{computed::texts_hp_note}}</span>&nbsp;
<span data-i18n="hit-points-abbrv">HP</span>&nbsp;
<span data-i18n="texts-notes-fail">and no Texts for 1 hour</span>
{{/texts_hp_note}}
</span>
</div>
{{/rollTotal() computed::fumble 1}}
<!-- non-fumble -->
{{#^rollTotal() computed::fumble 1}}
<div class="sheet-row">
<span class="sheet-span-all">
<!-- show for Fail, set fumble=[[0]] -->
{{#success}}<span class="sheet-failed-roll" data-i18n="test-failed">Fail{{computed::success}}</span>{{/success}}
</span>
<span class="sheet-span-all">
{{#texts_hp_note}}
<strong>-</strong>&nbsp;
<span>{{computed::texts_hp_note}}</span>&nbsp;
<span data-i18n="hit-points-reduced">HP has been reduced</span>
<span data-i18n="texts-notes-fail">and no Texts for 1 hour</span>.
{{/texts_hp_note}}
</span>
</div>
{{/^rollTotal() computed::fumble 1}}
{{/^rollTotal() computed::success 1}}
{{/roll_texts}}
<!-- rest -->
{{#roll_rest}}
<div class="sheet-row">
{{#roll}}
<span class="sheet-span-all">{{roll}}</span>
{{#rollTotal() computed::long_rest 6}}
{{#roll2}}<span class="sheet-span-all">{{roll2}}</span>{{/roll2}}
{{/rollTotal() computed::long_rest 6}}
{{/roll}}
</div>
<div class="sheet-row">
<span class="sheet-span-all sheet-description">
{{#rollTotal() computed::short_rest 4}}<span data-i18n="short-rest-note">10+ min, Consumes 1 Food and 1 Water. HP increased.</span>{{/rollTotal() computed::short_rest 4}}
{{#rollTotal() computed::long_rest 6}}<span data-i18n="long-rest-note">6+ hr, Consumes 1 Food and 1 Water. Virtues reset and HP increased.</span>{{/rollTotal() computed::long_rest 6}}
</span>
</div>
{{/roll_rest}}
<!-- ailment -->
{{#roll_infected}}
<div class="sheet-row">
{{#roll}}
<span class="sheet-span-all">{{roll}}</span>
{{/roll}}
</div>
<div class="sheet-row">
<span class="sheet-span-all sheet-description">
<span data-i18n="infection-poison-note">You are Infected or Poisoned. Rest won't help. -d6/day. HP reduced.</span>
</span>
</div>
{{/roll_infected}}
<!-- hunger -->
{{#roll_hunger}}
<div class="sheet-row">
{{#roll}}
<span class="sheet-span-all">{{roll}}</span>
{{/roll}}
</div>
<div class="sheet-row">
<span class="sheet-span-all sheet-description">
<span data-i18n="hunger-thirst-note">Two days without Food or Water. -d4/day. HP reduced.</span>
</span>
</div>
{{/roll_hunger}}
<!-- debilitating -->
{{#roll_debilitating}}
<div class="sheet-row"><span class="sheet-span-all">{{roll}}</span></div>
<div class="sheet-row">
<span class="sheet-span-all sheet-description">
{{#rollTotal() roll 1}}<span data-i18n="debilitating-injuries-1">TRANSLATED</span>{{/rollTotal() roll 1}}
{{#rollTotal() roll 2}}<span data-i18n="debilitating-injuries-2">TRANSLATED</span>{{/rollTotal() roll 2}}
{{#rollTotal() roll 3}}<span data-i18n="debilitating-injuries-3">TRANSLATED</span>{{/rollTotal() roll 3}}
{{#rollTotal() roll 4}}<span data-i18n="debilitating-injuries-4">TRANSLATED</span>{{/rollTotal() roll 4}}
{{#rollTotal() roll 5}}<span data-i18n="debilitating-injuries-5">TRANSLATED</span>{{/rollTotal() roll 5}}
{{#rollTotal() roll 6}}<span data-i18n="debilitating-injuries-6">TRANSLATED</span>{{/rollTotal() roll 6}}
{{#rollTotal() roll 7}}<span data-i18n="debilitating-injuries-7">TRANSLATED</span>{{/rollTotal() roll 7}}
{{#rollTotal() roll 8}}<span data-i18n="debilitating-injuries-8">TRANSLATED</span>{{/rollTotal() roll 8}}
{{#rollTotal() roll 9}}<span data-i18n="debilitating-injuries-9">TRANSLATED</span>{{/rollTotal() roll 9}}
{{#rollTotal() roll 10}}<span data-i18n="debilitating-injuries-10">TRANSLATED</span>{{/rollTotal() roll 10}}
</span>
</div>
{{/roll_debilitating}}
<!-- broken -->
{{#roll_broken}}
<div class="sheet-row"><span class="sheet-span-all">{{roll}}</span></div>
<div class="sheet-row">
<span class="sheet-span-all sheet-description sheet-center">
{{#rollTotal() roll 1}}
<span data-i18n="broken-outcome1">Fall unconscious. d4 rounds, awaken with d4 HP</span><br>
<strong>d4</strong> <span data-i18n="unconscious">Unconscious</span> = {{roll2}}<span data-i18n="rounds">rounds</span><br>
<strong>d4</strong> <span data-i18n="hit-points-abbrv">HP</span> = {{roll3}}<br>
<span data-i18n="hit-points-increased">HP has been increased</span>
{{/rollTotal() roll 1}}
{{#rollTotal() roll 2}}
<span><strong>d6</strong> <span data-i18n="roll-result">Roll =</span> {{roll4}}</span><br>
{{#rollLess() roll4 6}}<span data-i18n="broken-outcome2-1">Broken or severed limb.</span>{{/rollLess() roll4 6}}
{{#rollTotal() roll4 6}}<span data-i18n="broken-outcome2-6">Lost eye. Can't act for d4 rounds then become active with d4 HP</span><br>
<strong>d4</strong> <span data-i18n="cannot-act">Cannot act</span> = {{roll5}} <span data-i18n="rounds">rounds</span><br>
<strong>d4</strong> <span data-i18n="hit-points-abbrv">HP</span> = {{roll6}}<br>
<span data-i18n="hit-points-increased">HP has been increased</span>
{{/rollTotal() roll4 6}}
{{/rollTotal() roll 2}}
{{#rollTotal() roll 3}}
<span data-i18n="broken-outcome3">Hemorrhage. Death in d2 hours unless treated. All tests are DR16 the first hour. DR18 the last hour.</span><br>
<strong>d2</strong> <span data-i18n="death">Death</span> = {{roll7}} <span data-i18n="hours">hours</span>
{{/rollTotal() roll 3}}
{{#rollTotal() roll 4}}
<span class="sheet-fumble-roll" data-i18n="broken-outcome4">Dead</span><br>
<span data-i18n="resurrection-note">When a warrior falls, they are cast into the depths of Yomi.</span><br>
<span data-i18n="hit-points-features-restored">HP and Features have been restored.</span>
{{/rollTotal() roll 4}}
</span>
</div>
{{/roll_broken}}
{{#roll_death}}
{{#rollTotal() roll_death 0}}
<div class="sheet-row">
<span class="sheet-span-all sheet-description sheet-center">
<span class="sheet-fumble-roll" data-i18n="broken-outcome4">Dead</span><br>
<span data-i18n="resurrection-note">When a warrior falls, they are cast into the depths of Yomi.</span><br>
<span data-i18n="hit-points-features-restored">HP and Features have been restored.</span>
</span>
</div>
{{/rollTotal() roll_death 0}}
{{#rollTotal() roll_death 1}}
<div class="sheet-row">
<span class="sheet-span-all sheet-description sheet-center">
<span class="sheet-fumble-roll" data-i18n="broken-outcome4">Dead</span><br>
<span data-i18n="death-note">A character can only be resurrected once.</span><br>
{{#rollGreater() roll 9}}
<span data-i18n="death-with-honour">You have died Honourably.</span> {{roll}}
{{/rollGreater() roll 9}}
{{#^rollGreater() roll 9}}
<span data-i18n="death-without-honour">You have died Dishonourably.</span> {{roll}}
{{/^rollGreater() roll 9}}
</span>
</div>
{{/rollTotal() roll_death 1}}
{{/roll_death}}
<!-- kamis vengeance -->
{{#roll_kami}}
<div class="sheet-row">
<span class="sheet-span-all">
<span class="sheet-d20-roll">{{roll}}</span>
<span class="sheet-span-all sheet-description sheet-center">
{{#rollTotal() roll 1}}<span data-i18n="kamis-vengeance-1">TRANSLATED</span>{{/rollTotal() roll 1}}
{{#rollTotal() roll 2}}
<span data-i18n="kamis-vengeance-2">TRANSLATED</span>
<span class="sheet-roll-query" data-i18n-title="roll-query">{{roll_query}}</span>
{{/rollTotal() roll 2}}
{{#rollTotal() roll 3}}<span data-i18n="kamis-vengeance-3">TRANSLATED</span>{{/rollTotal() roll 3}}
{{#rollTotal() roll 4}}<span data-i18n="kamis-vengeance-4">TRANSLATED</span><br>{{menu3}}{{/rollTotal() roll 4}}
{{#rollTotal() roll 5}}<span data-i18n="kamis-vengeance-5">TRANSLATED</span>{{/rollTotal() roll 5}}
{{#rollTotal() roll 6}}<span data-i18n="kamis-vengeance-6">TRANSLATED</span>{{/rollTotal() roll 6}}
{{#rollTotal() roll 7}}<span data-i18n="kamis-vengeance-7">TRANSLATED</span>{{/rollTotal() roll 7}}
{{#rollTotal() roll 8}}<span data-i18n="kamis-vengeance-8">TRANSLATED</span>{{/rollTotal() roll 8}}
{{#rollTotal() roll 9}}<span data-i18n="kamis-vengeance-9">TRANSLATED</span>{{/rollTotal() roll 9}}
{{#rollTotal() roll 10}}<span data-i18n="kamis-vengeance-10">TRANSLATED</span>{{/rollTotal() roll 10}}
{{#rollTotal() roll 11}}<span data-i18n="kamis-vengeance-11">TRANSLATED</span>{{/rollTotal() roll 11}}
{{#rollTotal() roll 12}}<span data-i18n="kamis-vengeance-12">TRANSLATED</span>{{/rollTotal() roll 12}}
{{#rollTotal() roll 13}}<span data-i18n="kamis-vengeance-13">TRANSLATED</span><br>{{menu1}}{{/rollTotal() roll 13}}
{{#rollTotal() roll 14}}<span data-i18n="kamis-vengeance-14">TRANSLATED</span>{{/rollTotal() roll 14}}
{{#rollTotal() roll 15}}<span data-i18n="kamis-vengeance-15">TRANSLATED</span><br>{{menu2}}{{/rollTotal() roll 15}}
{{#rollTotal() roll 16}}<span data-i18n="kamis-vengeance-16">TRANSLATED</span>{{/rollTotal() roll 16}}
{{#rollTotal() roll 17}}
<span data-i18n="kamis-vengeance-17">TRANSLATED</span><br>
{{damagePC}}
{{/rollTotal() roll 17}}
{{#rollTotal() roll 18}}<span data-i18n="kamis-vengeance-18">TRANSLATED</span>{{/rollTotal() roll 18}}
{{#rollTotal() roll 19}}<span data-i18n="kamis-vengeance-19">TRANSLATED</span>{{/rollTotal() roll 19}}
{{#rollTotal() roll 20}}<span data-i18n="kamis-vengeance-20">TRANSLATED</span><br>{{menu2}}{{/rollTotal() roll 20}}
</span>
</div>
{{/roll_kami}}
<!-- dice -->
{{#roll_dice}}
<div class="sheet-row">
<span class="sheet-span-all">
<span class="sheet-dice-roll">{{roll}}</span>
<span class="sheet-dice-roll">{{roll2}}</span>
</span>
<span class="sheet-span-all">
<span class="sheet-roll-query" data-i18n-title="roll-query">{{roll_query}}</span>
</span>
</div>
{{/roll_dice}}
<!-- improve -->
{{#roll_improve}}
<div class="sheet-row"><strong class="sheet-span-all" data-i18n="hit-points-u">HIT POINTS</strong></div>
{{#roll}}
<div class="sheet-row">
<span class="sheet-span-all">{{roll}}</span>
{{#rollTotal() computed::hp_success 1}}
<span class="sheet-span-all"><span class="sheet-success-roll" data-i18n="test-successful">Success</span> +{{roll2}}</span>
{{/rollTotal() computed::hp_success 1}}
{{#^rollTotal() computed::hp_success 1}}
<span class="sheet-span-all"><span class="sheet-failed-roll" data-i18n="test-failed">Fail</span> +0</span>
{{/^rollTotal() computed::hp_success 1}}
</div>
{{/roll}}
<hr>
<div class="sheet-row"><strong class="sheet-span-all" data-i18n="swiftness-u">SWIFTNESS</strong></div>
{{#roll3}}
<div class="sheet-row">
<span class="sheet-span-all">{{roll3}}</span>
{{#rollTotal() computed::swiftness_success 1}}
<span class="sheet-span-all"><span class="sheet-success-roll" data-i18n="test-successful">Success</span> +1</span>
{{/rollTotal() computed::swiftness_success 1}}
{{#^rollTotal() computed::swiftness_success 1}}
<span class="sheet-span-all"><span class="sheet-failed-roll" data-i18n="test-failed">Fail</span> -1</span>
{{/^rollTotal() computed::swiftness_success 1}}
</div>
{{/roll3}}
<hr>
<div class="sheet-row"><strong class="sheet-span-all" data-i18n="spirit-u">SPIRIT</strong></div>
{{#roll4}}
<div class="sheet-row">
<span class="sheet-span-all">{{roll4}}</span>
{{#rollTotal() computed::spirit_success 1}}
<span class="sheet-span-all"><span class="sheet-success-roll" data-i18n="test-successful">Success</span> +1</span>
{{/rollTotal() computed::spirit_success 1}}
{{#^rollTotal() computed::spirit_success 1}}
<span class="sheet-span-all"><span class="sheet-failed-roll" data-i18n="test-failed">Fail</span> -1</span>
{{/^rollTotal() computed::spirit_success 1}}
</div>
{{/roll4}}
<hr>
<div class="sheet-row"><strong class="sheet-span-all" data-i18n="vigor-u">VIGOR</strong></div>
{{#roll5}}
<div class="sheet-row">
<span class="sheet-span-all">{{roll5}}</span>
{{#rollTotal() computed::vigor_success 1}}
<span class="sheet-span-all"><span class="sheet-success-roll" data-i18n="test-successful">Success</span> +1</span>
{{/rollTotal() computed::vigor_success 1}}
{{#^rollTotal() computed::vigor_success 1}}
<span class="sheet-span-all"><span class="sheet-failed-roll" data-i18n="test-failed">Fail</span> -1</span>
{{/^rollTotal() computed::vigor_success 1}}
</div>
{{/roll5}}
<hr>
<div class="sheet-row"><strong class="sheet-span-all" data-i18n="resilience-u">RESILIENCE</strong></div>
{{#roll6}}
<div class="sheet-row">
<span class="sheet-span-all">{{roll6}}</span>
{{#rollTotal() computed::resilience_success 1}}
<span class="sheet-span-all"><span class="sheet-success-roll" data-i18n="test-successful">Success</span> +1</span>
{{/rollTotal() computed::resilience_success 1}}
{{#^rollTotal() computed::resilience_success 1}}
<span class="sheet-span-all"><span class="sheet-failed-roll" data-i18n="test-failed">Fail</span> -1</span>
{{/^rollTotal() computed::resilience_success 1}}
</div>
{{/roll6}}
{{/roll_improve}}
<!-- morale -->
{{#roll_morale}}
{{#roll}}
<div class="sheet-row">
<span class="sheet-span-all">
{{roll}}
{{#dr_final}}<span data-i18n="versus-morale-rating">vs Morale</span>{{computed::dr_final}}{{/dr_final}}
</span>
</div>
<!-- SUCCESS -->
<div class="sheet-row">
<span class="sheet-span-all">
{{#rollTotal() computed::success 1}}
{{#success}}
<span class="sheet-success-roll" data-i18n="test-successful">Success{{computed::success}}</span>
<span data-i18n="enemy-is-demoralized">Enemy is Demoralized{{computed::success}}</span>
{{/success}}
</span>
<span class="sheet-span-all sheet-description sheet-center">
{{#rollLess() roll2 4}}
<span data-i18n="morale-result-1-3">Fights even harder, driven by their anger and determination to avenge their fallen comrades.</span>
{{/rollLess() roll2 4}}
{{#^rollLess() roll2 4}}
<span data-i18n="morale-result-4-6">Surrenders or retreats, unable to face the shame of defeat.</span>
{{/^rollLess() roll2 4}}
</span>
{{/rollTotal() computed::success 1}}
</span>
</div>
<!-- FAIL -->
<div class="sheet-row">
<span class="sheet-span-all">
{{#^rollTotal() computed::success 1}}
{{#success}}
<span class="sheet-failed-roll" data-i18n="test-failed">Fail{{computed::success}}</span>
<span data-i18n="enemy-is-not-demoralized">Enemy is not Demoralized{{computed::success}}</span>
{{/success}}
{{/^rollTotal() computed::success 1}}
</span>
</div>
{{/roll}}
{{/roll_morale}}
<!-- reaction -->
{{#roll_reaction}}
{{#roll}}
<div class="sheet-row">
<span class="sheet-span-all">
{{roll}}
</span>
</div>
<div class="sheet-row">
<span class="sheet-span-all sheet-description sheet-center">
{{#rollBetween() roll 2 3}}<span data-i18n="reaction-result-2-3">You will be slaughtered!</span>{{/rollBetween() roll 2 3}}
{{#rollBetween() roll 4 6}}<span data-i18n="reaction-result-4-6">Fury</span>{{/rollBetween() roll 4 6}}
{{#rollBetween() roll 7 8}}<span data-i18n="reaction-result-7-8">Apathetic</span>{{/rollBetween() roll 7 8}}
{{#rollBetween() roll 9 10}}<span data-i18n="reaction-result-9-10">Almost courteous</span>{{/rollBetween() roll 9 10}}
{{#rollBetween() roll 11 12}}<span data-i18n="reaction-result-11-12">Cooperative</span>{{/rollBetween() roll 11 12}}
</span>
</div>
{{/roll}}
{{/roll_reaction}}
{{#description}}
<div class="sheet-row"><span class="sheet-span-all sheet-description">{{description}}</span></div>
{{/description}}
{{#description_center}}
<div class="sheet-row"><span class="sheet-span-all sheet-description sheet-center">{{description_center}}</span></div>
{{/description_center}}
{{#allprops() armour_pen armour_reduction armour_worn attack_ammo attack_track_ammo attack_crit_note attack_fail_note attack_fumble_note attack_success_note crit damage damagePC damagePChalf damage_total defence_crit_note defence_fail_note defence_fumble_note defence_success_note description description_center dr_base dr_final dueling footnote fumble guard_crit_note guard_fail_note guard_fumble_note guard_success_note haiku_fail_note haiku_success_note heading hungry infection long_rest menu1 menu2 menu3 menu4 name parry_crit_note parry_fail_note parry_fumble_note parry_success_note resurrected riposte_crit_note riposte_fumble_note riposte_fail_note riposte_success_note roll roll2 roll3 roll4 roll5 roll6 roll7 roll_attack roll_dice roll_parry roll_guard roll_riposte roll_broken roll_infected roll_damage roll_death roll_debilitating roll_default roll_defence roll_haiku roll_improve roll_initiative roll_hunger roll_kami roll_morale roll_reaction roll_query roll_query_footer roll_rest roll_seppuku roll_texts seppuku2_fail_note seppuku2_success_note seppuku_fail_note seppuku_success_note short_rest subheading success texts_hp_note texts_kamis_note hp_success swiftness_success spirit_success vigor_success resilience_success}}
<div class="sheet-row">
<span class="sheet-key">{{key}}</span>
<span class="sheet-value">{{value}}</span>
</div>
{{/allprops() armour_pen armour_reduction armour_worn attack_ammo attack_track_ammo attack_crit_note attack_fail_note attack_fumble_note attack_success_note crit damage damagePC damagePChalf damage_total defence_crit_note defence_fail_note defence_fumble_note defence_success_note description description_center dr_base dr_final dueling footnote fumble guard_crit_note guard_fail_note guard_fumble_note guard_success_note haiku_fail_note haiku_success_note heading hungry infection long_rest menu1 menu2 menu3 menu4 name parry_crit_note parry_fail_note parry_fumble_note parry_success_note resurrected riposte_crit_note riposte_fumble_note riposte_fail_note riposte_success_note roll roll2 roll3 roll4 roll5 roll6 roll7 roll_attack roll_dice roll_parry roll_guard roll_riposte roll_broken roll_infected roll_damage roll_death roll_debilitating roll_default roll_defence roll_haiku roll_improve roll_initiative roll_hunger roll_kami roll_morale roll_reaction roll_query roll_query_footer roll_rest roll_seppuku roll_texts seppuku2_fail_note seppuku2_success_note seppuku_fail_note seppuku_success_note short_rest subheading success texts_hp_note texts_kamis_note hp_success swiftness_success spirit_success vigor_success resilience_success}}
{{#footnote}}
<div class="sheet-row">
<span class="sheet-footnote sheet-span-all">{{footnote}}</span>
</div>
{{/footnote}}
{{#roll_query_footer}}
<div class="sheet-row">
<span class="sheet-span-all">
<span class="sheet-roll-query" data-i18n-title="roll-query">{{roll_query_footer}}</span>
</span>
</div>
{{/roll_query_footer}}
</div>
</rolltemplate>
<!-- query text translations and hidden attributes -->
<div class="hidden">
<span class="hidden" data-i18n="ask-broken">Roll Broken?</span>
<span class="hidden" data-i18n="ask-yes">YES</span>
<span class="hidden" data-i18n="ask-no">NO</span>
<span class="hidden" data-i18n="difficulty-rating-text-6">Simple</span>
<span class="hidden" data-i18n="difficulty-rating-text-8">Routine</span>
<span class="hidden" data-i18n="difficulty-rating-text-10">Pretty simple</span>
<span class="hidden" data-i18n="difficulty-rating-text-12">Normal</span>
<span class="hidden" data-i18n="difficulty-rating-text-14">Difficult</span>
<span class="hidden" data-i18n="difficulty-rating-text-16">Very hard</span>
<span class="hidden" data-i18n="difficulty-rating-text-18">Should not be possible</span>
<span class="hidden" data-i18n="difficulty-rating-abbrv-6">DR6</span>
<span class="hidden" data-i18n="difficulty-rating-abbrv-8">DR8</span>
<span class="hidden" data-i18n="difficulty-rating-abbrv-10">DR10</span>
<span class="hidden" data-i18n="difficulty-rating-abbrv-12">DR12</span>
<span class="hidden" data-i18n="difficulty-rating-abbrv-14">DR14</span>
<span class="hidden" data-i18n="difficulty-rating-abbrv-16">DR16</span>
<span class="hidden" data-i18n="difficulty-rating-abbrv-18">DR18</span>
<span class="hidden" data-i18n="difficulty-rating">Difficulty Rating</span>
<span class="hidden" data-i18n="enter-morale-rating">Enter Morale Rating</span>
<span class="hidden" data-i18n="short-long-rest">Short or Long Rest?</span>
<span class="hidden" data-i18n="short-d4">Short d4</span>
<span class="hidden" data-i18n="long-d6">Long d6</span>
<span class="hidden" data-i18n="choose-ailment">Choose your ailment</span>
<span class="hidden" data-i18n="hunger-or-thirst">Hunger or Thirst -d4</span>
<span class="hidden" data-i18n="infection-or-poison">Infection or Poison -d</span>
<span class="hidden" data-i18n="choose-dice">Choose your die</span>
<span class="hidden" data-i18n="enter-dice-number">Enter #of Dice</span>
<span class="hidden" data-i18n="enter-dice-sides">Enter #of Sides and any +/- modifier</span>
<span class="hidden" data-i18n="enter-morale-rating">Enter Morale Rating</span>
<!-- placeholder attrs used between rolls -->
<input class="hidden" type="hidden" name="attr_damage_multiplier" value="1" />
<input class="hidden" type="hidden" name="attr_armour_tier_damage" value="1" />
<input class="hidden" type="text" name="attr_character_name_safe" value="" />
<input class="hidden" type="text" name="attr_swiftness_roll_label" value="[swiftness]" />
<input class="hidden" type="text" name="attr_spirit_roll_label" value="[spirit]" />
<input class="hidden" type="text" name="attr_vigor_roll_label" value="[vigor]" />
<input class="hidden" type="text" name="attr_resilience_roll_label" value="[resilience]" />
<input class="hidden" type="text" name="attr_query12" value="?{Difficulty Rating?|DR12 Normal.,12|DR6 Simple.,6|DR8 Routine.,8|DR10 Pretty simple.,10|DR12 Normal.,12|DR14 Difficult.,14|DR16 Very hard.,16|DR18 Should not be possible.,18}" />
<input class="hidden" type="text" name="attr_query14" value="?{Difficulty Rating?|DR14 Normal.,14|DR6 Simple.,6|DR8 Routine.,8|DR10 Pretty simple.,10|DR12 Normal.,12|DR14 Difficult.,14|DR16 Very hard.,16|DR18 Should not be possible.,18}" />
<input class="hidden" type="text" name="attr_morale_query" value="?{Choose Morale Rating|7}" />
<input class="hidden" type="text" name="attr_armour_query" value="?{Armour tier of target?|0,0|-d2,2|-d4,4|-d6,6|-d8,8}" />
<input class="hidden" type="text" name="attr_rest_query" value="?{Short or Long Rest?|Short d4, d4|Long d6, d6}" />
<input class="hidden" type="text" name="attr_dice_query" value="?{Choose your die|d2|d4|d6|d8|d10|d12|d20}" />
<input class="hidden" type="text" name="attr_dice_query2" value="?{Enter #of Dice|1}d?{Enter #of Sides|2}" />
<input class="hidden" type="text" name="attr_dice_d6" value="d6" />
<!-- <input class="hidden" type="text" name="attr_dice_query_inline_roll" value="&{template:ronin} {{heading=^{rolling-dice}}} {{&nbsp;?{Choose your die|d2|d4|d6|d8|d10|d12|d20}= = [[?{Choose your die|d2|d4|d6|d8|d10|d12|d20}]]}} {{roll_query_footer=[&amp;nbsp;](`&amp;#64;{selected|dice_query_inline_roll})}}" /> -->
<input class="hidden" type="text" name="attr_dice_query_inline_roll" value="&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolling-dice}}} {{roll_dice=[[0]]}} {{roll=?{Enter #of Dice|1}d?{Enter #of Sides|2} = [[?{Enter #of Dice|1}d?{Enter #of Sides|2}]]}} {{roll_query_footer=[&amp;nbsp;](`&amp;#64;{@{character_name_safe}|dice_query_inline_roll})}}" />
<input class="hidden" type="text" name="attr_dice_d6_inline_roll" value="&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolling-dice}}} {{roll_dice=[[0]]}} {{roll=@{dice_d6} = [[@{dice_d6}]]}} {{roll_query_footer=[&amp;nbsp;](`&amp;#64;{@{character_name_safe}|dice_query_inline_roll})}}" />
</div>
<script type="text/worker">
// concatenates repeating attribute
// (repeating section, rowID, attribute)
const section_attribute = (section, id, field) => `repeating_${section}_${id}_${field}`;
// non-repeating buttons
const buttonSet = [
'broken',
'dailytexts',
'defence',
'dr_test',
'haiku',
'improve',
'hunger',
'infection',
'initiative',
'initiative2',
'kamisvengeance',
'morale',
'reaction',
'resilience_test',
'rest',
'seppuku',
'seppuku2',
'seppukudamage',
'debilitating',
'seppukuhonour',
'seppukuhonourhalf',
'spirit_test',
'swiftness_test',
'takedamage',
'takedamagenoarmour',
'vigor_test',
'virtues',
];
// enables drag/drop of action buttons by syncing with a normal button
on('change:character_name sheet:opened', (eventInfo) => {
getSectionIDs('repeating_weapons', (idArrayWeapons) => {
getSectionIDs('repeating_texts', (idArrayTexts) => {
getAttrs(['character_name'], (v) => {
let allAttributeValues = {};
// process non-repeating buttons
allAttributeValues = buttonSet.reduce((all, one) => {
return {...all, [one]: `%{${v.character_name}|${one}-button}`};
}, {});
// process each repeating sections buttons
idArrayTexts.forEach((id) => {
// repeating buttons
const repeatingButtonSet = ['test'];
const attribute_values = repeatingButtonSet.reduce((all, one) => {
return {...all, [`repeating_texts_${id}_${one}`]: `%{${v.character_name}|repeating_texts_${id}_${one}-button}`};
}, {});
allAttributeValues = {...allAttributeValues, ...attribute_values};
});
idArrayWeapons.forEach((id) => {
// repeating buttons
const repeatingButtonSet = ['attack', 'monsterdamage', 'guard', 'parry', 'riposte'];
const attribute_values = repeatingButtonSet.reduce((all, one) => {
return {...all, [`repeating_weapons_${id}_${one}`]: `%{${v.character_name}|repeating_weapons_${id}_${one}-button}`};
}, {});
allAttributeValues = {...allAttributeValues, ...attribute_values};
});
setAttrs(allAttributeValues, {silent: true});
});
});
});
});
const stats = [
'broken-button',
'dailytexts-button',
'defence-button',
'dr_test-button',
'haiku-button',
'hunger-button',
'improve-button',
'infection-button',
'initiative-button',
'initiative2-button',
'kamisvengeance-button',
'morale-button',
'reaction-button',
'resilience_test-button',
'rest-button',
'seppuku-button',
'seppuku2-button',
'seppukudamage-button',
'debilitating-button',
'seppukuhonour-button',
'seppukuhonourhalf-button',
'spirit_test-button',
'swiftness_test-button',
'takedamage-button',
'takedamagenoarmour-button',
'vigor_test-button',
'virtues-button',
];
const stat_changes = stats.map((stat) => `clicked:${stat}`).join(' ');
on(stat_changes, (eventInfo) => {
console.log(eventInfo.triggerName);
// include attributes here
const fields = [
'armour_damaged',
'armour_def_pen',
'armour_swift_pen',
'armour_tier_damage',
'armour_tier',
'character_name_safe',
'damage_multiplier',
'dr_query_12',
'dr_query_14',
'morale_query',
'food',
'honour',
'hp_max',
'hp',
'resilience',
'resurrection',
'spirit',
'swiftness',
'vigor',
'virtue',
'virtue_die',
'virtue_max',
'water',
];
// which button was pressed?
const trigger = eventInfo.triggerName.replace('clicked:', '');
getAttrs(fields, (v) => {
const output = {};
const character_name = v.character_name_safe;
// non-repeating CRP rolls
const nonRepeatingRolls = {
['broken-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{broken}}} {{roll=^{roll-result} [[1d4]]}} {{roll2=[[1d4]]}} {{roll3=[[1d4]]}} {{roll4=[[1d6]]}} {{roll5=[[1d4]]}} {{roll6=[[1d4]]}} {{roll7=[[1d2]]}} {{roll_broken=[[0]]}}`,
['improve-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{roll-improve}}} {{roll_improve=[[0]]}} {{roll=[[ 6d10 ]]^{hit-points-maximum-abbrv} @{hp|max}}} {{roll2=[[ 1d6 ]]}} {{roll3=[[ 1d6 ]]^{versus-swiftness} @{swiftness}}} {{roll4=[[ 1d6 ]]^{versus-spirit} @{spirit}}} {{roll5=[[ 1d6 ]]^{versus-vigor} @{vigor}}} {{roll6=[[ 1d6 ]]^{versus-resilience} @{resilience}}} {{hp_success=[[0]]}} {{swiftness_success=[[0]]}} {{spirit_success=[[0]]}} {{vigor_success=[[0]]}} {{resilience_success=[[0]]}}`,
['dailytexts-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{daily-texts}}} {{roll_default=[[0]]}} {{roll=^{roll-result} [[ 1d4 + @{spirit} @{spirit_roll_label} + @{spirit_mod} [mod] ]]}} {{description_center=^{daily-texts-result}}}`,
['defence-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{defence}}}} {{armour_worn=@{armour}}} {{roll_defence=[[0]]}} {{roll=^{roll-result} [[ 1d20 + @{swiftness} @{swiftness_roll_label} + @{swiftness_mod} [mod] ]]}} {{armour_pen=[[0]]}} {{defence_success_note=[[0]]}} {{defence_crit_note=[[0]]}} {{defence_fumble_note=[[0]]}} {{damagePC=[^{roll-pc-damage}](\`&#64;{${character_name}|takedamage})}} {{dr_final=[[0]]}} {{dr_base=[[0]]}} {{success=[[0]]}} {{crit=[[0]]}} {{fumble=[[0]]}}`,
['takedamage-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=@{dice_query2} ^{damage}}} {{armour_worn=d@{armour_tier}}} {{roll_damage=[[0]]}} {{roll=[[ floor(@{dice_query2}*@{damage_multiplier} [mult]) ]]}} {{armour_reduction=[[ d@{armour_tier} ]]}} {{damage_total=[[0]]}} {{description_center=^{hit-points-reduced}}}`,
['takedamagenoarmour-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=@{dice_query2} ^{damage}}} {{roll_damage=[[0]]}} {{roll=[[ @{dice_query2} ]]}} {{armour_reduction=[[0]]}} {{damage_total=[[0]]}} {{description_center=^{hit-points-reduced}}}`,
['initiative-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{initiative-group}}} {{roll_initiative=[[0]]}} {{roll=^{roll-result} [[ 1d6 ]]}}`,
['initiative2-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{initiative-individual}}} {{roll_default=[[0]]}} {{roll=^{roll-result} [[ 1d6 + @{swiftness} @{swiftness_roll_label}&{tracker} ]]}} {{description_center=^{added-to-tracker} }}`,
['kamisvengeance-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{kamis-vengeance}}} {{roll_kami=[[0]]}} {{roll=^{roll-result} [[1d20]]}} {{menu1=[^{roll-resilience}](\`&#64;{${character_name}|resilience_test})}} {{menu2=[^{roll-swiftness}](\`&#64;{${character_name}|swiftness_test})}} {{menu3=[^{roll-spirit}](\`&#64;{${character_name}|spirit_test})}} {{damagePC=[^{roll-pc-damage}](\`&#64;{${character_name}|takedamagenoarmour})}} {{roll_query=[&nbsp;](\`&#64;{${character_name}|dice_d6_inline_roll})}}`,
['rest-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls}}} {{roll_rest=[[0]]}} {{roll=**+** [[ @{rest_query} ]] ^{hit-points-abbrv}}} {{roll2=d@{virtue_die} ^{virtues-u} &equals; [[ d@{virtue_die} ]]}} {{short_rest=[[0]]}} {{long_rest=[[0]]}} {{footnote=[[ @{food}-1 ]]^{food} | [[ @{water}-1 ]]^{water}}}`,
['infection-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls}}} {{roll=**-** [[ 1d6 ]] ^{hit-points-abbrv}}}} {{roll_infected=[[0]]}} {{infection=[[0]]}}`,
['hunger-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{hunger-thirst}}} {{roll=**-** [[ 1d4 ]] ^{hit-points-abbrv}}}} {{roll_hunger=[[0]]}} {{hungry=[[0]]}`,
['virtues-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{virtues-u}}} {{roll_default=[[0]]}} {{roll=^{roll-result} [[ 1d@{virtue_die} ]]}}`,
['seppuku-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{seppuku-u} &#11046; ^{spirit-u} ^{test}}} {{roll_seppuku=[[0]]}} {{roll=^{roll-result} [[ 1d20 + @{spirit} @{spirit_roll_label} + @{spirit_mod} [mod] ]]}} {{dr_final=[[0]]}} {{dr_base}} {{success=[[0]]}} {{crit=[[0]]}} {{fumble=[[0]]}} {{seppuku_success_note=[[1]]}} {{seppuku_fail_note=[[0]]}} {{menu1=[^{roll-resilience}](\`&#64;{${character_name}|seppuku2})}}`,
['seppuku2-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{seppuku-u} &#11046; ^{resilience-u} ^{test}}} {{roll_seppuku=[[0]]}} {{roll=^{roll-result} [[ 1d20 + @{resilience} @{resilience_roll_label} ]]}} {{dr_final=[[14]]}} {{dr_base}} {{success=[[0]]}} {{crit=[[0]]}} {{fumble=[[0]]}} {{seppuku2_success_note=[[0]]}} {{seppuku2_fail_note=[[0]]}} {{menu1=[^{roll-pc-damage}](\`&#64;{${character_name}|seppukudamage}) **|** [^{roll-half-honour}](\`&#64;{${character_name}|seppukuhonourhalf})}} {{menu2=[^{roll-honour}](\`&#64;{${character_name}|seppukuhonour})}}`,
['seppukudamage-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{seppuku-u} &#11046; ^{hit-points-abbrv} ^{damage}}} {{roll_default=[[0]]}} {{roll=^{roll-result} [[ 1d8 ]] %NEWLINE% [^{roll-debilitating-injuries}](\`&#64;{${character_name}|debilitating})}}`,
['debilitating-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{debilitating-injuries}}} {{roll_debilitating=[[0]]}} {{roll=^{roll-result} [[ 1d10 ]]}}`,
['seppukuhonour-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{honour-u}}} {{roll_seppuku=[[0]]}} {{roll2=^{roll-result} [[ 2d6+2 ]]}} {{roll3=[[@{honour}]]}} {{resurrected=[[@{resurrection}]]}}`,
['seppukuhonourhalf-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ½ ^{honour-u}}} {{roll_seppuku=[[0]]}} {{roll2=^{roll-result} [[ floor((2d6+2)/2) ]]}} {{roll3=[[@{honour}]]}} {{resurrected=[[@{resurrection}]]}}`,
['haiku-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{haiku-u}}} {{roll_haiku=[[0]]}} {{roll=^{roll-result} [[ 1d20 + @{spirit} @{spirit_roll_label} + @{spirit_mod} [mod] ]]}} {{haiku_fail_note=[[0]]}} {{haiku_success_note=[[0]]}} {{roll_query=[&nbsp;](\`&#64;{${character_name}|dice_d6_inline_roll})}} {{dr_final=[[0]]}} {{dr_base=[[0]]}} {{success=[[0]]}} {{crit=[[0]]}} {{fumble=[[0]]}}`,
['dr_test-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{dr-test}}} {{roll_default=[[0]]}} {{roll=^{roll-result} [[ 1d20 ]]}} {{dr_final=[[0]]}} {{dr_base=[[0]]}} {{success=[[0]]}} {{crit=[[0]]}} {{fumble=[[0]]}}`,
['swiftness_test-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{swiftness-u}}} {{armour_worn=@{armour}}} {{roll_default=[[0]]}} {{roll=^{roll-result} [[ 1d20 + @{swiftness} @{swiftness_roll_label} + @{swiftness_mod} [mod] ]]}} {{armour_pen=[[0]]}} {{dr_final=[[0]]}} {{dr_base=[[0]]}} {{success=[[0]]}} {{crit=[[0]]}} {{fumble=[[0]]}}`,
['spirit_test-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{spirit-u}}} {{roll_default=[[0]]}} {{roll=^{roll-result} [[ 1d20 + @{spirit} @{spirit_roll_label} + @{spirit_mod} [mod]]]}} {{dr_final=[[0]]}} {{dr_base=[[0]]}} {{success=[[0]]}} {{crit=[[0]]}} {{fumble=[[0]]}}`,
['vigor_test-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{vigor-u}}} {{roll_default=[[0]]}} {{roll=^{roll-result} [[ 1d20 + @{vigor} @{vigor_roll_label} + @{vigor_mod} [mod]]]}} {{dr_final=[[0]]}} {{dr_base=[[0]]}} {{success=[[0]]}} {{crit=[[0]]}} {{fumble=[[0]]}}`,
['resilience_test-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{resilience-u}}} {{roll_default=[[0]]}} {{roll=^{roll-result} [[ 1d20 + @{resilience} @{resilience_roll_label} + @{resilience_mod} [mod]]]}} {{dr_final=[[0]]}} {{dr_base=[[0]]}} {{success=[[0]]}} {{crit=[[0]]}} {{fumble=[[0]]}}`,
['morale-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{morale-u}}} {{roll_morale=[[0]]}} {{roll=^{roll-result} [[ 2d6 ]]}} {{roll2=[[ 1d6 ]]}} {{dr_final=[[0]]}} {{dr_base=[[0]]}} {{success=[[0]]}}`,
['reaction-button']: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{reaction-u}}} {{roll_reaction=[[0]]}} {{roll=^{roll-result} [[ 2d6 ]]}}`,
};
const roll_string = nonRepeatingRolls[trigger];
const dr_string12 = `!&{template:ronin}{{answer=![[${v.dr_query_12}]]}}`;
const dr_string14 = `!&{template:ronin}{{answer=![[${v.dr_query_14}]]}}`;
const morale_string = `!&{template:ronin}{{answer=![[${v.morale_query}]]}}`;
const swiftness = +v.swiftness || 0;
const spirit = +v.spirit || 0;
const vigor = +v.vigor || 0;
const resilience = +v.resilience || 0;
const armourTier = +v.armour_tier || 0;
// armour penalty does not apply to Swiftness when damaged
const armourDamaged = +v.armour_damaged || 0;
const armourTierSwiftPen = +armourDamaged === 0 ? v.armour_swift_pen : 0;
const armourTierDefPen = +v.armour_def_pen || 0;
const hp = +v.hp || 0;
const hpMax = +v.hp_max || 0;
const honour = +v.honour || 10;
const food = +v.food || 0;
const water = +v.water || 0;
const resurrection = +v.resurrection || 0;
const virtue = +v.virtue || 0;
const virtueMax = +v.virtue_max || 0;
// process each button's roll
if (trigger === 'dailytexts-button') {
startRoll(roll_string, (roll) => {
const result = roll.results.roll.result;
output.texts_per_day = result;
output.texts_per_day_max = result;
finishRoll(roll.rollId);
setAttrs(output, {silent: true});
});
} else if (trigger === 'virtues-button') {
startRoll(roll_string, (roll) => {
const result = roll.results.roll.result;
output.virtue = result;
output.virtue_max = result;
finishRoll(roll.rollId);
setAttrs(output, {silent: true});
});
} else if (trigger === 'takedamage-button') {
startRoll(roll_string, (roll) => {
console.log(roll);
const armourResult = roll.results.armour_reduction.result;
const damageResult = roll.results.roll.result;
const damageMult = v.damage_multiplier;
const armourTierDamage = v.armour_tier_damage;
console.log(`Damage rolled: damageMult:${damageMult} armourTierDamage:${armourTierDamage}`);
const adjustedDamage = Math.max(damageResult - armourResult, 0);
finishRoll(roll.rollId, {
damage_total: adjustedDamage,
});
output.hp = hp - adjustedDamage;
output.armour_tier = armourTierDamage === 1 ? Math.max(armourTier - 2, 0) : armourTier;
output.armour_damaged = armourTierDamage === 1 ? 1 : 0;
// reset placeholder attrs
output.damage_multiplier = 1;
output.armour_tier_damage = 0;
setAttrs(output);
});
} else if (trigger === 'takedamagenoarmour-button') {
startRoll(roll_string, (roll) => {
console.log(roll);
const damageResult = roll.results.roll.result;
finishRoll(roll.rollId, {
damage_total: damageResult,
});
output.hp = hp - damageResult;
setAttrs(output);
});
} else if (trigger === 'rest-button') {
startRoll(roll_string, (roll) => {
console.log(roll);
const result = roll.results.roll.result;
const die = roll.results.roll.rolls[0].sides;
const virtueReroll = roll.results.roll2.result;
finishRoll(roll.rollId, {
short_rest: die,
long_rest: die,
});
output.food = food - 1;
output.water = water - 1;
output.hp = Math.min(hp + result, hpMax);
output.virtue_max = virtueReroll;
output.virtue = virtueReroll;
setAttrs(output);
});
} else if (trigger === 'infection-button') {
startRoll(roll_string, (roll) => {
const result = roll.results.roll.result;
const die = roll.results.roll.rolls[0].sides;
finishRoll(roll.rollId, {
infection: die,
});
output.infected = 1;
output.hp = hp - result;
setAttrs(output);
});
} else if (trigger === 'hunger-button') {
startRoll(roll_string, (roll) => {
const result = roll.results.roll.result;
const die = roll.results.roll.rolls[0].sides;
finishRoll(roll.rollId, {
hungry: die,
});
output.hp = hp - result;
setAttrs(output);
});
} else if (trigger === 'defence-button') {
console.log(`Change detected: trigger:${trigger}`);
startRoll(dr_string12, (dr_prompt) => {
const baseDR = dr_prompt.results.answer.result;
// armour penalty applies
const DR = baseDR + armourTierDefPen;
startRoll(roll_string, (roll) => {
// console.log(roll);
const d20Roll = roll.results.roll.dice[0];
const result = roll.results.roll.result;
const isCrit = d20Roll === 20 ? 1 : 0;
const isFumble = d20Roll === 1 ? 1 : 0;
const isSuccess = result >= DR ? 1 : 0;
finishRoll(roll.rollId, {
//'name of key': 'computed value'
dr_base: baseDR,
dr_final: DR,
success: isSuccess,
crit: isCrit,
fumble: isFumble,
armour_pen: armourTierDefPen,
});
// pass to damage roll
output.armour_tier_damage = isFumble === 1 ? 1 : 0;
output.damage_multiplier = isFumble === 1 ? 2 : 1;
setAttrs(output);
});
});
} else if (trigger === 'swiftness_test-button') {
console.log(`Change detected: trigger:${trigger}`);
startRoll(dr_string12, (dr_prompt) => {
const baseDR = dr_prompt.results.answer.result;
// add the armour penalty
const DR = baseDR + armourTierSwiftPen;
console.log(`Change detected: dr:${DR}`);
startRoll(roll_string, (roll) => {
// console.log(roll);
const d20Roll = roll.results.roll.dice[0];
const result = roll.results.roll.result;
const isCrit = d20Roll === 20 ? 1 : 0;
const isFumble = d20Roll === 1 ? 1 : 0;
const isSuccess = result >= DR ? 1 : 0;
finishRoll(roll.rollId, {
//'name of key': 'computed value'
dr_base: baseDR,
dr_final: DR,
success: isSuccess,
crit: isCrit,
fumble: isFumble,
armour_pen: armourTierSwiftPen,
});
setAttrs(output, {silent: true});
});
});
} else if (trigger === 'spirit_test-button') {
console.log(`Change detected: trigger:${trigger}`);
startRoll(dr_string12, (dr_prompt) => {
const baseDR = dr_prompt.results.answer.result;
const DR = baseDR;
console.log(`Change detected: dr:${DR}`);
startRoll(roll_string, (roll) => {
// console.log(roll);
const d20Roll = roll.results.roll.dice[0];
const result = roll.results.roll.result;
const isCrit = d20Roll === 20 ? 1 : 0;
const isFumble = d20Roll === 1 ? 1 : 0;
const isSuccess = result >= DR ? 1 : 0;
finishRoll(roll.rollId, {
//'name of key': 'computed value'
dr_base: baseDR,
dr_final: DR,
success: isSuccess,
crit: isCrit,
fumble: isFumble,
});
setAttrs(output, {silent: true});
});
});
} else if (trigger === 'seppuku-button') {
console.log(`Change detected: trigger:${trigger}`);
startRoll(roll_string, (roll) => {
const result = roll.results.roll.result;
const DR = 12;
const isSuccess = result >= DR ? 1 : 0;
finishRoll(roll.rollId, {
dr_final: DR,
success: isSuccess,
});
output.seppuku_status = isSuccess === 1 ? 1 : 0;
setAttrs(output, {silent: true});
});
} else if (trigger === 'seppuku2-button') {
console.log(`Change detected: trigger:${trigger}`);
startRoll(roll_string, (roll) => {
console.log(roll);
const result = roll.results.roll.result;
const DR = 14;
const isSuccess = result >= DR ? 1 : 0;
finishRoll(roll.rollId, {
dr_final: DR,
success: isSuccess,
});
});
} else if (trigger === 'seppukudamage-button') {
console.log(`Change detected: trigger:${trigger}`);
startRoll(roll_string, (roll) => {
console.log(roll);
const result = roll.results.roll.result;
finishRoll(roll.rollId);
output.hp = hp - result;
setAttrs(output, {silent: true});
});
} else if (trigger === 'seppukuhonour-button') {
console.log(`Change detected: trigger:${trigger}`);
startRoll(roll_string, (roll2) => {
console.log(roll2);
const result = roll2.results.roll2.result;
finishRoll(roll2.rollId);
// first death?
output.hp = resurrection === 0 ? hpMax : hp;
output.honour = Math.min(honour + result, 10);
output.resurrection = 1;
setAttrs(output);
});
} else if (trigger === 'seppukuhonourhalf-button') {
console.log(`Change detected: trigger:${trigger}`);
startRoll(roll_string, (roll2) => {
console.log(roll2);
const result = roll2.results.roll2.result;
finishRoll(roll2.rollId);
// first death?
output.hp = resurrection === 0 ? hpMax : hp;
output.honour = Math.min(honour + result, 10);
output.resurrection = 1;
setAttrs(output);
});
} else if (trigger === 'debilitating-button') {
console.log(`Change detected: trigger:${trigger}`);
startRoll(roll_string, (roll) => {
console.log(roll);
// const result = roll.results.roll.result;
finishRoll(roll.rollId);
});
} else if (trigger === 'dr_test-button') {
console.log(`Change detected: trigger:${trigger}`);
startRoll(dr_string12, (dr_prompt) => {
const baseDR = dr_prompt.results.answer.result;
const DR = baseDR;
console.log(`Change detected: dr:${DR}`);
startRoll(roll_string, (roll) => {
// console.log(roll);
const d20Roll = roll.results.roll.dice[0];
const result = roll.results.roll.result;
const isCrit = d20Roll === 20 ? 1 : 0;
const isFumble = d20Roll === 1 ? 1 : 0;
const isSuccess = result >= DR ? 1 : 0;
finishRoll(roll.rollId, {
//'name of key': 'computed value'
dr_base: baseDR,
dr_final: DR,
success: isSuccess,
crit: isCrit,
fumble: isFumble,
});
setAttrs(output, {silent: true});
});
});
} else if (trigger === 'vigor_test-button') {
console.log(`Change detected: trigger:${trigger}`);
startRoll(dr_string12, (dr_prompt) => {
const baseDR = dr_prompt.results.answer.result;
const DR = baseDR;
console.log(`Change detected: dr:${DR}`);
startRoll(roll_string, (roll) => {
// console.log(roll);
const d20Roll = roll.results.roll.dice[0];
const result = roll.results.roll.result;
const isCrit = d20Roll === 20 ? 1 : 0;
const isFumble = d20Roll === 1 ? 1 : 0;
const isSuccess = result >= DR ? 1 : 0;
finishRoll(roll.rollId, {
//'name of key': 'computed value'
dr_base: baseDR,
dr_final: DR,
success: isSuccess,
crit: isCrit,
fumble: isFumble,
});
setAttrs(output, {silent: true});
});
});
} else if (trigger === 'resilience_test-button') {
console.log(`Change detected: trigger:${trigger}`);
startRoll(dr_string12, (dr_prompt) => {
const baseDR = dr_prompt.results.answer.result;
const DR = baseDR;
console.log(`Change detected: dr:${DR}`);
startRoll(roll_string, (roll) => {
// console.log(roll);
const d20Roll = roll.results.roll.dice[0];
const result = roll.results.roll.result;
const isCrit = d20Roll === 20 ? 1 : 0;
const isFumble = d20Roll === 1 ? 1 : 0;
const isSuccess = result >= DR ? 1 : 0;
finishRoll(roll.rollId, {
//'name of key': 'computed value'
dr_base: baseDR,
dr_final: DR,
success: isSuccess,
crit: isCrit,
fumble: isFumble,
});
setAttrs(output, {silent: true});
});
});
} else if (trigger === 'haiku-button') {
console.log(`Change detected: trigger:${trigger}`);
startRoll(dr_string12, (dr_prompt) => {
const baseDR = dr_prompt.results.answer.result;
const DR = baseDR;
console.log(`Change detected: dr:${DR}`);
startRoll(roll_string, (roll) => {
// console.log(roll);
const result = roll.results.roll.result;
const isSuccess = result >= DR ? 1 : 0;
finishRoll(roll.rollId, {
dr_base: baseDR,
dr_final: DR,
success: isSuccess,
});
output.virtue = isSuccess === 1 ? Math.min(virtue + 1, virtueMax) : virtue;
setAttrs(output, {silent: true});
});
});
} else if (trigger === 'morale-button') {
console.log(`Change detected: trigger:${trigger}`);
startRoll(morale_string, (morale_prompt) => {
const baseMorale = morale_prompt.results.answer.result;
const morale = baseMorale;
console.log(`Change detected: dr:${morale}`);
startRoll(roll_string, (roll) => {
// console.log(roll);
const result = roll.results.roll.result;
const isSuccess = result >= morale ? 1 : 0;
finishRoll(roll.rollId, {
dr_base: baseMorale,
dr_final: morale,
success: isSuccess,
});
setAttrs(output, {silent: true});
});
});
} else if (trigger === 'reaction-button') {
console.log(`Change detected: trigger:${trigger}`);
startRoll(roll_string, (roll) => {
// console.log(roll);
const result = roll.results.roll.result;
finishRoll(roll.rollId);
setAttrs(output, {silent: true});
});
} else if (trigger === 'broken-button') {
console.log(`Change detected: trigger:${trigger}`);
brokenRoll(roll_string);
} else if (trigger === 'kamisvengeance-button') {
console.log(`Change detected: trigger:${trigger}`);
startRoll(roll_string, (roll) => {
// DO STUFF WITH THIS ROLL
console.log(roll);
// const result = roll.results.roll.result;
finishRoll(roll.rollId);
});
} else if (trigger === 'improve-button') {
console.log(`Change detected: trigger:${trigger}`);
startRoll(roll_string, (roll) => {
const hpResult = roll.results.roll.result;
const hpBonusResult = roll.results.roll2.result;
const swiftnessResult = roll.results.roll3.result;
const spiritResult = roll.results.roll4.result;
const vigorResult = roll.results.roll5.result;
const resilienceResult = roll.results.roll6.result;
let swiftness_success = 0;
let spirit_success = 0;
let vigor_success = 0;
let resilience_success = 0;
let swiftnessMOD = 0;
let spiritMOD = 0;
let vigorMOD = 0;
let resilienceMOD = 0;
if (swiftnessResult === 1 || swiftnessResult < swiftness) {
swiftness_success = 0;
swiftnessMOD = Math.max(-3, swiftness - 1);
} else if (swiftnessResult >= swiftness) {
swiftness_success = 1;
swiftnessMOD = Math.min(6, swiftness + 1);
}
if (spiritResult === 1 || spiritResult < spirit) {
spirit_success = 0;
spiritMOD = Math.max(-3, spirit - 1);
} else if (spiritResult >= spirit) {
spirit_success = 1;
spiritMOD = Math.min(6, spirit + 1);
}
if (vigorResult === 1 || vigorResult < vigor) {
vigor_success = 0;
vigorMOD = Math.max(-3, vigor - 1);
} else if (vigorResult >= vigor) {
vigor_success = 1;
vigorMOD = Math.min(6, vigor + 1);
}
if (resilienceResult === 1 || resilienceResult < resilience) {
resilience_success = 0;
resilienceMOD = Math.max(-3, resilience - 1);
} else if (resilienceResult >= resilience) {
resilience_success = 1;
resilienceMOD = Math.min(6, resilience + 1);
}
finishRoll(roll.rollId, {
hp_success: hpResult >= hpMax ? 1 : 0,
swiftness_success: swiftness_success,
spirit_success: spirit_success,
vigor_success: vigor_success,
resilience_success: resilience_success,
});
output.hp_max = hpResult >= hpMax ? hpMax + hpBonusResult : hpMax;
output.swiftness = swiftnessMOD;
output.spirit = spiritMOD;
output.vigor = vigorMOD;
output.resilience = resilienceMOD;
setAttrs(output);
});
} else {
// NORMAL ROLL NO SPECIAL HANDLING NEEDED
console.log(`Normal roll - No special handling`);
startRoll(roll_string, (roll) => {
finishRoll(roll.rollId);
});
}
});
});
on(
'clicked:repeating_weapons:attack-button clicked:repeating_weapons:monsterdamage-button clicked:repeating_weapons:guard-button clicked:repeating_weapons:parry-button clicked:repeating_weapons:riposte-button clicked:repeating_texts:test-button',
(eventInfo) => {
const id = eventInfo.sourceAttribute.split('_')[2].toLowerCase();
console.log(eventInfo.triggerName);
// include non-rep attribute here
const fields = [
'armour_def_pen',
'armour_swift_pen',
'armour_tier',
'armour_damaged',
'armour_query',
'character_name_safe',
'dr_query_12',
'dr_query_14',
'duel',
'hp',
'resilience',
'spirit',
'swiftness',
'texts_per_day',
'vigor',
`repeating_weapons_${id}_type`,
`repeating_weapons_${id}_track_ammo`,
`repeating_weapons_${id}_ammo`,
`repeating_weapons_${id}_ammo_max`,
];
getAttrs(fields, (v) => {
const output = {};
const character_name = v.character_name_safe;
const weaponTypeRanged = v[`repeating_weapons_${id}_type`] === '@{spirit}' ? 1 : 0;
const trackAmmo = +v[`repeating_weapons_${id}_track_ammo`];
const ammo = +v[`repeating_weapons_${id}_ammo`];
const ammoMax = +v[`repeating_weapons_${id}_ammo_max`];
console.log(`Change detected: weaponTypeRanged:${weaponTypeRanged} trackAmmo:${trackAmmo} ammo:${ammo}/${ammoMax}`);
// repeating CRP rolls
const repeatingRolls = {
[`repeating_texts_${id}_test-button`]: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{wield-text} - @{repeating_texts_${id}_name}}} {{roll_texts=[[0]]}} {{roll=[[ 1d20 + @{spirit} @{spirit_roll_label} + @{spirit_mod} [mod] ]]}} {{texts_hp_note=[[1d2]]}} {{texts_kamis_note=[^{roll-kamis-vengeance}](\`&#64;{${character_name}|kamisvengeance})}} {{description=**@{repeating_texts_${id}_name}** - @{repeating_texts_${id}_description}}} {{dr_final=[[0]]}} {{dr_base=[[0]]}} {{success=[[0]]}} {{crit=[[0]]}} {{fumble=[[0]]}}`,
[`repeating_weapons_${id}_attack-button`]: `&{template:ronin} {{heading=@{character_name}}} {{subheading=@{repeating_weapons_${id}_type_label} ^{attack} - @{repeating_weapons_${id}_name}}} {{roll_attack=[[0]]}} {{roll=[[ 1d20 + @{repeating_weapons_${id}_type} [@{repeating_weapons_${id}_type_label_ability}] + @{repeating_weapons_${id}_type_mod} [mod] ]]}} {{damage=[[@{repeating_weapons_${id}_damage}]]}} {{damagePC=[^{roll-pc-damage}](\`&#64;{${character_name}|takedamage})}} {{attack_success_note=[[0]]}} {{attack_crit_note=[[0]]}} {{attack_fail_note=[[0]]}} {{attack_fumble_note=[[0]]}} {{attack_track_ammo=[[@{repeating_weapons_${id}_track_ammo}]]}} {{attack_ammo=[[@{repeating_weapons_${id}_ammo}]]^{portion-of} @{repeating_weapons_${id}_ammo|max} ^{remaining}}} {{dueling=[[@{duel}]]}} {{dr_final=[[0]]}} {{dr_base=[[0]]}} {{success=[[0]]}} {{crit=[[0]]}} {{fumble=[[0]]}}`,
[`repeating_weapons_${id}_monsterdamage-button`]: `&{template:ronin} {{heading=@{character_name}}} {{subheading=@{repeating_weapons_${id}_type_label} ^{attack} - @{repeating_weapons_${id}_name}}} {{roll=[[@{repeating_weapons_${id}_damage}]]}} {{roll_damage=[[0]]}} {{damage=[[0]]}} {{armour_worn=d@{armour_query}}} {{armour_reduction=[[ d@{armour_query} ]]}} {{damage_total=[[0]]}} {{attack_track_ammo=[[@{repeating_weapons_${id}_track_ammo}]]}} {{attack_ammo=[[@{repeating_weapons_${id}_ammo}]]^{portion-of} @{repeating_weapons_${id}_ammo|max} ^{remaining}}} {{description_center=^{reduce-hit-points-target}}}`,
[`repeating_weapons_${id}_parry-button`]: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{parry} - @{repeating_weapons_${id}_name}}} {{roll_parry=[[0]]}} {{roll=[[ 1d20 + @{resilience} @{resilience_roll_label} + @{resilience_mod} [mod] ]]}} {{damage=[[ @{repeating_weapons_${id}_damage} ]]}} {{damagePC=[^{roll-pc-damage}](\`&#64;{${character_name}|takedamage})}} {{parry_success_note=[[0]]}} {{parry_crit_note=[[0]]}} {{parry_fail_note=[[0]]}} {{parry_fumble_note=[[0]]}} {{dr_final=[[0]]}} {{dr_base=[[0]]}} {{success=[[0]]}} {{crit=[[0]]}} {{fumble=[[0]]}}`,
[`repeating_weapons_${id}_guard-button`]: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{guard} - @{repeating_weapons_${id}_name}}} {{roll_guard=[[0]]}} {{roll=[[ 1d20 + @{swiftness} @{swiftness_roll_label} + @{swiftness_mod} [mod] ]]}} {{damage=[[@{repeating_weapons_${id}_damage}]]}} {{damagePC=[^{roll-pc-damage}](\`&#64;{${character_name}|takedamage})}} {{damagePChalf=[^{roll-half-pc-damage}](\`&#64;{${character_name}|takedamage})}} {{guard_crit_note=[[0]]}} {{guard_success_note=[[0]]}} {{guard_fail_note=[[0]]}} {{guard_fumble_note=[[0]]}} {{dueling=[[@{duel}]]}} {{dr_final=[[0]]}} {{dr_base=[[0]]}} {{success=[[0]]}} {{crit=[[0]]}} {{fumble=[[0]]}}`,
[`repeating_weapons_${id}_riposte-button`]: `&{template:ronin} {{heading=@{character_name}}} {{subheading=^{riposte} - @{repeating_weapons_${id}_name}}} {{roll_riposte=[[0]]}} {{roll=[[ 1d20 + @{resilience} @{resilience_roll_label} + @{resilience_mod} [mod] ]]}} {{damage=[[@{repeating_weapons_${id}_damage}]]}} {{damagePC=[^{roll-pc-damage}](\`&#64;{${character_name}|takedamage})}} {{riposte_crit_note=[[0]]}} {{riposte_success_note=[[0]]}} {{riposte_fail_note=[[0]]}} {{riposte_fumble_note=[[0]]}} {{dueling=[[@{duel}]]}} {{dr_final=[[0]]}} {{dr_base=[[0]]}} {{success=[[0]]}} {{crit=[[0]]}} {{fumble=[[0]]}}`,
};
// which button was pressed?
const trigger = eventInfo.triggerName.replace('clicked:', '');
const roll_string = repeatingRolls[trigger];
const dr_string12 = `!&{template:ronin}{{answer=![[${v.dr_query_12}]]}}`;
const dr_string14 = `!&{template:ronin}{{answer=![[${v.dr_query_14}]]}}`;
const textsPerDay = +v.texts_per_day || 0;
const currentHP = +v.hp || 0;
const isDuel = v.duel || 0;
// process each button's roll
if (trigger.includes('test-button')) {
console.log(`Change detected: trigger:${trigger}`);
startRoll(dr_string12, (dr_prompt) => {
const baseDR = dr_prompt.results.answer.result;
const DR = baseDR;
startRoll(roll_string, (roll) => {
// console.log(roll);
const d20Roll = roll.results.roll.dice[0];
const result = roll.results.roll.result;
const isFumble = d20Roll === 1 ? 1 : 0;
const isSuccess = result >= DR ? 1 : 0;
const failedHP = roll.results.texts_hp_note.result;
output.texts_per_day = Math.max(0, textsPerDay - 1);
output.hp = result >= DR ? currentHP : currentHP - failedHP; // allow negative HP
finishRoll(roll.rollId, {
//'name of key': 'computed value'
dr_base: baseDR,
dr_final: DR,
success: isSuccess,
fumble: isFumble,
texts_hp_note: failedHP,
});
setAttrs(output);
});
});
} else if (trigger.includes('attack-button')) {
console.log(`Change detected: trigger:${trigger}`);
startRoll(dr_string12, (dr_prompt) => {
const baseDR = dr_prompt.results.answer.result;
const DR = baseDR;
startRoll(roll_string, (roll) => {
// console.log(roll);
const d20Roll = roll.results.roll.dice[0];
const result = roll.results.roll.result;
const isCrit = d20Roll === 20 ? 1 : 0;
const isFumble = d20Roll === 1 ? 1 : 0;
const isSuccess = result >= DR ? 1 : 0;
const damageRoll = roll.results.damage.result;
const critMult = isCrit === 1 ? 2 : 1;
const damageTotal = damageRoll * critMult;
finishRoll(roll.rollId, {
//'name of key': 'computed value'
dr_base: baseDR,
dr_final: DR,
success: isSuccess,
crit: isCrit,
fumble: isFumble,
damage: damageTotal,
attack_ammo: Math.max(0, weaponTypeRanged === 1 && trackAmmo === 1 ? ammo - 1 : ammo),
});
output[`repeating_weapons_${id}_broken_weapon`] = isFumble === 1 ? 1 : 0;
output[`repeating_weapons_${id}_ammo`] = Math.max(0, weaponTypeRanged === 1 && trackAmmo === 1 ? ammo - 1 : ammo);
setAttrs(output, {silent: true});
});
});
} else if (trigger.includes('monsterdamage-button')) {
console.log(`Change detected: trigger:${trigger}`);
startRoll(roll_string, (roll) => {
// console.log(roll);
const damageResult = roll.results.roll.result;
const armourResult = roll.results.armour_reduction.result;
const adjustedDamage = Math.max(damageResult - armourResult, 0);
finishRoll(roll.rollId, {
//'name of key': 'computed value'
damage: damageResult,
damage_total: adjustedDamage,
attack_ammo: Math.max(0, weaponTypeRanged === 1 && trackAmmo === 1 ? ammo - 1 : ammo),
});
output[`repeating_weapons_${id}_ammo`] = Math.max(0, weaponTypeRanged === 1 && trackAmmo === 1 ? ammo - 1 : ammo);
setAttrs(output, {silent: true});
});
} else if (trigger.includes('parry-button')) {
console.log(`Change detected: trigger:${trigger}`);
startRoll(dr_string14, (dr_prompt) => {
const baseDR = dr_prompt.results.answer.result;
const DR = baseDR;
startRoll(roll_string, (roll) => {
// console.log(roll);
const d20Roll = roll.results.roll.dice[0];
const result = roll.results.roll.result;
const isCrit = d20Roll === 20 ? 1 : 0;
const isFumble = d20Roll === 1 ? 1 : 0;
const isSuccess = result >= DR ? 1 : 0;
const damageRoll = roll.results.damage.result;
const critMult = isCrit === 1 ? 2 : 1;
const damageTotal = damageRoll * critMult;
finishRoll(roll.rollId, {
//'name of key': 'computed value'
dr_base: baseDR,
dr_final: DR,
success: isSuccess,
crit: isCrit,
fumble: isFumble,
damage: damageTotal,
});
// pass to damage roll
output.armour_tier_damage = isFumble === 1 ? 1 : 0;
output.damage_multiplier = isFumble === 1 ? 2 : 1;
if (isDuel === 1) {
output[`repeating_weapons_${id}_broken_weapon`] = isFumble === 1 ? 1 : 0;
}
setAttrs(output, {silent: true});
});
});
} else if (trigger.includes('guard-button')) {
console.log(`Change detected: trigger:${trigger}`);
startRoll(dr_string12, (dr_prompt) => {
const baseDR = dr_prompt.results.answer.result;
const DR = baseDR;
startRoll(roll_string, (roll) => {
// console.log(roll);
const d20Roll = roll.results.roll.dice[0];
const result = roll.results.roll.result;
const isCrit = d20Roll === 20 ? 1 : 0;
const isFumble = d20Roll === 1 ? 1 : 0;
const isSuccess = result >= DR ? 1 : 0;
const damageRoll = roll.results.damage.result;
const critMult = isCrit === 1 ? 2 : 1;
const damageTotal = damageRoll * critMult;
finishRoll(roll.rollId, {
//'name of key': 'computed value'
dr_base: baseDR,
dr_final: DR,
success: isSuccess,
crit: isCrit,
fumble: isFumble,
damage: damageTotal,
});
// pass to damage roll
output.damage_multiplier = isSuccess !== 1 ? 0.5 : 1;
output.armour_tier_damage = isFumble === 1 ? 1 : 0;
output[`repeating_weapons_${id}_broken_weapon`] = isFumble === 1 ? 1 : 0;
setAttrs(output, {silent: true});
});
});
} else if (trigger.includes('riposte-button')) {
console.log(`Change detected: trigger:${trigger}`);
startRoll(dr_string14, (dr_prompt) => {
const baseDR = dr_prompt.results.answer.result;
const DR = baseDR;
startRoll(roll_string, (roll) => {
// console.log(roll);
const d20Roll = roll.results.roll.dice[0];
const result = roll.results.roll.result;
const isCrit = d20Roll === 20 ? 1 : 0;
const isFumble = d20Roll === 1 ? 1 : 0;
const isSuccess = result >= DR ? 1 : 0;
let damageRoll = roll.results.damage.result;
// riposte does x2 on success
damageRoll = damageRoll * 2;
const critMult = isCrit === 1 ? 2 : 1;
const damageTotal = damageRoll * critMult;
finishRoll(roll.rollId, {
//'name of key': 'computed value'
dr_base: baseDR,
dr_final: DR,
success: isSuccess,
crit: isCrit,
fumble: isFumble,
damage: damageTotal,
});
output[`repeating_weapons_${id}_broken_weapon`] = isFumble === 1 ? 1 : 0;
output.armour_tier_damage = isFumble === 1 ? 1 : 0;
setAttrs(output, {silent: true});
});
});
} else {
// NORMAL ROLL NO SPECIAL HANDLING NEEDED
console.log(`Normal roll - No special handling`);
startRoll(roll_string, (roll) => {
finishRoll(roll.rollId);
});
}
});
},
);
on('change:armour_tier change:armour', (eventInfo) => {
getAttrs(['armour_tier', 'armour'], (v) => {
const output = {};
const armourTier = +v['armour_tier'];
let armourTierSwiftPen = 0;
let armourTierDefPen = 0;
if (armourTier === 4) {
armourTierSwiftPen = 2;
armourTierDefPen = 2;
}
if (armourTier === 6) {
armourTierSwiftPen = 4;
armourTierDefPen = 2;
}
// rules do not specify above tier 3
if (armourTier === 8) {
armourTierSwiftPen = 4;
armourTierDefPen = 2;
}
output.armour_swift_pen = armourTierSwiftPen;
output.armour_def_pen = armourTierDefPen;
console.log(`
armour_tier:${armourTier}
armour_swift_pen:${armourTierSwiftPen}
armour_def_pen:${armourTierDefPen}`);
setAttrs(output, {silent: true});
});
});
// equipment weight
on('change:repeating_equipment change:vigor', (eventInfo) => {
console.log(`Change detected: ${eventInfo.sourceAttribute}`);
getSectionIDs('repeating_equipment', (idArray) => {
const output = {};
const fields = [];
_.each(idArray, (id) => {
fields.push(section_attribute('equipment', id, 'name'));
fields.push(section_attribute('equipment', id, 'weight'));
});
getAttrs(['vigor', ...fields], (v) => {
const totalEquipmentWeight = [];
const vigor = +v.vigor || 0;
idArray.forEach((id) => {
name = v[section_attribute('equipment', id, 'name')];
if (name !== '') {
weight = +v[section_attribute('equipment', id, 'weight')] || 0;
} else {
weight = 0;
}
totalEquipmentWeight.push(weight);
});
output.carrying_capacity = vigor + 8;
output.load = totalEquipmentWeight.reduce((sum, weight) => sum + weight, 0);
setAttrs(output);
});
});
});
// set field warnings
const setWarning = (attr, flag) => {
const output = {};
output[`${attr}_warning`] = flag;
setAttrs(output);
};
// check for Broken
on('change:hp', (eventInfo) => {
getAttrs(['hp', 'hp_max', 'resurrection', 'ask_broken'], (v) => {
const output = {};
const roll_string =
'&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{broken}}} {{roll=^{roll-result} [[1d4]]}} {{roll2=[[1d4]]}} {{roll3=[[1d4]]}} {{roll4=[[1d6]]}} {{roll5=[[1d4]]}} {{roll6=[[1d4]]}} {{roll7=[[1d2]]}} {{roll_broken=[[0]]}}';
const HP = +v.hp || 0;
const hpMax = +v.hp_max || 0;
const resurrection = +v.resurrection || 0;
const askBroken = v.ask_broken;
if (HP > 0) {
// INJURED
console.log(`Change detected: INJURED`);
setWarning('hp', 0);
setWarning('broken', 0);
return;
} else if (resurrection === 1) {
// DEAD DEAD
console.log(`Change detected: DEAD DEAD`);
const roll_string = '&{template:ronin} {{heading=@{character_name}}} {{subheading}} {{roll_death=[[1]]}} {{roll=[[ @{honour} ]]}}';
startRoll(roll_string, (roll) => {
console.log(roll);
finishRoll(roll.rollId);
});
setWarning('hp', 1);
setWarning('broken', 0);
return;
} else if (HP < 0) {
// RESURRECTION go to Yomi
console.log(`Change detected: RESURRECTION go to Yomi`);
const roll_string = '&{template:ronin} {{heading=@{character_name}}} {{subheading}} {{roll_death=[[0]]}}';
startRoll(roll_string, (roll) => {
console.log(roll);
finishRoll(roll.rollId);
});
output.resurrection = 1;
output.hp = hpMax;
setWarning('hp', 1);
setWarning('broken', 0);
} else {
// ROLL BROKEN
console.log(`Change detected: BROKEN`);
brokenRoll(roll_string, HP, hpMax, resurrection, askBroken);
setWarning('hp', 1);
setWarning('broken', 1);
}
setAttrs(output, {silent: true});
});
});
const brokenRoll = (roll_string, HP, hpMax, resurrection, askBroken) => {
const output = {};
// Broken roll was pushed but HP is not 0
if (HP !== 0) {
console.log(`Change detected: HP is not at 0. PC is not Broken`);
startRoll(
'&{template:ronin} {{heading=@{character_name}}} {{subheading=^{rolls} ^{broken}}} {{description_center=^{hit-points-abbrv} = [[@{hp}]]%NEWLINE%^{not-broken}}}',
(roll) => {
console.log(roll);
finishRoll(roll.rollId);
},
);
return;
}
// QUERY
startRoll(`!{{template:default}}{{ask=![[${askBroken}]]}}`, (question) => {
const query = question.results.ask.result;
if (query) {
startRoll(roll_string, (roll) => {
console.log(roll);
const result = roll.results.roll.result;
const hpRecoveryRoll3 = roll.results.roll3.result || 0;
const subRoll = roll.results.roll4.result || 0;
const hpRecoveryRoll6 = roll.results.roll6.result || 0;
console.log(`Change detected: hpRecoveryRoll3 ${hpRecoveryRoll3} hpRecoveryRoll6 ${hpRecoveryRoll6}`);
// first time Dead?
if (result === 4 && resurrection === 0) {
output.resurrection = 1;
output.hp = hpMax;
}
finishRoll(roll.rollId);
if (result === 1) {
output.hp = hpRecoveryRoll3;
}
if (result === 2 && subRoll === 6) {
output.hp = hpRecoveryRoll6;
}
setAttrs(output);
});
} else {
console.log(`Change detected: DO NOT ROLL BROKEN`);
}
});
};
// warns for over-loaded
on('change:load', (eventInfo) => {
getAttrs(['load', 'carrying_capacity'], (v) => {
const load = +v.load;
const carryingCapacity = +v.carrying_capacity || 0;
const flag = load > carryingCapacity ? 1 : 0;
setWarning('load', flag);
});
});
// translation for queries
const translateWeaponType = () => {
getSectionIDs('repeating_weapons', (idArray) => {
const output = {};
const fields = [];
_.each(idArray, (id) => {
fields.push(section_attribute('weapons', id, 'type'));
});
getAttrs(fields, (v) => {
idArray.forEach((id) => {
const weaponType = v[section_attribute('weapons', id, 'type')];
const striking = getTranslationByKey('striking');
const ranged = getTranslationByKey('ranged');
output[section_attribute('weapons', id, 'type_label')] = weaponType.includes('vigor') ? striking : ranged;
output[section_attribute('weapons', id, 'type_label_ability')] = weaponType.includes('vigor') ? 'vigor' : 'spirit';
output[section_attribute('weapons', id, 'type_mod')] = weaponType.includes('vigor') ? '@{vigor_mod}' : '@{spirit_mod}';
output[section_attribute('weapons', id, 'show_ranged')] = weaponType.includes('vigor') ? 0 : 1;
});
setAttrs(output, {silent: true});
});
});
};
on('sheet:opened', function (eventInfo) {
setAttrs(
{
dr_query_12:
'?{' +
getTranslationByKey('difficulty-rating') +
'|' +
getTranslationByKey('difficulty-rating-abbrv-12') +
' ' +
getTranslationByKey('difficulty-rating-text-12') +
',12|' +
getTranslationByKey('difficulty-rating-abbrv-6') +
' ' +
getTranslationByKey('difficulty-rating-text-6') +
',6|' +
getTranslationByKey('difficulty-rating-abbrv-8') +
' ' +
getTranslationByKey('difficulty-rating-text-8') +
',8|' +
getTranslationByKey('difficulty-rating-abbrv-10') +
' ' +
getTranslationByKey('difficulty-rating-text-10') +
',10|' +
getTranslationByKey('difficulty-rating-abbrv-12') +
' ' +
getTranslationByKey('difficulty-rating-text-12') +
',12|' +
getTranslationByKey('difficulty-rating-abbrv-14') +
' ' +
getTranslationByKey('difficulty-rating-text-14') +
',14|' +
getTranslationByKey('difficulty-rating-abbrv-16') +
' ' +
getTranslationByKey('difficulty-rating-text-16') +
',16|' +
getTranslationByKey('difficulty-rating-abbrv-18') +
' ' +
getTranslationByKey('difficulty-rating-text-18') +
',18}',
dr_query_14:
'?{' +
getTranslationByKey('difficulty-rating') +
'|' +
getTranslationByKey('difficulty-rating-abbrv-14') +
' ' +
getTranslationByKey('difficulty-rating-text-14') +
',14|' +
getTranslationByKey('difficulty-rating-abbrv-6') +
' ' +
getTranslationByKey('difficulty-rating-text-6') +
',6|' +
getTranslationByKey('difficulty-rating-abbrv-8') +
' ' +
getTranslationByKey('difficulty-rating-text-8') +
',8|' +
getTranslationByKey('difficulty-rating-abbrv-10') +
' ' +
getTranslationByKey('difficulty-rating-text-10') +
',10|' +
getTranslationByKey('difficulty-rating-abbrv-12') +
' ' +
getTranslationByKey('difficulty-rating-text-12') +
',12|' +
getTranslationByKey('difficulty-rating-abbrv-14') +
' ' +
getTranslationByKey('difficulty-rating-text-14') +
',14|' +
getTranslationByKey('difficulty-rating-abbrv-16') +
' ' +
getTranslationByKey('difficulty-rating-text-16') +
',16|' +
getTranslationByKey('difficulty-rating-abbrv-18') +
' ' +
getTranslationByKey('difficulty-rating-text-18') +
',18}',
armour_query: '?{' + getTranslationByKey('enter-armour-tier') + '|0,0|-d2,2|-d4,4|-d6,6|-d8,8}',
morale_query: '?{' + getTranslationByKey('enter-morale-rating') + '|7}',
rest_query: '?{' + getTranslationByKey('short-long-rest') + '|' + getTranslationByKey('short-d4') + ',d4|' + getTranslationByKey('long-d6') + ',d6}',
dice_query: '?{' + getTranslationByKey('choose-dice') + '|d2|d4|d6|d8|d10|d12|d20}',
dice_query2: '?{' + getTranslationByKey('enter-dice-number') + '|1}d' + '?{' + getTranslationByKey('enter-dice-sides') + '|6}',
ask_broken: '?{' + getTranslationByKey('ask-broken') + '|' + getTranslationByKey('ask-yes') + ',1|' + getTranslationByKey('ask-no') + ',0|' + '}',
silent: true,
},
translateWeaponType(),
);
});
// sync weapon type selector
on('change:vigor change:spirit change:vigor_mod change:spirit_mod change:repeating_weapons:name change:repeating_weapons:type', (eventInfo) => {
translateWeaponType();
});
// Auto-generates a repeating row as a placeholder
// generate a unique ID 100 % of the time
const uniqueids = {};
const generateUniqueRowID = () => {
let generated = generateRowID();
while (uniqueids[generated] === true) {
// console.log(`generateUniqueRowID: ${generated} is not a unique ID, trying again.`);
generated = generateRowID();
}
uniqueids[generated] = true;
return generated;
};
on('sheet:opened', (eventInfo) => {
getSectionIDs('repeating_texts', (textsID) => {
getSectionIDs('repeating_weapons', (weaponID) => {
getSectionIDs('repeating_equipment', (equipmentID) => {
const output = {};
const textsRows = textsID.length;
const weaponRows = weaponID.length;
const equipmentRows = equipmentID.length;
if (textsRows === 0) {
const newrowid = generateUniqueRowID();
output[`repeating_texts_${newrowid}_text_value`] = 1;
}
while (weaponRows + Object.keys(output).filter((key) => key.includes('repeating_weapons')).length < 2) {
const newrowid = generateUniqueRowID();
output[`repeating_weapons_${newrowid}_weapon_value`] = 1;
}
while (equipmentRows + Object.keys(output).filter((key) => key.includes('repeating_equipment')).length < 3) {
const newrowid = generateUniqueRowID();
output[`repeating_equipment_${newrowid}_equipment_value`] = 1;
}
if (Object.keys(output).length > 0) {
setAttrs(output, {silent: true});
}
});
});
});
});
// resets placeholder attributes used by startRoll
on('sheet:opened', (eventInfo) => {
const output = {};
output.damage_multiplier = 1;
output.armour_tier_damage = 0;
setAttrs(output, {silent: true});
});
// replace double quotes for chat menu buttons
on('change:character_name sheet:opened', (eventInfo) => {
getAttrs(['character_name'], (v) => {
const output = {};
output.character_name_safe = v.character_name ? v.character_name.replace(/"/g, '&quot;') : '';
setAttrs(output, {silent: true});
});
});
</script>