661 lines
37 KiB
HTML
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 & 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 & 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> |