Files
roll20-character-sheets/Dragonslayer/dragonslayer.html
T
Todd-Antill 8398adafb7 Add dragonslayer.html for official Dragonslayer sheet
Initial commit of official Dragonslayer Classic Fantasy RPG HTML file.
2025-11-24 18:16:59 -06:00

1411 lines
64 KiB
HTML

<!-- ======================================= -->
<!-- Dragonslayer Sheet Toggle Button -->
<!-- ======================================= -->
<button type="action" name="act_toggleSheet" class="toggle-sheet-btn">Toggle Sheet</button>
<input type="hidden" class="sheet-mode-toggle" name="attr_sheetMode" value="pc" />
<div class="charsheet">
<input type="hidden" class="sheet-tabstoggle" name="attr_sheetTab" value="main" />
<!-- ======================================= -->
<!-- Dragonslayer Logo -->
<!-- ======================================= -->
<div class="sheet-logo-row">
<img alt="dragonslayerlogo.png"
src="https://raw.githubusercontent.com/Todd-Antill/dragonslayer_roll20/refs/heads/main/images/dragonslayerlogo.png">
</div>
<!-- ======================================= -->
<!-- Tab Buttons -->
<!-- ======================================= -->
<div class="sheet-tab-buttons">
<button type="action" name="act_main" class="sheet-button0">Main</button>
<button type="action" name="act_equipment" class="sheet-button1">Equipment</button>
<button type="action" name="act_abilities" class="sheet-button2">Abilities</button>
<button type="action" name="act_spells" class="sheet-button3">Spells</button>
<button type="action" name="act_wealth" class="sheet-button4">Wealth &amp; Treasure</button>
<button type="action" name="act_henchmen" class="sheet-button5">Henchmen &amp; Hirelings</button>
<button type="action" name="act_notes" class="sheet-button6">Notes</button>
</div>
<!-- ======================================= -->
<!-- Tab Content -->
<!-- ======================================= -->
<div class="sheet-tab-content">
<!-- ======================================= -->
<!-- Main Tab Content -->
<!-- ======================================= -->
<div class="sheet-main-tab">
<!-- ======================================= -->
<!-- Character Details -->
<!-- ======================================= -->
<div class="sheet-header-container">
<div class="sheet-header-row">
<div>
<input type="text" accept="race" name="attr_race">
<label for="attr_race">Race</label>
</div>
<div>
<input type="text" accept="class" name="attr_class">
<label for="attr_class">Class</label>
</div>
<div>
<input type="text" name="attr_level">
<label for="attr_level">Level</label>
</div>
<div>
<input type="text" name="attr_title">
<label for="attr_title">Title</label>
</div>
</div>
<div class="sheet-alignment-row">
<div>
<input type="text" name="attr_alignment">
<label for="attr_alignment">Alignment</label>
</div>
<div>
<input type="text" name="attr_deity">
<label for="attr_deity">Deity</label>
</div>
</div>
<div class="sheet-languages-row">
<div>
<input type="text" name="attr_languages">
<label for="attr_languages">Languages</label>
</div>
</div>
</div>
<!-- ======================================= -->
<!-- Character Info Row -->
<!-- ======================================= -->
<div class="sheet-pc-info-row">
<div class="sheet-pc-info-section">
<!-- ARMOR CLASS =========================== -->
<h3>ARMOR CLASS</h3>
<div class="armor-class-container">
<input type="text" name="attr_armor-class">
</div>
<div class="armor-description-container">
<div class="compendium-drop-target">
<input type="text" name="attr_armor1_name" accept="Armor" class="armor-description-input">
<label for="attr_armor1_name" class="armor-description-label_1">Armor</label>
<input type="text" name="attr_armor2_name" accept="Armor" class="armor-description-input">
<label for="attr_armor2_name" class="armor-description-label_2">Shield</label>
<input type="text" name="attr_armor_magic_name" accept="Item" class="armor-description-input">
<label for="attr_armor_magic_name" class="armor-description-label_2">Magic Item</label>
</div>
</div>
</div>
<div class="sheet-pc-info-section">
<!-- HIT POINTS =========================== -->
<h3>HIT POINTS</h3>
<div class="hp-container">
<label for="attr_current-hp" class="curr-hp-label">CURRENT</label>
<input type="text" name="attr_current-hp">
<label for="attr_max-hp" class="max-hp-label">MAX</label>
<input type="text" name="attr_max-hp">
</div>
<!-- MOVEMENT =========================== -->
<h3 class="movement-hdr"><div class="movement-hdr-small">MOVEMENT</div></h3>
<div class="movement-container">
<input type="text" name="attr_movement" class="move-input">
</div>
</div>
<div class="sheet-pc-info-section">
<!-- EXPERIENCE =========================== -->
<h3>EXPERIENCE</h3>
<div class="xp-container">
<div>
<input type="text" name="attr_experience">
<label for="attr_experience">Experience</label>
</div>
<div>
<input type="text" name="attr_xp-bonus">
<label for="attr_xp-bonus">XP Bonus</label>
</div>
</div>
<div class="xp-container-next-level">
<input type="text" name="attr_xp_next_level">
<label for="attr_xp-bonus">Next Level</label>
</div>
<!-- ATTACK BONUS =========================== -->
<h3 class="atk-bonus-hdr"><div class="atk-hdr-small">ATTACK BONUS</div></h3>
<div class="atk-bonus-container">
<input type="text" name="attr_attack-bonus">
</div>
</div>
</div>
<!-- ======================================= -->
<!-- Weapons Section -->
<!-- ======================================= -->
<div class="sheet-weapon-table">
<hr>
<!-- WEAPONS =========================== -->
<h3>WEAPONS</h3>
<hr>
<div class="weapon-row header-row">
<div class="cell-weapon">Weapon</div>
<div class="cell-type">Type</div>
<div class="cell-hitmod">Hit<br />Mod.</div>
<div class="cell-dmg">DMG</div>
<div class="cell-dmgmod">DMG<br />Mod.</div>
</div>
<fieldset class="repeating_weapon">
<div class="weapon-row">
<button type="roll" name="roll_attack_new" value="&{template:pc_attack_roll} {{character_name=@{character_name}}} {{weapon=@{new_weapon}}} {{rawToHit=[[1d20cs>=20]]}} {{toHitRoll=[[1d20 + (0 + @{new_weapon_hit_mod}) + (0 + ?{Additional Modifiers|0})]]}} {{modifier=[[ (0 + @{new_weapon_hit_mod}) + (0 + ?{Additional Modifiers|0}) ]]}} {{damage=[[ @{new_weapon_dmg} + (0 + @{new_weapon_dmg_mod}) ]]}} {{critDamage=[[ @{new_weapon_dmg} + @{new_weapon_dmg} + (0 + @{new_weapon_dmg_mod}) ]]}} {{fumbleResult=[[1d8]]}}"></button>
<input type="text" name="attr_new_weapon" />
<select name="attr_new_weapon_type">
<option value="Melee">Melee</option>
<option value="Ranged">Ranged</option>
</select>
<input type="number" name="attr_new_weapon_hit_mod" value="0" />
<select name="attr_new_weapon_dmg">
<option value="1d3">1d3</option>
<option value="1d4">1d4</option>
<option value="1d4+1">1d4+1</option>
<option value="2d4">2d4</option>
<option value="1d6">1d6</option>
<option value="1d6+1">1d6+1</option>
<option value="2d6">2d6</option>
<option value="1d8">1d8</option>
<option value="1d10">1d10</option>
</select>
<input type="number" name="attr_new_weapon_dmg_mod" value="0"/>
</div>
</fieldset>
</div>
<!-- ======================================= -->
<!-- Stats & Saving Throws -->
<!-- ======================================= -->
<div class="sheet-pc-stats-row">
<div class="sheet-pc-attributes compact">
<!-- Abilities =========================== -->
<h3>Abilities</h3>
<div class="sheet-abilities">
<div class="sheet-ability">
<button type="roll" name="roll_ability-strength"
value="&{template:rollunder} {{character_name=@{character_name}}} {{roll_type=a Strength Ability Check}} {{roll=[[1d20 + ?{Bonus|0}]]}} {{target=[[@{strength}]]}}"></button>
<div class="hex-container">
<input type="text" name="attr_strength" class="hex-input">
</div>
<label for="attr_strength">Strength</label>
</div>
<div class="sheet-ability">
<button type="roll" name="roll_ability-intelligence"
value="&{template:rollunder} {{character_name=@{character_name}}} {{roll_type=an Intelligence Ability Check}} {{roll=[[1d20 + ?{Bonus|0}]]}} {{target=[[@{intelligence}]]}}"></button>
<div class="hex-container">
<input type="text" name="attr_intelligence" class="hex-input">
</div>
<label for="attr_intelligence">Intelligence</label>
</div>
<div class="sheet-ability">
<button type="roll" name="roll_ability-wisdom"
value="&{template:rollunder} {{character_name=@{character_name}}} {{roll_type=an Wisdom Ability Check}} {{roll=[[1d20 + ?{Bonus|0}]]}} {{target=[[@{wisdom}]]}}"></button>
<div class="hex-container">
<input type="text" name="attr_wisdom" class="hex-input">
</div>
<label for="attr_wisdom">Wisdom</label>
</div>
<div class="sheet-ability">
<button type="roll" name="roll_ability-dexterity"
value="&{template:rollunder} {{character_name=@{character_name}}} {{roll_type=a Dexterity Ability Check}} {{roll=[[1d20 + ?{Bonus|0}]]}} {{target=[[@{dexterity}]]}}"></button>
<div class="hex-container">
<input type="text" name="attr_dexterity" class="hex-input">
</div>
<label for="attr_dexterity">Dexterity</label>
</div>
<div class="sheet-ability">
<button type="roll" name="roll_ability-constitution"
value="&{template:rollunder} {{character_name=@{character_name}}} {{roll_type=a Constitution Ability Check}} {{roll=[[1d20 + ?{Bonus|0}]]}} {{target=[[@{constitution}]]}}"></button>
<div class="hex-container">
<input type="text" name="attr_constitution" class="hex-input">
</div>
<label for="attr_constitution">Constitution</label>
</div>
<div class="sheet-ability">
<button type="roll" name="roll_ability-charisma"
value="&{template:rollunder} {{character_name=@{character_name}}} {{roll_type=a Charisma Ability Check}} {{roll=[[1d20 + ?{Bonus|0}]]}} {{target=[[@{charisma}]]}}"></button>
<div class="hex-container">
<input type="text" name="attr_charisma" class="hex-input">
</div>
<label for="attr_charisma">Charisma</label>
</div>
</div>
</div>
<div class="sheet-pc-attribute-mods compact">
<!-- Modifiers =========================== -->
<h3>Modifiers</h3>
<div class="sheet-modifiers">
<div class="sheet-modifier">
<input type="text" name="attr_melee-hit-damage">
<input type="text" name="attr_force-door">
<label for="attr_melee-hit-damage">Melee To Hit &amp; Damage</label>
<label for="attr_force-door">Force Door</label>
</div>
<div class="sheet-modifier">
<input type="text" name="attr_languages-mod">
<label for="attr_languages-mod">Modifier / # Languages</label>
</div>
<div class="sheet-modifier">
<input type="text" name="attr_magic-save">
<label for="attr_magic-save">Magic Save</label>
</div>
<div class="sheet-modifier">
<input type="text" name="attr_missile-hit-damage">
<input type="text" name="attr_armor-mod">
<label for="attr_missile-hit-damage">Missile To Hit &amp; Damage</label>
<label for="attr_armor-mod">Armor</label>
</div>
<div class="sheet-modifier">
<input type="text" name="attr_hit-points-mod">
<label for="attr_hit-points-mod">Hit Point</label>
</div>
<div class="sheet-modifier">
<input type="text" name="attr_henchmen">
<input type="text" name="attr_henchmen-morale">
<label for="attr_henchmen"># Henchmen</label>
<label for="attr_henchmen-morale">Henchmen Morale</label>
</div>
</div>
</div>
<div class="sheet-pc-saving-throws compact">
<!-- Saving Throws =========================== -->
<h3>Saving Throws</h3>
<div class="sheet-saving-throws-container">
<div class="sheet-saving-throws-wrapper">
<div class="sheet-saving-throws-buttons">
<button type="roll" name="roll_saving-breath"
value="&{template:rollover} {{character_name=@{character_name}}} {{roll_type=a Breath Saving Throw}} {{roll=[[1d20 + ?{Bonus|0}]]}} {{target=[[@{saving-breath}]]}}"></button>
<button type="roll" name="roll_saving-death"
value="&{template:rollover} {{character_name=@{character_name}}} {{roll_type=a Death Saving Throw}} {{roll=[[1d20 + ?{Bonus|0}]]}} {{target=[[@{saving-death}]]}}"></button>
<button type="roll" name="roll_saving-stone"
value="&{template:rollover} {{character_name=@{character_name}}} {{roll_type=a Stone Saving Throw}} {{roll=[[1d20 + ?{Bonus|0}]]}} {{target=[[@{saving-stone}]]}}"></button>
<button type="roll" name="roll_saving-wand"
value="&{template:rollover} {{character_name=@{character_name}}} {{roll_type=a Wand Saving Throw}} {{roll=[[1d20 + ?{Bonus|0}]]}} {{target=[[@{saving-wand}]]}}"></button>
<button type="roll" name="roll_saving-spell"
value="&{template:rollover} {{character_name=@{character_name}}} {{roll_type=a Spell Saving Throw}} {{roll=[[1d20 + ?{Bonus|0}]]}} {{target=[[@{saving-spell}]]}}"></button>
</div>
<div class="sheet-saving-throws">
<input type="text" name="attr_saving-breath" class="breath">
<label for="attr_saving-breath">Breath</label>
<input type="text" name="attr_saving-death" class="death">
<label for="attr_saving-death">Death</label>
<input type="text" name="attr_saving-stone" class="stone">
<label for="attr_saving-stone">Stone</label>
<input type="text" name="attr_saving-wand" class="wand">
<label for="attr_saving-wand">Wand</label>
<input type="text" name="attr_saving-spell" class="spell">
<label for="attr_saving-spell">Spell</label>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- ======================================= -->
<!-- Equipment Tab Content -->
<!-- ======================================= -->
<div class="sheet-equipment-tab">
<div class="equipment-columns">
<div class="equipment-column">
<label for="attr_equipment_item">
<h2>Items</h2>
</label>
<fieldset class="repeating_equipment1">
<div class="equipment-entry">
<input type="text" accept="equipment_name" name="attr_equipment_item">
</div>
</fieldset>
</div>
<div class="equipment-column">
<label for="attr_equipment_item">
<h2>Items</h2>
</label>
<fieldset class="repeating_equipment2">
<div class="equipment-entry">
<input type="text" accept="equipment_name" name="attr_equipment_item">
</div>
</fieldset>
</div>
</div>
</div>
<!-- ======================================= -->
<!-- Abilities Tab Content -->
<!-- ======================================= -->
<div class="sheet-abilities-tab">
<div class="abilities-columns">
<div class="abilities-column">
<h2>Abilities</h2>
<fieldset class="repeating_ability">
<div class="ability-entry">
<textarea name="attr_ability_description" rows="4"
placeholder="Enter ability details..."></textarea>
</div>
</fieldset>
</div>
<div class="thief-skills-column">
<h2>Thief Skills</h2>
<div class="thief-skills-list">
<div class="thief-skill">
<button type="roll" name="roll_thief_pickpockets"
value="&{template:thief_skill} {{character_name=@{character_name}}} {{skill=Pick Pockets}} {{roll=[[1d100]]}} {{target=[[@{pick_pockets}]]}}">
</button>
<div class="skill-name">Pick Pockets</div>
<input type="text" name="attr_pick_pockets">
</div>
<div class="thief-skill">
<button type="roll" name="roll_thief_openlocks"
value="&{template:thief_skill} {{character_name=@{character_name}}} {{skill=Open Locks}} {{roll=[[1d100]]}} {{target=[[@{open_locks}]]}}">
</button>
<div class="skill-name">Open Locks</div>
<input type="text" name="attr_open_locks">
</div>
<div class="thief-skill">
<button type="roll" name="roll_thief_findtraps"
value="&{template:thief_skill} {{character_name=@{character_name}}} {{skill=Find and Remove Traps}} {{roll=[[1d100]]}} {{target=[[@{find_traps}]]}}">
</button>
<div class="skill-name">Find and Remove Traps</div>
<input type="text" name="attr_find_traps">
</div>
<div class="thief-skill">
<button type="roll" name="roll_thief_movesilently"
value="&{template:thief_skill} {{character_name=@{character_name}}} {{skill=Move Silently}} {{roll=[[1d100]]}} {{target=[[@{move_silently}]]}}">
</button>
<div class="skill-name">Move Silently</div>
<input type="text" name="attr_move_silently">
</div>
<div class="thief-skill">
<button type="roll" name="roll_thief_hideinshadows"
value="&{template:thief_skill} {{character_name=@{character_name}}} {{skill=Hide in Shadows}} {{roll=[[1d100]]}} {{target=[[@{hide_in_shadows}]]}}">
</button>
<div class="skill-name">Hide in Shadows</div>
<input type="text" name="attr_hide_in_shadows">
</div>
<div class="thief-skill">
<button type="roll" name="roll_thief_climbwalls"
value="&{template:thief_skill} {{character_name=@{character_name}}} {{skill=Climb Walls}} {{roll=[[1d100]]}} {{target=[[@{climb_walls}]]}}">
</button>
<div class="skill-name">Climb Walls</div>
<input type="text" name="attr_climb_walls">
</div>
<div class="thief-skill">
<button type="roll" name="roll_thief_hearnoise"
value="&{template:thief_skill} {{character_name=@{character_name}}} {{skill=Hear Noise}} {{roll=[[1d6]]}} {{target=[[@{hear_noise}]]}}">
</button>
<div class="skill-name">Hear Noise</div>
<input type="text" name="attr_hear_noise">
</div>
<div class="thief-skill">
<button type="roll" name="roll_thief_appraise"
value="&{template:thief_skill} {{character_name=@{character_name}}} {{skill=Appraise}} {{roll=[[1d6]]}} {{target=[[@{appraise}]]}}">
</button>
<div class="skill-name">Appraise</div>
<input type="text" name="attr_appraise">
</div>
</div>
</div>
</div>
</div>
<!-- ======================================= -->
<!-- Spells Tab Content -->
<!-- ======================================= -->
<div class="sheet-spells-tab">
<div class="spells-per-day">
<div class="spells-per-day-wrapper">
<div class="spells-per-day-left">
<div class="spells-per-day-label">Spells Per Day</div>
<div class="spells-level-label">Level</div>
</div>
<div class="spells-per-day-right">
<div class="spells-per-day-inputs">
<input type="text" name="attr_spell_per_day_1" />
<input type="text" name="attr_spell_per_day_2" />
<input type="text" name="attr_spell_per_day_3" />
<input type="text" name="attr_spell_per_day_4" />
<input type="text" name="attr_spell_per_day_5" />
<input type="text" name="attr_spell_per_day_6" />
<input type="text" name="attr_spell_per_day_7" />
<input type="text" name="attr_spell_per_day_8" />
<input type="text" name="attr_spell_per_day_9" />
</div>
<div class="spells-per-day-numbers">
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
<span>5</span>
<span>6</span>
<span>7</span>
<span>8</span>
<span>9</span>
</div>
</div>
</div>
</div>
<div class="spells-list">
<div class="spells-list-column spells-list-low">
<div class="spell-level-entry">
<div class="spells-list-header">
<h2>Level 1</h2>
</div>
<div class="spell-level-labels">
<span title="Memorized Spell" class="memorized-header"></span>
<span class="spell-name-header">Spell Name</span>
</div>
<fieldset class="repeating_spelllevel1">
<div class="spell-entry">
<input type="checkbox" name="attr_spellmemorized" class="spell-memorized">
<input type="text" name="attr_spellname" accept="spell_name" placeholder="Spell Name">
</div>
</fieldset>
</div>
<div class="spell-level-entry">
<div class="spells-list-header">
<h2>Level 2</h2>
</div>
<div class="spell-level-labels">
<span class="memorized-header"></span>
<span class="spell-name-header">Spell Name</span>
</div>
<fieldset class="repeating_spelllevel2">
<div class="spell-entry">
<input type="checkbox" name="attr_spellmemorized" class="spell-memorized">
<input type="text" name="attr_spellname" accept="spell_name" placeholder="Spell Name">
</div>
</fieldset>
</div>
<div class="spell-level-entry">
<div class="spells-list-header">
<h2>Level 3</h2>
</div>
<div class="spell-level-labels">
<span class="memorized-header"></span>
<span class="spell-name-header">Spell Name</span>
</div>
<fieldset class="repeating_spelllevel3">
<div class="spell-entry">
<input type="checkbox" name="attr_spellmemorized" class="spell-memorized">
<input type="text" name="attr_spellname" accept="spell_name" placeholder="Spell Name">
</div>
</fieldset>
</div>
<div class="spell-level-entry">
<div class="spells-list-header">
<h2>Level 4</h2>
</div>
<div class="spell-level-labels">
<span class="memorized-header"></span>
<span class="spell-name-header">Spell Name</span>
</div>
<fieldset class="repeating_spelllevel4">
<div class="spell-entry">
<input type="checkbox" name="attr_spellmemorized" class="spell-memorized">
<input type="text" name="attr_spellname" accept="spell_name" placeholder="Spell Name">
</div>
</fieldset>
</div>
<div class="spell-level-entry">
<div class="spells-list-header">
<h2>Level 5</h2>
</div>
<div class="spell-level-labels">
<span class="memorized-header"></span>
<span class="spell-name-header">Spell Name</span>
</div>
<fieldset class="repeating_spelllevel5">
<div class="spell-entry">
<input type="checkbox" name="attr_spellmemorized" class="spell-memorized">
<input type="text" name="attr_spellname" accept="spell_name" placeholder="Spell Name">
</div>
</fieldset>
</div>
</div>
<div class="spells-list-column spells-list-high">
<div class="spell-level-entry">
<div class="spells-list-header">
<h2>Level 6</h2>
</div>
<div class="spell-level-labels">
<span class="memorized-header"></span>
<span class="spell-name-header">Spell Name</span>
</div>
<fieldset class="repeating_spelllevel6">
<div class="spell-entry">
<input type="checkbox" name="attr_spellmemorized" class="spell-memorized">
<input type="text" name="attr_spellname" accept="spell_name" placeholder="Spell Name">
</div>
</fieldset>
</div>
<div class="spell-level-entry">
<div class="spells-list-header">
<h2>Level 7</h2>
</div>
<div class="spell-level-labels">
<span class="memorized-header"></span>
<span class="spell-name-header">Spell Name</span>
</div>
<fieldset class="repeating_spelllevel7">
<div class="spell-entry">
<input type="checkbox" name="attr_spellmemorized" class="spell-memorized">
<input type="text" name="attr_spellname" accept="spell_name" placeholder="Spell Name">
</div>
</fieldset>
</div>
<div class="spell-level-entry">
<div class="spells-list-header">
<h2>Level 8</h2>
</div>
<div class="spell-level-labels">
<span class="memorized-header"></span>
<span class="spell-name-header">Spell Name</span>
</div>
<fieldset class="repeating_spelllevel8">
<div class="spell-entry">
<input type="checkbox" name="attr_spellmemorized" class="spell-memorized">
<input type="text" name="attr_spellname" accept="spell_name" placeholder="Spell Name">
</div>
</fieldset>
</div>
<div class="spell-level-entry">
<div class="spells-list-header">
<h2>Level 9</h2>
</div>
<div class="spell-level-labels">
<span class="memorized-header"></span>
<span class="spell-name-header">Spell Name</span>
</div>
<fieldset class="repeating_spelllevel9">
<div class="spell-entry">
<input type="checkbox" name="attr_spellmemorized" class="spell-memorized">
<input type="text" name="attr_spellname" accept="spell_name" placeholder="Spell Name">
</div>
</fieldset>
</div>
</div>
</div>
</div>
<!-- ======================================= -->
<!-- Wealth & Treasure Tab Content -->
<!-- ======================================= -->
<div class="sheet-wealth-tab">
<div class="sheet-wealth-table">
<div class="wealth-row">
<div class="wealth-cell wealth-heading">Wealth</div>
<div class="wealth-cell coin-col"><input type="text" name="attr_coins_CP"></div>
<div class="wealth-cell coin-col"><input type="text" name="attr_coins_SP"></div>
<div class="wealth-cell coin-col"><input type="text" name="attr_coins_EP"></div>
<div class="wealth-cell coin-col"><input type="text" name="attr_coins_GP"></div>
<div class="wealth-cell coin-col"><input type="text" name="attr_coins_PP"></div>
</div>
<div class="wealth-row">
<div class="wealth-cell"></div>
<div class="wealth-cell coin-col"><label>CP</label></div>
<div class="wealth-cell coin-col"><label>SP</label></div>
<div class="wealth-cell coin-col"><label>EP</label></div>
<div class="wealth-cell coin-col"><label>GP</label></div>
<div class="wealth-cell coin-col"><label>PP</label></div>
</div>
</div>
<h2 class="treasure-heading">Treasure</h2>
<div class="treasure-two-col">
<div class="treasure-col">
<div class="treasure-col-header">
<div class="col-item-label">Item</div>
<div class="col-value-label">Value</div>
</div>
<fieldset class="repeating_treasureleft">
<div class="treasure-entry-2col">
<input type="text" name="attr_item">
<input type="text" name="attr_value">
</div>
</fieldset>
</div>
<div class="treasure-col">
<div class="treasure-col-header">
<div class="col-item-label">Item</div>
<div class="col-value-label">Value</div>
</div>
<fieldset class="repeating_treasureright">
<div class="treasure-entry-2col">
<input type="text" name="attr_item">
<input type="text" name="attr_value">
</div>
</fieldset>
</div>
</div>
</div>
<!-- ======================================= -->
<!-- Henchmen & Hirelings Tab Content -->
<!-- ======================================= -->
<div class="sheet-hireling-tab">
<fieldset class="repeating_hireling">
<div class="sheet-hireling-table">
<div class="hireling-row1-labels">
<div class="hireling-col-name">Name</div>
<div class="hireling-col-race">Race</div>
<div class="hireling-col-class">Class</div>
<div class="hireling-col-level">Level</div>
<div class="hireling-col-hp">HP</div>
<div class="hireling-col-armor">Armor</div>
<div class="hireling-col-ac">AC</div>
<div class="hireling-col-xp">XP</div>
</div>
<div class="hireling-row1-data">
<input type="text" class="col-name" name="attr_name">
<select class="hireling-col-race" name="attr_race">
<option value="">-- Race --</option>
<option value="Human">Human</option>
<option value="Cyclopsman">Cyclopsman</option>
<option value="Dwarf">Dwarf</option>
<option value="Elf">Elf</option>
<option value="Gnome">Gnome</option>
<option value="Halfling">Halfling</option>
<option value="Half-Elf">Half-Elf</option>
<option value="Half-Orc">Half-Orc</option>
</select>
<select class="hireling-col-class" name="attr_class">
<option value="">-- Class --</option>
<option value="Torch-Bearers">Torch-Bearers</option>
<option value="Porter">Porter</option>
<option value="Specialist">Specialist</option>
<option value="Man At Arms">Man At Arms</option>
<option value="Cleric">Cleric</option>
<option value="Druid">Druid</option>
<option value="Monk">Monk</option>
<option value="Fighter">Fighter</option>
<option value="Barbarian">Barbarian</option>
<option value="Paladin">Paladin</option>
<option value="Ranger">Ranger</option>
<option value="Magic-User">Magic-User</option>
<option value="Illusionist">Illusionist</option>
<option value="Thief">Thief</option>
<option value="Assassin">Assassin</option>
</select>
<input type="text" class="hireling-col-level" name="attr_level">
<input type="text" class="hireling-col-hp" name="attr_hitpoints">
<select class="hireling-col-armor" name="attr_armor">
<option value="">-- Armor --</option>
<option value="Leather">Leather</option>
<option value="Studded Leather">Studded Leather</option>
<option value="Ring Mail">Ring Mail</option>
<option value="Chain Mail">Chain Mail</option>
<option value="Half-Plate Mail">Half-Plate Mail</option>
<option value="Plate Mail">Plate Mail</option>
<option value="Shield">Shield</option>
</select>
<input type="text" class="hireling-col-ac" name="attr_armorclass">
<input type="text" class="hireling-col-xp" name="attr_xp">
</div>
<div class="hireling-row2-labels">
<div class="hireling-col-attack"></div>
<div class="hireling-col-weapon">Weapon</div>
<div class="hireling-col-hitmod">Hit Mod</div>
<div class="hireling-col-dmgdice">Damage</div>
<div class="hireling-col-dmgmod">Dmg Mod</div>
<div class="hireling-col-notes">Notes</div>
</div>
<div class="hireling-row2-data">
<button type="roll" class="hireling-col-attack" name="roll_attack" value="&{template:pc_attack_roll} {{character_name=@{name}}} {{weapon=@{weapon}}} {{toHitRoll=[[1d20 + (0 + @{hitmod}) + (0 + ?{Additional Mods|0})]]}} {{damage=[[ @{dmgdice} + (0 + @{dmgmod}) ]]}}"></button>
<input type="text" class="hireling-col-weapon" name="attr_weapon">
<input type="text" class="hireling-col-hitmod" name="attr_hitmod" value="0">
<select class="hireling-col-dmgdice" name="attr_dmgdice">
<option value="1d3">1d3</option>
<option value="1d4">1d4</option>
<option value="2d4">2d4</option>
<option value="1d6">1d6</option>
<option value="2d6">2d6</option>
<option value="1d8">1d8</option>
<option value="1d10">1d10</option>
<option value="1d12">1d12</option>
</select>
<input type="text" class="hireling-col-dmgmod" name="attr_dmgmod" value="0">
<input type="text" class="hireling-col-notes" name="attr_notes">
</div>
</div>
</fieldset>
</div>
<!-- ======================================= -->
<!-- Notes Tab Content -->
<!-- ======================================= -->
<div class="sheet-notes-tab">
<div class="sheet-notes">
<div class="notes-two-col">
<div class="notes-col">
<fieldset class="repeating_notes_left">
<div class="notes-entry">
<input type="text" name="attr_notetitle_left" placeholder="Note Name">
<textarea name="attr_notecontent_left" rows="4"></textarea>
</div>
</fieldset>
</div>
<div class="notes-col">
<fieldset class="repeating_notes_right">
<div class="notes-entry">
<input type="text" name="attr_notetitle_right" placeholder="Note Name">
<textarea name="attr_notecontent_right" rows="4"></textarea>
</div>
</fieldset>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- ======================================= -->
<!-- Monster Sheet Content -->
<!-- ======================================= -->
<div class="monsheet">
<div class="monster-sheet">
<div class="monster-sheet-cols">
<div class="monster-info-grid">
<div class="stat-row">
<div class="stat-button">
<button type="roll" name="roll_noenc"
value="/w gm Monsters Encountered: [[0+@{monster_no_enc}]]"></button>
</div>
<div class="stat-label">No. Enc</div>
<div class="stat-input">
<div class="double-input">
<input type="text" name="attr_monster_no_enc" />
<button type="roll" name="roll_noenc_lair"
value="/w gm Monsters In Lair Encountered: [[0+@{monster_no_enc_lair}]]"></button>
<input type="text" name="attr_monster_no_enc_lair">
</div>
</div>
</div>
<div class="stat-row">
<div class="stat-button"></div>
<div class="stat-label">Alignment</div>
<div class="stat-input">
<input type="text" name="attr_monster_alignment">
</div>
</div>
<div class="stat-row">
<div class="stat-button"></div>
<div class="stat-label">Movement</div>
<div class="stat-input">
<input type="text" name="attr_monster_movement">
</div>
</div>
<div class="stat-row">
<div class="stat-button"></div>
<div class="stat-label">Armor Class</div>
<div class="stat-input">
<input type="text" name="attr_monster_armor_class">
</div>
</div>
<div class="stat-row">
<div class="stat-button">
<button type="roll" name="roll_hitdice"
value="/w gm Hit Dice: [[0+@{monster_hit_dice_full}]]"></button>
</div>
<div class="stat-label">Hit Dice</div>
<div class="stat-input">
<input type="text" name="attr_monster_hit_dice">
</div>
</div>
<div class="stat-row">
<div class="stat-button">
<button type="roll" name="roll_morale"
value="&{template:morale} {{roll=[[2d6]]}} {{morale=[[0+@{monster_morale}]]}}"></button>
</div>
<div class="stat-label">Morale</div>
<div class="stat-input">
<input type="text" name="attr_monster_morale">
</div>
</div>
<div class="stat-row">
<div class="stat-button"></div>
<div class="stat-label">Treasure</div>
<div class="stat-input">
<input type="text" name="attr_monster_treasure">
</div>
</div>
<div class="stat-row">
<div class="stat-button"></div>
<div class="stat-label">XP</div>
<div class="stat-input">
<input type="text" name="attr_monster_xp">
</div>
</div>
<div class="stat-row">
<div class="stat-button"></div>
<div class="stat-label">Save</div>
<div class="stat-input">
<input type="text" name="attr_monster_save_as">
</div>
</div>
<div class="monster-saving-throws">
<div class="saving-throws-grid">
<div class="saving-throw">
<button type="roll" name="roll_saving-mon-breath"
value="&{template:rollover} {{character_name=@{character_name}}} {{roll_type=a Breath Saving Throw}} {{roll=[[1d20 + ?{Bonus|0}]]}} {{target=[[@{monster_save_breath}]]}}"></button>
<input type="text" name="attr_monster_save_breath">
<div class="saving-label">Breath</div>
</div>
<div class="saving-throw">
<button type="roll" name="roll_saving-mon-death"
value="&{template:rollover} {{character_name=@{character_name}}} {{roll_type=a Death Saving Throw}} {{roll=[[1d20 + ?{Bonus|0}]]}} {{target=[[@{monster_save_death}]]}}"></button>
<input type="text" name="attr_monster_save_death">
<div class="saving-label">Death</div>
</div>
<div class="saving-throw">
<button type="roll" name="roll_saving-mon-stone"
value="&{template:rollover} {{character_name=@{character_name}}} {{roll_type=a Stone Saving Throw}} {{roll=[[1d20 + ?{Bonus|0}]]}} {{target=[[@{monster_save_stone}]]}}"></button>
<input type="text" name="attr_monster_save_stone">
<div class="saving-label">Stone</div>
</div>
<div class="saving-throw">
<button type="roll" name="roll_saving-mon-wand"
value="&{template:rollover} {{character_name=@{character_name}}} {{roll_type=a Wand Saving Throw}} {{roll=[[1d20 + ?{Bonus|0}]]}} {{target=[[@{monster_save_wand}]]}}"></button>
<input type="text" name="attr_monster_save_wand">
<div class="saving-label">Wand</div>
</div>
<div class="saving-throw">
<button type="roll" name="roll_saving-mon-spell"
value="&{template:rollover} {{character_name=@{character_name}}} {{roll_type=a Spell Saving Throw}} {{roll=[[1d20 + ?{Bonus|0}]]}} {{target=[[@{monster_save_spell}]]}}"></button>
<input type="text" name="attr_monster_save_spell">
<div class="saving-label">Spell</div>
</div>
</div>
</div>
</div>
<div class="monster-attack">
<fieldset class="repeating_monster-attack">
<div class="atk-entry">
<div class="mon-atk-row-1">
<button type="roll" name="roll_monster_attack"
value="&{template:pc_attack_roll} {{character_name=@{character_name}}} {{weapon=@{mon_atk_attack_name}}} {{rawToHit=[[1d20cs>=20]]}} {{toHitRoll=[[1d20+@{mon_atk_attack_bonus}+?{Additional Modifiers|0}]]}} {{modifier=[[@{mon_atk_attack_bonus}+?{Additional Modifiers|0}]]}} {{damage=[[ @{mon_atk_primary_damage} ]]}} {{critDamage=[[ @{mon_atk_primary_damage}+0 ]]}} {{fumbleResult=[[1d8]]}}"></button>
<label>Attack Name</label>
<input type="text" name="attr_mon_atk_attack_name">
</div>
<div class="mon-atk-row-2">
<label>Attack Bonus</label>
<input type="text" name="attr_mon_atk_attack_bonus">
<button type="roll" name="roll_mon_atk_attack_text"
value="**@{character_name}** attacks with '@{mon_atk_attack_name}' for [[@{mon_atk_primary_damage}]] damage."></button>
<label>Damage</label>
<input type="text" name="attr_mon_atk_primary_damage">
</div>
<label class="mon-description-label"></label>
<div class="mon-atk-row-description">
<textarea name="attr_mon_atk_description"></textarea>
</div>
</div>
</fieldset>
</div>
</div>
</div>
</div>
<rolltemplate class="sheet-rolltemplate-pc_attack_roll">
<div class="sheet-container">
<div class="sheet-header">
<strong>{{character_name}}</strong> attacks with a
<span class="sheet-atk-weapon">{{weapon}}</span> for a total roll of {{toHitRoll}}
{{#rollBetween() toHitRoll 2 9}}
and missed!
{{/rollBetween() toHitRoll 2 9}}
{{#rollWasFumble() toHitRoll}}
<span class="sheet-fumble">
<strong>Fumble Result</strong>:<br>
{{#rollTotal() fumbleResult 1}}Dexterity Check or miss next attack.{{/rollTotal() fumbleResult 1}}
{{#rollTotal() fumbleResult 2}}You attack, slip, and fall prone.{{/rollTotal() fumbleResult 2}}
{{#rollTotal() fumbleResult 3}}Weapon slips and lands behind enemy.{{/rollTotal() fumbleResult 3}}
{{#rollTotal() fumbleResult 4}}Headgear slips, blind until adjusted.{{/rollTotal() fumbleResult 4}}
{{#rollTotal() fumbleResult 5}}Cower in fear of enemy for 1 round.{{/rollTotal() fumbleResult 5}}
{{#rollTotal() fumbleResult 6}}Enemy receives free attack.{{/rollTotal() fumbleResult 6}}
{{#rollTotal() fumbleResult 7}}Hit Closest Ally for {{damage}} points of damage: Dexterity Check to half the
damage.{{/rollTotal() fumbleResult 7}}
{{#rollTotal() fumbleResult 8}}Hit Yourself for {{damage}} points of damage: Dexterity Check to half the
damage.{{/rollTotal() fumbleResult 8}}
</span>
{{/rollWasFumble() toHitRoll}}
{{#rollWasCrit() toHitRoll}}
<span class="sheet-crit">scoring a critical hit for {{critDamage}} damage.</span>
{{/rollWasCrit() toHitRoll}}
{{^rollWasFumble() toHitRoll}}
{{^rollWasCrit() toHitRoll}}
<span class="sheet-normal-damage">
<span class="sheet-ac-hit">
{{#rollTotal() toHitRoll 10}}
<span class="sheet-hit">hitting AC 10 for {{damage}} points of damage. </span>
{{/rollTotal() toHitRoll 10}}
{{#rollTotal() toHitRoll 11}}
<span class="sheet-hit">hitting AC 9 for {{damage}} points of damage.</span>
{{/rollTotal() toHitRoll 11}}
{{#rollTotal() toHitRoll 12}}
<span class="sheet-hit">hitting AC 8 for {{damage}} points of damage.</span>
{{/rollTotal() toHitRoll 12}}
{{#rollTotal() toHitRoll 13}}
<span class="sheet-hit">hitting AC 7 for {{damage}} points of damage.</span>
{{/rollTotal() toHitRoll 13}}
{{#rollTotal() toHitRoll 14}}
<span class="sheet-hit">hitting AC 6 for {{damage}} points of damage.</span>
{{/rollTotal() toHitRoll 14}}
{{#rollTotal() toHitRoll 15}}
<span class="sheet-hit">hitting AC 5 for {{damage}} points of damage.</span>
{{/rollTotal() toHitRoll 15}}
{{#rollTotal() toHitRoll 16}}
<span class="sheet-hit">hitting AC 4 for {{damage}} points of damage.</span>
{{/rollTotal() toHitRoll 16}}
{{#rollTotal() toHitRoll 17}}
<span class="sheet-hit">hitting AC 3 for {{damage}} points of damage.</span>
{{/rollTotal() toHitRoll 17}}
{{#rollTotal() toHitRoll 18}}
<span class="sheet-hit">hitting AC 2 for {{damage}} points of damage.</span>
{{/rollTotal() toHitRoll 18}}
{{#rollTotal() toHitRoll 19}}
<span class="sheet-hit">hitting AC 1 for {{damage}} points of damage.</span>
{{/rollTotal() toHitRoll 19}}
{{#rollTotal() toHitRoll 20}}
<span class="sheet-hit">hitting AC 0 for {{damage}} points of damage.</span>
{{/rollTotal() toHitRoll 20}}
{{#rollTotal() toHitRoll 21}}
<span class="sheet-hit">hitting AC -1 for {{damage}} points of damage.</span>
{{/rollTotal() toHitRoll 21}}
{{#rollTotal() toHitRoll 22}}
<span class="sheet-hit">hitting AC -2 for {{damage}} points of damage.</span>
{{/rollTotal() toHitRoll 22}}
{{#rollTotal() toHitRoll 23}}
<span class="sheet-hit">hitting AC -3 for {{damage}} points of damage.</span>
{{/rollTotal() toHitRoll 23}}
{{#rollTotal() toHitRoll 24}}
<span class="sheet-hit">hitting AC -4 for {{damage}} points of damage.</span>
{{/rollTotal() toHitRoll 24}}
{{#rollTotal() toHitRoll 25}}
<span class="sheet-hit">hitting AC -5 for {{damage}} points of damage.</span>
{{/rollTotal() toHitRoll 25}}
{{#rollTotal() toHitRoll 26}}
<span class="sheet-hit">hitting AC -6 for {{damage}} points of damage.</span>
{{/rollTotal() toHitRoll 26}}
{{#rollTotal() toHitRoll 27}}
<span class="sheet-hit">hitting AC -7 for {{damage}} points of damage.</span>
{{/rollTotal() toHitRoll 27}}
{{#rollTotal() toHitRoll 28}}
<span class="sheet-hit">hitting AC -8 for {{damage}} points of damage.</span>
{{/rollTotal() toHitRoll 28}}
{{#rollTotal() toHitRoll 29}}
<span class="sheet-hit">hitting AC -9 for {{damage}} points of damage.</span>
{{/rollTotal() toHitRoll 29}}
{{#rollGreater() toHitRoll 29}}
<span class="sheet-hit">hitting AC -10 for {{damage}} points of damage.</span>
{{/rollGreater() toHitRoll 29}}
</span>
</span>
{{/rollWasCrit() toHitRoll}}
{{/rollWasFumble() toHitRoll}}
</div>
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-savingthrow">
<div class="sheet-roll-header">
<span><strong>{{character_name}}</strong></span> rolls a <strong>{{save}}</strong> Save
</div>
<div class="sheet-roll-result">
<span class="sheet-roll-dice">{{roll}}</span> vs. <span class="sheet-roll-target">{{target}}</span>
</div>
{{#rollLess() roll target}}
<div class="sheet-roll-failure">Failure!</div>
{{/rollLess() roll target}}
{{#rollTotal() roll target}}
<div class="sheet-roll-success">Success!</div>
{{/rollTotal() roll target}}
{{#rollGreater() roll target}}
<div class="sheet-roll-success">Success!</div>
{{/rollGreater() roll target}}
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-rollover">
<div class="sheet-roll-header">
<strong>{{character_name}}</strong> rolls <strong>{{roll_type}}</strong>
</div>
<div class="sheet-roll-result">
<span class="sheet-roll-dice">{{roll}}</span> vs. <span class="sheet-roll-target">{{target}}</span>
</div>
{{#rollGreater() roll target}}
<div class="sheet-roll-success">Success!</div>
{{/rollGreater() roll target}}
{{#rollTotal() roll target}}
<div class="sheet-roll-success">Success!</div>
{{/rollTotal() roll target}}
{{#rollLess() roll target}}
<div class="sheet-roll-failure">Failure!</div>
{{/rollLess() roll target}}
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-rollunder">
<div class="sheet-roll-header">
<strong>{{character_name}}</strong> rolls a <strong>{{roll_type}}</strong>
</div>
<div class="sheet-roll-result">
<span class="sheet-roll-dice">{{roll}}</span> vs. <span class="sheet-roll-target">{{target}}</span>
</div>
{{#rollLess() roll target}}
<div class="sheet-roll-success">Success!</div>
{{/rollLess() roll target}}
{{#rollTotal() roll target}}
<div class="sheet-roll-success">Success!</div>
{{/rollTotal() roll target}}
{{#rollGreater() roll target}}
<div class="sheet-roll-failure">Failure!</div>
{{/rollGreater() roll target}}
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-thief_skill">
<div class="sheet-roll-message">
<strong>{{character_name}}</strong> rolls {{skill}} ({{roll}})
{{#rollBetween() roll 0 target}}
and Succeeds.
{{/rollBetween() roll 0 target}}
{{#rollGreater() roll target}}
and Fails.
{{/rollGreater() roll target}}
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-morale">
<div class="sheet-roll-header">Morale Check</div>
<div class="sheet-roll-result">
<span class="sheet-roll-dice">{{roll}}</span> vs. <span class="sheet-roll-target">{{morale}}</span>
</div>
{{#rollBetween() roll 2 morale}}
<div class="sheet-roll-failure">Monster holds!</div>
{{/rollBetween() roll 2 morale}}
{{#rollGreater() roll morale}}
<div class="sheet-roll-success">Monster flees!</div>
{{/rollGreater() roll morale}}
</rolltemplate>
<script type="text/worker">
const buttonlist = ["main", "equipment", "abilities", "spells", "wealth", "henchmen", "notes"];
buttonlist.forEach(button => {
on(`clicked:${button}`, function() {
setAttrs({
sheetTab: button
});
});
});
on("clicked:toggleSheet", function() {
getAttrs(["sheetMode"], function(values) {
// Toggle between "pc" and "monster"
var newMode = (values.sheetMode === "monster") ? "pc" : "monster";
setAttrs({ sheetMode: newMode });
});
});
on("sheet:opened change:monster_hit_dice", function() {
getAttrs(["monster_hit_dice"], function(values) {
var input = values.monster_hit_dice || "";
if(input.indexOf("d8") !== -1) {
setAttrs({ monster_hit_dice_full: input });
} else {
var parts = input.split("+");
if(parts.length === 2) {
var dice = parseInt(parts[0].trim(), 10);
var bonus = parseInt(parts[1].trim(), 10);
if(!isNaN(dice) && !isNaN(bonus)) {
setAttrs({ monster_hit_dice_full: dice + "d8+" + bonus });
} else {
setAttrs({ monster_hit_dice_full: "0" });
}
} else {
var diceOnly = parseInt(input.trim(),10);
if(!isNaN(diceOnly)) {
setAttrs({ monster_hit_dice_full: diceOnly + "d8" });
} else {
setAttrs({ monster_hit_dice_full: "0" });
}
}
}
});
});
const abilityMods = {
strength: [
{ min: 3, max: 3, values: { 'melee-hit-damage': -3, 'force-door': -3 } },
{ min: 4, max: 5, values: { 'melee-hit-damage': -2, 'force-door': -2 } },
{ min: 6, max: 8, values: { 'melee-hit-damage': -1, 'force-door': -1 } },
{ min: 9, max: 12, values: { 'melee-hit-damage': 0, 'force-door': 0 } },
{ min: 13, max: 15, values: { 'melee-hit-damage': 1, 'force-door': 1 } },
{ min: 16, max: 17, values: { 'melee-hit-damage': 2, 'force-door': 2 } },
{ min: 18, max: 18, values: { 'melee-hit-damage': 3, 'force-door': 3 } },
],
intelligence: [
{ min: 3, max: 3, values: { 'languages-mod': -3 } },
{ min: 4, max: 5, values: { 'languages-mod': -2 } },
{ min: 6, max: 8, values: { 'languages-mod': -1 } },
{ min: 9, max: 12, values: { 'languages-mod': 0 } },
{ min: 13, max: 15, values: { 'languages-mod': 1 } },
{ min: 16, max: 17, values: { 'languages-mod': 2 } },
{ min: 18, max: 18, values: { 'languages-mod': 3 } },
],
wisdom: [
{ min: 3, max: 3, values: { 'magic-save': -3 } },
{ min: 4, max: 5, values: { 'magic-save': -2 } },
{ min: 6, max: 8, values: { 'magic-save': -1 } },
{ min: 9, max: 12, values: { 'magic-save': 0 } },
{ min: 13, max: 15, values: { 'magic-save': 1 } },
{ min: 16, max: 17, values: { 'magic-save': 2 } },
{ min: 18, max: 18, values: { 'magic-save': 3 } },
],
dexterity: [
{ min: 3, max: 3, values: { 'missile-hit-damage': -3, 'armor-mod': 3 } },
{ min: 4, max: 5, values: { 'missile-hit-damage': -2, 'armor-mod': 2 } },
{ min: 6, max: 8, values: { 'missile-hit-damage': -1, 'armor-mod': 1 } },
{ min: 9, max: 12, values: { 'missile-hit-damage': 0, 'armor-mod': 0 } },
{ min: 13, max: 15, values: { 'missile-hit-damage': 1, 'armor-mod': -1 } },
{ min: 16, max: 17, values: { 'missile-hit-damage': 2, 'armor-mod': -2 } },
{ min: 18, max: 18, values: { 'missile-hit-damage': 3, 'armor-mod': -3 } },
],
constitution: [
{ min: 3, max: 3, values: { 'hit-points-mod': -3 } },
{ min: 4, max: 5, values: { 'hit-points-mod': -2 } },
{ min: 6, max: 8, values: { 'hit-points-mod': -1 } },
{ min: 9, max: 12, values: { 'hit-points-mod': 0 } },
{ min: 13, max: 15, values: { 'hit-points-mod': 1 } },
{ min: 16, max: 17, values: { 'hit-points-mod': 2 } },
{ min: 18, max: 18, values: { 'hit-points-mod': 3 } },
],
charisma: [
{ min: 3, max: 3, values: { 'henchmen': 0, 'henchmen-morale': 4 } },
{ min: 4, max: 5, values: { 'henchmen': 1, 'henchmen-morale': 5 } },
{ min: 6, max: 8, values: { 'henchmen': 2, 'henchmen-morale': 6 } },
{ min: 9, max: 12, values: { 'henchmen': 3, 'henchmen-morale': 7 } },
{ min: 13, max: 15, values: { 'henchmen': 4, 'henchmen-morale': 8 } },
{ min: 16, max: 17, values: { 'henchmen': 5, 'henchmen-morale': 9 } },
{ min: 18, max: 18, values: { 'henchmen': 6, 'henchmen-morale': 10 } },
]
};
Object.keys(abilityMods).forEach(ability => {
on(`change:${ability}`, function() {
getAttrs([ability], function(values) {
const score = parseInt(values[ability]) || 0;
const modTable = abilityMods[ability];
const match = modTable.find(entry => score >= entry.min && score <= entry.max);
if (match) {
setAttrs(match.values);
}
});
});
});
// ===== SAVING THROWS SHEETWORKER =====
on("change:class change:level", function() {
getAttrs(["class", "level"], function(values) {
const cls = (values.class || "").toLowerCase().trim();
const level = parseInt(values.level || "0", 10);
const tables = {
cleric: [
{ max: 3, breath:16, death:10, stone:13, wand:14, spell:15 },
{ max: 6, breath:15, death:9, stone:12, wand:13, spell:14 },
{ max: 9, breath:13, death:7, stone:10, wand:11, spell:12 },
{ max:12, breath:12, death:6, stone:9, wand:10, spell:11 },
{ max:15, breath:11, death:5, stone:8, wand:9, spell:10 },
{ max:18, breath:10, death:4, stone:7, wand:8, spell:9 },
{ max:99,breath:8, death:2, stone:5, wand:6, spell:7 }
],
fighter: [
{ max:0, breath:17, death:16, stone:17, wand:18, spell:19 },
{ max:2, breath:16, death:14, stone:15, wand:16, spell:17 },
{ max:4, breath:15, death:13, stone:14, wand:15, spell:16 },
{ max:6, breath:13, death:11, stone:12, wand:13, spell:14 },
{ max:8, breath:12, death:10, stone:11, wand:12, spell:13 },
{ max:10, breath:9, death:8, stone:9, wand:10, spell:11 },
{ max:12, breath:8, death:7, stone:8, wand:9, spell:10 },
{ max:14, breath:5, death:5, stone:6, wand:7, spell:8 },
{ max:16, breath:4, death:4, stone:5, wand:6, spell:7 },
{ max:99, breath:4, death:3, stone:4, wand:5, spell:6 }
],
magicuser: [
{ max:5, breath:15, death:14, stone:13, wand:11, spell:12 },
{ max:10, breath:13, death:13, stone:11, wand:9, spell:10 },
{ max:15, breath:11, death:11, stone:9, wand:7, spell:8 },
{ max:20, breath:9, death:10, stone:7, wand:5, spell:6 },
{ max:99, breath:4, death:3, stone:4, wand:5, spell:6 }
],
thief: [
{ max:4, breath:16, death:13, stone:12, wand:14, spell:15 },
{ max:8, breath:15, death:12, stone:11, wand:12, spell:13 },
{ max:12, breath:14, death:11, stone:10, wand:10, spell:11 },
{ max:16, breath:12, death:10, stone:9, wand:8, spell:9 },
{ max:99, breath:11, death:9, stone:8, wand:6, spell:7 }
]
};
let table;
if (/cleric|druid|monk/.test(cls)) {
table = tables.cleric;
} else if (/fighter|barbarian|paladin|ranger/.test(cls)) {
table = tables.fighter;
} else if (/magic.?user|illusionist/.test(cls)) {
table = tables.magicuser;
} else if (/thief|assassin/.test(cls)) {
table = tables.thief;
} else {
return; // Class doesn't match any known type
}
const row = table.find(r => level <= r.max);
if (!row) return;
setAttrs({
"saving-breath": row.breath,
"saving-death": row.death,
"saving-stone": row.stone,
"saving-wand": row.wand,
"saving-spell": row.spell
});
});
});
</script>