Files
roll20-character-sheets/HeroSystem6eHeroic/HeroSystem6eHeroic.html
T
2022-07-18 21:15:23 -06:00

11310 lines
449 KiB
HTML

<div class="tab">
<button type="action" name="act_characteristics" >Characteristics</button>
<button type="action" name="act_gear" >Gear</button>
<button type="action" name="act_skills" >Skills</button>
<button type="action" name="act_powers" >Powers</button>
<button type="action" name="act_complications" >Talents & Complications</button>
<button type="action" name="act_options" >Options</button>
</div>
<input type="hidden" class="sheet-tabstoggle" name="attr_sheetTab" value="character"/>
<!-- --------------------------------------------------------------------------------- -->
<!-- Bio, primary statistics, and combat statistics tab -->
<!-- --------------------------------------------------------------------------------- -->
<div class="sheet-characteristics">
<div class="grid-container-tab-characteristics">
<div class="grid-container-characteristics-leftGrid">
<div class="item-characteristics-logo">
<img src="https://github.com/Roll20/roll20-character-sheets/blob/master/HeroSystem6eHeroic/HeroSystemGraphic.png?raw=true" alt="Sheet Logo" style="width:209px;height:105px;">
</div>
<div class="item-characteristics-bio">
<div class="item-characteristics-bio-nameLabel">
<h1>Name:</h1>
</div>
<div class="item-characteristics-bio-nameText">
<input type="text" value="" name="attr_character_name" maxlength="36" tabindex="1"/>
</div>
<div class="item-characteristics-bio-titleLabel">
<h1>Title:</h1>
</div>
<div class="item-characteristics-bio-titleText">
<input type="text" value="" name="attr_character_title" maxlength="36" tabindex="2"/>
</div>
<div class="item-characteristics-bio-backgroundLabel">
<h1>Background:</h1>
</div>
<div class="item-characteristics-bio-backgroundText">
<textarea name="attr_backgroundText" cols="28" rows="3" maxlength="64" tabindex="3"/></textarea>
</div>
</div>
<div class="item-characteristics-earnings">
<div class="item-characteristics-earnings-experienceLabel">
<h1>Experience:</h1>
</div>
<div class="item-characteristics-earnings-experience">
<input type="number" min="0" value="0" name="attr_experience" tabindex="4"/>
</div>
<div class="item-characteristics-earnings-moneyLabel">
<input type="text" value="Money:" name="attr_moneyLabel" maxlength="15" tabindex="-1">
</div>
<div class="item-characteristics-earnings-money">
<input type="number" value="0" name="attr_money" step="1" tabindex="5"/>
</div>
</div>
<div class="item-characteristics-primary-attributes">
<div class="item-characteristics-primary-attributes-names">
<h1>Characteristics</h1>
<h2>Strength</h2>
<h2>Dexterity</h2>
<h2>Constitution</h2>
<h2>Intelligence</h2>
<h2>Ego</h2>
<h2>Presence</h2>
</div>
<div class="item-characteristics-primary-attributes-values">
<h1>Value</h1>
<input type="number" value="10" name="attr_strength" min="1" tabindex="6"/>
<input type="number" value="10" name="attr_dexterity" min="1" tabindex="7"/>
<input type="number" value="10" name="attr_constitution" min="1" tabindex="8"/>
<input type="number" value="10" name="attr_intelligence" min="1" tabindex="9"/>
<input type="number" value="10" name="attr_ego" min="1" tabindex="10"/>
<input type="number" value="10" name="attr_presence" min="1" tabindex="11"/>
</div>
<div class="item-characteristics-primary-attributes-rollChances">
<h1>Roll</h1>
<input type="text" value="11" name="attr_strengthChance" readonly tabindex="-1"/>
<input type="text" value="11" name="attr_dexterityChance" readonly tabindex="-1"/>
<input type="text" value="11" name="attr_constitutionChance" readonly tabindex="-1"/>
<input type="text" value="11" name="attr_intelligenceChance" readonly tabindex="-1"/>
<input type="text" value="11" name="attr_egoChance" readonly tabindex="-1"/>
<input type="text" value="11" name="attr_presenceChance" readonly tabindex="-1"/>
</div>
<div class="item-characteristics-primary-attributes-rollButtons">
<h1>&#8205;</h1> <!-- Invisible character -->
<button type="roll" class="button buttonRoll" tabindex="-1" name="roll_strength" value="&{template:custom} {{title=@{character_name} - @{character_title}}} {{subtitle= Uses Strength }} {{Base Chance = [[@{strengthChance}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<button type="roll" class="button buttonRoll" tabindex="-1" name="roll_dexterity" value="&{template:custom} {{title=@{character_name} - @{character_title}}} {{subtitle= Uses Dexterity }} {{Base Chance = [[@{dexterityChance}+@{weightDexDCVPenalty}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<button type="roll" class="button buttonRoll" tabindex="-1" name="roll_constitution" value="&{template:custom} {{title=@{character_name} - @{character_title}}} {{subtitle= Uses Constitution}} {{Base Chance = [[@{constitutionChance}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<button type="roll" class="button buttonRoll" tabindex="-1" name="roll_intelligence" value="&{template:custom} {{title=@{character_name} - @{character_title}}} {{subtitle= Uses Intelligence}} {{Base Chance = [[@{intelligenceChance}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<button type="roll" class="button buttonRoll" tabindex="-1" name="roll_ego" value="&{template:custom} {{title=@{character_name} - @{character_title}}} {{subtitle= Uses Ego}} {{Base Chance = [[@{egoChance}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<button type="roll" class="button buttonRoll" tabindex="-1" name="roll_presence" value="&{template:custom} {{title=@{character_name} - @{character_title}}} {{subtitle= Uses Presence}} {{Base Chance = [[@{presenceChance}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
</div>
<div class="item-characteristics-primary-attributes-costs">
<h1>CP</h1>
<input type="text" value="0" name="attr_strengthCP" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_dexterityCP" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_constitutionCP" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_intelligenceCP" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_egoCP" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_presenceCP" readonly tabindex="-1"/>
</div>
</div>
<div class="item-characteristics-combat-attributes">
<div class="item-characteristics-combat-attributes-names">
<h1>Combat Abilities</h1>
<h2>OCV</h2>
<h2>DCV</h2>
<h2>OMCV</h2>
<h2>DMCV</h2>
<h2>Speed</h2>
<h2>Physical Defense</h2>
<h2>Energy Defense</h2>
<h2>Body</h2>
<h2>Stun</h2>
<h2>Endurance</h2>
<h2>Recovery</h2>
</div>
<div class="item-characteristics-combat-attributes-values">
<h1>Value</h1>
<input type="number" value="3" name="attr_ocv" min="1" tabindex="12"/>
<input type="number" value="3" name="attr_dcv" min="1" tabindex="13"/>
<input type="number" value="3" name="attr_omcv" min="1" tabindex="14"/>
<input type="number" value="3" name="attr_dmcv" min="1" tabindex="15"/>
<input type="number" value="2" name="attr_speed" min="1" max="12" tabindex="16"/>
<input type="number" value="2" name="attr_pd" min="1" tabindex="17"/>
<input type="number" value="2" name="attr_ed" min="1" tabindex="18"/>
<input type="number" value="10" name="attr_body" min ="1" tabindex="19"/>
<input type="number" value="20" name="attr_stun" min="0" step="2" tabindex="20"/>
<input type="number" value="20" name="attr_endurance" min="0" step="5" tabindex="21"/>
<input type="number" value="4" name="attr_recovery" min="1" tabindex="22"/>
</div>
<div class="item-characteristics-combat-attributes-costs">
<h1>CP</h1>
<input type="text" value="0" name="attr_ocvCP" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_dcvCP" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_omcvCP" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_dmcvCP" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_speedCP" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_pdCP" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_edCP" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_bodyCP" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_stunCP" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_enduranceCP" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_recoveryCP" readonly tabindex="-1"/>
</div>
</div>
<div class="item-characteristics-movement-abilities">
<div class="item-characteristics-movement-abilities-names">
<h1>Movement</h1>
<h2>Running</h2>
<h2>Leaping</h2>
<h2>Swimming</h2>
</div>
<div class="item-characteristics-movement-abilities-values">
<h1>Value</h1>
<input type="number" value="12" name="attr_running" min="0" step="1" tabindex="23"/>
<input type="number" value="4" name="attr_leaping" min="0" step="2" tabindex="24"/>
<input type="number" value="4" name="attr_swimming" min="0" step="2" tabindex="25"/>
</div>
<div class="item-characteristics-movement-abilities-costs">
<h1>CP</h1>
<input type="text" value="0" name="attr_runningCP" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_leapingCP" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_swimmingCP" readonly tabindex="-1"/>
</div>
</div>
</div>
<div class="grid-container-characteristics-rightGrid">
<div class="item-characteristics-portrait">
<!-- Hidden variables for the portrait display slideshow -->
<input type="hidden" class="item-portrait-slideshow" name="attr_portraitSelection" value="0" min="0" step="1" max="2"/>
<input type="hidden" name="attr_totalNumberOfPortraits" value="2"/>
<!-- A set of portrait images or rule cards with the visible image selected by the user. -->
<!-- There are three cards: -->
<!-- (1) A welcome card that could be changed to something else. Increasing attr_totalNumberOfPortraits's maximum value (and updates to the CSS) would allow for more cards. -->
<!-- (2) The character's Avatar Portrait. -->
<!-- (3) A sticky note for more player notes. -->
<!-- The rule card: -->
<div class="item-portrait-00">
<h1>Welcome!</h1>
<div class="item-portrait-flex-container">
<div class="item-portrait-rule-description">
<h1>Starting Character Points</h1>
<p>Heroic characters are typically built on a base of 125 CP plus up to 50 CP that are offset with Complications. Use the Bonus CP input at the bottom of this sheet to account for free abilities.</p>
</div>
<div class="item-portrait-rule-description">
<h1>Portrait</h1>
<p>You may change this frame to your avatar or to space for more notes with the hidden side arrow buttons.</p>
</div>
</div>
</div>
<!-- Avatar Portrait Image -->
<div class="item-portrait-01">
<img alt="Character Avatar" name="attr_theSheetAvatar" style="width:250px;height:250px;">
</div>
<!-- Sticky Note -->
<div class="item-portrait-02">
<textarea name="attr_portraitStickyNote" maxlength="403">Sticky Note</textarea>
</div>
<!-- Portrait frame select buttons -->
<button type="action" name="act_left-arrow-button" tabindex="-1" class="button button-left-arrow">&#10094;</button>
<button type="action" name="act_right-arrow-button" tabindex="-1" class="button button-right-arrow">&#10095;</button>
</div>
<div class="item-characteristics-health">
<h2>BODY</h2>
<div class="item-health-stat">
<input type="text" name="attr_CurrentBODY" value="10" maxlength="3" pattern="[0-9]+" tabindex="26"/>
<div class="item-health-stat-plus-minus-enclosure">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_currentBODYplus">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_currentBODYminus">
<span>&#10094;</span>
</button>
</div>
</div>
<h2>STUN</h2>
<div class="item-health-stat">
<input type="text" name="attr_CurrentSTUN" value="20" maxlength="3" pattern="[0-9]+" tabindex="27"/>
<div class="item-health-stat-plus-minus-enclosure ">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_currentSTUNplus">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_currentSTUNminus">
<span>&#10094;</span>
</button>
</div>
</div>
<h2>END</h2>
<div class="item-health-stat">
<input type="text" name="attr_CurrentEND" value="20" maxlength="3" pattern="[0-9]+" tabindex="28"/>
<div class="item-health-stat-plus-minus-enclosure ">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_currentENDplus">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_currentENDminus">
<span>&#10094;</span>
</button>
</div>
</div>
<button type="action" class="button buttonRecover" tabindex="-1" name="act_recoverHealth">Recover</button>
<button type="action" class="button buttonReset" tabindex="-1" name="act_resetHealth">Reset</button>
</div>
<div class="grid-container-container-turn-segments">
<label class="container-speed-indicator" >
<input type="checkbox" name="attr_speedIndicator01">
<span class="checkmark01" ></span>
</label>
<label class="container-speed-indicator">
<input type="checkbox" name="attr_speedIndicator02">
<span class="checkmark02"></span>
</label>
<label class="container-speed-indicator">
<input type="checkbox" name="attr_speedIndicator03">
<span class="checkmark03"></span>
</label>
<label class="container-speed-indicator">
<input type="checkbox" name="attr_speedIndicator04">
<span class="checkmark04"></span>
</label>
<label class="container-speed-indicator">
<input type="checkbox" name="attr_speedIndicator05">
<span class="checkmark05"></span>
</label>
<label class="container-speed-indicator">
<input type="checkbox" name="attr_speedIndicator06" checked="true">
<span class="checkmark06"></span>
</label>
<label class="container-speed-indicator">
<input type="checkbox" name="attr_speedIndicator07">
<span class="checkmark07"></span>
</label>
<label class="container-speed-indicator">
<input type="checkbox" name="attr_speedIndicator08">
<span class="checkmark08"></span>
</label>
<label class="container-speed-indicator">
<input type="checkbox" name="attr_speedIndicator09">
<span class="checkmark09"></span>
</label>
<label class="container-speed-indicator">
<input type="checkbox" name="attr_speedIndicator10">
<span class="checkmark10"></span>
</label>
<label class="container-speed-indicator">
<input type="checkbox" name="attr_speedIndicator11">
<span class="checkmark11"></span>
</label>
<label class="container-speed-indicator">
<input type="checkbox" name="attr_speedIndicator12" checked="true">
<span class="checkmark12"></span>
</label>
</div>
<div class="item-characteristics-turn-tracker">
<button type="roll" class="button buttonTracker" tabindex="-1" name="roll_initiative" value="[[(?{Modifiers|0}+@{dexterity}) &{tracker}]]">Tracker</button>
</div>
<div class="item-characteristics-history">
<textarea name="attr_historyText" maxlength="4440" tabindex="36">Biography</textarea>
</div>
<!-- Perception Rolls -->
<div class="item-characteristics-perception">
<div class="subitem-characteristics-perception-row-container">
<div class="subitem-characteristics-perception-stat-container">
<h1>Perception</h1>
<div class="subitem-characteristics-perception-column-container">
<input type="text" name="attr_perceptionBase" value="11" readonly tabindex="-1">
<span>+<input type="number" name="attr_enhancedPerceptionModifier" value="0" min="-10" max="10" step="1" tabindex="29"></span>
<button type="roll" class="button buttonRoll" tabindex="-1" name="roll_perceptionRoll" value="&{template:custom} {{title=@{character_name} - @{character_title}}} {{subtitle= Uses Perception}} {{Base Chance = [[?{Modifiers|0}+@{perceptionBase}+@{enhancedPerceptionModifier}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
</div>
</div>
<div class="subitem-characteristics-perception-stat-container">
<input type="text" value="Vision" name="attr_perceptionVisionLabel" maxlength="12" tabindex="30">
<div class="subitem-characteristics-perception-column-container">
<input type="text" name="attr_perceptionVision" value="11" readonly tabindex="-1">
<span>+<input type="number" name="attr_perceptionModifierVision" value="0" min="-10" max="10" step="1" tabindex="31"></span>
<button type="roll" class="button buttonRoll" tabindex="-1" name="roll_perceptionRollVision" value="&{template:custom} {{title=@{character_name} - @{character_title}}} {{subtitle= Uses Perception - @{perceptionVisionLabel} }} {{Base Chance = [[?{Modifiers|0}+@{intelligenceChance}+@{enhancedPerceptionModifier}+@{perceptionModifierVision}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
</div>
</div>
<div class="subitem-characteristics-perception-stat-container">
<input type="text" value="Hearing" name="attr_perceptionHearingLabel" maxlength="12" tabindex="32">
<div class="subitem-characteristics-perception-column-container">
<input type="text" name="attr_perceptionHearing" value="11" readonly tabindex="-1">
<span>+<input type="number" name="attr_perceptionModifierHearing" value="0" min="-10" max="10" step="1" tabindex="33"></span>
<button type="roll" class="button buttonRoll" tabindex="-1" name="roll_perceptionRollHearing" value="&{template:custom} {{title=@{character_name} - @{character_title}}} {{subtitle= Uses Perception - @{perceptionHearingLabel} }} {{Base Chance = [[?{Modifiers|0}+@{intelligenceChance}+@{enhancedPerceptionModifier}+@{perceptionModifierHearing}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
</div>
</div>
<div class="subitem-characteristics-perception-stat-container">
<input type="text" value="Smell" name="attr_perceptionSmellLabel" maxlength="12" tabindex="34">
<div class="subitem-characteristics-perception-column-container">
<input type="text" name="attr_perceptionSmell" value="11" readonly tabindex="-1">
<span>+<input type="number" name="attr_perceptionModifierSmell" value="0" min="-10" max="10" step="1" tabindex="35"></span>
<button type="roll" class="button buttonRoll" tabindex="-1" name="roll_perceptionRollSmell" value="&{template:custom} {{title=@{character_name} - @{character_title}}} {{subtitle= Uses Perception - @{perceptionSmellLabel} }} {{Base Chance = [[?{Modifiers|0}+@{intelligenceChance}+@{enhancedPerceptionModifier}+@{perceptionModifierSmell}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- --------------------------------------------------------------------------------- -->
<!-- Gear, weapons, and armor tab -->
<!-- --------------------------------------------------------------------------------- -->
<div class="sheet-gear">
<div class="grid-container-tab-gear">
<div class="item-tab-gear-flex-container-encumbrance">
<div class="subitem-tab-gear-flex-container-encumbrance">
<h1>Lift</h1>
<h1>Weight</h1>
<input type="number" name="attr_liftWeight" value="100" readonly tabindex="-1"/>
</div>
<div class="subitem-tab-gear-flex-container-encumbrance">
<h1>Free</h1>
<h1>Carry</h1>
<input type="number" name="attr_encumbranceFreeCarry" value="10" readonly tabindex="-1"/>
</div>
<div class="subitem-tab-gear-flex-container-encumbrance">
<h1>Carried</h1>
<h1>Load</h1>
<input type="number" name="attr_carriedWeight" value="0" readonly tabindex="-1"/>
</div>
<div class="subitem-tab-gear-flex-container-encumbrance">
<h1>END</h1>
<h1>per Turn</h1>
<input type="number" name="attr_weightEndPenalty" value="0" readonly tabindex="-1"/>
</div>
<div class="subitem-tab-gear-flex-container-encumbrance">
<h1>DCV & DEX</h1>
<h1>Roll Penalty</h1>
<input type="number" name="attr_weightDexDCVPenalty" value="0" readonly tabindex="-1"/>
</div>
<div class="subitem-tab-gear-flex-container-encumbrance-bonus">
<h1>DCV</h1>
<h1>Modifier</h1>
<div class="subitem-tab-gear-plus-minus-enclosure">
<input type="text" name="attr_bonusDCVmodifier" value="0" maxlength="2" pattern="[0-9]+" tabindex="-1"/>
<div class="subitem-tab-gear-flex-container-stat">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_bonusDCVmodifierPlus">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_bonusDCVmodifierMinus">
<span>&#10094;</span>
</button>
</div>
</div>
</div>
<div class="subitem-tab-gear-flex-container-encumbrance">
<h1>Movement</h1>
<h1>Penalty</h1>
<input type="number" name="attr_weightMovePenalty" value="0" readonly tabindex="-1"/>
</div>
</div>
<div class="item-tab-gear-grid-container-armor">
<div class="subitem-tab-gear-flex-container-armor">
<div class="subitem-tab-gear-flex-container-armor-row">
<h1>Armor</h1>
<h1>rPD</h1>
<h1>PD</h1>
<h1>rED</h1>
<h1>ED</h1>
<h1>END/T</h1>
<h1>ACT</h1>
<h1>&#8205;</h1>
<h1>Locations</h1>
<h1>Mass</h1>
</div>
<!-- Armor Item 01 -->
<div class="subitem-tab-gear-flex-container-armor-row">
<input type="text" name="attr_armorName01" value="" maxlength="20" tabindex="50"/>
<input type="number" name="attr_armorPD01" step="1" value="0" min="0" step="1" tabindex="51"/>
<input type="number" name="attr_totalPD01" step="1" value="0" min="0" step="1" tabindex="51.5"/>
<input type="number" name="attr_armorED01" step="1" value="0" min="0" step="1" tabindex="52"/>
<input type="number" name="attr_totalED01" step="1" value="0" min="0" step="1" tabindex="52.5"/>
<div class="custom-select">
<select name="attr_armorEND01" tabindex="-1">
<option value="5">5</option>
<option value="4">4</option>
<option value="3">3</option>
<option value="2">2</option>
<option value="1">1</option>
<option value="0" selected>0</option>
</select>
</div>
<div class="custom-select">
<select name="attr_armorActivation01" tabindex="-1">
<option value="15">15-</option>
<option value="14">14-</option>
<option value="13">13-</option>
<option value="12">12-</option>
<option value="11">11-</option>
<option value="10">10-</option>
<option value="9">9-</option>
<option value="8">8-</option>
<option value="18" selected>NA</option>
</select>
</div>
<button type="roll" class="button buttonRollActivate" tabindex="-1" name="roll_armorActivation01" value="&{template:custom-activate} {{title=@{character_name} - @{character_title}}} {{subtitle= Defends with @{armorName01}**}} {{Activate on = [[@{armorActivation01}]] **or less**}} {{Result = [[3d6cf<0cs>0]]}} {{Resistant Defense = **rPD ``@{armorPD01}`` rED ``@{armorED01}``**}} {{Total Defense = **PD ``@{totalPD01}`` ED ``@{totalED01}``**}}" >Roll</button>
<input type="text" class="armorLocationsText" name="attr_armorLocations01" maxlength="24" tabindex="54"/>
<input type="number" name="attr_armorMass01" value="0" min="0" step="0.1" tabindex="55"/>
</div>
<!-- Armor Item 02 -->
<div class="subitem-tab-gear-flex-container-armor-row">
<input type="text" name="attr_armorName02" value="" maxlength="20" tabindex="56"/>
<input type="number" name="attr_armorPD02" step="1" value="0" min="0" step="1" tabindex="57"/>
<input type="number" name="attr_totalPD02" step="1" value="0" min="0" step="1" tabindex="57.5"/>
<input type="number" name="attr_armorED02" step="1" value="0" min="0" step="1" tabindex="58"/>
<input type="number" name="attr_totalED02" step="1" value="0" min="0" step="1" tabindex="58.5"/>
<div class="custom-select">
<select name="attr_armorEND02" tabindex="-1">
<option value="5">5</option>
<option value="4">4</option>
<option value="3">3</option>
<option value="2">2</option>
<option value="1">1</option>
<option value="0" selected>0</option>
</select>
</div>
<div class="custom-select">
<select name="attr_armorActivation02" tabindex="-1">
<option value="15">15-</option>
<option value="14">14-</option>
<option value="13">13-</option>
<option value="12">12-</option>
<option value="11">11-</option>
<option value="10">10-</option>
<option value="9">9-</option>
<option value="8">8-</option>
<option value="18" selected>NA</option>
</select>
</div>
<button type="roll" class="button buttonRollActivate" tabindex="-1" name="roll_armorActivation02" value="&{template:custom-activate} {{title=@{character_name} - @{character_title}}} {{subtitle= Defends with @{armorName02}**}} {{Activate on = [[@{armorActivation02}]] **or less**}} {{Result = [[3d6cf<0cs>0]]}} {{Resistant Defense = **rPD ``@{armorPD02}`` rED ``@{armorED02}``**}} {{Total Defense = **PD ``@{totalPD02}`` ED ``@{totalED02}``**}}" >Roll</button>
<input type="text" class="armorLocationsText" name="attr_armorLocations02" maxlength="24" tabindex="59"/>
<input type="number" name="attr_armorMass02" value="0" min="0" step="0.1" tabindex="60"/>
</div>
<!-- Armor Item 03 -->
<div class="subitem-tab-gear-flex-container-armor-row">
<input type="text" name="attr_armorName03" value="" maxlength="20" tabindex="61"/>
<input type="number" name="attr_armorPD03" step="1" value="0" min="0" step="1" tabindex="62"/>
<input type="number" name="attr_totalPD03" step="1" value="0" min="0" step="1" tabindex="62.5"/>
<input type="number" name="attr_armorED03" step="1" value="0" min="0" step="1" tabindex="63"/>
<input type="number" name="attr_totalED03" step="1" value="0" min="0" step="1" tabindex="63.5"/>
<div class="custom-select">
<select name="attr_armorEND03" tabindex="-1">
<option value="5">5</option>
<option value="4">4</option>
<option value="3">3</option>
<option value="2">2</option>
<option value="1">1</option>
<option value="0" selected>0</option>
</select>
</div>
<div class="custom-select">
<select name="attr_armorActivation03" tabindex="-1">
<option value="15">15-</option>
<option value="14">14-</option>
<option value="13">13-</option>
<option value="12">12-</option>
<option value="11">11-</option>
<option value="10">10-</option>
<option value="9">9-</option>
<option value="8">8-</option>
<option value="18" selected>NA</option>
</select>
</div>
<button type="roll" class="button buttonRollActivate" tabindex="-1" name="roll_armorActivation03" value="&{template:custom-activate} {{title=@{character_name} - @{character_title}}} {{subtitle= Defends with @{armorName03}**}} {{Activate on = [[@{armorActivation03}]] **or less**}} {{Result = [[3d6cf<0cs>0]]}} {{Resistant Defense = **rPD ``@{armorPD03}`` rED ``@{armorED03}``**}} {{Total Defense = **PD ``@{totalPD03}`` ED ``@{totalED03}``**}}" >Roll</button>
<input type="text" class="armorLocationsText" name="attr_armorLocations03" maxlength="24" tabindex="64"/>
<input type="number" name="attr_armorMass03" value="0" min="0" step="0.1" tabindex="65"/>
</div>
<!-- Armor Item 04 -->
<div class="subitem-tab-gear-flex-container-armor-row">
<input type="text" name="attr_armorName04" value="" maxlength="20" tabindex="66"/>
<input type="number" name="attr_armorPD04" step="1" value="0" min="0" step="1" tabindex="67"/>
<input type="number" name="attr_totalPD04" step="1" value="0" min="0" step="1" tabindex="67.5"/>
<input type="number" name="attr_armorED04" step="1" value="0" min="0" step="1" tabindex="68"/>
<input type="number" name="attr_totalED04" step="1" value="0" min="0" step="1" tabindex="68.5"/>
<div class="custom-select">
<select name="attr_armorEND04" tabindex="-1">
<option value="5">5</option>
<option value="4">4</option>
<option value="3">3</option>
<option value="2">2</option>
<option value="1">1</option>
<option value="0" selected>0</option>
</select>
</div>
<div class="custom-select">
<select name="attr_armorActivation04" tabindex="-1">
<option value="15">15-</option>
<option value="14">14-</option>
<option value="13">13-</option>
<option value="12">12-</option>
<option value="11">11-</option>
<option value="10">10-</option>
<option value="9">9-</option>
<option value="8">8-</option>
<option value="18" selected>NA</option>
</select>
</div>
<button type="roll" class="button buttonRollActivate" tabindex="-1" name="roll_armorActivation04" value="&{template:custom-activate} {{title=@{character_name} - @{character_title}}} {{subtitle= Defends with @{armorName04}**}} {{Activate on = [[@{armorActivation04}]] **or less**}} {{Result = [[3d6cf<0cs>0]]}} {{Resistant Defense = **rPD ``@{armorPD04}`` rED ``@{armorED04}``**}} {{Total Defense = **PD ``@{totalPD04}`` ED ``@{totalED04}``**}}" >Roll</button>
<input type="text" class="armorLocationsText" name="attr_armorLocations04" maxlength="24" tabindex="69"/>
<input type="number" name="attr_armorMass04" value="0" min="0" step="0.1" tabindex="70"/>
</div>
</div>
<!-- Shield -->
<div class="subitem-tab-gear-flex-container-shield">
<div class="subitem-tab-gear-flex-container-shield-row">
<h1>Shield</h1>
<h1>DCV</h1>
<h1>Damage</h1>
<h1>N</h1>
<h1>&#8205;</h1>
<h1>OCV</h1>
<h1>STUNx</h1>
<h1>STR</h1>
<h1>END</h1>
<h1>BODY</h1>
<h1>DEF</h1>
<h1>Mass</h1>
</div>
<input type="hidden" name="attr_targetOCVpenalty" value="0"/>
<div class="subitem-tab-gear-flex-container-shield-row">
<input type="text" name="attr_shieldName" value="" maxlength="20" tabindex="76"/>
<input type="number" name="attr_shieldDCV" step="1" min="0" value="0" tabindex="77"/>
<input type="text" name="attr_shieldDamage" step="1" min="0" value="0" maxlength="16" tabindex="78"/>
<label class="container-checkbox-small">
<input type="checkbox" checked="checked" name="attr_shieldNormalDamage">
<span class="checkmark-small"></span>
</label>
<button type="action" class="button buttonRollShieldAttack" tabindex="-1" name="act_attackShield">Roll</button>
<input type="number" name="attr_shieldOCV" step="1" min="-10" value="0" tabindex="79"/>
<input type="number" name="attr_shieldStunMod" value="0" min="-2" step="1" tabindex="80"/>
<input type="number" name="attr_shieldStrength"step="1" min="0" value="0" tabindex="81"/>
<input type="text" name="attr_shieldEndurance" value="0" readonly tabindex="-1"/>
<input type="number" name="attr_shieldBody" step="1" min="0" value="0" tabindex="83"/>
<input type="number" name="attr_shieldDefense" step="1" min="0" value="0" tabindex="84"/>
<input type="number" name="attr_shieldMass" step="0.1" min="0" value="0" tabindex="85"/>
</div>
</div>
</div>
<div class="item-tab-gear-flex-container-weapons">
<div class="subitem-tab-gear-flex-container-weapon-row">
<h1>Weapons</h1>
<h1>Damage</h1>
<h1>N</h1>
<h1>&#8205;</h1>
<h1>OCV</h1>
<h1>RMod</h1>
<h1>STUNx</h1>
<h1>Shots</h1>
<h1>STR</h1>
<h1>END</h1>
<h1>Range</h1>
<h1>AoE</h1>
<h1>Mass</h1>
</div>
<!-- Weapon 01 -->
<input type="hidden" name="attr_weaponOCVPenalty01" value="0"/>
<div class="subitem-tab-gear-flex-container-weapon-row">
<input type="text" name="attr_weaponName01" value="" maxlength="20" tabindex="86"/>
<input type="text" name="attr_weaponDamage01" value="0" maxlength="16" tabindex="87"/>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_weaponNormalDamage01">
<span class="checkmark-small"></span>
</label>
<button type="action" class="button buttonRollAttack" tabindex="-1" name="act_attackWeapon01">Roll</button>
<input type="number" name="attr_weaponOCV01" step="1" value="0" tabindex="88"/>
<input type="number" name="attr_weaponRangeMod01" step="1" value="0" tabindex="89"/>
<input type="number" name="attr_weaponStunMod01" value="0" min="-2" step="1" tabindex="90"/>
<input type="number" name="attr_weaponShots01" step="1" min="0" value ="0" tabindex="91"/>
<input type="number" name="attr_weaponStrength01" step="1" min="0" value="0" tabindex="92"/>
<input type="text" name="attr_weaponEndurance01" value="0" readonly tabindex="-1"/>
<input type="number" name="attr_weaponRange01" step="1" min="0" value="0" tabindex="93"/>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_weaponAreaEffect01">
<span class="checkmark-small"></span>
</label>
<input type="number" name="attr_weaponMass01" step="0.1" min="0" value="0" tabindex="94"/>
</div>
<!-- Weapon 02 -->
<input type="hidden" name="attr_weaponOCVPenalty02" value="0"/>
<div class="subitem-tab-gear-flex-container-weapon-row">
<input type="text" name="attr_weaponName02" value="" maxlength="20" tabindex="95"/>
<input type="text" name="attr_weaponDamage02" value="0" maxlength="16" tabindex="96"/>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_weaponNormalDamage02">
<span class="checkmark-small"></span>
</label>
<button type="action" class="button buttonRollAttack" tabindex="-1" name="act_attackWeapon02">Roll</button>
<input type="number" name="attr_weaponOCV02" step="1" value="0" tabindex="97"/>
<input type="number" name="attr_weaponRangeMod02" step="1" value="0" tabindex="98"/>
<input type="number" name="attr_weaponStunMod02" value="0" min="-2" step="1" tabindex="99"/>
<input type="number" name="attr_weaponShots02" step="1" min="0" value="0" tabindex="100"/>
<input type="number" name="attr_weaponStrength02" step="1" min="0" value="0" tabindex="101"/>
<input type="text" name="attr_weaponEndurance02" value="0" readonly tabindex="-1"/>
<input type="number" name="attr_weaponRange02" step="1" min="0" value="0" tabindex="102"/>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_weaponAreaEffect02">
<span class="checkmark-small"></span>
</label>
<input type="number" name="attr_weaponMass02" step="0.1" min="0" value="0" tabindex="103"/>
</div>
<!-- Weapon 03 -->
<input type="hidden" name="attr_weaponOCVPenalty03" value="0"/>
<div class="subitem-tab-gear-flex-container-weapon-row">
<input type="text" name="attr_weaponName03" value="" maxlength="20" tabindex="104"/>
<input type="text" name="attr_weaponDamage03" value="0" maxlength="16" tabindex="105"/>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_weaponNormalDamage03">
<span class="checkmark-small"></span>
</label>
<button type="action" class="button buttonRollAttack" tabindex="-1" name="act_attackWeapon03">Roll</button>
<input type="number" name="attr_weaponOCV03" step="1" value="0" tabindex="106"/>
<input type="number" name="attr_weaponRangeMod03" step="1" value="0" tabindex="107"/>
<input type="number" name="attr_weaponStunMod03" value="0" min="-2" step="1" tabindex="108"/>
<input type="number" name="attr_weaponShots03" step="1" min="0" value="0" tabindex="109"/>
<input type="number" name="attr_weaponStrength03" step="1" min="0" value="0" tabindex="110"/>
<input type="text" name="attr_weaponEndurance03" value="0" readonly tabindex="-1"/>
<input type="number" name="attr_weaponRange03" step="1" min="0" value="0" tabindex="111"/>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_weaponAreaEffect03">
<span class="checkmark-small"></span>
</label>
<input type="number" name="attr_weaponMass03" step="0.1" min="0" value="0" tabindex="112"/>
</div>
<!-- Weapon 04 -->
<input type="hidden" name="attr_weaponOCVPenalty04" value="0"/>
<div class="subitem-tab-gear-flex-container-weapon-row">
<input type="text" name="attr_weaponName04" value="" maxlength="20" tabindex="113"/>
<input type="text" name="attr_weaponDamage04" value="0" maxlength="16" tabindex="114"/>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_weaponNormalDamage04">
<span class="checkmark-small"></span>
</label>
<button type="action" class="button buttonRollAttack" tabindex="-1" name="act_attackWeapon04">Roll</button>
<input type="number" name="attr_weaponOCV04" step="1" value="0" tabindex="115"/>
<input type="number" name="attr_weaponRangeMod04" step="1" value="0" tabindex="116"/>
<input type="number" name="attr_weaponStunMod04" value="0" min="-2" step="1" tabindex="117"/>
<input type="number" name="attr_weaponShots04" step="1" min="0" value="0" tabindex="118"/>
<input type="number" name="attr_weaponStrength04" step="1" min="0" value="0" tabindex="119"/>
<input type="text" name="attr_weaponEndurance04" value="0" readonly tabindex="-1"/>
<input type="number" name="attr_weaponRange04" step="1" min="0" value="0" tabindex="120"/>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_weaponAreaEffect04">
<span class="checkmark-small"></span>
</label>
<input type="number" name="attr_weaponMass04" step="0.1" min="0" value="0" tabindex="121"/>
</div>
<!-- Weapon 05 -->
<input type="hidden" name="attr_weaponOCVPenalty05" value="0"/>
<div class="subitem-tab-gear-flex-container-weapon-row">
<input type="text" name="attr_weaponName05" vvalue="" maxlength="20" tabindex="122"/>
<input type="text" name="attr_weaponDamage05"value="0" maxlength="16" tabindex="123"/>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_weaponNormalDamage05">
<span class="checkmark-small"></span>
</label>
<button type="action" class="button buttonRollAttack" tabindex="-1" name="act_attackWeapon05">Roll</button>
<input type="number" name="attr_weaponOCV05" step="1" value="0" tabindex="124"/>
<input type="number" name="attr_weaponRangeMod05" step="1" value="0" tabindex="125"/>
<input type="number" name="attr_weaponStunMod04" value="0" min="-2" step="1" tabindex="126"/>
<input type="number" name="attr_weaponShots05" step="1" min="0" value="0" tabindex="127"/>
<input type="number" name="attr_weaponStrength05" step="1" min="0" value="0" tabindex="128"/>
<input type="text" name="attr_weaponEndurance05" value="0" readonly tabindex="-1"/>
<input type="number" name="attr_weaponRange05" step="1" min="0" value="0" tabindex="129"/>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_weaponAreaEffect05">
<span class="checkmark-small"></span>
</label>
<input type="number" name="attr_weaponMass05" step="0.1" min="0" value="0" tabindex="130"/>
</div>
</div>
<div class="item-tab-gear-flex-container-equipment">
<div class="subitem-tab-gear-flex-container-equipment">
<h1>Equipment</h1>
<h1>Mass</h1>
</div>
<div class="subitem-tab-gear-flex-container-equipment">
<input type="text" name="attr_equipText01" maxlength="30" tabindex="131"/>
<div class="gear-mover-plus-minus-enclosure">
<div class="gear-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_equipUp01">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_equipDown01">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="number" name="attr_equipMass01" min="0" step="0.1" tabindex="132"/>
</div>
<div class="subitem-tab-gear-flex-container-equipment">
<input type="text" name="attr_equipText02" maxlength="30" tabindex="134"/>
<div class="gear-mover-plus-minus-enclosure">
<div class="gear-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_equipUp02">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_equipDown02">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="number" name="attr_equipMass02" min="0" step="0.1" tabindex="135"/>
</div>
<div class="subitem-tab-gear-flex-container-equipment">
<input type="text" name="attr_equipText03" maxlength="30" tabindex="136"/>
<div class="gear-mover-plus-minus-enclosure">
<div class="gear-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_equipUp03">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_equipDown03">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="number" name="attr_equipMass03" min="0" step="0.1" tabindex="137"/>
</div>
<div class="subitem-tab-gear-flex-container-equipment">
<input type="text" name="attr_equipText04" maxlength="30" tabindex="138"/>
<div class="gear-mover-plus-minus-enclosure">
<div class="gear-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_equipUp04">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_equipDown04">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="number" name="attr_equipMass04" min="0" step="0.1" tabindex="139"/>
</div>
<div class="subitem-tab-gear-flex-container-equipment">
<input type="text" name="attr_equipText05" maxlength="30" tabindex="140"/>
<div class="gear-mover-plus-minus-enclosure">
<div class="gear-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_equipUp05">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_equipDown05">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="number" name="attr_equipMass05" min="0" step="0.1" tabindex="141"/>
</div>
<div class="subitem-tab-gear-flex-container-equipment">
<input type="text" name="attr_equipText06" maxlength="30" tabindex="142"/>
<div class="gear-mover-plus-minus-enclosure">
<div class="gear-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_equipUp06">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_equipDown06">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="number" name="attr_equipMass06" min="0" step="0.1" tabindex="143"/>
</div>
<div class="subitem-tab-gear-flex-container-equipment">
<input type="text" name="attr_equipText07" maxlength="30" tabindex="144"/>
<div class="gear-mover-plus-minus-enclosure">
<div class="gear-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_equipUp07">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_equipDown07">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="number" name="attr_equipMass07" min="0" step="0.1" tabindex="145"/>
</div>
<div class="subitem-tab-gear-flex-container-equipment">
<input type="text" name="attr_equipText08" maxlength="30" tabindex="146"/>
<div class="gear-mover-plus-minus-enclosure">
<div class="gear-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_equipUp08">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_equipDown08">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="number" name="attr_equipMass08" min="0" step="0.1" tabindex="147"/>
</div>
<div class="subitem-tab-gear-flex-container-equipment">
<input type="text" name="attr_equipText09" maxlength="30" tabindex="148"/>
<div class="gear-mover-plus-minus-enclosure">
<div class="gear-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_equipUp09">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_equipDown09">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="number" name="attr_equipMass09" min="0" step="0.1" tabindex="149"/>
</div>
<div class="subitem-tab-gear-flex-container-equipment">
<input type="text" name="attr_equipText10" maxlength="30" tabindex="150"/>
<div class="gear-mover-plus-minus-enclosure">
<div class="gear-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_equipUp10">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_equipDown10">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="number" name="attr_equipMass10" min="0" step="0.1" tabindex="151"/>
</div>
<div class="subitem-tab-gear-flex-container-equipment">
<input type="text" name="attr_equipText11" maxlength="30" tabindex="152"/>
<div class="gear-mover-plus-minus-enclosure">
<div class="gear-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_equipUp11">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_equipDown11">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="number" name="attr_equipMass11" min="0" step="0.1" tabindex="153"/>
</div>
<div class="subitem-tab-gear-flex-container-equipment">
<input type="text" name="attr_equipText12" maxlength="30" tabindex="154"/>
<div class="gear-mover-plus-minus-enclosure">
<div class="gear-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_equipUp12">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_equipDown12">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="number" name="attr_equipMass12" min="0" step="0.1" tabindex="155"/>
</div>
<div class="subitem-tab-gear-flex-container-equipment">
<input type="text" name="attr_equipText13" maxlength="30" tabindex="156"/>
<div class="gear-mover-plus-minus-enclosure">
<div class="gear-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_equipUp13">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_equipDown13">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="number" name="attr_equipMass13" min="0" step="0.1"/ tabindex="157"/>
</div>
<div class="subitem-tab-gear-flex-container-equipment">
<input type="text" name="attr_equipText14" maxlength="30" tabindex="158"/>
<div class="gear-mover-plus-minus-enclosure">
<div class="gear-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_equipUp14">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_equipDown14">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="number" name="attr_equipMass14" min="0" step="0.1" tabindex="159"/>
</div>
<div class="subitem-tab-gear-flex-container-equipment">
<input type="text" name="attr_equipText15" maxlength="30" tabindex="160"/>
<div class="gear-mover-plus-minus-enclosure">
<div class="gear-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_equipUp15">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_equipDown15">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="number" name="attr_equipMass15" min="0" step="0.1" tabindex="161"/>
</div>
<div class="subitem-tab-gear-flex-container-equipment">
<input type="text" name="attr_equipText16" maxlength="30" tabindex="162"/>
<div class="gear-mover-plus-minus-enclosure">
<div class="gear-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_equipUp16">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_equipDown16">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="number" name="attr_equipMass16" min="0" step="0.1" tabindex="163"/>
</div>
</div>
<!-- Tab Gear Health Status -->
<div class="item-gear-health">
<h2>BODY</h2>
<div class="item-health-stat">
<input type="text" name="attr_gearCurrentBODY" value="10" maxlength="3" pattern="[0-9]+" tabindex="-1"/>
<div class="item-health-stat-plus-minus-enclosure ">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_gearCurrentBODYplus">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_gearCurrentBODYminus">
<span>&#10094;</span>
</button>
</div>
</div>
<h2>STUN</h2>
<div class="item-health-stat">
<input type="text" name="attr_gearCurrentSTUN" value="20" maxlength="3" pattern="[0-9]+" tabindex="-1"/>
<div class="item-health-stat-plus-minus-enclosure ">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_gearCurrentSTUNplus">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_gearCurrentSTUNminus">
<span>&#10094;</span>
</button>
</div>
</div>
<h2>END</h2>
<div class="item-health-stat">
<input type="text" name="attr_gearCurrentEND" value="20" maxlength="3" pattern="[0-9]+" tabindex="-1"/>
<div class="item-health-stat-plus-minus-enclosure ">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_gearCurrentENDplus">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_gearCurrentENDminus">
<span>&#10094;</span>
</button>
</div>
</div>
<button type="action" class="button buttonRecover" tabindex="-1" name="act_gearRecoverHealth">Recover</button>
<button type="action" class="button buttonReset" tabindex="-1" name="act_gearResetHealth">Reset</button>
</div>
<!-- Maneuvers Container -->
<div class="item-tab-gear-slide-container">
<input type="hidden" class="item-gear-slideshow" name="attr_gearSlideSelection" value="1" min="1" step="1" max="4"/>
<input type="hidden" name="attr_totalNumberOfGearSlides" value="4"/>
<div class="item-tab-gear-slide-flex-container-maneuvers">
<!-- Slide showing basic Hero combat maneuvers a flex container for rows of flex columns -->
<div class="subitem-tab-gear-slide-flex-container-maneuvers-heading">
<h1>Maneuver</h1>
<h1>Phase</h1>
<h1>OCV</h1>
<h1>DCV</h1>
<h1>Effects</h1>
</div>
<div class="subitem-tab-gear-slide-flex-container-maneuvers-light-row">
<h1>Block</h1>
<h2>1/2</h2>
<h2>+0</h2>
<h2>+0</h2>
<h2>Block, Abort</h2>
</div>
<div class="subitem-tab-gear-slide-flex-container-maneuvers-light-row">
<h1>Brace</h1>
<h2>0</h2>
<h2>+2</h2>
<h2>1/2</h2>
<h2>+2 OCV vs. Range Mod.</h2>
</div>
<div class="subitem-tab-gear-slide-flex-container-maneuvers-light-row">
<h1>Disarm</h1>
<h2>1/2</h2>
<h2>-2</h2>
<h2>+0</h2>
<h2>Strength vs Strength</h2>
</div>
<div class="subitem-tab-gear-slide-flex-container-maneuvers-dark-row">
<h1>Dodge</h1>
<h2>1/2</h2>
<h2></h2>
<h2>+3</h2>
<h2>Abort, vs. all attacks</h2>
</div>
<div class="subitem-tab-gear-slide-flex-container-maneuvers-dark-row">
<h1>Grab</h1>
<h2>1/2</h2>
<h2>-1*</h2>
<h2>-2*</h2>
<h2>Grab two limbs</h2>
</div>
<div class="subitem-tab-gear-slide-flex-container-maneuvers-dark-row">
<h1>Grab By</h1>
<h2>1/2</h2>
<h2>-3</h2>
<h2>-4</h2>
<h2>Move, grab, +v/10 STR</h2>
</div>
<div class="subitem-tab-gear-slide-flex-container-maneuvers-light-row">
<h1>Haymaker</h1>
<h2>1/2*</h2>
<h2>+0</h2>
<h2>-5</h2>
<h2>+4 DC to attack</h2>
</div>
<div class="subitem-tab-gear-slide-flex-container-maneuvers-light-row">
<h1>Move By</h1>
<h2>1/2</h2>
<h2>-2</h2>
<h2>-2</h2>
<h2>STR/2 +v/10; take 1/3</h2>
</div>
<div class="subitem-tab-gear-slide-flex-container-maneuvers-light-row">
<h1>Move Through</h1>
<h2>1/2</h2>
<h2>-v/10</h2>
<h2>-3</h2>
<h2>STR+v/6; take 1/2 or full</h2>
</div>
<div class="subitem-tab-gear-slide-flex-container-maneuvers-dark-row">
<h1>Multiple Attack</h1>
<h2>1</h2>
<h2>var.</h2>
<h2>1/2</h2>
<h2>Attack multiple times</h2>
</div>
<div class="subitem-tab-gear-slide-flex-container-maneuvers-dark-row">
<h1>Set</h1>
<h2>1</h2>
<h2>+1*</h2>
<h2>+0</h2>
<h2>Ranged attacks. May Brace</h2>
</div>
<div class="subitem-tab-gear-slide-flex-container-maneuvers-dark-row">
<h1>Shove</h1>
<h2>1/2</h2>
<h2>-1</h2>
<h2>-1</h2>
<h2>Push 1m per 5 STR</h2>
</div>
<div class="subitem-tab-gear-slide-flex-container-maneuvers-light-row">
<h1>Strike</h1>
<h2>1/2</h2>
<h2>+0</h2>
<h2>+0</h2>
<h2>Damage by STR or weapon</h2>
</div>
<div class="subitem-tab-gear-slide-flex-container-maneuvers-light-row">
<h1>Throw</h1>
<h2>1/2</h2>
<h2>+0</h2>
<h2>+0</h2>
<h2>Throw with STR damage</h2>
</div>
<div class="subitem-tab-gear-slide-flex-container-maneuvers-light-row">
<h1>Trip</h1>
<h2>1/2</h2>
<h2>-1</h2>
<h2>-2</h2>
<h2>Knock target prone</h2>
</div>
</div>
<div class="item-tab-gear-slide-flex-container-martial-maneuvers">
<!-- Slide showing special martial arts maneuvers. Entries need to be supplied by the user. -->
<div class="subitem-tab-gear-slide-flex-container-martial-maneuvers-heading">
<h1>Martial Maneuver</h1>
<h1>Phase</h1>
<h1>OCV</h1>
<h1>DCV</h1>
<h1>Effects</h1>
</div>
<div class="item-tab-gear-slide-flex-container-martial-maneuvers-block">
<div class="subitem-tab-gear-slide-flex-container-martial-maneuvers-row">
<div class="subitem-tab-gear-slide-flex-container-martial-name-and-points">
<input type="text" value="" maxlength="24" name="attr_martialManeuverName01" tabindex="164"/>
<div class="subitem-tab-gear-slide-flex-container-martial-name-and-points-row">
<h1>CP:</h1>
<input type="number" value="0" min="0" step="1" name="attr_martialManeuverCP01" tabindex="165"/>
<button type="roll" class="button buttonRollShow" tabindex="-1" name="roll_showMartialRoll01" value="&{template:custom-show} {{title=@{character_name} - @{character_title}}} {{subtitle= Martial Maneuver - @{martialManeuverName01}}} {{Phases=@{martialManeuverPhase01}}} {{OCV = @{martialManeuverOCV01}}} {{DCV = @{martialManeuverDCV01}}} {{desc=@{martialManeuverEffect01}}}">Show</button>
</div>
</div>
<input type="text" value="1/2" name="attr_martialManeuverPhase01" tabindex="166"/>
<input type="text" value="+0" name="attr_martialManeuverOCV01" tabindex="167"/>
<input type="text" value="+0" name="attr_martialManeuverDCV01" tabindex="168"/>
<textarea value="" name="attr_martialManeuverEffect01" tabindex="169"/>
</div>
<div class="subitem-tab-gear-slide-flex-container-martial-maneuvers-row">
<div class="subitem-tab-gear-slide-flex-container-martial-name-and-points">
<input type="text" value="" maxlength="24" name="attr_martialManeuverName02" tabindex="170"/>
<div class="subitem-tab-gear-slide-flex-container-martial-name-and-points-row">
<h1>CP:</h1>
<input type="number" value="0" min="0" step="1" name="attr_martialManeuverCP02" tabindex="171"/>
<button type="roll" class="button buttonRollShow" tabindex="-1" name="roll_showMartialRoll02" value="&{template:custom-show} {{title=@{character_name} - @{character_title}}} {{subtitle= Martial Maneuver - @{martialManeuverName02}}} {{Phases=@{martialManeuverPhase02}}} {{OCV = @{martialManeuverOCV02}}} {{DCV = @{martialManeuverDCV02}}} {{desc=@{martialManeuverEffect02}}}">Show</button>
</div>
</div>
<input type="text" value="1/2" name="attr_martialManeuverPhase02" tabindex="172"/>
<input type="text" value="+0" name="attr_martialManeuverOCV02" tabindex="173"/>
<input type="text" value="+0" name="attr_martialManeuverDCV02" tabindex="174"/>
<textarea value="" name="attr_martialManeuverEffect02" tabindex="175"/>
</div>
<div class="subitem-tab-gear-slide-flex-container-martial-maneuvers-row">
<div class="subitem-tab-gear-slide-flex-container-martial-name-and-points">
<input type="text" value="" maxlength="24" name="attr_martialManeuverName03" tabindex="176"/>
<div class="subitem-tab-gear-slide-flex-container-martial-name-and-points-row">
<h1>CP:</h1>
<input type="number" value="0" min="0" step="1" name="attr_martialManeuverCP03" tabindex="177"/>
<button type="roll" class="button buttonRollShow" tabindex="-1" name="roll_showMartialRoll03" value="&{template:custom-show} {{title=@{character_name} - @{character_title}}} {{subtitle= Martial Maneuver - @{martialManeuverName03}}} {{Phases=@{martialManeuverPhase03}}} {{OCV = @{martialManeuverOCV03}}} {{DCV = @{martialManeuverDCV03}}} {{desc=@{martialManeuverEffect03}}}">Show</button>
</div>
</div>
<input type="text" value="1/2" name="attr_martialManeuverPhase03" tabindex="178"/>
<input type="text" value="+0" name="attr_martialManeuverOCV03" tabindex="179"/>
<input type="text" value="+0" name="attr_martialManeuverDCV03" tabindex="180"/>
<textarea value="" name="attr_martialManeuverEffect03" tabindex="181"/>
</div>
<div class="subitem-tab-gear-slide-flex-container-martial-maneuvers-row">
<div class="subitem-tab-gear-slide-flex-container-martial-name-and-points">
<input type="text" value="" maxlength="24" name="attr_martialManeuverName04" tabindex="182"/>
<div class="subitem-tab-gear-slide-flex-container-martial-name-and-points-row">
<h1>CP:</h1>
<input type="number" value="0" min="0" step="1" name="attr_martialManeuverCP04"tabindex="183"/>
<button type="roll" class="button buttonRollShow" tabindex="-1" name="roll_showMartialRoll04" value="&{template:custom-show} {{title=@{character_name} - @{character_title}}} {{subtitle= Martial Maneuver - @{martialManeuverName04}}} {{Phases=@{martialManeuverPhase04}}} {{OCV = @{martialManeuverOCV04}}} {{DCV = @{martialManeuverDCV04}}} {{desc=@{martialManeuverEffect04}}}">Show</button>
</div>
</div>
<input type="text" value="1/2" name="attr_martialManeuverPhase04" tabindex="184"/>
<input type="text" value="+0" name="attr_martialManeuverOCV04" tabindex="185"/>
<input type="text" value="+0" name="attr_martialManeuverDCV04" tabindex="186"/>
<textarea value="" name="attr_martialManeuverEffect04" tabindex="187"/>
</div>
<div class="subitem-tab-gear-slide-flex-container-martial-maneuvers-row">
<div class="subitem-tab-gear-slide-flex-container-martial-name-and-points">
<input type="text" value="" maxlength="24" name="attr_martialManeuverName05" tabindex="188"/>
<div class="subitem-tab-gear-slide-flex-container-martial-name-and-points-row">
<h1>CP:</h1>
<input type="number" value="0" min="0" step="1" name="attr_martialManeuverCP05" tabindex="189"/>
<button type="roll" class="button buttonRollShow" tabindex="-1" name="roll_showMartialRoll05" value="&{template:custom-show} {{title=@{character_name} - @{character_title}}} {{subtitle= Martial Maneuver - @{martialManeuverName05}}} {{Phases=@{martialManeuverPhase05}}} {{OCV = @{martialManeuverOCV05}}} {{DCV = @{martialManeuverDCV05}}} {{desc=@{martialManeuverEffect05}}}">Show</button>
</div>
</div>
<input type="text" value="1/2" name="attr_martialManeuverPhase05" tabindex="190"/>
<input type="text" value="+0" name="attr_martialManeuverOCV05" tabindex="191"/>
<input type="text" value="+0" name="attr_martialManeuverDCV05" tabindex="192"/>
<textarea value="" name="attr_martialManeuverEffect05" tabindex="193"/>
</div>
<div class="subitem-tab-gear-slide-flex-container-martial-maneuvers-row">
<div class="subitem-tab-gear-slide-flex-container-martial-name-and-points">
<input type="text" value="" maxlength="24" name="attr_martialManeuverName06" tabindex="194"/>
<div class="subitem-tab-gear-slide-flex-container-martial-name-and-points-row">
<h1>CP:</h1>
<input type="number" value="0" min="0" step="1" name="attr_martialManeuverCP06" tabindex="195"/>
<button type="roll" class="button buttonRollShow" tabindex="-1" name="roll_showMartialRoll06" value="&{template:custom-show} {{title=@{character_name} - @{character_title}}} {{subtitle= Martial Maneuver - @{martialManeuverName06}}} {{Phases=@{martialManeuverPhase06}}} {{OCV = @{martialManeuverOCV06}}} {{DCV = @{martialManeuverDCV06}}} {{desc=@{martialManeuverEffect06}}}">Show</button>
</div>
</div>
<input type="text" value="1/2" name="attr_martialManeuverPhase06" tabindex="196"/>
<input type="text" value="+0" name="attr_martialManeuverOCV06" tabindex="197"/>
<input type="text" value="+0" name="attr_martialManeuverDCV06" tabindex="198"/>
<textarea value="" name="attr_martialManeuverEffect06" tabindex="199"/>
</div>
</div>
<div class="subitem-tab-gear-slide-flex-container-standard-attack">
<h1>Basic Attack</h1>
<span><button type="action" class="button buttonRollNormalAttack" tabindex="-1" name="act_standardAttackRoll">Roll</button></span>
<h2>1/2</h2>
<h2>+0</h2>
<h2>+0</h2>
<h2>Normal damage STR/5</h2>
</div>
<!-- Range Modifier Table -->
<div class="subitem-tab-gear-slide-flex-container-range-modifiers">
<div class="subitem-tab-gear-slide-range-modifier-container-first">
<h2>Range (m)</h2>
<h2>OCV Mod:</h2>
</div>
<div class="subitem-tab-gear-slide-range-modifier-container">
<h2>0-8</h2>
<h2>0</h2>
</div>
<div class="subitem-tab-gear-slide-range-modifier-container">
<h2>9-16</h2>
<h2>-2</h2>
</div>
<div class="subitem-tab-gear-slide-range-modifier-container">
<h2>17-32</h2>
<h2>-4</h2>
</div>
<div class="subitem-tab-gear-slide-range-modifier-container">
<h2>33-64</h2>
<h2>-6</h2>
</div>
<div class="subitem-tab-gear-slide-range-modifier-container">
<h2>65-125</h2>
<h2>-8</h2>
</div>
<div class="subitem-tab-gear-slide-range-modifier-container">
<h2>126-250</h2>
<h2>-10</h2>
</div>
</div>
</div>
<div class="item-tab-gear-slide-flex-container-hit-locations">
<div class="item-gear-slide-container-hit-locations-flex-row">
<!-- Special target locations -->
<div class="item-gear-slide-flex-container-hit-locations-special">
<div class="subitem-gear-slide-flex-container-hit-locations-special-heading">
<h1>Target</h1>
<h1>Roll</h1>
<h1>Location</h1>
<h1>OCV</h1>
</div>
<div class="subitem-gear-slide-flex-container-hit-locations-special-top-row">
<label class="custom-radio-button-container">
<input type="radio" name="attr_targetSelection" value="1" checked>
<span class="custom-radio-button"></span>
</label>
<h1>3d6</h1>
<h1>Any</h1>
<h1>0</h1>
</div>
<div class="subitem-gear-slide-flex-container-hit-locations-special-middle-row">
<label class="custom-radio-button-container">
<input type="radio" name="attr_targetSelection" value="12">
<span class="custom-radio-button"></span>
</label>
<h1>1d6+3</h1>
<h1>Head Shot</h1>
<h1>-4</h1>
</div>
<div class="subitem-gear-slide-flex-container-hit-locations-special-middle-row">
<label class="custom-radio-button-container">
<input type="radio" name="attr_targetSelection" value="13">
<span class="custom-radio-button"></span>
</label>
<h1>2d6+1</h1>
<h1>High Shot</h1>
<h1>-2</h1>
</div>
<div class="subitem-gear-slide-flex-container-hit-locations-special-middle-row">
<label class="custom-radio-button-container">
<input type="radio" name="attr_targetSelection" value="14">
<span class="custom-radio-button"></span>
</label>
<h1>2d6+4</h1>
<h1>Body Shot</h1>
<h1>-1</h1>
</div>
<div class="subitem-gear-slide-flex-container-hit-locations-special-middle-row">
<label class="custom-radio-button-container">
<input type="radio" name="attr_targetSelection" value="15">
<span class="custom-radio-button"></span>
</label>
<h1>2d6+7</h1>
<h1>Low Shot</h1>
<h1>-2</h1>
</div>
<div class="subitem-gear-slide-flex-container-hit-locations-special-bottom-row">
<label class="custom-radio-button-container">
<input type="radio" name="attr_targetSelection" value="16">
<span class="custom-radio-button"></span>
</label>
<h1>1d6+12</h1>
<h1>Leg Shot</h1>
<h1>-4</h1>
</div>
</div>
<!-- Targeting Options -->
<div class="item-gear-slide-container-hit-locations-options">
<div class="subitem-gear-slide-container-hit-locations-options-top">
<label class="container-checkbox-small-gray">
<input type="checkbox" name="attr_halveTargetOCVpenalty">
<span class="checkmark-small-gray"></span>
</label>
<h1>Half Penalty</h1>
</div>
<div class="subitem-gear-slide-container-hit-locations-options-bottom">
<h1>Apply PSL</h1>
<input type="number" name="attr_penaltySkillLevels" value="0" min="0" step="1" tabindex="200"/>
</div>
</div>
</div>
<!-- Standard Hit Location Table -->
<div class="item-gear-slide-container-hit-locations-table">
<div class="subitem-gear-slide-container-hit-locations-table-heading">
<h1>Target</h1>
<h1>Roll</h1>
<h1>Location</h1>
<h1>STUNx</h1>
<h1>N STUN</h1>
<h1>BODYx</h1>
<h1>OCV</h1>
</div>
<div class="subitem-gear-slide-container-hit-locations-table-top-row">
<label class="custom-radio-button-container">
<input type="radio" name="attr_targetSelection" value="2">
<span class="custom-radio-button"></span>
</label>
<h1>3-5</h1>
<h1>Head</h1>
<h1>x5</h1>
<h1>x2</h1>
<h1>x2</h1>
<h1>-8</h1>
</div>
<div class="subitem-gear-slide-container-hit-locations-table-middle-row">
<label class="custom-radio-button-container">
<input type="radio" name="attr_targetSelection" value="3">
<span class="custom-radio-button"></span>
</label>
<h1>6</h1>
<h1>Hands</h1>
<h1>x1</h1>
<h1>x1/2</h1>
<h1>x1/2</h1>
<h1>-6</h1>
</div>
<div class="subitem-gear-slide-container-hit-locations-table-middle-row">
<label class="custom-radio-button-container">
<input type="radio" name="attr_targetSelection" value="4">
<span class="custom-radio-button"></span>
</label>
<h1>7-8</h1>
<h1>Arms</h1>
<h1>x2</h1>
<h1>x1/2</h1>
<h1>x1/2</h1>
<h1>-5</h1>
</div>
<div class="subitem-gear-slide-container-hit-locations-table-middle-row">
<label class="custom-radio-button-container">
<input type="radio" name="attr_targetSelection" value="5">
<span class="custom-radio-button"></span>
</label>
<h1>9</h1>
<h1>Shoulders</h1>
<h1>x3</h1>
<h1>x1</h1>
<h1>x1</h1>
<h1>-5</h1>
</div>
<div class="subitem-gear-slide-container-hit-locations-table-middle-row">
<label class="custom-radio-button-container">
<input type="radio" name="attr_targetSelection" value="6">
<span class="custom-radio-button"></span>
</label>
<h1>10-11</h1>
<h1>Chest</h1>
<h1>x3</h1>
<h1>x1</h1>
<h1>x1</h1>
<h1>-3</h1>
</div>
<div class="subitem-gear-slide-container-hit-locations-table-middle-row">
<label class="custom-radio-button-container">
<input type="radio" name="attr_targetSelection" value="7">
<span class="custom-radio-button"></span>
</label>
<h1>12</h1>
<h1>Stomach</h1>
<h1>x4</h1>
<h1>x3/2</h1>
<h1>x1</h1>
<h1>-7</h1>
</div>
<div class="subitem-gear-slide-container-hit-locations-table-middle-row">
<label class="custom-radio-button-container">
<input type="radio" name="attr_targetSelection" value="8">
<span class="custom-radio-button"></span>
</label>
<h1>13</h1>
<h1>Vitals</h1>
<h1>x4</h1>
<h1>x3/2</h1>
<h1>x2</h1>
<h1>-8</h1>
</div>
<div class="subitem-gear-slide-container-hit-locations-table-middle-row">
<label class="custom-radio-button-container">
<input type="radio" name="attr_targetSelection" value="9">
<span class="custom-radio-button"></span>
</label>
<h1>14</h1>
<h1>Thighs</h1>
<h1>x2</h1>
<h1>x1</h1>
<h1>x1</h1>
<h1>-4</h1>
</div>
<div class="subitem-gear-slide-container-hit-locations-table-middle-row">
<label class="custom-radio-button-container">
<input type="radio" name="attr_targetSelection" value="10">
<span class="custom-radio-button"></span>
</label>
<h1>15-16</h1>
<h1>Legs</h1>
<h1>x2</h1>
<h1>x1/2</h1>
<h1>x1/2</h1>
<h1>-6</h1>
</div>
<div class="subitem-gear-slide-container-hit-locations-table-bottom-row">
<label class="custom-radio-button-container">
<input type="radio" name="attr_targetSelection" value="11">
<span class="custom-radio-button"></span>
</label>
<h1>17-18</h1>
<h1>Feet</h1>
<h1>x1</h1>
<h1>x1/2</h1>
<h1>x1/2</h1>
<h1>-8</h1>
</div>
</div>
</div>
<!-- Slide for text -->
<div class="item-tab-gear-slide-treasure-text">
<textarea name="attr_treasures" maxlength="4096" tabindex="201"></textarea>
</div>
<button type="action" name="act_left-gear-arrow-button" tabindex="-1" class="button button-left-arrow">&#10094;</button>
<button type="action" name="act_right-gear-arrow-button" tabindex="-1" class="button button-right-arrow">&#10095;</button>
</div>
</div>
</div>
<!-- --------------------------------------------------------------------------------- -->
<!-- Skills tab -->
<!-- --------------------------------------------------------------------------------- -->
<div class="sheet-skills">
<div class="grid-container-skills-tab">
<div class="item-skillsTab-flex-container-skills-group01">
<!-- Left side skills heading -->
<div class="subitem-skillsTab-grid-container-skills-heading-left">
<div class="subitem-skillsTab-grid-container-skills-heading-left-name">
<h1>Skill</h1>
</div>
<div class="subitem-skillsTab-grid-container-skills-heading-left-type">
<h1>Type</h1>
</div>
<div class="subitem-skillsTab-grid-container-skills-heading-left-roll">
<h1>Roll</h1>
</div>
<div class="subitem-skillsTab-grid-container-skills-heading-left-cost">
<h1>CP</h1>
</div>
</div>
<!-- Skill 01 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName01" maxlength="20" tabindex="300"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp01">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown01">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-alternate-skill">
<select name="attr_skillType01">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance01" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill01" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName01}}} {{Base Chance = [[@{skillRollChance01}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}">Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP01" tabindex="301"/>
</div>
<!-- Skill 02 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName02" maxlength="20" tabindex="302"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp02">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown02">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType02">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance02" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill02" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName02}}} {{Base Chance = [[@{skillRollChance02}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP02" tabindex="303"/>
</div>
<!-- Skill 03 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName03" maxlength="20" tabindex="304"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp03">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown03">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType03">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance03" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill03" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName03}}} {{Base Chance = [[@{skillRollChance03}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP03" tabindex="305"/>
</div>
<!-- Skill 04 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName04" maxlength="20" tabindex="306"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp04">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown04">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType04">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance04" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill04" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName04}}} {{Base Chance = [[@{skillRollChance04}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP04" tabindex="307"/>
</div>
<!-- Skill 05 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName05" maxlength="20" tabindex="308"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp05">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown05">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-alternate-skill">
<select name="attr_skillType05">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance05" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill05" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName05}}} {{Base Chance = [[@{skillRollChance05}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP05" tabindex="309"/>
</div>
<!-- Skill 06 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName06" maxlength="20" tabindex="310"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp06">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown06">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType06">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance06" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill06" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName06}}} {{Base Chance = [[@{skillRollChance06}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP06" tabindex="311"/>
</div>
<!-- Skill 07 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName07" maxlength="20" tabindex="312"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp07">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown07">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType07">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance07" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill07" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName07}}} {{Base Chance = [[@{skillRollChance07}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP07" tabindex="313"/>
</div>
<!-- Skill 08 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName08" maxlength="20" tabindex="314"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp08">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown08">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType08">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance08" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill08" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName08}}} {{Base Chance = [[@{skillRollChance08}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP08" tabindex="315"/>
</div>
<!-- Skill 09 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName09" maxlength="20" tabindex="316"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp09">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown09">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType09">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance09" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill09" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName09}}} {{Base Chance = [[@{skillRollChance09}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP09" tabindex="317"/>
</div>
<!-- Skill 10 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName10" maxlength="20" tabindex="318"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp10">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown10">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType10">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance10" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill10" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName10}}} {{Base Chance = [[@{skillRollChance10}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP10" tabindex="319"/>
</div>
</div>
<!-- Skill Group 02-->
<div class="item-skillsTab-flex-container-skills-group02">
<!-- Skill 11 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName11" maxlength="20" tabindex="320"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp11">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown11">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-alternate-skill">
<select name="attr_skillType11">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance11" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill11" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName11}}} {{Base Chance = [[@{skillRollChance11}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP11" tabindex="321"/>
</div>
<!-- Skill 12 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName12" maxlength="20" tabindex="322"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp12">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown12">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType12">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance12" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill12" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName12}}} {{Base Chance = [[@{skillRollChance12}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP12" tabindex="323"/>
</div>
<!-- Skill 13 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName13" maxlength="20" tabindex="324"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp13">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown13">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType13">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance13" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill13" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName13}}} {{Base Chance = [[@{skillRollChance13}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP13" tabindex="325"/>
</div>
<!-- Skill 14 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName14" maxlength="20" tabindex="326"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp14">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown14">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType14">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance14" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill14" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName14}}} {{Base Chance = [[@{skillRollChance14}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP14" tabindex="327"/>
</div>
<!-- Skill 15 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName15" maxlength="20" tabindex="328"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp15">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown15">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-alternate-skill">
<select name="attr_skillType15">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance15" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill15" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName15}}} {{Base Chance = [[@{skillRollChance15}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP15" tabindex="329"/>
</div>
<!-- Skill 16 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName16" maxlength="20" tabindex="330"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp16">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown16">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType16">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance16" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill16" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName16}}} {{Base Chance = [[@{skillRollChance16}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP16" tabindex="331"/>
</div>
<!-- Skill 17 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName17" maxlength="20" tabindex="332"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp17">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown17">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType17">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance17" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill17" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName17}}} {{Base Chance = [[@{skillRollChance17}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP17" tabindex="333"/>
</div>
<!-- Skill 18 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName18" maxlength="20" tabindex="334"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp18">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown18">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType18">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance18" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill18" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName18}}} {{Base Chance = [[@{skillRollChance18}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP18" tabindex="335"/>
</div>
<!-- Skill 19 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName19" maxlength="20" tabindex="336"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp19">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown19">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType19">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance19" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill19" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName19}}} {{Base Chance = [[@{skillRollChance19}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP19" tabindex="337"/>
</div>
<!-- Skill 20 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName20" maxlength="20" tabindex="338"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp20">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown20">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType20">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance20" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill20" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName20}}} {{Base Chance = [[@{skillRollChance20}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP20" tabindex="339"/>
</div>
</div>
<!-- Skill Group 03-->
<div class="item-skillsTab-flex-container-skills-group03">
<!-- Skill 21 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName21" maxlength="20" tabindex="340"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp21">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown21">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-alternate-skill">
<select name="attr_skillType21">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="combat">Combat</option>
<option value="tf">TF</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance21" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill21" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName21}}} {{Base Chance = [[@{skillRollChance21}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP21" tabindex="341"/>
</div>
<!-- Skill 22 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName22" maxlength="20" tabindex="342"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp22">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown22">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType22">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance22" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill22" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName22}}} {{Base Chance = [[@{skillRollChance22}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP22" tabindex="343"/>
</div>
<!-- Skill 23 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName23" maxlength="20" tabindex="344"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp23">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown23">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType23">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance23" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill23" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName23}}} {{Base Chance = [[@{skillRollChance23}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP23" tabindex="345"/>
</div>
<!-- Skill 24 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName24" maxlength="20" tabindex="346"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp24">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown24">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType24">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance24" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill24" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName24}}} {{Base Chance = [[@{skillRollChance24}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP24" tabindex="347"/>
</div>
<!-- Skill 25 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName25" maxlength="20" tabindex="348"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp25">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown25">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-alternate-skill">
<select name="attr_skillType25">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance25" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill25" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName25}}} {{Base Chance = [[@{skillRollChance25}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP25" tabindex="349"/>
</div>
<!-- Skill 26 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName26" maxlength="20" tabindex="350"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp26">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown26">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType26">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance26" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill26" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName26}}} {{Base Chance = [[@{skillRollChance26}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP26" tabindex="351"/>
</div>
<!-- Skill 27 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName27" maxlength="20" tabindex="352"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp27">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown27">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType27">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance27" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill27" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName27}}} {{Base Chance = [[@{skillRollChance27}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP27" tabindex="353"/>
</div>
<!-- Skill 28 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName28" maxlength="20" tabindex="354"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp28">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown28">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType28">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance28" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill28" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName28}}} {{Base Chance = [[@{skillRollChance28}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP28" tabindex="355"/>
</div>
<!-- Skill 29 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName29" maxlength="20" tabindex="356"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp29">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown29">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType29">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance29" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill29" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName29}}} {{Base Chance = [[@{skillRollChance29}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP29" tabindex="357"/>
</div>
<!-- Skill 30 -->
<div class="subitem-skillsTab-flex-container-skill">
<input type="text" value="" name="attr_skillName30" maxlength="20" tabindex="358"/>
<div class="skill-mover-plus-minus-enclosure">
<div class="skill-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_skillUp30">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_skillDown30">
<span>&#10094;</span>
</button>
</div>
</div>
<div class="custom-select-skill">
<select name="attr_skillType30">
<option value="none" selected>-</option>
<option value="str">STR</option>
<option value="dex">DEX</option>
<option value="con">CON</option>
<option value="int">INT</option>
<option value="ego">EGO</option>
<option value="pre">PRE</option>
<option value="ak">AK</option>
<option value="ks">KS</option>
<option value="intKS">KS (INT)</option>
<option value="ps">PS</option>
<option value="intPS">PS (INT)</option>
<option value="dexPS">PS (DEX)</option>
<option value="ss">SS</option>
<option value="intSS">SS (INT)</option>
<option value="tf">TF</option>
<option value="combat">Combat</option>
<option value="other">Other</option>
<option value="group">Group</option>
</select>
</div>
<input type="text" value="0" name="attr_skillRollChance30" readonly tabindex="-1"/>
<button type="roll" class='button buttonRoll' name="roll_testSkill30" tabindex="-1" value="&{template:custom} {{title=@{character_name} - @{character_title} }} {{subtitle= Uses @{skillName30}}} {{Base Chance = [[@{skillRollChance30}+?{Modifiers|0}]] }} {{Roll=[[3d6cf<7cs>0]]}} {{}}" >Roll</button>
<input type="number" value="0" min="0" name="attr_skillCP30" tabindex="359"/>
</div>
</div>
<!-- Combat skills section -->
<div class="item-skillsTab-grid-container-combat-skills">
<!-- Combat skill names -->
<div class="subitem-skillsTab-flex-container-combat-skills-names">
<h1>Combat Skills</h1>
<input type="text" value="" name="attr_skillName31" maxlength="20" tabindex="360"/>
<input type="text" value="" name="attr_skillName32" maxlength="20" tabindex="362"/>
<input type="text" value="" name="attr_skillName33" maxlength="20" tabindex="364"/>
<input type="text" value="" name="attr_skillName34" maxlength="20" tabindex="366"/>
<input type="text" value="" name="attr_skillName35" maxlength="20" tabindex="368"/>
<input type="text" value="" name="attr_skillName36" maxlength="20" tabindex="370"/>
<input type="text" value="" name="attr_skillName37" maxlength="20" tabindex="372"/>
</div>
<div class="subitem-skillsTab-flex-container-combat-skills-level-names">
<h1>All HTH Levels</h1> <!-- skill 38 -->
<h1>All Range Levels</h1> <!-- skill 39 -->
<h1>All Combat Levels</h1> <!-- skill 40 -->
</div>
<!-- Combat skill levels where needed -->
<div class="subitem-skillsTab-flex-container-combat-skills-levels">
<h1>Levels</h1>
<input type="number" value="0" min="0" name="attr_skillLevels31" tabindex="361"/>
<input type="number" value="0" min="0" name="attr_skillLevels32" tabindex="363"/>
<input type="number" value="0" min="0" name="attr_skillLevels33" tabindex="365"/>
<input type="number" value="0" min="0" name="attr_skillLevels34" tabindex="367"/>
<input type="number" value="0" min="0" name="attr_skillLevels35" tabindex="369"/>
<input type="number" value="0" min="0" name="attr_skillLevels36" tabindex="371"/>
<input type="number" value="0" min="0" name="attr_skillLevels37" tabindex="373"/>
<input type="number" value="0" min="0" name="attr_skillLevels38" tabindex="375"/> <!-- All HTH -->
<input type="number" value="0" min="0" name="attr_skillLevels39" tabindex="377"/> <!-- All Range -->
<input type="number" value="0" min="0" name="attr_skillLevels40" tabindex="379"/> <!-- All Combat -->
</div>
<div class="subitem-skillsTab-flex-container-combat-skills-types">
<h1>Type</h1>
<div class="custom-select">
<select name="attr_skillType31">
<option value="none" selected>-</option>
<option value="Fam1" >WF1</option>
<option value="Fam2" >WF2</option>
<option value="CSL2">CSL2</option>
<option value="CSL3">CSL3</option>
<option value="CSL5">CSL5</option>
<option value="CSL8">CSL8</option>
<option value="PSL1">PSL1</option>
<option value="PSL2">PSL2</option>
<option value="PSL3">PSL3</option>
</select>
</div>
<div class="custom-select">
<select name="attr_skillType32">
<option value="none" selected>-</option>
<option value="Fam1" >WF1</option>
<option value="Fam2" >WF2</option>
<option value="CSL2">CSL2</option>
<option value="CSL3">CSL3</option>
<option value="CSL8">CSL8</option>
<option value="CSL5">CSL5</option>
<option value="PSL1">PSL1</option>
<option value="PSL2">PSL2</option>
<option value="PSL3">PSL3</option>
</select>
</div>
<div class="custom-select">
<select name="attr_skillType33">
<option value="none" selected>-</option>
<option value="Fam1" >WF1</option>
<option value="Fam2" >WF2</option>
<option value="CSL2">CSL2</option>
<option value="CSL3">CSL3</option>
<option value="CSL5">CSL5</option>
<option value="CSL8">CSL8</option>
<option value="PSL1">PSL1</option>
<option value="PSL2">PSL2</option>
<option value="PSL3">PSL3</option>
</select>
</div>
<div class="custom-select">
<select name="attr_skillType34">
<option value="none" selected>-</option>
<option value="Fam1" >WF1</option>
<option value="Fam2" >WF2</option>
<option value="CSL2">CSL2</option>
<option value="CSL3">CSL3</option>
<option value="CSL5">CSL5</option>
<option value="CSL8">CSL8</option>
<option value="PSL1">PSL1</option>
<option value="PSL2">PSL2</option>
<option value="PSL3">PSL3</option>
</select>
</div>
<div class="custom-select">
<select name="attr_skillType35">
<option value="none" selected>-</option>
<option value="Fam1" >WF1</option>
<option value="Fam2" >WF2</option>
<option value="CSL2">CSL2</option>
<option value="CSL3">CSL3</option>
<option value="CSL5">CSL5</option>
<option value="CSL8">CSL8</option>
<option value="PSL1">PSL1</option>
<option value="PSL2">PSL2</option>
<option value="PSL3">PSL3</option>
</select>
</div>
<div class="custom-select">
<select name="attr_skillType36">
<option value="none" selected>-</option>
<option value="Fam1" >WF1</option>
<option value="Fam2" >WF2</option>
<option value="CSL2">CSL2</option>
<option value="CSL3">CSL3</option>
<option value="CSL5">CSL5</option>
<option value="CSL8">CSL8</option>
<option value="PSL1">PSL1</option>
<option value="PSL2">PSL2</option>
<option value="PSL3">PSL3</option>
</select>
</div>
<div class="custom-select">
<select name="attr_skillType37">
<option value="none" selected>-</option>
<option value="Fam1" >WF1</option>
<option value="Fam2" >WF2</option>
<option value="CSL2">CSL2</option>
<option value="CSL3">CSL3</option>
<option value="CSL5">CSL5</option>
<option value="CSL8">CSL8</option>
<option value="PSL1">PSL1</option>
<option value="PSL2">PSL2</option>
<option value="PSL3">PSL3</option>
</select>
</div>
<!-- Blank entry for Skill 38 type: All HTH -->
<!-- Blank entry for Skill 39 type: All Range -->
<!-- Blank entry for Skill 40 type: All Combat -->
</div>
<div class="subitem-skillsTab-flex-container-combat-skills-costs">
<h1>CP</h1>
<input type="text" value="0" name="attr_skillCP31" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_skillCP32" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_skillCP33" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_skillCP34" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_skillCP35" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_skillCP36" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_skillCP37" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_skillCP38" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_skillCP39" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_skillCP40" readonly tabindex="-1"/>
</div>
</div>
<!-- Language skills section -->
<div class="item-skillsTab-flex-container-languages">
<!-- Language skills heading -->
<div class="subitem-skillsTab-flex-container-languages-heading">
<div class="subitem-skillsTab-flex-container-languages-heading-name">
<h1>Languages</h1>
</div>
<div class="subitem-skillsTab-flex-container-languages-heading-fluency">
<h1>Fluency</h1>
</div>
<div class="subitem-skillsTab-flex-container-languages-heading-literacy">
<h1>Lit.</h1>
</div>
<div class="subitem-skillsTab-flex-container-languages-heading-cost">
<h1>CP</h1>
</div>
</div>
<!-- Language skill 01 (41 overall) -->
<div class="subitem-skillsTab-flex-container-language">
<input type="text" value="Native Language" name="attr_skillName41" maxlength="23" tabindex="380"/>
<div class="custom-select">
<select name="attr_skillFluency41">
<option value="native" selected >Native</option>
<option value="none">-</option>
<option value="basic" >Basic</option>
<option value="fluent" >Fluent</option>
<option value="accent" >Accent</option>
<option value="idiomatic">Idiomatic</option>
<option value="imitate" >Imitate</option>
</select>
</div>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_skillLiteracy41">
<span class="checkmark-small"></span>
</label>
<input type="text" value="0" name="attr_skillCP41" readonly tabindex="-1"/>
</div>
<!-- Language skill 02 (42 overall) -->
<div class="subitem-skillsTab-flex-container-language">
<input type="text" value="" name="attr_skillName42" maxlength="23" tabindex="381"/>
<div class="custom-select">
<select name="attr_skillFluency42">
<option value="native">Native</option>
<option value="none" selected >-</option>
<option value="basic" >Basic</option>
<option value="fluent" >Fluent</option>
<option value="accent" >Accent</option>
<option value="idiomatic">Idiomatic</option>
<option value="imitate" >Imitate</option>
</select>
</div>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_skillLiteracy42">
<span class="checkmark-small"></span>
</label>
<input type="text" value="0" name="attr_skillCP42" readonly tabindex="-1"/>
</div>
<!-- Language skill 03 (43 overall) -->
<div class="subitem-skillsTab-flex-container-language">
<input type="text" value="" name="attr_skillName43" maxlength="23" tabindex="382"/>
<div class="custom-select">
<select name="attr_skillFluency43">
<option value="native">Native</option>
<option value="none" selected >-</option>
<option value="basic" >Basic</option>
<option value="fluent" >Fluent</option>
<option value="accent" >Accent</option>
<option value="idiomatic">Idiomatic</option>
<option value="imitate" >Imitate</option>
</select>
</div>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_skillLiteracy43">
<span class="checkmark-small"></span>
</label>
<input type="text" value="0" name="attr_skillCP43" readonly tabindex="-1"/>
</div>
<!-- Language skill 04 (44 overall) -->
<div class="subitem-skillsTab-flex-container-language">
<input type="text" value="" name="attr_skillName44" maxlength="23" tabindex="383"/>
<div class="custom-select">
<select name="attr_skillFluency44">
<option value="native">Native</option>
<option value="none" selected >-</option>
<option value="basic" >Basic</option>
<option value="fluent" >Fluent</option>
<option value="accent" >Accent</option>
<option value="idiomatic">Idiomatic</option>
<option value="imitate" >Imitate</option>
</select>
</div>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_skillLiteracy44">
<span class="checkmark-small"></span>
</label>
<input type="text" value="0" name="attr_skillCP44" readonly tabindex="-1"/>
</div>
<!-- Language skill 05 (45 overall) -->
<div class="subitem-skillsTab-flex-container-language">
<input type="text" value="" name="attr_skillName45" maxlength="23" tabindex="384"/>
<div class="custom-select">
<select name="attr_skillFluency45">
<option value="native">Native</option>
<option value="none" selected >-</option>
<option value="basic" >Basic</option>
<option value="fluent" >Fluent</option>
<option value="accent" >Accent</option>
<option value="idiomatic">Idiomatic</option>
<option value="imitate" >Imitate</option>
</select>
</div>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_skillLiteracy45">
<span class="checkmark-small"></span>
</label>
<input type="text" value="0" name="attr_skillCP45" readonly tabindex="-1"/>
</div>
<!-- Language skill 06 (46 overall) -->
<div class="subitem-skillsTab-flex-container-language">
<input type="text" value="" name="attr_skillName46" maxlength="23" tabindex="385"/>
<div class="custom-select">
<select name="attr_skillFluency46">
<option value="native">Native</option>
<option value="none" selected >-</option>
<option value="basic" >Basic</option>
<option value="fluent" >Fluent</option>
<option value="accent" >Accent</option>
<option value="idiomatic">Idiomatic</option>
<option value="imitate" >Imitate</option>
</select>
</div>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_skillLiteracy46">
<span class="checkmark-small"></span>
</label>
<input type="text" value="0" name="attr_skillCP46" readonly tabindex="-1"/>
</div>
<!-- Language skill 07 (47 overall) -->
<div class="subitem-skillsTab-flex-container-language">
<input type="text" value="" name="attr_skillName47" maxlength="23" tabindex="386"/>
<div class="custom-select">
<select name="attr_skillFluency47">
<option value="native">Native</option>
<option value="none" selected >-</option>
<option value="basic" >Basic</option>
<option value="fluent" >Fluent</option>
<option value="accent" >Accent</option>
<option value="idiomatic">Idiomatic</option>
<option value="imitate" >Imitate</option>
</select>
</div>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_skillLiteracy47">
<span class="checkmark-small"></span>
</label>
<input type="text" value="0" name="attr_skillCP47" readonly tabindex="-1"/>
</div>
<!-- Language skill 08 (48 overall) -->
<div class="subitem-skillsTab-flex-container-language">
<input type="text" value="" name="attr_skillName48" maxlength="23" tabindex="387"/>
<div class="custom-select">
<select name="attr_skillFluency48">
<option value="native">Native</option>
<option value="none" selected >-</option>
<option value="basic" >Basic</option>
<option value="fluent" >Fluent</option>
<option value="accent" >Accent</option>
<option value="idiomatic">Idiomatic</option>
<option value="imitate" >Imitate</option>
</select>
</div>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_skillLiteracy48">
<span class="checkmark-small"></span>
</label>
<input type="text" value="0" name="attr_skillCP48" readonly tabindex="-1"/>
</div>
<!-- Language skill 09 (49 overall) -->
<div class="subitem-skillsTab-flex-container-language">
<input type="text" value="" name="attr_skillName49" maxlength="23" tabindex="388"/>
<div class="custom-select">
<select name="attr_skillFluency49">
<option value="native">Native</option>
<option value="none" selected >-</option>
<option value="basic" >Basic</option>
<option value="fluent" >Fluent</option>
<option value="accent" >Accent</option>
<option value="idiomatic">Idiomatic</option>
<option value="imitate" >Imitate</option>
</select>
</div>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_skillLiteracy49">
<span class="checkmark-small"></span>
</label>
<input type="text" value="0" name="attr_skillCP49" readonly tabindex="-1"/>
</div>
</div>
<!-- Enhancers and Levels -->
<div class="item-skillsTab-grid-container-skill-enhancers">
<!-- Enhancer Heading -->
<div class="subitem-skillsTab-flex-container-skill-enhancers-heading">
<h1>Enhancer</h1>
<h1>CP</h1>
</div>
<!-- Enhancer Checkboxes -->
<div class="subitem-skillsTab-flex-container-skill-enhancers-checkboxes">
<label class="container-checkbox-small">
<input type="checkbox" name="attr_enhancerJack">
<span class="checkmark-small"></span>
</label>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_enhancerLing">
<span class="checkmark-small"></span>
</label>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_enhancerSch">
<span class="checkmark-small"></span>
</label>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_enhancerSci">
<span class="checkmark-small"></span>
</label>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_enhancerTrav">
<span class="checkmark-small"></span>
</label>
<label class="container-checkbox-small">
<input type="checkbox" name="attr_enhancerWell">
<span class="checkmark-small"></span>
</label>
</div>
<!-- Skill Names -->
<div class="subitem-skillsTab-flex-container-skill-enhancers-names">
<h1>Jack of all Trades</h1>
<h1>Linguist</h1>
<h1>Scholar</h1>
<h1>Scientist</h1>
<h1>Traveler</h1>
<h1>Well-Connected</h1>
<h1>Interaction Skill Levels</h1>
<h1>Intellect Skill Levels</h1>
<h1>Agility Skill Levels</h1>
<h1>Non-combat Skill Levels</h1>
<h1>Overall Levels</h1>
</div>
<!-- Skill Levels -->
<div class="subitem-skillsTab-flex-container-skill-enhancers-levels">
<input type="number" name="attr_interactionLevels" min="0" value="0" tabindex="390"/>
<input type="number" name="attr_intellectLevels" min="0" value="0" tabindex="391"/>
<input type="number" name="attr_agilityLevels" min="0" value="0" tabindex="392"/>
<input type="number" name="attr_noncombatLevels" min="0" value="0" tabindex="393"/>
<input type="number" name="attr_overallLevels" min="0" value="0" tabindex="394"/>
</div>
<!-- Skill Costs -->
<div class="subitem-skillsTab-flex-container-skill-enhancers-costs">
<input type="text" value="0" name="attr_enhancerJackCP" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_enhancerLingCP" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_enhancerSchCP" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_enhancerSciCP" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_enhancerTravCP" readonly tabindex="-1"/>
<input type="text" value="0" name="attr_enhancerWellCP" readonly tabindex="-1"/>
<input type="text" name="attr_interactionLevelsCP" value="0" readonly tabindex="-1"/>
<input type="text" name="attr_intellectLevelsCP" value="0" readonly tabindex="-1"/>
<input type="text" name="attr_agilityLevelsCP" value="0" readonly tabindex="-1"/>
<input type="text" name="attr_noncombatLevelsCP" value="0" readonly tabindex="-1"/>
<input type="text" name="attr_overallLevelsCP" value="0" readonly tabindex="-1"/>
</div>
</div>
</div>
</div>
<!-- --------------------------------------------------------------------------------- -->
<!-- Powers tab -->
<!-- --------------------------------------------------------------------------------- -->
<div class="sheet-powers">
<div class="grid-container-powers">
<!-- Left side powers -->
<div class="flex-container-powers-left">
<!-- Power 01 -->
<div class="item-flex-power">
<div class="subitem-flex-power-heading-left">
<div class="power-mover-plus-minus-enclosure">
<div class="power-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_powerUp01">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_powerDown01">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" value="" name="attr_powerName01" maxlength="35" tabindex="400"/>
<div class="custom-select">
<select name="attr_powerType01">
<option value="single" selected>Single Power</option>
<option value="multipower">Multipower</option>
<option value="variableSlot">Variable Slot</option>
<option value="fixedSlot">Fixed Slot</option>
<option value="powerPool">Power Pool</option>
<option value="compound">Compound</option>
<option value="unified">Unified</option>
</select>
</div>
<input type="text" name="attr_powerEND01" value="0" readonly tabindex="-1"/>
<button type="action" class="button button-Power-END-left" tabindex="-1" name="act_buttonPowerEND01" tabindex="-1">END</button>
</div>
<div class="subitem-flex-power-effect-left">
<input type="text" name="attr_powerEffect01" maxlength="25" tabindex="401"/>
<input type="text" name="attr_powerDice01" value="0d6" maxlength="16" tabindex="402"/>
<h1>Roll:</h1>
<input type="number" name="attr_powerSkillRoll01" value="18" min="0" max="30" tabindex="403"/>
<button type="action" class="button buttonRollPower" tabindex="-1" name="act_powerRoll01">Roll</button>
</div>
<div class="subitem-flex-power-active-cost-left">
<h1>Base CP:</h1>
<input type="number" name="attr_powerBaseCost01" min="0" value="0" tabindex="404"/>
<h1>Active CP:</h1>
<input type="text" name="attr_powerActiveCost01" value="0" readonly tabindex="-1"/>
<h1>Real CP:</h1>
<input type="text" name="attr_powerCP01" value="0" readonly tabindex="-1"/>
</div>
<div class="subitem-flex-power-limitations-left">
<h1>Adv:</h1>
<input type="number" name="attr_powerAdvantages01" min="0" value="0" step="0.25" tabindex="405"/>
<h1>Lim:</h1>
<input type="number" name="attr_powerLimitations01" min="0" value="0" step="0.25" tabindex="406"/>
<h1>END:</h1>
<div class="custom-select">
<select name="attr_powerReducedEND01">
<option value="noEND">None</option>
<option value="costsENDhalf">Costs END (half)</option>
<option value="costsENDfull">Costs END (full)</option>
<option value="zeroENDAF">Zero (AF)</option>
<option value="zeroEND">Zero</option>
<option value="reducedENDAF">Reduced (AF)</option>
<option value="reducedEND">Reduced</option>
<option value="standardEND" selected>Standard</option>
<option value="increasedENDx2">Increase x2</option>
<option value="increasedENDx3">Increase x3</option>
<option value="increasedENDx4">Increase x4</option>
<option value="increasedENDx5">Increase x5</option>
<option value="increasedENDx6">Increase x6</option>
<option value="increasedENDx7">Increase x7</option>
<option value="increasedENDx8">Increase x8</option>
<option value="increasedENDx9">Increase x9</option>
<option value="increasedENDx10">Increase x10</option>
</select>
</div>
</div>
<textarea name="attr_powerText01" maxlength="512" tabindex="407"></textarea>
</div>
<!-- Power 02 -->
<div class="item-flex-power">
<div class="subitem-flex-power-heading-left">
<div class="power-mover-plus-minus-enclosure">
<div class="power-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_powerUp02">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_powerDown02">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" value="" name="attr_powerName02" maxlength="35" tabindex="410"/>
<div class="custom-select">
<select name="attr_powerType02">
<option value="single" selected>Single Power</option>
<option value="multipower">Multipower</option>
<option value="variableSlot">Variable Slot</option>
<option value="fixedSlot">Fixed Slot</option>
<option value="powerPool">Power Pool</option>
<option value="compound">Compound</option>
<option value="unified">Unified</option>
</select>
</div>
<input type="text" name="attr_powerEND02" value="0" readonly tabindex="-1"/>
<button type="action" class="button button-Power-END-left" tabindex="-1" name="act_buttonPowerEND02">END</button>
</div>
<div class="subitem-flex-power-effect-left">
<input type="text" name="attr_powerEffect02" maxlength="25" tabindex="411"/>
<input type="text" name="attr_powerDice02" value="0d6" maxlength="16" tabindex="412"/>
<h1>Roll:</h1>
<input type="number" name="attr_powerSkillRoll02" value="18" min="0" max="30" tabindex="413"/>
<button type="action" class="button buttonRollPower" tabindex="-1" name="act_powerRoll02">Roll</button>
</div>
<div class="subitem-flex-power-active-cost-left">
<h1>Base CP:</h1>
<input type="number" name="attr_powerBaseCost02" min="0" value="0" tabindex="414"/>
<h1>Active CP:</h1>
<input type="text" name="attr_powerActiveCost02" value="0" readonly tabindex="-1"/>
<h1>Real CP:</h1>
<input type="text" name="attr_powerCP02" value="0" readonly tabindex="-1"/>
</div>
<div class="subitem-flex-power-limitations-left">
<h1>Adv:</h1>
<input type="number" name="attr_powerAdvantages02" min="0" value="0" step="0.25" tabindex="415"/>
<h1>Lim:</h1>
<input type="number" name="attr_powerLimitations02" min="0" value="0" step="0.25" tabindex="416"/>
<h1>END:</h1>
<div class="custom-select">
<select name="attr_powerReducedEND02">
<option value="noEND">None</option>
<option value="costsENDhalf">Costs END (half)</option>
<option value="costsENDfull">Costs END (full)</option>
<option value="zeroENDAF">Zero (AF)</option>
<option value="zeroEND">Zero</option>
<option value="reducedENDAF">Reduced (AF)</option>
<option value="reducedEND">Reduced</option>
<option value="standardEND" selected>Standard</option>
<option value="increasedENDx2">Increase x2</option>
<option value="increasedENDx3">Increase x3</option>
<option value="increasedENDx4">Increase x4</option>
<option value="increasedENDx5">Increase x5</option>
<option value="increasedENDx6">Increase x6</option>
<option value="increasedENDx7">Increase x7</option>
<option value="increasedENDx8">Increase x8</option>
<option value="increasedENDx9">Increase x9</option>
<option value="increasedENDx10">Increase x10</option>
</select>
</div>
</div>
<textarea name="attr_powerText02" maxlength="512" tabindex="417"></textarea>
</div>
<!-- Power 03 -->
<div class="item-flex-power">
<div class="subitem-flex-power-heading-left">
<div class="power-mover-plus-minus-enclosure">
<div class="power-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_powerUp03">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_powerDown03">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" value="" name="attr_powerName03" maxlength="35" tabindex="420"/>
<div class="custom-select">
<select name="attr_powerType03">
<option value="single" selected>Single Power</option>
<option value="multipower">Multipower</option>
<option value="variableSlot">Variable Slot</option>
<option value="fixedSlot">Fixed Slot</option>
<option value="powerPool">Power Pool</option>
<option value="compound">Compound</option>
<option value="unified">Unified</option>
</select>
</div>
<input type="text" name="attr_powerEND03" value="0" readonly tabindex="-1"/>
<button type="action" class="button button-Power-END-left" tabindex="-1" name="act_buttonPowerEND03">END</button>
</div>
<div class="subitem-flex-power-effect-left">
<input type="text" name="attr_powerEffect03" maxlength="25" tabindex="421"/>
<input type="text" name="attr_powerDice03" value="0d6" maxlength="16" tabindex="422"/>
<h1>Roll:</h1>
<input type="number" name="attr_powerSkillRoll03" value="18" min="0" max="30" tabindex="423"/>
<button type="action" class="button buttonRollPower" tabindex="-1" name="act_powerRoll03">Roll</button>
</div>
<div class="subitem-flex-power-active-cost-left">
<h1>Base CP:</h1>
<input type="number" name="attr_powerBaseCost03" min="0" value="0" tabindex="424"/>
<h1>Active CP:</h1>
<input type="text" name="attr_powerActiveCost03" value="0" readonly tabindex="-1"/>
<h1>Real CP:</h1>
<input type="text" name="attr_powerCP03" value="0" readonly tabindex="-1"/>
</div>
<div class="subitem-flex-power-limitations-left">
<h1>Adv:</h1>
<input type="number" name="attr_powerAdvantages03" min="0" value="0" step="0.25" tabindex="425"/>
<h1>Lim:</h1>
<input type="number" name="attr_powerLimitations03" min="0" value="0" step="0.25" tabindex="426"/>
<h1>END:</h1>
<div class="custom-select">
<select name="attr_powerReducedEND03">
<option value="noEND">None</option>
<option value="costsENDhalf">Costs END (half)</option>
<option value="costsENDfull">Costs END (full)</option>
<option value="zeroENDAF">Zero (AF)</option>
<option value="zeroEND">Zero</option>
<option value="reducedENDAF">Reduced (AF)</option>
<option value="reducedEND">Reduced</option>
<option value="standardEND" selected>Standard</option>
<option value="increasedENDx2">Increase x2</option>
<option value="increasedENDx3">Increase x3</option>
<option value="increasedENDx4">Increase x4</option>
<option value="increasedENDx5">Increase x5</option>
<option value="increasedENDx6">Increase x6</option>
<option value="increasedENDx7">Increase x7</option>
<option value="increasedENDx8">Increase x8</option>
<option value="increasedENDx9">Increase x9</option>
<option value="increasedENDx10">Increase x10</option>
</select>
</div>
</div>
<textarea name="attr_powerText03" maxlength="512" tabindex="427"></textarea>
</div>
<!-- Power 04 -->
<div class="item-flex-power">
<div class="subitem-flex-power-heading-left">
<div class="power-mover-plus-minus-enclosure">
<div class="power-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_powerUp04">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_powerDown04">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" value="" name="attr_powerName04" maxlength="35" tabindex="430"/>
<div class="custom-select">
<select name="attr_powerType04">
<option value="single" selected>Single Power</option>
<option value="multipower">Multipower</option>
<option value="variableSlot">Variable Slot</option>
<option value="fixedSlot">Fixed Slot</option>
<option value="powerPool">Power Pool</option>
<option value="compound">Compound</option>
<option value="unified">Unified</option>
</select>
</div>
<input type="text" name="attr_powerEND04" value="0" readonly tabindex="-1"/>
<button type="action" class="button button-Power-END-left" tabindex="-1" name="act_buttonPowerEND04">END</button>
</div>
<div class="subitem-flex-power-effect-left">
<input type="text" name="attr_powerEffect04" maxlength="25" tabindex="431"/>
<input type="text" name="attr_powerDice04" value="0d6" maxlength="16" tabindex="432"/>
<h1>Roll:</h1>
<input type="number" name="attr_powerSkillRoll04" value="18" min="0" max="30" tabindex="433"/>
<button type="action" class="button buttonRollPower" tabindex="-1" name="act_powerRoll04">Roll</button>
</div>
<div class="subitem-flex-power-active-cost-left">
<h1>Base CP:</h1>
<input type="number" name="attr_powerBaseCost04" min="0" value="0" tabindex="434"/>
<h1>Active CP:</h1>
<input type="text" name="attr_powerActiveCost04" value="0" readonly tabindex="-1"/>
<h1>Real CP:</h1>
<input type="text" name="attr_powerCP04" value="0" readonly tabindex="-1"/>
</div>
<div class="subitem-flex-power-limitations-left">
<h1>Adv:</h1>
<input type="number" name="attr_powerAdvantages04" min="0" value="0" step="0.25" tabindex="435"/>
<h1>Lim:</h1>
<input type="number" name="attr_powerLimitations04" min="0" value="0" step="0.25" tabindex="436"/>
<h1>END:</h1>
<div class="custom-select">
<select name="attr_powerReducedEND04">
<option value="noEND">None</option>
<option value="costsENDhalf">Costs END (half)</option>
<option value="costsENDfull">Costs END (full)</option>
<option value="zeroENDAF">Zero (AF)</option>
<option value="zeroEND">Zero</option>
<option value="reducedENDAF">Reduced (AF)</option>
<option value="reducedEND">Reduced</option>
<option value="standardEND" selected>Standard</option>
<option value="increasedENDx2">Increase x2</option>
<option value="increasedENDx3">Increase x3</option>
<option value="increasedENDx4">Increase x4</option>
<option value="increasedENDx5">Increase x5</option>
<option value="increasedENDx6">Increase x6</option>
<option value="increasedENDx7">Increase x7</option>
<option value="increasedENDx8">Increase x8</option>
<option value="increasedENDx9">Increase x9</option>
<option value="increasedENDx10">Increase x10</option>
</select>
</div>
</div>
<textarea name="attr_powerText04" maxlength="512" tabindex="437"></textarea>
</div>
<!-- Power 05 -->
<div class="item-flex-power">
<div class="subitem-flex-power-heading-left">
<div class="power-mover-plus-minus-enclosure">
<div class="power-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_powerUp05">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_powerDown05">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" value="" name="attr_powerName05" maxlength="35" tabindex="440"/>
<div class="custom-select">
<select name="attr_powerType05">
<option value="single" selected>Single Power</option>
<option value="multipower">Multipower</option>
<option value="variableSlot">Variable Slot</option>
<option value="fixedSlot">Fixed Slot</option>
<option value="powerPool">Power Pool</option>
<option value="compound">Compound</option>
<option value="unified">Unified</option>
</select>
</div>
<input type="text" name="attr_powerEND05" value="0" readonly tabindex="-1"/>
<button type="action" class="button button-Power-END-left" tabindex="-1" name="act_buttonPowerEND05">END</button>
</div>
<div class="subitem-flex-power-effect-left">
<input type="text" name="attr_powerEffect05" maxlength="25" tabindex="441"/>
<input type="text" name="attr_powerDice05" value="0d6" maxlength="16" tabindex="442"/>
<h1>Roll:</h1>
<input type="number" name="attr_powerSkillRoll05" value="18" min="0" max="30" tabindex="443"/>
<button type="action" class="button buttonRollPower" tabindex="-1" name="act_powerRoll05">Roll</button>
</div>
<div class="subitem-flex-power-active-cost-left">
<h1>Base CP:</h1>
<input type="number" name="attr_powerBaseCost05" min="0" value="0" tabindex="444"/>
<h1>Active CP:</h1>
<input type="text" name="attr_powerActiveCost05" value="0" readonly tabindex="-1"/>
<h1>Real CP:</h1>
<input type="text" name="attr_powerCP05" value="0" readonly tabindex="-1"/>
</div>
<div class="subitem-flex-power-limitations-left">
<h1>Adv:</h1>
<input type="number" name="attr_powerAdvantages05" min="0" value="0" step="0.25" tabindex="445"/>
<h1>Lim:</h1>
<input type="number" name="attr_powerLimitations05" min="0" value="0" step="0.25" tabindex="446"/>
<h1>END:</h1>
<div class="custom-select">
<select name="attr_powerReducedEND05">
<option value="noEND">None</option>
<option value="costsENDhalf">Costs END (half)</option>
<option value="costsENDfull">Costs END (full)</option>
<option value="zeroENDAF">Zero (AF)</option>
<option value="zeroEND">Zero</option>
<option value="reducedENDAF">Reduced (AF)</option>
<option value="reducedEND">Reduced</option>
<option value="standardEND" selected>Standard</option>
<option value="increasedENDx2">Increase x2</option>
<option value="increasedENDx3">Increase x3</option>
<option value="increasedENDx4">Increase x4</option>
<option value="increasedENDx5">Increase x5</option>
<option value="increasedENDx6">Increase x6</option>
<option value="increasedENDx7">Increase x7</option>
<option value="increasedENDx8">Increase x8</option>
<option value="increasedENDx9">Increase x9</option>
<option value="increasedENDx10">Increase x10</option>
</select>
</div>
</div>
<textarea name="attr_powerText05" maxlength="512" tabindex="447"></textarea>
</div>
</div>
<!-- Right side powers -->
<div class="flex-container-powers-right">
<!-- Power 06 -->
<div class="item-flex-power">
<div class="subitem-flex-power-heading-right">
<div class="power-mover-plus-minus-enclosure">
<div class="power-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_powerUp06">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_powerDown06">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" value="" name="attr_powerName06" maxlength="35" tabindex="450"/>
<div class="custom-select-alternate">
<select name="attr_powerType06">
<option value="single" selected>Single Power</option>
<option value="multipower">Multipower</option>
<option value="variableSlot">Variable Slot</option>
<option value="fixedSlot">Fixed Slot</option>
<option value="powerPool">Power Pool</option>
<option value="compound">Compound</option>
<option value="unified">Unified</option>
</select>
</div>
<input type="text" name="attr_powerEND06" value="0" readonly tabindex="-1"/>
<button type="action" class="button button-Power-END-right" tabindex="-1" name="act_buttonPowerEND06">END</button>
</div>
<div class="subitem-flex-power-effect-right">
<input type="text" name="attr_powerEffect06" maxlength="25" tabindex="451"/>
<input type="text" name="attr_powerDice06" value="0d6" maxlength="16" tabindex="452"/>
<h1>Roll:</h1>
<input type="number" name="attr_powerSkillRoll06" value="18" min="0" max="30" tabindex="453"/>
<button type="action" class="button buttonRollPower" tabindex="-1" name="act_powerRoll06">Roll</button>
</div>
<div class="subitem-flex-power-active-cost-right">
<h1>Base CP:</h1>
<input type="number" name="attr_powerBaseCost06" min="0" value="0" tabindex="454"/>
<h1>Active CP:</h1>
<input type="text" name="attr_powerActiveCost06" value="0" readonly tabindex="-1"/>
<h1>Real CP:</h1>
<input type="text" name="attr_powerCP06" value="0" readonly tabindex="-1"/>
</div>
<div class="subitem-flex-power-limitations-right">
<h1>Adv:</h1>
<input type="number" name="attr_powerAdvantages06" min="0" value="0" step="0.25" tabindex="455"/>
<h1>Lim:</h1>
<input type="number" name="attr_powerLimitations06" min="0" value="0" step="0.25" tabindex="456"/>
<h1>END:</h1>
<div class="custom-select-alternate">
<select name="attr_powerReducedEND06">
<option value="noEND">None</option>
<option value="costsENDhalf">Costs END (half)</option>
<option value="costsENDfull">Costs END (full)</option>
<option value="zeroENDAF">Zero (AF)</option>
<option value="zeroEND">Zero</option>
<option value="reducedENDAF">Reduced (AF)</option>
<option value="reducedEND">Reduced</option>
<option value="standardEND" selected>Standard</option>
<option value="increasedENDx2">Increase x2</option>
<option value="increasedENDx3">Increase x3</option>
<option value="increasedENDx4">Increase x4</option>
<option value="increasedENDx5">Increase x5</option>
<option value="increasedENDx6">Increase x6</option>
<option value="increasedENDx7">Increase x7</option>
<option value="increasedENDx8">Increase x8</option>
<option value="increasedENDx9">Increase x9</option>
<option value="increasedENDx10">Increase x10</option>
</select>
</div>
</div>
<textarea name="attr_powerText06" maxlength="512" tabindex="457"></textarea>
</div>
<!-- Power 07 -->
<div class="item-flex-power">
<div class="subitem-flex-power-heading-right">
<div class="power-mover-plus-minus-enclosure">
<div class="power-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_powerUp07">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_powerDown07">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" value="" name="attr_powerName07" maxlength="35" tabindex="460"/>
<div class="custom-select-alternate">
<select name="attr_powerType07">
<option value="single" selected>Single Power</option>
<option value="multipower">Multipower</option>
<option value="variableSlot">Variable Slot</option>
<option value="fixedSlot">Fixed Slot</option>
<option value="powerPool">Power Pool</option>
<option value="compound">Compound</option>
<option value="unified">Unified</option>
</select>
</div>
<input type="text" name="attr_powerEND07" value="0" readonly tabindex="-1"/>
<button type="action" class="button button-Power-END-right" tabindex="-1" name="act_buttonPowerEND07">END</button>
</div>
<div class="subitem-flex-power-effect-right">
<input type="text" name="attr_powerEffect07" maxlength="25" tabindex="461"/>
<input type="text" name="attr_powerDice07" value="0d6" maxlength="16" tabindex="462"/>
<h1>Roll:</h1>
<input type="number" name="attr_powerSkillRoll07" value="18" min="0" max="30" tabindex="463"/>
<button type="action" class="button buttonRollPower" tabindex="-1" name="act_powerRoll07">Roll</button>
</div>
<div class="subitem-flex-power-active-cost-right">
<h1>Base CP:</h1>
<input type="number" name="attr_powerBaseCost07" min="0" value="0" tabindex="464"/>
<h1>Active CP:</h1>
<input type="text" name="attr_powerActiveCost07" value="0" readonly tabindex="-1"/>
<h1>Real CP:</h1>
<input type="text" name="attr_powerCP07" value="0" readonly tabindex="-1"/>
</div>
<div class="subitem-flex-power-limitations-right">
<h1>Adv:</h1>
<input type="number" name="attr_powerAdvantages07" min="0" value="0" step="0.25" tabindex="465"/>
<h1>Lim:</h1>
<input type="number" name="attr_powerLimitations07" min="0" value="0" step="0.25" tabindex="466"/>
<h1>END:</h1>
<div class="custom-select-alternate">
<select name="attr_powerReducedEND07">
<option value="noEND">None</option>
<option value="costsENDhalf">Costs END (half)</option>
<option value="costsENDfull">Costs END (full)</option>
<option value="zeroENDAF">Zero (AF)</option>
<option value="zeroEND">Zero</option>
<option value="reducedENDAF">Reduced (AF)</option>
<option value="reducedEND">Reduced</option>
<option value="standardEND" selected>Standard</option>
<option value="increasedENDx2">Increase x2</option>
<option value="increasedENDx3">Increase x3</option>
<option value="increasedENDx4">Increase x4</option>
<option value="increasedENDx5">Increase x5</option>
<option value="increasedENDx6">Increase x6</option>
<option value="increasedENDx7">Increase x7</option>
<option value="increasedENDx8">Increase x8</option>
<option value="increasedENDx9">Increase x9</option>
<option value="increasedENDx10">Increase x10</option>
</select>
</div>
</div>
<textarea name="attr_powerText07" maxlength="512" tabindex="467"></textarea>
</div>
<!-- Power 08 -->
<div class="item-flex-power">
<div class="subitem-flex-power-heading-right">
<div class="power-mover-plus-minus-enclosure">
<div class="power-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_powerUp08">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_powerDown08">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" value="" name="attr_powerName08" maxlength="35" tabindex="470"/>
<div class="custom-select-alternate">
<select name="attr_powerType08">
<option value="single" selected>Single Power</option>
<option value="multipower">Multipower</option>
<option value="variableSlot">Variable Slot</option>
<option value="fixedSlot">Fixed Slot</option>
<option value="powerPool">Power Pool</option>
<option value="compound">Compound</option>
<option value="unified">Unified</option>
</select>
</div>
<input type="text" name="attr_powerEND08" value="0" readonly tabindex="-1"/>
<button type="action" class="button button-Power-END-right" tabindex="-1" name="act_buttonPowerEND08">END</button>
</div>
<div class="subitem-flex-power-effect-right">
<input type="text" name="attr_powerEffect08" maxlength="25" tabindex="471"/>
<input type="text" name="attr_powerDice08" value="0d6" maxlength="16" tabindex="472"/>
<h1>Roll:</h1>
<input type="number" name="attr_powerSkillRoll08" value="18" min="0" max="30" tabindex="473"/>
<button type="action" class="button buttonRollPower" tabindex="-1" name="act_powerRoll08">Roll</button>
</div>
<div class="subitem-flex-power-active-cost-right">
<h1>Base CP:</h1>
<input type="number" name="attr_powerBaseCost08" min="0" value="0" tabindex="474"/>
<h1>Active CP:</h1>
<input type="text" name="attr_powerActiveCost08" value="0" readonly tabindex="-1"/>
<h1>Real CP:</h1>
<input type="text" name="attr_powerCP08" value="0" readonly tabindex="-1"/>
</div>
<div class="subitem-flex-power-limitations-right">
<h1>Adv:</h1>
<input type="number" name="attr_powerAdvantages08" min="0" value="0" step="0.25" tabindex="475"/>
<h1>Lim:</h1>
<input type="number" name="attr_powerLimitations08" min="0" value="0" step="0.25" tabindex="476"/>
<h1>END:</h1>
<div class="custom-select-alternate">
<select name="attr_powerReducedEND08">
<option value="noEND">None</option>
<option value="costsENDhalf">Costs END (half)</option>
<option value="costsENDfull">Costs END (full)</option>
<option value="zeroENDAF">Zero (AF)</option>
<option value="zeroEND">Zero</option>
<option value="reducedENDAF">Reduced (AF)</option>
<option value="reducedEND">Reduced</option>
<option value="standardEND" selected>Standard</option>
<option value="increasedENDx2">Increase x2</option>
<option value="increasedENDx3">Increase x3</option>
<option value="increasedENDx4">Increase x4</option>
<option value="increasedENDx5">Increase x5</option>
<option value="increasedENDx6">Increase x6</option>
<option value="increasedENDx7">Increase x7</option>
<option value="increasedENDx8">Increase x8</option>
<option value="increasedENDx9">Increase x9</option>
<option value="increasedENDx10">Increase x10</option>
</select>
</div>
</div>
<textarea name="attr_powerText08" maxlength="512" tabindex="477"></textarea>
</div>
<!-- Power 09 -->
<div class="item-flex-power">
<div class="subitem-flex-power-heading-right">
<div class="power-mover-plus-minus-enclosure">
<div class="power-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_powerUp09">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_powerDown09">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" value="" name="attr_powerName09" maxlength="35" tabindex="480"/>
<div class="custom-select-alternate">
<select name="attr_powerType09">
<option value="single" selected>Single Power</option>
<option value="multipower">Multipower</option>
<option value="variableSlot">Variable Slot</option>
<option value="fixedSlot">Fixed Slot</option>
<option value="powerPool">Power Pool</option>
<option value="compound">Compound</option>
<option value="unified">Unified</option>
</select>
</div>
<input type="text" name="attr_powerEND09" value="0" readonly tabindex="-1"/>
<button type="action" class="button button-Power-END-right" tabindex="-1" name="act_buttonPowerEND09">END</button>
</div>
<div class="subitem-flex-power-effect-right">
<input type="text" name="attr_powerEffect09" maxlength="25" tabindex="481"/>
<input type="text" name="attr_powerDice09" value="0d6" maxlength="16" tabindex="482"/>
<h1>Roll:</h1>
<input type="number" name="attr_powerSkillRoll09" value="18" min="0" max="30" tabindex="483"/>
<button type="action" class="button buttonRollPower" tabindex="-1" name="act_powerRoll09">Roll</button>
</div>
<div class="subitem-flex-power-active-cost-right">
<h1>Base CP:</h1>
<input type="number" name="attr_powerBaseCost09" min="0" value="0" tabindex="484"/>
<h1>Active CP:</h1>
<input type="text" name="attr_powerActiveCost09" value="0" readonly tabindex="-1"/>
<h1>Real CP:</h1>
<input type="text" name="attr_powerCP09" value="0" readonly tabindex="-1"/>
</div>
<div class="subitem-flex-power-limitations-right">
<h1>Adv:</h1>
<input type="number" name="attr_powerAdvantages09" min="0" value="0" step="0.25" tabindex="485"/>
<h1>Lim:</h1>
<input type="number" name="attr_powerLimitations09" min="0" value="0" step="0.25" tabindex="486"/>
<h1>END:</h1>
<div class="custom-select-alternate">
<select name="attr_powerReducedEND09">
<option value="noEND">None</option>
<option value="costsENDhalf">Costs END (half)</option>
<option value="costsENDfull">Costs END (full)</option>
<option value="zeroENDAF">Zero (AF)</option>
<option value="zeroEND">Zero</option>
<option value="reducedENDAF">Reduced (AF)</option>
<option value="reducedEND">Reduced</option>
<option value="standardEND" selected>Standard</option>
<option value="increasedENDx2">Increase x2</option>
<option value="increasedENDx3">Increase x3</option>
<option value="increasedENDx4">Increase x4</option>
<option value="increasedENDx5">Increase x5</option>
<option value="increasedENDx6">Increase x6</option>
<option value="increasedENDx7">Increase x7</option>
<option value="increasedENDx8">Increase x8</option>
<option value="increasedENDx9">Increase x9</option>
<option value="increasedENDx10">Increase x10</option>
</select>
</div>
</div>
<textarea name="attr_powerText09" maxlength="512" tabindex="487"></textarea>
</div>
<!-- Power 10 -->
<div class="item-flex-power">
<div class="subitem-flex-power-heading-right">
<div class="power-mover-plus-minus-enclosure">
<div class="power-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_powerUp10">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_powerDown10">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" value="" name="attr_powerName10" maxlength="35" tabindex="490"/>
<div class="custom-select-alternate">
<select name="attr_powerType10">
<option value="single" selected>Single Power</option>
<option value="multipower">Multipower</option>
<option value="variableSlot">Variable Slot</option>
<option value="fixedSlot">Fixed Slot</option>
<option value="powerPool">Power Pool</option>
<option value="compound">Compound</option>
<option value="unified">Unified</option>
</select>
</div>
<input type="text" name="attr_powerEND10" value="0" readonly tabindex="-1"/>
<button type="action" class="button button-Power-END-right" tabindex="-1" tabindex="-1" name="act_buttonPowerEND10">END</button>
</div>
<div class="subitem-flex-power-effect-right">
<input type="text" name="attr_powerEffect10" maxlength="25" tabindex="491"/>
<input type="text" name="attr_powerDice10" value="0d6" maxlength="16" tabindex="492"/>
<h1>Roll:</h1>
<input type="number" name="attr_powerSkillRoll10" value="18" min="0" max="30" tabindex="493"/>
<button type="action" class="button buttonRollPower" tabindex="-1" name="act_powerRoll10">Roll</button>
</div>
<div class="subitem-flex-power-active-cost-right">
<h1>Base CP:</h1>
<input type="number" name="attr_powerBaseCost10" min="0" value="0" tabindex="494"/>
<h1>Active CP:</h1>
<input type="text" name="attr_powerActiveCost10" value="0" readonly tabindex="-1"/>
<h1>Real CP:</h1>
<input type="text" name="attr_powerCP10" value="0" readonly tabindex="-1"/>
</div>
<div class="subitem-flex-power-limitations-right">
<h1>Adv:</h1>
<input type="number" name="attr_powerAdvantages10" min="0" value="0" step="0.25" tabindex="495"/>
<h1>Lim:</h1>
<input type="number" name="attr_powerLimitations10" min="0" value="0" step="0.25" tabindex="496"/>
<h1>END:</h1>
<div class="custom-select-alternate">
<select name="attr_powerReducedEND10">
<option value="noEND">None</option>
<option value="costsENDhalf">Costs END (half)</option>
<option value="costsENDfull">Costs END (full)</option>
<option value="zeroENDAF">Zero (AF)</option>
<option value="zeroEND">Zero</option>
<option value="reducedENDAF">Reduced (AF)</option>
<option value="reducedEND">Reduced</option>
<option value="standardEND" selected>Standard</option>
<option value="increasedENDx2">Increase x2</option>
<option value="increasedENDx3">Increase x3</option>
<option value="increasedENDx4">Increase x4</option>
<option value="increasedENDx5">Increase x5</option>
<option value="increasedENDx6">Increase x6</option>
<option value="increasedENDx7">Increase x7</option>
<option value="increasedENDx8">Increase x8</option>
<option value="increasedENDx9">Increase x9</option>
<option value="increasedENDx10">Increase x10</option>
</select>
</div>
</div>
<textarea name="attr_powerText10" maxlength="512" tabindex="497"></textarea>
</div>
</div>
</div>
</div>
<!-- --------------------------------------------------------------------------------- -->
<!-- Perks, Talents, and Complications tab -->
<!-- --------------------------------------------------------------------------------- -->
<div class="sheet-complications">
<div class="grid-container-complications-talents">
<!-- Perks and Talents -->
<div class="flex-container-complications-talents-left">
<h2> Perks and Talents</h2>
<!-- Talent 01 -->
<div class="item-talent-heading">
<div class="talent-mover-plus-minus-enclosure">
<div class="talent-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_talentUp01">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_talentDown01">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" name="attr_talentName01" value="" maxlength="32" tabindex="500"/>
<button type="roll" class="button buttonRollShow" tabindex="-1" name="roll_showTalentRoll01" value="&{template:custom-show} {{title=@{character_name} - @{character_title}}} {{subtitle= Perks & Talents - @{talentName01}}} {{desc=@{talentText01}}}">Show</button>
<h1>CP:</h1>
<input type="number" name="attr_talentCP01" value="0" min="0" tabindex="501"/>
</div>
<div class="item-talent-textbox">
<textarea name="attr_talentText01" maxlength="240" tabindex="502"></textarea>
</div>
<!-- Talent 02 -->
<div class="item-talent-heading">
<div class="talent-mover-plus-minus-enclosure">
<div class="talent-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_talentUp02">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_talentDown02">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" name="attr_talentName02" value="" maxlength="32" tabindex="503"/>
<button type="roll" class="button buttonRollShow" tabindex="-1" name="roll_showTalentRoll02" value="&{template:custom-show} {{title=@{character_name} - @{character_title}}} {{subtitle= Perks & Talents - @{talentName02}}} {{desc=@{talentText02}}}">Show</button>
<h1>CP:</h1>
<input type="number" name="attr_talentCP02" value="0" min="0" tabindex="504"/>
</div>
<div class="item-talent-textbox">
<textarea name="attr_talentText02" maxlength="240" tabindex="505"></textarea>
</div>
<!-- Talent 03 -->
<div class="item-talent-heading">
<div class="talent-mover-plus-minus-enclosure">
<div class="talent-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_talentUp03">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_talentDown03">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" name="attr_talentName03" value="" maxlength="32"tabindex="506"/>
<button type="roll" class="button buttonRollShow" tabindex="-1" name="roll_showTalentRoll03" value="&{template:custom-show} {{title=@{character_name} - @{character_title}}} {{subtitle= Perks & Talents - @{talentName03}}} {{desc=@{talentText03}}}">Show</button>
<h1>CP:</h1>
<input type="number" name="attr_talentCP03" value="0" min="0" tabindex="507"/>
</div>
<div class="item-talent-textbox">
<textarea name="attr_talentText03" maxlength="240" tabindex="508"></textarea>
</div>
<!-- Talent 04 -->
<div class="item-talent-heading">
<div class="talent-mover-plus-minus-enclosure">
<div class="talent-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_talentUp04">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_talentDown04">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" name="attr_talentName04" value="" maxlength="32" tabindex="509"/>
<button type="roll" class="button buttonRollShow" tabindex="-1" name="roll_showTalentRoll04" value="&{template:custom-show} {{title=@{character_name} - @{character_title}}} {{subtitle= Perks & Talents - @{talentName04}}} {{desc=@{talentText04}}}">Show</button>
<h1>CP:</h1>
<input type="number" name="attr_talentCP04" value="0" min="0" tabindex="510"/>
</div>
<div class="item-talent-textbox">
<textarea name="attr_talentText04" maxlength="240" tabindex="511"></textarea>
</div>
<!-- Talent 05 -->
<div class="item-talent-heading">
<div class="talent-mover-plus-minus-enclosure">
<div class="talent-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_talentUp05">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_talentDown05">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" name="attr_talentName05" value="" maxlength="32" tabindex="512"/>
<button type="roll" class="button buttonRollShow" tabindex="-1" name="roll_showTalentRoll05" value="&{template:custom-show} {{title=@{character_name} - @{character_title}}} {{subtitle= Perks & Talents - @{talentName05}}} {{desc=@{talentText05}}}">Show</button>
<h1>CP:</h1>
<input type="number" name="attr_talentCP05" value="0" min="0" tabindex="513"/>
</div>
<div class="item-talent-textbox">
<textarea name="attr_talentText05" maxlength="240" tabindex="514"></textarea>
</div>
<!-- Talent 06 -->
<div class="item-talent-heading">
<div class="talent-mover-plus-minus-enclosure">
<div class="talent-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_talentUp06">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_talentDown06">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" name="attr_talentName06" value="" maxlength="32" tabindex="515"/>
<button type="roll" class="button buttonRollShow" tabindex="-1" name="roll_showTalentRoll06" value="&{template:custom-show} {{title=@{character_name} - @{character_title}}} {{subtitle= Perks & Talents - @{talentName06}}} {{desc=@{talentText06}}}">Show</button>
<h1>CP:</h1>
<input type="number" name="attr_talentCP06" value="0" min="0" tabindex="516"/>
</div>
<div class="item-talent-textbox">
<textarea name="attr_talentText06" maxlength="240" tabindex="517"></textarea>
</div>
<!-- Talent 07 -->
<div class="item-talent-heading">
<div class="talent-mover-plus-minus-enclosure">
<div class="talent-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_talentUp07">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_talentDown07">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" name="attr_talentName07" value="" maxlength="32" tabindex="518"/>
<button type="roll" class="button buttonRollShow" tabindex="-1" name="roll_showTalentRoll07" value="&{template:custom-show} {{title=@{character_name} - @{character_title}}} {{subtitle= Perks & Talents - @{talentName07}}} {{desc=@{talentText07}}}">Show</button>
<h1>CP:</h1>
<input type="number" name="attr_talentCP07" value="0" min="0" tabindex="519"/>
</div>
<div class="item-talent-textbox">
<textarea name="attr_talentText07" maxlength="240" tabindex="520"></textarea>
</div>
</div>
<!-- Complications -->
<div class="flex-container-complications-talents-right">
<h2>Complications</h2>
<!-- Complication 01 -->
<div class="item-complication-heading">
<div class="talent-mover-plus-minus-enclosure">
<div class="talent-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_complicationUp01">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_complicationDown01">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" name="attr_complicationName01" value="" maxlength="32" tabindex="530"/>
<button type="roll" class="button buttonRollShow" tabindex="-1" name="roll_showComplicationRoll01" value="&{template:custom-show} {{title=@{character_name} - @{character_title}}} {{subtitle= Complication - @{complicationName01}}} {{desc=@{complicationText01}}}">Show</button>
<h1>CP:</h1>
<input type="number" name="attr_complicationCP01" value="0" min="0" tabindex="531"/>
</div>
<div class="item-complication-textbox">
<textarea name="attr_complicationText01" maxlength="240" tabindex="532"></textarea>
</div>
<!-- Complication 02 -->
<div class="item-complication-heading">
<div class="talent-mover-plus-minus-enclosure">
<div class="talent-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_complicationUp02">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_complicationDown02">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" name="attr_complicationName02" value="" maxlength="32" tabindex="533"/>
<button type="roll" class="button buttonRollShow" tabindex="-1" name="roll_showComplicationRoll02" value="&{template:custom-show} {{title=@{character_name} - @{character_title}}} {{subtitle= Complication - @{complicationName02}}} {{desc=@{complicationText02}}}">Show</button>
<h1>CP:</h1>
<input type="number" name="attr_complicationCP02" value="0" min="0" tabindex="534"/>
</div>
<div class="item-complication-textbox">
<textarea name="attr_complicationText02" maxlength="240" tabindex="535"></textarea>
</div>
<!-- Complication 03 -->
<div class="item-complication-heading">
<div class="talent-mover-plus-minus-enclosure">
<div class="talent-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_complicationUp03">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_complicationDown03">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" name="attr_complicationName03" value="" maxlength="32" tabindex="536"/>
<button type="roll" class="button buttonRollShow" tabindex="-1" name="roll_showComplicationRoll03" value="&{template:custom-show} {{title=@{character_name} - @{character_title}}} {{subtitle= Complication - @{complicationName03}}} {{desc=@{complicationText03}}}">Show</button>
<h1>CP:</h1>
<input type="number" name="attr_complicationCP03" value="0" min="0" tabindex="537"/>
</div>
<div class="item-complication-textbox">
<textarea name="attr_complicationText03" maxlength="240" tabindex="538"></textarea>
</div>
<!-- Complication 04 -->
<div class="item-complication-heading">
<div class="talent-mover-plus-minus-enclosure">
<div class="talent-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_complicationUp04">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_complicationDown04">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" name="attr_complicationName04" value="" maxlength="32" tabindex="539"/>
<button type="roll" class="button buttonRollShow" tabindex="-1" name="roll_showComplicationRoll04" value="&{template:custom-show} {{title=@{character_name} - @{character_title}}} {{subtitle= Complication - @{complicationName04}}} {{desc=@{complicationText04}}}">Show</button>
<h1>CP:</h1>
<input type="number" name="attr_complicationCP04" value="0" min="0" tabindex="540"/>
</div>
<div class="item-complication-textbox">
<textarea name="attr_complicationText04" maxlength="240" tabindex="541"></textarea>
</div>
<!-- Complication 05 -->
<div class="item-complication-heading">
<div class="talent-mover-plus-minus-enclosure">
<div class="talent-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_complicationUp05">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_complicationDown05">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" name="attr_complicationName05" value="" maxlength="32" tabindex="542"/>
<button type="roll" class="button buttonRollShow" tabindex="-1" name="roll_showComplicationRoll05" value="&{template:custom-show} {{title=@{character_name} - @{character_title}}} {{subtitle= Complication - @{complicationName05}}} {{desc=@{complicationText05}}}">Show</button>
<h1>CP:</h1>
<input type="number" name="attr_complicationCP05" value="0" min="0" tabindex="543"/>
</div>
<div class="item-complication-textbox">
<textarea name="attr_complicationText05" maxlength="240" tabindex="544"></textarea>
</div>
<!-- Complication 06 -->
<div class="item-complication-heading">
<div class="talent-mover-plus-minus-enclosure">
<div class="talent-mover-plus-minus-button">
<button type="action" class="button buttonPlus" tabindex="-1" name="act_complicationUp06">
<span>&#10095;</span>
</button>
<button type="action" class="button buttonMinus" tabindex="-1" name="act_complicationDown06">
<span>&#10094;</span>
</button>
</div>
</div>
<input type="text" name="attr_complicationName06" value="" maxlength="32" tabindex="545"/>
<button type="roll" class="button buttonRollShow" tabindex="-1" name="roll_showComplicationRoll06" value="&{template:custom-show} {{title=@{character_name} - @{character_title}}} {{subtitle= Complication - @{complicationName06}}} {{desc=@{complicationText06}}}">Show</button>
<h1>CP:</h1>
<input type="number" name="attr_complicationCP06" value="0" min="0" tabindex="546"/>
</div>
<div class="item-complication-textbox">
<textarea name="attr_complicationText06" maxlength="240" tabindex="547"></textarea>
</div>
</div>
<!-- Complications Notes -->
<div class="flex-container-complications-bottom">
<textarea name="attr_complicationsTextLeft" maxlength="2048" tabindex="548"></textarea>
<textarea name="attr_complicationsTextRight" maxlength="2048" tabindex="549"></textarea>
</div>
</div>
</div>
<!-- --------------------------------------------------------------------------------- -->
<!-- Options tab -->
<!-- --------------------------------------------------------------------------------- -->
<div class="sheet-options">
<div class="grid-container-tab-options">
<div class="item-options">
<div class="item-options-row">
<h1> Options </h1>
</div>
<div class="item-options-row">
<label class="container-checkbox">
<input type="checkbox" name="attr_useCharacteristicMaximums">
<span class="checkmark"></span>
</label>
<h1>Characteristic Maximums</h1>
</div>
<div class="item-options-row">
<label class="container-checkbox">
<input type="checkbox" checked="checked" name="attr_optionLiteracyCostsPoints">
<span class="checkmark"></span>
</label>
<h1>Literacy Costs Character Points</h1>
</div>
<div class="item-options-row">
<label class="container-checkbox">
<input type="checkbox" checked="checked" name="attr_optionAutoSubtractEND">
<span class="checkmark"></span>
</label>
<h1>Attack and Power Buttons Apply END Costs</h1>
</div>
<div class="item-options-row">
<label class="container-checkbox">
<input type="checkbox" name="attr_optionSuperHeroicEndurance">
<span class="checkmark"></span>
</label>
<h1>Super-Heroic Campaign Endurance</h1>
</div>
<div class="item-options-row">
<label class="container-checkbox">
<input type="checkbox" name="attr_optionHitLocationSystem">
<span class="checkmark"></span>
</label>
<h1>Use Hit Location System</h1>
</div>
<div class="item-options-row">
<label class="container-checkbox">
<input type="checkbox" name="attr_optionTakesNoSTUN">
<span class="checkmark"></span>
</label>
<h1>Takes No STUN</h1>
</div>
</div>
</div>
</div>
<!-- --------------------------------------------------------------------------------- -->
<!-- Tally bar that appears below all tabs to keep track of point totals -->
<!-- --------------------------------------------------------------------------------- -->
<div class = "sheet-tallybar">
<div class="sheet-flex-tallybar">
<span>Char:</span>
<span><input class="tally" type="number" value="0" min="0" name=attr_characteristicsCost readonly="true" tabindex="-1"/></span>
<span>Skills:</span>
<span><input class="tally" type="number" value="0" min="0" name=attr_skillsCost readonly="true" tabindex="-1"/></span>
<span>Powers:</span>
<span><input class="tally" type="number" value="0" min="0" name=attr_powersPerksTalentsCost readonly="true" tabindex="-1"/></span>
<span>Complications:</span>
<span><input class="tally" type="number" value="0" min="0" name=attr_complicationsBenefit readonly="true" tabindex="-1"/></span>
<span>Bonus:</span>
<span><input class="tally" type="number" value="0" min="0" name=attr_bonusBenefit tabindex="-1"/></span>
<span>EXP:</span>
<span><input class="tally" type="number" value="0" min="0" name=attr_experienceBenefit tabindex="-1"/></span>
<span>Total:</span>
<span><input class="tally" type="number" value="0" min="0" name=attr_totalCharacterCost readonly="true" tabindex="-1"/></span>
</div>
</div>
<!-- Hidden variables to protect characteristics during option changes -->
<input type="hidden" name="attr_hiddenSTUN" value="20"/>
<!-- Some hidden variables to help simplify skill point calculations -->
<input type="hidden" name="attr_hiddenSet1SkillsCost" value="0"/>
<input type="hidden" name="attr_hiddenSet2SkillsCost" value="0"/>
<input type="hidden" name="attr_hiddenSet3SkillsCost" value="0"/>
<input type="hidden" name="attr_hiddenCombatSkillsCost" value="0"/>
<input type="hidden" name="attr_hiddenLanguageSkillsCost" value="0"/>
<input type="hidden" name="attr_hiddenEnhancerSkillsCost" value="0"/>
<input type="hidden" name="attr_hiddenMartialSkillsCost" value="0"/>
<!-- Hidden variables for clean weapon damage strings -->
<input type="hidden" name="attr_hiddenShieldDamage01" value="0"/>
<input type="hidden" name="attr_hiddenWeaponDamage01" value="0"/>
<input type="hidden" name="attr_hiddenWeaponDamage02" value="0"/>
<input type="hidden" name="attr_hiddenWeaponDamage03" value="0"/>
<input type="hidden" name="attr_hiddenWeaponDamage04" value="0"/>
<input type="hidden" name="attr_hiddenWeaponDamage05" value="0"/>
<input type="hidden" name="attr_hiddenManeuverDamage01" value="2d6"/>
<!-- Hidden variables for clean power dice strings -->
<input type="hidden" name="attr_hiddenPowerDice01" value="0"/>
<input type="hidden" name="attr_hiddenPowerDice02" value="0"/>
<input type="hidden" name="attr_hiddenPowerDice03" value="0"/>
<input type="hidden" name="attr_hiddenPowerDice04" value="0"/>
<input type="hidden" name="attr_hiddenPowerDice05" value="0"/>
<input type="hidden" name="attr_hiddenPowerDice06" value="0"/>
<input type="hidden" name="attr_hiddenPowerDice07" value="0"/>
<input type="hidden" name="attr_hiddenPowerDice08" value="0"/>
<input type="hidden" name="attr_hiddenPowerDice09" value="0"/>
<input type="hidden" name="attr_hiddenPowerDice10" value="0"/>
<!-- Hidden variable for token display -->
<input type="hidden" name="attr_currentDCV" value="0"/>
<!-- Jackob's Roll Template -->
<rolltemplate class="sheet-rolltemplate-custom">
<div class="template-wrapper">
<div class="sheet-container sheet-color-{{color}}">
<div class="sheet-header">
{{#title}}<div class="sheet-title">{{title}}</div>{{/title}}
{{#subtitle}}<div class="sheet-subtitle">{{subtitle}}</div>{{/subtitle}}
</div>
<div class="sheet-content">
{{#allprops() title subtitle desc color}}
<div class="sheet-key">{{key}}</div>
<div class="sheet-value">{{value}}</div>
{{/allprops() title subtitle desc color}}
{{#desc}}<div class="sheet-desc">{{desc}}</div>{{/desc}}
</div>
</div>
</div>
</rolltemplate>
<!-- Jackob's Roll Template for normal damage attacks -->
<!-- Includes row for computed BODY damage using July, 2021 Roll Parsing feature -->
<rolltemplate class="sheet-rolltemplate-custom-normal-attack">
<div class="sheet-template-wrapper">
<div class="sheet-container sheet-color-{{color}}">
<div class="sheet-header">
{{#title}}<div class="sheet-title">{{title}}</div>{{/title}}
{{#subtitle}}<div class="sheet-subtitle">{{subtitle}}</div>{{/subtitle}}
</div>
<div class="sheet-content">
{{#allprops() title subtitle desc color}}
<div class="sheet-key">{{key}}</div>
<div class="sheet-value">{{value}}</div>
{{/allprops() title subtitle desc color}}
{{#desc}}<div class="sheet-desc">{{desc}}</div>{{/desc}}
<!-- Computed result inserted as final row -->
<div class="sheet-key">BODY</div>
<div class="sheet-value">{{computed::STUN}}</div>
</div>
</div>
</div>
</rolltemplate>
<!-- Jackob's Roll Template for killing damage attacks -->
<rolltemplate class="sheet-rolltemplate-custom-attack">
<div class="sheet-template-wrapper">
<div class="sheet-container sheet-color-{{color}}">
<div class="sheet-header">
{{#title}}<div class="sheet-title">{{title}}</div>{{/title}}
{{#subtitle}}<div class="sheet-subtitle">{{subtitle}}</div>{{/subtitle}}
</div>
<div class="sheet-content">
{{#allprops() title subtitle desc color}}
<div class="sheet-key">{{key}}</div>
<div class="sheet-value">{{value}}</div>
{{/allprops() title subtitle desc color}}
{{#desc}}<div class="sheet-desc">{{desc}}</div>{{/desc}}
<!-- Computed result inserted as final row -->
<div class="sheet-key">STUN</div>
<div class="sheet-value">{{computed::BODY}}</div>
</div>
</div>
</div>
</rolltemplate>
<!-- Jackob's Roll Template -->
<rolltemplate class="sheet-rolltemplate-custom-activate">
<div class="sheet-template-wrapper">
<div class="sheet-container sheet-color-{{color}}">
<div class="sheet-header">
{{#title}}<div class="sheet-title">{{title}}</div>{{/title}}
{{#subtitle}}<div class="sheet-subtitle">{{subtitle}}</div>{{/subtitle}}
</div>
<div class="sheet-content">
{{#allprops() title subtitle desc color}}
<div class="sheet-key">{{key}}</div>
<div class="sheet-value">{{value}}</div>
{{/allprops() title subtitle desc color}}
{{#desc}}<div class="sheet-desc">{{desc}}</div>{{/desc}}
</div>
</div>
</div>
</rolltemplate>
<!-- Jackob's Roll Template for Powers -->
<rolltemplate class="sheet-rolltemplate-custom-power-attack">
<div class="sheet-template-wrapper">
<div class="sheet-container sheet-color-{{color}}">
<div class="sheet-header">
{{#title}}<div class="sheet-title">{{title}}</div>{{/title}}
{{#subtitle}}<div class="sheet-subtitle">{{subtitle}}</div>{{/subtitle}}
</div>
<div class="sheet-content">
{{#allprops() title subtitle desc color}}
<div class="sheet-key">{{key}}</div>
<div class="sheet-value">{{value}}</div>
{{/allprops() title subtitle desc color}}
{{#desc}}<div class="sheet-desc">{{desc}}</div>{{/desc}}
</div>
</div>
</div>
</rolltemplate>
<!-- Jackob's Roll Template used for showing talents, perks, and complications -->
<rolltemplate class="sheet-rolltemplate-custom-show">
<div class="sheet-template-wrapper">
<div class="sheet-container sheet-color-{{color}}">
<div class="sheet-header">
{{#title}}<div class="sheet-title">{{title}}</div>{{/title}}
{{#subtitle}}<div class="sheet-subtitle">{{subtitle}}</div>{{/subtitle}}
</div>
<div class="sheet-content">
{{#allprops() title subtitle desc color}}
<div class="sheet-key">{{key}}</div>
<div class="sheet-value">{{value}}</div>
{{/allprops() title subtitle desc color}}
{{#desc}}<div class="sheet-desc">{{desc}}</div>{{/desc}}
</div>
</div>
</div>
</rolltemplate>
<!-- --------------------------------------------------------------------------------- -->
<!-- Sheet workers -->
<!-- --------------------------------------------------------------------------------- -->
<script type="text/worker">
// Get the URL to the pseudo attribute attr_character_avatar for use in the Portrait Section.
on("sheet:opened", function() {
getAttrs(["character_avatar"], function(values) {
let theAvatarURL=values.character_avatar;
setAttrs({
theSheetAvatar:theAvatarURL
});
});
});
// Tab buttons
const buttonlist = ["characteristics","skills","powers","complications","gear","options"];
buttonlist.forEach(button => {
on(`clicked:${button}`, function() {
setAttrs({
sheetTab: button
});
});
});
/* ------------------------- */
/* Functions used sheet-wide */
/* ------------------------- */
function heroRoundHigh(theNumber) {
// In the Hero System rounding favors the player. Here where high is good.
let theIntegerPart = Math.floor(theNumber);
let theRemainder = Math.floor(100*(theNumber-theIntegerPart))/100;
if (theRemainder<=0.4) {
return theIntegerPart;
} else {
return theIntegerPart+1;
}
}
function heroRoundLow(theNumber) {
// In the Hero System rounding favors the player. Here where low is good.
let theIntegerPart = Math.floor(theNumber);
let theRemainder = Math.floor(100*(theNumber-theIntegerPart))/100;
if (theRemainder<0.6) {
return theIntegerPart;
} else {
return theIntegerPart+1;
}
}
function calculateRoll(theNumber) {
// Determine basic characteristic and skill roll chance
return heroRoundHigh(9+theNumber/5);
}
/* ------------------------- */
/* Portrait Selection */
/* ------------------------- */
// Demote the portrait slide show.
on("clicked:left-arrow-button", function () {
advancePortrait(-1);
});
// Advance the portrait slide show.
on("clicked:right-arrow-button", function () {
advancePortrait(+1);
});
function advancePortrait(direction) {
getAttrs(["portraitSelection", "totalNumberOfPortraits"], function(values) {
const currentSelection = parseInt(values.portraitSelection)||0;
const minimumSelection = 0;
const maximumSelection = parseInt(values.totalNumberOfPortraits)||1;
let newSelection = currentSelection+direction;
if (newSelection < minimumSelection) {
newSelection = maximumSelection;
}
if (newSelection > maximumSelection) {
newSelection = minimumSelection;
}
setAttrs({
"portraitSelection":newSelection
});
});
}
/* ------------------------- */
/* Gear Slide Selection */
/* ------------------------- */
// Demote the portrait slide show.
on("clicked:left-gear-arrow-button", function () {
advanceGearSlide(-1);
});
// Advance the portrait slide show.
on("clicked:right-gear-arrow-button", function () {
advanceGearSlide(+1);
});
function advanceGearSlide(direction) {
getAttrs(["gearSlideSelection", "totalNumberOfGearSlides"], function(values) {
const currentSelection = parseInt(values.gearSlideSelection)||1;
const minimumSelection = 1;
const maximumSelection = parseInt(values.totalNumberOfGearSlides)||1;
let newSelection = currentSelection+direction;
if (newSelection < minimumSelection) {
newSelection = maximumSelection;
}
if (newSelection > maximumSelection) {
newSelection = minimumSelection;
}
setAttrs({
"gearSlideSelection":newSelection
});
});
}
/* -------------------------------------- */
/* Functions used for health status boxes */
/* -------------------------------------- */
/* Increment and Decrement buttons for Health Fields on Page 1: Characteristics */
// Add 1 to currentBODY
on("clicked:currentBODYplus", function () {
getAttrs(["currentBODY"], function(values) {
const currentValue = parseInt(values.currentBODY)||0;
setAttrs({
"currentBODY":currentValue+1
});
});
});
// Subtract 1 from currentBODY
on("clicked:currentBODYminus", function () {
getAttrs(["currentBODY"], function(values) {
const currentValue = parseInt(values.currentBODY)||0;
setAttrs({
"currentBODY":currentValue-1
});
});
});
// Add 1 to currentSTUN
on("clicked:currentSTUNplus", function () {
getAttrs(["currentSTUN", "optionTakesNoSTUN"], function(values) {
let currentValue = parseInt(values.currentSTUN)||0;
const takesNoSTUN = values.optionTakesNoSTUN;
if (takesNoSTUN != 0) {
currentValue = 0;
} else {
currentValue = currentValue+1;
}
setAttrs({
"currentSTUN":currentValue
});
});
});
// Subtract 1 from currentSTUN
on("clicked:currentSTUNminus", function () {
getAttrs(["currentSTUN", "optionTakesNoSTUN"], function(values) {
let currentValue = parseInt(values.currentSTUN)||0;
const takesNoSTUN = values.optionTakesNoSTUN;
if (takesNoSTUN != 0) {
currentValue = 0;
} else {
currentValue = currentValue-1;
}
setAttrs({
"currentSTUN":currentValue
});
});
});
// Add 1 to currentEND
on("clicked:currentENDplus", function () {
getAttrs(["currentEND"], function(values) {
const currentValue = parseInt(values.currentEND)||0;
if (currentValue < 0) {
// Attempt to correct negative END values.
setAttrs({
"currentEND":0
});
} else {
setAttrs({
"currentEND":currentValue+1
});
}
});
});
// Subtract 1 from currentEND
on("clicked:currentENDminus", function () {
getAttrs(["currentEND"], function(values) {
const currentValue = parseInt(values.currentEND)||0;
if (currentValue > 0) {
setAttrs({
"currentEND":currentValue-1
});
}
});
});
// Subtract X from currentEND.
// Used for power and attack buttons.
function subtractEndurance(enduranceSpent) {
getAttrs(["currentEND"], function(values) {
let currentValue = parseInt(values.currentEND)||0;
currentValue = currentValue - enduranceSpent;
if (currentValue < 0) {
currentValue = 0;
}
setAttrs({
"currentEND":currentValue
});
});
}
/* Increment and Decrement buttons for Health Fields on Page 2: Gear */
// Add 1 to gearCurrentBODY
on("clicked:gearCurrentBODYplus", function () {
getAttrs(["gearCurrentBODY"], function(values) {
const currentValue = parseInt(values.gearCurrentBODY)||0;
setAttrs({
"gearCurrentBODY":currentValue+1
});
});
});
// Subtract 1 from gearCurrentBODY
on("clicked:gearCurrentBODYminus", function () {
getAttrs(["gearCurrentBODY"], function(values) {
const currentValue = parseInt(values.gearCurrentBODY)||0;
setAttrs({
"gearCurrentBODY":currentValue-1
});
});
});
// Add 1 to gearCurrentSTUN
on("clicked:gearCurrentSTUNplus", function () {
getAttrs(["gearCurrentSTUN", "optionTakesNoSTUN"], function(values) {
let currentValue = parseInt(values.gearCurrentSTUN)||0;
const takesNoSTUN = values.optionTakesNoSTUN;
if (takesNoSTUN != 0) {
currentValue = 0;
} else {
currentValue = currentValue +1;
}
setAttrs({
"gearCurrentSTUN":currentValue
});
});
});
// Subtract 1 from gearCurrentSTUN
on("clicked:gearCurrentSTUNminus", function () {
getAttrs(["gearCurrentSTUN", "optionTakesNoSTUN"], function(values) {
let currentValue = parseInt(values.gearCurrentSTUN)||0;
const takesNoSTUN = values.optionTakesNoSTUN;
if (takesNoSTUN != 0) {
currentValue = 0;
} else {
currentValue = currentValue -1;
}
setAttrs({
"gearCurrentSTUN":currentValue
});
});
});
// Add 1 to gearCurrentEND
on("clicked:gearCurrentENDplus", function () {
getAttrs(["gearCurrentEND"], function(values) {
const currentValue = parseInt(values.gearCurrentEND)||0;
if (currentValue < 0) {
// Attempt to correct negative END values.
setAttrs({
"gearCurrentEND":0
});
} else {
setAttrs({
"gearCurrentEND":currentValue+1
});
}
});
});
// Subtract 1 from gearCurrentEND
on("clicked:gearCurrentENDminus", function () {
getAttrs(["gearCurrentEND"], function(values) {
const currentValue = parseInt(values.gearCurrentEND)||0;
if (currentValue > 0) {
setAttrs({
"gearCurrentEND":currentValue-1
});
}
});
});
// Subtract X from gearCurrentEND.
// Used for power and attack buttons.
function subtractGearEndurance(enduranceSpent) {
getAttrs(["gearCurrentEND"], function(values) {
let currentValue = parseInt(values.gearCurrentEND)||0;
currentValue = currentValue - enduranceSpent;
if (currentValue < 0) {
currentValue = 0;
}
setAttrs({
"gearCurrentEND":currentValue
});
});
}
// Reset endurance and stun in item-characteristics-health when the reset action button is clicked.
on("clicked:resetHealth", function () {
applyResetHealth();
});
// Reset endurance and stun when the resect action button in item-gear-health panel is clicked.
on("clicked:gearResetHealth", function () {
applyResetHealth();
});
function applyResetHealth() {
getAttrs(["endurance","stun"], function(values) {
const maxEND = parseInt(values.endurance);
const maxSTUN = parseInt(values.stun);
setAttrs({
"currentSTUN":maxSTUN,
"currentEND":maxEND,
"gearCurrentSTUN":maxSTUN,
"gearCurrentEND":maxEND
});
});
}
/* Recover Buttons */
// Recover endurance and stun when the recover button in the item-characteristics-health box is clicked.
on("clicked:recoverHealth", function () {
applyRecovery();
});
// Recover endurance and stun when the recover button in the gear health status box is clicked.
on("clicked:gearRecoverHealth", function () {
applyRecovery();
});
function applyRecovery() {
getAttrs(["endurance","stun","currentEND","currentSTUN","gearCurrentEND","gearCurrentSTUN","recovery","sheetTab"], function(values) {
const maxEND = parseInt(values.endurance);
const maxSTUN = parseInt(values.stun);
const recovery = parseInt(values.recovery);
const currentSheet = values.sheetTab;
if (currentSheet=="characteristics") {
// The player is viewing the Page 1: characteristics.
let currentEND = parseInt(values.currentEND);
let currentSTUN = parseInt(values.currentSTUN);
if (currentSTUN<=maxSTUN) { // Check to see if character hasn't been boosted above character max by Aid power or similar.
if (currentSTUN+recovery<=maxSTUN) {
setAttrs({
"currentSTUN":currentSTUN+recovery
});
} else {
setAttrs({
"currentSTUN":maxSTUN
});
}
}
if (currentEND<=maxEND) { // Check to see if character hasn't been boosted above character max by Aid power or similar.
if (currentEND+recovery<=maxEND) {
setAttrs({
"currentEND":currentEND+recovery
});
} else {
setAttrs({
"currentEND":maxEND
});
}
}
} else {
// The player is viewing Page 2: gear.
let currentEND = parseInt(values.gearCurrentEND);
let currentSTUN = parseInt(values.gearCurrentSTUN);
if (currentSTUN<=maxSTUN) { // Check to see if character hasn't been boosted above character max by Aid power or similar.
if (currentSTUN+recovery<=maxSTUN) {
setAttrs({
"gearCurrentSTUN":currentSTUN+recovery
});
} else {
setAttrs({
"gearCurrentSTUN":maxSTUN
});
}
}
if (currentEND<=maxEND) { // Check to see if character hasn't been boosted above character max by Aid power or similar.
if (currentEND+recovery<=maxEND) {
setAttrs({
"gearCurrentEND":currentEND+recovery
});
} else {
setAttrs({
"gearCurrentEND":maxEND
});
}
}
}
});
}
/* Synchronize health statuses */
// Keep the gear tab's health status up to date with the character tab's health status.
on("change:currentBODY change:currentSTUN change:currentEND", function () {
getAttrs(["gearCurrentBODY","gearCurrentSTUN","gearCurrentEND","currentBODY","currentSTUN","currentEND","sheetTab"], function(values) {
// Get the visible sheet.
const currentSheet = values.sheetTab;
// As long as the visible sheet is not Page 2 (Gear) change Page 2's BODY, STUN, and END health status.
if (currentSheet != "gear") {
setAttrs({
"gearCurrentBODY":parseInt(values.currentBODY)||0,
"gearCurrentSTUN":parseInt(values.currentSTUN)||0,
"gearCurrentEND":parseInt(values.currentEND)||0,
})
}
});
});
// Keep the gear tab's health status up to date with the character tab's health status.
on("change:gearCurrentBODY change:gearCurrentSTUN change:gearCurrentEND", function () {
getAttrs(["gearCurrentBODY","gearCurrentSTUN","gearCurrentEND","currentBODY","currentSTUN","currentEND","sheetTab"], function(values) {
// Get the visible sheet.
const currentSheet = values.sheetTab;
// As long as the visible sheet is Page 2 (Gear) change Page 1's BODY, STUN, and END health status.
if (currentSheet == "gear") {
setAttrs({
"currentBODY":parseInt(values.gearCurrentBODY)||0,
"currentSTUN":parseInt(values.gearCurrentSTUN)||0,
"currentEND":parseInt(values.gearCurrentEND)||0,
})
}
});
});
/* -------------------------------------- */
/* Functions used for characteristics tab */
/* -------------------------------------- */
function sumCharacteristicPoints() {
// Add up points spent on characteristics.
// All character attributes added in one function to avoid getAttrs() limitations.
// Add attribute costs in one go
getAttrs(["strengthCP","dexterityCP","constitutionCP","intelligenceCP","egoCP","presenceCP","ocvCP","dcvCP","omcvCP","dmcvCP","speedCP","pdCP","edCP","bodyCP","stunCP","enduranceCP","recoveryCP","runningCP","leapingCP","swimmingCP"], function(values) {
const strengthCost = parseInt(values.strengthCP)||0;
const dexterityCost = parseInt(values.dexterityCP)||0;
const constitutionCost = parseInt(values.constitutionCP)||0;
const intelligenceCost = parseInt(values.intelligenceCP)||0;
const egoCost = parseInt(values.egoCP)||0;
const presenceCost = parseInt(values.presenceCP)||0;
const ocvCost = parseInt(values.ocvCP)||0;
const dcvCost = parseInt(values.dcvCP)||0;
const omcvCost = parseInt(values.omcvCP)||0;
const dmcvCost = parseInt(values.dmcvCP)||0;
const speedCost = parseInt(values.speedCP)||0;
const pdCost = parseInt(values.pdCP)||0;
const edCost = parseInt(values.edCP)||0;
const bodyCost = parseInt(values.bodyCP)||0;
const stunCost = parseInt(values.stunCP)||0;
const endCost = parseInt(values.enduranceCP)||0;
const recCost = parseInt(values.recoveryCP)||0;
const runningCost = parseInt(values.runningCP)||0;
const leapingCost = parseInt(values.leapingCP)||0;
const swimmingCost = parseInt(values.swimmingCP)||0;
let primaryAttributesCost = strengthCost+dexterityCost+constitutionCost+intelligenceCost+egoCost+presenceCost;
let combatValuesCost = ocvCost+dcvCost+omcvCost+dmcvCost;
let defenseCost = pdCost+edCost;
let healthCost = bodyCost+stunCost+endCost+recCost;
let movementCost = runningCost+leapingCost+swimmingCost;
let characterAttributeCost = primaryAttributesCost+combatValuesCost+speedCost+defenseCost+healthCost+movementCost;
setAttrs({
"characteristicsCost":parseInt(characterAttributeCost)
});
});
}
// Update Strength related stats and skills
on("change:strength change:useCharacteristicMaximums", function () {
getAttrs(["strength","useCharacteristicMaximums"], function(values) {
const statValue = parseInt(values.strength)||0;
const useMaximums = values.useCharacteristicMaximums;
const baseStat = 10;
const maxStat = 20;
const costStat = 1;
let statCP = 0;
var liftCapability;
var freeCarry;
if ( (statValue>maxStat) && (useMaximums != 0) ) {
statCP=(statValue-maxStat)*costStat+(statValue-baseStat)*costStat;
} else {
statCP=(statValue-baseStat)*costStat;
}
switch (statValue) {
case 0: liftCapability = 0;
break;
case 1: liftCapability = 8;
break;
case 2: liftCapability = 16;
break;
case 3: liftCapability = 25;
break;
case 4: liftCapability = 38;
break;
default: liftCapability=Math.round(25*Math.pow(2,(statValue/5)));
}
freeCarry=liftCapability/10;
// Update cost and roll chance
setAttrs({
"strengthCP":statCP,
"strengthChance":calculateRoll(statValue),
"liftWeight":liftCapability,
"encumbranceFreeCarry":freeCarry
});
// Update costs
sumCharacteristicPoints();
});
});
// Update Dexterity
on("change:dexterity change:useCharacteristicMaximums", function () {
getAttrs(["dexterity","useCharacteristicMaximums"], function(values) {
const statValue = parseInt(values.dexterity)||0;
const useMaximums = values.useCharacteristicMaximums;
const baseStat = 10;
const maxStat = 20;
const costStat = 2;
let statCP = 0;
if ( (statValue>maxStat) && (useMaximums != 0) ) {
statCP=(statValue-maxStat)*costStat+(statValue-baseStat)*costStat;
} else {
statCP=(statValue-baseStat)*costStat;
}
// Update cost and roll chance
setAttrs({
"dexterityCP":statCP,
"dexterityChance":calculateRoll(statValue)
});
// Update costs
sumCharacteristicPoints();
});
});
// Update Constitution
on("change:constitution change:useCharacteristicMaximums", function () {
getAttrs(["constitution","useCharacteristicMaximums"], function(values) {
const statValue = parseInt(values.constitution)||0;
const useMaximums = values.useCharacteristicMaximums;
const baseStat = 10;
const maxStat = 20;
const costStat = 1;
let statCP = 0;
if ( (statValue>maxStat) && (useMaximums != 0) ) {
statCP=(statValue-maxStat)*costStat+(statValue-baseStat)*costStat;
} else {
statCP=(statValue-baseStat)*costStat;
}
// Update cost and roll chance
setAttrs({
"constitutionCP":statCP,
"constitutionChance":calculateRoll(statValue)
});
// Update costs
sumCharacteristicPoints();
});
});
// Update Intelligence
on("change:intelligence change:enhancedPerceptionModifier change:useCharacteristicMaximums", function () {
getAttrs(["intelligence","useCharacteristicMaximums","enhancedPerceptionModifier"], function(values) {
const statValue = parseInt(values.intelligence)||0;
const useMaximums = values.useCharacteristicMaximums;
const baseStat = 10;
const maxStat = 20;
const costStat = 1;
// Here we get the enhanced perception modifier. Perception is like a child of Intelligence.
// The base value of perception is the intelligence roll. The Perception roll is the base value plus the enhancedPerceptionModifier.
// Individual senses start at Intelligence Chance + Perception modifier.
const enhancedPerceptionMod = parseInt(values.enhancedPerceptionModifier)||0;
let statCP = 0;
if ( (statValue>maxStat) && (useMaximums != 0) ) {
statCP=(statValue-maxStat)*costStat+(statValue-baseStat)*costStat;
} else {
statCP=(statValue-baseStat)*costStat;
}
// Update cost and roll chance
setAttrs({
"intelligenceCP":statCP,
"intelligenceChance":calculateRoll(statValue),
"perceptionBase":calculateRoll(statValue),
"perceptionVision":calculateRoll(statValue)+enhancedPerceptionMod,
"perceptionHearing":calculateRoll(statValue)+enhancedPerceptionMod,
"perceptionSmell":calculateRoll(statValue)+enhancedPerceptionMod
});
// Update costs
sumCharacteristicPoints();
});
});
// Update Ego
on("change:ego change:useCharacteristicMaximums", function () {
getAttrs(["ego","useCharacteristicMaximums"], function(values) {
const statValue = parseInt(values.ego)||0;
const useMaximums = values.useCharacteristicMaximums;
const baseStat = 10;
const maxStat = 20;
const costStat = 1;
let statCP = 0;
if ( (statValue>maxStat) && (useMaximums != 0) ) {
statCP=(statValue-maxStat)*costStat+(statValue-baseStat)*costStat;
} else {
statCP=(statValue-baseStat)*costStat;
}
// Update cost and roll chance
setAttrs({
"egoCP":statCP,
"egoChance":calculateRoll(statValue)
});
// Update costs
sumCharacteristicPoints();
});
});
// Update Presence
on("change:presence change:useCharacteristicMaximums", function () {
getAttrs(["presence","useCharacteristicMaximums"], function(values) {
const statValue = parseInt(values.presence)||0;
const useMaximums = values.useCharacteristicMaximums;
const baseStat = 10;
const maxStat = 20;
const costStat = 1;
let statCP = 0;
if ( (statValue>maxStat) && (useMaximums != 0) ) {
statCP=(statValue-maxStat)*costStat+(statValue-baseStat)*costStat;
} else {
statCP=(statValue-baseStat)*costStat;
}
// Update cost and roll chance
setAttrs({
"presenceCP":statCP,
"presenceChance":calculateRoll(statValue)
});
// Update costs
sumCharacteristicPoints();
});
});
// Combat Characteristics
// Update Offensive Combat Value
on("change:ocv change:useCharacteristicMaximums", function () {
getAttrs(["ocv","useCharacteristicMaximums"], function(values) {
const statValue = parseInt(values.ocv)||0;
const useMaximums = values.useCharacteristicMaximums;
const baseStat = 3;
const maxStat = 8;
const costStat = 5;
let statCP = 0;
if ( (statValue>maxStat) && (useMaximums != 0) ) {
statCP=(statValue-maxStat)*costStat+(statValue-baseStat)*costStat;
} else {
statCP=(statValue-baseStat)*costStat;
}
// Update cost
setAttrs({
"ocvCP":statCP
});
// Update costs
sumCharacteristicPoints();
});
});
// Update Defensive Combat Value
// Encumbrance Section: Add 1 to bonusDCVmodifier
on("clicked:bonusDCVmodifierPlus", function () {
getAttrs(["bonusDCVmodifier"], function(values) {
const currentValue = parseInt(values.bonusDCVmodifier)||0;
setAttrs({
"bonusDCVmodifier":Math.min(Math.max(-10, (currentValue+1) ), +10)
});
});
});
// Encumbrance Section: Subtract 1 from bonusDCVmodifier
on("clicked:bonusDCVmodifierMinus", function () {
getAttrs(["bonusDCVmodifier"], function(values) {
const currentValue = parseInt(values.bonusDCVmodifier)||0;
setAttrs({
"bonusDCVmodifier":Math.min(Math.max(-10, (currentValue-1) ), +10)
});
});
});
// Update hidden attribute currentDCV
on("change:dcv change:weightDexDCVPenalty change:shieldDCV change:bonusDCVmodifier change:useCharacteristicMaximums change:optionTakesNoSTUN", function () {
getAttrs(["dcv","useCharacteristicMaximums","currentDCV","weightDexDCVPenalty","shieldDCV","bonusDCVmodifier", "optionTakesNoSTUN"], function(values) {
const statValue = parseInt(values.dcv)||0;
const shieldBonus = parseInt(values.shieldDCV)||0;
const weightPenalty = parseInt(values.weightDexDCVPenalty)||0;
const bonusModifier = parseInt(values.bonusDCVmodifier)||0;
const useMaximums = values.useCharacteristicMaximums;
const takesNoSTUN = values.optionTakesNoSTUN;
let baseStat = 3;
const maxStat = 8;
let costStat = 5;
let statCP = 0;
// Automaton defenses cost triple.
if (takesNoSTUN != 0) {
costStat = costStat*3;
}
if ( (statValue>maxStat) && (useMaximums != 0) ) {
statCP=(statValue-maxStat)*costStat+(statValue-baseStat)*costStat;
} else {
statCP=(statValue-baseStat)*costStat;
}
// Update cost and current DCV
setAttrs({
"dcvCP":statCP,
"currentDCV":statValue+shieldBonus+weightPenalty+bonusModifier
});
// Update costs
sumCharacteristicPoints();
});
});
// Update Mental Offensive Combat Value
on("change:omcv change:useCharacteristicMaximums", function () {
getAttrs(["omcv","useCharacteristicMaximums"], function(values) {
const statValue = parseInt(values.omcv)||0;
const useMaximums = values.useCharacteristicMaximums;
const baseStat = 3;
const maxStat = 8;
const costStat = 3;
let statCP = 0;
if ( (statValue>maxStat) && (useMaximums != 0) ) {
statCP=(statValue-maxStat)*costStat+(statValue-baseStat)*costStat;
} else {
statCP=(statValue-baseStat)*costStat;
}
// Update cost
setAttrs({
"omcvCP":statCP
});
// Update costs
sumCharacteristicPoints();
});
});
// Update Mental Defensive Combat Value
on("change:dmcv change:useCharacteristicMaximums change:optionTakesNoSTUN", function () {
getAttrs(["dmcv","useCharacteristicMaximums", "optionTakesNoSTUN"], function(values) {
const statValue = parseInt(values.dmcv)||0;
const useMaximums = values.useCharacteristicMaximums;
const takesNoSTUN = values.optionTakesNoSTUN;
const baseStat = 3;
const maxStat = 8;
let costStat = 3;
let statCP = 0;
// Automaton defenses cost triple.
if (takesNoSTUN != 0) {
costStat = costStat*3;
}
if ( (statValue>maxStat) && (useMaximums != 0) ) {
statCP=(statValue-maxStat)*costStat+(statValue-baseStat)*costStat;
} else {
statCP=(statValue-baseStat)*costStat;
}
// Update cost
setAttrs({
"dmcvCP":statCP
});
// Update costs
sumCharacteristicPoints();
});
});
// Update Speed
on("change:speed change:useCharacteristicMaximums", function () {
getAttrs(["speed","useCharacteristicMaximums"], function(values) {
let theSpeed = parseInt(values.speed)||0;
let useMaximums = values.useCharacteristicMaximums;
const baseStat = 2;
const maxStat = 4;
const costStat = 10;
let statCP = 0;
if ( (theSpeed>maxStat) && (useMaximums != 0) ) {
statCP=(theSpeed-maxStat)*costStat+(theSpeed-baseStat)*costStat;
} else {
statCP=(theSpeed-baseStat)*costStat;
}
// Update cost
setAttrs({
"speedCP":statCP
});
sumCharacteristicPoints();
// Update speed indicator checkboxes
if (theSpeed==12) {
setAttrs({
"speedIndicator01":"on"
});
} else {
setAttrs({
"speedIndicator01":0
});
}
if (theSpeed>=6) {
setAttrs({
"speedIndicator02":"on"
});
} else {
setAttrs({
"speedIndicator02":0
});
}
if ((theSpeed>=8)||(theSpeed===4)||(theSpeed===5)) {
setAttrs({
"speedIndicator03":"on"
});
} else {
setAttrs({
"speedIndicator03":0
});
}
if ((theSpeed>=9)||(theSpeed===3)||(theSpeed===6)||(theSpeed===7)) {
setAttrs({
"speedIndicator04":"on"
});
} else {
setAttrs({
"speedIndicator04":0
});
}
if ((theSpeed>=10)||(theSpeed===8)||(theSpeed===5)) {
setAttrs({
"speedIndicator05":"on"
});
} else {
setAttrs({
"speedIndicator05":0
});
}
if ((theSpeed>=6)||(theSpeed===2)||(theSpeed===4)) {
setAttrs({
"speedIndicator06":"on"
});
} else {
setAttrs({
"speedIndicator06":0
});
}
if ((theSpeed>=11)||(theSpeed===1)||(theSpeed===7)||(theSpeed===9)) {
setAttrs({
"speedIndicator07":"on"
});
} else {
setAttrs({
"speedIndicator07":0
});
}
if ((theSpeed>=8)||(theSpeed===3)||(theSpeed===5)||(theSpeed===6)) {
setAttrs({
"speedIndicator08":"on"
});
} else {
setAttrs({
"speedIndicator08":0
});
}
if ((theSpeed>=10)||(theSpeed===4)||(theSpeed===7)||(theSpeed===8)) {
setAttrs({
"speedIndicator09":"on"
});
} else {
setAttrs({
"speedIndicator09":0
});
}
if ((theSpeed>=9)||(theSpeed===5)||(theSpeed===6)) {
setAttrs({
"speedIndicator10":"on"
});
} else {
setAttrs({
"speedIndicator10":0
});
}
if (theSpeed>=7) {
setAttrs({
"speedIndicator11":"on"
});
} else {
setAttrs({
"speedIndicator11":0
});
}
if (theSpeed>=2) {
setAttrs({
"speedIndicator12":"on"
});
} else {
setAttrs({
"speedIndicator12":0
});
}
});
});
// Update Physical Defense
on("change:pd change:useCharacteristicMaximums change:optionTakesNoSTUN", function () {
getAttrs(["pd","useCharacteristicMaximums", "optionTakesNoSTUN"], function(values) {
const statValue = parseInt(values.pd)||0;
const useMaximums = values.useCharacteristicMaximums;
const takesNoSTUN = values.optionTakesNoSTUN;
let baseStat = 2;
const maxStat = 8;
let costStat = 1;
let statCP = 0;
// Automaton defenses cost triple.
if (takesNoSTUN != 0) {
costStat = costStat*3;
baseStat = 1;
}
if ( (statValue>maxStat) && (useMaximums != 0) ) {
statCP=(statValue-maxStat)*costStat+(statValue-baseStat)*costStat;
} else {
statCP=(statValue-baseStat)*costStat;
}
// Update cost
setAttrs({
"pdCP":statCP
});
// Update costs
sumCharacteristicPoints();
});
});
// Update Energy Defense
on("change:ed change:useCharacteristicMaximums change:optionTakesNoSTUN", function () {
getAttrs(["ed","useCharacteristicMaximums", "optionTakesNoSTUN"], function(values) {
const statValue = parseInt(values.ed)||0;
const useMaximums = values.useCharacteristicMaximums;
const takesNoSTUN = values.optionTakesNoSTUN;
let baseStat = 2;
const maxStat = 8;
let costStat = 1;
let statCP = 0;
// Automaton defenses cost triple.
if (takesNoSTUN != 0) {
costStat = costStat*3;
baseStat = 1;
}
if ( (statValue>maxStat) && (useMaximums != 0) ) {
statCP=(statValue-maxStat)*costStat+(statValue-baseStat)*costStat;
} else {
statCP=(statValue-baseStat)*costStat;
}
// Update cost
setAttrs({
"edCP":statCP
});
// Update costs
sumCharacteristicPoints();
});
});
// Update BODY
on("change:body change:useCharacteristicMaximums", function () {
getAttrs(["body","useCharacteristicMaximums"], function(values) {
const statValue = parseInt(values.body)||0;
const useMaximums = values.useCharacteristicMaximums;
const baseStat = 10;
const maxStat = 20;
const costStat = 1;
let statCP = 0;
if ( (statValue>maxStat) && (useMaximums != 0) ) {
statCP=(statValue-maxStat)*costStat+(statValue-baseStat)*costStat;
} else {
statCP=(statValue-baseStat)*costStat;
}
// Update cost
setAttrs({
"bodyCP":statCP
});
// Update costs
sumCharacteristicPoints();
});
});
// Handle STUN data when optionTakesNoSTUN is checked.
on("change:optionTakesNoSTUN", function () {
getAttrs(["optionTakesNoSTUN", "stun", "hiddenSTUN"], function(values) {
const takesNoSTUN = values.optionTakesNoSTUN;
let statValue = values.stun;
let savedStatValue = values.hiddenSTUN;
// Store STUN in hiddenSTUN and then set it to zero.
if (takesNoSTUN != 0) {
savedStatValue = statValue;
statValue = 0;
} else {
statValue = savedStatValue;
}
// Update character. Reset health status.
setAttrs({
"hiddenSTUN":savedStatValue,
"stun":statValue,
"currentSTUN":statValue,
"gearCurrentSTUN":statValue
});
// Update characteristics cost
sumCharacteristicPoints();
});
});
// Update STUN
on("change:stun change:useCharacteristicMaximums change:optionTakesNoSTUN", function () {
getAttrs(["stun","useCharacteristicMaximums", "hiddenSTUN", "optionTakesNoSTUN"], function(values) {
const statValue = parseInt(values.stun)||0;
const useMaximums = values.useCharacteristicMaximums;
const takesNoSTUN = values.optionTakesNoSTUN;
let baseStat = 20;
const maxStat = 50;
const costStat = 0.5;
let statCP = 0;
// If option takesNoSTUN is not checked. Save the new value of STUN.
if (takesNoSTUN != 0) {
// Reset STUN and cost to zero.
setAttrs({
"stun":0,
"stunCP":0
});
} else {
// Calculate costs, save stun to hiddenSTUN, and calculate cost.
if ( (statValue>maxStat) && (useMaximums != 0) ) {
statCP=(statValue-maxStat)*costStat+(statValue-baseStat)*costStat;
} else {
statCP=(statValue-baseStat)*costStat;
}
setAttrs({
"hiddenSTUN":statValue,
"stunCP":heroRoundLow(statCP)
});
}
// Update costs
sumCharacteristicPoints();
});
});
// Update Endurance
on("change:endurance change:useCharacteristicMaximums", function () {
getAttrs(["endurance","useCharacteristicMaximums"], function(values) {
const statValue = parseInt(values.endurance)||0;
const useMaximums = values.useCharacteristicMaximums;
const baseStat = 20;
const maxStat = 50;
const costStat = 0.2;
let statCP = 0;
if ( (statValue>maxStat) && (useMaximums != 0) ) {
statCP=(statValue-maxStat)*costStat+(statValue-baseStat)*costStat;
} else {
statCP=(statValue-baseStat)*costStat;
}
// Update cost
setAttrs({
"enduranceCP":heroRoundLow(statCP)
});
// Update characteristics cost
sumCharacteristicPoints();
});
});
// Update Recovery
on("change:recovery change:useCharacteristicMaximums", function () {
getAttrs(["recovery","useCharacteristicMaximums"], function(values) {
const statValue = parseInt(values.recovery)||0;
const useMaximums = values.useCharacteristicMaximums;
const baseStat = 4;
const maxStat = 10;
const costStat = 1;
let statCP = 0;
if ( (statValue>maxStat) && (useMaximums != 0) ) {
statCP=(statValue-maxStat)*costStat+(statValue-baseStat)*costStat;
} else {
statCP=(statValue-baseStat)*costStat;
}
// Update cost
setAttrs({
"recoveryCP":statCP
});
// Update characteristics cost
sumCharacteristicPoints();
});
});
// Movement abilities
// Update Running
on("change:running change:useCharacteristicMaximums", function () {
getAttrs(["running","useCharacteristicMaximums"], function(values) {
const statValue = parseInt(values.running)||0;
const useMaximums = values.useCharacteristicMaximums;
const baseStat = 12;
const maxStat = 20;
const costStat = 1;
let statCP = 0;
if ( (statValue>maxStat) && (useMaximums != 0) ) {
statCP=(statValue-maxStat)*costStat+(statValue-baseStat)*costStat;
} else {
statCP=(statValue-baseStat)*costStat;
}
// Update cost
setAttrs({
"runningCP":statCP
});
// Update characteristics cost
sumCharacteristicPoints();
});
});
// Update Leaping
on("change:leaping change:useCharacteristicMaximums", function () {
getAttrs(["leaping","useCharacteristicMaximums"], function(values) {
const statValue = parseInt(values.leaping)||0;
const useMaximums = values.useCharacteristicMaximums;
const baseStat = 4;
const maxStat = 10;
const costStat = 0.5;
let statCP = 0;
if ( (statValue>maxStat) && (useMaximums != 0) ) {
statCP=(statValue-maxStat)*costStat+(statValue-baseStat)*costStat;
} else {
statCP=(statValue-baseStat)*costStat;
}
// Update cost
setAttrs({
"leapingCP":heroRoundLow(statCP)
});
// Update characteristics cost
sumCharacteristicPoints();
});
});
// Update Swimming
on("change:swimming change:useCharacteristicMaximums", function () {
getAttrs(["swimming","useCharacteristicMaximums"], function(values) {
const statValue = parseInt(values.swimming)||0;
const useMaximums = values.useCharacteristicMaximums;
const baseStat = 4;
const maxStat = 10;
const costStat = 0.5;
let statCP = 0;
if ( (statValue>maxStat) && (useMaximums != 0) ) {
statCP=(statValue-maxStat)*costStat+(statValue-baseStat)*costStat;
} else {
statCP=(statValue-baseStat)*costStat;
}
// Update cost
setAttrs({
"swimmingCP":heroRoundLow(statCP)
});
// Update characteristics cost
sumCharacteristicPoints();
});
});
// Update point totals when option: useCharacteristicMaximums checked or unchecked.
on("change:useCharacteristicMaximums", function () {
sumCharacteristicPoints();
});
/* -------------------------------------- */
/* Functions used for tally bar */
/* -------------------------------------- */
function addPoints() {
// Add up points from each section of the tally bar and subtract the complications benefit to arrive at a total character cost
// Seems to need a onchange() notice for each tab total to be recognized correctly.
getAttrs(["hiddenCombatSkillsCost","characteristicsCost","hiddenSet1SkillsCost","hiddenSet2SkillsCost","hiddenSet3SkillsCost","hiddenLanguageSkillsCost","hiddenEnhancerSkillsCost","hiddenMartialSkillsCost","powersPerksTalentsCost","complicationsBenefit","bonusBenefit","experienceBenefit"], function(values) {
const characteristicsCP = parseInt(values.characteristicsCost)||0;
const set1SkillsCP = parseInt(values.hiddenSet1SkillsCost)||0;
const set2SkillsCP = parseInt(values.hiddenSet2SkillsCost)||0;
const set3SkillsCP = parseInt(values.hiddenSet3SkillsCost)||0;
const combatSkillsCP = parseInt(values.hiddenCombatSkillsCost)||0;
const languageSkillsCP = parseInt(values.hiddenLanguageSkillsCost)||0;
const enhancerSkillsCP = parseInt(values.hiddenEnhancerSkillsCost)||0;
const martialSkillsCP = parseInt(values.hiddenMartialSkillsCost)||0;
const powersPerksTalentsCP = parseInt(values.powersPerksTalentsCost)||0;
const complicationsCP = parseInt(values.complicationsBenefit)||0;
const bonusCP = parseInt(values.bonusBenefit)||0;
const experienceCP = parseInt(values.experienceBenefit)||0;
let totalSkillsCP = set1SkillsCP+set2SkillsCP+set3SkillsCP+combatSkillsCP+languageSkillsCP+enhancerSkillsCP+martialSkillsCP;
let totalCP = characteristicsCP+totalSkillsCP+powersPerksTalentsCP-complicationsCP-bonusCP-experienceCP;
setAttrs({
"skillsCost":totalSkillsCP,
"totalCharacterCost":totalCP
});
});
}
on("change:characteristicsCost change:hiddenSet1SkillsCost change:hiddenSet2SkillsCost change:hiddenSet3SkillsCost change:hiddenCombatSkillsCost change:hiddenEnhancerSkillsCost change:hiddenLanguageSkillsCost change:hiddenMartialSkillsCost change:powersPerksTalentsCost change:complicationsBenefit change:bonusBenefit change:experienceBenefit", function () {
// Update total character points any of the hidden character point subtotals change.
addPoints();
});
/* -------------------------------------------------- */
/* Functions used for talents and complications tab */
/* -------------------------------------------------- */
function sumComplicationsBenefit() {
getAttrs(["complicationCP01","complicationCP02","complicationCP03","complicationCP04","complicationCP05","complicationCP06"], function(values) {
const complication01benefit = parseInt(values.complicationCP01)||0;
const complication02benefit = parseInt(values.complicationCP02)||0;
const complication03benefit = parseInt(values.complicationCP03)||0;
const complication04benefit = parseInt(values.complicationCP04)||0;
const complication05benefit = parseInt(values.complicationCP05)||0;
const complication06benefit = parseInt(values.complicationCP06)||0;
let totalBenefit = complication01benefit+complication02benefit+complication03benefit+complication04benefit+complication05benefit+complication06benefit;
setAttrs({
"complicationsBenefit":totalBenefit
});
});
}
// Update Tally Bar after change notice any complication's CP benefit.
on("change:complicationCP01 change:complicationCP02 change:complicationCP03 change:complicationCP04 change:complicationCP05 change:complicationCP06", function () {
sumComplicationsBenefit();
});
function sumPowersPerksTalents() {
getAttrs(["talentCP01","talentCP02","talentCP03","talentCP04","talentCP05","talentCP06","talentCP07","powerCP01","powerCP02","powerCP03","powerCP04","powerCP05","powerCP06", "powerCP07", "powerCP08", "powerCP09", "powerCP10"], function(values) {
const talent01cost = parseInt(values.talentCP01)||0;
const talent02cost = parseInt(values.talentCP02)||0;
const talent03cost = parseInt(values.talentCP03)||0;
const talent04cost = parseInt(values.talentCP04)||0;
const talent05cost = parseInt(values.talentCP05)||0;
const talent06cost = parseInt(values.talentCP06)||0;
const talent07cost = parseInt(values.talentCP07)||0;
let talentsCost = talent01cost+talent02cost+talent03cost+talent04cost+talent05cost+talent06cost+talent07cost;
const power01cost = parseInt(values.powerCP01)||0;
const power02cost = parseInt(values.powerCP02)||0;
const power03cost = parseInt(values.powerCP03)||0;
const power04cost = parseInt(values.powerCP04)||0;
const power05cost = parseInt(values.powerCP05)||0;
const power06cost = parseInt(values.powerCP06)||0;
const power07cost = parseInt(values.powerCP07)||0;
const power08cost = parseInt(values.powerCP08)||0;
const power09cost = parseInt(values.powerCP09)||0;
const power10cost = parseInt(values.powerCP10)||0;
let powersCost = power01cost+power02cost+power03cost+power04cost+power05cost+power06cost+power07cost+power08cost+power09cost+power10cost;
let totalCost=talentsCost+powersCost;
setAttrs({
"powersPerksTalentsCost":totalCost
});
});
}
// Update Tally Bar after change to any Talent's CP cost.
on("change:talentCP01 change:talentCP02 change:talentCP03 change:talentCP04 change:talentCP05 change:talentCP06 change:talentCP07", function () {
sumPowersPerksTalents();
});
/* -------------------------------------------------- */
/* Functions used for powers tab */
/* -------------------------------------------------- */
function calculatePowerEND(powerActiveCost,powerReducedEND) {
// Calculates power endurance given active cost and reduced, standard, or increased endurance limitation.
var powerEND=0;
switch (powerReducedEND) {
case 'increasedENDx10': powerEND=10*(heroRoundLow(powerActiveCost/10));
if (powerEND<1) {
powerEND=1;
};
break;
case 'increasedENDx9': powerEND=9*(heroRoundLow(powerActiveCost/10));
if (powerEND<1) {
powerEND=1;
};
break;
case 'increasedENDx8': powerEND=8*(heroRoundLow(powerActiveCost/10));
if (powerEND<1) {
powerEND=1;
};
break;
case 'increasedENDx7': powerEND=7*(heroRoundLow(powerActiveCost/10));
if (powerEND<1) {
powerEND=1;
};
break;
case 'increasedENDx6': powerEND=6*(heroRoundLow(powerActiveCost/10));
if (powerEND<1) {
powerEND=1;
};
break;
case 'increasedENDx5': powerEND=5*(heroRoundLow(powerActiveCost/10));
if (powerEND<1) {
powerEND=1;
};
break;
case 'increasedENDx4': powerEND=4*(heroRoundLow(powerActiveCost/10));
if (powerEND<1) {
powerEND=1;
};
break;
case 'increasedENDx3': powerEND=3*(heroRoundLow(powerActiveCost/10));
if (powerEND<1) {
powerEND=1;
};
break;
case 'increasedENDx2': powerEND=2*(heroRoundLow(powerActiveCost/10));
if (powerEND<1) {
powerEND=1;
};
break;
case 'standardEND': powerEND=heroRoundLow(powerActiveCost/10);
if (powerEND<1) {
powerEND=1;
};
break;
case 'reducedEND': powerEND=heroRoundLow(powerActiveCost/20);
if (powerEND<1) {
powerEND=1;
};
break;
case 'reducedENDAF': powerEND=heroRoundLow(powerActiveCost/20);
if (powerEND<1) {
powerEND=1;
};
break;
case 'costsENDhalf': powerEND=heroRoundLow(powerActiveCost/20);
if (powerEND<1) {
powerEND=1;
};
break;
case 'costsENDfull': powerEND=heroRoundLow(powerActiveCost/10);
if (powerEND<1) {
powerEND=1;
};
break;
default: powerEND=0;
}
return powerEND;
}
function calculateActiveCost(powerBaseCost,powerAdvantages,powerReducedEND) {
var powerActiveCost=0;
switch (powerReducedEND) {
case 'reducedENDAF': powerActiveCost=powerBaseCost*(powerAdvantages+1.5);
break;
case 'zeroENDAF': powerActiveCost=powerBaseCost*(powerAdvantages+2);
break;
case 'reducedEND': powerActiveCost=powerBaseCost*(powerAdvantages+1.25);
break;
case 'zeroEND': powerActiveCost=powerBaseCost*(powerAdvantages+1.5);
break;
default: powerActiveCost=powerBaseCost*(1+powerAdvantages);
}
return powerActiveCost;
}
function increasedENDlimitation(settingEND) {
switch (settingEND) {
case 'costsENDhalf': return 0.25;
break;
case 'costsENDfull': return 0.5;
break;
case 'increasedENDx2': return 0.5;
break;
case 'increasedENDx2': return 0.5;
break;
case 'increasedENDx3': return 1;
break;
case 'increasedENDx4': return 1.5;
break;
case 'increasedENDx5': return 2;
break;
case 'increasedENDx6': return 2.5;
break;
case 'increasedENDx7': return 3;
break;
case 'increasedENDx8': return 3.5;
break;
case 'increasedENDx9': return 3.5;
break;
case 'increasedENDx10': return 4;
break;
default: return 0;
}
}
/* Update Power01 after detecting change to any of the numerical vales in the flex container */
on("change:powerType01 change:powerBaseCost01 change:powerAdvantages01 change:powerReducedEND01 change:powerLimitations01 change:powerDice01", function () {
getAttrs(["powerType01","powerBaseCost01","powerAdvantages01","powerReducedEND01","powerLimitations01","powerDice01"], function(values) {
let powerType = values.powerType01;
const powerBaseCost = parseInt(values.powerBaseCost01)||0;
const powerAdvantages = parseFloat(values.powerAdvantages01)||0;
const powerReducedEND = values.powerReducedEND01;
let powerActiveCost=0;
let powerModifiedCost=0;
let powerRealCost=0;
let powerEND=0;
let thePowerDice=values.powerDice01;
var increasedENDLimitation=increasedENDlimitation(powerReducedEND);
var powerLimitations = (parseFloat(values.powerLimitations01)||0)+increasedENDLimitation;
powerPreReducedEndActiveCost=powerBaseCost * (1+powerAdvantages);
powerEND=calculatePowerEND(powerPreReducedEndActiveCost, powerReducedEND);
powerActiveCost=calculateActiveCost(powerBaseCost, powerAdvantages, powerReducedEND);
powerActiveCost=heroRoundLow(powerActiveCost);
thePowerDice=thePowerDice.replace(/[^\ddD\\+\\-]/g,"");
if (powerBaseCost != 0) {
switch (powerType) {
case 'variableSlot': powerRealCost=powerActiveCost/(1+powerLimitations)/5;
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
break;
case 'fixedSlot': powerRealCost=powerActiveCost/(1+powerLimitations)/10;
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
break;
default: powerRealCost=powerActiveCost/(1+powerLimitations);
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
}
} else {
powerActiveCost=0;
powerEND=0;
}
setAttrs({
"powerActiveCost01":powerActiveCost,
"powerEND01":powerEND,
"powerCP01":powerRealCost,
"hiddenPowerDice01":thePowerDice
});
});
});
// Use Power 01 Endurance
on("clicked:buttonPowerEND01", function () {
getAttrs(["currentEND","powerEND01"], function(values) {
const currentEND = parseInt(values.currentEND);
const powerEND = parseInt(values.powerEND01);
let updatedEND=currentEND-powerEND;
if (updatedEND<0) {
updatedEND=0;
}
setAttrs({
"currentEND":updatedEND
});
});
});
/* Activate Power 01 */
on('clicked:powerRoll01', (info) => {
startRoll("&{template:custom-power-attack} {{title=@{character_name} - @{character_title}}} {{subtitle= @{powerName01} - @{powerEffect01}}} {{desc=@{powerText01}}} {{Activate On = [[?{Modifiers|0}+@{powerSkillRoll01}]] **or less**}} {{Success Roll=[[3d6cf<0cs>0]]}} {{Attack Roll=[[3d6cf<0cs>0]]}} {{Effect Roll=[[@{hiddenPowerDice01}sd]]}} {{END=[[@{powerEND01}]]}}", (results) => {
// Roll activation and effect dice. If the option to auto apply endurance is TRUE, subtract the power's END once from currentEND.
getAttrs(["optionAutoSubtractEND", "powerEND01"], function(values) {
let autoSubtractEND = values.optionAutoSubtractEND;
let powerEND = parseInt(values.powerEND01)||0;
subtractEndurance(powerEND);
});
finishRoll(
results.rollId,
{
}
);
});
});
/* Update Power02 after detecting change to any of the numerical vales in the flex container */
on("change:powerType02 change:powerBaseCost02 change:powerAdvantages02 change:powerReducedEND02 change:powerLimitations02 change:powerDice02", function () {
getAttrs(["powerType02","powerBaseCost02","powerAdvantages02","powerReducedEND02","powerLimitations02","powerDice02"], function(values) {
let powerType = values.powerType02;
const powerBaseCost = parseInt(values.powerBaseCost02)||0;
const powerAdvantages = parseFloat(values.powerAdvantages02)||0;
const powerReducedEND = values.powerReducedEND02;
let powerActiveCost=0;
let powerModifiedCost=0;
let powerRealCost=0;
let powerEND=0;
let thePowerDice=values.powerDice02;
var increasedENDLimitation=increasedENDlimitation(powerReducedEND);
var powerLimitations = (parseFloat(values.powerLimitations02)||0)+increasedENDLimitation;
powerPreReducedEndActiveCost=powerBaseCost * (1+powerAdvantages);
powerEND=calculatePowerEND(powerPreReducedEndActiveCost, powerReducedEND);
powerActiveCost=calculateActiveCost(powerBaseCost, powerAdvantages, powerReducedEND);
powerActiveCost=heroRoundLow(powerActiveCost);
thePowerDice=thePowerDice.replace(/[^\ddD\\+\\-]/g,"");
if (powerBaseCost != 0) {
switch (powerType) {
case 'variableSlot': powerRealCost=powerActiveCost/(1+powerLimitations)/5;
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
break;
case 'fixedSlot': powerRealCost=powerActiveCost/(1+powerLimitations)/10;
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
break;
default: powerRealCost=powerActiveCost/(1+powerLimitations);
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
}
} else {
powerActiveCost=0;
powerEND=0;
}
setAttrs({
"powerActiveCost02":powerActiveCost,
"powerEND02":powerEND,
"powerCP02":powerRealCost,
"hiddenPowerDice02":thePowerDice
});
});
});
// Use Power 02 Endurance
on("clicked:buttonPowerEND02", function () {
getAttrs(["currentEND","powerEND02"], function(values) {
const currentEND = parseInt(values.currentEND);
const powerEND = parseInt(values.powerEND02);
let updatedEND=currentEND-powerEND;
if (updatedEND<0) {
updatedEND=0;
}
setAttrs({
"currentEND":updatedEND
});
});
});
/* Activate Power 02 */
on('clicked:powerRoll02', (info) => {
startRoll("&{template:custom-power-attack} {{title=@{character_name} - @{character_title}}} {{subtitle= @{powerName02} - @{powerEffect02}}} {{desc=@{powerText02}}} {{Activate On = [[?{Modifiers|0}+@{powerSkillRoll02}]] **or less**}} {{Success Roll=[[3d6cf<0cs>0]]}} {{Attack Roll=[[3d6cf<0cs>0]]}} {{Effect Roll=[[@{hiddenPowerDice02}sd]]}} {{END=[[@{powerEND02}]]}}", (results) => {
// Roll activation and effect dice. If the option to auto apply endurance is TRUE, subtract the power's END once from currentEND.
getAttrs(["optionAutoSubtractEND", "powerEND02"], function(values) {
let autoSubtractEND = values.optionAutoSubtractEND;
let powerEND = parseInt(values.powerEND02)||0;
subtractEndurance(powerEND);
});
finishRoll(
results.rollId,
{
}
);
});
});
/* Update Power03 after detecting change to any of the numerical vales in the flex container */
on("change:powerType03 change:powerBaseCost03 change:powerAdvantages03 change:powerReducedEND03 change:powerLimitations03 change:powerDice03", function () {
getAttrs(["powerType03","powerBaseCost03","powerAdvantages03","powerReducedEND03","powerLimitations03","powerDice03"], function(values) {
let powerType = values.powerType03;
const powerBaseCost = parseInt(values.powerBaseCost03)||0;
const powerAdvantages = parseFloat(values.powerAdvantages03)||0;
const powerReducedEND = values.powerReducedEND03;
let powerActiveCost=0;
let powerModifiedCost=0;
let powerRealCost=0;
let powerEND=0;
let thePowerDice=values.powerDice03;
var increasedENDLimitation=increasedENDlimitation(powerReducedEND);
var powerLimitations = (parseFloat(values.powerLimitations03)||0)+increasedENDLimitation;
powerPreReducedEndActiveCost=powerBaseCost * (1+powerAdvantages);
powerEND=calculatePowerEND(powerPreReducedEndActiveCost, powerReducedEND);
powerActiveCost=calculateActiveCost(powerBaseCost, powerAdvantages, powerReducedEND);
powerActiveCost=heroRoundLow(powerActiveCost);
thePowerDice=thePowerDice.replace(/[^\ddD\\+\\-]/g,"");
if (powerBaseCost != 0) {
switch (powerType) {
case 'variableSlot': powerRealCost=powerActiveCost/(1+powerLimitations)/5;
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
break;
case 'fixedSlot': powerRealCost=powerActiveCost/(1+powerLimitations)/10;
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
break;
default: powerRealCost=powerActiveCost/(1+powerLimitations);
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
}
} else {
powerActiveCost=0;
powerEND=0;
}
setAttrs({
"powerActiveCost03":powerActiveCost,
"powerEND03":powerEND,
"powerCP03":powerRealCost,
"hiddenPowerDice03":thePowerDice
});
});
});
// Use Power 03 Endurance
on("clicked:buttonPowerEND03", function () {
getAttrs(["currentEND","powerEND03"], function(values) {
const currentEND = parseInt(values.currentEND);
const powerEND = parseInt(values.powerEND03);
let updatedEND=currentEND-powerEND;
if (updatedEND<0) {
updatedEND=0;
}
setAttrs({
"currentEND":updatedEND
});
});
});
/* Activate Power 03 */
on('clicked:powerRoll03', (info) => {
startRoll("&{template:custom-power-attack} {{title=@{character_name} - @{character_title}}} {{subtitle= @{powerName03} - @{powerEffect03}}} {{desc=@{powerText03}}} {{Activate On = [[?{Modifiers|0}+@{powerSkillRoll03}]] **or less**}} {{Success Roll=[[3d6cf<0cs>0]]}} {{Attack Roll=[[3d6cf<0cs>0]]}} {{Effect Roll=[[@{hiddenPowerDice03}sd]]}} {{END=[[@{powerEND03}]]}}", (results) => {
// Roll activation and effect dice. If the option to auto apply endurance is TRUE, subtract the power's END once from currentEND.
getAttrs(["optionAutoSubtractEND", "powerEND03"], function(values) {
let autoSubtractEND = values.optionAutoSubtractEND;
let powerEND = parseInt(values.powerEND03)||0;
subtractEndurance(powerEND);
});
finishRoll(
results.rollId,
{
}
);
});
});
/* Update Power04 after detecting change to any of the numerical vales in the flex container */
on("change:powerType04 change:powerBaseCost04 change:powerAdvantages04 change:powerReducedEND04 change:powerLimitations04 change:powerDice04", function () {
getAttrs(["powerType04","powerBaseCost04","powerAdvantages04","powerReducedEND04","powerLimitations04","powerDice04"], function(values) {
let powerType = values.powerType04;
const powerBaseCost = parseInt(values.powerBaseCost04)||0;
const powerAdvantages = parseFloat(values.powerAdvantages04)||0;
const powerReducedEND = values.powerReducedEND04;
let powerActiveCost=0;
let powerModifiedCost=0;
let powerRealCost=0;
let powerEND=0;
let thePowerDice=values.powerDice04;
var increasedENDLimitation=increasedENDlimitation(powerReducedEND);
var powerLimitations = (parseFloat(values.powerLimitations04)||0)+increasedENDLimitation;
powerPreReducedEndActiveCost=powerBaseCost * (1+powerAdvantages);
powerEND=calculatePowerEND(powerPreReducedEndActiveCost, powerReducedEND);
powerActiveCost=calculateActiveCost(powerBaseCost, powerAdvantages, powerReducedEND);
powerActiveCost=heroRoundLow(powerActiveCost);
thePowerDice=thePowerDice.replace(/[^\ddD\\+\\-]/g,"");
if (powerBaseCost != 0) {
switch (powerType) {
case 'variableSlot': powerRealCost=powerActiveCost/(1+powerLimitations)/5;
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
break;
case 'fixedSlot': powerRealCost=powerActiveCost/(1+powerLimitations)/10;
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
break;
default: powerRealCost=powerActiveCost/(1+powerLimitations);
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
}
} else {
powerActiveCost=0;
powerEND=0;
}
setAttrs({
"powerActiveCost04":powerActiveCost,
"powerEND04":powerEND,
"powerCP04":powerRealCost,
"hiddenPowerDice04":thePowerDice
});
});
});
// Use Power 04 Endurance
on("clicked:buttonPowerEND04", function () {
getAttrs(["currentEND","powerEND04"], function(values) {
const currentEND = parseInt(values.currentEND);
const powerEND = parseInt(values.powerEND04);
let updatedEND=currentEND-powerEND;
if (updatedEND<0) {
updatedEND=0;
}
setAttrs({
"currentEND":updatedEND
});
});
});
/* Activate Power 04 */
on('clicked:powerRoll04', (info) => {
startRoll("&{template:custom-power-attack} {{title=@{character_name} - @{character_title}}} {{subtitle= @{powerName04} - @{powerEffect04}}} {{desc=@{powerText04}}} {{Activate On = [[?{Modifiers|0}+@{powerSkillRoll04}]] **or less**}} {{Success Roll=[[3d6cf<0cs>0]]}} {{Attack Roll=[[3d6cf<0cs>0]]}} {{Effect Roll=[[@{hiddenPowerDice04}sd]]}} {{END=[[@{powerEND04}]]}}", (results) => {
// Roll activation and effect dice. If the option to auto apply endurance is TRUE, subtract the power's END once from currentEND.
getAttrs(["optionAutoSubtractEND", "powerEND04"], function(values) {
let autoSubtractEND = values.optionAutoSubtractEND;
let powerEND = parseInt(values.powerEND04)||0;
subtractEndurance(powerEND);
});
finishRoll(
results.rollId,
{
}
);
});
});
/* Update Power05 after detecting change to any of the numerical vales in the flex container */
on("change:powerType05 change:powerBaseCost05 change:powerAdvantages05 change:powerReducedEND05 change:powerLimitations05 change:powerDice05", function () {
getAttrs(["powerType05","powerBaseCost05","powerAdvantages05","powerReducedEND05","powerLimitations05","powerDice05"], function(values) {
let powerType = values.powerType05;
const powerBaseCost = parseInt(values.powerBaseCost05)||0;
const powerAdvantages = parseFloat(values.powerAdvantages05)||0;
const powerReducedEND = values.powerReducedEND05;
let powerActiveCost=0;
let powerModifiedCost=0;
let powerRealCost=0;
let powerEND=0;
let thePowerDice=values.powerDice05;
var increasedENDLimitation=increasedENDlimitation(powerReducedEND);
var powerLimitations = (parseFloat(values.powerLimitations05)||0)+increasedENDLimitation;
powerPreReducedEndActiveCost=powerBaseCost * (1+powerAdvantages);
powerEND=calculatePowerEND(powerPreReducedEndActiveCost, powerReducedEND);
powerActiveCost=calculateActiveCost(powerBaseCost, powerAdvantages, powerReducedEND);
powerActiveCost=heroRoundLow(powerActiveCost);
thePowerDice=thePowerDice.replace(/[^\ddD\\+\\-]/g,"");
if (powerBaseCost != 0) {
switch (powerType) {
case 'variableSlot': powerRealCost=powerActiveCost/(1+powerLimitations)/5;
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
break;
case 'fixedSlot': powerRealCost=powerActiveCost/(1+powerLimitations)/10;
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
break;
default: powerRealCost=powerActiveCost/(1+powerLimitations);
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
}
} else {
powerActiveCost=0;
powerEND=0;
}
setAttrs({
"powerActiveCost05":powerActiveCost,
"powerEND05":powerEND,
"powerCP05":powerRealCost,
"hiddenPowerDice05":thePowerDice
});
});
});
// Use Power 05 Endurance
on("clicked:buttonPowerEND05", function () {
getAttrs(["currentEND","powerEND05"], function(values) {
const currentEND = parseInt(values.currentEND);
const powerEND = parseInt(values.powerEND05);
let updatedEND=currentEND-powerEND;
if (updatedEND<0) {
updatedEND=0;
}
setAttrs({
"currentEND":updatedEND
});
});
});
/* Activate Power 05 */
on('clicked:powerRoll05', (info) => {
startRoll("&{template:custom-power-attack} {{title=@{character_name} - @{character_title}}} {{subtitle= @{powerName05} - @{powerEffect05}}} {{desc=@{powerText05}}} {{Activate On = [[?{Modifiers|0}+@{powerSkillRoll05}]] **or less**}} {{Success Roll=[[3d6cf<0cs>0]]}} {{Attack Roll=[[3d6cf<0cs>0]]}} {{Effect Roll=[[@{hiddenPowerDice05}sd]]}} {{END=[[@{powerEND05}]]}}", (results) => {
// Roll activation and effect dice. If the option to auto apply endurance is TRUE, subtract the power's END once from currentEND.
getAttrs(["optionAutoSubtractEND", "powerEND05"], function(values) {
let autoSubtractEND = values.optionAutoSubtractEND;
let powerEND = parseInt(values.powerEND05)||0;
subtractEndurance(powerEND);
});
finishRoll(
results.rollId,
{
}
);
});
});
/* Update Power06 after detecting change to any of the numerical vales in the flex container */
on("change:powerType06 change:powerBaseCost06 change:powerAdvantages06 change:powerReducedEND06 change:powerLimitations06 change:powerDice06", function () {
getAttrs(["powerType06","powerBaseCost06","powerAdvantages06","powerReducedEND06","powerLimitations06","powerDice06"], function(values) {
let powerType = values.powerType06;
const powerBaseCost = parseInt(values.powerBaseCost06)||0;
const powerAdvantages = parseFloat(values.powerAdvantages06)||0;
const powerReducedEND = values.powerReducedEND06;
let powerActiveCost=0;
let powerModifiedCost=0;
let powerRealCost=0;
let powerEND=0;
let thePowerDice=values.powerDice06;
var increasedENDLimitation=increasedENDlimitation(powerReducedEND);
var powerLimitations = (parseFloat(values.powerLimitations06)||0)+increasedENDLimitation;
powerPreReducedEndActiveCost=powerBaseCost * (1+powerAdvantages);
powerEND=calculatePowerEND(powerPreReducedEndActiveCost, powerReducedEND);
powerActiveCost=calculateActiveCost(powerBaseCost, powerAdvantages, powerReducedEND);
powerActiveCost=heroRoundLow(powerActiveCost);
thePowerDice=thePowerDice.replace(/[^\ddD\\+\\-]/g,"");
if (powerBaseCost != 0) {
switch (powerType) {
case 'variableSlot': powerRealCost=powerActiveCost/(1+powerLimitations)/5;
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
break;
case 'fixedSlot': powerRealCost=powerActiveCost/(1+powerLimitations)/10;
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
break;
default: powerRealCost=powerActiveCost/(1+powerLimitations);
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
}
} else {
powerActiveCost=0;
powerEND=0;
}
setAttrs({
"powerActiveCost06":powerActiveCost,
"powerEND06":powerEND,
"powerCP06":powerRealCost,
"hiddenPowerDice06":thePowerDice
});
});
});
// Use Power 06
on("clicked:buttonPowerEND06", function () {
getAttrs(["currentEND","powerEND06"], function(values) {
const currentEND = parseInt(values.currentEND);
const powerEND = parseInt(values.powerEND06);
let updatedEND=currentEND-powerEND;
if (updatedEND<0) {
updatedEND=0;
}
setAttrs({
"currentEND":updatedEND
});
});
});
/* Activate Power 06 */
on('clicked:powerRoll06', (info) => {
startRoll("&{template:custom-power-attack} {{title=@{character_name} - @{character_title}}} {{subtitle= @{powerName06} - @{powerEffect06}}} {{desc=@{powerText06}}} {{Activate On = [[?{Modifiers|0}+@{powerSkillRoll06}]] **or less**}} {{Success Roll=[[3d6cf<0cs>0]]}} {{Attack Roll=[[3d6cf<0cs>0]]}} {{Effect Roll=[[@{hiddenPowerDice06}sd]]}} {{END=[[@{powerEND06}]]}}", (results) => {
// Roll activation and effect dice. If the option to auto apply endurance is TRUE, subtract the power's END once from currentEND.
getAttrs(["optionAutoSubtractEND", "powerEND06"], function(values) {
let autoSubtractEND = values.optionAutoSubtractEND;
let powerEND = parseInt(values.powerEND06)||0;
subtractEndurance(powerEND);
});
finishRoll(
results.rollId,
{
}
);
});
});
/* Update Power07 after detecting change to any of the numerical vales in the flex container */
on("change:powerType07 change:powerBaseCost07 change:powerAdvantages07 change:powerReducedEND07 change:powerLimitations07 change:powerDice07", function () {
getAttrs(["powerType07","powerBaseCost07","powerAdvantages07","powerReducedEND07","powerLimitations07","powerDice07"], function(values) {
let powerType = values.powerType07;
const powerBaseCost = parseInt(values.powerBaseCost07)||0;
const powerAdvantages = parseFloat(values.powerAdvantages07)||0;
const powerReducedEND = values.powerReducedEND07;
let powerActiveCost=0;
let powerModifiedCost=0;
let powerRealCost=0;
let powerEND=0;
let thePowerDice=values.powerDice07;
var increasedENDLimitation=increasedENDlimitation(powerReducedEND);
var powerLimitations = (parseFloat(values.powerLimitations07)||0)+increasedENDLimitation;
powerPreReducedEndActiveCost=powerBaseCost * (1+powerAdvantages);
powerEND=calculatePowerEND(powerPreReducedEndActiveCost, powerReducedEND);
powerActiveCost=calculateActiveCost(powerBaseCost, powerAdvantages, powerReducedEND);
powerActiveCost=heroRoundLow(powerActiveCost);
thePowerDice=thePowerDice.replace(/[^\ddD\\+\\-]/g,"");
if (powerBaseCost != 0) {
switch (powerType) {
case 'variableSlot': powerRealCost=powerActiveCost/(1+powerLimitations)/5;
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
break;
case 'fixedSlot': powerRealCost=powerActiveCost/(1+powerLimitations)/10;
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
break;
default: powerRealCost=powerActiveCost/(1+powerLimitations);
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
}
} else {
powerActiveCost=0;
powerEND=0;
}
setAttrs({
"powerActiveCost07":powerActiveCost,
"powerEND07":powerEND,
"powerCP07":powerRealCost,
"hiddenPowerDice07":thePowerDice
});
});
});
// Use Power 07 Endurance
on("clicked:buttonPowerEND07", function () {
getAttrs(["currentEND","powerEND07"], function(values) {
const currentEND = parseInt(values.currentEND);
const powerEND = parseInt(values.powerEND07);
let updatedEND=currentEND-powerEND;
if (updatedEND<0) {
updatedEND=0;
}
setAttrs({
"currentEND":updatedEND
});
});
});
/* Activate Power 07 */
on('clicked:powerRoll07', (info) => {
startRoll("&{template:custom-power-attack} {{title=@{character_name} - @{character_title}}} {{subtitle= @{powerName07} - @{powerEffect07}}} {{desc=@{powerText07}}} {{Activate On = [[?{Modifiers|0}+@{powerSkillRoll07}]] **or less**}} {{Success Roll=[[3d6cf<0cs>0]]}} {{Attack Roll=[[3d6cf<0cs>0]]}} {{Effect Roll=[[@{hiddenPowerDice07}sd]]}} {{END=[[@{powerEND07}]]}}", (results) => {
// Roll activation and effect dice. If the option to auto apply endurance is TRUE, subtract the power's END once from currentEND.
getAttrs(["optionAutoSubtractEND", "powerEND07"], function(values) {
let autoSubtractEND = values.optionAutoSubtractEND;
let powerEND = parseInt(values.powerEND07)||0;
subtractEndurance(powerEND);
});
finishRoll(
results.rollId,
{
}
);
});
});
/* Update Power08 after detecting change to any of the numerical vales in the flex container */
on("change:powerType08 change:powerBaseCost08 change:powerAdvantages08 change:powerReducedEND08 change:powerLimitations08 change:powerDice08", function () {
getAttrs(["powerType08","powerBaseCost08","powerAdvantages08","powerReducedEND08","powerLimitations08","powerDice08"], function(values) {
let powerType = values.powerType08;
const powerBaseCost = parseInt(values.powerBaseCost08)||0;
const powerAdvantages = parseFloat(values.powerAdvantages08)||0;
const powerReducedEND = values.powerReducedEND08;
let powerActiveCost=0;
let powerModifiedCost=0;
let powerRealCost=0;
let powerEND=0;
let thePowerDice=values.powerDice08;
var increasedENDLimitation=increasedENDlimitation(powerReducedEND);
var powerLimitations = (parseFloat(values.powerLimitations08)||0)+increasedENDLimitation;
powerPreReducedEndActiveCost=powerBaseCost * (1+powerAdvantages);
powerEND=calculatePowerEND(powerPreReducedEndActiveCost, powerReducedEND);
powerActiveCost=calculateActiveCost(powerBaseCost, powerAdvantages, powerReducedEND);
powerActiveCost=heroRoundLow(powerActiveCost);
thePowerDice=thePowerDice.replace(/[^\ddD\\+\\-]/g,"");
if (powerBaseCost != 0) {
switch (powerType) {
case 'variableSlot': powerRealCost=powerActiveCost/(1+powerLimitations)/5;
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
break;
case 'fixedSlot': powerRealCost=powerActiveCost/(1+powerLimitations)/10;
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
break;
default: powerRealCost=powerActiveCost/(1+powerLimitations);
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
}
} else {
powerActiveCost=0;
powerEND=0;
}
setAttrs({
"powerActiveCost08":powerActiveCost,
"powerEND08":powerEND,
"powerCP08":powerRealCost,
"hiddenPowerDice08":thePowerDice
});
});
});
// Use Power 08
on("clicked:buttonPowerEND08", function () {
getAttrs(["currentEND","powerEND08"], function(values) {
const currentEND = parseInt(values.currentEND);
const powerEND = parseInt(values.powerEND08);
let updatedEND=currentEND-powerEND;
if (updatedEND<0) {
updatedEND=0;
}
setAttrs({
"currentEND":updatedEND
});
});
});
/* Activate Power 08 */
on('clicked:powerRoll08', (info) => {
startRoll("&{template:custom-power-attack} {{title=@{character_name} - @{character_title}}} {{subtitle= @{powerName08} - @{powerEffect08}}} {{desc=@{powerText08}}} {{Activate On = [[?{Modifiers|0}+@{powerSkillRoll08}]] **or less**}} {{Success Roll=[[3d6cf<0cs>0]]}} {{Attack Roll=[[3d6cf<0cs>0]]}} {{Effect Roll=[[@{hiddenPowerDice08}sd]]}} {{END=[[@{powerEND08}]]}}", (results) => {
// Roll activation and effect dice. If the option to auto apply endurance is TRUE, subtract the power's END once from currentEND.
getAttrs(["optionAutoSubtractEND", "powerEND08"], function(values) {
let autoSubtractEND = values.optionAutoSubtractEND;
let powerEND = parseInt(values.powerEND08)||0;
subtractEndurance(powerEND);
});
finishRoll(
results.rollId,
{
}
);
});
});
/* Update Power09 after detecting change to any of the numerical vales in the flex container */
on("change:powerType09 change:powerBaseCost09 change:powerAdvantages09 change:powerReducedEND09 change:powerLimitations09 change:powerDice09", function () {
getAttrs(["powerType09","powerBaseCost09","powerAdvantages09","powerReducedEND09","powerLimitations09","powerDice09"], function(values) {
let powerType = values.powerType09;
const powerBaseCost = parseInt(values.powerBaseCost09)||0;
const powerAdvantages = parseFloat(values.powerAdvantages09)||0;
const powerReducedEND = values.powerReducedEND09;
let powerActiveCost=0;
let powerModifiedCost=0;
let powerRealCost=0;
let powerEND=0;
let thePowerDice=values.powerDice09;
var increasedENDLimitation=increasedENDlimitation(powerReducedEND);
var powerLimitations = (parseFloat(values.powerLimitations09)||0)+increasedENDLimitation;
powerPreReducedEndActiveCost=powerBaseCost * (1+powerAdvantages);
powerEND=calculatePowerEND(powerPreReducedEndActiveCost, powerReducedEND);
powerActiveCost=calculateActiveCost(powerBaseCost, powerAdvantages, powerReducedEND);
powerActiveCost=heroRoundLow(powerActiveCost);
thePowerDice=thePowerDice.replace(/[^\ddD\\+\\-]/g,"");
if (powerBaseCost != 0) {
switch (powerType) {
case 'variableSlot': powerRealCost=powerActiveCost/(1+powerLimitations)/5;
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
break;
case 'fixedSlot': powerRealCost=powerActiveCost/(1+powerLimitations)/10;
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
break;
default: powerRealCost=powerActiveCost/(1+powerLimitations);
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
}
} else {
powerActiveCost=0;
powerEND=0;
}
setAttrs({
"powerActiveCost09":powerActiveCost,
"powerEND09":powerEND,
"powerCP09":powerRealCost,
"hiddenPowerDice09":thePowerDice
});
});
});
// Use Power 09 Endurance
on("clicked:buttonPowerEND09", function () {
getAttrs(["currentEND","powerEND09"], function(values) {
const currentEND = parseInt(values.currentEND);
const powerEND = parseInt(values.powerEND09);
let updatedEND=currentEND-powerEND;
if (updatedEND<0) {
updatedEND=0;
}
setAttrs({
"currentEND":updatedEND
});
});
});
/* Activate Power 09 */
on('clicked:powerRoll09', (info) => {
startRoll("&{template:custom-power-attack} {{title=@{character_name} - @{character_title}}} {{subtitle= @{powerName09} - @{powerEffect09}}} {{desc=@{powerText09}}} {{Activate On = [[?{Modifiers|0}+@{powerSkillRoll09}]] **or less**}} {{Success Roll=[[3d6cf<0cs>0]]}} {{Attack Roll=[[3d6cf<0cs>0]]}} {{Effect Roll=[[@{hiddenPowerDice09}sd]]}} {{END=[[@{powerEND09}]]}}", (results) => {
// Roll activation and effect dice. If the option to auto apply endurance is TRUE, subtract the power's END once from currentEND.
getAttrs(["optionAutoSubtractEND", "powerEND09"], function(values) {
let autoSubtractEND = values.optionAutoSubtractEND;
let powerEND = parseInt(values.powerEND09)||0;
subtractEndurance(powerEND);
});
finishRoll(
results.rollId,
{
}
);
});
});
/* Update Power10 after detecting change to any of the numerical vales in the flex container */
on("change:powerType10 change:powerBaseCost10 change:powerAdvantages10 change:powerReducedEND10 change:powerLimitations10 change:powerDice10", function () {
getAttrs(["powerType10","powerBaseCost10","powerAdvantages10","powerReducedEND10","powerLimitations10","powerDice10"], function(values) {
let powerType = values.powerType10;
const powerBaseCost = parseInt(values.powerBaseCost10)||0;
const powerAdvantages = parseFloat(values.powerAdvantages10)||0;
const powerReducedEND = values.powerReducedEND10;
let powerActiveCost=0;
let powerModifiedCost=0;
let powerRealCost=0;
let powerEND=0;
let thePowerDice=values.powerDice10;
var increasedENDLimitation=increasedENDlimitation(powerReducedEND);
var powerLimitations = (parseFloat(values.powerLimitations10)||0)+increasedENDLimitation;
powerPreReducedEndActiveCost=powerBaseCost * (1+powerAdvantages);
powerEND=calculatePowerEND(powerPreReducedEndActiveCost, powerReducedEND);
powerActiveCost=calculateActiveCost(powerBaseCost, powerAdvantages, powerReducedEND);
powerActiveCost=heroRoundLow(powerActiveCost);
thePowerDice=thePowerDice.replace(/[^\ddD\\+\\-]/g,"");
if (powerBaseCost != 0) {
switch (powerType) {
case 'variableSlot': powerRealCost=powerActiveCost/(1+powerLimitations)/5;
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
break;
case 'fixedSlot': powerRealCost=powerActiveCost/(1+powerLimitations)/10;
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
break;
default: powerRealCost=powerActiveCost/(1+powerLimitations);
powerRealCost=heroRoundLow(powerRealCost);
if (powerRealCost<1) {
powerRealCost=1;
};
}
} else {
powerActiveCost=0;
powerEND=0;
}
setAttrs({
"powerActiveCost10":powerActiveCost,
"powerEND10":powerEND,
"powerCP10":powerRealCost,
"hiddenPowerDice10":thePowerDice
});
});
});
// Use Power 10 Endurance
on("clicked:buttonPowerEND10", function () {
getAttrs(["currentEND","powerEND10"], function(values) {
const currentEND = parseInt(values.currentEND);
const powerEND = parseInt(values.powerEND10);
let updatedEND=currentEND-powerEND;
if (updatedEND<0) {
updatedEND=0;
}
setAttrs({
"currentEND":updatedEND
});
});
});
/* Activate Power 10 */
on('clicked:powerRoll10', (info) => {
startRoll("&{template:custom-power-attack} {{title=@{character_name} - @{character_title}}} {{subtitle= @{powerName10} - @{powerEffect10}}} {{desc=@{powerText10}}} {{Activate On = [[?{Modifiers|0}+@{powerSkillRoll10}]] **or less**}} {{Success Roll=[[3d6cf<0cs>0]]}} {{Attack Roll=[[3d6cf<0cs>0]]}} {{Effect Roll=[[@{hiddenPowerDice10}sd]]}} {{END=[[@{powerEND10}]]}}", (results) => {
// Roll activation and effect dice. If the option to auto apply endurance is TRUE, subtract the power's END once from currentEND.
getAttrs(["optionAutoSubtractEND", "powerEND10"], function(values) {
let autoSubtractEND = values.optionAutoSubtractEND;
let powerEND = parseInt(values.powerEND10)||0;
subtractEndurance(powerEND);
});
finishRoll(
results.rollId,
{
}
);
});
});
// Update Tally Bar after change to any Power's CP cost.
on("change:powerCP01 change:powerCP02 change:powerCP03 change:powerCP04 change:powerCP05 change:powerCP06 change:powerCP07 change:powerCP08 change:powerCP09 change:powerCP10", function () {
sumPowersPerksTalents();
});
/* -------------- */
/* Power Movers */
/* -------------- */
on("clicked:powerDown01 clicked:powerUp02", function () {
getAttrs(["powerName01", "powerName02", "powerType01", "powerType02", "powerEffect01", "powerEffect02", "powerDice01", "powerDice02", "powerSkillRoll01", "powerSkillRoll02", "powerBaseCost01", "powerBaseCost02", "powerAdvantages01", "powerAdvantages02", "powerLimitations01", "powerLimitations02", "powerReducedEND01", "powerReducedEND02", "powerText01", "powerText02"], function(values) {
let destinationName = values.powerName02;
let sourceName = values.powerName01;
let destinationType = values.powerType02;
let sourceType = values.powerType01;
let destinationEffect = values.powerEffect02;
let sourceEffect = values.powerEffect01;
let destinationDice = values.powerDice02;
let sourceDice = values.powerDice01;
let destinationSkillRoll = values.powerSkillRoll02;
let sourceSkillRoll = values.powerSkillRoll01;
let destinationBaseCost = values.powerBaseCost02;
let sourceBaseCost = values.powerBaseCost01;
let destinationAdvantages = values.powerAdvantages02;
let sourceAdvantages = values.powerAdvantages01;
let destinationLimitations = values.powerLimitations02;
let sourceLimitations = values.powerLimitations01;
let destinationReducedEND = values.powerReducedEND02;
let sourceReducedEND = values.powerReducedEND01;
let destinationText = values.powerText02;
let sourceText = values.powerText01;
setAttrs({
"powerName02":sourceName,
"powerName01":destinationName,
"powerType02":sourceType,
"powerType01":destinationType,
"powerEffect02":sourceEffect,
"powerEffect01":destinationEffect,
"powerDice02":sourceDice,
"powerDice01":destinationDice,
"powerSkillRoll02":sourceSkillRoll,
"powerSkillRoll01":destinationSkillRoll,
"powerBaseCost02":sourceBaseCost,
"powerBaseCost01":destinationBaseCost,
"powerAdvantages02":sourceAdvantages,
"powerAdvantages01":destinationAdvantages,
"powerLimitations02":sourceLimitations,
"powerLimitations01":destinationLimitations,
"powerReducedEND02":sourceReducedEND,
"powerReducedEND01":destinationReducedEND,
"powerText02":sourceText,
"powerText01":destinationText
});
});
});
on("clicked:powerDown02 clicked:powerUp03", function () {
getAttrs(["powerName02", "powerName03", "powerType02", "powerType03", "powerEffect02", "powerEffect03", "powerDice02", "powerDice03", "powerSkillRoll02", "powerSkillRoll03", "powerBaseCost02", "powerBaseCost03", "powerAdvantages02", "powerAdvantages03", "powerLimitations02", "powerLimitations03", "powerReducedEND02", "powerReducedEND03", "powerText02", "powerText03"], function(values) {
let destinationName = values.powerName03;
let sourceName = values.powerName02;
let destinationType = values.powerType03;
let sourceType = values.powerType02;
let destinationEffect = values.powerEffect03;
let sourceEffect = values.powerEffect02;
let destinationDice = values.powerDice03;
let sourceDice = values.powerDice02;
let destinationSkillRoll = values.powerSkillRoll03;
let sourceSkillRoll = values.powerSkillRoll02;
let destinationBaseCost = values.powerBaseCost03;
let sourceBaseCost = values.powerBaseCost02;
let destinationAdvantages = values.powerAdvantages03;
let sourceAdvantages = values.powerAdvantages02;
let destinationLimitations = values.powerLimitations03;
let sourceLimitations = values.powerLimitations02;
let destinationReducedEND = values.powerReducedEND03;
let sourceReducedEND = values.powerReducedEND02;
let destinationText = values.powerText03;
let sourceText = values.powerText02;
setAttrs({
"powerName03":sourceName,
"powerName02":destinationName,
"powerType03":sourceType,
"powerType02":destinationType,
"powerEffect03":sourceEffect,
"powerEffect02":destinationEffect,
"powerDice03":sourceDice,
"powerDice02":destinationDice,
"powerSkillRoll03":sourceSkillRoll,
"powerSkillRoll02":destinationSkillRoll,
"powerBaseCost03":sourceBaseCost,
"powerBaseCost02":destinationBaseCost,
"powerAdvantages03":sourceAdvantages,
"powerAdvantages02":destinationAdvantages,
"powerLimitations03":sourceLimitations,
"powerLimitations02":destinationLimitations,
"powerReducedEND03":sourceReducedEND,
"powerReducedEND02":destinationReducedEND,
"powerText03":sourceText,
"powerText02":destinationText
});
});
});
on("clicked:powerDown03 clicked:powerUp04", function () {
getAttrs(["powerName03", "powerName04", "powerType03", "powerType04", "powerEffect03", "powerEffect04", "powerDice03", "powerDice04", "powerSkillRoll03", "powerSkillRoll04", "powerBaseCost03", "powerBaseCost04", "powerAdvantages03", "powerAdvantages04", "powerLimitations03", "powerLimitations04", "powerReducedEND03", "powerReducedEND04", "powerText03", "powerText04"], function(values) {
let destinationName = values.powerName04;
let sourceName = values.powerName03;
let destinationType = values.powerType04;
let sourceType = values.powerType03;
let destinationEffect = values.powerEffect04;
let sourceEffect = values.powerEffect03;
let destinationDice = values.powerDice04;
let sourceDice = values.powerDice03;
let destinationSkillRoll = values.powerSkillRoll04;
let sourceSkillRoll = values.powerSkillRoll03;
let destinationBaseCost = values.powerBaseCost04;
let sourceBaseCost = values.powerBaseCost03;
let destinationAdvantages = values.powerAdvantages04;
let sourceAdvantages = values.powerAdvantages03;
let destinationLimitations = values.powerLimitations04;
let sourceLimitations = values.powerLimitations03;
let destinationReducedEND = values.powerReducedEND04;
let sourceReducedEND = values.powerReducedEND03;
let destinationText = values.powerText04;
let sourceText = values.powerText03;
setAttrs({
"powerName04":sourceName,
"powerName03":destinationName,
"powerType04":sourceType,
"powerType03":destinationType,
"powerEffect04":sourceEffect,
"powerEffect03":destinationEffect,
"powerDice04":sourceDice,
"powerDice03":destinationDice,
"powerSkillRoll04":sourceSkillRoll,
"powerSkillRoll03":destinationSkillRoll,
"powerBaseCost04":sourceBaseCost,
"powerBaseCost03":destinationBaseCost,
"powerAdvantages04":sourceAdvantages,
"powerAdvantages03":destinationAdvantages,
"powerLimitations04":sourceLimitations,
"powerLimitations03":destinationLimitations,
"powerReducedEND04":sourceReducedEND,
"powerReducedEND03":destinationReducedEND,
"powerText04":sourceText,
"powerText03":destinationText
});
});
});
on("clicked:powerDown04 clicked:powerUp05", function () {
getAttrs(["powerName04", "powerName05", "powerType04", "powerType05", "powerEffect04", "powerEffect05", "powerDice04", "powerDice05", "powerSkillRoll04", "powerSkillRoll05", "powerBaseCost04", "powerBaseCost05", "powerAdvantages04", "powerAdvantages05", "powerLimitations04", "powerLimitations05", "powerReducedEND04", "powerReducedEND05", "powerText04", "powerText05"], function(values) {
let destinationName = values.powerName05;
let sourceName = values.powerName04;
let destinationType = values.powerType05;
let sourceType = values.powerType04;
let destinationEffect = values.powerEffect05;
let sourceEffect = values.powerEffect04;
let destinationDice = values.powerDice05;
let sourceDice = values.powerDice04;
let destinationSkillRoll = values.powerSkillRoll05;
let sourceSkillRoll = values.powerSkillRoll04;
let destinationBaseCost = values.powerBaseCost05;
let sourceBaseCost = values.powerBaseCost04;
let destinationAdvantages = values.powerAdvantages05;
let sourceAdvantages = values.powerAdvantages04;
let destinationLimitations = values.powerLimitations05;
let sourceLimitations = values.powerLimitations04;
let destinationReducedEND = values.powerReducedEND05;
let sourceReducedEND = values.powerReducedEND04;
let destinationText = values.powerText05;
let sourceText = values.powerText04;
setAttrs({
"powerName05":sourceName,
"powerName04":destinationName,
"powerType05":sourceType,
"powerType04":destinationType,
"powerEffect05":sourceEffect,
"powerEffect04":destinationEffect,
"powerDice05":sourceDice,
"powerDice04":destinationDice,
"powerSkillRoll05":sourceSkillRoll,
"powerSkillRoll04":destinationSkillRoll,
"powerBaseCost05":sourceBaseCost,
"powerBaseCost04":destinationBaseCost,
"powerAdvantages05":sourceAdvantages,
"powerAdvantages04":destinationAdvantages,
"powerLimitations05":sourceLimitations,
"powerLimitations04":destinationLimitations,
"powerReducedEND05":sourceReducedEND,
"powerReducedEND04":destinationReducedEND,
"powerText05":sourceText,
"powerText04":destinationText
});
});
});
on("clicked:powerDown05 clicked:powerUp06", function () {
getAttrs(["powerName05", "powerName06", "powerType05", "powerType06", "powerEffect05", "powerEffect06", "powerDice05", "powerDice06", "powerSkillRoll05", "powerSkillRoll06", "powerBaseCost05", "powerBaseCost06", "powerAdvantages05", "powerAdvantages06", "powerLimitations05", "powerLimitations06", "powerReducedEND05", "powerReducedEND06", "powerText05", "powerText06"], function(values) {
let destinationName = values.powerName06;
let sourceName = values.powerName05;
let destinationType = values.powerType06;
let sourceType = values.powerType05;
let destinationEffect = values.powerEffect06;
let sourceEffect = values.powerEffect05;
let destinationDice = values.powerDice06;
let sourceDice = values.powerDice05;
let destinationSkillRoll = values.powerSkillRoll06;
let sourceSkillRoll = values.powerSkillRoll05;
let destinationBaseCost = values.powerBaseCost06;
let sourceBaseCost = values.powerBaseCost05;
let destinationAdvantages = values.powerAdvantages06;
let sourceAdvantages = values.powerAdvantages05;
let destinationLimitations = values.powerLimitations06;
let sourceLimitations = values.powerLimitations05;
let destinationReducedEND = values.powerReducedEND06;
let sourceReducedEND = values.powerReducedEND05;
let destinationText = values.powerText06;
let sourceText = values.powerText05;
setAttrs({
"powerName06":sourceName,
"powerName05":destinationName,
"powerType06":sourceType,
"powerType05":destinationType,
"powerEffect06":sourceEffect,
"powerEffect05":destinationEffect,
"powerDice06":sourceDice,
"powerDice05":destinationDice,
"powerSkillRoll06":sourceSkillRoll,
"powerSkillRoll05":destinationSkillRoll,
"powerBaseCost06":sourceBaseCost,
"powerBaseCost05":destinationBaseCost,
"powerAdvantages06":sourceAdvantages,
"powerAdvantages05":destinationAdvantages,
"powerLimitations06":sourceLimitations,
"powerLimitations05":destinationLimitations,
"powerReducedEND06":sourceReducedEND,
"powerReducedEND05":destinationReducedEND,
"powerText06":sourceText,
"powerText05":destinationText
});
});
});
on("clicked:powerDown06 clicked:powerUp07", function () {
getAttrs(["powerName06", "powerName07", "powerType06", "powerType07", "powerEffect06", "powerEffect07", "powerDice06", "powerDice07", "powerSkillRoll06", "powerSkillRoll07", "powerBaseCost06", "powerBaseCost07", "powerAdvantages06", "powerAdvantages07", "powerLimitations06", "powerLimitations07", "powerReducedEND06", "powerReducedEND07", "powerText06", "powerText07"], function(values) {
let destinationName = values.powerName07;
let sourceName = values.powerName06;
let destinationType = values.powerType07;
let sourceType = values.powerType06;
let destinationEffect = values.powerEffect07;
let sourceEffect = values.powerEffect06;
let destinationDice = values.powerDice07;
let sourceDice = values.powerDice06;
let destinationSkillRoll = values.powerSkillRoll07;
let sourceSkillRoll = values.powerSkillRoll06;
let destinationBaseCost = values.powerBaseCost07;
let sourceBaseCost = values.powerBaseCost06;
let destinationAdvantages = values.powerAdvantages07;
let sourceAdvantages = values.powerAdvantages06;
let destinationLimitations = values.powerLimitations07;
let sourceLimitations = values.powerLimitations06;
let destinationReducedEND = values.powerReducedEND07;
let sourceReducedEND = values.powerReducedEND06;
let destinationText = values.powerText07;
let sourceText = values.powerText06;
setAttrs({
"powerName07":sourceName,
"powerName06":destinationName,
"powerType07":sourceType,
"powerType06":destinationType,
"powerEffect07":sourceEffect,
"powerEffect06":destinationEffect,
"powerDice07":sourceDice,
"powerDice06":destinationDice,
"powerSkillRoll07":sourceSkillRoll,
"powerSkillRoll06":destinationSkillRoll,
"powerBaseCost07":sourceBaseCost,
"powerBaseCost06":destinationBaseCost,
"powerAdvantages07":sourceAdvantages,
"powerAdvantages06":destinationAdvantages,
"powerLimitations07":sourceLimitations,
"powerLimitations06":destinationLimitations,
"powerReducedEND07":sourceReducedEND,
"powerReducedEND06":destinationReducedEND,
"powerText07":sourceText,
"powerText06":destinationText
});
});
});
on("clicked:powerDown07 clicked:powerUp08", function () {
getAttrs(["powerName07", "powerName08", "powerType07", "powerType08", "powerEffect07", "powerEffect08", "powerDice07", "powerDice08", "powerSkillRoll07", "powerSkillRoll08", "powerBaseCost07", "powerBaseCost08", "powerAdvantages07", "powerAdvantages08", "powerLimitations07", "powerLimitations08", "powerReducedEND07", "powerReducedEND08", "powerText07", "powerText08"], function(values) {
let destinationName = values.powerName08;
let sourceName = values.powerName07;
let destinationType = values.powerType08;
let sourceType = values.powerType07;
let destinationEffect = values.powerEffect08;
let sourceEffect = values.powerEffect07;
let destinationDice = values.powerDice08;
let sourceDice = values.powerDice07;
let destinationSkillRoll = values.powerSkillRoll08;
let sourceSkillRoll = values.powerSkillRoll07;
let destinationBaseCost = values.powerBaseCost08;
let sourceBaseCost = values.powerBaseCost07;
let destinationAdvantages = values.powerAdvantages08;
let sourceAdvantages = values.powerAdvantages07;
let destinationLimitations = values.powerLimitations08;
let sourceLimitations = values.powerLimitations07;
let destinationReducedEND = values.powerReducedEND08;
let sourceReducedEND = values.powerReducedEND07;
let destinationText = values.powerText08;
let sourceText = values.powerText07;
setAttrs({
"powerName08":sourceName,
"powerName07":destinationName,
"powerType08":sourceType,
"powerType07":destinationType,
"powerEffect08":sourceEffect,
"powerEffect07":destinationEffect,
"powerDice08":sourceDice,
"powerDice07":destinationDice,
"powerSkillRoll08":sourceSkillRoll,
"powerSkillRoll07":destinationSkillRoll,
"powerBaseCost08":sourceBaseCost,
"powerBaseCost07":destinationBaseCost,
"powerAdvantages08":sourceAdvantages,
"powerAdvantages07":destinationAdvantages,
"powerLimitations08":sourceLimitations,
"powerLimitations07":destinationLimitations,
"powerReducedEND08":sourceReducedEND,
"powerReducedEND07":destinationReducedEND,
"powerText08":sourceText,
"powerText07":destinationText
});
});
});
on("clicked:powerDown08 clicked:powerUp09", function () {
getAttrs(["powerName08", "powerName09", "powerType08", "powerType09", "powerEffect08", "powerEffect09", "powerDice08", "powerDice09", "powerSkillRoll08", "powerSkillRoll09", "powerBaseCost08", "powerBaseCost09", "powerAdvantages08", "powerAdvantages09", "powerLimitations08", "powerLimitations09", "powerReducedEND08", "powerReducedEND09", "powerText08", "powerText09"], function(values) {
let destinationName = values.powerName09;
let sourceName = values.powerName08;
let destinationType = values.powerType09;
let sourceType = values.powerType08;
let destinationEffect = values.powerEffect09;
let sourceEffect = values.powerEffect08;
let destinationDice = values.powerDice09;
let sourceDice = values.powerDice08;
let destinationSkillRoll = values.powerSkillRoll09;
let sourceSkillRoll = values.powerSkillRoll08;
let destinationBaseCost = values.powerBaseCost09;
let sourceBaseCost = values.powerBaseCost08;
let destinationAdvantages = values.powerAdvantages09;
let sourceAdvantages = values.powerAdvantages08;
let destinationLimitations = values.powerLimitations09;
let sourceLimitations = values.powerLimitations08;
let destinationReducedEND = values.powerReducedEND09;
let sourceReducedEND = values.powerReducedEND08;
let destinationText = values.powerText09;
let sourceText = values.powerText08;
setAttrs({
"powerName09":sourceName,
"powerName08":destinationName,
"powerType09":sourceType,
"powerType08":destinationType,
"powerEffect09":sourceEffect,
"powerEffect08":destinationEffect,
"powerDice08":sourceDice,
"powerDice09":destinationDice,
"powerSkillRoll09":sourceSkillRoll,
"powerSkillRoll08":destinationSkillRoll,
"powerBaseCost09":sourceBaseCost,
"powerBaseCost08":destinationBaseCost,
"powerAdvantages09":sourceAdvantages,
"powerAdvantages08":destinationAdvantages,
"powerLimitations09":sourceLimitations,
"powerLimitations08":destinationLimitations,
"powerReducedEND09":sourceReducedEND,
"powerReducedEND08":destinationReducedEND,
"powerText09":sourceText,
"powerText08":destinationText
});
});
});
on("clicked:powerDown09 clicked:powerUp10", function () {
getAttrs(["powerName09", "powerName10", "powerType09", "powerType10", "powerEffect09", "powerEffect10", "powerDice09", "powerDice10", "powerSkillRoll09", "powerSkillRoll10", "powerBaseCost09", "powerBaseCost10", "powerAdvantages09", "powerAdvantages10", "powerLimitations09", "powerLimitations10", "powerReducedEND09", "powerReducedEND10", "powerText09", "powerText10"], function(values) {
let destinationName = values.powerName10;
let sourceName = values.powerName09;
let destinationType = values.powerType10;
let sourceType = values.powerType09;
let destinationEffect = values.powerEffect10;
let sourceEffect = values.powerEffect09;
let destinationDice = values.powerDice10;
let sourceDice = values.powerDice09;
let destinationSkillRoll = values.powerSkillRoll10;
let sourceSkillRoll = values.powerSkillRoll09;
let destinationBaseCost = values.powerBaseCost10;
let sourceBaseCost = values.powerBaseCost09;
let destinationAdvantages = values.powerAdvantages10;
let sourceAdvantages = values.powerAdvantages09;
let destinationLimitations = values.powerLimitations10;
let sourceLimitations = values.powerLimitations09;
let destinationReducedEND = values.powerReducedEND10;
let sourceReducedEND = values.powerReducedEND09;
let destinationText = values.powerText10;
let sourceText = values.powerText09;
setAttrs({
"powerName10":sourceName,
"powerName09":destinationName,
"powerType10":sourceType,
"powerType09":destinationType,
"powerEffect10":sourceEffect,
"powerEffect09":destinationEffect,
"powerDice09":sourceDice,
"powerDice10":destinationDice,
"powerSkillRoll10":sourceSkillRoll,
"powerSkillRoll09":destinationSkillRoll,
"powerBaseCost10":sourceBaseCost,
"powerBaseCost09":destinationBaseCost,
"powerAdvantages10":sourceAdvantages,
"powerAdvantages09":destinationAdvantages,
"powerLimitations10":sourceLimitations,
"powerLimitations09":destinationLimitations,
"powerReducedEND10":sourceReducedEND,
"powerReducedEND09":destinationReducedEND,
"powerText10":sourceText,
"powerText09":destinationText
});
});
});
on("clicked:powerDown10 clicked:powerUp01", function () {
getAttrs(["powerName10", "powerName01", "powerType10", "powerType01", "powerEffect10", "powerEffect01", "powerDice10", "powerDice01", "powerSkillRoll10", "powerSkillRoll01", "powerBaseCost10", "powerBaseCost01", "powerAdvantages10", "powerAdvantages01", "powerLimitations10", "powerLimitations01", "powerReducedEND10", "powerReducedEND01", "powerText10", "powerText01"], function(values) {
let destinationName = values.powerName01;
let sourceName = values.powerName10;
let destinationType = values.powerType01;
let sourceType = values.powerType10;
let destinationEffect = values.powerEffect01;
let sourceEffect = values.powerEffect10;
let destinationDice = values.powerDice01;
let sourceDice = values.powerDice10;
let destinationSkillRoll = values.powerSkillRoll01;
let sourceSkillRoll = values.powerSkillRoll10;
let destinationBaseCost = values.powerBaseCost01;
let sourceBaseCost = values.powerBaseCost10;
let destinationAdvantages = values.powerAdvantages01;
let sourceAdvantages = values.powerAdvantages10;
let destinationLimitations = values.powerLimitations01;
let sourceLimitations = values.powerLimitations10;
let destinationReducedEND = values.powerReducedEND01;
let sourceReducedEND = values.powerReducedEND10;
let destinationText = values.powerText01;
let sourceText = values.powerText10;
setAttrs({
"powerName01":sourceName,
"powerName10":destinationName,
"powerType01":sourceType,
"powerType10":destinationType,
"powerEffect01":sourceEffect,
"powerEffect10":destinationEffect,
"powerDice01":sourceDice,
"powerDice10":destinationDice,
"powerSkillRoll01":sourceSkillRoll,
"powerSkillRoll10":destinationSkillRoll,
"powerBaseCost01":sourceBaseCost,
"powerBaseCost10":destinationBaseCost,
"powerAdvantages01":sourceAdvantages,
"powerAdvantages10":destinationAdvantages,
"powerLimitations01":sourceLimitations,
"powerLimitations10":destinationLimitations,
"powerReducedEND01":sourceReducedEND,
"powerReducedEND10":destinationReducedEND,
"powerText01":sourceText,
"powerText10":destinationText
});
});
});
/* -------------------------------------------------- */
/* Functions used for skills tab */
/* -------------------------------------------------- */
function calculateLanguageSkillCost(skillFluency, skillLiteracy, enhancerLinguist, literacyCost) {
var enhancerBonus=0;
var languageCP=0;
let literacyCP=0;
if (skillLiteracy!=0) {
literacyCP=literacyCost;
}
if (enhancerLinguist!=0) {
enhancerBonus=1;
}
switch (skillFluency) {
case "native": languageCP = literacyCP;
break;
case "none": languageCP = literacyCP;
break;
case "basic": languageCP = 1+literacyCP;
break;
case "fluent": languageCP = 2+literacyCP-enhancerBonus;
break;
case "accent": languageCP = 3+literacyCP-enhancerBonus;
break;
case "idiomatic": languageCP = 4+literacyCP-enhancerBonus;
break;
case "imitate": languageCP = 5+literacyCP-enhancerBonus;
break;
}
return languageCP;
}
function standardSkillChance(theBaseSkillRoll,skillCP,additionalLevels) {
var skillCost=3;
var skillLevelCost=2;
var theSkillRollChance;
var theSkillBonus;
if (skillCP==0) {
theSkillRollChance=0;
} else if (skillCP==1) {
theSkillRollChance=8;
} else if (skillCP==2) {
theSkillRollChance=10;
} else {
theSkillBonus=Math.floor((skillCP-skillCost)/skillLevelCost);
theSkillRollChance=theBaseSkillRoll+theSkillBonus+additionalLevels;
}
return theSkillRollChance;
}
function knowledgeSkillChance(enhancer,skillCP,additionalLevels) {
// Calculate KS, PS, or AK-type skill roll chance.
var skillCost=2;
var skillLevelCost=1;
var theBaseSkillRoll=11;
var theSkillBonus=0;
var theSkillRollChance=0;
if (skillCP==0) {
theSkillRollChance = 0;
} else if (skillCP==1 && enhancer == 0) {
theSkillRollChance = 8;
} else if ( (skillCP>=2) && (enhancer == 0) ) {
theSkillBonus=skillCP-skillCost;
theSkillRollChance = theBaseSkillRoll+theSkillBonus+additionalLevels;
} else {
skillCost=1;
theSkillBonus=skillCP-skillCost;
theSkillRollChance = theBaseSkillRoll+theSkillBonus+additionalLevels;
}
return theSkillRollChance;
}
function knowledgeIntSkillChance(theBaseSkillRoll, enhancer, skillCP, additionalLevels) {
// Knowledge, Professional, and Science Skills can be purchased as Intelligence-based skills. In such a case
// this function replaces the more general knowledgeSkillChance(...) function.
var skillCost=3;
var skillLevelCost=1;
var theSkillBonus=0;
var theSkillRollChance=0;
if (skillCP==0) {
theSkillRollChance = 0;
} else if (skillCP==1 && enhancer == 0) {
theSkillRollChance = 8;
} else if (skillCP==1 && enhancer != 0) {
theSkillRollChance = 11+additionalLevels; // I.e., a regular Knowledge Skill is the better choice.
} else if ( (skillCP==2) && (enhancer == 0) ) {
theSkillRollChance = 11+additionalLevels; // I.e., a regular Knowledge Skill is better than 10- skill proficiency.
} else if ( (skillCP==3) && (enhancer == 0) ) {
theSkillBonus=0;
theSkillRollChance=theBaseSkillRoll+theSkillBonus+additionalLevels;
} else {
if (enhancer!=0) {
skillCost=2;
}
theSkillBonus=Math.floor((skillCP-skillCost)/skillLevelCost);
theSkillRollChance=theBaseSkillRoll+theSkillBonus+additionalLevels;
}
return theSkillRollChance;
}
function calculateSkillChance(skillType,skillCP,enhancerJack,enhancerSch,enhancerSci,enhancerTrav,strengthChance,dexterityChance,constitutionChance,intelligenceChance,egoChance,presenceChance,interactionSkillLevels,intellectSkillLevels,agilitySkillLevels,bonusLevels) {
// Calculates the skill roll chance for a general skill.
//
// A bit crazy, but all of these variables need to be passed to this function for the the switch function contained below
// to calculate the skill roll chance for the skill passed to the function.
switch (skillType) {
case "str":
theSkillRollChance=standardSkillChance( strengthChance,skillCP,bonusLevels);
break;
case "dex":
theSkillRollChance=standardSkillChance( dexterityChance,skillCP,agilitySkillLevels+bonusLevels);
break;
case "con":
theSkillRollChance=standardSkillChance( constitutionChance,skillCP,bonusLevels);
break;
case "int":
theSkillRollChance=standardSkillChance( intelligenceChance,skillCP,intellectSkillLevels+bonusLevels);
break;
case "ego":
theSkillRollChance=standardSkillChance( egoChance,skillCP,bonusLevels);
break;
case "pre":
theSkillRollChance=standardSkillChance( presenceChance,skillCP,interactionSkillLevels+bonusLevels);
break;
case "ps":
theSkillRollChance=knowledgeSkillChance( enhancerJack,skillCP,bonusLevels);
break;
case "intPS":
theSkillRollChance=knowledgeIntSkillChance( intelligenceChance, enhancerJack,skillCP,bonusLevels);
break;
case "dexPS":
theSkillRollChance=knowledgeIntSkillChance( dexterityChance, enhancerJack,skillCP,bonusLevels);
break;
case "ks":
theSkillRollChance=knowledgeSkillChance( enhancerSch,skillCP,bonusLevels);
break;
case "intKS":
theSkillRollChance=knowledgeIntSkillChance( intelligenceChance, enhancerSch, skillCP,bonusLevels);
break;
case "ss":
theSkillRollChance=knowledgeSkillChance( enhancerSci,skillCP,bonusLevels);
break;
case "intSS":
theSkillRollChance=knowledgeIntSkillChance( intelligenceChance, enhancerSci, skillCP,bonusLevels);
break;
case "ak":
theSkillRollChance=knowledgeSkillChance( enhancerTrav,skillCP,bonusLevels);;
break;
case "other":
theSkillRollChance=0;
break;
case "none":
theSkillRollChance=0;
break;
case "group":
theSkillRollChance=0;
break;
default:
theSkillRollChance=0;
}
return theSkillRollChance;
}
/* -------------- */
/* Skill Movers */
/* -------------- */
/* Move Skills 01-10 */
on("clicked:skillDown01 clicked:skillUp02", function () {
getAttrs(["skillName01", "skillName02", "skillType01", "skillType02", "skillCP01", "skillCP02"], function(values) {
let destinationName = values.skillName02;
let sourceName = values.skillName01;
let destinationType = values.skillType02;
let sourceType = values.skillType01;
let destinationCP = values.skillCP02;
let sourceCP = values.skillCP01;
setAttrs({
"skillName02":sourceName,
"skillName01":destinationName,
"skillType02":sourceType,
"skillType01":destinationType,
"skillCP02":sourceCP,
"skillCP01":destinationCP
});
});
});
on("clicked:skillDown02 clicked:skillUp03", function () {
getAttrs(["skillName02", "skillName03", "skillType02", "skillType03", "skillCP02", "skillCP03"], function(values) {
let destinationName = values.skillName03;
let sourceName = values.skillName02;
let destinationType = values.skillType03;
let sourceType = values.skillType02;
let destinationCP = values.skillCP03;
let sourceCP = values.skillCP02;
setAttrs({
"skillName03":sourceName,
"skillName02":destinationName,
"skillType03":sourceType,
"skillType02":destinationType,
"skillCP03":sourceCP,
"skillCP02":destinationCP
});
});
});
on("clicked:skillDown03 clicked:skillUp04", function () {
getAttrs(["skillName03", "skillName04", "skillType03", "skillType04", "skillCP03", "skillCP04"], function(values) {
let destinationName = values.skillName04;
let sourceName = values.skillName03;
let destinationType = values.skillType04;
let sourceType = values.skillType03;
let destinationCP = values.skillCP04;
let sourceCP = values.skillCP03;
setAttrs({
"skillName04":sourceName,
"skillName03":destinationName,
"skillType04":sourceType,
"skillType03":destinationType,
"skillCP04":sourceCP,
"skillCP03":destinationCP
});
});
});
on("clicked:skillDown04 clicked:skillUp05", function () {
getAttrs(["skillName04", "skillName05", "skillType04", "skillType05", "skillCP04", "skillCP05"], function(values) {
let destinationName = values.skillName05;
let sourceName = values.skillName04;
let destinationType = values.skillType05;
let sourceType = values.skillType04;
let destinationCP = values.skillCP05;
let sourceCP = values.skillCP04;
setAttrs({
"skillName05":sourceName,
"skillName04":destinationName,
"skillType05":sourceType,
"skillType04":destinationType,
"skillCP05":sourceCP,
"skillCP04":destinationCP
});
});
});
on("clicked:skillDown05 clicked:skillUp06", function () {
getAttrs(["skillName05", "skillName06", "skillType05", "skillType06", "skillCP05", "skillCP06"], function(values) {
let destinationName = values.skillName06;
let sourceName = values.skillName05;
let destinationType = values.skillType06;
let sourceType = values.skillType05;
let destinationCP = values.skillCP06;
let sourceCP = values.skillCP05;
setAttrs({
"skillName06":sourceName,
"skillName05":destinationName,
"skillType06":sourceType,
"skillType05":destinationType,
"skillCP06":sourceCP,
"skillCP05":destinationCP
});
});
});
on("clicked:skillDown06 clicked:skillUp07", function () {
getAttrs(["skillName06", "skillName07", "skillType06", "skillType07", "skillCP06", "skillCP07"], function(values) {
let destinationName = values.skillName07;
let sourceName = values.skillName06;
let destinationType = values.skillType07;
let sourceType = values.skillType06;
let destinationCP = values.skillCP07;
let sourceCP = values.skillCP06;
setAttrs({
"skillName07":sourceName,
"skillName06":destinationName,
"skillType07":sourceType,
"skillType06":destinationType,
"skillCP07":sourceCP,
"skillCP06":destinationCP
});
});
});
on("clicked:skillDown07 clicked:skillUp08", function () {
getAttrs(["skillName07", "skillName08", "skillType07", "skillType08", "skillCP07", "skillCP08"], function(values) {
let destinationName = values.skillName08;
let sourceName = values.skillName07;
let destinationType = values.skillType08;
let sourceType = values.skillType07;
let destinationCP = values.skillCP08;
let sourceCP = values.skillCP07;
setAttrs({
"skillName08":sourceName,
"skillName07":destinationName,
"skillType08":sourceType,
"skillType07":destinationType,
"skillCP08":sourceCP,
"skillCP07":destinationCP
});
});
});
on("clicked:skillDown08 clicked:skillUp09", function () {
getAttrs(["skillName08", "skillName09", "skillType08", "skillType09", "skillCP08", "skillCP09"], function(values) {
let destinationName = values.skillName09;
let sourceName = values.skillName08;
let destinationType = values.skillType09;
let sourceType = values.skillType08;
let destinationCP = values.skillCP09;
let sourceCP = values.skillCP08;
setAttrs({
"skillName09":sourceName,
"skillName08":destinationName,
"skillType09":sourceType,
"skillType08":destinationType,
"skillCP09":sourceCP,
"skillCP08":destinationCP
});
});
});
on("clicked:skillDown09 clicked:skillUp10", function () {
getAttrs(["skillName09", "skillName10", "skillType09", "skillType10", "skillCP09", "skillCP10"], function(values) {
let destinationName = values.skillName10;
let sourceName = values.skillName09;
let destinationType = values.skillType10;
let sourceType = values.skillType09;
let destinationCP = values.skillCP10;
let sourceCP = values.skillCP09;
setAttrs({
"skillName10":sourceName,
"skillName09":destinationName,
"skillType10":sourceType,
"skillType09":destinationType,
"skillCP10":sourceCP,
"skillCP09":destinationCP
});
});
});
/* Move Skills 11-20 */
on("clicked:skillDown10 clicked:skillUp11", function () {
getAttrs(["skillName10", "skillName11", "skillType10", "skillType11", "skillCP10", "skillCP11"], function(values) {
let destinationName = values.skillName11;
let sourceName = values.skillName10;
let destinationType = values.skillType11;
let sourceType = values.skillType10;
let destinationCP = values.skillCP11;
let sourceCP = values.skillCP10;
setAttrs({
"skillName11":sourceName,
"skillName10":destinationName,
"skillType11":sourceType,
"skillType10":destinationType,
"skillCP11":sourceCP,
"skillCP10":destinationCP
});
});
});
on("clicked:skillDown11 clicked:skillUp12", function () {
getAttrs(["skillName11", "skillName12", "skillType11", "skillType12", "skillCP11", "skillCP12"], function(values) {
let destinationName = values.skillName12;
let sourceName = values.skillName11;
let destinationType = values.skillType12;
let sourceType = values.skillType11;
let destinationCP = values.skillCP12;
let sourceCP = values.skillCP11;
setAttrs({
"skillName12":sourceName,
"skillName11":destinationName,
"skillType12":sourceType,
"skillType11":destinationType,
"skillCP12":sourceCP,
"skillCP11":destinationCP
});
});
});
on("clicked:skillDown12 clicked:skillUp13", function () {
getAttrs(["skillName12", "skillName13", "skillType12", "skillType13", "skillCP12", "skillCP13"], function(values) {
let destinationName = values.skillName13;
let sourceName = values.skillName12;
let destinationType = values.skillType13;
let sourceType = values.skillType12;
let destinationCP = values.skillCP13;
let sourceCP = values.skillCP12;
setAttrs({
"skillName13":sourceName,
"skillName12":destinationName,
"skillType13":sourceType,
"skillType12":destinationType,
"skillCP13":sourceCP,
"skillCP12":destinationCP
});
});
});
on("clicked:skillDown13 clicked:skillUp14", function () {
getAttrs(["skillName13", "skillName14", "skillType13", "skillType14", "skillCP13", "skillCP14"], function(values) {
let destinationName = values.skillName14;
let sourceName = values.skillName13;
let destinationType = values.skillType14;
let sourceType = values.skillType13;
let destinationCP = values.skillCP14;
let sourceCP = values.skillCP13;
setAttrs({
"skillName14":sourceName,
"skillName13":destinationName,
"skillType14":sourceType,
"skillType13":destinationType,
"skillCP14":sourceCP,
"skillCP13":destinationCP
});
});
});
on("clicked:skillDown14 clicked:skillUp15", function () {
getAttrs(["skillName14", "skillName15", "skillType14", "skillType15", "skillCP14", "skillCP15"], function(values) {
let destinationName = values.skillName15;
let sourceName = values.skillName14;
let destinationType = values.skillType15;
let sourceType = values.skillType14;
let destinationCP = values.skillCP15;
let sourceCP = values.skillCP14;
setAttrs({
"skillName15":sourceName,
"skillName14":destinationName,
"skillType15":sourceType,
"skillType14":destinationType,
"skillCP15":sourceCP,
"skillCP14":destinationCP
});
});
});
on("clicked:skillDown15 clicked:skillUp16", function () {
getAttrs(["skillName15", "skillName16", "skillType15", "skillType16", "skillCP15", "skillCP16"], function(values) {
let destinationName = values.skillName16;
let sourceName = values.skillName15;
let destinationType = values.skillType16;
let sourceType = values.skillType15;
let destinationCP = values.skillCP16;
let sourceCP = values.skillCP15;
setAttrs({
"skillName16":sourceName,
"skillName15":destinationName,
"skillType16":sourceType,
"skillType15":destinationType,
"skillCP16":sourceCP,
"skillCP15":destinationCP
});
});
});
on("clicked:skillDown16 clicked:skillUp17", function () {
getAttrs(["skillName16", "skillName17", "skillType16", "skillType17", "skillCP16", "skillCP17"], function(values) {
let destinationName = values.skillName17;
let sourceName = values.skillName16;
let destinationType = values.skillType17;
let sourceType = values.skillType16;
let destinationCP = values.skillCP17;
let sourceCP = values.skillCP16;
setAttrs({
"skillName17":sourceName,
"skillName16":destinationName,
"skillType17":sourceType,
"skillType16":destinationType,
"skillCP17":sourceCP,
"skillCP16":destinationCP
});
});
});
on("clicked:skillDown17 clicked:skillUp18", function () {
getAttrs(["skillName17", "skillName18", "skillType17", "skillType18", "skillCP17", "skillCP18"], function(values) {
let destinationName = values.skillName18;
let sourceName = values.skillName17;
let destinationType = values.skillType18;
let sourceType = values.skillType17;
let destinationCP = values.skillCP18;
let sourceCP = values.skillCP17;
setAttrs({
"skillName18":sourceName,
"skillName17":destinationName,
"skillType18":sourceType,
"skillType17":destinationType,
"skillCP18":sourceCP,
"skillCP17":destinationCP
});
});
});
on("clicked:skillDown18 clicked:skillUp19", function () {
getAttrs(["skillName18", "skillName19", "skillType18", "skillType19", "skillCP18", "skillCP19"], function(values) {
let destinationName = values.skillName19;
let sourceName = values.skillName18;
let destinationType = values.skillType19;
let sourceType = values.skillType18;
let destinationCP = values.skillCP19;
let sourceCP = values.skillCP18;
setAttrs({
"skillName19":sourceName,
"skillName18":destinationName,
"skillType19":sourceType,
"skillType18":destinationType,
"skillCP19":sourceCP,
"skillCP18":destinationCP
});
});
});
on("clicked:skillDown19 clicked:skillUp20", function () {
getAttrs(["skillName19", "skillName20", "skillType19", "skillType20", "skillCP19", "skillCP20"], function(values) {
let destinationName = values.skillName20;
let sourceName = values.skillName19;
let destinationType = values.skillType20;
let sourceType = values.skillType19;
let destinationCP = values.skillCP20;
let sourceCP = values.skillCP19;
setAttrs({
"skillName20":sourceName,
"skillName19":destinationName,
"skillType20":sourceType,
"skillType19":destinationType,
"skillCP20":sourceCP,
"skillCP19":destinationCP
});
});
});
/* Move Skills 11-20 */
on("clicked:skillDown20 clicked:skillUp21", function () {
getAttrs(["skillName20", "skillName21", "skillType20", "skillType21", "skillCP20", "skillCP21"], function(values) {
let destinationName = values.skillName21;
let sourceName = values.skillName20;
let destinationType = values.skillType21;
let sourceType = values.skillType20;
let destinationCP = values.skillCP21;
let sourceCP = values.skillCP20;
setAttrs({
"skillName21":sourceName,
"skillName20":destinationName,
"skillType21":sourceType,
"skillType20":destinationType,
"skillCP21":sourceCP,
"skillCP20":destinationCP
});
});
});
on("clicked:skillDown21 clicked:skillUp22", function () {
getAttrs(["skillName21", "skillName22", "skillType21", "skillType22", "skillCP21", "skillCP22"], function(values) {
let destinationName = values.skillName22;
let sourceName = values.skillName21;
let destinationType = values.skillType22;
let sourceType = values.skillType21;
let destinationCP = values.skillCP22;
let sourceCP = values.skillCP21;
setAttrs({
"skillName22":sourceName,
"skillName21":destinationName,
"skillType22":sourceType,
"skillType21":destinationType,
"skillCP22":sourceCP,
"skillCP21":destinationCP
});
});
});
on("clicked:skillDown22 clicked:skillUp23", function () {
getAttrs(["skillName22", "skillName23", "skillType22", "skillType23", "skillCP22", "skillCP23"], function(values) {
let destinationName = values.skillName23;
let sourceName = values.skillName22;
let destinationType = values.skillType23;
let sourceType = values.skillType22;
let destinationCP = values.skillCP23;
let sourceCP = values.skillCP22;
setAttrs({
"skillName23":sourceName,
"skillName22":destinationName,
"skillType23":sourceType,
"skillType22":destinationType,
"skillCP23":sourceCP,
"skillCP22":destinationCP
});
});
});
on("clicked:skillDown23 clicked:skillUp24", function () {
getAttrs(["skillName23", "skillName24", "skillType23", "skillType24", "skillCP23", "skillCP24"], function(values) {
let destinationName = values.skillName24;
let sourceName = values.skillName23;
let destinationType = values.skillType24;
let sourceType = values.skillType23;
let destinationCP = values.skillCP24;
let sourceCP = values.skillCP23;
setAttrs({
"skillName24":sourceName,
"skillName23":destinationName,
"skillType24":sourceType,
"skillType23":destinationType,
"skillCP24":sourceCP,
"skillCP23":destinationCP
});
});
});
on("clicked:skillDown24 clicked:skillUp25", function () {
getAttrs(["skillName24", "skillName25", "skillType24", "skillType25", "skillCP24", "skillCP25"], function(values) {
let destinationName = values.skillName25;
let sourceName = values.skillName24;
let destinationType = values.skillType25;
let sourceType = values.skillType24;
let destinationCP = values.skillCP25;
let sourceCP = values.skillCP24;
setAttrs({
"skillName25":sourceName,
"skillName24":destinationName,
"skillType25":sourceType,
"skillType24":destinationType,
"skillCP25":sourceCP,
"skillCP24":destinationCP
});
});
});
on("clicked:skillDown25 clicked:skillUp26", function () {
getAttrs(["skillName25", "skillName26", "skillType25", "skillType26", "skillCP25", "skillCP26"], function(values) {
let destinationName = values.skillName26;
let sourceName = values.skillName25;
let destinationType = values.skillType26;
let sourceType = values.skillType25;
let destinationCP = values.skillCP26;
let sourceCP = values.skillCP25;
setAttrs({
"skillName26":sourceName,
"skillName25":destinationName,
"skillType26":sourceType,
"skillType25":destinationType,
"skillCP26":sourceCP,
"skillCP25":destinationCP
});
});
});
on("clicked:skillDown26 clicked:skillUp27", function () {
getAttrs(["skillName26", "skillName27", "skillType26", "skillType27", "skillCP26", "skillCP27"], function(values) {
let destinationName = values.skillName27;
let sourceName = values.skillName26;
let destinationType = values.skillType27;
let sourceType = values.skillType26;
let destinationCP = values.skillCP27;
let sourceCP = values.skillCP26;
setAttrs({
"skillName27":sourceName,
"skillName26":destinationName,
"skillType27":sourceType,
"skillType26":destinationType,
"skillCP27":sourceCP,
"skillCP26":destinationCP
});
});
});
on("clicked:skillDown27 clicked:skillUp28", function () {
getAttrs(["skillName27", "skillName28", "skillType27", "skillType28", "skillCP27", "skillCP28"], function(values) {
let destinationName = values.skillName28;
let sourceName = values.skillName27;
let destinationType = values.skillType28;
let sourceType = values.skillType27;
let destinationCP = values.skillCP28;
let sourceCP = values.skillCP27;
setAttrs({
"skillName28":sourceName,
"skillName27":destinationName,
"skillType28":sourceType,
"skillType27":destinationType,
"skillCP28":sourceCP,
"skillCP27":destinationCP
});
});
});
on("clicked:skillDown28 clicked:skillUp29", function () {
getAttrs(["skillName28", "skillName29", "skillType28", "skillType29", "skillCP28", "skillCP29"], function(values) {
let destinationName = values.skillName29;
let sourceName = values.skillName28;
let destinationType = values.skillType29;
let sourceType = values.skillType28;
let destinationCP = values.skillCP29;
let sourceCP = values.skillCP28;
setAttrs({
"skillName29":sourceName,
"skillName28":destinationName,
"skillType29":sourceType,
"skillType28":destinationType,
"skillCP29":sourceCP,
"skillCP28":destinationCP
});
});
});
on("clicked:skillDown29 clicked:skillUp30", function () {
getAttrs(["skillName29", "skillName30", "skillType29", "skillType30", "skillCP29", "skillCP30"], function(values) {
let destinationName = values.skillName30;
let sourceName = values.skillName29;
let destinationType = values.skillType30;
let sourceType = values.skillType29;
let destinationCP = values.skillCP30;
let sourceCP = values.skillCP29;
setAttrs({
"skillName30":sourceName,
"skillName29":destinationName,
"skillType30":sourceType,
"skillType29":destinationType,
"skillCP30":sourceCP,
"skillCP29":destinationCP
});
});
});
on("clicked:skillDown30 clicked:skillUp01", function () {
getAttrs(["skillName30", "skillName01", "skillType30", "skillType01", "skillCP30", "skillCP01"], function(values) {
let destinationName = values.skillName01;
let sourceName = values.skillName30;
let destinationType = values.skillType01;
let sourceType = values.skillType30;
let destinationCP = values.skillCP01;
let sourceCP = values.skillCP30;
setAttrs({
"skillName01":sourceName,
"skillName30":destinationName,
"skillType01":sourceType,
"skillType30":destinationType,
"skillCP01":sourceCP,
"skillCP30":destinationCP
});
});
});
/* ------------------- */
/* Skill Updaters */
/* ------------------- */
/* Skill set 01-10 */
on("change:skillType01 change:skillCP01 change:skillType02 change:skillCP02 change:skillType03 change:skillCP03 change:skillType04 change:skillCP04 change:skillType05 change:skillCP05 change:skillType06 change:skillCP06 change:skillType07 change:skillCP07 change:skillType08 change:skillCP08 change:skillType09 change:skillCP09 change:skillType10 change:skillCP10 change:enhancerJack change:enhancerSch change:enhancerSci change:enhancerTrav change:strengthChance change:dexterityChance change:constitutionChance change:intelligenceChance change:egoChance change:presenceChance change:interactionLevels change:intellectLevels change:agilityLevels change:noncombatLevels change:overallLevels", function() {
//
// The sandbox makes calculating the skill roll chance of general skills messy. All of these modifiers need to be accessed and checked for changes.
// Group levels are handled by slotting into skills 01 and 05. A player will need to organize the three skills that the group levels apply into
// the three lines below the desired group level.
//
getAttrs(["skillType01","skillCP01","skillType02","skillCP02","skillType03","skillCP03","skillType04","skillCP04","skillType05","skillCP05","skillType06","skillCP06","skillType07","skillCP07","skillType08","skillCP08","skillType09","skillCP09","skillType10","skillCP10","enhancerJack","enhancerSch","enhancerSci","enhancerTrav","strengthChance","dexterityChance","constitutionChance","intelligenceChance","egoChance","presenceChance","interactionLevels","intellectLevels","agilityLevels","noncombatLevels","overallLevels"], function(values) {
// Skill 01
let bonusLevels=(parseInt(values.noncombatLevels)||0)+(parseInt(values.overallLevels)||0);
let skillRollChance01=calculateSkillChance(values.skillType01, (parseInt(values.skillCP01)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 02
// Bonus Levels for Skills 02, 03, and 04 may include group levels if Skill 01 is of type "group".
if (values.skillType01==="group") {
bonusLevels=(parseInt(values.noncombatLevels)||0)+(parseInt(values.overallLevels)||0)+Math.floor((parseInt(values.skillCP01))/3);
} else {
bonusLevels=(parseInt(values.noncombatLevels)||0)+(parseInt(values.overallLevels)||0);
}
let skillRollChance02=calculateSkillChance(values.skillType02, (parseInt(values.skillCP02)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 03
let skillRollChance03=calculateSkillChance(values.skillType03, (parseInt(values.skillCP03)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 04
let skillRollChance04=calculateSkillChance(values.skillType04, (parseInt(values.skillCP04)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 05
bonusLevels=(parseInt(values.noncombatLevels)||0)+(parseInt(values.overallLevels)||0);
let skillRollChance05=calculateSkillChance(values.skillType05, (parseInt(values.skillCP05)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 06
// Bonus Levels for Skills 06, 07, and 08 may include group levels if Skill 05 is of type "group".
if (values.skillType05=="group") {
bonusLevels=(parseInt(values.noncombatLevels)||0)+(parseInt(values.overallLevels)||0)+Math.floor((parseInt(values.skillCP05))/3);
} else {
bonusLevels=(parseInt(values.noncombatLevels)||0)+(parseInt(values.overallLevels)||0);
}
let skillRollChance06=calculateSkillChance(values.skillType06, (parseInt(values.skillCP06)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 07
let skillRollChance07=calculateSkillChance(values.skillType07, (parseInt(values.skillCP07)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 08
let skillRollChance08=calculateSkillChance(values.skillType08, (parseInt(values.skillCP08)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 09
// Skills 09 and 10 aren't available for group levels.
bonusLevels=(parseInt(values.noncombatLevels)||0)+(parseInt(values.overallLevels)||0);
let skillRollChance09=calculateSkillChance(values.skillType09, (parseInt(values.skillCP09)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 10
let skillRollChance10=calculateSkillChance(values.skillType10, (parseInt(values.skillCP10)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill Set 1 total character point cost
let setSkillsCost=(parseInt(values.skillCP01)||0)+(parseInt(values.skillCP02)||0)+(parseInt(values.skillCP03)||0)+(parseInt(values.skillCP04)||0)+(parseInt(values.skillCP05)||0)+(parseInt(values.skillCP06)||0)+(parseInt(values.skillCP07)||0)+(parseInt(values.skillCP08)||0)+(parseInt(values.skillCP09)||0)+(parseInt(values.skillCP10)||0);
// Assign calculated skill rolls.
setAttrs({
"skillRollChance01":skillRollChance01,
"skillRollChance02":skillRollChance02,
"skillRollChance03":skillRollChance03,
"skillRollChance04":skillRollChance04,
"skillRollChance05":skillRollChance05,
"skillRollChance06":skillRollChance06,
"skillRollChance07":skillRollChance07,
"skillRollChance08":skillRollChance08,
"skillRollChance09":skillRollChance09,
"skillRollChance10":skillRollChance10,
"hiddenSet1SkillsCost":setSkillsCost
});
});
});
/* Skill set 11-20 */
on("change:skillType11 change:skillCP11 change:skillType12 change:skillCP12 change:skillType13 change:skillCP13 change:skillType14 change:skillCP14 change:skillType15 change:skillCP15 change:skillType16 change:skillCP16 change:skillType17 change:skillCP17 change:skillType18 change:skillCP18 change:skillType19 change:skillCP19 change:skillType20 change:skillCP20 change:enhancerJack change:enhancerSch change:enhancerSci change:enhancerTrav change:strengthChance change:dexterityChance change:constitutionChance change:intelligenceChance change:egoChance change:presenceChance change:interactionLevels change:intellectLevels change:agilityLevels change:noncombatLevels change:overallLevels", function() {
//
// The sandbox makes calculating the skill roll chance of general skills messy. All of these modifiers need to be accessed and checked for changes.
// Group levels are handled by slotting into skills 11 and 15. A player will need to organize the three skills that the group levels apply into
// the three lines below the desired group level.
//
getAttrs(["skillType11","skillCP11","skillType12","skillCP12","skillType13","skillCP13","skillType14","skillCP14","skillType15","skillCP15","skillType16","skillCP16","skillType17","skillCP17","skillType18","skillCP18","skillType19","skillCP19","skillType20","skillCP20","enhancerJack","enhancerSch","enhancerSci","enhancerTrav","strengthChance","dexterityChance","constitutionChance","intelligenceChance","egoChance","presenceChance","interactionLevels","intellectLevels","agilityLevels","noncombatLevels","overallLevels"], function(values) {
// Skill 11
let bonusLevels=(parseInt(values.noncombatLevels)||0)+(parseInt(values.overallLevels)||0);
let skillRollChance11=calculateSkillChance(values.skillType11, (parseInt(values.skillCP11)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 12
// Bonus Levels for Skills 12, 13, and 14 may include group levels if Skill 11 is of type "group".
if (values.skillType11==="group") {
bonusLevels=(parseInt(values.noncombatLevels)||0)+(parseInt(values.overallLevels)||0)+Math.floor((parseInt(values.skillCP11))/3);
} else {
bonusLevels=(parseInt(values.noncombatLevels)||0)+(parseInt(values.overallLevels)||0);
}
let skillRollChance12=calculateSkillChance(values.skillType12, (parseInt(values.skillCP12)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 13
let skillRollChance13=calculateSkillChance(values.skillType13, (parseInt(values.skillCP13)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 14
let skillRollChance14=calculateSkillChance(values.skillType14, (parseInt(values.skillCP14)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 15
bonusLevels=(parseInt(values.noncombatLevels)||0)+(parseInt(values.overallLevels)||0);
let skillRollChance15=calculateSkillChance(values.skillType15, (parseInt(values.skillCP15)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 16
// Bonus Levels for Skills 16, 17, and 18 may include group levels if Skill 15 is of type "group".
if (values.skillType15==="group") {
bonusLevels=(parseInt(values.noncombatLevels)||0)+(parseInt(values.overallLevels)||0)+Math.floor((parseInt(values.skillCP15))/3);
} else {
bonusLevels=(parseInt(values.noncombatLevels)||0)+(parseInt(values.overallLevels)||0);
}
let skillRollChance16=calculateSkillChance(values.skillType16, (parseInt(values.skillCP16)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 17
let skillRollChance17=calculateSkillChance(values.skillType17, (parseInt(values.skillCP17)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 18
let skillRollChance18=calculateSkillChance(values.skillType18, (parseInt(values.skillCP18)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 19
// Skills 19 and 20 aren't available for group levels.
bonusLevels=(parseInt(values.noncombatLevels)||0)+(parseInt(values.overallLevels)||0);
let skillRollChance19=calculateSkillChance(values.skillType19, (parseInt(values.skillCP19)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 20
let skillRollChance20=calculateSkillChance(values.skillType20, (parseInt(values.skillCP20)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill Set 2 total character point cost
let setSkillsCost=(parseInt(values.skillCP11)||0)+(parseInt(values.skillCP12)||0)+(parseInt(values.skillCP13)||0)+(parseInt(values.skillCP14)||0)+(parseInt(values.skillCP15)||0)+(parseInt(values.skillCP16)||0)+(parseInt(values.skillCP17)||0)+(parseInt(values.skillCP18)||0)+(parseInt(values.skillCP19)||0)+(parseInt(values.skillCP20)||0);
// Assign calculated skill rolls.
setAttrs({
"skillRollChance11":skillRollChance11,
"skillRollChance12":skillRollChance12,
"skillRollChance13":skillRollChance13,
"skillRollChance14":skillRollChance14,
"skillRollChance15":skillRollChance15,
"skillRollChance16":skillRollChance16,
"skillRollChance17":skillRollChance17,
"skillRollChance18":skillRollChance18,
"skillRollChance19":skillRollChance19,
"skillRollChance20":skillRollChance20,
"hiddenSet2SkillsCost":setSkillsCost
});
});
});
/* Skill set 21-30 */
on("change:skillType21 change:skillCP21 change:skillType22 change:skillCP22 change:skillType23 change:skillCP23 change:skillType24 change:skillCP24 change:skillType25 change:skillCP25 change:skillType26 change:skillCP26 change:skillType27 change:skillCP27 change:skillType28 change:skillCP28 change:skillType29 change:skillCP29 change:skillType30 change:skillCP30 change:enhancerJack change:enhancerSch change:enhancerSci change:enhancerTrav change:strengthChance change:dexterityChance change:constitutionChance change:intelligenceChance change:egoChance change:presenceChance change:interactionLevels change:intellectLevels change:agilityLevels change:noncombatLevels change:overallLevels", function() {
//
// The sandbox makes calculating the skill roll chance of general skills messy. All of these modifiers need to be accessed and checked for changes.
// Group levels are handled by slotting into skills 21 and 25. A player will need to organize the three skills that the group levels apply into
// the three lines below the desired group level.
//
getAttrs(["skillType21","skillCP21","skillType22","skillCP22","skillType23","skillCP23","skillType24","skillCP24","skillType25","skillCP25","skillType26","skillCP26","skillType27","skillCP27","skillType28","skillCP28","skillType29","skillCP29","skillType30","skillCP30","enhancerJack","enhancerSch","enhancerSci","enhancerTrav","strengthChance","dexterityChance","constitutionChance","intelligenceChance","egoChance","presenceChance","interactionLevels","intellectLevels","agilityLevels","noncombatLevels","overallLevels"], function(values) {
// Skill 21
let bonusLevels=(parseInt(values.noncombatLevels)||0)+(parseInt(values.overallLevels)||0);
let skillRollChance21=calculateSkillChance(values.skillType21, (parseInt(values.skillCP21)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 22
// Bonus Levels for Skills 22, 23, and 24 may include group levels if Skill 21 is of type "group".
if (values.skillType21==="group") {
bonusLevels=(parseInt(values.noncombatLevels)||0)+(parseInt(values.overallLevels)||0)+Math.floor((parseInt(values.skillCP21))/3);
} else {
bonusLevels=(parseInt(values.noncombatLevels)||0)+(parseInt(values.overallLevels)||0);
}
let skillRollChance22=calculateSkillChance(values.skillType22, (parseInt(values.skillCP22)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 23
let skillRollChance23=calculateSkillChance(values.skillType23, (parseInt(values.skillCP23)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 24
let skillRollChance24=calculateSkillChance(values.skillType24, (parseInt(values.skillCP24)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 25
bonusLevels=(parseInt(values.noncombatLevels)||0)+(parseInt(values.overallLevels)||0);
let skillRollChance25=calculateSkillChance(values.skillType25, (parseInt(values.skillCP25)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 26
// Bonus Levels for Skills 26, 27, and 28 may include group levels if Skill 25 is of type "group".
if (values.skillType25==="group") {
bonusLevels=(parseInt(values.noncombatLevels)||0)+(parseInt(values.overallLevels)||0)+Math.floor((parseInt(values.skillCP25))/3);
} else {
bonusLevels=(parseInt(values.noncombatLevels)||0)+(parseInt(values.overallLevels)||0);
}
let skillRollChance26=calculateSkillChance(values.skillType26, (parseInt(values.skillCP26)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 27
let skillRollChance27=calculateSkillChance(values.skillType27, (parseInt(values.skillCP27)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 28
let skillRollChance28=calculateSkillChance(values.skillType28, (parseInt(values.skillCP28)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 29
// Skills 29 and 30 aren't available for group levels.
bonusLevels=(parseInt(values.noncombatLevels)||0)+(parseInt(values.overallLevels)||0);
let skillRollChance29=calculateSkillChance(values.skillType29, (parseInt(values.skillCP29)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill 30
let skillRollChance30=calculateSkillChance(values.skillType30, (parseInt(values.skillCP30)||0), values.enhancerJack, values.enhancerSch, values.enhancerSci, values.enhancerTrav, (parseInt(values.strengthChance)||0), (parseInt(values.dexterityChance)||0), (parseInt(values.constitutionChance)||0), (parseInt(values.intelligenceChance)||0), (parseInt(values.egoChance)||0), (parseInt(values.presenceChance)||0), (parseInt(values.interactionLevels)||0), (parseInt(values.intellectLevels)||0), (parseInt(values.agilityLevels)||0), bonusLevels);
// Skill Set 3 total character point cost
let setSkillsCost=(parseInt(values.skillCP21)||0)+(parseInt(values.skillCP22)||0)+(parseInt(values.skillCP23)||0)+(parseInt(values.skillCP24)||0)+(parseInt(values.skillCP25)||0)+(parseInt(values.skillCP26)||0)+(parseInt(values.skillCP27)||0)+(parseInt(values.skillCP28)||0)+(parseInt(values.skillCP29)||0)+(parseInt(values.skillCP30)||0);
// Assign calculated skill rolls.
setAttrs({
"skillRollChance21":skillRollChance21,
"skillRollChance22":skillRollChance22,
"skillRollChance23":skillRollChance23,
"skillRollChance24":skillRollChance24,
"skillRollChance25":skillRollChance25,
"skillRollChance26":skillRollChance26,
"skillRollChance27":skillRollChance27,
"skillRollChance28":skillRollChance28,
"skillRollChance29":skillRollChance29,
"skillRollChance30":skillRollChance30,
"hiddenSet3SkillsCost":setSkillsCost
});
});
});
/* Combat Skills */
on("change:skillLevels31 change:skillType31 change:skillLevels32 change:skillType32 change:skillLevels33 change:skillType33 change:skillLevels34 change:skillType34 change:skillLevels35 change:skillType35 change:skillLevels36 change:skillType36 change:skillLevels37 change:skillType37 change:skillLevels38 change:skillLevels39 change:skillLevels40", function () {
//
// Calculation of combat skill costs is based on many user selections.
// If the skill is a weapon familiarity, the cost is either 1 CP (WF1) or 2 CP (WF2).
// If the selection is a skill level, the cost is determined by number of levels and the scope (single: 2, small group: 3, or large group: 5).
// The costs of general combat skills are calculated by the function calculateCombatSkillCost(..).
//
// Skill level costs for all HTH, all ranged, and all combat are calculated here without the calculateCombatSkillCost(..).
//
getAttrs(["skillLevels31", "skillType31", "skillLevels32", "skillType32", "skillLevels33", "skillType33", "skillLevels34", "skillType34", "skillLevels35", "skillType35", "skillLevels36", "skillType36", "skillLevels37", "skillType37", "skillLevels38","skillLevels39","skillLevels40"], function(values) {
// Skills 31-37 are general combat skills with costs determined by their skill type or levels.
let skill31Cost = calculateCombatSkillCost(values.skillType31, (parseInt(values.skillLevels31)||0) );
let skill32Cost = calculateCombatSkillCost(values.skillType32, (parseInt(values.skillLevels32)||0) );
let skill33Cost = calculateCombatSkillCost(values.skillType33, (parseInt(values.skillLevels33)||0) );
let skill34Cost = calculateCombatSkillCost(values.skillType34, (parseInt(values.skillLevels34)||0) );
let skill35Cost = calculateCombatSkillCost(values.skillType35, (parseInt(values.skillLevels35)||0) );
let skill36Cost = calculateCombatSkillCost(values.skillType36, (parseInt(values.skillLevels36)||0) );
let skill37Cost = calculateCombatSkillCost(values.skillType37, (parseInt(values.skillLevels37)||0) );
// Skill 38: All HTH Combat Levels cost 8 CP each.
let skill38Cost = 8*(parseInt(values.skillLevels38)||0);
// Skill 39: All Range Combat Levels cost 8 CP each.
let skill39Cost = 8*(parseInt(values.skillLevels39)||0);
// Skill 40: All Combat Levels cost 10 CP each.
let skill40Cost = 10*(parseInt(values.skillLevels40)||0);
let combatSkillsCost = skill31Cost+skill32Cost+skill33Cost+skill34Cost+skill35Cost+skill36Cost+skill37Cost+skill38Cost+skill39Cost+skill40Cost;
setAttrs({
"hiddenCombatSkillsCost":combatSkillsCost,
"skillCP31":skill31Cost,
"skillCP32":skill32Cost,
"skillCP33":skill33Cost,
"skillCP34":skill34Cost,
"skillCP35":skill35Cost,
"skillCP36":skill36Cost,
"skillCP37":skill37Cost,
"skillCP38":skill38Cost,
"skillCP39":skill39Cost,
"skillCP40":skill40Cost
});
});
});
function calculateCombatSkillCost(skillType,numberOfLevels) {
// Used to calculate costs of general combat skill and familiarities.
let skillBaseCost=0;
let skillLevelCost=0;
switch (skillType) {
case "none": skillLevelCost=0;
skillBaseCost = 0;
break;
case "Fam1": skillLevelCost=0;
skillBaseCost = 1;
break;
case "Fam2": skillLevelCost=0;
skillBaseCost = 2;
break;
case "CSL2": skillLevelCost=2;
skillBaseCost = 0;
break;
case "CSL3": skillLevelCost=3;
skillBaseCost = 0;
break;
case "CSL5": skillLevelCost=5;
skillBaseCost = 0;
break;
case "CSL8": skillLevelCost=8;
skillBaseCost = 0;
break;
case "PSL1": skillLevelCost=1;
skillBaseCost = 0;
break;
case "PSL2": skillLevelCost=2;
skillBaseCost = 0;
break;
case "PSL3": skillLevelCost=3;
skillBaseCost = 0;
break;
default: skillLevelCost=0;
skillBaseCost = 0;
break;
}
return skillBaseCost+numberOfLevels*skillLevelCost;
}
/* Language Skills */
on("change:enhancerLing change:skillFluency41 change:skillLiteracy41 change:skillFluency42 change:skillLiteracy42 change:skillFluency43 change:skillLiteracy43 change:skillFluency44 change:skillLiteracy44 change:skillFluency45 change:skillLiteracy45 change:skillFluency46 change:skillLiteracy46 change:skillFluency47 change:skillLiteracy47 change:skillFluency48 change:skillLiteracy48 change:skillFluency49 change:skillLiteracy49, optionLiteracyCostsPoints", function () {
// Language skills are relatively simple without levels or roll calculations. The linguist enhancer is the only complication.
// All calculations handled by the function calculateLanguageSkillCost(...).
getAttrs(["enhancerLing", "skillFluency41","skillLiteracy41", "skillFluency42","skillLiteracy42", "skillFluency43","skillLiteracy43", "skillFluency44","skillLiteracy44", "skillFluency45","skillLiteracy45", "skillFluency46","skillLiteracy46", "skillFluency47","skillLiteracy47", "skillFluency48","skillLiteracy48", "skillFluency49","skillLiteracy49","optionLiteracyCostsPoints"], function(values) {
const linguist = values.enhancerLing;
let literacyCost = 0;
if (values.optionLiteracyCostsPoints!=0) {
literacyCost = 1;
}
let skill41Cost = calculateLanguageSkillCost( values.skillFluency41 , values.skillLiteracy41, linguist, literacyCost);
let skill42Cost = calculateLanguageSkillCost( values.skillFluency42 , values.skillLiteracy42, linguist, literacyCost);
let skill43Cost = calculateLanguageSkillCost( values.skillFluency43 , values.skillLiteracy43, linguist, literacyCost);
let skill44Cost = calculateLanguageSkillCost( values.skillFluency44 , values.skillLiteracy44, linguist, literacyCost);
let skill45Cost = calculateLanguageSkillCost( values.skillFluency45 , values.skillLiteracy45, linguist, literacyCost);
let skill46Cost = calculateLanguageSkillCost( values.skillFluency46 , values.skillLiteracy46, linguist, literacyCost);
let skill47Cost = calculateLanguageSkillCost( values.skillFluency47 , values.skillLiteracy47, linguist, literacyCost);
let skill48Cost = calculateLanguageSkillCost( values.skillFluency48 , values.skillLiteracy48, linguist, literacyCost);
let skill49Cost = calculateLanguageSkillCost( values.skillFluency49 , values.skillLiteracy49, linguist, literacyCost);
let totalLanguageCosts = skill41Cost+skill42Cost+skill43Cost+skill44Cost+skill45Cost+skill46Cost+skill47Cost+skill48Cost+skill49Cost;
setAttrs({
"hiddenLanguageSkillsCost":totalLanguageCosts,
"skillCP41":skill41Cost,
"skillCP42":skill42Cost,
"skillCP43":skill43Cost,
"skillCP44":skill44Cost,
"skillCP45":skill45Cost,
"skillCP46":skill46Cost,
"skillCP47":skill47Cost,
"skillCP48":skill48Cost,
"skillCP49":skill49Cost
});
});
});
/* Skill Enhancers and wide-scope noncombat levels */
on("change:enhancerJack change:enhancerLing change:enhancerSch change:enhancerSci change:enhancerTrav change:enhancerWell change:interactionLevels change:intellectLevels change:agilityLevels change:noncombatLevels change:overallLevels", function () {
// If any of the enhancers or wide-scope noncombat levels change (anything in the lower right skill block) recalculate their costs.
// Because enhancers lower the costs of other skills and wide-scope levels change the rolls of other other skills, the
// non-combat skills 01-30 will have their costs and roll chances recalculated as well.
getAttrs(["enhancerJack","enhancerLing","enhancerSch","enhancerSci","enhancerTrav","enhancerWell","interactionLevels","intellectLevels","agilityLevels","noncombatLevels","overallLevels"], function(values) {
// Check for purchased enhancers and assign costs of 3 CP for each.
const enhancerJackStatus=values.enhancerJack;
const enhancerLingStatus=values.enhancerLing;
const enhancerSchStatus=values.enhancerSch;
const enhancerSciStatus=values.enhancerSci;
const enhancerTravStatus=values.enhancerTrav;
const enhancerWellStatus=values.enhancerWell;
let enhancerJackCost = 0;
let enhancerLingCost = 0;
let enhancerSchCost = 0;
let enhancerSciCost = 0;
let enhancerTravCost = 0;
let enhancerWellCost = 0;
if (enhancerJackStatus!=0) {
enhancerJackCost = 3;
}
if (enhancerLingStatus!=0) {
enhancerLingCost = 3;
}
if (enhancerSchStatus!=0) {
enhancerSchCost = 3;
}
if (enhancerSciStatus!=0) {
enhancerSciCost = 3;
}
if (enhancerTravStatus!=0) {
enhancerTravCost = 3;
}
if (enhancerWellStatus!=0) {
enhancerWellCost = 3;
}
setAttrs({
"enhancerJackCP":enhancerJackCost,
"enhancerLingCP":enhancerLingCost,
"enhancerSchCP":enhancerSchCost,
"enhancerSciCP":enhancerSciCost,
"enhancerWellCP":enhancerWellCost,
"enhancerTravCP":enhancerTravCost
});
// Calculate costs for each wide-scope non-combat level.
const interactionSkillLevels=parseInt(values.interactionLevels)||0;
const intellectSkillLevels=parseInt(values.intellectLevels)||0;
const agilitySkillLevels=parseInt(values.agilityLevels)||0;
const noncombatSkillLevels=parseInt(values.noncombatLevels)||0;
const overallSkillLevels=parseInt(values.overallLevels)||0;
let interactionSkillLevelsCost= interactionSkillLevels*4;
let intellectSkillLevelsCost= intellectSkillLevels*4;
let agilitySkillLevelsCost= agilitySkillLevels*6;
let noncombatSkillLevelsCost= noncombatSkillLevels*10;
let overallSkillLevelsCost= overallSkillLevels*12;
setAttrs({
"interactionLevelsCP":interactionSkillLevelsCost,
"intellectLevelsCP":intellectSkillLevelsCost,
"agilityLevelsCP":agilitySkillLevelsCost,
"noncombatLevelsCP":noncombatSkillLevelsCost,
"overallLevelsCP":overallSkillLevelsCost
});
skillEnhancersCost = enhancerJackCost+enhancerLingCost+enhancerSchCost+enhancerSciCost+enhancerTravCost+enhancerWellCost;
skillLevelsCost=interactionSkillLevelsCost+intellectSkillLevelsCost+agilitySkillLevelsCost+noncombatSkillLevelsCost+overallSkillLevelsCost;
setAttrs({
"hiddenEnhancerSkillsCost":skillEnhancersCost+skillLevelsCost,
});
//addSkillPoints();
});
});
/* Martial Skills, which are entered in the Gear Section */
on("change:martialManeuverCP01 change:martialManeuverCP02 change:martialManeuverCP03 change:martialManeuverCP04 change:martialManeuverCP05 change:martialManeuverCP06", function () {
// Martial maneuver skills are not dependent on other attributes or skills.
getAttrs(["martialManeuverCP01", "martialManeuverCP02","martialManeuverCP03", "martialManeuverCP04","martialManeuverCP05", "martialManeuverCP06"], function(values) {
let martialManeuver01Cost = parseInt(values.martialManeuverCP01)||0;
let martialManeuver02Cost = parseInt(values.martialManeuverCP02)||0;
let martialManeuver03Cost = parseInt(values.martialManeuverCP03)||0;
let martialManeuver04Cost = parseInt(values.martialManeuverCP04)||0;
let martialManeuver05Cost = parseInt(values.martialManeuverCP05)||0;
let martialManeuver06Cost = parseInt(values.martialManeuverCP06)||0;
let totalMartialManeuversCost = martialManeuver01Cost+martialManeuver02Cost+martialManeuver03Cost+martialManeuver04Cost+martialManeuver05Cost+martialManeuver06Cost;
setAttrs({
"hiddenMartialSkillsCost":totalMartialManeuversCost
});
});
});
/* -------------------------------------------------- */
/* Functions used for gear tab */
/* -------------------------------------------------- */
/* Calculate weapon endurance costs */
on("change:optionSuperHeroicEndurance change:weaponStrength01 change:weaponStrength02 change:weaponStrength03 change:weaponStrength04 change:weaponStrength05 change:shieldStrength", function() {
getAttrs(["optionSuperHeroicEndurance", "weaponStrength01","weaponStrength02","weaponStrength03","weaponStrength04","weaponStrength05","shieldStrength"], function(values) {
// If optionSuperHeroicEndurance is true, endurance cost is 1 per 5 strength, otherwise it is 1 per 10 strength used.
optionSuperHeroic = values.optionSuperHeroicEndurance;
let enduranceCostFactor = 10;
if (optionSuperHeroic != 0) {
enduranceCostFactor=5;
}
let enduranceCost01= heroRoundLow( (parseInt(values.weaponStrength01)||0)/enduranceCostFactor );
if ( (enduranceCost01<1) && (parseInt(values.weaponStrength01)||0)>0) {
enduranceCost01=1
}
let enduranceCost02= heroRoundLow( (parseInt(values.weaponStrength02)||0)/enduranceCostFactor );
if ( (enduranceCost02<1) && (parseInt(values.weaponStrength02)||0)>0) {
enduranceCost02=1
}
let enduranceCost03= heroRoundLow( (parseInt(values.weaponStrength03)||0)/enduranceCostFactor );
if ( (enduranceCost03<1) && (parseInt(values.weaponStrength03)||0)>0) {
enduranceCost03=1
}
let enduranceCost04= heroRoundLow( (parseInt(values.weaponStrength04)||0)/enduranceCostFactor );
if ( (enduranceCost04<1) && (parseInt(values.weaponStrength04)||0)>0) {
enduranceCost04=1
}
let enduranceCost05= heroRoundLow( (parseInt(values.weaponStrength05)||0)/enduranceCostFactor );
if ( (enduranceCost05<1) && (parseInt(values.weaponStrength05)||0)>0) {
enduranceCost05=1
}
let enduranceCostShield= heroRoundLow( (parseInt(values.shieldStrength)||0)/enduranceCostFactor );
if ( (enduranceCostShield<1) && (parseInt(values.shieldStrength)||0)>0) {
enduranceCostShield=1
}
setAttrs({
"weaponEndurance01":enduranceCost01,
"weaponEndurance02":enduranceCost02,
"weaponEndurance03":enduranceCost03,
"weaponEndurance04":enduranceCost04,
"weaponEndurance05":enduranceCost05,
"shieldEndurance":enduranceCostShield
});
});
});
/* Gear Tab sum up equipment weight */
on("change:liftWeight change:armorEND01 change:armorEND02 change:armorEND03 change:armorEND04 change:armorMass01 change:armorMass01 change:armorMass02 change:armorMass03 change:armorMass04 change:shieldMass change:weaponMass01 change:weaponMass02 change:weaponMass03 change:weaponMass04 change:weaponMass05 change:equipMass01 change:equipMass02 change:equipMass03 change:equipMass04 change:equipMass05 change:equipMass06 change:equipMass07 change:equipMass08 change:equipMass09 change:equipMass10 change:equipMass11 change:equipMass12 change:equipMass13 change:equipMass14 change:equipMass15 change:equipMass16", function () {
// Add the masses of all items of equipment.
// Determine END used per turn, DCV/DEX roll penalty, and Movement Penalty.
getAttrs(["liftWeight","armorEND01","armorEND02","armorEND03","armorEND04","armorMass01","armorMass02","armorMass03","armorMass04","shieldMass", "weaponMass01", "weaponMass02", "weaponMass03", "weaponMass04", "weaponMass05", "equipMass01", "equipMass02", "equipMass03", "equipMass04", "equipMass05", "equipMass06", "equipMass07", "equipMass08", "equipMass09", "equipMass10", "equipMass11", "equipMass12", "equipMass13", "equipMass14", "equipMass15", "equipMass16"], function(values) {
// Add up carried mass
armorCarried=(parseFloat(values.armorMass01)||0)+(parseFloat(values.armorMass02)||0)+(parseFloat(values.armorMass03)||0)+(parseFloat(values.armorMass04)||0)+(parseFloat(values.shieldMass)||0);
weaponsCarried=(parseFloat(values.weaponMass01)||0)+(parseFloat(values.weaponMass02)||0)+(parseFloat(values.weaponMass03)||0)+(parseFloat(values.weaponMass04)||0)+(parseFloat(values.weaponMass05)||0);
equipmentCarried=(parseFloat(values.equipMass01)||0)+(parseFloat(values.equipMass02)||0)+(parseFloat(values.equipMass03)||0)+(parseFloat(values.equipMass04)||0)+(parseFloat(values.equipMass05)||0)+(parseFloat(values.equipMass06)||0)+(parseFloat(values.equipMass07)||0)+(parseFloat(values.equipMass08)||0)+(parseFloat(values.equipMass09)||0)+(parseFloat(values.equipMass10)||0)+(parseFloat(values.equipMass11)||0)+(parseFloat(values.equipMass12)||0)+(parseFloat(values.equipMass13)||0)+(parseFloat(values.equipMass14)||0)+(parseFloat(values.equipMass15)||0)+(parseFloat(values.equipMass16)||0);
carriedWeight=armorCarried+weaponsCarried+equipmentCarried;
carriedWeight=Math.floor(10*carriedWeight)/10;
// Determine penalties
const lift=(parseFloat(values.liftWeight)||0);
const armorENDcost = (parseInt(values.armorEND01)||0)+(parseInt(values.armorEND02)||0)+(parseInt(values.armorEND03)||0)+(parseInt(values.armorEND04)||0);
let enduranceCost=0;
let dexPenalty=0;
let movePenalty=0;
if (carriedWeight<=lift*0.1) {
dexPenalty=0;
enduranceCost=0+armorENDcost;
movePenalty=0;
} else if (carriedWeight<=lift*0.24) {
dexPenalty=-1;
enduranceCost=0+armorENDcost;
movePenalty=0;
} else if (carriedWeight<=lift*0.49) {
dexPenalty=-2;
enduranceCost=1+armorENDcost;
movePenalty=-2;
} else if (carriedWeight<=lift*0.74) {
dexPenalty=-3;
enduranceCost=2+armorENDcost;
movePenalty=-4;
} else if (carriedWeight<=lift*0.89) {
dexPenalty=-4;
enduranceCost=3+armorENDcost;
movePenalty=-8;
} else {
dexPenalty=-5;
enduranceCost=4+armorENDcost;
movePenalty=-16;
}
setAttrs({
"carriedWeight":carriedWeight,
"weightEndPenalty":enduranceCost,
"weightDexDCVPenalty":dexPenalty,
"weightMovePenalty":movePenalty
});
});
});
// Open with first tab (thanks to GiGs)
on("sheet:opened", function() {
setAttrs({sheetTab:"characteristics"});
});
/* ------------------------------------------------ */
/* --- Weapon Attacks and Hit Location Helpers --- */
/* ------------------------------------------------ */
// Update weaponOCVPenalty01
on("change:optionHitLocationSystem change:targetSelection change:weaponAreaEffect01 change:halveTargetOCVpenalty change:penaltySkillLevels", function () {
getAttrs(["optionHitLocationSystem","targetSelection","weaponAreaEffect01","halveTargetOCVpenalty","penaltySkillLevels"], function(values) {
let penalty = 0;
let useHitLocations = values.optionHitLocationSystem;
let areaEffectWeapon = values.weaponAreaEffect01;
let targetSelectionType = parseInt(values.targetSelection)||1;
let halveTargetPenalty = values.halveTargetOCVpenalty;
let penaltySkillLevels = parseInt(values.penaltySkillLevels)||0;
// For some reason I couldn't get this switch function work in an independent function. Will have to suffer with the extra space needed.
if ((useHitLocations != 0) && (areaEffectWeapon == 0)) {
switch (targetSelectionType) {
case 1: penalty = 0;
break;
case 2: penalty = -8;
break;
case 3: penalty = -6;
break;
case 4: penalty = -5;
break;
case 5: penalty = -5;
break;
case 6: penalty = -3;
break;
case 7: penalty = -7;
break;
case 8: penalty = -8;
break;
case 9: penalty = -4;
break;
case 10: penalty = -6;
break;
case 11: penalty = -8;
break;
case 12: penalty = -4;
break;
case 13: penalty = -2;
break;
case 14: penalty = -1;
break;
case 15: penalty = -2;
break;
case 16: penalty = -4;
break;
default: penalty = 0;
};
if (halveTargetPenalty != 0) {
penalty = heroRoundHigh(penalty/2);
}
// Apply penalty skill levels.
penalty = penalty+penaltySkillLevels;
// The net penaly cannot be positive.
if (penalty>0) {
penalty=0;
}
}
// Update OCV penalty for weapon01
setAttrs({
"weaponOCVPenalty01":penalty
});
});
});
// Update weaponOCVPenalty02
on("change:optionHitLocationSystem change:targetSelection change:weaponAreaEffect02 change:halveTargetOCVpenalty change:penaltySkillLevels", function () {
getAttrs(["optionHitLocationSystem","targetSelection","weaponAreaEffect02","halveTargetOCVpenalty","penaltySkillLevels"], function(values) {
let penalty = 0;
let useHitLocations = values.optionHitLocationSystem;
let areaEffectWeapon = values.weaponAreaEffect02;
let targetSelectionType = parseInt(values.targetSelection)||1;
let halveTargetPenalty = values.halveTargetOCVpenalty;
let penaltySkillLevels = parseInt(values.penaltySkillLevels)||0;
if ((useHitLocations != 0) && (areaEffectWeapon == 0)) {
switch (targetSelectionType) {
case 1: penalty = 0;
break;
case 2: penalty = -8;
break;
case 3: penalty = -6;
break;
case 4: penalty = -5;
break;
case 5: penalty = -5;
break;
case 6: penalty = -3;
break;
case 7: penalty = -7;
break;
case 8: penalty = -8;
break;
case 9: penalty = -4;
break;
case 10: penalty = -6;
break;
case 11: penalty = -8;
break;
case 12: penalty = -4;
break;
case 13: penalty = -2;
break;
case 14: penalty = -1;
break;
case 15: penalty = -2;
break;
case 16: penalty = -4;
break;
default: penalty = 0;
};
if (halveTargetPenalty != 0) {
penalty = heroRoundHigh(penalty/2);
}
// Apply penalty skill levels.
penalty = penalty+penaltySkillLevels;
// The net penaly cannot be positive.
if (penalty>0) {
penalty=0;
}
}
// Update OCV penalty for weapon02
setAttrs({
"weaponOCVPenalty02":penalty
});
});
});
// Update weaponOCVPenalty03
on("change:optionHitLocationSystem change:targetSelection change:weaponAreaEffect03 change:halveTargetOCVpenalty change:penaltySkillLevels", function () {
getAttrs(["optionHitLocationSystem","targetSelection","weaponAreaEffect03","halveTargetOCVpenalty","penaltySkillLevels"], function(values) {
let penalty = 0;
let useHitLocations = values.optionHitLocationSystem;
let areaEffectWeapon = values.weaponAreaEffect03;
let targetSelectionType = parseInt(values.targetSelection)||1;
let halveTargetPenalty = values.halveTargetOCVpenalty;
let penaltySkillLevels = parseInt(values.penaltySkillLevels)||0;
if ((useHitLocations != 0) && (areaEffectWeapon == 0)) {
switch (targetSelectionType) {
case 1: penalty = 0;
break;
case 2: penalty = -8;
break;
case 3: penalty = -6;
break;
case 4: penalty = -5;
break;
case 5: penalty = -5;
break;
case 6: penalty = -3;
break;
case 7: penalty = -7;
break;
case 8: penalty = -8;
break;
case 9: penalty = -4;
break;
case 10: penalty = -6;
break;
case 11: penalty = -8;
break;
case 12: penalty = -4;
break;
case 13: penalty = -2;
break;
case 14: penalty = -1;
break;
case 15: penalty = -2;
break;
case 16: penalty = -4;
break;
default: penalty = 0;
};
if (halveTargetPenalty != 0) {
penalty = heroRoundHigh(penalty/2);
}
// Apply penalty skill levels.
penalty = penalty+penaltySkillLevels;
// The net penaly cannot be positive.
if (penalty>0) {
penalty=0;
}
}
// Update OCV penalty for weapon03
setAttrs({
"weaponOCVPenalty03":penalty
});
});
});
// Update weaponOCVPenalty04
on("change:optionHitLocationSystem change:targetSelection change:weaponAreaEffect04 change:halveTargetOCVpenalty change:penaltySkillLevels", function () {
getAttrs(["optionHitLocationSystem","targetSelection","weaponAreaEffect04","halveTargetOCVpenalty","penaltySkillLevels"], function(values) {
let penalty = 0;
let useHitLocations = values.optionHitLocationSystem;
let areaEffectWeapon = values.weaponAreaEffect04;
let targetSelectionType = parseInt(values.targetSelection)||1;
let halveTargetPenalty = values.halveTargetOCVpenalty;
let penaltySkillLevels = parseInt(values.penaltySkillLevels)||0;
if ((useHitLocations != 0) && (areaEffectWeapon == 0)) {
switch (targetSelectionType) {
case 1: penalty = 0;
break;
case 2: penalty = -8;
break;
case 3: penalty = -6;
break;
case 4: penalty = -5;
break;
case 5: penalty = -5;
break;
case 6: penalty = -3;
break;
case 7: penalty = -7;
break;
case 8: penalty = -8;
break;
case 9: penalty = -4;
break;
case 10: penalty = -6;
break;
case 11: penalty = -8;
break;
case 12: penalty = -4;
break;
case 13: penalty = -2;
break;
case 14: penalty = -1;
break;
case 15: penalty = -2;
break;
case 16: penalty = -4;
break;
default: penalty = 0;
};
if (halveTargetPenalty != 0) {
penalty = heroRoundHigh(penalty/2);
}
// Apply penalty skill levels.
penalty = penalty+penaltySkillLevels;
// The net penaly cannot be positive.
if (penalty>0) {
penalty=0;
}
}
// Update OCV penalty for weapon04
setAttrs({
"weaponOCVPenalty04":penalty
});
});
});
// Update weaponOCVPenalty05
on("change:optionHitLocationSystem change:targetSelection change:weaponAreaEffect05 change:halveTargetOCVpenalty change:penaltySkillLevels", function () {
getAttrs(["optionHitLocationSystem","targetSelection","weaponAreaEffect05","halveTargetOCVpenalty","penaltySkillLevels"], function(values) {
let penalty = 0;
let useHitLocations = values.optionHitLocationSystem;
let areaEffectWeapon = values.weaponAreaEffect05;
let targetSelectionType = parseInt(values.targetSelection)||1;
let halveTargetPenalty = values.halveTargetOCVpenalty;
let penaltySkillLevels = parseInt(values.penaltySkillLevels)||0;
if ((useHitLocations != 0) && (areaEffectWeapon == 0)) {
switch (targetSelectionType) {
case 1: penalty = 0;
break;
case 2: penalty = -8;
break;
case 3: penalty = -6;
break;
case 4: penalty = -5;
break;
case 5: penalty = -5;
break;
case 6: penalty = -3;
break;
case 7: penalty = -7;
break;
case 8: penalty = -8;
break;
case 9: penalty = -4;
break;
case 10: penalty = -6;
break;
case 11: penalty = -8;
break;
case 12: penalty = -4;
break;
case 13: penalty = -2;
break;
case 14: penalty = -1;
break;
case 15: penalty = -2;
break;
case 16: penalty = -4;
break;
default: penalty = 0;
};
if (halveTargetPenalty != 0) {
penalty = heroRoundHigh(penalty/2);
}
// Apply penalty skill levels.
penalty = penalty+penaltySkillLevels;
// The net penaly cannot be positive.
if (penalty>0) {
penalty=0;
}
}
// Update OCV penalty for weapon05
setAttrs({
"weaponOCVPenalty05":penalty
});
});
});
// Update targetOCVpenalty. No area of effect complication. Used for shield and basic attacks.
on("change:optionHitLocationSystem change:targetSelection change:halveTargetOCVpenalty change:penaltySkillLevels", function () {
getAttrs(["optionHitLocationSystem","targetSelection","halveTargetOCVpenalty","penaltySkillLevels"], function(values) {
let penalty = 0;
let useHitLocations = values.optionHitLocationSystem;
let targetSelectionType = parseInt(values.targetSelection)||1;
let halveTargetPenalty = values.halveTargetOCVpenalty;
let penaltySkillLevels = parseInt(values.penaltySkillLevels)||0;
if (useHitLocations != 0) {
switch (targetSelectionType) {
case 1: penalty = 0;
break;
case 2: penalty = -8;
break;
case 3: penalty = -6;
break;
case 4: penalty = -5;
break;
case 5: penalty = -5;
break;
case 6: penalty = -3;
break;
case 7: penalty = -7;
break;
case 8: penalty = -8;
break;
case 9: penalty = -4;
break;
case 10: penalty = -6;
break;
case 11: penalty = -8;
break;
case 12: penalty = -4;
break;
case 13: penalty = -2;
break;
case 14: penalty = -1;
break;
case 15: penalty = -2;
break;
case 16: penalty = -4;
break;
default: penalty = 0;
};
if (halveTargetPenalty != 0) {
penalty = heroRoundHigh(penalty/2);
}
// Apply penalty skill levels.
penalty = penalty+penaltySkillLevels;
// The net penaly cannot be positive.
if (penalty>0) {
penalty=0;
}
}
// Update OCV penalty for the shield
setAttrs({
"targetOCVpenalty":penalty
});
});
});
function killingHitLocation(targetSelection) {
// Used to determine hit location message and stun multiplier of Killing Attacks.
var theHitLocation = new Object();
// From the targeting selection determine the target roll:
switch (targetSelection) {
//Standard attack.
case 1: theHitLocation.roll = Math.floor(Math.random()*6+1)+Math.floor(Math.random()*6+1)+Math.floor(Math.random()*6+1);
break;
// Head (3-5)
case 2: theHitLocation.roll = Math.floor(Math.random()*3+1)+2;
break;
// Hands (6)
case 3: theHitLocation.roll = 6;
break;
// Arms (7-8)
case 4: theHitLocation.roll = Math.floor(Math.random()*2+1)+6;
break;
// Shoulders (9)
case 5: theHitLocation.roll = 9;
break;
// Shoulders (10-11)
case 6: theHitLocation.roll = Math.floor(Math.random()*2+1)+9;
break;
// Stomach (12)
case 7: theHitLocation.roll = 12;
break;
// Vitals (13)
case 8: theHitLocation.roll = 13;
break;
// Thighs (14)
case 9: theHitLocation.roll = 14;
break;
// Legs (15-16)
case 10: theHitLocation.roll = Math.floor(Math.random()*2+1)+14;
break;
// Feet (17-18)
case 11: theHitLocation.roll = Math.floor(Math.random()*2+1)+16;
break;
// Head Shot (1d6+3)
case 12: theHitLocation.roll = Math.floor(Math.random()*6+1)+3;
break;
// High Shot (2d6+1)
case 13: theHitLocation.roll = Math.floor(Math.random()*6+1)+Math.floor(Math.random()*6+1)+1;
break;
// Body Shot (2d6+4)
case 14: theHitLocation.roll = Math.floor(Math.random()*6+1)+Math.floor(Math.random()*6+1)+4;
break;
// Low Shot (2d6+7)
case 15: theHitLocation.roll = Math.floor(Math.random()*6+1)+Math.floor(Math.random()*6+1)+7;
break;
// Leg Shot (1d6+12)
case 16: theHitLocation.roll = Math.floor(Math.random()*6+1)+12;
break;
// Default 3d6
default: theHitLocation.roll = Math.floor(Math.random()*6+1)+Math.floor(Math.random()*6+1)+Math.floor(Math.random()*6+1);
}
// Determine target location and stun multiplier.
switch (theHitLocation.roll) {
case 3: theMessage = ": Head(3) BODYx2";
theSTUNmultiplier = 5;
break;
case 4: theMessage = ": Head(4) BODYx2";
theSTUNmultiplier = 5;
break;
case 5: theMessage = ": Head(5) BODYx2";
theSTUNmultiplier = 5;
break;
case 6: theMessage = ": Hands(6) BODY/2";
theSTUNmultiplier = 1;
break;
case 7: theMessage = ": Arms(7) BODY/2";
theSTUNmultiplier = 1;
break;
case 8: theMessage = ": Arms(8) BODY/2";
theSTUNmultiplier = 2;
break;
case 9: theMessage = ": Shoulders(9) BODYx1";
theSTUNmultiplier = 3;
break;
case 10: theMessage = ": Chest(10) BODYx1";
theSTUNmultiplier = 3;
break;
case 11: theMessage = ": Chest(11) BODYx1";
theSTUNmultiplier = 3;
break;
case 12: theMessage = ": Stomach(12) BODYx1";
theSTUNmultiplier = 4;
break;
case 13: theMessage = ": Vitals(13) BODYx2";
theSTUNmultiplier = 4;
break;
case 14: theMessage = ": Thighs(14) BODYx1";
theSTUNmultiplier = 2;
break;
case 15: theMessage = ": Legs(15) BODY/2";
theSTUNmultiplier = 2;
break;
case 16: theMessage = ": Legs(16) BODY/2";
theSTUNmultiplier = 2;
break;
case 17: theMessage = ": Feet(17) BODY/2";
theSTUNmultiplier = 1;
break;
case 18: theMessage = ": Feet(18) BODY/2";
theSTUNmultiplier = 1;
break;
default: theMessage = ": Feet(18) BODY/2";
theSTUNmultiplier = 1;
}
theHitLocation.stunMultiplier=theSTUNmultiplier;
theHitLocation.message=theMessage;
return theHitLocation;
}
function normalHitLocation(targetSelection) {
// Used to determine hit location message of normal attacks.
var theHitLocation = new Object();
// From the targeting selection determine the target roll:
switch (targetSelection) {
//Standard attack.
case 1: theHitLocation.roll = Math.floor(Math.random()*6+1)+Math.floor(Math.random()*6+1)+Math.floor(Math.random()*6+1);
break;
// Head (3-5)
case 2: theHitLocation.roll = Math.floor(Math.random()*3+1)+2;
break;
// Hands (6)
case 3: theHitLocation.roll = 6;
break;
// Arms (7-8)
case 4: theHitLocation.roll = Math.floor(Math.random()*2+1)+6;
break;
// Shoulders (9)
case 5: theHitLocation.roll = 9;
break;
// Shoulders (10-11)
case 6: theHitLocation.roll = Math.floor(Math.random()*2+1)+9;
break;
// Stomach (12)
case 7: theHitLocation.roll = 12;
break;
// Vitals (13)
case 8: theHitLocation.roll = 13;
break;
// Thighs (14)
case 9: theHitLocation.roll = 14;
break;
// Legs (15-16)
case 10: theHitLocation.roll = Math.floor(Math.random()*2+1)+14;
break;
// Feet (17-18)
case 11: theHitLocation.roll = Math.floor(Math.random()*2+1)+16;
break;
// Head Shot (1d6+3)
case 12: theHitLocation.roll = Math.floor(Math.random()*6+1)+3;
break;
// High Shot (2d6+1)
case 13: theHitLocation.roll = Math.floor(Math.random()*6+1)+Math.floor(Math.random()*6+1)+1;
break;
// Body Shot (2d6+4)
case 14: theHitLocation.roll = Math.floor(Math.random()*6+1)+Math.floor(Math.random()*6+1)+4;
break;
// Low Shot (2d6+7)
case 15: theHitLocation.roll = Math.floor(Math.random()*6+1)+Math.floor(Math.random()*6+1)+7;
break;
// Leg Shot (1d6+12)
case 16: theHitLocation.roll = Math.floor(Math.random()*6+1)+12;
break;
// Default 3d6
default: theHitLocation.roll = Math.floor(Math.random()*6+1)+Math.floor(Math.random()*6+1)+Math.floor(Math.random()*6+1);
}
// Determine target location and stun multiplier.
switch (theHitLocation.roll) {
case 3: theMessage = ": Head(3) Sx2 Bx2";
break;
case 4: theMessage = ": Head(4) Sx2 Bx2";
break;
case 5: theMessage = ": Head(5) Sx2 Bx2";
break;
case 6: theMessage = ": Hands(6) S/2 B/2";
break;
case 7: theMessage = ": Arms(7) S/2 B/2";
break;
case 8: theMessage = ": Arms(8) S/2 B/2";
break;
case 9: theMessage = ": Shoulders(9) Sx1 Bx1";
break;
case 10: theMessage = ": Chest(10) Sx1 Bx1";
break;
case 11: theMessage = ": Chest(11) Sx1 Bx1";
break;
case 12: theMessage = ": Stomach(12) 3S/2 Bx1";
break;
case 13: theMessage = ": Vitals(13) 3S/2 Bx2";
break;
case 14: theMessage = ": Thighs(14) Sx1 Bx1";
break;
case 15: theMessage = ": Legs(15) S/2 B/2";
break;
case 16: theMessage = ": Legs(16) S/2 B/2";
break;
case 17: theMessage = ": Feet(17) S/2 B/2";
break;
case 18: theMessage = ": Feet(18) S/2 B/2";
break;
default: theMessage = ": No Location";
}
theHitLocation.message=theMessage;
return theHitLocation;
}
/* ------------------------ */
/* --- Weapon Attacks --- */
/* ------------------------ */
on("change:shieldDamage change:weaponDamage01 change:weaponDamage02 change:weaponDamage03 change:weaponDamage04 change:weaponDamage05 change:strength", function () {
// This function attempts to clean damage text input into text more likely to be rollable dice.
// Only characters 0-9, d, D, +, and - are passed to attack rolls.
getAttrs(["shieldDamage","weaponDamage01","weaponDamage02","weaponDamage03","weaponDamage04","weaponDamage05","strength"], function(values) {
var theShieldDamage=values.shieldDamage;
theShieldDamage=theShieldDamage.replace(/[^\ddD\\+\\-]/g,"");
var theWeaponDamage01=values.weaponDamage01;
theWeaponDamage01=theWeaponDamage01.replace(/[^\ddD\\+\\-]/g,"");
var theWeaponDamage02=values.weaponDamage02;
theWeaponDamage02=theWeaponDamage02.replace(/[^\ddD\\+\\-]/g,"");
var theWeaponDamage03=values.weaponDamage03;
theWeaponDamage03=theWeaponDamage03.replace(/[^\ddD\\+\\-]/g,"");
var theWeaponDamage04=values.weaponDamage04;
theWeaponDamage04=theWeaponDamage04.replace(/[^\ddD\\+\\-]/g,"");
var theWeaponDamage05=values.weaponDamage05;
theWeaponDamage05=theWeaponDamage05.replace(/[^\ddD\\+\\-]/g,"");
// Calculate basic strength damage dice and create a roll20 dice string of d6s and d3s.
let theStrength=parseInt(values.strength)||0;
let theNumberOfD6=(parseInt((theStrength-(theStrength%5))/5)||0).toString();
let theNumberOfD3=0;
if (theStrength%5>2) {
theNumberOfD3=1;
}
var theStrengthDamage=theNumberOfD6.concat("d6+",theNumberOfD3.toString(),"d3");
setAttrs({
hiddenShieldDamage01:theShieldDamage,
hiddenWeaponDamage01:theWeaponDamage01,
hiddenWeaponDamage02:theWeaponDamage02,
hiddenWeaponDamage03:theWeaponDamage03,
hiddenWeaponDamage04:theWeaponDamage04,
hiddenWeaponDamage05:theWeaponDamage05,
hiddenManeuverDamage01:theStrengthDamage
});
});
});
on('clicked:attackWeapon01', (info) => {
// Roll attack and damage dice for Weapon 01.
// First determine if the weapon does normal or killing damage.
getAttrs(["weaponNormalDamage01", "optionAutoSubtractEND", "weaponEndurance01"], function(values) {
let isNormalDamage = values.weaponNormalDamage01;
let autoSubtractEND = values.optionAutoSubtractEND;
let weaponEND = parseInt(values.weaponEndurance01)||0;
// If isNormalDamage is TRUE, use the Normal Damage template.
if (isNormalDamage != 0) {
startRoll("&{template:custom-normal-attack} {{title=@{character_name} - @{character_title}}} {{subtitle=Attacks with @{weaponName01}}} {{OCV=[[?{Modifier|0}+@{weaponOCV01}+@{weaponOCVPenalty01}+@{ocv}]]}} {{Result=[[3d6cf<0cs>0]]}} {{STUN=[[@{hiddenWeaponDamage01}]]}}", (results) => {
// Convert dice roll to equivalent BODY damage.
let computed =0;
const theDice = results.results.STUN.rolls;
// Subtract END cost if option checked.
if (autoSubtractEND != 0) {
subtractGearEndurance(weaponEND);
}
// For each type of dice (d3 or d6) calculate BODY:
for(let groupOfDice of theDice) {
if (groupOfDice.sides == 3) {
// calculate normal damage of d3 dice.
for (let element of groupOfDice.results) {
if (element === 3) {
computed = computed+1;
} else if (element === 2) {
computed = computed + Math.floor(Math.random()*2); // Flip a coin. 0 or 1 BODY corresponding to a '3' or '4' on a d6.
} else {
computed = computed+0; // Add nothing.
}
}
} else if (groupOfDice.sides == 6) {
// calculate normal damage of d6 dice.
for (let element of groupOfDice.results) {
if (element === 1) {
computed = computed+0; // Add nothing.
} else if (element === 6) {
computed = computed+2;
} else {
computed = computed+1;
}
}
}
}
// Get hit location message if system used.
getAttrs(["optionHitLocationSystem", "weaponAreaEffect01", "targetSelection"], function(values) {
let useHitLocations = values.optionHitLocationSystem;
let areaEffectWeapon = values.weaponAreaEffect01;
let targetSelectionType = parseInt(values.targetSelection)||1;
let theMessage = " ";
if ((useHitLocations != 0) && (areaEffectWeapon == 0)) {
var theHitLocation = new normalHitLocation(targetSelectionType);
theMessage = theHitLocation.message;
} else if (areaEffectWeapon != 0) {
theMessage = " AoE";
}
setAttrs({
rollDialogMessage:theMessage
});
let theResult = String(computed);
finishRoll(
results.rollId,
{
STUN: theResult.concat(theMessage)
}
);
});
});
} else {
// If isNormalDamage is FALSE, use the killing Damage template.
startRoll("&{template:custom-attack} {{title=@{character_name} - @{character_title}}} {{subtitle= Attacks with @{weaponName01}}} {{OCV=[[?{Modifier|0}+@{weaponOCV01}+@{weaponOCVPenalty01}+@{ocv}]]}} {{Result=[[3d6cf<0cs>0]]}} {{BODY=[[@{hiddenWeaponDamage01}]]}}", (results) => {
let computed = parseInt(results.results.BODY.result)||0;
setAttrs({
hiddenDamageRoll: computed
});
// Subtract END cost if option checked.
if (autoSubtractEND != 0) {
subtractGearEndurance(weaponEND);
}
getAttrs(["optionHitLocationSystem", "weaponStunMod01", "weaponAreaEffect01", "targetSelection"], function(values) {
let useHitLocations = values.optionHitLocationSystem;
let areaEffectWeapon = values.weaponAreaEffect01;
let theSTUNmodifier = parseInt(values.weaponStunMod01)||0;
let targetSelectionType = parseInt(values.targetSelection)||1;
let theMessage = " ";
// Determine the base stun multiple, which is 1d3.
let theSTUNmultiplier = Math.floor(Math.random()*3+1);
// If the hit location system option is used and the weapon is not of type area effect call the hit location function.
if ((useHitLocations != 0) && (areaEffectWeapon == 0)) {
var theHitLocation = new killingHitLocation(targetSelectionType);
theSTUNmultiplier = theHitLocation.stunMultiplier;
theMessage = theHitLocation.message;
}
else if (areaEffectWeapon != 0) {
theMessage = " AoE";
}
// Add the weapon's stun modifier.
theSTUNmultiplier = theSTUNmultiplier + theSTUNmodifier;
// Prevent STUN multiples of less than 1.
if (theSTUNmultiplier < 1) {
theSTUNmultiplier = 1;
}
setAttrs({
rollDialogMessage:theMessage,
hiddenSTUNmultiplier:theSTUNmultiplier
});
let theResult = String(computed*theSTUNmultiplier);
finishRoll(
results.rollId,
{
BODY: theResult.concat(theMessage)
}
);
});
});
}
});
});
on('clicked:attackWeapon02', (info) => {
// Roll attack and damage dice for Weapon 02.
// First determine if the weapon does normal or killing damage.
getAttrs(["weaponNormalDamage02", "optionAutoSubtractEND", "weaponEndurance02"], function(values) {
let isNormalDamage = values.weaponNormalDamage02;
let autoSubtractEND = values.optionAutoSubtractEND;
let weaponEND = parseInt(values.weaponEndurance02)||0;
// If isNormalDamage is TRUE, use the Normal Damage template.
if (isNormalDamage != 0) {
startRoll("&{template:custom-normal-attack} {{title=@{character_name} - @{character_title}}} {{subtitle=Attacks with @{weaponName02}}} {{OCV=[[?{Modifier|0}+@{weaponOCV02}+@{weaponOCVPenalty02}+@{ocv}]]}} {{Result=[[3d6cf<0cs>0]]}} {{STUN=[[@{hiddenWeaponDamage02}]]}}", (results) => {
// Convert dice roll to equivalent BODY damage.
let computed =0;
const theDice = results.results.STUN.rolls;
// Subtract END cost if option checked.
if (autoSubtractEND != 0) {
subtractGearEndurance(weaponEND);
}
// For each type of dice (d3 or d6) calculate BODY:
for(let groupOfDice of theDice) {
if (groupOfDice.sides == 3) {
// calculate normal damage of d3 dice.
for (let element of groupOfDice.results) {
if (element === 3) {
computed = computed+1;
} else if (element === 2) {
computed = computed + Math.floor(Math.random()*2); // Flip a coin. 0 or 1 BODY corresponding to a '3' or '4' on a d6.
} else {
computed = computed+0; // Add nothing.
}
}
} else if (groupOfDice.sides == 6) {
// calculate normal damage of d6 dice.
for (let element of groupOfDice.results) {
if (element === 1) {
computed = computed+0; // Add nothing.
} else if (element === 6) {
computed = computed+2;
} else {
computed = computed+1;
}
}
}
}
// Get hit location message if system used.
getAttrs(["optionHitLocationSystem", "weaponAreaEffect02", "targetSelection"], function(values) {
let useHitLocations = values.optionHitLocationSystem;
let areaEffectWeapon = values.weaponAreaEffect02;
let targetSelectionType = parseInt(values.targetSelection)||1;
let theMessage = " ";
if ((useHitLocations != 0) && (areaEffectWeapon == 0)) {
var theHitLocation = new normalHitLocation(targetSelectionType);
theMessage = theHitLocation.message;
} else if (areaEffectWeapon != 0) {
theMessage = " AoE";
}
setAttrs({
rollDialogMessage:theMessage
});
let theResult = String(computed);
finishRoll(
results.rollId,
{
STUN: theResult.concat(theMessage)
}
);
});
});
} else {
// If isNormalDamage is FALSE, use the killing Damage template.
startRoll("&{template:custom-attack} {{title=@{character_name} - @{character_title}}} {{subtitle= Attacks with @{weaponName02}}} {{OCV=[[?{Modifier|0}+@{weaponOCV02}+@{weaponOCVPenalty02}+@{ocv}]]}} {{Result=[[3d6cf<0cs>0]]}} {{BODY=[[@{hiddenWeaponDamage02}]]}}", (results) => {
let computed = parseInt(results.results.BODY.result)||0;
setAttrs({
hiddenDamageRoll: computed
});
// Subtract END cost if option checked.
if (autoSubtractEND != 0) {
subtractGearEndurance(weaponEND);
}
getAttrs(["optionHitLocationSystem", "weaponStunMod02", "weaponAreaEffect02", "targetSelection"], function(values) {
let useHitLocations = values.optionHitLocationSystem;
let areaEffectWeapon = values.weaponAreaEffect02;
let theSTUNmodifier = parseInt(values.weaponStunMod02)||0;
let targetSelectionType = parseInt(values.targetSelection)||1;
let theMessage = " ";
// Determine the base stun multiple, which is 1d3.
let theSTUNmultiplier = Math.floor(Math.random()*3+1);
// If the hit location system option is used and the weapon is not of type area effect call the hit location function.
if ((useHitLocations != 0) && (areaEffectWeapon == 0)) {
var theHitLocation = new killingHitLocation(targetSelectionType);
theSTUNmultiplier = theHitLocation.stunMultiplier;
theMessage = theHitLocation.message;
}
else if (areaEffectWeapon != 0) {
theMessage = " AoE";
}
// Add the weapon's stun modifier.
theSTUNmultiplier = theSTUNmultiplier + theSTUNmodifier;
// Prevent STUN multiples of less than 1.
if (theSTUNmultiplier < 1) {
theSTUNmultiplier = 1;
}
setAttrs({
rollDialogMessage:theMessage,
hiddenSTUNmultiplier:theSTUNmultiplier
});
let theResult = String(computed*theSTUNmultiplier);
finishRoll(
results.rollId,
{
BODY: theResult.concat(theMessage)
}
);
});
});
}
});
});
on('clicked:attackWeapon03', (info) => {
// Roll attack and damage dice for Weapon 03.
// First determine if the weapon does normal or killing damage.
getAttrs(["weaponNormalDamage03", "optionAutoSubtractEND", "weaponEndurance03"], function(values) {
let isNormalDamage = values.weaponNormalDamage03;
let autoSubtractEND = values.optionAutoSubtractEND;
let weaponEND = parseInt(values.weaponEndurance03)||0;
// If isNormalDamage is TRUE, use the Normal Damage template.
if (isNormalDamage != 0) {
startRoll("&{template:custom-normal-attack} {{title=@{character_name} - @{character_title}}} {{subtitle=Attacks with @{weaponName03}}} {{OCV=[[?{Modifier|0}+@{weaponOCV03}+@{weaponOCVPenalty03}+@{ocv}]]}} {{Result=[[3d6cf<0cs>0]]}} {{STUN=[[@{hiddenWeaponDamage03}]]}}", (results) => {
// Convert dice roll to equivalent BODY damage.
let computed =0;
const theDice = results.results.STUN.rolls;
// Subtract END cost if option checked.
if (autoSubtractEND != 0) {
subtractGearEndurance(weaponEND);
}
// For each type of dice (d3 or d6) calculate BODY:
for(let groupOfDice of theDice) {
if (groupOfDice.sides == 3) {
// calculate normal damage of d3 dice.
for (let element of groupOfDice.results) {
if (element === 3) {
computed = computed+1;
} else if (element === 2) {
computed = computed + Math.floor(Math.random()*2); // Flip a coin. 0 or 1 BODY corresponding to a '3' or '4' on a d6.
} else {
computed = computed+0; // Add nothing.
}
}
} else if (groupOfDice.sides == 6) {
// calculate normal damage of d6 dice.
for (let element of groupOfDice.results) {
if (element === 1) {
computed = computed+0; // Add nothing.
} else if (element === 6) {
computed = computed+2;
} else {
computed = computed+1;
}
}
}
}
// Get hit location message if system used.
getAttrs(["optionHitLocationSystem", "weaponAreaEffect03", "targetSelection"], function(values) {
let useHitLocations = values.optionHitLocationSystem;
let areaEffectWeapon = values.weaponAreaEffect03;
let targetSelectionType = parseInt(values.targetSelection)||1;
let theMessage = " ";
if ((useHitLocations != 0) && (areaEffectWeapon == 0)) {
var theHitLocation = new normalHitLocation(targetSelectionType);
theMessage = theHitLocation.message;
} else if (areaEffectWeapon != 0) {
theMessage = " AoE";
}
setAttrs({
rollDialogMessage:theMessage
});
let theResult = String(computed);
finishRoll(
results.rollId,
{
STUN: theResult.concat(theMessage)
}
);
});
});
} else {
// If isNormalDamage is FALSE, use the killing Damage template.
startRoll("&{template:custom-attack} {{title=@{character_name} - @{character_title}}} {{subtitle= Attacks with @{weaponName03}}} {{OCV=[[?{Modifier|0}+@{weaponOCV03}+@{weaponOCVPenalty03}+@{ocv}]]}} {{Result=[[3d6cf<0cs>0]]}} {{BODY=[[@{hiddenWeaponDamage03}]]}}", (results) => {
let computed = parseInt(results.results.BODY.result)||0;
setAttrs({
hiddenDamageRoll: computed
});
// Subtract END cost if option checked.
if (autoSubtractEND != 0) {
subtractGearEndurance(weaponEND);
}
getAttrs(["optionHitLocationSystem", "weaponStunMod03", "weaponAreaEffect03", "targetSelection"], function(values) {
let useHitLocations = values.optionHitLocationSystem;
let areaEffectWeapon = values.weaponAreaEffect03;
let theSTUNmodifier = parseInt(values.weaponStunMod03)||0;
let targetSelectionType = parseInt(values.targetSelection)||1;
let theMessage = " ";
// Determine the base stun multiple, which is 1d3.
let theSTUNmultiplier = Math.floor(Math.random()*3+1);
// If the hit location system option is used and the weapon is not of type area effect call the hit location function.
if ((useHitLocations != 0) && (areaEffectWeapon == 0)) {
var theHitLocation = new killingHitLocation(targetSelectionType);
theSTUNmultiplier = theHitLocation.stunMultiplier;
theMessage = theHitLocation.message;
}
else if (areaEffectWeapon != 0) {
theMessage = " AoE";
}
// Add the weapon's stun modifier.
theSTUNmultiplier = theSTUNmultiplier + theSTUNmodifier;
// Prevent STUN multiples of less than 1.
if (theSTUNmultiplier < 1) {
theSTUNmultiplier = 1;
}
setAttrs({
rollDialogMessage:theMessage,
hiddenSTUNmultiplier:theSTUNmultiplier
});
let theResult = String(computed*theSTUNmultiplier);
finishRoll(
results.rollId,
{
BODY: theResult.concat(theMessage)
}
);
});
});
}
});
});
on('clicked:attackWeapon04', (info) => {
// Roll attack and damage dice for Weapon 04.
// First determine if the weapon does normal or killing damage.
getAttrs(["weaponNormalDamage04", "optionAutoSubtractEND", "weaponEndurance04"], function(values) {
let isNormalDamage = values.weaponNormalDamage04;
let autoSubtractEND = values.optionAutoSubtractEND;
let weaponEND = parseInt(values.weaponEndurance04)||0;
// If isNormalDamage is TRUE, use the Normal Damage template.
if (isNormalDamage != 0) {
startRoll("&{template:custom-normal-attack} {{title=@{character_name} - @{character_title}}} {{subtitle=Attacks with @{weaponName04}}} {{OCV=[[?{Modifier|0}+@{weaponOCV04}+@{weaponOCVPenalty04}+@{ocv}]]}} {{Result=[[3d6cf<0cs>0]]}} {{STUN=[[@{hiddenWeaponDamage04}]]}}", (results) => {
// Convert dice roll to equivalent BODY damage.
let computed =0;
const theDice = results.results.STUN.rolls;
// Subtract END cost if option checked.
if (autoSubtractEND != 0) {
subtractGearEndurance(weaponEND);
}
// For each type of dice (d3 or d6) calculate BODY:
for(let groupOfDice of theDice) {
if (groupOfDice.sides == 3) {
// calculate normal damage of d3 dice.
for (let element of groupOfDice.results) {
if (element === 3) {
computed = computed+1;
} else if (element === 2) {
computed = computed + Math.floor(Math.random()*2); // Flip a coin. 0 or 1 BODY corresponding to a '3' or '4' on a d6.
} else {
computed = computed+0; // Add nothing.
}
}
} else if (groupOfDice.sides == 6) {
// calculate normal damage of d6 dice.
for (let element of groupOfDice.results) {
if (element === 1) {
computed = computed+0; // Add nothing.
} else if (element === 6) {
computed = computed+2;
} else {
computed = computed+1;
}
}
}
}
// Get hit location message if system used.
getAttrs(["optionHitLocationSystem", "weaponAreaEffect04", "targetSelection"], function(values) {
let useHitLocations = values.optionHitLocationSystem;
let areaEffectWeapon = values.weaponAreaEffect04;
let targetSelectionType = parseInt(values.targetSelection)||1;
let theMessage = " ";
if ((useHitLocations != 0) && (areaEffectWeapon == 0)) {
var theHitLocation = new normalHitLocation(targetSelectionType);
theMessage = theHitLocation.message;
} else if (areaEffectWeapon != 0) {
theMessage = " AoE";
}
setAttrs({
rollDialogMessage:theMessage
});
let theResult = String(computed);
finishRoll(
results.rollId,
{
STUN: theResult.concat(theMessage)
}
);
});
});
} else {
// If isNormalDamage is FALSE, use the killing Damage template.
startRoll("&{template:custom-attack} {{title=@{character_name} - @{character_title}}} {{subtitle= Attacks with @{weaponName04}}} {{OCV=[[?{Modifier|0}+@{weaponOCV04}+@{weaponOCVPenalty04}+@{ocv}]]}} {{Result=[[3d6cf<0cs>0]]}} {{BODY=[[@{hiddenWeaponDamage04}]]}}", (results) => {
let computed = parseInt(results.results.BODY.result)||0;
setAttrs({
hiddenDamageRoll: computed
});
// Subtract END cost if option checked.
if (autoSubtractEND != 0) {
subtractGearEndurance(weaponEND);
}
getAttrs(["optionHitLocationSystem", "weaponStunMod04", "weaponAreaEffect04", "targetSelection"], function(values) {
let useHitLocations = values.optionHitLocationSystem;
let areaEffectWeapon = values.weaponAreaEffect04;
let theSTUNmodifier = parseInt(values.weaponStunMod04)||0;
let targetSelectionType = parseInt(values.targetSelection)||1;
let theMessage = " ";
// Determine the base stun multiple, which is 1d3.
let theSTUNmultiplier = Math.floor(Math.random()*3+1);
// If the hit location system option is used and the weapon is not of type area effect call the hit location function.
if ((useHitLocations != 0) && (areaEffectWeapon == 0)) {
var theHitLocation = new killingHitLocation(targetSelectionType);
theSTUNmultiplier = theHitLocation.stunMultiplier;
theMessage = theHitLocation.message;
}
else if (areaEffectWeapon != 0) {
theMessage = " AoE";
}
// Add the weapon's stun modifier.
theSTUNmultiplier = theSTUNmultiplier + theSTUNmodifier;
// Prevent STUN multiples of less than 1.
if (theSTUNmultiplier < 1) {
theSTUNmultiplier = 1;
}
setAttrs({
rollDialogMessage:theMessage,
hiddenSTUNmultiplier:theSTUNmultiplier
});
let theResult = String(computed*theSTUNmultiplier);
finishRoll(
results.rollId,
{
BODY: theResult.concat(theMessage)
}
);
});
});
}
});
});
on('clicked:attackWeapon05', (info) => {
// Roll attack and damage dice for Weapon 02.
// First determine if the weapon does normal or killing damage.
getAttrs(["weaponNormalDamage05", "optionAutoSubtractEND", "weaponEndurance05"], function(values) {
let isNormalDamage = values.weaponNormalDamage05;
let autoSubtractEND = values.optionAutoSubtractEND;
let weaponEND = parseInt(values.weaponEndurance05)||0;
// If isNormalDamage is TRUE, use the Normal Damage template.
if (isNormalDamage != 0) {
startRoll("&{template:custom-normal-attack} {{title=@{character_name} - @{character_title}}} {{subtitle=Attacks with @{weaponName05}}} {{OCV=[[?{Modifier|0}+@{weaponOCV05}+@{weaponOCVPenalty05}+@{ocv}]]}} {{Result=[[3d6cf<0cs>0]]}} {{STUN=[[@{hiddenWeaponDamage05}]]}}", (results) => {
// Convert dice roll to equivalent BODY damage.
let computed =0;
const theDice = results.results.STUN.rolls;
// Subtract END cost if option checked.
if (autoSubtractEND != 0) {
subtractGearEndurance(weaponEND);
}
// For each type of dice (d3 or d6) calculate BODY:
for(let groupOfDice of theDice) {
if (groupOfDice.sides == 3) {
// calculate normal damage of d3 dice.
for (let element of groupOfDice.results) {
if (element === 3) {
computed = computed+1;
} else if (element === 2) {
computed = computed + Math.floor(Math.random()*2); // Flip a coin. 0 or 1 BODY corresponding to a '3' or '4' on a d6.
} else {
computed = computed+0; // Add nothing.
}
}
} else if (groupOfDice.sides == 6) {
// calculate normal damage of d6 dice.
for (let element of groupOfDice.results) {
if (element === 1) {
computed = computed+0; // Add nothing.
} else if (element === 6) {
computed = computed+2;
} else {
computed = computed+1;
}
}
}
}
// Get hit location message if system used.
getAttrs(["optionHitLocationSystem", "weaponAreaEffect05", "targetSelection"], function(values) {
let useHitLocations = values.optionHitLocationSystem;
let areaEffectWeapon = values.weaponAreaEffect05;
let targetSelectionType = parseInt(values.targetSelection)||1;
let theMessage = " ";
if ((useHitLocations != 0) && (areaEffectWeapon == 0)) {
var theHitLocation = new normalHitLocation(targetSelectionType);
theMessage = theHitLocation.message;
} else if (areaEffectWeapon != 0) {
theMessage = " AoE";
}
setAttrs({
rollDialogMessage:theMessage
});
let theResult = String(computed);
finishRoll(
results.rollId,
{
STUN: theResult.concat(theMessage)
}
);
});
});
} else {
// If isNormalDamage is FALSE, use the killing Damage template.
startRoll("&{template:custom-attack} {{title=@{character_name} - @{character_title}}} {{subtitle= Attacks with @{weaponName05}}} {{OCV=[[?{Modifier|0}+@{weaponOCV05}+@{weaponOCVPenalty05}+@{ocv}]]}} {{Result=[[3d6cf<0cs>0]]}} {{BODY=[[@{hiddenWeaponDamage05}]]}}", (results) => {
let computed = parseInt(results.results.BODY.result)||0;
setAttrs({
hiddenDamageRoll: computed
});
// Subtract END cost if option checked.
if (autoSubtractEND != 0) {
subtractGearEndurance(weaponEND);
}
getAttrs(["optionHitLocationSystem", "weaponStunMod05", "weaponAreaEffect05", "targetSelection"], function(values) {
let useHitLocations = values.optionHitLocationSystem;
let areaEffectWeapon = values.weaponAreaEffect05;
let theSTUNmodifier = parseInt(values.weaponStunMod05)||0;
let targetSelectionType = parseInt(values.targetSelection)||1;
let theMessage = " ";
// Determine the base stun multiple, which is 1d3.
let theSTUNmultiplier = Math.floor(Math.random()*3+1);
// If the hit location system option is used and the weapon is not of type area effect call the hit location function.
if ((useHitLocations != 0) && (areaEffectWeapon == 0)) {
var theHitLocation = new killingHitLocation(targetSelectionType);
theSTUNmultiplier = theHitLocation.stunMultiplier;
theMessage = theHitLocation.message;
}
else if (areaEffectWeapon != 0) {
theMessage = " AoE";
}
// Add the weapon's stun modifier.
theSTUNmultiplier = theSTUNmultiplier + theSTUNmodifier;
// Prevent STUN multiples of less than 1.
if (theSTUNmultiplier < 1) {
theSTUNmultiplier = 1;
}
setAttrs({
rollDialogMessage:theMessage,
hiddenSTUNmultiplier:theSTUNmultiplier
});
let theResult = String(computed*theSTUNmultiplier);
finishRoll(
results.rollId,
{
BODY: theResult.concat(theMessage)
}
);
});
});
}
});
});
on('clicked:attackShield', (info) => {
// Roll attack and damage dice for the shield.
// First determine if the shield does normal or killing damage.
getAttrs(["shieldNormalDamage", "optionAutoSubtractEND", "shieldEndurance"], function(values) {
let isNormalDamage = values.shieldNormalDamage;
let autoSubtractEND = values.optionAutoSubtractEND;
let shieldEND = parseInt(values.shieldEndurance)||0;
// If isNormalDamage is TRUE, use the Normal Damage template.
if (isNormalDamage != 0) {
startRoll("&{template:custom-normal-attack} {{title=@{character_name} - @{character_title}}} {{subtitle=Attacks with @{shieldName}}} {{OCV=[[?{Modifiers|0}-@{shieldDCV}+@{shieldOCV}+@{targetOCVpenalty}+@{ocv}]]}} {{Result=[[3d6cf<0cs>0]]}} {{STUN=[[@{hiddenShieldDamage01}]]}}", (results) => {
// Convert dice roll to equivalent BODY damage.
let computed =0;
const theDice = results.results.STUN.rolls;
// Subtract END cost if option checked.
if (autoSubtractEND != 0) {
subtractGearEndurance(shieldEND);
}
// For each type of dice (d3 or d6) calculate BODY:
for(let groupOfDice of theDice) {
if (groupOfDice.sides == 3) {
// calculate normal damage of d3 dice.
for (let element of groupOfDice.results) {
if (element === 3) {
computed = computed+1;
} else if (element === 2) {
computed = computed + Math.floor(Math.random()*2); // Flip a coin. 0 or 1 BODY corresponding to a '3' or '4' on a d6.
} else {
computed = computed+0; // Add nothing.
}
}
} else if (groupOfDice.sides == 6) {
// calculate normal damage of d6 dice.
for (let element of groupOfDice.results) {
if (element === 1) {
computed = computed+0; // Add nothing.
} else if (element === 6) {
computed = computed+2;
} else {
computed = computed+1;
}
}
}
}
// Get hit location message if system used.
getAttrs(["optionHitLocationSystem", "targetSelection"], function(values) {
let useHitLocations = values.optionHitLocationSystem;
let targetSelectionType = parseInt(values.targetSelection)||1;
let theMessage = " ";
if (useHitLocations != 0) {
var theHitLocation = new normalHitLocation(targetSelectionType);
theMessage = theHitLocation.message;
}
setAttrs({
rollDialogMessage:theMessage
});
let theResult = String(computed);
finishRoll(
results.rollId,
{
STUN: theResult.concat(theMessage)
}
);
});
});
} else {
// If isNormalDamage is FALSE, use the killing Damage template.
startRoll("&{template:custom-attack} {{title=@{character_name} - @{character_title}}} {{subtitle= Attacks with @{shieldName}}} {{OCV=[[?{Modifiers|0}-@{shieldDCV}+@{shieldOCV}+@{targetOCVpenalty}+@{ocv}]]}} {{Result=[[3d6cf<0cs>0]]}} {{BODY=[[@{hiddenShieldDamage01}]]}}", (results) => {
let computed = parseInt(results.results.BODY.result)||0;
setAttrs({
hiddenDamageRoll: computed
});
// Subtract END cost if option checked.
if (autoSubtractEND != 0) {
subtractGearEndurance(shieldEND);
}
getAttrs(["optionHitLocationSystem", "shieldStunMod", "targetSelection"], function(values) {
let useHitLocations = values.optionHitLocationSystem;
let areaEffectWeapon = values.weaponAreaEffect05;
let theSTUNmodifier = parseInt(values.shieldStunMod)||0;
let targetSelectionType = parseInt(values.targetSelection)||1;
let theMessage = " ";
// Determine the base stun multiple, which is 1d3.
let theSTUNmultiplier = Math.floor(Math.random()*3+1);
// If the hit location system option is used and the weapon is not of type area effect call the hit location function.
if (useHitLocations != 0){
var theHitLocation = new killingHitLocation(targetSelectionType);
theSTUNmultiplier = theHitLocation.stunMultiplier;
theMessage = theHitLocation.message;
}
// Add the weapon's stun modifier.
theSTUNmultiplier = theSTUNmultiplier + theSTUNmodifier;
// Prevent STUN multiples of less than 1.
if (theSTUNmultiplier < 1) {
theSTUNmultiplier = 1;
}
setAttrs({
rollDialogMessage:theMessage,
hiddenSTUNmultiplier:theSTUNmultiplier
});
let theResult = String(computed*theSTUNmultiplier);
finishRoll(
results.rollId,
{
BODY: theResult.concat(theMessage)
}
);
});
});
}
});
});
on('clicked:standardAttackRoll', (info) => {
startRoll("&{template:custom-normal-attack} {{title=@{character_name} - @{character_title}}} {{subtitle= Attacks with Strength @{strength}}} {{OCV=[[?{Modifiers|0}+@{ocv}+@{targetOCVpenalty}]]}} {{Result=[[3d6cf<0cs>0]]}} {{STUN=[[@{hiddenManeuverDamage01}]]}}", (results) => {
// A standard strength-based attack is complicated by the need to use a 1d3 for strength%5 == 3 or 4, such as 4, 8, 13, 19, etc.
getAttrs(["optionHitLocationSystem", "targetSelection", "strength", "optionAutoSubtractEND", "optionSuperHeroicEndurance"], function(values) {
let useHitLocations = values.optionHitLocationSystem;
let autoSubtractEND = values.optionAutoSubtractEND;
let optionSuperHeroic = values.optionSuperHeroicEndurance;
let enduranceCostFactor = 10;
let targetSelectionType = parseInt(values.targetSelection)||1;
let theMessage = " ";
let computed =0;
const theDiceD6 = results.results.STUN.dice;
// Subtract END cost if option checked.
if (autoSubtractEND != 0) {
/* Determine END cost */
if (optionSuperHeroic != 0) {
enduranceCostFactor=5;
}
let enduranceCost= heroRoundLow( (parseInt(values.strength)||0)/enduranceCostFactor );
if ( (enduranceCost<1) && (parseInt(values.strength)||0)>0) {
enduranceCost=1
}
subtractGearEndurance(enduranceCost);
}
// Determine BODY damage of d3 dice.
if (parseInt(values.strength)%5>2) {
// Get the last die value, which was rolled with a d3.
let theDiceD3 = theDiceD6.pop(); // Take the d3 off of the array.
if (theDiceD3 == 3) {
computed = computed+1;
} else if (theDiceD3 == 2) {
computed = computed + Math.floor(Math.random()*2); // Flip a coin. 0 or 1 BODY corresponding to a '3' or '4' on a d6.
} else {
computed = computed+0; // Add nothing.
}
}
// Calculate BODY damage of d6 dice.
for (let element of theDiceD6) {
if (element === 1) {
computed = computed+0; // Add nothing.
} else if (element === 6) {
computed = computed+2;
} else {
computed = computed+1;
}
}
// Get hit location message if system used.
if (useHitLocations != 0) {
var theHitLocation = new normalHitLocation(targetSelectionType);
theMessage = theHitLocation.message;
}
setAttrs({
rollDialogMessage:theMessage
});
let theResult = String(computed);
finishRoll(
results.rollId,
{
STUN: theResult.concat(theMessage)
}
);
});
});
});
/* ---------------- */
/* Equipment Movers */
/* ---------------- */
on("clicked:equipDown01 clicked:equipUp02", function () {
getAttrs(["equipText01", "equipText02", "equipMass01", "equipMass02"], function(values) {
let destinationText = values.equipText02;
let sourceText = values.equipText01;
let destinationMass = values.equipMass02;
let sourceMass = values.equipMass01;
setAttrs({
"equipText02":sourceText,
"equipText01":destinationText,
"equipMass02":sourceMass,
"equipMass01":destinationMass
});
});
});
on("clicked:equipDown02 clicked:equipUp03", function () {
getAttrs(["equipText02", "equipText03", "equipMass02", "equipMass03"], function(values) {
let destinationText = values.equipText03;
let sourceText = values.equipText02;
let destinationMass = values.equipMass03;
let sourceMass = values.equipMass02;
setAttrs({
"equipText03":sourceText,
"equipText02":destinationText,
"equipMass03":sourceMass,
"equipMass02":destinationMass
});
});
});
on("clicked:equipDown03 clicked:equipUp04", function () {
getAttrs(["equipText03", "equipText04", "equipMass03", "equipMass04"], function(values) {
let destinationText = values.equipText04;
let sourceText = values.equipText03;
let destinationMass = values.equipMass04;
let sourceMass = values.equipMass03;
setAttrs({
"equipText04":sourceText,
"equipText03":destinationText,
"equipMass04":sourceMass,
"equipMass03":destinationMass
});
});
});
on("clicked:equipDown04 clicked:equipUp05", function () {
getAttrs(["equipText04", "equipText05", "equipMass04", "equipMass05"], function(values) {
let destinationText = values.equipText05;
let sourceText = values.equipText04;
let destinationMass = values.equipMass05;
let sourceMass = values.equipMass04;
setAttrs({
"equipText05":sourceText,
"equipText04":destinationText,
"equipMass05":sourceMass,
"equipMass04":destinationMass
});
});
});
on("clicked:equipDown05 clicked:equipUp06", function () {
getAttrs(["equipText05", "equipText06", "equipMass05", "equipMass06"], function(values) {
let destinationText = values.equipText06;
let sourceText = values.equipText05;
let destinationMass = values.equipMass06;
let sourceMass = values.equipMass05;
setAttrs({
"equipText06":sourceText,
"equipText05":destinationText,
"equipMass06":sourceMass,
"equipMass05":destinationMass
});
});
});
on("clicked:equipDown06 clicked:equipUp07", function () {
getAttrs(["equipText06", "equipText07", "equipMass06", "equipMass07"], function(values) {
let destinationText = values.equipText07;
let sourceText = values.equipText06;
let destinationMass = values.equipMass07;
let sourceMass = values.equipMass06;
setAttrs({
"equipText07":sourceText,
"equipText06":destinationText,
"equipMass07":sourceMass,
"equipMass06":destinationMass
});
});
});
on("clicked:equipDown07 clicked:equipUp08", function () {
getAttrs(["equipText07", "equipText08", "equipMass07", "equipMass08"], function(values) {
let destinationText = values.equipText08;
let sourceText = values.equipText07;
let destinationMass = values.equipMass08;
let sourceMass = values.equipMass07;
setAttrs({
"equipText08":sourceText,
"equipText07":destinationText,
"equipMass08":sourceMass,
"equipMass07":destinationMass
});
});
});
on("clicked:equipDown08 clicked:equipUp09", function () {
getAttrs(["equipText08", "equipText09", "equipMass08", "equipMass09"], function(values) {
let destinationText = values.equipText09;
let sourceText = values.equipText08;
let destinationMass = values.equipMass09;
let sourceMass = values.equipMass08;
setAttrs({
"equipText09":sourceText,
"equipText08":destinationText,
"equipMass09":sourceMass,
"equipMass08":destinationMass
});
});
});
on("clicked:equipDown09 clicked:equipUp10", function () {
getAttrs(["equipText09", "equipText10", "equipMass09", "equipMass10"], function(values) {
let destinationText = values.equipText10;
let sourceText = values.equipText09;
let destinationMass = values.equipMass10;
let sourceMass = values.equipMass09;
setAttrs({
"equipText10":sourceText,
"equipText09":destinationText,
"equipMass10":sourceMass,
"equipMass09":destinationMass
});
});
});
on("clicked:equipDown10 clicked:equipUp11", function () {
getAttrs(["equipText10", "equipText11", "equipMass10", "equipMass11"], function(values) {
let destinationText = values.equipText11;
let sourceText = values.equipText10;
let destinationMass = values.equipMass11;
let sourceMass = values.equipMass10;
setAttrs({
"equipText11":sourceText,
"equipText10":destinationText,
"equipMass11":sourceMass,
"equipMass10":destinationMass
});
});
});
on("clicked:equipDown11 clicked:equipUp12", function () {
getAttrs(["equipText11", "equipText12", "equipMass11", "equipMass12"], function(values) {
let destinationText = values.equipText12;
let sourceText = values.equipText11;
let destinationMass = values.equipMass12;
let sourceMass = values.equipMass11;
setAttrs({
"equipText12":sourceText,
"equipText11":destinationText,
"equipMass12":sourceMass,
"equipMass11":destinationMass
});
});
});
on("clicked:equipDown12 clicked:equipUp13", function () {
getAttrs(["equipText12", "equipText13", "equipMass12", "equipMass13"], function(values) {
let destinationText = values.equipText13;
let sourceText = values.equipText12;
let destinationMass = values.equipMass13;
let sourceMass = values.equipMass12;
setAttrs({
"equipText13":sourceText,
"equipText12":destinationText,
"equipMass13":sourceMass,
"equipMass12":destinationMass
});
});
});
on("clicked:equipDown13 clicked:equipUp14", function () {
getAttrs(["equipText13", "equipText14", "equipMass13", "equipMass14"], function(values) {
let destinationText = values.equipText14;
let sourceText = values.equipText13;
let destinationMass = values.equipMass14;
let sourceMass = values.equipMass13;
setAttrs({
"equipText14":sourceText,
"equipText13":destinationText,
"equipMass14":sourceMass,
"equipMass13":destinationMass
});
});
});
on("clicked:equipDown14 clicked:equipUp15", function () {
getAttrs(["equipText14", "equipText15", "equipMass14", "equipMass15"], function(values) {
let destinationText = values.equipText15;
let sourceText = values.equipText14;
let destinationMass = values.equipMass15;
let sourceMass = values.equipMass14;
setAttrs({
"equipText15":sourceText,
"equipText14":destinationText,
"equipMass15":sourceMass,
"equipMass14":destinationMass
});
});
});
on("clicked:equipDown15 clicked:equipUp16", function () {
getAttrs(["equipText15", "equipText16", "equipMass15", "equipMass16"], function(values) {
let destinationText = values.equipText16;
let sourceText = values.equipText15;
let destinationMass = values.equipMass16;
let sourceMass = values.equipMass15;
setAttrs({
"equipText16":sourceText,
"equipText15":destinationText,
"equipMass16":sourceMass,
"equipMass15":destinationMass
});
});
});
on("clicked:equipDown16 clicked:equipUp01", function () {
getAttrs(["equipText16", "equipText01", "equipMass16", "equipMass01"], function(values) {
let destinationText = values.equipText01;
let sourceText = values.equipText16;
let destinationMass = values.equipMass01;
let sourceMass = values.equipMass16;
setAttrs({
"equipText01":sourceText,
"equipText16":destinationText,
"equipMass01":sourceMass,
"equipMass16":destinationMass
});
});
});
// Talent Movers
on("clicked:talentDown01 clicked:talentUp02", function () {
getAttrs(["talentName01", "talentName02", "talentText01", "talentText02", "talentCP01", "talentCP02"], function(values) {
let destinationName = values.talentName02;
let sourceName = values.talentName01;
let destinationText = values.talentText02;
let sourceText = values.talentText01;
let destinationCP = values.talentCP02;
let sourceCP = values.talentCP01;
setAttrs({
"talentName02":sourceName,
"talentName01":destinationName,
"talentText02":sourceText,
"talentText01":destinationText,
"talentCP02":sourceCP,
"talentCP01":destinationCP
});
});
});
on("clicked:talentDown02 clicked:talentUp03", function () {
getAttrs(["talentName02", "talentName03", "talentText02", "talentText03", "talentCP02", "talentCP03"], function(values) {
let destinationName = values.talentName03;
let sourceName = values.talentName02;
let destinationText = values.talentText03;
let sourceText = values.talentText02;
let destinationCP = values.talentCP03;
let sourceCP = values.talentCP02;
setAttrs({
"talentName03":sourceName,
"talentName02":destinationName,
"talentText03":sourceText,
"talentText02":destinationText,
"talentCP03":sourceCP,
"talentCP02":destinationCP
});
});
});
on("clicked:talentDown03 clicked:talentUp04", function () {
getAttrs(["talentName03", "talentName04", "talentText03", "talentText04", "talentCP03", "talentCP04"], function(values) {
let destinationName = values.talentName04;
let sourceName = values.talentName03;
let destinationText = values.talentText04;
let sourceText = values.talentText03;
let destinationCP = values.talentCP04;
let sourceCP = values.talentCP03;
setAttrs({
"talentName04":sourceName,
"talentName03":destinationName,
"talentText04":sourceText,
"talentText03":destinationText,
"talentCP04":sourceCP,
"talentCP03":destinationCP
});
});
});
on("clicked:talentDown04 clicked:talentUp05", function () {
getAttrs(["talentName04", "talentName05", "talentText04", "talentText05", "talentCP04", "talentCP05"], function(values) {
let destinationName = values.talentName05;
let sourceName = values.talentName04;
let destinationText = values.talentText05;
let sourceText = values.talentText04;
let destinationCP = values.talentCP05;
let sourceCP = values.talentCP04;
setAttrs({
"talentName05":sourceName,
"talentName04":destinationName,
"talentText05":sourceText,
"talentText04":destinationText,
"talentCP05":sourceCP,
"talentCP04":destinationCP
});
});
});
on("clicked:talentDown05 clicked:talentUp06", function () {
getAttrs(["talentName05", "talentName06", "talentText05", "talentText06", "talentCP05", "talentCP06"], function(values) {
let destinationName = values.talentName06;
let sourceName = values.talentName05;
let destinationText = values.talentText06;
let sourceText = values.talentText05;
let destinationCP = values.talentCP06;
let sourceCP = values.talentCP05;
setAttrs({
"talentName06":sourceName,
"talentName05":destinationName,
"talentText06":sourceText,
"talentText05":destinationText,
"talentCP06":sourceCP,
"talentCP05":destinationCP
});
});
});
on("clicked:talentDown06 clicked:talentUp07", function () {
getAttrs(["talentName06", "talentName07", "talentText06", "talentText07", "talentCP06", "talentCP07"], function(values) {
let destinationName = values.talentName07;
let sourceName = values.talentName06;
let destinationText = values.talentText07;
let sourceText = values.talentText06;
let destinationCP = values.talentCP07;
let sourceCP = values.talentCP06;
setAttrs({
"talentName07":sourceName,
"talentName06":destinationName,
"talentText07":sourceText,
"talentText06":destinationText,
"talentCP07":sourceCP,
"talentCP06":destinationCP
});
});
});
on("clicked:talentDown07 clicked:talentUp01", function () {
getAttrs(["talentName07", "talentName01", "talentText07", "talentText01", "talentCP07", "talentCP01"], function(values) {
let destinationName = values.talentName01;
let sourceName = values.talentName07;
let destinationText = values.talentText01;
let sourceText = values.talentText07;
let destinationCP = values.talentCP01;
let sourceCP = values.talentCP07;
setAttrs({
"talentName01":sourceName,
"talentName07":destinationName,
"talentText01":sourceText,
"talentText07":destinationText,
"talentCP01":sourceCP,
"talentCP07":destinationCP
});
});
});
// Complication Movers
on("clicked:complicationDown01 clicked:complicationUp02", function () {
getAttrs(["complicationName01", "complicationName02", "complicationText01", "complicationText02", "complicationCP01", "complicationCP02"], function(values) {
let destinationName = values.complicationName02;
let sourceName = values.complicationName01;
let destinationText = values.complicationText02;
let sourceText = values.complicationText01;
let destinationCP = values.complicationCP02;
let sourceCP = values.complicationCP01;
setAttrs({
"complicationName02":sourceName,
"complicationName01":destinationName,
"complicationText02":sourceText,
"complicationText01":destinationText,
"complicationCP02":sourceCP,
"complicationCP01":destinationCP
});
});
});
on("clicked:complicationDown02 clicked:complicationUp03", function () {
getAttrs(["complicationName02", "complicationName03", "complicationText02", "complicationText03", "complicationCP02", "complicationCP03"], function(values) {
let destinationName = values.complicationName03;
let sourceName = values.complicationName02;
let destinationText = values.complicationText03;
let sourceText = values.complicationText02;
let destinationCP = values.complicationCP03;
let sourceCP = values.complicationCP02;
setAttrs({
"complicationName03":sourceName,
"complicationName02":destinationName,
"complicationText03":sourceText,
"complicationText02":destinationText,
"complicationCP03":sourceCP,
"complicationCP02":destinationCP
});
});
});
on("clicked:complicationDown03 clicked:complicationUp04", function () {
getAttrs(["complicationName03", "complicationName04", "complicationText03", "complicationText04", "complicationCP03", "complicationCP04"], function(values) {
let destinationName = values.complicationName04;
let sourceName = values.complicationName03;
let destinationText = values.complicationText04;
let sourceText = values.complicationText03;
let destinationCP = values.complicationCP04;
let sourceCP = values.complicationCP03;
setAttrs({
"complicationName04":sourceName,
"complicationName03":destinationName,
"complicationText04":sourceText,
"complicationText03":destinationText,
"complicationCP04":sourceCP,
"complicationCP03":destinationCP
});
});
});
on("clicked:complicationDown04 clicked:complicationUp05", function () {
getAttrs(["complicationName04", "complicationName05", "complicationText04", "complicationText05", "complicationCP04", "complicationCP05"], function(values) {
let destinationName = values.complicationName05;
let sourceName = values.complicationName04;
let destinationText = values.complicationText05;
let sourceText = values.complicationText04;
let destinationCP = values.complicationCP05;
let sourceCP = values.complicationCP04;
setAttrs({
"complicationName05":sourceName,
"complicationName04":destinationName,
"complicationText05":sourceText,
"complicationText04":destinationText,
"complicationCP05":sourceCP,
"complicationCP04":destinationCP
});
});
});
on("clicked:complicationDown05 clicked:complicationUp06", function () {
getAttrs(["complicationName05", "complicationName06", "complicationText05", "complicationText06", "complicationCP05", "complicationCP06"], function(values) {
let destinationName = values.complicationName06;
let sourceName = values.complicationName05;
let destinationText = values.complicationText06;
let sourceText = values.complicationText05;
let destinationCP = values.complicationCP06;
let sourceCP = values.complicationCP05;
setAttrs({
"complicationName06":sourceName,
"complicationName05":destinationName,
"complicationText06":sourceText,
"complicationText05":destinationText,
"complicationCP06":sourceCP,
"complicationCP05":destinationCP
});
});
});
on("clicked:complicationDown06 clicked:complicationUp01", function () {
getAttrs(["complicationName06", "complicationName01", "complicationText06", "complicationText01", "complicationCP06", "complicationCP01"], function(values) {
let destinationName = values.complicationName01;
let sourceName = values.complicationName06;
let destinationText = values.complicationText01;
let sourceText = values.complicationText06;
let destinationCP = values.complicationCP01;
let sourceCP = values.complicationCP06;
setAttrs({
"complicationName01":sourceName,
"complicationName06":destinationName,
"complicationText01":sourceText,
"complicationText06":destinationText,
"complicationCP01":sourceCP,
"complicationCP06":destinationCP
});
});
});
// End sheet workers
</script>