mirror of
https://github.com/Nighthawk42/roll20-character-sheets.git
synced 2026-09-01 04:32:28 +00:00
- Set Prettier line length limit to a more sensible 140 to prevent the horrendous formatting that caused so many elements to be broken into multiple lines
1694 lines
77 KiB
HTML
1694 lines
77 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: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>
|