mirror of
https://github.com/Nighthawk42/roll20-character-sheets.git
synced 2026-08-30 19:52:29 +00:00
606 lines
30 KiB
HTML
606 lines
30 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>Name: </span>
|
|
<input type="text" class="sheet-bottom-line" name="attr_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">Class</span>
|
|
<span class="sheet-info3">Level</span>
|
|
<span class="sheet-info3">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">Age</span>
|
|
<span class="sheet-info1">Sex</span>
|
|
<span class="sheet-info3">Current XP</span>
|
|
<span class="sheet-info3">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>Abilities</h3>
|
|
<div class="sheet-flex">
|
|
<div class="sheet-ability-column-value">
|
|
<span>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">Retainer Recruitment, Loyalty</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+@{ChaMod}+(?{Bonus|0})]]}}" name="roll_ChaCheck"></button>
|
|
</div>
|
|
</div>
|
|
<div class="sheet-flex">
|
|
<div class="sheet-ability-column-value">
|
|
<span>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">Hit Points,<br>Daily Travel Distance</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+@{ConMod}+(?{Bonus|0})]]}}" name="roll_ConCheck"></button>
|
|
</div>
|
|
</div>
|
|
<div class="sheet-flex">
|
|
<div class="sheet-ability-column-value">
|
|
<span>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">AC, Ranged AB, Initiative</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+@{DexMod}+(?{Bonus|0})]]}}" name="roll_DexCheck"></button>
|
|
</div>
|
|
</div>
|
|
<div class="sheet-flex">
|
|
<div class="sheet-ability-column-value">
|
|
<span>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">Saves vs Magic Effects, Languages</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+@{IntMod}+(?{Bonus|0})]]}}" name="roll_IntCheck"></button>
|
|
</div>
|
|
</div>
|
|
<div class="sheet-flex">
|
|
<div class="sheet-ability-column-value">
|
|
<span>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">Mêlée AB,<br>Open Doors</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+@{StrMod}+(?{Bonus|0})]]}}" name="roll_StrCheck"></button>
|
|
</div>
|
|
</div>
|
|
<div class="sheet-flex">
|
|
<div class="sheet-ability-column-value">
|
|
<span>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">Saves vs Non-Magic 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+@{WisMod}+(?{Bonus|0})]]}}" 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>Saving Throws</h3>
|
|
<div class="sheet-flex">
|
|
<div class="sheet-svblock">
|
|
<span class="sheet-svbtitle">Paralyze</span>
|
|
<input type="number" class="sheet-savingthrow" name="attr_Paralyze">
|
|
<span class="sheet-svnsubtext">Mobility Hazards (Petrification, Hold, Etc.)</span>
|
|
<button class="sheet-ability-button" type="roll" value="&{template:lotfp_check} {{name=Paralyze}} {{saveroll=[[1d20+(?{Bonus|0})]]}} {{target=[[@{Paralyze}]]}}" name="roll_ParalyzeCheck"></button>
|
|
</div>
|
|
<div class="sheet-svblock">
|
|
<span class="sheet-svbtitle">Poison</span>
|
|
<input type="number" class="sheet-savingthrow" name="attr_Poison">
|
|
<span class="sheet-svnsubtext">Instant Death/KO Situations</span>
|
|
<button class="sheet-ability-button" type="roll" value="&{template:lotfp_check} {{name=Poison}} {{saveroll=[[1d20+(?{Bonus|0})]]}} {{target=[[@{Poison}]]}}" name="roll_PoisonCheck"></button>
|
|
</div>
|
|
<div class="sheet-svblock">
|
|
<span class="sheet-svbtitle">Breath Weapon</span>
|
|
<input type="number" class="sheet-savingthrow" name="attr_Breath">
|
|
<span class="sheet-svnsubtext">Area<br>Effects</span>
|
|
<button class="sheet-ability-button" type="roll" value="&{template:lotfp_check} {{name=Breath Weapon}} {{saveroll=[[1d20+(?{Bonus|0})]]}} {{target=[[@{Breath}]]}}" name="roll_BreathCheck"></button>
|
|
</div>
|
|
<div class="sheet-svblock">
|
|
<span class="sheet-svbtitle">Magical Device</span>
|
|
<input type="number" class="sheet-savingthrow" name="attr_Device">
|
|
<span class="sheet-svnsubtext">Spell-Like Effects from Items</span>
|
|
<button class="sheet-ability-button" type="roll" value="&{template:lotfp_check} {{name=Magical Device}} {{saveroll=[[1d20+(?{Bonus|0})]]}} {{target=[[@{Device}]]}}" name="roll_DeviceCheck"></button>
|
|
</div>
|
|
<div class="sheet-svblock">
|
|
<span class="sheet-svbtitle">Magic</span>
|
|
<input type="number" class="sheet-savingthrow" name="attr_Magic">
|
|
<span class="sheet-svnsubtext">Spells or Innate Abilities</span>
|
|
<button class="sheet-ability-button" type="roll" value="&{template:lotfp_check} {{name=Magic}} {{saveroll=[[1d20+(?{Bonus|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">Base<br>AB</span>
|
|
<input type="number" class="sheet-savingthrow" name="attr_BaseAB" value="1">
|
|
</div>
|
|
<div class="sheet-svblock">
|
|
<span class="sheet-svbtitle">Mêlée<br>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">Ranged<br>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">Current<br>HP</span>
|
|
<input type="number" class="sheet-savingthrow sheet-hp" name="attr_HP">
|
|
</div>
|
|
<div class="sheet-svblock">
|
|
<span class="sheet-svbtitle">Max<br>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">Mêlée<br>AC</span>
|
|
<input type="number" class="sheet-savingthrow" name="attr_MeleeAC" value="12">
|
|
</div>
|
|
<div class="sheet-svblock">
|
|
<span class="sheet-svbtitle">Ranged<br>AC</span>
|
|
<input type="number" class="sheet-savingthrow" name="attr_RangedAC" value="12">
|
|
</div>
|
|
<div class="sheet-svblock">
|
|
<span class="sheet-svbtitle">W.Shield<br>AC</span>
|
|
<input type="number" class="sheet-savingthrow" name="attr_WShieldAC" value="12">
|
|
</div>
|
|
<div class="sheet-svblock">
|
|
<span class="sheet-svbtitle">Surpr.<br>AC</span>
|
|
<input type="number" class="sheet-savingthrow" name="attr_SurprisedAC" value="12">
|
|
</div>
|
|
<div class="sheet-svblock">
|
|
<span class="sheet-svbtitle">Encumb.</span>
|
|
<input type="number" class="sheet-savingthrow" name="attr_Encumbrance">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- WEAPONS -->
|
|
<div class="sheet-thick-border">
|
|
<h3>Weapons</h3>
|
|
<div class="sheet-rep-title sheet-flex-between">
|
|
<span class="sheet-weapon-name">Name</span>
|
|
<span class="sheet-weapon-type">Type</span>
|
|
<span class="sheet-attackbonus">AB</span>
|
|
<span class="sheet-damage">Damage</span>
|
|
<span class="sheet-damage">S Range</span>
|
|
<span class="sheet-damage">M Range</span>
|
|
<span class="sheet-damage">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}" selected>Mêlée</option>
|
|
<option value="@{RangedAB}">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=@{name}}} {{attackroll=[[1d20+@{attackbonus}+(?{Bonus|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>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>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">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>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>Filter:</div>
|
|
<label class="sheet-filter-button">
|
|
<input type="radio" name="attr_spells_filter" value="all" checked>
|
|
<span>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" placeholder="Name">
|
|
<select name="attr_spelltype" class="sheet-spell-type">
|
|
<option value="Magic-User" selected>Magic-User</option>
|
|
<option value="Cleric">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" placeholder="Duration">
|
|
<input type="text" name="attr_spellrange" class="sheet-bottom-line sheet-spell-range" placeholder="Range">
|
|
<div>
|
|
<span># 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=@{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" placeholder="Description"></textarea>
|
|
</div>
|
|
</fieldset>
|
|
</div>
|
|
|
|
<!-- RETAINERS -->
|
|
<div class="sheet-thick-border">
|
|
<h3>Retainers</h3>
|
|
<div class="sheet-rep-title sheet-flex-between">
|
|
<span class="sheet-retainer-name">Name</span>
|
|
<span class="sheet-retainer-position">Position</span>
|
|
<span class="sheet-retainer-classlevel">Class/Level</span>
|
|
<span class="sheet-retainer-hp">HP</span>
|
|
<span class="sheet-retainer-wage">Wage</span>
|
|
<span class="sheet-retainer-share">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>
|
|
{{#abilityroll}}
|
|
<tr><th>{{name}} check</th></tr>
|
|
<tr><td><span class="sheet-tcat">Roll: </span>{{abilityroll}}</td></tr>
|
|
{{/abilityroll}}
|
|
{{#attackroll}}
|
|
<tr><th>{{charactername}} attacks with {{name}}</th></tr>
|
|
<tr><td><span class="sheet-tcat">Attack Roll: </span>{{attackroll}}</td></tr>
|
|
<tr><td><span class="sheet-tcat">Damage: </span>{{damageroll}}</td></tr>
|
|
{{/attackroll}}
|
|
{{#skillroll}}
|
|
<tr><th>{{name}} check</th></tr>
|
|
<tr><td><span class="sheet-tcat">Roll: </span>{{skillroll}} <= {{target}} </td></tr>
|
|
{{#rollLess() skillroll target}}
|
|
<tr><td class="sheet-subheader" style="color:green;"><b>Success!</b></td></tr>
|
|
{{/rollLess() skillroll target}}
|
|
{{#rollTotal() skillroll target}}
|
|
<tr><td class="sheet-subheader" style="color:green;"><b>Success!</b></td></tr>
|
|
{{/rollTotal() skillroll target}}
|
|
{{#rollGreater() skillroll target}}
|
|
<tr><td class="sheet-subheader" style="color:red;"><b>Failure.</b></td></tr>
|
|
{{/rollGreater() skillroll target}}
|
|
{{/skillroll}}
|
|
{{#saveroll}}
|
|
<tr><th>{{name}} save</th></tr>
|
|
<tr><td><span class="sheet-tcat">Roll: </span>{{saveroll}} > {{target}}</td></tr>
|
|
{{#rollLess() saveroll target}}
|
|
<tr><td class="sheet-subheader" style="color:red;"><b>Failure.</b></td></tr>
|
|
{{/rollLess() saveroll target}}
|
|
{{#rollGreater() saveroll target}}
|
|
<tr><td class="sheet-subheader" style="color:green;"><b>Success!</b></td></tr>
|
|
{{/rollGreater() saveroll target}}
|
|
{{/saveroll}}
|
|
{{#spell}}
|
|
<tr><th>{{charactername}} casts {{name}}</th></tr>
|
|
<tr class="sheet-spellrow"><td><span class="sheet-tcat">Level: </span>{{type}} {{level}}</td></tr>
|
|
<tr class="sheet-spellrow"><td><span class="sheet-tcat">Duration: </span>{{duration}}</td></tr>
|
|
<tr class="sheet-spellrow"><td><span class="sheet-tcat">Range: </span>{{range}}</td></tr>
|
|
<tr class="sheet-spellrow"><td><span class="sheet-tcat">Description: </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'
|
|
];
|
|
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);
|
|
});
|
|
});
|
|
};
|
|
// 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
|
|
['Cha', 'Con', 'Dex', 'Int', 'Str', 'Wis'].forEach(ability => {
|
|
on(`sheet:opened change:${ability.toLowerCase()}`, () => {
|
|
getAttrs([ability.toLowerCase()], v => {
|
|
const value = parseInt(v[ability.toLowerCase()]) || 10,
|
|
setting = {};
|
|
if (value <= 3) setting[`${ability}Mod`] = -3;
|
|
else if (value <= 5) setting[`${ability}Mod`] = -2;
|
|
else if (value <= 8) setting[`${ability}Mod`] = -1;
|
|
else if (value <= 12) setting[`${ability}Mod`] = 0;
|
|
else if (value <= 15) setting[`${ability}Mod`] = 1;
|
|
else if (value <= 17) setting[`${ability}Mod`] = 2;
|
|
else setting[`${ability}Mod`] = 3;
|
|
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>
|