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