Files
roll20-character-sheets/Cloudbreaker_Alliance/cloudbreaker_alliance.html
T

6041 lines
318 KiB
HTML
Raw 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.
<!DOCTYPE html>
<main>
<div class="charsheet">
<datalist id="primary_class" class="sheet-classlist sheet-primary"></datalist>
<datalist id="secondary_class" class="sheet-classlist sheet-secondary"></datalist>
<datalist id="discipline_list" class="sheet-discipline"></datalist>
<datalist id="class_list" class="sheet-class"></datalist>
<datalist id="ranks_list" class="sheet-ranks"></datalist>
<input class="sheet-tabstoggle" name="attr_sheetTab" type="hidden" value="character"/>
<div class="sheet-header">
<div>
<button class="sheet-tabButton" data-i18n="character-button" name="act_character" type="action">
Character
</button>
<button class="sheet-tabButton" data-i18n="combat-button" name="act_combat" type="action">
Combat
</button>
<button class="sheet-tabButton" data-i18n="magic-button" name="act_magic" type="action">
Magic
</button>
<button class="sheet-tabButton" data-i18n="notes-button" name="act_notes" type="action">
Notes
</button>
<button class="sheet-tabButton" data-i18n="options-button" name="act_options" type="action">
Options
</button>
</div>
<div class="sheet-flexGrow sheet-flexEnd">
<select data-i18n-title="roll-whisper-type-select-title" name="attr_roll_whisper_type" title="Select roll visibility">
<option data-i18n="show-rolls-option" data-i18n-title="show-rolls-option-title" selected="" title="Rolls are visible by everyone" value="">
Show rolls
</option>
<option data-i18n="ask-each-time-option" data-i18n-title="ask-each-time-option-title" title="Select your roll visibility each time you roll" value="?{Whisper?|Public Roll,|Whisper Roll,/w gm }">
Ask each time
</option>
<option data-i18n="always-whisper-option" data-i18n-title="always-whisper-option-title" title="Only you and the GM will see your rolls" value="/w gm">
Always whisper
</option>
</select>
</div>
</div>
<div class="sheet-character sheet-tab">
<h1 data-i18n="character-title">
Character
</h1>
<!-- Player Info -->
<div class="sheet-playerinfo">
<!-- <div><span>Player Name:</span><input type="text" name="attr_player_name"/></div> -->
<div>
<div style="display: flex; flex: 1 0 auto;">
<span data-i18n="character-name-text">
Character Name:
</span>
<input name="attr_character_name" type="text"/>
</div>
<div style="display: flex; flex: 1 0 auto;">
<span data-i18n="character-alias-text">
Character Alias:
</span>
<input name="attr_character_alias" type="text"/>
</div>
<div style="display: flex; flex: 0 0 auto; width: 183px; ">
<span data-i18n="level-text">
Level:
</span>
<input name="attr_character_level" style="text-align: end;" type="number" value="1"/>
<span>
(
</span>
<input name="attr_character_xp" type="number"/>
<span data-i18n="exp-text">
) exp
</span>
</div>
</div>
<div>
<div style="display: flex; flex: 1 0 auto;">
<span data-i18n="lifeform-text">
Lifeform:
</span>
<input name="attr_character_lifeform" type="text"/>
</div>
<div style="flex-shrink: 0; width: 183px; display: flex;">
<span data-i18n="grade-text" style="flex-shrink: 0;">
Grade:
</span>
<input class="sheet-adventuringRank" name="attr_adventuring_grade" type="hidden" value="copper"/>
<span class="sheet-adventuringRank sheet-replicateInput sheet-copperRank" data-i18n="copper-grade-text">
Copper
</span>
<span class="sheet-adventuringRank sheet-replicateInput sheet-silverRank" data-i18n="silver-grade-text">
Silver
</span>
<span class="sheet-adventuringRank sheet-replicateInput sheet-goldRank" data-i18n="gold-grade-text">
Gold
</span>
<span class="sheet-adventuringRank sheet-replicateInput sheet-platinumRank" data-i18n="platinum-grade-text">
Platinum
</span>
</div>
</div>
<div>
<span data-i18n="primary-class-text">
⬖ Primary Class:
</span>
<input name="attr_character_primary_class" type="text" list="primary_class"/>
</div>
<div>
<span data-i18n="secondary-class-text">
⬗ Secondary Class:
</span>
<input name="attr_character_secondary_class" type="text" list="secondary_class"/>
</div>
</div>
<!-- Quirks -->
<div class="sheet-botSpace">
<input name="attr_quirk_total" type="hidden" value="0"/>
<input name="attr_quirk_points_label" type="hidden" value="0/2"/>
<div style="display: flex; flex-flow: column wrap; justify-content: stretch;">
<div class="sheet-sectionTitle" style="display: flex; flex: 1 1 auto;">
<span class="sheet-sectionTitle" data-i18n="character-quirks-text">
Character quirks
</span>
<input class="sheet-folder" name="attr_quirk_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
<span class="sheet-sectionTitle" name="attr_quirk_points_label" style="flex: 1 0 auto; text-align: end;">
</span>
</div>
<input class="sheet-folder" name="attr_quirk_fold" type="hidden"/>
<div class="sheet-foldable sheet-sectionContainer" style="flex-flow: column wrap; gap: 4px;">
<div>
<span data-i18n="bonus-max-quirk-text">
Bonus max quirk:
</span>
<input name="attr_added_quirk" type="number" value="0"/>
</div>
<!-- Quirks (repeating sections) -->
<fieldset class="repeating_quirks" style="flex-flow: row wrap;">
<!-- Name + Lvl + foldable section -->
<div>
<div>
<input data-i18n-placeholder="quirk-name-input-placeholder" data-i18n-title="quirk-name-input-title" name="attr_quirk_name" placeholder="Quirk name" title="Quirk name" type="text"/>
<input data-i18n-title="quirk-level-input-title" name="attr_quirk_level" title="Quirk level" type="number" value="1"/>
<input class="sheet-folder" name="attr_quirk_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<!-- Text area for quirk description -->
<input class="sheet-folder" name="attr_quirk_fold" type="hidden"/>
<div class="sheet-foldable">
<textarea data-i18n-placeholder="quirk-description-textarea-placeholder" data-i18n-title="quirk-description-textarea-title" name="attr_quirk_description" placeholder="Quirk description" style="width: 100%;" title="Quirk description"></textarea>
</div>
</div>
</fieldset>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<input name="attr_quirk_summary" type="hidden"/>
<span class="sheet-replicateInput sheet-contentSummary" name="attr_quirk_summary">
</span>
</div>
</div>
</div>
<!-- Resolve HP MP -->
<div>
<!-- Resolve HP MP -->
<div style="display: flex; flex-flow: row wrap; gap: 4px; justify-content: space-evenly;">
<div class="sheet-guardPoint">
<div class="sheet-sectionTitle">
<span data-i18n="spirit-text">
Spirit
</span>
<div>
<input name="attr_spirit1" type="checkbox"/>
<input name="attr_spirit2" type="checkbox"/>
<input name="attr_spirit3" type="checkbox"/>
<input name="attr_spirit4" type="checkbox"/>
<input name="attr_spirit5" type="checkbox"/>
</div>
</div>
<div class="sheet-sectionTitle">
<span data-i18n="resolve-points-text">
Resolve Points
</span>
<input class="sheet-folder" name="attr_resolve_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<div class="sheet-extendedCounterPoint">
<input class="sheet-folder" name="attr_resolve_fold" type="hidden"/>
<div class="sheet-counterPoint">
<div class="sheet-inputPoint">
<input name="attr_resolve_current" type="number" value="30"/>
</div>
<div>
<span data-i18n="max-resolve-text">
Max Resolve
</span>
<input name="attr_resolve_max" type="hidden" value="30"/>
<span class="sheet-replicateInput" name="attr_resolve_max">
</span>
</div>
</div>
<div class="sheet-foldable">
<div>
<span data-i18n="max-resolve-bonus-text">
Max Resolve Bonus
</span>
<input name="attr_added_resolve" type="number" value="0"/>
</div>
</div>
</div>
</div>
<div class="sheet-guardPoint">
<div class="sheet-sectionTitle">
<span data-i18n="barrier-text">
Barrier
</span>
<div>
<input name="attr_barrier1" type="checkbox"/>
<input name="attr_barrier2" type="checkbox"/>
<input name="attr_barrier3" type="checkbox"/>
</div>
</div>
<div class="sheet-sectionTitle">
<span data-i18n="hit-points-text">
Hit Points
</span>
<input class="sheet-folder" name="attr_hp_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<div class="sheet-extendedCounterPoint">
<input class="sheet-folder" name="attr_hp_fold" type="hidden"/>
<div class="sheet-counterPoint">
<div class="sheet-inputPoint">
<input name="attr_hp_current" type="number" value="15"/>
</div>
<div>
<span data-i18n="max-hp-text">
Max HP
</span>
<input name="attr_hp_max" type="hidden" value="15"/>
<span class="sheet-replicateInput" name="attr_hp_max">
</span>
</div>
</div>
<div class="sheet-foldable">
<div>
<span data-i18n="unarmored-toughness-text">
Unarmored Toughness
</span>
<input name="attr_unarmored_toughness" type="checkbox"/>
</div>
<div>
<span data-i18n="armor-hp-text">
Armor HP
</span>
<select name="attr_armor_type">
<option data-i18n="none-option" selected="" value="none">
None
</option>
<option data-i18n="light-option" value="light">
Light
</option>
<option data-i18n="medium-option" value="medium">
Medium
</option>
<option data-i18n="heavy-option" value="heavy">
Heavy
</option>
</select>
<input name="attr_armor_hp" type="number" value="0"/>
</div>
<div>
<span data-i18n="max-hp-bonus-text">
Max HP Bonus
</span>
<input name="attr_added_hp" type="number" value="0"/>
</div>
</div>
</div>
</div>
<div class="sheet-guardPoint">
<div class="sheet-sectionTitle">
<span data-i18n="spellglyphs-text">
Spellglyphs
</span>
<div>
<input name="attr_glyph1" type="checkbox"/>
<input name="attr_glyph2" type="checkbox"/>
<input name="attr_glyph3" type="checkbox"/>
</div>
</div>
<div class="sheet-sectionTitle">
<span data-i18n="mind-points-text">
Mind Points
</span>
<input class="sheet-folder" name="attr_mp_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<div class="sheet-extendedCounterPoint">
<input class="sheet-folder" name="attr_mp_fold" type="hidden"/>
<div class="sheet-counterPoint">
<div class="sheet-inputPoint">
<input name="attr_mp_current" type="number" value="15"/>
</div>
<div>
<span data-i18n="max-mp-text">
Max MP
</span>
<input name="attr_mp_max" type="hidden" value="15"/>
<span class="sheet-replicateInput" name="attr_mp_max">
</span>
</div>
</div>
<div class="sheet-foldable">
<div>
<span data-i18n="max-mp-bonus-text">
Max MP Bonus
</span>
<input name="attr_added_mp" type="number" value="0"/>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Stat pills -->
<div class="sheet-botSpace" style="align-items: center; flex-flow: row wrap; justify-content: space-evenly;">
<!-- Fond memories -->
<div class="sheet-statPill">
<div class="sheet-sectionTitle">
<span data-i18n="fond-text">
Fond
</span>
<span data-i18n="memories-text" style="font-size: small;">
Memories
</span>
</div>
<div>
<input name="attr_fond_memories" style="text-align: center;" type="number" value="0"/>
<div style="display: flex;
flex-flow: column;
height: auto;
border: 0;
border-radius: 0;
padding: 0;
margin-right: 2px;">
<span data-i18n="max-text">
Max
</span>
<span style="text-align: center; font-weight: bold;">
50
</span>
</div>
</div>
</div>
<!-- Mastery bonus -->
<div class="sheet-statPill">
<div class="sheet-sectionTitle">
<span data-i18n="mastery-text" style="font-size: small;">
Mastery
</span>
<span data-i18n="bonus-text">
Bonus
</span>
</div>
<div>
<span style="font-size: x-large; font-weight: bold;">
+
</span>
<input name="attr_mastery_bonus" type="hidden" value="2"/>
<span class="sheet-replicateInput" name="attr_mastery_bonus" style="width: 3em;">
</span>
</div>
</div>
<!-- Destiny End Points -->
<div class="sheet-statPill">
<div class="sheet-sectionTitle">
<span data-i18n="destiny's-text">
Destiny's
</span>
<span data-i18n="end-points-text" style="font-size: small;">
End Points
</span>
</div>
<div>
<input name="attr_destiny_current" style="text-align: center;" type="number" value="0"/>
<div style="display: flex;
flex-flow: column;
height: auto;
border: 0;
border-radius: 0;
padding: 0;
margin-right: 2px;">
<span data-i18n="max-text">
Max
</span>
<span style="text-align: center; font-weight: bold;">
12
</span>
</div>
</div>
</div>
</div>
<!-- Comps and Toolkits -->
<div class="sheet-botSpace" style="flex-flow: row wrap; gap: 4px;">
<!-- Attributes & Skills tableau -->
<div class="sheet-attributeTable">
<!-- Header -->
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="attributes-text" style="width: 148px; flex: 0 0 auto;">
Attributes
</span>
<span class="sheet-sectionTitle" data-i18n="skills-text" style="width: 120px; flex: 1 0 auto;">
Skills
</span>
<span class="sheet-sectionTitle" data-i18n="bns-text" style="width: 45.5px; flex: 1 0 auto;">
BNS
</span>
<span class="sheet-sectionTitle" data-i18n="roll-text" style="width: 50px; flex: 0 0 auto;">
Roll
</span>
</div>
<div>
<!--
Strength
Brute
Endurance
Intimidation
Agility
Sports
Thievery
Deception
Awareness
Detect
Information
Reason
Empathy
Psychology
Artistry
Charm
-->
<!-- Strength -->
<div class="sheet-abilityBlock">
<div class="sheet-statBlock">
<input name="attr_strength" type="number" value="0"/>
<button name="act_rollStrength" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Strength}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{strength} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{strength} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{strength} @{ask_modifier}]]}}">
<span data-i18n="strength-text">
Strength
</span>
</button>
</div>
<div class="sheet-compBlock">
<div class="sheet-compLine">
<span>
+
</span>
<input name="attr_brute" type="checkbox"/>
<input name="attr_brute_mastery" type="hidden" value="0"/>
<span data-i18n="brute-text">
Brute
</span>
<input name="attr_brute_bns" type="number" value="0"/>
<input name="attr_brute_total_label" type="hidden" value="0"/>
<button name="act_rollBrute" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Brute}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{strength} +@{brute_mastery} +@{brute_bns} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{strength} +@{brute_mastery} +@{brute_bns} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{strength} +@{brute_mastery} +@{brute_bns} @{ask_modifier}]]}}">
<span name="attr_brute_total_label">
</span>
</button>
</div>
<div class="sheet-compLine">
<span>
+
</span>
<input name="attr_endurance" type="checkbox"/>
<input name="attr_endurance_mastery" type="hidden" value="0"/>
<span data-i18n="endurance-text">
Endurance
</span>
<input name="attr_endurance_bns" type="number" value="0"/>
<input name="attr_endurance_total_label" type="hidden" value="0"/>
<button name="act_rollEndurance" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Endurance}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{strength} +@{endurance_mastery} +@{endurance_bns} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{strength} +@{endurance_mastery} +@{endurance_bns} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{strength} +@{endurance_mastery} +@{endurance_bns} @{ask_modifier}]]}}">
<span name="attr_endurance_total_label">
</span>
</button>
</div>
<div class="sheet-compLine">
<span>
+
</span>
<input name="attr_intimidation" type="checkbox"/>
<input name="attr_intimidation_mastery" type="hidden" value="0"/>
<span data-i18n="intimidation-text">
Intimidation
</span>
<input name="attr_intimidation_bns" type="number" value="0"/>
<input name="attr_intimidation_total_label" type="hidden" value="0"/>
<button name="act_rollIntimidation" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Intimidation}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{strength} +@{intimidation_mastery} +@{intimidation_bns} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{strength} +@{intimidation_mastery} +@{intimidation_bns} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{strength} +@{intimidation_mastery} +@{intimidation_bns} @{ask_modifier}]]}}">
<span name="attr_intimidation_total_label">
</span>
</button>
</div>
</div>
</div>
<!-- Agility -->
<div class="sheet-abilityBlock">
<div class="sheet-statBlock">
<input name="attr_agility" type="number" value="0"/>
<button name="act_rollAgility" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Agility}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{agility} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{agility} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{agility} @{ask_modifier}]]}}">
<span data-i18n="agility-text">
Agility
</span>
</button>
</div>
<div class="sheet-compBlock">
<div class="sheet-compLine">
<span>
+
</span>
<input name="attr_sports" type="checkbox"/>
<input name="attr_sports_mastery" type="hidden" value="0"/>
<span data-i18n="sports-text">
Sports
</span>
<input name="attr_sports_bns" type="number" value="0"/>
<input name="attr_sports_total_label" type="hidden" value="0"/>
<button name="act_rollSports" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Sports}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{agility} +@{sports_mastery} +@{sports_bns} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{agility} +@{sports_mastery} +@{sports_bns} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{agility} +@{sports_mastery} +@{sports_bns} @{ask_modifier}]]}}">
<span name="attr_sports_total_label">
</span>
</button>
</div>
<div class="sheet-compLine">
<span>
+
</span>
<input name="attr_thievery" type="checkbox"/>
<input name="attr_thievery_mastery" type="hidden" value="0"/>
<span data-i18n="thievery-text">
Thievery
</span>
<input name="attr_thievery_bns" type="number" value="0"/>
<input name="attr_thievery_total_label" type="hidden" value="0"/>
<button name="act_rollThievery" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Thievery}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{agility} +@{thievery_mastery} +@{thievery_bns} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{agility} +@{thievery_mastery} +@{thievery_bns} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{agility} +@{thievery_mastery} +@{thievery_bns} @{ask_modifier}]]}}">
<span name="attr_thievery_total_label">
</span>
</button>
</div>
<div class="sheet-compLine">
<span>
+
</span>
<input name="attr_deception" type="checkbox"/>
<input name="attr_deception_mastery" type="hidden" value="0"/>
<span data-i18n="deception-text">
Deception
</span>
<input name="attr_deception_bns" type="number" value="0"/>
<input name="attr_deception_total_label" type="hidden" value="0"/>
<button name="act_rollDeception" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Deception}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{agility} +@{deception_mastery} +@{deception_bns} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{agility} +@{deception_mastery} +@{deception_bns} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{agility} +@{deception_mastery} +@{deception_bns} @{ask_modifier}]]}}">
<span name="attr_deception_total_label">
</span>
</button>
</div>
</div>
</div>
<!-- Awareness -->
<div class="sheet-abilityBlock">
<div class="sheet-statBlock">
<input name="attr_awareness" type="number" value="0"/>
<button name="act_rollAwareness" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Awareness}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{awareness} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{awareness} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{awareness} @{ask_modifier}]]}}">
<span data-i18n="awareness-text">
Awareness
</span>
</button>
</div>
<div class="sheet-compBlock">
<div class="sheet-compLine">
<span>
+
</span>
<input name="attr_detect" type="checkbox"/>
<input name="attr_detect_mastery" type="hidden" value="0"/>
<span data-i18n="detect-text">
Detect
</span>
<input name="attr_detect_bns" type="number" value="0"/>
<input name="attr_detect_total_label" type="hidden" value="0"/>
<button name="act_rollDetect" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Detect}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{awareness} +@{detect_mastery} +@{detect_bns} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{awareness} +@{detect_mastery} +@{detect_bns} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{awareness} +@{detect_mastery} +@{detect_bns} @{ask_modifier}]]}}">
<span name="attr_detect_total_label">
</span>
</button>
</div>
<div class="sheet-compLine">
<span>
+
</span>
<input name="attr_information" type="checkbox"/>
<input name="attr_information_mastery" type="hidden" value="0"/>
<span data-i18n="information-text">
Information
</span>
<input name="attr_information_bns" type="number" value="0"/>
<input name="attr_information_total_label" type="hidden" value="0"/>
<button name="act_rollInformation" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Information}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{awareness} +@{information_mastery} +@{information_bns} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{awareness} +@{information_mastery} +@{information_bns} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{awareness} +@{information_mastery} +@{information_bns} @{ask_modifier}]]}}">
<span name="attr_information_total_label">
</span>
</button>
</div>
<div class="sheet-compLine">
<span>
+
</span>
<input name="attr_reason" type="checkbox"/>
<input name="attr_reason_mastery" type="hidden" value="0"/>
<span data-i18n="reason-text">
Reason
</span>
<input name="attr_reason_bns" type="number" value="0"/>
<input name="attr_reason_total_label" type="hidden" value="0"/>
<button name="act_rollReason" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Reason}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{awareness} +@{reason_mastery} +@{reason_bns} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{awareness} +@{reason_mastery} +@{reason_bns} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{awareness} +@{reason_mastery} +@{reason_bns} @{ask_modifier}]]}}">
<span name="attr_reason_total_label">
</span>
</button>
</div>
</div>
</div>
<!-- Empathy -->
<div class="sheet-abilityBlock">
<div class="sheet-statBlock">
<input name="attr_empathy" type="number" value="0"/>
<button name="act_rollEmpathy" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Empathy}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{empathy} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{empathy} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{empathy} @{ask_modifier}]]}}">
<span data-i18n="empathy-text">
Empathy
</span>
</button>
</div>
<div class="sheet-compBlock">
<div class="sheet-compLine">
<span>
+
</span>
<input name="attr_psychology" type="checkbox"/>
<input name="attr_psychology_mastery" type="hidden" value="0"/>
<span data-i18n="psychology-text">
Psychology
</span>
<input name="attr_psychology_bns" type="number" value="0"/>
<input name="attr_psychology_total_label" type="hidden" value="0"/>
<button name="act_rollPsychology" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Psychology}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{empathy} +@{psychology_mastery} +@{psychology_bns} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{empathy} +@{psychology_mastery} +@{psychology_bns} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{empathy} +@{psychology_mastery} +@{psychology_bns} @{ask_modifier}]]}}">
<span name="attr_psychology_total_label">
</span>
</button>
</div>
<div class="sheet-compLine">
<span>
+
</span>
<input name="attr_artistry" type="checkbox"/>
<input name="attr_artistry_bns" type="hidden" value="0"/>
<span data-i18n="artistry-text">
Artistry
</span>
<input name="attr_artistry_bns" type="number" value="0"/>
<input name="attr_artistry_total_label" type="hidden" value="0"/>
<button name="act_rollArtistry" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Artistry}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{empathy} +@{artistry_mastery} +@{artistry_bns} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{empathy} +@{artistry_mastery} +@{artistry_bns} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{empathy} +@{artistry_mastery} +@{artistry_bns} @{ask_modifier}]]}}">
<span name="attr_artistry_total_label">
</span>
</button>
</div>
<div class="sheet-compLine">
<span>
+
</span>
<input name="attr_appeal" type="checkbox"/>
<input name="attr_appeal_bns" type="hidden" value="0"/>
<span data-i18n="appeal-text">
Appeal
</span>
<input name="attr_appeal_bns" type="number" value="0"/>
<input name="attr_appeal_total_label" type="hidden" value="0"/>
<button name="act_rollAppeal" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Appeal}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{empathy} +@{appeal_mastery} +@{appeal_bns} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{empathy} +@{appeal_mastery} +@{appeal_bns} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{empathy} +@{appeal_mastery} +@{appeal_bns} @{ask_modifier}]]}}">
<span name="attr_appeal_total_label">
</span>
</button>
</div>
</div>
</div>
</div>
</div>
<!-- Toolkits -->
<div class="sheet-toolkitTable">
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="toolkits-text" style="flex: 4 0 auto;">
Toolkits
</span>
<span class="sheet-sectionTitle" data-i18n="quality-text" style="flex: 2 0 auto;">
Quality
</span>
<span class="sheet-sectionTitle" data-i18n="bns-text" style="flex: 1 0 auto;">
BNS
</span>
<span class="sheet-sectionTitle" data-i18n="roll-text" style="flex: 1 0 auto;">
Roll
</span>
</div>
<div>
<!--
Arcanist
Chemist
Climbing
Impersonation
Infiltration
Mechanic
Navigation
Thaumaturgist
Free Toolkit places
-->
<!-- Arcanist -->
<div class="sheet-toolkitBlock">
<span data-i18n="arcanist-kit-text">
Arcanist kit
</span>
<input name="attr_arcanist_quality" type="number" value="0"/>
<span>
+
</span>
<input name="attr_arcanist" type="checkbox"/>
<input name="attr_arcanist_mastery" type="hidden" value="0"/>
<input name="attr_arcanist_bns" type="number" value="0"/>
<input name="attr_arcanist_total_label" type="hidden" value="+0"/>
<button name="act_rollArcanist" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Arcanist kit}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{arcanist_quality} +@{arcanist_mastery} +@{arcanist_bns} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{arcanist_quality} +@{arcanist_mastery} +@{arcanist_bns} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{arcanist_quality} +@{arcanist_mastery} +@{arcanist_bns} @{ask_modifier}]]}}">
<span name="attr_arcanist_total_label">
</span>
</button>
</div>
<!-- Chemist -->
<div class="sheet-toolkitBlock">
<span data-i18n="chemist-kit-text">
Chemist kit
</span>
<input name="attr_chemist_quality" type="number" value="0"/>
<span>
+
</span>
<input name="attr_chemist" type="checkbox"/>
<input name="attr_chemist_mastery" type="hidden" value="0"/>
<input name="attr_chemist_bns" type="number" value="0"/>
<input name="attr_chemist_total_label" type="hidden" value="+0"/>
<button name="act_rollChemist" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Chemist kit}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{chemist_quality} +@{chemist_mastery} +@{chemist_bns} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{chemist_quality} +@{chemist_mastery} +@{chemist_bns} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{chemist_quality} +@{chemist_mastery} +@{chemist_bns} @{ask_modifier}]]}}">
<span name="attr_chemist_total_label">
</span>
</button>
</div>
<!-- Climbing -->
<div class="sheet-toolkitBlock">
<span data-i18n="climbing-kit-text">
Climbing kit
</span>
<input name="attr_climbing_quality" type="number" value="0"/>
<span>
+
</span>
<input name="attr_climbing" type="checkbox"/>
<input name="attr_climbing_mastery" type="hidden" value="0"/>
<input name="attr_climbing_bns" type="number" value="0"/>
<input name="attr_climbing_total_label" type="hidden" value="+0"/>
<button name="act_rollClimbing" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Climbing kit}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{climbing_quality} +@{climbing_mastery} +@{climbing_bns} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{climbing_quality} +@{climbing_mastery} +@{climbing_bns} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{climbing_quality} +@{climbing_mastery} +@{climbing_bns} @{ask_modifier}]]}}">
<span name="attr_climbing_total_label">
</span>
</button>
</div>
<!-- Impersonation -->
<div class="sheet-toolkitBlock" style="margin-bottom: 6px;">
<span data-i18n="impersonation-kit-text">
Impersonation kit
</span>
<input name="attr_impersonation_quality" type="number" value="0"/>
<span>
+
</span>
<input name="attr_impersonation" type="checkbox"/>
<input name="attr_impersonation_mastery" type="hidden" value="0"/>
<input name="attr_impersonation_bns" type="number" value="0"/>
<input name="attr_impersonation_total_label" type="hidden" value="+0"/>
<button name="act_rollImpersonation" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Impersonation kit}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{impersonation_quality} +@{impersonation_mastery} +@{impersonation_bns} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{impersonation_quality} +@{impersonation_mastery} +@{impersonation_bns} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{impersonation_quality} +@{impersonation_mastery} +@{impersonation_bns} @{ask_modifier}]]}}">
<span name="attr_impersonation_total_label">
</span>
</button>
</div>
<!-- Infiltration -->
<div class="sheet-toolkitBlock">
<span data-i18n="infiltration-kit-text">
Infiltration kit
</span>
<input name="attr_infiltration_quality" type="number" value="0"/>
<span>
+
</span>
<input name="attr_infiltration" type="checkbox"/>
<input name="attr_infiltration_mastery" type="hidden" value="0"/>
<input name="attr_infiltration_bns" type="number" value="0"/>
<input name="attr_infiltration_total_label" type="hidden" value="+0"/>
<button name="act_rollInfiltration" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Infiltration kit}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{infiltration_quality} +@{infiltration_mastery} +@{infiltration_bns} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{infiltration_quality} +@{infiltration_mastery} +@{infiltration_bns} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{infiltration_quality} +@{infiltration_mastery} +@{infiltration_bns} @{ask_modifier}]]}}">
<span name="attr_infiltration_total_label">
</span>
</button>
</div>
<!-- Mechanic -->
<div class="sheet-toolkitBlock">
<span data-i18n="mechanic-kit-text">
Mechanic kit
</span>
<input name="attr_mechanic_quality" type="number" value="0"/>
<span>
+
</span>
<input name="attr_mechanic" type="checkbox"/>
<input name="attr_mechanic_mastery" type="hidden" value="0"/>
<input name="attr_mechanic_bns" type="number" value="0"/>
<input name="attr_mechanic_total_label" type="hidden" value="+0"/>
<button name="act_rollMechanic" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Mechanic kit}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{mechanic_quality} +@{mechanic_mastery} +@{mechanic_bns} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{mechanic_quality} +@{mechanic_mastery} +@{mechanic_bns} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{mechanic_quality} +@{mechanic_mastery} +@{mechanic_bns} @{ask_modifier}]]}}">
<span name="attr_mechanic_total_label">
</span>
</button>
</div>
<!-- Navigation -->
<div class="sheet-toolkitBlock">
<span data-i18n="navigation-kit-text">
Navigation kit
</span>
<input name="attr_navigation_quality" type="number" value="0"/>
<span>
+
</span>
<input name="attr_navigation" type="checkbox"/>
<input name="attr_navigation_mastery" type="hidden" value="0"/>
<input name="attr_navigation_bns" type="number" value="0"/>
<input name="attr_navigation_total_label" type="hidden" value="+0"/>
<button name="act_rollNavigation" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Navigation kit}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{navigation_quality} +@{navigation_mastery} +@{navigation_bns} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{navigation_quality} +@{navigation_mastery} +@{navigation_bns} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{navigation_quality} +@{navigation_mastery} +@{navigation_bns} @{ask_modifier}]]}}">
<span name="attr_navigation_total_label">
</span>
</button>
</div>
<!-- Thaumaturgist -->
<div class="sheet-toolkitBlock" style="margin-bottom: 6px;">
<span data-i18n="thaumaturgist-kit-text">
Thaumaturgist kit
</span>
<input name="attr_thaumaturgist_quality" type="number" value="0"/>
<span>
+
</span>
<input name="attr_thaumaturgist" type="checkbox"/>
<input name="attr_thaumaturgist_mastery" type="hidden" value="0"/>
<input name="attr_thaumaturgist_bns" type="number" value="0"/>
<input name="attr_thaumaturgist_total_label" type="hidden" value="+0"/>
<button name="act_rollThaumaturgist" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=Thaumaturgist kit}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{thaumaturgist_quality} +@{thaumaturgist_mastery} +@{thaumaturgist_bns} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{thaumaturgist_quality} +@{thaumaturgist_mastery} +@{thaumaturgist_bns} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{thaumaturgist_quality} +@{thaumaturgist_mastery} +@{thaumaturgist_bns} @{ask_modifier}]]}}">
<span name="attr_thaumaturgist_total_label">
</span>
</button>
</div>
<!-- Free Toolkit places -->
<fieldset class="repeating_toolkits">
<div>
<div class="sheet-toolkitBlock">
<input data-i18n-placeholder="toolkit-name-input-placeholder" name="attr_toolkit_name" placeholder="Toolkit name" type="text"/>
<input name="attr_toolkit_quality" type="number" value="0"/>
<span>
+
</span>
<input name="attr_toolkit" type="checkbox"/>
<input name="attr_toolkit_mastery" type="hidden" value="0"/>
<input name="attr_toolkit_bns" type="number" value="0"/>
<input name="attr_toolkit_total_label" type="hidden" value="+0"/>
<button name="act_rollToolkit" type="roll" value="@{roll_whisper_type} &amp;{template:generic} {{charName=@{character_name}}} {{rollName=@{toolkit_name} kit}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{toolkit_quality} +@{toolkit_mastery} +@{toolkit_bns} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{toolkit_quality} +@{toolkit_mastery} +@{toolkit_bns} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{toolkit_quality} +@{toolkit_mastery} +@{toolkit_bns} @{ask_modifier}]]}}">
<span name="attr_toolkit_total_label">
</span>
</button>
</div>
</div>
</fieldset>
</div>
</div>
</div>
<!-- Traits & stuff -->
<div style="display: flex; flex-flow: row wrap; gap: 4px; justify-content: stretch;">
<!-- Traits & Features -->
<div style="flex-flow: column; flex: 1 1 auto;">
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="traits-&amp;-features-text" style="flex: 1 1 auto;">
Traits &amp; Features
</span>
<input class="sheet-folder" name="attr_trait_summary_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_trait_summary_fold" type="hidden"/>
<div class="sheet-sectionContainer sheet-foldable" style="gap: 4px;">
<div>
<!-- Quirks -->
<!-- as a repeating section -->
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="quirks-text">
Quirks
</span>
<input class="sheet-folder" name="attr_quirk_trait_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_quirk_trait_fold" type="hidden"/>
<div class="sheet-foldable sheet-sectionContainer">
<fieldset class="repeating_quirks">
<div>
<div>
<input data-i18n-placeholder="quirk-name-input-placeholder" data-i18n-title="quirk-name-input-title" name="attr_quirk_name" placeholder="Quirk name" title="Quirk name" type="text"/>
<input data-i18n-title="quirk-level-input-title" name="attr_quirk_level" title="Quirk level" type="number" value="1"/>
<input class="sheet-folder" name="attr_quirk_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<!-- Text area for quirk description -->
<input class="sheet-folder" name="attr_quirk_fold" type="hidden"/>
<div class="sheet-foldable">
<textarea name="attr_quirk_description" style="width: 100%;"></textarea>
</div>
</div>
</fieldset>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<input name="attr_quirk_summary" type="hidden"/>
<span class="sheet-replicateInput sheet-contentSummary" name="attr_quirk_summary">
</span>
</div>
</div>
<div>
<!-- Traits -->
<!-- as a repeating section -->
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="lifeform-traits-text">
Lifeform traits
</span>
<input class="sheet-folder" name="attr_trait_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_trait_fold" type="hidden"/>
<div class="sheet-foldable sheet-sectionContainer">
<fieldset class="repeating_traits">
<div>
<div class="sheet-repeatingTrait">
<div>
<input data-i18n-placeholder="trait-name-input-placeholder" data-i18n-title="trait-name-input-title" name="attr_trait_name" placeholder="Trait name" title="Trait name" type="text"/>
<input data-i18n-placeholder="trait-lifeform-input-placeholder" data-i18n-title="trait-lifeform-input-title" name="attr_trait_lifeform" placeholder="Lifeform" title="Lifeform" type="text"/>
<input class="sheet-folder" name="attr_trait_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<!-- Text area for trait description -->
<input class="sheet-folder" name="attr_trait_fold" type="hidden"/>
<div class="sheet-foldable">
<select data-i18n-title="trait-type-select-title" name="attr_trait_type" title="Trait type">
<option data-i18n="major-option" value="major">
Major
</option>
<option data-i18n="minor-option" value="minor">
minor
</option>
<option data-i18n="xtra-option" value="xtra">
Xtra
</option>
</select>
<textarea data-i18n-placeholder="trait-description-textarea-placeholder" name="attr_trait_description" placeholder="Trait description" style="width: 100%;"></textarea>
</div>
</div>
</div>
</fieldset>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<input name="attr_trait_summary" type="hidden"/>
<span class="sheet-replicateInput sheet-contentSummary" name="attr_trait_summary">
</span>
</div>
</div>
<!-- Features -->
<!-- as a repeating section -->
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="discipline-&amp;-class-features-text">
Discipline &amp; Class features
</span>
<input class="sheet-folder" name="attr_feature_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_feature_fold" type="hidden"/>
<div class="sheet-foldable sheet-sectionContainer">
<fieldset class="repeating_features">
<div>
<div class="sheet-repeatingFeature">
<div>
<input data-i18n-placeholder="feature-name-input-placeholder" data-i18n-title="feature-name-input-title" name="attr_feature_name" placeholder="Feature name" title="Feature name" type="text"/>
<input data-i18n-placeholder="feature-discipline-input-placeholder" data-i18n-title="feature-discipline-input-title" name="attr_feature_discipline" placeholder="Discipline" title="Feature discipline" type="text"/>
<input class="sheet-folder" name="attr_feature_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<!-- Text area for feature description -->
<input class="sheet-folder" name="attr_feature_fold" type="hidden"/>
<div class="sheet-foldable">
<div>
<input data-i18n-placeholder="feature-class-input-placeholder" data-i18n-title="feature-class-input-title" name="attr_feature_class" placeholder="Class" title="Class" type="text"/>
<input data-i18n-title="feature-level-input-title" name="attr_feature_level" title="Feature level" type="number" value="1"/>
</div>
<textarea data-i18n-placeholder="feature-description-textarea-placeholder" name="attr_feature_description" placeholder="Feature description" style="width: 100%;"></textarea>
</div>
</div>
</div>
</fieldset>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<input name="attr_feature_summary" type="hidden"/>
<span class="sheet-replicateInput sheet-contentSummary" name="attr_feature_summary">
</span>
</div>
</div>
</div>
<input name="attr_quirk_traits_features_summary" type="hidden"/>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<span class="sheet-replicateInput sheet-contentSummary" name="attr_quirk_traits_features_summary">
</span>
</div>
</div>
<!-- Character Equipment -->
<div style="flex-flow: column; flex: 1 1 auto;">
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="equipment-text">
Equipment
</span>
<div style="flex: 1 0 auto; display: flex; justify-content: center; gap: 4px;">
<span class="sheet-sectionTitle" data-i18n="cred-text">
Cred
</span>
<input name="attr_equipment_cred" type="number" value="0"/>
</div>
<input name="attr_equipment_weight_label" type="hidden" value="0/8"/>
<span class="sheet-sectionTitle" name="attr_equipment_weight_label">
</span>
<input class="sheet-folder" name="attr_equipment_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_equipment_fold" type="hidden"/>
<div class="sheet-sectionContainer sheet-foldable" style="gap: 4px;">
<div>
<span data-i18n="additional-slots-text">
Additional slots:
</span>
<input name="attr_added_slots" type="number" value="0"/>
</div>
<fieldset class="repeating_equipment">
<div>
<div class="sheet-repeatingEquipment">
<div>
<input data-i18n-placeholder="equipment-name-input-placeholder" data-i18n-title="equipment-name-input-title" name="attr_equipment_name" placeholder="Equipment name" title="Equipment name" type="text"/>
<input data-i18n-title="equipment-quantity-input-title" name="attr_equipment_quantity" title="Equipment quantity" type="number" value="1"/>
<input data-i18n-title="equipment-weight-input-title" name="attr_equipment_weight" title="Equipment weight" type="number" value="0"/>
<input class="sheet-folder" name="attr_equipment_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<!-- Text area for equipment description -->
<input class="sheet-folder" name="attr_equipment_fold" type="hidden"/>
<div class="sheet-foldable">
<textarea data-i18n-placeholder="equipment-description-textarea-placeholder" name="attr_equipment_description" placeholder="Equipment description" style="width: 100%;"></textarea>
</div>
</div>
</div>
</fieldset>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<input name="attr_equipment_summary" type="hidden"/>
<span class="sheet-replicateInput sheet-contentSummary" name="attr_equipment_summary">
</span>
</div>
</div>
</div>
</div>
<div class="sheet-combat sheet-tab">
<h1 data-i18n="combat-title">
Combat
</h1>
<!-- Player Info -->
<div class="sheet-playerinfo sheet-botSpace">
<!-- <div><span>Player Name:</span><input type="text" name="attr_player_name"/></div> -->
<div>
<div style="display: flex; flex: 1 0 auto;">
<span data-i18n="character-name-text">
Character Name:
</span>
<input name="attr_character_name" type="text"/>
</div>
<div style="display: flex; flex: 1 0 auto;">
<span data-i18n="character-alias-text">
Character Alias:
</span>
<input name="attr_character_alias" type="text"/>
</div>
<div style="display: flex; flex-shrink: 0; width: 183px;">
<span data-i18n="level-text">
Level:
</span>
<input name="attr_character_level" style="text-align: end;" type="number" value="1"/>
<span>
(
</span>
<input name="attr_character_xp" type="number"/>
<span data-i18n="exp-text">
) exp
</span>
</div>
</div>
<div>
<div style="display: flex; flex: 1 0 auto;">
<span data-i18n="lifeform-text">
Lifeform:
</span>
<input name="attr_character_lifeform" type="text"/>
</div>
<div style="flex-shrink: 0; width: 183px; display: flex;">
<span data-i18n="grade-text" style="flex-shrink: 0;">
Grade:
</span>
<input class="sheet-adventuringRank" name="attr_adventuring_grade" type="hidden" value="silver"/>
<span class="sheet-adventuringRank sheet-replicateInput sheet-copperRank" data-i18n="copper-grade-text">
Copper
</span>
<span class="sheet-adventuringRank sheet-replicateInput sheet-silverRank" data-i18n="silver-grade-text">
Silver
</span>
<span class="sheet-adventuringRank sheet-replicateInput sheet-goldRank" data-i18n="gold-grade-text">
Gold
</span>
<span class="sheet-adventuringRank sheet-replicateInput sheet-platinumRank" data-i18n="platinum-grade-text">
Platinum
</span>
</div>
</div>
<div>
<span data-i18n="primary-class-text">
⬖ Primary Class:
</span>
<input name="attr_character_primary_class" type="text"/>
</div>
<div>
<span data-i18n="secondary-class-text">
⬗ Secondary Class:
</span>
<input name="attr_character_secondary_class" type="text"/>
</div>
</div>
<!-- Stat pills -->
<div style="align-items: center; flex-flow: row wrap; justify-content: space-evenly;">
<!-- Fond memories -->
<div class="sheet-statPill">
<div class="sheet-sectionTitle">
<span data-i18n="fond-text">
Fond
</span>
<span data-i18n="memories-text" style="font-size: small;">
Memories
</span>
</div>
<div>
<input name="attr_fond_memories" style="text-align: center;" type="number" value="0"/>
<div style="display: flex;
flex-flow: column;
height: auto;
border: 0;
border-radius: 0;
padding: 0;
margin-right: 2px;">
<span data-i18n="max-text">
Max
</span>
<span style="text-align: center; font-weight: bold;">
50
</span>
</div>
</div>
</div>
<!-- Mastery bonus -->
<div class="sheet-statPill">
<div class="sheet-sectionTitle">
<span data-i18n="mastery-text" style="font-size: small;">
Mastery
</span>
<span data-i18n="bonus-text">
Bonus
</span>
</div>
<div>
<span style="font-size: x-large; font-weight: bold;">
+
</span>
<input name="attr_mastery_bonus" type="hidden" value="2"/>
<span class="sheet-replicateInput" name="attr_mastery_bonus" style="width: 3em;">
</span>
</div>
</div>
<!-- Destiny End Points -->
<div class="sheet-statPill">
<div class="sheet-sectionTitle">
<span data-i18n="destiny's-text">
Destiny's
</span>
<span data-i18n="end-points-text" style="font-size: small;">
End Points
</span>
</div>
<div>
<input name="attr_destiny_current" style="text-align: center;" type="number" value="0"/>
<div style="display: flex;
flex-flow: column;
height: auto;
border: 0;
border-radius: 0;
padding: 0;
margin-right: 2px;">
<span data-i18n="max-text">
Max
</span>
<span style="text-align: center; font-weight: bold;">
12
</span>
</div>
</div>
</div>
</div>
<!-- Combat stats -->
<div class="sheet-botSpace" style="display: flex; flex-flow: column; gap: 8px;">
<!-- Resolve HP MP -->
<div>
<div style="display: flex; flex-flow: row wrap; gap: 4px; justify-content: space-evenly;">
<div class="sheet-guardPoint">
<div class="sheet-sectionTitle">
<span data-i18n="spirit-text">
Spirit
</span>
<div>
<input name="attr_spirit1" type="checkbox"/>
<input name="attr_spirit2" type="checkbox"/>
<input name="attr_spirit3" type="checkbox"/>
<input name="attr_spirit4" type="checkbox"/>
<input name="attr_spirit5" type="checkbox"/>
</div>
</div>
<div class="sheet-sectionTitle">
<span data-i18n="resolve-points-text">
Resolve Points
</span>
<input class="sheet-folder" name="attr_resolve_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<div class="sheet-extendedCounterPoint">
<input class="sheet-folder" name="attr_resolve_fold" type="hidden"/>
<div class="sheet-counterPoint">
<div class="sheet-inputPoint">
<input name="attr_resolve_current" type="number" value="30"/>
</div>
<div>
<span data-i18n="max-resolve-text">
Max Resolve
</span>
<input name="attr_resolve_max" type="hidden" value="30"/>
<span class="sheet-replicateInput" name="attr_resolve_max">
</span>
</div>
</div>
<div class="sheet-foldable">
<div>
<span data-i18n="max-resolve-bonus-text">
Max Resolve Bonus
</span>
<input name="attr_added_resolve" type="number" value="0"/>
</div>
</div>
</div>
</div>
<div class="sheet-guardPoint">
<div class="sheet-sectionTitle">
<span data-i18n="barrier-text">
Barrier
</span>
<div>
<input name="attr_barrier1" type="checkbox"/>
<input name="attr_barrier2" type="checkbox"/>
<input name="attr_barrier3" type="checkbox"/>
</div>
</div>
<div class="sheet-sectionTitle">
<span data-i18n="hit-points-text">
Hit Points
</span>
<input class="sheet-folder" name="attr_hp_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<div class="sheet-extendedCounterPoint">
<input class="sheet-folder" name="attr_hp_fold" type="hidden"/>
<div class="sheet-counterPoint">
<div class="sheet-inputPoint">
<input name="attr_hp_current" type="number" value="15"/>
</div>
<div>
<span data-i18n="max-hp-text">
Max HP
</span>
<input name="attr_hp_max" type="hidden" value="15"/>
<span class="sheet-replicateInput" name="attr_hp_max">
</span>
</div>
</div>
<div class="sheet-foldable">
<div>
<span data-i18n="unarmored-toughness-text">
Unarmored Toughness
</span>
<input name="attr_unarmored_toughness" type="checkbox"/>
</div>
<div>
<span data-i18n="armor-hp-text">
Armor HP
</span>
<input name="attr_armor_hp" type="number" value="0"/>
</div>
<div>
<span data-i18n="max-hp-bonus-text">
Max HP Bonus
</span>
<input name="attr_added_hp" type="number" value="0"/>
</div>
</div>
</div>
</div>
<div class="sheet-guardPoint">
<div class="sheet-sectionTitle">
<span data-i18n="spellglyphs-text">
Spellglyphs
</span>
<div>
<input name="attr_glyph1" type="checkbox"/>
<input name="attr_glyph2" type="checkbox"/>
<input name="attr_glyph3" type="checkbox"/>
</div>
</div>
<div class="sheet-sectionTitle">
<span data-i18n="mind-points-text">
Mind Points
</span>
<input class="sheet-folder" name="attr_mp_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<div class="sheet-extendedCounterPoint">
<input class="sheet-folder" name="attr_mp_fold" type="hidden"/>
<div class="sheet-counterPoint">
<div class="sheet-inputPoint">
<input name="attr_mp_current" type="number" value="15"/>
</div>
<div>
<span data-i18n="max-mp-text">
Max MP
</span>
<input name="attr_mp_max" type="hidden" value="15"/>
<span class="sheet-replicateInput" name="attr_mp_max">
</span>
</div>
</div>
<div class="sheet-foldable">
<div>
<span data-i18n="max-mp-bonus-text">
Max MP Bonus
</span>
<input name="attr_added_mp" type="number" value="0"/>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sheet-defenses">
<!-- Defense -->
<div>
<div class="sheet-sectionTitle" style="flex: 1 1 auto;">
<span class="sheet-sectionTitle" data-i18n="defense-text">
Defense
</span>
<input checked="" class="sheet-folder" name="attr_defense_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<div class="sheet-sectionContainer">
<input class="sheet-folder" name="attr_defense_fold" type="hidden" value="on"/>
<div class="sheet-foldable">
<div>
<span data-i18n="base-defense-text">
Base defense
</span>
<input name="attr_base_defense" type="number" value="6"/>
</div>
<div>
<span data-i18n="bonus-defense-text">
Bonus defense
</span>
<input name="attr_bonus_defense" type="number" value="0"/>
</div>
</div>
<input name="attr_total_defense" type="hidden" value="8"/>
<span class="sheet-replicateInput" name="attr_total_defense">
</span>
</div>
</div>
<div style="display: flex; flex-flow: row; gap: 4px;">
<!-- Fortitude -->
<div>
<div class="sheet-sectionTitle" style="border-top-right-radius: 0;">
<div>
<span class="sheet-sectionTitle" data-i18n="physical-text">
Physical
</span>
<span class="sheet-sectionTitle" data-i18n="physical-fortitude-text">
Fortitude
</span>
</div>
<input checked="" class="sheet-folder" name="attr_fortitude_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<div class="sheet-sectionContainer" style="border-bottom-right-radius: 0;">
<input class="sheet-folder" name="attr_fortitude_fold" type="hidden" value="on"/>
<div class="sheet-foldable">
<div>
<span data-i18n="base-fortitude-text">
Base fortitude
</span>
<input name="attr_base_fortitude" type="number" value="6"/>
</div>
<div>
<span data-i18n="bonus-fortitude-text">
Bonus fortitude
</span>
<input name="attr_bonus_fortitude" type="number" value="0"/>
</div>
</div>
<input name="attr_total_fortitude" type="hidden" value="8"/>
<span class="sheet-replicateInput" name="attr_total_fortitude">
</span>
</div>
</div>
<!-- Willpower -->
<div>
<div class="sheet-sectionTitle" style="border-top-left-radius: 0;">
<div>
<span class="sheet-sectionTitle" data-i18n="mental-text">
Mental
</span>
<span class="sheet-sectionTitle" data-i18n="mental-fortitude-text">
Fortitude
</span>
</div>
<input checked="" class="sheet-folder" name="attr_willpower_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<div class="sheet-sectionContainer" style="border-bottom-left-radius: 0;">
<input class="sheet-folder" name="attr_willpower_fold" type="hidden" value="on"/>
<div class="sheet-foldable">
<div>
<span data-i18n="base-willpower-text">
Base willpower
</span>
<input name="attr_base_willpower" type="number" value="6"/>
</div>
<div>
<span data-i18n="bonus-willpower-text">
Bonus willpower
</span>
<input name="attr_bonus_willpower" type="number" value="0"/>
</div>
</div>
<input name="attr_total_willpower" type="hidden" value="8"/>
<span class="sheet-replicateInput" name="attr_total_willpower">
</span>
</div>
</div>
</div>
</div>
<div style="display: flex; flex-flow: row wrap; gap: 8px; align-items: stretch; justify-content: space-evenly;">
<div class="sheet-movements">
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="turn-speed-text">
Turn Speed
</span>
<span class="sheet-sectionTitle" data-i18n="movement-text">
Movement
</span>
</div>
<div class="sheet-sectionContainer">
<!-- Turn speed -->
<div>
<button class="sheet-invisible-button" name="act_rollTurnSpeed" type="roll" value="&{template:basic} {{charName=@{character_name}}} {{rollName=Turn speed}} {{rollValues=[[@{turn_speed} &{tracker}]]}}"></button>
<input name="attr_turn_speed" type="number" value="4"/>
</div>
<!-- Movement -->
<div>
<div>
<span data-i18n="distance-text" style="flex: 1 1 auto;">
Distance
</span>
<div>
<input name="attr_movement_distance" type="number" value="10"/>
<span data-i18n="m-text">
m
</span>
</div>
<div>
<input name="attr_movement_zone" type="number" value="1"/>
<span data-i18n="zone-text">
zone
</span>
</div>
</div>
<div>
<span data-i18n="max-distance-text" style="flex: 1 1 auto;">
Max Distance
</span>
<div>
<input name="attr_max_movement_distance" type="number" value="20"/>
<span data-i18n="m-text">
m
</span>
</div>
<div>
<input name="attr_max_movement_zone" type="number" value="2"/>
<span data-i18n="zone-text">
zone
</span>
</div>
</div>
</div>
</div>
</div>
<!-- Combat Actions -->
<div style="display: flex; flex-flow: row;">
<!-- Major Action is flex 1 height wise -->
<div style="display: flex;
flex-flow: column;">
<div class="sheet-sectionTitle" style="border-radius: 0; flex: 1 1 auto; align-items: center;">
<span class="sheet-sectionTitle" data-i18n="major-action-text">
Major Action
</span>
</div>
<div class="sheet-sectionContainer" style="border-radius: 0;
flex: 1 1 auto;
padding: 0;
display: flex;
flex-flow: row;">
<input name="attr_major_action" style="flex: 1 1 auto;
text-align: center;
font-size: x-large;
font-weight: bold;" type="number" value="1"/>
</div>
</div>
<!-- Minor Action is flex 0 height wise -->
<div style="display: flex;
flex-flow: column; align-self: flex-end;">
<div class="sheet-sectionTitle" style="border-radius: 0; align-items: center;">
<span class="sheet-sectionTitle" data-i18n="minor-action-text">
Minor Action
</span>
</div>
<div class="sheet-sectionContainer" style="border-radius: 0;
padding: 0;
display: flex;
flex-flow: row">
<input name="attr_minor_action" style="flex: 1 1 auto;
text-align: center;
font-size: x-large;
font-weight: bold;" type="number" value="1"/>
</div>
</div>
</div>
</div>
</div>
<!-- Combat options-->
<div class="sheet-botSpace" style="display: flex; flex-flow: row wrap; gap: 4px;">
<!-- Combat masteries -->
<div>
<div class="sheet-sectionTitle" style="border-top-right-radius: 0;">
<span class="sheet-sectionTitle" data-i18n="combat-masteries-text" style="flex: 1 1 auto;">
Combat Masteries
</span>
</div>
<div class="sheet-sectionContainer sheet-masteries">
<span data-i18n="weapon-text">
Weapon
</span>
<div>
<div>
<input checked="" disabled="" type="checkbox"/>
<span data-i18n="unarmed-combat-text">
Unarmed combat
</span>
</div>
<div>
<input name="attr_spell_catalyst" type="checkbox"/>
<span data-i18n="spell-catalyst-text">
Spell catalyst
</span>
</div>
<div>
<input name="attr_light_weapon" type="checkbox"/>
<span data-i18n="light-weapon-text">
Light weapon
</span>
</div>
<div>
<input name="attr_medium_weapon" type="checkbox"/>
<span data-i18n="medium-weapon-text">
Medium weapon
</span>
</div>
<div>
<input name="attr_heavy_weapon" type="checkbox"/>
<span data-i18n="heavy-weapon-text">
Heavy weapon
</span>
</div>
<div>
<input name="attr_xtra_heavy" type="checkbox"/>
<span data-i18n="xtra-heavy-text">
XTra heavy
</span>
</div>
</div>
<span data-i18n="armor-text">
Armor
</span>
<div>
<div>
<input name="attr_spell_garb" type="checkbox"/>
<span data-i18n="spell-garb-text">
Spell garb
</span>
</div>
<div>
<input name="attr_light_armor" type="checkbox"/>
<span data-i18n="light-armor-text">
Light armor
</span>
</div>
<div>
<input name="attr_medium_armor" type="checkbox"/>
<span data-i18n="medium-armor-text">
Medium armor
</span>
</div>
<div>
<input name="attr_heavy_armor" type="checkbox"/>
<span data-i18n="heavy-armor-text">
Heavy armor
</span>
</div>
</div>
<span data-i18n="maneuver-text">
Maneuver
</span>
<div style="flex-flow: row wrap;">
<div>
<input name="attr_scuffle" type="checkbox"/>
<span data-i18n="scuffle-text">
Scuffle
</span>
</div>
<div>
<input name="attr_cheapshot" type="checkbox"/>
<span data-i18n="cheap-shot-text">
Cheap shot
</span>
</div>
</div>
</div>
</div>
<!-- Attacks & Effects -->
<div style="flex: 1 0 auto;">
<div class="sheet-sectionTitle" style="border-top-left-radius: 0;">
<span class="sheet-sectionTitle" data-i18n="attack-effects-text" style="flex: 1 1 auto;">
Attack/Effects
</span>
<!-- <span class="sheet-sectionTitle">Rng</span>
<span class="sheet-sectionTitle">Bns</span>
<span class="sheet-sectionTitle">Damage</span> -->
</div>
<div class="sheet-sectionContainer">
<fieldset class="repeating_attacks">
<div class="sheet-repeatingAttack">
<div style="gap: 4px;">
<div>
<input name="attr_attack_roll" type="hidden" value="+0"/>
<button name="act_rollAttack" type="roll" value="@{roll_whisper_type} &amp;{template:attack} {{charName=@{character_name}}} {{rollName=@{attack_name}}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{attack_mastery_value} +@{attack_bonus} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{attack_mastery_value} +@{attack_bonus} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{attack_mastery_value} +@{attack_bonus} @{ask_modifier}]]}} {{damage=@{attack_damage}}}">
<span name="attr_attack_roll">
</span>
</button>
<input checked="" data-i18n-title="attack-mastery-input-title" name="attr_attack_mastery" title="Attack mastery" type="checkbox" value="on"/>
<input name="attr_attack_mastery_value" type="hidden"/>
<input data-i18n-placeholder="attack-name-input-placeholder" data-i18n-title="attack-name-input-title" name="attr_attack_name" placeholder="Attack name" title="Attack name" type="text"/>
</div>
<div style="flex: 0 0 auto;">
<span data-i18n="range-text" style="align-self: center;">
Range:
</span>
<input data-i18n-title="attack-range-input-title" name="attr_attack_range" title="Attack range" type="number" value="0"/>
<span data-i18n="attacks-bns-text" style="align-self: center;">
BNS:
</span>
<input data-i18n-title="attack-bonus-input-title" name="attr_attack_bonus" title="Attack bonus" type="number" value="0"/>
</div>
<div>
<input data-i18n-title="attack-damage-input-title" name="attr_attack_damage" title="Attack damage" type="text" value=" 1 HP Blunt Unarmed Combat"/>
<input checked="" class="sheet-folder" name="attr_attack_fold" type="checkbox" value="on"/>
<span class="sheet-folder">
</span>
</div>
</div>
<input class="sheet-folder" name="attr_attack_fold" type="hidden" value="on"/>
<div class="sheet-foldable">
<textarea data-i18n-placeholder="attack-description-textarea-placeholder" data-i18n-title="attack-description-textarea-title" name="attr_attack_description" placeholder="Attack description" title="Attack description"></textarea>
</div>
</div>
</fieldset>
</div>
</div>
</div>
<!-- Quirks, Traits, Features -->
<div style="flex-flow: column;">
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="traits-&amp;-features-text" style="flex: 1 1 auto;">
Traits &amp; Features
</span>
<input class="sheet-folder" name="attr_trait_summary_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_trait_summary_fold" type="hidden"/>
<div class="sheet-sectionContainer sheet-foldable" style="gap: 4px;">
<div>
<!-- Quirks -->
<!-- as a repeating section -->
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="quirks-text">
Quirks
</span>
<input class="sheet-folder" name="attr_quirk_trait_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_quirk_trait_fold" type="hidden"/>
<div class="sheet-foldable sheet-sectionContainer">
<fieldset class="repeating_quirks">
<div>
<div>
<input data-i18n-placeholder="quirk-name-input-placeholder" data-i18n-title="quirk-name-input-title" name="attr_quirk_name" placeholder="Quirk name" title="Quirk name" type="text"/>
<input data-i18n-title="quirk-level-input-title" name="attr_quirk_level" title="Quirk level" type="number" value="1"/>
<input class="sheet-folder" name="attr_quirk_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<!-- Text area for quirk description -->
<input class="sheet-folder" name="attr_quirk_fold" type="hidden"/>
<div class="sheet-foldable">
<textarea name="attr_quirk_description" style="width: 100%;"></textarea>
</div>
</div>
</fieldset>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<input name="attr_quirk_summary" type="hidden"/>
<span class="sheet-replicateInput sheet-contentSummary" name="attr_quirk_summary">
</span>
</div>
</div>
<div>
<!-- Traits -->
<!-- as a repeating section -->
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="lifeform-traits-text">
Lifeform traits
</span>
<input class="sheet-folder" name="attr_trait_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_trait_fold" type="hidden"/>
<div class="sheet-foldable sheet-sectionContainer">
<fieldset class="repeating_traits">
<div>
<div class="sheet-repeatingTrait">
<div>
<input data-i18n-placeholder="trait-name-input-placeholder" data-i18n-title="trait-name-input-title" name="attr_trait_name" placeholder="Trait name" title="Trait name" type="text"/>
<input data-i18n-placeholder="trait-lifeform-input-placeholder" data-i18n-title="trait-lifeform-input-title" name="attr_trait_lifeform" placeholder="Lifeform" title="Lifeform" type="text"/>
<input class="sheet-folder" name="attr_trait_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<!-- Text area for trait description -->
<input class="sheet-folder" name="attr_trait_fold" type="hidden"/>
<div class="sheet-foldable">
<select data-i18n-title="trait-type-select-title" name="attr_trait_type" title="Trait type">
<option data-i18n="major-option" value="major">
Major
</option>
<option data-i18n="minor-option" value="minor">
minor
</option>
<option data-i18n="xtra-option" value="xtra">
Xtra
</option>
</select>
<textarea data-i18n-placeholder="trait-description-textarea-placeholder" name="attr_trait_description" placeholder="Trait description" style="width: 100%;"></textarea>
</div>
</div>
</div>
</fieldset>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<input name="attr_trait_summary" type="hidden"/>
<span class="sheet-replicateInput sheet-contentSummary" name="attr_trait_summary">
</span>
</div>
</div>
<!-- Features -->
<!-- as a repeating section -->
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="discipline-&amp;-class-features-text">
Discipline &amp; Class features
</span>
<input class="sheet-folder" name="attr_feature_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_feature_fold" type="hidden"/>
<div class="sheet-foldable sheet-sectionContainer">
<fieldset class="repeating_features">
<div>
<div class="sheet-repeatingFeature">
<div>
<input data-i18n-placeholder="feature-name-input-placeholder" data-i18n-title="feature-name-input-title" name="attr_feature_name" placeholder="Feature name" title="Feature name" type="text"/>
<input list="discipline_list" data-i18n-placeholder="feature-discipline-input-placeholder" data-i18n-title="feature-discipline-input-title" name="attr_feature_discipline" placeholder="Discipline" title="Feature discipline" type="text" />
<input class="sheet-folder" name="attr_feature_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<!-- Text area for feature description -->
<input class="sheet-folder" name="attr_feature_fold" type="hidden"/>
<div class="sheet-foldable">
<div>
<input list="class_list" data-i18n-placeholder="feature-class-input-placeholder" data-i18n-title="feature-class-input-title" name="attr_feature_class" placeholder="Class" title="Class" type="text"/>
<input data-i18n-title="feature-level-input-title" name="attr_feature_level" title="Feature level" type="number" value="1"/>
</div>
<textarea data-i18n-placeholder="feature-description-textarea-placeholder" name="attr_feature_description" placeholder="Feature description" style="width: 100%;"></textarea>
</div>
</div>
</div>
</fieldset>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<input name="attr_feature_summary" type="hidden"/>
<span class="sheet-replicateInput sheet-contentSummary" name="attr_feature_summary">
</span>
</div>
</div>
</div>
<input name="attr_quirk_traits_features_summary" type="hidden"/>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<span class="sheet-replicateInput sheet-contentSummary" name="attr_quirk_traits_features_summary">
</span>
</div>
</div>
</div>
<div class="sheet-magic sheet-tab">
<h1 data-i18n="magic-title">
Magic
</h1>
<div style="display: flex; flex-flow: column; gap: 4px;">
<div style="display: flex; gap: 4px; flex-flow: row wrap;">
<div style="flex: 1 1 auto; min-width: 368px;">
<div class="sheet-sectionTitle">
<input name="attr_attunements_label" type="hidden" value="0/0"/>
<span class="sheet-sectionTitle" data-i18n="elemental-attunement-text" style="flex: 1 1 auto; padding-right: 4px;">
Elemental attunement
</span>
<div>
<span class="sheet-sectionTitle" data-i18n="slots-text">
Slots:
</span>
<span class="sheet-sectionTitle" name="attr_attunements_label">
</span>
</div>
<input checked="" class="sheet-folder" name="attr_attunements_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<div class="sheet-sectionContainer">
<input name="attr_attunements_total" type="hidden" value="0"/>
<input class="sheet-folder" name="attr_attunements_fold" type="hidden" value="on"/>
<div class="sheet-foldable" style="gap: 4px;">
<span data-i18n="max-attunement-slots-text">
Max attunement slots:
</span>
<input name="attr_attunements_max" type="number" value="0"/>
</div>
<div>
<div>
<div class="sheet-arcaneTitle">
<div>
</div>
<span data-i18n="arcane-magic-text">
Arcane magic
</span>
<div>
</div>
</div>
<div class="sheet-arcaneBackground" style="flex-flow: column;">
<div class="sheet-arcaneBox">
<div class="sheet-arcaneBox">
<div class="sheet-arcaneBackground" style="background-color: var(--spell-sub-background-color);">
<div>
<!-- Fire -->
<div class="sheet-arcaneAttunement">
<img src="https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Cloudbreaker_Alliance/Elements_FIRE.png" style="height: 64px; width: 64px;"/>
<div>
<input name="attr_fire" type="checkbox"/>
<span data-i18n="fire-text">
Fire
</span>
</div>
</div>
<!-- Wood -->
<div class="sheet-arcaneAttunement">
<img src="https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Cloudbreaker_Alliance/Elements_WOOD.png" style="height: 64px; width: 64px;"/>
<div>
<input name="attr_wood" type="checkbox"/>
<span data-i18n="wood-text">
Wood
</span>
</div>
</div>
<!-- Earth -->
<div class="sheet-arcaneAttunement">
<img src="https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Cloudbreaker_Alliance/Elements_EARTH.png" style="height: 64px; width: 64px;"/>
<div>
<input name="attr_earth" type="checkbox"/>
<span data-i18n="earth-text">
Earth
</span>
</div>
</div>
</div>
<div style="justify-content: end;">
<!-- Toxic -->
<div class="sheet-arcaneAttunement">
<img src="https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Cloudbreaker_Alliance/Elements_POISON.png" style="height: 64px; width: 64px;"/>
<span data-i18n="toxic-text">
Toxic
</span>
</div>
</div>
</div>
<div class="sheet-arcaneBackground" style="background-color: var(--spell-sub-background-color);">
<div>
<!-- Water -->
<div class="sheet-arcaneAttunement">
<img src="https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Cloudbreaker_Alliance/Elements_WATER.png" style="height: 64px; width: 64px;"/>
<div>
<input name="attr_water" type="checkbox"/>
<span data-i18n="water-text">
Water
</span>
</div>
</div>
<!-- Wind -->
<div class="sheet-arcaneAttunement">
<img src="https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Cloudbreaker_Alliance/Elements_WIND.png" style="height: 64px; width: 64px;"/>
<div>
<input name="attr_wind" type="checkbox"/>
<span data-i18n="wind-text">
Wind
</span>
</div>
</div>
<!-- Metal -->
<div class="sheet-arcaneAttunement">
<img src="https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Cloudbreaker_Alliance/Elements_METAL.png" style="height: 64px; width: 64px;"/>
<div>
<input name="attr_metal" type="checkbox"/>
<span data-i18n="metal-text">
Metal
</span>
</div>
</div>
</div>
<div style="justify-content: end;">
<!-- Lightning -->
<div class="sheet-arcaneAttunement">
<img src="https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Cloudbreaker_Alliance/Elements_LIGHTNING.png" style="height: 64px; width: 64px;"/>
<span data-i18n="lightning-text">
Lightning
</span>
</div>
</div>
</div>
</div>
</div>
<!-- Ice -->
<div class="sheet-arcaneAttunement" style="justify-content: center; align-items: center;">
<!--
<img src="https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Cloudbreaker_Alliance/Elements_ICE.png" style="height: 64px; width: 64px;"/>
-->
<img src="https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Cloudbreaker_Alliance/Elements_ICE.png" style="height: 64px; width: 64px;"/>
<span data-i18n="ice-text" style="
font-size: x-large;
color: white;
text-shadow: -1px -1px 0 black, 1px 1px 0 black, 1px -1px 0 black, -1px 1px 0 black;">
Ice
</span>
</div>
</div>
</div>
<div>
<div class="sheet-arcaneTitle">
<div>
</div>
<span data-i18n="cosmic-magic-text">
Cosmic magic
</span>
<div>
</div>
</div>
<div class="sheet-cosmicBackground">
<!-- Order -->
<div>
<img src="https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Cloudbreaker_Alliance/Elements_ORDER.png" style="height: 64px; width: 64px;"/>
<div>
<input name="attr_order" type="checkbox"/>
<input name="attr_order" type="checkbox"/>
<span data-i18n="order-text">
Order
</span>
</div>
</div>
<!-- Chaos -->
<div>
<img src="https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Cloudbreaker_Alliance/Elements_CHAOS.png" style="height: 64px; width: 64px;"/>
<div>
<input name="attr_chaos" type="checkbox"/>
<input name="attr_chaos" type="checkbox"/>
<span data-i18n="chaos-text">
Chaos
</span>
</div>
</div>
<!-- Astral -->
<div>
<img src="https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Cloudbreaker_Alliance/Elements_ASTRAL.png" style="height: 64px; width: 64px;"/>
<div>
<input name="attr_astral" type="checkbox"/>
<input name="attr_astral" type="checkbox"/>
<span data-i18n="astral-text">
Astral
</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div style="flex: 1 1 auto; display: flex; flex-flow: column; gap: 4px; min-width: 306px;">
<div class="sheet-guardPoint">
<div class="sheet-sectionTitle">
<span data-i18n="spellglyphs-text">
Spellglyphs
</span>
<div>
<input name="attr_glyph1" type="checkbox"/>
<input name="attr_glyph2" type="checkbox"/>
<input name="attr_glyph3" type="checkbox"/>
</div>
</div>
<div class="sheet-sectionTitle">
<span data-i18n="mind-points-text">
Mind Points
</span>
<input class="sheet-folder" name="attr_mp_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<div class="sheet-extendedCounterPoint">
<input class="sheet-folder" name="attr_mp_fold" type="hidden"/>
<div class="sheet-counterPoint">
<div class="sheet-inputPoint">
<input name="attr_mp_current" type="number" value="15"/>
</div>
<div>
<span data-i18n="max-mp-text">
Max MP
</span>
<input name="attr_mp_max" type="hidden" value="15"/>
<span class="sheet-replicateInput" name="attr_mp_max">
</span>
</div>
</div>
<div class="sheet-foldable">
<div>
<span data-i18n="max-mp-bonus-text">
Max MP Bonus
</span>
<input name="attr_added_mp" type="number" value="0"/>
</div>
</div>
</div>
</div>
<div>
<input class="sheet-folder" name="attr_attacks_fold" type="hidden"/>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="attack-effects-text" style="flex: 1 1 auto;">
Attack/Effects
</span>
<!-- <span class="sheet-sectionTitle">Rng</span>
<span class="sheet-sectionTitle">Bns</span>
<span class="sheet-sectionTitle">Damage</span> -->
<input class="sheet-folder" name="attr_attacks_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<div class="sheet-sectionContainer sheet-foldable">
<fieldset class="repeating_attacks">
<div class="sheet-repeatingAttack">
<div>
<div>
<input name="attr_attack_roll" type="hidden" value="+0"/>
<button name="act_rollAttack" type="roll" value="@{roll_whisper_type} &amp;{template:attack} {{charName=@{character_name}}} {{rollName=@{attack_name}}} {{RollType=[[@{ask_advantage}]]}} {{totalN=[[2d6 +@{attack_mastery_value} +@{attack_bonus} @{ask_modifier}]]}} {{totalE=[[{2d6,2d6}kh1 +@{attack_mastery_value} +@{attack_bonus} @{ask_modifier}]]}} {{totalSB=[[{2d6,2d6}kl1 +@{attack_mastery_value} +@{attack_bonus} @{ask_modifier}]]}} {{damage=@{attack_damage}}}">
<span name="attr_attack_roll">
</span>
</button>
<input checked="" data-i18n-title="attack-mastery-input-title" name="attr_attack_mastery" title="Attack mastery" type="checkbox" value="on"/>
<input name="attr_attack_mastery_value" type="hidden"/>
<input data-i18n-placeholder="attack-name-input-placeholder" data-i18n-title="attack-name-input-title" name="attr_attack_name" placeholder="Attack name" title="Attack name" type="text"/>
</div>
<div style="flex: 0 0 auto;">
<input data-i18n-title="attack-range-input-title" name="attr_attack_range" title="Attack range" type="number" value="0"/>
<input data-i18n-title="attack-bonus-input-title" name="attr_attack_bonus" title="Attack bonus" type="number" value="0"/>
</div>
<div>
<input data-i18n-title="attack-damage-input-title" name="attr_attack_damage" title="Attack damage" type="text" value="1 HP Blunt Unarmed Combat"/>
<input checked="" class="sheet-folder" name="attr_attack_fold" type="checkbox" value="on"/>
<span class="sheet-folder">
</span>
</div>
</div>
<input class="sheet-folder" name="attr_attack_fold" type="hidden" value="on"/>
<div class="sheet-foldable">
<select name="attr_attack_rank" value="none">
<option data-i18n="none-option" selected="" value="none">
None
</option>
<option data-i18n="rank-1-option" value="copper">
Rank 1
</option>
<option data-i18n="rank-2-option" value="silver">
Rank 2
</option>
<option data-i18n="rank-3-option" value="gold">
Rank 3
</option>
</select>
<textarea data-i18n-placeholder="attack-description-textarea-placeholder" data-i18n-title="attack-description-textarea-title" name="attr_attack_description" placeholder="Attack description" title="Attack description"></textarea>
</div>
</div>
</fieldset>
</div>
<div class="sheet-sectionContainer sheet-reverseFoldable">
</div>
</div>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="castable-spells-text">
Castable spells
</span>
<input checked="" class="sheet-folder" name="attr_spellcasting_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_spellcasting_fold" type="hidden" value="on"/>
<div class="sheet-sectionContainer sheet-foldable" style="gap: 4px;">
<!-- Arcane Spells -->
<div>
<input class="sheet-folder" name="attr_arcane_spells_fold" type="hidden" value="on"/>
<div class="sheet-sectionTitle sheet-spellSectionTitle">
<span class="sheet-sectionTitle" data-i18n="arcane-spells-text">
Arcane Spells
</span>
<input checked="" class="sheet-folder" name="attr_arcane_spells_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<div class="sheet-sectionContainer sheet-foldable" style="gap: 4px;">
<fieldset class="repeating_spellsarcane">
<div class="sheet-repeatingSpell">
<input class="sheet-folder" name="attr_spell_name_fold" type="hidden" value="on"/>
<div class="sheet-spellName">
<input class="sheet-folder" name="attr_spell_name_fold" type="hidden" value="on"/>
<div class="sheet-foldable">
<input data-i18n-placeholder="spell-name-input-placeholder" data-i18n-title="spell-name-input-title" name="attr_spell_name" placeholder="Spell name" title="Spell name" type="text" value="Spell name"/>
</div>
<div class="sheet-reverseFoldable">
<span class="sheet-spellTitle" name="attr_spell_name">
</span>
</div>
<input checked="" class="sheet-folder" name="attr_spell_name_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<div class="sheet-spellContainer sheet-foldable">
<div>
<div>
<span data-i18n="levels-text">
Levels:
</span>
<span>
0
</span>
<input checked="" name="attr_spell_rank_0" type="checkbox" value="on"/>
<span>
1
</span>
<input checked="" name="attr_spell_rank_1" type="checkbox" value="on"/>
<span>
2
</span>
<input checked="" name="attr_spell_rank_2" type="checkbox" value="on"/>
<span>
3
</span>
<input checked="" name="attr_spell_rank_3" type="checkbox" value="on"/>
</div>
<div class="sheet-spellMetadata">
<div>
<span data-i18n="attunements-text">
Attunements:
</span>
<input data-i18n-placeholder="spell-attunement-input-placeholder" data-i18n-title="spell-attunement-input-title" name="attr_spell_attunement" placeholder="Attunement" title="Spell attunement" type="text"/>
</div>
<div>
<span data-i18n="glyph-text">
Glyph:
</span>
<select data-i18n-title="spell-glyph-select-title" name="attr_spell_glyph" title="Glyph">
<option data-i18n="yes-option" value="0">
Yes
</option>
<option data-i18n="no-option" value="1">
No
</option>
</select>
</div>
<div>
<span data-i18n="requirement-text">
Requirement:
</span>
<input data-i18n-placeholder="spell-requirement-input-placeholder" data-i18n-title="spell-requirement-input-title" name="attr_spell_requirement" placeholder="Mov, Verb, M.Wpn" title="Spell requirement" type="text" value="Mov, Verb, M.Wpn"/>
</div>
<div>
<span data-i18n="action-text">
Action:
</span>
<select data-i18n-title="spell-action-select-title" name="attr_spell_action" title="Action">
<option data-i18n="major-option" value="0">
Major
</option>
<option data-i18n="minor-option" value="1">
minor
</option>
<option data-i18n="free-option" value="2">
Free
</option>
<option data-i18n="instant-option" value="3">
Instant
</option>
</select>
</div>
</div>
<div>
<span data-i18n="description-text">
Description:
</span>
<textarea data-i18n-placeholder="spell-effect-textarea-placeholder" name="attr_spell_effect" placeholder="Spell effect"></textarea>
</div>
</div>
<input class="sheet-rank0" name="attr_spell_rank_0" type="hidden" value="on"/>
<div class="sheet-spellRank sheet-rank0">
<div class="sheet-spellTitle">
<input class="sheet-folder" name="attr_spell_zero_fold" type="hidden"/>
<div class="sheet-foldable">
<div>
<span class="sheet-spellTitle" data-i18n="rank-0-text">
Rank 0
</span>
<span class="sheet-spellSubTitle" data-i18n="level-1-text">
(Level 1+)
</span>
</div>
<div>
<span class="sheet-spellTitle" data-i18n="mp-text">
MP:
</span>
<input class="sheet-foldable" data-i18n-title="spell-rank-zero-mp-input-title" name="attr_spell_rank_zero_mp" title="Spell MP" type="number" value="0"/>
</div>
</div>
<div class="sheet-reverseFoldable">
<div>
<span class="sheet-spellTitle" data-i18n="rank-0-text">
Rank 0
</span>
<span class="sheet-spellSubTitle" data-i18n="level-1-text">
(Level 1+)
</span>
</div>
<div>
<span class="sheet-spellTitle" data-i18n="mp-text">
MP:
</span>
<span class="sheet-spellTitle sheet-reverseFoldable" name="attr_spell_rank_zero_mp">
</span>
</div>
</div>
<input class="sheet-folder" name="attr_spell_zero_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_spell_zero_fold" type="hidden"/>
<div class="sheet-foldable sheet-spellRankContent">
<div>
<div>
<span data-i18n="range-text">
Range:
</span>
<input data-i18n-placeholder="spell-rank-zero-range-input-placeholder" data-i18n-title="spell-rank-zero-range-input-title" name="attr_spell_rank_zero_range" placeholder="0-3" title="Spell range" type="text"/>
</div>
<div>
<span data-i18n="radius-text">
Radius:
</span>
<input data-i18n-placeholder="spell-rank-zero-radius-input-placeholder" data-i18n-title="spell-rank-zero-radius-input-title" name="attr_spell_rank_zero_radius" placeholder="0-3" title="Spell radius" type="text"/>
</div>
<div>
<span data-i18n="duration-text">
Duration:
</span>
<input data-i18n-placeholder="spell-rank-zero-duration-input-placeholder" data-i18n-title="spell-rank-zero-duration-input-title" name="attr_spell_rank_zero_duration" placeholder="5 min (Focus)" title="Spell target" type="text"/>
</div>
</div>
<div>
<textarea data-i18n-placeholder="spell-rank-zero-description-textarea-placeholder" name="attr_spell_rank_zero_description" placeholder="Spell description"></textarea>
</div>
</div>
</div>
<input class="sheet-rank1" name="attr_spell_rank_1" type="hidden" value="on"/>
<div class="sheet-spellRank sheet-rank1">
<div class="sheet-spellTitle">
<input class="sheet-folder" name="attr_spell_rank_one_fold" type="hidden"/>
<div class="sheet-foldable">
<div>
<span class="sheet-spellTitle" data-i18n="rank-1-text">
Rank 1
</span>
<span class="sheet-spellSubTitle" data-i18n="level-1-text">
(Level 1+)
</span>
</div>
<div>
<span class="sheet-spellTitle" data-i18n="mp-text">
MP:
</span>
<input class="sheet-foldable" data-i18n-title="spell-rank-one-mp-input-title" name="attr_spell_rank_one_mp" title="Spell MP" type="number" value="5"/>
</div>
</div>
<div class="sheet-reverseFoldable">
<div>
<span class="sheet-spellTitle" data-i18n="rank-1-text">
Rank 1
</span>
<span class="sheet-spellSubTitle" data-i18n="level-1-text">
(Level 1+)
</span>
</div>
<div>
<span class="sheet-spellTitle" data-i18n="mp-text">
MP:
</span>
<span class="sheet-spellTitle sheet-reverseFoldable" name="attr_spell_rank_one_mp">
</span>
</div>
</div>
<input class="sheet-folder" name="attr_spell_rank_one_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_spell_rank_one_fold" type="hidden"/>
<div class="sheet-foldable sheet-spellRankContent">
<div>
<div>
<span data-i18n="range-text">
Range:
</span>
<input data-i18n-placeholder="spell-rank-one-range-input-placeholder" data-i18n-title="spell-rank-one-range-input-title" name="attr_spell_rank_one_range" placeholder="0-3" title="Spell range" type="text"/>
</div>
<div>
<span data-i18n="radius-text">
Radius:
</span>
<input data-i18n-placeholder="spell-rank-one-radius-input-placeholder" data-i18n-title="spell-rank-one-radius-input-title" name="attr_spell_rank_one_radius" placeholder="0-3" title="Spell radius" type="text"/>
</div>
<div>
<span data-i18n="duration-text">
Duration:
</span>
<input data-i18n-placeholder="spell-rank-one-duration-input-placeholder" data-i18n-title="spell-rank-one-duration-input-title" name="attr_spell_rank_one_duration" placeholder="5 min (Focus)" title="Spell target" type="text"/>
</div>
</div>
<div>
<textarea data-i18n-placeholder="spell-rank-one-description-textarea-placeholder" name="attr_spell_rank_one_description" placeholder="Spell description"></textarea>
</div>
</div>
</div>
<input class="sheet-rank2" name="attr_spell_rank_2" type="hidden" value="on"/>
<div class="sheet-spellRank sheet-rank2">
<div class="sheet-spellTitle">
<input class="sheet-folder" name="attr_spell_rank_two_fold" type="hidden"/>
<div class="sheet-foldable">
<div>
<span class="sheet-spellTitle" data-i18n="rank-2-text">
Rank 2
</span>
<span class="sheet-spellSubTitle" data-i18n="level-5-text">
(Level 5+)
</span>
</div>
<div>
<span class="sheet-spellTitle" data-i18n="mp-text">
MP:
</span>
<input class="sheet-foldable" data-i18n-title="spell-rank-two-mp-input-title" name="attr_spell_rank_two_mp" title="Spell MP" type="number" value="10"/>
</div>
</div>
<div class="sheet-reverseFoldable">
<div>
<span class="sheet-spellTitle" data-i18n="rank-2-text">
Rank 2
</span>
<span class="sheet-spellSubTitle" data-i18n="level-5-text">
(Level 5+)
</span>
</div>
<div>
<span class="sheet-spellTitle" data-i18n="mp-text">
MP:
</span>
<span class="sheet-spellTitle sheet-reverseFoldable" name="attr_spell_rank_two_mp">
</span>
</div>
</div>
<input class="sheet-folder" name="attr_spell_rank_two_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_spell_rank_two_fold" type="hidden"/>
<div class="sheet-foldable sheet-spellRankContent">
<div>
<div>
<span data-i18n="range-text">
Range:
</span>
<input data-i18n-placeholder="spell-rank-two-range-input-placeholder" data-i18n-title="spell-rank-two-range-input-title" name="attr_spell_rank_two_range" placeholder="0-3" title="Spell range" type="text"/>
</div>
<div>
<span data-i18n="radius-text">
Radius:
</span>
<input data-i18n-placeholder="spell-rank-two-radius-input-placeholder" data-i18n-title="spell-rank-two-radius-input-title" name="attr_spell_rank_two_radius" placeholder="0-3" title="Spell radius" type="text"/>
</div>
<div>
<span data-i18n="duration-text">
Duration:
</span>
<input data-i18n-placeholder="spell-rank-two-duration-input-placeholder" data-i18n-title="spell-rank-two-duration-input-title" name="attr_spell_rank_two_duration" placeholder="5 min (Focus)" title="Spell target" type="text"/>
</div>
</div>
<div>
<textarea data-i18n-placeholder="spell-rank-two-description-textarea-placeholder" name="attr_spell_rank_two_description" placeholder="Spell description"></textarea>
</div>
</div>
</div>
<input class="sheet-rank3" name="attr_spell_rank_3" type="hidden" value="on"/>
<div class="sheet-spellRank sheet-rank3">
<div class="sheet-spellTitle">
<input class="sheet-folder" name="attr_spell_rank_three_fold" type="hidden"/>
<div class="sheet-foldable">
<div>
<span class="sheet-spellTitle" data-i18n="rank-3-text">
Rank 3
</span>
<span class="sheet-spellSubTitle" data-i18n="level-9-text">
(Level 9+)
</span>
</div>
<div>
<span class="sheet-spellTitle" data-i18n="mp-text">
MP:
</span>
<input class="sheet-foldable" data-i18n-title="spell-rank-three-mp-input-title" name="attr_spell_rank_three_mp" title="Spell MP" type="number" value="15"/>
</div>
</div>
<div class="sheet-reverseFoldable">
<div>
<span class="sheet-spellTitle" data-i18n="rank-3-text">
Rank 3
</span>
<span class="sheet-spellSubTitle" data-i18n="level-9-text">
(Level 9+)
</span>
</div>
<div>
<span class="sheet-spellTitle" data-i18n="mp-text">
MP:
</span>
<span class="sheet-spellTitle sheet-reverseFoldable" name="attr_spell_rank_three_mp">
</span>
</div>
</div>
<input class="sheet-folder" name="attr_spell_rank_three_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_spell_rank_three_fold" type="hidden"/>
<div class="sheet-foldable sheet-spellRankContent">
<div>
<div>
<span data-i18n="range-text">
Range:
</span>
<input data-i18n-placeholder="spell-rank-three-range-input-placeholder" data-i18n-title="spell-rank-three-range-input-title" name="attr_spell_rank_three_range" placeholder="0-3" title="Spell range" type="text"/>
</div>
<div>
<span data-i18n="radius-text">
Radius:
</span>
<input data-i18n-placeholder="spell-rank-three-radius-input-placeholder" data-i18n-title="spell-rank-three-radius-input-title" name="attr_spell_rank_three_radius" placeholder="0-3" title="Spell radius" type="text"/>
</div>
<div>
<span data-i18n="duration-text">
Duration:
</span>
<input data-i18n-placeholder="spell-rank-three-duration-input-placeholder" data-i18n-title="spell-rank-three-duration-input-title" name="attr_spell_rank_three_duration" placeholder="5 min (Focus)" title="Spell target" type="text"/>
</div>
</div>
<div>
<textarea data-i18n-placeholder="spell-rank-three-description-textarea-placeholder" name="attr_spell_rank_three_description" placeholder="Spell description"></textarea>
</div>
</div>
</div>
</div>
</div>
</fieldset>
</div>
</div>
<!-- Cosmic Spells -->
<div>
<input class="sheet-folder" name="attr_cosmic_spells_fold" type="hidden" value="on"/>
<div class="sheet-sectionTitle sheet-spellSectionTitle">
<span class="sheet-sectionTitle" data-i18n="cosmic-spells-text">
Cosmic Spells
</span>
<input checked="" class="sheet-folder" name="attr_cosmic_spells_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<div class="sheet-sectionContainer sheet-foldable" style="gap: 4px;">
<fieldset class="repeating_spellscosmic">
<div class="sheet-repeatingSpell">
<input class="sheet-folder" name="attr_spell_name_fold" type="hidden" value="on"/>
<div class="sheet-spellName">
<input class="sheet-folder" name="attr_spell_name_fold" type="hidden" value="on"/>
<div class="sheet-foldable">
<input data-i18n-placeholder="spell-name-input-placeholder" data-i18n-title="spell-name-input-title" name="attr_spell_name" placeholder="Spell name" title="Spell name" type="text" value="Spell name"/>
</div>
<div class="sheet-reverseFoldable">
<span class="sheet-spellTitle" name="attr_spell_name">
</span>
</div>
<input checked="" class="sheet-folder" name="attr_spell_name_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<div class="sheet-spellContainer sheet-foldable">
<div>
<div>
<span data-i18n="levels-text">
Levels:
</span>
<span>
0
</span>
<input checked="" name="attr_spell_rank_0" type="checkbox" value="on"/>
<span>
1
</span>
<input checked="" name="attr_spell_rank_1" type="checkbox" value="on"/>
<span>
2
</span>
<input checked="" name="attr_spell_rank_2" type="checkbox" value="on"/>
<span>
3
</span>
<input checked="" name="attr_spell_rank_3" type="checkbox" value="on"/>
</div>
<div class="sheet-spellMetadata">
<div>
<span data-i18n="attunements-text">
Attunements:
</span>
<input data-i18n-placeholder="spell-attunement-input-placeholder" data-i18n-title="spell-attunement-input-title" name="attr_spell_attunement" placeholder="Attunement" title="Spell attunement" type="text"/>
</div>
<div>
<span data-i18n="glyph-text">
Glyph:
</span>
<select data-i18n-title="spell-glyph-select-title" name="attr_spell_glyph" title="Glyph">
<option data-i18n="yes-option" value="0">
Yes
</option>
<option data-i18n="no-option" value="1">
No
</option>
</select>
</div>
<div>
<span data-i18n="requirement-text">
Requirement:
</span>
<input data-i18n-placeholder="spell-requirement-input-placeholder" data-i18n-title="spell-requirement-input-title" name="attr_spell_requirement" placeholder="Mov, Verb, M.Wpn" title="Spell requirement" type="text" value="Mov, Verb, M.Wpn"/>
</div>
<div>
<span data-i18n="action-text">
Action:
</span>
<select data-i18n-title="spell-action-select-title" name="attr_spell_action" title="Action">
<option data-i18n="major-option" value="0">
Major
</option>
<option data-i18n="minor-option" value="1">
minor
</option>
<option data-i18n="free-option" value="2">
Free
</option>
<option data-i18n="instant-option" value="3">
Instant
</option>
</select>
</div>
</div>
<div>
<span data-i18n="description-text">
Description:
</span>
<textarea data-i18n-placeholder="spell-effect-textarea-placeholder" name="attr_spell_effect" placeholder="Spell effect"></textarea>
</div>
</div>
<input class="sheet-rank0" name="attr_spell_rank_0" type="hidden" value="on"/>
<div class="sheet-spellRank sheet-rank0">
<div class="sheet-spellTitle">
<input class="sheet-folder" name="attr_spell_zero_fold" type="hidden"/>
<div class="sheet-foldable">
<div>
<span class="sheet-spellTitle" data-i18n="rank-0-text">
Rank 0
</span>
<span class="sheet-spellSubTitle" data-i18n="level-1-text">
(Level 1+)
</span>
</div>
<div>
<span class="sheet-spellTitle" data-i18n="mp-text">
MP:
</span>
<input class="sheet-foldable" data-i18n-title="spell-rank-zero-mp-input-title" name="attr_spell_rank_zero_mp" title="Spell MP" type="number" value="0"/>
</div>
</div>
<div class="sheet-reverseFoldable">
<div>
<span class="sheet-spellTitle" data-i18n="rank-0-text">
Rank 0
</span>
<span class="sheet-spellSubTitle" data-i18n="level-1-text">
(Level 1+)
</span>
</div>
<div>
<span class="sheet-spellTitle" data-i18n="mp-text">
MP:
</span>
<span class="sheet-spellTitle sheet-reverseFoldable" name="attr_spell_rank_zero_mp">
</span>
</div>
</div>
<input class="sheet-folder" name="attr_spell_zero_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_spell_zero_fold" type="hidden"/>
<div class="sheet-foldable sheet-spellRankContent">
<div>
<div>
<span data-i18n="range-text">
Range:
</span>
<input data-i18n-placeholder="spell-rank-zero-range-input-placeholder" data-i18n-title="spell-rank-zero-range-input-title" name="attr_spell_rank_zero_range" placeholder="0-3" title="Spell range" type="text"/>
</div>
<div>
<span data-i18n="radius-text">
Radius:
</span>
<input data-i18n-placeholder="spell-rank-zero-radius-input-placeholder" data-i18n-title="spell-rank-zero-radius-input-title" name="attr_spell_rank_zero_radius" placeholder="0-3" title="Spell radius" type="text"/>
</div>
<div>
<span data-i18n="duration-text">
Duration:
</span>
<input data-i18n-placeholder="spell-rank-zero-duration-input-placeholder" data-i18n-title="spell-rank-zero-duration-input-title" name="attr_spell_rank_zero_duration" placeholder="5 min (Focus)" title="Spell target" type="text"/>
</div>
</div>
<div>
<textarea data-i18n-placeholder="spell-rank-zero-description-textarea-placeholder" name="attr_spell_rank_zero_description" placeholder="Spell description"></textarea>
</div>
</div>
</div>
<input class="sheet-rank1" name="attr_spell_rank_1" type="hidden" value="on"/>
<div class="sheet-spellRank sheet-rank1">
<div class="sheet-spellTitle">
<input class="sheet-folder" name="attr_spell_rank_one_fold" type="hidden"/>
<div class="sheet-foldable">
<div>
<span class="sheet-spellTitle" data-i18n="rank-1-text">
Rank 1
</span>
<span class="sheet-spellSubTitle" data-i18n="level-1-text">
(Level 1+)
</span>
</div>
<div>
<span class="sheet-spellTitle" data-i18n="mp-text">
MP:
</span>
<input class="sheet-foldable" data-i18n-title="spell-rank-one-mp-input-title" name="attr_spell_rank_one_mp" title="Spell MP" type="number" value="5"/>
</div>
</div>
<div class="sheet-reverseFoldable">
<div>
<span class="sheet-spellTitle" data-i18n="rank-1-text">
Rank 1
</span>
<span class="sheet-spellSubTitle" data-i18n="level-1-text">
(Level 1+)
</span>
</div>
<div>
<span class="sheet-spellTitle" data-i18n="mp-text">
MP:
</span>
<span class="sheet-spellTitle sheet-reverseFoldable" name="attr_spell_rank_one_mp">
</span>
</div>
</div>
<input class="sheet-folder" name="attr_spell_rank_one_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_spell_rank_one_fold" type="hidden"/>
<div class="sheet-foldable sheet-spellRankContent">
<div>
<div>
<span data-i18n="range-text">
Range:
</span>
<input data-i18n-placeholder="spell-rank-one-range-input-placeholder" data-i18n-title="spell-rank-one-range-input-title" name="attr_spell_rank_one_range" placeholder="0-3" title="Spell range" type="text"/>
</div>
<div>
<span data-i18n="radius-text">
Radius:
</span>
<input data-i18n-placeholder="spell-rank-one-radius-input-placeholder" data-i18n-title="spell-rank-one-radius-input-title" name="attr_spell_rank_one_radius" placeholder="0-3" title="Spell radius" type="text"/>
</div>
<div>
<span data-i18n="duration-text">
Duration:
</span>
<input data-i18n-placeholder="spell-rank-one-duration-input-placeholder" data-i18n-title="spell-rank-one-duration-input-title" name="attr_spell_rank_one_duration" placeholder="5 min (Focus)" title="Spell target" type="text"/>
</div>
</div>
<div>
<textarea data-i18n-placeholder="spell-rank-one-description-textarea-placeholder" name="attr_spell_rank_one_description" placeholder="Spell description"></textarea>
</div>
</div>
</div>
<input class="sheet-rank2" name="attr_spell_rank_2" type="hidden" value="on"/>
<div class="sheet-spellRank sheet-rank2">
<div class="sheet-spellTitle">
<input class="sheet-folder" name="attr_spell_rank_two_fold" type="hidden"/>
<div class="sheet-foldable">
<div>
<span class="sheet-spellTitle" data-i18n="rank-2-text">
Rank 2
</span>
<span class="sheet-spellSubTitle" data-i18n="level-5-text">
(Level 5+)
</span>
</div>
<div>
<span class="sheet-spellTitle" data-i18n="mp-text">
MP:
</span>
<input class="sheet-foldable" data-i18n-title="spell-rank-two-mp-input-title" name="attr_spell_rank_two_mp" title="Spell MP" type="number" value="10"/>
</div>
</div>
<div class="sheet-reverseFoldable">
<div>
<span class="sheet-spellTitle" data-i18n="rank-2-text">
Rank 2
</span>
<span class="sheet-spellSubTitle" data-i18n="level-5-text">
(Level 5+)
</span>
</div>
<div>
<span class="sheet-spellTitle" data-i18n="mp-text">
MP:
</span>
<span class="sheet-spellTitle sheet-reverseFoldable" name="attr_spell_rank_two_mp">
</span>
</div>
</div>
<input class="sheet-folder" name="attr_spell_rank_two_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_spell_rank_two_fold" type="hidden"/>
<div class="sheet-foldable sheet-spellRankContent">
<div>
<div>
<span data-i18n="range-text">
Range:
</span>
<input data-i18n-placeholder="spell-rank-two-range-input-placeholder" data-i18n-title="spell-rank-two-range-input-title" name="attr_spell_rank_two_range" placeholder="0-3" title="Spell range" type="text"/>
</div>
<div>
<span data-i18n="radius-text">
Radius:
</span>
<input data-i18n-placeholder="spell-rank-two-radius-input-placeholder" data-i18n-title="spell-rank-two-radius-input-title" name="attr_spell_rank_two_radius" placeholder="0-3" title="Spell radius" type="text"/>
</div>
<div>
<span data-i18n="duration-text">
Duration:
</span>
<input data-i18n-placeholder="spell-rank-two-duration-input-placeholder" data-i18n-title="spell-rank-two-duration-input-title" name="attr_spell_rank_two_duration" placeholder="5 min (Focus)" title="Spell target" type="text"/>
</div>
</div>
<div>
<textarea data-i18n-placeholder="spell-rank-two-description-textarea-placeholder" name="attr_spell_rank_two_description" placeholder="Spell description"></textarea>
</div>
</div>
</div>
<input class="sheet-rank3" name="attr_spell_rank_3" type="hidden" value="on"/>
<div class="sheet-spellRank sheet-rank3">
<div class="sheet-spellTitle">
<input class="sheet-folder" name="attr_spell_rank_three_fold" type="hidden"/>
<div class="sheet-foldable sheet-spellRankContent">
<div>
<span class="sheet-spellTitle" data-i18n="rank-3-text">
Rank 3
</span>
<span class="sheet-spellSubTitle" data-i18n="level-9-text">
(Level 9+)
</span>
</div>
<div>
<span class="sheet-spellTitle" data-i18n="mp-text">
MP:
</span>
<input class="sheet-foldable" data-i18n-title="spell-rank-three-mp-input-title" name="attr_spell_rank_three_mp" title="Spell MP" type="number" value="15"/>
</div>
</div>
<div class="sheet-reverseFoldable">
<div>
<span class="sheet-spellTitle" data-i18n="rank-3-text">
Rank 3
</span>
<span class="sheet-spellSubTitle" data-i18n="level-9-text">
(Level 9+)
</span>
</div>
<div>
<span class="sheet-spellTitle" data-i18n="mp-text">
MP:
</span>
<span class="sheet-spellTitle sheet-reverseFoldable" name="attr_spell_rank_three_mp">
</span>
</div>
</div>
<input class="sheet-folder" name="attr_spell_rank_three_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_spell_rank_three_fold" type="hidden"/>
<div class="sheet-foldable sheet-spellRankContent">
<div>
<div>
<span data-i18n="range-text">
Range:
</span>
<input data-i18n-placeholder="spell-rank-three-range-input-placeholder" data-i18n-title="spell-rank-three-range-input-title" name="attr_spell_rank_three_range" placeholder="0-3" title="Spell range" type="text"/>
</div>
<div>
<span data-i18n="radius-text">
Radius:
</span>
<input data-i18n-placeholder="spell-rank-three-radius-input-placeholder" data-i18n-title="spell-rank-three-radius-input-title" name="attr_spell_rank_three_radius" placeholder="0-3" title="Spell radius" type="text"/>
</div>
<div>
<span data-i18n="duration-text">
Duration:
</span>
<input data-i18n-placeholder="spell-rank-three-duration-input-placeholder" data-i18n-title="spell-rank-three-duration-input-title" name="attr_spell_rank_three_duration" placeholder="5 min (Focus)" title="Spell target" type="text"/>
</div>
</div>
<div>
<textarea data-i18n-placeholder="spell-rank-three-description-textarea-placeholder" name="attr_spell_rank_three_description" placeholder="Spell description"></textarea>
</div>
</div>
</div>
</div>
</div>
</fieldset>
</div>
</div>
<!-- High Spells -->
<div>
<input class="sheet-folder" name="attr_high_spells_fold" type="hidden"/>
<div class="sheet-sectionTitle sheet-spellSectionTitle">
<span class="sheet-sectionTitle" data-i18n="high-spells-text">
High Spells
</span>
<input class="sheet-folder" name="attr_high_spells_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<div class="sheet-sectionContainer sheet-foldable" style="gap: 4px;">
<fieldset class="repeating_spellshigh">
<div class="sheet-repeatingSpell">
<input class="sheet-folder" name="attr_spell_name_fold" type="hidden" value="on"/>
<div class="sheet-spellName">
<input class="sheet-folder" name="attr_spell_name_fold" type="hidden" value="on"/>
<div class="sheet-foldable">
<input data-i18n-placeholder="spell-name-input-placeholder" data-i18n-title="spell-name-input-title" name="attr_spell_name" placeholder="Spell name" title="Spell name" type="text" value="Spell name"/>
</div>
<div class="sheet-reverseFoldable">
<span class="sheet-spellTitle" name="attr_spell_name">
</span>
</div>
<input checked="" class="sheet-folder" name="attr_spell_name_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<div class="sheet-spellContainer sheet-foldable">
<div>
<div class="sheet-spellMetadata">
<div>
<span data-i18n="attunements-text">
Attunements:
</span>
<input data-i18n-placeholder="spell-attunement-input-placeholder" data-i18n-title="spell-attunement-input-title" name="attr_spell_attunement" placeholder="Attunement" title="Spell attunement" type="text"/>
</div>
<div>
<span data-i18n="glyph-text">
Glyph:
</span>
<select data-i18n-title="spell-glyph-select-title" name="attr_spell_glyph" title="Glyph">
<option data-i18n="yes-option" value="0">
Yes
</option>
<option data-i18n="no-option" selected="" value="1">
No
</option>
</select>
</div>
<div>
<span data-i18n="requirement-text">
Requirement:
</span>
<input data-i18n-placeholder="spell-requirement-input-placeholder" data-i18n-title="spell-requirement-input-title" name="attr_spell_requirement" placeholder="Mov, Verb, M.Wpn" title="Spell requirement" type="text" value="Mov, Verb, M.Wpn"/>
</div>
<div>
<span data-i18n="action-text">
Action:
</span>
<select data-i18n-title="spell-action-select-title" name="attr_spell_action" title="Action">
<option data-i18n="major-option" value="0">
Major
</option>
<option data-i18n="minor-option" value="1">
minor
</option>
<option data-i18n="free-option" value="2">
Free
</option>
<option data-i18n="instant-option" value="3">
Instant
</option>
</select>
</div>
</div>
<div>
<span data-i18n="rare-casting-conditions-text">
Rare casting conditions:
</span>
<textarea data-i18n-placeholder="spell-condition-textarea-placeholder" name="attr_spell_condition" placeholder="Rare casting conditions"></textarea>
</div>
<div>
<span data-i18n="description-text">
Description:
</span>
<textarea data-i18n-placeholder="spell-effect-textarea-placeholder" name="attr_spell_effect" placeholder="Spell effect"></textarea>
</div>
</div>
<input class="sheet-rank0" name="attr_spell_rank_0" type="hidden" value="on"/>
<div class="sheet-spellRank sheet-rank0">
<div class="sheet-spellTitle">
<input class="sheet-folder" name="attr_spell_four_fold" type="hidden"/>
<div class="sheet-foldable">
<div>
<span class="sheet-spellTitle" data-i18n="rank-4-text">
Rank 4
</span>
<span class="sheet-spellSubTitle" data-i18n="spirit-tokens-text" style="text-transform: uppercase; font-size: small;">
(Spirit tokens:
</span>
<input class="sheet-foldable" data-i18n-title="spell-rank-four-spirit-input-title" name="attr_spell_rank_four_spirit" title="Spell Spirits" type="number" value="3"/>
<span class="sheet-spellSubTitle" style="text-transform: uppercase; font-size: small;">
)
</span>
</div>
<div>
<span class="sheet-spellTitle" data-i18n="mp-text">
MP:
</span>
<input class="sheet-foldable" data-i18n-title="spell-rank-four-mp-input-title" name="attr_spell_rank_four_mp" title="Spell MP" type="number" value="0"/>
</div>
</div>
<div class="sheet-reverseFoldable">
<div>
<span class="sheet-spellTitle" data-i18n="rank-4-text">
Rank 4
</span>
<span class="sheet-spellSubTitle" data-i18n="spirit-tokens-text" style="text-transform: uppercase; font-size: small;">
(Spirit tokens:
</span>
<span class="sheet-spellSubTitle" name="attr_spell_rank_four_spirit">
</span>
<span class="sheet-spellSubTitle" style="text-transform: uppercase; font-size: small;">
)
</span>
</div>
<div>
<span class="sheet-spellTitle" data-i18n="mp-text">
MP:
</span>
<span class="sheet-spellTitle sheet-reverseFoldable" name="attr_spell_rank_four_mp">
</span>
</div>
</div>
<input class="sheet-folder" name="attr_spell_four_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_spell_four_fold" type="hidden"/>
<div class="sheet-foldable sheet-spellRankContent">
<div>
<div>
<span data-i18n="range-text">
Range:
</span>
<input data-i18n-placeholder="spell-rank-four-range-input-placeholder" data-i18n-title="spell-rank-four-range-input-title" name="attr_spell_rank_four_range" placeholder="0-3" title="Spell range" type="text"/>
</div>
<div>
<span data-i18n="radius-text">
Radius:
</span>
<input data-i18n-placeholder="spell-rank-four-radius-input-placeholder" data-i18n-title="spell-rank-four-radius-input-title" name="attr_spell_rank_four_radius" placeholder="0-3" title="Spell radius" type="text"/>
</div>
<div>
<span data-i18n="duration-text">
Duration:
</span>
<input data-i18n-placeholder="spell-rank-four-duration-input-placeholder" data-i18n-title="spell-rank-four-duration-input-title" name="attr_spell_rank_four_duration" placeholder="5 min (Focus)" title="Spell target" type="text"/>
</div>
</div>
<div>
<textarea data-i18n-placeholder="spell-rank-four-description-textarea-placeholder" name="attr_spell_rank_four_description" placeholder="Spell description"></textarea>
</div>
</div>
</div>
</div>
</div>
</fieldset>
</div>
</div>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<input name="attr_all_spells" type="hidden"/>
<span class="sheet-replicateInput sheet-contentSummary" name="attr_all_spells">
</span>
</div>
</div>
</div>
</div>
<div class="sheet-notes sheet-tab">
<h1 data-i18n="notes-title">
Notes
</h1>
<div style="display: flex; flex-flow: row wrap; gap: 4px;">
<!-- Fond Memories & Bonds -->
<div>
<input name="attr_bond_amount_label" type="hidden" value="Bonds: 0
Bond points: 0
Fond memories: 0/50"/>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="fond-memories-&amp;-bonds-text" style="flex: 1 1 auto;">
Fond Memories &amp; Bonds
</span>
<input class="sheet-folder" name="attr_all_fond_memories_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<div>
<input class="sheet-folder" name="attr_all_fond_memories_fold" type="hidden"/>
<div class="sheet-sectionContainer sheet-foldable" style="gap: 4px;">
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="fond-memories-text" style="font-size: small;">
Fond Memories
</span>
</div>
<div class="sheet-sectionContainer" style="flex-flow: row;">
<input name="attr_fond_memories" style="text-align: end; flex: 1 1 auto;" type="number" value="0"/>
<span>
/50
</span>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="bonds-text" style="font-size: small;">
Bonds
</span>
</div>
<div class="sheet-sectionContainer" style="gap: 4px;">
<fieldset class="repeating_bonds">
<div class="sheet-repeatingBond">
<div>
<input data-i18n-placeholder="bond-name-input-placeholder" data-i18n-title="bond-name-input-title" name="attr_bond_name" placeholder="Bond name" title="Bond name" type="text"/>
<input data-i18n-title="bond-level-input-title" name="attr_bond_level" style="text-align: end;" title="Bond level" type="number" value="1"/>
<input class="sheet-folder" name="attr_bond_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<!-- Text area for bond description -->
<input class="sheet-folder" name="attr_bond_fold" type="hidden"/>
<div class="sheet-foldable" style="flex-flow: column wrap;">
<input data-i18n-placeholder="bond-type-input-placeholder" data-i18n-title="bond-type-input-title" name="attr_bond_type" placeholder="Bond type" title="Bond type" type="text"/>
<textarea data-i18n-placeholder="bond-description-textarea-placeholder" name="attr_bond_description" placeholder="Bond description" style="width: 100%;"></textarea>
</div>
</div>
</fieldset>
</div>
</div>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<span class="sheet-replicateInput sheet-contentSummary" name="attr_bond_amount_label">
</span>
</div>
</div>
</div>
<!-- Equipement -->
<div style="flex-flow: column; flex: 1 1 auto;">
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="equipment-text">
Equipment
</span>
<div style="flex: 1 0 auto; display: flex; justify-content: center; gap: 4px;">
<span class="sheet-sectionTitle" data-i18n="cred-text">
Cred
</span>
<input name="attr_equipment_cred" type="number" value="0"/>
</div>
<input name="attr_equipment_weight_label" type="hidden" value="0/8"/>
<span class="sheet-sectionTitle" name="attr_equipment_weight_label">
</span>
<input class="sheet-folder" name="attr_equipment_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_equipment_fold" type="hidden"/>
<div class="sheet-sectionContainer sheet-foldable">
<fieldset class="repeating_equipment">
<div>
<div class="sheet-repeatingEquipment">
<div>
<input data-i18n-placeholder="equipment-name-input-placeholder" data-i18n-title="equipment-name-input-title" name="attr_equipment_name" placeholder="Equipment name" title="Equipment name" type="text"/>
<input data-i18n-title="equipment-quantity-input-title" name="attr_equipment_quantity" title="Equipment quantity" type="number" value="1"/>
<input data-i18n-title="equipment-weight-input-title" name="attr_equipment_weight" title="Equipment weight" type="number" value="0"/>
<input class="sheet-folder" name="attr_equipment_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<!-- Text area for equipment description -->
<input class="sheet-folder" name="attr_equipment_fold" type="hidden"/>
<div class="sheet-foldable">
<textarea data-i18n-placeholder="equipment-description-textarea-placeholder" name="attr_equipment_description" placeholder="Equipment description" style="width: 100%;"></textarea>
</div>
</div>
</div>
</fieldset>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<input name="attr_equipment_summary" type="hidden"/>
<span class="sheet-replicateInput sheet-contentSummary" name="attr_equipment_summary">
</span>
</div>
</div>
<!-- Class Ranks list -->
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="class-ranks-text" style="flex: 1 1 auto;">
Class Ranks
</span>
<input class="sheet-folder" name="attr_all_class_ranks_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_all_class_ranks_fold" type="hidden"/>
<div class="sheet-sectionContainer sheet-foldable" style="gap: 4px;">
<fieldset class="repeating_ranks">
<div class="sheet-repeatingRank">
<div>
<input data-i18n-placeholder="rank-name-input-placeholder" data-i18n-title="rank-name-input-title" name="attr_rank_name" placeholder="Discipline / Class" style="flex: 1 1 auto;" title="Discipline / Class" type="text" list="ranks_list"/>
<input name="attr_rank_level" type="hidden"/>
<input name="attr_rank_level_label" type="hidden"/>
<span name="attr_rank_level_label" style="font-weight: bold;">
</span>
<input class="sheet-folder" name="attr_rank_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<!-- Text area for rank description -->
<input class="sheet-folder" name="attr_rank_fold" type="hidden"/>
<div class="sheet-foldable">
<textarea data-i18n-placeholder="rank-description-textarea-placeholder" name="attr_rank_description" placeholder="Rank description" style="width: 100%;"></textarea>
</div>
</div>
</fieldset>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<input name="attr_rank_summary" type="hidden"/>
<span class="sheet-replicateInput sheet-contentSummary" name="attr_rank_summary">
</span>
</div>
</div>
<!-- Details -->
<div class="sheet-details">
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="details-text" style="flex: 1 1 auto;">
Details
</span>
<input class="sheet-folder" name="attr_all_details_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_all_details_fold" type="hidden"/>
<div class="sheet-sectionContainer sheet-foldable" style="gap: 4px;">
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="background-text">
Background
</span>
<input class="sheet-folder" name="attr_background_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_background_fold" type="hidden"/>
<div class="sheet-foldable sheet-sectionContainer">
<textarea name="attr_background" style="width: 100%;"></textarea>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<span name="attr_background">
</span>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="personality-text">
Personality
</span>
<input class="sheet-folder" name="attr_personality_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_personality_fold" type="hidden"/>
<div class="sheet-foldable sheet-sectionContainer">
<textarea name="attr_personality" style="width: 100%;"></textarea>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<span name="attr_personality">
</span>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="appearance-text">
Appearance
</span>
<input class="sheet-folder" name="attr_appearance_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_appearance_fold" type="hidden"/>
<div class="sheet-foldable sheet-sectionContainer">
<textarea name="attr_appearance" style="width: 100%;"></textarea>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<span name="attr_appearance">
</span>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="goals-text">
Goals
</span>
<input class="sheet-folder" name="attr_goals_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_goals_fold" type="hidden"/>
<div class="sheet-foldable sheet-sectionContainer">
<textarea name="attr_goals" style="width: 100%;"></textarea>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<span name="attr_goals">
</span>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="beliefs-text">
Beliefs
</span>
<input class="sheet-folder" name="attr_beliefs_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_beliefs_fold" type="hidden"/>
<div class="sheet-foldable sheet-sectionContainer">
<textarea name="attr_beliefs" style="width: 100%;"></textarea>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<span name="attr_beliefs">
</span>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="relationships-text">
Relationships
</span>
<input class="sheet-folder" name="attr_relationships_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_relationships_fold" type="hidden"/>
<div class="sheet-foldable sheet-sectionContainer" style="gap: 4px;">
<div>
<span data-i18n="family-text" style="font-weight: bold;">
Family
</span>
<textarea name="attr_family" style="width: 100%;"></textarea>
</div>
<div>
<span data-i18n="friends-text" style="font-weight: bold;">
Friends
</span>
<textarea name="attr_friends" style="width: 100%;"></textarea>
</div>
<div>
<span data-i18n="enemies-text" style="font-weight: bold;">
Enemies
</span>
<textarea name="attr_enemies" style="width: 100%;"></textarea>
</div>
</div>
<input name="attr_relationships" type="hidden"/>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<span name="attr_relationships">
</span>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="hobbies-text">
Hobbies
</span>
<input class="sheet-folder" name="attr_hobbies_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_hobbies_fold" type="hidden"/>
<div class="sheet-foldable sheet-sectionContainer">
<textarea name="attr_hobbies" style="width: 100%;"></textarea>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<span name="attr_hobbies">
</span>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="secrets-text">
Secrets
</span>
<input class="sheet-folder" name="attr_secrets_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_secrets_fold" type="hidden"/>
<div class="sheet-foldable sheet-sectionContainer">
<textarea name="attr_secrets" style="width: 100%;"></textarea>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<span name="attr_secrets">
</span>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="fears-text">
Fears
</span>
<input class="sheet-folder" name="attr_fears_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_fears_fold" type="hidden"/>
<div class="sheet-foldable sheet-sectionContainer">
<textarea name="attr_fears" style="width: 100%;"></textarea>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<span name="attr_fears">
</span>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="hometown-text">
Hometown
</span>
<input class="sheet-folder" name="attr_hometown_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_hometown_fold" type="hidden"/>
<div class="sheet-foldable sheet-sectionContainer">
<textarea name="attr_hometown" style="width: 100%;"></textarea>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<span name="attr_hometown">
</span>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="current-residence-text">
Current Residence
</span>
<input class="sheet-folder" name="attr_residence_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_residence_fold" type="hidden"/>
<div class="sheet-foldable sheet-sectionContainer">
<textarea name="attr_residence" style="width: 100%;"></textarea>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<span name="attr_residence">
</span>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="occupation-text">
Occupation
</span>
<input class="sheet-folder" name="attr_occupation_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_occupation_fold" type="hidden"/>
<div class="sheet-foldable sheet-sectionContainer">
<textarea name="attr_occupation" style="width: 100%;"></textarea>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<span name="attr_occupation">
</span>
</div>
</div>
</div>
<input name="attr_details" type="hidden"/>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<span class="sheet-replicateInput sheet-contentSummary" name="attr_details">
</span>
</div>
</div>
<!-- Storage -->
<div style="flex: 1 1 auto;">
<input name="attr_storage_contents" type="hidden"/>
<input name="attr_storage_total_weight_label" type="hidden"/>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="storage-text" style="flex: 1 1 auto;">
Storage
</span>
<span class="sheet-sectionTitle" name="attr_storage_total_weight_label" style="flex: 0 0 auto;">
</span>
<input class="sheet-folder" name="attr_all_storage_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_all_storage_fold" type="hidden"/>
<div class="sheet-sectionContainer sheet-foldable">
<div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="storage-text" style="flex: 1 1 auto;">
Storage
</span>
<span class="sheet-sectionTitle" data-i18n="capacity-text">
Capacity:
</span>
<span class="sheet-sectionTitle" name="attr_storage_total_capacity">
</span>
<input class="sheet-folder" name="attr_storage_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
</div>
<input class="sheet-folder" name="attr_storage_fold" type="hidden"/>
<input name="attr_storage_total_capacity" type="hidden" value="0"/>
<div class="sheet-sectionContainer sheet-foldable">
<fieldset class="repeating_storages">
<div class="sheet-repeatingStorage">
<div>
<input data-i18n-placeholder="storage-name-input-placeholder" data-i18n-title="storage-name-input-title" name="attr_storage_name" placeholder="Storage name" title="Storage name" type="text"/>
<input data-i18n-title="storage-capacity-input-title" name="attr_storage_capacity" title="Storage weight" type="number" value="20"/>
<input class="sheet-folder" name="attr_storage_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<!-- Text area for storage description -->
<input class="sheet-folder" name="attr_storage_fold" type="hidden"/>
<div class="sheet-foldable">
<textarea data-i18n-placeholder="storage-description-textarea-placeholder" name="attr_storage_description" placeholder="Storage description" style="width: 100%;"></textarea>
</div>
</div>
</fieldset>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<input name="attr_storage_storages" type="hidden"/>
<span class="sheet-replicateInput sheet-contentSummary" name="attr_storage_storages">
</span>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="possessions-text" style="flex: 1 1 auto;">
Possessions
</span>
<span class="sheet-sectionTitle" data-i18n="total-weight-text">
Total weight:
</span>
<span class="sheet-sectionTitle" name="attr_possessions_total_weight">
</span>
<input class="sheet-folder" name="attr_possessions_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_possessions_fold" type="hidden"/>
<input name="attr_possessions_total_weight" type="hidden" value="0"/>
<div class="sheet-foldable sheet-sectionContainer" style="gap: 4px;">
<fieldset class="repeating_possessions">
<div class="sheet-repeatingPossession">
<div>
<input data-i18n-placeholder="possession-name-input-placeholder" data-i18n-title="possession-name-input-title" name="attr_possession_name" placeholder="Item name" title="Item name" type="text"/>
<input data-i18n-title="possession-weight-input-title" name="attr_possession_weight" title="Item weight" type="number" value="0"/>
<input data-i18n-title="possession-quantity-input-title" name="attr_possession_quantity" title="Item quantity" type="number" value="1"/>
<input class="sheet-folder" name="attr_possession_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<!-- Text area for possession description -->
<input class="sheet-folder" name="attr_possession_fold" type="hidden"/>
<div class="sheet-foldable">
<div>
<span data-i18n="storage-text">
Storage:
</span>
<input data-i18n-placeholder="possession-storage-input-placeholder" data-i18n-title="possession-storage-input-title" name="attr_possession_storage" placeholder="Guild storage" title="Where is this stored" type="text"/>
</div>
<textarea data-i18n-placeholder="possession-description-textarea-placeholder" name="attr_possession_description" placeholder="Item description" style="width: 100%;"></textarea>
</div>
</div>
</fieldset>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<input name="attr_possession_items" type="hidden"/>
<span class="sheet-replicateInput sheet-contentSummary" name="attr_possession_items">
</span>
</div>
</div>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<input name="attr_storage_contents" type="hidden"/>
<span class="sheet-replicateInput sheet-contentSummary" name="attr_storage_contents" style="text-transform: none;">
</span>
</div>
</div>
<!-- Notes -->
<div style="flex: 1 1 auto;">
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="notes-text" style="flex: 1 1 auto;">
Notes
</span>
<input class="sheet-folder" name="attr_all_notes_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<input class="sheet-folder" name="attr_all_notes_fold" type="hidden"/>
<div class="sheet-sectionContainer sheet-foldable">
<fieldset class="repeating_notes">
<div class="sheet-repeatingNote">
<div>
<input data-i18n-placeholder="note-name-input-placeholder" data-i18n-title="note-name-input-title" name="attr_note_name" placeholder="Note name" title="Note name" type="text"/>
<input class="sheet-folder" name="attr_note_fold" type="checkbox"/>
<span class="sheet-folder">
</span>
</div>
<!-- Text area for note description -->
<input class="sheet-folder" name="attr_note_fold" type="hidden"/>
<div class="sheet-foldable">
<textarea data-i18n-placeholder="note-description-textarea-placeholder" name="attr_note_description" placeholder="Note description"></textarea>
</div>
</div>
</fieldset>
</div>
<div class="sheet-reverseFoldable sheet-sectionContainer">
<span class="sheet-replicateInput sheet-contentSummary">
</span>
</div>
</div>
</div>
</div>
<!-- Options Tab -->
<div class="sheet-options sheet-tab">
<h1 data-i18n="options-title">
Options
</h1>
<div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="roll-options-text">
Roll options
</span>
</div>
<div class="sheet-sectionContainer">
<div>
<span data-i18n="ask-for-modifier-text">
Ask for modifier
</span>
<select name="attr_ask_modifier">
<option data-i18n="always-option" selected="" value="+?{Modifier|0}">
Always
</option>
<option data-i18n="never-option" value="+0">
Never
</option>
</select>
</div>
<div>
<span data-i18n="ask-for-edge-setback-text">
Ask for edge/setback
</span>
<select name="attr_ask_advantage">
<option data-i18n="always-option" selected="" value="?{Roll Type|Normal,0|Edge,1|Setback,2}">
Always
</option>
<option data-i18n="never-option" value="0">
Never
</option>
</select>
</div>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="downgrading-text">
Downgrading
</span>
</div>
<div class="sheet-sectionContainer">
<div>
<span data-i18n="downgrade-level-text">
Downgrade level
</span>
<select name="attr_downgrade_level">
<option data-i18n="none-option" selected="" value="none">
None
</option>
<option data-i18n="copper-option" value="copper">
Copper
</option>
<option data-i18n="silver-option" value="silver">
Silver
</option>
</select>
</div>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="resolve-text">
Resolve
</span>
</div>
<div class="sheet-sectionContainer">
<div>
<span data-i18n="additional-max-resolve-text">
Additional max resolve
</span>
<input name="attr_added_resolve" type="number" value="0"/>
</div>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="hit-points-text">
Hit Points
</span>
</div>
<div class="sheet-sectionContainer">
<div>
<span data-i18n="unarmored-toughness-text">
Unarmored toughness
</span>
<input name="attr_unarmored_toughness" type="checkbox"/>
</div>
<div>
<span data-i18n="armor-hp-text">
Armor HP
</span>
<select name="attr_armor_type">
<option data-i18n="none-option" value="none">
None
</option>
<option data-i18n="light-option" value="light">
Light
</option>
<option data-i18n="medium-option" value="medium">
Medium
</option>
<option data-i18n="heavy-option" value="heavy">
Heavy
</option>
</select>
<input name="attr_armor_hp" type="number" value="0"/>
</div>
<div>
<span data-i18n="additional-max-hp-text">
Additional max HP
</span>
<input name="attr_added_hp" type="number" value="0"/>
</div>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="mind-points-text">
Mind Points
</span>
</div>
<div class="sheet-sectionContainer">
<div>
<span data-i18n="additional-max-mp-text">
Additional max MP
</span>
<input name="attr_added_mp" type="number" value="0"/>
</div>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="defense-text">
Defense
</span>
</div>
<div class="sheet-sectionContainer">
<div>
<span data-i18n="base-defense-text">
Base defense
</span>
<input name="attr_base_defense" type="number" value="6"/>
</div>
<div>
<span data-i18n="bonus-defense-text">
Bonus defense
</span>
<input name="attr_bonus_defense" type="number" value="0"/>
</div>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="p-fortitude-text">
P. Fortitude
</span>
</div>
<div class="sheet-sectionContainer">
<div>
<span data-i18n="base-fortitude-text">
Base fortitude
</span>
<input name="attr_base_fortitude" type="number" value="6"/>
</div>
<div>
<span data-i18n="bonus-fortitude-text">
Bonus fortitude
</span>
<input name="attr_bonus_fortitude" type="number" value="0"/>
</div>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="m-fortitude-text">
M. Fortitude
</span>
</div>
<div class="sheet-sectionContainer">
<div>
<span data-i18n="base-fortitude-text">
Base fortitude
</span>
<input name="attr_base_willpower" type="number" value="6"/>
</div>
<div>
<span data-i18n="bonus-fortitude-text">
Bonus fortitude
</span>
<input name="attr_bonus_willpower" type="number" value="0"/>
</div>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="equipment-text">
Equipment
</span>
</div>
<div class="sheet-sectionContainer">
<div>
<span data-i18n="additional-slots-text">
Additional slots
</span>
<input name="attr_added_slots" type="number" value="0"/>
</div>
</div>
</div>
<div>
<div class="sheet-sectionTitle">
<span class="sheet-sectionTitle" data-i18n="attunements-text">
Attunements
</span>
</div>
<div class="sheet-sectionContainer">
<div>
<span data-i18n="max-attunements-text">
Max attunements
</span>
<input name="attr_attunements_max" type="number" value="0"/>
</div>
</div>
</div>
</div>
</div>
</div>
<rolltemplate class="sheet-rolltemplate-basic">
<div class="sheet-template-container">
<div class="sheet-template-header">
<h1>
{{charName}}
<br/>
{{rollName}}
</h1>
</div>
<div class="sheet-template-contents">
<div class="sheet-template-row">
Total = {{rollValues}}
</div>
</div>
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-generic">
<div class="sheet-template-container">
<div class="sheet-template-header">
<h1>
{{charName}}
<br/>
{{rollName}}
</h1>
</div>
<div class="sheet-template-contents">
{{#rollTotal() RollType 0}}
<div class="sheet-template-row">
Total = {{totalN}}
</div>
{{/rollTotal() RollType 0}}
{{#rollTotal() RollType 1}}
<div class="sheet-template-row">
Total = {{totalE}}
</div>
{{/rollTotal() RollType 1}}
{{#rollTotal() RollType 2}}
<div class="sheet-template-row">
Total = {{totalSB}}
</div>
{{/rollTotal() RollType 2}}
</div>
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-attack">
<div class="sheet-template-container">
<div class="sheet-template-header">
<h1>
{{charName}} {{rollName}}
</h1>
</div>
<div class="sheet-template-contents">
{{#rollTotal() RollType 0}}
<div class="sheet-template-row">
Total = {{totalN}}
</div>
{{/rollTotal() RollType 0}}
{{#rollTotal() RollType 1}}
<div class="sheet-template-row">
Total = {{totalE}}
</div>
{{/rollTotal() RollType 1}}
{{#rollTotal() RollType 2}}
<div class="sheet-template-row">
Total = {{totalSB}}
</div>
{{/rollTotal() RollType 2}}
<div class="sheet-template-row">
Damage = {{damage}}
</div>
</div>
</div>
</rolltemplate>
</main>
<script type="text/worker">
const copper_rank = "copper";
const silver_rank = "silver";
const gold_rank = "gold";
const platinum_rank = "platinum";
var getSectionIDsOrdered = function (sectionName, callback) {
'use strict';
getAttrs([`_reporder_${sectionName}`], function (v) {
getSectionIDs(sectionName, function (idArray) {
let reporderArray = v[`_reporder_${sectionName}`] ? v[`_reporder_${sectionName}`].toLowerCase().split(',') : [],
ids = [...new Set(reporderArray.filter(x => idArray.includes(x)).concat(idArray))];
callback(ids);
});
});
};
const tabs = [
"character",
"combat",
"magic",
"notes",
"options"
];
tabs.forEach(tab => {
on(`clicked:${tab}`, function() {
var output = {};
output["sheetTab"] = tab;
setAttrs(output, {silent: true});
});
});
on("change:character_level", function(eventInfo) {
var level = 1;
if (eventInfo.newValue != undefined || eventInfo.newValue != "")
level = parseInt(eventInfo.newValue);
var new_level = level < 1 ? 1 : level;
const capped_level = new_level > 12 ? 12 : new_level;
const grade_ranked = Math.floor((capped_level) / 4);
const grade = new_level == 89 ? platinum_rank : new_level > 8 ? gold_rank : new_level > 4 ? silver_rank : copper_rank;
const total_attributes = 7 + grade_ranked;
getAttrs(["downgrade_level"], function(v) {
var output = {};
var downgrade = v["downgrade_level"];
var downgraded_rank = grade;
var mastery_total = 2 + grade_ranked;
if (downgrade == copper_rank) {
downgraded_rank = copper_rank;
mastery_total = 3;
}
else if (downgrade == silver_rank && grade != copper_rank) {
downgraded_rank = silver_rank;
mastery_total = 4;
}
output["character_level"] = new_level;
output["adventuring_grade"] = downgraded_rank;
output["total_attributes"] = total_attributes;
output["mastery_bonus"] = mastery_total;
setAttrs(output, {silent: false});
});
getAttrs(["armor_hp", "unarmored_toughness", "added_hp", "attunements_total", "added_mp", "added_resolve", "downgrade_level", "armor_type"], function(v) {
var output = {};
const downgrade = v["downgrade_level"];
const armor_type = v["armor_type"];
const armor_hp = parseInt(v["armor_hp"]);
const unarmored_toughness = v["unarmored_toughness"];
const added_hp = parseInt(v["added_hp"]);
const attunements_total = parseInt(v["attunements_total"]);
const added_mp = parseInt(v["added_mp"]);
const added_resolve = parseInt(v["added_resolve"]);
var hp_max = 15 + (capped_level - 1) * 2 + armor_hp;
if (unarmored_toughness == "on")
hp_max = 20 + (capped_level - 1) * 3;
if (downgrade == copper_rank) {
if (armor_type == "light")
hp_max = Math.min(hp_max, 30);
else if (armor_type == "medium")
hp_max = Math.min(hp_max, 40);
else if (armor_type == "heavy")
hp_max = Math.min(hp_max, 50);
else if (armor_type == "none" && unarmored_toughness == "on")
hp_max = Math.min(hp_max, 29);
else if (armor_type == "none")
hp_max = Math.min(hp_max, 21);
}
else if (downgrade == silver_rank && grade != copper_rank) {
if (armor_type == "light")
hp_max = Math.min(hp_max, 45);
else if (armor_type == "medium")
hp_max = Math.min(hp_max, 55);
else if (armor_type == "heavy")
hp_max = Math.min(hp_max, 70);
else if (armor_type == "none" && unarmored_toughness == "on")
hp_max = Math.min(hp_max, 41);
else if (armor_type == "none")
hp_max = Math.min(hp_max, 29);
}
var mp_max = 15 + (capped_level - 1) * 2 + 10 * attunements_total;
if (downgrade == copper_rank)
mp_max = Math.min(mp_max, 50);
else if (downgrade == silver_rank && grade != copper_rank)
mp_max = Math.min(mp_max, 70);
const resolve_max = 30 + (capped_level - 1) * 4 + added_resolve;
output["hp_max"] = hp_max + added_hp;
output["mp_max"] = mp_max + added_mp;
output["resolve_max"] = resolve_max;
setAttrs(output, {silent: true});
});
getAttrs(["added_quirk", "quirk_total"], function(v) {
var output = {};
const quirk_total = parseInt(v["quirk_total"]);
const quirk_max = 2 + grade_ranked + parseInt(v["added_quirk"]);
output["quirk_points_label"] = `${quirk_total}/${quirk_max}`;
setAttrs(output, {silent: true});
});
});
on("change:adventuring_grade", function(eventInfo) {
const new_grade = eventInfo.newValue;
const new_grade_value = new_grade == platinum_rank ? 3 : new_grade == gold_rank ? 3 : new_grade == silver_rank ? 2 : 1;
getAttrs(["minor_action", "downgrade_level"], function(v) {
var output = {};
const downgrade = v["downgrade_level"];
var minor_action = new_grade_value;
if (downgrade == copper_rank)
minor_action = Math.min(minor_action, 1);
else if (downgrade == silver_rank && new_grade_value != copper_rank)
minor_action = Math.min(minor_action, 2);
output["minor_action"] = minor_action;
setAttrs(output, {silent: true});
});
});
on("change:downgrade_level", function(eventInfo) {
getAttrs(["character_level"], function(v) {
var output = {};
const downgrade = eventInfo.newValue;
const character_level = parseInt(v["character_level"]);
const capped_level = character_level > 12 ? 12 : character_level;
const grade = character_level == 89 ? platinum_rank : character_level > 8 ? gold_rank : character_level > 4 ? silver_rank : copper_rank;
const grade_ranked = Math.floor((capped_level) / 4);
var new_grade = grade;
if (downgrade == copper_rank)
new_grade = copper_rank;
else if (downgrade == silver_rank && grade != copper_rank)
new_grade = silver_rank;
var mastery_bonus = 2 + grade_ranked;
if (downgrade == copper_rank)
mastery_bonus = 3;
else if (downgrade == silver_rank && grade != copper_rank)
mastery_bonus = 4;
var minor_action = new_grade == copper_rank ? 1 : new_grade == silver_rank ? 2 : 3;
output["adventuring_grade"] = new_grade;
output["mastery_bonus"] = mastery_bonus;
output["minor_action"] = minor_action;
setAttrs(output, {silent: false});
getAttrs(["armor_hp", "unarmored_toughness", "added_hp", "armor_type"], function(v) {
var output = {};
const armor_type = v["armor_type"];
const armor_hp = parseInt(v["armor_hp"]);
const unarmored_toughness = v["unarmored_toughness"];
const added_hp = parseInt(v["added_hp"]);
var hp_max = 15 + (capped_level - 1) * 2 + armor_hp;
if (unarmored_toughness == "on")
hp_max = 20 + (capped_level - 1) * 3;
if (downgrade == copper_rank) {
if (armor_type == "light")
hp_max = Math.min(hp_max, 30);
else if (armor_type == "medium")
hp_max = Math.min(hp_max, 40);
else if (armor_type == "heavy")
hp_max = Math.min(hp_max, 50);
else if (armor_type == "none" && unarmored_toughness == "on")
hp_max = Math.min(hp_max, 29);
else if (armor_type == "none")
hp_max = Math.min(hp_max, 21);
}
else if (downgrade == silver_rank && grade != copper_rank) {
if (armor_type == "light")
hp_max = Math.min(hp_max, 45);
else if (armor_type == "medium")
hp_max = Math.min(hp_max, 55);
else if (armor_type == "heavy")
hp_max = Math.min(hp_max, 70);
else if (armor_type == "none" && unarmored_toughness == "on")
hp_max = Math.min(hp_max, 41);
else if (armor_type == "none")
hp_max = Math.min(hp_max, 29);
}
output["hp_max"] = hp_max + added_hp;
setAttrs(output, {silent: true});
});
getAttrs(["attunements_total", "added_mp"], function(v) {
var output = {};
const attunements_total = parseInt(v["attunements_total"]);
const added_mp = parseInt(v["added_mp"]);
var mp_max = 15 + (capped_level - 1) * 2 + 10 * attunements_total;
if (downgrade == copper_rank)
mp_max = Math.min(mp_max, 50);
else if (downgrade == silver_rank && grade != copper_rank)
mp_max = Math.min(mp_max, 70);
output["mp_max"] = mp_max + added_mp;
setAttrs(output, {silent: true});
});
});
});
on("change:added_resolve", function(eventInfo) {
getAttrs(["added_resolve", "character_level"], function(v) {
var output = {};
const character_level = parseInt(v["character_level"]);
const capped_level = character_level > 12 ? 12 : character_level;
const added_resolve = parseInt(v["added_resolve"]);
const resolve_max = 30 + (capped_level - 1) * 4 + added_resolve;
output["resolve_max"] = resolve_max;
setAttrs(output, {silent: true});
});
});
on("change:added_hp change:armor_hp change:unarmored_toughness change:armor_type", function(eventInfo) {
getAttrs(["added_hp", "armor_hp", "unarmored_toughness", "character_level", "armor_type", "downgrade_level"], function(v) {
var output = {};
const downgrade = v["downgrade_level"];
const armor_type = v["armor_type"];
const character_level = parseInt(v["character_level"]);
const capped_level = character_level > 12 ? 12 : character_level;
const added_hp = parseInt(v["added_hp"]);
const armor_hp = parseInt(v["armor_hp"]);
const unarmored_toughness = v["unarmored_toughness"];
var hp_max = 15 + (capped_level - 1) * 2 + armor_hp;
if (unarmored_toughness == "on")
hp_max = 20 + (capped_level - 1) * 3;
if (downgrade == copper_rank) {
if (armor_type == "light")
hp_max = Math.min(hp_max, 30);
else if (armor_type == "medium")
hp_max = Math.min(hp_max, 40);
else if (armor_type == "heavy")
hp_max = Math.min(hp_max, 50);
else if (armor_type == "none" && unarmored_toughness == "on")
hp_max = Math.min(hp_max, 29);
else if (armor_type == "none")
hp_max = Math.min(hp_max, 21);
}
else if (downgrade == silver_rank) {
if (armor_type == "light")
hp_max = Math.min(hp_max, 45);
else if (armor_type == "medium")
hp_max = Math.min(hp_max, 55);
else if (armor_type == "heavy")
hp_max = Math.min(hp_max, 70);
else if (armor_type == "none" && unarmored_toughness == "on")
hp_max = Math.min(hp_max, 41);
else if (armor_type == "none")
hp_max = Math.min(hp_max, 29);
}
output["hp_max"] = hp_max + added_hp;
setAttrs(output, {silent: true});
});
});
on("change:added_mp change:attunements_total", function(eventInfo) {
getAttrs(["added_mp", "attunements_total", "character_level", "downgrade_level"], function(v) {
var output = {};
const downgrade = v["downgrade_level"];
const character_level = parseInt(v["character_level"]);
const capped_level = character_level > 12 ? 12 : character_level;
const added_mp = parseInt(v["added_mp"]);
const attunements_total = parseInt(v["attunements_total"]);
var mp_max = 15 + (capped_level - 1) * 2 + 10 * attunements_total;
if (downgrade == copper_rank)
mp_max = Math.min(mp_max, 50);
else if (downgrade == silver_rank)
mp_max = Math.min(mp_max, 70);
output["mp_max"] = mp_max + added_mp;
setAttrs(output, {silent: true});
});
});
on("change:repeating_quirks remove:repeating_quirks change:_reporder:quirks", function(eventInfo) {
getSectionIDsOrdered("repeating_quirks", function(ids) {
var attrs_to_get = ids.map(id => `repeating_quirks_${id}_quirk_name`).concat(ids.map(id => `repeating_quirks_${id}_quirk_level`));
getAttrs(attrs_to_get, function(v) {
var output = {};
var quirk_value_pair = "";
var total_quirk_points = 0;
ids.forEach(id => {
var quirkName = v[`repeating_quirks_${id}_quirk_name`];
const quirkLevel = v[`repeating_quirks_${id}_quirk_level`];
if (quirkName == undefined || quirkName == "")
quirkName = "Unnamed Quirk";
total_quirk_points += parseInt(quirkLevel);
quirk_value_pair += `${quirkName} (Rank ${quirkLevel})\n`;
});
quirk_value_pair = quirk_value_pair.trimEnd();
output["quirk_summary"] = quirk_value_pair;
if (total_quirk_points == undefined)
total_quirk_points = 0;
output["quirk_total"] = total_quirk_points;
setAttrs(output, {silent: false});
});
});
});
on("change:quirk_total change:added_quirk", function(eventInfo) {
getAttrs(["added_quirk", "character_level", "quirk_total"], function(v) {
var output = {};
const character_level = parseInt(v["character_level"]);
const added_quirk = parseInt(v["added_quirk"]);
const quirk_total = parseInt(v["quirk_total"]);
const capped_level = character_level > 12 ? 12 : character_level;
const grade_ranked = Math.floor((capped_level + 1) / 4);
const quirk_max = 2 + grade_ranked + added_quirk;
output["quirk_points_label"] = `${eventInfo.newValue}/${quirk_max}`;
setAttrs(output, {silent: true});
});
});
on("change:strength change:mastery_bonus", function(eventInfo) {
getAttrs(["strength", "mastery_bonus", "brute", "brute_bns", "endurance", "endurance_bns", "intimidation", "intimidation_bns"], function(v) {
var output = {};
const strength = parseInt(v["strength"]);
const brute = v["brute"] == "on";
const endurance = v["endurance"] == "on";
const intimidation = v["intimidation"] == "on";
const brute_bns = parseInt(v["brute_bns"]);
const endurance_bns = parseInt(v["endurance_bns"]);
const intimidation_bns = parseInt(v["intimidation_bns"]);
const mastery_bonus = parseInt(v["mastery_bonus"]);
const brute_total = strength + (brute ? mastery_bonus : 0) + brute_bns;
const endurance_total = strength + (endurance ? mastery_bonus : 0) + endurance_bns;
const intimidation_total = strength + (intimidation ? mastery_bonus : 0) + intimidation_bns;
output["brute_mastery"] = brute ? mastery_bonus : 0;
output["endurance_mastery"] = endurance ? mastery_bonus : 0;
output["intimidation_mastery"] = intimidation ? mastery_bonus : 0;
output["brute_total_label"] = `+${brute_total}`;
output["endurance_total_label"] = `+${endurance_total}`;
output["intimidation_total_label"] = `+${intimidation_total}`;
setAttrs(output, {silent: true});
});
});
on("change:brute change:brute_bns", function(eventInfo) {
getAttrs(["strength", "mastery_bonus", "brute", "brute_bns"], function(v) {
var output = {};
const strength = parseInt(v["strength"]);
const brute = v["brute"] == "on";
const brute_bns = parseInt(v["brute_bns"]);
const mastery_bonus = parseInt(v["mastery_bonus"]);
const brute_total = strength + (brute ? mastery_bonus : 0) + brute_bns;
output["brute_mastery"] = brute ? mastery_bonus : 0;
output["brute_total_label"] = `+${brute_total}`;
setAttrs(output, {silent: true});
});
});
on("change:endurance change:endurance_bns", function(eventInfo) {
getAttrs(["strength", "mastery_bonus", "endurance", "endurance_bns"], function(v) {
var output = {};
const strength = parseInt(v["strength"]);
const endurance = v["endurance"] == "on";
const endurance_bns = parseInt(v["endurance_bns"]);
const mastery_bonus = parseInt(v["mastery_bonus"]);
const endurance_total = strength + (endurance ? mastery_bonus : 0) + endurance_bns;
output["endurance_mastery"] = endurance ? mastery_bonus : 0;
output["endurance_total_label"] = `+${endurance_total}`;
setAttrs(output, {silent: true});
});
});
on("change:intimidation change:intimidation_bns", function(eventInfo) {
getAttrs(["strength", "mastery_bonus", "intimidation", "intimidation_bns"], function(v) {
var output = {};
const strength = parseInt(v["strength"]);
const intimidation = v["intimidation"] == "on";
const intimidation_bns = parseInt(v["intimidation_bns"]);
const mastery_bonus = parseInt(v["mastery_bonus"]);
const intimidation_total = strength + (intimidation ? mastery_bonus : 0) + intimidation_bns;
output["intimidation_mastery"] = intimidation ? mastery_bonus : 0;
output["intimidation_total_label"] = `+${intimidation_total}`;
setAttrs(output, {silent: true});
});
});
on("change:agility change:mastery_bonus", function(eventInfo) {
getAttrs(["agility", "mastery_bonus", "sports", "sports_bns", "thievery", "thievery_bns", "deception", "deception_bns"], function(v) {
var output = {};
const agility = parseInt(v["agility"]);
const sports = v["sports"] == "on";
const thievery = v["thievery"] == "on";
const deception = v["deception"] == "on";
const sports_bns = parseInt(v["sports_bns"]);
const thievery_bns = parseInt(v["thievery_bns"]);
const deception_bns = parseInt(v["deception_bns"]);
const mastery_bonus = parseInt(v["mastery_bonus"]);
const sports_total = agility + (sports ? mastery_bonus : 0) + sports_bns;
const thievery_total = agility + (thievery ? mastery_bonus : 0) + thievery_bns;
const deception_total = agility + (deception ? mastery_bonus : 0) + deception_bns;
output["sports_mastery"] = sports ? mastery_bonus : 0;
output["thievery_mastery"] = thievery ? mastery_bonus : 0;
output["deception_mastery"] = deception ? mastery_bonus : 0;
output["sports_total_label"] = `+${sports_total}`;
output["thievery_total_label"] = `+${thievery_total}`;
output["deception_total_label"] = `+${deception_total}`;
setAttrs(output, {silent: true});
});
});
on("change:sports change:sports_bns", function(eventInfo) {
getAttrs(["agility", "mastery_bonus", "sports", "sports_bns"], function(v) {
var output = {};
const agility = parseInt(v["agility"]);
const sports = v["sports"] == "on";
const sports_bns = parseInt(v["sports_bns"]);
const mastery_bonus = parseInt(v["mastery_bonus"]);
const sports_total = agility + (sports ? mastery_bonus : 0) + sports_bns;
output["sports_mastery"] = sports ? mastery_bonus : 0;
output["sports_total_label"] = `+${sports_total}`;
setAttrs(output, {silent: true});
});
});
on("change:thievery change:thievery_bns", function(eventInfo) {
getAttrs(["agility", "mastery_bonus", "thievery", "thievery_bns"], function(v) {
var output = {};
const agility = parseInt(v["agility"]);
const thievery = v["thievery"] == "on";
const thievery_bns = parseInt(v["thievery_bns"]);
const mastery_bonus = parseInt(v["mastery_bonus"]);
const thievery_total = agility + (thievery ? mastery_bonus : 0) + thievery_bns;
output["thievery_mastery"] = thievery ? mastery_bonus : 0;
output["thievery_total_label"] = `+${thievery_total}`;
setAttrs(output, {silent: true});
});
});
on("change:deception change:deception_bns", function(eventInfo) {
getAttrs(["agility", "mastery_bonus", "deception", "deception_bns"], function(v) {
var output = {};
const agility = parseInt(v["agility"]);
const deception = v["deception"] == "on";
const deception_bns = parseInt(v["deception_bns"]);
const mastery_bonus = parseInt(v["mastery_bonus"]);
const deception_total = agility + (deception ? mastery_bonus : 0) + deception_bns;
output["deception_mastery"] = deception ? mastery_bonus : 0;
output["deception_total_label"] = `+${deception_total}`;
setAttrs(output, {silent: true});
});
});
on("change:awareness change:mastery_bonus", function(eventInfo) {
getAttrs(["awareness", "mastery_bonus", "detect", "detect_bns", "information", "information_bns", "reason", "reason_bns"], function(v) {
var output = {};
const awareness = parseInt(v["awareness"]);
const detect = v["detect"] == "on";
const information = v["information"] == "on";
const reason = v["reason"] == "on";
const detect_bns = parseInt(v["detect_bns"]);
const information_bns = parseInt(v["information_bns"]);
const reason_bns = parseInt(v["reason_bns"]);
const mastery_bonus = parseInt(v["mastery_bonus"]);
const detect_total = awareness + (detect ? mastery_bonus : 0) + detect_bns;
const information_total = awareness + (information ? mastery_bonus : 0) + information_bns;
const reason_total = awareness + (reason ? mastery_bonus : 0) + reason_bns;
output["detect_mastery"] = detect ? mastery_bonus : 0;
output["information_mastery"] = information ? mastery_bonus : 0;
output["reason_mastery"] = reason ? mastery_bonus : 0;
output["detect_total_label"] = `+${detect_total}`;
output["information_total_label"] = `+${information_total}`;
output["reason_total_label"] = `+${reason_total}`;
setAttrs(output, {silent: true});
});
});
on("change:detect change:detect_bns", function(eventInfo) {
getAttrs(["awareness", "mastery_bonus", "detect", "detect_bns"], function(v) {
var output = {};
const awareness = parseInt(v["awareness"]);
const detect = v["detect"] == "on";
const detect_bns = parseInt(v["detect_bns"]);
const mastery_bonus = parseInt(v["mastery_bonus"]);
const detect_total = awareness + (detect ? mastery_bonus : 0) + detect_bns;
output["detect_mastery"] = detect ? mastery_bonus : 0;
output["detect_total_label"] = `+${detect_total}`;
setAttrs(output, {silent: true});
});
});
on("change:information change:information_bns", function(eventInfo) {
getAttrs(["awareness", "mastery_bonus", "information", "information_bns"], function(v) {
var output = {};
const awareness = parseInt(v["awareness"]);
const information = v["information"] == "on";
const information_bns = parseInt(v["information_bns"]);
const mastery_bonus = parseInt(v["mastery_bonus"]);
const information_total = awareness + (information ? mastery_bonus : 0) + information_bns;
output["information_mastery"] = information ? mastery_bonus : 0;
output["information_total_label"] = `+${information_total}`;
setAttrs(output, {silent: true});
});
});
on("change:reason change:reason_bns", function(eventInfo) {
getAttrs(["awareness", "mastery_bonus", "reason", "reason_bns"], function(v) {
var output = {};
const awareness = parseInt(v["awareness"]);
const reason = v["reason"] == "on";
const reason_bns = parseInt(v["reason_bns"]);
const mastery_bonus = parseInt(v["mastery_bonus"]);
const reason_total = awareness + (reason ? mastery_bonus : 0) + reason_bns;
output["reason_mastery"] = reason ? mastery_bonus : 0;
output["reason_total_label"] = `+${reason_total}`;
setAttrs(output, {silent: true});
});
});
on("change:empathy change:mastery_bonus", function(eventInfo) {
getAttrs(["empathy", "mastery_bonus", "psychology", "psychology_bns", "artistry", "artistry_bns", "appeal", "appeal_bns"], function(v) {
var output = {};
const empathy = parseInt(v["empathy"]);
const psychology = v["psychology"] == "on";
const artistry = v["artistry"] == "on";
const appeal = v["appeal"] == "on";
const psychology_bns = parseInt(v["psychology_bns"]);
const artistry_bns = parseInt(v["artistry_bns"]);
const appeal_bns = parseInt(v["appeal_bns"]);
const mastery_bonus = parseInt(v["mastery_bonus"]);
const psychology_total = empathy + (psychology ? mastery_bonus : 0) + psychology_bns;
const artistry_total = empathy + (artistry ? mastery_bonus : 0) + artistry_bns;
const appeal_total = empathy + (appeal ? mastery_bonus : 0) + appeal_bns;
output["psychology_mastery"] = psychology ? mastery_bonus : 0;
output["artistry_mastery"] = artistry ? mastery_bonus : 0;
output["appeal_mastery"] = appeal ? mastery_bonus : 0;
output["psychology_total_label"] = `+${psychology_total}`;
output["artistry_total_label"] = `+${artistry_total}`;
output["appeal_total_label"] = `+${appeal_total}`;
setAttrs(output, {silent: true});
});
});
on("change:psychology change:psychology_bns", function(eventInfo) {
getAttrs(["empathy", "mastery_bonus", "psychology", "psychology_bns"], function(v) {
var output = {};
const empathy = parseInt(v["empathy"]);
const psychology = v["psychology"] == "on";
const psychology_bns = parseInt(v["psychology_bns"]);
const mastery_bonus = parseInt(v["mastery_bonus"]);
const psychology_total = empathy + (psychology ? mastery_bonus : 0) + psychology_bns;
output["psychology_mastery"] = psychology ? mastery_bonus : 0;
output["psychology_total_label"] = `+${psychology_total}`;
setAttrs(output, {silent: true});
});
});
on("change:artistry change:artistry_bns", function(eventInfo) {
getAttrs(["empathy", "mastery_bonus", "artistry", "artistry_bns"], function(v) {
var output = {};
const empathy = parseInt(v["empathy"]);
const artistry = v["artistry"] == "on";
const artistry_bns = parseInt(v["artistry_bns"]);
const mastery_bonus = parseInt(v["mastery_bonus"]);
const artistry_total = empathy + (artistry ? mastery_bonus : 0) + artistry_bns;
output["artistry_mastery"] = artistry ? mastery_bonus : 0;
output["artistry_total_label"] = `+${artistry_total}`;
setAttrs(output, {silent: true});
});
});
on("change:appeal change:appeal_bns", function(eventInfo) {
getAttrs(["empathy", "mastery_bonus", "appeal", "appeal_bns"], function(v) {
var output = {};
const empathy = parseInt(v["empathy"]);
const appeal = v["appeal"] == "on";
const appeal_bns = parseInt(v["appeal_bns"]);
const mastery_bonus = parseInt(v["mastery_bonus"]);
const appeal_total = empathy + (appeal ? mastery_bonus : 0) + appeal_bns;
output["appeal_mastery"] = appeal ? mastery_bonus : 0;
output["appeal_total_label"] = `+${appeal_total}`;
setAttrs(output, {silent: true});
});
});
/*
Arcanist
Chemist
Climbing
Impersonation
Infiltration
Mechanic
Navigation
Thaumaturgist
Free Toolkit places
*/
on("change:mastery_bonus", function(eventInfo) {
const mastery_bonus = parseInt(eventInfo.newValue);
const kit_list = [
"arcanist",
"chemist",
"climbing",
"impersonation",
"infiltration",
"mechanic",
"navigation",
"thaumaturgist"
];
var attrs_to_get = kit_list.map(kit => `${kit}`).concat(kit_list.map(kit => `${kit}_bns`)).concat(kit_list.map(kit => `${kit}_quality`));
getAttrs(attrs_to_get, function(v) {
var output = {};
for (let i = 0; i < kit_list.length; i++) {
const kit = kit_list[i];
const kit_mastered = v[`${kit}`] == "on";
if (!kit_mastered)
continue;
const kit_bns = parseInt(v[`${kit}_bns`]);
const kit_quality = parseInt(v[`${kit}_quality`]);
const kit_total = kit_quality + (kit_mastered ? mastery_bonus : 0) + kit_bns;
output[`${kit}_mastery`] = kit_mastered ? mastery_bonus : 0;
output[`${kit}_total_label`] = `+${kit_total}`;
}
setAttrs(output, {silent: true});
});
});
on("change:arcanist change:arcanist_bns change:arcanist_quality", function(eventInfo) {
getAttrs(["mastery_bonus", "arcanist", "arcanist_bns", "arcanist_quality"], function(v) {
var output = {};
const mastery_bonus = parseInt(v["mastery_bonus"]);
const arcanist = v["arcanist"] == "on";
const arcanist_bns = parseInt(v["arcanist_bns"]);
const arcanist_quality = parseInt(v["arcanist_quality"]);
const arcanist_total = arcanist_quality + (arcanist ? mastery_bonus : 0) + arcanist_bns;
output["arcanist_mastery"] = arcanist ? mastery_bonus : 0;
output["arcanist_total_label"] = `+${arcanist_total}`;
setAttrs(output, {silent: true});
});
});
on("change:chemist change:chemist_bns change:chemist_quality", function(eventInfo) {
getAttrs(["mastery_bonus", "chemist", "chemist_bns", "chemist_quality"], function(v) {
var output = {};
const mastery_bonus = parseInt(v["mastery_bonus"]);
const chemist = v["chemist"] == "on";
const chemist_bns = parseInt(v["chemist_bns"]);
const chemist_quality = parseInt(v["chemist_quality"]);
const chemist_total = chemist_quality + (chemist ? mastery_bonus : 0) + chemist_bns;
output["chemist_mastery"] = chemist ? mastery_bonus : 0;
output["chemist_total_label"] = `+${chemist_total}`;
setAttrs(output, {silent: true});
});
});
on("change:climbing change:climbing_bns change:climbing_quality", function(eventInfo) {
getAttrs(["mastery_bonus", "climbing", "climbing_bns", "climbing_quality"], function(v) {
var output = {};
const mastery_bonus = parseInt(v["mastery_bonus"]);
const climbing = v["climbing"] == "on";
const climbing_bns = parseInt(v["climbing_bns"]);
const climbing_quality = parseInt(v["climbing_quality"]);
const climbing_total = climbing_quality + (climbing ? mastery_bonus : 0) + climbing_bns;
output["climbing_mastery"] = climbing ? mastery_bonus : 0;
output["climbing_total_label"] = `+${climbing_total}`;
setAttrs(output, {silent: true});
});
});
on("change:impersonation change:impersonation_bns change:impersonation_quality", function(eventInfo) {
getAttrs(["mastery_bonus", "impersonation", "impersonation_bns", "impersonation_quality"], function(v) {
var output = {};
const mastery_bonus = parseInt(v["mastery_bonus"]);
const impersonation = v["impersonation"] == "on";
const impersonation_bns = parseInt(v["impersonation_bns"]);
const impersonation_quality = parseInt(v["impersonation_quality"]);
const impersonation_total = impersonation_quality + (impersonation ? mastery_bonus : 0) + impersonation_bns;
output["impersonation_mastery"] = impersonation ? mastery_bonus : 0;
output["impersonation_total_label"] = `+${impersonation_total}`;
setAttrs(output, {silent: true});
});
});
on("change:infiltration change:infiltration_bns change:infiltration_quality", function(eventInfo) {
getAttrs(["mastery_bonus", "infiltration", "infiltration_bns", "infiltration_quality"], function(v) {
var output = {};
const mastery_bonus = parseInt(v["mastery_bonus"]);
const infiltration = v["infiltration"] == "on";
const infiltration_bns = parseInt(v["infiltration_bns"]);
const infiltration_quality = parseInt(v["infiltration_quality"]);
const infiltration_total = infiltration_quality + (infiltration ? mastery_bonus : 0) + infiltration_bns;
output["infiltration_mastery"] = infiltration ? mastery_bonus : 0;
output["infiltration_total_label"] = `+${infiltration_total}`;
setAttrs(output, {silent: true});
});
});
on("change:mechanic change:mechanic_bns change:mechanic_quality", function(eventInfo) {
getAttrs(["mastery_bonus", "mechanic", "mechanic_bns", "mechanic_quality"], function(v) {
var output = {};
const mastery_bonus = parseInt(v["mastery_bonus"]);
const mechanic = v["mechanic"] == "on";
const mechanic_bns = parseInt(v["mechanic_bns"]);
const mechanic_quality = parseInt(v["mechanic_quality"]);
const mechanic_total = mechanic_quality + (mechanic ? mastery_bonus : 0) + mechanic_bns;
output["mechanic_mastery"] = mechanic ? mastery_bonus : 0;
output["mechanic_total_label"] = `+${mechanic_total}`;
setAttrs(output, {silent: true});
});
});
on("change:navigation change:navigation_bns change:navigation_quality", function(eventInfo) {
getAttrs(["mastery_bonus", "navigation", "navigation_bns", "navigation_quality"], function(v) {
var output = {};
const mastery_bonus = parseInt(v["mastery_bonus"]);
const navigation = v["navigation"] == "on";
const navigation_bns = parseInt(v["navigation_bns"]);
const navigation_quality = parseInt(v["navigation_quality"]);
const navigation_total = navigation_quality + (navigation ? mastery_bonus : 0) + navigation_bns;
output["navigation_mastery"] = navigation ? mastery_bonus : 0;
output["navigation_total_label"] = `+${navigation_total}`;
setAttrs(output, {silent: true});
});
});
on("change:thaumaturgist change:thaumaturgist_bns change:thaumaturgist_quality", function(eventInfo) {
getAttrs(["mastery_bonus", "thaumaturgist", "thaumaturgist_bns", "thaumaturgist_quality"], function(v) {
var output = {};
const mastery_bonus = parseInt(v["mastery_bonus"]);
const thaumaturgist = v["thaumaturgist"] == "on";
const thaumaturgist_bns = parseInt(v["thaumaturgist_bns"]);
const thaumaturgist_quality = parseInt(v["thaumaturgist_quality"]);
const thaumaturgist_total = thaumaturgist_quality + (thaumaturgist ? mastery_bonus : 0) + thaumaturgist_bns;
output["thaumaturgist_mastery"] = thaumaturgist ? mastery_bonus : 0;
output["thaumaturgist_total_label"] = `+${thaumaturgist_total}`;
setAttrs(output, {silent: true});
});
});
on("change:mastery_bonus", function(eventInfo) {
const mastery_bonus = parseInt(eventInfo.newValue);
getSectionIDs("toolkits", function(ids) {
var attrs_to_get = ids.map(id => `repeating_toolkits_${id}_toolkit`).concat(ids.map(id => `repeating_toolkits_${id}_toolkit_bns`)).concat(ids.map(id => `repeating_toolkits_${id}_toolkit_quality`));
getAttrs(attrs_to_get, function(v) {
var output = {};
for (let id of ids) {
const toolkit = v[`repeating_toolkits_${id}_toolkit`];
const toolkit_mastered = toolkit == "on";
if (!toolkit_mastered)
continue;
const toolkit_bns = parseInt(v[`repeating_toolkits_${id}_toolkit_bns`]);
const toolkit_quality = parseInt(v[`repeating_toolkits_${id}_toolkit_quality`]);
const toolkit_mastery_bonus = toolkit_mastered ? mastery_bonus : 0;
const toolkit_total = toolkit_quality + toolkit_mastery_bonus + toolkit_bns;
output[`repeating_toolkits_${id}_toolkit_mastery`] = toolkit_mastery_bonus;
output[`repeating_toolkits_${id}_toolkit_total_label`] = `+${toolkit_total}`;
}
setAttrs(output, {silent: true});
});
});
});
on("change:repeating_toolkits", function(eventInfo) {
getAttrs(["repeating_toolkits_toolkit", "repeating_toolkits_toolkit_bns", "repeating_toolkits_toolkit_quality", "mastery_bonus"], function(v) {
var output = {};
const toolkit = v["repeating_toolkits_toolkit"];
const toolkit_mastered = toolkit == "on";
const toolkit_bns = parseInt(v["repeating_toolkits_toolkit_bns"]);
const toolkit_quality = parseInt(v["repeating_toolkits_toolkit_quality"]);
const mastery_bonus = parseInt(v["mastery_bonus"]);
const toolkit_mastery_bonus = toolkit_mastered ? mastery_bonus : 0;
const toolkit_total = toolkit_quality + toolkit_mastery_bonus + toolkit_bns;
output["repeating_toolkits_toolkit_mastery"] = toolkit_mastery_bonus;
output["repeating_toolkits_toolkit_total_label"] = `+${toolkit_total}`;
setAttrs(output, {silent: true});
});
});
on("change:repeating_traits", function(eventInfo) {
getAttrs(["repeating_traits_trait_lifeform", "character_lifeform"], function(v) {
var output = {};
const lifeform = v["repeating_traits_trait_lifeform"];
const character_lifeform = v["character_lifeform"];
if (lifeform != "")
return;
output["repeating_traits_trait_lifeform"] = character_lifeform;
setAttrs(output, {silent: true});
});
});
on("change:repeating_traits remove:repeating_traits change:_reporder:traits", function(eventInfo) {
getSectionIDsOrdered("repeating_traits", function(ids) {
var attrs_to_get = ids.map(id => `repeating_traits_${id}_trait_name`).concat(ids.map(id => `repeating_traits_${id}_trait_type`));
getAttrs(attrs_to_get, function(v) {
var output = {};
var trait_value_pair = "";
for (const id of ids) {
const traitName = v[`repeating_traits_${id}_trait_name`];
const traitType = v[`repeating_traits_${id}_trait_type`];
if (traitName == undefined || traitName == "")
continue;
trait_value_pair += `${traitName} (${traitType} trait)\n`;
}
trait_value_pair = trait_value_pair.trimEnd();
output["trait_summary"] = trait_value_pair;
setAttrs(output, {silent: false});
});
});
});
on("change:repeating_features remove:repeating_features change:_reporder:features change:character_primary_class change:character_secondary_class change:adventuring_grade", function(eventInfo) {
getAttrs(["character_primary_class", "character_secondary_class", "adventuring_grade"], function(v) {
var output = {};
const adventuring_grade = v["adventuring_grade"];
const primary_class = v["character_primary_class"].toLowerCase();
const secondary_class = v["character_secondary_class"].toLowerCase();
getSectionIDsOrdered("repeating_features", function(ids) {
var attrs_to_get =
ids.map(id => `repeating_features_${id}_feature_name`)
.concat(ids.map(id => `repeating_features_${id}_feature_level`))
.concat(ids.map(id => `repeating_features_${id}_feature_class`))
.concat(ids.map(id => `repeating_features_${id}_feature_discipline`));
getAttrs(attrs_to_get, function(v) {
var output = {};
var primary_features = [];
var secondary_features = [];
var uncategorized_features = [];
for (let i = 0; i < ids.length; i++) {
const id = ids[i];
const featureClass = v[`repeating_features_${id}_feature_class`];
const featureDiscipline = v[`repeating_features_${id}_feature_discipline`];
const featureName = v[`repeating_features_${id}_feature_name`];
const featureLevel = v[`repeating_features_${id}_feature_level`];
if ((primary_class == undefined || primary_class == "") && (secondary_class == undefined || secondary_class == "")) {
uncategorized_features.push({
feature_discipline: featureDiscipline,
feature_class: featureClass,
feature_name: featureName,
feature_level: featureLevel
});
continue;
}
if (featureClass != undefined && featureClass != "") {
if (primary_class.includes(featureClass.toLowerCase())) {
primary_features.push({
feature_discipline: featureDiscipline,
feature_class: featureClass,
feature_name: featureName,
feature_level: featureLevel
});
} else if (secondary_class.includes(featureClass.toLowerCase())) {
secondary_features.push({
feature_discipline: featureDiscipline,
feature_class: featureClass,
feature_name: featureName,
feature_level: featureLevel
});
}
}
else if (featureDiscipline != undefined && featureDiscipline != "") {
if (primary_class.includes(featureDiscipline.toLowerCase())) {
primary_features.push({
feature_discipline: featureDiscipline,
feature_class: featureClass,
feature_name: featureName,
feature_level: featureLevel
});
} else if (secondary_class.includes(featureDiscipline.toLowerCase())) {
secondary_features.push({
feature_discipline: featureDiscipline,
feature_class: featureClass,
feature_name: featureName,
feature_level: featureLevel
});
}
}
else {
uncategorized_features.push({
feature_discipline: featureDiscipline,
feature_class: featureClass,
feature_name: featureName,
feature_level: featureLevel
});
}
}
if (primary_features.length == 0 && secondary_features.length == 0 && uncategorized_features.length == 0) {
for (let i = 0; i < ids.length; i++) {
const id = ids[i];
const featureName = v[`repeating_features_${id}_feature_name`];
const featureLevel = v[`repeating_features_${id}_feature_level`];
const featureClass = v[`repeating_features_${id}_feature_class`];
const featureDiscipline = v[`repeating_features_${id}_feature_discipline`];
uncategorized_features.push({
feature_discipline: featureDiscipline,
feature_class: featureClass,
feature_name: featureName,
feature_level: featureLevel
});
}
}
primary_features.sort((a, b) => a.feature_level - b.feature_level);
secondary_features.sort((a, b) => a.feature_level - b.feature_level);
uncategorized_features.sort((a, b) => {
if (a.feature_discipline.toLowerCase() < b.feature_discipline.toLowerCase()) return -1;
if (a.feature_discipline.toLowerCase() > b.feature_discipline.toLowerCase()) return 1;
if (a.feature_class.toLowerCase() < b.feature_class.toLowerCase()) return -1;
if (a.feature_class.toLowerCase() > b.feature_class.toLowerCase()) return 1;
return a.feature_level - b.feature_level;
});
var final_string = "";
if (primary_features.length > 0) {
const primary_discipline = primary_features.find(feature => feature.feature_discipline !== undefined && feature.feature_discipline !== null && feature.feature_discipline !== "")?.feature_discipline || "";
const primary_class = primary_features.find(feature => feature.feature_class !== undefined && feature.feature_class !== null && feature.feature_class !== "")?.feature_class || "";
final_string += `Primary Class (${primary_discipline} ${primary_class}) features\n`;
for (let feature of primary_features) {
final_string += ` ${feature.feature_name} (Rank ${feature.feature_level})\n`;
}
}
if (secondary_features.length > 0 && adventuring_grade != copper_rank) {
const secondary_discipline = secondary_features.find(feature => feature.feature_discipline !== undefined && feature.feature_discipline !== null && feature.feature_discipline !== "")?.feature_discipline || "";
const secondary_class = secondary_features.find(feature => feature.feature_class !== undefined && feature.feature_class !== null && feature.feature_class !== "")?.feature_class || "";
final_string += `Secondary Class (${secondary_discipline} ${secondary_class}) features\n`;
for (let feature of secondary_features) {
final_string += ` ${feature.feature_name} (Rank ${feature.feature_level})\n`;
}
}
if (uncategorized_features.length > 0) {
final_string += `Uncategorized features\n`;
for (let feature of uncategorized_features) {
final_string += ` ${feature.feature_name} (Rank ${feature.feature_level})\n`;
}
}
output["feature_summary"] = final_string.trimEnd();
setAttrs(output, {silent: false});
});
});
});
});
on("change:quirk_summary change:trait_summary change:feature_summary", function(eventInfo) {
getAttrs(["quirk_summary", "trait_summary", "feature_summary"], function(v) {
var output = {};
const quirk_summary = v["quirk_summary"];
const trait_summary = v["trait_summary"];
const feature_summary = v["feature_summary"];
var all_text = "";
if (quirk_summary != undefined && quirk_summary != "")
all_text += "Quirks\n" + quirk_summary.split("\n").map(line => ` ${line}`).join("\n") + "\n\n";
if (trait_summary != undefined && trait_summary != "")
all_text += "Traits\n" + trait_summary.split("\n").map(line => ` ${line}`).join("\n") + "\n\n";
if (feature_summary != undefined && feature_summary != "")
all_text += "Features\n" + feature_summary.split("\n").map(line => ` ${line}`).join("\n") + "\n\n";
output["quirk_traits_features_summary"] = all_text.trimEnd();
setAttrs(output, {silent: true});
});
});
on("change:repeating_equipment remove:repeating_equipment change:_reporder:equipment", function(eventInfo) {
getSectionIDsOrdered("repeating_equipment", function(ids) {
var attrs_to_get = ids.map(id => `repeating_equipment_${id}_equipment_name`).concat(ids.map(id => `repeating_equipment_${id}_equipment_quantity`)).concat(ids.map(id => `repeating_equipment_${id}_equipment_weight`)).concat("added_slots");
getAttrs(attrs_to_get, function(v) {
var output = {};
var equipment_value_pair = "";
var total_weight = 0;
const added_slots = parseInt(v["added_slots"]);
const total_slots = 8 + added_slots;
for (const id of ids) {
const equipmentName = v[`repeating_equipment_${id}_equipment_name`];
const equipmentQuantity = parseInt(v[`repeating_equipment_${id}_equipment_quantity`]);
if (equipmentName == undefined || equipmentName == "")
continue;
equipment_value_pair += `${equipmentName} (${equipmentQuantity})\n`;
}
equipment_value_pair = equipment_value_pair.trimEnd();
output["equipment_summary"] = equipment_value_pair;
for (const id of ids) {
const equipmentWeight = parseFloat(v[`repeating_equipment_${id}_equipment_weight`]);
const equipmentQuantity = parseFloat(v[`repeating_equipment_${id}_equipment_quantity`]);
if (equipmentQuantity == 0 || equipmentWeight == 0)
continue;
total_weight += equipmentQuantity * equipmentWeight;
}
output["equipment_weight_label"] = `${total_weight}/${total_slots}`;
setAttrs(output, {silent: false});
});
});
});
on("change:added_slots", function(eventInfo) {
getAttrs(["added_slots", "equipment_weight_label"], function(v) {
var output = {};
const added_slots = parseInt(v["added_slots"]);
const total_slots = 8 + added_slots;
const equipment_weight_label = v["equipment_weight_label"];
const total_weight = parseInt(equipment_weight_label.split("/")[0]);
output["equipment_weight_label"] = `${total_weight}/${total_slots}`;
setAttrs(output, {silent: true});
});
});
on("change:repeating_bonds change:fond_memories remove:repeating_bonds change:_reporder:bonds", function(eventInfo) {
var output = {};
getSectionIDsOrdered("repeating_bonds", function(ids) {
var attrs_to_get = ids.map(id => `repeating_bonds_${id}_bond_name`).concat(ids.map(id => `repeating_bonds_${id}_bond_level`));
attrs_to_get.push("fond_memories");
getAttrs(attrs_to_get, function(v) {
const fond_memories = parseInt(v["fond_memories"]);
var bond_strength = 0;
const bond_amount = ids.length;
var bond_lines = [];
for (let i = 0; i < ids.length; i++) {
const id = ids[i];
const bondName = v[`repeating_bonds_${id}_bond_name`];
const bondLevel = v[`repeating_bonds_${id}_bond_level`];
if (bondName == undefined || bondName == "" || bondLevel == undefined || bondLevel == "")
continue;
bond_lines.push(`${bondName} (Rank ${bondLevel})`);
bond_strength += parseInt(bondLevel);
}
var bond_label = "";
bond_label += `Fond memories: ${fond_memories}/50\n`;
bond_label += `Bond points: ${bond_strength}\n`;
bond_label += `Bonds: ${bond_amount}\n\n`;
bond_label += bond_lines.join('\n');
output["bond_amount_label"] = bond_label.trim();
setAttrs(output, {silent: true});
});
});
});
var getSectionIDsOrdered = function(sectionName, callback) {
'use strict';
getAttrs([`_reporder_${sectionName}`], function(v) {
getSectionIDs(sectionName, function(idArray) {
let reporderArray = v[`_reporder_${sectionName}`] ? v[`_reporder_${sectionName}`].toLowerCase().split(',') : [],
ids = [...new Set(reporderArray.filter(x => idArray.includes(x)).concat(idArray))];
callback(ids);
});
});
};
on("change:repeating_ranks change:_reporder:ranks remove:repeating_ranks", function(eventInfo) {
getSectionIDsOrdered("repeating_ranks", function(ids) {
var output = {};
for (var i = 0; i < ids.length; i++) {
var id = ids[i];
output[`repeating_ranks_${id}_rank_level`] = i + 1;
output[`repeating_ranks_${id}_rank_level_label`] = `Rank ${i + 1}`;
}
setAttrs(output, {silent: true});
const name_ranks_attributes = ids.map(id => `repeating_ranks_${id}_rank_name`).concat(ids.map(id => `repeating_ranks_${id}_rank_level`));
getAttrs(name_ranks_attributes, function(v) {
var output = {};
var ranks_value_pair = "";
for (let i = 0; i < ids.length; i++) {
const id = ids[i];
const rankName = v[`repeating_ranks_${id}_rank_name`];
const rankLevel = v[`repeating_ranks_${id}_rank_level`];
if (rankName == undefined || rankName == "")
continue;
ranks_value_pair += `Level ${rankLevel}: ${rankName}\n`;
}
ranks_value_pair = ranks_value_pair.trimEnd();
output["rank_summary"] = ranks_value_pair;
setAttrs(output, {silent: true});
});
});
});
on("change:repeating_attacks change:repeating_attacks:attack_mastery change:repeating_attacks:attack_bonus", function(eventInfo) {
getAttrs(["repeating_attacks_attack_mastery", "repeating_attacks_attack_bonus", "mastery_bonus"], function(v) {
var output = {};
const mastery = v["repeating_attacks_attack_mastery"];
const attack_bonus = parseInt(v["repeating_attacks_attack_bonus"]);
const mastery_bonus = parseInt(v["mastery_bonus"]);
const attack_mastery = mastery == "on" ? mastery_bonus : 0;
const attack_roll = attack_mastery + attack_bonus;
const attack_roll_label = `+${attack_roll}`;
output["repeating_attacks_attack_mastery_value"] = attack_mastery;
output["repeating_attacks_attack_roll"] = attack_roll_label;
setAttrs(output, {silent: true});
});
});
on("change:repeating_attacks", function(eventInfo) {
const id = eventInfo.triggerName;
if (eventInfo["sourceAttribute"].includes("attack_rank")) {
const new_rank = eventInfo["newValue"];
var attrs_to_get = [`${id}_attack_damage_${new_rank}`, `${id}_attack_description_${new_rank}`, `${id}_attack_damage`, `${id}_attack_description`];
getAttrs(attrs_to_get, function(v) {
var output = {};
var new_damage = v[`${id}_attack_damage_${new_rank}`];
var new_description = v[`${id}_attack_description_${new_rank}`];
if (new_damage == undefined || new_damage == "") {
new_damage = v[`${id}_attack_damage`];
output[`${id}_attack_damage_${new_rank}`] = new_damage;
}
if (new_description == undefined || new_description == "") {
new_description = v[`${id}_attack_description`];
output[`${id}_attack_description_${new_rank}`] = new_description;
}
output[`${id}_attack_damage`] = new_damage;
output[`${id}_attack_description`] = new_description;
setAttrs(output, {silent: true});
});
}
else {
var attrs_to_get = [`${id}_attack_rank`, `${id}_attack_damage`, `${id}_attack_description`];
getAttrs(attrs_to_get, function(v) {
var output = {};
const rank = v[`${id}_attack_rank`];
const damage = v[`${id}_attack_damage`];
const description = v[`${id}_attack_description`];
output[`${id}_attack_damage_${rank}`] = damage;
output[`${id}_attack_description_${rank}`] = description;
setAttrs(output, {silent: true});
});
}
});
on("change:mastery_bonus", function(eventInfo) {
const mastery_bonus = parseInt(eventInfo.newValue);
getSectionIDs("attacks", function(ids) {
var attrs_to_get = ids.map(id => `repeating_attacks_${id}_attack_mastery`).concat(ids.map(id => `repeating_attacks_${id}_attack_bonus`));
getAttrs(attrs_to_get, function(v) {
var output = {};
for (let i = 0; i < ids.length; i++) {
const id = ids[i];
const mastery = v[`repeating_attacks_${id}_attack_mastery`];
const attack_bonus = parseInt(v[`repeating_attacks_${id}_attack_bonus`]);
const attack_mastery = mastery == "on" ? mastery_bonus : 0;
const attack_roll = attack_mastery + attack_bonus;
const attack_roll_label = `+${attack_roll}`;
output[`repeating_attacks_${id}_attack_mastery_value`] = attack_mastery;
output[`repeating_attacks_${id}_attack_roll`] = attack_roll_label;
}
setAttrs(output, {silent: true});
});
});
});
on("change:attunements_total change:attunements_max", function(eventInfo) {
getAttrs(["attunements_total", "attunements_max"], function(v) {
var output = {};
const attunements_total = parseInt(v["attunements_total"]);
const max_attunements = parseInt(v["attunements_max"]);
const attunements_label = `${attunements_total}/${max_attunements}`;
output["attunements_label"] = attunements_label;
setAttrs(output, {silent: true});
});
});
on("change:fire change:wood change:earth change:water change:wind change:metal change:order change:chaos change:astral", function(eventInfo) {
getAttrs(["fire", "wood", "earth", "water", "wind", "metal", "order", "chaos", "astral"], function(v) {
var output = {};
const fire = v["fire"] == "on" ? 1 : 0;
const wood = v["wood"] == "on" ? 1 : 0;
const earth = v["earth"] == "on" ? 1 : 0;
const water = v["water"] == "on" ? 1 : 0;
const wind = v["wind"] == "on" ? 1 : 0;
const metal = v["metal"] == "on" ? 1 : 0;
const order = v["order"] == "on" ? 2 : 0;
const chaos = v["chaos"] == "on" ? 2 : 0;
const astral = v["astral"] == "on" ? 2 : 0;
const total = fire + wood + earth + water + wind + metal + order + chaos + astral;
output["attunements_total"] = total;
setAttrs(output, {silent: false});
});
});
on("change:family change:friends change:enemies", function(eventInfo) {
getAttrs(["family", "friends", "enemies"], function(v) {
var output = {};
const family = v["family"];
const friends = v["friends"];
const enemies = v["enemies"];
const relationships = `Family: ${family}\nFriends: ${friends}\nEnemies: ${enemies}`;
output["relationships"] = relationships;
setAttrs(output, {silent: false});
});
});
on("change:background change:personality change:appearance change:goals change:beliefs change:relationships change:hobbies change:secrets change:fears change:hometown change:residence change:occupation", function(eventInfo) {
getAttrs(["background", "personality", "appearance", "goals", "beliefs", "relationships", "hobbies", "secrets", "fears", "hometown", "residence", "occupation"], function(v) {
var output = {};
const background = v["background"];
const personality = v["personality"];
const appearance = v["appearance"];
const goals = v["goals"];
const beliefs = v["beliefs"];
const relationships = v["relationships"];
const hobbies = v["hobbies"];
const secrets = v["secrets"];
const fears = v["fears"];
const hometown = v["hometown"];
const residence = v["residence"];
const occupation = v["occupation"];
var relationship_label = "";
if (relationships !== undefined && relationships !== "") {
relationship_label = relationships.split("\n").map(line => ` ${line}`).join("\n");
}
var details = ""
if (background !== undefined && background !== "")
details += `Background: ${background}\n`;
if (personality !== undefined && personality !== "")
details += `Personality: ${personality}\n`;
if (appearance !== undefined && appearance !== "")
details += `Appearance: ${appearance}\n`;
if (goals !== undefined && goals !== "")
details += `Goals: ${goals}\n`;
if (beliefs !== undefined && beliefs !== "")
details += `Beliefs: ${beliefs}\n`;
if (relationships !== undefined && relationships !== "")
details += `Relationships: \n${relationship_label}\n`;
if (hobbies !== undefined && hobbies !== "")
details += `Hobbies: ${hobbies}\n`;
if (secrets !== undefined && secrets !== "")
details += `Secrets: ${secrets}\n`;
if (fears !== undefined && fears !== "")
details += `Fears: ${fears}\n`;
if (hometown !== undefined && hometown !== "")
details += `Hometown: ${hometown}\n`;
if (residence !== undefined && residence !== "")
details += `Residence: ${residence}\n`;
if (occupation !== undefined && occupation !== "")
details += `Occupation: ${occupation}`;
output["details"] = details.trim();
setAttrs(output, {silent: true});
});
});
on("change:base_defense change:bonus_defense change:mastery_bonus", function(eventInfo) {
getAttrs(["base_defense", "bonus_defense", "mastery_bonus"], function(v) {
var output = {};
const base_defense = parseInt(v["base_defense"]);
const bonus_defense = parseInt(v["bonus_defense"]);
const mastery_bonus = parseInt(v["mastery_bonus"]);
const total_defense = base_defense + bonus_defense + mastery_bonus;
output["total_defense"] = total_defense;
setAttrs(output, {silent: true});
});
});
on("change:base_fortitude change:bonus_fortitude change:mastery_bonus", function(eventInfo) {
getAttrs(["base_fortitude", "bonus_fortitude", "mastery_bonus"], function(v) {
var output = {};
const base_fortitude = parseInt(v["base_fortitude"]);
const bonus_fortitude = parseInt(v["bonus_fortitude"]);
const mastery_bonus = parseInt(v["mastery_bonus"]);
const total_fortitude = base_fortitude + bonus_fortitude + mastery_bonus;
output["total_fortitude"] = total_fortitude;
setAttrs(output, {silent: true});
});
});
on("change:base_willpower change:bonus_willpower change:mastery_bonus", function(eventInfo) {
getAttrs(["base_willpower", "bonus_willpower", "mastery_bonus"], function(v) {
var output = {};
const base_willpower = parseInt(v["base_willpower"]);
const bonus_willpower = parseInt(v["bonus_willpower"]);
const mastery_bonus = parseInt(v["mastery_bonus"]);
const total_willpower = base_willpower + bonus_willpower + mastery_bonus;
output["total_willpower"] = total_willpower;
setAttrs(output, {silent: true});
});
});
/*
on("change:spirit1 change:spirit2 change:spirit3 change:spirit4 change:spirit5", function(eventInfo) {
const changed_spirit = eventInfo.sourceAttribute;
const spirit_number = parseInt(changed_spirit.slice(-1));
getAttrs(["spirit1", "spirit2", "spirit3", "spirit4", "spirit5"], function(v) {
var output = {};
for (let i = 1; i <= 5; i++) {
const spirit = v[`spirit${i}`];
if (spirit == undefined || spirit == "")
continue;
if (i < spirit_number)
output[`spirit${i}_checked`] = "on";
else
output[`spirit${i}_checked`] = "0";
}
setAttrs(output, {silent: true});
});
});
on("change:barrier1 change:barrier2 change:barrier3", function(eventInfo) {
const changed_barrier = eventInfo.sourceAttribute;
const barrier_number = parseInt(changed_barrier.slice(-1));
getAttrs(["barrier1", "barrier2", "barrier3"], function(v) {
var output = {};
for (let i = 1; i <= 3; i++) {
const barrier = v[`barrier${i}`];
if (barrier == undefined || barrier == "")
continue;
if (i < barrier_number)
output[`barrier${i}_checked`] = "on";
else
output[`barrier${i}_checked`] = "0";
}
setAttrs(output, {silent: true});
});
});
on("change:glyph1 change:glyph2 change:glyph3", function(eventInfo) {
const changed_glyph = eventInfo.sourceAttribute;
const glyph_number = parseInt(changed_glyph.slice(-1));
getAttrs(["glyph1", "glyph2", "glyph3"], function(v) {
var output = {};
for (let i = 1; i <= 5; i++) {
const glyph = v[`glyph${i}`];
if (glyph == undefined || glyph == "")
continue;
if (i < glyph_number)
output[`glyph${i}_checked`] = "on";
else
output[`glyph${i}_checked`] = "0";
}
setAttrs(output, {silent: true});
});
});
*/
on("change:movement_distance", function(eventInfo) {
getAttrs(["movement_distance"], function(v) {
var output = {};
const movement_distance = parseInt(v["movement_distance"]);
const movement_zone = Math.floor(movement_distance / 10);
output["movement_zone"] = movement_zone;
setAttrs(output, {silent: true});
});
});
on("change:movement_zone", function(eventInfo) {
getAttrs(["movement_zone"], function(v) {
var output = {};
const movement_zone = parseInt(v["movement_zone"]);
const movement_distance = movement_zone * 10;
output["movement_distance"] = movement_distance;
setAttrs(output, {silent: true});
});
});
on("change:max_movement_distance", function(eventInfo) {
getAttrs(["max_movement_distance"], function(v) {
var output = {};
const max_movement_distance = parseInt(v["max_movement_distance"]);
const max_movement_zone = Math.floor(max_movement_distance / 10);
output["max_movement_zone"] = max_movement_zone;
setAttrs(output, {silent: true});
});
});
on("change:max_movement_zone", function(eventInfo) {
getAttrs(["max_movement_zone"], function(v) {
var output = {};
const max_movement_zone = parseInt(v["max_movement_zone"]);
const max_movement_distance = max_movement_zone * 10;
output["max_movement_distance"] = max_movement_distance;
setAttrs(output, {silent: true});
});
});
on("sheet:opened", function(eventInfo) {
getSectionIDsOrdered("repeating_storages", function(ids) {
var output = {};
if (ids.length == 0) {
var newStorageLine = `repeating_storages_${generateRowID()}`;
output[`${newStorageLine}_storage_name`] = "Guild Storage";
output[`${newStorageLine}_storage_capacity`] = 20;
output[`${newStorageLine}_storage_description`] = "The Cloudbreaker Guild allows you to store 20 Item Slots worth of items and equipment. You can request that your stored items be delivered to you between missions. You can also store your items on your rides, allowing you to swap your inventory anytime as long as you can access your rides trunk. Different rides can store different amounts of items.";
setAttrs(output, {silent: false});
}
});
});
on("change:repeating_storages remove:repeating_storages change:_reporder:storages", function(eventInfo) {
getSectionIDsOrdered("repeating_storages", function(ids) {
var attrs_to_get = ids.map(id => `repeating_storages_${id}_storage_name`).concat(ids.map(id => `repeating_storages_${id}_storage_capacity`));
getAttrs(attrs_to_get, function(v) {
var output = {};
var storage_value_pair = "";
var total_capacity = 0;
for (let i = 0; i < ids.length; i++) {
const id = ids[i];
const storageName = v[`repeating_storages_${id}_storage_name`];
const storageCapacity = parseInt(v[`repeating_storages_${id}_storage_capacity`]);
if (storageName == undefined || storageName == "")
continue;
storage_value_pair += `${storageName} (${storageCapacity} slots)\n`;
total_capacity += storageCapacity;
}
storage_value_pair = storage_value_pair.trimEnd();
output["storage_storages"] = storage_value_pair;
output["storage_total_capacity"] = total_capacity;
setAttrs(output, {silent: false});
});
});
});
on("change:repeating_possessions remove:repeating_possessions change:_reporder:possessions", function(eventInfo) {
getSectionIDsOrdered("repeating_possessions", function(ids) {
var attrs_to_get = ids.map(id => `repeating_possessions_${id}_possession_name`).concat(ids.map(id => `repeating_possessions_${id}_possession_weight`)).concat(ids.map(id => `repeating_possessions_${id}_possession_quantity`));
getAttrs(attrs_to_get, function(v) {
var output = {};
var possession_value_pair = "";
var total_weight = 0;
for (let i = 0; i < ids.length; i++) {
const id = ids[i];
const possessionName = v[`repeating_possessions_${id}_possession_name`];
const possessionWeight = parseFloat(v[`repeating_possessions_${id}_possession_weight`]);
const possessionQuantity = parseFloat(v[`repeating_possessions_${id}_possession_quantity`]);
if (possessionName == undefined || possessionName == "")
continue;
possession_value_pair += `${possessionName} (${possessionQuantity})\n`;
total_weight += possessionWeight * possessionQuantity;
}
possession_value_pair = possession_value_pair.trimEnd();
output["possession_items"] = possession_value_pair;
output["possessions_total_weight"] = total_weight;
setAttrs(output, {silent: false});
});
});
});
on("change:storage_total_capacity change:possessions_total_weight", function(eventInfo) {
getAttrs(["storage_total_capacity", "possessions_total_weight"], function(v) {
var output = {};
const storage_capacity = parseInt(v["storage_total_capacity"]);
const total_weight = parseInt(v["possessions_total_weight"]);
output["storage_total_weight_label"] = `${total_weight}/${storage_capacity}`;
setAttrs(output, {silent: true});
});
});
on("change:repeating_storages change:_reporder:storages remove:repeating_storages change:repeating_possessions remove:repeating_possessions change:_reporder:possessions", function(eventInfo) {
getSectionIDsOrdered("repeating_storages", function(storageIDs) {
getSectionIDsOrdered("repeating_possessions", function(possessionsIDs) {
var attrs_to_get = storageIDs.map(id => `repeating_storages_${id}_storage_capacity`).concat(storageIDs.map(id => `repeating_storages_${id}_storage_name`)).concat(possessionsIDs.map(id => `repeating_possessions_${id}_possession_name`)).concat(possessionsIDs.map(id => `repeating_possessions_${id}_possession_quantity`)).concat(possessionsIDs.map(id => `repeating_possessions_${id}_possession_weight`)).concat(possessionsIDs.map(id => `repeating_possessions_${id}_possession_storage`));
getAttrs(attrs_to_get, function(v) {
var output = {};
var storage_value_pairs = {};
for (let i = 0; i < storageIDs.length; i++) {
const storageID = storageIDs[i];
const storageName = v[`repeating_storages_${storageID}_storage_name`];
const storageCapacity = parseInt(v[`repeating_storages_${storageID}_storage_capacity`]);
storage_value_pairs[storageName] = {capacity: storageCapacity, weight: 0, items: []};
}
for (let i = 0; i < possessionsIDs.length; i++) {
const possessionID = possessionsIDs[i];
const possessionName = v[`repeating_possessions_${possessionID}_possession_name`];
const possessionQuantity = parseInt(v[`repeating_possessions_${possessionID}_possession_quantity`]);
const possessionWeight = parseFloat(v[`repeating_possessions_${possessionID}_possession_weight`]);
var possessionStorage = v[`repeating_possessions_${possessionID}_possession_storage`];
if (possessionStorage == undefined || possessionStorage == "")
possessionStorage = "Guild Storage";
storage_value_pairs[possessionStorage].weight += possessionQuantity * possessionWeight;
storage_value_pairs[possessionStorage].items.push({name: possessionName, quantity: possessionQuantity});
}
var storage_label = "";
for (const [storageName, storageData] of Object.entries(storage_value_pairs)) {
storage_label += `${storageName} (${storageData.weight}/${storageData.capacity})\n`;
for (let item of storageData.items) {
storage_label += ` ${item.name} (${item.quantity})\n`;
}
}
output["storage_contents"] = storage_label.trimEnd();
setAttrs(output, {silent: true});
});
});
});
});
on("change:_reporder:ranks", function(eventInfos) {
console.log(eventInfos);
});
on("sheet:opened change:repeating_ranks remove:repeating_ranks change:repeating_features remove:repeating_features", function(eventInfos) {
getSectionIDs("ranks", function(ranktIDs) {
getSectionIDs("features", function(featuresIDs) {
var attrs_to_get = [];
attrs_to_get.push("character_primary_class");
attrs_to_get.push("character_secondary_class");
for (let i = 0; i < ranktIDs.length; i++) {
attrs_to_get.push(`repeating_ranks_${ranktIDs[i]}_rank_name`);
}
for (let i = 0; i < featuresIDs.length; i++) {
attrs_to_get.push(`repeating_features_${featuresIDs[i]}_feature_discipline`);
attrs_to_get.push(`repeating_features_${featuresIDs[i]}_feature_class`);
}
getAttrs(attrs_to_get, function(v) {
var output = {};
const primary_class = v["character_primary_class"];
const secondary_class = v["character_secondary_class"];
var ranks = [];
var rankName = null;
for (let i = 0; i < ranktIDs.length; i++) {
rankName = v[`repeating_ranks_${ranktIDs[i]}_rank_name`];
if (rankName == undefined) continue;
rankName = rankName.trim();
if (!ranks.includes(rankName)) ranks.push(rankName);
}
var features = [];
var disciplines = [];
var classes = [];
for (let i = 0; i < featuresIDs.length; i++) {
const featureDiscipline = v[`repeating_features_${featuresIDs[i]}_feature_discipline`].trim();
const featureClass = v[`repeating_features_${featuresIDs[i]}_feature_class`].trim();
if (featureDiscipline == undefined || featureClass == undefined) continue;
const feature = `${featureDiscipline} ${featureClass}`;
if (!features.includes(feature)) features.push(feature);
if (!disciplines.includes(featureDiscipline)) disciplines.push(featureDiscipline);
if (!classes.includes(featureClass)) classes.push(featureClass);
}
var total_classes = [];
for (let rank of ranks) {
if (!total_classes.includes(rank)) total_classes.push(rank);
}
for (let feature of features) {
if (!total_classes.includes(feature)) total_classes.push(feature);
}
var options = [];
var value_to_add = {};
var is_primary = false;
for (let class_name of total_classes) {
value_to_add = {};
is_primary = primary_class.toLowerCase().includes(class_name.toLowerCase());
value_to_add["value"] = class_name;
if (is_primary) {
value_to_add["selected"] = true;
}
options.push(value_to_add);
}
populateListOptions({
elemSelector: '.sheet-primary',
optionsArray: options,
callback: () => {console.log("Primary class options populated");}
});
options = [];
value_to_add = {};
var is_secondary = false;
for (let class_name of total_classes) {
value_to_add = {};
is_secondary = secondary_class.toLowerCase().includes(class_name.toLowerCase());
value_to_add["value"] = class_name;
if (is_secondary) {
value_to_add["selected"] = true;
}
options.push(value_to_add);
}
populateListOptions({
elemSelector: '.sheet-secondary',
optionsArray: options,
callback: () => {console.log("Secondary class options populated");}
});
options = [];
value_to_add = {};
for (let class_name of total_classes) {
value_to_add = {};
value_to_add["value"] = class_name;
options.push(value_to_add);
}
populateListOptions({
elemSelector: '.sheet-ranks',
optionsArray: options,
callback: () => {console.log("Ranks options populated");}
});
options = [];
value_to_add = {};
for (let discipline of disciplines) {
if (discipline === "") continue;
value_to_add = {};
value_to_add["value"] = discipline;
options.push(value_to_add);
}
console.log(options);
populateListOptions({
elemSelector: '.sheet-discipline',
optionsArray: options,
callback: () => {console.log("Disciplines options populated");}
});
options = [];
value_to_add = {};
for (let class_name of classes) {
if (class_name === "") continue;
value_to_add = {};
value_to_add["value"] = class_name;
options.push(value_to_add);
}
console.log(options);
populateListOptions({
elemSelector: '.sheet-class',
optionsArray: options,
callback: () => {console.log("Classes options populated");}
});
});
});
});
});
const spirits = [1, 2, 3, 4, 5];
const barriers = [1, 2, 3];
const glyphs = [1, 2, 3];
spirits.forEach(spirit => {
on(`change:spirit${spirit}`, function(eventInfo) {
const changed_spirit = eventInfo.sourceAttribute;
const spirit_number = parseInt(changed_spirit.slice(-1));
var output = {};
for (let i = 1; i <= 5; i++) {
if (i == spirit_number)
continue;
if (i < spirit_number)
output[`spirit${i}`] = "on";
else
output[`spirit${i}`] = "0";
}
setAttrs(output, {silent: true});
});
});
barriers.forEach(barrier => {
on(`change:barrier${barrier}`, function(eventInfo) {
const changed_barrier = eventInfo.sourceAttribute;
const barrier_number = parseInt(changed_barrier.slice(-1));
var output = {};
for (let i = 1; i <= 3; i++) {
if (i == barrier_number)
continue;
if (i < barrier_number)
output[`barrier${i}`] = "on";
else
output[`barrier${i}`] = "0";
}
setAttrs(output, {silent: true});
});
});
glyphs.forEach(glyph => {
on(`change:glyph${glyph}`, function(eventInfo) {
const changed_glyph = eventInfo.sourceAttribute;
const glyph_number = parseInt(changed_glyph.slice(-1));
var output = {};
for (let i = 1; i <= 5; i++) {
if (i == glyph_number)
continue;
if (i < glyph_number)
output[`glyph${i}`] = "on";
else
output[`glyph${i}`] = "0";
}
setAttrs(output, {silent: true});
});
});
</script>