1999 lines
91 KiB
HTML
1999 lines
91 KiB
HTML
<!-- 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 />
|
||
<button type="roll" name="roll_attack_check" class="stat-roller"
|
||
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"></span>
|
||
</button><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 />
|
||
<button type="roll" name="roll_defense_check" class="stat-roller"
|
||
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"></span>
|
||
</button><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 />
|
||
<button type="roll" name="roll_special-attack_check" class="stat-roller"
|
||
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"></span>
|
||
</button><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 />
|
||
<button type="roll" name="roll_special-defense_check" class="stat-roller"
|
||
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"></span>
|
||
</button><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 />
|
||
<button type="roll" name="roll_speed_check" class="stat-roller"
|
||
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"></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 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 />
|
||
<button type="roll" name="roll_attack_check" class="stat-roller"
|
||
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"></span>
|
||
</button><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 />
|
||
<button type="roll" name="roll_special-attack_check" class="stat-roller"
|
||
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"></span>
|
||
</button><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 />
|
||
<button type="roll" name="roll_speed_check" class="stat-roller"
|
||
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"></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 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>Talent</b>
|
||
<b>Bonus</b>
|
||
<b>Inventory</b>
|
||
</div>
|
||
|
||
<div class="2col-centered">
|
||
<div>
|
||
<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="2" />
|
||
<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="2" />
|
||
<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="2" />
|
||
<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="2" />
|
||
<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="2" />
|
||
<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="2" />
|
||
<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="2" />
|
||
<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="2" />
|
||
<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="2" />
|
||
<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="2" />
|
||
<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="2" />
|
||
<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="2" />
|
||
<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="2" />
|
||
<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="2" />
|
||
<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="2" />
|
||
<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="2" />
|
||
<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="2" />
|
||
<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="2" />
|
||
<input type="number" name="attr_stealth" value="0" />
|
||
</div>
|
||
<hr class="skill-separator"/>
|
||
<div class="capture-pokemon-skill tab-trainer">
|
||
<input type="number" readonly name="attr_capture_total" class="speed-read-color" />
|
||
<button type='roll' name='roll_capturecheck' class='skill-roller spd-skill'
|
||
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 name="attr_ball_capture_modifier" class="ball-selector">
|
||
<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 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>
|
||
|
||
<!-- General-Purpose Hidden Attributes -->
|
||
<input type="hidden" name="attr_initiative-tie-breaker" value="[[d20]]"/>
|
||
</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">
|
||
// 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 Colour Changes
|
||
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);
|
||
});
|
||
});
|
||
|
||
// 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);
|
||
}
|
||
|
||
</script> |