mirror of
https://github.com/Nighthawk42/roll20-character-sheets.git
synced 2026-08-30 03:40:32 +00:00
1875 lines
65 KiB
HTML
1875 lines
65 KiB
HTML
<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">💬</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>Can’t 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">💬</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 1–15
|
||
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 -->
|