Files
roll20-character-sheets/Lotfp/Lotfp.html
T
2024-06-03 13:15:14 -04:00

621 lines
32 KiB
HTML

<div class="sheet-flex-between">
<div class="sheet-col-left sheet-noborder">
<!-- LOGO -->
<img src="http://i.imgur.com/uwl3LKE.jpg" class="sheet-logo">
</div>
<div class="sheet-col-right sheet-noborder">
<!-- Header Content -->
<div class="sheet-info-name sheet-info-margin">
<span><span data-i18n="name"></span>: </span>
<input type="text" class="sheet-bottom-line" name="attr_character_name">
</div>
<div class="sheet-info-row">
<input type="text" class="sheet-info3" name="attr_class">
<input type="text" class="sheet-info3" name="attr_level">
<input type="text" class="sheet-info3" name="attr_alignment">
<span class="sheet-info3" data-i18n="class"></span>
<span class="sheet-info3" data-i18n="level"></span>
<span class="sheet-info3" data-u18n="alignment"></span>
</div>
<div class="sheet-info-row">
<input type="text" class="sheet-info2" name="attr_age">
<input type="text" class="sheet-info1" name="attr_sex">
<input type="text" class="sheet-info3" name="attr_xp">
<input type="text" class="sheet-info3" name="attr_nextxp">
<span class="sheet-info2" data-i18n="age"></span>
<span class="sheet-info1" data-i18n="sex"></span>
<span class="sheet-info3" data-i18n="current_xp"></span>
<span class="sheet-info3" data-i18n="xp_for_next_level"></span>
</div>
</div>
</div>
<!-- ABILITIES, SAVES, ETC -->
<div class="sheet-flex-between">
<!-- ABILITIES-->
<div class="sheet-col-left sheet-thick-border">
<!-- ABILITIES -->
<h3 data-i18n="abilities"></h3>
<div class="sheet-flex">
<div class="sheet-ability-column-value">
<span data-i18n="charisma"></span>
<input type="number" class="sheet-ability-value" name="attr_cha" value="10">
</div>
<div class="sheet-ability-column-modifier sheet-flex-between">
<input type="number" class="sheet-ability-modifier" name="attr_ChaMod" value="0" readonly>
<span class="sheet-subtext" data-i18n="charisma_effects"></span>
</div>
<div class="sheet-ability-column-roll sheet-flex">
<button class="sheet-ability-button" type="roll" value="&{template:lotfp_check} {{name=^{charisma}}} {{abilityroll=[[1d20+(?{@{bonus_query}|0})]]}} {{target=[[@{Cha}]]}}" name="roll_ChaCheck"></button>
</div>
</div>
<div class="sheet-flex">
<div class="sheet-ability-column-value">
<span data-i18n="constitution"></span>
<input type="number" class="sheet-ability-value" name="attr_con" value="10">
</div>
<div class="sheet-ability-column-modifier sheet-flex-between">
<input type="number" class="sheet-ability-modifier" name="attr_ConMod" value="0" readonly>
<span class="sheet-subtext" data-i18n="constitution_effects"></span>
</div>
<div class="sheet-ability-column-roll sheet-flex">
<button class="sheet-ability-button" type="roll" value="&{template:lotfp_check} {{name=^{constitution}}} {{abilityroll=[[1d20+(?{@{bonus_query}|0})]]}} {{target=[[@{Con}]]}}" name="roll_ConCheck"></button>
</div>
</div>
<div class="sheet-flex">
<div class="sheet-ability-column-value">
<span data-i18n="dexterity"></span>
<input type="number" class="sheet-ability-value" name="attr_dex" value="10">
</div>
<div class="sheet-ability-column-modifier sheet-flex-between">
<input type="number" class="sheet-ability-modifier" name="attr_DexMod" value="0" readonly>
<span class="sheet-subtext" data-i18n="dexterity_effects"></span>
</div>
<div class="sheet-ability-column-roll sheet-flex">
<button class="sheet-ability-button" type="roll" value="&{template:lotfp_check} {{name=^{dexterity}}} {{abilityroll=[[1d20+(?{@{bonus_query}|0})]]}} {{target=[[@{Dex}]]}}" name="roll_DexCheck"></button>
</div>
</div>
<div class="sheet-flex">
<div class="sheet-ability-column-value">
<span data-i18n="intelligence"></span>
<input type="number" class="sheet-ability-value" name="attr_int" value="10">
</div>
<div class="sheet-ability-column-modifier sheet-flex-between">
<input type="number" class="sheet-ability-modifier" name="attr_IntMod" value="0" readonly>
<span class="sheet-subtext" data-i18n="intelligence_effects"></span>
</div>
<div class="sheet-ability-column-roll sheet-flex">
<button class="sheet-ability-button" type="roll" value="&{template:lotfp_check} {{name=^{intelligence}}} {{abilityroll=[[1d20+(?{@{bonus_query}|0})]]}} {{target=[[@{Int}]]}}" name="roll_IntCheck"></button>
</div>
</div>
<div class="sheet-flex">
<div class="sheet-ability-column-value">
<span data-i18n="strength"></span>
<input type="number" class="sheet-ability-value" name="attr_str" value="10">
</div>
<div class="sheet-ability-column-modifier sheet-flex-between">
<input type="number" class="sheet-ability-modifier" name="attr_StrMod" value="0" readonly>
<span class="sheet-subtext" data-i18n="strength_effects"></span>
</div>
<div class="sheet-ability-column-roll sheet-flex">
<button class="sheet-ability-button" type="roll" value="&{template:lotfp_check} {{name=^{strength}}} {{abilityroll=[[1d20+(?{@{bonus_query}|0})]]}} {{target=[[@{Str}]]}}" name="roll_StrCheck"></button>
</div>
</div>
<div class="sheet-flex">
<div class="sheet-ability-column-value">
<span data-i18n="wisdom"></span>
<input type="number" class="sheet-ability-value" name="attr_wis" value="10">
</div>
<div class="sheet-ability-column-modifier sheet-flex-between">
<input type="number" class="sheet-ability-modifier" name="attr_WisMod" value="0" readonly>
<span class="sheet-subtext" data-i18n="wisdom_effects"></span>
</div>
<div class="sheet-ability-column-roll sheet-flex">
<button class="sheet-ability-button" type="roll" value="&{template:lotfp_check} {{name=^{wisdom}}} {{abilityroll=[[1d20+(?{@{bonus_query}|0})]]}} {{target=[[@{Wis}]]}}" name="roll_WisCheck"></button>
</div>
</div>
</div>
<div class="sheet-col-right sheet-save-col sheet-flex-between">
<!-- SAVING THROWS -->
<div class="sheet-thick-border">
<!-- Saving Throws -->
<h3 data-i18n="saving_throws"></h3>
<div class="sheet-flex">
<div class="sheet-svblock">
<span class="sheet-svbtitle" data-i18n="paralyze"></span>
<input type="number" class="sheet-savingthrow" name="attr_Paralyze">
<span class="sheet-svnsubtext" data-i18n="paralyze_desc"></span>
<button class="sheet-ability-button" type="roll" value="&{template:lotfp_check} {{name=^{paralyze}}} {{saveroll=[[1d20+(?{@{bonus_query}|0})]]}} {{target=[[@{Paralyze}]]}}" name="roll_ParalyzeCheck"></button>
</div>
<div class="sheet-svblock">
<span class="sheet-svbtitle" data-i18n="poison"></span>
<input type="number" class="sheet-savingthrow" name="attr_Poison">
<span class="sheet-svnsubtext" data-i18n="poison_desc"></span>
<button class="sheet-ability-button" type="roll" value="&{template:lotfp_check} {{name=^{poison}}} {{saveroll=[[1d20+(?{@{bonus_query}|0})]]}} {{target=[[@{Poison}]]}}" name="roll_PoisonCheck"></button>
</div>
<div class="sheet-svblock">
<span class="sheet-svbtitle" data-i18n="breath_weapon"></span>
<input type="number" class="sheet-savingthrow" name="attr_Breath">
<span class="sheet-svnsubtext" data-i18n="breath_weapon_desc"></span>
<button class="sheet-ability-button" type="roll" value="&{template:lotfp_check} {{name=^{breath_weapon}}} {{saveroll=[[1d20+(?{@{bonus_query}|0})]]}} {{target=[[@{Breath}]]}}" name="roll_BreathCheck"></button>
</div>
<div class="sheet-svblock">
<span class="sheet-svbtitle" data-i18n="magical_device"></span>
<input type="number" class="sheet-savingthrow" name="attr_Device">
<span class="sheet-svnsubtext" data-i18n="magical_device_desc"></span>
<button class="sheet-ability-button" type="roll" value="&{template:lotfp_check} {{name=^{magical_device}}} {{saveroll=[[1d20+(?{@{bonus_query}|0})]]}} {{target=[[@{Device}]]}}" name="roll_DeviceCheck"></button>
</div>
<div class="sheet-svblock">
<span class="sheet-svbtitle" data-i18n="magic"></span>
<input type="number" class="sheet-savingthrow" name="attr_Magic">
<span class="sheet-svnsubtext" data-i18n="magic_desc"></span>
<button class="sheet-ability-button" type="roll" value="&{template:lotfp_check} {{name=^{magic}}} {{saveroll=[[1d20+(?{@{bonus_query}|0})]]}} {{target=[[@{Magic}]]}}" name="roll_MagicCheck"></button>
</div>
</div>
</div>
<!-- AB AND HP -->
<div class="sheet-thick-border sheet-flex">
<div class="sheet-svblock">
<span class="sheet-svbtitle" data-i18n="base_ab"></span>
<input type="number" class="sheet-savingthrow" name="attr_BaseAB" value="1">
</div>
<div class="sheet-svblock">
<span class="sheet-svbtitle" data-i18n="melee_ab"></span>
<input type="number" class="sheet-savingthrow" name="attr_MeleeAB" value="(@{BaseAB}+@{StrMod})" disabled="true">
</div>
<div class="sheet-svblock">
<span class="sheet-svbtitle" data-i18n="ranged_ab"></span>
<input type="number" class="sheet-savingthrow" name="attr_RangedAB" value="(@{BaseAB}+@{DexMod})" disabled="true">
</div>
<div class="sheet-svblock">
<span class="sheet-svbtitle" data-i18n="current_hp"></span>
<input type="number" class="sheet-savingthrow sheet-hp" name="attr_HP">
</div>
<div class="sheet-svblock">
<span class="sheet-svbtitle" data-i18n="max_hp"></span>
<input type="number" class="sheet-savingthrow sheet-hp" name="attr_HP_max">
</div>
</div>
<!-- AC -->
<div class="sheet-thick-border sheet-flex">
<div class="sheet-svblock">
<span class="sheet-svbtitle" data-i18n="melee_ac"></span>
<input type="number" class="sheet-savingthrow" name="attr_MeleeAC" value="12">
</div>
<div class="sheet-svblock">
<span class="sheet-svbtitle" data-i18n="ranged_ac"></span>
<input type="number" class="sheet-savingthrow" name="attr_RangedAC" value="12">
</div>
<div class="sheet-svblock">
<span class="sheet-svbtitle" data-i18n="w_shield_ac"></span>
<input type="number" class="sheet-savingthrow" name="attr_WShieldAC" value="12">
</div>
<div class="sheet-svblock">
<span class="sheet-svbtitle" data-i18n="surprise_ac"></span>
<input type="number" class="sheet-savingthrow" name="attr_SurprisedAC" value="12">
</div>
<div class="sheet-svblock">
<span class="sheet-svbtitle" data-i18n="encumb"></span>
<input type="number" class="sheet-savingthrow" name="attr_Encumbrance">
</div>
</div>
</div>
</div>
<!-- WEAPONS -->
<div class="sheet-thick-border">
<h3 data-i18n="weapons"></h3>
<div class="sheet-rep-title sheet-flex-between">
<span class="sheet-weapon-name" data-i18n="name"></span>
<span class="sheet-weapon-type" data-i18n="type"></span>
<span class="sheet-attackbonus" data-i18n="ab"></span>
<span class="sheet-damage" data-i18n="damage"></span>
<span class="sheet-damage" data-i18n="s_range"></span>
<span class="sheet-damage" data-i18n="m_range"></span>
<span class="sheet-damage" data-i18n="l_range"></span>
<span class="sheet-dummy-attack-button"></span>
</div>
<fieldset class="repeating_weapons">
<input type="text" name="attr_weaponname" class="sheet-bottom-line sheet-weapon-name">
<select name="attr_weapontype" class="sheet-weapon-type">
<option value="@{MeleeAB}" data-i18n="melee" selected></option>
<option value="@{RangedAB}" data-i18n="ranged"></option>
</select>
<input type="number" name="attr_attackbonus" value="@{weapontype}" class="sheet-bottom-line sheet-attackbonus" disabled="true">
<input type="text" name="attr_weapondamage" class="sheet-bottom-line sheet-damage">
<input type="text" name="attr_shortrange" class="sheet-bottom-line sheet-damage">
<input type="text" name="attr_mediumrange" class="sheet-bottom-line sheet-damage">
<input type="text" name="attr_longrange" class="sheet-bottom-line sheet-damage">
<button class="sheet-attack-button" type="roll" value="&{template:lotfp_check} {{name=@{weaponname}}} {{charactername=@{character_name}}} {{attackroll=[[1d20+@{attackbonus}+(?{@{bonus_query}|0})]]}} {{damageroll=[[@{weapondamage}]]}}" name="roll_Attack"></button>
</fieldset>
</div>
<!-- SKILLS AND EQUIPMENT -->
<div class="sheet-flex-between">
<div class="sheet-col-left sheet-thick-border">
<h3 data-i18n="skills"></h3>
<fieldset class="repeating_skills">
<input type="text" name="attr_skillname" class="sheet-bottom-line sheet-skillname">
<select name="attr_skillvalue" class="sheet-skillvalue">
<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>
<button class="sheet-skill-button" type="roll" value="&{template:lotfp_check} {{name=@{skillname}}} {{skillroll=[[1d6]]}} {{target=[[@{skillvalue}]]}}" name="roll_Skill"></button>
</fieldset>
</div>
<div class="sheet-col-right sheet-thick-border sheet-equipment">
<h3 data-i18n="equipment"></h3>
<fieldset class="repeating_equipment">
<input type="text" name="attr_itemname" class="sheet-bottom-line sheet-equipment-name">
<input type="number" name="attr_encumbrance" class="sheet-encumbrance sheet-bottom-line" value="0" min="0">
</fieldset>
<div class="sheet-top-line sheet-flex-between sheet-encumbrance-total">
<span class="sheet-equipment-name" data-i18n="total"></span>
<input type="number" name="attr_encumbrance_total" class="sheet-encumbrance" value="0" readonly>
</div>
</div>
</div>
<!-- SPELLS -->
<div class="sheet-thick-border sheet-spells">
<input type="checkbox" name="attr_spells_filter" class="sheet-spellfilter" value="all" checked>
<input type="checkbox" name="attr_spells_filter" class="sheet-spellfilter" value="1">
<input type="checkbox" name="attr_spells_filter" class="sheet-spellfilter" value="2">
<input type="checkbox" name="attr_spells_filter" class="sheet-spellfilter" value="3">
<input type="checkbox" name="attr_spells_filter" class="sheet-spellfilter" value="4">
<input type="checkbox" name="attr_spells_filter" class="sheet-spellfilter" value="5">
<input type="checkbox" name="attr_spells_filter" class="sheet-spellfilter" value="6">
<input type="checkbox" name="attr_spells_filter" class="sheet-spellfilter" value="7">
<input type="checkbox" name="attr_spells_filter" class="sheet-spellfilter" value="8">
<input type="checkbox" name="attr_spells_filter" class="sheet-spellfilter" value="9">
<h3 data-i18n="spells"></h3>
<div class="sheet-spells-per-level sheet-flex-between">
<div class="sheet-flex-between">
<span>1: </span>
<input type="number" name="attr_spells_l1" value="0">
<span> / </span>
<input type="number" name="attr_spells_l1_max" value="0">
</div>
<div class="sheet-flex-between">
<span>2: </span>
<input type="number" name="attr_spells_l2" value="0">
<span> / </span>
<input type="number" name="attr_spells_l2_max" value="0">
</div>
<div class="sheet-flex-between">
<span>3: </span>
<input type="number" name="attr_spells_l3" value="0">
<span> / </span>
<input type="number" name="attr_spells_l3_max" value="0">
</div>
<div class="sheet-flex-between">
<span>4: </span>
<input type="number" name="attr_spells_l4" value="0">
<span> / </span>
<input type="number" name="attr_spells_l4_max" value="0">
</div>
<div class="sheet-flex-between">
<span>5: </span>
<input type="number" name="attr_spells_l5" value="0">
<span> / </span>
<input type="number" name="attr_spells_l5_max" value="0">
</div>
<div class="sheet-flex-between">
<span>6: </span>
<input type="number" name="attr_spells_l6" value="0">
<span> / </span>
<input type="number" name="attr_spells_l6_max" value="0">
</div>
<div class="sheet-flex-between">
<span>7: </span>
<input type="number" name="attr_spells_l7" value="0">
<span> / </span>
<input type="number" name="attr_spells_l7_max" value="0">
</div>
<div class="sheet-flex-between">
<span>8: </span>
<input type="number" name="attr_spells_l8" value="0">
<span> / </span>
<input type="number" name="attr_spells_l8_max" value="0">
</div>
<div class="sheet-flex-between">
<span>9: </span>
<input type="number" name="attr_spells_l9" value="0">
<span> / </span>
<input type="number" name="attr_spells_l9_max" value="0">
</div>
</div>
<div class="sheet-spell-filters sheet-flex-between">
<div data-i18n="filter"></div>
<label class="sheet-filter-button">
<input type="radio" name="attr_spells_filter" value="all" checked>
<span data-i18n="all"></span>
</label>
<label class="sheet-filter-button">
<input type="radio" name="attr_spells_filter" value="1">
<span>1</span>
</label>
<label class="sheet-filter-button">
<input type="radio" name="attr_spells_filter" value="2">
<span>2</span>
</label>
<label class="sheet-filter-button">
<input type="radio" name="attr_spells_filter" value="3">
<span>3</span>
</label>
<label class="sheet-filter-button">
<input type="radio" name="attr_spells_filter" value="4">
<span>4</span>
</label>
<label class="sheet-filter-button">
<input type="radio" name="attr_spells_filter" value="5">
<span>5</span>
</label>
<label class="sheet-filter-button">
<input type="radio" name="attr_spells_filter" value="6">
<span>6</span>
</label>
<label class="sheet-filter-button">
<input type="radio" name="attr_spells_filter" value="7">
<span>7</span>
</label>
<label class="sheet-filter-button">
<input type="radio" name="attr_spells_filter" value="8">
<span>8</span>
</label>
<label class="sheet-filter-button">
<input type="radio" name="attr_spells_filter" value="9">
<span>9</span>
</label>
</div>
<fieldset class="repeating_spells">
<input type="checkbox" name="attr_spelllevel" class="sheet-hidden-spell-level" value="1">
<input type="checkbox" name="attr_spelllevel" class="sheet-hidden-spell-level" value="2">
<input type="checkbox" name="attr_spelllevel" class="sheet-hidden-spell-level" value="3">
<input type="checkbox" name="attr_spelllevel" class="sheet-hidden-spell-level" value="4">
<input type="checkbox" name="attr_spelllevel" class="sheet-hidden-spell-level" value="5">
<input type="checkbox" name="attr_spelllevel" class="sheet-hidden-spell-level" value="6">
<input type="checkbox" name="attr_spelllevel" class="sheet-hidden-spell-level" value="7">
<input type="checkbox" name="attr_spelllevel" class="sheet-hidden-spell-level" value="8">
<input type="checkbox" name="attr_spelllevel" class="sheet-hidden-spell-level" value="9">
<div class="sheet-spellcontainer">
<input type="text" name="attr_spellname" class="sheet-bottom-line sheet-spell-name" data-i18n-placeholder="name">
<select name="attr_spelltype" class="sheet-spell-type">
<option value="Magic-User" data-i18n="magic_user" selected></option>
<option value="Cleric" data-i18n="cleric"></option>
</select>
<input type="text" name="attr_spelllevel" class="sheet-bottom-line sheet-spell-level" placeholder="1">
<input type="text" name="attr_spellduration" class="sheet-bottom-line sheet-spell-duration" data-i18n-placeholder="duration">
<input type="text" name="attr_spellrange" class="sheet-bottom-line sheet-spell-range" data-i18n-placeholder="range">
<div>
<span data-i18n="num_prepared"></span>
<input type="number" name="attr_spellprepared" class="sheet-bottom-line sheet-spell-prepared" value="0" min="0">
</div>
<button class="sheet-attack-button" type="roll" value="&{template:lotfp_check} {{name=@{spellname}}} {{spell=1}} {{charactername=@{character_name}}} {{type=@{spelltype}}} {{level=@{spelllevel}}} {{duration=@{spellduration}}} {{range=@{spellrange}}} {{description=@{spelldescription}}}" name="roll_Cast"></button>
<textarea spellcheck="false" name="attr_spelldescription" class="sheet-spell-description" data-i18n-placeholder="description"></textarea>
</div>
</fieldset>
</div>
<!-- RETAINERS -->
<div class="sheet-thick-border">
<h3 data-i18n="retainers"></h3>
<div class="sheet-rep-title sheet-flex-between">
<span class="sheet-retainer-name" data-i18n="name"></span>
<span class="sheet-retainer-position" data-i18n="position"></span>
<span class="sheet-retainer-classlevel" data-i18n="class/level"></span>
<span class="sheet-retainer-hp" data-i18n="hp"></span>
<span class="sheet-retainer-wage" data-i18n="wage"></span>
<span class="sheet-retainer-share" data-i18n="share"></span>
</div>
<fieldset class="repeating_retainers">
<input type="text" name="attr_retainername" class="sheet-bottom-line sheet-retainer-name">
<input type="text" name="attr_retainerposition" class="sheet-bottom-line sheet-retainer-position">
<input type="text" name="attr_retainerclass" class="sheet-bottom-line sheet-retainer-classlevel">
<input type="text" name="attr_retainerhp" class="sheet-bottom-line sheet-retainer-hp">
<input type="text" name="attr_retainerwage" class="sheet-bottom-line sheet-retainer-wage">
<input type="text" name="attr_retainershare" class="sheet-bottom-line sheet-retainer-share">
</fieldset>
</div>
<!-- Templates -->
<rolltemplate class="sheet-rolltemplate-lotfp_check">
<table class="sheet-rt-table">
{{#abilityroll}}
<tr><th>{{name}} <span data-i18n="ability_check"></span></th></tr>
<tr><td><span class="sheet-tcat"><span data-i18n="roll"></span>: </span>{{abilityroll}} &le; {{target}} </td></tr>
{{#rollLess() abilityroll target}}
<tr><td class="sheet-subheader" style="color:green;"><b><span data-i18n="success"></span>!</b></td></tr>
{{/rollLess() abilityroll target}}
{{#rollTotal() abilityroll target}}
<tr><td class="sheet-subheader" style="color:green;"><b><span data-i18n="success"></span>!</b></td></tr>
{{/rollTotal() abilityroll target}}
{{#rollGreater() abilityroll target}}
<tr><td class="sheet-subheader" style="color:red;"><b><span data-i18n="failure"></span>.</b></td></tr>
{{/rollGreater() abilityroll target}}
{{/abilityroll}}
{{#attackroll}}
<tr><th>{{charactername}} <span data-i18n="attacks_with"></span> {{name}}</th></tr>
<tr><td><span class="sheet-tcat"><span data-i18n="attack_roll"></span>: </span>{{attackroll}}</td></tr>
<tr><td><span class="sheet-tcat"><span data-i18n="damage"></span>: </span>{{damageroll}}</td></tr>
{{/attackroll}}
{{#skillroll}}
<tr><th>{{name}} <span data-i18n="skill_check"></span></th></tr>
<tr><td><span class="sheet-tcat"><span data-i18n="roll"></span>: </span>{{skillroll}} &le; {{target}} </td></tr>
{{#rollLess() skillroll target}}
<tr><td class="sheet-subheader" style="color:green;"><b><span data-i18n="success"></span>!</b></td></tr>
{{/rollLess() skillroll target}}
{{#rollTotal() skillroll target}}
<tr><td class="sheet-subheader" style="color:green;"><b><span data-i18n="success"></span>!</b></td></tr>
{{/rollTotal() skillroll target}}
{{#rollGreater() skillroll target}}
<tr><td class="sheet-subheader" style="color:red;"><b><span data-i18n="failure"></span>.</b></td></tr>
{{/rollGreater() skillroll target}}
{{/skillroll}}
{{#saveroll}}
<tr><th>{{name}} <span data-i18n="saving_throw"></span></th></tr>
<tr><td><span class="sheet-tcat"><span data-i18n="roll"></span>: </span>{{saveroll}} &ge; {{target}}</td></tr>
{{#rollLess() saveroll target}}
<tr><td class="sheet-subheader" style="color:red;"><b><span data-i18n="failure"></span>.</b></td></tr>
{{/rollLess() saveroll target}}
{{#rollGreater() saveroll target}}
<tr><td class="sheet-subheader" style="color:green;"><b><span data-i18n="success"></span>!</b></td></tr>
{{/rollGreater() saveroll target}}
{{/saveroll}}
{{#spell}}
<tr><th>{{charactername}} <span data-i18n="casts"></span> {{name}}</th></tr>
<tr class="sheet-spellrow"><td><span class="sheet-tcat"><span data-i18n="level"></span>: </span>{{type}} {{level}}</td></tr>
<tr class="sheet-spellrow"><td><span class="sheet-tcat"><span data-i18n="duration"></span>: </span>{{duration}}</td></tr>
<tr class="sheet-spellrow"><td><span class="sheet-tcat"><span data-i18n="range"></span>: </span>{{range}}</td></tr>
<tr class="sheet-spellrow"><td><span class="sheet-tcat"><span data-i18n="description"></span>: </span>{{description}}</td></tr>
{{/spell}}
</table>
</rolltemplate>
<!-- Sheet workers -->
<script type="text/worker">
const skills = [
"architecture",
"bushcraft",
"climb",
"languages",
"search",
"sleight_of_hand",
"sneak_attack",
"stealth",
"tinker",
].map(getTranslationByKey);
const fillRepeatingSectionFromData = (sectionName, dataList) => {
getSectionIDs(`repeating_${sectionName}`, idList => {
const existingRowAttributes = idList.map(id => `repeating_${sectionName}_${id}_name`);
getAttrs(existingRowAttributes, v => {
const createdIDs = [],
setting = dataList.map(o => {
let rowID;
while (!rowID) {
let newID = generateRowID();
if (!createdIDs.includes(newID)) {
rowID = newID;
createdIDs.push(rowID);
}
}
return Object.keys(o).reduce((m, key) => {
m[`repeating_${sectionName}_${rowID}_${key}`] = String(o[key]);
return m;
}, {});
})
.reduce((m, o) => Object.assign(m, o), {});
setAttrs(setting);
});
});
};
on("sheet:opened", () => {
setAttrs({
bonus_query: getTranslationByKey("bonus")
});
});
// Spells prepared
on('change:repeating_spells remove:repeating_spells', () => {
"use strict";
getSectionIDs('repeating_spells', idArray => {
const attrs = [
...idArray.map(id => `repeating_spells_${id}_spelllevel`),
...idArray.map(id => `repeating_spells_${id}_spellprepared`)
];
getAttrs(attrs, v => {
const levels = ['1', '2', '3', '4', '5', '6', '7', '8', '9'],
spellsPrepared = levels.reduce((m, level) => {
m[`spells_l${level}`] = 0;
return m;
}, {});
idArray.forEach(id => {
if (levels.includes(v[`repeating_spells_${id}_spelllevel`])) {
spellsPrepared['spells_l' + v[`repeating_spells_${id}_spelllevel`]] +=
(parseInt(v[`repeating_spells_${id}_spellprepared`]) || 0);
}
});
setAttrs(spellsPrepared);
});
});
});
// Equipment counter
on('change:repeating_equipment remove:repeating_equipment', () => {
"use strict";
getSectionIDs('repeating_equipment', idArray => {
getAttrs(idArray.map(id => `repeating_equipment_${id}_encumbrance`), v => {
const total = Object.values(v).reduce((m, w) => (m + (parseInt(w) || 0)), 0);
setAttrs({
encumbrance_total: total
});
});
});
});
// Ability modifiers
const classMods = {Dwarf: "Con", Halfling: "Dex"};
['Cha', 'Con', 'Dex', 'Int', 'Str', 'Wis'].forEach(ability => {
on(`sheet:opened change:class change:${ability.toLowerCase()}`, () => {
getAttrs([ability.toLowerCase(), 'class'], v => {
const score = parseInt(v[ability.toLowerCase()]) || 10;
const race = v.class.trim();
const setting = {};
const statrank = [1,3,5,8,12,15,17,19].findIndex(rank => score <= rank);
setting[`${ability}Mod`] = (statrank === -1 ? 4 : statrank -4) + ((classMods[race] || '') === ability ? 1 : 0);
setAttrs(setting);
});
});
});
// Conversion
on('sheet:opened', () => {
const generateSkills = () => {
getSectionIDs('repeating_skills', idArray => {
const skillNames = idArray.map(id => `repeating_skills_${id}_skillname`);
getAttrs(skillNames, v => {
const existingSkills = Object.values(v).map(name => (name || '').toLowerCase()),
newSkills = skills.filter(s => !existingSkills.includes(s.toLowerCase())).map(n => ({
skillname: n
}));
fillRepeatingSectionFromData('skills', newSkills);
});
});
}
getAttrs(['version', 'MaxHP'], v => {
if (!v.version) {
if (v.MaxHP) {
setAttrs({
hp_max: v.MaxHP
});
}
getSectionIDs('repeating_wepons', idArray => {
const attrsToConvert = [
'weaponname', 'weapontype', 'weapondamage', 'shortrange', 'mediumrange', 'longrange'
];
const attrs = idArray.reduce((m, id) => {
return m.concat(attrsToConvert.map(name => `repeating_wepons_${id}_${name}`));
}, []);
getAttrs(attrs, v => {
const data = idArray.map(id => {
return attrsToConvert.reduce((m, name) => {
m[name] = v[`repeating_wepons_${id}_${name}`] || '';
return m;
}, {});
});
idArray.forEach(id => removeRepeatingRow(`repeating_wepons_${id}`));
fillRepeatingSectionFromData('weapons', data);
});
});
generateSkills();
}
if (v.version === '1') generateSkills();
setAttrs({
version: '2'
});
});
});
</script>