Files
LFG a5a130266d Text Fixes & Added Functionality
Added Total Skill Ranks Tally & an automated roll for all Skills
-Clicking on a Skill now does 1d20+Skill Total for that skill.
-Fixed Text for Seafaring & Tactics
2026-04-13 16:30:50 -04:00

2484 lines
129 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.
<!--
Logical Fantasy Gaming (LFG)
Official Roll20 Character Sheet
Author: Daniel Brillat
System: Logical Fantasy Gaming (LFG)
Repository: https://github.com/LogicalFantasyGaming/lfg-roll20-character-sheet
All game mechanics and system content © Logical Fantasy Gaming.
Character sheet code may be reused with attribution.
-->
<div class="lfg-sheet">
<!-- sheet359: Sheet header line with logo -->
<div class="lfg-sheet-titlebar">
<img class="lfg-sheet-logo" src="https://raw.githubusercontent.com/LogicalFantasyGaming/lfg-roll20-character-sheet/main/assets/lfg-logo-horizontal.png" alt="Logical Fantasy Gaming">
</div>
<!-- TAB STATE -->
<input id="tab-front" class="tabstate" type="radio" name="attr_sheetTab" value="front" checked>
<input id="tab-back" class="tabstate" type="radio" name="attr_sheetTab" value="back">
<input id="tab-magic" class="tabstate" type="radio" name="attr_sheetTab" value="magic">
<!-- TAB BUTTONS -->
<div class="tabs">
<label class="tabbtn" for="tab-front">Front</label>
<label class="tabbtn" for="tab-back">Back</label>
<label class="tabbtn" for="tab-magic">Spells &amp; Magic</label>
</div>
<!-- ===================== FRONT ===================== -->
<div class="page page-front">
<!-- ===== Identity Strip (Paper-sheet order) ===== -->
<!-- Identity Strip Toggle -->
<input type="checkbox" class="id-toggle" name="attr_show_identity" id="show-identity">
<label class="id-toggle-btn" for="show-identity">Identity &amp; XP</label>
<div class="identity-strip">
<div class="id-grid">
<!-- Row 1 -->
<div class="id-field id-name">
<label>Character Name</label>
<input type="text" name="attr_Name">
</div>
<div class="id-field id-class">
<label>Class</label>
<input type="text" name="attr_Class">
</div>
<div class="id-field id-level">
<label>Level</label>
<input type="text" name="attr_Level">
</div>
<div class="id-xp">
<label>Experience Points</label>
<input type="text" name="attr_XP" maxlength="4" class="xp4" placeholder="XP">
</div>
<!-- Row 2 -->
<div class="id-field id-age">
<label>Age</label>
<input type="text" name="attr_Age">
</div>
<div class="id-field id-sex">
<label>Sex</label>
<input type="text" name="attr_Sex">
</div>
<div class="id-field id-height">
<label>Height</label>
<input type="text" name="attr_Height">
</div>
<div class="id-field id-weight">
<label>Weight</label>
<input type="text" name="attr_Weight">
</div>
<div class="id-field id-hair">
<label>Hair</label>
<input type="text" name="attr_HairColor">
</div>
<div class="id-field id-eyes">
<label>Eyes</label>
<input type="text" name="attr_EyeColor">
</div>
<div class="id-field id-race">
<label>Race</label>
<input type="text" name="attr_Race">
</div>
<!-- Row 3 -->
<div class="id-field id-morality">
<label>Morality</label>
<input type="text" name="attr_Morality">
</div>
<div class="id-field id-motivation1">
<label>Motivation 1</label>
<input type="text" name="attr_Motivation_1">
</div>
<div class="id-field id-motivation2">
<label>Motivation 2</label>
<input type="text" name="attr_Motivation_2">
</div>
<div class="id-field id-moralitypoints">
<label>Morality Points</label>
<input type="text" name="attr_Morality_Points" class="mp3" placeholder="MP">
</div>
<div class="id-row id-row-vision">
<div class="id-field id-vision">
<label>Vision &amp; Senses</label>
<input type="text" name="attr_Vision_Senses">
</div>
<div class="id-field id-languages">
<label>Languages</label>
<input type="text" name="attr_Languages">
</div>
</div>
</div>
</div>
<!-- (Front retained from v2 baseline) -->
<div class="grid top-two">
<div class="card core-stats-card">
<div class="card-title">Core Stats</div>
<div class="ability-block">
<div class="ability-header">
<div></div>
<div class="ability-col-title">Ability<br>Score</div>
<div class="ability-col-title">Ability<br>Mod</div>
</div>
<div class="ability-row">
<div class="ability-abbr">STR</div>
<input type="text" name="attr_STR" class="ability-box">
<input type="text" name="attr_STRMOD" class="ability-box" readonly>
</div>
<div class="ability-row">
<div class="ability-abbr">DEX</div>
<input type="text" name="attr_DEX" class="ability-box">
<input type="text" name="attr_DEXMOD" class="ability-box" readonly>
</div>
<div class="ability-row">
<div class="ability-abbr">CON</div>
<input type="text" name="attr_CON" class="ability-box">
<input type="text" name="attr_CONMOD" class="ability-box" readonly>
</div>
<div class="ability-row">
<div class="ability-abbr">INT</div>
<input type="text" name="attr_INT" class="ability-box">
<input type="text" name="attr_INTMOD" class="ability-box" readonly>
</div>
<div class="ability-row">
<div class="ability-abbr">WIS</div>
<input type="text" name="attr_WIS" class="ability-box">
<input type="text" name="attr_WISMOD" class="ability-box" readonly>
</div>
<div class="ability-row">
<div class="ability-abbr">CHA</div>
<input type="text" name="attr_CHA" class="ability-box">
<input type="text" name="attr_CHAMOD" class="ability-box" readonly>
</div>
<div class="ability-tokenline">
<div class="hp-drlabel">Confidence Tokens</div>
<input type="text" name="attr_Confidence_Tokens" class="hp-drbox ct-box">
</div>
</div>
<div class="hp-panel">
<div class="hp-panel-title">Hit Points</div>
<div class="hp-grid">
<div class="hp-cell">
<div class="hp-label">Max HP</div>
<input type="text" name="attr_HP" class="hp-box">
</div>
<div class="hp-cell">
<div class="hp-label">Current</div>
<input type="text" name="attr_Current_HP" class="hp-box">
</div>
<div class="hp-cell">
<div class="hp-label hp-label-small">Injured<br>Threshold</div>
<input type="text" name="attr_Injured_Threshold" class="hp-box" readonly>
</div>
</div>
<div class="hp-drgrid">
<div class="hp-drlabel">Damage Resistance (DR)</div>
<input type="text" name="attr_DR" class="hp-drbox" placeholder="DR">
</div>
</div>
<div class="corestat-row hr-row" style="margin-top:6px; margin-bottom:-3px; ">
<div class="corestat-label">Hit Rating</div>
<input type="text" name="attr_HR" class="corestat-box" placeholder="HR">
</div>
<div class="corestat-row movespeed-row">
<div class="corestat-label">Move Speed</div>
<input type="text" name="attr_Move" class="corestat-box">
</div>
</div>
<div class="right-col">
<div class="card initiative-card">
<div class="initiative-row">
<div class="corestat-label corestat-label-initiative">Initiative
<div class="initiative-reactions">
<span class="initiative-reactions-label">Reactions:</span>
<input type="text" name="attr_Reactions" class="initiative-reactions-box">
</div>
</div>
<input type="text" name="attr_Initiative2" class="corestat-box">
<!-- Two-state toggle button (does not affect layout) -->
<input type="checkbox" id="init-ready-toggle" class="init-ready-toggle" name="attr_InitReadyToggle">
<label class="init-ready-btn" for="init-ready-toggle"></label>
</div>
<div class="sh sh-rating" style="margin:1px 0 8px 0; text-align:left;">
Initiative = IR+WISMod+DEXMod
</div>
</div>
<div class="card armor-saves-card">
<div class="card-title">AC &amp; Saves</div>
<!-- Armor -->
<div class="armor-top">
<div class="armor-class-label">Armor Class</div>
<input type="text" name="attr_AC" class="armor-box armor-box-main" placeholder="AC">
<div class="temp-ac-block">
<div class="temp-ac-label">Temp AC</div>
<input type="text" name="attr_Temp_AC" class="armor-box armor-box-temp">
</div>
</div>
<div class="armor-lines">
<div class="armor-line">
<div class="armor-line-label">Flat-Footed AC</div>
<input type="text" name="attr_FFAC" class="armor-box armor-box-small" placeholder="FFAC">
</div>
<div class="armor-line">
<div class="armor-line-label">AC vs Critical</div>
<input type="text" name="attr_ACvsCrit" class="armor-box armor-box-small" placeholder="ACvC">
</div>
<div class="armor-line">
<div class="armor-line-label">Touch AC</div>
<input type="text" name="attr_TouchAC" class="armor-box armor-box-small" placeholder="Touch">
</div>
</div>
<!-- AC formula helper -->
<div class="ac-formula">AC = 10+AR+DEXMod+Other Modifiers</div>
<!-- Conditions -->
<div class="conditions-panel">
<div class="conditions-label">Conditions / Effects:</div>
<textarea name="attr_Conditions___Effects" class="conditions-text"></textarea>
</div>
<!-- Saves -->
<div class="saving-title">Saving Throws</div>
<div class="saving-header">
<div></div>
<div class="sh sh-total">Total<br>Save</div>
<div></div>
<div class="sh sh-rating">Save<br>Rating</div>
<div></div>
<div class="sh sh-ability">Ability<br>Mod</div>
<div></div>
<div class="sh sh-other">Other<br>Bonus</div>
</div>
<div class="save-row">
<button type="roll" class="save-name save-roll-btn" value="&{template:default} {{name=FORT Save}} {{Save Total=[[1d20 + @{FORT}]]}}">FORT</button>
<div class="save-cell">
<input type="text" name="attr_FORT" class="save-box save-total" readonly>
</div>
<div class="save-eq">=</div>
<div class="save-cell">
<input type="text" name="attr_FORT_Save_Rating" class="save-box">
</div>
<div class="save-plus">+</div>
<div class="save-cell">
<input type="text" name="attr_FORT_AbilityMod" class="save-box save-ability" placeholder="CON" readonly>
</div>
<div class="save-plus">+</div>
<div class="save-cell">
<input type="text" name="attr_FORT_OtherBonus" class="save-box">
</div>
</div>
<div class="save-row">
<button type="roll" class="save-name save-roll-btn" value="&{template:default} {{name=REF Save}} {{Save Total=[[1d20 + @{REF}]]}}">REF</button>
<div class="save-cell">
<input type="text" name="attr_REF" class="save-box save-total" readonly>
</div>
<div class="save-eq">=</div>
<div class="save-cell">
<input type="text" name="attr_REF_Save_Rating" class="save-box">
</div>
<div class="save-plus">+</div>
<div class="save-cell">
<input type="text" name="attr_REF_AbilityMod" class="save-box save-ability" placeholder="DEX" readonly>
</div>
<div class="save-plus">+</div>
<div class="save-cell">
<input type="text" name="attr_REF_OtherBonus" class="save-box">
</div>
</div>
<div class="save-row">
<button type="roll" class="save-name save-roll-btn" value="&{template:default} {{name=WILL Save}} {{Save Total=[[1d20 + @{WILL}]]}}">WILL</button>
<div class="save-cell">
<input type="text" name="attr_WILL" class="save-box save-total" readonly>
</div>
<div class="save-eq">=</div>
<div class="save-cell">
<input type="text" name="attr_WILL_Save_Rating" class="save-box">
</div>
<div class="save-plus">+</div>
<div class="save-cell">
<input type="text" name="attr_WILL_AbilityMod" class="save-box save-ability" placeholder="WIS" readonly>
</div>
<div class="save-plus">+</div>
<div class="save-cell">
<input type="text" name="attr_WILL_OtherBonus" class="save-box">
</div>
</div>
</div>
</div>
<div class="card armor-defenses-card">
<input type="checkbox" class="ad-card-toggle" name="attr_ui_armor_defenses_open" id="ad-card-toggle-armor-defenses" checked>
<label class="card-title ad-card-toggle-btn" for="ad-card-toggle-armor-defenses">Armor &amp; Defenses</label>
<div class="ad-card-collapsible">
<div class="ad-body">
<!-- ARMOR -->
<div class="ad-block ad-armor">
<div class="ad-block-title">Armor:<input type="text" name="attr_Equipped_Armor" class="ad-input ad-title-input" placeholder="Equipped Armor"></div>
<div class="ad-row ad-row-two">
<div class="ad-field ar-field">
<div class="ad-label red nowrap">Armor Rating:</div>
<input type="text" name="attr_Armor_Rating" class="ad-input ad-box ad-box-ar" placeholder="AR">
</div>
<div class="ad-field">
<div class="ad-label arvc-black">ARvC:</div>
<input type="text" name="attr_ARvC" class="ad-input ad-box ad-box-secondary" placeholder="ARvC">
</div>
</div>
<div class="ad-row ad-armor-type">
<input type="text" name="attr_Armor_Type" class="ad-input ad-line armor-type-full" placeholder="Armor Type & Info (Simple / Light / Med / Heavy)">
</div>
<div class="ad-divider"></div>
<div class="ad-row ad-dr-row">
<div class="ad-label red">Damage Resistance:</div>
<input type="text" name="attr_Armor_DR" class="corestat-box" placeholder="DR">
</div>
<div class="ad-row ad-row-two">
<div class="ad-field">
<div class="ad-label">Time to Don:</div>
<input type="text" name="attr_Time_to_Don" class="ad-input ad-line" placeholder="">
</div>
<div class="ad-field">
<div class="ad-label">Weight:</div>
<input type="text" name="attr_Armor_Weight" class="ad-input ad-line" placeholder="">
</div>
</div>
<div class="ad-row ad-details">
<label class="ad-check">
<span class="ad-check-label">Tattered (-1AC)</span>
<input type="checkbox" name="attr_Armor_Tattered">
</label>
<div class="ad-label red nowrap">Attack Penalty</div>
<input type="text" name="attr_Attack_Penalty" class="ad-input ad-box" placeholder="0">
</div>
</div>
<!-- OTHER DEFENSES -->
<div class="ad-block ad-otherdef">
<div class="ad-table">
<div class="ad-th ad-th-left">Other Defenses</div>
<div class="ad-th ad-th-right">+ to AC</div>
<div class="ad-td ad-td-left"><input type="text" name="attr_OD_Name1" class="ad-input ad-td-input" placeholder="DEX Mod"></div>
<div class="ad-td ad-td-right"><input type="text" name="attr_OD_DEX_Mod" class="ad-input ad-tablebox"></div>
<div class="ad-td ad-td-left"><input type="text" name="attr_OD_Name2" class="ad-input ad-td-input" placeholder="Shield Rating (SR)"></div>
<div class="ad-td ad-td-right"><input type="text" name="attr_OD_Shield_Rating" class="ad-input ad-tablebox"></div>
<div class="ad-td ad-td-left"><input type="text" name="attr_OD_Name3" class="ad-input ad-td-input" placeholder="Natural Armor"></div>
<div class="ad-td ad-td-right"><input type="text" name="attr_OD_Natural_Armor" class="ad-input ad-tablebox"></div>
<div class="ad-td ad-td-left"><input type="text" name="attr_OD_Name4" class="ad-input ad-td-input" placeholder=""></div>
<div class="ad-td ad-td-right"><input type="text" name="attr_OD_Other1" class="ad-input ad-tablebox"></div>
<div class="ad-td ad-td-left"><input type="text" name="attr_OD_Name5" class="ad-input ad-td-input" placeholder=""></div>
<div class="ad-td ad-td-right"><input type="text" name="attr_OD_Other2" class="ad-input ad-tablebox"></div>
<div class="ad-td ad-td-left"><input type="text" name="attr_OD_Name6" class="ad-input ad-td-input" placeholder=""></div>
<div class="ad-td ad-td-right"><input type="text" name="attr_OD_Other3" class="ad-input ad-tablebox"></div>
<div class="ad-parry">
<div class="ad-parry-label">Active Parry Roll: <span class="ad-parry-fixed">1d20 +</span></div>
<input type="text" name="attr_Active_Parry_Bonus" class="corestat-box">
</div>
<div class="ad-resist">
<div class="ad-resist-label">Resistances:</div>
<textarea name="attr_Resistances" class="ad-textarea" rows="2"></textarea>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="grid two">
<!-- REPEATING WEAPONS --> </div>
<div class="card weapons-card-full">
<div class="card-title">Weapons &amp; Attacks</div>
<fieldset class="repeating_weapons">
<div class="weapon-table">
<!-- Row 1 -->
<div class="wt-left wt-row1">
<div class="wt-weaponline">
<input type="text" name="attr_weapon_label" class="wt-weaponlabelbox" placeholder="Weapon">
</div>
<div class="wt-handline">
<div class="wt-handlabel">Hand:</div>
<input type="text" name="attr_weapon_hand" class="wt-hand" placeholder="R/L">
</div>
<div class="wt-bigaction">
<div class="wt-biglabel">Big Action Attack:</div>
</div>
</div>
<div class="wt-head wt-attackbonus"><div class="wt-headlabel">Attack Bonus</div><input type="text" name="attr_weapon_attack_top" class="wt-box wt-box-top" placeholder="Atk Bonus 1">
<button type="roll" class="wt-attackroll-btn" value="&{template:default} {{name=@{weapon_label} Attack Roll}} {{Total=[[1d20 + @{weapon_attack_top}]]}}">Attack Roll</button></div>
<div class="wt-head wt-critical"><div class="wt-headlabel">Critical</div><input type="text" name="attr_weapon_critical_top" class="wt-box wt-box-top" placeholder="Critical 1"></div>
<div class="wt-head wt-damage"><div class="wt-headlabel">Damage</div><input type="text" name="attr_weapon_damage_top" class="wt-box wt-box-top" placeholder="Damage 1"></div>
<!-- Row 2 -->
<div class="wt-left wt-row2">
<input type="text" name="attr_weapon_otherattack" class="wt-otherattack" placeholder="Other Attack">
</div>
<div class="wt-cell">
<input type="text" name="attr_weapon_attack" class="wt-box wt-box-secondary" placeholder="Atk Bonus 2">
</div>
<div class="wt-cell">
<input type="text" name="attr_weapon_critical" class="wt-box wt-box-secondary" placeholder="Critical 2">
</div>
<div class="wt-cell">
<input type="text" name="attr_weapon_damage" class="wt-box wt-box-secondary" placeholder="Damage 2">
</div>
<!-- Row 3 -->
<div class="wt-otherinfo">
<div class="wt-otherlabel">Other Info:</div>
<textarea name="attr_weapon_notes" class="weapon-notes-text" placeholder="AP / Traits / Range / Ammo / Notes"></textarea>
</div>
</div>
<hr>
</fieldset>
</div>
</div>
<div class="grid two">
<div class="card">
<div class="card-title">Feats & Abilities</div>
<div class="row"><textarea name="attr_Feat1" class="feats-notes-text" rows="1" placeholder="Feat 1"></textarea></div>
<div class="row"><textarea name="attr_Feat2" class="feats-notes-text" rows="1" placeholder="Feat 2"></textarea></div>
<div class="row"><textarea name="attr_Feat3" class="feats-notes-text" rows="1" placeholder="Feat 3"></textarea></div>
<div class="row"><textarea name="attr_Ability1" class="feats-notes-text" rows="1" placeholder="Ability 1"></textarea></div>
<div class="row"><textarea name="attr_Ability2" class="feats-notes-text" rows="1" placeholder="Ability 2"></textarea></div>
<div class="row"><textarea name="attr_Ability3" class="feats-notes-text" rows="1" placeholder="Ability 3"></textarea></div>
<!-- Optional extra rows -->
<fieldset class="repeating_featsabilities">
<div class="row"><textarea name="attr_name" class="feats-notes-text" rows="1" placeholder="Additional Feat / Ability"></textarea></div>
</fieldset>
</div>
<div class="card">
<div class="card-title">Story Notes</div>
<textarea name="attr_Note1"></textarea>
<textarea name="attr_Note2"></textarea>
<textarea name="attr_Note3"></textarea>
</div>
</div>
</div>
<!-- ===================== BACK ===================== -->
<div class="page page-back">
<div class="grid two">
<div class="card skills-card">
<div class="card-title">Skills</div>
<div class="skill-header">
<div>Total</div>
<div>Skill</div>
<div>Ability Mod</div>
<div>Bonus1</div>
<div>Bonus2</div>
<div>RANKS</div>
</div>
<div class="skill-row">
<input type="text" name="attr_Acrobatics" placeholder="Total" readonly readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Acrobatics}} {{Skill Check=[[1d20 + @{Acrobatics}]]}}">Acrobatics*</button>
<input type="text" name="attr_Acrobatics_AbilityMod" placeholder="DEX" readonly>
<input type="text" name="attr_AcroBonus1" placeholder="Bonus1">
<input type="text" name="attr_AcroBonus2" placeholder="Bonus2">
<input type="text" name="attr_Acro_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Bluff" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Bluff}} {{Skill Check=[[1d20 + @{Bluff}]]}}">Bluff</button>
<input type="text" name="attr_Bluff_AbilityMod" placeholder="CHA" readonly>
<input type="text" name="attr_BluffBonus1" placeholder="Bonus1">
<input type="text" name="attr_BluffBonus2" placeholder="Bonus2">
<input type="text" name="attr_Bluff_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Climb" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Climb*}} {{Skill Check=[[1d20 + @{Climb}]]}}">Climb*</button>
<input type="text" name="attr_Climb_AbilityMod" placeholder="STR" readonly>
<input type="text" name="attr_ClimbBonus1" placeholder="Bonus1">
<input type="text" name="attr_ClimbBonus2" placeholder="Bonus2">
<input type="text" name="attr_Climb_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Academia" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Craft (Academia)}} {{Skill Check=[[1d20 + @{Academia}]]}}">Craft (Academia)</button>
<input type="text" name="attr_Craft_Academia_AbilityMod" placeholder="INT" readonly>
<input type="text" name="attr_AcademiaBonus1" placeholder="Bonus1">
<input type="text" name="attr_AcademiaBonus2" placeholder="Bonus2">
<input type="text" name="attr_Academia_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Alchemy" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Craft (Alchemy)}} {{Skill Check=[[1d20 + @{Alchemy}]]}}">Craft (Alchemy)</button>
<input type="text" name="attr_Craft_Alchemy_AbilityMod" placeholder="INT" readonly>
<input type="text" name="attr_AlchemyBonus1" placeholder="Bonus1">
<input type="text" name="attr_AlchemyBonus2" placeholder="Bonus2">
<input type="text" name="attr_Alchemy_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Blacksmith" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Craft (Blacksmith)}} {{Skill Check=[[1d20 + @{Blacksmith}]]}}">Craft (Blacksmith)</button>
<input type="text" name="attr_Craft_Blacksmith_AbilityMod" placeholder="INT" readonly>
<input type="text" name="attr_BlacksmithBonus1" placeholder="Bonus1">
<input type="text" name="attr_BlacksmithBonus2" placeholder="Bonus2">
<input type="text" name="attr_Blacksmith_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Bow_Fletch" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Craft (Bow/Fletch)}} {{Skill Check=[[1d20 + @{Bow_Fletch}]]}}">Craft (Bow/Fletch)</button>
<input type="text" name="attr_Craft_Bow_Fletch_AbilityMod" placeholder="INT" readonly>
<input type="text" name="attr_Bow_FletchBonus1" placeholder="Bonus1">
<input type="text" name="attr_Bow_FletchBonus2" placeholder="Bonus2">
<input type="text" name="attr_Bow_Fletch_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Fine_Arts" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Craft (Fine Arts)*}} {{Skill Check=[[1d20 + @{Fine_Arts}]]}}">Craft (Fine Arts)*</button>
<input type="text" name="attr_Craft_Fine_Arts_AbilityMod" placeholder="IN/DX">
<input type="text" name="attr_FineArtsBonus1" placeholder="Bonus1">
<input type="text" name="attr_FineArtsBonus2" placeholder="Bonus2">
<input type="text" name="attr_Fine_Arts_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Jeweler" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Craft (Jeweler)*}} {{Skill Check=[[1d20 + @{Jeweler}]]}}">Craft (Jeweler)*</button>
<input type="text" name="attr_Craft_Jeweler_AbilityMod" placeholder="IN/DX">
<input type="text" name="attr_JewelerBonus1" placeholder="Bonus1">
<input type="text" name="attr_JewelerBonus2" placeholder="Bonus2">
<input type="text" name="attr_Jeweler_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Craft_Magic_Item" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Craft (Magic Item)}} {{Skill Check=[[1d20 + @{Craft_Magic_Item}]]}}">Craft (Magic Item)</button>
<input type="text" name="attr_Craft_Magic_Item_AbilityMod" placeholder="INT" readonly>
<input type="text" name="attr_CraftMagicItemBonus1" placeholder="Bonus1">
<input type="text" name="attr_CraftMagicItemBonus2" placeholder="Bonus2">
<input type="text" name="attr_Craft_Magic_Item_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Mechanisms" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Craft (Mechanisms)*}} {{Skill Check=[[1d20 + @{Mechanisms}]]}}">Craft (Mechanisms)*</button>
<input type="text" name="attr_Craft_Mechanisms_AbilityMod" placeholder="IN/DX">
<input type="text" name="attr_MechanismsBonus1" placeholder="Bonus1">
<input type="text" name="attr_MechanismsBonus2" placeholder="Bonus2">
<input type="text" name="attr_Mechanisms_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Stonework" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Craft (Stonework)}} {{Skill Check=[[1d20 + @{Stonework}]]}}">Craft (Stonework)</button>
<input type="text" name="attr_Craft_Stonework_AbilityMod" placeholder="INT" readonly>
<input type="text" name="attr_StoneworkBonus1" placeholder="Bonus1">
<input type="text" name="attr_StoneworkBonus2" placeholder="Bonus2">
<input type="text" name="attr_Stonework_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Tailor" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Craft (Tailor)}} {{Skill Check=[[1d20 + @{Tailor}]]}}">Craft (Tailor)</button>
<input type="text" name="attr_Craft_Tailor_AbilityMod" placeholder="INT" readonly>
<input type="text" name="attr_TailorBonus1" placeholder="Bonus1">
<input type="text" name="attr_TailorBonus2" placeholder="Bonus2">
<input type="text" name="attr_Tailor_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Woodwork" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Craft (Woodwork)}} {{Skill Check=[[1d20 + @{Woodwork}]]}}">Craft (Woodwork)</button>
<input type="text" name="attr_Craft_Woodwork_AbilityMod" placeholder="INT" readonly>
<input type="text" name="attr_WoodworkBonus1" placeholder="Bonus1">
<input type="text" name="attr_WoodworkBonus2" placeholder="Bonus2">
<input type="text" name="attr_Woodwork_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Diplomacy" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Diplomacy}} {{Skill Check=[[1d20 + @{Diplomacy}]]}}">Diplomacy</button>
<input type="text" name="attr_Diplomacy_AbilityMod" placeholder="CHA" readonly>
<input type="text" name="attr_DiplomacyBonus1" placeholder="Bonus1">
<input type="text" name="attr_DiplomacyBonus2" placeholder="Bonus2">
<input type="text" name="attr_Diplomacy_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Handle_Animal" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Handle Animal}} {{Skill Check=[[1d20 + @{Handle_Animal}]]}}">Handle Animal</button>
<input type="text" name="attr_Handle_Animal_AbilityMod" placeholder="WIS" readonly>
<input type="text" name="attr_HandleAnimalBonus1" placeholder="Bonus1">
<input type="text" name="attr_HandleAnimalBonus2" placeholder="Bonus2">
<input type="text" name="attr_Handle_Animal_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Heal" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Heal}} {{Skill Check=[[1d20 + @{Heal}]]}}">Heal</button>
<input type="text" name="attr_Heal_AbilityMod" placeholder="INT" readonly>
<input type="text" name="attr_HealBonus1" placeholder="Bonus1">
<input type="text" name="attr_HealBonus2" placeholder="Bonus2">
<input type="text" name="attr_Heal_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Hide" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Hide}} {{Skill Check=[[1d20 + @{Hide}]]}}">Hide</button>
<input type="text" name="attr_Hide_AbilityMod" placeholder="IN/WI">
<input type="text" name="attr_HideBonus1" placeholder="Bonus1">
<input type="text" name="attr_HideBonus2" placeholder="Bonus2">
<input type="text" name="attr_Hide_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Intimidate" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Intimidate}} {{Skill Check=[[1d20 + @{Intimidate}]]}}">Intimidate</button>
<input type="text" name="attr_Intimidate_AbilityMod" placeholder="CH/ST">
<input type="text" name="attr_IntimidateBonus1" placeholder="Bonus1">
<input type="text" name="attr_IntimidateBonus2" placeholder="Bonus2">
<input type="text" name="attr_Intimidate_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_JumpandSprint" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Jump & Sprint*}} {{Skill Check=[[1d20 + @{JumpandSprint}]]}}">Jump & Sprint*</button>
<input type="text" name="attr_Jump_and_Sprint_AbilityMod" placeholder="STR" readonly>
<input type="text" name="attr_JumpandSprintBonus1" placeholder="Bonus1">
<input type="text" name="attr_JumpandSprintBonus2" placeholder="Bonus2">
<input type="text" name="attr_Jump_and_Sprint_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Arcana" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Knowledge (Arcana)}} {{Skill Check=[[1d20 + @{Arcana}]]}}">Knowledge (Arcana)</button>
<input type="text" name="attr_Knowledge_Arcana_AbilityMod" placeholder="INT" readonly>
<input type="text" name="attr_ArcanaBonus1" placeholder="Bonus1">
<input type="text" name="attr_ArcanaBonus2" placeholder="Bonus2">
<input type="text" name="attr_Arcana_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Civilization" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Knowledge (Civilization)}} {{Skill Check=[[1d20 + @{Civilization}]]}}">Knowledge (Civilization)</button>
<input type="text" name="attr_Knowledge_Civilization_AbilityMod" placeholder="INT" readonly>
<input type="text" name="attr_CivilizationBonus1" placeholder="Bonus1">
<input type="text" name="attr_CivilizationBonus2" placeholder="Bonus2">
<input type="text" name="attr_Civilization_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Dungeons" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Knowledge (Dungeons)}} {{Skill Check=[[1d20 + @{Dungeons}]]}}">Knowledge (Dungeons)</button>
<input type="text" name="attr_Knowledge_Dungeons_AbilityMod" placeholder="INT" readonly>
<input type="text" name="attr_DungeonsBonus1" placeholder="Bonus1">
<input type="text" name="attr_DungeonsBonus2" placeholder="Bonus2">
<input type="text" name="attr_Dungeons_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Nature" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Knowledge (Nature)}} {{Skill Check=[[1d20 + @{Nature}]]}}">Knowledge (Nature)</button>
<input type="text" name="attr_Knowledge_Nature_AbilityMod" placeholder="INT" readonly>
<input type="text" name="attr_NatureBonus1" placeholder="Bonus1">
<input type="text" name="attr_NatureBonus2" placeholder="Bonus2">
<input type="text" name="attr_Nature_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Planes" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Knowledge (Planes)}} {{Skill Check=[[1d20 + @{Planes}]]}}">Knowledge (Planes)</button>
<input type="text" name="attr_Knowledge_Planes_AbilityMod" placeholder="INT" readonly>
<input type="text" name="attr_PlanesBonus1" placeholder="Bonus1">
<input type="text" name="attr_PlanesBonus2" placeholder="Bonus2">
<input type="text" name="attr_Planes_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Religion" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Knowledge (Religion)}} {{Skill Check=[[1d20 + @{Religion}]]}}">Knowledge (Religion)</button>
<input type="text" name="attr_Knowledge_Religion_AbilityMod" placeholder="INT" readonly>
<input type="text" name="attr_ReligionBonus1" placeholder="Bonus1">
<input type="text" name="attr_ReligionBonus2" placeholder="Bonus2">
<input type="text" name="attr_Religion_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Linguistics" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Linguistics}} {{Skill Check=[[1d20 + @{Linguistics}]]}}">Linguistics</button>
<input type="text" name="attr_Linguistics_AbilityMod" placeholder="INT" readonly>
<input type="text" name="attr_LinguisticsBonus1" placeholder="Bonus1">
<input type="text" name="attr_LinguisticsBonus2" placeholder="Bonus2">
<input type="text" name="attr_Linguistics_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Listen" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Listen}} {{Skill Check=[[1d20 + @{Listen}]]}}">Listen</button>
<input type="text" name="attr_Listen_AbilityMod" placeholder="WIS" readonly>
<input type="text" name="attr_ListenBonus1" placeholder="Bonus1">
<input type="text" name="attr_ListenBonus2" placeholder="Bonus2">
<input type="text" name="attr_Listen_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Move_Silently" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Move Silently*}} {{Skill Check=[[1d20 + @{Move_Silently}]]}}">Move Silently*</button>
<input type="text" name="attr_Move_Silently_AbilityMod" placeholder="DEX" readonly>
<input type="text" name="attr_MoveSilentlyBonus1" placeholder="Bonus1">
<input type="text" name="attr_MoveSilentlyBonus2" placeholder="Bonus2">
<input type="text" name="attr_Move_Silently_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Comedy_and_Stories" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Perform (Comedy & Stories)}} {{Skill Check=[[1d20 + @{Comedy_and_Stories}]]}}">Perform (Comedy & Stories)</button>
<input type="text" name="attr_Perform_Comedy_and_Stories_AbilityMod" placeholder="CHA" readonly>
<input type="text" name="attr_ComedyBonus1" placeholder="Bonus1">
<input type="text" name="attr_ComedyBonus2" placeholder="Bonus2">
<input type="text" name="attr_Comedy_and_Stories_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Dance_and_Motion" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Perform (Dance & Motion)*}} {{Skill Check=[[1d20 + @{Dance_and_Motion}]]}}">Perform (Dance & Motion)*</button>
<input type="text" name="attr_Perform_Dance_and_Motion_AbilityMod" placeholder="DEX" readonly>
<input type="text" name="attr_DanceBonus1" placeholder="Bonus1">
<input type="text" name="attr_DanceBonus2" placeholder="Bonus2">
<input type="text" name="attr_Dance_and_Motion_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Music_Aerobic" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Perform (Music - Aerobic)}} {{Skill Check=[[1d20 + @{Music_Aerobic}]]}}">Perform (Music - Aerobic)</button>
<input type="text" name="attr_Perform_Music___Aerobic_AbilityMod" placeholder="CHA" readonly>
<input type="text" name="attr_MusicAerobicBonus1" placeholder="Bonus1">
<input type="text" name="attr_MusicAerobicBonus2" placeholder="Bonus2">
<input type="text" name="attr_Music_Aerobic_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Music_Manual" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Perform (Music - Manual)}} {{Skill Check=[[1d20 + @{Music_Manual}]]}}">Perform (Music - Manual)</button>
<input type="text" name="attr_Perform_Music___Manual_AbilityMod" placeholder="CHA" readonly>
<input type="text" name="attr_MusicManualBonus1" placeholder="Bonus1">
<input type="text" name="attr_MusicManualBonus2" placeholder="Bonus2">
<input type="text" name="attr_Music_Manual_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Song_and_Poerty" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Perform (Song & Poetry)}} {{Skill Check=[[1d20 + @{Song_and_Poerty}]]}}">Perform (Song & Poetry)</button>
<input type="text" name="attr_Perform_Song_and_Poetry_AbilityMod" placeholder="CHA" readonly>
<input type="text" name="attr_SongPoetryBonus1" placeholder="Bonus1">
<input type="text" name="attr_SongPoetryBonus2" placeholder="Bonus2">
<input type="text" name="attr_Song_and_Poetry_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Perseverance" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Perseverance*}} {{Skill Check=[[1d20 + @{Perseverance}]]}}">Perseverance*</button>
<input type="text" name="attr_Perseverance_AbilityMod" placeholder="CO/WI">
<input type="text" name="attr_PerseveranceBonus1" placeholder="Bonus1">
<input type="text" name="attr_PerseveranceBonus2" placeholder="Bonus2">
<input type="text" name="attr_Perseverance_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Ride" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Ride*}} {{Skill Check=[[1d20 + @{Ride}]]}}">Ride*</button>
<input type="text" name="attr_Ride_AbilityMod" placeholder="DEX" readonly>
<input type="text" name="attr_RideBonus1" placeholder="Bonus1">
<input type="text" name="attr_RideBonus2" placeholder="Bonus2">
<input type="text" name="attr_Ride_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Seafaring" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Seafaring}} {{Skill Check=[[1d20 + @{Seafaring}]]}}">Seafaring</button>
<input type="text" name="attr_Knowledge_Seafaring_AbilityMod" placeholder="INT" readonly>
<input type="text" name="attr_SeafaringBonus1" placeholder="Bonus1">
<input type="text" name="attr_SeafaringBonus2" placeholder="Bonus2">
<input type="text" name="attr_Seafaring_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Sense_Motive" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Sense Motive}} {{Skill Check=[[1d20 + @{Sense_Motive}]]}}">Sense Motive</button>
<input type="text" name="attr_Sense_Motive_AbilityMod" placeholder="WIS" readonly>
<input type="text" name="attr_SenseMotiveBonus1" placeholder="Bonus1">
<input type="text" name="attr_SenseMotiveBonus2" placeholder="Bonus2">
<input type="text" name="attr_Sense_Motive_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Sleight_of_Hand" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Sleight of Hand*}} {{Skill Check=[[1d20 + @{Sleight_of_Hand}]]}}">Sleight of Hand*</button>
<input type="text" name="attr_Sleight_of_Hand_AbilityMod" placeholder="DEX" readonly>
<input type="text" name="attr_SleightofHandBonus1" placeholder="Bonus1">
<input type="text" name="attr_SleightofHandBonus2" placeholder="Bonus2">
<input type="text" name="attr_Sleight_of_Hand_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Spot" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Spot}} {{Skill Check=[[1d20 + @{Spot}]]}}">Spot</button>
<input type="text" name="attr_Spot_AbilityMod" placeholder="WIS" readonly>
<input type="text" name="attr_SpotBonus1" placeholder="Bonus1">
<input type="text" name="attr_SpotBonus2" placeholder="Bonus2">
<input type="text" name="attr_Spot_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Survival" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Survival}} {{Skill Check=[[1d20 + @{Survival}]]}}">Survival</button>
<input type="text" name="attr_Survival_AbilityMod" placeholder="WIS" readonly>
<input type="text" name="attr_SurvivalBonus1" placeholder="Bonus1">
<input type="text" name="attr_SurvivalBonus2" placeholder="Bonus2">
<input type="text" name="attr_Survival_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Swim" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Swim*}} {{Skill Check=[[1d20 + @{Swim}]]}}">Swim*</button>
<input type="text" name="attr_Swim_AbilityMod" placeholder="STR" readonly>
<input type="text" name="attr_SwimBonus1" placeholder="Bonus1">
<input type="text" name="attr_SwimBonus2" placeholder="Bonus2">
<input type="text" name="attr_Swim_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Tactics" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Knowledge (Tactics)}} {{Skill Check=[[1d20 + @{Tactics}]]}}">Knowledge (Tactics)</button>
<input type="text" name="attr_Knowledge_Tactics_AbilityMod" placeholder="INT" readonly>
<input type="text" name="attr_TacticsBonus1" placeholder="Bonus1">
<input type="text" name="attr_TacticsBonus2" placeholder="Bonus2">
<input type="text" name="attr_Tactics_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Under_Cover" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Under Cover}} {{Skill Check=[[1d20 + @{Under_Cover}]]}}">Under Cover</button>
<input type="text" name="attr_Under_Cover_AbilityMod" placeholder="CHA" readonly>
<input type="text" name="attr_UnderCoverBonus1" placeholder="Bonus1">
<input type="text" name="attr_UnderCoverBonus2" placeholder="Bonus2">
<input type="text" name="attr_Under_Cover_Ranks" placeholder="RANKS">
</div>
<div class="skill-row">
<input type="text" name="attr_Wrestling" placeholder="Total" readonly>
<button type="roll" class="skill-name skill-roll-btn" value="&{template:default} {{name=Wrestling}} {{Skill Check=[[1d20 + @{Wrestling}]]}}">Wrestling</button>
<input type="text" name="attr_Wrestling_AbilityMod" placeholder="STR" readonly>
<input type="text" name="attr_WrestlingBonus1" placeholder="Bonus1">
<input type="text" name="attr_WrestlingBonus2" placeholder="Bonus2">
<input type="text" name="attr_Wrestling_Ranks" placeholder="RANKS">
</div>
<div class="skills-physnote">* indicates Physical Skills affected by your Mobility Penalty</div>
<div class="row skills-totalranks">
<label>Total Skill Ranks</label>
<input type="text" name="attr_Total_Skill_Ranks" placeholder="Total Skill Ranks" readonly>
</div>
<hr>
<div class="card-title">Custom Skills</div>
<div class="skill-header skill-header-custom">
<div>Total</div>
<div>Skill</div>
<div>Ability Mod</div>
<div>Bonus1</div>
<div>Bonus2</div>
<div>RANKS</div>
</div>
<fieldset class="repeating_customskills">
<div class="skill-row skill-row-custom">
<input type="text" name="attr_total" placeholder="Total" readonly>
<input type="text" name="attr_name" placeholder="Skill Name">
<input type="text" name="attr_abilitymod" placeholder="Ability Mod">
<input type="text" name="attr_bonus1" placeholder="Bonus1">
<input type="text" name="attr_bonus2" placeholder="Bonus2">
<input type="text" name="attr_ranks" placeholder="RANKS">
</div>
</fieldset>
</div>
<div class="card gear-equipment">
<div class="card-title">Gear & Equipment</div>
<div class="subcard gold-money-subcard">
<div class="subcard-title">Gold &amp; Money</div>
<div class="equip-grid">
<div class="equip-row equip-header-row">
<div class="equip-col-header">Gems &amp; Valuables</div>
<div class="equip-col-header">Gold</div>
</div>
<div class="equip-sep"></div>
<div class="equip-row">
<textarea type="text" name="attr_GemsValuables" placeholder="Gems &amp; Valuables" class="gm-gems-text" rows="1" placeholder="Gems &amp; Valuables"></textarea>
<input type="text" name="attr_Gold" placeholder="Gold (GP)">
</div>
</div>
</div>
<div class="subcard equip-slots">
<div class="subcard-title">Equip Slots</div>
<div class="equip-grid">
<div class="equip-row equip-header-row">
<div class="equip-label"></div>
<div class="equip-col-header">Equipped Item</div>
<div class="equip-col-header">Weight</div>
</div>
<div class="equip-row">
<div class="equip-label">Head</div>
<input type="text" name="attr_Head_Equip" placeholder="Head Equip">
<input type="text" name="attr_HeadWeight" placeholder="Wt">
</div>
<div class="equip-row">
<div class="equip-label">Face</div>
<input type="text" name="attr_Face_Equip" placeholder="Face Equip">
<input type="text" name="attr_FaceWeight" placeholder="Wt">
</div>
<div class="equip-row">
<div class="equip-label">Neck</div>
<input type="text" name="attr_Neck_Equip" placeholder="Neck Equip">
<input type="text" name="attr_NeckWeight" placeholder="Wt">
</div>
<div class="equip-row">
<div class="equip-label">Torso-Under</div>
<input type="text" name="attr_Torso_Under_Equip" placeholder="Torso-Under Equip">
<input type="text" name="attr_TorsoUnderWeight" placeholder="Wt">
</div>
<div class="equip-row">
<div class="equip-label">Torso-Over</div>
<input type="text" name="attr_Torso_Over_Equip" placeholder="Torso-Over Equip">
<input type="text" name="attr_TorsoOverWeight" placeholder="Wt">
</div>
<div class="equip-row">
<div class="equip-label">Waist</div>
<input type="text" name="attr_Waist_Equip" placeholder="Waist Equip">
<input type="text" name="attr_WaistWeight" placeholder="Wt">
</div>
<div class="equip-row">
<div class="equip-label">Shoulders</div>
<input type="text" name="attr_Shoulders_Equip" placeholder="Shoulders Equip">
<input type="text" name="attr_ShouldersWeight" placeholder="Wt">
</div>
<div class="equip-row">
<div class="equip-label">Arm/Wrist</div>
<input type="text" name="attr_Arm_Wrist_Equip" placeholder="Arm/Wrist Equip">
<input type="text" name="attr_ArmsWeight" placeholder="Wt">
</div>
<div class="equip-row">
<div class="equip-label">Hands</div>
<input type="text" name="attr_Hands_Equip" placeholder="Hands Equip">
<input type="text" name="attr_HandsWeight" placeholder="Wt">
</div>
<div class="equip-row">
<div class="equip-label">Ring 1</div>
<input type="text" name="attr_Ring_1_Equip" placeholder="Ring 1 Equip">
<input type="text" name="attr_RingWeight1" placeholder="Wt">
</div>
<div class="equip-row">
<div class="equip-label">Ring 2</div>
<input type="text" name="attr_Ring_2_Equip" placeholder="Ring 2 Equip">
<input type="text" name="attr_RingWeight2" placeholder="Wt">
</div>
<div class="equip-row">
<div class="equip-label">Legs</div>
<input type="text" name="attr_Legs_Equip" placeholder="Legs Equip">
<input type="text" name="attr_LegsWeight" placeholder="Wt">
</div>
<div class="equip-row">
<div class="equip-label">Feet</div>
<input type="text" name="attr_Feet_Equip" placeholder="Feet Equip">
<input type="text" name="attr_FeetWeight" placeholder="Wt">
</div>
<div class="equip-row">
<div class="equip-label">Accessory</div>
<input type="text" name="attr_Accessory_Equip" placeholder="Accessory Equip">
<input type="text" name="attr_AccessoryWeight" placeholder="Wt">
</div>
<div class="equip-row">
<div class="equip-label">Carried Item 1</div>
<input type="text" name="attr_CarriedItem1_Equip" placeholder="Carried Item 1">
<input type="text" name="attr_CarriedItem1_Equip_Wt" placeholder="Wt">
</div>
<div class="equip-row">
<div class="equip-label">Carried Item 2</div>
<input type="text" name="attr_CarriedItem2_Equip" placeholder="Carried Item 2">
<input type="text" name="attr_CarriedItem2_Equip_Wt" placeholder="Wt">
</div>
<div class="equip-sep"></div>
<div class="equip-row equip-total-row">
<div class="equip-label">TOTAL EQUIPPED WEIGHT</div>
<input type="text" name="attr_TotalEquippedWeight" placeholder="TOTAL EQUIPPED WEIGHT" class="equip-total-weight" readonly>
</div>
</div>
</div>
<div class="subcard backpack-test">
<div class="subcard-title">Backpack</div>
<div class="equip-grid">
<div class="equip-row equip-header-row">
<div class="equip-col-header">Backpack Item</div>
<div class="equip-col-header">Weight</div>
</div>
<div class="equip-sep"></div>
<div class="equip-row">
<input type="text" name="attr_BackpackTest_Item_1" placeholder="Backpack Item 1">
<input type="text" name="attr_BackpackTest_Wt_1" placeholder="Wt">
</div>
<div class="equip-row">
<input type="text" name="attr_BackpackTest_Item_2" placeholder="Backpack Item 2">
<input type="text" name="attr_BackpackTest_Wt_2" placeholder="Wt">
</div>
<div class="equip-row">
<input type="text" name="attr_BackpackTest_Item_3" placeholder="Backpack Item 3">
<input type="text" name="attr_BackpackTest_Wt_3" placeholder="Wt">
</div>
<div class="equip-row">
<input type="text" name="attr_BackpackTest_Item_4" placeholder="Backpack Item 4">
<input type="text" name="attr_BackpackTest_Wt_4" placeholder="Wt">
</div>
<div class="equip-row">
<input type="text" name="attr_BackpackTest_Item_5" placeholder="Backpack Item 5">
<input type="text" name="attr_BackpackTest_Wt_5" placeholder="Wt">
</div>
<!-- Additional Backpack rows (Roll20 repeating section) -->
<fieldset class="repeating_backpack">
<div class="equip-row">
<input type="text" name="attr_item" placeholder="Backpack Item">
<input type="text" name="attr_wt" placeholder="Wt">
</div>
</fieldset>
<div class="equip-sep"></div>
<div class="equip-row backpack-total-row">
<div class="equip-label backpack-total-label">TOTAL BACKPACK WEIGHT</div>
<input type="text" name="attr_BackpackTest_TotalWeight" placeholder="" class="backpack-total-weight" readonly>
</div>
</div>
</div>
<div class="inv-sheaths">
<div class="subcard boot-sheath">
<div class="subcard-title">Sheaths &amp; Bandoliers</div>
<div class="inv-grid inv-cols-1">
<div class="inv-row"><input type="text" name="attr_BootSheathSlot1" placeholder="Left Sheath">
<input type="text" name="attr_SheathWeight1" placeholder="Wt 1">
</div>
<div class="inv-row"><input type="text" name="attr_BootSheathSlot2" placeholder="Right Sheath">
<input type="text" name="attr_SheathWeight2" placeholder="Wt 2">
</div>
<div class="inv-row"><input type="text" name="attr_BootSheathSlot3" placeholder="Back/Bandolier 1">
<input type="text" name="attr_SheathWeight3" placeholder="Wt 3">
</div>
<div class="inv-row"><input type="text" name="attr_BootSheathSlot4" placeholder="Back/Bandolier 2">
<input type="text" name="attr_SheathWeight4" placeholder="Wt 4">
</div>
<fieldset class="repeating_sheathsbandoliers">
<div class="inv-row">
<input type="text" name="attr_other_sheath" placeholder="Other Sheath">
<input type="text" name="attr_other_sheath_weight" placeholder="Wt">
</div>
</fieldset>
<div class="equip-sep"></div>
<div class="sheath-total-row">
<div class="equip-label sheath-total-label">TOTAL SHEATH WEIGHT</div>
<input type="text" name="attr_TotalSheathWeight" placeholder="" class="sheath-total-weight" readonly>
</div>
</div>
</div>
<div class="subcard boot-sheath belt-pouches">
<div class="subcard-title">Belt Pouches</div>
<div class="inv-grid inv-cols-1">
<div class="inv-row"><input type="text" name="attr_BeltPouchSlot1" placeholder="Pouch Item 1">
<input type="text" name="attr_BeltPouchWeight1" placeholder="Wt 1">
</div>
<div class="inv-row"><input type="text" name="attr_BeltPouchSlot2" placeholder="Pouch Item 2">
<input type="text" name="attr_BeltPouchWeight2" placeholder="Wt 2">
</div>
<div class="inv-row"><input type="text" name="attr_BeltPouchSlot3" placeholder="Pouch Item 3">
<input type="text" name="attr_BeltPouchWeight3" placeholder="Wt 3">
</div>
<div class="inv-row"><input type="text" name="attr_BeltPouchSlot4" placeholder="Pouch Item 4">
<input type="text" name="attr_BeltPouchWeight4" placeholder="Wt 4">
</div>
<fieldset class="repeating_beltpouches">
<div class="inv-row">
<input type="text" name="attr_pouch_item" placeholder="Pouch Item">
<input type="text" name="attr_pouch_weight" placeholder="Wt">
</div>
</fieldset>
<div class="equip-sep"></div>
<div class="pouch-total-row">
<div class="equip-label pouch-total-label">TOTAL POUCH WEIGHT</div>
<input type="text" name="attr_TotalPouchWeight" placeholder="" class="pouch-total-weight" readonly>
</div>
</div>
</div>
</div>
<div class="subcard capacity-encumbrance">
<div class="subcard-title">Capacity &amp; Encumbrance</div>
<div class="cap-block">
<div class="cap-header">CARRYING CAPACITY &amp; ENCUMBRANCE</div>
<div class="cap-grid">
<div class="cap-grid-head cap-grid-lefthead"><span class="cap-grid-note">Carrying Capacity is determined by STR &amp; size. Some skills, races, &amp; feats can impact this value.</span></div>
<div class="cap-grid-head cap-grid-right">Mobility<br>Penalty*</div>
<div class="cap-grid-label">Light Load (No Penalties)</div>
<input class="cap-grid-input" type="text" name="attr_CarryCapacity_Light" placeholder="Lt Weight">
<div class="cap-grid-penalty"> </div>
<div class="cap-grid-label mod-light">Modified Light Load (Size/Skills/etc)</div>
<input class="cap-grid-input" type="text" name="attr_CarryCapacity_Light_Modified" placeholder="Mod Lt Weight">
<div class="cap-grid-penalty"> </div>
<div class="cap-grid-label">Medium Load (Encumbered)</div>
<input class="cap-grid-input" type="text" name="attr_CarryCapacity_Moderate" placeholder="Md Weight">
<div class="cap-grid-penalty">-3</div>
<div class="cap-grid-label">Heavy Load (Heavily Encumbered)</div>
<input class="cap-grid-input" type="text" name="attr_CarryCapacity_Heavy" placeholder="Hvy Weight">
<div class="cap-grid-penalty">-6</div>
</div>
</div>
<div class="cap-block cap-totals">
<div class="cap-totals-grid">
<div class="cap-totals-head cap-totals-left">TOTALS:</div>
<div class="cap-totals-head">GEAR WEIGHT</div>
<div class="cap-totals-head">MOBILITY PENALTY*</div>
<div class="cap-totals-sep"></div>
<div class="cap-totals-label">With Backpack</div>
<input type="text" name="attr_TotalGearWeight_WithBackpack" placeholder="Weight w/Bkpk" readonly>
<input type="text" name="attr_TotalMobPenalty_WithBackpack" placeholder="Mob* w/Bkpk">
<div class="cap-totals-label">Without Backpack</div>
<input type="text" name="attr_TotalGearWeight_WithoutBackpack" placeholder="Weight NO Bkpk" readonly>
<input type="text" name="attr_TotalMobPenalty_WithoutBackpack" placeholder="Mob* NO Bkpk">
</div>
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-title">Player Notes</div>
<textarea name="attr_PlayerNotes1"></textarea>
<textarea name="attr_PlayerNotes2"></textarea>
<textarea name="attr_PlayerNotes3"></textarea>
</div>
</div>
<!-- ===================== SPELLS & MAGIC ===================== -->
<div class="page page-magic">
<div class="card magic-card">
<div class="magic-subtitle">Spellcasting Information</div>
<div class="magic-row">
<div class="magic-pair">
<div class="magic-label">Perseverance</div>
<input type="text" name="attr_Spell_Perseverance" class="magic-box small">
</div>
<div class="magic-group">
<div class="magic-label">Touch Attacks:</div>
<div class="magic-inline">
<div class="magic-label">Ranged</div>
<input type="text" name="attr_TouchAtk_Ranged" class="magic-box small">
<div class="magic-label">Melee</div>
<input type="text" name="attr_TouchAtk_Melee" class="magic-box small">
</div>
</div>
<div class="magic-pair">
<div class="magic-label">Caster Level</div>
<input type="text" name="attr_CasterLevel" class="magic-box small">
</div>
<div class="magic-pair wide">
<div class="magic-label">Casting Ability Mod (CastingMod)</div>
<input type="text" name="attr_CastingMod" class="magic-box medium">
</div>
</div>
<div class="magic-notes">
<textarea name="attr_SpellcastingNotes1" class="magic-notes-box" placeholder="Important Spellcasting Notes"></textarea>
</div>
</div>
<!-- ===================== SPELL LEVEL 0 (SL0) ===================== -->
<div class="card sl0-card">
<!-- Collapsible toggle (matches Identity & XP triangle indicator) -->
<input type="checkbox" class="sl0-toggle" name="attr_show_sl0" id="show-sl0" checked>
<label class="sl0-toggle-btn" for="show-sl0">Spell Level 0 (SL0)</label>
<div class="sl0-body">
<div class="sl0-toprow">
<div class="sl0-topitem">SL0 - Save DC: <input type="text" name="attr_SL0_SaveDC" class="sl0-box"></div>
<div class="sl0-topitem">SL0 - Spells per Day: <input type="text" name="attr_SL0_SpellsPerDay" class="sl0-box"></div>
<div class="sl0-topitem">SL0 - Spells Remaining: <input type="text" name="attr_SL0_SpellsRemaining" class="sl0-box"></div>
</div>
<div class="sl0-knownrow">
<div class="sl0-knownlabel">SL0 - Spells Known:</div>
<textarea name="attr_SL0_SpellsKnown" class="sl0-knownarea" placeholder=""></textarea>
</div>
<div class="sl0-sep"></div>
<div class="sl0-spellbox">
<div class="subcard-title">Spell Info</div>
<div class="sl0-spellrow sl0-spellrow-name">
<div class="sl0-spellpair namepair"><div class="sl0-spelllabel">Spell Name:</div>
<input type="text" name="attr_SL0_SpellName0" class="sl0-line short name">
</div>
<div class="sl0-spellpair timepair"><div class="sl0-spelllabel">Casting Time:</div>
<input type="text" name="attr_SL0_CastingTime0" class="sl0-line short time">
</div>
<div class="sl0-spellpair rangepair"><div class="sl0-spelllabel">Range:</div>
<input type="text" name="attr_SL0_Range0" class="sl0-line short range">
</div>
</div>
<div class="sl0-spellrow">
<div class="sl0-spelllabel">Spell Description:</div>
<textarea name="attr_SL0_SpellDesc0" class="sl0-descarea" placeholder=""></textarea>
</div>
<div class="sl0-spellinfo-repeat-note">Need more Spell Info cards? Use the <span class="sl0-addhint">+ Add</span> button (appears below) to create additional entries.</div>
<fieldset class="repeating_sl0spellinfo">
<div class="sl0-spellbox sl0-spellbox-repeat">
<div class="subcard-title">Spell Info</div>
<div class="sl0-spellrow sl0-spellrow-name">
<div class="sl0-spellpair namepair"><div class="sl0-spelllabel">Spell Name:</div>
<input type="text" name="attr_SpellName" class="sl0-line short name">
</div>
<div class="sl0-spellpair timepair"><div class="sl0-spelllabel">Casting Time:</div>
<input type="text" name="attr_CastingTime" class="sl0-line short time">
</div>
<div class="sl0-spellpair rangepair"><div class="sl0-spelllabel">Range:</div>
<input type="text" name="attr_Range" class="sl0-line short range">
</div>
</div>
<div class="sl0-spellrow">
<div class="sl0-spelllabel">Spell Description:</div>
<textarea name="attr_SpellDesc" class="sl0-descarea" placeholder=""></textarea>
</div>
</div>
</fieldset>
</div>
</div>
</div>
<div class="card sl1-card">
<!-- Collapsible toggle (matches Identity & XP triangle indicator) -->
<input type="checkbox" class="sl1-toggle" name="attr_show_sl1" id="show-sl1" checked>
<label class="sl1-toggle-btn" for="show-sl1">Spell Level 1 (SL1)</label>
<div class="sl1-body">
<div class="sl1-toprow">
<div class="sl1-topitem">SL1 - Save DC: <input type="text" name="attr_SL1_SaveDC" class="sl1-box"></div>
<div class="sl1-topitem">SL1 - Spells per Day: <input type="text" name="attr_SL1_SpellsPerDay" class="sl1-box"></div>
<div class="sl1-topitem">SL1 - Spells Remaining: <input type="text" name="attr_SL1_SpellsRemaining" class="sl1-box"></div>
</div>
<div class="sl1-knownrow">
<div class="sl1-knownlabel">SL1 - Spells Known:</div>
<textarea name="attr_SL1_SpellsKnown" class="sl1-knownarea" placeholder=""></textarea>
</div>
<div class="sl1-sep"></div>
<div class="sl1-spellbox">
<div class="subcard-title">Spell Info</div>
<div class="sl1-spellrow sl1-spellrow-name">
<div class="sl1-spellpair namepair"><div class="sl1-spelllabel">Spell Name:</div>
<input type="text" name="attr_SL1_SpellName0" class="sl1-line short name">
</div>
<div class="sl1-spellpair timepair"><div class="sl1-spelllabel">Casting Time:</div>
<input type="text" name="attr_SL1_CastingTime0" class="sl1-line short time">
</div>
<div class="sl1-spellpair rangepair"><div class="sl1-spelllabel">Range:</div>
<input type="text" name="attr_SL1_Range0" class="sl1-line short range">
</div>
</div>
<div class="sl1-spellrow">
<div class="sl1-spelllabel">Spell Description:</div>
<textarea name="attr_SL1_SpellDesc0" class="sl1-descarea" placeholder=""></textarea>
</div>
<div class="sl1-spellinfo-repeat-note">Need more Spell Info cards? Use the <span class="sl1-addhint">+ Add</span> button (appears below) to create additional entries.</div>
<fieldset class="repeating_sl1spellinfo">
<div class="sl1-spellbox sl1-spellbox-repeat">
<div class="subcard-title">Spell Info</div>
<div class="sl1-spellrow sl1-spellrow-name">
<div class="sl1-spellpair namepair"><div class="sl1-spelllabel">Spell Name:</div>
<input type="text" name="attr_SpellName" class="sl1-line short name">
</div>
<div class="sl1-spellpair timepair"><div class="sl1-spelllabel">Casting Time:</div>
<input type="text" name="attr_CastingTime" class="sl1-line short time">
</div>
<div class="sl1-spellpair rangepair"><div class="sl1-spelllabel">Range:</div>
<input type="text" name="attr_Range" class="sl1-line short range">
</div>
</div>
<div class="sl1-spellrow">
<div class="sl1-spelllabel">Spell Description:</div>
<textarea name="attr_SpellDesc" class="sl1-descarea" placeholder=""></textarea>
</div>
</div>
</fieldset>
</div>
</div>
</div>
<div class="card sl2-card">
<!-- Collapsible toggle (matches Identity & XP triangle indicator) -->
<input type="checkbox" class="sl2-toggle" name="attr_show_sl2" id="show-sl2" checked>
<label class="sl2-toggle-btn" for="show-sl2">Spell Level 2 (SL2)</label>
<div class="sl2-body">
<div class="sl2-toprow">
<div class="sl2-topitem">SL2 - Save DC: <input type="text" name="attr_SL2_SaveDC" class="sl2-box"></div>
<div class="sl2-topitem">SL2 - Spells per Day: <input type="text" name="attr_SL2_SpellsPerDay" class="sl2-box"></div>
<div class="sl2-topitem">SL2 - Spells Remaining: <input type="text" name="attr_SL2_SpellsRemaining" class="sl2-box"></div>
</div>
<div class="sl2-knownrow">
<div class="sl2-knownlabel">SL2 - Spells Known:</div>
<textarea name="attr_SL2_SpellsKnown" class="sl2-knownarea" placeholder=""></textarea>
</div>
<div class="sl2-sep"></div>
<div class="sl2-spellbox">
<div class="subcard-title">Spell Info</div>
<div class="sl2-spellrow sl2-spellrow-name">
<div class="sl2-spellpair namepair"><div class="sl2-spelllabel">Spell Name:</div>
<input type="text" name="attr_SL2_SpellName0" class="sl2-line short name">
</div>
<div class="sl2-spellpair timepair"><div class="sl2-spelllabel">Casting Time:</div>
<input type="text" name="attr_SL2_CastingTime0" class="sl2-line short time">
</div>
<div class="sl2-spellpair rangepair"><div class="sl2-spelllabel">Range:</div>
<input type="text" name="attr_SL2_Range0" class="sl2-line short range">
</div>
</div>
<div class="sl2-spellrow">
<div class="sl2-spelllabel">Spell Description:</div>
<textarea name="attr_SL2_SpellDesc0" class="sl2-descarea" placeholder=""></textarea>
</div>
<div class="sl2-spellinfo-repeat-note">Need more Spell Info cards? Use the <span class="sl2-addhint">+ Add</span> button (appears below) to create additional entries.</div>
<fieldset class="repeating_sl2spellinfo">
<div class="sl2-spellbox sl2-spellbox-repeat">
<div class="subcard-title">Spell Info</div>
<div class="sl2-spellrow sl2-spellrow-name">
<div class="sl2-spellpair namepair"><div class="sl2-spelllabel">Spell Name:</div>
<input type="text" name="attr_SpellName" class="sl2-line short name">
</div>
<div class="sl2-spellpair timepair"><div class="sl2-spelllabel">Casting Time:</div>
<input type="text" name="attr_CastingTime" class="sl2-line short time">
</div>
<div class="sl2-spellpair rangepair"><div class="sl2-spelllabel">Range:</div>
<input type="text" name="attr_Range" class="sl2-line short range">
</div>
</div>
<div class="sl2-spellrow">
<div class="sl2-spelllabel">Spell Description:</div>
<textarea name="attr_SpellDesc" class="sl2-descarea" placeholder=""></textarea>
</div>
</div>
</fieldset>
</div>
</div>
</div>
<div class="card sl3-card">
<!-- Collapsible toggle (matches Identity & XP triangle indicator) -->
<input type="checkbox" class="sl3-toggle" name="attr_show_sl3" id="show-sl3" checked>
<label class="sl3-toggle-btn" for="show-sl3">Spell Level 3 (SL3)</label>
<div class="sl3-body">
<div class="sl3-toprow">
<div class="sl3-topitem">SL3 - Save DC: <input type="text" name="attr_SL3_SaveDC" class="sl3-box"></div>
<div class="sl3-topitem">SL3 - Spells per Day: <input type="text" name="attr_SL3_SpellsPerDay" class="sl3-box"></div>
<div class="sl3-topitem">SL3 - Spells Remaining: <input type="text" name="attr_SL3_SpellsRemaining" class="sl3-box"></div>
</div>
<div class="sl3-knownrow">
<div class="sl3-knownlabel">SL3 - Spells Known:</div>
<textarea name="attr_SL3_SpellsKnown" class="sl3-knownarea" placeholder=""></textarea>
</div>
<div class="sl3-sep"></div>
<div class="sl3-spellbox">
<div class="subcard-title">Spell Info</div>
<div class="sl3-spellrow sl3-spellrow-name">
<div class="sl3-spellpair namepair"><div class="sl3-spelllabel">Spell Name:</div>
<input type="text" name="attr_SL3_SpellName0" class="sl3-line short name">
</div>
<div class="sl3-spellpair timepair"><div class="sl3-spelllabel">Casting Time:</div>
<input type="text" name="attr_SL3_CastingTime0" class="sl3-line short time">
</div>
<div class="sl3-spellpair rangepair"><div class="sl3-spelllabel">Range:</div>
<input type="text" name="attr_SL3_Range0" class="sl3-line short range">
</div>
</div>
<div class="sl3-spellrow">
<div class="sl3-spelllabel">Spell Description:</div>
<textarea name="attr_SL3_SpellDesc0" class="sl3-descarea" placeholder=""></textarea>
</div>
<div class="sl3-spellinfo-repeat-note">Need more Spell Info cards? Use the <span class="sl3-addhint">+ Add</span> button (appears below) to create additional entries.</div>
<fieldset class="repeating_sl3spellinfo">
<div class="sl3-spellbox sl3-spellbox-repeat">
<div class="subcard-title">Spell Info</div>
<div class="sl3-spellrow sl3-spellrow-name">
<div class="sl3-spellpair namepair"><div class="sl3-spelllabel">Spell Name:</div>
<input type="text" name="attr_SpellName" class="sl3-line short name">
</div>
<div class="sl3-spellpair timepair"><div class="sl3-spelllabel">Casting Time:</div>
<input type="text" name="attr_CastingTime" class="sl3-line short time">
</div>
<div class="sl3-spellpair rangepair"><div class="sl3-spelllabel">Range:</div>
<input type="text" name="attr_Range" class="sl3-line short range">
</div>
</div>
<div class="sl3-spellrow">
<div class="sl3-spelllabel">Spell Description:</div>
<textarea name="attr_SpellDesc" class="sl3-descarea" placeholder=""></textarea>
</div>
</div>
</fieldset>
</div>
</div>
</div>
<div class="card sl4-card">
<!-- Collapsible toggle (matches Identity & XP triangle indicator) -->
<input type="checkbox" class="sl4-toggle" name="attr_show_sl4" id="show-sl4" checked>
<label class="sl4-toggle-btn" for="show-sl4">Spell Level 4 (SL4)</label>
<div class="sl4-body">
<div class="sl4-toprow">
<div class="sl4-topitem">SL4 - Save DC: <input type="text" name="attr_SL4_SaveDC" class="sl4-box"></div>
<div class="sl4-topitem">SL4 - Spells per Day: <input type="text" name="attr_SL4_SpellsPerDay" class="sl4-box"></div>
<div class="sl4-topitem">SL4 - Spells Remaining: <input type="text" name="attr_SL4_SpellsRemaining" class="sl4-box"></div>
</div>
<div class="sl4-knownrow">
<div class="sl4-knownlabel">SL4 - Spells Known:</div>
<textarea name="attr_SL4_SpellsKnown" class="sl4-knownarea" placeholder=""></textarea>
</div>
<div class="sl4-sep"></div>
<div class="sl4-spellbox">
<div class="subcard-title">Spell Info</div>
<div class="sl4-spellrow sl4-spellrow-name">
<div class="sl4-spellpair namepair"><div class="sl4-spelllabel">Spell Name:</div>
<input type="text" name="attr_SL4_SpellName0" class="sl4-line short name">
</div>
<div class="sl4-spellpair timepair"><div class="sl4-spelllabel">Casting Time:</div>
<input type="text" name="attr_SL4_CastingTime0" class="sl4-line short time">
</div>
<div class="sl4-spellpair rangepair"><div class="sl4-spelllabel">Range:</div>
<input type="text" name="attr_SL4_Range0" class="sl4-line short range">
</div>
</div>
<div class="sl4-spellrow">
<div class="sl4-spelllabel">Spell Description:</div>
<textarea name="attr_SL4_SpellDesc0" class="sl4-descarea" placeholder=""></textarea>
</div>
<div class="sl4-spellinfo-repeat-note">Need more Spell Info cards? Use the <span class="sl4-addhint">+ Add</span> button (appears below) to create additional entries.</div>
<fieldset class="repeating_sl4spellinfo">
<div class="sl4-spellbox sl4-spellbox-repeat">
<div class="subcard-title">Spell Info</div>
<div class="sl4-spellrow sl4-spellrow-name">
<div class="sl4-spellpair namepair"><div class="sl4-spelllabel">Spell Name:</div>
<input type="text" name="attr_SpellName" class="sl4-line short name">
</div>
<div class="sl4-spellpair timepair"><div class="sl4-spelllabel">Casting Time:</div>
<input type="text" name="attr_CastingTime" class="sl4-line short time">
</div>
<div class="sl4-spellpair rangepair"><div class="sl4-spelllabel">Range:</div>
<input type="text" name="attr_Range" class="sl4-line short range">
</div>
</div>
<div class="sl4-spellrow">
<div class="sl4-spelllabel">Spell Description:</div>
<textarea name="attr_SpellDesc" class="sl4-descarea" placeholder=""></textarea>
</div>
</div>
</fieldset>
</div>
</div>
</div>
<div class="card sl5-card">
<!-- Collapsible toggle (matches Identity & XP triangle indicator) -->
<input type="checkbox" class="sl5-toggle" name="attr_show_sl5" id="show-sl5" checked>
<label class="sl5-toggle-btn" for="show-sl5">Spell Level 5 (SL5)</label>
<div class="sl5-body">
<div class="sl5-toprow">
<div class="sl5-topitem">SL5 - Save DC: <input type="text" name="attr_SL5_SaveDC" class="sl5-box"></div>
<div class="sl5-topitem">SL5 - Spells per Day: <input type="text" name="attr_SL5_SpellsPerDay" class="sl5-box"></div>
<div class="sl5-topitem">SL5 - Spells Remaining: <input type="text" name="attr_SL5_SpellsRemaining" class="sl5-box"></div>
</div>
<div class="sl5-knownrow">
<div class="sl5-knownlabel">SL5 - Spells Known:</div>
<textarea name="attr_SL5_SpellsKnown" class="sl5-knownarea" placeholder=""></textarea>
</div>
<div class="sl5-sep"></div>
<div class="sl5-spellbox">
<div class="subcard-title">Spell Info</div>
<div class="sl5-spellrow sl5-spellrow-name">
<div class="sl5-spellpair namepair"><div class="sl5-spelllabel">Spell Name:</div>
<input type="text" name="attr_SL5_SpellName0" class="sl5-line short name">
</div>
<div class="sl5-spellpair timepair"><div class="sl5-spelllabel">Casting Time:</div>
<input type="text" name="attr_SL5_CastingTime0" class="sl5-line short time">
</div>
<div class="sl5-spellpair rangepair"><div class="sl5-spelllabel">Range:</div>
<input type="text" name="attr_SL5_Range0" class="sl5-line short range">
</div>
</div>
<div class="sl5-spellrow">
<div class="sl5-spelllabel">Spell Description:</div>
<textarea name="attr_SL5_SpellDesc0" class="sl5-descarea" placeholder=""></textarea>
</div>
<div class="sl5-spellinfo-repeat-note">Need more Spell Info cards? Use the <span class="sl5-addhint">+ Add</span> button (appears below) to create additional entries.</div>
<fieldset class="repeating_sl5spellinfo">
<div class="sl5-spellbox sl5-spellbox-repeat">
<div class="subcard-title">Spell Info</div>
<div class="sl5-spellrow sl5-spellrow-name">
<div class="sl5-spellpair namepair"><div class="sl5-spelllabel">Spell Name:</div>
<input type="text" name="attr_SpellName" class="sl5-line short name">
</div>
<div class="sl5-spellpair timepair"><div class="sl5-spelllabel">Casting Time:</div>
<input type="text" name="attr_CastingTime" class="sl5-line short time">
</div>
<div class="sl5-spellpair rangepair"><div class="sl5-spelllabel">Range:</div>
<input type="text" name="attr_Range" class="sl5-line short range">
</div>
</div>
<div class="sl5-spellrow">
<div class="sl5-spelllabel">Spell Description:</div>
<textarea name="attr_SpellDesc" class="sl5-descarea" placeholder=""></textarea>
</div>
</div>
</fieldset>
</div>
</div>
</div>
<div class="card sl6-card">
<!-- Collapsible toggle (matches Identity & XP triangle indicator) -->
<input type="checkbox" class="sl6-toggle" name="attr_show_sl6" id="show-sl6" checked>
<label class="sl6-toggle-btn" for="show-sl6">Spell Level 6 (SL6)</label>
<div class="sl6-body">
<div class="sl6-toprow">
<div class="sl6-topitem">SL6 - Save DC: <input type="text" name="attr_SL6_SaveDC" class="sl6-box"></div>
<div class="sl6-topitem">SL6 - Spells per Day: <input type="text" name="attr_SL6_SpellsPerDay" class="sl6-box"></div>
<div class="sl6-topitem">SL6 - Spells Remaining: <input type="text" name="attr_SL6_SpellsRemaining" class="sl6-box"></div>
</div>
<div class="sl6-knownrow">
<div class="sl6-knownlabel">SL6 - Spells Known:</div>
<textarea name="attr_SL6_SpellsKnown" class="sl6-knownarea" placeholder=""></textarea>
</div>
<div class="sl6-sep"></div>
<div class="sl6-spellbox">
<div class="subcard-title">Spell Info</div>
<div class="sl6-spellrow sl6-spellrow-name">
<div class="sl6-spellpair namepair"><div class="sl6-spelllabel">Spell Name:</div>
<input type="text" name="attr_SL6_SpellName0" class="sl6-line short name">
</div>
<div class="sl6-spellpair timepair"><div class="sl6-spelllabel">Casting Time:</div>
<input type="text" name="attr_SL6_CastingTime0" class="sl6-line short time">
</div>
<div class="sl6-spellpair rangepair"><div class="sl6-spelllabel">Range:</div>
<input type="text" name="attr_SL6_Range0" class="sl6-line short range">
</div>
</div>
<div class="sl6-spellrow">
<div class="sl6-spelllabel">Spell Description:</div>
<textarea name="attr_SL6_SpellDesc0" class="sl6-descarea" placeholder=""></textarea>
</div>
<div class="sl6-spellinfo-repeat-note">Need more Spell Info cards? Use the <span class="sl6-addhint">+ Add</span> button (appears below) to create additional entries.</div>
<fieldset class="repeating_sl6spellinfo">
<div class="sl6-spellbox sl6-spellbox-repeat">
<div class="subcard-title">Spell Info</div>
<div class="sl6-spellrow sl6-spellrow-name">
<div class="sl6-spellpair namepair"><div class="sl6-spelllabel">Spell Name:</div>
<input type="text" name="attr_SpellName" class="sl6-line short name">
</div>
<div class="sl6-spellpair timepair"><div class="sl6-spelllabel">Casting Time:</div>
<input type="text" name="attr_CastingTime" class="sl6-line short time">
</div>
<div class="sl6-spellpair rangepair"><div class="sl6-spelllabel">Range:</div>
<input type="text" name="attr_Range" class="sl6-line short range">
</div>
</div>
<div class="sl6-spellrow">
<div class="sl6-spelllabel">Spell Description:</div>
<textarea name="attr_SpellDesc" class="sl6-descarea" placeholder=""></textarea>
</div>
</div>
</fieldset>
</div>
</div>
</div>
<div class="card sl7-card">
<!-- Collapsible toggle (matches Identity & XP triangle indicator) -->
<input type="checkbox" class="sl7-toggle" name="attr_show_sl7" id="show-sl7" checked>
<label class="sl7-toggle-btn" for="show-sl7">Spell Level 7 (SL7)</label>
<div class="sl7-body">
<div class="sl7-toprow">
<div class="sl7-topitem">SL7 - Save DC: <input type="text" name="attr_SL7_SaveDC" class="sl7-box"></div>
<div class="sl7-topitem">SL7 - Spells per Day: <input type="text" name="attr_SL7_SpellsPerDay" class="sl7-box"></div>
<div class="sl7-topitem">SL7 - Spells Remaining: <input type="text" name="attr_SL7_SpellsRemaining" class="sl7-box"></div>
</div>
<div class="sl7-knownrow">
<div class="sl7-knownlabel">SL7 - Spells Known:</div>
<textarea name="attr_SL7_SpellsKnown" class="sl7-knownarea" placeholder=""></textarea>
</div>
<div class="sl7-sep"></div>
<div class="sl7-spellbox">
<div class="subcard-title">Spell Info</div>
<div class="sl7-spellrow sl7-spellrow-name">
<div class="sl7-spellpair namepair"><div class="sl7-spelllabel">Spell Name:</div>
<input type="text" name="attr_SL7_SpellName0" class="sl7-line short name">
</div>
<div class="sl7-spellpair timepair"><div class="sl7-spelllabel">Casting Time:</div>
<input type="text" name="attr_SL7_CastingTime0" class="sl7-line short time">
</div>
<div class="sl7-spellpair rangepair"><div class="sl7-spelllabel">Range:</div>
<input type="text" name="attr_SL7_Range0" class="sl7-line short range">
</div>
</div>
<div class="sl7-spellrow">
<div class="sl7-spelllabel">Spell Description:</div>
<textarea name="attr_SL7_SpellDesc0" class="sl7-descarea" placeholder=""></textarea>
</div>
<div class="sl7-spellinfo-repeat-note">Need more Spell Info cards? Use the <span class="sl7-addhint">+ Add</span> button (appears below) to create additional entries.</div>
<fieldset class="repeating_sl7spellinfo">
<div class="sl7-spellbox sl7-spellbox-repeat">
<div class="subcard-title">Spell Info</div>
<div class="sl7-spellrow sl7-spellrow-name">
<div class="sl7-spellpair namepair"><div class="sl7-spelllabel">Spell Name:</div>
<input type="text" name="attr_SpellName" class="sl7-line short name">
</div>
<div class="sl7-spellpair timepair"><div class="sl7-spelllabel">Casting Time:</div>
<input type="text" name="attr_CastingTime" class="sl7-line short time">
</div>
<div class="sl7-spellpair rangepair"><div class="sl7-spelllabel">Range:</div>
<input type="text" name="attr_Range" class="sl7-line short range">
</div>
</div>
<div class="sl7-spellrow">
<div class="sl7-spelllabel">Spell Description:</div>
<textarea name="attr_SpellDesc" class="sl7-descarea" placeholder=""></textarea>
</div>
</div>
</fieldset>
</div>
</div>
</div>
<div class="card sl8-card">
<!-- Collapsible toggle (matches Identity & XP triangle indicator) -->
<input type="checkbox" class="sl8-toggle" name="attr_show_sl8" id="show-sl8" checked>
<label class="sl8-toggle-btn" for="show-sl8">Spell Level 8 (SL8)</label>
<div class="sl8-body">
<div class="sl8-toprow">
<div class="sl8-topitem">SL8 - Save DC: <input type="text" name="attr_SL8_SaveDC" class="sl8-box"></div>
<div class="sl8-topitem">SL8 - Spells per Day: <input type="text" name="attr_SL8_SpellsPerDay" class="sl8-box"></div>
<div class="sl8-topitem">SL8 - Spells Remaining: <input type="text" name="attr_SL8_SpellsRemaining" class="sl8-box"></div>
</div>
<div class="sl8-knownrow">
<div class="sl8-knownlabel">SL8 - Spells Known:</div>
<textarea name="attr_SL8_SpellsKnown" class="sl8-knownarea" placeholder=""></textarea>
</div>
<div class="sl8-sep"></div>
<div class="sl8-spellbox">
<div class="subcard-title">Spell Info</div>
<div class="sl8-spellrow sl8-spellrow-name">
<div class="sl8-spellpair namepair"><div class="sl8-spelllabel">Spell Name:</div>
<input type="text" name="attr_SL8_SpellName0" class="sl8-line short name">
</div>
<div class="sl8-spellpair timepair"><div class="sl8-spelllabel">Casting Time:</div>
<input type="text" name="attr_SL8_CastingTime0" class="sl8-line short time">
</div>
<div class="sl8-spellpair rangepair"><div class="sl8-spelllabel">Range:</div>
<input type="text" name="attr_SL8_Range0" class="sl8-line short range">
</div>
</div>
<div class="sl8-spellrow">
<div class="sl8-spelllabel">Spell Description:</div>
<textarea name="attr_SL8_SpellDesc0" class="sl8-descarea" placeholder=""></textarea>
</div>
<div class="sl8-spellinfo-repeat-note">Need more Spell Info cards? Use the <span class="sl8-addhint">+ Add</span> button (appears below) to create additional entries.</div>
<fieldset class="repeating_sl8spellinfo">
<div class="sl8-spellbox sl8-spellbox-repeat">
<div class="subcard-title">Spell Info</div>
<div class="sl8-spellrow sl8-spellrow-name">
<div class="sl8-spellpair namepair"><div class="sl8-spelllabel">Spell Name:</div>
<input type="text" name="attr_SpellName" class="sl8-line short name">
</div>
<div class="sl8-spellpair timepair"><div class="sl8-spelllabel">Casting Time:</div>
<input type="text" name="attr_CastingTime" class="sl8-line short time">
</div>
<div class="sl8-spellpair rangepair"><div class="sl8-spelllabel">Range:</div>
<input type="text" name="attr_Range" class="sl8-line short range">
</div>
</div>
<div class="sl8-spellrow">
<div class="sl8-spelllabel">Spell Description:</div>
<textarea name="attr_SpellDesc" class="sl8-descarea" placeholder=""></textarea>
</div>
</div>
</fieldset>
</div>
</div>
</div>
<div class="card sl9-card">
<!-- Collapsible toggle (matches Identity & XP triangle indicator) -->
<input type="checkbox" class="sl9-toggle" name="attr_show_sl9" id="show-sl9" checked>
<label class="sl9-toggle-btn" for="show-sl9">Spell Level 9 (SL9)</label>
<div class="sl9-body">
<div class="sl9-toprow">
<div class="sl9-topitem">SL9 - Save DC: <input type="text" name="attr_SL9_SaveDC" class="sl9-box"></div>
<div class="sl9-topitem">SL9 - Spells per Day: <input type="text" name="attr_SL9_SpellsPerDay" class="sl9-box"></div>
<div class="sl9-topitem">SL9 - Spells Remaining: <input type="text" name="attr_SL9_SpellsRemaining" class="sl9-box"></div>
</div>
<div class="sl9-knownrow">
<div class="sl9-knownlabel">SL9 - Spells Known:</div>
<textarea name="attr_SL9_SpellsKnown" class="sl9-knownarea" placeholder=""></textarea>
</div>
<div class="sl9-sep"></div>
<div class="sl9-spellbox">
<div class="subcard-title">Spell Info</div>
<div class="sl9-spellrow sl9-spellrow-name">
<div class="sl9-spellpair namepair"><div class="sl9-spelllabel">Spell Name:</div>
<input type="text" name="attr_SL9_SpellName0" class="sl9-line short name">
</div>
<div class="sl9-spellpair timepair"><div class="sl9-spelllabel">Casting Time:</div>
<input type="text" name="attr_SL9_CastingTime0" class="sl9-line short time">
</div>
<div class="sl9-spellpair rangepair"><div class="sl9-spelllabel">Range:</div>
<input type="text" name="attr_SL9_Range0" class="sl9-line short range">
</div>
</div>
<div class="sl9-spellrow">
<div class="sl9-spelllabel">Spell Description:</div>
<textarea name="attr_SL9_SpellDesc0" class="sl9-descarea" placeholder=""></textarea>
</div>
<div class="sl9-spellinfo-repeat-note">Need more Spell Info cards? Use the <span class="sl9-addhint">+ Add</span> button (appears below) to create additional entries.</div>
<fieldset class="repeating_sl9spellinfo">
<div class="sl9-spellbox sl9-spellbox-repeat">
<div class="subcard-title">Spell Info</div>
<div class="sl9-spellrow sl9-spellrow-name">
<div class="sl9-spellpair namepair"><div class="sl9-spelllabel">Spell Name:</div>
<input type="text" name="attr_SpellName" class="sl9-line short name">
</div>
<div class="sl9-spellpair timepair"><div class="sl9-spelllabel">Casting Time:</div>
<input type="text" name="attr_CastingTime" class="sl9-line short time">
</div>
<div class="sl9-spellpair rangepair"><div class="sl9-spelllabel">Range:</div>
<input type="text" name="attr_Range" class="sl9-line short range">
</div>
</div>
<div class="sl9-spellrow">
<div class="sl9-spelllabel">Spell Description:</div>
<textarea name="attr_SpellDesc" class="sl9-descarea" placeholder=""></textarea>
</div>
</div>
</fieldset>
</div>
</div>
</div>
</div>
</div>
<script type="text/worker">
(function() {
var LFG_LIGHT_LOAD_BY_STR = {
1:3, 2:6, 3:10, 4:13, 5:16, 6:20, 7:25, 8:30, 9:35, 10:40,
11:45, 12:50, 13:55, 14:60, 15:70, 16:80, 17:90, 18:100, 19:120, 20:150,
21:180, 22:220, 23:260, 24:300, 25:350, 26:400, 27:450, 28:500, 29:600, 30:700
};
function toNumber(value) {
if (value === undefined || value === null) return 0;
var text = String(value).trim();
if (!text) return 0;
var match = text.match(/-?\d+(?:\.\d+)?/);
if (!match) return 0;
var num = parseFloat(match[0]);
return isNaN(num) ? 0 : num;
}
function formatNumber(num) {
if (num === undefined || num === null || isNaN(num)) return "";
if (Math.abs(num - Math.round(num)) < 0.000001) return String(Math.round(num));
return String(Math.round(num * 100) / 100);
}
function abilityMod(score) {
var raw = String(score || "").trim();
if (!raw) return "";
return Math.floor((toNumber(raw) - 10) / 2);
}
function updateAbilityMods() {
getAttrs(["STR","DEX","CON","INT","WIS","CHA"], function(v) {
var strMod = abilityMod(v.STR);
var dexMod = abilityMod(v.DEX);
var conMod = abilityMod(v.CON);
var intMod = abilityMod(v.INT);
var wisMod = abilityMod(v.WIS);
var chaMod = abilityMod(v.CHA);
setAttrs({
STRMOD: strMod === "" ? "" : String(strMod),
DEXMOD: dexMod === "" ? "" : String(dexMod),
CONMOD: conMod === "" ? "" : String(conMod),
INTMOD: intMod === "" ? "" : String(intMod),
WISMOD: wisMod === "" ? "" : String(wisMod),
CHAMOD: chaMod === "" ? "" : String(chaMod),
OD_DEX_Mod: dexMod === "" ? "" : String(dexMod)
});
});
}
function updateInjuredThreshold() {
getAttrs(["HP"], function(v) {
var raw = String(v.HP || "").trim();
if (!raw) {
setAttrs({ Injured_Threshold: "" });
return;
}
var hp = toNumber(raw);
setAttrs({ Injured_Threshold: String(Math.floor(hp / 4)) });
});
}
function updateSaveAbilityMods() {
getAttrs(["CONMOD","DEXMOD","WISMOD"], function(v) {
setAttrs({
FORT_AbilityMod: String(v.CONMOD || ""),
REF_AbilityMod: String(v.DEXMOD || ""),
WILL_AbilityMod: String(v.WISMOD || "")
});
});
}
function updateSaveTotals() {
getAttrs([
"FORT_Save_Rating","FORT_AbilityMod","FORT_OtherBonus",
"REF_Save_Rating","REF_AbilityMod","REF_OtherBonus",
"WILL_Save_Rating","WILL_AbilityMod","WILL_OtherBonus"
], function(v) {
setAttrs({
FORT: formatNumber(toNumber(v.FORT_Save_Rating) + toNumber(v.FORT_AbilityMod) + toNumber(v.FORT_OtherBonus)),
REF: formatNumber(toNumber(v.REF_Save_Rating) + toNumber(v.REF_AbilityMod) + toNumber(v.REF_OtherBonus)),
WILL: formatNumber(toNumber(v.WILL_Save_Rating) + toNumber(v.WILL_AbilityMod) + toNumber(v.WILL_OtherBonus))
});
});
}
function updateInitiative() {
getAttrs(["Reactions","WISMOD","DEXMOD"], function(v) {
var allBlank = String(v.Reactions || "").trim() === "" &&
String(v.WISMOD || "").trim() === "" &&
String(v.DEXMOD || "").trim() === "";
setAttrs({
});
});
}
var autoSkillMap = [{"total": "Acrobatics", "ability": "Acrobatics_AbilityMod", "placeholder": "DEX", "readonly": true, "bonus1": "AcroBonus1", "bonus2": "AcroBonus2", "ranks": "Acro_Ranks"}, {"total": "Bluff", "ability": "Bluff_AbilityMod", "placeholder": "CHA", "readonly": true, "bonus1": "BluffBonus1", "bonus2": "BluffBonus2", "ranks": "Bluff_Ranks"}, {"total": "Climb", "ability": "Climb_AbilityMod", "placeholder": "STR", "readonly": true, "bonus1": "ClimbBonus1", "bonus2": "ClimbBonus2", "ranks": "Climb_Ranks"}, {"total": "Academia", "ability": "Craft_Academia_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "AcademiaBonus1", "bonus2": "AcademiaBonus2", "ranks": "Academia_Ranks"}, {"total": "Alchemy", "ability": "Craft_Alchemy_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "AlchemyBonus1", "bonus2": "AlchemyBonus2", "ranks": "Alchemy_Ranks"}, {"total": "Blacksmith", "ability": "Craft_Blacksmith_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "BlacksmithBonus1", "bonus2": "BlacksmithBonus2", "ranks": "Blacksmith_Ranks"}, {"total": "Bow_Fletch", "ability": "Craft_Bow_Fletch_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "Bow_FletchBonus1", "bonus2": "Bow_FletchBonus2", "ranks": "Bow_Fletch_Ranks"}, {"total": "Craft_Magic_Item", "ability": "Craft_Magic_Item_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "CraftMagicItemBonus1", "bonus2": "CraftMagicItemBonus2", "ranks": "Craft_Magic_Item_Ranks"}, {"total": "Stonework", "ability": "Craft_Stonework_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "StoneworkBonus1", "bonus2": "StoneworkBonus2", "ranks": "Stonework_Ranks"}, {"total": "Tailor", "ability": "Craft_Tailor_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "TailorBonus1", "bonus2": "TailorBonus2", "ranks": "Tailor_Ranks"}, {"total": "Woodwork", "ability": "Craft_Woodwork_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "WoodworkBonus1", "bonus2": "WoodworkBonus2", "ranks": "Woodwork_Ranks"}, {"total": "Diplomacy", "ability": "Diplomacy_AbilityMod", "placeholder": "CHA", "readonly": true, "bonus1": "DiplomacyBonus1", "bonus2": "DiplomacyBonus2", "ranks": "Diplomacy_Ranks"}, {"total": "Handle_Animal", "ability": "Handle_Animal_AbilityMod", "placeholder": "WIS", "readonly": true, "bonus1": "HandleAnimalBonus1", "bonus2": "HandleAnimalBonus2", "ranks": "Handle_Animal_Ranks"}, {"total": "Heal", "ability": "Heal_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "HealBonus1", "bonus2": "HealBonus2", "ranks": "Heal_Ranks"}, {"total": "JumpandSprint", "ability": "Jump_and_Sprint_AbilityMod", "placeholder": "STR", "readonly": true, "bonus1": "JumpandSprintBonus1", "bonus2": "JumpandSprintBonus2", "ranks": "Jump_and_Sprint_Ranks"}, {"total": "Arcana", "ability": "Knowledge_Arcana_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "ArcanaBonus1", "bonus2": "ArcanaBonus2", "ranks": "Arcana_Ranks"}, {"total": "Civilization", "ability": "Knowledge_Civilization_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "CivilizationBonus1", "bonus2": "CivilizationBonus2", "ranks": "Civilization_Ranks"}, {"total": "Dungeons", "ability": "Knowledge_Dungeons_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "DungeonsBonus1", "bonus2": "DungeonsBonus2", "ranks": "Dungeons_Ranks"}, {"total": "Nature", "ability": "Knowledge_Nature_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "NatureBonus1", "bonus2": "NatureBonus2", "ranks": "Nature_Ranks"}, {"total": "Planes", "ability": "Knowledge_Planes_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "PlanesBonus1", "bonus2": "PlanesBonus2", "ranks": "Planes_Ranks"}, {"total": "Religion", "ability": "Knowledge_Religion_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "ReligionBonus1", "bonus2": "ReligionBonus2", "ranks": "Religion_Ranks"}, {"total": "Linguistics", "ability": "Linguistics_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "LinguisticsBonus1", "bonus2": "LinguisticsBonus2", "ranks": "Linguistics_Ranks"}, {"total": "Listen", "ability": "Listen_AbilityMod", "placeholder": "WIS", "readonly": true, "bonus1": "ListenBonus1", "bonus2": "ListenBonus2", "ranks": "Listen_Ranks"}, {"total": "Move_Silently", "ability": "Move_Silently_AbilityMod", "placeholder": "DEX", "readonly": true, "bonus1": "MoveSilentlyBonus1", "bonus2": "MoveSilentlyBonus2", "ranks": "Move_Silently_Ranks"}, {"total": "Comedy_and_Stories", "ability": "Perform_Comedy_and_Stories_AbilityMod", "placeholder": "CHA", "readonly": true, "bonus1": "ComedyBonus1", "bonus2": "ComedyBonus2", "ranks": "Comedy_and_Stories_Ranks"}, {"total": "Dance_and_Motion", "ability": "Perform_Dance_and_Motion_AbilityMod", "placeholder": "DEX", "readonly": true, "bonus1": "DanceBonus1", "bonus2": "DanceBonus2", "ranks": "Dance_and_Motion_Ranks"}, {"total": "Music_Aerobic", "ability": "Perform_Music___Aerobic_AbilityMod", "placeholder": "CHA", "readonly": true, "bonus1": "MusicAerobicBonus1", "bonus2": "MusicAerobicBonus2", "ranks": "Music_Aerobic_Ranks"}, {"total": "Music_Manual", "ability": "Perform_Music___Manual_AbilityMod", "placeholder": "CHA", "readonly": true, "bonus1": "MusicManualBonus1", "bonus2": "MusicManualBonus2", "ranks": "Music_Manual_Ranks"}, {"total": "Song_and_Poerty", "ability": "Perform_Song_and_Poetry_AbilityMod", "placeholder": "CHA", "readonly": true, "bonus1": "SongPoetryBonus1", "bonus2": "SongPoetryBonus2", "ranks": "Song_and_Poetry_Ranks"}, {"total": "Ride", "ability": "Ride_AbilityMod", "placeholder": "DEX", "readonly": true, "bonus1": "RideBonus1", "bonus2": "RideBonus2", "ranks": "Ride_Ranks"}, {"total": "Seafaring", "ability": "Knowledge_Seafaring_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "SeafaringBonus1", "bonus2": "SeafaringBonus2", "ranks": "Seafaring_Ranks"}, {"total": "Sense_Motive", "ability": "Sense_Motive_AbilityMod", "placeholder": "WIS", "readonly": true, "bonus1": "SenseMotiveBonus1", "bonus2": "SenseMotiveBonus2", "ranks": "Sense_Motive_Ranks"}, {"total": "Sleight_of_Hand", "ability": "Sleight_of_Hand_AbilityMod", "placeholder": "DEX", "readonly": true, "bonus1": "SleightofHandBonus1", "bonus2": "SleightofHandBonus2", "ranks": "Sleight_of_Hand_Ranks"}, {"total": "Spot", "ability": "Spot_AbilityMod", "placeholder": "WIS", "readonly": true, "bonus1": "SpotBonus1", "bonus2": "SpotBonus2", "ranks": "Spot_Ranks"}, {"total": "Survival", "ability": "Survival_AbilityMod", "placeholder": "WIS", "readonly": true, "bonus1": "SurvivalBonus1", "bonus2": "SurvivalBonus2", "ranks": "Survival_Ranks"}, {"total": "Swim", "ability": "Swim_AbilityMod", "placeholder": "STR", "readonly": true, "bonus1": "SwimBonus1", "bonus2": "SwimBonus2", "ranks": "Swim_Ranks"}, {"total": "Tactics", "ability": "Knowledge_Tactics_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "TacticsBonus1", "bonus2": "TacticsBonus2", "ranks": "Tactics_Ranks"}, {"total": "Under_Cover", "ability": "Under_Cover_AbilityMod", "placeholder": "CHA", "readonly": true, "bonus1": "UnderCoverBonus1", "bonus2": "UnderCoverBonus2", "ranks": "Under_Cover_Ranks"}, {"total": "Wrestling", "ability": "Wrestling_AbilityMod", "placeholder": "STR", "readonly": true, "bonus1": "WrestlingBonus1", "bonus2": "WrestlingBonus2", "ranks": "Wrestling_Ranks"}];
function updateSkillAbilityMods() {
var attrs = ["STRMOD","DEXMOD","CONMOD","INTMOD","WISMOD","CHAMOD"];
getAttrs(attrs, function(v) {
var out = {};
for (var i = 0; i < autoSkillMap.length; i++) {
var skill = autoSkillMap[i];
var modField = skill.placeholder + "MOD";
out[skill.ability] = String(v[modField] || "");
}
setAttrs(out);
});
}
var allSkillMap = [{"total": "Acrobatics", "ability": "Acrobatics_AbilityMod", "placeholder": "DEX", "readonly": true, "bonus1": "AcroBonus1", "bonus2": "AcroBonus2", "ranks": "Acro_Ranks"}, {"total": "Bluff", "ability": "Bluff_AbilityMod", "placeholder": "CHA", "readonly": true, "bonus1": "BluffBonus1", "bonus2": "BluffBonus2", "ranks": "Bluff_Ranks"}, {"total": "Climb", "ability": "Climb_AbilityMod", "placeholder": "STR", "readonly": true, "bonus1": "ClimbBonus1", "bonus2": "ClimbBonus2", "ranks": "Climb_Ranks"}, {"total": "Academia", "ability": "Craft_Academia_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "AcademiaBonus1", "bonus2": "AcademiaBonus2", "ranks": "Academia_Ranks"}, {"total": "Alchemy", "ability": "Craft_Alchemy_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "AlchemyBonus1", "bonus2": "AlchemyBonus2", "ranks": "Alchemy_Ranks"}, {"total": "Blacksmith", "ability": "Craft_Blacksmith_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "BlacksmithBonus1", "bonus2": "BlacksmithBonus2", "ranks": "Blacksmith_Ranks"}, {"total": "Bow_Fletch", "ability": "Craft_Bow_Fletch_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "Bow_FletchBonus1", "bonus2": "Bow_FletchBonus2", "ranks": "Bow_Fletch_Ranks"}, {"total": "Fine_Arts", "ability": "Craft_Fine_Arts_AbilityMod", "placeholder": "IN/DX", "readonly": false, "bonus1": "FineArtsBonus1", "bonus2": "FineArtsBonus2", "ranks": "Fine_Arts_Ranks"}, {"total": "Jeweler", "ability": "Craft_Jeweler_AbilityMod", "placeholder": "IN/DX", "readonly": false, "bonus1": "JewelerBonus1", "bonus2": "JewelerBonus2", "ranks": "Jeweler_Ranks"}, {"total": "Craft_Magic_Item", "ability": "Craft_Magic_Item_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "CraftMagicItemBonus1", "bonus2": "CraftMagicItemBonus2", "ranks": "Craft_Magic_Item_Ranks"}, {"total": "Mechanisms", "ability": "Craft_Mechanisms_AbilityMod", "placeholder": "IN/DX", "readonly": false, "bonus1": "MechanismsBonus1", "bonus2": "MechanismsBonus2", "ranks": "Mechanisms_Ranks"}, {"total": "Stonework", "ability": "Craft_Stonework_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "StoneworkBonus1", "bonus2": "StoneworkBonus2", "ranks": "Stonework_Ranks"}, {"total": "Tailor", "ability": "Craft_Tailor_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "TailorBonus1", "bonus2": "TailorBonus2", "ranks": "Tailor_Ranks"}, {"total": "Woodwork", "ability": "Craft_Woodwork_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "WoodworkBonus1", "bonus2": "WoodworkBonus2", "ranks": "Woodwork_Ranks"}, {"total": "Diplomacy", "ability": "Diplomacy_AbilityMod", "placeholder": "CHA", "readonly": true, "bonus1": "DiplomacyBonus1", "bonus2": "DiplomacyBonus2", "ranks": "Diplomacy_Ranks"}, {"total": "Handle_Animal", "ability": "Handle_Animal_AbilityMod", "placeholder": "WIS", "readonly": true, "bonus1": "HandleAnimalBonus1", "bonus2": "HandleAnimalBonus2", "ranks": "Handle_Animal_Ranks"}, {"total": "Heal", "ability": "Heal_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "HealBonus1", "bonus2": "HealBonus2", "ranks": "Heal_Ranks"}, {"total": "Hide", "ability": "Hide_AbilityMod", "placeholder": "IN/WI", "readonly": false, "bonus1": "HideBonus1", "bonus2": "HideBonus2", "ranks": "Hide_Ranks"}, {"total": "Intimidate", "ability": "Intimidate_AbilityMod", "placeholder": "CH/ST", "readonly": false, "bonus1": "IntimidateBonus1", "bonus2": "IntimidateBonus2", "ranks": "Intimidate_Ranks"}, {"total": "JumpandSprint", "ability": "Jump_and_Sprint_AbilityMod", "placeholder": "STR", "readonly": true, "bonus1": "JumpandSprintBonus1", "bonus2": "JumpandSprintBonus2", "ranks": "Jump_and_Sprint_Ranks"}, {"total": "Arcana", "ability": "Knowledge_Arcana_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "ArcanaBonus1", "bonus2": "ArcanaBonus2", "ranks": "Arcana_Ranks"}, {"total": "Civilization", "ability": "Knowledge_Civilization_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "CivilizationBonus1", "bonus2": "CivilizationBonus2", "ranks": "Civilization_Ranks"}, {"total": "Dungeons", "ability": "Knowledge_Dungeons_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "DungeonsBonus1", "bonus2": "DungeonsBonus2", "ranks": "Dungeons_Ranks"}, {"total": "Nature", "ability": "Knowledge_Nature_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "NatureBonus1", "bonus2": "NatureBonus2", "ranks": "Nature_Ranks"}, {"total": "Planes", "ability": "Knowledge_Planes_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "PlanesBonus1", "bonus2": "PlanesBonus2", "ranks": "Planes_Ranks"}, {"total": "Religion", "ability": "Knowledge_Religion_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "ReligionBonus1", "bonus2": "ReligionBonus2", "ranks": "Religion_Ranks"}, {"total": "Linguistics", "ability": "Linguistics_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "LinguisticsBonus1", "bonus2": "LinguisticsBonus2", "ranks": "Linguistics_Ranks"}, {"total": "Listen", "ability": "Listen_AbilityMod", "placeholder": "WIS", "readonly": true, "bonus1": "ListenBonus1", "bonus2": "ListenBonus2", "ranks": "Listen_Ranks"}, {"total": "Move_Silently", "ability": "Move_Silently_AbilityMod", "placeholder": "DEX", "readonly": true, "bonus1": "MoveSilentlyBonus1", "bonus2": "MoveSilentlyBonus2", "ranks": "Move_Silently_Ranks"}, {"total": "Comedy_and_Stories", "ability": "Perform_Comedy_and_Stories_AbilityMod", "placeholder": "CHA", "readonly": true, "bonus1": "ComedyBonus1", "bonus2": "ComedyBonus2", "ranks": "Comedy_and_Stories_Ranks"}, {"total": "Dance_and_Motion", "ability": "Perform_Dance_and_Motion_AbilityMod", "placeholder": "DEX", "readonly": true, "bonus1": "DanceBonus1", "bonus2": "DanceBonus2", "ranks": "Dance_and_Motion_Ranks"}, {"total": "Music_Aerobic", "ability": "Perform_Music___Aerobic_AbilityMod", "placeholder": "CHA", "readonly": true, "bonus1": "MusicAerobicBonus1", "bonus2": "MusicAerobicBonus2", "ranks": "Music_Aerobic_Ranks"}, {"total": "Music_Manual", "ability": "Perform_Music___Manual_AbilityMod", "placeholder": "CHA", "readonly": true, "bonus1": "MusicManualBonus1", "bonus2": "MusicManualBonus2", "ranks": "Music_Manual_Ranks"}, {"total": "Song_and_Poerty", "ability": "Perform_Song_and_Poetry_AbilityMod", "placeholder": "CHA", "readonly": true, "bonus1": "SongPoetryBonus1", "bonus2": "SongPoetryBonus2", "ranks": "Song_and_Poetry_Ranks"}, {"total": "Perseverance", "ability": "Perseverance_AbilityMod", "placeholder": "CO/WI", "readonly": false, "bonus1": "PerseveranceBonus1", "bonus2": "PerseveranceBonus2", "ranks": "Perseverance_Ranks"}, {"total": "Ride", "ability": "Ride_AbilityMod", "placeholder": "DEX", "readonly": true, "bonus1": "RideBonus1", "bonus2": "RideBonus2", "ranks": "Ride_Ranks"}, {"total": "Seafaring", "ability": "Knowledge_Seafaring_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "SeafaringBonus1", "bonus2": "SeafaringBonus2", "ranks": "Seafaring_Ranks"}, {"total": "Sense_Motive", "ability": "Sense_Motive_AbilityMod", "placeholder": "WIS", "readonly": true, "bonus1": "SenseMotiveBonus1", "bonus2": "SenseMotiveBonus2", "ranks": "Sense_Motive_Ranks"}, {"total": "Sleight_of_Hand", "ability": "Sleight_of_Hand_AbilityMod", "placeholder": "DEX", "readonly": true, "bonus1": "SleightofHandBonus1", "bonus2": "SleightofHandBonus2", "ranks": "Sleight_of_Hand_Ranks"}, {"total": "Spot", "ability": "Spot_AbilityMod", "placeholder": "WIS", "readonly": true, "bonus1": "SpotBonus1", "bonus2": "SpotBonus2", "ranks": "Spot_Ranks"}, {"total": "Survival", "ability": "Survival_AbilityMod", "placeholder": "WIS", "readonly": true, "bonus1": "SurvivalBonus1", "bonus2": "SurvivalBonus2", "ranks": "Survival_Ranks"}, {"total": "Swim", "ability": "Swim_AbilityMod", "placeholder": "STR", "readonly": true, "bonus1": "SwimBonus1", "bonus2": "SwimBonus2", "ranks": "Swim_Ranks"}, {"total": "Tactics", "ability": "Knowledge_Tactics_AbilityMod", "placeholder": "INT", "readonly": true, "bonus1": "TacticsBonus1", "bonus2": "TacticsBonus2", "ranks": "Tactics_Ranks"}, {"total": "Under_Cover", "ability": "Under_Cover_AbilityMod", "placeholder": "CHA", "readonly": true, "bonus1": "UnderCoverBonus1", "bonus2": "UnderCoverBonus2", "ranks": "Under_Cover_Ranks"}, {"total": "Wrestling", "ability": "Wrestling_AbilityMod", "placeholder": "STR", "readonly": true, "bonus1": "WrestlingBonus1", "bonus2": "WrestlingBonus2", "ranks": "Wrestling_Ranks"}];
function updateSkillTotals() {
var attrs = [];
for (var i = 0; i < allSkillMap.length; i++) {
attrs.push(allSkillMap[i].ability, allSkillMap[i].bonus1, allSkillMap[i].bonus2, allSkillMap[i].ranks);
}
getAttrs(attrs, function(v) {
var out = {};
for (var i = 0; i < allSkillMap.length; i++) {
var skill = allSkillMap[i];
var sourcesBlank = String(v[skill.ability] || "").trim() === "" &&
String(v[skill.bonus1] || "").trim() === "" &&
String(v[skill.bonus2] || "").trim() === "" &&
String(v[skill.ranks] || "").trim() === "";
out[skill.total] = sourcesBlank ? "" : formatNumber(
toNumber(v[skill.ability]) +
toNumber(v[skill.bonus1]) +
toNumber(v[skill.bonus2]) +
toNumber(v[skill.ranks])
);
}
setAttrs(out);
});
}
function updateCustomSkillTotals(callback) {
getSectionIDs("repeating_customskills", function(ids) {
if (!ids || !ids.length) {
if (typeof callback === "function") callback();
return;
}
var attrs = [];
for (var i = 0; i < ids.length; i++) {
attrs.push(
"repeating_customskills_" + ids[i] + "_abilitymod",
"repeating_customskills_" + ids[i] + "_bonus1",
"repeating_customskills_" + ids[i] + "_bonus2",
"repeating_customskills_" + ids[i] + "_ranks"
);
}
getAttrs(attrs, function(v) {
var out = {};
for (var i = 0; i < ids.length; i++) {
var prefix = "repeating_customskills_" + ids[i] + "_";
var allBlank = String(v[prefix + "abilitymod"] || "").trim() === "" &&
String(v[prefix + "bonus1"] || "").trim() === "" &&
String(v[prefix + "bonus2"] || "").trim() === "" &&
String(v[prefix + "ranks"] || "").trim() === "";
out[prefix + "total"] = allBlank ? "" : formatNumber(
toNumber(v[prefix + "abilitymod"]) +
toNumber(v[prefix + "bonus1"]) +
toNumber(v[prefix + "bonus2"]) +
toNumber(v[prefix + "ranks"])
);
}
setAttrs(out, {}, function() {
if (typeof callback === "function") callback();
});
});
});
}
function updateTotalSkillRanks() {
var attrs = [];
for (var i = 0; i < allSkillMap.length; i++) {
attrs.push(allSkillMap[i].ranks);
}
getSectionIDs("repeating_customskills", function(ids) {
var repAttrs = [];
for (var i = 0; i < ids.length; i++) {
repAttrs.push("repeating_customskills_" + ids[i] + "_ranks");
}
getAttrs(attrs.concat(repAttrs), function(v) {
var total = 0;
for (var i = 0; i < allSkillMap.length; i++) {
total += toNumber(v[allSkillMap[i].ranks]);
}
for (var i = 0; i < repAttrs.length; i++) {
total += toNumber(v[repAttrs[i]]);
}
setAttrs({ Total_Skill_Ranks: total ? formatNumber(total) : "" });
});
});
}
function updateCarryCapacitiesFromSTR() {
getAttrs(["STR", "CarryCapacity_Light_Modified"], function(v) {
var raw = String(v.STR || "").trim();
var str = parseInt(raw, 10);
var modRaw = String(v.CarryCapacity_Light_Modified || "").trim();
var hasOverride = modRaw !== "";
var modLight = hasOverride ? toNumber(modRaw) : null;
if (isNaN(str) || str < 1 || str > 30) {
setAttrs({
CarryCapacity_Light: "",
CarryCapacity_Moderate: "",
CarryCapacity_Heavy: ""
});
return;
}
var baseLight = LFG_LIGHT_LOAD_BY_STR[str];
var effectiveLight = hasOverride ? modLight : baseLight;
setAttrs({
CarryCapacity_Light: formatNumber(baseLight),
CarryCapacity_Moderate: formatNumber(effectiveLight * 2),
CarryCapacity_Heavy: formatNumber(effectiveLight * 3)
});
});
}
function sumWeights(baseFields, repeatingSection, repeatingField, callback) {
getAttrs(baseFields, function(v) {
var total = 0;
for (var i = 0; i < baseFields.length; i++) {
total += toNumber(v[baseFields[i]]);
}
if (!repeatingSection) {
callback(total);
return;
}
getSectionIDs(repeatingSection, function(ids) {
if (!ids || !ids.length) {
callback(total);
return;
}
var repAttrs = [];
for (var i = 0; i < ids.length; i++) {
repAttrs.push("repeating_" + repeatingSection + "_" + ids[i] + "_" + repeatingField);
}
getAttrs(repAttrs, function(repVals) {
for (var i = 0; i < repAttrs.length; i++) {
total += toNumber(repVals[repAttrs[i]]);
}
callback(total);
});
});
});
}
function updateWeightTotals() {
sumWeights(
["HeadWeight","FaceWeight","NeckWeight","TorsoUnderWeight","TorsoOverWeight","WaistWeight","ShouldersWeight","ArmsWeight","HandsWeight","RingWeight1","RingWeight2","LegsWeight","FeetWeight","AccessoryWeight","CarriedItem1_Equip_Wt","CarriedItem2_Equip_Wt"],
null,
null,
function(equippedTotal) {
sumWeights(
["BackpackTest_Wt_1","BackpackTest_Wt_2","BackpackTest_Wt_3","BackpackTest_Wt_4","BackpackTest_Wt_5"],
"backpack",
"wt",
function(backpackTotal) {
sumWeights(
["SheathWeight1","SheathWeight2","SheathWeight3","SheathWeight4"],
"sheathsbandoliers",
"other_sheath_weight",
function(sheathTotal) {
sumWeights(
["BeltPouchWeight1","BeltPouchWeight2","BeltPouchWeight3","BeltPouchWeight4"],
"beltpouches",
"pouch_weight",
function(pouchTotal) {
var withPack = equippedTotal + backpackTotal + sheathTotal + pouchTotal;
var withoutPack = equippedTotal + sheathTotal + pouchTotal;
setAttrs({
TotalEquippedWeight: formatNumber(equippedTotal),
BackpackTest_TotalWeight: formatNumber(backpackTotal),
TotalSheathWeight: formatNumber(sheathTotal),
TotalPouchWeight: formatNumber(pouchTotal),
TotalGearWeight_WithBackpack: formatNumber(withPack),
TotalGearWeight_WithoutBackpack: formatNumber(withoutPack)
});
}
);
}
);
}
);
}
);
}
on("sheet:opened", function() {
updateAbilityMods();
updateInjuredThreshold();
updateSaveAbilityMods();
updateSaveTotals();
updateInitiative();
updateSkillAbilityMods();
updateSkillTotals();
updateCustomSkillTotals(updateTotalSkillRanks);
updateTotalSkillRanks();
updateCarryCapacitiesFromSTR();
updateWeightTotals();
});
on("change:STR change:DEX change:CON change:INT change:WIS change:CHA", function() {
updateAbilityMods();
updateSaveAbilityMods();
updateInitiative();
updateSkillAbilityMods();
updateSkillTotals();
updateCarryCapacitiesFromSTR();
});
on("change:HP", updateInjuredThreshold);
on("change:FORT_Save_Rating change:FORT_AbilityMod change:FORT_OtherBonus change:REF_Save_Rating change:REF_AbilityMod change:REF_OtherBonus change:WILL_Save_Rating change:WILL_AbilityMod change:WILL_OtherBonus", updateSaveTotals);
on("change:CONMOD change:DEXMOD change:WISMOD", function() {
updateSaveAbilityMods();
updateSaveTotals();
updateInitiative();
updateSkillAbilityMods();
updateSkillTotals();
});
on("change:Reactions", updateInitiative);
on("change:CarryCapacity_Light_Modified", updateCarryCapacitiesFromSTR);
on("change:Acrobatics_AbilityMod change:AcroBonus1 change:AcroBonus2 change:Acro_Ranks change:Bluff_AbilityMod change:BluffBonus1 change:BluffBonus2 change:Bluff_Ranks change:Climb_AbilityMod change:ClimbBonus1 change:ClimbBonus2 change:Climb_Ranks change:Craft_Academia_AbilityMod change:AcademiaBonus1 change:AcademiaBonus2 change:Academia_Ranks change:Craft_Alchemy_AbilityMod change:AlchemyBonus1 change:AlchemyBonus2 change:Alchemy_Ranks change:Craft_Blacksmith_AbilityMod change:BlacksmithBonus1 change:BlacksmithBonus2 change:Blacksmith_Ranks change:Craft_Bow_Fletch_AbilityMod change:Bow_FletchBonus1 change:Bow_FletchBonus2 change:Bow_Fletch_Ranks change:Craft_Fine_Arts_AbilityMod change:FineArtsBonus1 change:FineArtsBonus2 change:Fine_Arts_Ranks change:Craft_Jeweler_AbilityMod change:JewelerBonus1 change:JewelerBonus2 change:Jeweler_Ranks change:Craft_Magic_Item_AbilityMod change:CraftMagicItemBonus1 change:CraftMagicItemBonus2 change:Craft_Magic_Item_Ranks change:Craft_Mechanisms_AbilityMod change:MechanismsBonus1 change:MechanismsBonus2 change:Mechanisms_Ranks change:Craft_Stonework_AbilityMod change:StoneworkBonus1 change:StoneworkBonus2 change:Stonework_Ranks change:Craft_Tailor_AbilityMod change:TailorBonus1 change:TailorBonus2 change:Tailor_Ranks change:Craft_Woodwork_AbilityMod change:WoodworkBonus1 change:WoodworkBonus2 change:Woodwork_Ranks change:Diplomacy_AbilityMod change:DiplomacyBonus1 change:DiplomacyBonus2 change:Diplomacy_Ranks change:Handle_Animal_AbilityMod change:HandleAnimalBonus1 change:HandleAnimalBonus2 change:Handle_Animal_Ranks change:Heal_AbilityMod change:HealBonus1 change:HealBonus2 change:Heal_Ranks change:Hide_AbilityMod change:HideBonus1 change:HideBonus2 change:Hide_Ranks change:Intimidate_AbilityMod change:IntimidateBonus1 change:IntimidateBonus2 change:Intimidate_Ranks change:Jump_and_Sprint_AbilityMod change:JumpandSprintBonus1 change:JumpandSprintBonus2 change:Jump_and_Sprint_Ranks change:Knowledge_Arcana_AbilityMod change:ArcanaBonus1 change:ArcanaBonus2 change:Arcana_Ranks change:Knowledge_Civilization_AbilityMod change:CivilizationBonus1 change:CivilizationBonus2 change:Civilization_Ranks change:Knowledge_Dungeons_AbilityMod change:DungeonsBonus1 change:DungeonsBonus2 change:Dungeons_Ranks change:Knowledge_Nature_AbilityMod change:NatureBonus1 change:NatureBonus2 change:Nature_Ranks change:Knowledge_Planes_AbilityMod change:PlanesBonus1 change:PlanesBonus2 change:Planes_Ranks change:Knowledge_Religion_AbilityMod change:ReligionBonus1 change:ReligionBonus2 change:Religion_Ranks change:Linguistics_AbilityMod change:LinguisticsBonus1 change:LinguisticsBonus2 change:Linguistics_Ranks change:Listen_AbilityMod change:ListenBonus1 change:ListenBonus2 change:Listen_Ranks change:Move_Silently_AbilityMod change:MoveSilentlyBonus1 change:MoveSilentlyBonus2 change:Move_Silently_Ranks change:Perform_Comedy_and_Stories_AbilityMod change:ComedyBonus1 change:ComedyBonus2 change:Comedy_and_Stories_Ranks change:Perform_Dance_and_Motion_AbilityMod change:DanceBonus1 change:DanceBonus2 change:Dance_and_Motion_Ranks change:Perform_Music___Aerobic_AbilityMod change:MusicAerobicBonus1 change:MusicAerobicBonus2 change:Music_Aerobic_Ranks change:Perform_Music___Manual_AbilityMod change:MusicManualBonus1 change:MusicManualBonus2 change:Music_Manual_Ranks change:Perform_Song_and_Poetry_AbilityMod change:SongPoetryBonus1 change:SongPoetryBonus2 change:Song_and_Poerty_Ranks change:Perseverance_AbilityMod change:PerseveranceBonus1 change:PerseveranceBonus2 change:Perseverance_Ranks change:Ride_AbilityMod change:RideBonus1 change:RideBonus2 change:Ride_Ranks change:Knowledge_Seafaring_AbilityMod change:SeafaringBonus1 change:SeafaringBonus2 change:Seafaring_Ranks change:Sense_Motive_AbilityMod change:SenseMotiveBonus1 change:SenseMotiveBonus2 change:Sense_Motive_Ranks change:Sleight_of_Hand_AbilityMod change:SleightofHandBonus1 change:SleightofHandBonus2 change:Sleight_of_Hand_Ranks change:Spot_AbilityMod change:SpotBonus1 change:SpotBonus2 change:Spot_Ranks change:Survival_AbilityMod change:SurvivalBonus1 change:SurvivalBonus2 change:Survival_Ranks change:Swim_AbilityMod change:SwimBonus1 change:SwimBonus2 change:Swim_Ranks change:Knowledge_Tactics_AbilityMod change:TacticsBonus1 change:TacticsBonus2 change:Tactics_Ranks change:Under_Cover_AbilityMod change:UnderCoverBonus1 change:UnderCoverBonus2 change:Under_Cover_Ranks change:Wrestling_AbilityMod change:WrestlingBonus1 change:WrestlingBonus2 change:Wrestling_Ranks", function() { updateSkillTotals(); updateTotalSkillRanks(); });
on("change:repeating_customskills:abilitymod change:repeating_customskills:bonus1 change:repeating_customskills:bonus2 change:repeating_customskills:ranks remove:repeating_customskills", function() { updateCustomSkillTotals(updateTotalSkillRanks); });
on("change:HeadWeight change:FaceWeight change:NeckWeight change:TorsoUnderWeight change:TorsoOverWeight change:WaistWeight change:ShouldersWeight change:ArmsWeight change:HandsWeight change:RingWeight1 change:RingWeight2 change:LegsWeight change:FeetWeight change:AccessoryWeight change:CarriedItem1_Equip_Wt change:CarriedItem2_Equip_Wt change:BackpackTest_Wt_1 change:BackpackTest_Wt_2 change:BackpackTest_Wt_3 change:BackpackTest_Wt_4 change:BackpackTest_Wt_5 change:SheathWeight1 change:SheathWeight2 change:SheathWeight3 change:SheathWeight4 change:BeltPouchWeight1 change:BeltPouchWeight2 change:BeltPouchWeight3 change:BeltPouchWeight4 change:repeating_backpack:wt remove:repeating_backpack change:repeating_sheathsbandoliers:other_sheath_weight remove:repeating_sheathsbandoliers change:repeating_beltpouches:pouch_weight remove:repeating_beltpouches", updateWeightTotals);
})();
</script>