mirror of
https://github.com/Nighthawk42/roll20-character-sheets.git
synced 2026-08-30 11:42:29 +00:00
621 lines
32 KiB
HTML
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}} ≤ {{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}} ≤ {{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}} ≥ {{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>
|
|
|
|
|
|
|
|
|