Files
roll20-character-sheets-tester/Lion & Dragon/LionDragon.html
T

661 lines
37 KiB
HTML

<input name="attr_template_start" type="hidden" value="&{template:lion_dragon} {{character_name=@{character_name}}} {{character_id=@{character_id}}}" title="@{template_start}"/>
<input name="attr_sheet_version" type="hidden" value="0" title="@{sheet_version}"/>
<main>
<input class="page-1-radio hidden" name="attr_page_control" type="radio" value="1" id="page-1-radio" checked="true" title="@{page_control}"/>
<input class="page-2-radio hidden" name="attr_page_control" type="radio" value="2" id="page-2-radio" title="@{page_control}"/>
<input class="page-all-radio page-2-radio page-1-radio hidden" name="attr_page_control" type="radio" value="all" id="page-all-radio" title="@{page_control}"/>
<section id="general">
<h1 class="sheet-head" data-i18n="Lion &amp; Dragon"></h1>
<label class="pseudo-button" for="page-1-radio" data-i18n="basics" id="page-1-label">
</label>
<label class="pseudo-button" for="page-2-radio" data-i18n="advanced" id="page-2-label">
</label>
<label class="pseudo-button" for="page-all-radio" data-i18n="all pages" id="page-all-label">
</label>
<div class="input-label under character-name">
<input name="attr_character_name" value="" type="text" title="@{character_name}"/><span data-i18n="character name"></span>
</div>
<div class="input-label under class">
<input name="attr_class" value="" type="text" title="@{class}"/><span data-i18n="class"></span>
</div>
<div class="input-label under level">
<input name="attr_level" value="" type="text" title="@{level}"/><span data-i18n="level"></span>
</div>
<div class="input-label under alignment">
<input name="attr_alignment" value="" type="text" title="@{alignment}"/><span data-i18n="alignment"></span>
</div>
<div class="input-label under social-class">
<input name="attr_social_class" value="" type="text" title="@{social_class}"/><span data-i18n="social class"></span>
</div>
<div class="input-label under background">
<input name="attr_background" value="" type="text" title="@{background}"/><span data-i18n="background"></span>
</div>
<div class="dual input-label experience under">
<input name="attr_experience" value="0" type="number" title="@{experience}"/><span class="slash h2">/</span>
<input name="attr_experience_max" value="0" type="number" title="@{experience_max}"/><span data-i18n="experience"></span>
</div>
<div class="saving-throw"><span class="h3" data-i18n="saving throw"></span>
<div class="input-label under">
<input class="ratio1-1 boxed" name="attr_saving_throw" value="16" type="number" title="@{saving_throw}"/><span data-i18n="base"></span>
</div>
<button class="d20" name="roll_saving_throw" type="roll" value="@{template_start}{{title=^{saving throw}}} {{roll=[[1d20]]}} {{dc=@{saving_throw}}}" title="%{saving_throw}">
</button>
</div>
<div class="headed-textarea languages">
<h3 data-i18n="languages">
</h3>
<textarea class="boxed" name="attr_languages" value="" data-i18n-placeholder="what languages do you speak and/or read" title="@{languages}"></textarea>
</div>
</section>
<section class="page" id="page-1">
<div id="ability-scores">
<div class="scores">
<div class="input-label over strength">
<input class="ratio1-1 boxed" name="attr_strength" value="10" type="number" title="@{strength}"/><span data-i18n="str"></span>
</div>
<input class="plus-control" name="attr_strength_mod" type="hidden" value="0" title="@{strength_mod}"/><span class="mod strength h3" name="attr_strength_mod" title="@{strength_mod}">0</span>
<button class="d20" name="roll_strength" type="roll" value="@{template_start} {{title=^{strength}}} {{roll=[[1d20+@{strength_mod}]]}}" title="%{strength}">
</button>
<div class="input-label over dexterity">
<input class="ratio1-1 boxed" name="attr_dexterity" value="10" type="number" title="@{dexterity}"/><span data-i18n="dex"></span>
</div>
<input class="plus-control" name="attr_dexterity_mod" type="hidden" value="0" title="@{dexterity_mod}"/><span class="mod dexterity h3" name="attr_dexterity_mod" title="@{dexterity_mod}">0</span>
<button class="d20" name="roll_dexterity" type="roll" value="@{template_start} {{title=^{dexterity}}} {{roll=[[1d20+@{dexterity_mod}]]}}" title="%{dexterity}">
</button>
<div class="input-label over constitution">
<input class="ratio1-1 boxed" name="attr_constitution" value="10" type="number" title="@{constitution}"/><span data-i18n="con"></span>
</div>
<input class="plus-control" name="attr_constitution_mod" type="hidden" value="0" title="@{constitution_mod}"/><span class="mod constitution h3" name="attr_constitution_mod" title="@{constitution_mod}">0</span>
<button class="d20" name="roll_constitution" type="roll" value="@{template_start} {{title=^{constitution}}} {{roll=[[1d20+@{constitution_mod}]]}}" title="%{constitution}">
</button>
<div class="input-label over intelligence">
<input class="ratio1-1 boxed" name="attr_intelligence" value="10" type="number" title="@{intelligence}"/><span data-i18n="int"></span>
</div>
<input class="plus-control" name="attr_intelligence_mod" type="hidden" value="0" title="@{intelligence_mod}"/><span class="mod intelligence h3" name="attr_intelligence_mod" title="@{intelligence_mod}">0</span>
<button class="d20" name="roll_intelligence" type="roll" value="@{template_start} {{title=^{intelligence}}} {{roll=[[1d20+@{intelligence_mod}]]}}" title="%{intelligence}">
</button>
<div class="input-label over wisdom">
<input class="ratio1-1 boxed" name="attr_wisdom" value="10" type="number" title="@{wisdom}"/><span data-i18n="wis"></span>
</div>
<input class="plus-control" name="attr_wisdom_mod" type="hidden" value="0" title="@{wisdom_mod}"/><span class="mod wisdom h3" name="attr_wisdom_mod" title="@{wisdom_mod}">0</span>
<button class="d20" name="roll_wisdom" type="roll" value="@{template_start} {{title=^{wisdom}}} {{roll=[[1d20+@{wisdom_mod}]]}}" title="%{wisdom}">
</button>
<div class="input-label over charisma">
<input class="ratio1-1 boxed" name="attr_charisma" value="10" type="number" title="@{charisma}"/><span data-i18n="cha"></span>
</div>
<input class="plus-control" name="attr_charisma_mod" type="hidden" value="0" title="@{charisma_mod}"/><span class="mod charisma h3" name="attr_charisma_mod" title="@{charisma_mod}">0</span>
<button class="d20" name="roll_charisma" type="roll" value="@{template_start} {{title=^{charisma}}} {{roll=[[1d20+@{charisma_mod}]]}}" title="%{charisma}">
</button>
</div>
<div class="derivatives">
<input class="boxed ratio1-1" name="attr_movement_restrictions" type="number" value="0" title="@{movement_restrictions}"/><span data-i18n="movement restrictions (Str)"></span>
<button class="d20" name="roll_movement_restrictions" type="roll" value="@{template_start} {{title=^{movement restrictions (Str)}}} {{roll=[[1d20+@{movement_restrictions}+@{strength_mod}]]}} {{dc=@{saving_throw}}}" title="%{movement_restrictions}">
</button>
<input class="boxed ratio1-1" name="attr_area_effects_&_reflexes" type="number" value="0" title="@{area_effects_&_reflexes}"/><span data-i18n="area effects &amp; reflexes (Dex)"></span>
<button class="d20" name="roll_area_effects_&_reflexes" type="roll" value="@{template_start} {{title=^{area effects & reflexes (Dex)}}} {{roll=[[1d20+@{area_effects_&_reflexes}+@{dexterity_mod}]]}} {{dc=@{saving_throw}}}" title="%{area_effects_&_reflexes}">
</button>
<input class="boxed ratio1-1" name="attr_poison_and_disease_and_instant_death" type="number" value="0" title="@{poison_and_disease_and_instant_death}"/><span data-i18n="poison and disease and instant death (Con)"></span>
<button class="d20" name="roll_poison_and_disease_and_instant_death" type="roll" value="@{template_start} {{title=^{poison and disease and instant death (Con)}}} {{roll=[[1d20+@{poison_and_disease_and_instant_death}+@{constitution_mod}]]}} {{dc=@{saving_throw}}}" title="%{poison_and_disease_and_instant_death}">
</button>
<input class="boxed ratio1-1" name="attr_mental_effects" type="number" value="0" title="@{mental_effects}"/><span data-i18n="mental effects (Int)"></span>
<button class="d20" name="roll_mental_effects" type="roll" value="@{template_start} {{title=^{mental effects (Int)}}} {{roll=[[1d20+@{mental_effects}+@{intelligence_mod}]]}} {{dc=@{saving_throw}}}" title="%{mental_effects}">
</button>
<input class="boxed ratio1-1" name="attr_magical_effects" type="number" value="0" title="@{magical_effects}"/><span data-i18n="magical effects (Wis)"></span>
<button class="d20" name="roll_magical_effects" type="roll" value="@{template_start} {{title=^{magical effects (Wis)}}} {{roll=[[1d20+@{magical_effects}+@{wisdom_mod}]]}} {{dc=@{saving_throw}}}" title="%{magical_effects}">
</button>
</div>
</div>
<div id="defenses">
<div class="input-label armor-class large">
<input class="circle ratio1-1 boxed" name="attr_armor_class" type="number" value="10" title="@{armor_class}"/><span data-i18n="armor class"></span>
</div>
<div class="input-label shielded large">
<input class="circle ratio1-1 boxed" name="attr_shielded_armor_class" type="number" value="10" title="@{shielded_armor_class}"/><span data-i18n="shielded"></span>
</div>
<div class="input-label armor under">
<input class="boxed" name="attr_armor" type="text" value="" title="@{armor}"/><span data-i18n="armor"></span>
</div>
<div class="input-label shield under">
<input class="boxed" name="attr_shield" type="text" value="" title="@{shield}"/><span data-i18n="shield"></span>
</div>
<div class="input-label hp under large">
<input class="boxed" name="attr_hp" type="number" value="0" title="@{hp}"/><span data-i18n="hp"></span>
</div>
<div class="input-label hp_max under large">
<input class="boxed" name="attr_hp_max" type="number" value="0" title="@{hp_max}"/><span data-i18n="hp_max"></span>
</div>
<div class="input-label initiative under large">
<input class="boxed" name="attr_initiative" type="number" value="0" title="@{initiative}"/><span data-i18n="initiative"></span>
</div>
<div class="input-label base-attack under large">
<input class="boxed" name="attr_base_attack" type="number" value="0" title="@{base_attack}"/><span data-i18n="base attack"></span>
</div>
<div class="headed-textarea injuries">
<h3 data-i18n="injuries">
</h3>
<textarea class="boxed injuries fixed" name="attr_injuries" title="@{injuries}"></textarea>
</div>
</div>
<div class="repeating-skills" id="skills">
<h3 data-i18n="skills"></h3>
<fieldset class="repeating_skills">
<input name="attr_name" type="text" value="" data-i18n-placeholder="skill name" title="@{repeating_skills_$X_name}"/>
<input class="boxed" name="attr_mod" type="number" value="" title="@{repeating_skills_$X_mod}"/>
<button name="roll_roll" value="@{template_start} {{title=@{name}}} {{roll=[[1d20+@{mod}]]}}" title="%{repeating_skills_$X_roll}" type="roll">
</button>
</fieldset>
</div>
<div class="repeating-benefits" id="benefits">
<h3 data-i18n="class benefits"></h3>
<fieldset class="repeating_benefits">
<input name="attr_name" type="text" value="" title="@{repeating_benefits_$X_name}" data-i18n-placeholder="benefit name"/>
</fieldset>
</div>
<div class="repeating-arms" id="arms">
<h3 data-i18n="arms"></h3>
<div class="repeat-columns">
<h4 data-i18n="weapon"></h4>
<h4 data-i18n="ability"></h4>
<h4 data-i18n="base"></h4>
<h4 data-i18n="misc"></h4>
<h4 data-i18n="damage"></h4>
<h4 data-i18n="ability"></h4>
<h4 data-i18n="misc"></h4>
<h4 data-i18n="range"></h4>
<h4 data-i18n="description"></h4>
</div>
<fieldset class="repeating_arms">
<input class="right" name="attr_name" type="text" value="" title="@{repeating_arms_$X_name}" data-i18n-placeholder="weapon name"/>
<select name="attr_type" title="@{repeating_arms_$X_type}">
<option value="0" data-i18n="none"></option>
<option value="@{strength_mod}" selected="true" data-i18n="melee"></option>
<option value="@{dexterity_mod}" data-i18n="ranged"></option>
<option value="@{constitution_mod}" data-i18n="constitution"></option>
<option value="@{intelligence_mod}" data-i18n="intelligence"></option>
<option value="@{wisdom_mod}" data-i18n="wisdom"></option>
<option value="@{charisma_mod}" data-i18n="charisma"></option>
</select>
<input class="plus-control" name="attr_base_mod" type="hidden" value="0" title="@{base_mod}"/><span class="h4" name="attr_base_mod" title="@{repeating_arms_$X_base_mod}">0</span>
<input name="attr_custom_mod" type="text" value="" title="@{repeating_arms_$X_custom_mod}" placeholder="0"/>
<input name="attr_damage" type="text" value="" data-i18n-placeholder="e.g. 1d8" title="@{repeating_arms_$X_damage}"/>
<select name="attr_damage_ability" title="@{repeating_arms_$X_damage_ability}">
<option value="0" data-i18n="none" selected="true"></option>
<option value="@{strength_mod}" data-i18n="strength"></option>
<option value="@{dexterity_mod}" data-i18n="dexterity"></option>
<option value="@{constitution_mod}" data-i18n="constitution"></option>
<option value="@{intelligence_mod}" data-i18n="intelligence"></option>
<option value="@{wisdom_mod}" data-i18n="wisdom"></option>
<option value="@{charisma_mod}" data-i18n="charisma"></option>
</select>
<input name="attr_damage_mod" type="text" value="" title="@{repeating_arms_$X_damage_mod}"/>
<input name="attr_range" type="text" value="" data-i18n-placeholder="S/M/L" title="@{repeating_arms_$X_range}"/>
<input name="attr_description" type="text" value="" title="@{repeating_arms_$X_description}"/>
<button name="roll_roll" value="@{template_start} {{title=@{name}}} {{roll=[[1d20+@{base_attack}[Base Attack]+@{type}[Ability]+[[0@{custom_mod}]][Custom Mod]]]}} {{damage=[[0@{damage}+@{damage_ability}[Ability]+[[0@{damage_mod}]][Custom Mod]]]}} {{range=@{range}}} {{description=@{description}}}" title="%{repeating_arms_$X_roll}" type="roll">
</button>
</fieldset>
</div>
<div class="repeating-equipment" id="equipment">
<h3 class="header" data-i18n="equipment"></h3>
<h4 class="label" data-i18n="encumbrance"></h4>
<input class="boxed" name="attr_encumbrance" type="number" value="0" readonly="readonly" title="@{encumbrance}"/>
<fieldset class="repeating_equipment">
<input name="attr_name" type="text" value="" data-i18n-placeholder="item name" title="@{repeating_equipment_$X_name}"/>
<input class="boxed" name="attr_weight" type="number" value="" title="@{repeating_equipment_$X_weight}"/>
</fieldset>
</div>
<div class="repeating-parry" id="defensive-combat">
<h3 data-i18n="defensive combat"></h3>
<div class="repeat-columns">
<h4 data-i18n="weapon"></h4>
<h4 data-i18n="ability"></h4>
<h4 data-i18n="base"></h4>
<h4 data-i18n="misc"></h4>
<h4 data-i18n="block"></h4>
<h4 data-i18n="ability"></h4>
<h4 data-i18n="misc"></h4>
</div>
<fieldset class="repeating_parry">
<input class="right" name="attr_name" type="text" value="" title="@{repeating_parry_$X_name}" data-i18n-placeholder="weapon name"/>
<select name="attr_type" title="@{repeating_parry_$X_type}">
<option value="0" data-i18n="none"></option>
<option value="2" data-i18n="shield"></option>
<option value="@{strength_mod}" selected="true" data-i18n="melee"></option>
<option value="@{dexterity_mod}" data-i18n="dexterity"></option>
<option value="@{constitution_mod}" data-i18n="constitution"></option>
<option value="@{intelligence_mod}" data-i18n="intelligence"></option>
<option value="@{wisdom_mod}" data-i18n="wisdom"></option>
<option value="@{charisma_mod}" data-i18n="charisma"></option>
</select>
<input class="plus-control" name="attr_base_mod" type="hidden" value="0" title="@{base_mod}"/><span class="h4" name="attr_base_mod" title="@{repeating_parry_$X_base_mod}">0</span>
<input name="attr_custom_mod" type="text" value="" title="@{repeating_parry_$X_custom_mod}" placeholder="0"/>
<input name="attr_block" type="text" value="" data-i18n-placeholder="e.g. 1d8" title="@{repeating_parry_$X_block}"/>
<select name="attr_block_ability" title="@{repeating_parry_$X_block_ability}">
<option value="0" data-i18n="none" selected="true"></option>
<option value="@{strength_mod}" data-i18n="strength"></option>
<option value="@{dexterity_mod}" data-i18n="dexterity"></option>
<option value="@{constitution_mod}" data-i18n="constitution"></option>
<option value="@{intelligence_mod}" data-i18n="intelligence"></option>
<option value="@{wisdom_mod}" data-i18n="wisdom"></option>
<option value="@{charisma_mod}" data-i18n="charisma"></option>
</select>
<input name="attr_block_mod" type="text" value="" title="@{repeating_parry_$X_block_mod}"/>
<button class="pictoscustom" name="roll_partial defense" value="@{template_start} {{title=@{name}}} {{roll=[[1d20+@{type}[Ability]+@{base_attack}[Base Attack]+[[0@{custom_mod}]][Custom Mod] ]]}} {{block=[[0@{block}+@{block_ability}[Ability]+[[0@{block_mod}]][Custom Mod] ]]}}" title="%{repeating_parry_$X_partial_defense}" type="roll">e
</button>
<button class="pictos3" name="roll_full defense" value="@{template_start} {{title=@{name}}} {{roll=[[1d20+@{type}[Ability]+@{base_attack}[Base Attack]+[[0@{custom_mod}]][Custom Mod]+4[Full Defense] ]]}} {{block=[[0@{block}+@{block_ability}[Ability]+[[0@{block_mod}]][Custom Mod] ]]}}" title="%{repeating_parry_$X_full_defense}" type="roll">b
</button>
</fieldset>
</div>
</section>
<section class="page" id="page-2">
<div class="repeating-miracles" id="miracles">
<h3 data-i18n="clerical miracles"></h3>
<fieldset class="repeating_miracles">
<input name="attr_name" type="text" value="" data-i18n-placeholder="name" title="@{repeating_miracles_$X_name}"/>
<input name="attr_custom_mod" type="number" value="" title="@{repeating_miracles_$X_custom_mod}" placeholder="0"/>
<input class="plus-control" name="attr_total_mod" type="hidden" value="0" title="@{total_mod}"/><span class="h4" name="attr_total_mod" title="@{repeating_miracles_$X_total_mod}">0</span>
<button name="roll_roll" value="@{template_start} {{title=@{name}}} {{roll=[[1d20+@{wisdom_mod}[wisdom mod]+[[0@{custom_mod}]][custom mod]]]}}" title="%{repeating_miracles_$X_roll}" type="roll">
</button>
</fieldset>
</div>
<div class="repeating-lores" id="lores">
<h3 data-i18n="magister lores"></h3>
<fieldset class="repeating_lores">
<input name="attr_name" type="text" value="" data-i18n-placeholder="name" title="@{repeating_lores_$X_name}"/>
<input name="attr_custom_mod" type="number" value="" title="@{repeating_lores_$X_custom_mod}" placeholder="0"/>
<input class="plus-control" name="attr_total_mod" type="hidden" value="0" title="@{total_mod}"/><span class="h4" name="attr_total_mod" title="@{repeating_lores_$X_total_mod}">0</span>
<button name="roll_roll" value="@{template_start} {{title=@{name}}} {{roll=[[1d20+@{intelligence_mod}[intelligence mod]+[[0@{custom_mod}]][custom mod]]]}}" title="%{repeating_lores_$X_roll}" type="roll">
</button>
</fieldset>
</div>
<div id="wealth">
<h3 data-i18n="wealth"></h3><span class="h4" data-i18n="l"></span>
<input name="attr_pounds" type="number" value="" title="@{pounds}"/><span class="h4" data-i18n="sh"></span>
<input name="attr_shillings" type="number" value="" title="@{shillings}"/><span class="h4" data-i18n="p"></span>
<input name="attr_pennies" type="number" value="" title="@{pennies}"/>
<div class="repeating-wealth" id="wealth-section">
<fieldset class="repeating_wealth">
<input name="attr_name" type="text" value="" data-i18n-placeholder="item name" title="@{repeating_wealth_$X_name}"/>
<input class="boxed ratio1-1" name="attr_quantity" type="number" value="0" title="@{repeating_wealth_$X_quantity}"/>
</fieldset>
</div>
</div>
<div class="headed-textarea" id="grimoires">
<h3 data-i18n="spells, grimoires, and artefacts">
</h3>
<textarea class="boxed" name="attr_grimoires" value="" data-i18n-placeholder="type your spells, grimoires, and artefacts here" title="@{grimoires}"></textarea>
</div>
<div class="headed-textarea" id="lineage">
<h3 data-i18n="family lineage">
</h3>
<textarea class="boxed" name="attr_lineage" value="" data-i18n-placeholder="what's your lineage?" title="@{lineage}"></textarea>
</div>
<div class="headed-textarea" id="retainers">
<h3 data-i18n="retainers & mounts">
</h3>
<textarea class="boxed" name="attr_retainers" value="" data-i18n-placeholder="what retainers do you have?" title="@{retainers}"></textarea>
</div>
<div class="headed-textarea" id="influence">
<h3 data-i18n="power & influence">
</h3>
<textarea class="boxed" name="attr_influence" value="" data-i18n-placeholder="what is your influence in the world?" title="@{influence}"></textarea>
</div>
<div class="headed-textarea" id="information">
<h3 data-i18n="other information">
</h3>
<textarea name="attr_information" value="" title="@{information}"></textarea>
</div>
</section>
</main>
<rolltemplate class="sheet-rolltemplate-lion_dragon">
<div class="sheet-header">{{#title}}
<h3 class="sheet-title">{{title}}</h3>{{/title}}{{#character_name}}{{#character_id}}
<h4 class="character_name">[{{character_name}}](http://journal.roll20.net/character/{{character_id}})</h4>{{/character_id}}{{^character_id}}
<h4 class="character_name">{{character_name}}</h4>{{/character_id}}{{/character_name}}
</div>{{#roll}}{{^dc}}
<div><span class="label" data-i18n="roll"></span>
<div class="sheet-roll">{{roll}}</div>
</div>{{/dc}}{{#dc}}
<div class="dc-compare">
<div class="sheet-roll">{{roll}}</div><span class="sheet-vs" data-i18n="vs"></span>
<div class="sheet-dc">{{dc}}</div>{{#^rollLess() roll dc}}<span class="dc-result">^{success}</span>{{/^rollLess() roll dc}}{{#rollLess() roll dc}}<span class="dc-result">^{failure}</span>{{/rollLess() roll dc}}
</div>{{/dc}}{{#is_attack}}{{#crit_roll}}{{#rollWasCrit() roll}}
<div class="sheet-crit_roll">{{crit_roll}}</div>{{#^rollLess() crit_roll 4}}<span>^{crit 1-3}</span>{{/^rollLess() crit_roll 4}}{{#^rollBetween() crit_roll 4 6}}<span>^{crit 4-6}</span>{{/^rollBetween() crit_roll 4 6}}{{#^rollBetween() crit_roll 7 9}}<span>^{crit 7-9}</span>{{/^rollBetween() crit_roll 7 9}}{{#^rollBetween() crit_roll 10 11}}<span>^{crit 10-11}</span>{{/^rollBetween() crit_roll 10 11}}{{#^rollTotal() crit_roll 12}}<span>^{crit 12}</span>{{/^rollTotal() crit_roll 12}}{{#^rollTotal() crit_roll 13}}<span>^{crit 13}</span>{{/^rollTotal() crit_roll 13}}{{#^rollTotal() crit_roll 14}}<span>^{crit 14}</span>{{/^rollTotal() crit_roll 14}}{{#^rollTotal() crit_roll 15}}<span>^{crit 15}</span>{{/^rollTotal() crit_roll 15}}{{#^rollTotal() crit_roll 16}}<span>^{crit 16}</span>{{/^rollTotal() crit_roll 16}}{{#^rollTotal() crit_roll 17}}<span>^{crit 17}</span>{{/^rollTotal() crit_roll 17}}{{#^rollTotal() crit_roll 18}}<span>^{crit 18}</span>{{/^rollTotal() crit_roll 18}}{{#^rollTotal() crit_roll 19}}<span>^{crit 19}</span>{{/^rollTotal() crit_roll 19}}{{#^rollTotal() crit_roll 20}}<span>^{crit 20}</span>{{/^rollTotal() crit_roll 20}}{{#^rollGreater() crit_roll 20}}<span>^{crit 21}</span>{{/^rollGreater() crit_roll 20}}{{/rollWasCrit() roll}}{{/crit_roll}}{{/is_attack}}{{/roll}}{{#range}}
<div class="sheet-range"><span class="sheet-label" data-i18n="range"></span>{{range}}</div>{{/range}}{{#damage}}
<div class="sheet-damage"><span class="sheet-label" data-i18n="damage"></span><span class="sheet-roll">{{damage}}</span></div>{{/damage}}{{#block}}
<div class="sheet-block"><span class="sheet-label" data-i18n="block"></span><span class="sheet-roll">{{block}}</span></div>{{/block}}{{#description}}
<div class="sheet-description">
<h5 data-i18n="description"></h5>{{description}}
</div>{{/description}}
</rolltemplate>
<script type="text/worker">/*jshint esversion: 11, laxcomma:true, eqeqeq:true*/
/*jshint -W014,-W084,-W030,-W033,-*/
//Sheet variables
const version = 0.1;
const toMonitor = ['strength','dexterity','constitution','intelligence','wisdom','charisma','base_attack'];
const baseGet = [...toMonitor,'strength_mod','dexterity_mod','constitution_mod','intelligence_mod','wisdom_mod','charisma_mod'];
const repeatMonitor = ['repeating_arms','repeating_miracles','repeating_lores','repeating_equipment:weight','repeating_parry'];
const repeating_section_details = [
/*TEMPLATE
{
section:'string',
fields:['string','string']
},
*/
{
section:'repeating_arms',
fields:['name','type','base_mod','custom_mod','damage','damage_ability','range','description']
},
{
section:'repeating_parry',
fields:['name','type','base_mod','custom_mod','block','block_mod','block_ability']
},
{
section:'repeating_miracles',
fields:['name','total_mod','custom_mod','description']
},
{
section:'repeating_lores',
fields:['name','total_mod','custom_mod','description']
},
{
section:'repeating_equipment',
fields:['weight']
},
];
//Async functions
const setActiveCharacterId = function(charId){
var oldAcid=getActiveCharacterId();
var ev = new CustomEvent("message");
ev.data={"id":"0", "type":"setActiveCharacter", "data":charId};
self.dispatchEvent(ev);
return oldAcid;
};
const _getAttrs = function (props){
var acid=getActiveCharacterId(); //save the current activeCharacterID in case it has changed when the promise runs
var prevAcid=null; //local variable defined here, because it needs to be shared across the promise callbacks defined below
return new Promise((resolve,reject)=>{
prevAcid=setActiveCharacterId(acid); //in case the activeCharacterId has changed, restore it to what we were expecting and save the current value to restore later
try{
getAttrs(props,(values)=>{ resolve(values); });
}
catch{ reject(); }
}).finally(()=>{
setActiveCharacterId(prevAcid); //restore activeCharcterId to what it was when the promise first ran
});
};
//use the same pattern for each of the following...
const _setAttrs = function (propObj, options){
var acid=getActiveCharacterId();
var prevAcid=null;
return new Promise((resolve,reject)=>{
prevAcid=setActiveCharacterId(acid);
try{
setAttrs(propObj,options,(values)=>{ resolve(values); });
}
catch{ reject(); }
}).finally(()=>{
setActiveCharacterId(prevAcid);
});
};
const _getSectionIDs = function(sectionName){
var acid=getActiveCharacterId();
var prevAcid=null;
return new Promise((resolve,reject)=>{
prevAcid=setActiveCharacterId(acid);
try{
getSectionIDs(sectionName,(values)=>{ resolve(values); });
}
catch{ reject(); }
}).finally(()=>{
setActiveCharacterId(prevAcid);
});
};
const _getSections = function(){
let queue = _.clone(repeating_section_details);
const worker = async (repeatAttrs=[],sections={})=>{
let detail = queue.shift();
sections[detail.section] = sections[detail.section] || {};
let IDs = await _getSectionIDs(detail.section);
sections[detail.section] = IDs;
let attrs = IDs.forEach((i)=>{
detail.fields.forEach((f)=>{
repeatAttrs.push(`${detail.section}_${i}_${f}`);
});
});
if(queue.length){
return worker(repeatAttrs,sections);
}else{
return [repeatAttrs,sections];
}
};
return worker();
};
//Utility Functions
const log = function(msg){
const sheetName = 'Lion & Dragon';
if(typeof msg === 'string'){
console.log(`%c${sheetName} log| ${msg}`,"background-color:#159ccf");
}else if(typeof msg === 'object'){
Object.keys(msg).forEach((m)=>{
if(typeof msg[m] === 'string'){
console.log(`%c${sheetName} log| ${m}: ${msg[m]}`,"background-color:#159ccf");
}else{
console.log(`%c${sheetName} log| ${typeof msg[m]} ${m}`,"background-color:#159ccf");
console.table(msg[m]);
}
});
}
};
const updateSheet = async function(){
let attributes = _getAttrs(['sheet_version',...baseGet]);
const setObj = {
sheet_version:version
};
log(`Sheet Update applied. Current Sheet Version ${version}`);
set(setObj);
}
const set = function(setObj,callback){
log({setObj});
return setAttrs(setObj,{silent:true},callback);
};
const expandRepeating = function(cascade,sections,attributes){
return _.keys(cascade).reduce((memo,key)=>{
if(/^repeating/.test(key)){
key.replace(/(repeating_[^_]+)_[^_]+_(.+)/,(match,section,field)=>{
_.each(sections[section],(id)=>{
let row = `${section}_${id}_${field}`;
memo[row]=_.clone(cascade[key]);
memo[row].affects = memo[row].affects.map((affected)=>{
return affected.replace(/(repeating_[^_]+_)[^_]+(.+)/,`$1${id}$2`);
});
memo[row].name = row;
if(memo[row].calculation && typeof memo[row].calculation === 'string'){
memo[row].calculation = memo[row].calculation.replace(/(@{repeating_[^_]+?_)[^_]+?(_.+?})/g,`$1${id}$2`);
}
});
});
}else{
memo[key] = _.clone(cascade[key]);
memo[key].affects = memo[key].affects.reduce((m,a)=>{
if(/^repeating/.test(a)){
a.replace(/(repeating_[^_]+?)_[^_]+?(_.+)/,(match,section,field)=>{
if(section === 'repeating_arms' && /_mod$/.test(key) && field==='_total_mod'){
sections[section].forEach((id)=>{
if(attributes[`${section}_${id}_type`]===`@{${key}}`){
m.push(`${section}_${id}${field}`);
log({m});
}
});
}else{
sections[section].forEach(id=>m.push(`${section}_${id}${field}`));
}
});
}else{
m.push(a);
}
return m;
},[])
}
return memo;
},{});
};
//Calculation Functions
const abilityMod = function(score){
let mod;
score = +score;
log({score});
if(score <= 3){
mod = -3;
}
else if(score <= 5){
mod = -2;
}
else if(score <= 8){
mod = -1;
}
else if(score <= 12){
mod = 0;
}
else if(score <= 15){
mod = 1;
}
else if(score <= 17){
mod = 2;
}else{
mod = 3;
}
log({mod});
return mod;
};
const sheetCalc = function(name,calculation,attributes,setObj){
let parsedCalc = calculation;
if(calculation === 'mod') return abilityMod(attributes[name.replace(/_mod/,'')]);
parsedCalc = attributeParse(parsedCalc,attributes);
parsedCalc = parsedCalc.replace(/floor|ceil|round|abs/g,'Math.$&').replace(/\[\[|\]\]|\[.*?\]|=/g,'');
let finalCalc;
try{
finalCalc = eval(parsedCalc);
}catch(err){
finalCalc = undefined;
}
return finalCalc;
};
const attributeParse = function(string,attributes){
log({string});
while(/@{[^}]+}/.test(string)){
log('attributeParse: Attribute call found');
string = string.replace(/@{([^}]+)}/g,(match,name)=>{
return attributes[name.toLowerCase()];
});
}
return string;
};
//converts a value to a number, it's default value, or 0
const value = function(val,def){
return (+val||def||0);
};
//Calculates total encumbrance
const totalEncumbrance = function(statObj,attributes,sections){
log('Calculating Encumbrance');
return sections.repeating_equipment.reduce((total,id)=>{
return total += value(attributes[`repeating_equipment_${id}_weight`]);
},0);
};
//Calculates total attack bonus
const attackBonus = function(statObj,attributes,sections){
return attributes.base_attack;
};
//Sheet Functions
const accessSheet = async function(event){
let [repeats,sections] = await _getSections();
const attributes = await _getAttrs([...baseGet,...repeats]);
log({sections,attributes});
const setObj = {}
const casc = expandRepeating(cascades,sections,attributes);
let trigger = casc[event.sourceAttribute];
log({event,trigger,casc});
let queue = [...trigger.affects];
log({queue});
while(queue.length){
let name = queue.shift();
let obj = casc[name];
log({obj,type:typeof obj.calculation});
let val = typeof obj.calculation === 'string' ? sheetCalc(obj.name,obj.calculation,attributes,setObj) : obj.calculation(obj,attributes,sections);
if(value(val) !== value(attributes[obj.name])){
setObj[obj.name] = value(val);
attributes[obj.name] = setObj[obj.name];
queue = [...queue,...obj.affects];
}
}
set(setObj);
};
const cascades = {
//Attributes
strength:{name:'strength',defaultValue:10,type:'number',affects:['strength_mod']},
dexterity:{name:'dexterity',defaultValue:10,type:'number',affects:['dexterity_mod']},
constitution:{name:'constitution',defaultValue:10,type:'number',affects:['constitution_mod']},
intelligence:{name:'intelligence',defaultValue:10,type:'number',affects:['intelligence_mod']},
wisdom:{name:'wisdom',defaultValue:10,type:'number',affects:['wisdom_mod']},
charisma:{name:'charisma',defaultValue:10,type:'number',affects:['charisma_mod']},
strength_mod:{name:'strength_mod',defaultValue:0,type:'number',calculation:'mod',affects:[]},
dexterity_mod:{name:'dexterity_mod',defaultValue:0,type:'number',calculation:'mod',affects:[]},
constitution_mod:{name:'constitution_mod',defaultValue:0,type:'number',calculation:'mod',affects:[]},
intelligence_mod:{name:'intelligence_mod',defaultValue:0,type:'number',calculation:'mod',affects:['repeating_lores_$X_total_mod']},
wisdom_mod:{name:'wisdom_mod',defaultValue:0,type:'number',calculation:'mod',affects:['repeating_miracles_$X_total_mod']},
charisma_mod:{name:'charisma_mod',defaultValue:0,type:'number',calculation:'mod',affects:[]},
//Equipment/Encumbrance
encumbrance:{name:'encumbrance',defaultValue:0,type:'number',affects:[],calculation:totalEncumbrance},
repeating_equipment_$X_weight:{name:'repeating_equipment_$X_weight',defaultValue:0,type:'number',affects:['encumbrance']},
//Base Attack/Arms/Def Combat
base_attack:{name:'base_attack',defaultValue:0,type:'number',affects:['repeating_arms_$X_base_mod','repeating_parry_$X_base_mod']},
repeating_arms_$X_name:{name:'repeating_arms_$X_name',defaultValue:0,type:'number',affects:['repeating_arms_$X_base_mod']},
repeating_arms_$X_type:{name:'repeating_arms_$X_type',defaultValue:0,type:'number',affects:['repeating_arms_$X_base_mod']},
repeating_arms_$X_base_mod:{name:'repeating_arms_$X_base_mod',defaultValue:0,type:'number',calculation:attackBonus,affects:[]},
repeating_arms_$X_custom_mod:{name:'repeating_arms_$X_custom_mod',defaultValue:0,type:'number',affects:['repeating_arms_$X_base_mod']},
repeating_arms_$X_damage:{name:'repeating_arms_$X_damage',defaultValue:0,type:'number',affects:['repeating_arms_$X_base_mod']},
repeating_arms_$X_damage_ability:{name:'repeating_arms_$X_damage_ability',defaultValue:0,type:'number',affects:['repeating_arms_$X_base_mod']},
repeating_arms_$X_range:{name:'repeating_arms_$X_range',defaultValue:0,type:'number',affects:['repeating_arms_$X_base_mod']},
repeating_arms_$X_description:{name:'repeating_arms_$X_description',defaultValue:0,type:'number',affects:['repeating_arms_$X_base_mod']},
repeating_parry_$X_name:{name:'repeating_parry_$X_name',defaultValue:0,type:'number',affects:['repeating_parry_$X_base_mod']},
repeating_parry_$X_type:{name:'repeating_parry_$X_type',defaultValue:0,type:'number',affects:['repeating_parry_$X_base_mod']},
repeating_parry_$X_base_mod:{name:'repeating_parry_$X_base_mod',defaultValue:0,type:'number',calculation:attackBonus,affects:[]},
repeating_parry_$X_custom_mod:{name:'repeating_parry_$X_custom_mod',defaultValue:0,type:'number',affects:['repeating_parry_$X_base_mod']},
repeating_parry_$X_block:{name:'repeating_parry_$X_damage',defaultValue:0,type:'number',affects:['repeating_parry_$X_base_mod']},
repeating_parry_$X_block_ability:{name:'repeating_parry_$X_block_ability',defaultValue:0,type:'number',affects:['repeating_parry_$X_base_mod']},
//Miracles
repeating_miracles_$X_name:{name:'repeating_miracles_$X_name',defaultValue:0,type:'number',affects:['repeating_miracles_$X_total_mod']},
repeating_miracles_$X_custom_mod:{name:'repeating_miracles_$X_custom_mod',defaultValue:0,type:'number',affects:['repeating_miracles_$X_total_mod']},
repeating_miracles_$X_total_mod:{name:'repeating_miracles_$X_total_mod',defaultValue:0,type:'number',calculation:'@{repeating_miracles_$X_custom_mod}+@{wisdom_mod}',affects:[]},
//Lores
repeating_lores_$X_name:{name:'repeating_lores_$X_name',defaultValue:0,type:'number',affects:['repeating_lores_$X_total_mod']},
repeating_lores_$X_custom_mod:{name:'repeating_lores_$X_custom_mod',defaultValue:0,type:'number',affects:['repeating_lores_$X_total_mod']},
repeating_lores_$X_total_mod:{name:'repeating_lores_$X_total_mod',defaultValue:0,type:'number',calculation:'@{repeating_lores_$X_custom_mod}+@{intelligence_mod}',affects:[]},
};
//Listeners
on('sheet:opened',updateSheet);
[...baseGet,...repeatMonitor].forEach(g =>
on(`change:${g}`,accessSheet)
);
log('Sheet Started');
</script>