Files
roll20-character-sheets-tester/PokemonTabletopAdventures_v3/PTA3.html
T
Ian Merryweather f2994b67f3 feature: Use skill total in skill roll
- Replaces fetching the various skill total components with just using the calculated skill total for adding to the dice in skill rolls via the template
2020-11-09 12:29:36 +00:00

1535 lines
82 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 type="checkbox" name="attr_style-bug" class="hidden-setting color-setting-bug"></input>
<input type="checkbox" name="attr_style-dark" class="hidden-setting color-setting-dark"></input>
<input type="checkbox" name="attr_style-dragon" class="hidden-setting color-setting-dragon"></input>
<input type="checkbox" name="attr_style-electric" class="hidden-setting color-setting-electric"></input>
<input type="checkbox" name="attr_style-fairy" class="hidden-setting color-setting-fairy"></input>
<input type="checkbox" name="attr_style-fighting" class="hidden-setting color-setting-fighting"></input>
<input type="checkbox" name="attr_style-fire" class="hidden-setting color-setting-fire"></input>
<input type="checkbox" name="attr_style-flying" class="hidden-setting color-setting-flying"></input>
<input type="checkbox" name="attr_style-ghost" class="hidden-setting color-setting-ghost"></input>
<input type="checkbox" name="attr_style-grass" class="hidden-setting color-setting-grass"></input>
<input type="checkbox" name="attr_style-ground" class="hidden-setting color-setting-ground"></input>
<input type="checkbox" name="attr_style-ice" class="hidden-setting color-setting-ice"></input>
<input type="checkbox" name="attr_style-normal" class="hidden-setting color-setting-normal"></input>
<input type="checkbox" name="attr_style-poison" class="hidden-setting color-setting-poison"></input>
<input type="checkbox" name="attr_style-psychic" class="hidden-setting color-setting-psychic"></input>
<input type="checkbox" name="attr_style-rock" class="hidden-setting color-setting-rock"></input>
<input type="checkbox" name="attr_style-steel" class="hidden-setting color-setting-steel"></input>
<input type="checkbox" name="attr_style-water" class="hidden-setting color-setting-water"></input>
<div class="wrapper color-background">
<input type="radio" name="attr_tab" class="tab select-trainer" value="1" title="Trainer" checked="checked" />
<span class="tab select-trainer">Trainer</span>
<input type="radio" name="attr_tab" class="tab select-pokemon" value="2" title="Pokemon" />
<span class="tab select-pokemon">Pokémon</span>
<input type="radio" name="attr_tab" class="tab select-hybrid" value="3" title="Hybrid" />
<span class="tab select-hybrid">Hybrid</span>
<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 type="text" spellcheck="false" name="attr_character_name" class="top-information" />
<b>Origin</b><input type="text" spellcheck="false" name="attr_origin" class="top-information" />
<b>Honors</b><input type="number" name="attr_honor_count" class="top-information" />
<b>Credits</b><input type="number" name="attr_credits" class="top-information long-number" />
</div>
<div class="character-class-grid">
<b>Class</b><input type="text" spellcheck="false" name="attr_class1" class="top-information" />
<b>Level</b><input type="number" name="attr_level1" class="top-information" />
<b>Class</b><input type="text" spellcheck="false" name="attr_class2" class="top-information" />
<b>Level</b><input type="number" name="attr_level2" class="top-information" />
<b>Class</b><input type="text" spellcheck="false" name="attr_class3" class="top-information" />
<b>Level</b><input type="number" name="attr_level3" class="top-information" />
<b>Class</b><input type="text" spellcheck="false" name="attr_class4" class="top-information" />
<b>Level</b><input type="number" name="attr_level4" class="top-information" />
</div>
</div>
</div>
<div class="tab-pokemon">
<div class="2col-centered">
<div class="character-name-grid">
<b>Name</b><input type="text" spellcheck="false" name="attr_character_name" class="top-information" />
<b>Species</b><input type="text" spellcheck="false" name="attr_species" class="top-information" />
<b>Type</b>
<!-- Formatting note: These inputs should have no whitespace between them -->
<span><select name="attr_type1" class="half-text top-information">
<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 name="attr_type2" class="half-text top-information">
<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 name="attr_nature" class="top-information top-select">
<option value=""></option>
<option value="lonely">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="naive">Naive (+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 type="text" spellcheck="false" name="attr_item" class="top-information" />
</div>
<div class="character-name-grid">
<b>Size</b><input type="text" spellcheck="false" name="attr_size" class="top-information" />
<b>Weight</b><input type="text" spellcheck="false" name="attr_weight" class="top-information" />
<b>Sex</b><input type="text" spellcheck="false" name="attr_pokemon_sex" class="top-information" />
<b>Egg Group</b><input type="text" spellcheck="false" name="attr_egg_group" class="top-information" />
<b>Diet</b><input type="text" spellcheck="false" name="attr_diet" class="top-information" />
</div>
</div>
</div>
<div class="tab-hybrid">
<div class="2col-centered">
<div class="character-name-grid">
<b>Name</b><input type="text" spellcheck="false" name="attr_character_name" class="top-information" />
<b>Species</b><input type="text" spellcheck="false" name="attr_species" class="top-information" />
<b>Nature</b><input type="text" spellcheck="false" name="attr_nature" class="top-information" />
<b>Origin</b><input type="text" spellcheck="false" name="attr_origin" class="top-information" />
<b>Honors</b><input type="number" name="attr_honor_count" class="top-information" />
<b>Credits</b><input type="number" name="attr_credits" class="top-information long-number" />
</div>
<div class="character-name-grid">
<b>Type</b>
<!-- Formatting note: These inputs should have no whitespace between them -->
<span><select name="attr_type1" class="half-text top-information">
<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 name="attr_type2" class="half-text top-information">
<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>
<!-- Formatting note: These inputs should have no whitespace between them -->
<span><input type="text" spellcheck="false" name="attr_size" class="half-text top-information" /><input
type="text" spellcheck="false" name="attr_weight" class="half-text top-information" /></span>
<b>Sex</b><input type="text" spellcheck="false" name="attr_pokemon_sex" class="top-information" />
<b>Egg Group</b><input type="text" spellcheck="false" name="attr_egg_group" class="top-information" />
<b>Diet</b><input type="text" spellcheck="false" name="attr_diet" class="top-information" />
<b>Held Item</b><input type="text" spellcheck="false" name="attr_item" class="top-information" />
</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 type="number" name="attr_HP" class="stat-ball-color" /><br />
<input type="number" name="attr_HP_max" class="stat-ball-color" /><br />
<p>Max HP</p>
</div>
<div class="ball atk-ball">
<b>Attack</b><br />
<input type="number" name="attr_ATK" class="stat-ball-color" /><br />
<input type="number" name="attr_ATKMOD" readonly class="stat-read-ball-color" /><br />
<p>ATK mod</p>
</div>
<div class="ball def-ball">
<b>Defense</b><br />
<input type="number" name="attr_DEF" class="stat-ball-color" /><br />
<input type="number" name="attr_DEFMOD" readonly
class="stat-read-ball-color tab-pokemon tab-hybrid" /><br />
<p>DEF mod</p>
</div>
<div class="ball spatk-ball">
<b>Special Attack</b><br />
<input type="number" name="attr_SPATK" class="stat-ball-color" /><br />
<input type="number" name="attr_SPATKMOD" readonly class="stat-read-ball-color" /><br />
<p>SPATK mod</p>
</div>
<div class="ball spdef-ball">
<b>Special Defense</b><br />
<input type="number" name="attr_SPDEF" class="stat-ball-color" /><br />
<input type="number" name="attr_SPDEFMOD" readonly class="stat-read-ball-color" /><br />
<p>SPDEF mod</p>
</div>
<div class="ball spd-ball">
<b>Speed</b><br />
<input type="number" name="attr_SPD" class="stat-ball-color" /><br />
<input type="number" name="attr_SPDMOD" readonly class="stat-read-ball-color" /><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 type="number" name="attr_HP" class="stat-ball-color" /><br />
<input type="number" name="attr_HP_max" class="stat-ball-color" /><br />
<p>Max HP</p>
</div>
<div class="ball atk-ball">
<b>Attack</b><br />
<input type="number" name="attr_ATK" class="stat-ball-color" /><br />
<input type="number" name="attr_ATKMOD" readonly class="stat-read-ball-color" /><br />
<p>ATK mod</p>
</div>
<div class="ball def-ball">
<b>Defense</b><br />
<input type="number" name="attr_DEF" class="stat-ball-color" /><br />
</div>
<div class="ball spatk-ball">
<b>Special Attack</b><br />
<input type="number" name="attr_SPATK" class="stat-ball-color" /><br />
<input type="number" name="attr_SPATKMOD" readonly class="stat-read-ball-color" /><br />
<p>SPATK mod</p>
</div>
<div class="ball spdef-ball">
<b>Special Defense</b><br />
<input type="number" name="attr_SPDEF" class="stat-ball-color" />
</div>
<div class="ball spd-ball">
<b>Speed</b><br />
<input type="number" name="attr_SPD" class="stat-ball-color" /><br />
<input type="number" name="attr_SPDMOD" readonly class="stat-read-ball-color" /><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 type="number" name="attr_movement" readonly class="speed-read-color" />
<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 type="number" name="attr_atkbonus" class="attack-color" />
<input type="number" name="attr_defbonus" class="defense-color" />
<input type="number" name="attr_spatkbonus" class="spatk-color" />
<input type="number" name="attr_spdefbonus" class="spdef-color" />
<input type="number" name="attr_spdbonus" class="speed-color" />
<b>Contest Stats</b>
<b>Cool</b>
<b>Tough</b>
<b>Beauty</b>
<b>Clever</b>
<b>Cute</b>
<b></b>
<input type="number" name="attr_cool" class="attack-color" />
<input type="number" name="attr_tough" class="defense-color" />
<input type="number" name="attr_beauty" class="spatk-color" />
<input type="number" name="attr_clever" class="spdef-color" />
<input type="number" name="attr_cute" class="speed-color" />
</div>
</div>
<div class="tab-trainer tab-hybrid">
<br />
<div class="character-skill-labels">
<b>Total</b>
<b>Skill Name</b>
<b>+2</b>
<b>+5</b>
<b>Bonus</b>
<b>Inventory</b>
</div>
<div class="2col-centered">
<div class="character-skills">
<input type="number" readonly name="attr_acrobatics_total" class="speed-read-color" />
<button type='roll' name='roll_acrobaticscheck' class='skill-roller spd-skill'
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 type="checkbox" name="attr_acrobaticstalent1" value="2" />
<input type="checkbox" name="attr_acrobaticstalent2" value="3" />
<input type="number" name="attr_acrobatics" value="0" />
<input type="number" readonly name="attr_athletics_total" class="attack-read-color" />
<button type='roll' name='roll_athleticscheck' class='skill-roller atk-skill'
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 type="checkbox" name="attr_athleticstalent1" value="2" />
<input type="checkbox" name="attr_athleticstalent2" value="3" />
<input type="number" name="attr_athletics" value="0" />
<input type="number" readonly name="attr_bluff_total" class="spdef-read-color" />
<button type='roll' name='roll_bluffcheck' class='skill-roller spdef-skill'
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 type="checkbox" name="attr_blufftalent1" value="2" />
<input type="checkbox" name="attr_blufftalent2" value="3" />
<input type="number" name="attr_bluff" value="0" />
<input type="number" readonly name="attr_concentration_total" class="defense-read-color" />
<button type='roll' name='roll_concentrationcheck' class='skill-roller def-skill'
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 type="checkbox" name="attr_concentrationtalent1" value="2" />
<input type="checkbox" name="attr_concentrationtalent2" value="3" />
<input type="number" name="attr_concentration" value="0" />
<input type="number" readonly name="attr_constitution_total" class="defense-read-color" />
<button type='roll' name='roll_constitutioncheck' class='skill-roller def-skill'
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 type="checkbox" name="attr_constitutiontalent1" value="2" />
<input type="checkbox" name="attr_constitutiontalent2" value="3" />
<input type="number" name="attr_constitution" value="0" />
<input type="number" readonly name="attr_diplomacy_total" class="spdef-read-color" />
<button type='roll' name='roll_diplomacycheck' class='skill-roller spdef-skill'
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 type="checkbox" name="attr_diplomacytalent1" value="2" />
<input type="checkbox" name="attr_diplomacytalent2" value="3" />
<input type="number" name="attr_diplomacy" value="0" />
<input type="number" readonly name="attr_engineering_total" class="spatk-read-color" />
<button type='roll' name='roll_engineeringcheck' class='skill-roller spatk-skill'
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 type="checkbox" name="attr_engineeringtalent1" value="2" />
<input type="checkbox" name="attr_engineeringtalent2" value="3" />
<input type="number" name="attr_engineering" value="0" />
<input type="number" readonly name="attr_history_total" class="spatk-read-color" />
<button type='roll' name='roll_historycheck' class='skill-roller spatk-skill'
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 type="checkbox" name="attr_historytalent1" value="2" />
<input type="checkbox" name="attr_historytalent2" value="3" />
<input type="number" name="attr_history" value="0" />
<input type="number" readonly name="attr_insight_total" class="spdef-read-color" />
<button type='roll' name='roll_insightcheck' class='skill-roller spdef-skill'
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 type="checkbox" name="attr_insighttalent1" value="2" />
<input type="checkbox" name="attr_insighttalent2" value="3" />
<input type="number" name="attr_insight" value="0" />
<input type="number" readonly name="attr_investigate_total" class="spatk-read-color" />
<button type='roll' name='roll_investigatecheck' class='skill-roller spatk-skill'
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 type="checkbox" name="attr_investigatetalent1" value="2" />
<input type="checkbox" name="attr_investigatetalent2" value="3" />
<input type="number" name="attr_investigate" value="0" />
<input type="number" readonly name="attr_medicine_total" class="spatk-read-color" />
<button type='roll' name='roll_medicinecheck' class='skill-roller spatk-skill'
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 type="checkbox" name="attr_medicinetalent1" value="2" />
<input type="checkbox" name="attr_medicinetalent2" value="3" />
<input type="number" name="attr_medicine" value="0" />
<input type="number" readonly name="attr_nature_total" class="spatk-read-color" />
<button type='roll' name='roll_naturecheck' class='skill-roller spatk-skill'
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 type="checkbox" name="attr_naturetalent1" value="2" />
<input type="checkbox" name="attr_naturetalent2" value="3" />
<input type="number" name="attr_nature" value="0" />
<input type="number" readonly name="attr_perception_total" class="spdef-read-color" />
<button type='roll' name='roll_perceptioncheck' class='skill-roller spdef-skill'
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 type="checkbox" name="attr_perceptiontalent1" value="2" />
<input type="checkbox" name="attr_perceptiontalent2" value="3" />
<input type="number" name="attr_perception" value="0" />
<input type="number" readonly name="attr_perform_total" class="spdef-read-color" />
<button type='roll' name='roll_performcheck' class='skill-roller spdef-skill'
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 type="checkbox" name="attr_performtalent1" value="2" />
<input type="checkbox" name="attr_performtalent2" value="3" />
<input type="number" name="attr_perform" value="0" />
<input type="number" readonly name="attr_handling_total" class="spdef-read-color" />
<button type='roll' name='roll_handlingcheck' class='skill-roller spdef-skill'
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 type="checkbox" name="attr_handlingtalent1" value="2" />
<input type="checkbox" name="attr_handlingtalent2" value="3" />
<input type="number" name="attr_handling" value="0" />
<input type="number" readonly name="attr_programming_total" class="spatk-read-color" />
<button type='roll' name='roll_programmingcheck' class='skill-roller spatk-skill'
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 type="checkbox" name="attr_programmingtalent1" value="2" />
<input type="checkbox" name="attr_programmingtalent2" value="3" />
<input type="number" name="attr_programming" value="0" />
<input type="number" readonly name="attr_sleightofhand_total" class="speed-read-color" />
<button type='roll' name='roll_sleightofhandcheck' class='skill-roller spd-skill'
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 type="checkbox" name="attr_sleightofhandtalent1" value="2" />
<input type="checkbox" name="attr_sleightofhandtalent2" value="3" />
<input type="number" name="attr_sleightofhand" value="0" />
<input type="number" readonly name="attr_stealth_total" class="speed-read-color" />
<button type='roll' name='roll_stealthcheck' class='skill-roller spd-skill'
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 type="checkbox" name="attr_stealthtalent1" value="2" />
<input type="checkbox" name="attr_stealthtalent2" value="3" />
<input type="number" name="attr_stealth" value="0" />
</div>
<textarea spellcheck="false" name="attr_inventory" class="inventory"
placeholder="Pokéballs, Berries, Medicine, Accessories, etc."></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 spellcheck="false" name="attr_ownedpokemon"
placeholder="All Pokémon owned by this Trainer"></textarea>
</div>
<div class="tab-pokemon tab-hybrid">
<b>Skills</b>
<textarea spellcheck="false" name="attr_pokemonskills" class="3row-textarea"
placeholder="Capabilities to be used both in and out of battle, such as Firestarter, Invisibility, and Telekinetic"></textarea>
<b>Stat Passives</b>
<textarea spellcheck="false" name="attr_statpassives" class="3row-textarea"
placeholder="Passives that affect Pokémon stats, such as Nasty Plot and Play Nice"></textarea>
<b>Other Passives</b>
<textarea spellcheck="false" name="attr_otherpassives" class="4row-textarea"
placeholder="Passives that do not affect stats, such as Cute Charm and Static"></textarea>
</div>
<b>Moves</b>
<fieldset class="repeating_moves">
<input type="hidden" name="attr_move_category_defense" />
<input type="checkbox" name="attr_style-bug-move" class="hidden-setting color-setting-bug-move" />
<input type="checkbox" name="attr_style-dark-move" class="hidden-setting color-setting-dark-move" />
<input type="checkbox" name="attr_style-dragon-move" class="hidden-setting color-setting-dragon-move" />
<input type="checkbox" name="attr_style-electric-move" class="hidden-setting color-setting-electric-move" />
<input type="checkbox" name="attr_style-fairy-move" class="hidden-setting color-setting-fairy-move" />
<input type="checkbox" name="attr_style-fighting-move" class="hidden-setting color-setting-fighting-move" />
<input type="checkbox" name="attr_style-fire-move" class="hidden-setting color-setting-fire-move" />
<input type="checkbox" name="attr_style-flying-move" class="hidden-setting color-setting-flying-move" />
<input type="checkbox" name="attr_style-ghost-move" class="hidden-setting color-setting-ghost-move" />
<input type="checkbox" name="attr_style-grass-move" class="hidden-setting color-setting-grass-move" />
<input type="checkbox" name="attr_style-ground-move" class="hidden-setting color-setting-ground-move" />
<input type="checkbox" name="attr_style-ice-move" class="hidden-setting color-setting-ice-move" />
<input type="checkbox" name="attr_style-normal-move" class="hidden-setting color-setting-normal-move" checked />
<input type="checkbox" name="attr_style-poison-move" class="hidden-setting color-setting-poison-move" />
<input type="checkbox" name="attr_style-psychic-move" class="hidden-setting color-setting-psychic-move" />
<input type="checkbox" name="attr_style-rock-move" class="hidden-setting color-setting-rock-move" />
<input type="checkbox" name="attr_style-steel-move" class="hidden-setting color-setting-steel-move" />
<input type="checkbox" name="attr_style-water-move" class="hidden-setting color-setting-water-move" />
<div class="pokemon-move">
<div class="pokemon-move-info-header">
<input type="text" spellcheck="false" name="attr_move_name" placeholder="Move" />
<span>
<b>Move Usage</b>
<input type="number" name="attr_move_usage" 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 type="text" spellcheck="false" name="attr_move_range" placeholder="Range"
class="move-text" />
<select name="attr_move_type" class="move-text">
<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 name="attr_move_category" class="move-text">
<option value="0">Category</option>
<option value="1">Attack</option>
<option value="2">Special Attack</option>
<option value="3">Effect</option>
</select>
<select name="attr_move_frequency" class="move-text">
<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 type="number" name="attr_move_dicenumber" class="top-information damage-dice-count" 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 type="number" name="attr_move_acmod" class="top-information thin-number" value="0" />
</span>
<span>
<b>Critical Threshold</b>
<input type="number" name="attr_move_critthreshold" class="top-information thin-number" value="20" min="1" max="20"/>
<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>
</span>
<span>
<b>STAB</b><input type="number" name="attr_move_stabbonus" class="top-information thin-number" value="0" />
</span>
<span>
<b>Extra Damage</b><input type="number" name="attr_move_damagebonus" class="top-information thin-number" value="0" />
</span>
<span class="readonly-field">
<b>Damage Roll:</b>
<input type="hidden" name="attr_move_totaldamage" />
<input type="text" name="attr_move_totaldamage_display" readonly class="top-information total-display" value="" />
</span>
<span>
<b>Effect Threshold</b>
<input type="number" name="attr_move_effect1_threshold" class="top-information thin-number" value="0" min="0" max="20"/>
<b class="info-tooltip" title="Enter the value shown in the move notes for effects like Burned, Poisoned, and Stunned">ℹ</b>
</span>
<span>
<select name="attr_move_effect1" class="move-text">
<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 type="number" name="attr_move_effect2_threshold" class="top-information thin-number" value="0" min="0" max="20"/>
</span>
<span>
<input type="hidden" name="attr_move_effect2_name" />
<select name="attr_move_effect2" class="move-text">
<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 type="hidden" name="attr_move_totalaccuracy"/>
<input type="text" name="attr_move_totalaccuracy_display" readonly class="top-information total-display" value="" />
</span>
</div>
<div class="move-notes-roller">
<textarea spellcheck="false" name="attr_move_effect" placeholder="Additional Effect Notes" class="3row-textarea"></textarea>
<button 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}}}'
name='roll-movetemplate' class='move-roller'>T</button>
</div>
</div>
</fieldset>
<b>Notes</b>
<textarea spellcheck="false" name="attr_notes"></textarea>
</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 Roll -->
<!-- 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 -->
{{#^rollWasCrit() accuracy}}
{{#rollGreater() critical-damage 0}}
{{#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 Miss -->
{{#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}}
{{/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 -->
{{#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}}
{{#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">
on("change:ATK sheet:opened", function () {
getAttrs(["ATK"], function (values) {
let atk = parseInt(values.ATK) || 0;
let atkmod = Math.floor(atk / 2);
setAttrs({
"ATKMOD": atkmod
});
});
});
on("change:DEF sheet:opened", function () {
getAttrs(["DEF"], function (values) {
let def = parseInt(values.DEF) || 0;
let defmod = Math.floor(def / 2);
setAttrs({
"DEFMOD": defmod
});
});
});
on("change:SPATK sheet:opened", function () {
getAttrs(["SPATK"], function (values) {
let spatk = parseInt(values.SPATK) || 0;
let spatkmod = Math.floor(spatk / 2);
setAttrs({
"SPATKMOD": spatkmod
});
});
});
on("change:SPDEF sheet:opened", function () {
getAttrs(["SPDEF"], function (values) {
let spdef = parseInt(values.SPDEF) || 0;
let spdefmod = Math.floor(spdef / 2);
setAttrs({
"SPDEFMOD": spdefmod
});
});
});
on("change:SPD sheet:opened", function () {
getAttrs(["SPD"], function (values) {
let spd = parseInt(values.SPD) || 0;
let spdmod = Math.floor(spd / 2);
let move = spd * 5;
setAttrs({
"SPDMOD": spdmod,
"movement": move
});
});
});
types = ["bug", "dark", "dragon", "electric", "fairy", "fighting", "fire", "flying", "ghost", "grass", "ground", "ice", "normal", "poison", "psychic", "rock", "steel", "water"]
on("change:type1 sheet:opened", function (event) {
getAttrs(["type1"], function (values) {
var typeAttrs = {};
var selectedType = values.type1;
types.forEach((type) => {
if (type == selectedType) {
typeAttrs["style-" + type] = "on";
} else {
typeAttrs["style-" + type] = "off";
}
})
setAttrs(typeAttrs);
});
});
on("change:repeating_moves:move_type", function (event) {
getAttrs(["repeating_moves_move_type"], function (values) {
var typeAttrs = {};
var selectedType = values.repeating_moves_move_type;
types.forEach((type) => {
if (type == selectedType) {
typeAttrs["repeating_moves_style-" + type + "-move"] = "on";
} else {
typeAttrs["repeating_moves_style-" + type + "-move"] = "off";
}
})
setAttrs(typeAttrs);
});
});
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);
});
});
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
});
});
});
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);
});
});
// Calculating the Move Damage Bonus
categoryDamageModifiers = ["", "ATKMOD", "SPATKMOD", ""];
on("change:ATK change:SPATK sheet:opened", function (eventInfo) {
// Get all the section IDs for each move
getSectionIDs("repeating_moves", function (idArray) {
// Get all the section IDs mapped into an array including the repeating_moves_ prefix, so we can read and set attributes correctly
const rowNames = idArray.map(id => `repeating_moves_${id}`);
// Create arrays of all the Category, Extra Bonus, and STAB Bonus attribute names of each move
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`);
// Get the ATK and SPATK modifier attributes, as well the values for each moves category, extra bonus, and stab bonus.
getAttrs([`ATKMOD`, `SPATKMOD`, ...categories, ...extraBonuses, ...stabBonuses, ...diceNumbers, ...damageDice], function (values) {
const rows = rowNames.reduce((obj, rowName) => {
// For each move, get the value of its relevant attributes stored as a local var - default to 0 for easier maths
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;
// Get the modifier for the category selected
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}`;
// Assign the calculated damage bonus to the relevant move's total damage bonus attribute
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
});
});
});
categoryAccuracyModifiers = ["", "ATKMOD", "SPATKMOD", "SPDMOD"];
on("change:ATK change:SPATK change:SPD 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:SPD 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;
const calculated = stat + talent1 + talent2 + userBonus;
if (calculated != total) setAttrs({
'acrobatics_total': calculated
});
});
});
// Athletics
on("change:ATK 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;
const calculated = stat + talent1 + talent2 + userBonus;
if (calculated != total) setAttrs({
'athletics_total': calculated
});
});
});
// Bluff/Deception
on("change:SPDEF change:blufftalent1 change:blufftalent2 change:bluff sheet:opened", function (eventInfo) {
getAttrs([`SPDMODEF`, `blufftalent1`, `blufftalent2`, `bluff`, `bluff_total`], function (values){
const stat = parseInt(values.SPDMODEF) || 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;
const calculated = stat + talent1 + talent2 + userBonus;
if (calculated != total) setAttrs({
'bluff_total': calculated
});
});
});
// Concentration
on("change:DEF 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;
const calculated = stat + talent1 + talent2 + userBonus;
if (calculated != total) setAttrs({
'concentration_total': calculated
});
});
});
// Constitution
on("change:DEF 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;
const calculated = stat + talent1 + talent2 + userBonus;
if (calculated != total) setAttrs({
'constitution_total': calculated
});
});
});
// Diplomacy/Persuasion
on("change:SPDEF 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;
const calculated = stat + talent1 + talent2 + userBonus;
if (calculated != total) setAttrs({
'diplomacy_total': calculated
});
});
});
// Engineering/Operation
on("change:SPATK 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;
const calculated = stat + talent1 + talent2 + userBonus;
if (calculated != total) setAttrs({
'engineering_total': calculated
});
});
});
// History
on("change:SPATK 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;
const calculated = stat + talent1 + talent2 + userBonus;
if (calculated != total) setAttrs({
'history_total': calculated
});
});
});
// Insight
on("change:SPDEF 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;
const calculated = stat + talent1 + talent2 + userBonus;
if (calculated != total) setAttrs({
'insight_total': calculated
});
});
});
// Investigate
on("change:SPATK 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;
const calculated = stat + talent1 + talent2 + userBonus;
if (calculated != total) setAttrs({
'investigate_total': calculated
});
});
});
// Medicine
on("change:SPATK 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;
const calculated = stat + talent1 + talent2 + userBonus;
if (calculated != total) setAttrs({
'medicine_total': calculated
});
});
});
// Nature
on("change:SPATK 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;
const calculated = stat + talent1 + talent2 + userBonus;
if (calculated != total) setAttrs({
'nature_total': calculated
});
});
});
// Perception
on("change:SPDEF 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;
const calculated = stat + talent1 + talent2 + userBonus;
if (calculated != total) setAttrs({
'perception_total': calculated
});
});
});
// Perform
on("change:SPDEF 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;
const calculated = stat + talent1 + talent2 + userBonus;
if (calculated != total) setAttrs({
'perform_total': calculated
});
});
});
// Pokémon Handling
on("change:SPDEF 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;
const calculated = stat + talent1 + talent2 + userBonus;
if (calculated != total) setAttrs({
'handling_total': calculated
});
});
});
// Programming
on("change:SPATK 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;
const calculated = stat + talent1 + talent2 + userBonus;
if (calculated != total) setAttrs({
'programming_total': calculated
});
});
});
// Sleight of Hand
on("change:SPD 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;
const calculated = stat + talent1 + talent2 + userBonus;
if (calculated != total) setAttrs({
'sleightofhand_total': calculated
});
});
});
// Stealth
on("change:SPD 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;
const calculated = stat + talent1 + talent2 + userBonus;
if (calculated != total) setAttrs({
'stealth_total': calculated
});
});
});
</script>