Files
roll20-character-sheets/PokemonTabletopAdventures_v3/PTA3.html
T
Ian Merryweather c3fc6aab33 feature: Adds attribute-revealing titles to each relevant element
- Adds a title to allow hover-inspection of attribute names
- Alphabetises element attributes for a consistent order
- Increased the line length for Prettier to 160 because it was annoying me again, lol (sorry)
- Capitalises the hybrid character's nature field
- Renamed the nature select drop-down attribute as there was a clash with the nature bonus attribute
  - Added a sheet worker to migrate this change over
2020-12-12 15:17:33 +00:00

1821 lines
86 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!-- Background coloring strategy inspired by the GURPS sheet -->
<input class="sheet-color-setting" name="attr_type1" type="hidden" value="normal" />
<div class="wrapper color-background">
<div class="sheet-page-selection">
<button class="sheet-page-selection-option" name="act_character-page" type="action">Character</button>
<button class="sheet-page-selection-option" name="act_configuration-page" type="action">Configuration</button>
</div>
<input class="sheet-selected-page" name="attr_selected-page" type="hidden" value="character-page" />
<div class="sheet-character-page">
<input class="sheet-character-type" name="attr_character-type" type="hidden" value="trainer" />
<p class="logo">
<img src="https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/PokemonTabletopAdventures_v3/images/PTA3SmallLogo.png" />
</p>
<div class="tab-trainer">
<div class="2col-centered">
<div class="character-name-grid">
<b>Name</b>
<input class="top-information" name="attr_character_name" spellcheck="false" title="Attribute: character_name" type="text" />
<b>Origin</b>
<input class="top-information" name="attr_origin" spellcheck="false" title="Attribute: origin" type="text" />
<b>Honors</b>
<input class="top-information" name="attr_honor_count" title="Attribute: honor_count" type="number" />
<b>Credits</b>
<input class="top-information long-number" name="attr_credits" title="Attribute: credits" type="number" />
</div>
<div class="character-class-grid">
<b>Class</b>
<input class="top-information" name="attr_class1" spellcheck="false" title="Attribute: class1" type="text" />
<b>Level</b>
<input class="top-information" name="attr_level1" title="Attribute: level1" type="number" />
<b>Class</b>
<input class="top-information" name="attr_class2" spellcheck="false" title="Attribute: class2" type="text" />
<b>Level</b>
<input class="top-information" name="attr_level2" title="Attribute: level2" type="number" />
<b>Class</b>
<input class="top-information" name="attr_class3" spellcheck="false" title="Attribute: class3" type="text" />
<b>Level</b>
<input class="top-information" name="attr_level3" title="Attribute: level3" type="number" />
<b>Class</b>
<input class="top-information" name="attr_class4" spellcheck="false" title="Attribute: class4" type="text" />
<b>Level</b>
<input class="top-information" name="attr_level4" title="Attribute: level4" type="number" />
</div>
</div>
</div>
<div class="tab-pokemon">
<div class="2col-centered">
<div class="character-name-grid">
<b>Name</b>
<input class="top-information" name="attr_character_name" spellcheck="false" title="Attribute: character_name" type="text" />
<b>Species</b>
<input class="top-information" name="attr_species" spellcheck="false" title="Attribute: species" type="text" />
<b>Type</b>
<span>
<select class="half-text sheet-no-dropdown" name="attr_type1" title="Attribute: type1">
<option value="bug">Bug</option>
<option value="dark">Dark</option>
<option value="dragon">Dragon</option>
<option value="electric">Electric</option>
<option value="fairy">Fairy</option>
<option value="fighting">Fighting</option>
<option value="fire">Fire</option>
<option value="flying">Flying</option>
<option value="ghost">Ghost</option>
<option value="grass">Grass</option>
<option value="ground">Ground</option>
<option value="ice">Ice</option>
<option value="normal" selected>Normal</option>
<option value="poison">Poison</option>
<option value="psychic">Psychic</option>
<option value="rock">Rock</option>
<option value="steel">Steel</option>
<option value="water">Water</option>
</select>
<select class="half-text sheet-no-dropdown" name="attr_type2" title="Attribute: type2">
<option value=""></option>
<option value="bug">Bug</option>
<option value="dark">Dark</option>
<option value="dragon">Dragon</option>
<option value="electric">Electric</option>
<option value="fairy">Fairy</option>
<option value="fighting">Fighting</option>
<option value="fire">Fire</option>
<option value="flying">Flying</option>
<option value="ghost">Ghost</option>
<option value="grass">Grass</option>
<option value="ground">Ground</option>
<option value="ice">Ice</option>
<option value="normal">Normal</option>
<option value="poison">Poison</option>
<option value="psychic">Psychic</option>
<option value="rock">Rock</option>
<option value="steel">Steel</option>
<option value="water">Water</option>
</select>
</span>
<b>Nature</b>
<select class="sheet-no-dropdown top-select" name="attr_nature-type" title="Attribute: nature-type">
<option value=""></option>
<option value="onely">Lonely (+Atk, -Def)</option>
<option value="brave">Brave (+Atk, -Spd)</option>
<option value="adamant">Adamant (+Atk, -SpAtk)</option>
<option value="naughty">Naughty (+Atk, -SpDef)</option>
<option value="bold">Bold (+Def, -Atk)</option>
<option value="relaxed">Relaxed (+Def, -Spd)</option>
<option value="impish">Impish (+Def, -SpAtk)</option>
<option value="lax">Lax (+Def, -SpDef)</option>
<option value="timid">Timid (+Spd, -Atk)</option>
<option value="hasty">Hasty (+Spd, -Def)</option>
<option value="jolly">Jolly (+Spd, -SpAtk)</option>
<option value="naïve">Naïve (+Spd, -SpDef)</option>
<option value="modest">Modest (+SpAtk, -Atk)</option>
<option value="mild">Mild (+SpAtk, -Def)</option>
<option value="quiet">Quiet (+SpAtk, -Spd)</option>
<option value="rash">Rash (+SpAtk, -SpDef)</option>
<option value="calm">Calm (+SpDef, -Atk)</option>
<option value="gentle">Gentle (+SpDef, -Def)</option>
<option value="sassy">Sassy (+SpDef, -Spd)</option>
<option value="careful">Careful (+SpDef, -SpAtk)</option>
<option value="hardy">Hardy</option>
<option value="docile">Docile</option>
<option value="serious">Serious</option>
<option value="bashful">Bashful</option>
<option value="quirky">Quirky</option>
<option value="other">Other</option>
</select>
<b>Held Item</b>
<input class="top-information" name="attr_item" spellcheck="false" title="Attribute: item" type="text" />
</div>
<div class="character-name-grid">
<b>Size</b>
<input class="top-information" name="attr_size" spellcheck="false" title="Attribute: size" type="text" />
<b>Weight</b>
<input class="top-information" name="attr_weight" spellcheck="false" title="Attribute: weight" type="text" />
<b>Sex</b>
<input class="top-information" name="attr_pokemon_sex" spellcheck="false" title="Attribute: pokemon_sex" type="text" />
<b>Egg Group</b>
<input class="top-information" name="attr_egg_group" spellcheck="false" title="Attribute: egg_group" type="text" />
<b>Diet</b>
<input class="top-information" name="attr_diet" spellcheck="false" title="Attribute: diet" type="text" />
</div>
</div>
</div>
<div class="tab-hybrid">
<div class="2col-centered">
<div class="character-name-grid">
<b>Name</b>
<input class="top-information" name="attr_character_name" spellcheck="false" title="Attribute: character_name" type="text" />
<b>Species</b>
<input class="top-information" name="attr_species" spellcheck="false" title="Attribute: species" type="text" />
<b>Nature</b>
<input class="sheet-caps top-information" name="attr_nature-type" spellcheck="false" title="Attribute: nature-type" type="text" />
<b>Origin</b>
<input class="top-information" name="attr_origin" spellcheck="false" title="Attribute: origin" type="text" />
<b>Honors</b>
<input class="top-information" name="attr_honor_count" title="Attribute: honor_count" type="number" />
<b>Credits</b>
<input class="top-information long-number" name="attr_credits" title="Attribute: credits" type="number" />
</div>
<div class="character-name-grid">
<b>Type</b>
<span>
<select class="half-text sheet-no-dropdown" name="attr_type1" title="type1">
<option value="bug">Bug</option>
<option value="dark">Dark</option>
<option value="dragon">Dragon</option>
<option value="electric">Electric</option>
<option value="fairy">Fairy</option>
<option value="fighting">Fighting</option>
<option value="fire">Fire</option>
<option value="flying">Flying</option>
<option value="ghost">Ghost</option>
<option value="grass">Grass</option>
<option value="ground">Ground</option>
<option value="ice">Ice</option>
<option value="normal" selected>Normal</option>
<option value="poison">Poison</option>
<option value="psychic">Psychic</option>
<option value="rock">Rock</option>
<option value="steel">Steel</option>
<option value="water">Water</option>
</select>
<select class="half-text sheet-no-dropdown" name="attr_type2" title="type2">
<option value=""></option>
<option value="bug">Bug</option>
<option value="dark">Dark</option>
<option value="dragon">Dragon</option>
<option value="electric">Electric</option>
<option value="fairy">Fairy</option>
<option value="fighting">Fighting</option>
<option value="fire">Fire</option>
<option value="flying">Flying</option>
<option value="ghost">Ghost</option>
<option value="grass">Grass</option>
<option value="ground">Ground</option>
<option value="ice">Ice</option>
<option value="normal">Normal</option>
<option value="poison">Poison</option>
<option value="psychic">Psychic</option>
<option value="rock">Rock</option>
<option value="steel">Steel</option>
<option value="water">Water</option>
</select>
</span>
<b>Size / Weight</b>
<span>
<input class="half-text top-information" name="attr_size" spellcheck="false" title="Attribute: size" type="text" />
<input class="half-text top-information" name="attr_weight" spellcheck="false" title="Attribute: weight" type="text" />
</span>
<b>Sex</b>
<input class="top-information" name="attr_pokemon_sex" spellcheck="false" title="Attribute: pokemon_sex" type="text" />
<b>Egg Group</b>
<input class="top-information" name="attr_egg_group" spellcheck="false" title="Attribute: egg_group" type="text" />
<b>Diet</b>
<input class="top-information" name="attr_diet" spellcheck="false" title="Attribute: diet" type="text" />
<b>Held Item</b>
<input class="top-information" name="attr_item" spellcheck="false" title="Attribute: item" type="text" />
</div>
</div>
</div>
<br />
<div class="tab-trainer tab-hybrid">
<div class="character-stat-grid">
<div class="ball hp-ball">
<b>Current HP</b><br />
<input class="stat-ball-color" name="attr_HP" title="Attribute: HP" type="number" /><br />
<input class="stat-ball-color" name="attr_HP_max" title="Attribute: HP_max" type="number" /><br />
<p>Max HP</p>
</div>
<div class="ball atk-ball">
<b>Attack</b><br />
<input class="stat-ball-color" name="attr_ATK" title="Attribute: ATK" type="number" /><br />
<button
class="stat-roller"
name="roll_attack_check"
type="roll"
value="&{template:skill-roll} {{base-attribute=atk}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Generic Attack Check}} {{skill-roll=[[ 1d20 + [[ @{ATKMOD} + ?{Temp Modifier|0} ]] ]]}}"
>
<span name="attr_ATKMOD" title="Attribute: ATKMOD"></span>
</button>
<br />
<p>ATK mod</p>
</div>
<div class="ball def-ball">
<b>Defense</b><br />
<input class="stat-ball-color" name="attr_DEF" title="Attribute: DEF" type="number" /><br />
<button
class="stat-roller"
name="roll_defense_check"
type="roll"
value="&{template:skill-roll} {{base-attribute=def}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Generic Defense Check}} {{skill-roll=[[ 1d20 + [[ @{DEFMOD} + ?{Temp Modifier|0} ]] ]]}}"
>
<span name="attr_DEFMOD" title="Attribute: DEFMOD"></span>
</button>
<br />
<p>DEF mod</p>
</div>
<div class="ball spatk-ball">
<b>Special Attack</b><br />
<input class="stat-ball-color" name="attr_SPATK" title="Attribute: SPATK" type="number" /><br />
<button
class="stat-roller"
name="roll_special-attack_check"
type="roll"
value="&{template:skill-roll} {{base-attribute=spatk}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Generic Special Attack Check}} {{skill-roll=[[ 1d20 + [[ @{SPATKMOD} + ?{Temp Modifier|0} ]] ]]}}"
>
<span name="attr_SPATKMOD" title="Attribute: SPATKMOD"></span>
</button>
<br />
<p>SPATK mod</p>
</div>
<div class="ball spdef-ball">
<b>Special Defense</b><br />
<input class="stat-ball-color" name="attr_SPDEF" title="Attribute: SPDEF" type="number" /><br />
<button
class="stat-roller"
name="roll_special-defense_check"
type="roll"
value="&{template:skill-roll} {{base-attribute=spdef}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Generic Special Defense Check}} {{skill-roll=[[ 1d20 + [[ @{SPDEFMOD} + ?{Temp Modifier|0} ]] ]]}}"
>
<span name="attr_SPDEFMOD" title="Attribute: SPDEFMOD"></span>
</button>
<br />
<p>SPDEF mod</p>
</div>
<div class="ball spd-ball">
<b>Speed</b><br />
<input class="stat-ball-color" name="attr_SPD" title="Attribute: SPD" type="number" /><br />
<button
class="stat-roller"
name="roll_speed_check"
type="roll"
value="&{template:skill-roll} {{base-attribute=spd}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Generic Speed Check}} {{skill-roll=[[ 1d20 + [[ @{SPDMOD} + ?{Temp Modifier|0} ]] ]]}}"
>
<span name="attr_SPDMOD" title="Attribute: SPDMOD"></span>
</button>
<br />
<p>SPD mod</p>
</div>
</div>
</div>
<div class="tab-pokemon">
<div class="character-stat-grid">
<div class="ball hp-ball">
<b>Current HP</b><br />
<input class="stat-ball-color" name="attr_HP" title="Attribute: HP" type="number" /><br />
<input class="stat-ball-color" name="attr_HP_max" title="Attribute: HP_max" type="number" /><br />
<p>Max HP</p>
</div>
<div class="ball atk-ball">
<b>Attack</b><br />
<input class="stat-ball-color" name="attr_ATK" title="Attribute: ATK" type="number" /><br />
<button
class="stat-roller"
name="roll_attack_check"
type="roll"
value="&{template:skill-roll} {{base-attribute=atk}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Generic Attack Check}} {{skill-roll=[[ 1d20 + [[ @{ATKMOD} + ?{Temp Modifier|0} ]] ]]}}"
>
<span name="attr_ATKMOD" title="Attribute: ATKMOD"></span>
</button>
<br />
<p>ATK mod</p>
</div>
<div class="ball def-ball">
<b>Defense</b><br />
<input class="stat-ball-color" name="attr_DEF" title="Attribute: DEF" type="number" /><br />
</div>
<div class="ball spatk-ball">
<b>Special Attack</b><br />
<input class="stat-ball-color" name="attr_SPATK" title="Attribute: SPATK" type="number" /><br />
<button
class="stat-roller"
name="roll_special-attack_check"
type="roll"
value="&{template:skill-roll} {{base-attribute=spatk}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Generic Special Attack Check}} {{skill-roll=[[ 1d20 + [[ @{SPATKMOD} + ?{Temp Modifier|0} ]] ]]}}"
>
<span name="attr_SPATKMOD" title="Attribute: SPATKMOD"></span>
</button>
<br />
<p>SPATK mod</p>
</div>
<div class="ball spdef-ball">
<b>Special Defense</b><br />
<input class="stat-ball-color" name="attr_SPDEF" title="Attribute: SPDEF" type="number" /><br />
</div>
<div class="ball spd-ball">
<b>Speed</b><br />
<input class="stat-ball-color" name="attr_SPD" title="Attribute: SPD" type="number" /><br />
<button
class="stat-roller"
name="roll_speed_check"
type="roll"
value="&{template:skill-roll} {{base-attribute=spd}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Generic Speed Check}} {{skill-roll=[[ 1d20 + [[ @{SPDMOD} + ?{Temp Modifier|0} ]] ]]}}"
>
<span name="attr_SPDMOD" title="Attribute: SPDMOD"></span>
</button>
<br />
<p>SPD mod</p>
</div>
</div>
</div>
<div class="tab-pokemon tab-hybrid">
<div class="pokemon-extra-stats-grid">
<p></p>
<p></p>
<p></p>
<p></p>
<b>Movement</b>
<span>
<input class="speed-read-color" name="attr_movement" readonly title="Attribute: movement" type="number" />
<b>ft</b>
</span>
<b>Temporary Bonuses</b>
<b>Attack</b>
<b>Defense</b>
<b>Special Attack</b>
<b>Special Defense</b>
<b>Speed</b>
<b></b>
<input class="attack-color" name="attr_atkbonus" title="Attribute: atkbonus" type="number" />
<input class="defense-color" name="attr_defbonus" title="Attribute: defbonus" type="number" />
<input class="spatk-color" name="attr_spatkbonus" title="Attribute: spatkbonus" type="number" />
<input class="spdef-color" name="attr_spdefbonus" title="Attribute: spdefbonus" type="number" />
<input class="speed-color" name="attr_spdbonus" title="Attribute: spdbonus" type="number" />
<b>Contest Stats</b>
<b>Cool</b>
<b>Tough</b>
<b>Beauty</b>
<b>Clever</b>
<b>Cute</b>
<b></b>
<input class="attack-color" name="attr_cool" title="Attribute: cool" type="number" />
<input class="defense-color" name="attr_tough" title="Attribute: tough" type="number" />
<input class="spatk-color" name="attr_beauty" title="Attribute: beauty" type="number" />
<input class="spdef-color" name="attr_clever" title="Attribute: clever" type="number" />
<input class="speed-color" name="attr_cute" title="Attribute: cute" type="number" />
</div>
</div>
<div class="tab-trainer tab-hybrid">
<br />
<div class="character-skill-labels">
<b>Total</b>
<b>Skill Name</b>
<b>Talent</b>
<b>Bonus</b>
<b>Inventory</b>
</div>
<div class="2col-centered">
<div>
<div class="character-skills">
<input class="speed-read-color" name="attr_acrobatics_total" readonly title="Attribute: acrobatics_total" type="number" />
<button
class="skill-roller spd-skill"
name="roll_acrobaticscheck"
type="roll"
value="&{template:skill-roll} {{base-attribute=spd}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Acrobatics}} {{skill-roll=[[ 1d20!kh2 + [[ @{acrobatics_total} + ?{Temporary Bonus|0} ]] ]]}}"
>
Acrobatics (SPD)
</button>
<input name="attr_acrobaticstalent1" value="2" title="Attribute: acrobaticstalent1" type="checkbox" />
<input name="attr_acrobaticstalent2" value="2" title="Attribute: acrobaticstalent2" type="checkbox" />
<input name="attr_acrobatics" value="0" title="Attribute: acrobatics" type="number" />
<input class="attack-read-color" name="attr_athletics_total" readonly title="Attribute: athletics_total" type="number" />
<button
class="skill-roller atk-skill"
name="roll_athleticscheck"
type="roll"
value="&{template:skill-roll} {{base-attribute=atk}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Athletics}} {{skill-roll=[[ 1d20!kh2 + [[ @{athletics_total} + ?{Temporary Bonus|0} ]] ]]}}"
>
Athletics (ATK)
</button>
<input name="attr_athleticstalent1" value="2" title="Attribute: athleticstalent1" type="checkbox" />
<input name="attr_athleticstalent2" value="2" title="Attribute: athleticstalent2" type="checkbox" />
<input name="attr_athletics" value="0" title="Attribute: athletics" type="number" />
<input class="spdef-read-color" name="attr_bluff_total" readonly title="Attribute: bluff_total" type="number" />
<button
class="skill-roller spdef-skill"
name="roll_bluffcheck"
type="roll"
value="&{template:skill-roll} {{base-attribute=spdef}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Bluff/Deception}} {{skill-roll=[[ 1d20!kh2 + [[ @{bluff_total} + ?{Temporary Bonus|0} ]] ]]}}"
>
Bluff/Deception (SPDEF)
</button>
<input name="attr_blufftalent1" value="2" title="Attribute: blufftalent1" type="checkbox" />
<input name="attr_blufftalent2" value="2" title="Attribute: blufftalent2" type="checkbox" />
<input name="attr_bluff" value="0" title="Attribute: bluff" type="number" />
<input class="defense-read-color" name="attr_concentration_total" readonly title="Attribute: concentration_total" type="number" />
<button
class="skill-roller def-skill"
name="roll_concentrationcheck"
type="roll"
value="&{template:skill-roll} {{base-attribute=def}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Concentration}} {{skill-roll=[[ 1d20!kh2 + [[ @{concentration_total} + ?{Temporary Bonus|0} ]] ]]}}"
>
Concentration (DEF)
</button>
<input name="attr_concentrationtalent1" value="2" title="Attribute: concentrationtalent1" type="checkbox" />
<input name="attr_concentrationtalent2" value="2" title="Attribute: concentrationtalent2" type="checkbox" />
<input name="attr_concentration" value="0" title="Attribute: concentration" type="number" />
<input class="defense-read-color" name="attr_constitution_total" readonly title="Attribute: constitution_total" type="number" />
<button
class="skill-roller def-skill"
name="roll_constitutioncheck"
type="roll"
value="&{template:skill-roll} {{base-attribute=def}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Constitution}} {{skill-roll=[[ 1d20!kh2 + [[ @{constitution_total} + ?{Temporary Bonus|0} ]] ]]}}"
>
Constitution (DEF)
</button>
<input name="attr_constitutiontalent1" value="2" title="Attribute: constitutiontalent1" type="checkbox" />
<input name="attr_constitutiontalent2" value="2" title="Attribute: constitutiontalent2" type="checkbox" />
<input name="attr_constitution" value="0" title="Attribute: constitution" type="number" />
<input class="spdef-read-color" name="attr_diplomacy_total" readonly title="Attribute: diplomacy_total" type="number" />
<button
class="skill-roller spdef-skill"
name="roll_diplomacycheck"
type="roll"
value="&{template:skill-roll} {{base-attribute=spdef}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Diplomacy/Persuasion}} {{skill-roll=[[ 1d20!kh2 + [[ @{diplomacy_total} + ?{Temporary Bonus|0} ]] ]]}}"
>
Diplomacy/Persuasion (SPDEF)
</button>
<input name="attr_diplomacytalent1" value="2" title="Attribute: diplomacytalent1" type="checkbox" />
<input name="attr_diplomacytalent2" value="2" title="Attribute: diplomacytalent2" type="checkbox" />
<input name="attr_diplomacy" value="0" title="Attribute: diplomacy" type="number" />
<input class="spatk-read-color" name="attr_engineering_total" readonly title="Attribute: engineering_total" type="number" />
<button
class="skill-roller spatk-skill"
name="roll_engineeringcheck"
type="roll"
value="&{template:skill-roll} {{base-attribute=spatk}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Engineering/Operation}} {{skill-roll=[[ 1d20!kh2 + [[ @{engineering_total} + ?{Temporary Bonus|0} ]] ]]}}"
>
Engineering/Operation (SPATK)
</button>
<input name="attr_engineeringtalent1" value="2" title="Attribute: engineeringtalent1" type="checkbox" />
<input name="attr_engineeringtalent2" value="2" title="Attribute: engineeringtalent2" type="checkbox" />
<input name="attr_engineering" value="0" title="Attribute: engineering" type="number" />
<input class="spatk-read-color" name="attr_history_total" readonly title="Attribute: history_total" type="number" />
<button
class="skill-roller spatk-skill"
name="roll_historycheck"
type="roll"
value="&{template:skill-roll} {{base-attribute=spatk}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=History}} {{skill-roll=[[ 1d20!kh2 + [[ @{history_total} + ?{Temporary Bonus|0} ]] ]]}}"
>
History (SPATK)
</button>
<input name="attr_historytalent1" value="2" title="Attribute: historytalent1" type="checkbox" />
<input name="attr_historytalent2" value="2" title="Attribute: historytalent2" type="checkbox" />
<input name="attr_history" value="0" title="Attribute: history" type="number" />
<input class="spdef-read-color" name="attr_insight_total" readonly title="Attribute: insight_total" type="number" />
<button
class="skill-roller spdef-skill"
name="roll_insightcheck"
type="roll"
value="&{template:skill-roll} {{base-attribute=spdef}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Insight}} {{skill-roll=[[ 1d20!kh2 + [[ @{insight_total} + ?{Temporary Bonus|0} ]] ]]}}"
>
Insight (SPDEF)
</button>
<input name="attr_insighttalent1" value="2" title="Attribute: insighttalent1" type="checkbox" />
<input name="attr_insighttalent2" value="2" title="Attribute: insighttalent2" type="checkbox" />
<input name="attr_insight" value="0" title="Attribute: insight" type="number" />
<input class="spatk-read-color" name="attr_investigate_total" readonly title="Attribute: investigate_total" type="number" />
<button
class="skill-roller spatk-skill"
name="roll_investigatecheck"
type="roll"
value="&{template:skill-roll} {{base-attribute=spatk}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Investigate}} {{skill-roll=[[ 1d20!kh2 + [[ @{investigate_total} + ?{Temporary Bonus|0} ]] ]]}}"
>
Investigate (SPATK)
</button>
<input name="attr_investigatetalent1" value="2" title="Attribute: investigatetalent1" type="checkbox" />
<input name="attr_investigatetalent2" value="2" title="Attribute: investigatetalent2" type="checkbox" />
<input name="attr_investigate" value="0" title="Attribute: investigate" type="number" />
<input class="spatk-read-color" name="attr_medicine_total" readonly title="Attribute: medicine_total" type="number" />
<button
class="skill-roller spatk-skill"
name="roll_medicinecheck"
type="roll"
value="&{template:skill-roll} {{base-attribute=spatk}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Medicine}} {{skill-roll=[[ 1d20!kh2 + [[ @{medicine_total} + ?{Temporary Bonus|0} ]] ]]}}"
>
Medicine (SPATK)
</button>
<input name="attr_medicinetalent1" value="2" title="Attribute: medicinetalent1" type="checkbox" />
<input name="attr_medicinetalent2" value="2" title="Attribute: medicinetalent2" type="checkbox" />
<input name="attr_medicine" value="0" title="Attribute: medicine" type="number" />
<input class="spatk-read-color" name="attr_nature_total" readonly title="Attribute: nature_total" type="number" />
<button
class="skill-roller spatk-skill"
name="roll_naturecheck"
type="roll"
value="&{template:skill-roll} {{base-attribute=spatk}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Nature}} {{skill-roll=[[ 1d20!kh2 + [[ @{nature_total} + ?{Temporary Bonus|0} ]] ]]}}"
>
Nature (SPATK)
</button>
<input name="attr_naturetalent1" value="2" title="Attribute: naturetalent1" type="checkbox" />
<input name="attr_naturetalent2" value="2" title="Attribute: naturetalent2" type="checkbox" />
<input name="attr_nature" value="0" title="Attribute: nature" type="number" />
<input class="spdef-read-color" name="attr_perception_total" readonly title="Attribute: perception_total" type="number" />
<button
class="skill-roller spdef-skill"
name="roll_perceptioncheck"
type="roll"
value="&{template:skill-roll} {{base-attribute=spdef}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Perception}} {{skill-roll=[[ 1d20!kh2 + [[ @{perception_total} + ?{Temporary Bonus|0} ]] ]]}}"
>
Perception (SPDEF)
</button>
<input name="attr_perceptiontalent1" value="2" title="Attribute: perceptiontalent1" type="checkbox" />
<input name="attr_perceptiontalent2" value="2" title="Attribute: perceptiontalent2" type="checkbox" />
<input name="attr_perception" value="0" title="Attribute: perception" type="number" />
<input class="spdef-read-color" name="attr_perform_total" readonly title="Attribute: perform_total" type="number" />
<button
class="skill-roller spdef-skill"
name="roll_performcheck"
type="roll"
value="&{template:skill-roll} {{base-attribute=spdef}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Perform}} {{skill-roll=[[ 1d20!kh2 + [[ @{perform_total} + ?{Temporary Bonus|0} ]] ]]}}"
>
Perform (SPDEF)
</button>
<input name="attr_performtalent1" value="2" title="Attribute: performtalent1" type="checkbox" />
<input name="attr_performtalent2" value="2" title="Attribute: performtalent2" type="checkbox" />
<input name="attr_perform" value="0" title="Attribute: perform" type="number" />
<input class="spdef-read-color" name="attr_handling_total" readonly title="Attribute: handling_total" type="number" />
<button
class="skill-roller spdef-skill"
name="roll_handlingcheck"
type="roll"
value="&{template:skill-roll} {{base-attribute=spdef}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Pokemon Handling}} {{skill-roll=[[ 1d20!kh2 + [[ @{handling_total} + ?{Temporary Bonus|0} ]] ]]}}"
>
Pokémon Handling (SPDEF)
</button>
<input name="attr_handlingtalent1" value="2" title="Attribute: handlingtalent1" type="checkbox" />
<input name="attr_handlingtalent2" value="2" title="Attribute: handlingtalent2" type="checkbox" />
<input name="attr_handling" value="0" title="Attribute: handling" type="number" />
<input class="spatk-read-color" name="attr_programming_total" readonly title="Attribute: programming_total" type="number" />
<button
class="skill-roller spatk-skill"
name="roll_programmingcheck"
type="roll"
value="&{template:skill-roll} {{base-attribute=spatk}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Programming}} {{skill-roll=[[ 1d20!kh2 + [[ @{programming_total} + ?{Temporary Bonus|0} ]] ]]}}"
>
Programming (SPATK)
</button>
<input name="attr_programmingtalent1" value="2" title="Attribute: programmingtalent1" type="checkbox" />
<input name="attr_programmingtalent2" value="2" title="Attribute: programmingtalent2" type="checkbox" />
<input name="attr_programming" value="0" title="Attribute: programming" type="number" />
<input class="speed-read-color" name="attr_sleightofhand_total" readonly title="Attribute: sleightofhand_total" type="number" />
<button
class="skill-roller spd-skill"
name="roll_sleightofhandcheck"
type="roll"
value="&{template:skill-roll} {{base-attribute=spd}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Sleight of Hand}} {{skill-roll=[[ 1d20!kh2 + [[ @{sleightofhand_total} + ?{Temporary Bonus|0} ]] ]]}}"
>
Sleight of Hand (SPD)
</button>
<input name="attr_sleightofhandtalent1" value="2" title="Attribute: sleightofhandtalent1" type="checkbox" />
<input name="attr_sleightofhandtalent2" value="2" title="Attribute: sleightofhandtalent2" type="checkbox" />
<input name="attr_sleightofhand" value="0" title="Attribute: sleightofhand" type="number" />
<input class="speed-read-color" name="attr_stealth_total" readonly title="Attribute: stealth_total" type="number" />
<button
class="skill-roller spd-skill"
name="roll_stealthcheck"
type="roll"
value="&{template:skill-roll} {{base-attribute=spd}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Stealth}} {{skill-roll=[[ 1d20!kh2 + [[ @{stealth_total} + ?{Temporary Bonus|0} ]] ]]}}"
>
Stealth (SPD)
</button>
<input name="attr_stealthtalent1" value="2" title="Attribute: stealthtalent1" type="checkbox" />
<input name="attr_stealthtalent2" value="2" title="Attribute: stealthtalent2" type="checkbox" />
<input name="attr_stealth" value="0" title="Attribute: stealth" type="number" />
</div>
<hr class="skill-separator" />
<div class="capture-pokemon-skill tab-trainer">
<input class="speed-read-color" name="attr_capture_total" readonly title="Attribute: capture_total" type="number" />
<button
class="skill-roller spd-skill"
name="roll_capturecheck"
type="roll"
value="&{template:skill-roll} {{base-attribute=spd}} {{character-id=@{character_id}}} {{character-name=@{character_name}}} {{skill-name=Capture Pokémon}} {{skill-roll=[[ 1d20 + @{capture_total} ]] Capture Roll: [[ d100 + @{ball_capture_modifier} ]] }}"
>
Capture Pokémon (SPD)
</button>
<select class="sheet-ball-picker sheet-no-dropdown" name="attr_ball_capture_modifier" title="Attribute: ball_capture_modifier">
<option value="5" selected>Basic Ball</option>
<option value="0">Great Ball</option>
<option value="-5">Ultra Ball</option>
<option value="-20">Park Ball</option>
<option value="-20">Safari Ball</option>
<option value="-20">Sport Ball</option>
<option value="-5">Cherish Ball</option>
<option value="-5">Luxury Ball</option>
<option value="-5">Premier Ball</option>
<option value="-12">Dive Ball</option>
<option value="-7">Dusk Ball</option>
<option value="-8">Fast Ball</option>
<option value="-10">Lure Ball</option>
<option value="-20">Quick Ball</option>
<option value="-10">Repeat Ball</option>
<option value="-10">1m Timer Ball</option>
<option value="-25">2m Timer Ball</option>
<option value="0">Friend Ball</option>
<option value="0">Heal Ball</option>
<option value="-10">Dream Ball</option>
<option value="-15">Heavy Ball</option>
<option value="-10">Level Ball</option>
<option value="-10">Love Ball</option>
<option value="-10">Moon Ball</option>
<option value="-10">Nest Ball</option>
<option value="-15">Type Ball</option>
<option value="-12">Terrain Ball</option>
<option value="-10">Save Ball</option>
<option value="-100">Master Ball</option>
<option value="?{Custom Ball Modifier|0}">Custom Ball</option>
</select>
</div>
</div>
<textarea
class="inventory"
name="attr_inventory"
placeholder="Pokéballs, Berries, Medicine, Accessories, etc."
spellcheck="false"
title="Attribute: inventory"
></textarea>
</div>
<br />
<b>Origin Feature</b>
<div>
<div class="pokemon-move-info-header">
<input type="text" spellcheck="false" name="attr_originfeaturename" placeholder="Feature Name" />
<span
><b>Feature Usage</b>
<input type="number" name="attr_origin_usage" value="0" />
<button name="act_incrementoriginusage" type="action">+</button>
<button name="act_resetoriginusage" type="action">Reset</button>
</span>
</div>
<textarea spellcheck="false" name="attr_originfeaturedesc" class="3row-textarea" placeholder="Feature Description"></textarea>
</div>
<b>Class Features</b>
<fieldset class="repeating_features">
<div class="pokemon-move-info-header">
<input type="text" spellcheck="false" name="attr_classfeaturename" placeholder="Feature Name" />
<span
><b>Feature Usage</b>
<input type="number" name="attr_feature_usage" value="0" />
<button name="act_incrementfeatureusage" type="action">+</button>
<button name="act_resetfeatureusage" type="action">Reset</button>
</span>
</div>
<textarea spellcheck="false" name="attr_classfeaturedesc" class="3row-textarea" placeholder="Feature Description"></textarea>
</fieldset>
<b>Honors</b>
<textarea spellcheck="false" name="attr_honors" placeholder="Gym Badges, Contest Ribbons, Recognitions, etc."></textarea>
</div>
<div class="tab-trainer">
<b>Owned Pokémon</b>
<textarea name="attr_ownedpokemon" placeholder="All Pokémon owned by this Trainer" spellcheck="false" title="Attribute: ownedpokemon"></textarea>
</div>
<div class="tab-pokemon tab-hybrid">
<b>Skills</b>
<textarea
class="3row-textarea"
name="attr_pokemonskills"
placeholder="Capabilities to be used both in and out of battle, such as Firestarter, Invisibility, and Telekinetic"
spellcheck="false"
title="Attribute: pokemonskills"
></textarea>
<b>Stat Passives</b>
<textarea
class="3row-textarea"
name="attr_statpassives"
placeholder="Passives that affect Pokémon stats, such as Nasty Plot and Play Nice"
spellcheck="false"
title="Attribute: statpassives"
></textarea>
<b>Other Passives</b>
<textarea
class="4row-textarea"
name="attr_otherpassives"
placeholder="Passives that do not affect stats, such as Cute Charm and Static"
spellcheck="false"
title="Attribute: otherpassives"
></textarea>
</div>
<b>Moves</b>
<fieldset class="repeating_moves">
<input name="attr_move_category_defense" type="hidden" />
<input class="sheet-color-setting-move" name="attr_move_type" type="hidden" value="normal" />
<div class="pokemon-move">
<div class="pokemon-move-info-header">
<input name="attr_move_name" placeholder="Move" spellcheck="false" title="Attribute: move_name" type="text" />
<span>
<b>Move Usage</b>
<input name="attr_move_usage" title="Attribute: move_usage" type="number" value="0" />
<button name="act_incrementmoveusage" type="action">+</button>
<button name="act_resetmoveusage" type="action">Reset</button>
</span>
</div>
<div class="pokemon-move-info-grid-1">
<input class="move-text" name="attr_move_range" placeholder="Range" spellcheck="false" title="Attribute: move_range" type="text" />
<select class="move-text sheet-no-dropdown" name="attr_move_type" title="Attribute: move_type">
<option value="bug">Bug</option>
<option value="dark">Dark</option>
<option value="dragon">Dragon</option>
<option value="electric">Electric</option>
<option value="fairy">Fairy</option>
<option value="fighting">Fighting</option>
<option value="fire">Fire</option>
<option value="flying">Flying</option>
<option value="ghost">Ghost</option>
<option value="grass">Grass</option>
<option value="ground">Ground</option>
<option value="ice">Ice</option>
<option value="normal" selected>Normal</option>
<option value="poison">Poison</option>
<option value="psychic">Psychic</option>
<option value="rock">Rock</option>
<option value="steel">Steel</option>
<option value="water">Water</option>
</select>
<select class="move-text sheet-no-dropdown" name="attr_move_category" title="Attribute: move_category">
<option value="0">Category</option>
<option value="1">Attack</option>
<option value="2">Special Attack</option>
<option value="3">Effect</option>
</select>
<select class="move-text sheet-no-dropdown" name="attr_move_frequency" title="Attribute: move_frequency">
<option value="">Frequency</option>
<option value="atwill">At-Will</option>
<!-- 1day and 3day are switched, I know, but if we fix it we mess up existing sheets -->
<option value="1day">3/day</option>
<option value="3day">1/day</option>
<option value="1combat">1/combat</option>
</select>
<span>
<b>Damage</b>
<input class="top-information damage-dice-count" name="attr_move_dicenumber" title="Attribute: move_dicenumber" type="number" value="0" />
<select name="attr_damage_dice" class="damage-dice">
<option value="4">d4</option>
<option value="6">d6</option>
<option value="8">d8</option>
<option value="10">d10</option>
<option value="12">d12</option>
<option value="20">d20</option>
</select>
</span>
</div>
<div class="pokemon-move-info-grid-2">
<span>
<b>Accuracy Modifier</b>
<input class="top-information thin-number" name="attr_move_acmod" title="Attribute: move_acmod" type="number" value="0" />
</span>
<span>
<b title="Modify to change critical hits based on the dice roll, as per Focus Energy and Super Luck. For moves like Slash, see Effect Threshold"
>Critical Threshold</b
>
<b
class="info-tooltip"
title="Modify to change critical hits based on the dice roll, as per Focus Energy and Super Luck. For moves like Slash, see Effect Threshold"
></b
>
<input
class="top-information thin-number"
max="20"
min="1"
name="attr_move_critthreshold"
title="Attribute: move_critthreshold"
type="number"
value="20"
/>
</span>
<span>
<b>STAB</b>
<input class="top-information thin-number" name="attr_move_stabbonus" title="Attribute: move_stabbonus" type="number" value="0" />
</span>
<span>
<b>Extra Damage</b>
<input class="top-information thin-number" name="attr_move_damagebonus" title="Attribute: move_damagebonus" type="number" value="0" />
</span>
<span class="readonly-field">
<b>Damage Roll:</b>
<input name="attr_move_totaldamage" type="hidden" />
<input
class="top-information total-display"
name="attr_move_totaldamage_display"
readonly
title="Attribute: move_totaldamage_display (move_totaldamage for only the numerical bonus)"
type="text"
value=""
/>
</span>
<span>
<b title="Enter the value shown in the move notes for effects like Burned, Poisoned, and Stunned">Effect Threshold</b>
<b class="info-tooltip" title="Enter the value shown in the move notes for effects like Burned, Poisoned, and Stunned"></b>
<input
class="top-information thin-number"
max="20"
min="0"
name="attr_move_effect1_threshold"
title="Attribute: move_effect1_threshold"
type="number"
value="0"
/>
</span>
<span>
<select class="move-text" name="attr_move_effect1" title="Attribute: move_effect1_name (move_effect1 for the numerical value used in calculations)">
<option value="98" selected>None</option>
<option value="99">Critical Hit</option>
<option value="1">Asleep</option>
<option value="2">Burned</option>
<option value="3">Confused</option>
<option value="4">Cursed</option>
<option value="5">Frozen</option>
<option value="6">Infatuated</option>
<option value="7">Paralyzed</option>
<option value="8">Poisoned</option>
<option value="9">Toxified</option>
<option value="10">Stunned</option>
<option value="11">Other</option>
</select>
<input type="hidden" name="attr_move_effect1_name" />
<b class="info-tooltip" title="Choose Critical Hit for moves where a high accuracy check scores a critical hit, like Slash and Karate Chop"></b>
</span>
<span>
<b>Effect Threshold</b>
<input
class="top-information thin-number"
max="20"
min="0"
name="attr_move_effect2_threshold"
title="Attribute: move_effect2_threshold"
type="number"
value="0"
/>
</span>
<span>
<input name="attr_move_effect2_name" type="hidden" />
<select class="move-text" name="attr_move_effect2" title="Attribute: move_effect2_name (move_effect2 for the numerical value used in calculations)">
<option value="98" selected>None</option>
<option value="1">Asleep</option>
<option value="2">Burned</option>
<option value="3">Confused</option>
<option value="4">Cursed</option>
<option value="5">Frozen</option>
<option value="6">Infatuated</option>
<option value="7">Paralyzed</option>
<option value="8">Poisoned</option>
<option value="9">Toxified</option>
<option value="10">Stunned</option>
<option value="11">Other</option>
</select>
</span>
<span class="readonly-field">
<b>Accuracy Roll:</b>
<input name="attr_move_totalaccuracy" type="hidden" />
<input
class="top-information total-display"
name="attr_move_totalaccuracy_display"
readonly
title="Attribute: move_totalaccuracy_display (move_totalaccuracy for only the numerical bonus)"
type="text"
value=""
/>
</span>
</div>
<div class="move-notes-roller">
<textarea
class="3row-textarea"
name="attr_move_effect"
placeholder="Additional Effect Notes"
spellcheck="false"
title="Attribute: move_effect"
></textarea>
<button
class="move-roller"
name="roll-movetemplate"
type="roll"
value="&{template:move-roll} {{move-type=@{move_type}}} {{character-name=@{character_name}}} {{character-id=@{character_id}}} {{move-name=@{move_name}}} {{accuracy=[[ d20cf0cs>@{move_critthreshold} + [[ @{move_totalaccuracy} + ?{Temp Accuracy Bonus|0} ]] ]]}} {{target=@{move_category_defense}}} {{effectiveness=?{Effectiveness|Neutral, 0|Super Effective, 1|Extremely Effective, 2|Resisted, -1|Shielded, -2}}} {{effectiveness-roll=[[ 1d1 + 1 + ?{Effectiveness} ]]}} {{critical-damage=[[ ([[ @{move_dicenumber} + ?{Effectiveness} ]]) * @{damage_dice} + [[ @{move_totaldamage} + ?{Temp Damage Bonus|0} ]] ]]}} {{damage=[[ ([[@{move_dicenumber} + ?{Effectiveness}]])d@{damage_dice} + [[ @{move_totaldamage} + ?{Temp Damage Bonus}]] ]]}} {{effect1=@{move_effect1}}} {{effect1_roll=[[ 0 + @{move_effect1} ]]}} {{effect1_name=@{move_effect1_name}}} {{effect1_threshold=[[ 0 + @{move_effect1_threshold} ]]}} {{effect2=@{move_effect2}}} {{effect2_roll=[[ 0 + @{move_effect2} ]]}} {{effect2_name=@{move_effect2_name}}} {{effect2_threshold=[[ 0 + @{move_effect2_threshold} ]]}} {{notes=@{move_effect}}}"
>
T
</button>
</div>
</div>
</fieldset>
<b>Notes</b>
<textarea name="attr_notes" spellcheck="false" title="Attribute: notes"></textarea>
</div>
<div class="sheet-configuration-page">
<h2>Configuration Options</h2>
<div class="sheet-configuration-grid sheet-text-background">
<div class="sheet-character-type">
<b title="Default value: Trainer">Character Type:</b>
<b class="sheet-info-tooltip" title="Default value: Trainer"> </b>
<select class="sheet-character-type sheet-no-dropdown" name="attr_character-type" title="Attribute: character-type">
<option value="trainer" selected>Trainer</option>
<option value="pokemon">Pokémon</option>
<option value="hybrid">Pokémon (Character Class)</option>
</select>
<p class="sheet-dark-text">
This setting will change which options are available to use in the 'Character' page.<br />
The Pokémon Character Class option is best used to represent the Pokémon class from the PHB2, but can also be used for other things, and is especially
suited to custom classes.
</p>
</div>
<div class="sheet-initiative-breaker">
<b title="Default value: [[d20]]">Initiative Tie Breaker:</b>
<b class="sheet-info-tooltip" title="Default value: [[d20]]"> </b>
<input name="attr_initiative-tie-breaker" title="Attribute: initiative-tie-breaker" type="text" value="[[d20]]" /><br />
<p class="sheet-dark-text">
This setting is not used by the character sheet, but is incldued so that you can, if you wish, add it to the character's speed when determining their
initiative order. (Note this isn't an official rule, but it's helpful when characters have the same speed!)
<br />For best results, leave this as something you can add to a die-roll.
</p>
</div>
<div>
<b title="Default value: Normal">Type & Background Color:</b>
<b class="sheet-info-tooltip" title="Default value: Normal"> </b>
<select class="sheet-no-dropdown" name="attr_type1" title="Attribute: type1">
<option value="bug">Bug</option>
<option value="dark">Dark</option>
<option value="dragon">Dragon</option>
<option value="electric">Electric</option>
<option value="fairy">Fairy</option>
<option value="fighting">Fighting</option>
<option value="fire">Fire</option>
<option value="flying">Flying</option>
<option value="ghost">Ghost</option>
<option value="grass">Grass</option>
<option value="ground">Ground</option>
<option value="ice">Ice</option>
<option value="normal" selected>Normal</option>
<option value="poison">Poison</option>
<option value="psychic">Psychic</option>
<option value="rock">Rock</option>
<option value="steel">Steel</option>
<option value="water">Water</option>
</select>
<p class="sheet-dark-text">
This setting will update the first type for Pokémon-type characters, and also change the background color and theme for all types of characters.
</p>
</div>
</div>
</div>
</div>
<!-- ROLL TEMPLATES -->
<div class="rolltemplates">
<rolltemplate class="sheet-rolltemplate-move-roll">
<div class="container sheet-rolltemplate-color-setting-{{move-type}}-move">
<table class="move-template">
<tr>
<th colspan="2">{{move-name}}</th>
</tr>
<tr>
<td colspan="2" class="subhead">[{{character-name}}](https://journal.roll20.net/character/{{character-id}}" name="name-link")</td>
</tr>
<!-- Accuracy Check -->
<tr>
<td class="label"><span>Accuracy Check:</span></td>
<td class="accuracy-roll">
{{accuracy}} {{#target}}
<span class="targeted-defense">vs {{target}}</span>
{{/target}}
</td>
</tr>
<!-- Effectiveness -->
{{#^rollTotal() effectiveness-roll 2}}
<tr>
<!--<td class="label"><span>Effect:</span></td>-->
<td class="effectiveness-text" colspan="2">
<span>
<!-- Shielded -->
{{#rollTotal() effectiveness-roll 0}} It was *really* ineffective... {{/rollTotal() effectiveness-roll 0}}
<!-- Resisted -->
{{#rollTotal() effectiveness-roll 1}} It wasn't very effective... {{/rollTotal() effectiveness-roll 1}}
<!-- Super -->
{{#rollTotal() effectiveness-roll 3}} It was super effective! {{/rollTotal() effectiveness-roll 3}}
<!-- Extreme -->
{{#rollTotal() effectiveness-roll 4}} It was extremely effective! {{/rollTotal() effectiveness-roll 4}}
</span>
</td>
</tr>
{{/^rollTotal() effectiveness-roll 2}}
<!-- Damage Rolls -->
<!-- Dice-Based Critical Hit -->
{{#rollWasCrit() accuracy}} {{#rollGreater() critical-damage 0}}
<tr>
<td class="label"><span>{{move-type}} Damage:</span></td>
<td>
<span class="damage-roll {{effectiveness}}-effectiveness-color">
{{critical-damage}}
<span class="crit-damage-text {{effectiveness}}-effectiveness-text-color"> Critical Hit! </span>
</span>
</td>
</tr>
{{/rollGreater() critical-damage 0}} {{/rollWasCrit() accuracy}}
<!-- Effect-Based Critical Hit -->
<!-- Not a Natural Crit, and we deal Critical Damage -->
{{#^rollWasCrit() accuracy}} {{#rollGreater() critical-damage 0}}
<!-- Effect 1 is Critical Hit and we hit the Threshold -->
{{#rollTotal() effect1_roll 99}} {{#^rollLess() accuracy effect1_threshold}}
<tr>
<td class="label"><span>{{move-type}} Damage:</span></td>
<td>
<span class="damage-roll {{effectiveness}}-effectiveness-color">
{{critical-damage}}
<span class="crit-damage-text {{effectiveness}}-effectiveness-text-color"> Critical Hit! </span>
</span>
</td>
</tr>
{{/^rollLess() accuracy effect1_threshold}}
<!-- Effect-Based Critical Hit Dealing Regular Damage -->
{{#rollLess() accuracy effect1_threshold}}
<tr>
<td class="label"><span>{{move-type}} Damage:</span></td>
<td>
<span class="damage-roll {{effectiveness}}-effectiveness-color"> {{damage}} </span>
</td>
</tr>
{{/rollLess() accuracy effect1_threshold}}
<!-- Closing The Critical Hit Section -->
{{/rollTotal() effect1_roll 99}} {{/rollGreater() critical-damage 0}} {{/^rollWasCrit() accuracy}}
<!-- Regular Hit -->
{{#^rollWasCrit() accuracy}} {{#rollGreater() damage 0}} {{#rollLess() effect1_roll 99}}
<tr>
<td class="label"><span>{{move-type}} Damage:</span></td>
<td>
<span class="damage-roll {{effectiveness}}-effectiveness-color"> {{damage}} </span>
</td>
</tr>
{{/rollLess() effect1_roll 99}} {{/rollGreater() damage 0}} {{/^rollWasCrit() accuracy}}
<!-- Effect Resoluton -->
<!-- Effect 1 -->
{{#rollBetween() effect1_roll 1 10}} {{#^rollLess() accuracy effect1_threshold}}
<tr>
<td class="effectiveness-text" colspan="2">
<span>The opponent was {{effect1_name}}</span>
</td>
</tr>
{{/^rollLess() accuracy effect1_threshold}} {{/rollBetween() effect1_roll 1 10}}
<!-- Effect 2 -->
{{#rollBetween() effect2_roll 1 10}} {{#^rollLess() accuracy effect2_threshold}}
<tr>
<td class="effectiveness-text" colspan="2">
<span>The opponent was {{effect2_name}}</span>
</td>
</tr>
{{/^rollLess() accuracy effect2_threshold}} {{/rollBetween() effect2_roll 1 10}}
<!-- Additional Notes - if there are any -->
{{#notes}}
<tr>
<td class="notes-text" colspan="2"><span>{{notes}}</span></td>
</tr>
{{/notes}}
</table>
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-skill-roll">
<div class="container sheet-rolltemplate-color-setting-{{base-attribute}}-skill">
<table class="skill-template">
<tr>
<th colspan="2">{{skill-name}}</th>
</tr>
<tr>
<td colspan="2" class="subhead">[{{character-name}}](https://journal.roll20.net/character/{{character-id}}" name="name-link")</td>
</tr>
<!-- Skill Check -->
<tr>
<td class="label"><span>Skill Check:</span></td>
<td class="skill-roll">{{skill-roll}}</td>
</tr>
</table>
</div>
</rolltemplate>
</div>
<!-- SCRIPTS -->
<script type="text/worker">
// Page Selection
const pageButtons = ["character-page", "configuration-page"];
pageButtons.forEach((page) => {
on(`clicked:${page}`, function () {
setAttrs({ "selected-page": page });
});
});
// Handling Stat Changes
on("change:ATK change:atkbonus sheet:opened", function () {
getAttrs(["ATK", "atkbonus"], function (values) {
let atk = parseInt(values.ATK) || 0;
let bonus = parseInt(values.atkbonus) || 0;
calcModFor("ATK", atk, bonus);
});
});
on("change:DEF change:defbonus sheet:opened", function () {
getAttrs(["DEF", "defbonus"], function (values) {
let def = parseInt(values.DEF) || 0;
let bonus = parseInt(values.defbonus) || 0;
calcModFor("DEF", def, bonus);
});
});
on("change:SPATK change:spatkbonus sheet:opened", function () {
getAttrs(["SPATK", "spatkbonus"], function (values) {
let spatk = parseInt(values.SPATK) || 0;
let bonus = parseInt(values.spatkbonus) || 0;
calcModFor("SPATK", spatk, bonus);
});
});
on("change:SPDEF change:spdefbonus sheet:opened", function () {
getAttrs(["SPDEF", "spdefbonus"], function (values) {
let spdef = parseInt(values.SPDEF) || 0;
let bonus = parseInt(values.spdefbonus) || 0;
calcModFor("SPDEF", spdef, bonus);
});
});
on("change:SPD change:spdbonus sheet:opened", function () {
getAttrs(["SPD", "spdbonus"], function (values) {
let spd = parseInt(values.SPD) || 0;
let bonus = parseInt(values.spdbonus) || 0;
calcModFor("SPD", spd, bonus);
});
});
function calcModFor(ability, stat, bonus) {
const combined = stat + bonus;
const modifier = Math.floor(combined / 2);
const name = `${ability}MOD`;
const attrs = { [name]: modifier };
if (ability == "SPD") attrs["movement"] = combined * 5;
setAttrs(attrs);
}
// Handling Targeted Defense Changes
defenses = ["", "Defense", "Special Defense", "Speed"];
on("sheet:opened", function (eventInfo) {
getSectionIDs("repeating_moves", function (idArray) {
const categories = idArray.map((id) => `repeating_moves_${id}_move_category`);
getAttrs([...categories], function (values) {
const rows = categories.reduce((obj, rowName) => {
const cat = parseInt(values[rowName]) || 0;
const defense = defenses[cat];
obj[rowName + "_defense"] = defense;
return obj;
}, {});
if (rows) setAttrs(rows);
});
});
});
on("change:repeating_moves:move_category", function (event) {
getAttrs(["repeating_moves_move_name", "repeating_moves_move_category"], function (values) {
var attrs = {};
let cat = parseInt(values.repeating_moves_move_category) || 0;
attrs["repeating_moves_move_category_defense"] = defenses[cat];
setAttrs(attrs);
});
});
// Handling Move and Feature Usage
on("clicked:repeating_moves:incrementmoveusage", function () {
getAttrs(["repeating_moves_move_usage"], function (values) {
const currentusage = +values.repeating_moves_move_usage || 0;
const newusage = currentusage + 1;
setAttrs({
repeating_moves_move_usage: newusage,
});
});
});
on("clicked:repeating_moves:resetmoveusage", function () {
getAttrs(["repeating_moves_move_usage"], function (values) {
setAttrs({
repeating_moves_move_usage: 0,
});
});
});
on("clicked:incrementoriginusage", function () {
getAttrs(["origin_usage"], function (values) {
const currentusage = +values.origin_usage || 0;
const newusage = currentusage + 1;
setAttrs({
origin_usage: newusage,
});
});
});
on("clicked:resetoriginusage", function () {
getAttrs(["origin_usage"], function (values) {
setAttrs({
origin_usage: 0,
});
});
});
on("clicked:repeating_features:incrementfeatureusage", function () {
getAttrs(["repeating_features_feature_usage"], function (values) {
const currentusage = +values.repeating_features_feature_usage || 0;
const newusage = currentusage + 1;
setAttrs({
repeating_features_feature_usage: newusage,
});
});
});
on("clicked:repeating_features:resetfeatureusage", function () {
getAttrs(["repeating_features_feature_usage"], function (values) {
setAttrs({
repeating_features_feature_usage: 0,
});
});
});
// Handling Move Effects
effects = ["Critical Hit", "put to Sleep", "Burned", "Confused", "Cursed", "Frozen", "Infatuated", "Paralyzed", "Poisoned", "Toxified", "Stunned", "Other"];
on("sheet:opened", function (eventInfo) {
getSectionIDs("repeating_moves", function (idArray) {
const rowNames = idArray.map((id) => `repeating_moves_${id}`);
const effect1s = idArray.map((id) => `repeating_moves_${id}_move_effect1`);
const effect2s = idArray.map((id) => `repeating_moves_${id}_move_effect2`);
getAttrs([...effect1s, ...effect2s], function (values) {
const rows = rowNames.reduce((obj, rowName) => {
const index1 = parseInt(values[rowName + "_move_effect1"]) || 99;
const index2 = parseInt(values[rowName + "_move_effect2"]) || 99;
var name = "";
if (index1 < effects.length) {
name = effects[index1];
}
obj[rowName + "_move_effect1_name"] = name;
name = "";
if (index2 < effects.length) {
name = effects[index2];
}
obj[rowName + "_move_effect2_name"] = name;
return obj;
}, {});
if (rows) setAttrs(rows);
});
});
});
on("change:repeating_moves:move_effect1 change:repeating_moves:move_effect2", function (eventInfo) {
getAttrs(["repeating_moves_move_effect1", "repeating_moves_move_effect2"], function (values) {
let index1 = parseInt(values.repeating_moves_move_effect1) || 99;
let index2 = parseInt(values.repeating_moves_move_effect2) || 99;
var effectNames = {};
var name = "";
if (index1 < effects.length) {
name = effects[index1];
}
effectNames["repeating_moves_move_effect1_name"] = name;
name = "";
if (index2 < effects.length) {
name = effects[index2];
}
effectNames["repeating_moves_move_effect2_name"] = name;
if (effectNames) setAttrs(effectNames);
});
});
// Handling Move Damage Bonuses
categoryDamageModifiers = ["", "ATKMOD", "SPATKMOD", ""];
on("change:ATKMOD change:SPATKMOD sheet:opened", function (eventInfo) {
getSectionIDs("repeating_moves", function (idArray) {
const rowNames = idArray.map((id) => `repeating_moves_${id}`);
const categories = idArray.map((id) => `repeating_moves_${id}_move_category`);
const extraBonuses = idArray.map((id) => `repeating_moves_${id}_move_damagebonus`);
const stabBonuses = idArray.map((id) => `repeating_moves_${id}_move_stabbonus`);
const diceNumbers = idArray.map((id) => `repeating_moves_${id}_move_dicenumber`);
const damageDice = idArray.map((id) => `repeating_moves_${id}_damage_dice`);
getAttrs([`ATKMOD`, `SPATKMOD`, ...categories, ...extraBonuses, ...stabBonuses, ...diceNumbers, ...damageDice], function (values) {
const rows = rowNames.reduce((obj, rowName) => {
const category = parseInt(values[rowName + `_move_category`]) || 0;
const extra = parseInt(values[rowName + "_move_damagebonus"]) || 0;
const stab = parseInt(values[rowName + "_move_stabbonus"]) || 0;
const dice = parseInt(values[rowName + "_move_dicenumber"]) || 0;
const points = parseInt(values[rowName + "_damage_dice"]) || 0;
const categoryModifier = parseInt(values[`${categoryDamageModifiers[category]}`]) || 0;
const total = categoryModifier + extra + stab;
var display = `${total}`;
if (dice > 0) display = `${dice}d${points} ${total < 0 ? "" : "+ "}${total}`;
obj[rowName + "_move_totaldamage"] = total;
obj[rowName + "_move_totaldamage_display"] = display;
return obj;
}, {});
if (rows) setAttrs(rows);
});
});
});
on(
"change:repeating_moves:move_category change:repeating_moves:move_damagebonus change:repeating_moves:move_stabbonus change:repeating_moves:move_dicenumber change:repeating_moves:damage_dice",
function (eventInfo) {
getAttrs(
[
"ATKMOD",
"SPATKMOD",
"repeating_moves_move_category",
"repeating_moves_move_damagebonus",
"repeating_moves_move_stabbonus",
"repeating_moves_move_dicenumber",
"repeating_moves_damage_dice",
],
function (values) {
const category = parseInt(values.repeating_moves_move_category) || 0;
const extra = parseInt(values.repeating_moves_move_damagebonus) || 0;
const stab = parseInt(values.repeating_moves_move_stabbonus) || 0;
const dice = parseInt(values.repeating_moves_move_dicenumber) || 0;
const points = parseInt(values.repeating_moves_damage_dice) || 0;
const categoryModifier = parseInt(values[`${categoryDamageModifiers[category]}`]) || 0;
const total = categoryModifier + extra + stab;
var display = `${total}`;
if (dice > 0) display = `${dice}d${points} ${total < 0 ? "" : "+ "}${total}`;
setAttrs({
repeating_moves_move_totaldamage: total,
repeating_moves_move_totaldamage_display: display,
});
}
);
}
);
// Handling Move Accuracy Bonuses
categoryAccuracyModifiers = ["", "ATKMOD", "SPATKMOD", "SPDMOD"];
on("change:ATKMOD change:SPATKMOD change:SPDMOD sheet:opened", function (eventInfo) {
getSectionIDs("repeating_moves", function (idArray) {
const rowNames = idArray.map((id) => `repeating_moves_${id}`);
const categories = idArray.map((id) => `repeating_moves_${id}_move_category`);
const accuracyMods = idArray.map((id) => `repeating_moves_${id}_move_acmod`);
getAttrs([`ATKMOD`, `SPATKMOD`, `SPDMOD`, ...categories, ...accuracyMods], function (values) {
const rows = rowNames.reduce((obj, rowName) => {
const category = parseInt(values[rowName + `_move_category`]) || 0;
const accuracy = parseInt(values[rowName + `_move_acmod`]) || 0;
const categoryModifier = parseInt(values[`${categoryAccuracyModifiers[category]}`]) || 0;
const total = categoryModifier + accuracy;
const roll = `d20 ${total < 0 ? "" : "+ "}${total}`;
obj[rowName + "_move_totalaccuracy"] = total;
obj[rowName + "_move_totalaccuracy_display"] = roll;
return obj;
}, {});
if (rows) setAttrs(rows);
});
});
});
on("change:repeating_moves:move_category change:repeating_moves:move_acmod", function (eventInfo) {
getAttrs([`ATKMOD`, `SPATKMOD`, `SPDMOD`, `repeating_moves_move_category`, `repeating_moves_move_acmod`], function (values) {
const category = parseInt(values.repeating_moves_move_category) || 0;
const accuracy = parseInt(values.repeating_moves_move_acmod) || 0;
const categoryModifier = parseInt(values[`${categoryAccuracyModifiers[category]}`]) || 0;
const total = categoryModifier + accuracy;
const roll = `d20 ${total < 0 ? "" : "+ "}${total}`;
setAttrs({
repeating_moves_move_totalaccuracy: total,
repeating_moves_move_totalaccuracy_display: roll,
});
});
});
// Skills Sheet Workers
// Acrobatics
on("change:SPDMOD change:acrobaticstalent1 change:acrobaticstalent2 change:acrobatics sheet:opened", function (eventInfo) {
getAttrs([`SPDMOD`, `acrobaticstalent1`, `acrobaticstalent2`, `acrobatics`, `acrobatics_total`], function (values) {
const stat = parseInt(values.SPDMOD) || 0;
const talent1 = parseInt(values.acrobaticstalent1) || 0;
const talent2 = parseInt(values.acrobaticstalent2) || 0;
const total = parseInt(values.acrobatics_total) || -1;
const userBonus = parseInt(values.acrobatics) || 0;
assignSkillTotal("acrobatics_total", stat, talent1, talent2, total, userBonus);
});
});
// Athletics
on("change:ATKMOD change:athleticstalent1 change:athleticstalent2 change:athletics sheet:opened", function (eventInfo) {
getAttrs([`ATKMOD`, `athleticstalent1`, `athleticstalent2`, `athletics`, `athletics_total`], function (values) {
const stat = parseInt(values.ATKMOD) || 0;
const talent1 = parseInt(values.athleticstalent1) || 0;
const talent2 = parseInt(values.athleticstalent2) || 0;
const total = parseInt(values.athletics_total) || -1;
const userBonus = parseInt(values.athletics) || 0;
assignSkillTotal("athletics_total", stat, talent1, talent2, total, userBonus);
});
});
// Bluff/Deception
on("change:SPDEFMOD change:blufftalent1 change:blufftalent2 change:bluff sheet:opened", function (eventInfo) {
getAttrs([`SPDEFMOD`, `blufftalent1`, `blufftalent2`, `bluff`, `bluff_total`], function (values) {
const stat = parseInt(values.SPDEFMOD) || 0;
const talent1 = parseInt(values.blufftalent1) || 0;
const talent2 = parseInt(values.blufftalent2) || 0;
const total = parseInt(values.bluff_total) || -1;
const userBonus = parseInt(values.bluff) || 0;
assignSkillTotal("bluff_total", stat, talent1, talent2, total, userBonus);
});
});
// Concentration
on("change:DEFMOD change:concentrationtalent1 change:concentrationtalent2 change:concentration sheet:opened", function (eventInfo) {
getAttrs([`DEFMOD`, `concentrationtalent1`, `concentrationtalent2`, `concentration`, `concentration_total`], function (values) {
const stat = parseInt(values.DEFMOD) || 0;
const talent1 = parseInt(values.concentrationtalent1) || 0;
const talent2 = parseInt(values.concentrationtalent2) || 0;
const total = parseInt(values.concentration_total) || -1;
const userBonus = parseInt(values.concentration) || 0;
assignSkillTotal("concentration_total", stat, talent1, talent2, total, userBonus);
});
});
// Constitution
on("change:DEFMOD change:constitutiontalent1 change:constitutiontalent2 change:constitution sheet:opened", function (eventInfo) {
getAttrs([`DEFMOD`, `constitutiontalent1`, `constitutiontalent2`, `constitution`, `constitution_total`], function (values) {
const stat = parseInt(values.DEFMOD) || 0;
const talent1 = parseInt(values.constitutiontalent1) || 0;
const talent2 = parseInt(values.constitutiontalent2) || 0;
const total = parseInt(values.constitution_total) || -1;
const userBonus = parseInt(values.constitution) || 0;
assignSkillTotal("constitution_total", stat, talent1, talent2, total, userBonus);
});
});
// Diplomacy/Persuasion
on("change:SPDEFMOD change:diplomacytalent1 change:diplomacytalent2 change:diplomacy sheet:opened", function (eventInfo) {
getAttrs([`SPDEFMOD`, `diplomacytalent1`, `diplomacytalent2`, `diplomacy`, `diplomacy_total`], function (values) {
const stat = parseInt(values.SPDEFMOD) || 0;
const talent1 = parseInt(values.diplomacytalent1) || 0;
const talent2 = parseInt(values.diplomacytalent2) || 0;
const total = parseInt(values.diplomacy_total) || -1;
const userBonus = parseInt(values.diplomacy) || 0;
assignSkillTotal("diplomacy_total", stat, talent1, talent2, total, userBonus);
});
});
// Engineering/Operation
on("change:SPATKMOD change:engineeringtalent1 change:engineeringtalent2 change:engineering sheet:opened", function (eventInfo) {
getAttrs([`SPATKMOD`, `engineeringtalent1`, `engineeringtalent2`, `engineering`, `engineering_total`], function (values) {
const stat = parseInt(values.SPATKMOD) || 0;
const talent1 = parseInt(values.engineeringtalent1) || 0;
const talent2 = parseInt(values.engineeringtalent2) || 0;
const total = parseInt(values.engineering_total) || -1;
const userBonus = parseInt(values.engineering) || 0;
assignSkillTotal("engineering_total", stat, talent1, talent2, total, userBonus);
});
});
// History
on("change:SPATKMOD change:historytalent1 change:historytalent2 change:history sheet:opened", function (eventInfo) {
getAttrs([`SPATKMOD`, `historytalent1`, `historytalent2`, `history`, `history_total`], function (values) {
const stat = parseInt(values.SPATKMOD) || 0;
const talent1 = parseInt(values.historytalent1) || 0;
const talent2 = parseInt(values.historytalent2) || 0;
const total = parseInt(values.history_total) || -1;
const userBonus = parseInt(values.history) || 0;
assignSkillTotal("history_total", stat, talent1, talent2, total, userBonus);
});
});
// Insight
on("change:SPDEFMOD change:insighttalent1 change:insighttalent2 change:insight sheet:opened", function (eventInfo) {
getAttrs([`SPDEFMOD`, `insighttalent1`, `insighttalent2`, `insight`, `insight_total`], function (values) {
const stat = parseInt(values.SPDEFMOD) || 0;
const talent1 = parseInt(values.insighttalent1) || 0;
const talent2 = parseInt(values.insighttalent2) || 0;
const total = parseInt(values.insight_total) || -1;
const userBonus = parseInt(values.insight) || 0;
assignSkillTotal("insight_total", stat, talent1, talent2, total, userBonus);
});
});
// Investigate
on("change:SPATKMOD change:investigatetalent1 change:investigatetalent2 change:investigate sheet:opened", function (eventInfo) {
getAttrs([`SPATKMOD`, `investigatetalent1`, `investigatetalent2`, `investigate`, `investigate_total`], function (values) {
const stat = parseInt(values.SPATKMOD) || 0;
const talent1 = parseInt(values.investigatetalent1) || 0;
const talent2 = parseInt(values.investigatetalent2) || 0;
const total = parseInt(values.investigate_total) || -1;
const userBonus = parseInt(values.investigate) || 0;
assignSkillTotal("investigate_total", stat, talent1, talent2, total, userBonus);
});
});
// Medicine
on("change:SPATKMOD change:medicinetalent1 change:medicinetalent2 change:medicine sheet:opened", function (eventInfo) {
getAttrs([`SPATKMOD`, `medicinetalent1`, `medicinetalent2`, `medicine`, `medicine_total`], function (values) {
const stat = parseInt(values.SPATKMOD) || 0;
const talent1 = parseInt(values.medicinetalent1) || 0;
const talent2 = parseInt(values.medicinetalent2) || 0;
const total = parseInt(values.medicine_total) || -1;
const userBonus = parseInt(values.medicine) || 0;
assignSkillTotal("medicine_total", stat, talent1, talent2, total, userBonus);
});
});
// Nature
on("change:SPATKMOD change:naturetalent1 change:naturetalent2 change:nature sheet:opened", function (eventInfo) {
getAttrs([`SPATKMOD`, `naturetalent1`, `naturetalent2`, `nature`, `nature_total`], function (values) {
const stat = parseInt(values.SPATKMOD) || 0;
const talent1 = parseInt(values.naturetalent1) || 0;
const talent2 = parseInt(values.naturetalent2) || 0;
const total = parseInt(values.nature_total) || -1;
const userBonus = parseInt(values.nature) || 0;
assignSkillTotal("nature_total", stat, talent1, talent2, total, userBonus);
});
});
// Perception
on("change:SPDEFMOD change:perceptiontalent1 change:perceptiontalent2 change:perception sheet:opened", function (eventInfo) {
getAttrs([`SPDEFMOD`, `perceptiontalent1`, `perceptiontalent2`, `perception`, `perception_total`], function (values) {
const stat = parseInt(values.SPDEFMOD) || 0;
const talent1 = parseInt(values.perceptiontalent1) || 0;
const talent2 = parseInt(values.perceptiontalent2) || 0;
const total = parseInt(values.perception_total) || -1;
const userBonus = parseInt(values.perception) || 0;
assignSkillTotal("perception_total", stat, talent1, talent2, total, userBonus);
});
});
// Perform
on("change:SPDEFMOD change:performtalent1 change:performtalent2 change:perform sheet:opened", function (eventInfo) {
getAttrs([`SPDEFMOD`, `performtalent1`, `performtalent2`, `perform`, `perform_total`], function (values) {
const stat = parseInt(values.SPDEFMOD) || 0;
const talent1 = parseInt(values.performtalent1) || 0;
const talent2 = parseInt(values.performtalent2) || 0;
const total = parseInt(values.perform_total) || -1;
const userBonus = parseInt(values.perform) || 0;
assignSkillTotal("perform_total", stat, talent1, talent2, total, userBonus);
});
});
// Pokémon Handling
on("change:SPDEFMOD change:handlingtalent1 change:handlingtalent2 change:handling sheet:opened", function (eventInfo) {
getAttrs([`SPDEFMOD`, `handlingtalent1`, `handlingtalent2`, `handling`, `handling_total`], function (values) {
const stat = parseInt(values.SPDEFMOD) || 0;
const talent1 = parseInt(values.handlingtalent1) || 0;
const talent2 = parseInt(values.handlingtalent2) || 0;
const total = parseInt(values.handling_total) || -1;
const userBonus = parseInt(values.handling) || 0;
assignSkillTotal("handling_total", stat, talent1, talent2, total, userBonus);
});
});
// Programming
on("change:SPATKMOD change:programmingtalent1 change:programmingtalent2 change:programming sheet:opened", function (eventInfo) {
getAttrs([`SPATKMOD`, `programmingtalent1`, `programmingtalent2`, `programming`, `programming_total`], function (values) {
const stat = parseInt(values.SPATKMOD) || 0;
const talent1 = parseInt(values.programmingtalent1) || 0;
const talent2 = parseInt(values.programmingtalent2) || 0;
const total = parseInt(values.programming_total) || -1;
const userBonus = parseInt(values.programming) || 0;
assignSkillTotal("programming_total", stat, talent1, talent2, total, userBonus);
});
});
// Sleight of Hand
on("change:SPDMOD change:sleightofhandtalent1 change:sleightofhandtalent2 change:sleightofhand sheet:opened", function (eventInfo) {
getAttrs([`SPDMOD`, `sleightofhandtalent1`, `sleightofhandtalent2`, `sleightofhand`, `sleightofhand_total`], function (values) {
const stat = parseInt(values.SPDMOD) || 0;
const talent1 = parseInt(values.sleightofhandtalent1) || 0;
const talent2 = parseInt(values.sleightofhandtalent2) || 0;
const total = parseInt(values.sleightofhand_total) || -1;
const userBonus = parseInt(values.sleightofhand) || 0;
assignSkillTotal("sleightofhand_total", stat, talent1, talent2, total, userBonus);
});
});
// Stealth
on("change:SPDMOD change:stealthtalent1 change:stealthtalent2 change:stealth sheet:opened", function (eventInfo) {
getAttrs([`SPDMOD`, `stealthtalent1`, `stealthtalent2`, `stealth`, `stealth_total`], function (values) {
const stat = parseInt(values.SPDMOD) || 0;
const talent1 = parseInt(values.stealthtalent1) || 0;
const talent2 = parseInt(values.stealthtalent2) || 0;
const total = parseInt(values.stealth_total) || -1;
const userBonus = parseInt(values.stealth) || 0;
assignSkillTotal("stealth_total", stat, talent1, talent2, total, userBonus);
});
});
// Capture
on("change:SPDMOD change:capture sheet:opened", function (eventInfo) {
getAttrs([`SPDMOD`, `capture_total`], function (values) {
const stat = parseInt(values.SPDMOD) || 0;
const total = parseInt(values.capture_total) || -1;
assignSkillTotal("capture_total", stat, 0, 0, total, 0);
});
});
function assignSkillTotal(skillName, stat, leftTalent, rightTalent, oldTotal, userBonus) {
const talentAccumulator = leftTalent + rightTalent == 4 ? 1 : 0;
const talent = leftTalent + rightTalent + talentAccumulator;
const newBonus = stat + talent + userBonus;
const attrs = { [skillName]: newBonus };
if (newBonus != oldTotal) setAttrs(attrs);
}
// ATTRIBUTE DEPRECATION SHEET WORKERS
// Sheet Style Deprecation
on("sheet:opened", function () {
// Push so that it gets linted to two lines instead of 18. Huzzah!
var styles = ["style-bug", "style-dark", "style-dragon", "style-electric", "style-fairy", "style-fighting", "style-fire", "style-flying", "style-ghost"];
styles.push("style-grass", "style-ground", "style-ice", "style-normal", "style-poison", "style-psychic", "style-rock", "style-steel", "style-water");
getAttrs([...styles, "type1"], function (attributes) {
styles = styles.filter((style) => attributes[style] != undefined);
const values = styles.map((style) => attributes[style]);
if (values[0] == undefined) {
console.log("No Style attributes found; aborting preservation attempt");
return;
}
console.log("Existing Style Attributes Parsed:");
styles.forEach((style) => console.log(`${style}-${attributes[style]}`));
var attrs = {};
styles.forEach((style) => (attrs[style] = ""));
console.log("All Attributes set to blank");
const onStyle = styles.filter((style) => attributes[style] == "on").shift();
if (onStyle == undefined) {
setAttrs(attrs);
return;
}
console.log(`Retrieved on-style: ${onStyle}`);
const type = onStyle.replace("style-", "");
const type1 = attributes.type1;
if (type != type1) {
console.log(`Re-assigning type1 (${type1}) to ${type}`);
attrs["type1"] = type;
}
setAttrs(attrs);
});
});
// Nature Migration
on("sheet:opened", function () {
getAttrs(["nature", "nature-type"], function (values) {
if (values.nature === values.nature + 0) return;
const nature = values.nature;
const type = values["nature-type"];
var attrs = { nature: 0 };
if (nature != type) attrs["nature-type"] = nature;
setAttrs(attrs);
});
});
</script>