Files
roll20-character-sheets-tester/Dungeon_World_Official/Dungeon World.html
T

3161 lines
126 KiB
HTML
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<div class="container compendium-drop-target">
<input type="hidden" name="attr_sheet_version" value="110">
<input type="hidden" name="attr_populate_moves" value="all">
<input type="hidden" name="attr_rolltype" value="2d6">
<input type="hidden" name="attr_statmod_query" value="?{Stat|STR,@{strength_mod}[strength]|DEX, @{dexterity_mod}[dexterity]|CON, @{constitution_mod}[constitution]|INT, @{intelligence_mod}[intelligence]|WIS, @{wisdom_mod}[wisdom]|CHA, @{charisma_mod}[charisma]}">
<input type="hidden" name="attr_levels_prepared" value="0">
<input type="hidden" name="attr_global_dmg" value="0">
<input type="hidden" name="attr_global_arm" value="0">
<input type="hidden" name="attr_global_ongoing" value="0">
<input type="hidden" name="attr_equipment_dmg" value="0">
<input type="hidden" name="attr_equipment_armor" value="0">
<input type="hidden" name="attr_equipment_armormod" value="0">
<input type="hidden" name="attr_equipment_totalarmor" value="0">
<input type="hidden" name="attr_bond_query" value="(0)[Other Bond]">
<!--
<input type="hidden" name="attr_level0_name" value="@{rotename}">
<input type="hidden" name="attr_rotename" value="Rote" data-i18n="rote">
<input type="hidden" name="attr_cantripname" value="Cantrip" data-i18n="cantrip">
-->
<!-- For Generating translation keys only used dynamically, mostly in rolltemplates -->
<span class="invisible" tabindex="-1" data-i18n="armor">Armor</span>
<span class="invisible" tabindex="-1" data-i18n="look">Look</span>
<span class="invisible" tabindex="-1" data-i18n="hitpoints">Hit Points</span>
<span class="invisible" tabindex="-1" data-i18n="classdamage">Class Damage</span>
<span class="invisible" tabindex="-1" data-i18n="rote">Rote</span>
<span class="invisible" tabindex="-1" data-i18n="cantrip">Cantrip</span>
<input type="checkbox" class="invisible is-npc" tabindex="-1" name="attr_calc_isNPC" value="1" />
<div class="npc-toggler">
<input type="checkbox" class="invisible is-npc-label-sib" name="attr_calc_isNPC" value="1" />
<label>
<input type="checkbox" value="1" class="npc-toggler-checkbox" name="attr_isNPC" />
</label>
</div>
<div class="npc-container compendium-drop-target Monsters">
<div class="npc-header">
<span class="flex-row">
<span><input type="text" class="npc-name" name="attr_character_name"></span>
<span><span data-i18n="tags:" accept="Tags">Tags: </span>
<input type="text" class="npc-tags" data-i18n-placeholder="tags" placeholder="Tags" name="attr_NPC_tags" accept="Tags"></span>
</span>
<span class="flex-row">
<span>
<input type="text" class="npc-attack-name" data-i18n-placeholder="attack-name" placeholder="Attack Name" name="attr_NPC_attack_name" accept="Attack Name">
<input type="text" class="npc-attack-roll" data-i18n-placeholder="1d8+2" placeholder="1d8+2" name="attr_NPC_attack_roll" accept="Attack Roll">
<button type="roll" name="roll_NPC_attack" value="&{template:dwgeneral} {{charname=@{character_name}}} {{rollname=@{NPC_attack_name}}} {{result=[[@{NPC_attack_roll}]]}}">damage</button>
<input type="text" class="npc-attack-extrainfo" data-i18n-placeholder="zero-piercing" placeholder="0 piercing" name="attr_NPC_attack_extrainfo" accept="Attack Details">
</span>
<span>
<input type="number" class="npc-hp" name="attr_HP" accept="HP"> / <input type="number" class="npc-hp" name="attr_HP_max" accept="HP">&nbsp;<span data-i18n="hp-u">HP</span>
<input type="number" class="npc-armor" name="attr_NPC_armor" accept="Armor">&nbsp;<span data-i18n="armor">Armor</span>
</span>
</span>
<span class="flex-row flex-left">
<input type="text" class="npc-tags" data-i18n-placeholder="attack-reach" placeholder="Attack Reach(es)" name="attr_NPC_weapontags" accept="Weapon Tags">
</span>
<span class="flex-row flex-left">
<span data-i18n="special-qualities:"><em>Special Qualities:</em></span>&nbsp;
<input type="text" class="npc-qualities" name="attr_NPC_qualities" accept="Special Qualities">
</span>
</div>
<div class="npc-main">
<div>
<textarea class="npc-description" name="attr_NPC_description" accept="Description"></textarea>
</div>
<div class="npc-extras">
<span data-i18n="instinct:"><em>Instinct: </em></span>&nbsp;
<input type="text" class="npc-instinct" name="attr_NPC_instinct" accept="Instinct">
<br />
<span data-i18n="moves" class="label">Moves</span>
<input type="hidden" name="attr_comp_NPC_moves" accept="data-Moves">
<fieldset class="repeating_NPCmoves">
<div class="npc-moves">
&bull; <input type="text" class="npc-move" name="attr_NPC_move" />
</div>
</fieldset>
</div>
</div>
</div>
<div class="top-container">
<div class="gamebanner">
<img src="http://i.imgur.com/xXoBzkm.png" alt="Dungeon World">
</div>
<div class="rows-container">
<div class="header-container">
<div class="name-container">
<span class="label" data-i18n="char-name-u">NAME</span>
<input type="text" name="attr_character_name">
</div>
<div class="progression-container">
<div class="level-container">
<span class="label" data-i18n="level-u">LEVEL</span>
<input type="number" name="attr_level" value="1">
</div>
<div class="xp-container">
<span class="label" data-i18n="xp-u">XP</span>
<input type="number" name="attr_xp" value="0">
</div>
</div>
</div>
<div class="class-container">
<span class="label" data-i18n="char-class-u">CLASS</span>
<input type="hidden" name="attr_comp_name">
<input type="hidden" name="attr_comp_damagedie">
<input type="hidden" name="attr_comp_classmoves">
<input type="hidden" name="attr_comp_load">
<input type="text" name="attr_character_class">
</div>
</div>
</div>
<div class="navigation-container">
<div class="nav-tabs">
<div class="toggler">
<label>
<input type="radio" class="pagebutton-main" name="attr_page" value="0" checked="checked"><span data-i18n="main">Main</span>
</label>
<label>
<input type="radio" class="pagebutton-sub" name="attr_page" value="1"><span data-i18n="sub">Sub</span>
</label>
<label>
<input type="radio" class="pagebutton-settings" name="attr_page" value="2"><span data-i18n="settings">Settings</span>
</label>
</div>
</div>
<div class="roll-mods hold-box">
<div class="toggler">
<label>
<input type="radio" class="roll-normal" name="attr_rollforward" value="0" checked="checked"><span data-i18n="normal">Normal</span>
</label>
<label>
<input type="radio" class="roll-plusone" name="attr_rollforward" value="1"><span data-i18n="plus-one-forward">+1 Forward</span>
</label>
<label>
<input type="radio" class="roll-minusone" name="attr_rollforward" value="-1"><span data-i18n="minus-one-forward">-1 Forward</span>
</label>
<label>
<input type="radio" class="roll-query" name="attr_rollforward" value="?{Modifier|0}"><span data-i18n="query">Query</span>
</label>
<label>
<input type="radio" class="roll-query" name="attr_rollforward" value="@{hold}"><span data-i18n="hold:">Hold:</span>
</label>
<input type="number" name="attr_hold" value="0" />
</div>
</div>
</div>
<input type="radio" class="hpage-main invisible" tabindex="-1" name="attr_calc_page" value="0" checked="checked">
<input type="radio" class="hpage-sub invisible" tabindex="-1" name="attr_calc_page" value="1">
<input type="radio" class="hpage-settings invisible" tabindex="-1" name="attr_calc_page" value="2">
<div class="page main-page">
<div class="mid-container">
<div class="mid-module look-container">
<div class="mid-header">
<button type="roll" name="roll_showlook" value="&{template:dwgeneral} {{charname=@{character_name}}} {{infoname=^{look}}} {{details=@{char_look}}}">
<span class="label" data-i18n="look-u">LOOK</span>
</button>
</div>
<div class="mid-content look">
<textarea name="attr_char_look"></textarea>
</div>
</div>
<div class="mid-module vitals-container">
<div class="vital mid-header armor-container">
<button type="roll" name="roll_showarmor" value="&{template:dwgeneral} {{charname=@{character_name}}} {{infoname=^{armor}}} {{details=[[@{armor}]]}}">
<span class="label" data-i18n="armor-u">ARMOR</span>
</button>
<input type="number" name="attr_armor" value="@{equipment_armor}+@{equipment_armormod}+@{global_arm}" disabled="true">
</div>
<div class="vital mid-header hp-container">
<button type="roll" name="roll_showhp" value="&{template:dwgeneral} {{charname=@{character_name}}} {{infoname=^{hitpoints}}} {{details=[[@{HP}]]&#47;[[@{HP|max}]]}}">
<span class="label" data-i18n="hitpoints-u">HIT POINTS</span>
</button>
<span class="heart"></span>
<input type="number" min="0" class="hitpoints" name="attr_HP" value="0">
<input type="number" min="0" class="max-hitpoints" name="attr_HP_max" value="0">
</div>
<div class="vital mid-header damage-container">
<button type="roll" name="roll_damage" value="&{template:dwgeneral} {{charname=@{character_name}}} {{rollname=^{classdamage}}} {{result=[[@{damagedie} + @{equipment_dmg} + @{global_dmg}]]}}">
<span class="label" data-i18n="damage-u">DAMAGE</span>
</button>
<select name="attr_damagedie">
<option value="d4" selected="selected">d4</option>
<option value="d6">d6</option>
<option value="d8">d8</option>
<option value="d10">d10</option>
<option value="d12">d12</option>
<option value="d20">d20</option>
</select>
</div>
</div>
<div class="mid-module alignment-container">
<div class="mid-header">
<span class="label" data-i18n="alignment-u">ALIGNMENT</span>
</div>
<div class="mid-content alignment">
<input type="text" name="attr_alignment">
<textarea name="attr_alignment_details"></textarea>
</div>
</div>
</div>
<div class="sheet-mid-container">
<div class="stats-container">
<div class="dw stats">
<div class="dw-statbox">
<div class="dw-stat-header">
<span class="dw-statname-long" data-i18n="strength">Strength</span>
<input type="number" name="attr_strength" value="10">
</div>
<div class="dw-stat-debility">
<label><span class="dw-debility-name" data-i18n="weak-1">Weak -1</span>
<input type="checkbox" name="attr_debil_weak" value="1"></label>
</div>
<div class="dw-stat-footer">
<div class="dw-stat-circle">
<button type="roll" name="roll_strength" value="&{template:dwgeneral} {{charname=@{character_name}}} {{rollname=Strength}} {{result=[[@{rolltype} + @{strength_mod} + (@{rollforward})[forward] + @{global_ongoing}[global ongoing]]]}}">
<br />
<span class="dw-statname-short" data-i18n="str-u">STR</span>
<br />
<input type="hidden" name="attr_calc_strength_mod" value="0" />
<input type="number" class="dw-statbonus" name="attr_strength_mod" value="@{calc_strength_mod}" disabled="true">
</button>
</div>
</div>
</div>
<div class="dw-statbox">
<div class="dw-stat-header">
<span class="dw-statname-long" data-i18n="dexterity">Dexterity</span>
<input type="number" name="attr_dexterity" value="10">
</div>
<div class="dw-stat-debility">
<label><span class="dw-debility-name" data-i18n="shaky-1">Shaky -1</span>
<input type="checkbox" name="attr_debil_shaky" value="1"></label>
</div>
<div class="dw-stat-footer">
<div class="dw-stat-circle">
<button type="roll" name="roll_dexterity" value="&{template:dwgeneral} {{charname=@{character_name}}} {{rollname=Dexterity}} {{result=[[@{rolltype} + @{dexterity_mod} + (@{rollforward})[forward] + @{global_ongoing}[global ongoing]]]}}">
<br />
<span class="dw-statname-short" data-i18n="dex-u">DEX</span>
<br />
<input type="hidden" name="attr_calc_dexterity_mod" value="0" />
<input type="number" class="dw-statbonus" name="attr_dexterity_mod" value="@{calc_dexterity_mod}" disabled="true">
</button>
</div>
</div>
</div>
<div class="dw-statbox">
<div class="dw-stat-header">
<span class="dw-statname-long" data-i18n="constitution">Constitution</span>
<input type="number" name="attr_constitution" value="10">
</div>
<div class="dw-stat-debility">
<label><span class="dw-debility-name" data-i18n="sick-1">Sick -1</span>
<input type="checkbox" name="attr_debil_sick" value="1"></label>
</div>
<div class="dw-stat-footer">
<div class="dw-stat-circle">
<button type="roll" name="roll_constitution" value="&{template:dwgeneral} {{charname=@{character_name}}} {{rollname=Constitution}} {{result=[[@{rolltype} + @{constitution_mod} + (@{rollforward})[forward] + @{global_ongoing}[global ongoing]]]}}">
<br />
<span class="dw-statname-short" data-i18n="con-u">CON</span>
<br />
<input type="hidden" name="attr_calc_constitution_mod" value="0" />
<input type="number" class="dw-statbonus" name="attr_constitution_mod" value="@{calc_constitution_mod}" disabled="true">
</button>
</div>
</div>
</div>
<div class="dw-statbox">
<div class="dw-stat-header">
<span class="dw-statname-long" data-i18n="intelligence">Intelligence</span>
<input type="number" name="attr_intelligence" value="10">
</div>
<div class="dw-stat-debility">
<label><span class="dw-debility-name" data-i18n="stunned-1">Stunned -1</span>
<input type="checkbox" name="attr_debil_stunned" value="1"></label>
</div>
<div class="dw-stat-footer">
<div class="dw-stat-circle">
<button type="roll" name="roll_intelligence" value="&{template:dwgeneral} {{charname=@{character_name}}}{{rollname=Intelligence}} {{result=[[@{rolltype} + @{intelligence_mod} + (@{rollforward})[forward] + @{global_ongoing}[global ongoing]]]}}">
<br />
<span class="dw-statname-short" data-i18n="int-u">INT</span>
<br />
<input type="hidden" name="attr_calc_intelligence_mod" value="0" />
<input type="number" class="dw-statbonus" name="attr_intelligence_mod" value="@{calc_intelligence_mod}" disabled="true">
</button>
</div>
</div>
</div>
<div class="dw-statbox">
<div class="dw-stat-header">
<span class="dw-statname-long" data-i18n="wisdom">Wisdom</span>
<input type="number" name="attr_wisdom" value="10">
</div>
<div class="dw-stat-debility">
<label><span class="dw-debility-name" data-i18n="confused-1">Confused -1</span>
<input type="checkbox" name="attr_debil_confused" value="1"></label>
</div>
<div class="dw-stat-footer">
<div class="dw-stat-circle">
<button type="roll" name="roll_wisdom" value="&{template:dwgeneral} {{charname=@{character_name}}} {{rollname=Wisdom}} {{result=[[@{rolltype} + @{wisdom_mod} + (@{rollforward})[forward] + @{global_ongoing}[global ongoing]]]}}">
<br />
<span class="dw-statname-short" data-i18n="wis-u">WIS</span>
<br />
<input type="hidden" name="attr_calc_wisdom_mod" value="0" />
<input type="number" class="dw-statbonus" name="attr_wisdom_mod" value="@{calc_wisdom_mod}" disabled="true">
</button>
</div>
</div>
</div>
<div class="dw-statbox">
<div class="dw-stat-header">
<span class="dw-statname-long" data-i18n="charisma">Charisma</span>
<input type="number" name="attr_charisma" value="10">
</div>
<div class="dw-stat-debility">
<label><span class="dw-debility-name" data-i18n="scarred-1">Scarred -1</span>
<input type="checkbox" name="attr_debil_scarred" value="1"></label>
</div>
<div class="dw-stat-footer">
<div class="dw-stat-circle">
<button type="roll" name="roll_charisma" value="&{template:dwgeneral} {{charname=@{character_name}}} {{rollname=Charisma}} {{result=[[@{rolltype} + @{charisma_mod} + (@{rollforward})[forward] + @{global_ongoing}[global ongoing]]]}}">
<br />
<span class="dw-statname-short" data-i18n="cha-u">CHA</span>
<br />
<input type="hidden" name="attr_calc_charisma_mod" value="0" />
<input type="number" class="dw-statbonus" name="attr_charisma_mod" value="@{calc_charisma_mod}" disabled="true">
</button>
</div>
</div>
</div>
</div>
</div>
<div class="misc-container">
<div class="mid-header">
<span class="label" data-i18n="bonds-u">BONDS</span>
</div>
<div class="mid-content bonds">
<fieldset class="repeating_bonds">
<div class="bonds-main">
<input type="text" name="attr_bond_simple" />
<input class="expander expand-bond" type="checkbox" name="attr_expand_bond" value="1" title="Expand for additional notes" checked="checked" />
<span> </span>
<div class="bond-expansion">
<textarea name="attr_bond_details"></textarea>
</div>
</div>
</fieldset>
</div>
<div class="mid-header">
<span class="label" data-i18n="race-u">RACE</span>
</div>
<div class="mid-content race">
<div class="race-main">
<input type="text" name="attr_race" />
<textarea name="attr_race_details" style="height:50px;"></textarea>
</div>
</div>
<div class="mid-header">
<span class="label" data-i18n="global-modifiers-u">GLOBAL MODIFIERS</span>
</div>
<div class="mid-content gmod">
<fieldset class="repeating_gmods">
<div class="global-mods-main">
<input class="enable-mod" type="checkbox" name="attr_enable_modifier" value="1">
<input type="text" name="attr_gmod_name" />
<input class="expander expand-gmod" type="checkbox" name="attr_expand_gmod" value="1" checked="checked" />
<span> </span>
<div class="gmod-expansion">
<div class="flex-row flex-left">
<input class="enable-mod" type="checkbox" name="attr_ongoing_on" value="1" />
<span>
<span class="label" data-i18n="ongoing-roll-mod:">Ongoing Roll Modifier: </span>
<input type="number" name="attr_gmod_ongoing_mod" value="0" />
</span>
</div>
<div class="flex-row flex-left">
<input class="enable-mod" type="checkbox" name="attr_barbdice_on" value="1" />
<span>
<span class="label" data-i18n="roll1d61d8formoves">Roll 1d6+1d8 for Moves </span>
</span>
</div>
<div class="flex-row flex-left">
<input class="enable-mod" type="checkbox" name="attr_dmg_on" value="1" />
<span>
<span class="label" data-i18n="damage-mod:">Damage Mod:</span>
<input type="number" name="attr_gmod_dmg_diecount" value="0" />
<select class="gmod-die" name="attr_gmod_dmg_die">
<option value="d0" selected="selected">--</option>
<option value="d4">d4</option>
<option value="d6">d6</option>
<option value="d8">d8</option>
<option value="d10">d10</option>
<option value="d12">d12</option>
<option value="d20">d20</option>
</select>
<span> +</span>
<input type="number" name="attr_gmod_dmg_mod" value="0" />
</span>
</div>
<div class="flex-row flex-left">
<input class="enable-mod" type="checkbox" name="attr_arm_on" value="1" />
<span>
<span class="label" data-i18n="armor-modifier:">Armor Modifier: +</span>
<input type="number" name="attr_gmod_arm_mod" value="0" />
</span>
</div>
</div>
</div>
<input type="hidden" name="attr_calc_ongoing" value="0" />
<input type="hidden" name="attr_calc_dmg" value="0" />
<input type="hidden" name="attr_calc_arm" value="0" />
</fieldset>
</div>
</div>
</div>
<div class="lower-container">
<div class="moves-container">
<div class="mid-header moves-header">
<span class="label" data-i18n="moves-u">MOVES</span>
</div>
<div class="mid-content moves">
<fieldset class="repeating_moves">
<div class="move-main">
<button type="roll" name="roll_move" value="&{template:move} {{charname=@{character_name}}} {{movename=@{movename_base}}} {{trigger=@{movetrigger}}} {{success=@{movesuccess}}} {{partial=@{movepartial}}} {{miss=@{movemiss}}} {{doroll=[[@{move_doroll}]]}} {{result=[[@{rolltype} + @{movestat} +@{movemod} + (@{rollforward})[forward] + @{global_ongoing}[ongoing global]]]}} {{details=@{movedetails}}}">
<span class="rolltext" name="attr_move_name" value="@{move_name}"></span>
</button>
<input class="expander expand-move" type="checkbox" name="attr_expand_move" value="1" title="Details" checked="checked" />
<span> </span>
<div class="move-expansion">
<span class="label" data-i18n="move-name">Move Name:</span>
<input type="text" name="attr_movename_base" value="" />
<span class="label" data-i18n="move-trigger">Trigger:</span>
<br>
<textarea type="text" name="attr_movetrigger"></textarea>
<br>
<input class="enable-roll" type="checkbox" name="attr_move_doroll" value="1" checked="checked" />
<span class="label" data-i18n="move-roll">Roll:</span>
<select class="moveroll" name="attr_movestat">
<option value="0[no stat]" selected="selected">--</option>
<option value="@{strength_mod}[strength]" data-i18n="str-u">STR</option>
<option value="@{dexterity_mod}[dexterity]" data-i18n="dex-u">DEX</option>
<option value="@{constitution_mod}[constitution]" data-i18n="con-u">CON</option>
<option value="@{intelligence_mod}[intelligence]" data-i18n="int-u">INT</option>
<option value="@{wisdom_mod}[wisdom]" data-i18n="wis-u">WIS</option>
<option value="@{charisma_mod}[charisma]" data-i18n="cha-u">CHA</option>
<option value="@{statmod_query}" data-i18n="ask-u">ASK</option>
<option value="@{bond_query}" data-i18n="bond-u">BOND</option>
</select>
<span class="label moveroll"> + </span>
<input class="moveroll" type="number" name="attr_movemod" value="0" />
<div class="rollresults-container">
<span class="label" data-i18n="move-success">Success (10+):</span>
<br>
<textarea type="text" name="attr_movesuccess"></textarea>
<span class="label" data-i18n="move-partial">At a Cost (7-9):</span>
<br>
<textarea type="text" name="attr_movepartial"></textarea>
<span class="label" data-i18n="move-miss">Miss (6-):</span>
<br>
<textarea type="text" name="attr_movemiss"></textarea>
</div>
<span class="label" data-i18n="move-details">Details:</span>
<br />
<textarea class="move-details" name="attr_movedetails"></textarea>
</div>
</div>
</fieldset>
</div>
</div>
</div>
</div>
<div class="page sub-page">
<div class="mid-container sub-container">
<input type="checkbox" class="invisible gear-priority" name="attr_subsection_priority" value="1" />
<div class="gear-container">
<input type="hidden" name="attr_calc_load" value="0" />
<div class="mid-header coin-header">
<span class="label" data-i18n="coin-u">COIN</span>
<span class="coin-counter">
<input type="number" class="bigger-number" name="attr_coin" value="0" />
</span>
</div>
<div class="mid-header gear-header">
<span class="label" data-i18n="gear-u">GEAR</span>
<span class="weight-counter">
<span class="label" data-i18n="load-u">LOAD</span>
<input type="number" title="Current Load" class="load-count" name="attr_load" value="@{calc_load}" disabled="true" /> <span class="label">/</span>
<input type="number" title="Maximum Load" class="load-count" name="attr_load_max" value="0" />
</span>
</div>
<div class="mid-content gear">
<fieldset class="repeating_gear">
<div class="gear-main">
<button type="roll" name="roll_gear" value="&{template:dwgeneral} {{charname=@{character_name}}} {{infoname=@{gearname_base}}} {{tags=@{gear_tags}}} {{details=@{geardetails}}} {{doroll=[[@{gear_doroll}]]}} {{result=[[@{damagedie} + @{gear_damage} + @{global_dmg}]]}}">
<span class="rolltext" name="attr_gear_name" value="@{gear_name}"></span>
</button>
<input type="hidden" name="attr_comp_gear_type" value="Item">
<input type="hidden" name="attr_calc_gear_dmg" value="0">
<input type="hidden" name="attr_calc_gear_armor" value="0">
<input type="hidden" name="attr_calc_gear_armormod" value="0">
<input type="hidden" name="attr_calc_gear_weight" value="0">
<input type="hidden" name="attr_gear_doroll" value="0">
<input class="expander expand-gear" type="checkbox" name="attr_expand_gear" value="1" title="Details" checked="checked" />
<span> </span>
<div class="gear-expansion">
<span class="label" data-i18n="gear-name">Gear Name:</span>
<input type="text" name="attr_gearname_base" value="" />
<span class="label" data-i18n="gear-tags">Gear Tags:</span>
<input type="text" name="attr_gear_tags" value="" />
<div class="flex-row">
<span>
<span class="label" data-i18n="value:">Value:</span><input type="number" name="attr_gear_value" value="0" />
</span>
<span>
<span class="label" data-i18n="qty:">Qty:</span><input type="number" name="attr_gear_quantity" value="1" />
</span>
<span>
<span class="label" data-i18n="weight:">Weight:</span><input type="number" name="attr_gear_weight" \>
</span>
</div>
<div class="toggler flex-right">
<label>
<input type="checkbox" name="attr_gear_equipped" value="1" />
<span class="label" data-i18n="equipped">Equipped</span>
</label>
</div>
<br>
<div class="toggler gear-level-selector">
<label>
<input type="radio" class="gear-type-option" name="attr_gear_type" value="Item" checked="checked"><span data-i18n="item">Item</span>
</label>
<label>
<input type="radio" class="gear-type-option" name="attr_gear_type" value="Weapon"><span data-i18n="weapon">Weapon</span>
</label>
<label>
<input type="radio" class="gear-type-option" name="attr_gear_type" value="Armor"><span data-i18n="armor">Armor</span>
</label>
</div>
<input type="radio" class="gear-item-expander invisible" name="attr_calc_gear_type" value="Item" checked="checked">
<input type="radio" class="gear-weapon-expander invisible" name="attr_calc_gear_type" value="Weapon">
<input type="radio" class="gear-armor-expander invisible" name="attr_calc_gear_type" value="Armor">
<div class="flex-row flex-right gear-item">
</div>
<div class="flex-row flex-right gear-weapon">
<span>
<span class="label" data-i18n="damage:">Damage:</span><input type="number" name="attr_gear_damage" value="0" />
</span>
</div>
<div class="flex-row flex-right gear-armor">
<span>
<span class="label" data-i18n="base-armor:">Base Armor:</span><input type="number" name="attr_gear_base_armor" value="0" />
</span>
<span>
<span class="label" data-i18n="+armor:">+ Armor:</span><input type="number" name="attr_gear_add_armor" value="0" />
</span>
</div>
<br />
<span class="label" data-i18n="gear-details">Details:</span>
<br />
<textarea class="gear-details" name="attr_geardetails"></textarea>
</div>
</div>
</fieldset>
</div>
</div>
<div class="spells-container">
<div class="mid-header spells-header">
<span class="label" data-i18n="spells-u">SPELLS</span>
<span class="prepared-counter"><span class="label" data-i18n="spell-levels-prepared:">Spell Levels Prepared: </span><span class="label" name="attr_levels_prepared">0</span></span>
</div>
<div class="mid-content spells">
<fieldset class="repeating_spells">
<div class="spell-main compendium-drop-target">
<button type="roll" name="roll_spell" value="&{template:spell} {{charname=@{character_name}}} {{spellname=@{spellname_base}}} {{doroll=[[@{spell_doroll}]]}} {{tags=@{spell_tags}}} {{result=[[@{spell_diecount}@{spell_die} + @{spellmod}]]}} {{level=[[@{spell_level}]]}} {{details=@{spelldetails}}}">
<span class="rolltext" name="attr_spell_name" value="@{spell_name}"></span>
</button>
<input type="hidden" name="attr_comp_spell_level" value="-1">
<input type="hidden" name="attr_level0_type" value="^{rote}">
<input type="hidden" name="attr_comp_fullroll" value="0">
<input class="expander expand-spell" type="checkbox" name="attr_expand_spell" value="1" title="Details" checked="checked" />
<span> </span>
<div class="spell-expansion">
<span class="label" data-i18n="spell-name">Spell Name:</span>
<input type="text" name="attr_spellname_base" value="" />
<span class="label" data-i18n="spell-tags">Spell Tags:</span>
<input type="text" name="attr_spell_tags" value="" />
<span class="label" data-i18n="spell-level">Level:</span>
<div class="toggler spell-level-selector">
<label>
<input type="radio" class="spell-level-option" name="attr_spell_level" value="0" checked="checked"><span name="attr_level0_type" data-i18n-dynamic></span>
</label>
<label>
<input type="radio" class="spell-level-option" name="attr_spell_level" value="1"><span data-i18n="1st">1st</span>
</label>
<label>
<input type="radio" class="spell-level-option" name="attr_spell_level" value="3"><span data-i18n="3rd">3rd</span>
</label>
<label>
<input type="radio" class="spell-level-option" name="attr_spell_level" value="5"><span data-i18n="5th">5th</span>
</label>
<label>
<input type="radio" class="spell-level-option" name="attr_spell_level" value="7"><span data-i18n="7th">7th</span>
</label>
<label>
<input type="radio" class="spell-level-option" name="attr_spell_level" value="9"><span data-i18n="9th">9th</span>
</label>
</div>
<input type="checkbox" class="spell-level-rote invisible" tabindex="-1" name="attr_spell_level" value="0" checked="checked">
<div class="toggler flex-right">
<label>
<input type="checkbox" name="attr_spell_prepared" value="1" />
<span class="label" data-i18n="prepared">Prepared</span>
</label>
</div>
<!-- <input type="number" class="spell-level" name="attr_spell_level" value="0" /><span></span> -->
<input class="enable-roll" type="checkbox" name="attr_spell_doroll" value="1" />
<span class="label" data-i18n="spell-roll">Roll:</span>
<input class="spellroll" type="number" name="attr_spell_diecount" value="1" />
<select class="spelldie" name="attr_spell_die">
<option value="d4" selected="selected">d4</option>
<option value="d6">d6</option>
<option value="d8">d8</option>
<option value="d10">d10</option>
<option value="d12">d12</option>
<option value="d20">d20</option>
</select>
<span class="label spellroll"> + </span>
<input class="spellroll" type="number" name="attr_spellmod" value="0" />
<span class="label" data-i18n="spell-details">Details:</span>
<br />
<textarea class="spell-details" name="attr_spelldetails"></textarea>
<input type="hidden" name="attr_calc_prepval" value="0">
</div>
</div>
</fieldset>
</div>
</div>
</div>
<div class="sheet-notesfield">
<span class="label" >Notes</span>
<br />
<textarea class="sheet-notes" name="attr_notes" ></textarea><textarea class="sheet-notes sheet-notes2" name="attr_notes2" ></textarea>
</div>
</div>
<div class="page settings-page">
<div class="mid-container settings-container">
<div class="mid-header">
<span class="label" data-i18n="settings-u">SETTINGS</span>
</div>
<div class="settings-content">
<div class="settings-content-box">
<span class="label" data-i18n="sheet-layout"><h3>Sheet Layout</h3></span>
<span class="label" data-i18n="sub-section-display-priority">Sub Section Display Priority</span>
<div class="toggler">
<label>
<input type="radio" class="toggler-btn" name="attr_subsection_priority_base" value="0" checked="checked"><span data-i18n="spells">Spells</span>
</label>
<label>
<input type="radio" class="toggler-btn" name="attr_subsection_priority_base" value="1"><span data-i18n="gear">Gear</span>
</label>
</div>
</div>
<div class="settings-content-box">
<span class="label" data-i18n="compendium"><h3>Compendium</h3></span>
<span class="label" data-i18n="add-moves-class-drop">Add moves on Class Drop:</span>
<div class="toggler">
<label>
<input type="radio" class="toggler-btn" name="attr_populate_moves" value="all" checked="checked"><span data-i18n="all">All Moves</span>
</label>
<label>
<input type="radio" class="toggler-btn" name="attr_populate_moves" value="classonly"><span data-i18n="class-only">Class Moves</span>
</label>
<label>
<input type="radio" class="toggler-btn" name="attr_populate_moves" value="none"><span data-i18n="none">None</span>
</label>
</div>
</div>
<div class="settings-content-box">
<span class="label" data-i18n="spellcasting"><h3>Spellcasting</h3></span>
<span class="label" data-i18n="level-0-spell-type">Level 0 Spell Type</span>
<div class="toggler">
<label>
<input type="radio" class="spelltype-rote" name="attr_level0_type_base" value="rote" checked="checked"><span data-i18n="rote">Rote</span>
</label>
<label>
<input type="radio" class="spelltype-cantrip" name="attr_level0_type_base" value="cantrip"><span data-i18n="cantrip">Cantrip</span>
</label>
</div>
</div>
</div>
</div>
</div>
<!-- COMPENDIUM DROP CATCHERS -->
<input type="hidden" name="attr_drop_category" accept="Category">
<input type="hidden" name="attr_drop_name" accept="Name">
<input type="hidden" name="attr_drop_data" accept="data">
<input type="hidden" name="attr_drop_content" accept="Content">
</div>
<!-- End Container div -->
<input type="checkbox" class="tip-confirm-flag" name="attr_tip_confirm_flag" value="1">
<div class="class-tip">
<button type="action" class="cancel-button" name="act_cancelclass">&#128473;</button>
<h3><span data-i18n="getting-started">Getting Started</span></h3>
<p><span data-i18n="getting-started-class-tip">Welcome to the Dungeon World Character Sheet by Roll20! To get started, drag a class from the compendium or select one from the choices below:</span></p>
<button type="action" name="act_bard" data-i18n="Bard">Bard</button>
<button type="action" name="act_cleric" data-i18n="Cleric">Cleric</button>
<button type="action" name="act_druid" data-i18n="Druid">Druid</button>
<button type="action" name="act_fighter" data-i18n="Fighter">Fighter</button>
<button type="action" name="act_paladin" data-i18n="Paladin">Paladin</button>
<button type="action" name="act_ranger" data-i18n="Ranger">Ranger</button>
<button type="action" name="act_thief" data-i18n="Thief">Thief</button>
<button type="action" name="act_wizard" data-i18n="Wizard">Wizard</button>
</div>
<div class="compendium_warning">
<span data-i18n="accepting-drop-u">ACCEPTING DROP FROM COMPENDIUM</span>
</div>
<rolltemplate class="sheet-rolltemplate-move">
<div class="rt-container">
<div class="rt-header rt-header-minor">{{charname}} <span data-i18n="name-makes-move">makes a Move</span></div>
<div class="rt-header">{{movename}}</div>
<div class="rt-content">
{{#trigger}}
<div class="rt-row">
<span class="label rt-label" data-i18n="move-trigger">Trigger:</span>
<span class="rt-value rt-text">{{trigger}}</span>
</div>
{{/trigger}}
{{#modifiers}}
<div class="rt-row">
<span class="label rt-label" data-i18n="move-modifiers">Modifier(s):</span>
<span class="rt-value rt-text">{{modifiers}}</span>
</div>
{{/modifiers}}
{{#rollGreater() doroll 0}}
{{#result}}
<div class="rt-row">
<span class="label rt-label" data-i18n="move-roll">Roll:</span>
<span class="rt-value rt-text">{{result}}</span>
</div>
{{#rollLess() result 7}}
{{#miss}}
<div class="rt-row">
<span class="label rt-label" data-i18n="move-effect">Effect:</span>
<span class="rt-value rt-text">{{miss}}</span>
</div>
{{/miss}}
{{/rollLess() result 7}}
{{#rollBetween() result 7 9}}
{{#partial}}
<div class="rt-row">
<span class="label rt-label" data-i18n="move-effect">Effect:</span>
<span class="rt-value rt-text">{{partial}}</span>
</div>
{{/partial}}
{{/rollBetween() result 7 9}}
{{#rollGreater() result 9}}
{{#success}}
<div class="rt-row">
<span class="label rt-label" data-i18n="move-effect">Effect:</span>
<span class="rt-value rt-text">{{success}}</span>
</div>
{{/success}}
{{/rollGreater() result 9}}
{{/result}}
{{/rollGreater() doroll 0}}
{{#details}}
<div class="rt-row">
<span class="label rt-label" data-i18n="move-details">Details:</span>
<span class="rt-value rt-text">{{details}}</span>
</div>
{{/details}}
</div>
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-spell">
<div class="rt-container">
<div class="rt-header rt-header-minor">{{charname}} <span data-i18n="name-makes-spell">casts a spell</span></div>
<div class="rt-header">{{spellname}}</div>
{{#rollTotal() level 0}}
<div class="rt-header rt-header-minor"><span class="rt-text" data-i18n="rote">Rote</div>
{{/rollTotal() level 0}}
{{#rollGreater() level 0}}
<div class="rt-header rt-header-minor"><span class="rt-text" data-i18n="level:">Level: </span>{{level}}</div>
{{/rollGreater() level 0}}
{{#tags}}
<div class="rt-header rt-header-minor"><span class="rt-text">{{tags}}</span></div>
{{/tags}}
<div class="rt-content">
{{#modifiers}}
<div class="rt-row">
<span class="label rt-label" data-i18n="spell-modifiers">Modifier(s):</span>
<span class="rt-value rt-text">{{modifiers}}</span>
</div>
{{/modifiers}}
{{#rollGreater() doroll 0}}
{{#result}}
<div class="rt-row">
<span class="label rt-label" data-i18n="spell-roll">Roll:</span>
<span class="rt-value rt-text">{{result}}</span>
</div>
{{/result}}
{{/rollGreater() doroll 0}}
{{#details}}
<div class="rt-row">
<span class="label rt-label" data-i18n="spell-details">Details:</span>
<span class="rt-value rt-text">{{details}}</span>
</div>
{{/details}}
</div>
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-dwgeneral">
<div class="rt-container">
{{#rollname}}
<div class="rt-header rt-header-minor">{{charname}} <span data-i18n="rolls">rolls</span> {{rollname}}</div>
{{/rollname}}
{{#infoname}}
<div class="rt-header rt-header-minor">{{charname}} <span data-i18n="displays">displays</span> {{infoname}}</div>
{{/infoname}}
{{#tags}}
<div class="rt-header rt-header-minor"><em>{{tags}}</em></div>
{{/tags}}
<div class="rt-content">
{{#doroll}}
{{#rollGreater() doroll 0}}
{{#result}}
<div class="rt-row">
<span class="label rt-label" data-i18n="move-roll">Roll:</span>
<span class="rt-value rt-text">{{result}}</span>
</div>
{{/result}}
{{/rollGreater() doroll 0}}
{{/doroll}}
{{^doroll}}
{{#result}}
<div class="rt-row">
<span class="label rt-label" data-i18n="move-roll">Roll:</span>
<span class="rt-value rt-text">{{result}}</span>
</div>
{{/result}}
{{/doroll}}
{{#details}}
<div class="rt-row">
<span class="rt-value rt-text">{{details}}</span>
</div>
{{/details}}
</div>
</div>
</rolltemplate>
<script type="text/worker">
// Storing the data for moves right in the sheet, as js object.
var dwMoves = {
hackandslash: {
class: "Basic",
fullname: "Hack & Slash",
trigger: "When you attack an enemy in melee",
roll: "STR",
success: "Deal your damage to the enemy and avoid their attack.\nAt your option, you may choose to do +1d6 damage but expose yourself to the enemy's attack.",
partial: "Deal your damage to the enemy, and the enemy makes an attack against you.",
miss: "Miss!"
},
volley: {
class: "Basic",
fullname: "Volley",
trigger: "When you take aim and shoot at an enemy at range",
roll: "DEX",
success: "You have a clear shot—deal your damage.",
partial: "Deal your damage, and choose one:\n• You have to move to get the shot placing you in danger of the GM's choice\n• You have to take what you can get: -1d6 damage.\n• You have to take several shots, reducing your ammo by one.",
miss: "Miss!"
},
parley: {
class: "Basic",
fullname: "Parley",
trigger: "When you have leverage on a GM character and manipulate them",
roll: "CHA",
success: "They ask you for something and do it if you make them a promise first.",
partial: "They ask you for something and do it if you make them a promise, but they need concrete assurance of your promise, right now.",
details: "Leverage is something that character needs or wants."
},
defydanger: {
class: "Basic",
fullname: "Defy Danger",
trigger: "When you act despite an imminent threat or suffer a calamity",
roll: "ASK",
success: "You do what you set out to, the threat doesn't come to bear.",
partial: "You stumble, hesitate, or flinch: the GM will offer you a worse outcome, hard bargain, or ugly choice.",
details: "• by powering through, +Str\n• by getting out of the way or acting fast, +Dex\n• by enduring, +Con\n• with quick thinking, +Int\n• through mental fortitude, +Wis\n• sing charm and social grace, +Cha"
},
defydangerstr: {
class: "Basic",
fullname: "Defy Danger (Str)",
trigger: "When you act despite an imminent threat or suffer a calamity, and deal with it by powering through",
roll: "STR",
success: "You do what you set out to, the threat doesn't come to bear.",
partial: "You stumble, hesitate, or flinch: the GM will offer you a worse outcome, hard bargain, or ugly choice."
},
defydangerdex: {
class: "Basic",
fullname: "Defy Danger (Dex)",
trigger: "When you act despite an imminent threat or suffer a calamity, and deal with it by getting out of the way or acting fast",
roll: "DEX",
success: "You do what you set out to, the threat doesn't come to bear.",
partial: "You stumble, hesitate, or flinch: the GM will offer you a worse outcome, hard bargain, or ugly choice."
},
defydangercon: {
class: "Basic",
fullname: "Defy Danger (Con)",
trigger: "When you act despite an imminent threat or suffer a calamity, and deal with it by enduring",
roll: "CON",
success: "You do what you set out to, the threat doesn't come to bear.",
partial: "You stumble, hesitate, or flinch: the GM will offer you a worse outcome, hard bargain, or ugly choice."
},
defydangerint: {
class: "Basic",
fullname: "Defy Danger (Int)",
trigger: "When you act despite an imminent threat or suffer a calamity, and deal with it with quick thinking",
roll: "INT",
success: "You do what you set out to, the threat doesn't come to bear.",
partial: "You stumble, hesitate, or flinch: the GM will offer you a worse outcome, hard bargain, or ugly choice."
},
defydangerwis: {
class: "Basic",
fullname: "Defy Danger (Wis)",
trigger: "When you act despite an imminent threat or suffer a calamity, and deal with it through mental fortitude",
roll: "WIS",
success: "You do what you set out to, the threat doesn't come to bear.",
partial: "You stumble, hesitate, or flinch: the GM will offer you a worse outcome, hard bargain, or ugly choice."
},
defydangercha: {
class: "Basic",
fullname: "Defy Danger (Cha)",
trigger: "When you act despite an imminent threat or suffer a calamity, and deal with it with charm and social grace",
roll: "CHA",
success: "You do what you set out to, the threat doesn't come to bear.",
partial: "You stumble, hesitate, or flinch: the GM will offer you a worse outcome, hard bargain, or ugly choice."
},
defend: {
class: "Basic",
fullname: "Defend",
trigger: "When you stand in defense of a person, item, or location under attack",
roll: "CON",
success: "Hold 3",
partial: "Hold 1",
miss: "No Hold",
details: "So long as you stand in defense, when you or the thing you defend is attacked you may spend hold, 1 for 1, to choose an option:\n• Halve the attack's effect or damage\n• Open up the attacker to an ally, giving that ally +1 forward against the attacker\n• Deal damage to the attacker equal to your level"
},
discernrealities: {
class: "Basic",
fullname: "Discern Realities",
trigger: "When you closely study a situation or person",
roll: "WIS",
success: "Ask the GM three questions from the list below.",
partial: "Ask the GM one question from the list below.",
miss: "You cannot discern any answers.",
details: "Take +1 forward when acting on the answers:\n• What happened here recently?\n• What is about to happen?\n• What should I be on the lookout for?\n• What here is useful or valuable to me?\n• Who's really in control here?\n• What here is not what it appears to be?"
},
spoutlore: {
class: "Basic",
fullname: "Spout Lore",
trigger: "When you consult your accumulated knowledge about something",
roll: "INT",
success: "The GM will tell you something interesting and useful about the subject relevant to your situation.",
partial: "The GM will only tell you something interesting - it's on you to make it useful.",
details: "The GM might ask you \"How do you know this?\" Tell them the truth, now."
},
aidorinterfere: {
class: "Basic",
fullname: "Aid or Interfere",
trigger: "When you help or hinder someone you have a Bond with",
roll: "BOND",
success: "They take +1 or -2; your choice.",
partial: "They take +1 or -2; your choice. You also expose yourself to danger, retribution, or cost."
},
lastbreath: {
class: "Basic",
fullname: "Last Breath",
trigger: "When you're dying you catch a glimpse of what lies beyond the Black Gates of Death's Kingdom (the GM will describe it)",
roll: "--",
success: "You've cheated death - you're in a bad spot but you're still alive.",
partial: "Death will offer you a bargain. Take it and stabilize or refuse and pass beyond the Black Gates into whatever fate awaits you.",
miss: "Your fate is sealed. You're marked as Death's own and you'll cross the threshold soon. The GM will tell you when."
},
arcaneart: {
class: "Bard",
fullname: "Arcane Art",
trigger: "When you weave a performance into a basic spell, choose an ally and an effect below.",
roll: "CHA",
success: "The ally gets the selected effect.",
partial: "Your spell still works, but you draw unwanted attention or your magic reverberates to other targets affecting them as well, GM’s choice.",
details: "• Heal 1d8 damage\n• +1d4 forward to damage\n• Their mind is shaken clear of one enchantment\n• The next time someone successfully assists the target with aid, they get +2 instead of +1\n"
},
charmingandopen: {
class: "Bard",
fullname: "Charming and Open",
trigger: "When you speak frankly with someone",
roll: "NONE",
details: "You can ask their player a question from the list below. They must answer it truthfully, then they may ask you a question from the list (which you must answer truthfully).\n• Whom do you serve?\n• What do you wish I would do?\n• How can I get you to _____?\n• What are you really feeling right now? • What do you most desire?"
},
bardiclore: {
class: "Bard",
fullname: "Bardic Lore",
trigger: "When you first encounter an important creature, location, or item (your call) covered by your bardic lore",
roll: "NONE",
details: "Choose an area of expertise, then remove the rest.\n• Spells and Magicks\n• The Dead and Undead\n• Grand Histories of the Known World A Bestiary of Creatures Unusual The Planar Spheres\n• Legends of Heroes Past\n• Gods and Their Servants\n\nYou can ask the GM any one question about it; the GM will answer truthfully. The GM may then ask you what tale, song, or legend you heard that information in."
},
aportinthestorm: {
class: "Bard",
fullname: "A Port In The Storm",
trigger: "When you return to a civilized settlement you've visited before",
roll: "NONE",
details: "Tell the GM when you were last here. They’ll tell you how it’s changed since then."
},
signatureweapon: {
class: "Fighter",
fullname: "Signature Weapon",
trigger: "When you create your character",
details: "This is your weapon. There are many like it, but this one is yours. Your weapon is your best friend. It is your life. You Master it as you Master your life. Your weapon, without you, is useless. Without your weapon, you are useless. You must wield your weapon true.\n\nChoose a base description, all are 2 weight:\n\n• Sword\n• Axe\n• Hammer\n• Spear\n• Flail\n• Fists\nChoose the range that best fits your weapon:\n\n• Hand\n• Close\n• Reach\nChoose two enhancements:\n\n• Hooks and spikes. +1 damage, but +1 weight.\n• Sharp. +2 piercing.\n• Perfectly weighted. Add precise.\n• Serrated edges. +1 damage.\n• Glows in the presence of one type of creature, your choice.\n• Huge. Add messy and forceful.\n• Versatile. Choose an additional range.\n• Well-crafted. -1 weight.\nChoose a look:\n\n• Ancient\n• Unblemished\n• Ornate\n• Blood-stained\n• Sinister"
},
bendbarsliftgates: {
class: "Fighter",
fullname: "Bend Bars, Lift Gates",
trigger: "When you use pure strength to destroy an inanimate obstacle",
roll: "STR",
success: "Choose 3:",
partial: "Choose 2:",
miss: "Choose none.",
details: "• It doesn't take a very long time\n• Nothing of value is damaged\n• It doesn't make an inordinate amount of noise\n• You can fix the thing again without a lot of effort"
},
alittlehelpfrommyfriends: {
class: "Bard",
fullname: "A Little Help From My Friends",
roll: "NONE",
details: "When you successfully aid someone you take +1 forward as well."
},
aportinthestorm: {
class: "Bard",
fullname: "A Port in the Storm",
roll: "NONE",
details: "When you return to a civilized settlement you’ve visited before, tell the GM when you were last here. They’ll tell you how it’s changed since then."
},
asafeplace: {
class: "Ranger",
fullname: "A Safe Place",
trigger: "When you set the watch for the night",
roll: "NONE",
details: "Everyone takes +1 to take watch."
},
asaferplace: {
class: "Ranger",
fullname: "A Safer Place",
trigger: "When you set the watch for the night",
roll: "NONE",
details: "Everyone takes +1 to take watch. After a night in camp when you set the watch everyone takes +1 forward."
},
alchemist: {
class: "Thief",
fullname: "Alchemist",
trigger: "When you have you have time to gather materials and a safe place to brew",
roll: "NONE",
details: "You can create three doses of any poison you’ve used before. Alternately you can describe the effects of a poison you’d like to create. The GM will tell you that you can create it, but with one or more caveats:\n\n• It will only work under specific circumstances\n• The best you can manage is a weaker version\n• It’ll take a while to take effect\n• It’ll have obvious side effects"
},
anearformagic: {
class: "Bard",
fullname: "An Ear for Magic",
trigger: "When you hear an enemy Cast a Spell",
roll: "NONE",
details: "The GM will tell you the name of the spell and its effects. Take +1 forward when acting on the answers."
},
animalcompanion: {
class: "Ranger",
fullname: "Animal Companion",
roll: "NONE",
details: "You have a supernatural connection with a loyal animal. You can’t talk to it per se but it always acts as you wish it to. Name your animal companion and choose a species:\n\nWolf, cougar, bear, eagle, dog, hawk, cat, owl, pigeon, rat, mule\n\nChoose a base:\n\n• Ferocity +2, Cunning +1, 1 Armor, Instinct +1\n• Ferocity +2, Cunning +2, 0 Armor, Instinct +1\n• Ferocity +1, Cunning +2, 1 Armor, Instinct +1\n• Ferocity +3, Cunning +1, 1 Armor, Instinct +2\n\nChoose as many strengths as its ferocity:\n\nFast, burly, huge, calm, adaptable, quick reflexes, tireless, Camouflage, ferocious, intimidating, keen senses, stealthy\n\nYour animal companion is trained to fight humanoids. Choose as many additional trainings as its cunning:\n\nHunt, search, scout, guard, fight monsters, perform, labor, travel\n\nChoose as many weaknesses as its instinct:\n\nFlighty, savage, slow, broken, frightening, forgetful, stubborn, lame"
},
anointed: {
class: "Cleric",
fullname: "Anointed",
roll: "NONE",
details: "Choose one spell in addition to the one you picked for Chosen One. You are granted that spell as if it was one level lower."
},
apotheosis: {
class: "Cleric",
fullname: "Apotheosis",
trigger: "The first time you spend time in prayer as appropriate to your god after taking this move",
roll: "NONE",
details: "Choose a feature associated with your deity (rending claws, wings of sapphire feathers, an all-seeing third eye, etc.). When you emerge from prayer, you permanently gain that physical feature."
},
arcanearmor: {
class: "Wizard",
fullname: "Arcane Armor",
roll: "NONE",
details: "As long as you have at least one prepared spell of first level or higher, you have +4 armor."
},
arcaneward: {
class: "Wizard",
fullname: "Arcane Ward",
trigger: "As long as you have at least one prepared spell of first level or higher",
roll: "NONE",
details: "You have +2 armor"
},
armormastery: {
class: "Fighter",
fullname: "Armor Mastery",
trigger: "When you make your armor take the brunt of damage dealt to you",
roll: "NONE",
details: "The damage is negated but you must reduce the armor value of your armor or shield (your choice) by 1. The value is reduced each time you make this choice. If the reduction leaves the item with 0 armor it is destroyed."
},
armored: {
class: "Fighter",
fullname: "Armored",
roll: "NONE",
details: "You ignore the clumsy tag on any armor you wear."
},
armoredperfection: {
class: "Fighter",
fullname: "Armored Perfection",
trigger: "When you choose to let your armor take the brunt of damage dealt to you",
roll: "NONE",
details: "The damage is negated and you take +1 forward against the attacker, but you must reduce the armor value of your armor or shield (your choice) by 1. The value is reduced each time you make this choice. If the reduction leaves the item with 0 armor it is destroyed."
},
backstab: {
class: "Thief",
fullname: "Backstab",
trigger: "When you attack a surprised or defenseless enemy with a melee weapon, you can choose to deal your damage, or roll+Dex",
roll: "DEX",
success: "Choose two:",
partial: "Choose one:",
miss: "Choose none.",
details: "• You don’t get into melee with them\n• You deal your damage+1d6\n• You create an advantage, +1 forward to you or an ally acting on it\n• Reduce their armor by 1 until they Repair it"
},
balance: {
class: "Druid",
fullname: "Balance",
trigger: "When you deal damage",
roll: "NONE",
details: "Take 1 balance. When you touch someone and channel the spirits of life you may spend balance. For each balance spent, heal 1d4 HP."
},
bamboozle: {
class: "Bard",
fullname: "Bamboozle",
trigger: "When you parley with someone",
roll: "NONE",
details: "You also take +1 forward with them."
},
barkskin: {
class: "Druid",
fullname: "Barkskin",
roll: "NONE",
details: "So long as your feet touch the ground, you have +1 armor."
},
blacksmith: {
class: "Fighter",
fullname: "Blacksmith",
roll: "NONE",
trigger: "When you have access to a forge",
details: "You can graft the magical powers of a weapon onto your Signature Weapon. This process destroys the magical weapon. Your Signature Weapon gains the magical powers of the destroyed weapon."
},
bloodandthunder: {
class: "Druid",
fullname: "Blood and Thunder",
trigger: "When you are in an appropriate animal form (something dangerous)",
details: "Increase your damage to d10."
},
bloodthirsty: {
class: "Fighter",
fullname: "Bloodthirsty",
trigger: "When you deal damage",
details: "Deal +1d8 damage."
},
bloodyaegis: {
class: "Paladin",
fullname: "Bloody Aegis",
trigger: "When you take damage you can grit your teeth and accept the blow",
details: "If you do you take no damage but instead suffer a debility of your choice. If you already have all six debilities you can’t use this move."
},
blotoutthesun: {
class: "Ranger",
fullname: "Blot Out the Sun",
trigger: "When you volley you may spend extra ammo before rolling",
details: "For each point of ammo spent you may choose an extra target. Roll once and apply damage to all targets."
},
bornofthesoil: {
class: "Druid",
fullname: "Born of the Soil",
details: "You learned your magic in a place whose spirits are strong and ancient and they’ve marked you as one of their own. No matter where you go, they live within you and allow you to take their shape. Choose one of the following; remove the rest. It is the land to which you are attuned—when shapeshifting you may take the shape of any animal who might live in your Land.\n\n• The Great Forests\n• The Whispering Plains\n• The Vast Desert\n• The Stinking Mire\n• The River Delta\n• The Depths of the Earth\n• The Sapphire Islands\n• The Open Sea\n• The Towering Mountains\n• The Frozen North\n• The Blasted Wasteland\n\nChoose a tell—a physical attribute that marks you as born of the soil—that reflects the spirit of your land. It may be an animal feature like antlers or leopard’s spots or something more general: hair like leaves or eyes of glittering crystal. Your tell remains no matter what shape you take."
},
brewer: {
class: "Thief",
fullname: "Brewer",
trigger: "When you have time to gather materials and a safe place to brew",
details: "You can create three doses of any one poison you’ve used before."
},
bynaturesustained: {
class: "Druid",
fullname: "By Nature Sustained",
details: "You don’t need to eat or drink. If a move tells you to mark off a ration just ignore it."
},
calledshot: {
class: "Ranger",
fullname: "Called Shot",
trigger: "When you attack a defenseless or surprised enemy at range, you can choose to deal your damage, or name your target (Head, Arms, or Legs) and roll+DEX.",
roll: "DEX",
success:"Head: Deal your damage, and they do nothing but stand and drool for a few moments.\nArms: Deal your damage, and they drop anything they’re holding.\nLegs: Deal your damage, and they’re hobbled and slow moving.",
partial:"Head: They do nothing but stand and drool for a few moments.\nArms: They drop anything they’re holding.\nLegs: They’re hobbled and slow moving.",
miss:"You miss the mark entirely."
},
camouflage: {
class: "Ranger",
fullname: "Camouflage",
trigger: "When you keep still in natural surroundings",
details: "Enemies never spot you until you make a movement."
},
castaspell: {
class: "Cleric",
fullname: "Cast a Spell (WIS)",
trigger: "When you unleash a spell granted to you by your deity",
roll: "WIS",
success: "The spell is successfully cast and your deity does not revoke the spell, so you may cast it again.",
partial: "The spell is cast, but choose one:\n\n• You draw unwelcome attention or put yourself in a spot. The GM will tell you how.\n• Your casting distances you from your deity—take -1 ongoing to cast a spell until the next time you Commune.\n• After you cast it, the spell is revoked by your deity. You cannot cast the spell again until you Commune and have it granted to you.",
miss: "The spell fails.",
details: "Note that maintaining spells with ongoing effects will sometimes cause a penalty to your roll to cast a spell."
},
castaspellint: {
class: "Wizard",
fullname: "Cast a Spell (INT)",
trigger: "When you release a spell you’ve prepared",
roll: "INT",
success: "The spell is successfully cast and you do not forget the spell—you may cast it again later.",
partial: "The spell is cast, but choose one:\n\n• You draw unwelcome attention or put yourself in a spot. The GM will tell you how.\n• The spell disturbs the fabric of reality as it is cast—take -1 ongoing to Cast a Spell until the next time you Prepare Spells.\n• After it is cast, the spell is forgotten. You cannot cast the spell again until you Prepare Spells.",
miss: "The spell fails.",
details: "Note that maintaining spells with ongoing effects will sometimes cause a penalty to your roll to Cast a Spell."
},
cautious: {
class: "Thief",
fullname: "Cautious",
details: "When you use Trap Expert you always get +1 hold, even on a 6-."
},
charge: {
class: "Paladin",
fullname: "Charge!",
trigger: "When you lead the charge into combat",
details: "Those you lead take +1 forward."
},
cheapshot: {
class: "Thief",
fullname: "Cheap Shot",
trigger: "When using a precise or hand weapon",
details: "Your Backstab deals an extra +1d6 damage."
},
chimera: {
class: "Druid",
fullname: "Chimera",
trigger: "When you shapeshift",
details: "You may create a merged form of up to three different shapes. You may be a bear with the wings of an eagle and the head of a ram, for example. Each feature will grant you a different move to make. Your chimera form follows the same rules as Shapeshifter otherwise."
},
chosenone: {
class: "Cleric",
fullname: "Chosen One",
details: "Choose one spell. You are granted that spell as if it was one level lower."
},
command: {
class: "Ranger",
fullname: "Command",
trigger: "When you work with your Animal Companion on something it's trained in...",
details: "• ...and you attack the same target, add its ferocity to your damage\n• ...and you track, add its cunning to your roll\n• ...and you take damage, add its armor to your armor\n• ...and you discern realities, add its cunning to your roll\n• ...and you parley, add its cunning to your roll\n• ...and someone interferes with you, add its instinct to their roll"
},
commune: {
class: "Cleric",
fullname: "Commune",
trigger: "When you spend uninterrupted time (an hour or so) in quiet communion with your deity, you:",
details: "• Lose any spells already granted to you.\n• Are granted new spells of your choice whose total levels don’t exceed your own level+1, and none of which is a higher level than your own level.\n• Prepare all of your rotes, which never count against your limit."
},
communionofwhispers: {
class: "Druid",
fullname: "Communion of Whispers",
trigger: "When you spend time in a place, making note of its resident spirits and calling on the spirits of the land",
roll: "WIS",
success: "You are granted a vision of significance to you, your allies, and the spirits around you. The vision is clear and helpful to you.",
partial: "You are granted a vision of significance to you, your allies, and the spirits around you, but it is unclear, its meaning murky.",
miss: "You are granted a vision of significance to you, your allies, and the spirits around you, but the vision is upsetting, frightening, or traumatizing. The GM will describe it. Take -1 forward."
},
con: {
class: "Bard",
fullname: "Con",
trigger: "When you parley with someone",
details: "On a 7+ you also take +1 forward with them and get to ask their player one question which they must answer truthfully."
},
connections: {
class: "Thief",
fullname: "Connections",
trigger: "When you put out word to the criminal underbelly about something you want or need",
roll: "CHA",
success: "Someone has it, just for you.",
partial: "You’ll have to settle for something close or it comes with strings attached, your call.",
miss: "You don't get it."
},
counterspell: {
class: "Wizard",
fullname: "Counterspell",
trigger: "When you attempt to counter an arcane spell that will otherwise affect you, stake one of your prepared spells on the defense.",
success: "The spell is countered and has no effect on you.",
partial: "the spell is countered and you forget the spell you staked.",
miss: "You fail to counter the spell.",
details: "Your counterspell protects only you; if the countered spell has other targets they get its effects."
},
deity: {
class: "Cleric",
fullname: "Deity",
details: "You serve and worship some deity or power which grants you spells. Give your god a name (maybe Helferth, Sucellus, Zorica or Krugon the Bleak) and choose your deity’s domain:\n\n• Healing and Restoration\n• Bloody Conquest\n• Civilization\n• Knowledge and Hidden Things\n• The Downtrodden and Forgotten\n• What Lies Beneath\n\nChoose one precept of your religion:\n\n• Your religion preaches the sanctity of suffering, add Petition: Suffering\n• Your religion is cultish and insular, add Petition: Gaining Secrets\n• Your religion has important sacrificial rites, add Petition: Offering\n• Your religion believes in trial by combat, add Petition: Personal Victory"
},
devious: {
class: "Bard",
fullname: "Devious",
trigger: "When you use Charming and Open",
details: "You may also ask “How are you vulnerable to me?” Your subject may not ask this question of you."
},
devotedhealer: {
class: "Cleric",
fullname: "Devoted Healer",
trigger: "When you heal someone else of damage",
details: "Add your level to the amount of damage healed."
},
dirtyfighter: {
class: "Thief",
fullname: "Dirty Fighter",
trigger: "When using a precise or hand weapon",
details: "Your Backstab deals an extra +1d8 damage and all other attacks deal +1d4 damage."
},
disguise: {
class: "Thief",
fullname: "Disguise",
trigger: "When you have time and materials",
details: "You can create a disguise that will fool anyone into thinking you’re another creature of about the same size and shape. Your actions can give you away but your appearance won’t."
},
divinearmor: {
class: "Cleric",
fullname: "Divine Armor",
trigger: "When you wear no armor or shield",
details: "You get 3 armor."
},
divineauthority: {
class: "Paladin",
fullname: "Divine Authority",
details: "Take +1 to order hirelings. When you roll a 12+ the hireling transcends their moment of fear and doubt and carries out your order with particular effectiveness or efficiency."
},
divinefavor: {
class: "Paladin",
fullname: "Divine Favor",
details: "Dedicate yourself to a deity (name a new one or choose one that’s already been established). You gain the Commune and Cast a Spell Cleric moves. When you select this move, treat yourself as a Cleric of level 1 for using spells. Every time you gain a level thereafter, increase your effective Cleric level by 1."
},
divineguidance: {
class: "Cleric",
fullname: "Divine Guidance",
trigger: "When you petition your deity according to the precept of your religion",
details: "You are granted some useful knowledge or boon related to your deity’s domain. The GM will tell you what."
},
divineintervention: {
class: "Cleric",
fullname: "Divine Intervention",
trigger: "When you Commune",
details: "You get 1 hold and lose any hold you already had. Spend that hold when you or an ally takes damage to call on your deity, they intervene with an appropriate manifestation (a sudden gust of wind, a lucky slip, a burst of light) and negate the damage."
},
divineinvincibility: {
class: "Cleric",
fullname: "Divine Intervention",
trigger: "When you Commune",
details: "You gain 2 hold and lose any hold you already had. Spend that hold when you or an ally takes damage to call on your deity, who intervenes with an appropriate manifestation (a sudden gust of wind, a lucky slip, a burst of light) and negates the damage."
},
divineprotection: {
class: "Paladin",
fullname: "Divine Protection",
trigger: "While on a quest",
details: "You get +2 armor."
},
doppelgngersdance: {
class: "Druid",
fullname: "Doppelgänger’s Dance",
details: "You are able to study the essence of specific individuals to take their exact form, including men, elves, or the like. Suppressing your tell is possible, but if you do, take -1 ongoing until you return to your own form."
},
duelistsblock: {
class: "Bard",
fullname: "Duelist's Block",
trigger: "When you Hack and Slash",
details: "You take +2 armor forward."
},
duelistsparry: {
class: "Bard",
fullname: "Duelist's Parry",
trigger: "When you Hack and Slash",
details: "You take +1 armor forward."
},
dwarfcleric: {
class: "Cleric",
fullname: "Dwarf (Cleric)",
details: "You are one with stone. When you Commune you are also granted a special version of Words of the Unspeaking as a rote which only works on stone."
},
dwarffighter: {
class: "Fighter",
fullname: "Dwarf (Fighter)",
trigger: "When you share a drink with someone",
details: "You may parley with them using CON instead of CHA."
},
eldritchchord: {
class: "Bard",
fullname: "Eldritch Chord",
trigger: "When you use Arcane Art",
details: "You choose two effects. You also get to choose one of those effects to double."
},
eldritchtones: {
class: "Bard",
fullname: "Eldritch Tones",
details: "Your Arcane Art is strong, allowing you to choose two effects instead of one."
},
elementalmastery: {
class: "Druid",
fullname: "Elemental Mastery",
trigger: "When you call on the primal spirits of fire, water, earth or air to perform a task for you",
roll: "WIS",
success: "Choose two:\n• The effect you desire comes to pass\n• You avoid paying nature’s price\n• You retain control",
partial: "Choose one:\n• The effect you desire comes to pass\n• You avoid paying nature’s price\n• You retain control",
miss: "Some catastrophe occurs as a result of your calling."
},
elfbard: {
class: "Bard",
fullname: "Elf (Bard)",
details: "When you enter an important location (your call) you can ask the GM for one fact from the history of that location."
},
elfdruid: {
class: "Druid",
fullname: "Elf (Druid)",
details: "The sap of the elder trees flows within you. In addition to any other attunements, the Great Forest is always considered your land."
},
elffighter: {
class: "Fighter",
fullname: "Elf (Fighter)",
details: "Choose one weapon—you can always treat weapons of that type as if they had the precise tag."
},
elfranger: {
class: "Ranger",
fullname: "Elf (Ranger)",
details: "When you undertake a perilous journey through wilderness whatever job you take you succeed as if you rolled a 10+."
},
elfwizard: {
class: "Wizard",
fullname: "Elf (Wizard)",
details: "Magic is as natural as breath to you. Detect Magic is a cantrip for you."
},
embracingnoform: {
class: "Druid",
fullname: "Embracing No Form",
details: "When you shapeshift, roll 1d4 and add that total to your hold."
},
empower: {
class: "Cleric",
fullname: "Empower",
trigger: "When you cast a spell, on a 10+ you have the option of choosing from the 7-9 list.",
details: "If you do, you may choose one of these effects as well:\n• The spell's effects are doubled\n• The spell's targets are doubled"
},
empoweredmagic: {
class: "Wizard",
fullname: "Empowered Magic",
trigger: "When you cast a spell, on a 10+ you have the option of choosing from the 7-9 list.",
details: "If you do, you may choose one of these effects as well:\n• The spell's effects are maximized\n• The spell's targets are doubled"
},
enchanter: {
class: "Wizard",
fullname: "Enchanter",
trigger: "When you have time and safety with a magic item",
details: "You may ask the GM what it does, the GM will answer you truthfully."
},
enchanterssoul: {
class: "Wizard",
fullname: "Enchanter’s Soul",
trigger: "When you have time and safety with a magic item in a place of power",
details: "You can Empower that item so that the next time you use it its effects are amplified, the GM will tell you exactly how."
},
envenom: {
class: "Thief",
fullname: "Envenom",
details: "You can apply even complex poisons with a pinprick. When you apply a poison that’s not dangerous for you to use to your weapon it’s touch instead of applied."
},
escaperoute: {
class: "Thief",
fullname: "Escape Route",
trigger: "When you’re in too deep and need a way out, name your escape route and roll",
roll: "DEX",
success: "You're gone.",
partial: "You can stay or go, but if you go it costs you: leave something behind or take something with you, the GM will tell you what."
},
etherealtether: {
class: "Wizard",
fullname: "Ethereal Tether",
trigger: "When you have time with a willing or helpless subject",
details: "You can craft an ethereal tether with them. You perceive what they perceive and can discern realities about someone tethered to you or their surroundings no matter the distance. Someone willingly tethered to you can communicate with you over the tether as if you were in the room with them."
},
evasion: {
class: "Thief",
fullname: "Evasion",
trigger: "When you defy danger on a 12+",
details: "You transcend the danger. You not only do what you set out to, but the GM will offer you a better outcome, true beauty, or a moment of grace."
},
everonward: {
class: "Paladin",
fullname: "Ever Onward",
trigger: "When you lead the charge into combat",
details: "Those you lead take +1 forward and +2 armor forward."
},
evidenceoffaith: {
class: "Paladin",
fullname: "Evidence of Faith",
trigger: "When you see divine magic as it happens",
details: "You can ask the GM which deity granted the spell and its effects. Take +1 when acting on the answers."
},
evileye: {
class: "Fighter",
fullname: "Evil Eye",
trigger: "When you enter combat",
roll: "CHA",
success: "Hold 2. Spend your hold to make eye contact with an NPC present, who freezes or flinches and can’t act until you break it off.",
partial: "Hold 1. Spend your hold to make eye contact with an NPC present, who freezes or flinches and can’t act until you break it off.",
miss: "Your enemies immediately identify you as their biggest threat."
},
expandedspellbook: {
class: "Wizard",
fullname: "Expanded Spellbook",
details: "Add a new spell from the spell list of any class to your Spellbook."
},
exterminatus: {
class: "Paladin",
fullname: "Exterminatus",
trigger: "When you speak aloud your promise to defeat an enemy",
details: "You deal +2d4 damage against that enemy and -4 damage against anyone else. This effect lasts until the enemy is defeated. If you fail to defeat the enemy or give up the fight, you can admit your failure, but the effect continues until you find a way to redeem yourself."
},
extremelycautious: {
class: "Thief",
fullname: "Extremely Cautious",
trigger: "When you use Trap Expert",
details: "You always get +1 hold, even on a 6-. On a 12+ you get 3 hold and the next time you come near a trap the GM will immediately tell you what it does, what triggers it, who set it, and how you can use it to your advantage."
},
eyeforweaponry: {
class: "Fighter",
fullname: "Eye for Weaponry",
trigger: "When you look over an enemy’s weaponry",
details: "Ask the GM how much damage they do."
},
eyesofthetiger: {
class: "Druid",
fullname: "Eyes of the Tiger",
trigger: "When you mark an animal (with mud, dirt, or blood)",
details: "You can see through that animal’s eyes as if they were your own, no matter what distance separates you. Only one animal at a time may be marked in this way."
},
familiarprey: {
class: "Ranger",
fullname: "Familiar Prey",
trigger: "When you spout lore about a monster",
details: "You use WIS instead of INT"
},
firstaid: {
class: "Cleric",
fullname: "First Aid",
details: "Cure Light Wounds is a rote for you, and therefore doesn’t count against your limit of granted spells."
},
flexiblemorals: {
class: "Thief",
fullname: "Flexible Morals",
details: "When someone tries to detect your alignment you can tell them any alignment you like."
},
followme: {
class: "Ranger",
fullname: "Follow Me",
trigger: "When you undertake a perilous journey",
partial: "You can take two roles. You make a separate roll for each."
},
formcrafter: {
class: "Druid",
fullname: "Formcrafter",
trigger: "When you shapeshift",
details: "Choose a stat: you take +1 ongoing to rolls using that stat while shifted. The GM will choose a stat, too: you take -1 ongoing to rolls using that stat while shifted."
},
formshaper: {
class: "Druid",
fullname: "Formshaper",
details: "You may increase your armor by 1 or deal an additional +1d4 damage while in an animal form. Choose which when you shapeshift."
},
fountofknowledge: {
class: "Wizard",
fullname: "Fount of Knowledge",
trigger: "When you spout lore about something no one else has any clue about",
details: "Take +1."
},
godamidstthewastes: {
class: "Ranger",
fullname: "God Admidst the Wastes",
details: "Dedicate yourself to a deity (name a new one or choose one that’s already been established). You gain the Commune and Cast a Spell Cleric moves. When you select this move, treat yourself as a Cleric of level 1 for using spells. Every time you gain a level thereafter, increase your effective Cleric level by 1."
},
greaterempower: {
class: "Cleric",
fullname: "Greater Empower",
trigger: "When you Cast a Spell",
details: "On a 10–11 you have the option of choosing from the 7–9 list. If you do, you may choose one of these effects as well. On a 12+ you get to choose one of these effects for free:\n• The spell's effects are doubled\n• The spell's targets are doubled"
},
greaterempoweredmagic: {
class: "Wizard",
fullname: "Greater Empowered Magic",
trigger: "When you Cast a Spell",
details: "On a 10–11 you have the option of choosing from the 7–9 list. If you do, you may choose one of these effects as well. On a 12+ you get to choose one of these effects for free:\n• The spell's effects are maximized\n• The spell's targets are doubled"
},
greaterfirstaid: {
class: "Cleric",
fullname: "Greater First Aid",
details: "Cure Moderate Wounds is a rote for you, and therefore doesn’t count against your limit of granted spells."
},
halfelven: {
class: "Ranger",
fullname: "Half-Elven",
details: "Somewhere in your lineage lies mixed blood and it begins to show its presence. You gain the elf starting move if you took the human one at character creation or vice versa."
},
halflingdruid: {
class: "Druid",
fullname: "Halfling (Druid)",
details: "You sing the healing songs of spring and brook. When you make camp, you and your allies heal +1d6."
},
halflingfighter: {
class: "Fighter",
fullname: "Halfling (Fighter)",
trigger: "When you defy danger and use your small size to your advantage",
details: "Take +1."
},
halflingthief: {
class: "Thief",
fullname: "Halfling (Thief)",
trigger: "When you attack with a ranged weapon",
details: "Deal +2 damage."
},
healingchorus: {
class: "Bard",
fullname: "Healing Chorus",
trigger: "When you heal with Arcane Art",
details: "You heal +2d8 damage."
},
healingsong: {
class: "Bard",
fullname: "Healing Song",
trigger: "When you heal with Arcane Art",
details: "You heal +1d8 damage."
},
heirloom: {
class: "Fighter",
fullname: "Heirloom",
trigger: "When you consult the spirits that reside within your Signature Weapon, they will give you an insight relating to the current situation, and might ask you some questions in return",
roll: "CHA",
success: "The GM will give you good detail.",
partial: "The GM will give you an impression."
},
heist: {
class: "Thief",
fullname: "Heist",
trigger: "When you take time to make a plan to steal something, name the thing you want to steal.",
details: "Ask the GM these questions. When acting on the answers you and your allies take +1 forward.\n\n• Who will notice it’s missing?\n• What’s its most powerful defense?\n• Who will come after it?\n• Who else wants it?"
},
highlylogical: {
class: "Wizard",
fullname: "Highly Logical",
trigger: "When you use strict deduction to analyze your surroundings",
details: "You can discern realities with Int instead of Wis. On a 12+ you get to ask the GM any three questions, not limited by the list."
},
holyprotection: {
class: "Paladin",
fullname: "Holy Protection",
details: "You get +1 armor while on a quest."
},
holysmite: {
class: "Paladin",
fullname: "Holy Smite",
details: "While on a quest you deal +1d8 damage."
},
hospitaller: {
class: "Paladin",
fullname: "Hospitaller",
details: "When you heal an ally, you heal +1d8 damage."
},
humanbard: {
class: "Bard",
fullname: "Human (Bard)",
trigger: "When you first enter a civilized settlement",
details: "Someone who respects the custom of hospitality to minstrels will take you in as their guest."
},
humancleric: {
class: "Cleric",
fullname: "Human (Cleric)",
details: "Your faith is diverse. Choose one Wizard spell. You can cast and be granted that spell as if it was a Cleric spell."
},
humandruid: {
class: "Druid",
fullname: "Human (Druid)",
details: "As your people learned to bind animals to field and farm, so too are you bound to them. You may always take the shape of any domesticated animal, in addition to your normal options."
},
humanfighter: {
class: "Fighter",
fullname: "Human (Fighter)",
details: "Once per battle you may reroll a single damage roll (yours or someone else’s)."
},
humanpaladin: {
class: "Paladin",
fullname: "Human (Paladin)",
trigger: "When you pray for Guidance, even for a moment, and ask, \"What here is evil?\"",
details: "The GM will tell you, honestly."
},
humanranger: {
class: "Ranger",
fullname: "Human (Ranger)",
trigger: "When you make camp in a dungeon or city",
details: "You don’t need to consume a ration."
},
humanthief: {
class: "Thief",
fullname: "Human (Thief)",
details: "You are a professional. When you spout lore or discern realities about criminal activities, take +1."
},
humanwizard: {
class: "Wizard",
fullname: "Human (Wizard)",
details: "Choose one Cleric spell. You can cast it as if it was a Wizard spell."
},
huntandtrackwis: {
class: "Ranger",
fullname: "Hunt and Track (Wis)",
trigger: "When you follow a trail of clues left behind by passing creatures",
roll: "WIS",
success: "You follow the creature’s trail until there’s a significant change in its direction or mode of travel. Also, choose 1:\n• Gain a useful bit of information about your quarry, the GM will tell you what\n• Determine what caused the trail to end",
partial: "You follow the creature’s trail until there’s a significant change in its direction or mode of travel."
},
huntersbrother: {
class: "Druid",
fullname: "Hunter's Brother",
details: "Choose one move from the Ranger class list."
},
huntersprey: {
class: "Ranger",
fullname: "Hunter's Prey",
trigger: "When you spout lore about a monster",
details: "You use WIS instead of INT. On a 12+, in addition to the normal effects, you get to ask the GM any one question about the subject."
},
iamthelaw: {
class: "Paladin",
fullname: "I Am the Law",
trigger: "When you give an NPC an order based on your Divine Authority",
roll: "CHA",
success: "You take +1 forward against them, and they choose one:\n• Do what you say\n• Back away cautiously, then flee\n• Attack you",
partial: "They choose one:\n• Do what you say\n• Back away cautiously, then flee\n• Attack you",
miss: "They do as they please and you take -1 forward against them."
},
imperviousdefender: {
class: "Paladin",
fullname: "Impervious Defender",
trigger: "When you defend",
details: "You always get +1 hold, even on a 6-. When you get a 12+ to defend instead of getting hold the nearest attacking creature is stymied giving you a clear advantage, The GM will describe it."
},
improvedweapon: {
class: "Fighter",
fullname: "Improved Weapon",
details: "Choose one extra enhancement for your Signature Weapon."
},
indomitable: {
class: "Paladin",
fullname: "Indomitable",
trigger: "When you suffer a debility (even through Bloody Aegis)",
details: "Take +1 forward against whatever caused it."
},
interrogator: {
class: "Fighter",
fullname: "Interrogator",
trigger: "When you parley using threats of impending violence as leverage",
details: "You may use STR instead of CHA."
},
invigorate: {
class: "Cleric",
fullname: "Invigorate",
trigger: "When you heal someone",
details: "They take +2 forward to their Damage."
},
ironhide: {
class: "Fighter",
fullname: "Iron Hide",
details: "You gain +1 armor."
},
itgoestoeleven: {
class: "Bard",
fullname: "It Goes To Eleven",
trigger: "When you unleash a crazed performance (a righteous lute solo or mighty brass blast, maybe), choose a target who can hear you",
roll: "CHA",
success: "The target attacks their nearest ally in range.",
partial: "They attack their nearest ally, but you also draw their attention and ire.",
miss: "Miss!"
},
knowitall: {
class: "Wizard",
fullname: "Know-It-All",
trigger: "When another player’s character comes to you for advice and you tell them what you think is best",
details: "They get +1 forward when following your advice and you mark experience if they do."
},
layonhandscha: {
class: "Paladin",
fullname: "Lay on Hands (CHA)",
trigger: "When you touch someone, skin to skin, and pray for their well-being",
roll: "CHA",
success: "You heal 1d8 Damage or remove one disease.",
partial: "You heal 1d8 Damage or remove one disease, but said Damage or disease is transferred to you.",
miss: "Miss!"
},
logical: {
class: "Wizard",
fullname: "Logical",
trigger: "When you use strict deduction to analyze your surroundings",
details: "You can discern realities with INT instead of WIS."
},
mansbestfriend: {
class: "Ranger",
fullname: "Man's Best Friend",
trigger: "When you allow your Animal Companion to take a blow that was meant for you",
details: "The Damage is negated and your animal companion’s ferocity becomes 0. If its ferocity is already 0 you can’t use this ability. When you have a few hours of rest with your Animal Companion its ferocity returns to normal."
},
martyr: {
class: "Cleric",
fullname: "Martyr",
trigger: "When you take Damage and embrace the pain, you may take +1d4 Damage (ignoring armor).",
details: "If you do, take +1 forward to Cast a Spell and add your level to any Damage done or healed by the spell."
},
master: {
class: "Wizard",
fullname: "Master",
details: "Choose one spell in addition to the one you picked for Prodigy. You prepare that spell as if it were one level lower."
},
merciless: {
class: "Fighter",
fullname: "Merciless",
trigger: "When you deal damage",
details: "Deal +1d4 damage."
},
metalhurlant: {
class: "Bard",
fullname: "Metal Hurlant",
trigger: "When you shout with great force or play a shattering note, choose a target",
roll: "CON",
success: "The target takes 1d10 Damage and is deafened for a few minutes.",
partial: "The target takes 1d10 Damage and is deafened for a few minutes, but it’s out of control: The GM will choose an additional target nearby."
},
multiclassdabbler: {
class: "Fighter",
fullname: "Multiclass Dabbler",
details: "Get one move from another class. Treat your level as one lower for choosing the move."
},
multiclassinitiate: {
class: "Fighter",
fullname: "Multiclass Initiate",
details: "Get one move from another class. Treat your level as one lower for choosing the move."
},
multiclassmaster: {
class: "Fighter",
fullname: "Multiclass Master",
details: "Get one move from another class. Treat your level as one lower for choosing the move."
},
mysticalpuppetstrings: {
class: "Wizard",
fullname: "Mystical Puppet Strings",
trigger: "When you use magic to control a person’s actions",
details: "They have no memory of what you had them do and bear you no ill will."
},
observant: {
class: "Ranger",
fullname: "Observant",
details: "When you hunt and track, on a hit you may also ask one question about the creature you are tracking from the discern realities list for free."
},
orisonforguidance: {
class: "Cleric",
fullname: "Orison for Guidance",
trigger: "When you sacrifice something of value to your deity and pray for Guidance",
details: "Your deity tells you what it would have you do. If you do it, mark experience."
},
penitent: {
class: "Cleric",
fullname: "Penitent",
trigger: "When you take Damage and embrace the pain, you may take +1d4 Damage (ignoring armor).",
details: "If you do, take +1 forward to Cast a Spell."
},
perfecthospitaller: {
class: "Paladin",
fullname: "Perfect Hospitaller",
trigger: "When you heal an ally",
details: "You heal +2d8 damage."
},
perfectknight: {
class: "Paladin",
fullname: "Perfect Knight",
details: "When you quest you choose three boons instead of two."
},
poisonmaster: {
class: "Thief",
fullname: "Poison Master",
details: "After you’ve used a poison once it’s no longer dangerous for you to use."
},
preparespells: {
class: "Wizard",
fullname: "Prepare Spells",
trigger: "When you spend uninterrupted time (an hour or so) in quiet contemplation of your Spellbook",
details: "You:\n• Lose any Spells you already have prepared\n• Prepare new Spells of your choice from your Spellbook whose total levels don’t exceed your own level+1.\n• Prepare your cantrips which never count against your limit."
},
prodigy: {
class: "Wizard",
fullname: "Prodigy",
details: "Choose a spell. You prepare that spell as if it were one level lower."
},
protectivecounter: {
class: "Wizard",
fullname: "Protective Counter",
trigger: "When an ally within sight of you is affected by an arcane spell",
details: "You can counter it as if it affected you. If the spell affects multiple allies you must counter for each ally separately."
},
providence: {
class: "Cleric",
fullname: "Providence",
details: "You ignore the -1 penalty from two Spells you maintain."
},
quest: {
class: "Paladin",
fullname: "Quest",
trigger: "When you dedicate yourself to a mission through prayer and Ritual cleansing...",
details: "State what you set out to do:\n• Slay _______, a great blight on the land\n• Defend _______ from the iniquities that beset them\n• Discover the truth of _______\n\nThen choose up to two boons:\n• An unwavering sense of direction to _______.\n• Invulnerability to _______ (e.g., edged Weapons, fire, enchantment, etc.)\n• A mark of Divine Authority\n• Senses that pierce lies\n• A voice that transcends language\n• A freedom from hunger, thirst, and sleep\n\nThe GM will then tell you what vow or vows is required of you to maintain your blessing:\n• Honor (forbidden: cowardly tactics and tricks)\n• Temperance (forbidden: gluttony in food, drink, and pleasure of the flesh)\n• Piety (required: observance of daily holy services)\n• Valor (forbidden: suffering an evil creature to live)\n• Truth (forbidden: lies)\n• Hospitality (required: comfort to those in need, no matter who they are)"
},
quickstudy: {
class: "Wizard",
fullname: "Quick Study",
trigger: "When you see the effects of an arcane spell",
details: "Ask the GM the name of the spell and its effects. You take +1 when acting on the answers."
},
reaper: {
class: "Cleric",
fullname: "Reaper",
trigger: "When you take time after a conflict to dedicate your victory to your deity and deal with the dead",
details: "Take +1 forward."
},
redoftoothandclaw: {
class: "Druid",
fullname: "Red of Tooth and Claw",
trigger: "When you are in an appropriate animal form (something dangerous)",
details: "Increase your Damage to d8."
},
reputation: {
class: "Bard",
fullname: "Reputation",
trigger: "When you first meet someone who’s heard songs about you",
roll: "CHA",
success: "Tell the GM two things they've heard about you.",
partial: "Tell the GM one thing they've heard about you, and the GM tells you one thing."
},
ritual: {
class: "Wizard",
fullname: "Ritual",
trigger: "When you draw on a place of power to create a magical effect",
details: "Tell the GM what you’re trying to achieve. Ritual effects are always possible, but the GM will give you one to four of the following conditions:\n\n• It’s going to take days/weeks/months\n• First you must ____\n• You’ll need help from ____\n• It will require a lot of money\n• The best you can do is a lesser version, unreliable and limited\n• You and your allies will risk danger from ____\n• You’ll have to disenchant ____ to do it"
},
scentofblood: {
class: "Fighter",
fullname: "Scent of Blood",
trigger: "When you hack and slash an enemy",
details: "Your next attack against that same foe deals +1d4 Damage."
},
seeingred: {
class: "Fighter",
fullname: "Seeing Red",
trigger: "When you discern realities during combat",
details: "You take +1."
},
selfpowered: {
class: "Wizard",
fullname: "Self-Powered",
trigger: "When you have time, arcane materials, and a safe space, you can create your own place of power.",
details: "Describe to the GM what kind of power it is and how you’re binding it to this place, the GM will tell you one kind of creature that will have an interest in your workings."
},
serenity: {
class: "Cleric",
fullname: "Serenity",
trigger: "When you Cast a Spell",
details: "You ignore the first -1 penalty from ongoing Spells."
},
seriousunderdog: {
class: "Thief",
fullname: "Serious Underdog",
details: "You have +1 armor. When you’re outnumbered, you have +2 armor instead."
},
setupstrike: {
class: "Paladin",
fullname: "Setup Strike",
trigger: "When you Hack and Slash, choose an ally.",
details: "Their next attack against your target does +1d4 damage."
},
shapeshifter: {
class: "Druid",
fullname: "Shapeshifter",
trigger: "When you call upon the spirits to change your shape",
roll: "WIS",
success: "Hold 3.",
partial: "Hold 2.",
miss: "Hold 1 in addition to whatever the GM says.",
details: "You may take on the physical form of any species whose essence you have studied or who lives in your land: you and your possessions meld into a perfect copy of the species’ form. You have any innate abilities and weaknesses of the form: claws, wings, gills, breathing water instead of air. You still use your normal stats but some moves may be harder to trigger—a housecat will find it hard to do battle with an ogre. The GM will also tell you one or more moves associated with your new form. Spend 1 hold to make that move. Once you’re out of hold, you return to your natural form. At any time, you may spend all your hold and revert to your natural form."
},
shed: {
class: "Druid",
fullname: "Shed",
trigger: "When you take Damage while shapeshifted",
details: "You may choose to revert to your natural form to negate the Damage."
},
shootfirst: {
class: "Thief",
fullname: "Shoot First",
details: "You’re never caught by surprise. When an enemy would get the drop on you, you get to act first instead."
},
smaugsbelly: {
class: "Ranger",
fullname: "Smaug's Belly",
trigger: "When you know your target's weakest point",
details: "Your arrows have 2 piercing."
},
smite: {
class: "Paladin",
fullname: "Smite",
trigger: "While on a quest",
details: "You deal +1d4 damage."
},
specialtrick: {
class: "Ranger",
fullname: "Special Trick",
details: "Choose a move from another class. So long as you are working with your Animal Companion you have access to that move."
},
spellaugmentation: {
class: "Wizard",
fullname: "Spell Augmentation",
trigger: "When you deal damage to a creature, you can shunt a spell’s energy into them",
details: "End one of your ongoing Spells and add the spell’s level to the Damage dealt."
},
spelldefense: {
class: "Wizard",
fullname: "Spell Defense",
trigger: "You may end any ongoing spell immediately and use the energy of its dissipation to deflect an oncoming attack.",
details: "The spell ends and you subtract its level from the damage done to you."
},
spellbook: {
class: "Wizard",
fullname: "Spellbook",
details: "You have mastered several Spells and inscribed them in your spellbook. You start out with three first level Spells in your spellbook as well as the cantrips. Whenever you gain a level, you add a new spell of your level or lower to your spellbook. You spellbook is 1 weight."
},
spirittongue: {
class: "Druid",
fullname: "Spirit Tongue",
details: "The grunts, barks, chirps, and calls of the creatures of the wild are as language to you. You can understand any animal native to your land or akin to one whose essence you have studied."
},
stalkerssister: {
class: "Druid",
fullname: "Stalker's Sister",
details: "Choose one move from The Ranger class list."
},
staunchdefender: {
class: "Paladin",
fullname: "Staunch Defender",
trigger: "When you defend",
details: "You always get +1 hold, even on a 6-."
},
steelhide: {
class: "Fighter",
fullname: "Steel Hide",
details: "You gain +2 armor."
},
strider: {
class: "Ranger",
fullname: "Strider",
trigger: "When you undertake a perilous journey",
details: "You can take two roles. Roll twice and use the better result for both roles."
},
strongarmtrueaim: {
class: "Thief",
fullname: "Strong Arm, True Aim",
details: "You can throw any melee weapon, using it to volley. A thrown melee weapon is gone; you can never choose to reduce ammo on a 7–9."
},
studiedessence: {
class: "Druid",
fullname: "Studied Essence",
trigger: "When you spend time in contemplation of an animal spirit",
details: "You may add its species to those you can assume using shapeshifting."
},
superiorwarrior: {
class: "Fighter",
fullname: "Superior Warrior",
trigger: "When you hack and slash",
details: "On a 12+ you deal your Damage, avoid their attack, and impress, dismay, or frighten your enemy."
},
tandemstrike: {
class: "Paladin",
fullname: "Tandem Strike",
trigger: "When you Hack and Slash, choose an ally.",
details: "Their next attack against your target does +1d4 Damage and they take +1 forward against them."
},
tasteofblood: {
class: "Fighter",
fullname: "Taste of Blood",
trigger: "When you hack and slash an enemy",
details: "Your next attack against that same foe deals +1d8 Damage."
},
thedruidsleep: {
class: "Druid",
fullname: "The Druid Sleep",
trigger: "When you take this move, the next opportunity that you have safety and time to spend in an appropriate location, you may attune yourself to a new land.",
details: "This Effect occurs only once and The GM will tell you how long it will take and what cost you must pay. From then on, you are considered to be Born of the Soil in both lands."
},
thescalesoflifeanddeath: {
class: "Cleric",
fullname: "The Scales of Life and Death",
trigger: "When someone takes their last breath in your presence",
details: "They take +1 to the roll."
},
thingtalker: {
class: "Druid",
fullname: "Thing-Talker",
details: "You see the spirits in the sand, the sea and the stone. You may now apply your Spirit Tongue, shapeshifting and Studied Essence to inanimate natural objects (plants and rocks) or creatures made thereof, as well as animals. Thing-talker forms can be exact copies or can be mobile vaguely humanoid-shaped entities."
},
throughdeathseyes: {
class: "Fighter",
fullname: "Through Death's Eyes",
trigger: "When you go into battle",
roll: "WIS",
success: "Name someone who will live AND someone who will die. Name NPCs, not player characters. The GM will make your vision come true, if it’s even remotely possible.",
partial: "Name someone who will live OR someone who will die. Name NPCs, not player characters. The GM will make your vision come true, if it’s even remotely possible.",
miss: "You see your own death and consequently take -1 ongoing throughout the battle."
},
trapexpert: {
class: "Thief",
fullname: "Trap Expert",
trigger: "When you spend a moment to survey a dangerous area",
roll: "DEX",
success: "Hold 3.",
partial: "Hold 1.",
miss: "Hold 0.",
details: "Spend your hold as you walk through the area to ask these questions:\n\n• Is there a trap here and if so, what activates it?\n• What does the trap do when activated?\n• What else is hidden here?\n"
},
tricksofthetrade: {
class: "Thief",
fullname: "Tricks of the Trade",
trigger: "When you pick locks or pockets or disable traps",
roll: "DEX",
success: "You do it, no problem.",
partial: "You do it, but the GM will offer you two options between suspicion, danger, or cost."
},
turnundead: {
class: "Cleric",
fullname: "Turn Undead",
trigger: "When you hold your holy symbol aloft and call on your deity for protection",
roll: "WIS",
success: "So long as you continue to pray and brandish your holy symbol, no undead may come within reach of you. You also momentarily daze intelligent undead, and cause mindless undead to flee.",
partial: "So long as you continue to pray and brandish your holy symbol, no undead may come within reach of you.",
miss: "There is no effect.",
details: "Aggression breaks the effects and they are able to act as normal. Intelligent undead may still find ways to harry you from afar. They’re clever like that."
},
underdog: {
class: "Thief",
fullname: "Underdog",
trigger: "When you're outnumbered",
details: "You have +1 armor."
},
unforgettableface: {
class: "Bard",
fullname: "Unforgettable Face",
trigger: "When you meet someone you’ve met before (your call) after some time apart",
details: "You take +1 forward against them."
},
unnaturalally: {
class: "Ranger",
fullname: "Unnatural Ally",
details: "Your Animal Companion is a monster, not an animal. Describe it. Give it +2 ferocity and +1 instinct, plus a new training."
},
viciousblast: {
class: "Bard",
fullname: "Vicious Blast",
trigger: "When you grant bonus Damage with Arcane Art",
details: "You grant an extra +2d4 Damage."
},
viciouscacophony: {
class: "Bard",
fullname: "Vicious Cacophony",
trigger: "When you grant bonus Damage with Arcane Art",
details: "You grant an extra +1d4 Damage."
},
vipersfangs: {
class: "Ranger",
fullname: "Viper's Fangs",
trigger: "When you strike an enemy with two Weapons at once",
details: "Add an extra 1d8 Damage for your off-hand strike."
},
vipersstrike: {
class: "Ranger",
fullname: "Viper’s Strike",
trigger: "When you strike an enemy with two Weapons at once",
details: "Add an extra 1d4 Damage for your off-hand strike."
},
voiceofauthority: {
class: "Paladin",
fullname: "Voice of Authority",
details: "Take +1 to order Hirelings."
},
wealthandtaste: {
class: "Thief",
fullname: "Wealth and Taste",
trigger: "When you make a show of flashing around your most valuable possession",
details: "Choose someone present. They will do anything they can to obtain your item or one like it."
},
weatherweaver: {
class: "Druid",
fullname: "Weather Weaver",
trigger: "When you are under open skies when the sun rises",
details: "The GM will ask you what the weather will be that day. Tell them whatever you like; it comes to pass."
},
welltrained: {
class: "Ranger",
fullname: "Well-Trained",
details: "Choose another training for your Animal Companion."
},
wildempathy: {
class: "Ranger",
fullname: "Wild Empathy",
details: "You can speak with and understand animals."
},
wildspeech: {
class: "Ranger",
fullname: "Wild Speech",
details: "You can speak with and understand any non-magical, non-planar creature."
},
worldtalker: {
class: "Druid",
fullname: "World-Talker",
details: "You see the patterns that make up the fabric of The World. You may now apply your Spirit Tongue, Shapeshifter and Studied Essence moves to pure elements—fire, water, air and earth."
}
}
// ---- Start worker scripts ----- //
on("sheet:opened", function() {
getAttrs(["character_class", "isNPC"], function(v) {
if (v.isNPC != "1") {
update = {};
if (v.character_class == null || v.character_class == "") {
update["tip_confirm_flag"] = "0";
} else {
update["tip_confirm_flag"] = "1";
}
setAttrs(update);
}
});
});
on("clicked:bard", function(eventinfo) {
setupClass("Bard");
});
on("clicked:cleric", function(eventinfo) {
setupClass("Cleric");
});
on("clicked:druid", function(eventinfo) {
setupClass("Druid");
});
on("clicked:fighter", function(eventinfo) {
setupClass("Fighter");
});
on("clicked:paladin", function(eventinfo) {
setupClass("Paladin");
});
on("clicked:ranger", function(eventinfo) {
setupClass("Ranger");
});
on("clicked:thief", function(eventinfo) {
setupClass("Thief");
});
on("clicked:wizard", function(eventinfo) {
setupClass("Wizard");
});
on("clicked:cancelclass", function(eventinfo) {
setAttrs({tip_confirm_flag: 1}, "silent");
});
on("change:strength change:debil_weak", function() {
getAttrs(["strength", "debil_weak"], function(values) {
setAttrs({
calc_strength_mod: calculateMod(values.strength) - values.debil_weak
});
});
});
on("change:dexterity change:debil_shaky", function() {
getAttrs(["dexterity", "debil_shaky"], function(values) {
setAttrs({
calc_dexterity_mod: calculateMod(values.dexterity) - values.debil_shaky
});
});
});
on("change:constitution change:debil_sick", function() {
getAttrs(["constitution", "debil_sick"], function(values) {
setAttrs({
calc_constitution_mod: calculateMod(values.constitution) - values.debil_sick
});
});
});
on("change:intelligence change:debil_stunned", function() {
getAttrs(["intelligence", "debil_stunned"], function(values) {
setAttrs({
calc_intelligence_mod: calculateMod(values.intelligence) - values.debil_stunned
});
});
});
on("change:wisdom change:debil_confused", function() {
getAttrs(["wisdom", "debil_confused"], function(values) {
setAttrs({
calc_wisdom_mod: calculateMod(values.wisdom) - values.debil_confused
});
});
});
on("change:charisma change:debil_scarred", function() {
getAttrs(["charisma", "debil_scarred"], function(values) {
setAttrs({
calc_charisma_mod: calculateMod(values.charisma) - values.debil_scarred
});
});
});
on("change:page", function() {
getAttrs(["page"], function(v) {
setAttrs({calc_page:v.page});
});
});
on("change:isNPC", function () {
getAttrs(["isNPC", "character_class"], function(v) {
if (v.isNPC == "1") {
setAttrs({calc_isNPC: v.isNPC, tip_confirm_flag: 1});
} else {
if (v.character_class == null || v.character_class == "") {
setAttrs({calc_isNPC: v.isNPC, tip_confirm_flag: 0});
} else {
setAttrs({calc_isNPC: v.isNPC, tip_confirm_flag: 1});
}
}
});
})
var calculateMod = function(attribute) {
if (attribute < 4)
return -3;
if (attribute < 6)
return -2;
if (attribute < 9)
return -1;
if (attribute < 13)
return 0;
if (attribute < 16)
return 1;
if (attribute < 18)
return 2;
if (attribute >= 18)
return 3;
return 0;
};
var statnameToFreeform = function(statname) {
if (statname == "--") {
return "0[no stat]";
}
if (statname == "STR") {
return "@{strength_mod}[strength]";
}
if (statname == "DEX") {
return "@{dexterity_mod}[dexterity]";
}
if (statname == "CON") {
return "@{constitution_mod}[constitution]";
}
if (statname == "INT") {
return "@{intelligence_mod}[intelligence]";
}
if (statname == "WIS") {
return "@{wisdom_mod}[wisdom]";
}
if (statname == "CHA") {
return "@{charisma_mod}[charisma]";
}
if (statname == "ASK") {
return "@{statmod_query}"
}
return "0[no stat]";
}
// Spell is the name of the compendium page to get.
var addSpell = function(spell, rowid = 0) {
var newspellid = rowid;
if (!rowid) {
newspellid = generateRowID();
}
console.log("Adding Spell: " + spell);
getCompendiumPage(spell, function(page) {
console.log("Got compendium page for " + spell);
if (page["data"]) {
var data = page["data"];
console.log("dropping " + spell);
console.log(data);
var prefix = "repeating_spells_" + newspellid + "_";
var attrs = {};
attrs[prefix + "spellname_base"] = page["name"];
attrs[prefix + "spell_tags"] = data["Tags"] || "";
attrs[prefix + "comp_spell_level"] = data["Level"] || "0";
attrs[prefix + "comp_fullroll"] = data["Roll"] || "";
attrs[prefix + "spelldetails"] = data["Details"] || "";
// Don't auto-expand gear from compendium.
attrs[prefix + "expand_spell"] = 0;
setAttrs(attrs);
}
});
}
// Gear is the Name of the Compendium Page to get.
var addGear = function(gear, rowid = 0) {
var newgearid = rowid;
if (!rowid) {
newgearid = generateRowID();
}
console.log("Adding Gear: " + gear);
getCompendiumPage(gear, function(page) {
console.log("Got compendium page for " + gear);
if (page["data"]) {
var data = page["data"];
var prefix = "repeating_gear_" + newgearid + "_";
var attrs = {};
attrs[prefix + "gearname_base"] = page["name"];
attrs[prefix + "gear_tags"] = data["Tags"] || "";
attrs[prefix + "gear_value"] = data["Value"] || "0";
attrs[prefix + "gear_type"] = data["Type"] || "Item";
attrs[prefix + "gear_weight"] = data["Weight"] || "0";
attrs[prefix + "gear_damage"] = data["Damage"] || "0";
attrs[prefix + "gear_base_armor"] = data["Armor"] || "0";
attrs[prefix + "gear_add_armor"] = data["Armor Mod"] || "0";
attrs[prefix + "geardetails"] = data["Details"] || "";
// Don't auto-expand gear from compendium.
attrs[prefix + "expand_gear"] = 0;
setAttrs(attrs);
}
});
}
// move is the shortname, no special chars, spaces, all lowercase.
var addMove = function(move, rowid = 0) {
if (dwMoves[move]) {
var newmoveid = rowid;
if (!rowid) {
newmoveid = generateRowID();
}
var prefix = "repeating_moves_" + newmoveid + "_";
var attrs = {};
attrs[prefix + "movename_base"] = dwMoves[move].fullname;
if (dwMoves[move].trigger) attrs[prefix + "movetrigger"] = dwMoves[move].trigger;
if (dwMoves[move].roll && dwMoves[move].roll != "NONE") {
if (dwMoves[move].roll) attrs[prefix + "movestat"] = statnameToFreeform(dwMoves[move].roll);
if (dwMoves[move].success) attrs[prefix + "movesuccess"] = dwMoves[move].success;
if (dwMoves[move].partial) attrs[prefix + "movepartial"] = dwMoves[move].partial;
if (dwMoves[move].miss) attrs[prefix + "movemiss"] = dwMoves[move].miss;
attrs[prefix + "move_doroll"] = 1;
} else if (!dwMoves[move].roll || dwMoves[move].roll == "NONE") {
attrs[prefix + "move_doroll"] = 0;
}
if (dwMoves[move].details) attrs[prefix + "movedetails"] = dwMoves[move].details;
// Don't need the move expanded if it was auto added.
if (rowid == 0) {
attrs[prefix + "expand_move"] = 0;
}
setAttrs(attrs);
}
}
var addBasicMoves = function() {
addMove("hackandslash");
addMove("volley");
addMove("parley");
addMove("defydanger");
addMove("defend");
addMove("discernrealities");
addMove("spoutlore");
addMove("aidorinterfere");
addMove("lastbreath");
}
var parseRoll = function(rollText) {
var rollPieces = [];
rollPieces = rollText.split("d");
rollPieces[1] = "d" + rollPieces[1];
return rollPieces;
}
var shortName = function(fullName) {
var shortened = fullName.toLowerCase();
shortened = shortened.replace(/\W/g, '');
return shortened;
}
on("change:repeating_moves:movename_base", function() {
getAttrs(["repeating_moves_movename_base"], function(values) {
setAttrs({
repeating_moves_move_name: values.repeating_moves_movename_base
});
});
});
on("change:repeating_spells:spellname_base", function() {
getAttrs(["repeating_spells_spellname_base"], function(v) {
setAttrs({
repeating_spells_spell_name: v.repeating_spells_spellname_base
});
});
});
on("change:repeating_spells", function(eventInfo) {
getAttrs(["level0_type_base"], function(v) {
if (eventInfo.sourceAttribute.split("_").length > 3) {
setAttrs({
repeating_spells_level0_type: v.level0_type_base
}, "silent");
}
getSectionIDs("repeating_spells", function(ids) {
var preparedLevels = [];
for(var i=0; i < ids.length; i++) {
var attr = "repeating_spells_" + ids[i] + "_calc_prepval";
preparedLevels.push(attr);
}
var newLevelsPrepared = 0;
getAttrs(preparedLevels, function(v) {
_.each(v, function(prepval, attrName) {
newLevelsPrepared = newLevelsPrepared + Number(prepval);
});
setAttrs({
levels_prepared: newLevelsPrepared
});
});
});
});
});
on("change:repeating_spells:spell_prepared", function() {
getAttrs(["repeating_spells_spell_prepared","repeating_spells_spell_level"], function(v) {
if (v.repeating_spells_spell_prepared > 0) {
setAttrs({repeating_spells_calc_prepval: v.repeating_spells_spell_level});
} else {
setAttrs({repeating_spells_calc_prepval: 0})
}
});
});
on("change:repeating_spells:spell_level", function() {
getAttrs(["repeating_spells_spell_prepared", "repeating_spells_spell_level"], function(v) {
if (v.repeating_spells_spell_prepared > 0 && v.repeating_spells_spell_level == 0) {
setAttrs({repeating_spells_spell_prepared: 0});
}
if (v.repeating_spells_spell_prepared > 0) {
setAttrs({repeating_spells_calc_prepval: v.repeating_spells_spell_level});
}
});
});
on("change:repeating_spells:comp_spell_level", function() {
getAttrs(["repeating_spells_comp_spell_level", "repeating_spells_comp_fullroll"], function(v) {
if (v.repeating_spells_comp_spell_level >= 0) {
setAttrs({
repeating_spells_spell_level:v.repeating_spells_comp_spell_level,
repeating_spells_comp_spell_level: -1
});
if (v.repeating_spells_comp_fullroll != "" && v.repeating_spells_comp_fullroll != null && v.repeating_spells_comp_fullroll != "") {
var rollPieces = [];
rollPieces = parseRoll(v.repeating_spells_comp_fullroll);
setAttrs({
repeating_spells_spell_diecount: rollPieces[0],
repeating_spells_spell_die: rollPieces[1],
repeating_spells_spell_doroll: 1
});
} else {
setAttrs({repeating_spells_spell_doroll: 0});
}
}
});
});
/*
on("remove:repeating_spells", function(eventinfo) {
if (eventinfo.removedInfo[eventinfo['sourceAttribute']+'_spell_prepared'] > 0) {
getAttrs(["levels_prepared"], function(v) {
var finalPreparedSpells = v.levels_prepared - 1;
setAttrs({levels_prepared: finalPreparedSpells});
});
}
});
*/
on("change:repeating_gear:gearname_base", function() {
getAttrs(["repeating_gear_gearname_base"], function(values) {
setAttrs({
repeating_gear_gear_name: values.repeating_gear_gearname_base
});
});
});
on("change:repeating_gear:comp_gear_type", function() {
getAttrs(["repeating_gear_comp_gear_type"], function(v) {
setAttrs({repeating_gear_gear_type: v.repeating_gear_comp_gear_type});
});
});
on("change:repeating_gear:gear_type", function() {
getAttrs(["repeating_gear_gear_type"], function(v) {
setAttrs({repeating_gear_calc_gear_type: v.repeating_gear_gear_type});
if (v.repeating_gear_gear_type == "Weapon") {
setAttrs({repeating_gear_gear_doroll: 1});
} else {
setAttrs({repeating_gear_gear_doroll: 0});
}
});
});
on("change:repeating_gear:gear_weight change:repeating_gear:gear_quantity", function() {
getAttrs(["repeating_gear_gear_weight", "repeating_gear_gear_quantity"], function(v) {
var weight = v.repeating_gear_gear_weight;
var quantity = v.repeating_gear_gear_quantity;
if (isNaN(weight)) weight = 0;
if (isNaN(quantity)) quantity = 0;
setAttrs({
repeating_gear_calc_gear_weight: +weight * +quantity
});
})
})
on("change:repeating_gear:calc_gear_weight remove:repeating_gear", function() {
getSectionIDs("repeating_gear", function(ids) {
var gearWeights = [];
for(var i=0; i < ids.length; i++) {
gearWeights.push("repeating_gear_" + ids[i] + "_calc_gear_weight");
}
getAttrs(gearWeights, function(v) {
var newLoad = 0;
_.each(v, function(weight, attrName) {
newLoad = newLoad + Number(weight);
});
setAttrs({
calc_load: newLoad
});
});
});
});
on("change:repeating_moves:move_doroll", function() {
getAttrs(["repeating_moves_move_doroll", "repeating_moves_movestat"], function(v) {
if (v.repeating_moves_move_doroll != "1" && v.repeating_moves_movestat == "@{statmod_query}")
setAttrs({repeating_moves_movestat: 0});
});
});
on("change:level0_type_base", function() {
getAttrs(["level0_type_base"], function(v) {
getSectionIDs("repeating_spells", function(ids) {
for(var i=0; i < ids.length; i++) {
var newRowAttr = {};
newRowAttr["repeating_spells_" + ids[i] + "_level0_type"] = v.level0_type_base;
setAttrs(newRowAttr);
}
});
});
});
on("change:subsection_priority_base", function() {
getAttrs(["subsection_priority_base"], function(v) {
setAttrs({subsection_priority: v.subsection_priority_base});
});
});
// --- Equipment Mods Calcs --- //
// Set Mods within each repitem
on("change:repeating_gear:gear_equipped change:repeating_gear:gear_type change:repeating_gear:gear_base_armor change:repeating_gear:gear_add_armor change:repeating_gear:gear_damage", function() {
getAttrs(["repeating_gear_gear_equipped", "repeating_gear_gear_type", "repeating_gear_gear_base_armor", "repeating_gear_gear_add_armor", "repeating_gear_gear_damage"], function(v) {
if (v.repeating_gear_gear_type == "Armor" && v.repeating_gear_gear_equipped > 0) {
var armor = v.repeating_gear_gear_base_armor;
if (armor === undefined || armor == "") armor = 0;
setAttrs({repeating_gear_calc_gear_armor: armor});
} else {
setAttrs({repeating_gear_calc_gear_armor: 0});
}
if (v.repeating_gear_gear_type == "Armor" && v.repeating_gear_gear_equipped > 0) {
var armormod = v.repeating_gear_gear_add_armor;
if (armormod === undefined || armormod == "") armormod = 0;
setAttrs({repeating_gear_calc_gear_armormod: armormod});
} else {
setAttrs({repeating_gear_calc_gear_armormod: 0});
}
if (v.repeating_gear_gear_type == "Weapon" && v.repeating_gear_gear_equipped > 0) {
var damage = v.repeating_gear_gear_damage;
if (damage === undefined || damage == "") damage = 0;
setAttrs({repeating_gear_calc_gear_dmg: damage});
} else {
setAttrs({repeating_gear_calc_gear_dmg: 0});
}
});
});
// Set equipment mods from all sections whenever one changes
on("change:repeating_gear", function(eventInfo) {
getSectionIDs("repeating_gear", function(ids) {
var dmgMods = [];
for(var i=0; i < ids.length; i++) {
var attr = "repeating_gear_" + ids[i] + "_calc_gear_dmg";
dmgMods.push(attr);
}
var armMods = [];
for(var i=0; i < ids.length; i++) {
var attr = "repeating_gear_" + ids[i] + "_calc_gear_armormod";
armMods.push(attr);
}
var armorVals = [];
for(var i=0; i < ids.length; i++) {
var attr = "repeating_gear_" + ids[i] + "_calc_gear_armor";
armorVals.push(attr);
}
getAttrs(armMods, function(v) {
var newGearArmorMod = "0";
_.each(v, function(val, attrName) {
newGearArmorMod = newGearArmorMod.concat("+").concat("(" + val + ")");
});
newGearArmorMod = "(" + newGearArmorMod + ")";
newGearArmorMod = newGearArmorMod.replace(/\+\(0\)/g, "");
console.log("Setting armormod to: " + newGearArmorMod)
setAttrs({
equipment_armormod: newGearArmorMod
});
});
getAttrs(dmgMods, function(v) {
var newGearDmg = "0";
_.each(v, function(val, attrName) {
if (+val > newGearDmg) newGearDmg = val;
});
newGearDmg = "(" + newGearDmg + ")[Equipped Weapon]";
setAttrs({
equipment_dmg: newGearDmg
});
});
getAttrs(armorVals, function(v) {
var newGearArmor = "0";
_.each(v, function(val, attrName) {
if (+val > newGearArmor) newGearArmor = val;
});
newGearArmor = "(" + newGearArmor + ")";
setAttrs({
equipment_armor: newGearArmor
});
});
});
});
// -------------------- //
// Global Mods Calcs //
// -------------------- //
// Set Ongoing
on("change:repeating_gmods:enable_modifier change:repeating_gmods:ongoing_on change:repeating_gmods:gmod_ongoing_mod", function() {
getAttrs(["repeating_gmods_enable_modifier", "repeating_gmods_ongoing_on", "repeating_gmods_gmod_ongoing_mod"], function(v) {
if (v.repeating_gmods_ongoing_on > 0 && v.repeating_gmods_enable_modifier > 0) {
var mod = v.repeating_gmods_gmod_ongoing_mod;
if (mod === undefined || mod == "") mod = 0;
setAttrs({repeating_gmods_calc_ongoing: mod});
} else {
setAttrs({repeating_gmods_calc_ongoing: 0});
}
if (!v.repeating_gmods_enable_modifier > 0) {
setAttrs({repeating_gmods_calc_ongoing: 0});
}
});
});
// Set 1d6+1d8 (barbarian dice)
on("change:repeating_gmods:enable_modifier change:repeating_gmods:barbdice_on change:repeating_gmods:gmod_rolltype", function() {
getAttrs(["repeating_gmods_enable_modifier", "repeating_gmods_barbdice_on", "repeating_gmods_gmod_rolltype", "rolltype"], function(v) {
if (v.repeating_gmods_barbdice_on > 0 && v.repeating_gmods_enable_modifier > 0) {
var rolltype = "1d6+1d8";
if (rolltype === undefined || rolltype == "") mod = "2d6";
setAttrs({rolltype: rolltype});
} else {
setAttrs({rolltype: "2d6"});
}
if (!v.repeating_gmods_enable_modifier > 0) {
setAttrs({rolltype: "2d6"});
}
});
});
// Set Damage Mod
on("change:repeating_gmods:enable_modifier change:repeating_gmods:dmg_on change:repeating_gmods:gmod_dmg_diecount change:repeating_gmods:gmod_dmg_die change:repeating_gmods:gmod_dmg_mod", function() {
getAttrs(["repeating_gmods_enable_modifier", "repeating_gmods_dmg_on", "repeating_gmods_gmod_dmg_diecount", "repeating_gmods_gmod_dmg_die", "repeating_gmods_gmod_dmg_mod"], function(v) {
if (v.repeating_gmods_dmg_on > 0 && v.repeating_gmods_enable_modifier > 0) {
var dieCount = v.repeating_gmods_gmod_dmg_diecount;
var dmgMod = v.repeating_gmods_gmod_dmg_mod;
var dmgDie = v.repeating_gmods_gmod_dmg_die;
if (dieCount === undefined || dieCount == "") dieCount = 0;
if (Number(dieCount) == 0) dmgDie = 0;
if (dmgMod === undefined || dmgMod == "") dmgMod = 0;
if (Number(dieCount) < 0) {
dmgRoll = "0".concat(dieCount).concat(dmgDie).concat("+").concat(dmgMod);
} else {
dmgRoll = "".concat(dieCount).concat(dmgDie).concat("+").concat(dmgMod);
}
setAttrs({repeating_gmods_calc_dmg: dmgRoll});
}
else {
setAttrs({repeating_gmods_calc_dmg: 0});
}
if (!v.repeating_gmods_enable_modifier > 0) {
setAttrs({repeating_gmods_calc_dmg: 0});
}
});
});
// Set Armor Mod
on("change:repeating_gmods:enable_modifier change:repeating_gmods:arm_on change:repeating_gmods:gmod_arm_mod", function() {
getAttrs(["repeating_gmods_enable_modifier", "repeating_gmods_arm_on", "repeating_gmods_gmod_arm_mod"], function(v) {
if (v.repeating_gmods_arm_on > 0 && v.repeating_gmods_enable_modifier > 0) {
var mod = v.repeating_gmods_gmod_arm_mod;
if (mod === undefined || mod == "") mod = 0;
setAttrs({repeating_gmods_calc_arm: mod});
} else {
setAttrs({repeating_gmods_calc_arm: 0});
}
if (!v.repeating_gmods_enable_modifier > 0) {
setAttrs({repeating_gmods_calc_arm: 0});
}
});
});
// Set global mods from all sections whenever one changes
on("change:repeating_gmods", function(eventInfo) {
getSectionIDs("repeating_gmods", function(ids) {
var ongoingMods = [];
for(var i=0; i < ids.length; i++) {
var attr = "repeating_gmods_" + ids[i] + "_calc_ongoing";
ongoingMods.push(attr);
}
var dmgMods = [];
for(var i=0; i < ids.length; i++) {
var attr = "repeating_gmods_" + ids[i] + "_calc_dmg";
dmgMods.push(attr);
}
var armMods = [];
for(var i=0; i < ids.length; i++) {
var attr = "repeating_gmods_" + ids[i] + "_calc_arm";
armMods.push(attr);
}
getAttrs(ongoingMods, function(v) {
var newGlobOngoing = "0";
_.each(v, function(val, attrName) {
newGlobOngoing = newGlobOngoing.concat("+").concat("(" + val + ")");
});
newGlobOngoing = "(" + newGlobOngoing + ")";
newGlobOngoing = newGlobOngoing.replace(/\+\(0\)/g, "");
setAttrs({
global_ongoing: newGlobOngoing
});
});
getAttrs(dmgMods, function(v) {
var newGlobDmg = "0";
_.each(v, function(val, attrName) {
newGlobDmg = newGlobDmg.concat("+").concat("(" + val + ")");
});
newGlobDmg = "(" + newGlobDmg + ")";
newGlobDmg = newGlobDmg.replace(/\+\(0\)/g, "");
setAttrs({
global_dmg: newGlobDmg
});
});
getAttrs(armMods, function(v) {
var newGlobArm = "0";
_.each(v, function(val, attrName) {
newGlobArm = newGlobArm.concat("+").concat("(" + val + ")");
});
newGlobArm = "(" + newGlobArm + ")";
newGlobArm = newGlobArm.replace(/\+\(0\)/g, "");
setAttrs({
global_arm: newGlobArm
});
});
});
});
on("change:repeating_bonds", function(eventInfo) {
getSectionIDs("repeating_bonds", function(ids) {
if (ids.length == 0){
setAttrs({
bond_query: "(0)[Other Bond]"
});
return;
}
var attrs = [];
for(var i=0; i < ids.length; i++) {
var attr = "repeating_bonds_" + ids[i] + "_bond_simple";
attrs.push(attr);
}
console.log(ids);
getAttrs(attrs, function(v) {
var bonds = {};
_.each(v, function(val, attrName) {
if (val in bonds){
bonds[val] += 1;
}else{
bonds[val] = 1;
}
});
var query = "?{Bond";
_.each(bonds, function(count, name) {
query = query.concat(`|${name}, (${count})[Bonds with ${name}]`);
});
query = query.concat("|Other, (0)[Other Bond]}");
setAttrs({
bond_query: query
});
});
});
});
// ---------------------- //
// -- Compendium Drops -- //
// ---------------------- //
on("change:drop_category", function(eventinfo) {
if(eventinfo.newValue === "Monsters") {
// Handle query for changing to an NPC if not already one.
getAttrs(["isNPC", "drop_name"], function(v) {
if (v.isNPC) {
setAttrs({character_name: v.drop_name});
}
});
}
else {
handle_drop(eventinfo.newValue);
}
});
var handle_drop = function(category, eventinfo) {
console.log("Handling drop");
console.log(category);
setAttrs({drop_category: ""}, "silent", function() {
getAttrs(["drop_name", "drop_data", "drop_content"], function(v) {
pagedata = {};
try {
pagedata = JSON.parse(v.drop_data);
} catch(e) {
pagedata = v.drop_data;
}
console.log(pagedata);
if (category === "Moves") {
addMove(pagedata["data-Shortname"]);
} else if (category === "Equipment") {
addGear(v.drop_name);
} else if (category === "Spells") {
addSpell(v.drop_name);
} else if (category === "Classes") {
var update = {};
update["comp_name"] = v.drop_name;
update["comp_damagedie"] = pagedata["Base Damage"];
update["comp_classmoves"] = pagedata["data-Basic Moves"];
update["comp_load"] = pagedata["Load"];
setAttrs(update);
//setAttrs({comp_name: "dropped"}, "silent");
}
});
});
}
// Move Drop
on("change:repeating_moves:comp_shortname", function(eventInfo) {
});
// NPC Drop
on("change:comp_NPC_moves", function() {
getAttrs(["comp_NPC_moves"], function(v) {
var attrs = {};
movesList = JSON.parse(v.comp_NPC_moves);
for (i = 0; i < movesList.length; i++) {
var newid = generateRowID();
attrs["repeating_NPCmoves_" + newid + "_NPC_move"] = movesList[i];
}
setAttrs(attrs);
});
});
// ------------------------------------------ //
// -- Main Class Drop Compilation Function -- //
// ------------------------------------------ //
on("change:comp_name", function() {
getAttrs(["populate_moves", "comp_name", "comp_damagedie", "comp_classmoves", "comp_load", "strength_mod"], function(v) {
if (v.comp_name != "dropped") {
// Populate all basic moves.
if (v.populate_moves == "all") {
addBasicMoves();
setAttrs({
populate_moves: "classonly"
});
}
// Populate the Class's starting moves
if (v.populate_moves == "all" || v.populate_moves == "classonly") {
var startingMoves = []
startingMoves = JSON.parse(v.comp_classmoves);
for (var i = 0, len = startingMoves.length; i < len; i++) {
addMove(shortName(startingMoves[i]));
}
setAttrs({
damagedie: v.comp_damagedie
});
}
setAttrs({character_class: v.comp_name});
}
});
setAttrs({comp_name: "dropped", tip_confirm_flag: 1}, "silent");
});
// Classname is the name of the Compendium Page.
var setupClass = function(classname) {
getCompendiumPage(classname, function(page) {
if (page["data"]) {
var update = {};
var data = page["data"];
update["character_class"] = classname;
update["comp_name"] = classname;
update["comp_damagedie"] = data["Base Damage"];
update["comp_classmoves"] = data["data-Basic Moves"];
update["comp_load"] = data["Load"];
setAttrs(update);
}
});
};
</script>