Files
2026-03-27 03:52:49 +01:00

1875 lines
65 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<input type="hidden" class="sheet-tabstoggle" name="attr_sheetTab" value="character" />
<!-- Sheet Tabs -->
<div class="sheet-tabs">
<button type="action" name="act_character" class="sheet-tab-button">Character</button>
<button type="action" name="act_journal" class="sheet-tab-button">Journal</button>
<button type="action" name="act_notes" class="sheet-tab-button">Notes</button>
<button type="action" name="act_npc" class="sheet-tab-button">NPC</button>
</div>
<!-- Character Sheet tab below this line -->
<div class="sheet-tab-content sheet-character">
<div class="sheet-tab-inner">
<!-- Character Header Section -->
<div class="sheet-header">
<!-- Character Title Section -->
<div class="character-title">
<div class="token-wrapper">
<img class="token-image" name="attr_character_token">
</div>
<span class="character-display" name="attr_header_display"></span>
<div class="title-checkboxes">
<input type="checkbox" name="attr_action_1">
<input type="checkbox" name="attr_action_2">
<input type="checkbox" name="attr_action_3">
</div>
</div>
<!-- Character Info Section -->
<div class="character-info">
<!-- Character Info Grid -->
<div class="sheet-charinfo-grid">
<!-- Column 1: Wide -->
<div class="charinfo-column wide-column">
<div class="charinfo-block">
<label>Character Name</label>
<input type="text" name="attr_character_name" class="char-name-input" />
</div>
<div class="charinfo-block charinfo-combined">
<label>Class / Level</label>
<div class="class-level-wrapper">
<input type="text" name="attr_class" list="class" class="class-input"/>
<span class="class-level-slash">/</span>
<input type="number" name="attr_level" class="level-input" value="1" min="1" />
</div>
</div>
</div>
<!-- Column 2: Narrow -->
<div class="charinfo-column narrow-column">
<div class="charinfo-block">
<label>Nickname</label>
<input type="text" name="attr_nickname" />
</div>
<div class="charinfo-block">
<label>Size</label>
<input type="text" name="attr_size" list="size" />
</div>
</div>
<!-- Column 3: Medium -->
<div class="charinfo-column medium-column">
<div class="charinfo-block">
<label>Ancestry</label>
<input type="text" name="attr_ancestry" list="ancestry" />
</div>
<div class="charinfo-block">
<label>Background</label>
<input type="text" name="attr_background" list="backgrounds" />
</div>
</div>
</div>
</div>
</div>
<!-- End of Info Grid -->
<!-- Character Tab Main Sheet -->
<div class="sheet-main-content">
<!-- Upper Content Section -->
<div class="upper-content-section">
<!-- Start of Core Abilities -->
<div class="abilities-container">
<div class="abilities-header">Core Stats</div>
<!-- STR -->
<input type="hidden" name="attr_str_key" value="0" />
<div class="ability-cell">
<div class="ability-wrapper">
<button type="roll" name="roll_str" value="&{template:custom} {{charname=@{display_name}}} {{name=STR Check}} {{result=@{str_roll}}}" class="roll-ability">STR</button>
<div class="input-container">
<input type="checkbox" id="adv_str" class="ability-checkbox hidden-checkbox" name="attr_adv_str" value="on">
<label for="adv_str" class="custom-checkbox adv"></label>
<input type="number" class="ability-input" name="attr_str" value="0" />
<input type="checkbox" id="disadv_str" class="ability-checkbox hidden-checkbox" name="attr_disadv_str" value="on">
<label for="disadv_str" class="custom-checkbox disadv"></label>
</div>
</div>
</div>
<!-- DEX -->
<input type="hidden" name="attr_dex_key" value="0" />
<div class="ability-cell">
<div class="ability-wrapper">
<button type="roll" name="roll_dex" value="&{template:custom} {{charname=@{display_name}}} {{name=DEX Check}} {{result=@{dex_roll}}}" class="roll-ability">DEX</button>
<div class="input-container">
<input type="checkbox" id="adv_dex" class="ability-checkbox hidden-checkbox" name="attr_adv_dex" value="on">
<label for="adv_dex" class="custom-checkbox adv"></label>
<input type="number" class="ability-input" name="attr_dex" value="0" />
<input type="checkbox" id="disadv_dex" class="ability-checkbox hidden-checkbox" name="attr_disadv_dex" value="on">
<label for="disadv_dex" class="custom-checkbox disadv"></label>
</div>
</div>
</div>
<!-- INT -->
<input type="hidden" name="attr_int_key" value="0" />
<div class="ability-cell">
<div class="ability-wrapper">
<button type="roll" name="roll_int" value="&{template:custom} {{charname=@{display_name}}} {{name=INT Check}} {{result=@{int_roll}}}" class="roll-ability">INT</button>
<div class="input-container">
<input type="checkbox" id="adv_int" class="ability-checkbox hidden-checkbox" name="attr_adv_int" value="on">
<label for="adv_int" class="custom-checkbox adv"></label>
<input type="number" class="ability-input" name="attr_int" value="0" />
<input type="checkbox" id="disadv_int" class="ability-checkbox hidden-checkbox" name="attr_disadv_int" value="on">
<label for="disadv_int" class="custom-checkbox disadv"></label>
</div>
</div>
</div>
<!-- WIL -->
<input type="hidden" name="attr_wil_key" value="0" />
<div class="ability-cell">
<div class="ability-wrapper">
<button type="roll" name="roll_wil" value="&{template:custom} {{charname=@{display_name}}} {{name=WIL Check}} {{result=@{wil_roll}}}" class="roll-ability">WIL</button>
<div class="input-container">
<input type="checkbox" id="adv_wil" class="ability-checkbox hidden-checkbox" name="attr_adv_wil" value="on">
<label for="adv_wil" class="custom-checkbox adv"></label>
<input type="number" class="ability-input" name="attr_wil" value="0" />
<input type="checkbox" id="disadv_wil" class="ability-checkbox hidden-checkbox" name="attr_disadv_wil" value="on">
<label for="disadv_wil" class="custom-checkbox disadv"></label>
</div>
</div>
</div>
</div>
<!-- End of Core Abilities -->
<!-- Start of Secondary Abilities -->
<div class="secondary-stats-container">
<div class="secondary-stats-header">Secondary Stats</div>
<!-- Hit Points -->
<div class="secondary-stat-cell">
<label class="secondary-stat-label">Hit Points</label>
<div class="dual-inputs">
<input type="number" name="attr_HP" class="secondary-input" />
<span>/</span>
<input type="number" name="attr_HP_max" class="secondary-input" />
</div>
</div>
<!-- Temp HP -->
<div class="secondary-stat-cell">
<label class="secondary-stat-label">Temp HP</label>
<input type="number" name="attr_temp_HP" class="secondary-input" />
</div>
<!-- Wounds -->
<div class="secondary-stat-cell">
<label class="secondary-stat-label">Wounds</label>
<div class="dual-inputs">
<input type="number" name="attr_wounds" class="secondary-input" />
<span>/</span>
<input type="number" name="attr_wounds_max" class="secondary-input" />
</div>
</div>
<!-- Armor -->
<div class="secondary-stat-cell">
<label class="secondary-stat-label">Armor</label>
<input type="number" name="attr_armor" class="secondary-input" />
</div>
<!-- Initiative -->
<div class="secondary-stat-cell">
<div class="initiative-wrapper">
<button type="roll" name="roll_initiative"
value="&{template:custom} {{charname=@{display_name}}} {{name=Initiative}} {{result=[[ @{initiative_roll_formula} &{tracker} ]]}}"
class="roll-ability">
Initiative
</button>
<div class="initiative-inputs">
<input type="checkbox" id="adv_initiative" class="ability-checkbox hidden-checkbox" name="attr_adv_initiative" value="on">
<label for="adv_initiative" class="inline-checkbox"></label>
<input type="number" name="attr_initiative" class="secondary-input initiative-input" value="0" />
<input type="checkbox" id="disadv_initiative" class="ability-checkbox hidden-checkbox" name="attr_disadv_initiative" value="on">
<label for="disadv_initiative" class="inline-checkbox"></label>
</div>
</div>
</div>
<!-- Speed -->
<div class="secondary-stat-cell">
<label class="secondary-stat-label">Speed</label>
<input type="number" name="attr_speed" class="secondary-input" />
</div>
</div>
<!-- End of Secondary Abilities -->
<!-- Start of Skills Panel -->
<div class="skills-container">
<div class="skills-header">Skills</div>
<div class="skills-grid">
<!-- Arcana -->
<div class="skill-cell">
<div class="skill-wrapper">
<button type="roll" name="roll_arcana" value="&{template:custom} {{charname=@{display_name}}} {{name=Arcana}} {{result=@{arcana_roll}}}" class="roll-ability">Arcana</button>
<div class="skill-inputs">
<input type="checkbox" id="adv_arcana" class="ability-checkbox hidden-checkbox" name="attr_adv_arcana" value="on">
<label for="adv_arcana" class="inline-checkbox"></label>
<input type="number" name="attr_arcana" class="skill-input" value="0" />
<input type="checkbox" id="disadv_arcana" class="ability-checkbox hidden-checkbox" name="attr_disadv_arcana" value="on">
<label for="disadv_arcana" class="inline-checkbox"></label>
</div>
</div>
</div>
<!-- Examination -->
<div class="skill-cell">
<div class="skill-wrapper">
<button type="roll" name="roll_examination" value="&{template:custom} {{charname=@{display_name}}} {{name=Examination}} {{result=@{examination_roll}}}" class="roll-ability">Examination</button>
<div class="skill-inputs">
<input type="checkbox" id="adv_examination" class="ability-checkbox hidden-checkbox" name="attr_adv_examination" value="on">
<label for="adv_examination" class="inline-checkbox"></label>
<input type="number" name="attr_examination" class="skill-input" value="0" />
<input type="checkbox" id="disadv_examination" class="ability-checkbox hidden-checkbox" name="attr_disadv_examination" value="on">
<label for="disadv_examination" class="inline-checkbox"></label>
</div>
</div>
</div>
<!-- Finesse -->
<div class="skill-cell">
<div class="skill-wrapper">
<button type="roll" name="roll_finesse" value="&{template:custom} {{charname=@{display_name}}} {{name=Finesse}} {{result=@{finesse_roll}}}" class="roll-ability">Finesse</button>
<div class="skill-inputs">
<input type="checkbox" id="adv_finesse" class="ability-checkbox hidden-checkbox" name="attr_adv_finesse" value="on">
<label for="adv_finesse" class="inline-checkbox"></label>
<input type="number" name="attr_finesse" class="skill-input" value="0" />
<input type="checkbox" id="disadv_finesse" class="ability-checkbox hidden-checkbox" name="attr_disadv_finesse" value="on">
<label for="disadv_finesse" class="inline-checkbox"></label>
</div>
</div>
</div>
<!-- Influence -->
<div class="skill-cell">
<div class="skill-wrapper">
<button type="roll" name="roll_influence" value="&{template:custom} {{charname=@{display_name}}} {{name=Influence}} {{result=@{influence_roll}}}" class="roll-ability">Influence</button>
<div class="skill-inputs">
<input type="checkbox" id="adv_influence" class="ability-checkbox hidden-checkbox" name="attr_adv_influence" value="on">
<label for="adv_influence" class="inline-checkbox"></label>
<input type="number" name="attr_influence" class="skill-input" value="0" />
<input type="checkbox" id="disadv_influence" class="ability-checkbox hidden-checkbox" name="attr_disadv_influence" value="on">
<label for="disadv_influence" class="inline-checkbox"></label>
</div>
</div>
</div>
<!-- Insight -->
<div class="skill-cell">
<div class="skill-wrapper">
<button type="roll" name="roll_insight" value="&{template:custom} {{charname=@{display_name}}} {{name=Insight}} {{result=@{insight_roll}}}" class="roll-ability">Insight</button>
<div class="skill-inputs">
<input type="checkbox" id="adv_insight" class="ability-checkbox hidden-checkbox" name="attr_adv_insight" value="on">
<label for="adv_insight" class="inline-checkbox"></label>
<input type="number" name="attr_insight" class="skill-input" value="0" />
<input type="checkbox" id="disadv_insight" class="ability-checkbox hidden-checkbox" name="attr_disadv_insight" value="on">
<label for="disadv_insight" class="inline-checkbox"></label>
</div>
</div>
</div>
<!-- Lore -->
<div class="skill-cell">
<div class="skill-wrapper">
<button type="roll" name="roll_lore" value="&{template:custom} {{charname=@{display_name}}} {{name=Lore}} {{result=@{lore_roll}}}" class="roll-ability">Lore</button>
<div class="skill-inputs">
<input type="checkbox" id="adv_lore" class="ability-checkbox hidden-checkbox" name="attr_adv_lore" value="on">
<label for="adv_lore" class="inline-checkbox"></label>
<input type="number" name="attr_lore" class="skill-input" value="0" />
<input type="checkbox" id="disadv_lore" class="ability-checkbox hidden-checkbox" name="attr_disadv_lore" value="on">
<label for="disadv_lore" class="inline-checkbox"></label>
</div>
</div>
</div>
<!-- Might -->
<div class="skill-cell">
<div class="skill-wrapper">
<button type="roll" name="roll_might" value="&{template:custom} {{charname=@{display_name}}} {{name=Might}} {{result=@{might_roll}}}" class="roll-ability">Might</button>
<div class="skill-inputs">
<input type="checkbox" id="adv_might" class="ability-checkbox hidden-checkbox" name="attr_adv_might" value="on">
<label for="adv_might" class="inline-checkbox"></label>
<input type="number" name="attr_might" class="skill-input" value="0" />
<input type="checkbox" id="disadv_might" class="ability-checkbox hidden-checkbox" name="attr_disadv_might" value="on">
<label for="disadv_might" class="inline-checkbox"></label>
</div>
</div>
</div>
<!-- Naturecraft -->
<div class="skill-cell">
<div class="skill-wrapper">
<button type="roll" name="roll_naturecraft" value="&{template:custom} {{charname=@{display_name}}} {{name=Naturecraft}} {{result=@{naturecraft_roll}}}" class="roll-ability">Naturecraft</button>
<div class="skill-inputs">
<input type="checkbox" id="adv_naturecraft" class="ability-checkbox hidden-checkbox" name="attr_adv_naturecraft" value="on">
<label for="adv_naturecraft" class="inline-checkbox"></label>
<input type="number" name="attr_naturecraft" class="skill-input" value="0" />
<input type="checkbox" id="disadv_naturecraft" class="ability-checkbox hidden-checkbox" name="attr_disadv_naturecraft" value="on">
<label for="disadv_naturecraft" class="inline-checkbox"></label>
</div>
</div>
</div>
<!-- Perception -->
<div class="skill-cell">
<div class="skill-wrapper">
<button type="roll" name="roll_perception" value="&{template:custom} {{charname=@{display_name}}} {{name=Perception}} {{result=@{perception_roll}}}" class="roll-ability">Perception</button>
<div class="skill-inputs">
<input type="checkbox" id="adv_perception" class="ability-checkbox hidden-checkbox" name="attr_adv_perception" value="on">
<label for="adv_perception" class="inline-checkbox"></label>
<input type="number" name="attr_perception" class="skill-input" value="0" />
<input type="checkbox" id="disadv_perception" class="ability-checkbox hidden-checkbox" name="attr_disadv_perception" value="on">
<label for="disadv_perception" class="inline-checkbox"></label>
</div>
</div>
</div>
<!-- Stealth -->
<div class="skill-cell">
<div class="skill-wrapper">
<button type="roll" name="roll_stealth" value="&{template:custom} {{charname=@{display_name}}} {{name=Stealth}} {{result=@{stealth_roll}}}" class="roll-ability">Stealth</button>
<div class="skill-inputs">
<input type="checkbox" id="adv_stealth" class="ability-checkbox hidden-checkbox" name="attr_adv_stealth" value="on">
<label for="adv_stealth" class="inline-checkbox"></label>
<input type="number" name="attr_stealth" class="skill-input" value="0" />
<input type="checkbox" id="disadv_stealth" class="ability-checkbox hidden-checkbox" name="attr_disadv_stealth" value="on">
<label for="disadv_stealth" class="inline-checkbox"></label>
</div>
</div>
</div>
</div>
</div>
<!-- End of Skills Section -->
<!-- Start of Equipment Panel -->
<div class="equipment-container">
<!-- Inventory Section -->
<div class="inventory-header">
<span>Inventory Slots</span>
<div class="inventory-controls">
<button type="action" name="act_inv_remove" class="inv-ctl"></button>
<button type="action" name="act_inv_add" class="inv-ctl">+</button>
</div>
</div>
<div class="inventory-list">
<!-- 15 rows of inventory -->
<div class="inventory-row">
<button type="roll" name="roll_inventory_1"
value="&{template:inventory} {{charname=@{display_name}}} {{item=@{inventory_1}}}"
class="inventory-roll-button"></button>
<input type="hidden" name="attr_inventory_active_1" value="1" />
<input type="text" name="attr_inventory_1" class="inventory-input slot-1" />
</div>
<div class="inventory-row">
<button type="roll" name="roll_inventory_2"
value="&{template:inventory} {{charname=@{display_name}}} {{item=@{inventory_2}}}"
class="inventory-roll-button"></button>
<input type="hidden" name="attr_inventory_active_2" value="1" />
<input type="text" name="attr_inventory_2" class="inventory-input slot-2" />
</div>
<div class="inventory-row">
<button type="roll" name="roll_inventory_3"
value="&{template:inventory} {{charname=@{display_name}}} {{item=@{inventory_3}}}"
class="inventory-roll-button"></button>
<input type="hidden" name="attr_inventory_active_3" value="1" />
<input type="text" name="attr_inventory_3" class="inventory-input slot-3" />
</div>
<div class="inventory-row">
<button type="roll" name="roll_inventory_4"
value="&{template:inventory} {{charname=@{display_name}}} {{item=@{inventory_4}}}"
class="inventory-roll-button"></button>
<input type="hidden" name="attr_inventory_active_4" value="1" />
<input type="text" name="attr_inventory_4" class="inventory-input slot-4" />
</div>
<div class="inventory-row">
<button type="roll" name="roll_inventory_5"
value="&{template:inventory} {{charname=@{display_name}}} {{item=@{inventory_5}}}"
class="inventory-roll-button"></button>
<input type="hidden" name="attr_inventory_active_5" value="1" />
<input type="text" name="attr_inventory_5" class="inventory-input slot-5" />
</div>
<div class="inventory-row">
<button type="roll" name="roll_inventory_6"
value="&{template:inventory} {{charname=@{display_name}}} {{item=@{inventory_6}}}"
class="inventory-roll-button"></button>
<input type="hidden" name="attr_inventory_active_6" value="1" />
<input type="text" name="attr_inventory_6" class="inventory-input slot-6" />
</div>
<div class="inventory-row">
<button type="roll" name="roll_inventory_7"
value="&{template:inventory} {{charname=@{display_name}}} {{item=@{inventory_7}}}"
class="inventory-roll-button"></button>
<input type="hidden" name="attr_inventory_active_7" value="1" />
<input type="text" name="attr_inventory_7" class="inventory-input slot-7" />
</div>
<div class="inventory-row">
<button type="roll" name="roll_inventory_8"
value="&{template:inventory} {{charname=@{display_name}}} {{item=@{inventory_8}}}"
class="inventory-roll-button"></button>
<input type="hidden" name="attr_inventory_active_8" value="1" />
<input type="text" name="attr_inventory_8" class="inventory-input slot-8" />
</div>
<div class="inventory-row">
<button type="roll" name="roll_inventory_9"
value="&{template:inventory} {{charname=@{display_name}}} {{item=@{inventory_9}}}"
class="inventory-roll-button"></button>
<input type="hidden" name="attr_inventory_active_9" value="1" />
<input type="text" name="attr_inventory_9" class="inventory-input slot-9" />
</div>
<div class="inventory-row">
<button type="roll" name="roll_inventory_10"
value="&{template:inventory} {{charname=@{display_name}}} {{item=@{inventory_10}}}"
class="inventory-roll-button"></button>
<input type="hidden" name="attr_inventory_active_10" value="1" />
<input type="text" name="attr_inventory_10" class="inventory-input slot-10" />
</div>
<div class="inventory-row">
<button type="roll" name="roll_inventory_11"
value="&{template:inventory} {{charname=@{display_name}}} {{item=@{inventory_11}}}"
class="inventory-roll-button"></button>
<input type="hidden" name="attr_inventory_active_11" value="1" />
<input type="text" name="attr_inventory_11" class="inventory-input slot-11" />
</div>
<div class="inventory-row">
<button type="roll" name="roll_inventory_12"
value="&{template:inventory} {{charname=@{display_name}}} {{item=@{inventory_12}}}"
class="inventory-roll-button"></button>
<input type="hidden" name="attr_inventory_active_12" value="1" />
<input type="text" name="attr_inventory_12" class="inventory-input slot-12" />
</div>
<div class="inventory-row">
<button type="roll" name="roll_inventory_13"
value="&{template:inventory} {{charname=@{display_name}}} {{item=@{inventory_13}}}"
class="inventory-roll-button"></button>
<input type="hidden" name="attr_inventory_active_13" value="1" />
<input type="text" name="attr_inventory_13" class="inventory-input slot-13" />
</div>
<div class="inventory-row">
<button type="roll" name="roll_inventory_14"
value="&{template:inventory} {{charname=@{display_name}}} {{item=@{inventory_14}}}"
class="inventory-roll-button"></button>
<input type="hidden" name="attr_inventory_active_14" value="1" />
<input type="text" name="attr_inventory_14" class="inventory-input slot-14" />
</div>
<div class="inventory-row">
<button type="roll" name="roll_inventory_15"
value="&{template:inventory} {{charname=@{display_name}}} {{item=@{inventory_15}}}"
class="inventory-roll-button"></button>
<input type="hidden" name="attr_inventory_active_15" value="1" />
<input type="text" name="attr_inventory_15" class="inventory-input slot-15" />
</div>
<!-- Dynamic inventory rows begin here -->
<fieldset class="repeating_inventory">
<div class="inventory-row repinv-row">
<button type="roll" name="roll_repinv"
value="&{template:inventory} {{charname=@{display_name}}} {{item=@{item}}}"
class="inventory-roll-button">
</button>
<input type="text" name="attr_item" class="inventory-input repinv-input" placeholder="Extra item…" />
</div>
</fieldset>
</div>
</div>
<!-- End of Equipment Panel -->
</div><!-- End of upper content -->
<!-- Lower Content Section -->
<div class="lower-content-section">
<!-- Attacks Panel -->
<div class="attacks-wrapper">
<div class="attacks-header">
Attacks
</div>
<div class="attack-roll-setup">
<div class="attack-roll-inner">
<!-- Label Row -->
<div class="attack-roll-row labels">
<div class="attack-roll-cell roll-type">Roll Type</div>
<div class="attack-roll-cell adv-dis"># Adv/Dis</div>
<div class="attack-roll-cell crit">Crit?</div>
<div class="attack-roll-cell die-size">Die</div>
</div>
<!-- Input Row -->
<div class="attack-roll-row inputs">
<div class="attack-roll-cell roll-type">
<select name="attr_attack_roll_type">
<option value="normal" selected>Normal</option>
<option value="adv">Advantage</option>
<option value="dis">Disadvantage</option>
</select>
</div>
<div class="attack-roll-cell adv-dis">
<input type="number" name="attr_attack_adv_dis_dice" value="0" />
</div>
<button type="roll" name="roll_crit"
value="&{template:crit} {{die=@{attack_crit_die}}} {{roll=[[1@{attack_crit_die}!]]}}"
class="crit-roll-button">
<!-- icon or label here -->
</button>
<div class="attack-roll-cell die-size">
<select name="attr_attack_crit_die">
<option value="d4">d4</option>
<option value="d6">d6</option>
<option value="d8" selected>d8</option>
<option value="d10">d10</option>
<option value="d12">d12</option>
<option value="d20">d20</option>
</select>
</div>
</div>
</div>
</div>
<fieldset class="repeating_attacks">
<div class="attack-entry">
<!-- Toggle checkbox must come first for visibility control -->
<input type="checkbox" name="attr_attack_toggle" class="attack-toggle-checkbox" />
<!-- Top row with roll button and name -->
<div class="attack-top-row">
<button type="roll" name="roll_attack"
value="&{template:attack} {{charname=@{display_name}}} {{name=@{attack_name}}} {{damage=[[ @{attack_formula} ]]}} {{damagetype=@{attack_damage_type}}} {{actions=@{attack_actions}}} {{range=@{attack_range}}} {{target=@{attack_target}}}"
class="attack-roll-button">
</button>
<input type="text" name="attr_attack_name" class="attack-name-input" placeholder="Attack Name" />
</div>
<!-- Hidden input for the formula -->
<input type="hidden" name="attr_attack_formula" />
<input type="hidden" name="attr_roll_type" />
<input type="hidden" name="attr_adv_dis" />
<input type="hidden" name="attr_attack_roll_formula" value="1d8">
<!-- Toggled details section -->
<div class="attack-details">
<!-- Dice / Ability / Modifier row -->
<div class="attack-details-grid">
<div class="attack-details-row labels">
<div class="attack-detail-cell"># of Dice</div>
<div class="attack-detail-cell">Die Size</div>
<div class="attack-detail-cell">Ability</div>
<div class="attack-detail-cell">Adj.</div>
</div>
<div class="attack-details-row inputs">
<div class="attack-detail-cell">
<input type="number" name="attr_attack_num_dice" value="1" min="1" />
</div>
<div class="attack-detail-cell">
<select name="attr_attack_die">
<option value="d4">d4</option>
<option value="d6">d6</option>
<option value="d8" selected>d8</option>
<option value="d10">d10</option>
<option value="d12">d12</option>
<option value="d20">d20</option>
</select>
</div>
<div class="attack-detail-cell">
<select name="attr_attack_ability">
<option value="none">None</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="int">INT</option>
<option value="wil">WIL</option>
</select>
</div>
<input type="hidden" name="attr_attack_ability_mod" value="0">
<div class="attack-detail-cell">
<input type="number" name="attr_attack_static_mod" value="0" />
</div>
</div>
</div>
<!-- Attack Details -->
<div class="attack-description-layout">
<!-- First row: Labels -->
<div class="desc-row labels">
<div class="desc-label chat-icon">&#128172;</div>
<div class="desc-label damage-type-label">Damage Type</div>
</div>
<!-- First row: Inputs + roll -->
<div class="desc-row inputs">
<button type="roll" name="roll_attack_details"
value="&{template:attackdetail} {{charname=@{display_name}}} {{name=@{attack_name}}} {{damagetype=@{attack_damage_type}}} {{actions=@{attack_actions}}} {{range=@{attack_range}}} {{target=@{attack_target}}} {{notes=@{attack_notes}}}"
class="attack-detail-roll-button">
</button>
<input type="hidden" name="attr_attack_ability_dbg" value="">
<input type="text" name="attr_attack_damage_type" class="desc-input damage-type" list="dmgtype" />
</div>
<!-- Second row: Labels -->
<div class="desc-row labels">
<div class="desc-label action-label">Action(s)</div>
<div class="desc-label range-label">Rng/Rch</div>
<div class="desc-label target-label">Target</div>
</div>
<div class="desc-row inputs">
<input type="text" name="attr_attack_actions" class="desc-input action-input" />
<input type="text" name="attr_attack_range" class="desc-input range-input" />
<input type="text" name="attr_attack_target" class="desc-input target-input" />
</div>
<!-- Notes -->
<div class="desc-notes">
<label for="attr_attack_notes">Notes</label>
<textarea name="attr_attack_notes" rows="2"></textarea>
</div>
</div>
</div>
</div>
</fieldset>
</div>
<!-- End of Repeating Attacks -->
<!-- Spells Panel -->
<div class="spells-wrapper">
<div class="spells-header">
Spells
</div>
<div class="spells-mana-setup">
<div class="mana-row">
<span class="mana-label">Mana:</span>
<input type="number" name="attr_mana" min="0" class="mana-input" />
<span class="mana-slash">/</span>
<input type="number" name="attr_mana_max" min="0" class="mana-input" />
</div>
</div>
<!-- Repeating_spells section -->
<fieldset class="repeating_spells">
<div class="spell-entry">
<!-- Toggle checkbox first -->
<input type="checkbox" name="attr_spell_toggle" class="spell-toggle-checkbox" />
<!-- Top row: Roll button and spell name -->
<div class="spell-top-row">
<button type="roll" name="roll_spell_details"
value="&{template:spell} {{charname=@{display_name}}} {{name=@{spell_name}}} {{tier=@{spell_tier}}} {{actions=@{spell_actions}}} {{range=@{spell_range}}} {{target=@{spell_target}}} {{highlevels=@{spell_high_levels}}} {{upcast=@{spell_upcast}}} {{notes=@{spell_notes}}}"
class="attack-detail-roll-button">
</button>
<input type="text" name="attr_spell_name" class="spell-name-input" placeholder="Spell Name" />
</div>
<!-- Hidden section toggled open -->
<div class="spell-details">
<!-- Tier & Target -->
<div class="spell-detail-row">
<div class="spell-detail-block tier">
<label>Tier</label>
<select name="attr_spell_tier">
<option value="C">C</option>
<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>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
</select>
</div>
<div class="spell-detail-block target">
<label>Target</label>
<input type="text" name="attr_spell_target" />
</div>
</div>
<!-- Action(s) & Range/Reach -->
<div class="spell-detail-row">
<div class="spell-detail-block actions">
<label>Action(s)</label>
<input type="text" name="attr_spell_actions" />
</div>
<div class="spell-detail-block range">
<label>Range/Reach</label>
<input type="text" name="attr_spell_range" />
</div>
</div>
<!-- High Levels -->
<div class="spell-detail-row full">
<label>High Levels</label>
<input type="text" name="attr_spell_high_levels" />
</div>
<!-- Upcast -->
<div class="spell-detail-row full">
<label>Upcast</label>
<input type="text" name="attr_spell_upcast" />
</div>
<!-- Notes -->
<div class="spell-detail-row full">
<label>Notes</label>
<textarea name="attr_spell_notes" rows="2"></textarea>
</div>
</div>
</div>
</fieldset>
</div><!-- End of Spells Panel -->
<!-- Abilities & Other Panel -->
<div class="other-wrapper">
<div class="other-header">
Abilities & Other
</div>
<div class="hitdie-setup">
<div class="hitdie-row">
<!-- Roll Button -->
<button
type="roll"
name="roll_hitdie"
value="&{template:hitdie} {{title=Hit Die}} {{result=[[?{How many?|1}@{hit_die_size}]]}} {{die=@{hit_die_size}}}">
</button>
<!-- Label -->
<span class="hitdie-label">Hit Die:</span>
<!-- Current / Max -->
<input type="number" name="attr_hit_die" min="0" class="hitdie-input" />
<span class="hitdie-slash">/</span>
<input type="number" name="attr_hit_die_max" min="0" class="hitdie-input" />
<!-- Die Size Dropdown -->
<select name="attr_hit_die_size" class="hitdie-die-select">
<option value="d4">d4</option>
<option value="d6">d6</option>
<option value="d8" selected>d8</option>
<option value="d10">d10</option>
<option value="d12">d12</option>
<option value="d20">d20</option>
</select>
</div>
</div>
<fieldset class="repeating_other">
<div class="other-entry">
<!-- Toggle -->
<input type="checkbox" name="attr_other_toggle" class="other-toggle-checkbox" />
<!-- Top row: Roll button and name -->
<div class="other-top-row">
<button
type="roll"
name="roll_repeating_abilities_other"
value="&{template:other} {{charname=@{display_name}}} {{name=@{other_name}}} {{notes=@{other_notes}}}"
class="attack-roll-button">
</button>
<input type="text" name="attr_other_name" class="other-name-input" placeholder="Ability or Feature" />
</div>
<!-- Toggled detail section -->
<div class="other-details">
<div class="other-detail-row full">
<label for="attr_other_notes">Notes</label>
<textarea name="attr_other_notes" rows="2"></textarea>
</div>
</div>
</div>
</fieldset>
</div>
</div><!-- End of Lower Section -->
</div><!-- End of sheet main content -->
</div><!-- End of inner wrapper -->
</div><!-- End of Character Sheet Tab -->
<!-- Journal tab below this line -->
<div class="sheet-tab-content sheet-journal">
<div class="sheet-journal-columns">
<textarea name="attr_journal_col1"></textarea>
<textarea name="attr_journal_col2"></textarea>
<textarea name="attr_journal_co13"></textarea>
</div>
</div>
<!-- End of journal tab -->
<!-- Notes tab below this line -->
<div class="sheet-tab-content sheet-notes">
<div class="sheet-notes-columns">
<textarea name="attr_notes_col1"></textarea>
<textarea name="attr_notes_col2"></textarea>
<textarea name="attr_notes_col3"></textarea>
</div>
</div>
<!-- End of Notes tab -->
<!-- NPC tab below this line -->
<div class="sheet-tab-content sheet-npc">
<div class="sheet-tab-inner">
<!-- NPC Header -->
<div class="sheet-header">
<div class="character-title">
<div class="token-wrapper">
<img class="token-image" name="attr_character_token">
</div>
<span class="character-display" name="attr_character_name"></span>
</div>
<!-- Character Info -->
<div class="character-info">
<div class="npc-charinfo-row">
<div class="npc-charinfo-block">
<label>Character Name</label>
<input type="text" name="attr_character_name" class="char-name-input" />
</div>
<div class="npc-charinfo-block">
<label>Level</label>
<input type="text" name="attr_level" />
</div>
<div class="npc-charinfo-block">
<label>Size</label>
<input type="text" name="attr_size" list="size" />
</div>
</div>
</div>
<!-- NPC Type Flags -->
<div class="npc-flags">
<div class="npc-flag">
<label>
<input type="checkbox" name="attr_is_minion" value="1" />
<span class="npc-flag-title">Minion</span>
</label>
<div class="npc-flag-desc">
<ul>
<li>No HP. Any damage kills a minion.</li>
<li>One attack die. Can't crit.</li>
<li>Simplified Defense: Minion damage combines into a one attack.</li>
</ul>
</div>
</div>
<div class="npc-flag">
<label>
<input type="checkbox" name="attr_is_flunkie" value="1" />
<span class="npc-flag-title">Flunkie</span>
</label>
<div class="npc-flag-desc"><ul><li>Cant crit.</li></ul>
</div>
</div>
<div class="npc-flag">
<label>
<input type="checkbox" name="attr_is_legendary" value="1" />
<span class="npc-flag-title">Legendary</span>
</label>
<div class="npc-flag-desc">
<ul>
<li>Saves have advantage / disadvantage.</li>
<li>Gains new ability at half HP.</li>
<li>Last stand before final death.</li>
<li>Optional actions: Wind Up, Roar, Shove, etc.</li>
</ul>
</div>
</div>
</div>
<!-- NPC Main Content -->
<div class="sheet-main-content">
<div class="npc-upper-content-section">
<!-- Core Stats -->
<div class="abilities-container">
<div class="abilities-header">Core Stats</div>
<!-- STR -->
<input type="hidden" name="attr_str_key" value="0" />
<div class="ability-cell">
<div class="ability-wrapper">
<button type="roll" name="roll_str" value="&{template:custom} {{charname=@{display_name}}} {{name=STR Check}} {{result=@{str_roll}}}" class="roll-ability">STR</button>
<div class="input-container">
<input type="checkbox" id="adv_str" class="ability-checkbox hidden-checkbox" name="attr_adv_str" value="on">
<label for="adv_str" class="custom-checkbox adv"></label>
<input type="number" class="ability-input" name="attr_str" value="0" />
<input type="checkbox" id="disadv_str" class="ability-checkbox hidden-checkbox" name="attr_disadv_str" value="on">
<label for="disadv_str" class="custom-checkbox disadv"></label>
</div>
</div>
</div>
<!-- DEX -->
<input type="hidden" name="attr_dex_key" value="0" />
<div class="ability-cell">
<div class="ability-wrapper">
<button type="roll" name="roll_dex" value="&{template:custom} {{charname=@{display_name}}} {{name=DEX Check}} {{result=@{dex_roll}}}" class="roll-ability">DEX</button>
<div class="input-container">
<input type="checkbox" id="adv_dex" class="ability-checkbox hidden-checkbox" name="attr_adv_dex" value="on">
<label for="adv_dex" class="custom-checkbox adv"></label>
<input type="number" class="ability-input" name="attr_dex" value="0" />
<input type="checkbox" id="disadv_dex" class="ability-checkbox hidden-checkbox" name="attr_disadv_dex" value="on">
<label for="disadv_dex" class="custom-checkbox disadv"></label>
</div>
</div>
</div>
<!-- INT -->
<input type="hidden" name="attr_int_key" value="0" />
<div class="ability-cell">
<div class="ability-wrapper">
<button type="roll" name="roll_int" value="&{template:custom} {{charname=@{display_name}}} {{name=INT Check}} {{result=@{int_roll}}}" class="roll-ability">INT</button>
<div class="input-container">
<input type="checkbox" id="adv_int" class="ability-checkbox hidden-checkbox" name="attr_adv_int" value="on">
<label for="adv_int" class="custom-checkbox adv"></label>
<input type="number" class="ability-input" name="attr_int" value="0" />
<input type="checkbox" id="disadv_int" class="ability-checkbox hidden-checkbox" name="attr_disadv_int" value="on">
<label for="disadv_int" class="custom-checkbox disadv"></label>
</div>
</div>
</div>
<!-- WIL -->
<input type="hidden" name="attr_wil_key" value="0" />
<div class="ability-cell">
<div class="ability-wrapper">
<button type="roll" name="roll_wil" value="&{template:custom} {{charname=@{display_name}}} {{name=WIL Check}} {{result=@{wil_roll}}}" class="roll-ability">WIL</button>
<div class="input-container">
<input type="checkbox" id="adv_wil" class="ability-checkbox hidden-checkbox" name="attr_adv_wil" value="on">
<label for="adv_wil" class="custom-checkbox adv"></label>
<input type="number" class="ability-input" name="attr_wil" value="0" />
<input type="checkbox" id="disadv_wil" class="ability-checkbox hidden-checkbox" name="attr_disadv_wil" value="on">
<label for="disadv_wil" class="custom-checkbox disadv"></label>
</div>
</div>
</div>
</div><!-- End of Core Abilities -->
<!-- Secondary Stats -->
<div class="secondary-stats-container">
<!-- Hit Points, Temp HP, Wounds -->
<!-- Start of Secondary Abilities -->
<div class="secondary-stats-container">
<div class="secondary-stats-header">Secondary Stats</div>
<!-- Hit Points -->
<div class="secondary-stat-cell">
<label class="secondary-stat-label">Hit Points</label>
<div class="dual-inputs">
<input type="number" name="attr_HP" class="secondary-input" />
<span>/</span>
<input type="number" name="attr_HP_max" class="secondary-input" />
</div>
</div>
<!-- Temp HP -->
<div class="secondary-stat-cell">
<label class="secondary-stat-label">Temp HP</label>
<input type="number" name="attr_temp_HP" class="secondary-input" />
</div>
<!-- Wounds -->
<div class="secondary-stat-cell">
<label class="secondary-stat-label">Wounds</label>
<div class="dual-inputs">
<input type="number" name="attr_wounds" class="secondary-input" />
<span>/</span>
<input type="number" name="attr_wounds_max" class="secondary-input" />
</div>
</div>
<!-- Armor (dropdown), Initiative, Speed -->
<div class="secondary-stat-cell">
<label class="secondary-stat-label">Armor</label>
<select name="attr_armor" class="secondary-input">
<option value="U">U</option>
<option value="M">M</option>
<option value="H">H</option>
</select>
</div>
<!-- Initiative -->
<div class="secondary-stat-cell">
<div class="initiative-wrapper">
<button type="roll" name="roll_initiative"
value="&{template:custom} {{charname=@{display_name}}} {{name=Initiative}} {{result=[[ @{initiative_roll_formula} &{tracker} ]]}}"
class="roll-ability">
Initiative
</button>
<div class="initiative-inputs">
<input type="checkbox" id="adv_initiative" class="ability-checkbox hidden-checkbox" name="attr_adv_initiative" value="on">
<label for="adv_initiative" class="inline-checkbox"></label>
<input type="number" name="attr_initiative" class="secondary-input initiative-input" value="0" />
<input type="checkbox" id="disadv_initiative" class="ability-checkbox hidden-checkbox" name="attr_disadv_initiative" value="on">
<label for="disadv_initiative" class="inline-checkbox"></label>
</div>
</div>
</div>
<!-- Speed -->
<div class="secondary-stat-cell">
<label class="secondary-stat-label">Speed</label>
<input type="number" name="attr_speed" class="secondary-input" />
</div>
</div>
</div>
<div class="npc-loot-notes-container">
<div class="npc-loot-notes-section">
<div class="npc-loot-header-row">
<label for="attr_npc_loot">Loot</label>
<button type="roll" class="npc-loot-button" name="roll_npc_loot" value="&{template:npc} {{charname=@{character_name}}} {{name=Loot}} {{notes=@{npc_loot}}}"></button>
</div>
<textarea name="attr_npc_loot" rows="6" placeholder="Loot or treasures the NPC carries..."></textarea>
</div>
<div class="npc-loot-notes-section">
<label for="attr_npc_notes">Notes</label>
<textarea name="attr_npc_notes" rows="6" placeholder="Tactics, motivations, or any relevant notes..."></textarea>
</div>
</div>
</div><!-- End of NPC Upper Content -->
<!-- NPC Lower Content Section -->
<div class="lower-content-section">
<!-- Attacks Panel -->
<div class="attacks-wrapper">
<div class="attacks-header">
Attacks
</div>
<div class="attack-roll-setup">
<div class="attack-roll-inner">
<!-- Label Row -->
<div class="attack-roll-row labels">
<div class="attack-roll-cell roll-type">Roll Type</div>
<div class="attack-roll-cell adv-dis"># Adv/Dis</div>
<div class="attack-roll-cell crit">Crit?</div>
<div class="attack-roll-cell die-size">Die</div>
</div>
<!-- Input Row -->
<div class="attack-roll-row inputs">
<div class="attack-roll-cell roll-type">
<select name="attr_attack_roll_type">
<option value="normal" selected>Normal</option>
<option value="adv">Advantage</option>
<option value="dis">Disadvantage</option>
</select>
</div>
<div class="attack-roll-cell adv-dis">
<input type="number" name="attr_attack_adv_dis_dice" value="0" min="0" />
</div>
<div class="attack-roll-cell crit">
<!-- Crit: Public -->
<button type="roll" name="roll_crit_pub"
value="&{template:crit} {{die=@{attack_crit_die}}} {{roll=[[1@{attack_crit_die}!]]}}"
class="crit-roll-button">Public</button>
<!-- Crit: Whisper -->
<button type="roll" name="roll_crit_gm"
value="/w GM &{template:crit} {{die=@{attack_crit_die}}} {{roll=[[1@{attack_crit_die}!]]}}"
class="crit-roll-button">Whisper</button>
</div>
<div class="attack-roll-cell die-size">
<select name="attr_attack_crit_die">
<option value="d4">d4</option>
<option value="d6">d6</option>
<option value="d8" selected>d8</option>
<option value="d10">d10</option>
<option value="d12">d12</option>
<option value="d20">d20</option>
</select>
</div>
</div>
</div>
</div>
<fieldset class="repeating_attacks">
<div class="attack-entry">
<!-- Toggle checkbox must come first for visibility control -->
<input type="checkbox" name="attr_attack_toggle" class="attack-toggle-checkbox" />
<!-- Top row with roll button and name -->
<div class="attack-top-row">
<button type="roll" name="roll_attack_pub"
value="&{template:npcattack} {{name=@{attack_name}}} {{damage=[[ @{attack_formula} ]]}} {{damagetype=@{attack_damage_type}}} {{actions=@{attack_actions}}} {{range=@{attack_range}}} {{target=@{attack_target}}} {{notes=@{attack_notes}}}"
class="attack-roll-button">Public</button>
<button type="roll" name="roll_attack_gm"
value="/w GM &{template:npcattack} {{name=@{attack_name}}} {{damage=[[ @{attack_formula} ]]}} {{damagetype=@{attack_damage_type}}} {{actions=@{attack_actions}}} {{range=@{attack_range}}} {{target=@{attack_target}}} {{notes=@{attack_notes}}}"
class="attack-roll-button">Whisper</button>
<input type="text" name="attr_attack_name" class="attack-name-input" placeholder="Attack Name" />
</div>
<!-- Hidden input for the formula -->
<input type="hidden" name="attr_attack_formula" />
<input type="hidden" name="attr_roll_type" />
<input type="hidden" name="attr_adv_dis" />
<!-- Toggled details section -->
<div class="attack-details">
<!-- Dice / Ability / Modifier row -->
<div class="attack-details-grid">
<div class="attack-details-row labels">
<div class="attack-detail-cell"># of Dice</div>
<div class="attack-detail-cell">Die Size</div>
<div class="attack-detail-cell">Ability</div>
<div class="attack-detail-cell">Adj.</div>
</div>
<div class="attack-details-row inputs">
<div class="attack-detail-cell">
<input type="number" name="attr_attack_num_dice" value="1" min="1" />
</div>
<div class="attack-detail-cell">
<select name="attr_attack_die">
<option value="d4">d4</option>
<option value="d6">d6</option>
<option value="d8" selected>d8</option>
<option value="d10">d10</option>
<option value="d12">d12</option>
<option value="d20">d20</option>
</select>
</div>
<div class="attack-detail-cell">
<select name="attr_attack_ability">
<option value="0">None</option>
<option value="@{STR}">STR</option>
<option value="@{DEX}">DEX</option>
<option value="@{INT}">INT</option>
<option value="@{WIL}">WIL</option>
</select>
</div>
<div class="attack-detail-cell">
<input type="number" name="attr_attack_static_mod" value="0" />
</div>
</div>
</div>
<!-- Attack Details -->
<div class="attack-description-layout">
<!-- First row: Labels -->
<div class="desc-row labels">
<div class="desc-label chat-icon">&#128172;</div>
<div class="desc-label damage-type-label">Damage Type</div>
</div>
<!-- First row: Inputs + roll -->
<div class="desc-row inputs">
<button type="roll" name="roll_attack_details_pub"
value="&{template:attackdetail} {{charname=@{display_name}}} {{name=@{attack_name}}} {{damagetype=@{attack_damage_type}}} {{actions=@{attack_actions}}} {{range=@{attack_range}}} {{target=@{attack_target}}} {{notes=@{attack_notes}}}"
class="attack-detail-roll-button">Public</button>
<button type="roll" name="roll_attack_details_gm"
value="/w GM &{template:attackdetail} {{charname=@{display_name}}} {{name=@{attack_name}}} {{damagetype=@{attack_damage_type}}} {{actions=@{attack_actions}}} {{range=@{attack_range}}} {{target=@{attack_target}}} {{notes=@{attack_notes}}}"
class="attack-detail-roll-button">Whisper</button>
<input type="text" name="attr_attack_damage_type" class="desc-input damage-type" list="dmgtype" />
</div>
<!-- Second row: Labels -->
<div class="desc-row labels">
<div class="desc-label action-label">Action(s)</div>
<div class="desc-label range-label">Rng/Rch</div>
<div class="desc-label target-label">Target</div>
</div>
<div class="desc-row inputs">
<input type="text" name="attr_attack_actions" class="desc-input action-input" />
<input type="text" name="attr_attack_range" class="desc-input range-input" />
<input type="text" name="attr_attack_target" class="desc-input target-input" />
</div>
<!-- Notes -->
<div class="desc-notes">
<label for="attr_attack_notes">Notes</label>
<textarea name="attr_attack_notes" rows="2"></textarea>
</div>
</div>
</div>
</div>
</fieldset>
</div>
<!-- End of Repeating Attacks -->
<!-- Abilities & Other Panel -->
<div class="npc-other-wrapper">
<div class="npc-other-header">
Actions
</div>
<fieldset class="repeating_npc-other">
<div class="npc-other-entry">
<!-- Toggle -->
<input type="checkbox" name="attr_npc_other_toggle" class="npc-other-toggle-checkbox" />
<!-- Top row: Roll button and name -->
<div class="npc-other-top-row">
<button
type="roll"
name="roll_repeating_abilities_other"
value="&{template:npc} {{charname=@{display_name}}} {{name=@{other_name}}} {{notes=@{other_notes}}}"
class="npc-other-roll-button">Public
</button>
<button
type="roll"
name="roll_repeating_abilities_other"
value="/w GM &{template:npc} {{charname=@{display_name}}} {{name=@{other_name}}} {{notes=@{other_notes}}}"
class="npc-other-roll-button">Whisper
</button>
<input type="text" name="attr_other_name" class="npc-other-name-input" placeholder="Ability or Feature" />
</div>
<!-- Toggled detail section -->
<div class="npc-other-details">
<div class="npc-other-detail-row full">
<label for="attr_other_notes">Notes</label>
<textarea name="attr_other_notes" rows="2"></textarea>
</div>
</div>
</div>
</fieldset>
</div>
</div><!-- End of NPC Lower Section -->
</div>
</div>
</div>
</div><!-- End of NPC tab -->
<!-- Datalists -->
<datalist id="ancestry">
<option>Beastfolk</option>
<option>Birdfolk</option>
<option>Bunbun</option>
<option>Celestial</option>
<option>Changeling</option>
<option>Construct</option>
<option>Crystalborn</option>
<option>Dragonborn</option>
<option>Dryad</option>
<option>Dwarf</option>
<option>Elf</option>
<option>Fiendkin</option>
<option>Gnome</option>
<option>Goblin</option>
<option>Half-Giant</option>
<option>Halfling</option>
<option>Human</option>
<option>Kobold</option>
<option>Minotaur</option>
<option>Oozeling</option>
<option>Orc</option>
<option>Planarbeing</option>
<option>Ratfolk</option>
<option>Shroomling</option>
<option>Stoatling</option>
<option>Turtlefolk</option>
<option>Wyrdling</option>
</datalist>
<datalist id="backgrounds">
<option>Accidental Acrobat</option>
<option>Acrobat</option>
<option>Academy Dropout</option>
<option>At Home Underground</option>
<option>Back Out of Retirement</option>
<option>Bumblewise</option>
<option>Devoted Protector</option>
<option>Ear to the Ground</option>
<option>Fearless</option>
<option>Fey Touched</option>
<option>(Former) Con Artist</option>
<option>Haunted Past</option>
<option>History Buff</option>
<option>Home at Sea</option>
<option>Made a BAD Choice</option>
<option>Raised by Goblins</option>
<option>(Secretly) Undead</option>
<option>So Dumb I'm Smart Sometimes</option>
<option>Survivalist</option>
<option>Taste for the Finer Things</option>
<option>Tradesman/Artisan</option>
<option>What? I've Been Around</option>
<option>Wild One</option>
<option>Wily Underdog</option>
</datalist>
<datalist id="class">
<option>Berserker</option>
<option>Cheat</option>
<option>Commander</option>
<option>Hexbinder</option>
<option>Hunter</option>
<option>Luckshifter</option>
<option>Mage</option>
<option>Oathsworn</option>
<option>Shadowmancer</option>
<option>Shepherd</option>
<option>Songweaver</option>
<option>Stormshifter</option>
<option>Zephyr</option>
</datalist>
<datalist id="size">
<option>Tiny</option>
<option>Small</option>
<option>Medium</option>
<option>Large</option>
<option>Huge</option>
<option>Gargantuan</option>
</datalist>
<datalist id="dmgtype">
<option>Acid</option>
<option>Bludgeoning</option>
<option>Cold</option>
<option>Elemental</option>
<option>Fire</option>
<option>Force</option>
<option>Lightning</option>
<option>Necrotic</option>
<option>Physical</option>
<option>Piercing</option>
<option>Poison</option>
<option>Psychic</option>
<option>Radiant</option>
<option>Slashing</option>
<option>Thunder</option>
</datalist>
<!-- Roll templates below this line -->
<rolltemplate class="sheet-rolltemplate-custom">
<div class="sheet-template-container">
<div class="sheet-template-header">{{charname}} {{name}}</div>
<div class="sheet-template-body">
<div class="sheet-result-box">{{result}}</div>
</div>
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-macro">
<div class="sheet-template-container">
{{#name}}<div class="sheet-template-header">{{name}}</div>{{/name}}
{{#source}}<div class="sheet-template-subheader">{{source}}</div>{{/source}}
{{#description}}
<div class="sheet-template-body">
<div class="sheet-inventory-result-box">{{description}}</div>
</div>
{{/description}}
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-inventory">
<div class="sheet-template-container">
<div class="sheet-template-header" style="background:#a47764;color:white;">
Inventory Slot
</div>
<div class="sheet-template-body">
<div class="sheet-inventory-result-box" style="border:2px solid #a47764;background:#fff;color:#4b2e24;padding:6px 12px;margin:8px 0 0 0; border-radius:6px;font-size:1.2em;font-family:'Crimson Text',serif;">
{{item}}
</div>
<div style="margin-top:10px;color:#a47764;font-size:1em;">
<b>{{charname}}</b>
</div>
</div>
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-attack">
<div class="sheet-template-container">
<div class="sheet-template-header">{{name}}</div>
<div class="sheet-template-body">
<div style="text-align:center; font-size:1.4em; margin-bottom:8px;">
<span style="font-weight:bold;">{{damage}}</span>
<span>{{damagetype}} damage</span>
</div>
<div style="display:flex; justify-content:center; align-items:center; gap:18px; margin-bottom:4px; text-align:center;">
<span><b>Actions:</b> {{actions}}</span>
<span><b>Range:</b> {{range}} Sq</span>
<span><b>Target:</b> {{target}}</span>
</div>
</div>
<div style="text-align:center; font-weight:bold; margin-top:2px;">
{{#rollWasCrit() damage}}<span class="sheet-critical-text">CRIT!</span>{{/rollWasCrit() damage}}
{{#rollWasFumble() damage}}<span class="sheet-miss-text">MISS!</span>{{/rollWasFumble() damage}}
</div>
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-crit">
<div class="sheet-template-container">
<div class="sheet-template-header">Critical Roll</div>
<div class="sheet-template-body">
<span class="sheet-crit-dice">
{{#die}}
<b>Die:</b> {{die}}
{{/die}}
</span>
<div class="sheet-result-flex">
<span class="sheet-result-box">{{roll}}</span>
</div>
{{#notes}}
<div class="sheet-notes">{{notes}}</div>
{{/notes}}
</div>
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-attackdetail">
<div class="sheet-template-container">
<div class="sheet-template-header">{{charname}} — Attack</div>
{{#name}}
<div class="sheet-subheader">{{name}}</div>
{{/name}}
<div class="sheet-template-body">
{{#damagetype}}<div><strong>Damage Type:</strong> {{damagetype}}</div>{{/damagetype}}
{{#actions}}<div><strong>Action(s):</strong> {{actions}}</div>{{/actions}}
{{#range}}<div><strong>Range/Reach:</strong> {{range}}</div>{{/range}}
{{#target}}<div><strong>Target:</strong> {{target}}</div>{{/target}}
{{#notes}}
<div class="sheet-notes">{{notes}}</div>
{{/notes}}
</div>
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-spell">
<div class="sheet-template-container">
<div class="sheet-template-header">{{charname}} — Spell</div>
{{#name}}
<div class="sheet-subheader">{{name}}</div>
{{/name}}
<div class="sheet-template-body">
{{#tier}}<div><strong>Tier:</strong> {{tier}}</div>{{/tier}}
{{#actions}}<div><strong>Action(s):</strong> {{actions}}</div>{{/actions}}
{{#range}}<div><strong>Range/Reach:</strong> {{range}}</div>{{/range}}
{{#target}}<div><strong>Target:</strong> {{target}}</div>{{/target}}
{{#highlevels}}<div><strong>High Levels:</strong> {{highlevels}}</div>{{/highlevels}}
{{#upcast}}<div><strong>Upcast:</strong> {{upcast}}</div>{{/upcast}}
{{#notes}}<div class="sheet-notes">{{notes}}</div>{{/notes}}
</div>
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-other">
<div class="sheet-template-container">
<div class="sheet-template-header">{{charname}} — Ability/Other</div>
{{#name}}
<div class="sheet-subheader">{{name}}</div>
{{/name}}
<div class="sheet-template-body">
{{#notes}}
<div class="sheet-notes">{{notes}}</div>
{{/notes}}
</div>
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-hitdie">
<div class="sheet-template-container">
<div class="sheet-template-header">Hit Die</div>
<div class="sheet-template-body">
<div class="sheet-result-box">{{result}}</div>
<div class="sheet-hitdie-detail">
<span>Rolled: <b>{{die}}</b></span>
</div>
</div>
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-npc">
<div class="sheet-template-container">
<div class="sheet-template-header">{{charname}} — Action</div>
{{#name}}
<div class="sheet-subheader">{{name}}</div>
{{/name}}
<div class="sheet-template-body">
{{#notes}}
<div class="sheet-notes">{{notes}}</div>
{{/notes}}
</div>
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-npcattack">
<div class="sheet-template-container">
<div class="sheet-template-header">{{name}}</div>
<div class="sheet-template-body">
<div style="text-align:center; font-size:1.4em; margin-bottom:8px;">
<span style="font-weight:bold;">{{damage}}</span>
<span>{{damagetype}} damage</span>
</div>
<div style="display:flex; justify-content:center; align-items:center; gap:18px; margin-bottom:4px; text-align:center;">
<span><b>Actions:</b> {{actions}}</span>
<span><b>Range:</b> {{range}} Sq</span>
<span><b>Target:</b> {{target}}</span>
</div>
</div>
<div class="sheet-template-body">
{{#notes}}
<div class="sheet-notes">{{notes}}</div>
{{/notes}}
</div>
<div style="text-align:center; font-weight:bold; margin-top:2px;">
{{#rollWasCrit() damage}}<span class="sheet-critical-text">CRIT!</span>{{/rollWasCrit() damage}}
{{#rollWasFumble() damage}}<span class="sheet-miss-text">MISS!</span>{{/rollWasFumble() damage}}
</div>
</div>
</rolltemplate>
<!-- End of rolltemplates -->
<!-- Sheetworkers below this line -->
<script type="text/worker">
const buttonlist = ["character", "journal", "notes", "npc"];
buttonlist.forEach(button => {
on(`clicked:${button}`, () => {
setAttrs({ sheetTab: button });
});
});
// Sheetworker to roll advantage and disadvantage for ability rolls
["str", "dex", "int", "wil", "arcana", "examination", "finesse", "influence", "insight", "lore", "might", "naturecraft", "perception", "stealth"].forEach(function(stat) {
on(`sheet:opened change:${stat} change:adv_${stat} change:disadv_${stat}`, function() {
getAttrs([`adv_${stat}`, `disadv_${stat}`], function(values) {
const adv = values[`adv_${stat}`] === "on";
const dis = values[`disadv_${stat}`] === "on";
let formula = `[[1d20 + @{${stat}}]]`; // normal
if (adv && !dis) {
formula = `[[2d20kh1 + @{${stat}}]]`; // advantage
} else if (dis && !adv) {
formula = `[[2d20kl1 + @{${stat}}]]`; // disadvantage
}
let update = {};
update[`${stat}_roll`] = formula;
setAttrs(update, { silent: true });
});
});
});
//Sheetworker for initiative rolls
on("sheet:opened change:initiative change:adv_initiative change:disadv_initiative", function() {
getAttrs(["adv_initiative", "disadv_initiative"], function(values) {
const adv = values["adv_initiative"] === "on";
const dis = values["disadv_initiative"] === "on";
let formula = "1d20"; // normal
if (adv && !dis) {
formula = "2d20kh1"; // advantage
} else if (dis && !adv) {
formula = "2d20kl1"; // disadvantage
}
setAttrs({
initiative_roll: `[[${formula} + @{initiative}]]`,
initiative_roll_formula: `${formula} + @{initiative}`
}, { silent: true });
});
});
// Sheetworker to determine displayname if there is a nickname
on("sheet:opened change:nickname change:character_name", function() {
getAttrs(["nickname", "character_name"], function(values) {
const nickname = values.nickname && values.nickname.trim();
const charname = values.character_name;
const display = nickname || charname;
setAttrs({ display_name: display }, { silent: true });
});
});
// Sheetworker to highlight KEY abilities
on("change:class", function() {
getAttrs(["class"], function(v) {
let update = {
STR_key: "0",
DEX_key: "0",
INT_key: "0",
WIL_key: "0"
};
switch (v.class) {
case "Berserker":
update.STR_key = "1";
update.DEX_key = "1";
break;
case "Cheat":
update.DEX_key = "1";
update.INT_key = "1";
break;
case "Commander":
update.STR_key = "1";
update.INT_key = "1";
break;
case "Hunter":
update.DEX_key = "1";
update.WIL_key = "1";
break;
case "Luckshifter":
update.DEX_key = "1";
update.INT_key = "1";
break;
case "Mage":
update.INT_key = "1";
update.WIL_key = "1";
break;
case "Oathsworn":
update.STR_key = "1";
update.WIL_key = "1";
break;
case "Shadowmancer":
update.INT_key = "1";
update.DEX_key = "1";
break;
case "Shepherd":
update.WIL_key = "1";
update.STR_key = "1";
break;
case "Songweaver":
update.WIL_key = "1";
update.INT_key = "1";
break;
case "Stormshifter":
update.WIL_key = "1";
update.DEX_key = "1";
break;
case "Zephyr":
update.DEX_key = "1";
update.STR_key = "1";
break;
case "Hexbinder":
update.WIL_key = "1";
update.INT_key = "1";
break;
default:
break;
}
setAttrs(update);
});
});
// Sheetwork for Character Name Title Section
on("sheet:opened change:nickname change:class", function() {
getAttrs(["nickname", "class"], function(values) {
const nickname = values.nickname || "";
const characterClass = values.class || "";
const display = nickname && characterClass
? `${nickname} the ${characterClass}`
: nickname || characterClass || "";
setAttrs({ header_display: display }, { silent: true });
});
});
// Sheetworker for Character Name as Nimble by Default
on("sheet:opened", function() {
getAttrs(["header_display"], function(values) {
if (!values.header_display) {
setAttrs({ header_display: "Nimble" }, { silent: true });
}
});
});
// Sheetworker for Inventory Slots
// Baseline inventory from STR *without* turning off extra manual slots
on("sheet:opened change:STR", function () {
const fields = ["STR"].concat(Array.from({length: 15}, (_, i) => `inventory_active_${i+1}`));
getAttrs(fields, function (values) {
const str = parseInt(values.STR, 10) || 0;
const baseline = Math.min(15, Math.max(1, 10 + str)); // between 115
const update = {};
for (let i = 1; i <= baseline; i++) {
if (values[`inventory_active_${i}`] !== "1") {
update[`inventory_active_${i}`] = "1";
}
}
// Do NOT force higher slots off here—let +/- control that.
if (Object.keys(update).length) setAttrs(update, { silent: true });
});
});
// Helper to read all active flags + texts at once
const invFields = () => {
const actives = Array.from({length: 15}, (_, i) => `inventory_active_${i+1}`);
const texts = Array.from({length: 15}, (_, i) => `inventory_${i+1}`);
return actives.concat(texts);
};
/* ===== Repeating Inventory Add/Remove ===== */
/* ADD: create a new repeating_inventory row */
on("clicked:inv_add", function () {
const id = generateRowID();
const prefix = `repeating_inventory_${id}_`;
const set = {};
// seed a blank item (or a placeholder if you prefer)
set[`${prefix}item`] = "";
setAttrs(set, { silent: true }, function () {
// Optional: move it to the bottom explicitly (not strictly required)
getSectionIDs("repeating_inventory", function (ids) {
const order = ids.concat([id]);
setSectionOrder("repeating_inventory", order);
});
});
});
/* REMOVE: delete the last repeating_inventory row (if any) */
on("clicked:inv_remove", function () {
getSectionIDs("repeating_inventory", function (ids) {
if (!ids || !ids.length) return; // nothing to remove
const lastId = ids[ids.length - 1];
removeRepeatingRow(`repeating_inventory_${lastId}`);
});
});
const buildAttackFormula = (rowID) => {
const prefix = `repeating_attacks_${rowID}_`;
const fields = [
`${prefix}attack_num_dice`,
`${prefix}attack_die`,
`${prefix}attack_ability`,
`${prefix}attack_static_mod`,
"STR", "DEX", "INT", "WIL",
"attack_roll_type",
"attack_adv_dis_dice"
];
getAttrs(fields, function(values) {
const numDice = parseInt(values[`${prefix}attack_num_dice`], 10) || 1;
const dieSize = values[`${prefix}attack_die`] || "d6";
const rollType = values["attack_roll_type"] || "normal";
const advDisDice = parseInt(values["attack_adv_dis_dice"], 10) || 0;
const staticMod = parseInt(values[`${prefix}attack_static_mod`], 10) || 0;
// --- GET ABILITY MODIFIER CORRECTLY ---
const ability = values[`${prefix}attack_ability`] || "none";
let abilityMod = 0;
if (["str", "dex", "int", "wil"].includes(ability)) {
// The sheet uses lowercase names for abilities!
abilityMod = parseInt(values[ability.toUpperCase()], 10) || 0;
}
// --------------------------------------
// Advantage/Disadvantage dice structure for primary die
const advDis = Math.abs(advDisDice);
// Extract the max face from dieSize (e.g., "d20" -> 20). Defaults to 20 if not found.
const dieMax = Number((dieSize.match(/\d+/) || [20])[0]);
const critFlags = `cs=${dieMax}cf=1`;
let primaryGroup = "";
if (advDisDice > 0) {
primaryGroup = `${advDis + 1}${dieSize}kh1${critFlags}`;
} else if (advDisDice < 0) {
primaryGroup = `${advDis + 1}${dieSize}kl1${critFlags}`;
} else {
primaryGroup = `1${dieSize}${critFlags}`;
}
// Add the rest of the damage dice (not affected by adv/dis)
const extraDice = Math.max(numDice - 1, 0);
let restDice = extraDice > 0 ? ` + ${extraDice}${dieSize}` : "";
// Modifiers string
let modString = "";
if (abilityMod !== 0) modString += ` + ${abilityMod}`;
if (staticMod !== 0) modString += ` + ${staticMod}`;
const fullFormula = `${primaryGroup}${restDice}${modString}`;
let update = {};
update[`${prefix}attack_formula`] = fullFormula;
setAttrs(update, { silent: true });
});
};
// Update attack formulas for every possible relevant field
on(
"change:repeating_attacks:attack_num_dice change:repeating_attacks:attack_die " +
"change:repeating_attacks:attack_ability change:repeating_attacks:attack_static_mod " +
"change:repeating_attacks remove:repeating_attacks change:attack_roll_type change:attack_adv_dis_dice",
function() {
getSectionIDs("repeating_attacks", function(ids) {
ids.forEach(buildAttackFormula);
});
}
);
// The number box always drives the dropdown!
on("change:attack_adv_dis_dice", function(eventInfo) {
const newVal = parseInt(eventInfo.newValue, 10) || 0;
let rollType = "normal";
if (newVal > 0) rollType = "adv";
else if (newVal < 0) rollType = "dis";
setAttrs({ attack_roll_type: rollType });
});
on("change:attack_roll_type", function(eventInfo) {
let advDis = 0;
if (eventInfo.newValue === "adv") advDis = 1;
else if (eventInfo.newValue === "dis") advDis = -1;
else advDis = 0;
setAttrs({ attack_adv_dis_dice: advDis });
});
</script>
<!-- End of sheetworkers -->