Files
roll20-character-sheets/Shadowrun Sixth World/Shadowrun6thEdition.html
T
James Culp 0ef74a9910 Translation work
Added i18n values for translating many placeholders and some other labels throughout the Player facing sheet.  Thanks to Christian for his hard work translating the sheet on Crowdin and compiling the list for me to add.
2025-03-16 12:41:50 -04:00

14560 lines
817 KiB
HTML

<div class="compendium-drop-target npcs grunts contacts vehicles drones spirits sprites critters hosts">
<input type="hidden" value="" accept="Category" name="attr_compendium_drop_category"/>
<input type="hidden" value="" accept="Name" name="attr_compendium_drop_name"/>
<input type="hidden" value="" accept="data" name="attr_canvas_drop_data"/>
<input type="hidden" value="" accept="dropSubhead" name="attr_compendium_drop_header">
<input type="hidden" value="" accept="Content" name="attr_compendium_drop_content">
</div>
<div id='SR6WE' class="compendium-drop-target">
<div class="drop-zone">
<span>Dragging From Compendium</span>
</div>
<input class="sheet_type" name="attr_sheet_type" type="hidden" value="pc"/>
<input class="character-type" name="attr_flag_special" type="hidden" value="mundane"/>
<input class="enable-modifiers" name="attr_enable_modifiers" type="hidden" value="0"/>
<input class="compendium-drop-data" type="hidden" accept="data" name="attr_compendium_drop_data" value="">
<input class="compendium-drop-content" type="hidden" accept="Content" name="attr_compendium_drop_content" value="">
<input class="compendium-drop-category" type="hidden" accept="Category" name="attr_compendium_drop_category" value="">
<div class="pc">
<img class="shadowrun-logo" alt="Shadowrun sixth edition logo" src="https://s3.amazonaws.com/files.d20.io/images/204802539/QInmmma8HvUBA90c8e8H8Q/max.png?1614545502"/>
<div class="tabs">
<div class="header-names">
<h1 data-i18n="character">Character</h1>
<label data-i18n-title="character name" title="character name">
<input type="text" name="attr_character_name" i18n-data-placeholder="charactername" placeholder="Character name" title="@{character_name}"/>
</label>
<h1 data-i18n="player">Player</h1>
<label data-i18n-title="player name" title="player name">
<input type="text" name="attr_player_name" i18n-data-placeholder="playername" placeholder="Player name" title="@{player_name}"/>
</label>
</div>
<div class="header-toggles">
<span>&nbsp;</span>
<h2 data-i18n="wgm" data-i18n-title="whispergm">/w GM</h2>
<label class="switch" data-i18n-title="whispergm" title="Whisper rolls to GM">
<input class="whisper-toggle" name="attr_gm_toggle" type="checkbox" value="/w gm"/><span class="slider"></span>
</label>
<h2 data-i18n-title="wounds" data-i18n="wounds">Wounds</h2>
<label class="switch" data-i18n-title="wounds" title="Wounds">
<input class="whisper-toggle" name="attr_wounds_toggle" type="checkbox" value="@{wounds}"/><span class="slider"></span>
</label>
<h2 data-i18n-title="dicepoolmodifiers" data-i18n="modifiers">Modifiers</h2>
<label class="switch" data-i18n-title="dicepoolmodifiers" title="Dicepool Modifiers">
<input class="whisper-toggle" name="attr_modifiers_toggle" type="checkbox" value="?{Modifiers +/-|0}"/><span class="slider"></span>
</label>
<h2 data-i18n-title="addedgetodicepool">Edge</h2>
<label class="switch" data-i18n-title="addedgetodicepool" title="Add Edge to your dice pool and exploding 6's">
<input class="whisper-toggle" name="attr_edge_toggle" type="checkbox" value="@{edge}"/><span class="slider"></span>
</label>
<h2 data-i18n-title="wilddie" data-i18n="wdie">Wild Die</h2>
<label class="switch" data-i18n-title="wilddie" title="Change Last # Dice To Wild Dice">
<input class="whisper-toggle" name="attr_wild_die" type="checkbox" value="?{# Wild Dice?|0}"/><span class="slider"></span>
</label>
<span>&nbsp;</span>
</div>
<div class="header-navtabs">
<input name="attr_tab" type="hidden" value="core"/>
<h1>&nbsp;</h1>
<button name="act_extended_start" class="icon pictos" title="Start Extended Test" type="action" value="">r</button>
<button name="act_d6" class="icon d6" title="Roll D6s" type="action" value="">L</button>
<button class="pictos" name="act_tab_options" title="@{tab}" type="action"><span style="font-family: pictos;">y</span></button>
<button data-i18n="core" name="act_tab_core" type="action" title="@{tab}">core</button>
<button data-i18n="arms" name="act_tab_arms" type="action" title="@{tab}">arms</button>
<button data-i18n="augs" name="act_tab_augs" type="action" title="@{tab}">augs</button>
<button data-i18n="gear" name="act_tab_gear" type="action" title="@{tab}">gear</button>
<button data-i18n="magic" name="act_tab_magic" type="action" title="@{tab}">magic</button>
<button data-i18n="matrix" name="act_tab_matrix" type="action" title="@{tab}">matrix</button>
<button data-i18n="social" name="act_tab_social" type="action" title="@{tab}">social</button>
<button data-i18n="vehicle" name="act_tab_vehicle" type="action" title="@{tab}">vehicle</button>
<button data-i18n="notes" name="act_tab_notes" type="action" title="@{tab}">notes</button>
<button data-i18n="rolls" name="act_tab_rolls" type="action" title="@{tab}">rolls</button>
</div>
</div>
<input class="options_toggle" name="attr_tab" type="hidden" value="options"/>
<div class="static pc-col">
<div class="pc-row core-info">
<div class="header"><div class="triangle"></div><h1 data-i18n="personal">Personal Data</h1></div>
<div class="border-box">
<div class="pc-box small-box">
<div class="row-long pd-nam">
<h2 data-i18n="namealias">NAME/PRIMARY ALIAS</h2><input type="text" name="attr_character_name" data-i18n-placeholder="name" placeholder="name" title="@{name}" />
</div>
<div class="row-long pd-meta">
<h2 data-i18n="metatype">Metatype</h2><input type="text" name="attr_metatype" data-i18n-placeholder="metatype" placeholder="metatype" title="@{metatype}" />
<h2 data-i18n="ethnicity">Ethnicity</h2><input type="text" name="attr_ethnicity" data-i18n-placeholder="ethnicity" placeholder="ethnicity" title="@{ethnicity}" />
</div>
<div class="row-long pd-age">
<h2 data-i18n="age">Age</h2><input type="text" name="attr_age" data-i18n-placeholder="age" placeholder="age" title="@{age}" />
<h2 data-i18n="sex">Sex</h2><input type="text" name="attr_sex" data-i18n-placeholder="sex" placeholder="sex" title="@{sex}" />
<h2 data-i18n="height-u">Height</h2><input type="text" name="attr_height" data-i18n-placeholder="height-u" placeholder="height" title="@{height}" >
<h2 data-i18n="weight">Weight</h2><input type="text" name="attr_weight" data-i18n-placeholder="weight" placeholder="weight" title="@{weight}" />
</div>
<div class="row-long pd-rep">
<h2 data-i18n="reputation">Reputation</h2><input type="number" name="attr_reputation" placeholder="#" title="@{reputation}" />
<h2 data-i18n="heat">Heat</h2><input type="number" name="attr_heat" placeholder="#" title="@{heat}" />
<h2 class="nuyen">¥</h2><input type="number" name="attr_nuyen" placeholder="0" title="@{nuyen}" />
</div>
<div class="row-long pd-kar">
<h2 data-i18n="karma">Karma</h2><input style="width: 2em;" type="number" name="attr_karma" placeholder="#" title="@{karma}" />
<h2 data-i18n="total karma">Total Karma</h2><input style="width: 2em;" type="number" name="attr_total_karma" placeholder="#" title="@{total_karma}" />
</div>
<div class="row-long pd-kar">
<h2 data-i18n="essence">Essence</h2><input disabled="disabled" style="width: 1.5em !important;" type="number" step="0.01" min="0.00" name="attr_essence_base" value="6" title="@{essence_base}" /> + <h2 data-i18n="essencemodifier">Mod</h2><input style="width: 3em !important;" type="number" step="0.01" min="-6.00" name="attr_essence_mod" placeholder="0" title="@{essence_mod}" /> - <h2 data-i18n="augmentations">Augmentations</h2><span name="attr_aug_essence_cost" title="@{aug_essence_cost}"></span> = <h2 data-i18n="currentessence">Current Essence</h2><span name="attr_essence" title="@{essence}"></span>
</div>
</div>
</div>
</div>
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ START OF ATTRIBUTES ROW ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<div class="pc-row">
<div class="header left-header">
<div class="header htab">
<div class="triangle"></div>
<input class="attributes-toggle" name="attr_attributes_toggle" title="@{attributes_toggle}" type="radio" value="effects"/>
<h1 data-i18n="effects">Effects</h1>
<div class="right-tri"></div>
</div>
<div class="header htab">
<div class="triangle"></div>
<input class="attributes-toggle" name="attr_attributes_toggle" title="@{attributes_toggle}" type="radio" value="attributes"/>
<h1 data-i18n="attributes">Attributes</h1>
</div>
</div>
<div class="border-box">
<input class="attributes-toggle" name="attr_attributes_toggle" title="@{attributes_toggle}" type="hidden" value="attributes" />
<div class="attributes-active">
<div class="pc-box medium-box attr-box">
<input type="checkbox" class="settings-toggle" name="attr_flag_attribute" checked="checked" title="Settings toggle" /><span>x</span>
<div class="attr-col attr-col-left">
<!-- ~~:+: Body :+:~~ -->
<input type="hidden" name="attr_body" value="" />
<button class="btn ui-draggable" name="act_body" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{body}}}{{dice=[[(@{body}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}"><span class="red" data-i18n="body">Body</span></button>
<div class="attr-und">
<div class="settings">
<input type="number" name="attr_body_base" value="1" placeholder="3" title="@{body_base}" /><span class="tiny-span"> + </span>
<input type="number" name="attr_body_modifier" value="" placeholder="0" title="@{body_modifier}" /><span class="tiny-span"> = </span>
<span class="totals" name="attr_display_body" title="@{body}"></span>
</div>
<div class="display"><span name="attr_display_body" title="@{body}"></span></div>
</div>
<!-- ~~:+: Agility :+:~~ -->
<input type="hidden" name="attr_agility" value="" />
<button name="act_agility" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{agility}}}{{dice=[[(@{agility}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span class="red" data-i18n="agility">Agility</span></button>
<div class="attr-und">
<div class="settings">
<input type="number" name="attr_agility_base" value="1" placeholder="3" title="@{agility_base}" /><span class="tiny-span"> + </span>
<input type="number" name="attr_agility_modifier" value="" placeholder="0" title="@{agility_modifier}" /><span class="tiny-span"> = </span>
<span class="totals" name="attr_display_agility" title="@{agility}"></span>
</div>
<div class="display"><span name="attr_display_agility" title="@{agility}"></span></div>
</div>
<!-- ~~:+: Reaction :+:~~ -->
<input type="hidden" name="attr_reaction" value="" />
<button name="act_reaction" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{reaction}}}{{dice=[[(@{reaction}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span class="red" data-i18n="reaction">Reaction</span></button>
<div class="attr-und">
<div class="settings">
<input type="number" name="attr_reaction_base" value="1" placeholder="3" title="@{reaction_base}" /><span class="tiny-span"> + </span>
<input type="number" name="attr_reaction_modifier" value="" placeholder="0" title="@{reaction_modifier}" /><span class="tiny-span"> = </span>
<span class="totals" name="attr_display_reaction" title="@{reaction}"></span>
</div>
<div class="display"><span name="attr_display_reaction" title="@{reaction}"></span></div>
</div>
<!-- ~~:+: Strength :+:~~ -->
<input type="hidden" name="attr_strength" value="" />
<button name="act_strength" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{strength}}}{{dice=[[(@{strength}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span class="red" data-i18n="strength">Strength</span></button>
<div class="attr-und">
<div class="settings">
<input type="number" name="attr_strength_base" value="1" placeholder="3" title="@{strength_base}" /><span class="tiny-span"> + </span>
<input type="number" name="attr_strength_modifier" value="" placeholder="0" title="@{strength_modifier}" /><span class="tiny-span"> = </span>
<span class="totals" name="attr_display_strength" title="@{strength}"></span>
</div>
<div class="display"><span name="attr_display_strength" title="@{strength}"></span></div>
</div>
<!-- ~~:+: Willpower :+:~~ -->
<input type="hidden" name="attr_willpower" value="" />
<button name="act_willpower" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{willpower}}}{{dice=[[(@{willpower}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span data-i18n="willpower">Willpower</span></button>
<div class="attr-und">
<div class="settings">
<input type="number" name="attr_willpower_base" value="1" placeholder="3" title="@{willpower_base}" /><span class="tiny-span"> + </span>
<input type="number" name="attr_willpower_modifier" value="" placeholder="0" title="@{willpower_modifier}" /><span class="tiny-span"> = </span>
<span class="totals" name="attr_display_willpower" title="@{willpower}"></span>
</div>
<div class="display"><span name="attr_display_willpower" title="@{willpower}"></span></div>
</div>
<!-- ~~:+: Logic :+:~~ -->
<input type="hidden" name="attr_logic" value="" />
<button name="act_logic" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{logic}}}{{dice=[[(@{logic}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span data-i18n="logic">Logic</span></button>
<div class="attr-und">
<div class="settings">
<input type="number" name="attr_logic_base" value="1" placeholder="3" title="@{logic_base}" /><span class="tiny-span"> + </span>
<input type="number" name="attr_logic_modifier" value="" placeholder="0" title="@{logic_modifier}" /><span class="tiny-span"> = </span>
<span class="totals" name="attr_display_logic" title="@{logic}"></span>
</div>
<div class="display"><span name="attr_display_logic" title="@{logic}"></span></div>
</div>
<!-- ~~:+: Intuition :+:~~ -->
<input type="hidden" name="attr_intuition" value="" />
<button name="act_intuition" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{intuition}}}{{dice=[[(@{intuition}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span data-i18n="intuition">Intuition</span></button>
<div class="attr-und">
<div class="settings">
<input type="number" name="attr_intuition_base" value="1" placeholder="3" title="@{intuition_base}" /><span class="tiny-span"> + </span>
<input type="number" name="attr_intuition_modifier" value="" placeholder="0" title="@{intuition_modifier}" /><span class="tiny-span"> = </span>
<span class="totals" name="attr_display_intuition" title="@{intuition}"></span>
</div>
<div class="display"><span name="attr_display_intuition" title="@{intuition}"></span></div>
</div>
<!-- ~~:+: Charisma :+:~~ -->
<input type="hidden" name="attr_charisma" value="" />
<button name="act_charisma" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{charisma}}}{{dice=[[(@{charisma}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span data-i18n="charisma">Charisma</span></button>
<div class="attr-und">
<div class="settings">
<input type="number" name="attr_charisma_base" value="1" placeholder="3" title="@{charisma_base}" /><span class="tiny-span"> + </span>
<input type="number" name="attr_charisma_modifier" value="" placeholder="0" title="@{charisma_modifier}" /><span class="tiny-span"> = </span>
<span class="totals" name="attr_display_charisma" title="@{charisma}"></span>
</div>
<div class="display"><span name="attr_display_charisma" title="@{charisma}"></span></div>
</div>
<!-- ~~:+: Edge :+:~~ -->
<button name="act_edge" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{edge}}}{{dice=[[(@{edge}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span data-i18n="edge">Edge</span></button>
<div class="attr-und">
<div class="settings">
<input type="number" name="attr_edge" value="1" placeholder="3" title="@{edge}" />
</div>
<div class="display"><span name="attr_edge" title="@{edge}"></span></div>
</div>
<div class="edg-hex" style="width: 100%;">
<input class="edge-zero" type="hidden" name="attr_edge_hex" value="0"/>
<input class="hex-hider" type="hidden" name="attr_edge_max" value="7"/>
<input type="hidden" name="attr_edge_hex_max" value="7"/>
<input type="checkbox" name="attr_edge_hex" value="1" /><span class="hexagon"></span>
<input type="checkbox" name="attr_edge_hex" value="2" /><span class="hexagon"></span>
<input type="checkbox" name="attr_edge_hex" value="3" /><span class="hexagon"></span>
<input type="checkbox" name="attr_edge_hex" value="4" /><span class="hexagon"></span>
<input type="checkbox" name="attr_edge_hex" value="5" /><span class="hexagon"></span>
<input type="checkbox" name="attr_edge_hex" value="6" /><span class="hexagon"></span>
<input type="checkbox" name="attr_edge_hex" value="7" /><span class="hexagon"></span>
</div>
</div>
<div class="attr-col attr-col-right">
<!-- ~~:+: Magic or Resonance :+:~~ -->
<input type="hidden" name="attr_display_magic" value="" />
<input type="hidden" name="attr_magic_max" value="6" />
<input type="hidden" name="attr_display_resonance" value="" />
<label data-i18n="magicres">Magic/Resonance</label>
<div class="attr-und">
<div class="settings">
<div class="hide-magic">
<input type="number" name="attr_magic_base" placeholder="0" title="@{magic_base}" /><span class="tiny-span"> + </span>
<input type="number" name="attr_magic_modifier" placeholder="0" title="@{magic_modifier}" /><span class="tiny-span"> = </span>
<span class="totals" name="attr_display_magic" title="@{magic}"></span>
</div>
<div class="hide-resonance">
<input type="number" name="attr_resonance_base" placeholder="0" title="@{resonance_base}" /><span class="tiny-span"> + </span>
<input type="number" name="attr_resonance_modifier" placeholder="0" title="@{resonance_modifier}" /><span class="tiny-span"> = </span>
<span class="totals" name="attr_display_resonance" title="@{resonance}"></span>
</div>
</div>
<div class="display">
<div class="hide-magic"><span name="attr_display_magic" title="@{magic}"></span></div>
<div class="hide-resonance"><span name="attr_display_resonance" title="@{resonance}"></span></div>
</div>
</div>
<!-- ~~:+: Initiative :+:~~ -->
<input type="hidden" name="attr_initiative_base" value="0" />
<input type="hidden" name="attr_initiative_dice_mod" value="1" />
<input type="hidden" name="attr_initiative_dice" value="1" />
<button class="attr-ini" name="act_initiative" type="action" value="@{gm_toggle} &{template:rolls-computed}{{combat_paralysis=[[@{combat_paralysis}]]}}{{header=@{character_name}}}{{base=^{initiative}}}{{dice=[[ceil([[(@{initiative_base}+@{modifiers_toggle})+(1d6cf0 + (@{initiative_dice} + @{wounds_toggle} - 1)d6cf0)]] @{combat_paralysis_initiative_mod}) &{tracker}]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}">
<span class="attr-ini red init-settings" data-i18n="initiative">Initiative</span>
<span class="attr-ini red init-display" data-i18n="initiative">Initiative</span>
</button>
<div class="attr-und attr-ini">
<div class="settings">
<input type="number" name="attr_initiative_mod" value="0" placeholder="0" title="@{initiative_mod}" /><span class="tiny-span"> + </span>
<input type="number" name="attr_initiative_dice_mod" value="0" min="0" max="4" placeholder="0" title="@{initiative_dice_mod}" />
<span class="tiny-span"> = </span>
<span name="attr_display_initiative_base"></span><span class="tiny-span"> + </span>
<span name="attr_initiative_dice"></span><span class="tiny-span" data-i18n="d6">d6</span>
</div>
<div class="display">
<span name="attr_display_initiative_base" title="@{display_initiative_base}"></span><span class="tiny-span"> + </span>
<span name="attr_initiative_dice" title="@{initiative_dice}"></span><span class="tiny-span" data-i18n="d6">d6</span>
</div>
</div>
<!-- ~~:+: Astral Initative :+:~~ -->
<input type="hidden" name="attr_astral_initiative_base" value="0" />
<input type="hidden" name="attr_astral_initiative_dice_mod" value="0" />
<input type="hidden" name="attr_astral_initiative_dice" value="2" />
<div class="hide-magic" style="width: 100% !important">
<button class="attr-ini" name="act_astral_initiative" type="action" value="@{gm_toggle} &{template:rolls-computed}{{combat_paralysis=[[@{combat_paralysis}]]}}{{header=@{character_name}}}{{base=^{astral} ^{initiative}}}{{dice=[[ceil([[(@{astral_initiative_base}+@{modifiers_toggle})+(1d6cf0 + (@{astral_initiative_dice} + @{wounds_toggle} - 1)d6cf0)]] @{combat_paralysis_initiative_mod}) &{tracker}]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}">
<span class="attr-ini red init-settings" data-i18n="astralini">Astral Init</span>
<span class="attr-ini red init-display" data-i18n="astralinitiative">Astral Initiative</span>
</button>
<div class="attr-und attr-ini">
<div class="settings">
<input type="number" name="attr_astral_initiative_mod" value="0" placeholder="modifier" title="@{astral_initiative_mod}" /><span class="tiny-span"> + </span>
<input type="number" name="attr_astral_initiative_dice_mod" value="0" min="0" max="3" placeholder="0" title="@{astral_initiative_dice_mod}" />
<span class="tiny-span"> = </span>
<span name="attr_display_astral_initiative_base" title="@{display_astral_initiative_base}"></span><span class="tiny-span"> + </span>
<span name="attr_astral_initiative_dice" title="@{astral_initiative_dice}"></span><span class="tiny-span" data-i18n="d6">d6</span>
</div>
<div class="display">
<span name="attr_display_astral_initiative_base" title="@{display_astral_initiative_base}"></span><span class="tiny-span"> + </span>
<span name="attr_astral_initiative_dice" title="@{astral_initiative_dice}"></span><span class="tiny-span" data-i18n="d6">d6</span>
</div>
</div>
</div>
<!-- ~~:+: Matrix Initative :+:~~ -->
<input type="hidden" name="attr_matrix_initiative_base" value="0" />
<input type="hidden" name="attr_matrix_initiative_dice_mod" value="0" />
<input type="hidden" name="attr_matrix_initiative_dice" value="0" />
<button class="attr-ini" name="act_matrix_initiative" type="action" value="@{gm_toggle} &{template:rolls-computed}{{combat_paralysis=[[@{combat_paralysis}]]}}{{header=@{character_name}}}{{base=^{matrixinitiative}}}{{dice=[[ceil([[(@{matrix_initiative_base}+@{modifiers_toggle})+(1d6cf0 + (@{matrix_initiative_dice}+@{wounds_toggle} - 1)d6cf0)]] @{combat_paralysis_initiative_mod}) &{tracker}]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}">
<span class="attr-ini red init-settings" data-i18n="matrixinit">Matrix AR Ini</span>
<span class="attr-ini red init-display" data-i18n="matrixinitiative">Matrix AR Initiative</span>
</button>
<div class="attr-und attr-ini">
<div class="settings">
<input type="number" name="attr_matrix_initiative_mod" value="0" placeholder="0" title="@{matrix_initiative_mod}" /><span class="tiny-span"> + </span>
<input type="number" name="attr_matrix_initiative_dice_mod" value="0" min="0" max="5" placeholder="0" title="@{matrix_initiative_dice_mod}" />
<span class="tiny-span"> = </span>
<span name="attr_matrix_initiative_base" title="@{matrix_initiative_base}"></span><span class="tiny-span"> + </span>
<span name="attr_matrix_initiative_dice" title="@{matrix_initiative_dice}"></span><span class="tiny-span" data-i18n="d6">d6</span>
</div>
<div class="display">
<span name="attr_matrix_initiative_base" title="@{matrix_initiative_base}"></span><span class="tiny-span"> + </span>
<span name="attr_matrix_initiative_dice" title="@{matrix_initiative_dice}"></span><span class="tiny-span" data-i18n="d6">d6</span>
</div>
</div>
<!-- ~~:+: Cold Sim VR Initative :+:~~ -->
<input type="hidden" name="attr_cold_sim_initiative_base" value="0" />
<input type="hidden" name="attr_cold_sim_initiative_dice_mod" value="0" />
<input type="hidden" name="attr_cold_sim_initiative_dice" />
<button class="attr-ini" name="act_cold_sim_initiative" type="action" value="@{gm_toggle} &{template:rolls-computed}{{combat_paralysis=[[@{combat_paralysis}]]}}{{header=@{character_name}}}{{base=^{coldsiminitiative}}}{{dice=[[ceil([[(@{cold_sim_initiative_base}+@{modifiers_toggle})+(1d6cf0 + (@{cold_sim_initiative_dice}+@{wounds_toggle} - 1)d6cf0)]] @{combat_paralysis_initiative_mod}) &{tracker}]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}">
<span class="attr-ini red init-settings" data-i18n="coldsiminit">Cold Sim Init</span>
<span class="attr-ini red init-display" data-i18n="coldsiminitiative">Cold Sim VR Initiative</span>
</button>
<div class="attr-und attr-ini">
<div class="settings">
<input type="number" name="attr_cold_sim_initiative_mod" value="0" placeholder="0" title="@{cold_sim_initiative_mod}" /><span class="tiny-span"> + </span>
<input type="number" name="attr_cold_sim_initiative_dice_mod" value="0" min="0" max="5" placeholder="0" title="@{cold_sim_initiative_dice_mod}" />
<span class="tiny-span"> = </span>
<span name="attr_cold_sim_initiative_base" title="@{cold_sim_initiative_base}"></span><span class="tiny-span"> + </span>
<span name="attr_cold_sim_initiative_dice" title="@{cold_sim_initiative_dice}"></span><span class="tiny-span" data-i18n="d6">d6</span>
</div>
<div class="display">
<span name="attr_cold_sim_initiative_base" title="@{cold_sim_initiative_base}"></span><span class="tiny-span"> + </span>
<span name="attr_cold_sim_initiative_dice" title="@{cold_sim_initiative_dice}"></span><span class="tiny-span" data-i18n="d6">d6</span>
</div>
</div>
<!-- ~~:+: Hot Sim VR Initative :+:~~ -->
<input type="hidden" name="attr_hot_sim_initiative_base" value="0" />
<input type="hidden" name="attr_hot_sim_initiative_dice_mod" value="0" />
<input type="hidden" name="attr_hot_sim_initiative_dice" value="0" />
<button class="attr-ini" name="act_hot_sim_initiative" type="action" value="@{gm_toggle} &{template:rolls-computed}{{combat_paralysis=[[@{combat_paralysis}]]}}{{header=@{character_name}}}{{base=^{hotsiminitiative}}}{{dice=[[ceil([[(@{hot_sim_initiative_base}+@{modifiers_toggle})+(1d6cf0+ (@{hot_sim_initiative_dice}+@{wounds_toggle}-1)d6cf0)]] @{combat_paralysis_initiative_mod}) &{tracker}]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}">
<span class="attr-ini red init-settings" data-i18n="hotsiminit">Hot Sim Init</span>
<span class="attr-ini red init-display" data-i18n="hotsiminitiative">Hot Sim VR Initiative</span>
</button>
<div class="attr-und attr-ini">
<div class="settings">
<input type="number" name="attr_hot_sim_initiative_mod" value="0" placeholder="0" title="@{hot_sim_initiative_mod}" /><span class="tiny-span"> + </span>
<input type="number" name="attr_hot_sim_initiative_dice_mod" value="0" min="0" max="5" placeholder="0" title="@{hot_sim_initiative_dice_mod}" />
<span class="tiny-span"> = </span>
<span name="attr_hot_sim_initiative_base" title="@{hot_sim_initiative_base}"></span><span class="tiny-span"> + </span>
<span name="attr_hot_sim_initiative_dice" title="@{hot_sim_initiative_dice}"></span><span class="tiny-span" data-i18n="d6">d6</span>
</div>
<div class="display">
<span name="attr_hot_sim_initiative_base" title="@{hot_sim_base}"></span><span class="tiny-span"> + </span>
<span name="attr_hot_sim_initiative_dice" title="@{hot_sim_dice}"></span><span class="tiny-span" data-i18n="d6">d6</span>
</div>
</div>
<!-- ~~:+: Composure :+:~~ -->
<input type="hidden" name="attr_composure" value="" />
<button name="act_composure" data-i18n-title="Willpower + Charisma" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{composure}}}{{dice=[[(@{composure}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span data-i18n="composure">Composure</span></button>
<div class="attr-und">
<div class="settings">
<input type="number" name="attr_composure_modifier" placeholder="0" title="@{composure_modifier}" /><span class="tiny-span"> = </span>
<span class="totals" name="attr_composure" title="@{composure}"></span>
</div>
<div class="display">
<span name="attr_composure" title="@{composure}"></span>
</div>
</div>
<!-- ~~:+: Judge Intentions :+:~~ -->
<input type="hidden" name="attr_judge_intentions" value="" />
<button name="act_judge_intentions" data-i18n-title="Willpower + Intuition" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{judgeintentions}}}{{dice=[[(@{judge_intentions}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">
<span data-i18n="judgeintentions">Judge Intentions</span>
</button>
<div class="attr-und">
<div class="settings">
<input type="number" name="attr_judge_intentions_modifier" placeholder="0" title="@{judge_intentions_modifier}" /><span class="tiny-span"> = </span>
<span class="totals" name="attr_judge_intentions" title="@{judge_intentions}"></span>
</div>
<div class="display">
<span name="attr_judge_intentions" title="@{judge_intentions}"></span>
</div>
</div>
<!-- ~~:+: Memory :+:~~ -->
<input type="hidden" name="attr_memory" value="" />
<button name="act_memory" data-i18n-title="Logic + Intuition" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{memory}}}{{dice=[[(@{memory}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">
<span data-i18n="memory">Memory</span>
</button>
<div class="attr-und">
<div class="settings">
<input type="number" name="attr_memory_modifier" placeholder="0" title="@{memory_modifier}" /><span class="tiny-span"> = </span>
<span class="totals" name="attr_memory" title="@{memory}"></span>
</div>
<div class="display">
<span name="attr_memory" title="@{memory}"></span>
</div>
</div>
<!-- ~~:+: Social Rating :+:~~ -->
<input type="hidden" name="attr_social_rating" value="" />
<button type="action" name="act_social_rating" data-i18n-title="social_rating_desc" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{social_rating}}}{{rating=@{social_rating}}}">
<span data-i18n="social_rating">Social Rating</span>
</button>
<div class="attr-und">
<div class="settings">
<span name="attr_social_rating" title="@{social_rating}"></span>
</div>
<div class="display">
<span name="attr_social_rating" title="@{social_rating}"></span>
</div>
</div>
<!-- ~~:+: Lift & Carry :+:~~ -->
<input type="hidden" name="attr_lift_carry" value="" />
<button name="act_lift_carry" data-i18n-title="Body + Willpower" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{liftcarry}}}{{dice=[[(@{lift_carry}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">
<span data-i18n="liftcarry">Lift & Carry</span>
</button>
<div class="attr-und">
<div class="settings">
<input type="number" name="attr_lift_carry_modifier" placeholder="0" title="@{lift_carry_modifier}" /><span class="tiny-span"> = </span>
<span class="totals" name="attr_lift_carry" title="@{lift_carry}"></span>
</div>
<div class="display">
<span name="attr_lift_carry" title="@{lift_carry}"></span>
</div>
</div>
<!-- ~~:+: Walk & Run :+:~~ -->
<label data-i18n="movement">Movement</label>
<div class="attr-und">
<div class="settings">
<input style="width: 1.75em !important;" type="number" name="attr_move_speed" value="10" placeholder="10" title="@{move_speed}" />
<span class="tiny-span">/</span>
<input style="width: 1.75em !important;" type="number" name="attr_sprint_speed" value="15" placeholder="15" title="@{sprint_speed}" />
<span class="tiny-span">+</span>
<input style="width: 1.5em !important;" type="number" name="attr_sprint_modifier" value="1" title="@{sprint_modifier}" />
</div>
<div class="display">
<button name="act_sprint" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=@{sprint_speed}+(Athletics+Agility hits * @{sprint_modifier})}}{{dice=[[@{sprint_speed}+((@{athletics}+@{agility}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle} * @{sprint_modifier})]] meters}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">
<span data-i18n="sprint">Sprint</span>
</button>
</div>
</div>
</div>
</div>
</div><!-- ~~~~~~~~ End of PC Attributes~~~~~~~~ -->
<div class="attributes-effects">
<div class="pc-box medium-box attr-box">
<div class="rows repeating-container">
<div class="row-long headers">
<span></span>
<h2 data-i18n="name">Name</h2>
<h2 data-i18n="duration">Duration</h2>
<h2 data-i18n="source">Source</h2>
</span></span>
</span></span>
</div>
<fieldset class="repeating_effects">
<input class="settings-flag" name="attr_flag" type="hidden" value="settings"/>
<div class="buttons">
<input class="toggle" name="attr_active" value="on" type="checkbox" checked="checked"/>
<span class="pictos powerbutton">2</span>
</div>
<span name="attr_name" title="@{repeating_effects_${x}_name}"></span>
<span class="text-align-center" name="attr_duration" title="@{repeating_effects_${x}_duration}"></span>
<span class="text-align-center" name="attr_source" title="@{repeating_effects_${x}_source}"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
</span>&nbsp;</span>
<input type="text" name="attr_name" value="" placeholder="" title="Effect Name" />
<input type="text" name="attr_duration" value="" placeholder="" title="Duration" />
<input type="text" name="attr_source" value="" placeholder="" title="Source" />
</span></span>
</span></span>
<label data-i18n-title="notes" title="notes"><span data-i18n="notes">Notes</span>
<textarea name="attr_notes" data-i18n-placeholder="notes" placeholder="Notes" title="{repeating_effects_${x}_notes}"></textarea>
</label>
<label data-i18n-title="modifications" title="modifications"><span data-i18n="modifications">Modifications</span>
<textarea name="attr_modifications" data-i18n-placeholder="mods" placeholder="Modifications" title="{repeating_effects_${x}_modifications}"></textarea>
</label>
</div>
</fieldset>
</div>
</div>
</div>
</div>
</div><!-- ~~~~~~~~ End of PC Effects ~~~~~~~~ -->
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ START OF Knowledge/Skills ROW ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<div class="pc-row">
<div class="header left-header">
<div class="header htab">
<div class="triangle"></div>
<input class="skills-toggle" name="attr_skills_toggle" title="@{skills_toggle}" type="radio" value="knowledge"/>
<h1 data-i18n="knowledge">Knowledge</h1>
<div class="right-tri"></div>
</div>
<div class="header htab">
<div class="triangle"></div>
<input class="skills-toggle" name="attr_skills_toggle" title="@{skills_toggle}" type="radio" value="active" checked="checked"/>
<h1 data-i18n="skills">Skills</h1>
</div>
</div>
<div class="border-box skill-box">
<div class="pc-box medium-box">
<input class="skills-toggle" name="attr_skills_toggle" type="hidden" value="active"/>
<div class="skills-active">
<div class="rows repeating-container">
<div class="row-long headers">
<h2 data-i18n="skill">Skill</h2>
<h2 data-i18n="rtg">RTG</h2>
<h2 data-i18n="mod">Mod</h2>
<h2 data-i18n="attribute">Attribute</h2>
</div>
<div class="row-long">
<input name="attr_default_display" type="hidden" value="Agility"/>
<button data-i18n="default" name="act_default" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{default} = @{default_display} - 1}}{{dice=[[((@{default_attribute}+@{unskilled_mod}+-1)+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">default</button><span class="text-align-center">-1</span>
<input name="attr_unskilled_mod" min="0" placeholder="0" type="number" step="1" value="0" title="attr_unskilled_mod"/>
<select class="attribute-select" name="attr_default_attribute" title="Skill attribute">
<option data-i18n="body" value="@{body}">Body</option>
<option data-i18n="agility" value="@{agility}" selected="selected">Agility</option>
<option data-i18n="reaction" value="@{reaction}">Reaction</option>
<option data-i18n="strength" value="@{strength}">Strength</option>
<option data-i18n="willpower" value="@{willpower}">Willpower</option>
<option data-i18n="logic" value="@{logic}">Logic</option>
<option data-i18n="intuition" value="@{intuition}">Intuition</option>
<option data-i18n="charisma" value="@{charisma}">Charisma</option>
<option data-i18n="magic" value="@{magic}">Magic</option>
<option data-i18n="resonance" value="@{resonance}">Resonance</option>
</select>
</div>
<fieldset class="repeating_skills">
<input name="attr_display_rating" type="hidden"/>
<input name="attr_display_name" type="hidden"/>
<input name="attr_display_spec" type="hidden" value=""/>
<input name="attr_display_expert" type="hidden" value=""/>
<input name="attr_display_attribute" type="hidden" value="Intuition"/>
<input name="attr_dicepool" type="hidden" value="0"/>
<input class="settings-flag" name="attr_flag" type="hidden" value="settings"/>
<div class="buttons">
<button name="act_skill" class="skill" type="action" value=""><span name="attr_display_name"></span></button>
<span class="skill-button-hider" name="attr_spec">hideme</span><button name="act_spec" class="skill_spec" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} +2 (Spec: @{display_spec})}}{{dice=[[((@{rating}+@{attribute}+@{mod}+2)+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=Spec: @{spec}\n@{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span class="skill_spec" name="attr_display_spec"></span></button>
<span class="skill-button-hider" name="attr_expert">hideme</span><button name="act_expert" class="skill_expert" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} +3 (Expert: @{display_expert})}}{{dice=[[((@{rating}+@{attribute}+@{mod}+3)+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=Expertise: @{expert}\n@{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span class="skill_expert" name="attr_display_expert"></span></button>
</div>
<span class="text-align-center" name="attr_display_rating" title="@{repeating_skills_${x}_display_rating}"></span>
<input name="attr_mod" step="1" value="0" placeholder="0" type="number" title="mod"/>
<select class="attribute-select" name="attr_attribute" title="undefined_attribute">
<option data-i18n="body" value="@{body}">Body</option>
<option data-i18n="agility" value="@{agility}">Agility</option>
<option data-i18n="reaction" value="@{reaction}">Reaction</option>
<option data-i18n="strength" value="@{strength}">Strength</option>
<option data-i18n="willpower" value="@{willpower}">Willpower</option>
<option data-i18n="logic" value="@{logic}">Logic</option>
<option data-i18n="intuition" value="@{intuition}">Intuition</option>
<option data-i18n="charisma" value="@{charisma}">Charisma</option>
<option data-i18n="magic" value="@{magic}">Magic</option>
<option data-i18n="resonance" value="@{resonance}">Resonance</option>
</select>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<select class="skill-select" name="attr_name" title="name">
<option value="Astral" data-i18n="astral">Astral</option>
<option value="Athletics" data-i18n="athletics">Athletics</option>
<option value="Biotech" data-i18n="biotech">Biotech</option>
<option value="Close Combat" data-i18n="closecombat">Close Combat</option>
<option value="Con" data-i18n="con">Con</option>
<option value="Conjuring" data-i18n="conjuring">Conjuring</option>
<option value="Cracking" data-i18n="cracking">Cracking</option>
<option value="Electronics" data-i18n="electronics">Electronics</option>
<option value="Enchanting" data-i18n="enchanting">Enchanting</option>
<option value="Engineering" data-i18n="engineering">Engineering</option>
<option value="Exotic Weapons" data-i18n="exoticweapons">Exotic Weapons</option>
<option value="Firearms" data-i18n="firearms">Firearms</option>
<option value="Influence" data-i18n="influence">Influence</option>
<option value="Outdoors" data-i18n="outdoors">Outdoors</option>
<option value="Perception" data-i18n="perception">Perception</option>
<option value="Piloting" data-i18n="piloting">Piloting</option>
<option value="Sorcery" data-i18n="sorcery">Sorcery</option>
<option value="Stealth" data-i18n="stealth">Stealth</option>
<option value="Tasking" data-i18n="tasking">Tasking</option>
<option value="Language" data-i18n="language">Language</option>
<option value="Knowledge" data-i18n="knowledge">Knowledge</option>
</select>
<label data-i18n-title="rating" title="rating">
<input name="attr_rating" step="1" data-i18n-placeholder="skillsphrtg" placeholder="Rtg" type="number" title="rating" value='' />
</label>
<label data-i18n-title="mod" title="mod">
<input name="attr_mod" value="0" step="1" placeholder="Mod" type="number" title="mod"/>
</label>
<select class="attribute-select" name="attr_attribute" title="undefined_attribute">
<option data-i18n="body" value="@{body}">Body</option>
<option data-i18n="agility" value="@{agility}">Agility</option>
<option data-i18n="reaction" value="@{reaction}">Reaction</option>
<option data-i18n="strength" value="@{strength}">Strength</option>
<option data-i18n="willpower" value="@{willpower}">Willpower</option>
<option data-i18n="logic" value="@{logic}">Logic</option>
<option data-i18n="intuition" value="@{intuition}" selected="selected">Intuition</option>
<option data-i18n="charisma" value="@{charisma}">Charisma</option>
<option data-i18n="magic" value="@{magic}">Magic</option>
<option data-i18n="resonance" value="@{resonance}">Resonance</option>
</select>
<label data-i18n-title="specialization" title="specialization"> <span class="skill_spec" data-i18n="specialization">specialization</span>
<input name="attr_spec" data-i18n-placeholder="specializationword" placeholder="specialization" type="text" title="specialization"/>
</label>
<label data-i18n-title="expertise" title="expertise"> <span class="skill_expert" data-i18n="expertise">Expertise</span>
<input name="attr_expert" data-i18n-placeholder="expertiseword" placeholder="expertise" type="text" title="expertise"/>
</label>
<label data-i18n-title="notes" title="notes"><span data-i18n="notes">Notes</span>
<textarea name="attr_notes" placeholder="Notes" title="undefined_notes}"></textarea>
</label>
</div>
</fieldset>
</div>
</div>
<div class="skills-knowledge">
<div class="rows repeating-container">
<div class="row-long headers">
<h2 data-i18n="knowledge">Knowledge</h2>
<h2 data-i18n="type">Type</h2>
</div>
<fieldset class="repeating_knowledges">
<span name="attr_name"></span>
<span class="center" name="attr_type"></span>
<input class="settings-flag" name="attr_flag" type="hidden" value="settings" title="undefined_flag}"/>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<input type="text" name="attr_name" value="" placeholder="" title="Knowledge / Language Name" />
<select class="center" data-i18n-title="type" name="attr_type" title="skill_type">
<option data-i18n="knowledge" value="Knowledge">Knowledge</option>
<option data-i18n="language" value="Language">Language</option>
</select>
<label data-i18n-title="notes" title="notes"><span data-i18n="notes">Notes</span>
<textarea name="attr_notes" data-i18n-placeholder="notes" placeholder="Notes" title="undefined_notes}"></textarea>
</label>
</div>
</fieldset>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="options pc-col">
<div class="pc-row">
<div class="header right-header"><h1 data-i18n="options">Options</h1><div class="right-tri"></div></div>
<div class="border-box">
<div class="pc-box">
<div class="op-col op-col-left">
<div>
<h2 data-i18n="character_type">Character Type</h2><br />
<select name="attr_flag_special">
<option data-i18n="mundane" value="mundane" selected>Mundane</option>
<option data-i18n="awakened" value="magic">Awakened</option>
<option data-i18n="technomancer" value="resonance">Technomancer</option>
</select>
</div>
<hr />
<div>
<h2 data-i18n="sheetselect">Sheet Select</h2><br />
<select name="attr_sheet_type" title="@{sheet_type}">
<option value="pc" data-i18n="pc">PC</option>
<option value="grunt" data-i18n="grunt">Grunt</option>
<option value="spirit" data=i18n="spirit">Spirit</option>
<option value="host" data-i18n="host">Host</option>
<option value="sprite" data-i18n="sprite">Sprite</option>
<option value="vehicle" data-i18n="vehicle">Vehicle</option>
<option value="gm_helper" data-i18n="gm_helper">GM Helper</option>
</select>
</div>
<hr />
<div>
<h2 data-i18n="misc">Misc</h2><br />
<label data-i18n="enable_edge_rerolls">Enable Edge Rerolls</label><input class="enable-rerolls" type="checkbox" name="attr_rerolls" value="1" title="@{enable_modifiers}" checked="checked" /><br />
<span class="tiny red" data-i18n="enable_edge_rerolls_description">Enables Edge Reroll buttons on roll templates (the +, +4s and - buttons).</span><br />
</div>
<hr />
<div>
<h2 data-i18n="modifier_text_boxes">Modifier Text Boxes</h2><br />
<label data-i18n="enable_modifier_changes">Enable Modifier Changes</label><input class="enable-modifiers" type="checkbox" name="attr_enable_modifiers" value="1" title="@{enable_modifiers}" /><br />
<span class="tiny red" data-i18n="enable_modifier_changes_description">Warning: If not used correctly this can break your character data.</span><br />
<label data-i18n="enable_unrestricted_modifiers">Enable Unrestricted Modifiers</label><input type="checkbox" name="attr_enable_unrestricted_modifiers" value="1" title="@{enable_unrestricted_modifiers}" /><br />
</div>
</div>
<div class="op-col op-col-right">
<div>
<h2 data-i18n="temporarymodifiers">Temporary Modifiers</h2><br />
<label data-i18n="defense">Defense</label><input type="number" name="attr_defense_temp" title="@{defense_temp}" value="0" /><input type="checkbox" name="attr_defense_temp_flag" value="on" checked />
<label data-i18n="soak">Soak</label><input type="number" name="attr_soak_temp" title="@{soak_temp}" value="0" /><input type="checkbox" name="attr_soak_temp_flag" value="on" checked />
<hr />
<label data-i18n="body">Body</label><input type="number" name="attr_body_temp" title="@{body_temp}" value="0" /><input type="checkbox" name="attr_body_temp_flag" value="on" checked />
<label data-i18n="agility">Agility</label><input type="number" name="attr_agility_temp" title="@{agility_temp}" value="0" /><input type="checkbox" name="attr_agility_temp_flag" value="on" checked />
<label data-i18n="reaction">Reaction</label><input type="number" name="attr_reaction_temp" title="@{reaction_temp}" value="0" /><input type="checkbox" name="attr_reaction_temp_flag" value="on" checked />
<label data-i18n="strength">Strength</label><input type="number" name="attr_strength_temp" title="@{strength_temp}" value="0" /><input type="checkbox" name="attr_strength_temp_flag" value="on" checked />
<label data-i18n="willpower">Willpower</label><input type="number" name="attr_willpower_temp" title="@{willpower_temp}" value="0" /><input type="checkbox" name="attr_willpower_temp_flag" value="on" checked />
<label data-i18n="logic">Logic</label><input type="number" name="attr_logic_temp" title="@{logic_temp}" value="0" /><input type="checkbox" name="attr_logic_temp_flag" value="on" checked />
<label data-i18n="intuition">Intuition</label><input type="number" name="attr_intuition_temp" title="@{intuition_temp}" value="0" /><input type="checkbox" name="attr_intuition_temp_flag" value="on" checked />
<label data-i18n="charisma">Charisma</label><input type="number" name="attr_charisma_temp" title="@{charisma_temp}" value="0" /><input type="checkbox" name="attr_charisma_temp_flag" value="on" checked />
<label data-i18n="magic">Magic</label><input type="number" name="attr_magic_temp" title="@{magic_temp}" value="0" /><input type="checkbox" name="attr_magic_temp_flag" value="on" checked />
<label data-i18n="resonance">Resonance</label><input type="number" name="attr_resonance_temp" title="@{resonance_temp}" value="0" /><input type="checkbox" name="attr_resonance_temp_flag" value="on" checked />
<hr />
<label data-i18n="initiative">Initiative</label><input type="number" name="attr_initiative_temp" title="@{initiative_temp}" value="0" /><input type="checkbox" name="attr_initiative_temp_flag" value="on" checked />
<label data-i18n="initiativedice">Initiative Dice</label><input type="number" name="attr_initiative_dice_temp" title="@{initiative_dice_temp}" value="0" /><input type="checkbox" name="attr_initiative_dice_temp_flag" value="on" checked />
<label data-i18n="astralinitiative">Astral Initiative</label><input type="number" name="attr_astral_initiative_temp" title="@{astral_initiative_temp}" value="0" /><input type="checkbox" name="attr_astral_initiative_temp_flag" value="on" checked />
<label data-i18n="astralinitiativedice">Initiative Dice</label><input type="number" name="attr_astral_initiative_dice_temp" title="@{astral_initiative_dice_temp}" value="0" /><input type="checkbox" name="attr_astral_initiative_dice_temp_flag" value="on" checked />
<label data-i18n="matrixinitiative">Matrix Initiative</label><input type="number" name="attr_matrix_initiative_temp" title="@{matrix_initiative_temp}" value="0" /><input type="checkbox" name="attr_matrix_initiative_temp_flag" value="on" checked />
<label data-i18n="matrixinitiativedice">Matrix Initiative Dice</label><input type="number" name="attr_matrix_initiative_dice_temp" title="@{matrix_initiative_dice_temp}" value="0" /><input type="checkbox" name="attr_matrix_initiative_dice_temp_flag" value="on" checked />
<label data-i18n="coldsiminitiative">Cold Sim VR Initiative</label><input type="number" name="attr_cold_sim_initiative_temp" title="@{cold_sim_initiative_temp}" value="0" /><input type="checkbox" name="attr_cold_sim_initiative_temp_flag" value="on" checked />
<label data-i18n="coldsiminitiativedice">Cold Sim VR Initiative Dice</label><input type="number" name="attr_cold_sim_initiative_dice_temp" title="@{cold_sim_initiative_dice_temp}" value="0" /><input type="checkbox" name="attr_cold_sim_initiative_dice_temp_flag" value="on" checked />
<label data-i18n="hotsiminitiative">Hot Sim VR Initiative</label><input type="number" name="attr_hot_sim_initiative_temp" title="@{hot_sim_initiative_temp}" value="0" /><input type="checkbox" name="attr_hot_sim_initiative_temp_flag" value="on" checked />
<label data-i18n="hotsiminitiativedice">Hot Sim VR Initiative Dice</label><input type="number" name="attr_hot_sim_initiative_dice_temp" title="@{hot_sim_initiative_dice_temp}" value="0" /><input type="checkbox" name="attr_hot_sim_initiative_dice_temp_flag" value="on" checked />
</div>
</div>
<div class="importer">
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/>
<span class="pictos">c</span>
<div class="collapse importer-input">
<button class="import-button" name="act_import" type="action" value="">Import</button>
<textarea name="attr_import_data" placeholder="WARNING! Anything placed here CAN completely corrupt your character, make a copy!" title="Paste Genesis JSON Here"></textarea>
</div>
<span class="importer-feedback" name="attr_import_feedback"></span>
</div>
</div>
</div>
</div>
</div>
<div class="core pc-col">
<div class="pc-row">
<div class="header right-header">
<h1 data-i18n="corecombatinfo">Core Combat Info</h1>
<div class="right-tri"></div>
</div>
<div class="border-box">
<div class="pc-box small-box core-combat">
<div class="row-long cc-arm">
<div class="armor-info">
<div>&nbsp;</div>
<button type="action" name="act_dr" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{defense} ^{rating}}}{{rating=@{defense_rating}}}">
<span class="center"><span data-i18n="dr">DR</span> <span name="attr_defense_rating"></span></span>
</button>
<div>&nbsp;</div>
<button type="action" name="act_defense" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{defense} = ^{reaction} + ^{intuition}}}{{dice=[[((@{defense})+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">
<span class="center" name="defense" title="@{defense} = Reaction + Intuition" data-i18n="defense">Defense</span>
</button>
<div>&nbsp;</div>
<button type="action" name="act_toxin_resist" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{toxin} ^{resistance} = ^{body} + ^{willpower}}}{{dice=[[((@{body}+@{willpower}+?{Toxin Resistance Gear?|0})+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">
<span class="center" name="toxin_resist" title="Body + Willpower" data-i18n="resisttoxin">Resist Toxin</span>
</button>
<div>&nbsp;</div>
<button type="action" name="act_soak" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{soak} ^{damage}}}{{dice=[[((@{soak})+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">
<span class="center" name="soak" title="@{soak} = Body" data-i18n="soakdamage">Soak Damage</span>
</button>
<div>&nbsp;</div>
</div>
<div class="magic-defense">
<div>&nbsp;</div>
<button type="action" name="act_magic_ar" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{magic} ^{attack} ^{rating}}}{{rating=@{magic_ar}}}{{desc=Magic + @{tradition_attribute}}}">
<span class="center"><span data-i18n="magicar">Magic AR</span> <span name="attr_magic_ar"></span></span>
</button>
<div>&nbsp;</div>
<button type="action" name="act_direct_magic_defense" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{direct} ^{magic} ^{defense}}}{{dice=[[((@{willpower}+@{intuition})+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{desc=Willpower + Intuition}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">
<span class="center" title="Willpower + Intuition"><span class="center" data-i18n="directmagicdefense">Direct Magic Defense</span></span>
</button>
<div>&nbsp;</div>
<button type="action" name="act_indirect_magic_defense" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{indirect} ^{magic} ^{defense}}}{{dice=[[((@{reaction}+@{willpower})+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{desc=Reaction + Willpower}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">
<span class="center" title="Reaction + Willpower"><span class="center" data-i18n="indirectmagicdefense">Indirect Magic Defense</span></span>
</button>
<div>&nbsp;</div>
</div>
<div class="matrix-defense">
<div>&nbsp;</div>
<button name="act_matrix_attack_rating" type="action" value="&{template:rolls-computed}{{header=@{character_name}}}{{base=Matrix Attack Rating}}{{rating=[[(@{attack}+@{sleaze})]]}}{{desc=Attack + Sleaze}}" title="Matrix Attack Rating">
<span><span data-i18n="matrix_ar">Matrix AR</span><span name='attr_matrix_attack_rating'></span></span>
</button>
<div>&nbsp;</div>
<button name="act_matrix_defense_rating" type="action" value="&{template:rolls-computed}{{header=@{character_name}}}{{base=Matrix Defense Rating}}{{rating=[[@{matrix_defense_rating}]]}}{{desc=Data Processing + Firewall}}" title="Matrix Defense Rating">
<span><span data-i18n="matrix_dr">Matrix DR</span><span name='attr_matrix_defense_rating'></span></span>
</button>
<div>&nbsp;</div>
<button name="act_soak_matrix" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{matrix} ^{soak} = ^{firewall}}}{{dice=[[(@{firewall}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{desc=}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">
<span class="center" title="Firewall"><span class="center" data-i18n="matrixsoak">Matrix Soak</span></span>
</button>
<div>&nbsp;</div>
<button name="act_soak_biofeedback" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{biofeedback} ^{soak} = ^{willpower}}}{{dice=[[(@{willpower}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{desc=}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">
<span class="center" title="Willpower"><span class="center" data-i18n="biofeedbacksoak">Biofeedback Soak</span></span>
</button>
<div>&nbsp;</div>
</div>
<div class="armor-resists">
<h2 data-i18n="resists">Resists</h2>
<span class="armor-resist" title="@{resist_chem_total}"><span class="pictos3 chem">d</span><span class="chem" data-i18n="chem"> Chem </span><span class="armor-resist-value" name="attr_resist_chem_total"></span></span>
<span class="armor-resist" title="@{resist_cold_total}"><span class='pictos cold'>b</span><span class="cold" data-i18n="cold"> Cold </span><span class="armor-resist-value" name="attr_resist_cold_total"></span></span>
<span class="armor-resist" title="@{resist_elec_total}"><span class='pictos elec'>e</span><span class="elec" data-i18n="elec"> Elec </span><span class="armor-resist-value" name="attr_resist_elec_total"></span></span>
<span class="armor-resist" title="@{resist_fire_total}"><span class="pictos3 fire">j</span><span class="fire" data-i18n="fire"> Fire </span><span class="armor-resist-value" name="attr_resist_fire_total"></span></span>
</div>
</div>
<div>
<span>&nbsp;</span>
</div>
<div class="row-long cc-row primary-range">
<h2 data-i18n="primaryrangedweapon">Primary Ranged Weapon</h2>
<h2>&nbsp;</h2>
<h2 class="center" data-i18n="pool">Pool</h2>
<h2 class="center" data-i18n="dam">Dam</h2>
<h2 class="center" data-i18n="c" title="Close 0-3">C</h2>
<h2 class="center" data-i18n="n" title="Near 4-50">N</h2>
<h2 class="center" data-i18n="m" title="Medium 51-250">M</h2>
<h2 class="center" data-i18n="f" title="Far 251-500">F</h2>
<h2 class="center" data-i18n="e" title="Extreme 500+">E</h2>
</div>
<div class="cc-row primary-range">
<input name="attr_primary_range_weapon-rowid" type="hidden" value=""/>
<input type="hidden" name="attr_primary_range_weapon_split_dicepool" value="0" />
<button name="act_primary_range_weapon" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{primary_range_weapon}}}{{dice=[[(@{primary_range_weapon_rating}+@{primary_range_weapon_attr_rating}+@{primary_range_weapon_spec}+@{primary_range_weapon_expert}+@{primary_range_weapon_dicepool_modifier}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=Mode @{primary_range_weapon_mode}, Damage @{primary_range_weapon_damage}, Skill @{primary_range_weapon_skill}, Attribute: @{primary_range_weapon_attribute}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_primary_range_weapon" title="@{primary_range_weapon}"></span></button>
<button name="act_primary_range_weapon_split_pool_2" type="action" value=""><span name="attr_primary_range_weapon" title="@{primary_range_weapon}"></span></button>
<span>&nbsp;</span>
<span class="center" name="attr_primary_range_weapon_dicepool"></span>
<span class="center" name="attr_primary_range_weapon_damage"></span>
<span class="center" name="attr_primary_range_weapon_close"></span>
<span class="center" name="attr_primary_range_weapon_near"></span>
<span class="center" name="attr_primary_range_weapon_medium"></span>
<span class="center" name="attr_primary_range_weapon_far"></span>
<span class="center" name="attr_primary_range_weapon_extreme"></span>
</div>
<div class="row-long cc-row primary-range-row2">
<input type="hidden" name="attr_primary_range_weapon_mode_singleshot" value="0" />
<input type="hidden" name="attr_primary_range_weapon_mode_semiauto" value="0" />
<input type="hidden" name="attr_primary_range_weapon_mode_burst" value="0" />
<input type="hidden" name="attr_primary_range_weapon_mode_burstwide" value="0" />
<input type="hidden" name="attr_primary_range_weapon_mode_fullauto" value="0" />
<input type="hidden" name="attr_primary_range_weapon_mode_other" value="0" />
<input type="hidden" name="attr_primary_range_weapon_default_mode" value="" />
<input type="hidden" name="attr_primary_range_weapon_base_damage" value="0" />
<input type="hidden" name="attr_primary_range_weapon_base_close" value="0" />
<input type="hidden" name="attr_primary_range_weapon_base_near" value="0" />
<input type="hidden" name="attr_primary_range_weapon_base_medium" value="0" />
<input type="hidden" name="attr_primary_range_weapon_base_far" value="0" />
<input type="hidden" name="attr_primary_range_weapon_base_extreme" value="0" />
<input type="hidden" name="attr_primary_range_weapon_notes" value="" />
<select id="attr_primary_range_weapon_mode" name="attr_primary_range_weapon_mode" title="@{primary_range_weapon_mode}">
<option data-i18n="singleshot" value="Single Shot">Single Shot</option>
<option data-i18n="semiauto" value="Semi Auto">Semi-Auto</option>
<option data-i18n="burstfire" value="Burst Fire">Burst Fire</option>
<option data-i18n="burstwide" value="Burst Fire Wide">Burst Fire Wide</option>
<option data-i18n="fullauto" value="Full Auto">Full Auto</option>
<option data-i18n="other" value="Other">Other</option>
</select>
<span></span>
<select id="attr_primary_range_weapon_ammo_type" name="attr_primary_range_weapon_ammo_type" title="@{primary_range_weapon_ammo_type}">
<option data-i18n="regular" value="Regular">Regular</option>
<option data-i18n="apds" value="APDS">APDS</option>
<option data-i18n="explosive" value="Explosive">Explosive</option>
<option data-i18n="flechette" value="Flechette">Flechette</option>
<option data-i18n="gel" value="Gel">Gel</option>
<option data-i18n="handloaded" value="Handloaded">Handloaded</option>
<option data-i18n="matchgrade" value="Match-Grade">Match-Grade</option>
<option data-i18n="revo" value="rEVO">rEVO</option>
<option data-i18n="sticknshock" value="Stick-n-Shock">Stick-n-Shock</option>
<option data-i18n="other" value="Other">Other</option>
</select>
<span></span>
<!-- Ammo removal button -->
<button class="shots" name="act_shots_remove" type="action" data-i18n-title="fewershots">4</button>
<button class="shots" type="action" name="act_primary_ammo" title="Shots Fired">
<img alt="small handgun icon" src="https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Shadowrun5thEdition/images/gun.png" /><span name="attr_shots_fired"></span>
</button>
<button class="shots" name="act_shots_add" type="action" data-i18n-title="moreshots">4</button>
<span name="attr_primary_range_weapon_ammo" title="@{primary_range_weapon_ammo}"></span>
<span name="attr_primary_range_weapon_ammo_max" title="@{primary_range_weapon_ammo_max}"></span>
<button class="pictos shots" name="act_reload" type="action" data-i18n-title="reload">0</button>
</div>
<div class="row-long cc-row primary-range-mods">
<h2 class="right mods-list-label" data-i18n="weapon_mods_list">Weapon Mods List</h2>
<span class="mods-flag pictos">y</span>
<input class="mods-flag modal-state" id="modal-primary-mods" name="attr_mods-flag" title="Weapon Mods Toggle" type="checkbox"/>
<div class="modal">
<label class="modal__bg" for="modal-primary-mods"></label>
<div class="modal__inner">
<label class="modal__close" for="modal-primary-mods"></label>
<div class="mods-title"><span name="attr_primary_range_weapon_name"></span><br><span i18n="weapon_mods_list">Weapon Mods List</span></div>
<div class="rows repeating-container">
<div class="row-long headers">
<span></span>
<h2 data-i18n="name">Name</h2>
<h2 data-i18n="location">Duration</h2>
<h2 data-i18n="source">Source</h2>
</span></span>
</span></span>
</div>
<fieldset class="repeating_range-weapon-mods">
<input name="attr_primary_range_weapon-rowid" type="hidden" value=""/>
<input class="settings-flag" name="attr_flag" type="hidden" value="settings"/>
<div class="buttons">
<input class="toggle" name="attr_active" value="on" type="checkbox"/>
<span class="pictos powerbutton">2</span>
</div>
<span name="attr_name" title="@{repeating_weapon-mods_${x}_name}"></span>
<span class="text-align-center" name="attr_location" title="@{repeating_range-weapon-mods_${x}_location}"></span>
<span class="text-align-center" name="attr_source" title="@{repeating_range-weapon-mods_${x}_source}"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
</span>&nbsp;</span>
<input type="text" name="attr_name" value="" placeholder="" title="Mod Name" />
<input type="text" name="attr_location" value="" placeholder="" title="Location" />
<input type="text" name="attr_source" value="" placeholder="" title="Source" />
</span></span>
</span></span>
<label data-i18n-title="notes" title="notes"><span data-i18n="notes">Notes</span>
<textarea name="attr_notes" placeholder="Notes" title="{repeating_range-weapon-mods_${x}_notes}"></textarea>
</label>
<label data-i18n-title="modifications" title="modifications"><span data-i18n="modifications">Modifications</span>
<textarea name="attr_modifications" placeholder="Modifications" title="{repeating_range-weapon-mods_${x}_modifications}"></textarea>
</label>
</div>
</fieldset>
</div>
</div>
</div>
</div>
<div>
<span>&nbsp;</span>
</div>
<div class="row-long cc-row primary-melee">
<h2 data-i18n="primarymeleeweapon">Primary Melee Weapon</h2>
<h2>&nbsp;</h2>
<h2 class="center" data-i18n="pool">Pool</h2>
<h2 class="center" data-i18n="dam">Dam</h2>
<h2 class="center" data-i18n="c" title="Close 0-3">C</h2>
<h2 class="center" data-i18n="n" title="Near 4-50">N</h2>
<h2 class="center" data-i18n="m" title="Medium 51-250">M</h2>
<h2 class="center" data-i18n="f" title="Far 251-500">F</h2>
<h2 class="center" data-i18n="e" title="Extreme 500+">E</h2>
</div>
<div class="cc-row primary-melee">
<input type="hidden" name="primary_melee_weapon_notes" value="">
<button name="act_primary_melee_weapon" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{primary_melee_weapon_name}}}{{dice=[[(@{primary_melee_weapon_rating}+@{primary_melee_weapon_attr_rating}+@{primary_melee_weapon_spec}+@{primary_melee_weapon_expert}+@{primary_melee_weapon_dicepool_modifier}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=Damage @{primary_melee_weapon_damage}, Skill: @{primary_melee_weapon_skill}, Attribute: @{primary_melee_weapon_attribute}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_primary_melee_weapon_name"></span></button>
<span>&nbsp;</span>
<span class="center" name="attr_primary_melee_weapon_dicepool" title="@{primary_melee_weapon_dicepool}"></span>
<span class="center" name="attr_primary_melee_weapon_damage" title="@{primary_melee_weapon_damage}"></span>
<span class="center" name="attr_primary_melee_weapon_close" title="@{primary_melee_weapon_close}"></span>
<span class="center" name="attr_primary_melee_weapon_near" title="@{primary_melee_weapon_near}"></span>
<span class="center" name="attr_primary_melee_weapon_medium" title="@{primary_melee_weapon_medium}"></span>
<span class="center" name="attr_primary_melee_weapon_far" title="@{primary_melee_weapon_far}"></span>
<span class="center" name="attr_primary_melee_weapon_extreme" title="@{primary_melee_weapon_extreme}"></span>
</div>
</div>
</div>
</div>
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ START OF THE CONDITION MONITOR ROW ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<div class="pc-row">
<div class="header right-header"><h1 data-i18n="conditionmonitor">Condition Monitor</h1><div class="right-tri"></div></div>
<div class="border-box">
<div class="pc-box medium-box condition-box">
<input type="checkbox" class="settings-toggle" name="attr_flag_condition" checked="checked" title="Settings toggle" /><span>x</span>
<div class="settings">
<label data-i18n="conditionmonitormodifiers">Condition Monitor Modifiers (P/S): </label>
<input type="hidden" name="attr_physical" value="10" />
<input type="hidden" name="attr_stun" value="10" />
<input type="hidden" name="attr_physical_max" value="10" />
<input type="hidden" name="attr_stun_max" value="10" />
<input type="number" name="attr_physical_modifier" value="" placeholder="#" title="@{physical_modifier}" /><span> / </span>
<input type="number" name="attr_stun_modifier" value="" placeholder="#" title="@{stun_modifier}" /><br />
<input type="hidden" name="attr_overflow" value="3" />
<label data-i18n="overflowmodifier">Overflow Modifier</label><input type="number" name="attr_overflow_modifier" value="" placeholder="#" title="@{overflow_modifier}" /><br />
<label data-i18n="paintolerance">Pain Tolerance</label>
<select name="attr_pain_tolerance">
<option value="+1" data-i18n="highpaintolerance">High Pain Tolerance</option>
<option value="0" data-i18n="none" selected="selected">None</option>
<option value="-1" data-i18n="lowpaintolerance">Low Pain Tolerance</option>
</select>
<div class="con-footer">
<span data-i18n="painfooter">Low Pain Tolerance doubles wound modifiers and High Pain Tolerance lowers the modifier to wound modifiers by 1 per level.</span>
</div>
</div>
<div class="display">
<div class="con-track">
<input type="hidden" name="attr_physical_damage" value="0" />
<button name="act_cond_reset_physical" type="action" data-i18n="resetphysicaltrack">Reset Physical Track</button>
<button name="act_natural_healing_physical" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{natural} ^{healing} ^{physical}\n^{body} + ^{body}}}{{dice=[[(@{body}+@{body}+?{Medical Care?|No,0|Yes,2})d6>5]]}}{{desc=Natural Healing (Physical), This test can be performed once per 24 hours of rest to recover Overflow/Physical damage.\n\n&star; Duration is halved with the Quick Healer quality.}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}{{glitch=[[0]]}}"><span class="center"><span class="center" data-i18n="naturalhealingphysical">Natural Healing (Physical)</span></span></button>
<div class="squares">
<input class="hex-hider" type="hidden" name="attr_physical_max" value="10" />
<input type="radio" name="attr_physical_damage" value="1" /><span></span>
<input type="radio" name="attr_physical_damage" value="2" /><span></span>
<input type="radio" name="attr_physical_damage" value="3" /><span></span><div>-1</div>
<input type="radio" name="attr_physical_damage" value="4" /><span></span>
<input type="radio" name="attr_physical_damage" value="5" /><span></span>
<input type="radio" name="attr_physical_damage" value="6" /><span></span><div>-2</div>
<input type="radio" name="attr_physical_damage" value="7" /><span></span>
<input type="radio" name="attr_physical_damage" value="8" /><span></span>
<input type="radio" name="attr_physical_damage" value="9" /><span></span><div>-3</div>
<input type="radio" name="attr_physical_damage" value="10" /><span></span>
<input type="radio" name="attr_physical_damage" value="11" /><span></span>
<input type="radio" name="attr_physical_damage" value="12" /><span></span><div>-4</div>
<input type="radio" name="attr_physical_damage" value="13" /><span></span>
<input type="radio" name="attr_physical_damage" value="14" /><span></span>
<input type="radio" name="attr_physical_damage" value="15" /><span></span><div>-5</div>
<input type="radio" name="attr_physical_damage" value="16" /><span></span>
<input type="radio" name="attr_physical_damage" value="17" /><span></span>
<input type="radio" name="attr_physical_damage" value="18" /><span></span><div>-6</div>
<input type="radio" name="attr_physical_damage" value="19" /><span></span>
<input type="radio" name="attr_physical_damage" value="20" /><span></span>
<input type="radio" name="attr_physical_damage" value="21" /><span></span><div>-7</div>
<input type="radio" name="attr_physical_damage" value="22" /><span></span>
<input type="radio" name="attr_physical_damage" value="23" /><span></span>
<input type="radio" name="attr_physical_damage" value="24" /><span></span><div>-8</div>
<input type="radio" name="attr_physical_damage" value="25" /><span></span>
<input type="radio" name="attr_physical_damage" value="26" /><span></span>
<input type="radio" name="attr_physical_damage" value="27" /><span></span><div>-9</div>
<input type="radio" name="attr_physical_damage" value="28" /><span></span>
<input type="radio" name="attr_physical_damage" value="29" /><span></span>
<input type="radio" name="attr_physical_damage" value="30" /><span></span><div>-10</div>
</div>
<div class="con-footer" title="@{overflow}">
<label data-i18n="overflow">Overflow</label><div class="attr-und"><span name="attr_overflow"></span></div>
</div>
</div>
<div class="con-track">
<input type="hidden" name="attr_stun_damage" value="0" />
<button name="act_cond_reset_stun" type="action" data-i18n="resetstuntrack">Reset Stun Track</button>
<button name="act_natural_healing_stun" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{natural} ^{healing} ^{stun}\n^{body} + ^{willpower}}}{{dice=[[(@{body}+@{willpower}+?{Medical Care?|No,0|Yes,2})d6>5]]}}{{desc=Natural Healing (Stun), This test can be performed once per hour of rest to recover stun damage. &star;Duration is halved with the Quick Healer quality}}"><span class="center"><span class="center" data-i18n="naturalhealingstun">Natural Healing (Stun)</span></span></button>
<div class="squares">
<input class="hex-hider" type="hidden" name="attr_stun_max" value="10" />
<input type="radio" name="attr_stun_damage" value="1" /><span></span>
<input type="radio" name="attr_stun_damage" value="2" /><span></span>
<input type="radio" name="attr_stun_damage" value="3" /><span></span><div>-1</div>
<input type="radio" name="attr_stun_damage" value="4" /><span></span>
<input type="radio" name="attr_stun_damage" value="5" /><span></span>
<input type="radio" name="attr_stun_damage" value="6" /><span></span><div>-2</div>
<input type="radio" name="attr_stun_damage" value="7" /><span></span>
<input type="radio" name="attr_stun_damage" value="8" /><span></span>
<input type="radio" name="attr_stun_damage" value="9" /><span></span><div>-3</div>
<input type="radio" name="attr_stun_damage" value="10" /><span></span>
<input type="radio" name="attr_stun_damage" value="11" /><span></span>
<input type="radio" name="attr_stun_damage" value="12" /><span></span><div>-4</div>
<input type="radio" name="attr_stun_damage" value="13" /><span></span>
<input type="radio" name="attr_stun_damage" value="14" /><span></span>
<input type="radio" name="attr_stun_damage" value="15" /><span></span><div>-5</div>
<input type="radio" name="attr_stun_damage" value="16" /><span></span>
<input type="radio" name="attr_stun_damage" value="17" /><span></span>
<input type="radio" name="attr_stun_damage" value="18" /><span></span><div>-6</div>
<input type="radio" name="attr_stun_damage" value="19" /><span></span>
<input type="radio" name="attr_stun_damage" value="20" /><span></span>
<input type="radio" name="attr_stun_damage" value="21" /><span></span><div>-7</div>
</div>
<div class="con-footer">
<span data-i18n="conditionfooter">For every 3 boxes of damage on any one damage track, the character takes a -1 Dice Pool modifier on tests; these modifiers are cumulative within and across damage tracks.</span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- ~~~~~~~~ End of Condition Monitor ~~~~~~~~ -->
<div class="quality-box">
<div class="header right-header">
<div class="header htab">
<input class="tab-switch" name="attr_quality_toggle" type="radio" value="quality" checked="checked"/>
<h1 data-i18n="qualities">Qualities</h1>
<div class="right-tri"></div>
</div>
<div class="header htab">
<div class="triangle"></div>
<input class="tab-switch" name="attr_quality_toggle" type="radio" value="martial"/>
<h1 data-i18n="martialarts">Martial Arts</h1>
<div class="right-tri"></div>
</div>
</div>
<div class="border-box">
<div class="pc-box medium-box">
<input class="tab-switch" name="attr_quality_toggle" type="hidden" value="quality"/>
<div class="quality">
<div class="row-long headers">
<h2 data-i18n="quality">Quality</h2>
<h2 data-i18n="rtg">RTG</h2>
<h2 data-i18n="type">Type</h2>
<h2>&nbsp;</h2>
</div>
<div class="rows repeating-container">
<fieldset class="repeating_quality">
<span name="attr_name"></span>
<span class="center" name="attr_rating"></span>
<span class="center" name="attr_type"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/><span class="pictos">i</span>
<button class="pictos" name="quality_chat" type="roll" value="@{gm_toggle} &{template:quality}{{header=@{character_name}}}{{base=@{name}}}{{desc=@{notes}}}{{rating=@{rating}}}">w</button>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<input name="attr_name" data-i18n-placeholder="qualitiesphname" placeholder="quality name" title="@{repeating_quality_${x}_name}" type="text"/>
<label data-i18n-title="rating" title="@{repeating_quality_${x}_rating}">
<input name="attr_rating" placeholder="-" type="number" title="@{repeating_quality_${x}_rating}"/>
</label>
<select name="attr_type" title="@{repeating_quality_${x}_type}">
<option data-i18n="p" value="P" selected="selected">P</option>
<option data-i18n="n" value="N">N</option>
</select>
<h3 data-i18n="notes">notes</h3>
<label data-i18n-title="notes" title="notes">
<textarea name="attr_notes" data-i18n-placeholder="notes" placeholder="Notes" title="@{repeating_quality_${x}_notes}"></textarea>
</label>
<h3 data-i18n="modifications">modifications</h3>
<label data-i18n-title="modifications" title="modifications">
<textarea name="attr_modifications" data-i18n-placeholder="mods" placeholder="Mechanic: +/- mod" title="@{repeating_quality_${x}_modifications}"></textarea>
</label>
</div>
</fieldset>
</div>
</div>
<div class="martial">
<div class="row-long headers">
<h2 data-i18n="technique">Technique</h2>
<h2 data-i18n="style">Style</h2>
</div>
<div class="rows repeating-container">
<fieldset class="repeating_martial"><span name="attr_technique"></span><span class="center" name="attr_style"></span>
<button class="pictos" name="technique_chat" type="roll" value="@{gm_toggle} &amp;{template:rolls-computed}{{header=@{character_name}}}{{base=@{style} - @{technique}}}{{desc=@{notes}}}">w</button>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<input name="attr_technique" data-i18n-placeholder="techniquesphname" placeholder="technique name" title="@{repeating_martial_${x}_technique}" type="text"/>
<input name="attr_style" data-i18n-placeholder="techniquesphstyle" placeholder="style name" title="@{repeating_martial_${x}_style}" type="text"/>
<h3 data-i18n="notes">notes</h3>
<label data-i18n-title="notes" title="notes">
<textarea name="attr_notes" data-i18n-placeholder="notes" placeholder="Notes" title="@{repeating_martial_${x}_notes}"></textarea>
</label>
</div>
</fieldset>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="arms pc-col">
<div class="pc-row weapons">
<div class="header right-header">
<h1 data-i18n="weapons">Weapons</h1>
<div class="right-tri"></div>
</div>
<div class="header right-header">
<div class="header htab">
<input class="tab-switch" name="attr_weapon_type_toggle" type="radio" value="range" checked="checked"/>
<h1 data-i18n="ranged">Ranged</h1>
<div class="right-tri"></div>
</div>
<div class="header htab">
<div class="triangle"></div>
<input class="tab-switch" name="attr_weapon_type_toggle" type="radio" value="melee"/>
<h1 data-i18n="melee">Melee</h1>
<div class="right-tri"></div>
</div>
<div class="header htab">
<div class="triangle"></div>
<input class="tab-switch" name="attr_weapon_type_toggle" type="radio" value="grenade"/>
<h1 data-i18n="grenade">Grenade</h1>
<div class="right-tri"></div>
</div>
</div>
<div class="border-box">
<div class="pc-box medium-box">
<input class="tab-switch" name="attr_weapon_type_toggle" type="hidden" value="range"/>
<div class="rows repeating-container weapon-range">
<div class="row-long headers">
<span></span>
<h2 data-i18n="weapon">Weapon</h2>
<h2 data-i18n="pool">Pool</h2>
<h2 data-i18n="dam">Dam</h2>
<h2 class="center" data-i18n="c" title="Close 0-3">C</h2>
<h2 class="center" data-i18n="n" title="Near 4-50">N</h2>
<h2 class="center" data-i18n="m" title="Medium 51-250">M</h2>
<h2 class="center" data-i18n="f" title="Far 251-500">F</h2>
<h2 class="center" data-i18n="e" title="Extreme 500+">E</h2>
<h2 data-i18n="ammo">Ammo</h2>
</div>
<fieldset class="repeating_range">
<input title="@{repeating_range_${x}_rating}" name="attr_rating" type="hidden" value="0" />
<input name="attr_skill" type="hidden" value=""/>
<input name="attr_attribute" type="hidden" value="Agility"/>
<input name="attr_attr_rating" type="hidden" value="1"/>
<input name="attr_updateme" type="hidden" value="0"/>
<input class="flag-primary" name="attr_primary" type="hidden" value=""/>
<input class="flag-primary" name="attr_additional" type="hidden" value=""/>
<input class="toggle" name="attr_primary" value="primary" type="checkbox" />
<span class="pictos powerbutton">2</span>
<button name="act_rangeweapon" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{weapon}\n@{skill} + @{attribute}}}{{dice=[[(@{rating}+@{attr_rating}+@{spec}+@{expert}+@{dicepool_modifier}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=Mode: SS, Damage @{damage}, Skill: @{skill}, Attribute: @{attribute}, Notes @{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<span class="center" name="attr_dicepool"></span>
<span class="center" name="attr_damage"></span>
<span class="center" name="attr_close"></span>
<span class="center" name="attr_near"></span>
<span class="center" name="attr_medium"></span>
<span class="center" name="attr_far"></span>
<span class="center" name="attr_extreme"></span>
<span class="center" name="attr_ammo"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<span></span>
<label data-i18n-title="weapon" title="weapon">
<input name="attr_name" placeholder="Ares Predator" title="@{repeating_range_${x}_weapon}" type="text" value=""/>
</label>
<label data-i18n-title="pool" title="pool">
<input name="attr_dicepool" placeholder="" title="@{repeating_range_${x}_dicepool}" type="text" value=""/>
</label>
<label data-i18n-title="dam" title="dam">
<input name="attr_damage" placeholder="9P" title="@{repeating_range_${x}_damage}" type="text" value=""/>
</label>
<label data-i18n-title="c" title="Close">
<input name="attr_close" placeholder="-" title="@{repeating_range_${x}_close}" type="text" value=""/>
</label>
<label data-i18n-title="n" title="Near">
<input name="attr_near" placeholder="-" title="@{repeating_range_${x}_near}" type="text" value=""/>
</label>
<label data-i18n-title="m" title="Medium">
<input name="attr_medium" placeholder="-" title="@{repeating_range_${x}_medium}" type="text" value=""/>
</label>
<label data-i18n-title="f" title="Far">
<input name="attr_far" placeholder="-" title="@{repeating_range_${x}_far}" type="text" value=""/>
</label>
<label data-i18n-title="e" title="Extreme">
<input name="attr_extreme" placeholder="-" title="@{repeating_range_${x}_extreme}" type="text" value=""/>
</label>
<label data-i18n-title="ammo" title="ammo">
<input name="attr_ammo" placeholder="15" title="@{repeating_range_${x}_ammo}" type="number" value=""/>
</label>
<span></span>
<span></span>
<div class="row">
<h3 data-i18n="firingmodes">Firing Modes</h3>
<label data-i18n-title="modeoptions" title="Mode Options">
<input name="attr_firing_modes" placeholder="SS/SA/BF/BW/FA" type="text" title="@{repeating_range_${x}_firing_modes}}"/>
</label>
<h3 data-i18n="modifier">modifier</h3>
<label data-i18n-title="modifier" title="modifier">
<input name="attr_dicepool_modifier" title="@{repeating_range_${x}_dicepool_modifier}" value='0' type="number"/>
</label>
</div>
<div class="row">
<input type="hidden" name="attr_singleshot" value="0" />
<input type="hidden" name="attr_semiauto" value="0" />
<input type="hidden" name="attr_burst" value="0" />
<input type="hidden" name="attr_burstwide" value="0" />
<input type="hidden" name="attr_fullauto" value="0" />
<input type="hidden" name="attr_other" value="0" />
<h3 data-i18n="defaultfiringmode">Default Firing Mode</h3>
<select name="attr_default_mode" title="@{default_mode}">
<option data-i18n="singleshot" value="Single Shot" selected="selected">Single Shot</option>
<option data-i18n="semiauto" value="Semi Auto">Semi-Auto</option>
<option data-i18n="burstfire" value="Burst Fire">Burst Fire</option>
<option data-i18n="burstwide" value="Burst Fire">Burst Fire Wide</option>
<option data-i18n="fullauto" value="Full Auto">Full Auto</option>
<option data-i18n="other" value="Other">Other</option>
</select>
<h3 data-i18n="has_mods">Has Mods</h3>
<input name="attr_has_mods" value="1" title="@{repeating_range_${x}_has_mods" type="checkbox"/>
</div>
<div class="row">
<h3 data-i18n="skill">skill</h3>
<select name="attr_skill" title="@{repeating_range_${x}_skill}">
<option data-i18n="firearms" value="Firearms" selected="selected">Firearms</option>
<option data-i18n="exoticweapons" value="Exotic Weapons">Exotic Weapons</option>
<option data-i18n="athletics" value="Athletics">Athletics</option>
<option data-i18n="engineering" value="Engineering">Engineering</option>
</select>
<h3 data-i18n="specialization">specialization</h3>
<label data-i18n-title="specialization" title="specialization">
<input name="attr_spec" value="2" title="@{repeating_range_${x}_spec}" type="checkbox"/>
</label>
<h3 data-i18n="expertise">expertise</h3>
<label data-i18n-title="expertise" title="expertise">
<input name="attr_expert" value="3" title="@{repeating_range_${x}_expert}" type="checkbox"/>
</label>
<input name="attr_skill" type="hidden" value=""/>
<input name="attr_rating" type="hidden" value=""/>
<div class="exotic-warning"><i data-i18n="exoticnote">Exotic weapons are not linked to a skill. Use Modifier input to set dicepool.</i></div>
</div>
<h3 data-i18n="notes">notes</h3>
<label data-i18n-title="notes" title="notes">
<textarea name="attr_notes" placeholder="Notes" title="@{repeating_range_${x}_notes}"></textarea>
</label>
</div>
</fieldset>
</div>
<div class="rows repeating-container weapon-melee">
<div class="row-long headers">
<span></span>
<h2 data-i18n="weapon">Weapon</h2>
<h2 data-i18n="pool">Pool</h2>
<h2 data-i18n="dam">Dam</h2>
<h2 data-i18n="c" title="Close 0-3">C</h2>
<h2 data-i18n="n" title="Near 4-50">N</h2>
<h2 data-i18n="m" title="Medium 51-250">M</h2>
<h2 data-i18n="f" title="Far 251-500">F</h2>
<h2 data-i18n="e" title="Extreme 500+">E</h2>
</div>
<fieldset class="repeating_melee">
<input title="@{repeating_melee_${x}_rating}" name="attr_rating" type="hidden" value="0" />
<input name="attr_skill" type="hidden" value=""/>
<input name="attr_attribute" type="hidden" value="Agility"/>
<input name="attr_attr_rating" type="hidden" value="1"/>
<input name="attr_updateme" type="hidden" value="0"/>
<input class="flag-primary" name="attr_primary" type="hidden" value=""/>
<input class="flag-primary" name="attr_additional" type="hidden" value=""/>
<input class="toggle" name="attr_primary" value="primary" type="checkbox" />
<span class="pictos powerbutton">2</span>
<button name="act_meleeweapon" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name}}}{{dice=[[(@{rating}+@{attr_rating}+@{spec}+@{expert}+@{dicepool_modifier}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=Damage @{damage}, Skill: @{skill}, Attribute: @{attribute}, Notes: @{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<span class="center" name="attr_dicepool"></span>
<span class="center" name="attr_damage"></span>
<span class="center" name="attr_close"></span>
<span class="center" name="attr_near"></span>
<span class="center" name="attr_medium"></span>
<span class="center" name="attr_far"></span>
<span class="center" name="attr_extreme"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<span></span>
<label data-i18n-title="name" title="name">
<input name="attr_name" placeholder="Katana" title="@{repeating_melee_${x}_name}" type="text" value=""/>
</label>
<label data-i18n-title="pool" title="pool">
<input name="attr_dicepool" placeholder="0d6" title="@{repeating_melee_${x}_dicepool}" type="text" value=""/>
</label>
<label data-i18n-title="dam" title="dam">
<input name="attr_damage" placeholder="5P" title="@{repeating_melee_${x}_damage}" type="text" value=""/>
</label>
<label data-i18n-title="close" title="Close 0-3">
<input name="attr_close" placeholder="-" title="@{repeating_melee_${x}_close}" type="text" value=""/>
</label>
<label data-i18n-title="near" title="Near 4-50">
<input name="attr_near" placeholder="-" title="@{repeating_melee_${x}_near}" type="text" value=""/>
</label>
<label data-i18n-title="medium" title="Medium 51-250">
<input name="attr_medium" placeholder="-" title="@{repeating_melee_${x}_medium}" type="text" value=""/>
</label>
<label data-i18n-title="far" title="Far 251-500">
<input name="attr_far" placeholder="-" title="@{repeating_melee_${x}_far}" type="text" value=""/>
</label>
<label data-i18n-title="extreme" title="Extreme 500+">
<input name="attr_extreme" placeholder="-" title="@{repeating_melee_${x}_extreme}" type="text" value=""/>
</label>
<div class="row">
<h3 data-i18n="skill">skill</h3>
<select name="attr_skill" title="@{repeating_melee_${x}_skill}">
<option data-i18n="closecombat" value="Close Combat" selected="selected">Close Combat</option>
<option data-i18n="athletics" value="Athletics">Athletics</option>
<option data-i18n="exoticweapons" value="Exotic Weapons">Exotic Weapons</option>
<option data-i18n="engineering" value="Engineering">Engineering</option>
</select>
<h3 data-i18n="specialization">specialization</h3>
<label data-i18n-title="specialization" title="specialization">
<input name="attr_spec" value="2" title="@{repeating_melee_${x}_spec}" type="checkbox"/>
</label>
<h3 data-i18n="expertise">expertise</h3>
<label data-i18n-title="expertise" title="expertise">
<input name="attr_expert" value="3" title="@{repeating_melee_${x}_expert}" type="checkbox"/>
</label>
<div class="exotic-warning"><i data-i18n="exoticnote">Exotic weapons are not linked to a skill. Use Modifier input to set dicepool.</i></div>
</div>
<div class="row">
<h3 data-i18n="modifier">modifier</h3>
<label data-i18n-title="modifier" title="modifier">
<input name="attr_dicepool_modifier" title="@{repeating_melee_${x}_dicepool_modifier}" value='0' type="number"/>
</label>
</div>
<h3 data-i18n="notes">notes</h3>
<label data-i18n-title="notes" title="notes">
<textarea name="attr_notes" placeholder="Notes" title="@{repeating_melee_${x}_notes}"></textarea>
</label>
</div>
</fieldset>
</div>
<div class="rows repeating-container weapon-grenade">
<button name="roll_GrenadeScatterAndDistance" style="display: none !important;" type="roll" value="/w GM &{template:multirow}{{header=Grenade}}{{base=Bounce & Scatter}}{{desc=Scatter Direction [[2d6]]}}{{desc2=Bounce Distance [[{[[2d6]]-(?{Hits?|0}?{Range?|Close,+4|Near,+2|Medium,+0|Far,-2|Extreme,-4}),0}kh1]]m}}"></button>
<div class="row-long headers">
<h2 data-i18n="grenade">Grenade</h2>
<h2 data-i18n="pool">Pool</h2>
<h2 data-i18n="gz" title="Ground Zero ~1m">GZ</h2>
<h2 data-i18n="c" title="Close 1-3">C</h2>
<h2 data-i18n="n" title="Near 4-50">N</h2>
<h2 data-i18n="blast" title="Blast Area">Blast</h2>
</div>
<fieldset class="repeating_grenade">
<input type="hidden" name="attr_dicepool">
<input class="flag-primary" name="attr_primary" type="hidden" value=""/>
<input class="flag-primary" name="attr_additional" type="hidden" value=""/>
<button class="dicepool" name="act_grenadeweapon" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name}}}{{dice=[[(@{type}+@{spec}+@{expert}+@{dicepool_modifier}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=DV @{ground_zero}/@{close}/@{near}, Blast Area: @{blast}, Notes: @{notes} [GM Roll Scatter](~@{character_name}|GrenadeScatterAndDistance)}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<button class="no-dicepool" name="act_grenadeweaponnodicepool" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name}}}{{dice=[[(@{type}+@{spec}+@{expert}+@{dicepool_modifier}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=DV @{ground_zero}/@{close}/@{near}, Blast Area: @{blast}, Notes: @{notes} [GM Roll Scatter](~@{character_name}|GrenadeScatterAndDistance)}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<span class="center" name="attr_dicepool"></span>
<span class="center" name="attr_ground_zero"></span>
<span class="center" name="attr_close"></span>
<span class="center" name="attr_near"></span>
<span class="center" name="attr_blast"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<label data-i18n-title="name" title="name">
<input name="attr_name" data-i18n-placeholder="grenadephname" placeholder="Fragmentation" title="@{repeating_grenade_${x}_name}" type="text" value=""/>
</label>
<label data-i18n-title="pool" title="pool">
<input name="attr_dicepool" title="@{repeating_grenade_${x}_dicepool}" type="text" value=""/>
</label>
<label data-i18n-title="gz" title="Ground Zero <1m">
<input name="attr_ground_zero" data-i18n-placeholder="grenadephgz" placeholder="16P" title="@{repeating_grenade_${x}_ground_zero}" type="text" value=""/>
</label>
<label data-i18n-title="close" title="Close 1-3">
<input name="attr_close" data-i18n-placeholder="grenadephclose" placeholder="12P" title="@{repeating_grenade_${x}_close}" type="text" value=""/>
</label>
<label data-i18n-title="near" title="Near 4-50">
<input name="attr_near" data-i18n-placeholder="grenadephnear" placeholder="8P" title="@{repeating_grenade_${x}_near}" type="text" value=""/>
</label>
<label data-i18n-title="blast" title="Blast Area">
<input name="attr_blast" data-i18n-placeholder="grenadephblast" placeholder="20m" title="@{repeating_grenade_${x}_blast}" type="text" value=""/>
</label>
<div class="row">
<h3 data-i18n="type">type</h3>
<select name="attr_type" title="@{repeating_grenade_${x}_type}">
<option data-i18n="custom_dicepool" value="custom">Custom Dicepool</option>
<option data-i18n="thrown" value="@{athletics}+@{agility}">Thrown</option>
<option data-i18n="launcher" value="@{exotic weapons}+@{logic}">Exotic Weapons</option>
<option data-i18n="engineering" value="@{engineering}+@{logic}">Engineering</option>
</select>
<h3 data-i18n="specialization">specialization</h3>
<label data-i18n-title="specialization" title="specialization">
<input name="attr_spec" value="2" title="@{repeating_grenade_${x}_spec}" type="checkbox"/>
</label>
<h3 data-i18n="expertise">expertise</h3>
<label data-i18n-title="expertise" title="expertise">
<input name="attr_expert" value="3" title="@{repeating_grenade_${x}_expert}" type="checkbox"/>
</label>
</div>
<div class="row">
<h3 data-i18n="modifier">modifier</h3>
<label data-i18n-title="modifier" title="modifier">
<input name="attr_dicepool_modifier" title="@{repeating_grenade_${x}_dicepool_modifier}" placeholder='0' type="number" value="0"/>
</label>
</div>
<h3 data-i18n="notes">notes</h3>
<label data-i18n-title="notes" title="notes">
<textarea name="attr_notes" placeholder="Notes" title="@{repeating_grenade_${x}_notes}"></textarea>
</label>
</div>
</fieldset>
</div>
</div>
</div>
</div>
<div class="pc-row armor">
<div class="header right-header">
<h1 data-i18n="armor">Armor</h1>
<div class="right-tri"></div>
</div>
<div class="border-box">
<div class="pc-box medium-box">
<div class="rows repeating-container">
<div class="row-long headers">
<h2 data-i18n="armor">Armor</h2>
<h2 data-i18n="dr">DR</h2>
<h2 data-i18n="chem">Chem</h2>
<h2 data-i18n="cold">Cold</h2>
<h2 data-i18n="elec">Elec</h2>
<h2 data-i18n="fire">Fire</h2>
<h2 data-i18n="social">Social</h2>
</div>
<fieldset class="repeating_armor">
<input class="flag-primary" name="attr_primary" type="hidden" value=""/>
<span name="attr_name"></span>
<span class="center" name="attr_rating"></span>
<span class="center" name="attr_chem"></span>
<span class="center" name="attr_cold"></span>
<span class="center" name="attr_elec"></span>
<span class="center" name="attr_fire"></span>
<span class="center" name="attr_social"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<label data-i18n-title="name" title="name">
<input name="attr_name" data-i18n-placeholder="armorphname" placeholder="Armor Jacket" title="@{repeating_armor_${x}_name}" type="text" value=""/>
</label>
<label data-i18n-title="rating" title="rating">
<input name="attr_rating" placeholder="12" title="@{repeating_armor_${x}_rating}" type="number" value=""/>
</label>
<label data-i18n-title="chemical" title="chemical">
<input name="attr_chem" placeholder="0" title="@{repeating_armor_${x}_chem}" type="number" value="0" min="0" step="1"/>
</label>
<label data-i18n-title="cold" title="cold">
<input name="attr_cold" placeholder="0" title="@{repeating_armor_${x}_cold}" type="number" value="0" min="0" step="1"/>
</label>
<label data-i18n-title="elec" title="elec">
<input name="attr_elec" placeholder="0" title="@{repeating_armor_${x}_elec}" type="number" value="0" min="0" step="1"/>
</label>
<label data-i18n-title="fire" title="fire">
<input name="attr_fire" placeholder="0" title="@{repeating_armor_${x}_fire}" type="number" value="0" min="0" step="1"/>
</label>
<label data-i18n-title="social" title="social">
<input name="attr_social" placeholder="0" title="@{repeating_armor_${x}_social}" type="number" value="0" step="1"/>
</label>
<div class="row">
<h3 data-i18n="primary">Primary</h3>
<label data-i18n-title="primary" title="Primary">
<input name="attr_primary" type="checkbox" title="@{repeating_armor_${x}_primary}" value="primary"/>
</label>
<h3 data-i18n="cumulative">Cumulative</h3>
<label data-i18n-title="cumulative" title="Cumulative">
<input name="attr_cumulative" type="checkbox" title="@{repeating_armor_${x}_cumulative}" value="cumulative"/>
</label>
<h3 data-i18n="capacity">Capacity</h3>
<label data-i18n-title="capacity" title="Capacity">
<input name="attr_capacity" placeholder="0" title="@{repeating_armor_${x}_capacity}" type="number" value="0" step="1"/>
</label>
</div>
<h3 data-i18n="notes">notes</h3>
<label data-i18n-title="notes" title="notes">
<textarea name="attr_notes" placeholder="Notes" title="@{repeating_armor_${x}_notes}"></textarea>
</label>
</div>
</fieldset>
</div>
</div>
</div>
</div>
</div>
<div class="augs pc-col">
<div class="pc-row">
<div class="header right-header">
<h1 data-i18n="augmentations">Augmentations</h1>
<div class="right-tri"></div>
</div>
<div class="border-box">
<div class="pc-box medium-box">
<div class="row-long headers">
<h2 data-i18n="augmentations">Augmentations</h2>
<h2 data-i18n="rating">Rating</h2>
<h2 data-i18n="esscost">Ess Cost</h2>
</div>
<div class="rows repeating-container">
<fieldset class="repeating_augmentations">
<span name="attr_name"></span>
<span class="center" name="attr_rating"></span>
<span class="center" name="attr_essence_cost"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<div class="row1">
<label data-i18n-title="Augmentations" title="Augmentations">
<input name="attr_name" data-i18n-placeholder="name" placeholder="name" title="@{repeating_augmentations_${x}_augmentation}" type="text" value=""/>
</label>
<label data-i18n-title="Rating" title="Rating">
<input name="attr_rating" placeholder="0" title="@{repeating_augmentations_${x}_rating}" type="number" value=""/>
</label>
<label data-i18n-title="Essence" title="Essence">
<input name="attr_essence_cost" placeholder="0" title="@{repeating_augmentations_${x}_essence_cost}" type="number" step="0.01" value=""/>
</label>
<span>&nbsp;</span>
<span>&nbsp;</span>
</div>
<div class="row2">
<label data-i18n-title="Grade" title="Grade">
<span data-i18n="grade"></span>
<select name="attr_grade" title="@{repeating_augmentations_${x}_grade}">
<option data-i18n="used" value="Used">Used</option>
<option data-i18n="omega" value="Omega">Omega</option>
<option data-i18n="exoware" vaue="Exoware">Exoware</option>
<option data-i18n="standard" value="Standard" selected="selected">Standard</option>
<option data-i18n="alphaware" value="Alphaware">Alphaware</option>
<option data-i18n="betaware" value="Betaware">Betaware</option>
<option data-i18n="deltaware" value="Deltaware">Deltaware</option>
<option data-i18n="gammaware" value="Gammaware">Gammaware</option>
</select>
</label>
</div>
<div class="row3">
<label data-i18n-title="essence_base" title="Essence Base">
<span data-i18n="essence_base" title="Place the base essence cost for Standard Grade, Rating 1 augmentation here. If the essence cost is based on Rating x #.#, enter 'Rating x 0.1' and make sure 'Essence Cost Raw' is unchecked"></span>
<input class="" style="width: unset;" name="attr_essence_base" placeholder="" title="@{repeating_augmentations_${x}_essence_base" type="text" value="" />
</label>
<span>&nbsp;</span>
<label data-i18n-title="essence_cost_raw_title" title="Use Raw Essence Cost (no calculations applied)">
<span data-i18n="essence_cost_raw" title="Do not apply any calculations to the current Essence Cost value. This is checked by default for legacy characters to avoid changing data incorrectly."></span>
<input class="" name="attr_essence_cost_raw" placeholder="" title="@{repeating_augmentations_${x}_essence_base" type="hidden" value="" />
<input class="" name="attr_essence_cost_raw" placeholder="" title="@{repeating_augmentations_${x}_essence_base" type="checkbox" value="1" />
</label>
</div>
<label data-i18n-title="notes" title="notes">
<span data-i18n="notes">notes</span>
<textarea name="attr_notes" data-i18n-placeholder="notes" placeholder="Notes" title="@{repeating_augmentations_${x}_notes}"></textarea>
</label>
<label data-i18n-title="modifications" title="modifications">
<span data-i18n="modifications">modifications</span>
<textarea name="attr_modifications" data-i18n-placeholder="mods" placeholder="Attribute: +/- mod" title="@{repeating_augmentations_${x}_modifications}"></textarea>
</label>
</div>
</fieldset>
</div>
</div>
</div>
</div>
</div>
<div class="gear pc-col">
<div class="pc-row">
<div class="header right-header">
<h1 data-i18n="gear">Gear</h1>
<div class="right-tri"></div>
</div>
<div class="border-box">
<div class="pc-box medium-box">
<div class="row-long headers">
<h2 data-i18n="item">Item</h2>
<h2 data-i18n="rating">Rating</h2>
<h2 data-i18n="quantity">Quantity</h2>
</div>
<div class="rows repeating-container">
<fieldset class="repeating_items"><span name="attr_name"></span><span class="center" name="attr_rating"></span><span class="center" name="attr_quantity"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/><span class="pictos">i</span>
<button class="pictos" name="item_chat" type="roll" value="@{gm_toggle} &{template:quality}{{header=@{character_name}}}{{base=@{name}}}{{desc=@{notes}}}{{rating=@{rating}}}">w</button>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<label data-i18n-title="name" title="name">
<input name="attr_name" data-i18n-placeholder="geardefaultname" placeholder="Jammer" title="@{repeating_items_${x}_name}" type="text" value=""/>
</label>
<label data-i18n-title="rating" title="rating">
<input name="attr_rating" placeholder="3" title="@{repeating_items_${x}_rating}" type="text" value=""/>
</label>
<label data-i18n-title="quantity" title="quantity">
<input name="attr_quantity" placeholder="x3" title="@{repeating_items_${x}_quantity}" type="text" value=""/>
</label>
<h3 data-i18n="notes">notes</h3>
<label data-i18n-title="notes" title="notes">
<textarea name="attr_notes" data-i18n-placeholder="notes" placeholder="Notes" title="@{repeating_items_${x}_notes}"></textarea>
</label>
<h3 data-i18n="modifications">modifications</h3>
<label data-i18n-title="modifications" title="modifications">
<textarea name="attr_modifications" data-i18n-placeholder="mods" placeholder="Attribute: +/- mod" title="@{repeating_items_${x}_modifications}"></textarea>
</label>
</div>
</fieldset>
</div>
</div>
</div>
</div>
</div>
<div class="magic pc-col">
<div class="pc-row spell-box">
<div class="header right-header">
<h1 data-i18n="magic">Magic</h1>
<div class="right-tri"></div>
</div>
<div class="header right-header">
<div class="header htab">
<div class="triangle"></div>
<input class="magic-toggle" name="attr_magic_toggle" title="@{magic_toggle}" type="radio" value="spells" checked="checked"/>
<h1 data-i18n="spells">Spells</h1>
<div class="right-tri"></div>
</div>
<div class="header htab">
<div class="triangle"></div>
<input class="magic-toggle" name="attr_magic_toggle" title="@{magic_toggle}" type="radio" value="preps"/>
<h1 data-i18n="prep">Prep...</h1>
<div class="right-tri"></div>
</div>
<div class="header htab">
<div class="triangle"></div>
<input class="magic-toggle" name="attr_magic_toggle" title="@{magic_toggle}" type="radio" value="rituals"/>
<h1 data-i18n="rituals">Rituals</h1>
<div class="right-tri"></div>
</div>
</div>
<div class="border-box">
<div class="pc-box medium-box">
<input class="magic-toggle" name="attr_magic_toggle" type="hidden" value="spells"/>
<div class="magic-spells spellsFormulas">
<div class="row-long">
<button data-i18n="drain" name="act_spell_drain" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{spell} ^{drain}}}{{dice=[[((@{spell_drain_attribute_1}+@{spell_drain_attribute_2}+@{spell_drain_modifier})+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<select class="attribute-select" name="attr_spell_drain_attribute_1" title="@{spell_drain_attribute_1}">
<option data-i18n="body" value="@{body}">Body</option>
<option data-i18n="agility" value="@{agility}">Agility</option>
<option data-i18n="reaction" value="@{reaction}">Reaction</option>
<option data-i18n="strength" value="@{strength}">Strength</option>
<option data-i18n="willpower" value="@{willpower}">Willpower</option>
<option data-i18n="logic" value="@{logic}" selected="selected">Logic</option>
<option data-i18n="intuition" value="@{intuition}">Intuition</option>
<option data-i18n="charisma" value="@{charisma}">Charisma</option>
<option data-i18n="magic" value="@{magic}">Magic</option>
<option data-i18n="resonance" value="@{resonance}">Resonance</option>
</select><span>+</span>
<select class="attribute-select" name="attr_spell_drain_attribute_2" title="@{spell_drain_attribute_2}">
<option data-i18n="body" value="@{body}">Body</option>
<option data-i18n="agility" value="@{agility}">Agility</option>
<option data-i18n="reaction" value="@{reaction}">Reaction</option>
<option data-i18n="strength" value="@{strength}">Strength</option>
<option data-i18n="willpower" value="@{willpower}" selected="selected">Willpower</option>
<option data-i18n="logic" value="@{logic}">Logic</option>
<option data-i18n="intuition" value="@{intuition}">Intuition</option>
<option data-i18n="charisma" value="@{charisma}">Charisma</option>
<option data-i18n="magic" value="@{magic}">Magic</option>
<option data-i18n="resonance" value="@{resonance}">Resonance</option>
</select>
<h3 data-i18n="modifier">modifier</h3>
<label data-i18n-title="modifier" title="modifier">
<input name="attr_spell_drain_modifier" title="@{spell_drain_modifier}" type="number" value="0"/>
</label>
</div>
<div class="rows repeating-container">
<div class="row-long headers">
<h2 data-i18n="spell">Spell</h2>
<h2 data-i18n="type">Type</h2>
<h2 data-i18n="range">Range</h2>
<h2 data-i18n="duration">Duration</h2>
<h2 data-i18n="drain">Drain</h2>
</div>
<fieldset class="repeating_spell">
<input name="attr_dicepool" type="hidden" value="0" />
<input name="attr_category" type="hidden" value="" />
<input name="attr_range" type="hidden" value="" />
<button name="act_spell" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{dice=[[((@{skill}+@{magic}+@{dicepool_modifier}+@{specialization}+@{expertise})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{ampup=[[?{Amp Up|0|1|2|3|4|5|6|7|8|9|10}]]}}{{increasearea=[[?{Increase Area|0m,0|2m,1|4m,2|6m,3|8m,4|10m,5|12m,5|14m,6|16m,8|18m,9|20m,10}*2]]}}{{drain=[[?{Amp Up}*2+?{Increase Area}+(@{drain})]]}}{{desc=@{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<button name="act_spellaoe" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{dice=[[((@{skill}+@{magic}+@{dicepool_modifier}+@{specialization}+@{expertise})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{ampup=[[?{Amp Up|0|1|2|3|4|5|6|7|8|9|10}]]}}{{increasearea=[[?{Increase Area|0m,0|2m,1|4m,2|6m,3|8m,4|10m,5|12m,5|14m,6|16m,8|18m,9|20m,10}*2]]}}{{drain=[[?{Amp Up}*2+?{Increase Area}+(@{drain})]]}}{{desc=@{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<button name="act_noncombatspell" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{dice=[[((@{skill}+@{magic}+@{dicepool_modifier}+@{specialization}+@{expertise})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{increasearea=[[?{Increase Area|0m,0|2m,1|4m,2|6m,3|8m,4|10m,5|12m,5|14m,6|16m,8|18m,9|20m,10}*2]]}}{{drain=[[?{Increase Area}+(@{drain})]]}}{{desc=@{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<button name="act_noncombatspellaoe" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{dice=[[((@{skill}+@{magic}+@{dicepool_modifier}+@{specialization}+@{expertise})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{increasearea=[[?{Increase Area|0m,0|2m,1|4m,2|6m,3|8m,4|10m,5|12m,5|14m,6|16m,8|18m,9|20m,10}*2]]}}{{drain=[[?{Increase Area}+(@{drain})]]}}{{desc=@{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<span class="center" name="attr_type"></span>
<span class="center" name="attr_range"></span>
<span class="center" name="attr_duration"></span>
<span class="center" name="attr_drain"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox" checked="checked"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<label data-i18n-title="name" title="Name">
<input name="attr_name" data-i18n-placeholder="spellsphname" placeholder="Fireball" title="@{repeating_spell_${x}_name}" type="text"/>
</label>
<select name="attr_type" title="@{repeating_spell_${x}_type}">
<option data-i18n="mana" value="Mana">mana</option>
<option data-i18n="physical" value="Physical" selected="selected">physical</option>
</select>
<select name="attr_range" title="@{repeating_spell_${x}_range}">
<option data-i18n="los" value="LOS" selected="selected">los</option>
<option data-i18n="los (a)" value="LOS (A)">los (a)</option>
<option data-i18n="special" value="Special">special</option>
<option data-i18n="touch" value="T">touch</option>
</select>
<select name="attr_duration" title="@{repeating_spell_${x}_duration}">
<option data-i18n="instant" value="Instant" selected="selected">Instant</option>
<option data-i18n="sustained" value="Sustained">Sustained</option>
<option data-i18n="limited" value="Limited">Limited</option>
<option data-i18n="permanent" value="Permanent">Permanent</option>
</select>
<label data-i18n-title="drain" title="Drain">
<input name="attr_drain" placeholder="1" title="@{repeating_spell_${x}_drain}" type="number"/>
</label>
<div class="row">
<h3 data-i18n="category">Category</h3>
<select name="attr_category" title="@{repeating_spell_${x}_category}">
<option data-i18n="combat" value="Combat" selected="selected">combat</option>
<option data-i18n="detection" value="Detection">detection</option>
<option data-i18n="health" value="Health">health</option>
<option data-i18n="illusion" value="Illusion">illusion</option>
<option data-i18n="manipulation" value="Manipulation">manipulation</option>
</select>
<h3 data-i18n="effecttype">Effect Type</h3>
<select name="attr_effect_type" title="@{repeating_spell_${x}_effect_type}">
<option data-i18n="none" value="" selected="selected">None</option>
<option data-i18n="directcombat" value="Direct Combat">Direct Combat</option>
<option data-i18n="directcombatarea" value="Direct Combat, Area">Direct Combat, Area</option>
<option data-i18n="indirectcombat" value="Indirect Combat">Indirect Combat</option>
<option data-i18n="indirectcombatarea" value="Indirect Combat, Area">Indirect Combat, Area</option>
<option data-i18n="singlesense" value="Single-Sense">Single-Sense</option>
<option data-i18n="multisense" value="Multi-Sense">Multi-Sense</option>
</select>
</div>
<div class="row">
<h3 data-i18n="skill">Skill</h3>
<select name="attr_skill" title="@{repeating_spell_${x}_skill}">
<option data-i18n="sorcery" value="@{sorcery}" selected="selected">Sorcery</option>
<option data-i18n="conjuring" value="@{conjuring}">Conjuring</option>
<option data-i18n="enchanting" value="@{enchanting}">Enchanting</option>
</select>
<h3 data-i18n="specialization">Specialization</h3>
<label data-i18n-title="specialization" title="Specialization">
<input name="attr_specialization" title="@{repeating_spell_${x}_specialization}" type="checkbox" value="2"/>
</label>
<h3 data-i18n="expertise">Expertise</h3>
<label data-i18n-title="expertise" title="Expertise">
<input name="attr_expertise" title="@{repeating_spell_${x}_expertise}" type="checkbox" value="3"/>
</label>
</div>
<div class="row">
<h3 data-i18n="modifierdice">modifier dice</h3>
<label data-i18n-title="modifierdice" title="modifier dice">
<input name="attr_dicepool_modifier" placeholder="0" title="@{repeating_spell_${x}_dicepool_modifier}" type="text" value="0" />
</label>
<h3 data-i18n="damage_type">Damage Type</h3>
<select name="attr_damage" title="@{repeating_spell_${x}_damage}">
<option data-i18n="unset" value="" selected="selected">Unset</option>
<option data-i18n="stun" value="Stun">Stun</option>
<option data-i18n="physical" value="Physical">Physical</option>
<option data-i18n="physical_special" value="Physical, Special">Physical, Special</option>
</select>
</div>
<h3 data-i18n="notes">notes</h3>
<label data-i18n-title="notes" title="notes">
<textarea name="attr_notes" data-i18n-placeholder="notes" placeholder="Notes" title="@{repeating_spell_${x}_notes}"></textarea>
</label>
</div>
</fieldset>
</div>
</div>
<div class="magic-preps spellsFormulas">
<div class="row-long">
<button data-i18n="drain" name="act_preparation_drain" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{preparation} ^{drain}}}{{dice=[[((@{spell_drain_attribute_1}+@{spell_drain_attribute_2}+@{spell_drain_modifier})+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<select class="attribute-select" name="attr_spell_drain_attribute_1" title="@{spell_drain_attribute_1}">
<option data-i18n="body" value="@{body}">Body</option>
<option data-i18n="agility" value="@{agility}">Agility</option>
<option data-i18n="reaction" value="@{reaction}">Reaction</option>
<option data-i18n="strength" value="@{strength}">Strength</option>
<option data-i18n="willpower" value="@{willpower}">Willpower</option>
<option data-i18n="logic" value="@{logic}" selected="selected">Logic</option>
<option data-i18n="intuition" value="@{intuition}">Intuition</option>
<option data-i18n="charisma" value="@{charisma}">Charisma</option>
<option data-i18n="magic" value="@{magic}">Magic</option>
<option data-i18n="resonance" value="@{resonance}">Resonance</option>
</select><span>+</span>
<select class="attribute-select" name="attr_spell_drain_attribute_2" title="@{spell_drain_attribute_2}">
<option data-i18n="body" value="@{body}">Body</option>
<option data-i18n="agility" value="@{agility}">Agility</option>
<option data-i18n="reaction" value="@{reaction}">Reaction</option>
<option data-i18n="strength" value="@{strength}">Strength</option>
<option data-i18n="willpower" value="@{willpower}" selected="selected">Willpower</option>
<option data-i18n="logic" value="@{logic}">Logic</option>
<option data-i18n="intuition" value="@{intuition}">Intuition</option>
<option data-i18n="charisma" value="@{charisma}">Charisma</option>
<option data-i18n="magic" value="@{magic}">Magic</option>
<option data-i18n="resonance" value="@{resonance}">Resonance</option>
</select>
<h3 data-i18n="modifier">modifier</h3>
<label data-i18n-title="modifier" title="modifier">
<input name="attr_spell_drain_modifier" title="@{spell_drain_modifier}" type="number" value="0"/>
</label>
</div>
<div class="rows repeating-container prepared-preparations">
<div class="row-long headers">
<h3 data-i18n="preparation">preparation</h3>
<h3 data-i18n="magic">magic</h3>
<h3 data-i18n="potency">potency</h3>
<h3 data-i18n="trigger">trigger</h3>
</div>
<fieldset class="repeating_preparations">
<button name="act_preparation" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name}}}{{dice=[[((@{magic}+@{potency}+@{expert}+@{spec})+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=@{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<span class="center" name="attr_magic"></span>
<span class="center" name="attr_potency"></span>
<span class="center" name="attr_trigger"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<label data-i18n-title="name" title="name">
<input name="attr_name" data-i18n-placeholder="preparationsphname" placeholder="Name" title="@{repeating_preparations_${x}_name}" type="text" value=""/>
</label>
<label data-i18n-title="magic" title="magic">
<input name="attr_magic" placeholder="1" title="@{repeating_preparations_${x}_magic}" type="number" value=""/>
</label>
<label data-i18n-title="potency" title="potency">
<input name="attr_potency" placeholder="1" title="@{repeating_preparations_${x}_potency}" type="number" value=""/>
</label>
<select name="attr_trigger" title="@{repeating_preparations_${x}_trigger}">
<option data-i18n="command" value="Command">command</option>
<option data-i18n="contact" value="Contact" selected="selected">contact</option>
<option data-i18n="time" value="Time">time</option>
<option data-i18n="special" value="Special">special</option>
</select>
<div class="row">
<h3 data-i18n="specialization">Specialization</h3>
<label data-i18n-title="specialization" title="Specialization">
<input name="attr_spec" title="@{repeating_preparations_${x}_specialization}" type="checkbox" value="2"/>
</label>
<h3 data-i18n="expertise">Expertise</h3>
<label data-i18n-title="expertise" title="Expertise">
<input name="attr_expert" title="@{repeating_preparations_${x}_expertise}" type="checkbox" value="3"/>
</label>
</div>
<h3 data-i18n="notes">notes</h3>
<label data-i18n-title="notes" title="notes">
<textarea name="attr_notes" data-i18n-placeholder="notes" placeholder="Notes" title="@{repeating_preparations_${x}_notes}"></textarea>
</label>
</div>
</fieldset>
</div>
</div>
<div class="magic-rituals">
<div class="row-long">
<button data-i18n="drain" name="act_ritual_drain" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{ritual} ^{drain}}}{{dice=[[((@{spell_drain_attribute_1}+@{spell_drain_attribute_2}+@{spell_drain_modifier})+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<select class="attribute-select" name="attr_spell_drain_attribute_1" title="@{spell_drain_attribute_1}">
<option data-i18n="body" value="@{body}">Body</option>
<option data-i18n="agility" value="@{agility}">Agility</option>
<option data-i18n="reaction" value="@{reaction}">Reaction</option>
<option data-i18n="strength" value="@{strength}">Strength</option>
<option data-i18n="willpower" value="@{willpower}">Willpower</option>
<option data-i18n="logic" value="@{logic}" selected="selected">Logic</option>
<option data-i18n="intuition" value="@{intuition}">Intuition</option>
<option data-i18n="charisma" value="@{charisma}">Charisma</option>
<option data-i18n="magic" value="@{magic}">Magic</option>
<option data-i18n="resonance" value="@{resonance}">Resonance</option>
</select><span>+</span>
<select class="attribute-select" name="attr_spell_drain_attribute_2" title="@{spell_drain_attribute_2}">
<option data-i18n="body" value="@{body}">Body</option>
<option data-i18n="agility" value="@{agility}">Agility</option>
<option data-i18n="reaction" value="@{reaction}">Reaction</option>
<option data-i18n="strength" value="@{strength}">Strength</option>
<option data-i18n="willpower" value="@{willpower}" selected="selected">Willpower</option>
<option data-i18n="logic" value="@{logic}">Logic</option>
<option data-i18n="intuition" value="@{intuition}">Intuition</option>
<option data-i18n="charisma" value="@{charisma}">Charisma</option>
<option data-i18n="magic" value="@{magic}">Magic</option>
<option data-i18n="resonance" value="@{resonance}">Resonance</option>
</select>
<h3 data-i18n="modifier">modifier</h3>
<label data-i18n-title="modifier" title="modifier">
<input name="attr_spell_drain_modifier" title="@{spell_drain_modifier}" type="number" value="0"/>
</label>
</div>
<div class="rows repeating-container">
<div class="row-long headers">
<h2 data-i18n="ritual">Ritual</h2>
<h2 class="center" data-i18n="threshold">Threshold</h2>
</div>
<fieldset class="repeating_ritual">
<input name="attr_dicepool" type="hidden" value="0"/>
<button name="act_ritual" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} (Sorcery + Magic + Teamwork Hits)}}{{dice=[[((@{skill}+@{magic}+@{spec}+@{expert}+@{dicepool_modifier}+?{Teamwork test hits?|})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=Threshold: @{threshold}, Teamwork Test Hits: ?{Teamwork test hits?|}\nNotes:@{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<span class="center" name="attr_threshold"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox" checked="checked"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<label data-i18n-title="name" title="name">
<input name="attr_name" data-i18n-placeholder="ritualsphname" placeholder="Ritual Name" title="@{@{repeating_undefined_${x}_name}" type="text"/>
</label>
<label data-i18n-title="threshold" title="threshold">
<input name="attr_threshold" title="@{@{repeating_ritual_${x}_threshold}" type="number" value="1" step="1"/>
</label>
<div class="row">
<input type="hidden" name="attr_skill" value="@{sorcery}">
<h3 data-i18n="specialization">Specialization</h3>
<label data-i18n-title="specialization" title="specialization">
<input name="attr_spec" title="@{@{repeating_ritual_${x}_spec}" type="checkbox" value="2"/>
</label>
<h3 data-i18n="expertise">Expertise</h3>
<label data-i18n-title="expertise" title="expertise">
<input name="attr_expert" title="@{@{repeating_ritual_${x}_expert}" type="checkbox" value="3"/>
</label>
<h3 data-i18n="mod">mod</h3>
<label data-i18n-title="modifier" title="modifier">
<input name="attr_dicepool_modifier" title="@{@{repeating_ritual_${x}_dicepool_modifier}" type="number"/>
</label>
</div>
<h3 data-i18n="notes">notes</h3>
<label data-i18n-title="notes" title="notes">
<textarea name="attr_notes" data-i18n-placeholder="notes" placeholder="Notes" title="@{repeating_ritual_${x}_notes}"></textarea>
</label>
</div>
</fieldset>
</div>
</div>
</div>
</div>
</div>
<div class="pc-row powers-box">
<div class="header right-header">
<div class="header htab">
<div class="triangle"></div>
<input class="powers-toggle" name="attr_powers_toggle" title="@{powers_toggle}" type="radio" value="adept" checked="checked"/>
<h1 data-i18n="adept">Adept</h1>
<div class="right-tri"></div>
</div>
<div class="header htab">
<div class="triangle"></div>
<input class="powers-toggle" name="attr_powers_toggle" title="@{powers_toggle}" type="radio" value="conjuring"/>
<h1 data-i18n="conjuring">Conjuring</h1>
<div class="right-tri"></div>
</div>
<div class="header htab">
<div class="triangle"></div>
<input class="powers-toggle" name="attr_powers_toggle" title="@{powers_toggle}" type="radio" value="meta"/>
<h1 data-i18n="meta">Meta</h1>
<div class="right-tri"></div>
</div>
</div>
<div class="border-box">
<div class="pc-box medium-box">
<input class="powers-toggle" name="attr_powers_toggle" type="hidden" value="adept"/>
<div class="powers-adept">
<div class="row-long">
<button data-i18n="drain" name="act_adept_drain" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{adept} ^{power} ^{drain}}}{{dice=[[((@{adept_drain_attribute_1}+@{adept_drain_attribute_2}+@{adept_drain_modifier})+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<select class="attribute-select" name="attr_adept_drain_attribute_1" title="@{adept_drain_attribute_1}">
<option data-i18n="body" value="@{body}" selected="selected">Body</option>
<option data-i18n="agility" value="@{agility}">Agility</option>
<option data-i18n="reaction" value="@{reaction}">Reaction</option>
<option data-i18n="strength" value="@{strength}">Strength</option>
<option data-i18n="willpower" value="@{willpower}">Willpower</option>
<option data-i18n="logic" value="@{logic}">Logic</option>
<option data-i18n="intuition" value="@{intuition}">Intuition</option>
<option data-i18n="charisma" value="@{charisma}">Charisma</option>
<option data-i18n="magic" value="@{magic}">Magic</option>
<option data-i18n="resonance" value="@{resonance}">Resonance</option>
</select><span>+</span>
<select class="attribute-select" name="attr_adept_drain_attribute_2" title="@{adept_drain_attribute_2}">
<option data-i18n="body" value="@{body}">Body</option>
<option data-i18n="agility" value="@{agility}">Agility</option>
<option data-i18n="reaction" value="@{reaction}">Reaction</option>
<option data-i18n="strength" value="@{strength}">Strength</option>
<option data-i18n="willpower" value="@{willpower}" selected="selected">Willpower</option>
<option data-i18n="logic" value="@{logic}">Logic</option>
<option data-i18n="intuition" value="@{intuition}">Intuition</option>
<option data-i18n="charisma" value="@{charisma}">Charisma</option>
<option data-i18n="magic" value="@{magic}">Magic</option>
<option data-i18n="resonance" value="@{resonance}">Resonance</option>
</select>
<h3 data-i18n="modifier">modifier</h3>
<label data-i18n-title="modifier" title="modifier">
<input name="attr_adept_drain_modifier" title="@{adept_drain_modifier}" type="number" value="0"/>
</label>
</div>
<div class="row-long headers">
<h2 data-i18n="name">Power</h2>
<h2 class="center" data-i18n="level">Level</h2>
<h2 class="center" data-i18n="act">Act</h2>
</div>
<div class="rows repeating-container powers">
<fieldset class="repeating_powers">
<span name="attr_name"></span>
<span class="center" name="attr_rating"></span>
<span class="center" name="attr_activation"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox" checked="checked" value="on"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<label data-i18n-title="name" title="name">
<input name="attr_name" data-i18n-placeholder="powersphname" placeholder="name" title="@{repeating_powers_${x}_name}" type="text" value=""/>
</label>
<label data-i18n-title="rating" title="rating">
<input name="attr_rating" data-i18n-placeholder="rating" placeholder="rating" title="@{repeating_powers_${x}_rating}" type="number" value=""/>
</label>
<label data-i18n-title="activation" title="activation">
<select class="attribute-select" name="attr_activation" title="@{repeating_powers_${x}_activation}">
<option data-i18n="major" value="Major">Major</option>
<option data-i18n="minor" value="Minor">Minor</option>
<option data-i18n="passive" value="Passive">Passive</option>
</select>
</label>
<h3 data-i18n="notes">notes</h3>
<label data-i18n-title="notes" title="notes">
<textarea name="attr_notes" data-i18n-placeholder="notes" placeholder="Notes" title="@{repeating_powers_${x}_notes}"></textarea>
</label>
<h3 data-i18n="modifications">modifications</h3>
<label data-i18n-title="modifications" title="modifications">
<textarea name="attr_modifications" data-i18n-placeholder="mods" placeholder="Attribute: +/- mod" title="@{repeating_items_${x}_modifications}"></textarea>
</label>
</div>
</fieldset>
</div>
</div>
<div class="powers-conjuring">
<div class="row-long">
<button data-i18n="drain" name="act_conjuring_drain" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{conjuring} ^{drain}}}{{dice=[[((@{conjuring_drain_attribute_1}+@{conjuring_drain_attribute_2}+@{conjuring_drain_modifier})+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<select class="attribute-select" name="attr_conjuring_drain_attribute_1" title="@{conjuring_drain_attribute_1}">
<option data-i18n="body" value="@{body}" selected="selected">Body</option>
<option data-i18n="agility" value="@{agility}">Agility</option>
<option data-i18n="reaction" value="@{reaction}">Reaction</option>
<option data-i18n="strength" value="@{strength}">Strength</option>
<option data-i18n="willpower" value="@{willpower}">Willpower</option>
<option data-i18n="logic" value="@{logic}">Logic</option>
<option data-i18n="intuition" value="@{intuition}">Intuition</option>
<option data-i18n="charisma" value="@{charisma}">Charisma</option>
<option data-i18n="magic" value="@{magic}">Magic</option>
<option data-i18n="resonance" value="@{resonance}">Resonance</option>
</select><span>+</span>
<select class="attribute-select" name="attr_conjuring_drain_attribute_2" title="@{conjuring_drain_attribute_2}">
<option data-i18n="body" value="@{body}">Body</option>
<option data-i18n="agility" value="@{agility}">Agility</option>
<option data-i18n="reaction" value="@{reaction}">Reaction</option>
<option data-i18n="strength" value="@{strength}">Strength</option>
<option data-i18n="willpower" value="@{willpower}" selected="selected">Willpower</option>
<option data-i18n="logic" value="@{logic}">Logic</option>
<option data-i18n="intuition" value="@{intuition}">Intuition</option>
<option data-i18n="charisma" value="@{charisma}">Charisma</option>
<option data-i18n="magic" value="@{magic}">Magic</option>
<option data-i18n="resonance" value="@{resonance}">Resonance</option>
</select>
<h3 data-i18n="mod">Mod</h3>
<label data-i18n-title="modifier" title="modifier">
<input name="attr_conjuring_drain_modifier" title="@{conjuring_drain_modifier}" placeholder="mod" type="number" value="0"/>
</label>
</div>
<div class="row-long summon-spirit-button">
<span>&nbsp;</span>
<button name="act_conjuring" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Conjuring Spirit of ?{Spirit Type?|Air|Beasts|Earth|Fire|Kin|Water|Plant|Guardian|Guidance|Task} Force ?{Force?|1|2|3|4|5|6|7|8|9|10}}}{{dice=[[((@{conjuring}+@{magic}+?{Skill Level?|Skilled (+0),0|Specialization (+2),2|Expertise (+3),3})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=[Spirit Resist](~@{character_name}|SpiritResistForce?{Force?})}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span data-i18n="summonspirit"></span></button>
<span>&nbsp;</span>
<h3 data-i18n="asrep">AsRep</h3>
<label data-i18n-title="asrep" title="Astral Reputation">
<input name="attr_astral_reputation" title="@{astral_reputation}" placeholder="" type="number" value=""/>
</label>
<span>&nbsp;</span>
<!-- hidden spirit resist buttons -->
<button class="btn ui-draggable" name="act_SpiritResistForce1" type="action" style="display: none;" value="@{gm_toggle} &{template:rolls-computed}{{header=^{force} 1 ^{spirit}}}{{base=Summoning Resist}}{{dice=[[2d6>5]]}}{{desc=[Resist Drain](~@{character_name}|Drain)}}"></button>
<button class="btn ui-draggable" name="act_SpiritResistForce2" type="action" style="display: none;" value="@{gm_toggle} &{template:rolls-computed}{{header=^{force} 2 ^{spirit}}}{{base=Summoning Resist}}{{dice=[[4d6>5]]}}{{desc=[Resist Drain](~@{character_name}|Drain)}}"></button>
<button class="btn ui-draggable" name="act_SpiritResistForce3" type="action" style="display: none;" value="@{gm_toggle} &{template:rolls-computed}{{header=^{force} 3 ^{spirit}}}{{base=Summoning Resist}}{{dice=[[6d6>5]]}}{{desc=[Resist Drain](~@{character_name}|Drain)}}"></button>
<button class="btn ui-draggable" name="act_SpiritResistForce4" type="action" style="display: none;" value="@{gm_toggle} &{template:rolls-computed}{{header=^{force} 4 ^{spirit}}}{{base=Summoning Resist}}{{dice=[[8d6>5]]}}{{desc=[Resist Drain](~@{character_name}|Drain)}}"></button>
<button class="btn ui-draggable" name="act_SpiritResistForce5" type="action" style="display: none;" value="@{gm_toggle} &{template:rolls-computed}{{header=^{force} 5 ^{spirit}}}{{base=Summoning Resist}}{{dice=[[10d6>5]]}}{{desc=[Resist Drain](~@{character_name}|Drain)}}"></button>
<button class="btn ui-draggable" name="act_SpiritResistForce6" type="action" style="display: none;" value="@{gm_toggle} &{template:rolls-computed}{{header=^{force} 6 ^{spirit}}}{{base=Summoning Resist}}{{dice=[[12d6>5]]}}{{desc=[Resist Drain](~@{character_name}|Drain)}}"></button>
<button class="btn ui-draggable" name="act_SpiritResistForce7" type="action" style="display: none;" value="@{gm_toggle} &{template:rolls-computed}{{header=^{force} 7 ^{spirit}}}{{base=Summoning Resist}}{{dice=[[14d6>5]]}}{{desc=[Resist Drain](~@{character_name}|Drain)}}"></button>
<button class="btn ui-draggable" name="act_SpiritResistForce8" type="action" style="display: none;" value="@{gm_toggle} &{template:rolls-computed}{{header=^{force} 8 ^{spirit}}}{{base=Summoning Resist}}{{dice=[[16d6>5]]}}{{desc=[Resist Drain](~@{character_name}|Drain)}}"></button>
<button class="btn ui-draggable" name="act_SpiritResistForce9" type="action" style="display: none;" value="@{gm_toggle} &{template:rolls-computed}{{header=^{force} 9 ^{spirit}}}{{base=Summoning Resist}}{{dice=[[18d6>5]]}}{{desc=[Resist Drain](~@{character_name}|Drain)}}"></button>
<button class="btn ui-draggable" name="act_SpiritResistForce10" type="action" style="display: none;" value="@{gm_toggle} &{template:rolls-computed}{{header=^{force} 10 ^{spirit}}}{{base=Summoning Resist}}{{dice=[[20d6>5]]}}{{desc=[Resist Drain](~@{character_name}|Drain)}}"></button>
</div>
<div class="row-long headers">
<h2 data-i18n="force">Force</h2>
<h2 class="left" data-i18n="spirit">Spirit</h2>
<h2 data-i18n="favors">Favors</h2>
</div>
<div class="rows repeating-container spirits">
<fieldset class="repeating_spirits">
<span class="center" name="attr_force"></span>
<span class="left" name="attr_spirit"></span>
<span class="center" name="attr_services"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_skills"></span></div>
<div class="collapse"><span name="attr_powers"></span></div>
<div class="collapse"><span name="attr_attacks"></span></div>
<div class="settings">
<div class="row spirit-top">
<label data-i18n-title="force" title="force">
<input name="attr_force" data-i18n-placeholder="spiritsphforce" placeholder="force" title="@{repeating_spirits_${x}_force}" type="number" value=""/>
</label>
<label data-i18n-title="spirit" title="spirit">
<input class="left" name="attr_spirit" data-i18n-placeholder="spiritsphspirit" placeholder="spirit" title="@{repeating_spirits_${x}_spirit}" type="text" value=""/>
</label>
<label data-i18n-title="services" title="Services">
<input name="attr_services" placeholder="1" title="@{repeating_spirits_${x}_services}" type="number" value=""/>
</label>
</div>
<div class="row attr-headers">
<h2 data-i18n="b">B</h2>
<h2 data-i18n="a">A</h2>
<h2 data-i18n="r">R</h2>
<h2 data-i18n="s">S</h2>
<h2 data-i18n="w">W</h2>
<h2 data-i18n="l">L</h2>
<h2 data-i18n="i">I</h2>
<h2 data-i18n="c">C</h2>
<h2 data-i18n="m">M</h2>
<h2 data-i18n="ess">Ess</h2>
</div>
<div class="row spirit-attr">
<label data-i18n-title="body" title="Body">
<input name="attr_body" title="@{repeating_spirits_${x}_body}" placeholder="" type="number" step="1" value=""/>
</label>
<label data-i18n-title="agility" title="Agility">
<input name="attr_agility" title="@{repeating_spirits_${x}_agility}" placeholder="" type="number" step="1" value=""/>
</label>
<label data-i18n-title="reaction" title="Reaction">
<input name="attr_reaction" title="@{repeating_spirits_${x}_reaction}" placeholder="" type="number" step="1" value=""/>
</label>
<label data-i18n-title="strength" title="Strength">
<input name="attr_strength" title="@{repeating_spirits_${x}_strength}" placeholder="" type="number" step="1" value=""/>
</label>
<label data-i18n-title="willpower" title="Willpower">
<input name="attr_willpower" title="@{repeating_spirits_${x}_willpower}" placeholder="" type="number" step="1" value=""/>
</label>
<label data-i18n-title="logic" title="Logic">
<input name="attr_logic" title="@{repeating_spirits_${x}_logic}" placeholder="" type="number" step="1" value=""/>
</label>
<label data-i18n-title="intuition" title="Intuition">
<input name="attr_intuition" title="@{repeating_spirits_${x}_intuition}" placeholder="" type="number" step="1" value=""/>
</label>
<label data-i18n-title="charisma" title="Charisma">
<input name="attr_charisma" title="@{repeating_spirits_${x}_charisma}" placeholder="" type="number" step="1" value=""/>
</label>
<label data-i18n-title="magic" title="Magic">
<input name="attr_magic" title="@{repeating_spirits_${x}_magic}" placeholder="" type="number" step="1" value=""/>
</label>
<label data-i18n-title="essence" title="Essence">
<input name="attr_essence" title="@{repeating_spirits_${x}_essence}" placeholder="" type="number" step="1" value=""/>
</label>
</div>
<div class="row spirit-cmmove">
<h3 data-i18n="actions">Actions</h3>
<label data-i18n-title="actions" title="Actions">
<span data-i18n="a"> </span><input name="attr_actions_major" title="@{repeating_spirits_${x}_actions_major}" type="number" value="1"/>
<span class="tiny">/</span>
<span data-i18n="i"> </span><input name="attr_actions_minor" title="@{repeating_spirits_${x}_actions_minor}" type="number" value="2"/>
</label>
<h3 data-i18n="conditionmonitor">Condition Monitor</h3>
<label data-i18n-title="conditionmonitor" title="Condition Monitor">
<input name="attr_physical" title="@{repeating_spirits_${x}_physical}" type="number" value=""/>
</label>
<h3 data-i18n="movement">Movement</h3>
<label data-i18n-title="movement" title="Movement">
<input name="attr_move_speed" title="@{repeating_spirits_${x}_move_speed}" type="number" value="10"/>
<input name="attr_sprint_speed" title="@{repeating_spirits_${x}_sprint_speed}" type="number" value="15"/>
<input name="attr_sprint_mod" title="@{repeating_spirits_${x}_sprint_mod}" type="number" value="1"/>
</label>
</div>
<div class="row spirit-initiatives">
<h3 data-i18n="initiative">Initiative</h3>
<label data-i18n-title="initiative" title="Initiative">
<input name="attr_initiative_base" title="@{repeating_spirits_${x}_initiative_base}" type="number" value=""/>
<span class="tiny"> + </span>
<input name="attr_initiative_dice" title="@{repeating_spirits_${x}_initiative_dice}" type="number" value=""/>
<span class="tiny">d6</span>
</label>
<h3 data-i18n="astralinitiative">Astral Initiative</h3>
<label data-i18n-title="astralinitiative" title="Astral Initiative">
<input name="attr_astral_initiative_base" title="@{repeating_spirits_${x}_astral_initiative_base}" type="number" value=""/>
<span class="tiny"> + </span>
<input name="attr_astral_initiative_dice" title="@{repeating_spirits_${x}_astral_initiative_dice}" type="number" value=""/>
<span class="tiny">d6</span>
</label>
</div>
<div class="row spirit-skills">
<h3 data-i18n="skills">Skills</h3>
<label data-i18n-title="skills" title="Skills">
<textarea name="attr_skills" data-i18n-placeholder="spiritsphskills" placeholder="Skills" title="@{repeating_spirits_${x}_skills}"></textarea>
</label>
</div>
<div class="row spirit-powers">
<h3 data-i18n="powers">powers</h3>
<label data-i18n-title="powers" title="powers">
<textarea name="attr_powers" data-i18n-placeholder="spiritsphpowers" placeholder="powers" title="@{repeating_spirits_${x}_powers}"></textarea>
</label>
</div>
<div class="row spirit-attacks">
<h3 data-i18n="attacks">attacks</h3>
<label data-i18n-title="attacks" title="attacks">
<textarea name="attr_attacks" data-i18n-placeholder="spiritsphattacks" placeholder="attacks" title="@{repeating_spirits_${x}_attacks}"></textarea>
</label>
</div>
</div>
</fieldset>
</div>
</div>
<div class="powers-meta">
<div class="row-long mage-setup">
<div class="row1">
<span></span>
<select class='mage-type' name='attr_mage_type' title='@{mage_type}'>
<option data-i18n="mage" value="Mage" selected="selected">Mage</option>
<option data-i18n="adept" value="Adept">Adept</option>
<option data-i18n="mysticadept" value="Mystic Adept">Mystic Adept</option>
</select>
<span></span>
<h3 data-i18n="initiategrade">Initiate Grade</h3>
<label data-i18n-title="initiategrade" title="initiategrade">
<input name="attr_initiate_grade" placeholder="0" title="@{initiate_grade}" type="number" min="0" step="1" value="">
</label>
<span></span>
<input type="hidden" name="attr_magic_ar" value="0">
<label><button name="act_magic_ar" type="action" value="&{template:rolls-computed}{{header=@{character_name}}}{{base=^{magic} ^{attack} ^{rating}}}{{rating=[[@{magic_ar}]]}}{{desc=Magic + @{tradition_attribute}}}" title="Magic Attack Rating"><span class="red"><span data-i18n="magicar">Magic AR</span> <span name='attr_magic_ar'></span></span></button></label>
</div>
<div class="row2">
<span></span>
<h2 data-i18n="tradition">Tradition</h2>
<label data-i18n-title="tradition" title="tradition">
<select name='attr_tradition' title='@{tradition}'>
<option data-i18n="hermeticism-logic" value="Hermeticism">Hermeticism (Logic)</option>
<option data-i18n="hermeticism-intuition" value="Hermeticism (Intuition)">Hermeticism (Intuition)</option>
<option data-i18n="hermeticism-charisma" value="Hermeticism (Charisma)">Hermeticism (Charisma)</option>
<option data-i18n="shamanism-charisma" value="Shamanism">Shamanism (Charisma)</option>
<option data-i18n="shamanism-logic" value="Shamanism (Logic)">Shamanism (Logic)</option>
<option data-i18n="shamanism-intuition" value="Shamanism (Intuition)">Shamanism (Intuition)</option>
</select>
</label>
<span></span>
<h2 class="magic-aspect" data-i18n-title="aspect" title="aspect">Aspect</h2>
<select class="magic-aspect" name='attr_aspect' title='@{aspect}'>
<option data-i18n="non-aspected" value="Non-Aspected">Non-Aspected</option>
<option data-i18n="sorcery" value="Sorcery">Sorcery</option>
<option data-i18n="conjuring" value="Conjuring">Conjuring</option>
<option data-i18n="enchanting" value="Enchanting">Enchanting</option>
</select>
</div>
</div>
<div class="row-long headers">
<h2 data-i18n="metamagic">Metamagic</h2>
<h2 class="center" data-i18n="level">Level</h2>
</div>
<div class="rows repeating-container metamagic">
<fieldset class="repeating_metamagic">
<span name="attr_name"></span>
<span class="center" name="attr_rating"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox" checked="checked" value="on"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<label data-i18n-title="name" title="name">
<input name="attr_name" data-i18n-placeholder="metamagicsphname" placeholder="name" title="@{repeating_metamagic_${x}_name}" type="text" value=""/>
</label>
<label data-i18n-title="rating" title="rating">
<input name="attr_rating" data-i18n-placeholder="metamagicsphrating" placeholder="rating" title="@{repeating_metamagic_${x}_rating}" type="number" value=""/>
</label>
<h3 data-i18n="notes">notes</h3>
<label data-i18n-title="notes" title="notes">
<textarea name="attr_notes" data-i18n-placeholder="notes" placeholder="Notes" title="@{repeating_metamagic_${x}_notes}"></textarea>
</label>
<h3 data-i18n="modifications">modifications</h3>
<label data-i18n-title="modifications" title="modifications">
<textarea name="attr_modifications" data-i18n-placeholder="mods" placeholder="Attribute: +/- mod" title="@{repeating_items_${x}_modifications}"></textarea>
</label>
</div>
</fieldset>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="matrix pc-col">
<div class="pc-row matrix-box">
<div class="header right-header">
<h1 data-i18n="persona">Persona</h1>
<div class="right-tri"></div>
</div>
<div class="border-box">
<div class="pc-box medium-box">
<div class="cyberdeck">
<div class="row-matrix-combat-stats">
<input type="hidden" name="attr_matrix_device_rating" value="0">
<input type="hidden" name="attr_matrix_defense_rating" value="0">
<input type="hidden" name="attr_matrix_defense_rating_modifier" value="0">
<input type="hidden" name="attr_matrix_attack_rating" value="0">
<input type="hidden" name="attr_matrix_device_initiative_bonus" value="0">
<input type="hidden" name="attr_matrix_device_essence_cost" value="0">
<span>&nbsp;</span>
<label><button class="techno-hide" name="act_matrix_device_rating" type="action" value="&{template:rolls-computed}{{header=@{character_name}}}{{base=Matrix Device Rating}}{{rating=@{matrix_device_rating}}}" title="Matrix Device Rating"><span data-i18n="devicerating">Device Rating</span><span name='attr_matrix_device_rating'></span></button></label>
<span>&nbsp;</span>
<label><button name="act_matrix_attack_rating" type="action" value="&{template:rolls-computed}{{header=@{character_name}}}{{base=Matrix Attack Rating}}{{rating=[[(@{attack}+@{sleaze})]]}}{{desc=Attack + Sleaze}}" title="Matrix Attack Rating"><span data-i18n="attackrating">Attack Rating</span><span name='attr_matrix_attack_rating'></span></button></label>
<span>&nbsp;</span>
<label><button name="act_matrix_defense_rating" type="action" value="&{template:rolls-computed}{{header=@{character_name}}}{{base=Matrix Defense Rating}}{{rating=[[@{matrix_defense_rating}]]}}{{desc=Data Processing + Firewall}}" title="Matrix Defense Rating"><span data-i18n="defenserating">Defense Rating</span><span name='attr_matrix_defense_rating'></span></button></label>
<span>&nbsp;</span>
</div>
<div class="row-long row-matrix-soak">
<div>&nbsp;</div>
<button name="act_soak_matrix" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{matrix} ^{soak} = ^{firewall}}}{{dice=[[((@{firewall})+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{desc=}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">
<span class="center" title="Firewall"><span class="center" data-i18n="matrixsoak">Matrix Soak</span></span>
</button>
<div>&nbsp;</div>
<button name="act_soak_biofeedback" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{biofeedback} ^{soak} = ^{willpower}}}{{dice=[[(@{willpower}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{desc=Willpower + Intuition}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">
<span class="center" title="Willpower"><span class="center" data-i18n="biofeedbacksoak">Biofeedback Soak</span></span>
</button>
<div>&nbsp;</div>
</div>
<div class="row-long technomancer-attributes techno-see">
<span>&nbsp;</span>
<label data-i18n="attributearray">Attribute Array</label>
<input type="number" name="attr_attack_base" step="1" min="0" value="" placeholder="A" />
<input type="number" name="attr_sleaze_base" step="1" min="0" value="" placeholder="S" />
<input type="number" name="attr_data_processing_base" step="1" min="0" value="" placeholder="D" />
<input type="number" name="attr_firewall_base" step="1" min="0" value="" placeholder="F" />
<span>&nbsp;</span>
</div>
<div class="row-long">
<h3 data-i18n="total">Total</h3>
<h3 data-i18n="temp">Temp</h3>
<h3 data-i18n="modifier">modifier</h3>
<h3 data-i18n="base">Base</h3>
<h3 data-i18n="baseslider">Base slider</h3>
<br />
<label><button name="act_matrix_attack" type="action" value="" title="Roll attack" data-i18n="attack">Attack</button></label>
<div class="matrix-tot" title="@{attack}" ><span name="attr_attack"></span></div><span> = </span>
<input type="number" name="attr_attack_temp" min="0" value="0" placeholder="0" title="@{attack_temp}" /> +
<input type="number" name="attr_attack_modifier" min="0" value="0" placeholder="0" title="@{attack_modifier}" /> +
<input type="number" name="attr_attack_base" min="0" value="0" placeholder="7" title="@{attack_base}" />
<div class="device-attr">
<div class="matrix-bubble matrixAttack">
<input type="radio" name="attr_attack_base" value="0" /><span></span>
<input type="radio" name="attr_attack_base" value="1" /><span></span>
<input type="radio" name="attr_attack_base" value="2" /><span></span>
<input type="radio" name="attr_attack_base" value="3" /><span></span>
<input type="radio" name="attr_attack_base" value="4" /><span></span>
<input type="radio" name="attr_attack_base" value="5" /><span></span>
<input type="radio" name="attr_attack_base" value="6" /><span></span>
<input type="radio" name="attr_attack_base" value="7" /><span></span>
<input type="radio" name="attr_attack_base" value="8" /><span></span>
<input type="radio" name="attr_attack_base" value="9" /><span></span>
<input type="radio" name="attr_attack_base" value="10" /><span></span>
</div>
</div>
</div>
<div class="row-long">
<label><button name="act_matrix_sleaze" type="action" value="" title="Roll sleaze" data-i18n="sleaze">Sleaze</button></label>
<div class="matrix-tot" title="@{sleaze}" ><span name="attr_sleaze"></span></div><span> = </span>
<input type="number" name="attr_sleaze_temp" min="0" value="0" placeholder="0" title="@{sleaze_temp}" /> +
<input type="number" name="attr_sleaze_modifier" min="0" value="0" placeholder="0" title="@{sleaze_modifier}" /> +
<input type="number" name="attr_sleaze_base" min="0" value="0" placeholder="6" title="@{sleaze_base}" />
<div class="device-attr">
<div class="matrix-bubble matrixSleaze">
<input type="radio" name="attr_sleaze_base" value="0" /><span></span>
<input type="radio" name="attr_sleaze_base" value="1" /><span></span>
<input type="radio" name="attr_sleaze_base" value="2" /><span></span>
<input type="radio" name="attr_sleaze_base" value="3" /><span></span>
<input type="radio" name="attr_sleaze_base" value="4" /><span></span>
<input type="radio" name="attr_sleaze_base" value="5" /><span></span>
<input type="radio" name="attr_sleaze_base" value="6" /><span></span>
<input type="radio" name="attr_sleaze_base" value="7" /><span></span>
<input type="radio" name="attr_sleaze_base" value="8" /><span></span>
<input type="radio" name="attr_sleaze_base" value="9" /><span></span>
<input type="radio" name="attr_sleaze_base" value="10" /><span></span>
</div>
</div>
</div>
<div class="row-long">
<label><button name="act_matrix_data_processing" type="action" value="" title="Roll data processing" data-i18n="dataproc">Data Proc.</button></label>
<div class="matrix-tot" title="@{data_processing}" ><span name="attr_data_processing"></span></div><span> = </span>
<input type="number" name="attr_data_processing_temp" min="0" value="0" placeholder="0" title="@{data_processing_temp}" /> +
<input type="number" name="attr_data_processing_modifier" min="0" value="0" placeholder="0" title="@{data_processing_modifier}" /> +
<input type="number" name="attr_data_processing_base" min="0" value="0" placeholder="5" title="@{data_processing_base}" />
<div class="device-attr">
<div class="matrix-bubble matrixData">
<input type="radio" name="attr_data_processing_base" value="0" /><span></span>
<input type="radio" name="attr_data_processing_base" value="1" /><span></span>
<input type="radio" name="attr_data_processing_base" value="2" /><span></span>
<input type="radio" name="attr_data_processing_base" value="3" /><span></span>
<input type="radio" name="attr_data_processing_base" value="4" /><span></span>
<input type="radio" name="attr_data_processing_base" value="5" /><span></span>
<input type="radio" name="attr_data_processing_base" value="6" /><span></span>
<input type="radio" name="attr_data_processing_base" value="7" /><span></span>
<input type="radio" name="attr_data_processing_base" value="8" /><span></span>
<input type="radio" name="attr_data_processing_base" value="9" /><span></span>
<input type="radio" name="attr_data_processing_base" value="10" /><span></span>
</div>
</div>
</div>
<div class="row-long">
<label><button name="act_matrix_firewall" type="action" value="" title="Roll firewall" data-i18n="firewall">Firewall</button></label>
<div class="matrix-tot" title="@{firewall}" ><span name="attr_firewall"></span></div><span> = </span>
<input type="number" name="attr_firewall_temp" min="0" value="0" placeholder="0" title="@{firewall_temp}" /> +
<input type="number" name="attr_firewall_modifier" min="0" value="0" placeholder="0" title="@{firewall_modifier}" /> +
<input type="number" name="attr_firewall_base" min="0" value="0" placeholder="4" title="@{firewall_base}" />
<div class="device-attr">
<div class="matrix-bubble matrixFirewall">
<input type="radio" name="attr_firewall_base" value="0" /><span></span>
<input type="radio" name="attr_firewall_base" value="1" /><span></span>
<input type="radio" name="attr_firewall_base" value="2" /><span></span>
<input type="radio" name="attr_firewall_base" value="3" /><span></span>
<input type="radio" name="attr_firewall_base" value="4" /><span></span>
<input type="radio" name="attr_firewall_base" value="5" /><span></span>
<input type="radio" name="attr_firewall_base" value="6" /><span></span>
<input type="radio" name="attr_firewall_base" value="7" /><span></span>
<input type="radio" name="attr_firewall_base" value="8" /><span></span>
<input type="radio" name="attr_firewall_base" value="9" /><span></span>
<input type="radio" name="attr_firewall_base" value="10" /><span></span>
</div>
</div>
</div>
<div class="con-hex techno-hide">
<input type="hidden" name="attr_condition_monitor_link" value="">
<input type="hidden" name="attr_matrix_hex_max" value="12">
<input type="radio" name="attr_matrix_hex" value="0" /><h2 data-i18n="conditionmonitor">Condition Monitor</h2>
<input type="radio" name="attr_matrix_hex" value="1" /><span class="hexagon"></span>
<input type="radio" name="attr_matrix_hex" value="2" /><span class="hexagon"></span>
<input type="radio" name="attr_matrix_hex" value="3" /><span class="hexagon"></span>
<input type="radio" name="attr_matrix_hex" value="4" /><span class="hexagon"></span>
<input type="radio" name="attr_matrix_hex" value="5" /><span class="hexagon"></span>
<input type="radio" name="attr_matrix_hex" value="6" /><span class="hexagon"></span>
<input type="radio" name="attr_matrix_hex" value="7" /><span class="hexagon"></span>
<input type="radio" name="attr_matrix_hex" value="8" /><span class="hexagon"></span>
<input type="radio" name="attr_matrix_hex" value="9" /><span class="hexagon"></span>
<input type="radio" name="attr_matrix_hex" value="10" /><span class="hexagon"></span>
<input type="radio" name="attr_matrix_hex" value="11" /><span class="hexagon"></span>
<input type="radio" name="attr_matrix_hex" value="12" /><span class="hexagon"></span>
</div>
</div>
<div>&nbsp;</div>
<div class="rows repeating-container devices">
<div class="row-long headers">
<h2 data-i18n="device">Device</h2>
<h2 data-i18n="rtg">RTG</h2>
<h2 data-i18n="primary">Primary</h2>
<h2>&nbsp;</h2>
<h2>&nbsp;</h2>
</div>
<fieldset class="repeating_devices">
<span name="attr_name"></span>
<span name="attr_device_rating"></span>
<span name="attr_primary_device"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="persona-attribute-buttons techno-hide">
<div class="row3">
<span>&nbsp;</span>
<span>
<input type="checkbox" name="attr_attack_primary" value="1">
<button name="attack"><span data-i18n="attack">Attack</span> <span name="attr_attack"></span></button>
</span>
<span>
<input type="checkbox" name="attr_sleaze_primary" value="1">
<button name="sleaze"><span data-i18n="sleaze"></span> <span name="attr_sleaze"></span></button>
</span>
<span>
<input type="checkbox" name="attr_data_processing_primary" value="1">
<button name="dataproc"><span data-i18n="dataproc"></span> <span name="attr_data_processing"></span></button>
</span>
<span>
<input type="checkbox" name="attr_firewall_primary" value="1">
<button name="firewall"><span data-i18n="firewall"></span> <span name="attr_firewall"></span></button>
</span>
<span>&nbsp;</span>
</div>
</div>
<div class="collapse">
<span name="attr_notes"></span>
</div>
<div class="settings">
<div class="rows">
<div class="row1">
<label data-i18n-title="device" title="device">
<input name="attr_name" title="@{repeating_devices_${x}_name}" type="text" value="" data-i18n-placeholder="devicesphname" placeholder="Fairlight Excalibur"/>
</label>
<label data-i18n-title="devicerating" title="devicerating">
<input name="attr_device_rating" placeholder="6" title="@{repeating_devices_${x}_device_rating}" type="number" value=""/>
</label>
<label data-i18n-title="primary" title="primary">
<input type="checkbox" name="attr_primary_device" title="@{repeating_devices_${x}_primary_device}" value="1">
</label>
</div>
<div class="row2">
<span>&nbsp;</span>
<h3 data-i18n="devicetype">Device Type</h3>
<label data-i18n-title="devicetype" title="Device Type">
<select name="attr_type" title="@{repeating_devices_${x}_type}">
<option data-i18n="commlink" value="Commlink">Commlink</option>
<option data-i18n="cyberdeck" value="Cyberdeck">Cyberdeck</option>
<option data-i18n="cyberjack" value="Cyberjack">Cyberjack</option>
<option data-i18n="commandconsole" value="Command Console">Command Console</option>
<option data-i18n="controlrig" value="Control Rig">Control Rig</option>
<option data-i18n="mtoc" value="M-TOC">M-TOC</option>
</select>
</label>
<span>&nbsp;</span>
<h3 data-i18n="activeprogramslots">ActiveProgram Slots</h3>
<label data-i18n-title="activeprogramslots" title="Program Slots">
<input name="attr_active_program_slots" title="@{repeating_devices_${x}_active_program_slots" type="number" step="1" value="0">
</label>
<span>&nbsp;</span>
</div>
<div class="row3">
<span>&nbsp;</span>
<label data-i18n-title="attack" title="attack">
<span data-i18n="attack"></span>
<input type="number" name="attr_attack" value="" placeholder="9" title="@{repeating_devices_${x}_attack" step="1">
</label>
<label data-i18n-title="sleaze" title="Sleaze">
<span data-i18n="sleaze"></span>
<input type="number" name="attr_sleaze" value="" placeholder="9" title="@{repeating_devices_${x}_sleaze" step="1">
</label>
<label data-i18n-title="dataproc" title="Data Proc">
<span data-i18n="dataproc"></span>
<input type="number" name="attr_data_processing" value="" placeholder="9" title="@{repeating_devices_${x}_data_processing" step="1">
</label>
<label data-i18n-title="firewall" title="Firewall">
<span data-i18n="firewall"></span>
<input type="number" name="attr_firewall" value="" placeholder="9" title="@{repeating_devices_${x}_firewall" step="1">
</label>
<span>&nbsp;</span>
</div>
<div class="row4">
<span>&nbsp;</span>
<h3 data-i18n="matrixinitiativedicebonus">Matrix Initiative Dice Bonus</h3>
<label data-i18n-title="matrixinitiativebonus" title="Matrix Initiative Bonus">
<input type="number" name="attr_matrix_initiative_bonus" value="" title="@{repeating_devices_${x}_matrix_initiative_bonus" step="1">
</label>
<span>&nbsp;</span>
<h3 data-i18n="essencecost">Essence Cost</h3>
<label data-i18n-title="essencecost" title="Essence Cost">
<input type="number" name="attr_essence_cost" value="" title="@{repeating_devices_${x}_essence_cost" step=".01">
</label>
<span>&nbsp;</span>
</div>
<div class="row-condition-monitor">
<span>&nbsp;</span>
<h3 data-i18n="conditionmonitor">Current Condition Monitor</h3>
<label data-i18n-title="conditionmonitor" title="conditionmonitor">
<input type="number" name="attr_condition_monitor" value="" title="@{repeating_devices_${x}_condition_monitor}" step="1">
</label>
<span>&nbsp;</span>
<h3 data-i18n="conditionmonitormax">Condition Monitor Max</h3>
<label data-i18n-title="conditionmonitormax" title="conditionmonitormax">
<input type="number" name="attr_condition_monitor_max" value="" title="@{repeating_devices_${x}_condition_monitor_max}" step="1">
</label>
<span>&nbsp;</span>
</div>
<div class="row5">
<h3 data-i18n="notes">notes</h3>
<label data-i18n-title="notes" title="notes">
<textarea name="attr_notes" data-i18n-placeholder="notes" placeholder="Notes" title="@{repeating_devices_${x}_notes}"></textarea>
</label>
</div>
<div class="row5">
<h3 data-i18n="modifications">modifications</h3>
<label data-i18n-title="modifications" title="modifications">
<textarea name="attr_modifications" data-i18n-placeholder="mods" placeholder="Attribute: +/-mod" title="@{repeating_devices_${x}_modifications}"></textarea>
</label>
</div>
</div><!-- end rows -->
</div><!-- end settings -->
</fieldset>
</div>
<div class="rows repeating-container programs">
<h2 data-i18n="programs">Programs</h2>
<fieldset class="repeating_programs">
<input class="toggle" name="attr_powered_on" type="checkbox" checked="checked"/>
<span class="pictos">Q</span>
<span name="attr_name"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<label data-i18n-title="programs" title="programs">
<input name="attr_name" data-i18n-placeholder="programsphname" placeholder="Program name" title="@{repeating_programs_${x}_program}" type="text" value=""/>
</label>
<h3 data-i18n="notes">notes</h3>
<label data-i18n-title="notes" title="notes">
<textarea name="attr_notes" data-i18n-placeholder="notes" placeholder="Notes" title="@{repeating_programs_${x}_notes}"></textarea>
</label>
<h3 data-i18n="modifications">Modifications</h3>
<label data-i18n-title="modifications" title="Modifications">
<textarea name="attr_modifications" data-i18n-placeholder="mods" placeholder="Attribute: +/-mod" title="@{repeating_programs_${x}_modifications}"></textarea>
</label>
</div>
</fieldset>
</div>
</div>
</div>
</div>
<!-- Technomancer -->
<div class="pc-row techno techno-see">
<div class="header right-header">
<h1 data-i18n="technomancer">Technomancer</h1>
<div class="right-tri"></div>
</div>
<div class="header right-header">
<div class="header htab">
<div class="triangle"></div>
<input class="techno-toggle" name="attr_techno_toggle" title="@{techno_toggle}" type="radio" value="complexforms"/>
<h1 data-i18n="complexforms">Complex Forms</h1>
<div class="right-tri"></div>
</div>
<div class="header htab">
<div class="triangle"></div>
<input class="techno-toggle" name="attr_techno_toggle" title="@{techno_toggle}" type="radio" value="submersion"/>
<h1 data-i18n="submersion">Submersion</h1>
<div class="right-tri"></div>
</div>
</div>
<div class="border-box">
<div class="pc-box medium-box">
<input class="techno-toggle" name="attr_techno_toggle" type="hidden" value="complexforms"/>
<div class="complex-forms-rolls complexforms">
<input type="hidden" name="attr_complex_form_attack_rating" value="0">
<button name="roll_complex_forms_attack_rating" type="roll" value="&{template:rolls-computed}{{header=@{character_name}}}{{base=Complex Form Attack Rating}}{{rating=[[@{electronics}+@{resonance}]]}}{{desc=Electronics + Resonance}}" title="Complex Form Attack Rating"><span data-i18n="attackrating">Attack Rating</span><span name='attr_complex_form_attack_rating'></span></button>
<button data-i18n="resistfade" name="act_fade" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{resistfade}}}{{dice=[[(@{willpower}+@{logic}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}{{desc=Willpower + Logic}}"></button>
<div class="rows repeating-container complex-forms">
<div class="row-long headers">
<h2 data-i18n="complexform">Complex Form</h2>
<h2 data-i18n="duration">Duration</h2>
<h2 data-i18n="fade">Fade</h2>
</div>
<fieldset class="repeating_forms">
<input name="attr_dicepool" type="hidden" value="0"/>
<span class='hide-roll-button' name='attr_skill'></span>
<span class='show-name'>
<button name="act_complexformnoroll" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{complexform} @{name}}}{{desc=@{notes}}}{{fade=[[@{fade}]]}}"><span name="attr_name"></span></button>
</span>
<button name="act_complexform" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{complexform} @{name}}}{{dice=[[((@{skill}+@{resonance}+@{dicepool_modifier}+@{spec}+@{expert})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=@{notes}}}{{fade=[[@{fade}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<span class="center" name="attr_duration"></span>
<span class="center" name="attr_fade"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<label data-i18n-title="name" title="name">
<input name="attr_name" data-i18n-placeholder="complexformsphname" placeholder="name" title="@{repeating_forms_${x}_name}" type="text" value=""/>
</label>
<select name="attr_duration" title="@{repeating_forms_${x}_duration}">
<option data-i18n="instant" value="Instant">Instant</option>
<option data-i18n="sustained" value="Sustained">Sustained</option>
<option data-i18n="limited" value="Limited">Limited</option>
<option data-i18n="permanent" value="Permanent">Permanent</option>
<option data-i18n="other" value="Other">Other</option>
</select>
<label data-i18n-title="fade" title="fade">
<input name="attr_fade" placeholder="-1" title="@{repeating_forms_${x}_fade}" type="number" value=""/>
</label>
<div class="row">
<h3 data-i18n="skill">skill</h3>
<select name="attr_skill" title="@{repeating_forms_${x}_skill}">
<option data-i18n="noroll" value="">No Roll</option>
<option data-i18n="cracking" value="@{cracking}">Cracking</option>
<option data-i18n="electronics" value="@{electronics}">Electronics</option>
<option data-i18n="tasking" value="@{tasking}">Tasking</option>
</select>
<h3 data-i18n="specialization">Specialization</h3>
<label data-i18n-title="specialization" title="Specialization">
<input name="attr_spec" value="2" title="@{repeating_forms_${x}_spec}" type="checkbox"/>
</label>
<h3 data-i18n="expertise">Expertise</h3>
<label data-i18n-title="expertise" title="Expertise">
<input name="attr_expert" value="3" title="@{repeating_forms_${x}_expert}" type="checkbox"/>
</label>
</div>
<div class="row">
<h3 data-i18n="modifier">modifier</h3>
<label data-i18n-title="modifier" title="modifier">
<input name="attr_dicepool_modifier" title="@{repeating_forms_${x}_dicepool_modifier}" type="number"/>
</label>
</div>
<h3 data-i18n="notes">notes</h3>
<label data-i18n-title="notes" title="notes">
<textarea name="attr_notes" data-i18n-placeholder="notes" placeholder="Notes" title="@{repeating_forms_${x}_notes}"></textarea>
</label>
<h3 data-i18n="modifications">Modifications</h3>
<label data-i18n-title="modifications" title="Modifications">
<textarea name="attr_modifications" data-i18n-placeholder="mods" placeholder="Attribute: +/-mod" title="@{repeating_forms_${x}_modifications}"></textarea>
</label>
</div>
</fieldset>
</div>
</div>
<div class="complex-forms-rolls submersion">
<input class="techno-toggle" name="attr_techno_toggle" type="hidden" value="submersion"/>
<div class="pc-row submersion-headers">
<button data-i18n="resistfade" name="act_fade_compiling" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{resistfade} ^{compiling}}}{{dice=[[(@{willpower}+@{charisma}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}{{desc=Willpower + Charisma}}"></button>
<span>&nbsp;</span>
<h2 data-i18n="submersionlevel">Submersion Level</h2>
<label data-i18n-title="submersionlevel" title="Submersion Level">
<input name="attr_submersion_level" value="0" title="@{submersion_level}" type="number" min='0' step='1'>
</label>
</div>
<div class="row-long compile-sprite-button">
<span>&nbsp;</span>
<button name="act_compiling" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Compiling ?{sprite Type?|Courier|Crack|Data|Fault|Machine|Other} Sprite, Level ?{Level?|1|2|3|4|5|6|7|8|9|10}}}{{dice=[[((@{tasking}+@{resonance}+?{Skill Level?|Skilled (+0),0|Specialization (+2),2|Expertise (+3),3})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=[Sprite Resist](~@{character_name}|spriteResistLevel?{Level?})}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span data-i18n="compilesprite"></span></button>
<span>&nbsp;</span>
<!-- hidden sprite resist buttons -->
<button class="btn ui-draggable" name="act_spriteresistlevel1" type="action" style="display: none !important;" value="@{gm_toggle} &{template:rolls-computed}{{header=^{level} 1 ^{sprite}}}{{base=Compiling Resist}}{{dice=[[2d6>5]]}}{{desc=[Resist Fade](~@{character_name}|fade)}}"></button>
<button class="btn ui-draggable" name="act_spriteresistlevel2" type="action" style="display: none !important;" value="@{gm_toggle} &{template:rolls-computed}{{header=^{level} 2 ^{sprite}}}{{base=Compiling Resist}}{{dice=[[4d6>5]]}}{{desc=[Resist Fade](~@{character_name}|fade)}}"></button>
<button class="btn ui-draggable" name="act_spriteresistlevel3" type="action" style="display: none !important;" value="@{gm_toggle} &{template:rolls-computed}{{header=^{level} 3 ^{sprite}}}{{base=Compiling Resist}}{{dice=[[6d6>5]]}}{{desc=[Resist Fade](~@{character_name}|fade)}}"></button>
<button class="btn ui-draggable" name="act_spriteresistlevel4" type="action" style="display: none !important;" value="@{gm_toggle} &{template:rolls-computed}{{header=^{level} 4 ^{sprite}}}{{base=Compiling Resist}}{{dice=[[8d6>5]]}}{{desc=[Resist Fade](~@{character_name}|fade)}}"></button>
<button class="btn ui-draggable" name="act_spriteresistlevel5" type="action" style="display: none !important;" value="@{gm_toggle} &{template:rolls-computed}{{header=^{level} 5 ^{sprite}}}{{base=Compiling Resist}}{{dice=[[10d6>5]]}}{{desc=[Resist Fade](~@{character_name}|fade)}}"></button>
<button class="btn ui-draggable" name="act_spriteresistlevel6" type="action" style="display: none !important;" value="@{gm_toggle} &{template:rolls-computed}{{header=^{level} 6 ^{sprite}}}{{base=Compiling Resist}}{{dice=[[12d6>5]]}}{{desc=[Resist Fade](~@{character_name}|fade)}}"></button>
<button class="btn ui-draggable" name="act_spriteresistlevel7" type="action" style="display: none !important;" value="@{gm_toggle} &{template:rolls-computed}{{header=^{level} 7 ^{sprite}}}{{base=Compiling Resist}}{{dice=[[14d6>5]]}}{{desc=[Resist Fade](~@{character_name}|fade)}}"></button>
<button class="btn ui-draggable" name="act_spriteresistlevel8" type="action" style="display: none !important;" value="@{gm_toggle} &{template:rolls-computed}{{header=^{level} 8 ^{sprite}}}{{base=Compiling Resist}}{{dice=[[16d6>5]]}}{{desc=[Resist Fade](~@{character_name}|fade)}}"></button>
<button class="btn ui-draggable" name="act_spriteresistlevel9" type="action" style="display: none !important;" value="@{gm_toggle} &{template:rolls-computed}{{header=^{level} 9 ^{sprite}}}{{base=Compiling Resist}}{{dice=[[18d6>5]]}}{{desc=[Resist Fade](~@{character_name}|fade)}}"></button>
<button class="btn ui-draggable" name="act_spriteresistlevel10" type="action" style="display: none !important;" value="@{gm_toggle} &{template:rolls-computed}{{header=^{level} 10 ^{sprite}}}{{base=Compiling Resist}}{{dice=[[20d6>5]]}}{{desc=[Resist Fade](~@{character_name}|fade)}}"></button>
</div>
<div class="rows">
<h1 data-i18n="echos">Echos</h1>
</div>
<div class="rows repeating-container echoes">
<fieldset class="repeating_echoes">
<span name="attr_name"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<label data-i18n-title="echo" title="Echo">
<input name="attr_name" data-i18n-placeholder="echosphname" placeholder="Echo Name" type="text" title="@{repeating_echos_${x}_name}">
</label>
<label data-i18n-title="notes" title="Notes"><span data-i18n="notes">Notes</span>
<textarea name="attr_notes" data-i18n-placeholder="notes" placeholder="Notes" title="@{repeating_echos_${x}_notes}"></textarea>
</label>
<label data-i18n-title="modifications" title="Modifications"><span data-i18n="modifications">Modifications</span>
<textarea name="attr_modifications" data-i18n-placeholder="mods" placeholder="Attribute: +/-mod" title="@{repeating_echos_${x}_modifications}"></textarea>
</label>
</div>
</fieldset>
</div>
<div>&nbsp;</div>
<div class="rows">
<h1 data-i18n="sprites">Sprites</h1>
</div>
<div class="rows repeating-container sprites">
<div class="pc-row headers">
<span>&nbsp;</span>
<h2 data-i18n="lvl">Lvl</h2>
<h2 data-i18n="type">Type</h2>
<h2 data-i18n="tasks">Tasks</h2>
<span>&nbsp;</span>
<span>&nbsp;</span>
<span>&nbsp;</span>
</div>
<fieldset class="repeating_sprites">
<span>&nbsp;</span>
<span name="attr_level"></span>
<span name="attr_type"></span>
<span name="attr_tasks"></span>
<span>&nbsp;</span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<label data-i18n-title="level" title="Level">
<input name="attr_level" title="@{repeating_sprites_${x}_level}" type="number" min='0' step='1' value=''>
</label>
<label data-i18n-title="tasks" title="Tasks">
<select name="attr_type" title="@{repeating_sprites_${x}_type}">
<option data-i18n="couriersprite" value="Courier">Courier</option>
<option data-i18n="cracksprite" value="Crack">Crack</option>
<option data-i18n="datasprite" value="Data">Data</option>
<option data-i18n="faultsprite" value="Fault">Fault</option>
<option data-i18n="machinesprite" value="Machine">Machine</option>
<option data-i18n="other" value="Other">Other</option>
</select>
</label>
<label data-i18n-title="tasks" title="@{repeating_sprites_${x}_tasks}">
<input name="attr_tasks" type="number" title="@{repeating_sprites_${x}_tasks}" min='0' step='1' value=''>
</label>
<span>&nbsp;</span>
<label data-i18n-title="notes" title="Notes"><span data-i18n="notes">Notes</span>
<textarea name="attr_notes" data-i18n-placeholder="notes" placeholder="Notes" title="@{repeating_sprites_${x}_notes}"></textarea>
</label>
</div>
</fieldset>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="social pc-col">
<div class="pc-row"><!-- ~~~~~~~~ Start of Lifestyles Row ~~~~~~~~ -->
<div class="header right-header">
<h1 data-i18n="idslifestylecurrency">IDs/Lifestyles/Currency</h1>
<div class="right-tri"></div>
</div>
<div class="border-box repeat-box lifestyle">
<div class="pc-box small-box social-box">
<div class="row-long">
<h3 class="nuyen">¥</h3>
<input type="text" name="attr_nuyen" placeholder="-" title="@{nuyen}" />
<h3 data-i18n="birthname">Birth Name</h3>
<input type="text" name="attr_birth_name" data-i18n-placeholder="birthnameph" placeholder="John Q Public" title="@{birth_name}" />
</div>
<div class="row-long">
<div class="row-long heat-rep-asrep">
<span>&nbsp;</span>
<h2 data-i18n="reputation">Reputation</h2><input type="number" name="attr_reputation" placeholder="#" title="@{reputation}" />
<span>&nbsp;</span>
<h2 data-i18n="heat">Heat</h2><input type="number" name="attr_heat" placeholder="#" title="@{heat}" />
<span>&nbsp;</span>
<h2 data-i18n="asrep">AsRep</h2><input type="number" name="attr_astral_reputation" placeholder="" title="@{astral_reputation}" />
<span>&nbsp;</span>
</div>
</div>
<div class="row-long sins-headers">
<h3 data-i18n="sinname">SIN Name</h3>
<h3 data-i18n="rtg">RTG</h3>
<h3 data-i18n="lifestylelicensesnotes" class="center">Lifestyle / Licenses / Notes</h3>
<span></span>
</div>
<fieldset class="repeating_lifestyle">
<input type="hidden" class="settings-toggle" name="attr_flag" value="settings" />
<input class="display-flag" type="checkbox" name="attr_display_flag" />
<span name="attr_name"></span>
<span class="center" name="attr_rating"></span>
<span class="collapsible">
<span class="desc-lifestyle" name="attr_lifestyle"></span>
<span class="desc-lifestyle" name="attr_licenses"></span>
<span class="desc-lifestyle" name="attr_notes"></span>
</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="settings">
<label data-i18n-title="fakeid" title="Fake ID">
<span data-i18n="fakeid">Fake ID</span>
<input type="text" name="attr_name" data-i18n-placeholder="sinsphname" placeholder="SIN Name" title="SIN Name" />
</label>
<span></span>
<label data-i18n-title="rating" title="Rating">
<span data-i18n="rating">Rating</span>
<input type="number" name="attr_rating" placeholder="1" title="Rating" />
</label>
<h3 data-i18n="relatedlifestyle">Related Lifestyle</h3>
<textarea name="attr_lifestyle" data-i18n-placeholder="sinsphlifestyle" placeholder="Middle" title="Related lifestyle"></textarea>
<h3 data-i18n="licenses">Licenses</h3>
<textarea name="attr_licenses" data-i18n-placeholder="sinsphlicenses" placeholder="Technomancer, Pistols" title="Licenses"></textarea>
<h3 data-i18n="notes">Notes</h3>
<textarea name="attr_notes" data-i18n-placeholder="notes" placeholder="Notes" title="Notes"></textarea>
</div>
</fieldset>
</div>
</div>
</div>
<!-- ~~~~~~~~ End of Lifestyle Row ~~~~~~~~ -->
<!-- ~~~~~~~~ Start Contacts Row ~~~~~~~~ -->
<div class="pc-row">
<div class="header right-header">
<h1 data-i18n="contacts">Contacts</h1>
<div class="right-tri"></div>
</div>
<div class="border-box repeat-box contacts">
<div class="pc-box small-box">
<button class="btn ui-draggable" name="act_loyalty1" type="action" style="display: none;" value="/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{loyalty} 1}}{{dice=[[(@{charisma}+@{influence}+1)d6>5]]}}"></button>
<button class="btn ui-draggable" name="act_loyalty2" type="action" style="display: none;" value="/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{loyalty} 2}}{{dice=[[(@{charisma}+@{influence}+2)d6>5]]}}"></button>
<button class="btn ui-draggable" name="act_loyalty3" type="action" style="display: none;" value="/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{loyalty} 3}}{{dice=[[(@{charisma}+@{influence}+3)d6>5]]}}"></button>
<button class="btn ui-draggable" name="act_loyalty4" type="action" style="display: none;" value="/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{loyalty} 4}}{{dice=[[(@{charisma}+@{influence}+4)d6>5]]}}"></button>
<button class="btn ui-draggable" name="act_loyalty5" type="action" style="display: none;" value="/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{loyalty} 5}}{{dice=[[(@{charisma}+@{influence}+5)d6>5]]}}"></button>
<button class="btn ui-draggable" name="act_loyalty6" type="action" style="display: none;" value="/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{loyalty} 6}}{{dice=[[(@{charisma}+@{influence}+6)d6>5]]}}"></button>
<button class="btn ui-draggable" name="act_loyalty7" type="action" style="display: none;" value="/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{loyalty} 7}}{{dice=[[(@{charisma}+@{influence}+7)d6>5]]}}"></button>
<button class="btn ui-draggable" name="act_loyalty8" type="action" style="display: none;" value="/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{loyalty} 8}}{{dice=[[(@{charisma}+@{influence}+8)d6>5]]}}"></button>
<button class="btn ui-draggable" name="act_loyalty9" type="action" style="display: none;" value="/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{loyalty} 9}}{{dice=[[(@{charisma}+@{influence}+9)d6>5]]}}"></button>
<button class="btn ui-draggable" name="act_loyalty10" type="action" style="display: none;" value="/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{loyalty} 10}}{{dice=[[(@{charisma}+@{influence}+10)d6>5]]}}"></button>
<button class="btn ui-draggable" name="act_connections1" type="action" style="display: none;" value="/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{connection} 1}}{{dice=[[2d6>5]]}}"></button>
<button class="btn ui-draggable" name="act_connections2" type="action" style="display: none;" value="/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{connection} 2}}{{dice=[[4d6>5]]}}"></button>
<button class="btn ui-draggable" name="act_connections3" type="action" style="display: none;" value="/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{connection} 3}}{{dice=[[6d6>5]]}}"></button>
<button class="btn ui-draggable" name="act_connections4" type="action" style="display: none;" value="/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{connection} 4}}{{dice=[[8d6>5]]}}"></button>
<button class="btn ui-draggable" name="act_connections5" type="action" style="display: none;" value="/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{connection} 5}}{{dice=[[10d6>5]]}}"></button>
<button class="btn ui-draggable" name="act_connections6" type="action" style="display: none;" value="/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{connection} 6}}{{dice=[[12d6>5]]}}"></button>
<button class="btn ui-draggable" name="act_connections7" type="action" style="display: none;" value="/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{connection} 7}}{{dice=[[14d6>5]]}}"></button>
<button class="btn ui-draggable" name="act_connections8" type="action" style="display: none;" value="/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{connection} 8}}{{dice=[[16d6>5]]}}"></button>
<button class="btn ui-draggable" name="act_connections9" type="action" style="display: none;" value="/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{connection} 9}}{{dice=[[18d6>5]]}}"></button>
<button class="btn ui-draggable" name="act_connections10" type="action" style="display: none;" value="/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{connection} 10}}{{dice=[[20d6>5]]}}"></button>
<div class="row-long">
<h3 data-i18n="name">Name</h3>
<h3 data-i18n="loyalty">Loyalty</h3>
<h3 data-i18n="connection">Connection</h3>
<h3 data-i18n="favor">Favor</h3>
<span>&nbsp;</span>
<span>&nbsp;</span>
</div>
<fieldset class="repeating_contacts">
<input type="hidden" class="settings-toggle" name="attr_flag" value="settings" />
<input class="display-flag" type="checkbox" name="attr_display_flag" value="on" />
<label title="Contact name"><span name="attr_display"></span></label>
<label title="Loyalty"><span name="attr_loyalty"></span></label>
<label title="Influence"><span name="attr_influence"></span></label>
<label title="Favors"><span name="attr_favors"></span></label>
<button class="pictos" name="contact_chat" type="roll" value="@{gm_toggle} &{template:contact}{{header=@{character_name}}}{{name=@{name}}}{{loyalty=@{loyalty}}}{{connection=@{influence}}}{{favor=@{favors}}}{{desc=@{notes}}}">w</button>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapsible">
<div class="desc" title="Notes"><span name="attr_notes"></span></div>
</div>
<div class="settings">
<input type="text" name="attr_name" data-i18n-placeholder="contactsphname" placeholder="Contact Name" title="Contact name" />
<input type="number" name="attr_loyalty" min="1" placeholder="1" title="Loyalty" />
<input type="number" name="attr_influence" min="1" placeholder="1" title="Influence" />
<input type="number" name="attr_favors" placeholder="-" title="Favors" />
<span>&nbsp;</span>
<span>&nbsp;</span>
<h3 data-i18n="notes">Notes</h3>
<textarea name="attr_notes" data-i18n-placeholder="notes" placeholder="Notes"></textarea>
</div>
</fieldset>
</div>
</div>
</div><!-- ~~~~~~~~ End of Contacts row ~~~~~~~~ -->
</div>
<!-- PC Vehicles / Drones -->
<div class="vehicle pc-col">
<div class="pc-row">
<div class="header right-header"><h1 data-i18n="vehicle">Vehicle</h1><div class="right-tri"></div></div>
<div class="border-box repeat-box vehicle-box">
<div class="pc-box medium-box">
<fieldset class="repeating_vehicle">
<input type="hidden" class="settings-toggle" name="attr_flag" value="settings" />
<div class="settings">
<div>
<div class="row-long">
<label style="width: 10%;" data-i18n="vehicle">Vehicle</label>
<input style="width: 30%;" type="text" name="attr_name" data-i18n-placeholder="vehiclesphname" placeholder="name" title="Vehicle name" />
<span>&nbsp;</span>
<span>&nbsp;</span>
<span>&nbsp;</span>
<span>&nbsp;</span>
<span>&nbsp;</span>
<label data-i18n="type" style="width: 10%; text-align: right;">Type</label>
<select class="attribute-select" style="width: 30%" name="attr_type" title="@{repeating_vehicle_${x}_type}">
<option data-i18n="bike" value="Bike">Bike</option>
<option data-i18n="atv" value="ATV">ATV</option>
<option data-i18n="car" value="Car">Car</option>
<option data-i18n="truck" value="Truck">Truck</option>
<option data-i18n="van" value="Van">Van</option>
<option data-i18n="bus" value="Bus">Bus</option>
<option data-i18n="tracked" value="Tracked">Tracked</option>
<option data-i18n="hovercraft" value="Hovercraft">Hovercraft</option>
<option data-i18n="pwc" value="PWC">PWC</option>
<option data-i18n="boat" value="Boat">Boat</option>
<option data-i18n="ship" value="Ship">Ship</option>
<option data-i18n="submarine" value="Submarine">Submarine</option>
<option data-i18n="fixedwingaircraft" value="Fixed Wing Aircraft">Fixed Wing Aircraft</option>
<option data-i18n="rotorcraft" value="Rotorcraft">Rotorcraft</option>
<option data-i18n="vtolvstol" value="VTOL/VSTOL">VTOL/VSTOL</option>
<option data-i18n="ltav" value="LTAV">LTAV</option>
<option data-i18n="lav" value="LAV">LAV</option>
<option data-i18n="gravity" value="Gravity">Gravity</option>
<option data-i18n="trailer" value="Trailer">Trailer</option>
<option data-i18n="other" value="Other">Other</option>
<option data-i18n="drone" value="Drone">Drone</option>
<option data-i18n="microdrone" value="Microdrone">Microdrone</option>
<option data-i18n="minidrone" value="Minidrone">Minidrone</option>
<option data-i18n="smalldrone" value="Small Drone">Small Drone</option>
<option data-i18n="mediumdrone" value="Medium Drone">Medium Drone</option>
<option data-i18n="largedrone" value="Large Drone">Large Drone</option>
</select>
</div>
<div class="row-long">
<label data-i18n="handling">Handling</label>
<input type="hidden" name="attr_handling" />
<input type="number" name="attr_handling_onroad" data-i18n-placeholder="word_onroad" placeholder="On" title="Handling On-Road" />
<input type="number" name="attr_handling_offroad" data-i18n-placeholder="word_offroad" placeholder="Off" title="Handling Off-Road" />
<input type="number" name="attr_handling_modifier" data-i18n-placeholder="word_mod" placeholder="Mod" title="Handling Temp Modifier" />
<input type="hidden" name="attr_display_handling" />
<input type="hidden" name="attr_seats" />
<label data-i18n="seats" style="width: 14%;" >Seats</label>
<input type="number" name="attr_seats" placeholder="#" title="# Seats" />
</div>
<div class="row-long">
<label data-i18n="acceleration">Acceleration</label>
<input type="hidden" name="attr_acceleration" />
<input type="number" name="attr_acceleration_base" data-i18n-placeholder="word_base" placeholder="Base" title="Acceleration Base" />
<input type="number" name="attr_acceleration_modifier" data-i18n-placeholder="word_mod" placeholder="Mod" title="Acceleration Modifier" />
<input type="hidden" name="attr_display_acceleration" />
<span>&nbsp;</span>
<label data-i18n="speed">Speed</label>
<input type="hidden" name="attr_speed" />
<input type="number" name="attr_speed_base" data-i18n-placeholder="word_base" placeholder="Base" title="Speed Interval" />
<input type="number" name="attr_speed_modifier" data-i18n-placeholder="word_mod" placeholder="Mod" title="Speed Modifier" />
<input type="number" name="attr_speed_max" data-i18n-placeholder="word_max" placeholder="Max" title="Speed Max" />
<input type="hidden" name="attr_display_speed" />
</div>
<div class="row-long">
<label data-i18n="body">Body</label>
<input type="hidden" name="attr_body" />
<input type="number" name="attr_body_base" data-i18n-placeholder="word_base" placeholder="Base" title="Body Base" />
<input type="number" name="attr_body_modifier" data-i18n-placeholder="word_mod" placeholder="Mod" title="Body Modifier" />
<span>&nbsp;</span>
<input type="hidden" name="attr_display_body" />
<label data-i18n="armor">Armor</label>
<input type="hidden" name="attr_armor" />
<input type="number" name="attr_armor_base" data-i18n-placeholder="word_base" placeholder="Base" title="Armor Base" />
<input type="number" name="attr_armor_modifier" data-i18n-placeholder="word_mod" placeholder="Mod" title="Armor Modifier" />
<span>&nbsp;</span>
<input type="hidden" name="attr_display_armor" />
</div>
<div class="row-long">
<label data-i18n="pilot">Pilot</label>
<input type="hidden" name="attr_pilot" />
<input type="number" name="attr_pilot_base" data-i18n-placeholder="word_base" placeholder="Base" title="Pilot Base" />
<input type="number" name="attr_pilot_modifier" data-i18n-placeholder="word_mod" placeholder="Mod" title="Pilot Modifier" />
<span>&nbsp;</span>
<input type="hidden" name="attr_display_pilot" />
<label data-i18n="sensor">Sensor</label>
<input type="hidden" name="attr_sensor" />
<input type="number" name="attr_sensor_base" data-i18n-placeholder="word_base" placeholder="Base" title="Sensor Base" />
<input type="number" name="attr_sensor_modifier" data-i18n-placeholder="word_mod" placeholder="Mod" title="Sensor Modifier" />
<span>&nbsp;</span>
<input type="hidden" name="attr_display_sensor" />
</div>
<div class="row-long autosofts">
<div class="autosoft-column">
<input class="toggle" name="attr_powered_on_clearsight" type="checkbox" value='1'/>
<span class="pictos">Q</span>
<button data-i18n="clearsight" name="act_pcclearsight" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name} / @{name}}}{{base=^{clearsight} = ^{clearsight} + ^{sensor}}}{{dice=[[(@{clearsight}+@{display_sensor}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<input type="number" name="attr_clearsight" title="Clearsight" value="0">
</div>
<span>&nbsp;</span>
<div class="autosoft-column">
<input class="toggle" name="attr_powered_on_electronicwarfare" type="checkbox" value='1'/>
<span class="pictos">Q</span>
<button data-i18n="electronicwarfare" name="act_pcelectronicwarfare" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name} / @{name}}}{{base=^{electronicwarfare} = ^{electronicwarfare} + ^{sensor}}}{{dice=[[(@{electronicwarfare}+@{display_sensor}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<input type="number" name="attr_electronicwarfare" title="Electronic Warfare" value="0">
</div>
</div>
<div class="row-long autosofts">
<div class="autosoft-column">
<input class="toggle" name="attr_powered_on_evasion" type="checkbox" value='1'/>
<span class="pictos">Q</span>
<button data-i18n="evasion" name="act_pcevasion" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name} / @{name}}}{{base=^{evasion} = ^{evasion} + ^{pilot}}}{{dice=[[(@{evasion}+@{display_pilot}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<input type="number" name="attr_evasion" title="evasion" value="0">
</div>
<span>&nbsp;</span>
<div class="autosoft-column">
<input class="toggle" name="attr_powered_on_maneuvering" type="checkbox" value='1'/>
<span class="pictos">Q</span>
<button data-i18n="maneuvering" name="act_pcmaneuvering" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name} / @{name}}}{{base=^{maneuvering} = ^{maneuvering} + ^{pilot}}}{{dice=[[(@{maneuvering}+@{display_pilot}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<input type="number" name="attr_maneuvering" title="Electronic Warfare" value="0">
</div>
</div>
<div class="row-long autosofts">
<div class="autosoft-column">
<input class="toggle" name="attr_powered_on_stealth" type="checkbox" value='1'/>
<span class="pictos">Q</span>
<button data-i18n="stealth" name="act_pcstealth" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name} / @{name}}}{{base=^{stealth} = ^{stealth} + ^{pilot}}}{{dice=[[(@{stealth}+@{display_pilot}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<input type="number" name="attr_stealth" title="stealth" value="0">
</div>
<span>&nbsp;</span>
<div class="autosoft-column">
<input class="toggle" name="attr_powered_on_targeting_0" type="checkbox" value='1'/>
<span class="pictos">Q</span>
<button data-i18n="targeting" name="act_pctargeting" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name} / @{name}}}{{base=^{targeting} = ^{targeting} + ^{sensor}}}{{dice=[[(@{targeting}+@{display_sensor}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<input type="number" name="attr_targeting" title="[Weapon] Targeting" value="0">
</div>
</div>
<h3 data-i18n="notes">Notes</h3>
<textarea name="attr_notes" data-i18n-placeholder="notes" placeholder="Notes"></textarea>
</div>
<div><br><br></div>
</div>
<div class="display">
<input class="display-flag" type="checkbox" name="attr_display_flag" />
<div class="row-long">
<div class="display-row" title="Vehicle">
<h3 data-i18n="vehicle">Vehicle</h3>
<div>
<span name="attr_name"></span>
</div>
</div>
<div class="display-row" title="Type">
<h3 data-i18n="type">Type</h3>
<div>
<span name="attr_type"></span>
</div>
</div>
</div>
<div class="row-long">
<div class="display-row" title="Handling">
<h3 data-i18n="handling">Handling</h3>
<div class="vehicle-stat">
<span name="attr_display_handling"></span>
</div>
</div>
<div class="display-row" title="Seats">
<h3 data-i18n="seats">Seats</h3>
<div class="vehicle-stat">
<span name="attr_seats"></span>
</div>
</div>
</div>
<div class="row-long">
<div class="display-row" title="Acceleration">
<h3 data-i18n="acceleration">Acceleration</h3>
<div class="vehicle-stat">
<span name="attr_display_acceleration"></span>
</div>
</div>
<div class="display-row" title="Speed">
<h3 data-i18n="speed">Speed</h3>
<div class="vehicle-stat">
<span name="attr_display_speed"></span>
</div>
</div>
</div>
<div class="row-long">
<div class="display-row" title="Body">
<h3 data-i18n="body">Body</h3>
<div class="vehicle-stat">
<span name="attr_display_body"></span>
</div>
</div>
<div class="display-row" title="Armor">
<h3 data-i18n="armor">Armor</h3>
<div class="vehicle-stat">
<span name="attr_display_armor"></span>
</div>
</div>
</div>
<div class="row-long">
<div class="display-row" title="Pilot">
<h3 data-i18n="pilot">Pilot</h3>
<div class="vehicle-stat">
<span name="attr_display_pilot"></span>
</div>
</div>
<div class="display-row" title="Sensor">
<h3 data-i18n="sensor">Sensor</h3>
<div class="vehicle-stat">
<span name="attr_display_sensor"></span>
</div>
</div>
</div>
<div class="row-long autosofts">
<div class="autosoft-column">
<input class="toggle" name="attr_powered_on_clearsight" type="checkbox" value='1'/>
<span class="pictos">Q</span>
<button data-i18n="clearsight" name="act_pcclearsight" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name} / @{name}}}{{base=^{clearsight} = ^{clearsight} + ^{sensor}}}{{dice=[[(@{clearsight}+@{display_sensor}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<span name="attr_clearsight"></span>
</div>
<span>&nbsp;</span>
<div class="autosoft-column">
<input class="toggle" name="attr_powered_on_electronicwarfare" type="checkbox" value='1'/>
<span class="pictos">Q</span>
<button data-i18n="electronicwarfare" name="act_pcelectronicwarfare" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name} / @{name}}}{{base=^{electronicwarfare} = ^{electronicwarfare} + ^{sensor}}}{{dice=[[(@{electronicwarfare}+@{display_sensor}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<span name="attr_electronicwarfare"></span>
</div>
</div>
<div class="row-long autosofts">
<div class="autosoft-column">
<input class="toggle" name="attr_powered_on_evasion" type="checkbox" value='1'/>
<span class="pictos">Q</span>
<button data-i18n="evasion" name="act_pcevasion" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name} / @{name}}}{{base=^{evasion} = ^{evasion} + ^{pilot}}}{{dice=[[(@{evasion}+@{display_pilot}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<span name="attr_evasion"></span>
</div>
<span>&nbsp;</span>
<div class="autosoft-column">
<input class="toggle" name="attr_powered_on_maneuvering" type="checkbox" value='1'/>
<span class="pictos">Q</span>
<button data-i18n="maneuvering" name="act_pcmaneuvering" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name} / @{name}}}{{base=^{maneuvering} = ^{maneuvering} + ^{pilot}}}{{dice=[[(@{maneuvering}+@{display_pilot}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<span name="attr_maneuvering"></span>
</div>
</div>
<div class="row-long autosofts">
<div class="autosoft-column">
<input class="toggle" name="attr_powered_on_stealth" type="checkbox" value='1'/>
<span class="pictos">Q</span>
<button data-i18n="stealth" name="act_pcstealth" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name} / @{name}}}{{base=^{stealth} = ^{stealth} + ^{pilot}}}{{dice=[[(@{stealth}+@{display_pilot}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<span name="attr_stealth"></span>
</div>
<span>&nbsp;</span>
<div class="autosoft-column">
<input class="toggle" name="attr_powered_on_targeting_0" type="checkbox" value='1'/>
<span class="pictos">Q</span>
<button data-i18n="targeting" name="act_pctargeting" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name} / @{name}}}{{base=^{targeting} = ^{targeting} + ^{sensor}}}{{dice=[[(@{targeting}+@{display_sensor}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<span name="attr_targeting"></span>
</div>
</div>
<div class="collapsible">
<div class="desc"><span name="attr_notes"></span></div>
</div>
</div>
<button class="pictos settings-button" name="act_vehicle" type="action">x</button>
</fieldset>
</div>
</div>
</div>
</div>
<div class="notes pc-col">
<div class="pc-row">
<div class="header right-header">
<div class="header htab">
<input class="tab-switch" name="attr_notes_toggle" type="radio" value="notes" checked="checked"/>
<h1 data-i18n="notes">Notes</h1>
<div class="right-tri"></div>
</div>
</div>
<div class="header right-header">
<div class="header htab">
<div class="triangle"></div>
<input class="tab-switch" name="attr_notes_toggle" type="radio" value="logs"/>
<h1 data-i18n="logs">Logs</h1>
<div class="right-tri"></div>
</div>
</div>
<div class="header">
<div class="header htab">
<div class="triangle"></div>
<input class="tab-switch" name="attr_notes_toggle" type="radio" value="changelog"/>
<h1 data-i18n="updates">Updates</h1>
</div>
</div>
<div class="border-box">
<div class="pc-box">
<!-- <div><img name="attr_character_token" style="width: 70px; float: left;"><img name="attr_character_avatar" style="width: 100px; float: right;"></div> -->
<div class="notes-col">
<input class="tab-switch" name="attr_notes_toggle" type="hidden" value="notes"/>
<div class="notes-notes">
<textarea name="attr_player_notes" class="pc-notes" data-i18n-placeholder="playernotesph" placeholder="This space intentionally left blank."></textarea>
</div>
<input class="tab-switch" name="attr_notes_toggle" type="hidden" value="logs"/>
<div class="notes-logs">
<h2 data-i18n="session_logs">Session Logs</h2>
<div class="rows repeating-container">
<div class="row-long headers">
<span></span>
<h2 data-i18n="date">Date</h2>
<h2 data-i18n="session_name">Session Name</h2>
<h2 data-i18n="agent/gm">Agent/GM</h2>
</span></span>
</div>
<div class="row-long headers2">
<span></span>
<h2 data-i18n="karma">Karma</h2>
<h2>Nuyen</h2>
<h2 data-i18n="reputation">Reputation</h2>
<h2 data-i18n="heat">Heat</h2>
</span></span>
</div>
<fieldset class="repeating_sessions">
<input style="display: none;" class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/>
<input style="display: none;" class="collapse-flag" name="attr_display_flag" title="Collapse toggle" type="checkbox" checked="checked"/>
<div class="sess-info">
<span>&nbsp;</span>
<span name="attr_date" title="@{repeating_sessions_${x}_date}"></span>
<span name="attr_name" title="@{repeating_sessions_${x}_name}"></span>
<span name="attr_gm" title="@{repeating_sessions_${x}_gm}"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
</div>
<div class="sess-awards">
<span>&nbsp;</span>
<span name="attr_karma" title="@{repeating_sessions_${x}_karma}"></span>
<span name="attr_nuyen" title="@{repeating_sessions_${x}_nuyen}"></span>
<span name="attr_reputation" title="@{repeating_sessions_${x}_reputation}"></span>
<span name="attr_heat" title="@{repeating_sessions_${x}_heat}"></span>
<span>&nbsp;</span>
</div>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<div class="sess-info">
</span>&nbsp;</span>
<input type="text" name="attr_date" value="" data-i18n-placeholder="sessionsphdate" placeholder="Date Played" title="Date Played" />
<input type="text" name="attr_name" value="" data-i18n-placeholder="sessionsphname" placeholder="Session Name" title="Session Name" />
<input type="text" name="attr_gm" value="" data-i18n-placeholder="sessionsphgm" placeholder="Agent/GM" title="Agent/GM" />
</span>&nbsp;</span>
</div>
<div class="sess-awards">
<span>&nbsp;</span>
<input type="text" name="attr_karma" value="" data-i18n-placeholder="sessionsphkarma" placeholder="Karma" title="Karma" />
<input type="text" name="attr_nuyen" value="" data-i18n-placeholder="sessionsphnuyen" placeholder="Nuyen" title="Nuyen" />
<input type="text" name="attr_reputation" value="" data-i18n-placeholder="sessionsphreputation" placeholder="Reputation" title="Reputation" />
<input type="text" name="attr_heat" value="" data-i18n-placeholder="sessionsphheat" placeholder="Heat" title="Heat" />
</span>&nbsp;</span>
</div>
<label data-i18n-title="notes" title="notes"><span data-i18n="notes">Notes</span>
<textarea name="attr_notes" data-i18n-placeholder="notes" placeholder="Notes" title="{repeating_effects_${x}_notes}"></textarea>
</label>
</div>
</fieldset>
</div>
</div>
<input class="tab-switch" name="attr_notes_toggle" type="hidden" value="changelog"/>
<div class="notes-changelog">
<div name="changelog" class="changelog">
<h1 class="changelog-header">Most Recent Updates</h1>
<span class="changelog-entry"><b>2025-03-16 v.90</b> Chuz (James Culp)</span>
<ul>
<li><span class="bullet">F</span><b>New Feature</b> - Added i18n values for translating many placeholders and some other labels throughout the Player facing sheet. Thanks to Talon_Zorch for his hard work translating the sheet on Crowdin and compiling the list for me to add.
</ul>
<span class="changelog-entry"><b>&lt;REDACTED&gt; v.89</b> &lt;REDACTED&gt;</span>
<ul>
<li><span class="bullet">F</span><b>New Feature</b> - Did a v.89 ever exist? The megacorps say it did not and you should stop wondering about it... <span style="font-size: smaller;">skipped a version number, oops</span>
</ul>
<span class="changelog-entry"><b>2024-10-11 v.88</b> Chuz (James Culp)</span>
<ul>
<li><span class="bullet">F</span><b>New Feature</b> - Added lwa spirits from Shadows In Focus: That Old Voodoo to the Spirit NPC sheet. (Agwe, Azaca, Damballah, Erzulie, Ghede, Legba, Obatala, Ogoun and Shango)
</ul>
<span class="changelog-entry"><b>2024-06-05 v.87</b> Chuz (James Culp)</span>
<ul>
<li><span class="bullet">A</span><b>Bugfix</b> - Found an issue with imports where items would be dropped mysteriously. This affected anything that was in a repeating list and was tied to unique ids within Roll20. Added another check to prevent duplicate ids.
</ul>
<span class="changelog-entry"><b>2024-03-03 v.86</b> Chuz (James Culp)</span>
<ul>
<li><span class="bullet">A</span><b>Bugfix</b> - Essence Mod works again
<li><span class="bullet">F</span><b>New Feature</b> - Added Omega, Exoware and Gammaware to Augmentation grade drop downs and essence calculations. They do not however add the bad luck quality or extra condition monitor boxes when selected.
</ul>
<span class="changelog-entry"><b>2023-09-04 v.85</b> Chuz (James Culp)</span>
<ul>
<li><span class="bullet">F</span><b>New Feature</b> - GM Helper sheet, added extended test and d6 roll buttons so GMs can roll from the sheet if needed.
<li><span class="bullet">A</span><b>Bugfix</b> - PC Vehicles tab, handling mod was only reflected on the onroad handling value not the offroad value when settings mode was turned off.
<li><span class="bullet">A</span><b>Bugfix</b> - GM Helper sheet, incrementing OS using the + button was doing strange things, this has been fixed.
</ul>
<span class="changelog-entry"><b>2023-07-10 v.84</b> Chuz (James Culp)</span>
<ul>
<li><span class="bullet">F</span><b>New Feature</b> - Skill mods in the repeating skill list now should update those skills everywhere in the sheet.
<li><span class="bullet">A</span><b>Bugfix</b> - AoE Spells weren't adding the right amount of drain for 12m and 14m
<li><span class="bullet">A</span><b>Bugfix</b> - Attribute+Attribute selections were missing Strength
<li><span class="bullet">A</span><b>Bugfix</b> - Sprint rolls now include -1 skill modifier if the PC doesn't have an Athletics skill. Also added a function to resynch the hidden skill attributes any time a skill name is changed (via the drop down changing) or a skill is deleted.
<li><span class="bullet">A</span><b>Bugfix</b> - Fixed the increment button on the OS Tracker it now adds 1 instead of concatenating a 1 after the other digits sometimes.
</ul>
<span class="changelog-entry"><b>2023-06-15 v.83</b> Chuz (James Culp)</span>
<ul>
<li><span class="bullet">F</span><b>New Feature</b> - Beginning work on the GM Helper sheet, step 1 add an OS Tracker. I'm open to suggestions for other helpful GM tools to include in this sheet in the usual venues (Discord, Patreon, Roll20 DMs)
<li><span class="bullet">F</span><b>New Feature</b> - GMs rejoice, select a token on the board and click the "Track Selected" button on the GM Helper character sheet to add the selected character's name and A/S/D/F to the tracker.
</ul>
<span class="changelog-entry"><b>2023-05-30 v.82</b> Chuz (James Culp)</span>
<ul>
<li><span class="bullet">E</span><b>Update</b> - Added Hack & Slash Matrix Actions to the Rolls Pane -> Matrix Roll Buttons
<li><span class="bullet">F</span><b>New Feature</b> - Added Matrix Roll Buttons Legality Filter, this allows you to hide illegal actions. For pcs without a matrix persona or that are worried about OS
<li><span class="bullet">F</span><b>New Feature</b> - Added Matrix Roll Buttons Access Level Filter, this allows you to hide actions that are not usable at a particular Matrix Access Level (outsider/user/admin)
</ul>
<span class="changelog-entry"><b>2023-05-22 v.81</b> Chuz (James Culp)</span>
<ul>
<li><span class="bullet">A</span><b>Bugfix</b> - More weapon dicepool tweaks
<li><span class="bullet">F</span><b>New Feature</b> - NPC->Spirits made spirits awakened and now display the spells section for them. Dicepool does not auto-update when spirit force changes, that is an exercise for the user.
<li><span class="bullet">F</span><b>New Feature</b> - Added Critter Powers drag and drop from the compendium for spirits and grunts.
</ul>
<span class="changelog-entry"><b>2023-05-18 v.80</b> Chuz (James Culp)</span>
<ul>
<li><span class="bullet">A</span><b>Bugfix</b> - PC Qualities were always showing up as Negative regardless of the actual type.
<li><span class="bullet">A</span><b>Bugfix</b> - PC->Spells Ranges of Touch were showing up as LOS.
<li><span class="bullet">A</span><b>Bugfix</b> - PC/NPC Defense rolls throwing an error for the armor_rating, updated PC sheets to use defense_rating so they match NPC sheets.
</ul>
<span class="changelog-entry"><b>2023-05-01 v.79</b> Chuz (James Culp)</span>
<ul>
<li><span class="bullet">F</span><b>New Feature</b> - Added Resonance and Level to the sprite skill rolls attribute options
<li><span class="bullet">F</span><b>New Feature</b> - Added Magic and Force to the spirit skill rolls attribute options
<li><span class="bullet">F</span><b>New Feature</b> - Added Magic AR to combat spell roll templates
<li><span class="bullet">F</span><b>New Feature</b> - PC Added DR to Defense rolls template
<li><span class="bullet">F</span><b>New Feature</b> - NPC Added Universal Dicepool Adjustment (@{uda}) for GMs that with to add a dicepool penalty/bonus to all rolls the NPC makes.
<li><span class="bullet">A</span><b>Bugfix</b> - Fix to Grunts dicepool bug.
</ul>
<span class="changelog-entry"><b>2023-03-27 v.78</b> Chuz (James Culp)</span>
<ul>
<li><span class="bullet">A</span><b>Bugfix</b> - Final(?) fix to Spirit and Vehicle dicepool bug. Spirit ranged/melee dicepools are set when the spirit is created (when force/type are changed and reset toggle is on). Vehicle pools are set when the sheet owner sets them. They will only change now if/when they are in grunt groups and the number of grunts change or the sheet owner changes the dicepool directly.
</ul>
<span class="changelog-entry"><b>2023-03-20 v.77</b> Chuz (James Culp)</span>
<ul>
<li><span class="bullet">A</span><b>Bugfix</b> - (?) Trying to fix some dicepool bugs on NPC and Vehicle sheets tied to grunt groups.
<li><span class="bullet">A</span><b>Bugfix</b> - Vehicle physical and matrix condition monitors weren't updating right on drag and drop
</ul>
<span class="changelog-entry"><b>2023-03-13 v.76</b> Chuz (James Culp)</span>
<ul>
<li><span class="bullet">A</span><b>Bugfix</b> - Fixed Spirit Astral initiative dice had been reduced to mere metahumanity levels, they've been returned to their previous exceptionalism.
</ul>
<span class="changelog-entry"><b>2023-02-27 v.75</b> Chuz (James Culp)</span>
<ul>
<li><span class="bullet">F</span><b>New Feature</b> - PC-Magic-Conjuring Added Astral Reputation and added AsRep to Summon Spirit button output
<li><span class="bullet">F</span><b>New Feature</b> - Added Heat, Reputation and AsRep to the Social Pane
<li><span class="bullet">F</span><b>New Feature</b> - Added Drag and Drop support for Gear-Ammunition-Grenades Gear-Ammunition-Rockets to place them in the Arms-Grenades section instead of Gear
<li><span class="bullet">F</span><b>New Feature</b> - Added Grenade dicepool calculations
</ul>
<span class="changelog-entry"><b>2023-02-27 v.74</b> Chuz (James Culp)</span>
<ul>
<li><span class="bullet">A</span><b>Bugfix</b> - Fix for matrix device stats on drag and drop for NPCs
<li><span class="bullet">A</span><b>Bugfix</b> - Fix for Sprite drag and drop issue
<li><span class="bullet">F</span><b>New Feature</b> - NPCs->Grunts added a stun monitor and flag to display it (it is hidden by default)
</ul>
<span class="changelog-entry"><b>2023-02-23 v.73</b> Chuz (James Culp)</span>
<ul>
<li><span class="bullet">A</span><b>Bugfix</b> - PC Initiatives - Fixed a condition where if a dice mod is set and then the initiative base is changed it keeps adding the dice mod repeatedly.
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="rolls pc-col">
<div class="pc-row">
<div class="header right-header">
<h1 data-i18n="rolls">Rolls</h1>
<div class="right-tri"></div>
</div>
<br>
<div class="header right-header">
<div class="header htab">
<div class="triangle"></div>
<input class="tab-switch" name="attr_rolls_toggle" type="radio" value="matrix" checked="checked"/>
<h1 data-i18n="matrixactions">Matrix Actions</h1>
<div class="right-tri"></div>
</div>
<div class="header htab">
<div class="triangle"></div>
<input class="tab-switch" name="attr_rolls_toggle" type="radio" value="misc"/>
<h1 data-i18n="misc">Misc</h1>
<div class="right-tri"></div>
</div>
</div>
<!-- Hidden Buttons -->
<div style="display: none;">
<button name="act_extended_next" type="action" style="display: none;" value=""></button>
<button name="act_bump_fours1" type="action" style="display: none;"></button>
<button name="act_bump_fours2" type="action" style="display: none;"></button>
<button name="act_bump_fours3" type="action" style="display: none;"></button>
<button name="act_bump_fours4" type="action" style="display: none;"></button>
<button name="act_bump_fours5" type="action" style="display: none;"></button>
<button name="act_bump_fours6" type="action" style="display: none;"></button>
<button name="act_bump_fours7" type="action" style="display: none;"></button>
<button name="act_reroll1" type="action" style="display: none;"></button>
<button name="act_reroll2" type="action" style="display: none;"></button>
<button name="act_reroll3" type="action" style="display: none;"></button>
<button name="act_reroll4" type="action" style="display: none;"></button>
<button name="act_reroll5" type="action" style="display: none;"></button>
<button name="act_reroll6" type="action" style="display: none;"></button>
<button name="act_reroll7" type="action" style="display: none;"></button>
<button name="act_reroll8" type="action" style="display: none;"></button>
<button name="act_reroll9" type="action" style="display: none;"></button>
<button name="act_reroll10" type="action" style="display: none;"></button>
<button name="act_reroll11" type="action" style="display: none;"></button>
<button name="act_reroll12" type="action" style="display: none;"></button>
<button name="act_reroll13" type="action" style="display: none;"></button>
<button name="act_reroll14" type="action" style="display: none;"></button>
<button name="act_reroll15" type="action" style="display: none;"></button>
<button name="act_reroll16" type="action" style="display: none;"></button>
<button name="act_reroll17" type="action" style="display: none;"></button>
<button name="act_reroll18" type="action" style="display: none;"></button>
<button name="act_reroll19" type="action" style="display: none;"></button>
<button name="act_reroll20" type="action" style="display: none;"></button>
<button name="act_reroll21" type="action" style="display: none;"></button>
<button name="act_reroll22" type="action" style="display: none;"></button>
<button name="act_reroll23" type="action" style="display: none;"></button>
<button name="act_reroll24" type="action" style="display: none;"></button>
<button name="act_reroll25" type="action" style="display: none;"></button>
<button name="act_reroll26" type="action" style="display: none;"></button>
<button name="act_reroll27" type="action" style="display: none;"></button>
<button name="act_reroll28" type="action" style="display: none;"></button>
<button name="act_reroll29" type="action" style="display: none;"></button>
<button name="act_reroll30" type="action" style="display: none;"></button>
<button name="act_reroll31" type="action" style="display: none;"></button>
<button name="act_reroll32" type="action" style="display: none;"></button>
<button name="act_reroll33" type="action" style="display: none;"></button>
<button name="act_reroll34" type="action" style="display: none;"></button>
<button name="act_reroll35" type="action" style="display: none;"></button>
<button name="act_reroll36" type="action" style="display: none;"></button>
<button name="act_reroll37" type="action" style="display: none;"></button>
<button name="act_reroll38" type="action" style="display: none;"></button>
<button name="act_reroll39" type="action" style="display: none;"></button>
<button name="act_reroll40" type="action" style="display: none;"></button>
<button name="act_reroll41" type="action" style="display: none;"></button>
<button name="act_reroll42" type="action" style="display: none;"></button>
<button name="act_reroll43" type="action" style="display: none;"></button>
<button name="act_reroll44" type="action" style="display: none;"></button>
<button name="act_reroll45" type="action" style="display: none;"></button>
<button name="act_reroll46" type="action" style="display: none;"></button>
<button name="act_reroll47" type="action" style="display: none;"></button>
<button name="act_reroll48" type="action" style="display: none;"></button>
<button name="act_reroll49" type="action" style="display: none;"></button>
<button name="act_reroll50" type="action" style="display: none;"></button>
</div>
<div style="display: none;">
<button class="btn ui-draggable" name="act_matrixresist_int_f" type="action" style="display: none;" value=""></button>
<button class="btn ui-draggable" name="act_matrixresist_f_s" type="action" style="display: none;" value=""></button>
<button class="btn ui-draggable" name="act_matrixresist_w_f" type="action" style="display: none;" value=""></button>
<button class="btn ui-draggable" name="act_matrixresist_dp_f" type="action" style="display: none;" value=""></button>
<button class="btn ui-draggable" name="act_matrixresist_f_f" type="action" style="display: none;" value=""></button>
<button class="btn ui-draggable" name="act_matrixresist_int_dp" type="action" style="display: none;" value=""></button>
<button class="btn ui-draggable" name="act_matrixresist_dp_s" type="action" style="display: none;" value=""></button>
<button class="btn ui-draggable" name="act_matrixresist_c_dp" type="action" style="display: none;" value=""></button>
<button class="btn ui-draggable" name="act_matrixresist_dp_dr" type="action" style="display: none;" value=""></button>
<button class="btn ui-draggable" name="act_matrixresist_a_dp" type="action" style="display: none;" value=""></button>
<button class="btn ui-draggable" name="act_matrixresist_w_s" type="action" style="display: none;" value=""></button>
<button class="btn ui-draggable" name="act_matrixresist_dr_dr" type="action" style="display: none;" value=""></button>
<button class="btn ui-draggable" name="act_matrixresist_l_f" type="action" style="display: none;" value=""></button>
<button class="btn ui-draggable" name="act_matrixresist_pilot_f" type="action" style="display: none;" value=""></button>
</div>
<div class="border-box">
<div class="pc-box">
<div class="rolls-col">
<input class="tab-switch" name="attr_rolls_toggle" type="hidden" value="matrix"/>
<div class="rolls-matrix">
<input type="hidden" name="attr_display_illegal_matrix_actions" value="">
<input type="hidden" name="attr_matrix_access_level_filter" value="">
<h3 data-i18n="rollbuttonsdisclaimer"></h3><br>
<span class="full-width">
<label class="fright" data-i18n-title="illegal_actions" title="Display Illegal Actions">
<span data-i18n="illegal_actions"></span>
<input type="checkbox" name="attr_display_illegal_matrix_actions" value="1" checked="checked" title="@{display_illegal_matrix_actions}">
</label>
</span>
<span class="full-width">
<label class="fleft" data-i18n-title="matrix_noise" title="Matrix Noise">
<span data-i18n="matrix_noise"></span>
<input type="number" name="attr_matrix_noise" value="0" placeholder="0" title="@{matrix_noise}" step="1">
</label>
<label class="fright" data-i18n-title="matrix_access_level" title="Access Level Filter">
<span data-i18n="access_level_filter"></span>
<select name="attr_matrix_access_level_filter" title="@{matrix_access_level_filter}">
<option data-i18n="all" value="all">All</option>
<option data-i18n="outsider" value="outsider">Outsider</option>
<option data-i18n="user" value="user">User</option>
<option data-i18n="admin" value="admin">Admin</option>
</select>
</label>
</span>
<hr>
<h2 data-i18n="matrixmajor">Matrix Major Actions</h2>
<button title="Cracking + Logic" class="illegal outsider crb" name="act_matrix_backdoor_entry" type="action" value=""><span data-i18n="backdoorentry"></span></button>
<button title="Cracking + Logic" class="illegal outsider user admin crb" name="act_matrix_brute_force" type="action" value=""><span data-i18n="bruteforce"></span></button>
<button title="Cracking + Logic" class="legal user admin hs" name="act_matrix_calibration" type="action" value=""><span data-i18n="calibration"></span></button>
<button title="Cracking + Logic" class="illegal admin crb" name="act_matrix_check_os" type="action" value=""><span data-i18n="checkos"></span></button>
<button title="Electronics + Logic" class="legal user admin crb" name="act_matrix_control_device" type="action" value=""><span data-i18n="controldevice"></span></button>
<button title="Cracking + Logic" class="illegal user admin crb" name="act_matrix_crack_file" type="action" value=""><span data-i18n="crackfile"></span></button>
<button title="Cracking + Logic" class="illegal admin crb" name="act_matrix_crash_program" type="action" value=""><span data-i18n="crashprogram"></span></button>
<button title="Cracking + Logic" class="illegal outsider user admin crb" name="act_matrix_data_spike" type="action" value=""><span data-i18n="dataspike"></span></button>
<button title="Cracking + Logic" class="illegal outsider user admin hs" name="act_matrix_delayed_command" type="action" value=""><span data-i18n="delayed_command"></span></button>
<button title="Electronics + Logic" class="illegal outsider hs" name="act_matrix_denial_of_service" type="action" value=""><span data-i18n="denial_of_service"></span></button>
<button title="Cracking + Logic" class="illegal outsider user admin hs" name="act_matrix_device_lock" type="action" value=""><span data-i18n="device_lock"></span></button>
<button title="Cracking + Logic" class="legal user admin crb" name="act_matrix_disarm_data_bomb" type="action" value=""><span data-i18n="disarmdatabomb"></span></button>
<button title="Electronics + Logic" class="legal user admin crb" name="act_matrix_edit_file" type="action" value=""><span data-i18n="editfile"></span></button>
<button title="Electronics + Logic" class="legal user admin crb" name="act_matrix_encrypt_file" type="action" value=""><span data-i18n="encryptfile"></span></button>
<button title="Electronics + Logic" class="illegal user admin crb" name="act_matrix_erase_matrix_signature" type="action" value=""><span data-i18n="erasematrixsignature"></span></button>
<button title="Electronics + Logic" class="legal admin crb" name="act_matrix_format_device" type="action" value=""><span data-i18n="formatdevice"></span></button>
<span class="matrix-action legal outsider user admin crb" data-i18n="fullmatrixdefense"></span>
<button title="Cracking + Logic" class="illegal user admin hs" name="act_matrix_garbage_in_garbage_out" type="action" value=""><span data-i18n="garbage_in_garbage_out"></span></button>
<button title="Electronics + Logic" class="illegal user admin crb" name="act_matrix_hash_check" type="action" value=""><span data-i18n="hashcheck"></span></button>
<button title="Cracking + Intuition" class="illegal outsider user admin crb" name="act_matrix_hide" type="action" value=""><span data-i18n="hide"></span></button>
<button title="Electronics + Willpower" class="legal outsider user admin crb" name="act_matrix_jackout" type="action" value=""><span data-i18n="jackout"></span></button>
<button title="Cracking + Logic" class="illegal admin crb" name="act_matrix_jam_signals" type="action" value=""><span data-i18n="jamsignals"></span></button>
<button title="Electronics + Logic" class="legal user admin crb" name="act_matrix_jump_into_rigged_device" type="action" value=""><span data-i18n="jumpintoriggeddevice"></span></button>
<button title="Cracking + Logic" class="illegal outsider hs" name="act_matrix_known_exploit_backdoor_entry" type="action" value=""><span data-i18n="known_exploit_backdoor_entry"></span></button>
<button title="Cracking + Logic" class="illegal outsider hs" name="act_matrix_masquerade" type="action" value=""><span data-i18n="masquerade"></span></button>
<button title="Electronics + Intuition" class="legal outsider user admin crb" name="act_matrix_matrix_perception" type="action" value=""><span data-i18n="matrixperception"></span></button>
<button title="Electronics + Intuition" class="legal outsider user admin crb" name="act_matrix_matrix_search" type="action" value=""><span data-i18n="matrixsearch"></span></button>
<button title="Cracking + Logic" class="illegal outsider hs" name="act_matrix_metahuman_in_the_middle" type="action" value=""><span data-i18n="metahuman_in_the_middle"></span></button>
<button title="Electronics + Logic" class="illegal admin hs" name="act_matrix_modify_icon" type="action" value=""><span data-i18n="modify_icon"></span></button>
<button title="Cracking + Logic" class="illegal outsider hs" name="act_matrix_popup" type="action" value=""><span data-i18n="popup"></span></button>
<button title="Cracking + Logic" class="illegal outsider user admin crb" name="act_matrix_probe" type="action" value=""><span data-i18n="probe"></span></button>
<button title="Electronics + Logic" class="legal admin crb" name="act_matrix_reboot_device" type="action" value=""><span data-i18n="rebootdevice"></span></button>
<button title="Electronics + Logic" class="illegal admin crb" name="act_matrix_set_data_bomb" type="action" value=""><span data-i18n="setdatabomb"></span></button>
<button title="Cracking + Logic" class="illegal admin crb" name="act_matrix_snoop" type="action" value=""><span data-i18n="snoop"></span></button>
<button title="Cracking + Logic" class="illegal outsider user admin crb" name="act_matrix_spoof_command" type="action" value=""><span data-i18n="spoofcommand"></span></button>
<button title="Electronics + Logic" class="illegal admin hs" name="act_matrix_subvert_infrastructure" type="action" value=""><span data-i18n="subvert_infrastructure"></span></button>
<button title="Cracking + Logic" class="illegal outsider user admin crb" name="act_matrix_tarpit" type="action" value=""><span data-i18n="tarpit"></span></button>
<button title="Electronics + Intuition" class="illegal admin crb" name="act_matrix_trace_icon" type="action" value=""><span data-i18n="traceicon"></span></button>
<button title="Electronics + Logic" class="legal outsider user admin hs" name="act_matrix_threat_analysis" type="action" value=""><span data-i18n="threat_analysis"></span></button>
<hr>
<h2 data-i18n="matrixminor">Matrix Minor Actions</h2>
<span class="matrix-action legal user admin" data-i18n="changeicon"></span>
<span class="matrix-action legal" data-i18n="enterexithost"></span>
<button title="Electronics + Intuition" class="legal outsider user admin" name="act_matrix_matrix_perception" type="action" value=""><span data-i18n="matrixperception"></span></button>
<span class="matrix-action legal admin" data-i18n="reconfigurematrixattribute"></span>
<span class="matrix-action legal outsider user admin" data-i18n="sendmessage"></span>
<button title="Electronics + Logic" class="illegal outsider hs" name="act_matrix_squelch" type="action" value=""><span data-i18n="squelch"></span></button>
<span class="matrix-action legal admin" data-i18n="switchinterfacemode"></span>
<span class="matrix-action legal outsider" data-i18n="virtual_aim"></span>
<button title="Cracking + Logic" class="illegal user admin hs" name="act_matrix_watchdog" type="action" value=""><span data-i18n="watchdog"></span></button>
</div>
<input class="tab-switch" name="attr_rolls_toggle" type="hidden" value="misc"/>
<div class="rolls-misc">
<h2 data-i18n="convert">Convert</h2>
<span>&nbsp;</span>
<input type=number name="attr_measurement1" value="">
<select name="attr_conversion">
<option data-i18n="lb-kg" value="lb-kg">lb <=> kg</option>
<option data-i18n="ft-m" value="ft-m">ft <=> m</option>
<option data-i18n="mi-km" value="mi-km">mi <=> km</option>
</select>
<input type=number name="attr_measurement2" value="">
<span>&nbsp;</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- =========================================================
NPC SHEETS
========================================================= -->
<div class="npc">
<img class="shadowrun-logo" alt="Shadowrun sixth edition logo" src="https://s3.amazonaws.com/files.d20.io/images/204802539/QInmmma8HvUBA90c8e8H8Q/max.png?1614545502"/>
<input name="attr_stats_toggle" type="hidden" value="settings" checked="checked"/>
<input name="attr_flag_matrix" type="hidden" value=""/>
<input name="attr_show_stun" type="hidden" value=""/>
<div class="tabs border-box">
<div class="pc-box">
<div class="header-nav">
<input name="attr_stats_toggle" type="checkbox" value="settings" checked="checked"/>
<span class="pictos">y</span>
<select name="attr_sheet_type" title="Sheet Type">
<option value="pc" data-i18n="pc">PC</option>
<option value="grunt" data-i18n="grunt">Grunt</option>
<option value="spirit" data=i18n="spirit">Spirit</option>
<option value="host" data-i18n="host">Host</option>
<option value="sprite" data-i18n="sprite">Sprite</option>
<option value="vehicle" data-i18n="vehicle">Vehicle</option>
<option value="gm_helper" data-i18n="gm_helper">GM Helper</option>
</select>
<select class="sprite" name="attr_sprite_type" title="Sprite Type">
<option value="Courier" data-i18n="couriersprite">Courier</option>
<option value="Crack" data-i18n="cracksprite">Crack</option>
<option value="Data" data-i18n="datasprite">Data</option>
<option value="Fault" data-i18n="faultsprite">Fault</option>
<option value="Machine" data-i18n="machinesprite">Machine</option>
<option value="Other" data-i18n="other">Other</option>
</select>
<select class="spirit" name="attr_spirit_type" title="Spirit Type">
<option value="Air" data-i18n="air">Air</option>
<option value="Beasts" data-i18n="beasts">Beasts</option>
<option value="Blood" data-i18n="blood"></option>
<option value="Earth" data-i18n="earth">Earth</option>
<option value="Fire" data-i18n="fire">Fire</option>
<option value="Guardian" data-i18n="guardian">Guardian</option>
<option value="Guidance" data-i18n="guidance">Guidance</option>
<option value="Insect (Caretaker)" data-i18n="insect_caretaker">Insect (Caretaker)</option>
<option value="Insect (Nymph)" data-i18n="insect_nymph">Insect (Nymph)</option>
<option value="Insect (Scout)" data-i18n="insect_scout">Insect (Scout)</option>
<option value="Insect (Soldier)" data-i18n="insect_soldier">Insect (Soldier)</option>
<option value="Insect (Worker)" data-i18n="insect_worker">Insect (Worker)</option>
<option value="Insect (Queen)" data-i18n="insect_queen">Insect (Queen/Mother)</option>
<option value="Insect (Alpha)" data-i18n="insect_alpha">Insect (Alpha)</option>
<option value="Kin" data-i18n="kin">Kin</option>
<option value="Plant" data-i18n="plant">Plant</option>
<option value="Task" data-i18n="task">Task</option>
<option value="Water" data-i18n="water">Water</option>
<option value="Agwe" data-i18n="agwe">Agwe</option>
<option value="Azaca" data-i18n="azaca">Azaca</option>
<option value="Damballah" data-i18n="damballah">Damballah</option>
<option value="Erzulie" data-i18n="erzulie">Erzulie</option>
<option value="Ghede" data-i18n="ghede">Ghede</option>
<option value="Legba" data-i18n="legba">Legba</option>
<option value="Obatala" data-i18n="obatala">Obatala</option>
<option value="Ogoun" data-i18n="ogoun">Ogoun</option>
<option value="Shango" data-i18n="shango">Shango</option>
<option value="Other" data-i18n="other">Other</option>
</select>
<h2 class="grunt" data-i18n="metatype"></h2>
<input class="grunt" name="attr_metatype" type="text" />
<span class="host vehicle">&nbsp;</span>
<span class="spirit">
<h3 data-i18n-title="resettoggle" data-i18n="reset"></h3>
</span>
<span class="spirit">
<label class="switch" data-i18n-title="resettoggle" title="Reset skills, powers and weapons when changing type or force">
<input name="attr_spirit_reset_toggle" type="checkbox" checked="checked" value="reset"/><span class="slider"></span>
</label>
</span>
<span class="host vehicle sprite">&nbsp;</span>
<span></span>
<h2 data-i18n="name"></h2>
<input name="attr_character_name" type="text" />
</div>
<div class="header-toggles pc-box">
<span>&nbsp;</span>
<button name="act_extended_start" class="icon pictos" title="Start Extended Test" type="action" value="">r</button>
<button name="act_d6" class="icon d6" title="Roll D6s" type="action" value="">L</button>
<h2 data-i18n-title="whispergm">/w GM</h2>
<label class="switch" data-i18n-title="whispergm" title="Whisper rolls to GM">
<input class="whisper-toggle" name="attr_gm_toggle" type="checkbox" value="/w gm"/><span class="slider"></span>
</label>
<h2 data-i18n-title="wounds">Wounds</h2>
<label class="switch" data-i18n-title="wounds" title="Wounds">
<input class="whisper-toggle" name="attr_wounds_toggle" type="checkbox" value="@{wounds}"/><span class="slider"></span>
</label>
<h2 data-i18n-title="dicepoolmodifiers">Modifiers</h2>
<label class="switch" data-i18n-title="dicepoolmodifiers" title="Dicepool Modifiers">
<input class="whisper-toggle" name="attr_modifiers_toggle" type="checkbox" value="?{Modifiers +/-|0}"/><span class="slider"></span>
</label>
<h2 data-i18n-title="addedgetodicepool">Edge</h2>
<label class="switch" data-i18n-title="addedgetodicepool" title="Add Edge to your dice pool and exploding 6's">
<input class="whisper-toggle" name="attr_edge_toggle" type="checkbox" value="@{edge}"/><span class="slider"></span>
</label>
<h2 data-i18n-title="wilddie">Wild Die</h2>
<label class="switch" data-i18n-title="wilddie" title="Roll a single wild die">
<input class="whisper-toggle" name="attr_wild_die" type="checkbox" value="1"/><span class="slider"></span>
</label>
<span>&nbsp;</span>
</div>
</div>
</div>
<div class="border-box">
<div class="grunt attribute pc-box">
<button data-i18n="body" name="act_body" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{body}}}{{dice=[[(@{body}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">b</button>
<span name="attr_display_body"></span>
<label class="settings" data-i18n-title="Body" title="Body">
<input name="attr_body_base" placeholder="3" title="@{body_base}" type="number" value="3"/>
</label>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_body_modifier" placeholder="+" title="@{body_modifier}" type="number" value=""/>
</label>
<button data-i18n="agility" name="act_agility" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{agility}}}{{dice=[[(@{agility}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">a</button>
<span name="attr_display_agility"></span>
<label class="settings" data-i18n-title="Agility" title="Agility">
<input name="attr_agility_base" placeholder="3" title="@{agility_base}" type="number" value="3"/>
</label>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_agility_modifier" placeholder="+" title="@{agility_modifier}" type="number" value=""/>
</label>
<button data-i18n="reaction" name="act_reaction" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{reaction}}}{{dice=[[(@{reaction}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">r</button>
<span name="attr_display_reaction"></span>
<label class="settings" data-i18n-title="Reaction" title="Reaction">
<input name="attr_reaction_base" placeholder="3" title="@{reaction_base}" type="number" value="3"/>
</label>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_reaction_modifier" placeholder="+" title="@{reaction_modifier}" type="number" value=""/>
</label>
<button data-i18n="strength" name="act_strength" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{strength}}}{{dice=[[(@{strength}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">s</button>
<span name="attr_display_strength"></span>
<label class="settings" data-i18n-title="Strength" title="Strength">
<input name="attr_strength_base" placeholder="3" title="@{strength_base}" type="number" value="3"/>
</label>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_strength_modifier" placeholder="+" title="@{strength_modifier}" type="number" value=""/>
</label>
<button data-i18n="willpower" name="act_willpower" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{willpower}}}{{dice=[[(@{willpower}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">w</button>
<span name="attr_display_willpower"></span>
<label class="settings" data-i18n-title="Willpower" title="Willpower">
<input name="attr_willpower_base" placeholder="3" title="@{willpower_base}" type="number" value="3"/>
</label>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_willpower_modifier" placeholder="+" title="@{willpower_modifier}" type="number" value=""/>
</label>
<button data-i18n="logic" name="act_logic" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{logic}}}{{dice=[[(@{logic}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">l</button>
<span name="attr_display_logic"></span>
<label class="settings" data-i18n-title="Logic" title="Logic">
<input name="attr_logic_base" placeholder="3" title="@{logic_base}" type="number" value="3"/>
</label>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_logic_modifier" placeholder="+" title="@{logic_modifier}" type="number" value=""/>
</label>
<button data-i18n="intuition" name="act_intuition" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{intuition}}}{{dice=[[(@{intuition}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">i</button>
<span name="attr_display_intuition"></span>
<label class="settings" data-i18n-title="Intuition" title="Intuition">
<input name="attr_intuition_base" placeholder="3" title="@{intuition_base}" type="number" value="3"/>
</label>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_intuition_modifier" placeholder="+" title="@{intuition_modifier}" type="number" value=""/>
</label>
<button data-i18n="charisma" name="act_charisma" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{charisma}}}{{dice=[[(@{charisma}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">c</button>
<span name="attr_display_charisma"></span>
<label class="settings" data-i18n-title="Charisma" title="Charisma">
<input name="attr_charisma_base" placeholder="3" title="@{charisma_base}" type="number" value="3"/>
</label>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_charisma_modifier" placeholder="+" title="@{charisma_modifier}" type="number" value=""/>
</label>
<button data-i18n="edge" name="act_edge" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{edge}}}{{dice=[[(@{edge}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">e</button>
<span name="attr_edge"></span>
<label class="settings" data-i18n-title="edge" title="edge">
<input name="attr_edge" placeholder="3" title="@{edge}" type="number" value="3"/>
</label>
<h1 data-i18n="ess">ess</h1><span name="attr_essence"></span>
<label class="settings" data-i18n-title="essence" title="essence">
<input name="attr_essence" placeholder="6" title="@{essence}" type="number" step='0.01' value="6"/>
</label>
<h1 class="hide-magic" data-i18n="magic">m</h1><span class="hide-magic" name="attr_magic"></span>
<label class="hide-magic" data-i18n-title="magic" title="magic"><span class="settings">
<input name="attr_magic" placeholder="6" title="@{magic}" type="number" value="0"/>
</span></label>
<h1 class="hide-resonance" data-i18n="resonance">r</h1><span class="hide-resonance" name="attr_resonance"></span>
<label class="hide-resonance" data-i18n-title="resonance" title="resonance"><span class="settings">
<input class="hide-resonance" name="attr_resonance" placeholder="6" title="@{resonance}" type="number" value="0"/>
</span></label>
</div>
<div class="spirit attribute pc-box">
<h1 data-i18n="force">Force</h1><span name="attr_force"></span>
<label data-i18n-title="force" title="force"><span class="settings">
<input name="attr_force" placeholder="0" title="@{force}" type="number" value="1"/>
</span></label>
<label class="settings" data-i18n-title="modifier" title="modifier" style="display: none;"></label>
<h1 data-i18n="tasks">Tasks</h1><span class="spirit" name="attr_tasks"></span>
<label data-i18n-title="tasks" title="tasks"><span class="settings">
<input name="attr_tasks_base" placeholder="0" title="@{tasks}" type="number" value="1"/>
</span></label>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_tasks_modifier" placeholder="+" title="@{tasks_modifier}" type="number" value=""/>
</label>
<button data-i18n="body" name="act_body" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{body}}}{{dice=[[(@{body}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">b</button>
<span name="attr_display_body"></span>
<label class="settings" data-i18n-title="Body" title="Body">
<input name="attr_body_base" placeholder="3" title="@{body_base}" type="number" value="1"/>
</label>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_body_modifier" placeholder="+" title="@{body_modifier}" type="number" value=""/>
</label>
<button data-i18n="agility" name="act_agility" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{agility}}}{{dice=[[(@{agility}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">a</button>
<span name="attr_display_agility"></span>
<label class="settings" data-i18n-title="Agility" title="Agility">
<input name="attr_agility_base" placeholder="3" title="@{agility_base}" type="number" value="1"/>
</label>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_agility_modifier" placeholder="+" title="@{agility_modifier}" type="number" value=""/>
</label>
<button data-i18n="reaction" name="act_reaction" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{reaction}}}{{dice=[[(@{reaction}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">r</button>
<span name="attr_display_reaction"></span>
<label class="settings" data-i18n-title="Reaction" title="Reaction">
<input name="attr_reaction_base" placeholder="3" title="@{reaction_base}" type="number" value="1"/>
</label>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_reaction_modifier" placeholder="+" title="@{reaction_modifier}" type="number" value=""/>
</label>
<button data-i18n="strength" name="act_strength" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{strength}}}{{dice=[[(@{strength}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">s</button>
<span name="attr_display_strength"></span>
<label class="settings" data-i18n-title="Strength" title="Strength">
<input name="attr_strength_base" placeholder="3" title="@{strength_base}" type="number" value="1"/>
</label>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_strength_modifier" placeholder="+" title="@{strength_modifier}" type="number" value=""/>
</label>
<button data-i18n="willpower" name="act_willpower" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{willpower}}}{{dice=[[(@{willpower}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">w</button>
<span name="attr_display_willpower"></span>
<label class="settings" data-i18n-title="Willpower" title="Willpower">
<input name="attr_willpower_base" placeholder="3" title="@{willpower_base}" type="number" value="1"/>
</label>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_willpower_modifier" placeholder="+" title="@{willpower_modifier}" type="number" value=""/>
</label>
<button data-i18n="logic" name="act_logic" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{logic}}}{{dice=[[(@{logic}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">l</button>
<span name="attr_display_logic"></span>
<label class="settings" data-i18n-title="Logic" title="Logic">
<input name="attr_logic_base" placeholder="3" title="@{logic_base}" type="number" value="1"/>
</label>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_logic_modifier" placeholder="+" title="@{logic_modifier}" type="number" value=""/>
</label>
<button data-i18n="intuition" name="act_intuition" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{intuition}}}{{dice=[[(@{intuition}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">i</button>
<span name="attr_display_intuition"></span>
<label class="settings" data-i18n-title="Intuition" title="Intuition">
<input name="attr_intuition_base" placeholder="3" title="@{intuition_base}" type="number" value="1"/>
</label>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_intuition_modifier" placeholder="+" title="@{intuition_modifier}" type="number" value=""/>
</label>
<button data-i18n="charisma" name="act_charisma" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{charisma}}}{{dice=[[(@{charisma}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">c</button>
<span name="attr_display_charisma"></span>
<label class="settings" data-i18n-title="Charisma" title="Charisma">
<input name="attr_charisma_base" placeholder="3" title="@{charisma_base}" type="number" value="1"/>
</label>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_charisma_modifier" placeholder="+" title="@{charisma_modifier}" type="number" value=""/>
</label>
<button data-i18n="edge" name="act_edge" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{edge}}}{{dice=[[(@{edge}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">e</button>
<span name="attr_edge"></span>
<label class="settings" data-i18n-title="edge" title="edge">
<input name="attr_edge" placeholder="3" title="@{edge}" type="number" value="0"/>
</label>
<h1 data-i18n="ess">ess</h1><span name="attr_essence"></span>
<label class="settings" data-i18n-title="essence" title="essence">
<input name="attr_essence" placeholder="6" title="@{essence}" type="number" step='0.01' value="6"/>
</label>
<h1 data-i18n="magic">m</h1><span name="attr_magic"></span>
<label data-i18n-title="magic" title="magic"><span class="settings">
<input name="attr_magic" placeholder="6" title="@{magic}" type="number" value="0"/>
</span></label>
</div>
<div class="host attribute pc-box">
<button data-i18n="host_rating" name="act_host_rating" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{host_rating}}}{{rating=@{host_rating}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">host_rating</button><span name="attr_host_rating"></span>
<label class="settings" data-i18n-title="host_rating" title="Host Rating">
<input name="attr_host_rating" placeholder="5" title="@{host_rating}" type="number" value=""/>
</label>
<button data-i18n="attack" name="act_host_attack" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{attack}}}{{dice=[[(@{attack}+?{Secondary Attribute?|None,0|Host Rating,@{host_rating}|Attack,@{attack}|Sleaze,@{sleaze}|Data Processing,@{data_processing}|Firewall,@{firewall}}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">attack</button><span name="attr_attack"></span>
<label class="settings" data-i18n-title="attack" title="Attack">
<input name="attr_attack" placeholder="5" title="@{attack}" type="number" value=""/>
</label>
<button data-i18n="sleaze" name="act_host_sleaze" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{sleaze}}}{{dice=[[(@{sleaze}+?{Secondary Attribute?|None,0|Host Rating,@{host_rating}|Attack,@{attack}|Sleaze,@{sleaze}|Data Processing,@{data_processing}|Firewall,@{firewall}}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">sleaze</button><span name="attr_sleaze"></span>
<label class="settings" data-i18n-title="sleaze" title="Sleaze">
<input name="attr_sleaze" placeholder="6" title="@{sleaze}" type="number" value=""/>
</label>
<button data-i18n="data_processing" name="act_host_data_processing" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{data_processing}}}{{dice=[[(@{data_processing}+?{Secondary Attribute?|None,0|Host Rating,@{host_rating}|Attack,@{attack}|Sleaze,@{sleaze}|Data Processing,@{data_processing}|Firewall,@{firewall}}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">data_processing</button><span name="attr_data_processing"></span>
<label class="settings" data-i18n-title="data_processing" title="Data Processing">
<input name="attr_data_processing" placeholder="7" title="@{data_processing}" type="number" value=""/>
</label>
<button data-i18n="firewall" name="act_host_firewall" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{firewall}}}{{dice=[[(@{firewall}+?{Secondary Attribute?|None,0|Host Rating,@{host_rating}|Attack,@{attack}|Sleaze,@{sleaze}|Data Processing,@{data_processing}|Firewall,@{firewall}}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">firewall</button><span name="attr_firewall"></span>
<label class="settings" data-i18n-title="firewall" title="Firewall">
<input name="attr_firewall" placeholder="8" title="@{firewall}" type="number" value=""/>
</label>
</div>
<div class="vehicle attribute pc-box">
<h1 data-i18n="hand">Hand</h1><span name="attr_handling"></span>
<label class="settings" data-i18n-title="hand" title="Handling">
<input name="attr_handling" placeholder="3" title="@{handling}" type="number" value=""/>
</label>
<h1 data-i18n="handoff">Hand (Off)</h1><span name="attr_handling_offroad"></span>
<label class="settings" data-i18n-title="handoff" title="Handling (Offroad)">
<input name="attr_handling_offroad" placeholder="3" title="@{handling_offroad}" type="number" value=""/>
</label>
<h1 data-i18n="accel">Accel</h1><span name="attr_acceleration"></span>
<label class="settings" data-i18n-title="accel" title="Accel">
<input name="attr_acceleration" placeholder="3" title="@{acceleration}" type="number" value=""/>
</label>
<h1 data-i18n="interval">Interval</h1><span name="attr_interval"></span>
<label class="settings" data-i18n-title="interval" title="Speed Interval">
<input name="attr_interval" placeholder="3" title="@{interval}" type="number" value=""/>
</label>
<input name='attr_speed' type='hidden' value='0'>
<h1 data-i18n="maxspeed">Max Speed</h1><span name="attr_speed_max"></span>
<label class="settings" data-i18n-title="maxspeed" title="Max Speed">
<input name="attr_speed_max" placeholder="3" title="@{speed_max}" type="number" value=""/>
</label>
<h1 data-i18n="body">Body</h1><span name="attr_body"></span>
<label class="settings" data-i18n-title="body" title="Body">
<input name="attr_body_base" placeholder="3" title="@{body}" type="number" value=""/>
</label>
<h1 data-i18n="armor">Armor</h1><span name="attr_armor"></span>
<label class="settings" data-i18n-title="armor" title="Armor">
<input name="attr_armor" placeholder="3" title="@{armor}" type="number" value=""/>
</label>
<button data-i18n="pilot" name="act_pilot" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=^{pilot}}}{{base=^{pilot}}}{{dice=[[(@{pilot}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">pilot</button><span name="attr_pilot"></span>
<label class="settings" data-i18n-title="pilot" title="Pilot">
<input name="attr_pilot" placeholder="3" title="@{pilot}" type="number" value=""/>
</label>
<h1 data-i18n="sensor">Sensor</h1><span name="attr_sensor"></span>
<label class="settings" data-i18n-title="sensor" title="Sensor">
<input name="attr_sensor" placeholder="3" title="@{sensor}" type="number" value=""/>
</label>
<h1 data-i18n="seat">Seat</h1><span name="attr_seating"></span>
<label class="settings" data-i18n-title="seat" title="Seat">
<input name="attr_seating" placeholder="3" title="@{seating}" type="number" value=""/>
</label>
</div>
<div class="sprite attribute pc-box">
<button data-i18n="level" name="act_level" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{level}}}{{rating=@{level}}}">Level</button><span name="attr_level"></span>
<label class="settings" data-i18n-title="level" title="Level">
<input name="attr_level" placeholder="5" title="@{level}" type="number" value="1"/>
</label>
<h1 data-i18n="tasks">Tasks</h1><span name="attr_tasks"></span>
<label class="settings" data-i18n-title="tasks" title="Tasks">
<input name="attr_tasks" placeholder="0" title="@{tasks}" type="number" value=""/>
</label>
<button data-i18n="attack" name="act_sprite_attack" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{attack}}}{{dice=[[(@{attack}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">attack</button><span name="attr_attack"></span>
<label class="settings" data-i18n-title="attack" title="Attack">
<input name="attr_attack" placeholder="5" title="@{attack}" type="number" value=""/>
</label>
<button data-i18n="sleaze" name="act_sprite_sleaze" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{sleaze}}}{{dice=[[(@{sleaze}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">sleaze</button><span name="attr_sleaze"></span>
<label class="settings" data-i18n-title="sleaze" title="Sleaze">
<input name="attr_sleaze" placeholder="6" title="@{sleaze}" type="number" value=""/>
</label>
<button data-i18n="data_processing" name="act_sprite_data_processing" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{data_processing}}}{{dice=[[(@{data_processing}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">data_processing</button><span name="attr_data_processing"></span>
<label class="settings" data-i18n-title="data_processing" title="Data Processing">
<input name="attr_data_processing" placeholder="7" title="@{data_processing}" type="number" value=""/>
</label>
<button data-i18n="firewall" name="act_sprite_firewall" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{firewall}}}{{dice=[[(@{firewall}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">firewall</button><span name="attr_firewall"></span>
<label class="settings" data-i18n-title="firewall" title="Firewall">
<input name="attr_firewall" placeholder="8" title="@{firewall}" type="number" value=""/>
</label>
<button data-i18n="resonance" name="act_resonance" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{resonance}}}{{dice=[[(@{resonance}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">resonance</button><span name="attr_resonance"></span>
<label class="settings" data-i18n-title="resonance" title="resonance">
<input name="attr_resonance" placeholder="8" title="@{resonance}" type="number" value=""/>
</label>
</div>
</div>
<div class="border-box">
<div class="mid body pc-box">
<div class="column">
<!-- INITIATIVE/ACTIONS -->
<div class="rows">
<h1 data-i18n="init_actions">Initiative / Actions</h1>
</div>
<input name="attr_pr" type="hidden" value=""/>
<div class="rows grunt">
<h2 data-i18n="pr">Professional Rating</h2><span name="attr_pr" style="margin-left: 2%;"></span>
<label class="settings" data-i18n-title="pr" title="Professional Rating">
<input name="attr_pr" title="@{pr}" type="number"/>
</label>
</div>
<div class="rows grunt spirit sprite vehicle host">
<h2 data-i18n="universal_dicepool_adjustment">Universal Dicepool Adjustment</h2><span name="attr_uda" style="margin-left: 2%;"></span>
<label class="settings" data-i18n-title="universal_dicepool_adjustment" title="Professional Rating">
<input name="attr_uda" title="@{uda}" type="number" value="0"/>
</label>
</div>
<div class="rows grunt spirit sprite host">
<h2 data-i18n="actions">Actions</h2>
<label class="settings" data-i18n-title="majoractions" title="Major Actions">
<span data-i18n="a">A</span><input name="attr_major_actions" placeholder="1" title="@{major_actions}" type="number" value="1"/>
</label>
<span class="settings">, </span>
<label class="settings" data-i18n-title="minoractions" title="Minor Actions">
<span data-i18n="i">I</span><input min="0" name="attr_minor_actions" placeholder="2" title="@{minor_actions}" type="number" value="2"/>
</label>
<span class="toggle-display"> <span data-i18n="a">A</span><span name="attr_major_actions"></span><span class="tiny-span">, </span><span data-i18n="i">I</span><span name="attr_minor_actions"></span></span>
</div>
<div class="rows vehicle">
<h2 data-i18n="actions">Actions</h2>
<label class="settings" data-i18n-title="majoractions" title="Major Actions">
<span data-i18n="a">A</span><input name="attr_major_actions" placeholder="1" title="@{major_actions}" type="number" value="1"/>
</label>
<span class="settings">, </span>
<label class="settings" data-i18n-title="minoractions" title="Minor Actions">
<span data-i18n="i">I</span><input min="0" name="attr_minor_actions" placeholder="2" title="@{minor_actions}" type="number" value="5"/>
</label>
<span class="toggle-display"> <span data-i18n="a">A</span><span name="attr_major_actions"></span><span class="tiny-span">, </span><span data-i18n="i">I</span><span name="attr_minor_actions"></span></span>
</div>
<div class="rows grunt spirit">
<button data-i18n="initiative" name="act_initiative" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{initiative}}}{{dice=[[(@{initiative_base}+@{wounds_toggle}+@{modifiers_toggle})+(@{initiative_dice})d6cf0 &{tracker}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">Initiative</button>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_initiative_base" placeholder="0" title="@{initiative_base}" type="number" value="0"/>
</label><span class="settings">+</span>
<label class="settings" data-i18n-title="initiativedice" title="Initiative Dice">
<input min="0" max="5" name="attr_initiative_dice" placeholder="0" title="@{initiative_dice}" type="number" value="0"/>
</label><span class="settings" data-i18n="d6">d6</span>
<span class="toggle-display"> <span class="settings tiny-span">=</span><span name="attr_initiative_base"></span><span class="tiny-span">+</span><span name="attr_initiative_dice"></span><span class="tiny-span" data-i18n="d6">d6</span></span>
</div>
<div class="rows grunt hide-magic">
<button data-i18n="astralinitiative" name="act_astral_initiative" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{astralinitiative}}}{{dice=[[(@{astral_initiative_base}+@{wounds_toggle}+@{modifiers_toggle})+(@{astral_initiative_dice})d6cf0 &{tracker}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">Astral Initiative</button>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_astral_initiative_base" placeholder="0" title="@{astral_initiative_base}" type="number" value="0"/>
</label><span class="settings">+</span>
<label class="settings" data-i18n-title="astral_initiative_dice" title="Astral Initiative Dice">
<input min="0" max="5" name="attr_astral_initiative_dice" placeholder="0" title="@{astral_initiative_dice}" type="number" value="0"/>
</label><span class="settings" data-i18n="d6">d6</span>
<span class="toggle-display"> <span class="settings tiny-span">=</span><span name="attr_astral_initiative_base"></span><span class="tiny-span">+</span><span name="attr_astral_initiative_dice"></span><span class="tiny-span" data-i18n="d6">d6</span></span>
</div>
<div class="rows spirit">
<button data-i18n="astralinitiative" name="act_astral_initiative" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{astralinitiative}}}{{dice=[[(@{astral_initiative_base}+@{wounds_toggle}+@{modifiers_toggle})+(@{astral_initiative_dice})d6cf0 &{tracker}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">Astral Initiative</button>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_astral_initiative_base" placeholder="0" title="@{astral_initiative_base}" type="number" value="0"/>
</label><span class="settings">+</span>
<label class="settings" data-i18n-title="astral_initiative_dice" title="Astral Initiative Dice">
<input min="0" max="5" name="attr_astral_initiative_dice" placeholder="0" title="@{astral_initiative_dice}" type="number" value="0"/>
</label><span class="settings" data-i18n="d6">d6</span>
<span class="toggle-display"> <span class="settings tiny-span">=</span><span name="attr_astral_initiative_base"></span><span class="tiny-span">+</span><span name="attr_astral_initiative_dice"></span><span class="tiny-span" data-i18n="d6">d6</span></span>
</div>
<div class="rows grunt">
<button data-i18n="matrixinitiative" name="act_matrix_initiative" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{matrixinitiative}}}{{dice=[[(@{matrix_initiative_base}+@{wounds_toggle}+@{modifiers_toggle})+(@{matrix_initiative_dice})d6cf0 &{tracker}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">Matrix Initiative</button>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_matrix_initiative_base" placeholder="0" title="@{matrix_initiative_base}" type="number" value="0"/>
</label><span class="settings">+</span>
<label class="settings" data-i18n-title="matrix_initiative_dice" title="Matrix Initiative Dice">
<input min="0" max="5" name="attr_matrix_initiative_dice" placeholder="0" title="@{matrix_initiative_dice}" type="number" value="0"/>
</label><span class="settings" data-i18n="d6">d6</span>
<span class="toggle-display"> <span class="settings tiny-span">=</span><span name="attr_matrix_initiative_base"></span><span class="tiny-span">+</span><span name="attr_matrix_initiative_dice"></span><span class="tiny-span" data-i18n="d6">d6</span></span>
</div>
<div class="rows grunt">
<button data-i18n="coldsiminitiative" name="act_cold_sim_initiative" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{coldsiminitiative}}}{{dice=[[(@{cold_sim_initiative_base}+@{wounds_toggle}+@{modifiers_toggle})+(@{cold_sim_initiative_dice})d6cf0 &{tracker}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">Cold Sim Initiative</button>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_cold_sim_initiative_base" placeholder="0" title="@{cold_sim_initiative_base}" type="number" value="0"/>
</label><span class="settings">+</span>
<label class="settings" data-i18n-title="coldsiminitiativedice" title="Cold Sim Initiative Dice">
<input min="0" max="5" name="attr_cold_sim_initiative_dice" placeholder="0" title="@{cold_sim_initiative_dice}" type="number" value="0"/>
</label><span class="settings" data-i18n="d6">d6</span>
<span class="toggle-display"> <span class="settings tiny-span">=</span><span name="attr_cold_sim_initiative_base"></span><span class="tiny-span">+</span><span name="attr_cold_sim_initiative_dice"></span><span class="tiny-span" data-i18n="d6">d6</span></span>
</div>
<div class="rows grunt sprite host">
<button data-i18n="hotsiminitiative" name="act_hot_sim_initiative" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{hotsiminitiative}}}{{dice=[[(@{hot_sim_initiative_base}+@{wounds_toggle}+@{modifiers_toggle})+(@{hot_sim_initiative_dice})d6cf0 &{tracker}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">Hot Sim Initiative</button>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_hot_sim_initiative_base" placeholder="0" title="@{hot_sim_initiative_base}" type="number" value="0"/>
</label><span class="settings">+</span>
<label class="settings" data-i18n-title="hotsiminitiativedice" title="Hot Sim Initiative Dice">
<input min="0" max="5" name="attr_hot_sim_initiative_dice" placeholder="0" title="@{hot_sim_initiative_dice}" type="number" value="0"/>
</label><span class="settings" data-i18n="d6">d6</span>
<span class="toggle-display"> <span class="settings tiny-span">=</span><span name="attr_hot_sim_initiative_base"></span><span class="tiny-span">+</span><span name="attr_hot_sim_initiative_dice"></span><span class="tiny-span" data-i18n="d6">d6</span></span>
</div>
<div class="rows vehicle">
<button data-i18n="initiative" name="act_initiative" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{initiative}}}{{dice=[[(@{initiative_base}+@{wounds_toggle}+@{modifiers_toggle})+(@{initiative_dice})d6cf0 &{tracker}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">Initiative</button>
<label class="settings" data-i18n-title="modifier" title="modifier">
<input name="attr_initiative_base" placeholder="0" title="@{initiative_base}" type="number" value="0"/>
</label><span class="settings">+</span>
<label class="settings" data-i18n-title="initiativedice" title="Initiative Dice">
<input min="0" max="5" name="attr_initiative_dice" placeholder="0" title="@{initiative_dice}" type="number" value="4"/>
</label><span class="settings" data-i18n="d6">d6</span>
<span class="toggle-display"> <span class="settings tiny-span">=</span><span name="attr_initiative_base"></span><span class="tiny-span">+</span><span name="attr_initiative_dice"></span><span class="tiny-span" data-i18n="d6">d6</span></span>
</div>
<div class="rows grunt spirit">
<button name="act_sprint" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=@{sprint_speed}+(Athletics+Agility hits * @{sprint_modifier})}}{{dice=[[@{sprint_speed}+((@{athletics}+@{agility}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle} * @{sprint_modifier})]] meters}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span data-i18n="sprint"></span></button>
<label class="settings" data-i18n-title="move speed" title="Move Speed">
<input name="attr_move_speed" placeholder="0" title="@{move_speed}" type="number" value="10"/>
</label><span class="settings"> / </span>
<label class="settings" data-i18n-title="sprint speed" title="Sprint Speed">
<input name="attr_sprint_speed" placeholder="0" title="@{sprint_speed}" type="number" value="15"/>
</label><span class="settings"> / + </span>
<label class="settings" data-i18n-title="sprint modifier" title="Sprint Modifier">
<input name="attr_sprint_modifier" placeholder="2" title="@{sprint_modifier}" type="number" value="1"/>
</label><span class="settings"></span>
<span class="toggle-display"> <span class="settings tiny-span">=</span><span name="attr_move_speed" title="@{move_speed}"></span><span> / </span><span name="attr_sprint_speed" title="@{sprint_speed}"></span><span> / + </span><span name="attr_sprint_modifier" title="@{sprint_modifier}"></span><span></span></span>
</div>
<div class="rows grunt spirit">
<span name="attr_alternate_movement"></span>
</div>
<div class="rows grunt spirit">
<button class="btn ui-draggable" data-i18n="composure" name="act_composure" type="action" data-i18n-title="Willpower + Charisma" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{composure}}}{{dice=[[(@{composure}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}"><span data-i18n="composure">Composure</span></button>
</div>
<div class="rows grunt spirit vehicle sprite">
<h1>Condition Monitors</h1>
</div>
<div class="rows grunt spirit vehicle">
<span data-i18n="physical">Physical</span>
<label class="settings" data-i18n-title="conditionmonitor" title="Condition Monitor">
<input name="attr_physical" placeholder="0" title="@{physical}" type="number" value=""/>
</label><span class="settings"> / </span>
<label class="settings" data-i18n-title="conditionmonitor" title="Condition Monitor">
<input name="attr_physical_max" placeholder="0" title="@{physical_max}" type="number" value=""/>
</label>
<span class="toggle-display" name="attr_physical" title="@{physical}"></span><span class="toggle-display"> / </span><span class="toggle-display" name="attr_physical_max" title="@{physical_max}"></span>
<br>
</div>
<div class="rows grunt show-stun">
<span data-i18n="stun">Stun</span>
<label class="settings" data-i18n-title="conditionmonitor" title="Condition Monitor">
<input name="attr_stun" placeholder="0" title="@{stun}" type="number" value=""/>
</label><span class="settings"> / </span>
<label class="settings" data-i18n-title="conditionmonitor" title="Condition Monitor">
<input name="attr_stun_max" placeholder="0" title="@{stun_max}" type="number" value=""/>
</label>
<span class="toggle-display" name="attr_stun" title="@{stun}"></span><span class="toggle-display"> / </span><span class="toggle-display" name="attr_stun_max" title="@{stun_max}"></span>
<br>
</div>
<div class="rows grunt spirit vehicle sprite">
<input name="attr_flag_matrix" type="hidden" value=""/>
<div class="matrix">
<span data-i18n="matrix">Matrix</span>
<label class="settings" data-i18n-title="conditionmonitor" title="Condition Monitor">
<input name="attr_matrix" placeholder="0" title="@{matrix}" type="number" value=""/>
</label><span class="settings"> / </span>
<label class="settings" data-i18n-title="conditionmonitor" title="Condition Monitor">
<input name="attr_matrix_max" placeholder="0" title="@{matrix_max}" type="number" value=""/>
</label>
<span class="toggle-display" name="attr_matrix" title="@{matrix}"></span><span class="toggle-display"> / </span><span class="toggle-display" name="attr_matrix_max" title="@{matrix_max}"></span>
</div>
</div>
</div>
<div class="column">
<!-- DEFENSES -->
<div class="rows">
<h1 data-i18n="defenses">Defenses</h1>
</div>
<div class="rows grunt spirit">
<button type="action" name="act_direct_magic_defense" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{direct} ^{magic} ^{defense}}}{{dice=[[((@{willpower}+@{intuition})+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{desc=Willpower + Intuition}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">
<span class="center" title="Willpower + Intuition"><span class="center" data-i18n="directmagicdefense">Direct Magic Defense</span></span>
</button>
<button type="action" name="act_indirect_magic_defense" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{indirect} ^{magic} ^{defense}}}{{dice=[[((@{reaction}+@{willpower})+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{desc=Reaction + Willpower}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">
<span class="center" title="Reaction + Willpower"><span class="center" data-i18n="indirectmagicdefense">Indirect Magic Defense</span></span>
</button>
</div>
<div class="rows grunt spirit">
<button data-i18n="dr" name="act_spirit_dr" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{defenserating}}}{{rating=@{defense_rating}}}">DR</button>
<span class="toggle-display"><span name="attr_defense_rating"></span> </span>
<label class="settings" data-i18n-title="defenserating" title="defenserating">
<input name="attr_defense_rating" placeholder="9" title="@{defense_rating}" type="number" value="0"/>
</label>
<button data-i18n="defense" name="act_defense" type="action" title="Reaction + Intuition" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{defense} = ^{reaction} + ^{intuition}}}{{dice=[[(@{reaction}+@{intuition}+@{defense_modifier}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">defense</button>
<label class="settings" data-i18n-title="defense" title="defense">
<input name="attr_defense_modifier" placeholder="9" title="@{defense_modifier}" type="number" value="0"/>
</label>
<span class="toggle-display"> <span class="tiny">+</span><span name="attr_defense_modifier"></span></span>
<button data-i18n="soak" name="act_soak" type="action" title="Body" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{soak} ^{damage}}}{{dice=[[(@{body}+@{soak_modifier}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">soak</button>
<label class="settings" data-i18n-title="soak" title="soak">
<input name="attr_soak_modifier" placeholder="0" title="@{soak_modifier}" type="number" value="0"/>
</label>
<span class="toggle-display"> <span class="tiny">+</span><span name="attr_soak_modifier"></span></span>
</div>
<div class="rows grunt sprite host">
<input name="attr_flag_matrix" type="hidden" value=""/>
<div class="matrix">
<button name="act_matrix_attack_rating" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{matrix} ^{attackrating}}}{{rating=@{matrix_attack_rating}}}">
<span class="center"><span data-i18n="matrix_ar">Matrix AR</span> <span name="attr_matrix_attack_rating"></span></span>
</button>
<label class="settings" data-i18n-title="matrix_ar" title="matrix_ar">
<input name="attr_matrix_attack_rating" placeholder="9" title="@{matrix_attack_rating}" type="number" value="0"/>
</label>
<button name="act_matrix_defense_rating" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{matrix} ^{defenserating}}}{{rating=@{matrix_defense_rating}}}">
<span class="center"><span data-i18n="matrix_dr" title="@{matrix_defense_rating">DR</span> <span name="attr_matrix_defense_rating"></span></span>
</button>
<label class="settings" data-i18n-title="matrix_dr" title="matrix_dr">
<input name="attr_matrix_defense_rating" placeholder="9" title="@{matrix_defense_rating}" type="number" value="0"/>
</label>
</div>
</div>
<div class="rows vehicle">
<input name="attr_flag_matrix" type="hidden" value=""/>
<div class="matrix">
<button name="act_matrix_defense_rating" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{matrix} ^{defenserating}}}{{rating=@{matrix_defense_rating}}}">
<span class="center"><span data-i18n="matrix_dr" title="@{matrix_defense_rating">DR</span> <span name="attr_matrix_defense_rating"></span></span>
</button>
<label class="settings" data-i18n-title="matrix_dr" title="matrix_dr">
<input name="attr_matrix_defense_rating" placeholder="9" title="@{matrix_defense_rating}" type="number" value="0"/>
</label>
</div>
</div>
<div class="rows grunt">
<input name="attr_flag_matrix" type="hidden" value=""/>
<div class="matrix">
<button data-i18n="soakmatrix" name="act_soak_matrix" type="action" title="Firewall" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{soak} ^{matrix} ^{damage} = ^{firewall}}}{{dice=[[(@{firewall}+@{soak_matrix_modifier}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">soak matrix</button>
<label class="settings" data-i18n-title="soakmatrix" title="soak">
<input name="attr_soak_matrix_modifier" placeholder="0" title="@{soak_matrix_modifier}" type="number" value="0"/>
</label>
<span class="toggle-display"> <span class="tiny">+</span><span name="attr_soak_matrix_modifier"></span></span>
<button data-i18n="soakbiofeedback" name="act_soak_biofeedback" type="action" title="Willpower" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{soak} ^{biofeedback} ^{damage} = ^{willpower}}}{{dice=[[(@{willpower}+@{soak_biofeedback_modifier}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">soak biofeedback</button>
<label class="settings" data-i18n-title="soakbiofeedback" title="soak">
<input name="attr_soak_biofeedback_modifier" placeholder="0" title="@{soak_biofeedback_modifier}" type="number" value="0"/>
</label>
<span class="toggle-display"> <span class="tiny">+</span><span name="attr_soak_biofeedback_modifier"></span></span>
</div>
</div>
<div class="rows vehicle sprite host">
<input name="attr_flag_matrix" type="hidden" value=""/>
<div class="matrix">
<button data-i18n="soakmatrix" name="act_soak_matrix" type="action" title="Firewall" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{soak} ^{matrix} ^{damage} = ^{firewall}}}{{dice=[[(@{firewall}+@{soak_matrix_modifier}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">soak matrix</button>
<label class="settings" data-i18n-title="soakmatrix" title="soak">
<input name="attr_soak_matrix_modifier" placeholder="0" title="@{soak_matrix_modifier}" type="number" value="0"/>
</label>
<span class="toggle-display"> <span class="tiny">+</span><span name="attr_soak_matrix_modifier"></span></span>
</div>
</div>
<div class="rows grunt">
<span class="pictos3 chem">d</span><span class="chem"> Chem </span> <span name="attr_chem_total"></span>
<label class="settings" data-i18n-title="chemprotection" title="chemprotection">
<input name="attr_chem_modifier" placeholder="0" title="@{chem_modifier}" type="number" value="0"/>
</label>
<span class="toggle-display"> <span name="attr_chem_modifier"></span></span>
<span class="pictos cold">b</span><span class="cold"> Cold </span> <span name="attr_cold_total"></span>
<label class="settings" data-i18n-title="coldprotection" title="coldprotection">
<input name="attr_cold_modifier" placeholder="0" title="@{cold_modifier}" type="number" value="0"/>
</label>
<span class="toggle-display"> <span name="attr_cold_modifier"></span></span>
</div>
<div class="rows grunt">
<span class="pictos elec">e</span><span class="elec"> Elec </span> <span name="attr_elec_total"></span>
<label class="settings" data-i18n-title="elecprotection" title="elecprotection">
<input name="attr_elec_modifier" placeholder="0" title="@{elec_modifier}" type="number" value="0"/>
</label>
<span class="toggle-display"> <span name="attr_elec_modifier"></span></span>
<span class="pictos3 fire">j</span><span class="fire"> Fire </span> <span name="attr_fire_total"></span>
<label class="settings" data-i18n-title="fireprotection" title="fireprotection">
<input name="attr_fire_modifier" placeholder="0" title="@{fire_modifier}" type="number" value="0"/>
</label>
<span class="toggle-display"> <span name="attr_fire_modifier"></span></span>
</div>
<div class="rows vehicle">
<button data-i18n="dr" name="act_vehicle_dr" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{defenserating}}}{{rating=@{defense_rating}}}">DR</button>
<button data-i18n="defense" name="act_vehicle_defense" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{defense} = ^{pilot} + ^{evasion}}}{{dice=[[((?{Pilot Rating?| No Pilot, @{pilot}| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10}+?{Evasion Autosoft Rating?| No Evasion Autosoft, 0| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10}+@{defense_modifier})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">Defense</button>
<label class="settings" data-i18n-title="defense" title="defense">
<input name="attr_defense_modifier" placeholder="9" title="@{defense_modifier}" type="number" value="0"/>
</label>
<span class="toggle-display"> <span class="tiny">+</span><span name="attr_defense_modifier"></span></span>
</div>
<div class="rows vehicle">
<button data-i18n="soak" name="act_soak" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{soak} ^{damage}}}{{dice=[[(@{body}+@{soak_modifier}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}">soak</button>
<label class="settings" data-i18n-title="soak" title="soak">
<input name="attr_soak_modifier" placeholder="0" title="@{soak_modifier}" type="number" value="0"/>
</label>
<span class="toggle-display"> <span class="tiny">+</span><span name="attr_soak_modifier"></span></span>
</div>
</div>
<!-- OPTIONS -->
<div class="column">
<div class="rows">
<h1 data-i18n="options">Options</h1>
</div>
<div class="rows grunt spirit">
<label class="settings" data-i18n-title="archetype" title="Archetype">
<h2 data-i18n="archetype">Archetype</h2>
<select name="attr_flag_special">
<option value="mundane" data-i18n="mundane" selected="selected">Mundane</option>
<option value="magic" data-i18n="awakened">Awakened</option>
<option value="resonance" data-i18n="technomancer">Technomancer</option>
</select>
</label>
<label class="settings" data-i18n-title="paintolerance" title="Pain Tolerance">
<h2 data-i18n="paintolerance">Pain Tolerance</h2>
<select name="attr_pain_tolerance">
<option value="+1" data-i18n="highpaintolerance">High Pain Tolerance</option>
<option value="0" data-i18n="none" selected="selected">None</option>
<option value="-1" data-i18n="lowpaintolerance">Low Pain Tolerance</option>
</select>
</label>
</div>
<div class="rows grunt">
<label class="settings" title="Show Stun Monitor?">
<input class="character-type" name="attr_show_stun" title="@{show_stun}" type="checkbox" value="show_stun"/>
<h2 data-i18n="showstunmonitor">Show Stun Monitor?</h2>
</label>
</div>
<div class="rows grunt">
<label class="settings" title="Has Matrix Device">
<input class="character-type" name="attr_flag_matrix" title="@{flag_matrix}" type="checkbox" value="matrix"/>
<h2 data-i18n="hasmatrixdevice">Has Matrix Device</h2>
</label>
</div>
<div class="rows grunt spirit vehicle">
<label title="Grunt Group">
<input class="grunt-group-member" name="attr_grunt_group_member" title="@{grunt_group_member}" type="checkbox" value="grunt_group_member"/>
<h2 data-i18n="gruntgroupmember">Grunt Group Member</h2>
</label>
</div>
<div class="rows grunt spirit vehicle">
<label title="Grunt Count">
<h2 data-i18n="number_grunts"># Grunts</h2>
<input class="grunt-group-count" name="attr_grunt_group_count" title="@{grunt_group_count}" type="number" min='0' value="0"/>
</label>
</div>
<div class="rows vehicle">
<label class="settings" title="Drone">
<input class="character-type" name="attr_flag_drone" title="@{flag_drone}" type="checkbox" value="drone"/>
<h2>Drone</h2>
</label>
</div>
</div>
</div>
</div>
<br>
<div class="border-box">
<div class="end body pc-box">
<input name="attr_quality" type="hidden" value=""/>
<div class="textrow grunt">
<h1 data-i18n="qualities">Qualities</h1>
<span name="attr_quality"></span><br>
<label class="settings" data-i18n-title="quality" title="Qualities">
<textarea class="full-row" name="attr_quality" placeholder="Qualities" title="@{quality}"></textarea>
</label>
</div>
<input name="attr_augmentations" type="hidden" value=""/>
<div class="textrow grunt">
<h1 data-i18n="augmentations">Augmentations</h1>
<span name="attr_augmentations"></span><br>
<label class="settings" data-i18n-title="augmentations" title="Augmentations">
<textarea class="full-row" name="attr_augmentations" placeholder="Augmentations" title="@{augmentations}"></textarea>
</label>
</div>
<input name="attr_gear" type="hidden" value=""/>
<div class="textrow grunt vehicle">
<h1 data-i18n="gear">Gear</h1>
<span name="attr_gear"></span><br>
<label class="settings" data-i18n-title="gear" title="Gear">
<textarea class="full-row" name="attr_gear" placeholder="Gear" title="@{gear}"></textarea>
</label>
</div>
<div class="textrow vehicle">
<h1 data-i18n="autosofts">Autosofts</h1>
<div class="textrow autosofts">
<span>&nbsp;</span>
<div class="autosoft-column">
<input class="toggle" name="attr_powered_on_clearsight" type="checkbox" value='1'/>
<span class="pictos">Q</span>
<button data-i18n="clearsight" name="act_npc_clearsight" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{clearsight} = ^{clearsight} + ^{sensor}}}{{dice=[[(@{clearsight}+@{sensor}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<input class="settings" type="number" name="attr_clearsight" title="Clearsight" value="0">
<span class="toggle-display" name="attr_clearsight"></span>
</div>
<span>&nbsp;</span>
<div class="autosoft-column">
<input class="toggle" name="attr_powered_on_electronicwarfare" type="checkbox" value='1'/>
<span class="pictos">Q</span>
<button data-i18n="electronicwarfare" name="act_npc_electronicwarfare" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{electronicwarfare} = ^{electronicwarfare} + ^{sensor}}}{{dice=[[(@{electronicwarfare}+@{sensor}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<input class="settings" type="number" name="attr_electronicwarfare" title="Electronic Warfare" value="0">
<span class="toggle-display" name="attr_electronicwarfare"></span>
</div>
<span>&nbsp;</span>
</div>
<div class="textrow autosofts">
<span>&nbsp;</span>
<div class="autosoft-column">
<input class="toggle" name="attr_powered_on_evasion" type="checkbox" value='1'/>
<span class="pictos">Q</span>
<button data-i18n="evasion" name="act_npc_evasion" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{evasion} = ^{evasion} + ^{pilot}}}{{dice=[[(@{evasion}+@{pilot}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<input class="settings" type="number" name="attr_evasion" title="evasion" value="0">
<span class="toggle-display" name="attr_evasion"></span>
</div>
<span>&nbsp;</span>
<div class="autosoft-column">
<input class="toggle" name="attr_powered_on_maneuvering" type="checkbox" value='1'/>
<span class="pictos">Q</span>
<button data-i18n="maneuvering" name="act_npc_maneuvering" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{maneuvering} = ^{maneuvering} + ^{pilot}}}{{dice=[[(@{maneuvering}+@{pilot}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<input class="settings" type="number" name="attr_maneuvering" title="Electronic Warfare" value="0">
<span class="toggle-display" name="attr_maneuvering"></span>
</div>
<span>&nbsp;</span>
</div>
<div class="textrow autosofts">
<span>&nbsp;</span>
<div class="autosoft-column">
<input class="toggle" name="attr_powered_on_stealth" type="checkbox" value='1'/>
<span class="pictos">Q</span>
<button data-i18n="stealth" name="act_npc_stealth" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{stealth} = ^{stealth} + ^{pilot}}}{{dice=[[(@{stealth}+@{pilot}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<input class="settings" type="number" name="attr_stealth" title="stealth" value="0">
<span class="toggle-display" name="attr_stealth"></span>
</div>
<span>&nbsp;</span>
<div class="autosoft-column">
<input class="toggle" name="attr_powered_on_targeting_1" type="checkbox" value='1'/>
<span class="pictos">Q</span>
<button data-i18n="targeting" name="act_npc_targeting" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{targeting_weapon} ^{targeting} = ^{targeting} + ^{sensor}}}{{dice=[[(@{targeting}+@{sensor}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<input class="settings" type="number" name="attr_targeting" title="[Weapon] Targeting" value="0">
<input class="settings" type="text" name="attr_targeting_weapon" title="[Weapon]" value="" placeholder="AK-97">
<span class="toggle-display" name="attr_targeting"></span>
<span class="toggle-display"></span>
<span class="toggle-display" name="attr_targeting_weapon"></span>
</div>
<span>&nbsp;</span>
</div>
<div class="textrow autosofts">
<span>&nbsp;</span>
<div class="autosoft-column">
<input class="toggle" name="attr_powered_on_targeting_2" type="checkbox" value='1'/>
<span class="pictos">Q</span>
<button data-i18n="targeting" name="act_npc_targeting2" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{targeting2_weapon} ^{targeting} = ^{targeting} + ^{sensor}}}{{dice=[[(@{targeting2}+@{sensor}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<input class="settings" type="number" name="attr_targeting2" title="[Weapon2] Targeting" value="0">
<input class="settings" type="text" name="attr_targeting2_weapon" title="[Weapon2]" value="" placeholder="AK-97">
<span class="toggle-display" name="attr_targeting2"></span>
<span class="toggle-display"></span>
<span class="toggle-display" name="attr_targeting2_weapon"></span>
</div>
<span>&nbsp;</span>
<div class="autosoft-column">
<input class="toggle" name="attr_powered_on_targeting_3" type="checkbox" value='1'/>
<span class="pictos">Q</span>
<button data-i18n="targeting" name="act_npc_targeting3" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{targeting3_weapon} ^{targeting} = ^{targeting} + ^{sensor}}}{{dice=[[(@{targeting3}+@{sensor}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<input class="settings" type="number" name="attr_targeting3" title="[Weapon3] Targeting" value="0">
<input class="settings" type="text" name="attr_targeting3_weapon" title="[Weapon3]" value="" placeholder="AK-97">
<span class="toggle-display" name="attr_targeting3"></span>
<span class="toggle-display"></span>
<span class="toggle-display" name="attr_targeting3_weapon"></span>
</div>
<span>&nbsp;</span>
</div>
</div>
<input name="attr_programs" type="hidden" value=""/>
<div class="textrow vehicle">
<h1 data-i18n="programs">Programs</h1>
<span name="attr_programs"></span><br>
<label class="settings" data-i18n-title="programs" title="Programs">
<textarea class="full-row" name="attr_programs" placeholder="Programs" title="@{programs}"></textarea>
</label>
</div>
<input name="attr_modifications" type="hidden" value=""/>
<div class="textrow vehicle">
<h1 data-i18n="modifications">Modifications</h1>
<span name="attr_modifications"></span><br>
<label class="settings" data-i18n-title="modifications" title="Modifications">
<textarea class="full-row" name="attr_modifications" placeholder="Modifications" title="@{modifications}"></textarea>
</label>
</div>
<input name="attr_powers" type="hidden" value=""/>
<div class="textrow grunt">
<h1 data-i18n="powers">Powers</h1>
<span name="attr_powers"></span><br>
<label class="settings" data-i18n-title="powers" title="Powers">
<textarea class="full-row" name="attr_powers" placeholder="Powers" title="@{powers}"></textarea>
</label>
</div>
<input name="attr_weaknesses" type="hidden" value=""/>
<div class="textrow grunt spirit">
<h1 data-i18n="weaknesses">Weaknesses</h1>
<span name="attr_weaknesses"></span><br>
<label class="settings" data-i18n-title="powers" title="Powers">
<textarea class="full-row" name="attr_weaknesses" placeholder="Weaknesses" title="@{weaknesses}"></textarea>
</label>
</div>
<div class="textrow grunt hide-magic">
<input name="attr_initiate" type="hidden" value=""/>
<h1 data-i18n="initiation">Initiation</h1>
<span name="attr_initiate"></span><br>
<label class="settings" data-i18n-title="initiate" title="Initiate">
<input name="attr_initiate" placeholder="initiate" type="number" title="@{initiate}"/>
</label><br/><span name="attr_metamagic"></span>
<label class="settings" data-i18n-title="metamagic" title="metamagic">
<textarea class="full-row" name="attr_metamagic" placeholder="metamagic" title="@{metamagic}"></textarea>
</label>
</div>
<div class="textrow grunt hide-resonance">
<input name="attr_submersion" type="hidden" value=""/>
<h1 data-i18n="submersion">key</h1><span name="attr_submersion"></span>
<label class="settings" data-i18n-title="submersion" title="Submersion">
<input name="attr_submersion" placeholder="submersion" type="number" title="@{submersion}"/>
</label><br/><span name="attr_echos"></span>
<label class="settings" data-i18n-title="echos" title="echos">
<textarea class="full-row" name="attr_echos" placeholder="echos" title="@{echos}"></textarea>
</label>
</div>
<div class="rows grunt repeating inline-repeating">
<h1 data-i18n="skills">Skills</h1>
<fieldset class="repeating_skills">
<input name="attr_display_rating" type="hidden"/>
<input name="attr_display_attribute" type="hidden" value="Intuition"/>
<input name="attr_dicepool" type="hidden" value="0"/>
<input class="toggle" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<button name="act_skill" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} (@{display_attribute})}}{{dice=[[(@{dicepool}+@{attribute}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span><span name="attr_name"></span> <span name="attr_dicepool"></span></span></button>
<input class="skill-button-hider" name="attr_spec" type="hidden" value=""/>
<button name="act_spec" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} (@{display_attribute}) + ^{specialization}}}{{dice=[[(@{dicepool}+@{attribute}+2+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=Spec: @{specialization}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span class="skill_spec" name="attr_spec"></span></button>
<input class="skill-button-hider" name="attr_expert" type="hidden" value=""/>
<button name="act_expert" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} (@{display_attribute}) + ^{expertise}}}{{dice=[[(@{dicepool}+@{attribute}+3+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=Expert: @{expertise}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span class="skill_expert" name="attr_expert"></span></button><span class="tiny">, </span>
<div class="settings">
<h2 data-i18n="skill">Skill</h2>
<h2 data-i18n="rating">Rating</h2>
<h2 data-i18n="mod">Mod</h2>
<h2 data-i18n="attribute">Attribute</h2>
<select class="skill-select" name="attr_name" title="@{repeating_skills_${x}_name}">
<option value="Astral" data-i18n="astral">Astral</option>
<option value="Athletics" data-i18n="athletics">Athletics</option>
<option value="Biotech" data-i18n="biotech">Biotech</option>
<option value="Close Combat" data-i18n="closecombat">Close Combat</option>
<option value="Con" data-i18n="con">Con</option>
<option value="Conjuring" data-i18n="conjuring">Conjuring</option>
<option value="Cracking" data-i18n="cracking">Cracking</option>
<option value="Electronics" data-i18n="electronics">Electronics</option>
<option value="Enchanting" data-i18n="enchanting">Enchanting</option>
<option value="Engineering" data-i18n="engineering">Engineering</option>
<option value="Exotic Weapons" data-i18n="exoticweapons">Exotic Weapons</option>
<option value="Firearms" data-i18n="firearms">Firearms</option>
<option value="Influence" data-i18n="influence">Influence</option>
<option value="Outdoors" data-i18n="outdoors">Outdoors</option>
<option value="Perception" data-i18n="perception">Perception</option>
<option value="Piloting" data-i18n="piloting">Piloting</option>
<option value="Sorcery" data-i18n="sorcery">Sorcery</option>
<option value="Stealth" data-i18n="stealth">Stealth</option>
<option value="Tasking" data-i18n="tasking">Tasking</option>
</select>
<label data-i18n-title="rating" title="rating">
<input name="attr_rating" min="0" placeholder="0" title="@{repeating_skills_${x}_rating}" type="number"/>
</label>
<label data-i18n-title="ratingmodifier" title="Rating Modifier">
<input name="attr_rating_modifier" min="0" placeholder="0" title="@{repeating_skills_${x}_rating_modifier}" type="number"/>
</label>
<select class="attribute-select" name="attr_attribute" title="@{repeating_skills_${x}_attribute}">
<option data-i18n="body" value="@{body}">Body</option>
<option data-i18n="agility" value="@{agility}">Agility</option>
<option data-i18n="reaction" value="@{reaction}">Reaction</option>
<option data-i18n="strength" value="@{strength}">Strength</option>
<option data-i18n="willpower" value="@{willpower}">Willpower</option>
<option data-i18n="logic" value="@{logic}">Logic</option>
<option data-i18n="intuition" value="@{intuition}" selected="selected">Intuition</option>
<option data-i18n="charisma" value="@{charisma}">Charisma</option>
<option data-i18n="magic" value="@{magic}">Magic</option>
<option data-i18n="resonance" value="@{resonance}">Resonance</option>
</select>
<h2 class="full-row skill_spec" data-i18n="specialization">Specialization (+2)</h2>
<label class="full-row" data-i18n-title="specialization" title="specialization">
<input name="attr_spec" placeholder="Specializations" title="@{repeating_skills_${x}_spec}" type="text"/>
</label>
<h2 class="full-row skill_expert" data-i18n="expertise">Expertise (+3)</h2>
<label class="full-row" data-i18n-title="expertise" title="expertise">
<input name="attr_expert" placeholder="Expertise" title="@{repeating_skills_${x}_expert}" type="text"/>
</label>
</div>
</fieldset>
</div>
<div class="rows grunt repeating inline-repeating">
<h1 data-i18n="knowledge">knowledge</h1><br>
<fieldset class="repeating_knowledge">
<input class="toggle red" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<button name="roll_npc_knowledge" type="roll" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} (@{type})}}{{desc=@{notes}}}"><span name="attr_name"></span></button>
<div class="settings">
<h2 data-i18n="skill">Skill</h2>
<label data-i18n-title="name" title="Name">
<input name="attr_name" placeholder="Name" title="@{repeating_knowledge_${x}_name}" type="text"/>
</label>
<label data-i18n-title="type" title="Type">
<select class="center" data-i18n-title="type" name="attr_type" title="skill_type">
<option data-i18n="knowledge" value="Knowledge">Knowledge</option>
<option data-i18n="language" value="Language">Language</option>
</select>
</label>
<label data-i18n-title="notes" title="notes"><span data-i18n="notes">Notes</span>
<textarea class="full-row" name="attr_notes" placeholder="Notes" title="@{repeating_knowledge_${x}_notes}"></textarea>
</label>
</div>
</fieldset>
</div>
<div class="rows sprite repeating inline-repeating">
<h1 data-i18n="skills">skills</h1>
<fieldset class="repeating_skills">
<input class="toggle" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<button name="act_spriteskill" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{skill} @{level} + Attribute ?{Attribute|Logic,@{data_processing}|Intuition,@{sleaze}|Charisma,@{attack}|Willpower,@{firewall}|None,0}}}{{dice=[[(@{level}+?{Attribute}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_skill"></span></button>
<div class="settings">
<h2 class="full-row" data-i18n="skill">Skill</h2>
<select class="skill-select" name="attr_skill" title="@{repeating_skills_${x}_skill}">
<option value="Cracking" data-i18n="cracking">Cracking</option>
<option value="Electronics" data-i18n="electronics">Electronics</option>
<option value="Engineering" data-i18n="engineering">Engineering</option>
</select>
</div>
</fieldset>
</div>
<div class="rows spirit repeating inline-repeating">
<h1 data-i18n="skills">Skills</h1>
<fieldset class="repeating_skills">
<input class="toggle" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<button name="act_spiritskill" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{skill} ^{force} (@{force}) + ^{attribute} (?{Attribute|Body,@{body}|Agility,@{agility}|Reaction,@{reaction}|Strength,@{strength}|Willpower,@{willpower}|Logic,@{logic}|Intuition,@{intuition}|Charisma,@{charisma}|None,0})}}{{dice=[[(@{force}+?{Attribute}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_skill"></span></button>
<div class="settings">
<h2 class="full-row" data-i18n="skill">Skill</h2>
<label data-i18n-title="name" title="name">
<input name="attr_skill" placeholder="name" title="@{repeating_skills_${x}_skill}" type="text"/>
</label>
<h2 class="full-row" data-i18n="notes">Notes</h2>
<label class="full-row" data-i18n-title="notes" title="notes">
<textarea class="full-row" name="attr_notes" placeholder="skills notes" title="@{repeating_skills_${x}_notes}"></textarea>
</label>
</div>
</fieldset>
</div>
<div class="rows sprite spirit repeating inline-repeating">
<h1 data-i18n="powers">Powers</h1>
<fieldset class="repeating_powers">
<input class="toggle" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<button name="roll_power" type="roll" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=@{name}}}{{desc=@{notes}}}"><span name="attr_name"></span></button>
<div class="settings">
<h2 class="full-row" data-i18n="name">name</h2>
<label data-i18n-title="name" title="name">
<input name="attr_name" placeholder="name" title="@{repeating_powers_${x}_name}" type="text"/>
</label>
<h2 class="full-row" data-i18n="notes">Notes</h2>
<label class="full-row" data-i18n-title="notes" title="notes">
<textarea class="full-row" name="attr_notes" placeholder="Powers notes" title="@{repeating_powers_${x}_notes}"></textarea>
</label>
</div>
</fieldset>
</div>
<div class="rows grunt spirit vehicle repeating-container weapon-range">
<h1 data-i18n="rangedweapons">Ranged Weapons</h1>
<div class="row-long headers">
<h2 data-i18n="weapon">Weapon</h2>
<h2 data-i18n="pool">Pool</h2>
<h2 data-i18n="dam">Dam</h2>
<h2 data-i18n="c">C</h2>
<h2 data-i18n="n">N</h2>
<h2 data-i18n="m">M</h2>
<h2 data-i18n="f">F</h2>
<h2 data-i18n="e">E</h2>
<h2 data-i18n="mode">Mode</h2>
<h2 data-i18n="ammo">Ammo</h2>
</div>
<fieldset class="repeating_range">
<input name="attr_skill" type="hidden" value="Firearms"/>
<input name="attr_rating" type="hidden" value="0" />
<input name="attr_attribute" type="hidden" value="Agility"/>
<input name="attr_attr_rating" type="hidden" value="0"/>
<input class="flag-primary" name="attr_primary" type="hidden" value=""/>
<input class="flag-primary" name="attr_additional" type="hidden" value=""/>
<input name="attr_damage" type="hidden" value=""/>
<input name="attr_close" type="hidden" value=""/>
<input name="attr_near" type="hidden" value=""/>
<input name="attr_medium" type="hidden" value=""/>
<input name="attr_far" type="hidden" value=""/>
<input name="attr_extreme" type="hidden" value=""/>
<input name="attr_dicepool" type="hidden" value=""/>
<input name="attr_dicepool_base" type="hidden" value=""/>
<button class="no-dicepool" name="act_npcrangeweaponnodicepool" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} (Dicepool: ?{Skill / Autosoft Rating?|1,1|2,2|3,3|4,4|5,5|6,6|7,7|8,8|9,9|10,10} + ?{Attribute / Sensor Rating?|1,1|2,2|3,3|4,4|5,5|6,6|7,7|8,8|9,9|10,10})}}{{dice=[[(?{Skill / Autosoft Rating?}+?{Attribute / Sensor Rating?}+@{dicepool_modifier}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=Mode @{mode}, Damage @{damage}, Dicepool = @{dicepool} + Wounds @{wounds_toggle} + Modifiers @{modifiers_toggle} + Edge @{edge_toggle}, Notes @{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<button class="dicepool" name="act_npcrangeweapon" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} (Dicepool: @{dicepool})}}{{dice=[[(@{dicepool}+@{dicepool_modifier}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=Mode @{mode}, Damage @{damage}, Dicepool = @{dicepool} + Wounds @{wounds_toggle} + Modifiers @{modifiers_toggle} + Edge @{edge_toggle}, Notes @{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<span class="center" name="attr_dicepool"></span>
<span class="center" name="attr_damage"></span>
<span class="center" name="attr_close"></span>
<span class="center" name="attr_near"></span>
<span class="center" name="attr_medium"></span>
<span class="center" name="attr_far"></span>
<span class="center" name="attr_extreme"></span>
<select name="attr_mode" title="@{mode}">
<option data-i18n="ss" value="SS">SS</option>
<option data-i18n="sa" value="SA">SA</option>
<option data-i18n="bf" value="BF">BF</option>
<option data-i18n="fa" value="FA">FA</option>
<option data-i18n="other" value="Other">Other</option>
</select>
<span class="center" name="attr_ammo"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<label data-i18n-title="name" title="name">
<input name="attr_name" data-i18n-placeholder="armsphname" placeholder="Ares Predator" title="@{repeating_range_${x}_name}" type="text" value=""/>
</label>
<label data-i18n-title="pool" title="pool">
<input name="attr_dicepool" placeholder="" title="@{repeating_range_${x}_dicepool}" type="text" value=""/>
</label>
<label data-i18n-title="dam" title="dam">
<input name="attr_damage_base" data-i18n-placeholder="armsphdam" placeholder="9P" title="@{repeating_range_${x}_damage_base}" type="text" value=""/>
</label>
<label data-i18n-title="c" title="Close">
<input name="attr_close_base" placeholder="-" title="@{repeating_range_${x}_close_base}" type="text" value=""/>
</label>
<label data-i18n-title="n" title="Near">
<input name="attr_near_base" placeholder="-" title="@{repeating_range_${x}_near_base}" type="text" value=""/>
</label>
<label data-i18n-title="m" title="Medium">
<input name="attr_medium_base" placeholder="-" title="@{repeating_range_${x}_medium_base}" type="text" value=""/>
</label>
<label data-i18n-title="f" title="Far">
<input name="attr_far_base" placeholder="-" title="@{repeating_range_${x}_far_base}" type="text" value=""/>
</label>
<label data-i18n-title="e" title="Extreme">
<input name="attr_extreme_base" placeholder="-" title="@{repeating_range_${x}_extreme_base}" type="text" value=""/>
</label>
<span class="center">SS</span>
<label data-i18n-title="ammo" title="ammo">
<input name="attr_ammo" placeholder="15" title="@{repeating_range_${x}_ammo}" type="number" value=""/>
</label>
<span></span>
<span></span>
<div class="row">
<h3 data-i18n="firingmodes">Firing Modes</h3>
<label data-i18n-title="modeoptions" title="Mode Options">
<input name="attr_firing_modes" placeholder="SS/SA/BF/BW/FA" type="text" title="@{repeating_range_${x}_firing_modes}}"/>
</label>
<h3 class="atk-dp-mod" data-i18n="modifier">modifier</h3>
<label class="atk-dp-mod" data-i18n-title="modifier" title="modifier">
<input name="attr_dicepool_modifier" title="@{repeating_range_${x}_dicepool_modifier}" type="number" value="0"/>
</label>
</div>
<h3 data-i18n="notes">notes</h3>
<label data-i18n-title="notes" title="notes">
<textarea name="attr_notes" placeholder="Notes" title="@{repeating_range_${x}_notes}"></textarea>
</label>
</div>
</fieldset>
</div>
<div class="rows grunt spirit vehicle rows repeating-container weapon-melee">
<h1 data-i18n="meleeweapons">Melee Weapons</h1>
<div class="row-long headers">
<h2 data-i18n="weapon">Weapon</h2>
<h2 data-i18n="pool">Pool</h2>
<h2 data-i18n="dam">Dam</h2>
<h2 data-i18n="c" title="Close 0-3">C</h2>
<h2 data-i18n="n" title="Near 4-50">N</h2>
<h2 data-i18n="m" title="Medium 51-250">M</h2>
<h2 data-i18n="f" title="Far 251-500">F</h2>
<h2 data-i18n="e" title="Extreme 500+">E</h2>
</div>
<fieldset class="repeating_melee">
<input name="attr_skill" type="hidden" value="Close Combat"/>
<input name="attr_rating" type="hidden" value="0" />
<input name="attr_attribute" type="hidden" value="Agility"/>
<input name="attr_attr_rating" type="hidden" value="0"/>
<input class="flag-primary" name="attr_primary" type="hidden" value=""/>
<input class="flag-primary" name="attr_additional" type="hidden" value=""/>
<input name="attr_damage" type="hidden" value=""/>
<input name="attr_close" type="hidden" value=""/>
<input name="attr_near" type="hidden" value=""/>
<input name="attr_medium" type="hidden" value=""/>
<input name="attr_far" type="hidden" value=""/>
<input name="attr_extreme" type="hidden" value=""/>
<input name="attr_dicepool" type="hidden" value=""/>
<input name="attr_dicepool_base" type="hidden" value=""/>
<input name="attr_dicepool_modifier" type="hidden" value=""/>
<button class="no-dicepool" name="act_npcmeleeweaponnodicepool" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} (Dicepool: ?{Skill / Autosoft?|1,1|2,2|3,3|4,4|5,5|6,6|7,7|8,8|9,9|10,10} + ?{Attribute / Sensor?|1,1|2,2|3,3|4,4|5,5|6,6|7,7|8,8|9,9|10,10})}}{{dice=[[(?{Skill / Autosoft?}+?{Attribute / Sensor?}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=DV @{damage}, Notes: @{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<button class="dicepool" name="act_npcmeleeweapon" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} (Dicepool: @{dicepool})}}{{dice=[[(@{dicepool}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=DV @{damage}, Notes: @{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<span class="center" name="attr_dicepool"></span>
<span class="center" name="attr_damage"></span>
<span class="center" name="attr_close"></span>
<span class="center" name="attr_near"></span>
<span class="center" name="attr_medium"></span>
<span class="center" name="attr_far"></span>
<span class="center" name="attr_extreme"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<label data-i18n-title="name" title="name">
<input name="attr_name" data-i18n-placeholder="meleephname" placeholder="Katana" title="@{repeating_melee_${x}_name}" type="text" value=""/>
</label>
<label data-i18n-title="pool" title="pool">
<input name="attr_dicepool" placeholder="0d6" title="@{repeating_melee_${x}_dicepool}" type="text" value=""/>
</label>
<label data-i18n-title="dam" title="dam">
<input name="attr_damage_base" data-i18n-placeholder="meleephdam" placeholder="5P" title="@{repeating_melee_${x}_damage_base}" type="text" value=""/>
</label>
<label data-i18n-title="close" title="Close 0-3">
<input name="attr_close_base" placeholder="-" title="@{repeating_melee_${x}_close_base}" type="text" value=""/>
</label>
<label data-i18n-title="near" title="Near 4-50">
<input name="attr_near_base" placeholder="-" title="@{repeating_melee_${x}_near_base}" type="text" value=""/>
</label>
<label data-i18n-title="medium" title="Medium 51-250">
<input name="attr_medium_base" placeholder="-" title="@{repeating_melee_${x}_medium_base}" type="text" value=""/>
</label>
<label data-i18n-title="far" title="Far 251-500">
<input name="attr_far_base" placeholder="-" title="@{repeating_melee_${x}_far_base}" type="text" value=""/>
</label>
<label data-i18n-title="extreme" title="Extreme 500+">
<input name="attr_extreme_base" placeholder="-" title="@{repeating_melee_${x}_extreme_base}" type="text" value=""/>
</label>
<div class="row atk-dp-mod">
<h3 data-i18n="modifier">modifier</h3>
<label data-i18n-title="modifier" title="modifier">
<input name="attr_dicepool_modifier" title="@{repeating_range_${x}_dicepool_modifier}" type="number" value="0"/>
</label>
</div>
<h3 data-i18n="notes">notes</h3>
<label data-i18n-title="notes" title="notes">
<textarea name="attr_notes" data-i18n-placeholder="notes" placeholder="Notes" title="@{repeating_melee_${x}_notes}"></textarea>
</label>
</div>
</fieldset>
</div>
<!-- NEW npcspell repeating section -->
<div class="rows grunt spirit repeating-container spells hide-magic">
<h1 data-i18n="spells">Spells</h1>
<div class="row-long">
<button type="roll" name="roll_magic_ar" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{magic} ^{attack} ^{rating}}}{{rating=@{magic_ar}}}">
<span class="center"><span data-i18n="magicar">Magic AR</span> <span name="attr_magic_ar"></span></span>
</button>
<button data-i18n="drain" name="act_spell_drain" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{spell} ^{drain}}}{{dice=[[((@{spell_drain_attribute_1}+@{spell_drain_attribute_2}+@{spell_drain_modifier})+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"></button>
<select class="attribute-select" name="attr_spell_drain_attribute_1" title="@{spell_drain_attribute_1}">
<option data-i18n="willpower" value="@{willpower}">Willpower</option>
</select><span>+</span>
<select class="attribute-select" name="attr_spell_drain_attribute_2" title="@{spell_drain_attribute_2}">
<option data-i18n="willpower" value="@{willpower}" selected="selected">Willpower</option>
<option data-i18n="logic" value="@{logic}">Logic</option>
<option data-i18n="intuition" value="@{intuition}">Intuition</option>
<option data-i18n="charisma" value="@{charisma}">Charisma</option>
</select>
<h3 data-i18n="modifier">modifier</h3>
<label data-i18n-title="modifier" title="modifier">
<input name="attr_spell_drain_modifier" title="@{spell_drain_modifier}" type="number" value="0"/>
</label>
</div>
<div class="rows headers spells-header">
<h2 data-i18n="name">Name</h2>
<h2 data-i18n="dice">Dice</h2>
<h2 data-i18n="type">Type</h2>
<h2 data-i18n="range">Range</h2>
<h2 data-i18n="duration">Duration</h2>
<h2 data-i18n="drain">Drain</h2>
<span>&nbsp;</span>
<span>&nbsp;</span>
</div>
<fieldset class="repeating_spell">
<input name="attr_category" type="hidden" value="" />
<input name="attr_range" type="hidden" value="" />
<input name="attr_dicepool" type="hidden" value="" />
<button class="dicepool" name="act_npcspell" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{dice=[[((@{skill}+@{magic}+@{dicepool_modifier}+@{specialization}+@{expertise})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{ampup=[[?{Amp Up|0|1|2|3|4|5|6|7|8|9|10}]]}}{{increasearea=[[?{Increase Area|0m,0|2m,1|4m,2|6m,3|8m,4|10m,5|12m,5|14m,6|16m,8|18m,9|20m,10}*2]]}}{{drain=[[?{Amp Up}*2+?{Increase Area}+(@{drain})]]}}{{desc=@{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<button class="no-dicepool" name="act_npcspellnodicepool" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{dice=[[((@{skill}+@{magic}+@{dicepool_modifier}+@{specialization}+@{expertise})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{ampup=[[?{Amp Up|0|1|2|3|4|5|6|7|8|9|10}]]}}{{increasearea=[[?{Increase Area|0m,0|2m,1|4m,2|6m,3|8m,4|10m,5|12m,5|14m,6|16m,8|18m,9|20m,10}*2]]}}{{drain=[[?{Amp Up}*2+?{Increase Area}+(@{drain})]]}}{{desc=@{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<button class="dicepool" name="act_npcspellaoe" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{dice=[[((@{skill}+@{magic}+@{dicepool_modifier}+@{specialization}+@{expertise})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{ampup=[[?{Amp Up|0|1|2|3|4|5|6|7|8|9|10}]]}}{{increasearea=[[?{Increase Area|0m,0|2m,1|4m,2|6m,3|8m,4|10m,5|12m,5|14m,6|16m,8|18m,9|20m,10}*2]]}}{{drain=[[?{Amp Up}*2+?{Increase Area}+(@{drain})]]}}{{desc=@{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<button class="no-dicepool" name="act_npcspellaoenodicepool" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{dice=[[((@{skill}+@{magic}+@{dicepool_modifier}+@{specialization}+@{expertise})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{ampup=[[?{Amp Up|0|1|2|3|4|5|6|7|8|9|10}]]}}{{increasearea=[[?{Increase Area|0m,0|2m,1|4m,2|6m,3|8m,4|10m,5|12m,5|14m,6|16m,8|18m,9|20m,10}*2]]}}{{drain=[[?{Amp Up}*2+?{Increase Area}+(@{drain})]]}}{{desc=@{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<button class="dicepool" name="act_npcnoncombatspell" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{dice=[[((@{skill}+@{magic}+@{dicepool_modifier}+@{specialization}+@{expertise})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{increasearea=[[?{Increase Area|0m,0|2m,1|4m,2|6m,3|8m,4|10m,5|12m,5|14m,6|16m,8|18m,9|20m,10}*2]]}}{{drain=[[?{Increase Area}+(@{drain})]]}}{{desc=@{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<button class="no-dicepool" name="act_npcnoncombatspellnodicepool" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{dice=[[((@{skill}+@{magic}+@{dicepool_modifier}+@{specialization}+@{expertise})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{increasearea=[[?{Increase Area|0m,0|2m,1|4m,2|6m,3|8m,4|10m,5|12m,5|14m,6|16m,8|18m,9|20m,10}*2]]}}{{drain=[[?{Increase Area}+(@{drain})]]}}{{desc=@{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<button class="dicepool" name="act_npcnoncombatspellaoe" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{dice=[[((@{skill}+@{magic}+@{dicepool_modifier}+@{specialization}+@{expertise})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{increasearea=[[?{Increase Area|0m,0|2m,1|4m,2|6m,3|8m,4|10m,5|12m,5|14m,6|16m,8|18m,9|20m,10}*2]]}}{{drain=[[?{Increase Area}+(@{drain})]]}}{{desc=@{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<button class="no-dicepool" name="act_npcnoncombatspellaoenodicepool" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{dice=[[((@{skill}+@{magic}+@{dicepool_modifier}+@{specialization}+@{expertise})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{increasearea=[[?{Increase Area|0m,0|2m,1|4m,2|6m,3|8m,4|10m,5|12m,5|14m,6|16m,8|18m,9|20m,10}*2]]}}{{drain=[[?{Increase Area}+(@{drain})]]}}{{desc=@{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<span class="center" name="attr_dicepool"></span>
<span class="center" name="attr_type"></span>
<span class="center" name="attr_range"></span>
<span class="center" name="attr_duration"></span>
<span class="center" name="attr_drain"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox" checked="checked"/><span class="pictos">i</span>
<input class="settings-flag" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<div class="row1">
<label data-i18n-title="name" title="Name">
<input name="attr_name" placeholder="Fireball" title="@{repeating_spell_${x}_name}" type="text"/>
</label>
<label data-i18n-title="dice" title="Dice">
<input name="attr_dicepool" placeholder="18" title="@{repeating_spell_${x}_dicepool}" type="number"/>
</label>
<select name="attr_type" title="@{repeating_spell_${x}_type}">
<option data-i18n="mana" value="M">mana</option>
<option data-i18n="physical" value="P">physical</option>
</select>
<select name="attr_range" title="@{repeating_spell_${x}_range}">
<option data-i18n="los" value="LOS">los</option>
<option data-i18n="los (a)" value="LOS (A)">los (a)</option>
<option data-i18n="special" value="Special">special</option>
<option data-i18n="touch" value="T">Touch</option>
</select>
<select name="attr_duration" title="@{repeating_spell_${x}_duration}">
<option data-i18n="instant" value="Instant">instant</option>
<option data-i18n="permanent" value="Permanent">permanent</option>
<option data-i18n="limited" value="Limited">Limited</option>
<option data-i18n="sustained" value="Sustained">sustained</option>
<option data-i18n="special" value="Special">special</option>
</select>
<label data-i18n-title="drain" title="Drain">
<input name="attr_drain" placeholder="-1" title="@{repeating_spell_${x}_drain}" type="number"/>
</label>
<span>&nbsp;</span>
<span>&nbsp;</span>
</div>
<div class="row2">
<input name="attr_category" type="hidden" value="combat"/>
<h3 class="right" data-i18n="category">Category</h3>
<select name="attr_category" title="@{repeating_spell_${x}_category}">
<option data-i18n="combat" value="Combat" selected="selected">combat</option>
<option data-i18n="detection" value="Detection">detection</option>
<option data-i18n="health" value="Health">health</option>
<option data-i18n="illusion" value="Illusion">illusion</option>
<option data-i18n="manipulation" value="Manipulation">manipulation</option>
</select>
<h3 class="right" data-i18n="effecttype">Effect Type</h3>
<select name="attr_effect_type" title="@{repeating_spell_${x}_effect_type}">
<option data-i18n="none" value="" selected="selected">None</option>
<option data-i18n="directcombat" value="Direct Combat">Direct Combat</option>
<option data-i18n="directcombatarea" value="Direct Combat, Area">Direct Combat, Area</option>
<option data-i18n="indirectcombat" value="Indirect Combat">Indirect Combat</option>
<option data-i18n="indirectcombatarea" value="Indirect Combat, Area">Indirect Combat, Area</option>
<option data-i18n="singlesense" value="Single-Sense">Single-Sense</option>
<option data-i18n="multisense" value="Multi-Sense">Multi-Sense</option>
</select>
<h3 class="right" data-i18n="damage">Damage</h3>
<select name="attr_damage" title="@{repeating_spell_${x}_damage}">
<option data-i18n="unset" value="">Unset</option>
<option data-i18n="physical" value="Physical">Physical</option>
<option data-i18n="stun" value="Stun">Stun</option>
<option data-i18n="pspecial" value="Physical, Special">Physical, Special</option>
</select>
<h3 data-i18n="notes">Notes</h3>
<label data-i18n-title="notes" title="Notes">
<textarea class="full-row" name="attr_notes" placeholder="may start fires" title="@{repeating_spell_${x}_notes}" type="text"/></textarea>
</label>
</div>
</div>
</fieldset>
</div>
<div class="rows grunt repeating forms hide-resonance">
<h1 data-i18n="complexforms">Complex Forms</h1>
<div class="rows headers">
<h2 data-i18n="dice">Dice</h2>
<h2 class="name" data-i18n="name">Name</h2>
<h2 class="duration" data-i18n="duration">Duration</h2>
<h2 class="skill" data-i18n="skill">Skill</h2>
<h2 data-i18n="fade">Fade</h2>
<span>&nbsp;</span>
</div>
<fieldset class="repeating_forms">
<input name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/><span class="pictos">x</span>
<input name="attr_form" type="hidden" value=""/>
<input name='attr_skill' type="hidden" />
<input name='attr_skillname' type="hidden" value="" />
<span class="dice" name="attr_dice"></span>
<span class='hide-roll-button' name='attr_skill'></span>
<span class='show-name'>
<button name="act_complexformnoroll" type="action" value="@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{complexform} @{name}}}{{desc=@{notes}}}{{fade=[[@{fade}]]}}"><span name="attr_name"></span></button>
</span>
<button name="act_complexform" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{complexform} @{name}}}{{dice=[[((@{skill}+@{resonance}+@{dicepool_modifier}+@{spec}+@{expert})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=@{notes}}}{{fade=[[@{fade}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<button name="act_complexformdice" type="action" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{complexform} @{name}}}{{dice=[[((@{skill}+@{resonance}+@{dicepool_modifier}+@{spec}+@{expert})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=@{notes}}}{{fade=[[@{fade}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<span class="duration" name="attr_duration"></span>
<span class="skill" name="attr_skillname"></span>
<span class="fade_value" name="attr_fade"></span>
<span>&nbsp;</span>
<div class="settings">
<label data-i18n-title="dice" title="Dice">
<input name="attr_dice" placeholder="18" title="@{repeating_form_${x}_dice}" type="number"/>
</label>
<label data-i18n-title="name" title="Name">
<input name="attr_name" placeholder="Editor" title="@{repeating_form_${x}_name}" type="text"/>
</label>
<label data-i18n-title="duration" title="Duration">
<select name="attr_duration" title="@{repeating_forms_${x}_duration}">
<option data-i18n="instant" value="Instant">Instant</option>
<option data-i18n="sustained" value="Sustained">Sustained</option>
<option data-i18n="limited" value="Limited">Limited</option>
<option data-i18n="permanent" value="Permanent">Permanent</option>
<option data-i18n="other" value="Other">Other</option>
</select>
</label>
<select name="attr_skill" title="@{repeating_forms_${x}_skill}">
<option data-i18n="noroll" value="">No Roll</option>
<option data-i18n="cracking" value="@{cracking}">Cracking</option>
<option data-i18n="electronics" value="@{electronics}">Electronics</option>
<option data-i18n="tasking" value="@{tasking}">Tasking</option>
</select>
<label data-i18n-title="fade" title="Fade">
<input name="attr_fade" placeholder="+2" title="@{repeating_form_${x}_fade}" type="number"/>
</label>
<label data-i18n-title="notes" title="Notes">
<input name="attr_notes" placeholder="edit files" title="@{repeating_form_${x}_notes}" type="text"/>
</label>
</div>
</fieldset>
</div>
<div class="rows host repeating-container ic">
<h1 data-i18n="intrusioncountermeasures">Intrusion Countermeasures</h1>
<div class="row-long headers">
<span>&nbsp;</span>
<h2 data-i18n="ic">IC</h2>
<h2 data-i18n="pool">Pool</h2>
<h2 data-i18n="ar">AR</h2>
<h2 data-i18n="cm">CM</h2>
<h2 data-i18n="init">Init</h2>
<h2 data-i18n="defense">Defense</h2>
<span>&nbsp;</span>
<span>&nbsp;</span>
</div>
<fieldset class="repeating_IC">
<input name="attr_IC" type="hidden" value=""/>
<input class="toggle" name="attr_powered_on_IC" type="checkbox" value='1'/>
<span class="pictos">Q</span>
<button name="roll_IC" type="roll" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{ic}: @{name}}}{{dice=[[(@{dice}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}{{desc=vs. @{attribute}+@{matrix}\n@{notes}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}"><span name="attr_name"></span></button>
<span class="center" name="attr_dice"></span>
<span class="center" name="attr_ar"></span>
<label data-i18n-title="cm" title="Condition Monitor">
<input name="attr_cm" title="@{repeating_form_${x}_cm}" type="number"/>
</label>
<button name="roll_IC_init" type="roll" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}:IC}}{{base=^{ic}: ^{initiative}}}{{dice=[[(@{initdice}+@{modifiers_toggle}+@{edge_toggle})d6+@{init}]]}}"><span data-i18n="initiative"></span></button>
<span class="center" name="attr_defense"></span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox" />
<span class="pictos">i</span>
<input class="settings-toggle" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked" />
<span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<span>&nbsp;</span>
<label data-i18n-title="name" title="Name">
<input name="attr_name" placeholder="Black" title="@{repeating_IC_${x}_name}" type="text"/>
</label>
<label data-i18n-title="dice" title="Dice">
<input name="attr_dice" title="@{repeating_IC_${x}_dice}" type="number"/>
</label>
<label data-i18n-title="ar" title="Attack Rating">
<input name="attr_ar" title="@{repeating_IC_${x}_ar}" type="number"/>
</label>
<label data-i18n-title="cm" title="Condition Monitor">
<input name="attr_cm" title="@{repeating_IC_${x}_cm}" type="number"/>
</label>
<span class="initiative center">
<label data-i18n-title="init" title="Initiative">
<input name="attr_init" title="@{repeating_IC_${x}_init}" type="number" />
</label>
<span class="tiny">+</span>
<label data-i18n-title="init" title="Initiative Dice">
<input name="attr_initdice" title="@{repeating_IC_${x}_initdice}" type="number" value="3" />
</label>
<span class="tiny">d6</span>
</span>
<span class="defense_attributes center">
<select name="attr_attribute" title="@{repeating_IC_${x}_attribute}">
<option data-i18n="none" value="None">None</option>
<option data-i18n="intuition" value="Intuition">intuition</option>
<option data-i18n="logic" value="Logic">logic</option>
<option data-i18n="willpower" value="Willpower" selected="selected">willpower</option>
</select>
<span class="tiny">+</span>
<select name="attr_matrix" title="@{repeating_IC_${x}_matrix}">
<option data-i18n="none" value="None">None</option>
<option data-i18n="attack" value="Attack">attack</option>
<option data-i18n="sleaze" value="Sleaze">sleaze</option>
<option data-i18n="data_processing" value="Data Processing">data_processing</option>
<option data-i18n="firewall" value="Firewall" selected="selected">firewall</option>
</select>
</span>
<span>&nbsp;</span>
<span>&nbsp;</span>
<label data-i18n-title="notes" title="Notes">
<textarea name="attr_notes" placeholder="deploy the ic"></textarea>
</label>
</div>
</fieldset>
</div>
<div class="textrow host slaved-devices">
<h1 data-i18n="slaveddevices">Slaved Devices</h1><br>
<span name='attr_slaved_devices'></span>
<label class="settings" data-i18n-title="slaveddevices" title="Slaved Devices">
<textarea class="full-row" name="attr_slaved_devices" placeholder="Cameras, door locks, elevator controls..." title="@{slaved_devices}"></textarea>
</label>
</div>
<div class="textrow host sculpting">
<h1 data-i18n="sculpting">Sculpting</h1><br>
<span name='attr_sculpting'></span>
<label class="settings" data-i18n-title="sculpting" title="Sculpting">
<textarea class="full-row" name="attr_sculpting" placeholder="In VR, the host is designed to look like a large black pyramid..." title="@{sculpting}"></textarea>
</label>
</div>
<div class="textrow host security-procedures">
<h1 data-i18n="securityprocedures">Security Procedures</h1><br>
<span name='attr_security_procedures'></span>
<label class="settings" data-i18n-title="securityprocedures" title="Security Procedures">
<textarea class="full-row" name="attr_security_procedures" placeholder="Patrol IC running at all times, Once alarmed, the host launches IC in this order..." title="@{security_procedures}"></textarea>
</label>
</div>
<div class="textrow host pay-data">
<h1 data-i18n="paydata">Pay Data</h1><br>
<span name='attr_pay_data'></span>
<label class="settings" data-i18n-title="paydata" title="Pay Data">
<textarea class="full-row" name="attr_pay_data" placeholder="Housekeeping codes worth 500nuyen if sold within a week..." title="@{pay_data}"></textarea>
</label>
</div>
<div class="textrow grunt host sprite spirit vehicle notes">
<h1 data-i18n="notes">Notes</h1><br>
<span name='attr_notes'></span>
<label class="settings" data-i18n-title="notes" title="Notes">
<textarea class="full-row" name="attr_notes" placeholder="" title="@{notes}"></textarea>
</label>
</div>
</div>
</div><!-- end border-box div -->
<div class="matrix body matrix-device">
<div class="rows">
<h1 data-i18n="matrixdevice">Matrix Device</h1>
<label data-i18n-title="device" title="device">
<input name="attr_device_name" placeholder="Sony CIY-720" type="text"/>
</label>
<button data-i18n="devicerating" name="device rating" value="@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{device_name} ^{device} ^{rating}}}{{dice=[[(@{device_rating}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}]]}}" type="roll">Device Rating</button>
<label class="round" data-i18n-title="devicerating" title="devicerating">
<input name="attr_matrix_device_rating" placeholder="4" type="number" value=""/>
</label>
</div>
<div class="rows">
<button name="act_matrix_attack" type="action" value="" title="Roll attack" data-i18n="attack">Attack</button>
<div class="matrix-bubble matrixAttack">
<input name="attr_attack" value="0" type="radio"/><span></span>
<input name="attr_attack" value="1" type="radio"/><span></span>
<input name="attr_attack" value="2" type="radio"/><span></span>
<input name="attr_attack" value="3" type="radio"/><span></span>
<input name="attr_attack" value="4" type="radio"/><span></span>
<input name="attr_attack" value="5" type="radio"/><span></span>
<input name="attr_attack" value="6" type="radio"/><span></span>
<input name="attr_attack" value="7" type="radio"/><span></span>
<input name="attr_attack" value="8" type="radio"/><span></span>
<input name="attr_attack" value="9" type="radio"/><span></span>
<input name="attr_attack" value="10" type="radio"/><span></span>
<input name="attr_attack" value="11" type="radio"/><span></span>
<input name="attr_attack" value="12" type="radio"/><span></span>
<input name="attr_attack" value="13" type="radio"/><span></span>
<input name="attr_attack" value="14" type="radio"/><span></span>
<input name="attr_attack" value="15" type="radio"/><span></span>
<input name="attr_attack" value="16" type="radio"/><span></span>
<input name="attr_attack" value="17" type="radio"/><span></span>
<input name="attr_attack" value="18" type="radio"/><span></span>
<input name="attr_attack" value="19" type="radio"/><span></span>
<input name="attr_attack" value="20" type="radio"/><span></span>
</div>
<label class="round" data-i18n-title="attack" title="attack">
<input name="attr_attack" placeholder="4" type="number" value=""/>
</label>
</div>
<div class="rows">
<button name="act_matrix_sleaze" type="action" value="" title="Roll Sleaze" data-i18n="sleaze" >Sleaze</button>
<div class="matrix-bubble matrixSleaze">
<input name="attr_sleaze" value="0" type="radio"/><span></span>
<input name="attr_sleaze" value="1" type="radio"/><span></span>
<input name="attr_sleaze" value="2" type="radio"/><span></span>
<input name="attr_sleaze" value="3" type="radio"/><span></span>
<input name="attr_sleaze" value="4" type="radio"/><span></span>
<input name="attr_sleaze" value="5" type="radio"/><span></span>
<input name="attr_sleaze" value="6" type="radio"/><span></span>
<input name="attr_sleaze" value="7" type="radio"/><span></span>
<input name="attr_sleaze" value="8" type="radio"/><span></span>
<input name="attr_sleaze" value="9" type="radio"/><span></span>
<input name="attr_sleaze" value="10" type="radio"/><span></span>
<input name="attr_sleaze" value="11" type="radio"/><span></span>
<input name="attr_sleaze" value="12" type="radio"/><span></span>
<input name="attr_sleaze" value="13" type="radio"/><span></span>
<input name="attr_sleaze" value="14" type="radio"/><span></span>
<input name="attr_sleaze" value="15" type="radio"/><span></span>
<input name="attr_sleaze" value="16" type="radio"/><span></span>
<input name="attr_sleaze" value="17" type="radio"/><span></span>
<input name="attr_sleaze" value="18" type="radio"/><span></span>
<input name="attr_sleaze" value="19" type="radio"/><span></span>
<input name="attr_sleaze" value="20" type="radio"/><span></span>
</div>
<label class="round" data-i18n-title="sleaze" title="sleaze">
<input name="attr_sleaze" placeholder="4" type="number" value=""/>
</label>
</div>
<div class="rows">
<button name="act_matrix_data_processing" type="action" value="" title="Roll Data Processing" data-i18n="data_processing">Data Processing</button>
<div class="matrix-bubble matrixData">
<input name="attr_data_processing" value="0" type="radio"/><span></span>
<input name="attr_data_processing" value="1" type="radio"/><span></span>
<input name="attr_data_processing" value="2" type="radio"/><span></span>
<input name="attr_data_processing" value="3" type="radio"/><span></span>
<input name="attr_data_processing" value="4" type="radio"/><span></span>
<input name="attr_data_processing" value="5" type="radio"/><span></span>
<input name="attr_data_processing" value="6" type="radio"/><span></span>
<input name="attr_data_processing" value="7" type="radio"/><span></span>
<input name="attr_data_processing" value="8" type="radio"/><span></span>
<input name="attr_data_processing" value="9" type="radio"/><span></span>
<input name="attr_data_processing" value="10" type="radio"/><span></span>
<input name="attr_data_processing" value="11" type="radio"/><span></span>
<input name="attr_data_processing" value="12" type="radio"/><span></span>
<input name="attr_data_processing" value="13" type="radio"/><span></span>
<input name="attr_data_processing" value="14" type="radio"/><span></span>
<input name="attr_data_processing" value="15" type="radio"/><span></span>
<input name="attr_data_processing" value="16" type="radio"/><span></span>
<input name="attr_data_processing" value="17" type="radio"/><span></span>
<input name="attr_data_processing" value="18" type="radio"/><span></span>
<input name="attr_data_processing" value="19" type="radio"/><span></span>
<input name="attr_data_processing" value="20" type="radio"/><span></span>
</div>
<label class="round" data-i18n-title="data_processing" title="data_processing">
<input name="attr_data_processing" placeholder="4" type="number" value=""/>
</label>
</div>
<div class="rows">
<button name="act_matrix_firewall" type="action" value="" title="Roll Firewall" data-i18n="firewall">Firewall</button>
<div class="matrix-bubble matrixFirewall">
<input name="attr_firewall" value="0" type="radio"/><span></span>
<input name="attr_firewall" value="1" type="radio"/><span></span>
<input name="attr_firewall" value="2" type="radio"/><span></span>
<input name="attr_firewall" value="3" type="radio"/><span></span>
<input name="attr_firewall" value="4" type="radio"/><span></span>
<input name="attr_firewall" value="5" type="radio"/><span></span>
<input name="attr_firewall" value="6" type="radio"/><span></span>
<input name="attr_firewall" value="7" type="radio"/><span></span>
<input name="attr_firewall" value="8" type="radio"/><span></span>
<input name="attr_firewall" value="9" type="radio"/><span></span>
<input name="attr_firewall" value="10" type="radio"/><span></span>
<input name="attr_firewall" value="11" type="radio"/><span></span>
<input name="attr_firewall" value="12" type="radio"/><span></span>
<input name="attr_firewall" value="13" type="radio"/><span></span>
<input name="attr_firewall" value="14" type="radio"/><span></span>
<input name="attr_firewall" value="15" type="radio"/><span></span>
<input name="attr_firewall" value="16" type="radio"/><span></span>
<input name="attr_firewall" value="17" type="radio"/><span></span>
<input name="attr_firewall" value="18" type="radio"/><span></span>
<input name="attr_firewall" value="19" type="radio"/><span></span>
<input name="attr_firewall" value="20" type="radio"/><span></span>
</div>
<label class="round" data-i18n-title="firewall" title="firewall">
<input name="attr_firewall" placeholder="4" type="number" value=""/>
</label>
</div>
<div class="rows repeating">
<h1 data-i18n="programs">Programs</h1>
<fieldset class="repeating_programs">
<input class="toggle" name="attr_powered_on" type="checkbox" checked="checked"/>
<span class="pictos">Q</span>
<button name="roll_program" type="roll" value="@{gm_toggle} &amp;{template:rolls-computed}{{header=@{character_name}}}{{base=@{name}}}{{desc=@{program_note}}}"><span name="attr_name"></span></button>
<input class="toggle" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked"/>
<span class="pictos">x</span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox"/>
<span class="pictos">i</span>
<div class="collapse">
<span name="attr_program_note"></span>
</div>
<div class="settings">
<h2 data-i18n="name">name</h2>
<label data-i18n-title="name" title="name">
<input name="attr_name" placeholder="Program Name" title="@{repeating_programs_${x}_name}" type="text" value=""/>
</label>
<h2 data-i18n="notes">notes</h2>
<label data-i18n-title="notes" title="notes">
<textarea name="attr_program_note" placeholder="Program Description" title="@{repeating_programs_${x}_program_note}"></textarea>
</label>
</div>
</fieldset>
</div>
</div>
<div class="matrix body">
<div class="npc-roll-rows">
<div class="pc-row">
<div class="header right-header">
<h1 data-i18n="matrixactions">Matrix Actions</h1>
</div>
</div>
<div class="pc-row">
<div class="border-box">
<div class="pc-box">
<div class="rolls-col">
<input class="tab-switch" name="attr_rolls_toggle" type="hidden" value="matrix"/>
<div class="rolls-matrix">
<input type="hidden" name="attr_display_illegal_matrix_actions" value="">
<input type="hidden" name="attr_matrix_access_level_filter" value="">
<h3 data-i18n="rollbuttonsdisclaimer"></h3><br>
<span class="full-width">
<label class="fright" data-i18n-title="illegal_actions" title="Display Illegal Actions">
<span data-i18n="illegal_actions"></span>
<input type="checkbox" name="attr_display_illegal_matrix_actions" value="1" checked="checked" title="@{display_illegal_matrix_actions}">
</label>
</span>
<span class="full-width">
<label class="fleft" data-i18n-title="matrix_noise" title="Matrix Noise">
<span data-i18n="matrix_noise"></span>
<input type="number" name="attr_matrix_noise" value="0" placeholder="0" title="@{matrix_noise}" step="1">
</label>
<label class="fright" data-i18n-title="matrix_access_level" title="Access Level Filter">
<span data-i18n="access_level_filter"></span>
<select name="attr_matrix_access_level_filter" title="@{matrix_access_level_filter}">
<option data-i18n="all" value="all">All</option>
<option data-i18n="outsider" value="outsider">Outsider</option>
<option data-i18n="user" value="user">User</option>
<option data-i18n="admin" value="admin">Admin</option>
</select>
</label>
</span>
<h2 data-i18n="matrixmajor">Matrix Major Actions</h2>
<button title="Cracking + Logic" class="illegal outsider crb" name="act_matrix_backdoor_entry" type="action" value=""><span data-i18n="backdoorentry"></span></button>
<button title="Cracking + Logic" class="illegal outsider user admin crb" name="act_matrix_brute_force" type="action" value=""><span data-i18n="bruteforce"></span></button>
<button title="Cracking + Logic" class="legal user admin hs" name="act_matrix_calibration" type="action" value=""><span data-i18n="calibration"></span></button>
<button title="Cracking + Logic" class="illegal admin crb" name="act_matrix_check_os" type="action" value=""><span data-i18n="checkos"></span></button>
<button title="Electronics + Logic" class="legal user admin crb" name="act_matrix_control_device" type="action" value=""><span data-i18n="controldevice"></span></button>
<button title="Cracking + Logic" class="illegal user admin crb" name="act_matrix_crack_file" type="action" value=""><span data-i18n="crackfile"></span></button>
<button title="Cracking + Logic" class="illegal admin crb" name="act_matrix_crash_program" type="action" value=""><span data-i18n="crashprogram"></span></button>
<button title="Cracking + Logic" class="illegal outsider user admin crb" name="act_matrix_data_spike" type="action" value=""><span data-i18n="dataspike"></span></button>
<button title="Cracking + Logic" class="illegal outsider user admin hs" name="act_matrix_delayed_command" type="action" value=""><span data-i18n="delayed_command"></span></button>
<button title="Electronics + Logic" class="illegal outsider hs" name="act_matrix_denial_of_service" type="action" value=""><span data-i18n="denial_of_service"></span></button>
<button title="Cracking + Logic" class="illegal outsider user admin hs" name="act_matrix_device_lock" type="action" value=""><span data-i18n="device_lock"></span></button>
<button title="Cracking + Logic" class="legal user admin crb" name="act_matrix_disarm_data_bomb" type="action" value=""><span data-i18n="disarmdatabomb"></span></button>
<button title="Electronics + Logic" class="legal user admin crb" name="act_matrix_edit_file" type="action" value=""><span data-i18n="editfile"></span></button>
<button title="Electronics + Logic" class="legal user admin crb" name="act_matrix_encrypt_file" type="action" value=""><span data-i18n="encryptfile"></span></button>
<button title="Electronics + Logic" class="illegal user admin crb" name="act_matrix_erase_matrix_signature" type="action" value=""><span data-i18n="erasematrixsignature"></span></button>
<button title="Electronics + Logic" class="legal admin crb" name="act_matrix_format_device" type="action" value=""><span data-i18n="formatdevice"></span></button>
<span class="matrix-action legal outsider user admin crb" data-i18n="fullmatrixdefense"></span>
<button title="Cracking + Logic" class="illegal user admin hs" name="act_matrix_garbage_in_garbage_out" type="action" value=""><span data-i18n="garbage_in_garbage_out"></span></button>
<button title="Electronics + Logic" class="illegal user admin crb" name="act_matrix_hash_check" type="action" value=""><span data-i18n="hashcheck"></span></button>
<button title="Cracking + Intuition" class="illegal outsider user admin crb" name="act_matrix_hide" type="action" value=""><span data-i18n="hide"></span></button>
<button title="Electronics + Willpower" class="legal outsider user admin crb" name="act_matrix_jackout" type="action" value=""><span data-i18n="jackout"></span></button>
<button title="Cracking + Logic" class="illegal admin crb" name="act_matrix_jam_signals" type="action" value=""><span data-i18n="jamsignals"></span></button>
<button title="Electronics + Logic" class="legal user admin crb" name="act_matrix_jump_into_rigged_device" type="action" value=""><span data-i18n="jumpintoriggeddevice"></span></button>
<button title="Cracking + Logic" class="illegal outsider hs" name="act_matrix_known_exploit_backdoor_entry" type="action" value=""><span data-i18n="known_exploit_backdoor_entry"></span></button>
<button title="Cracking + Logic" class="illegal outsider hs" name="act_matrix_masquerade" type="action" value=""><span data-i18n="masquerade"></span></button>
<button title="Electronics + Intuition" class="legal outsider user admin crb" name="act_matrix_matrix_perception" type="action" value=""><span data-i18n="matrixperception"></span></button>
<button title="Electronics + Intuition" class="legal outsider user admin crb" name="act_matrix_matrix_search" type="action" value=""><span data-i18n="matrixsearch"></span></button>
<button title="Cracking + Logic" class="illegal outsider hs" name="act_matrix_metahuman_in_the_middle" type="action" value=""><span data-i18n="metahuman_in_the_middle"></span></button>
<button title="Electronics + Logic" class="illegal admin hs" name="act_matrix_modify_icon" type="action" value=""><span data-i18n="modify_icon"></span></button>
<button title="Cracking + Logic" class="illegal outsider hs" name="act_matrix_popup" type="action" value=""><span data-i18n="popup"></span></button>
<button title="Cracking + Logic" class="illegal outsider user admin crb" name="act_matrix_probe" type="action" value=""><span data-i18n="probe"></span></button>
<button title="Electronics + Logic" class="legal admin crb" name="act_matrix_reboot_device" type="action" value=""><span data-i18n="rebootdevice"></span></button>
<button title="Electronics + Logic" class="illegal admin crb" name="act_matrix_set_data_bomb" type="action" value=""><span data-i18n="setdatabomb"></span></button>
<button title="Cracking + Logic" class="illegal admin crb" name="act_matrix_snoop" type="action" value=""><span data-i18n="snoop"></span></button>
<button title="Cracking + Logic" class="illegal outsider user admin crb" name="act_matrix_spoof_command" type="action" value=""><span data-i18n="spoofcommand"></span></button>
<button title="Electronics + Logic" class="illegal admin hs" name="act_matrix_subvert_infrastructure" type="action" value=""><span data-i18n="subvert_infrastructure"></span></button>
<button title="Cracking + Logic" class="illegal outsider user admin crb" name="act_matrix_tarpit" type="action" value=""><span data-i18n="tarpit"></span></button>
<button title="Electronics + Intuition" class="illegal admin crb" name="act_matrix_trace_icon" type="action" value=""><span data-i18n="traceicon"></span></button>
<button title="Electronics + Logic" class="legal outsider user admin hs" name="act_matrix_threat_analysis" type="action" value=""><span data-i18n="threat_analysis"></span></button>
<h2 data-i18n="matrixminor">Matrix Minor Actions</h2>
<span class="matrix-action legal user admin" data-i18n="changeicon"></span>
<span class="matrix-action legal" data-i18n="enterexithost"></span>
<button title="Electronics + Intuition" class="legal outsider user admin" name="act_matrix_matrix_perception" type="action" value=""><span data-i18n="matrixperception"></span></button>
<span class="matrix-action legal admin" data-i18n="reconfigurematrixattribute"></span>
<span class="matrix-action legal outsider user admin" data-i18n="sendmessage"></span>
<button title="Electronics + Logic" class="illegal outsider hs" name="act_matrix_squelch" type="action" value=""><span data-i18n="squelch"></span></button>
<span class="matrix-action legal admin" data-i18n="switchinterfacemode"></span>
<span class="matrix-action legal outsider" data-i18n="virtual_aim"></span>
<button title="Cracking + Logic" class="illegal user admin hs" name="act_matrix_watchdog" type="action" value=""><span data-i18n="watchdog"></span></button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- =========================================================
GM HELPER -> MATRIX ENCOUNTER SHEET
========================================================= -->
<div class="gm-helper">
<img class="shadowrun-logo" alt="Shadowrun sixth edition logo" src="https://s3.amazonaws.com/files.d20.io/images/204802539/QInmmma8HvUBA90c8e8H8Q/max.png?1614545502"/>
<input name="attr_stats_toggle" type="hidden" value="settings" checked="checked"/>
<div class="border-box">
<div class="pc-box">
<div class="header-nav">
<input name="attr_stats_toggle" type="checkbox" value="settings" checked="checked"/>
<span class="pictos">y</span>
<select name="attr_sheet_type" title="Sheet Type">
<option value="pc" data-i18n="pc">PC</option>
<option value="grunt" data-i18n="grunt">Grunt</option>
<option value="spirit" data=i18n="spirit">Spirit</option>
<option value="host" data-i18n="host">Host</option>
<option value="sprite" data-i18n="sprite">Sprite</option>
<option value="vehicle" data-i18n="vehicle">Vehicle</option>
<option value="gm_helper" data-i18n="gm_helper">GM Helper</option>
</select>
<button name="act_extended_start" class="icon pictos" title="Start Extended Test" type="action" value="">r</button>
<button name="act_d6" class="icon d6" title="Roll D6s" type="action" value="">L</button>
<span></span>
<h2 data-i18n="name"></h2>
<input name="attr_character_name" type="text" />
</div>
</div>
</div>
<div class="border-box">
<div class="pc-box">
<h1 class="center" data-i18n="gm_helper">GM Helper</h1>
<button class="" name="act_add_to_os_tracker" type="action"><span data-i18n="track_selected"></span></button>
<div class="rows repeating-container os-tracker">
<div class="row-long headers">
<span>&nbsp;</span>
<h2 class="left" data-i18n="name">Name</h2>
<h2 data-i18n="access_level">Access Level</h2>
<h2 class="center" data-i18n="OS">OS</h2>
<span>&nbsp;</span>
<span>&nbsp;</span>
</div>
<fieldset class="repeating_os-tracker">
<span>&nbsp;</span>
<span class="bold purple" name="attr_name"></span>
<span class="center" name="attr_access_level"></span>
<span class="center">
<button class="pictos os-control-btn" name="act_osdel" type="action" data-i18n-title="remove">-</button>
<span style="display: inline-block; width: 2em; text-align: center;" class="" name="attr_os"></span>
<button class="pictos os-control-btn" name="act_osadd" type="action" data-i18n-title="add">+</button>
</span>
<input class="collapse-flag" name="attr_display_flag" type="checkbox" />
<span class="pictos">i</span>
<input class="settings-toggle" name="attr_flag" title="Settings toggle" type="checkbox" checked="checked" />
<span class="pictos">x</span>
<div class="collapse"><span name="attr_notes"></span></div>
<div class="settings">
<span>&nbsp;</span>
<label class="left" data-i18n-title="name" title="Name">
<input name="attr_name" placeholder="PC #1" title="@{repeating_os-tracker_${x}_name}" type="text"/>
</label>
<select class="centered" name="attr_access_level" data-i18n-title="access_level" title="Access Level">
<option data-i18n="none">None</option>
<option data-i18n="outsider">Outsider</option>
<option data-i18n="user">User</option>
<option data-i18n="admin">Admin</option>
<option data-i18n="other">Other</option>
</select>
<label class="center" data-i18n-title="OS" title="OS">
<input name="attr_os" title="@{repeating_os-tracker_${x}_os}" type="number" value="0"/>
</label>
<span>&nbsp;</span>
<span>&nbsp;</span>
<label data-i18n-title="notes" title="Notes">
<textarea name="attr_notes" placeholder="notes"></textarea>
</label>
</div>
</fieldset>
</div>
<br><br><br><br><br><br><br><br><br><br><br><br>
</div>
</div>
</div>
<div class="footer">
<div>
<span data-i18n="copyrightfooter">The Topps Company, Inc. has sole ownership of the names, logo, artwork, marks, photographs, sounds, audio, video and/or any proprietary material used in influence with the game Shadowrun. The Topps Company, Inc. has granted permission to use such names, logos, artwork, marks and/or any proprietary materials for promotional and informational purposes on its website but does not endorse, and is not affiliated with any official capacity whatsoever.
</span>
<span>Version </span><span name="attr_sheet_version"></span>
</div>
</div>
<div class="rolltemplates">
<!--Roll Template for Generic Info 6 each desc and bigdesc rows-->
<rolltemplate class="rolltemplate-multirow">
<div class="template-body">
<div class="template-header">
{{#header}}{{header}}{{/header}}
{{#base}}<br><span>{{base}}</span>{{/base}}
</div>
{{#desc}}<div class="template-row">
<span class="template-desc">
{{desc}}
</span>
</div>{{/desc}}
{{#bigdesc}}<div class="template-row">
{{bigdesc}}
</div>{{/bigdesc}}
{{#divided}}<div class="template-row split">
<span>{{#left}}{{left}}{{/left}}</span>
<span>{{#right}}{{right}}{{/right}}</span>
</div>{{/divided}}
{{#desc2}}<div class="template-row">
<span class="template-desc">
{{desc2}}
</span>
</div>{{/desc2}}
{{#bigdesc2}}<div class="template-row">
{{bigdesc2}}
</div>{{/bigdesc2}}
{{#divided2}}<div class="template-row split">
<span>{{#left2}}{{left2}}{{/left2}}</span>
<span>{{#right2}}{{right2}}{{/right2}}</span>
</div>{{/divided2}}
{{#desc3}}<div class="template-row">
<span class="template-desc">
{{desc3}}
</span>
</div>{{/desc3}}
{{#bigdesc3}}<div class="template-row">
{{bigdesc3}}
</div>{{/bigdesc3}}
{{#divided3}}<div class="template-row split">
<span>{{#left3}}{{left3}}{{/left3}}</span>
<span>{{#right3}}{{right3}}{{/right3}}</span>
</div>{{/divided3}}
{{#desc4}}<div class="template-row">
<span class="template-desc">
{{desc4}}
</span>
</div>{{/desc4}}
{{#bigdesc4}}<div class="template-row">
{{bigdesc4}}
</div>{{/bigdesc4}}
{{#divided4}}<div class="template-row split">
<span>{{#left4}}{{left4}}{{/left4}}</span>
<span>{{#right4}}{{right4}}{{/right4}}</span>
</div>{{/divided4}}
{{#desc5}}<div class="template-row">
<span class="template-desc">
{{desc5}}
</span>
</div>{{/desc5}}
{{#bigdesc5}}<div class="template-row">
{{bigdesc5}}
</div>{{/bigdesc5}}
{{#divided5}}<div class="template-row split">
<span>{{#left5}}{{left5}}{{/left5}}</span>
<span>{{#right5}}{{right5}}{{/right5}}</span>
</div>{{/divided5}}
{{#desc6}}<div class="template-row">
<span class="template-desc">
{{desc6}}
</span>
</div>{{/desc6}}
{{#bigdesc6}}<div class="template-row">
{{bigdesc6}}
</div>{{/bigdesc6}}
{{#divided6}}<div class="template-row split">
<span>{{#left6}}{{left6}}{{/left6}}</span>
<span>{{#right6}}{{right6}}{{/right6}}</span>
</div>{{/divided6}}
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-multirow">
<div class="sheet-template-body">
<div class="sheet-template-header">
{{#header}}{{header}}{{/header}}
{{#base}}<br><span>{{base}}</span>{{/base}}
</div>
{{#desc}}<div class="sheet-template-row">
<span class="sheet-template-desc">
{{desc}}
</span>
</div>{{/desc}}
{{#bigdesc}}<div class="sheet-template-row">
{{bigdesc}}
</div>{{/bigdesc}}
{{#divided}}<div class="sheet-template-row sheet-split">
<span>{{#left}}{{left}}{{/left}}</span>
<span>{{#right}}{{right}}{{/right}}</span>
</div>{{/divided}}
{{#desc2}}<div class="sheet-template-row">
<span class="sheet-template-desc">
{{desc2}}
</span>
</div>{{/desc2}}
{{#bigdesc2}}<div class="sheet-template-row">
{{bigdesc2}}
</div>{{/bigdesc2}}
{{#divided2}}<div class="sheet-template-row sheet-split">
<span>{{#left2}}{{left2}}{{/left2}}</span>
<span>{{#right2}}{{right2}}{{/right2}}</span>
</div>{{/divided2}}
{{#desc3}}<div class="sheet-template-row">
<span class="sheet-template-desc">
{{desc3}}
</span>
</div>{{/desc3}}
{{#bigdesc3}}<div class="sheet-template-row">
{{bigdesc3}}
</div>{{/bigdesc3}}
{{#divided3}}<div class="sheet-template-row sheet-split">
<span>{{#left3}}{{left3}}{{/left3}}</span>
<span>{{#right3}}{{right3}}{{/right3}}</span>
</div>{{/divided3}}
{{#desc4}}<div class="sheet-template-row">
<span class="sheet-template-desc">
{{desc4}}
</span>
</div>{{/desc4}}
{{#bigdesc4}}<div class="sheet-template-row">
{{bigdesc4}}
</div>{{/bigdesc4}}
{{#divided4}}<div class="sheet-template-row sheet-split">
<span>{{#left4}}{{left4}}{{/left4}}</span>
<span>{{#right4}}{{right4}}{{/right4}}</span>
</div>{{/divided4}}
{{#desc5}}<div class="sheet-template-row">
<span class="sheet-template-desc">
{{desc5}}
</span>
</div>{{/desc5}}
{{#bigdesc5}}<div class="sheet-template-row">
{{bigdesc5}}
</div>{{/bigdesc5}}
{{#divided5}}<div class="sheet-template-row sheet-split">
<span>{{#left5}}{{left5}}{{/left5}}</span>
<span>{{#right5}}{{right5}}{{/right5}}</span>
</div>{{/divided5}}
{{#desc6}}<div class="sheet-template-row">
<span class="sheet-template-desc">
{{desc6}}
</span>
</div>{{/desc6}}
{{#bigdesc6}}<div class="sheet-template-row">
{{bigdesc6}}
</div>{{/bigdesc6}}
{{#divided6}}<div class="sheet-template-row sheet-split">
<span>{{#left6}}{{left6}}{{/left6}}</span>
<span>{{#right6}}{{right6}}{{/right6}}</span>
</div>{{/divided6}}
</div>
</rolltemplate>
<!--Roll Template for sharing Quality Info-->
<rolltemplate class="rolltemplate-quality">
<div class="template-body">
<div class="template-header">
{{#header}}{{header}}{{/header}}
{{#base}}<br><span>{{base}}</span>{{/base}}
{{#rating}}<br><span>Rating: {{rating}}</span>{{/rating}}
</div>
<div class="template-row">
<span class="template-desc">
{{#desc}}{{desc}}{{/desc}}
</span>
</div>
</div>
</rolltemplate>
<!--Roll Template for sharing Quality Info-->
<rolltemplate class="sheet-rolltemplate-quality">
<div class="sheet-template-body">
<div class="sheet-template-header">
{{#header}}{{header}}{{/header}}
{{#base}}<br><span>{{base}}</span>{{/base}}
{{#rating}}<br><span>Rating: {{rating}}</span>{{/rating}}
</div>
<div class="sheet-template-row">
<span class="sheet-template-desc">
{{#desc}}{{desc}}{{/desc}}
</span>
</div>
</div>
</rolltemplate>
<!--Roll Template for sharing Contact Info-->
<rolltemplate class="rolltemplate-contact">
<div class="template-body">
<div class="template-header">
{{#header}}{{header}}{{/header}}
</div>
{{#name}}<div class="template-row">{{name}}</div>{{/name}}
<div class="template-row sheet-split">
<span>{{#loyalty}}<span data-i18n="loyalty">Loyalty</span><br>{{loyalty}}{{/loyalty}}</span>
<span>{{#connection}}<span data-i18n="connection">Connection</span><br>{{connection}}{{/connection}}</span>
</div>
{{#desc}}
<div class="template-row">
<span class="template-desc">
{{desc}}
</span>
</div>
{{/desc}}
<div class="template-row">
<span class="template-desc">
[Roll Loyalty](~{{header}}|Loyalty{{loyalty}})
</span>
<span class="template-desc">
[Roll Connections](~{{header}}|Connections{{connection}})
</span>
</div>
</div>
</rolltemplate>
<!--Roll Template for sharing Contact Info-->
<rolltemplate class="sheet-rolltemplate-contact">
<div class="sheet-template-body">
<div class="sheet-template-header">
{{#header}}{{header}}{{/header}}
</div>
{{#name}}<div class="sheet-template-row">{{name}}</div>{{/name}}
<div class="sheet-template-row sheet-split">
<span>{{#loyalty}}<span data-i18n="loyalty">Loyalty</span><br>{{loyalty}}{{/loyalty}}</span>
<span>{{#connection}}<span data-i18n="connection">Connection</span><br>{{connection}}{{/connection}}</span>
</div>
{{#desc}}
<div class="sheet-template-row">
<span class="sheet-template-desc">
{{desc}}
</span>
</div>
{{/desc}}
<div class="sheet-template-row">
<span class="sheet-template-desc">
[Roll Loyalty](~{{header}}|Loyalty{{loyalty}})
</span>
<span class="sheet-template-desc">
[Roll Connections](~{{header}}|Connections{{connection}})
</span>
</div>
</div>
</rolltemplate>
<!--Roll Template Original-->
<rolltemplate class="sheet-rolltemplate-rolls">
<div class="sheet-template-body">
<div class="sheet-template-header">
{{#header}}{{header}}{{/header}}{{#spec}}<span> ({{spec}})</span>{{/spec}}<br />
{{#arm}}<span>{{arm}}</span>{{/arm}}
{{#base}}<span>{{base}}</span><br>{{/base}}
{{#rollLess() wound 0}}<span>|</span><span data-i18n="wounds">Wounds</span> ({{wound}})<span>|</span>{{/rollLess() wound 0}}
{{#rollLess() mod 0}}<span>|</span><span data-i18n="modifier">Modifier</span> ({{mod}})<span>|</span>{{/rollLess() mod 0}}
{{#rollGreater() mod 0}}<span>|</span><span data-i18n="modifier">Modifier</span> ({{mod}})<span>|</span>{{/rollGreater() mod 0}}
{{#rollGreater() edge 0}}<span>|</span><span data-i18n="edge">Edge</span> ({{edge}})<span>|</span>{{/rollGreater() edge 0}}
{{#rollGreater() combat_paralysis 0}}<span>|</span><span data-i18n="combat_paralysis">Combat Paralysis</span><span>|</span>{{/rollGreater() combat_paralysis 0}}
{{#effecttype}}<br /><span>{{effecttype}}</span>{{/effecttype}}
</div>
{{#dice}}<div class="sheet-template-row">Hits: {{dice}}</div>{{/dice}}
{{#rollGreater() wilddie 0}}
<div class="sheet-template-row">Wild Die Rolled! {{wilddie}}<br>
{{#rollLess() wilddie 2}}
<div class="sheet-template-row"><span class="sheet-red">Remove all 5s!</span></div>
{{/rollLess() wilddie 2}}
{{#rollBetween() wilddie 2 4}}
<div class="sheet-template-row">No Change!</div>
{{/rollBetween() wilddie 2 4}}
{{#rollGreater() wilddie 4}}
<div class="sheet-template-row green"><span class="sheet-green">+3 Hits!</span></div>
{{/rollGreater() wilddie 4}}
</div>
{{/rollGreater() wilddie 0}}
{{#rating}}<div class="sheet-template-row">{{rating}}</div>{{/rating}}
{{#ampup}}{{#rollGreater() ampup 0}}
<div class="sheet-template-row">
<span class="sheet-template-desc">Amp Up: {{ampup}}</span>
</div>
{{/rollGreater() ampup 0}}{{/ampup}}
{{#drain}}{{#rollGreater() drain 0}}
<div class="sheet-template-row">
<span class="sheet-template-desc">Drain: {{drain}}</span>
</div>
{{/rollGreater() drain 0}}{{/drain}}
{{#increasearea}}{{#rollGreater() increasearea 0}}
<div class="sheet-template-row">
<span class="sheet-template-desc">Increase Area: {{increasearea}}m</span>
</div>
{{/rollGreater() increasearea 0}}{{/increasearea}}
{{#fade}}{{#rollGreater() fade 0}}
<div class="sheet-template-row">
<span class="sheet-template-desc">Fade: {{fade}}</span>
</div>
{{/rollGreater() fade 0}}{{/fade}}
{{#desc}}
<div class="sheet-template-row">
<span class="sheet-template-desc">
{{desc}}
</span>
</div>
{{/desc}}
{{#opp}}<div class="sheet-template-row">{{opp}}</div>{{/opp}}
</div>
</rolltemplate>
<!--Roll Template New Computed Stuff-->
<rolltemplate class="sheet-rolltemplate-rolls-computed">
<div class="sheet-template-body">
<div class="sheet-template-header nott">
{{#header}}{{header}}{{/header}}{{#spec}}<span> ({{spec}})</span>{{/spec}}<br />
{{#arm}}<span>{{arm}}</span>{{/arm}}
{{#reason}}<span>{{reason}}</span><br>{{/reason}}
{{#base}}<span>{{base}}</span><br>{{/base}}
{{#defense_rating}}<span>DR: {{defense_rating}}</span><br>{{/defense_rating}}
{{#magicar}}<span>Magic AR: {{magicar}}</span><br>{{/magicar}}
{{#effecttype}}<span>{{effecttype}}</span><br>{{/effecttype}}
{{#computed::dicepool}}<span class="dicepool">Dicepool: {{computed::dicepool}}</span><br>{{/computed::dicepool}}
{{#rollLess() wound 0}}<span>|</span><span data-i18n="wounds">Wounds</span> ({{wound}})<span>|</span>{{/rollLess() wound 0}}
{{#rollLess() mod 0}}<span>|</span><span data-i18n="modifier">Modifier</span> ({{mod}})<span>|</span>{{/rollLess() mod 0}}
{{#rollGreater() mod 0}}<span>|</span><span data-i18n="modifier">Modifier</span> ({{mod}})<span>|</span>{{/rollGreater() mod 0}}
{{#rollGreater() edge 0}}<span>|</span><span data-i18n="edge">Edge</span> ({{edge}})<span>|</span>{{/rollGreater() edge 0}}
{{#rollGreater() overclock 0}}<span>|</span><span data-i18n="overclock">Overclock</span> (2)<span>|</span>{{/rollGreater() overclock 0}}
{{#rollGreater() matrix_noise 0}}<span>|</span><span data-i18n="noise">Noise</span> (-{{matrix_noise}})<span>|</span>{{/rollGreater() matrix_noise 0}}
{{#rollGreater() combat_paralysis 0}}<span>|</span><span data-i18n="combat_paralysis">Combat Paralysis</span><span>|</span>{{/rollGreater() combat_paralysis 0}}
</div>
{{#rollGreater() computed::glitch 0}}
{{#rollLess() computed::glitch 2}}<div class="sheet-template-row red glitch"><span class="sheet-red">GLITCH!</span></div>{{/rollLess() computed::glitch 2}}
{{#rollGreater() computed::glitch 1}}<div class="sheet-template-row red glitch critglitch"><span class="sheet-red">CRITICAL GLITCH!</span></div>{{/rollGreater() computed::glitch 1}}
{{/rollGreater() computed::glitch 0}}
{{^split_pool}}
{{#dice}}
<div class="sheet-template-row">
<span style="width: 70%">Hits: <!-- {{dice}} => -->{{computed::dice}}</span>
</div>
{{/dice}}
{{/split_pool}}
{{#split_pool}}
<div class="sheet-template-row sheet-split">
<span class="glitchspan">
{{#rollGreater() computed::glitch1 0}}
{{#rollLess() computed::glitch1 2}}<div class="sheet-template-row red glitch"><span class="sheet-red">GLITCH!</span></div>{{/rollLess() computed::glitch1 2}}
{{#rollGreater() computed::glitch1 1}}<div class="sheet-template-row red glitch critglitch"><span class="sheet-red">CRITICAL GLITCH!</span></div>{{/rollGreater() computed::glitch1 1}}
{{/rollGreater() computed::glitch1 0}}
</span>
<span class="glitchspan">
{{#rollGreater() computed::glitch2 0}}
{{#rollLess() computed::glitch2 2}}<div class="sheet-template-row red glitch"><span class="sheet-red">GLITCH!</span></div>{{/rollLess() computed::glitch2 2}}
{{#rollGreater() computed::glitch2 1}}<div class="sheet-template-row red glitch critglitch"><span class="sheet-red">CRITICAL GLITCH!</span></div>{{/rollGreater() computed::glitch2 1}}
{{/rollGreater() computed::glitch2 0}}
</span>
<span style="width: 95%">
<span class="split_pool_dicepool nott">Dicepool {{computed::split_pool_dicepool_1}}</span><br>
<span class="split_pool_results">Atk 1: {{computed::roll1}}</span>
{{#rollGreater() wilddie1 0}}
<div class="sheet-template-row wilddice nott">{{wilddie1}} Wild Dice!<br>[{{computed::wilddie1_dice}}]</div>
{{/rollGreater() wilddie1 0}}
</span>
<span style="width: 95%">
<span class="split_pool_dicepool nott">Dicepool {{computed::split_pool_dicepool_2}}</span><br>
<span class="split_pool_results">Atk 2: {{computed::roll2}}</span>
{{#rollGreater() wilddie2 0}}
<div class="sheet-template-row wilddice nott">{{wilddie2}} Wild Dice!<br>[{{computed::wilddie2_dice}}]</div>
{{/rollGreater() wilddie2 0}}
</span>
</div>
{{/split_pool}}
{{#rollGreater() rerolls 0}}
<div class="sheet-template-row">
<span class="left" style="width: 30%; font-size:smaller;" class="sheet-template-desc">
<span title="Reroll Misses">{{#rollGreater() computed::misses 0}}[+](~{{header}}|reroll{{computed::misses}}){{/rollGreater() computed::misses 0}}</span>
<span title="Bump 4's to 5's">{{#rollGreater() computed::fours 0}}[+4s](~{{header}}|bump_fours{{computed::fours}}){{/rollGreater() computed::fours 0}}</span>
</span>
<span style="width: 40%; font-size: smaller;">Rerolls</span>
<span class="right" style="width: 30%; font-size: smaller;">&nbsp;{{#rollGreater() computed::hits 0}}<span title="Reroll Hits">[-](~{{header}}|reroll{{computed::hits}})</span>{{/rollGreater() computed::hits 0}}{{#rollLess() computed::hits 1}}<span title="Reroll Hits" style="cursor: not-allowed; pointer-events: none;">&nbsp;</span>{{/rollLess() computed::hits 1}}</span>
</div>
{{/rollGreater() rerolls 0}}
{{#extendedtest}}
<div class="sheet-template-row intervals-hitstotal">
<span style="padding-right: 5% !important" class="dicepool nott">Intervals: {{computed::intervals}}</span>
<span style="padding-left: 5% !important" class="nott">Total Hits: {{computed::hitstotal}}</span>
</div>
{{/extendedtest}}
{{#sprint}}<div class="sheet-template-row">Sprint: {{dice}} meters</div>{{/sprint}}
{{#initiative}}<div class="sheet-template-row">Initiative: <!-- {{initiative}} => --> {{computed::initiative}}</div>{{/initiative}}
{{#rollGreater() wilddie 0}}
<div class="sheet-template-row wilddice nott">{{wilddie}} Wild Dice!<br>[{{computed::wilddie_dice}}]</div>
{{/rollGreater() wilddie 0}}
{{#rating}}<div class="sheet-template-row">{{rating}}</div>{{/rating}}
{{#ampup}}{{#rollGreater() ampup 0}}
<div class="sheet-template-row">
<span class="sheet-template-desc nott">Amp Up: {{ampup}}</span>
</div>
{{/rollGreater() ampup 0}}{{/ampup}}
{{#drain}}{{#rollGreater() drain 0}}
<div class="sheet-template-row">
<span class="sheet-template-desc nott">Drain: {{drain}}</span>
</div>
{{/rollGreater() drain 0}}{{/drain}}
{{#increasearea}}{{#rollGreater() increasearea 0}}
<div class="sheet-template-row">
<span class="sheet-template-desc nott">Increase Area: {{increasearea}}m</span>
</div>
{{/rollGreater() increasearea 0}}{{/increasearea}}
{{#damagetype}}
<div class="sheet-template-row">
<span class="sheet-template-desc">Damage Type: {{damagetype}}</span>
</div>
{{/damagetype}}
{{#fade}}{{#rollGreater() fade 0}}
<div class="sheet-template-row">
<span class="sheet-template-desc nott">Fade: {{fade}}</span>
</div>
{{/rollGreater() fade 0}}{{/fade}}
{{#attackinfo}}
<div class="sheet-template-row">
<div class="sheet-weapon-info">
{{#melee}}<span class="sheet-tip sheet-weap-melee">
<span title="">Melee Attack</span>
</span>{{/melee}}
{{#damage}}<span class="sheet-tip sheet-weap-dv">
<span title="Damage Value (DV)">{{damage}}</span>
</span>{{/damage}}
{{#firingmode}}<span class="sheet-tip sheet-weap-mode">
<span title="Firing Mode">{{firingmode}}</span>
</span>{{/firingmode}}
{{#ammotype}}<span class="sheet-tip sheet-weap-ammo">
<span title="Ammo Type">{{ammotype}}</span>
</span>{{/ammotype}}
{{#ars}}<span class="sheet-tip sheet-weap-ars">
<span title="0-3m">{{arclose}}{{^arclose}}-{{/arclose}}</span> / <span title="4-50m">{{arnear}}{{^arnear}}-{{/arnear}}</span> / <span title="51-250m">{{armedium}}{{^armedium}}-{{/armedium}}</span> / <span title="251-500m">{{arfar}}{{^arfar}}-{{/arfar}}</span> / <span title="500+m">{{arextreme}}{{^arextreme}}-{{/arextreme}}</span>
</span>{{/ars}}
{{#skill}}<span class="sheet-tip sheet-weap-skill">
<span title="Skill">{{skill}}</span>
</span>{{/skill}}
{{#attribute}}<span class="sheet-tip sheet-weap-attr">
<span title="Attribute">{{attribute}}</span>
</span>{{/attribute}}
<span class="sheet-tip sheet-weap-spec">
{{#rollGreater() weapspec 0}}<span title="">Specialized</span>{{/rollGreater() weapspec 0}}
{{#rollGreater() weapexpert 0}}<span title="">Expertise</span>{{/rollGreater() weapexpert 0}}
</span>
</div>
</div>
{{/attackinfo}}
{{#npcattackinfo}}
<div class="sheet-template-row">
<div class="sheet-npcweapon-info">
{{#damage}}<span class="sheet-tip sheet-weap-dv">
<span title="Damage Value (DV)">{{damage}}</span>
</span>{{/damage}}
{{#melee}}<span class="sheet-tip sheet-weap-melee">
<span title="">Melee Attack</span>
</span>{{/melee}}
{{#firingmode}}<span class="sheet-tip sheet-weap-mode">
<span title="Firing Mode">{{firingmode}}</span>
</span>{{/firingmode}}
{{#ars}}<span class="sheet-tip sheet-weap-ars">
<span title="0-3m">{{arclose}}{{^arclose}}-{{/arclose}}</span> / <span title="4-50m">{{arnear}}{{^arnear}}-{{/arnear}}</span> / <span title="51-250m">{{armedium}}{{^armedium}}-{{/armedium}}</span> / <span title="251-500m">{{arfar}}{{^arfar}}-{{/arfar}}</span> / <span title="500+m">{{arextreme}}{{^arextreme}}-{{/arextreme}}</span>
</span>{{/ars}}
</div>
</div>
{{/npcattackinfo}}
{{#desc}}
<div class="sheet-template-row">
<span class="sheet-template-desc">{{desc}}</span>
</div>
{{/desc}}
{{#astralrep}}
<div class="sheet-template-row">
<span class="sheet-template-desc">Astral Reputation: {{astralrep}}</span>
</div>
{{/astralrep}}
{{#tip}}
<div class="sheet-template-row sheet-tip">
<span class="sheet-tip">{{tip}}</span>
</div>
{{/tip}}
{{#extendedtest}}
<div class="sheet-template-row">
{{#rollGreater() computed::dicepool 1}}
<span class="sheet-template-desc nott">[Next Roll](~{{header}}|extended_next||{{computed::passthrough}},{{reason}}) {{newdicepool}} dice</span>
{{/rollGreater() computed::dicepool 1}}
{{#rollLess() computed::dicepool 2}}
<span class="sheet-template-desc">**Dicepool Exhausted**</span>
{{/rollLess() computed::dicepool 2}}
</div>
{{/extendedtest}}
{{#opp}}<div class="sheet-template-row">{{opp}}</div>{{/opp}}
</div>
</rolltemplate>
</div>
<input type="hidden" name="attr_wounds" value="0" />
<input type="hidden" name="attr_explode_toggle" value="" />
<input type="hidden" name="attr_attribute_roll" value="" />
<input type="hidden" name="attr_armor_name" value="select a Primary in Arms">
<input type="hidden" name="attr_soak" value="3" />
<input type="hidden" name="attr_armor" value="3" />
<input type="hidden" name="attr_chem_protection" value="3" />
<input type="hidden" name="attr_cold_protection" value="3" />
<input type="hidden" name="attr_elec_protection" value="3" />
<input type="hidden" name="attr_fire_protection" value="3" />
<input type="hidden" name="attr_radiation_protection" value="3" />
<input type="hidden" name="attr_primary_range_weapon" value="select a Primary in Arms" />
<input type="hidden" name="attr_primary_range_weapon_skill" />
<input type="hidden" name="attr_primary_range_weapon_damage" />
<input type="hidden" name="attr_primary_range_weapon_damage_mod" />
<input type="hidden" name="attr_primary_range_weapon_near_mod" />
<input type="hidden" name="attr_primary_range_weapon_close_mod" />
<input type="hidden" name="attr_primary_range_weapon_medium_mod" />
<input type="hidden" name="attr_primary_range_weapon_far_mod" />
<input type="hidden" name="attr_primary_range_weapon_extreme_mod" />
<input type="hidden" name="attr_primary_range_weapon_dicepool" />
<input type="hidden" name="attr_primary_range_weapon_dicepool_mod" value="0" />
<input type="hidden" name="attr_primary_range_weapon_spec" />
<input type="hidden" name="attr_primary_range_weapon_expert" />
<input type="hidden" name="attr_primary_range_weapon_ammo" />
<input type="hidden" name="attr_full_auto_penalty_mod" />
<input type="hidden" name="attr_burst_fire_penalty_mod" />
<input type="hidden" name="attr_burst_wide_penalty_mod" />
<input type="hidden" name="attr_semi_auto_penalty_mod" />
<input type="hidden" name="attr_single_shot_penalty_mod" />
<input type="hidden" name="attr_shots_fired" value="1" />
<input type="hidden" name="attr_primary_melee_weapon" value="select a Primary in Arms" />
<input type="hidden" name="attr_primary_melee_weapon_skill" />
<input type="hidden" name="attr_primary_melee_weapon_damage" />
<input type="hidden" name="attr_primary_melee_weapon_dicepool" />
<input type="hidden" name="attr_primary_melee_weapon_reach" />
<input type="hidden" name="attr_aug_essence_cost" value="0" />
<input type="hidden" name="attr_initiative_mod" value="0" />
<input type="hidden" name="attr_initiative_dice" value="1" />
<input type="hidden" name="attr_astral_mod" value="6" />
<input type="hidden" name="attr_astral_dice" value="2" />
<input type="hidden" name="attr_matrix_mod" value="0" />
<input type="hidden" name="attr_matrix_dice" />
<input type="hidden" name="attr_matrix_initiative_dice_mod" value="0" />
<input type="hidden" name="attr_cold_sim_mod" value="0" />
<input type="hidden" name="attr_cold_sim_dice" />
<input type="hidden" name="attr_cold_sim_initiative_dice_mod" value="0" />
<input type="hidden" name="attr_hot_sim_mod" value="0" />
<input type="hidden" name="attr_hot_sim_dice" />
<input type="hidden" name="attr_hot_sim_initiative_dice_mod" value="0" />
<input type="hidden" name="attr_walk" value="12" />
<input type="hidden" name="attr_run" value="24" />
<input type="hidden" name="attr_physical" value="10" />
<input type="hidden" name="attr_stun" value="10" />
<input type="hidden" name="attr_physical_max" value="10" />
<input type="hidden" name="attr_stun_max" value="10" />
<input type="hidden" name="attr_matrix" value="10" />
<input type="hidden" name="attr_matrix_max" value="10" />
<input type="hidden" name="attr_defense" value="6" />
<input type="hidden" name="attr_combat_paralysis" value="0" />
<input type="hidden" name="attr_combat_paralysis_initiative_mod" value="" />
<input type="hidden" name="attr_bad_luck" value="0" />
<input type="hidden" name="attr_matrix_overclock" value="0" />
<input type="hidden" name="attr_rerolls" value="0" />
<input type="hidden" name="attr_phys_wound_threshold" value="3" />
<input type="hidden" name="attr_stun_wound_threshold" value="3" />
<input type="hidden" name="attr_resist_pain" value="0" />
<input type="hidden" name="attr_damage_compensator" value="0" />
<input type="hidden" name="attr_rerolls" value="1" />
<input type="hidden" name="attr_tradition_attribute" value="" />
<input type="hidden" name="attr_wild_die1" value="0" />
<input type="hidden" name="attr_wild_die2" value="0" />
<input type="hidden" name="attr_spellcasting_specialist" value="0" />
<input type="hidden" name="attr_spellcasting_expert" value="0" />
<input type="hidden" name="attr_universal_dicepool_adjustment" value="0" />
<input type="hidden" name="attr_astral" value="-1" />
<input type="hidden" name="attr_athletics" value="-1" />
<input type="hidden" name="attr_biotech" value="-1" />
<input type="hidden" name="attr_closecombat" value="-1" />
<input type="hidden" name="attr_con" value="-1" />
<input type="hidden" name="attr_conjuring" value="-1" />
<input type="hidden" name="attr_cracking" value="-1" />
<input type="hidden" name="attr_electronics" value="-1" />
<input type="hidden" name="attr_enchanting" value="-1" />
<input type="hidden" name="attr_engineering" value="-1" />
<input type="hidden" name="attr_exoticweapons" value="-1" />
<input type="hidden" name="attr_firearms" value="-1" />
<input type="hidden" name="attr_influence" value="-1" />
<input type="hidden" name="attr_outdoors" value="-1" />
<input type="hidden" name="attr_perception" value="-1" />
<input type="hidden" name="attr_piloting" value="-1" />
<input type="hidden" name="attr_sorcery" value="-1" />
<input type="hidden" name="attr_stealth" value="-1" />
<input type="hidden" name="attr_tasking" value="-1" />
<input type="hidden" name="attr_sheet_version" value="0.88">
<input type="hidden" name="attr_data_version" value="0">
<script type="text/worker">
// Sheet workers
// Data conversion for changes between sheet versions
on("sheet:opened", function() {
console.log("Sheet Opened!");
getAttrs(['sheet_type', 'sheet_version', 'data_version'], (v) => {
if(! v['sheet_version'] || ! v['sheet_type'] || ! v['data_version']) {
console.log(`%c Shadowrun 6th World Unable to load`, "color: red; font-weight: bold");
}
console.log(`%c Shadowrun 6th World v${v['sheet_version']}`, "color: blue; font-weight:bold");
console.log(`%c Sheet Type: ${v['sheet_type']}`, "color: red; font-weight:bold");
console.log(`%c Data Version: v${v['data_version']}`, "color: black; font-weight:bold");
if(v.sheet_version != v.data_version) {
console.log("Sheet ("+v.sheet_version+") and Data ("+v.data_version+") version mismatch, updating...");
switch(true) {
case (v.data_version == 0):
// fixed broken soak values
update_common_rolls(["body", "soak_modifier", "soak_temp", `soak_temp_flag`]);
['body', 'agility', 'reaction', 'strength', 'willpower', 'logic', 'intuition', 'charisma', 'magic', 'resonance'].forEach(attr => {
update_attributes(attr);
});
update_essence();
techno_update();
update_initiative();
update_astral_initiative();
update_matrix_initiative();
sprite_update();
case (v.data_version < 0.37):
_pre_v37_update();
console.log("Data now fits v.37");
case (v.data_version < 0.38):
_v38_update();
console.log("Data now fits v.38");
case (v.data_version < 0.39):
_v39_update();
console.log("Data now fits v.39");
case (v.data_version < 0.41):
_v41_update();
console.log("Data now fits v.42");
case (v.data_version < 0.54):
_v53_update();
console.log("Data now fits v.54");
case (v.data_version < 0.56):
_v56_update();
console.log("Data now fits v.56");
case (v.data_version < 0.57):
_v57_update();
console.log("Data now fits v.57");
show_changelog();
case (v.data_version < 0.58):
_v58_update();
console.log("Data now fits v.58");
case (v.data_version < 0.59):
_v58_update();
_v59_update();
console.log("Data now fits v.59");
case (v.data_version < 0.60):
_v60_update();
console.log("Data now fits v.60");
case (v.data_version < 0.65):
_v65_update();
console.log("Data now fits v.65");
case (v.data_version < 0.71):
_v71_update();
console.log("Data now fits v.71");
show_changelog();
case (v.data_version < 0.72):
_v72_update();
console.log("Data now fits v.72");
case (v.data_version < 0.77):
_v77_update();
console.log("Data now fits v.77");
case (v.data_version < 0.80):
_v80_update();
console.log("Data now fits v.80");
case (v.data_version < 0.81):
_v81_update();
console.log("Data now fits v.81");
case (v.data_version < 0.84):
_v84_update();
show_changelog();
console.log("Data now fits v.84");
default:
setAttrs({
'data_version': v.sheet_version
});
break;
}
console.log("Done.");
}
});
});
var show_changelog = () => {
// Force the PC sheets to the changelog section to see the latest updates
setAttrs({
'tab': 'notes',
'notes_toggle': 'changelog'
});
};
var _v84_update = () => {
// set the new attr_skill values
update_skill_ratings();
show_changelog();
};
var _v81_update = () => {
getAttrs(["sheet_type"], (v) => {
if(v.sheet_type == 'spirit') {
setAttrs({
flag_special: 'magic'
});
}
});
};
var _v80_update = () => {
getAttrs(["sheet_type", "defense_rating", "armor_rating"], (v) => {
if(v.sheet_type == 'pc') {
if(v.armor_rating && (! v.defense_rating || v.defense_rating == 0)) {
setAttrs({
defense_rating: v.armor_rating
});
}
}
});
};
var _v77_update = () => {
getAttrs(["sheet_type"], (v) => {
if(v.sheet_type == 'grunt' || v.sheet_type == 'spirit' || v.sheet_type == 'vehicle') {
// set the new repeating melee and repeating ranged dicepool_base attribute to dicepool - dicepool_modifier
getSectionIDs('repeating_range', (ids) => {
ids.forEach((row_id) => {
getAttrs([`repeating_range_${row_id}_dicepool_base`, `repeating_range_${row_id}_dicepool`, `repeating_range_${row_id}_dicepool_modifier`], (v) => {
setAttrs({
[`repeating_range_${row_id}_dicepool_base`]: parseInt(v[`repeating_range_${row_id}_dicepool`]) - parseInt(v[`repeating_range_${row_id}_dicepool_modifier`])
}, {silent: true});
});
});
});
getSectionIDs('repeating_melee', (ids) => {
ids.forEach((row_id) => {
getAttrs([`repeating_melee_${row_id}_dicepool_base`, `repeating_melee_${row_id}_dicepool`, `repeating_melee_${row_id}_dicepool_modifier`], (v) => {
setAttrs({
[`repeating_melee_${row_id}_dicepool_base`]: parseInt(v[`repeating_melee_${row_id}_dicepool`]) - parseInt(v[`repeating_melee_${row_id}_dicepool_modifier`])
}, {silent: true});
});
});
});
}
});
};
var _v72_update = () => {
getAttrs(["sheet_type"], (v) => {
if(v.sheet_type == 'grunt' || v.sheet_type == 'spirit') {
// We need to rename the repeating spells for npcs and move all of their data
getSectionIDs('repeating_npcspell', (spell_IDs) => {
let usedSpellIDs = [];
spell_IDs.forEach((spellID) => {
let newSpellID = generateRowID();
while(newSpellID in usedSpellIDs) {
newSpellID = generateRowID();
}
usedSpellIDs.push(newSpellID);
let newSpell = {};
let npc_attrs = [];
let attr_list = ["name", "dicepool", "type", "range", "duration", "drain", "category", "effect_type", "damage", "notes", "display_flag", "flag"];
attr_list.forEach((attr) => {
npc_attrs.push(`repeating_npcspell_${spellID}_${attr}`);
});
getAttrs(npc_attrs, (npcspell) => {
toUpdate = {};
attr_list.forEach((attr) => {
toUpdate[`repeating_spell_${newSpellID}_${attr}`] = npcspell[`repeating_npcspell_${spellID}_${attr}`] || '';
});
setAttrs(toUpdate, {silent: true});
});
});
});
}
// we need to rename the npc complex forms section and move the data over
if(v.sheet_type == 'grunt') {
getSectionIDs('repeating_form', (form_IDs) => {
let usedformIDs = [];
form_IDs.forEach((formID) => {
let newformID = generateRowID();
while(newformID in usedformIDs) {
newformID = generateRowID();
}
usedformIDs.push(newformID);
let newform = {};
let npc_attrs = [];
let attr_list = ["dice", "name", "duration", "fade", "notes", "skill", "spec", "expert"];
attr_list.forEach((attr) => {
npc_attrs.push(`repeating_form_${formID}_${attr}`);
});
getAttrs(npc_attrs, (form) => {
toUpdate = {};
attr_list.forEach((attr) => {
toUpdate[`repeating_forms_${newformID}_${attr}`] = form[`repeating_form_${formID}_${attr}`] || '';
});
setAttrs(toUpdate, {silent: true});
});
});
});
}
});
};
var _v71_update = () => {
getAttrs(["sheet_type", "device_rating"], (v) => {
// update npc skill specializations and expertise to match spec/expert like PCs use
if(v.sheet_type != 'pc') {
getSectionIDs('repeating_skills', (rows) => {
rows.forEach((row) => {
var skillRow = 'repeating_skills_' + row;
getAttrs([`${skillRow}_specialization`, `${skillRow}_expertise`], (v) => {
let toUpdate = {};
if(v[`${skillRow}_specialization`]) {
toUpdate[`${skillRow}_spec`] = v[`${skillRow}_specialization`];
}
if(v[`${skillRow}_expertise`]) {
toUpdate[`${skillRow}_expert`] = v[`${skillRow}_expertise`];
}
setAttrs(toUpdate);
});
});
});
// Update npc sheets to use matrix_device_rating instead of device_rating
if(v.device_rating) {
setAttrs({
matrix_device_rating: v.device_rating
});
}
}
});
// Update sprite, host, vehicle sheets to remove meat space attributes so matrix defense buttons work right
getAttrs(["sheet_type", "body", "agility", "reaction", "strength", "willpower", "logic", "intuition", "charisma"], (v) => {
if(v.sheet_type == 'sprite' || v.sheet_type == 'host') {
setAttrs({
body: 0,
agility: 0,
reaction: 0,
strength: 0,
willpower: 0,
logic: 0,
intuition: 0,
charisma: 0
});
}
if(v.sheet_type == 'vehicle') {
setAttrs({
agility: 0,
reaction: 0,
strength: 0,
willpower: 0,
logic: 0,
intuition: 0,
charisma: 0
});
}
});
// Update npc sheets repeating spells to display the correct value for "Type"
getAttrs(["sheet_type"], (sheet) => {
if(sheet.sheet_type != 'pc') {
getSectionIDs('repeating_npcspell', (spells) => {
spells.forEach((spell) => {
var spellID = 'repeating_npcspell_' + spell;
getAttrs([`${spellID}_type`, `${spellID}_damage`, `${spellID}_category`], (v) => {
if(v[`${spellID}_category`] != 'Combat') {
v[`${spellID}_damage`] = '';
}
setAttrs({
[`${spellID}_type`]: v[`${spellID}_type`].charAt(0).toUpperCase(),
[`${spellID}_damage`]: v[`${spellID}_damage`]
});
});
});
});
}
});
// Update repeating augmentations to preserve legacy data.
getSectionIDs("augmentations", (ids) => {
// If there are no augmentations it was likely triggered by a deletion, need to reset aug_essence_cost to 0
ids.forEach((id) => {
getAttrs([`repeating_augmentations_${id}_essence_cost`, `repeating_augmentations_${id}_essence_base`], (aug_ess) => {
let toUpdate = {};
if(aug_ess[`repeating_augmentations_${id}_essence_cost`]) {
toUpdate[`repeating_augmentations_${id}_essence_base`] = aug_ess[`repeating_augmentations_${id}_essence_cost`];
}
toUpdate[`repeating_augmentations_${id}_essence_cost_raw`] = 1;
// set the changes
setAttrs(toUpdate);
});
});
});
};
var _v65_update = () => {
// Define new field repeating_skills_display_name
getSectionIDs('repeating_skills', (rows) => {
rows.forEach((row) => {
var skillRow = 'repeating_skills_' + row + '_name';
getAttrs([skillRow], (v) => {
var skill_name_simplified = v[skillRow].toLowerCase().replace(/\s/g, '');
var skill_name_translated = getTranslationByKey(skill_name_simplified);
setAttrs({
[`repeating_skills_${row}_display_name`]: skill_name_translated
});
});
});
});
};
var _v60_update = () => {
// Update attr_cracking to reflect the correct value
getSectionIDs('repeating_skills', (rows) => {
rows.forEach((row) => {
getAttrs([`repeating_skills_${row}_name`, `repeating_skills_${row}_rating`], (v) => {
if(v[`repeating_skills_${row}_name`] == 'Cracking') {
skillName = v[`repeating_skills_${row}_name`];
setAttrs({
[`${skillName}`]: v[`repeating_skills_${row}_rating`]
});
}
});
});
});
};
var _v59_update = () => {
getAttrs(['character_name'], (v) => {
console.log(v);
set_display_name(v.character_name);
});
};
var _v58_update = () => {
setAttrs({
wild_die1: "?{Wild Dice for First Roll?|0}",
wild_die2: "?{Wild Dice for Second Roll?|0}"
});
};
var _v57_update = () => {
// Update the tradition_attribute if they're awakened and it hasn't been set. Also update Magic AR as well.
getAttrs(['flag_special', 'tradition_attribute', 'tradition', 'magic', 'magic_ar', 'logic', 'intuition', 'charisma'], (v) => {
if(v.flag_special == 'magic' && ! v.tradition_attribute) {
var magic_ar = v.magic || 0;
// make a default tradition attribute (Shaman of course!)
tradition_attribute = 'Charisma';
switch(v.tradition) {
case "Hermeticism":
case "Hermeticism (Logic)":
case "Shamanism (Logic)":
magic_ar += v.logic;
tradition_attribute = 'Logic';
break;
case "Hermeticism (Intuition)":
case "Shamanism (Intuition)":
magic_ar += v.intuition;
tradition_attribute = 'Intuition';
break;
case "Hermeticism (Charisma)":
case "Shamanism (Charisma)":
case "Shamanism":
magic_ar += v.charisma;
tradition_attribute = 'Charisma';
break;
default:
magic_ar = 0;
break;
}
setAttrs({
'magic_ar': magic_ar,
'tradition_attribute': tradition_attribute
});
}
});
};
var _v56_update = () => {
// Update repeating_augmentations_augmentation to be repeating_augmentations_name
getSectionIDs('repeating_augmentations', (rows) => {
rows.forEach((row) => {
getAttrs([`repeating_augmentations_${row}_augmentation`, `repeating_augmentations_${row}_augmentation`], (v) => {
if(! v[`repeating_augmentations_${row}_name`] && v[`repeating_augmentations_${row}_augmentation`]) {
setAttrs({
[`repeating_augmentations_${row}_name`]: v[`repeating_augmentations_${row}_augmentation`],
[`repeating_augmentations_${row}_augmentation`]: ''
});
}
});
});
});
// Update repeating_devices_device to be repeating_devices_name
getSectionIDs('repeating_devices', (rows) => {
rows.forEach((row) => {
getAttrs([`repeating_devices_${row}_device`, `repeating_devices_${row}_name`], (v) => {
if(! v[`repeating_devices_${row}_name`] && v[`repeating_devices_${row}_device`]) {
setAttrs({
[`repeating_devices_${row}_name`]: v[`repeating_devices_${row}_device`],
[`repeating_devices_${row}_device`]: ''
});
}
});
});
});
// Update repeating_programs_program to be repeating_programs_name
getSectionIDs('repeating_programs', (rows) => {
rows.forEach((row) => {
getAttrs([`repeating_programs_${row}_program`, `repeating_programs_${row}_name`], (v) => {
if(! v[`repeating_programs_${row}_name`] && v[`repeating_programs_${row}_program`]) {
setAttrs({
[`repeating_programs_${row}_name`]: v[`repeating_programs_${row}_program`],
[`repeating_programs_${row}_program`]: ''
});
}
});
});
});
// Update repeating_echoes_echo to be repeating_echoes_name
getSectionIDs('repeating_echoes', (rows) => {
rows.forEach((row) => {
getAttrs([`repeating_echoes_${row}_echo`, `repeating_echoes_${row}_name`], (v) => {
if(! v[`repeating_echoes_${row}_name`] && v[`repeating_echoes_${row}_echo`]) {
setAttrs({
[`repeating_echoes_${row}_name`]: v[`repeating_echoes_${row}_echo`],
[`repeating_echoes_${row}_echo`]: ''
});
}
});
});
});
// Update repeating_IC_IC_* to be repeating_IC_*
getSectionIDs('repeating_IC', (rows) => {
rows.forEach((row) => {
['name', 'dice', 'ar', 'cm', 'init', 'initdice', 'attribute', 'matrix'].forEach((attr) => {
getAttrs([`repeating_IC_${row}_IC_${attr}`, `repeating_IC_${row}_${attr}`], (v) => {
if(! v[`repeating_IC_${row}_${attr}`] && v[`repeating_IC_${row}_IC_${attr}`]) {
setAttrs({
[`repeating_IC_${row}_${attr}`]: v[`repeating_IC_${row}_IC_${attr}`],
[`repeating_IC_${row}_IC_${attr}`]: ''
});
}
});
});
});
});
// Update repeating_quality_quality to be repeating_quality_name
getSectionIDs('repeating_quality', (rows) => {
rows.forEach((row) => {
getAttrs([`repeating_quality_${row}_quality`, `repeating_quality_${row}_name`], (v) => {
if(! v[`repeating_quality_${row}_name`] && v[`repeating_quality_${row}_quality`]) {
setAttrs({
[`repeating_quality_${row}_name`]: v[`repeating_quality_${row}_quality`],
[`repeating_quality_${row}_quality`]: ''
});
}
});
});
});
// Update repeating_items_item to be repeating_items_name
getSectionIDs('repeating_items', (rows) => {
rows.forEach((row) => {
getAttrs([`repeating_items_${row}_item`, `repeating_items_${row}_name`], (v) => {
if(! v[`repeating_items_${row}_name`] && v[`repeating_items_${row}_item`]) {
setAttrs({
[`repeating_items_${row}_name`]: v[`repeating_items_${row}_item`],
[`repeating_items_${row}_item`]: ''
});
}
});
});
});
// Update repeating_melee_weapon to be repeating_melee_name
getSectionIDs('repeating_melee', (rows) => {
rows.forEach((row) => {
getAttrs([`repeating_melee_${row}_weapon`, `repeating_melee_${row}_name`], (v) => {
if(! v[`repeating_melee_${row}_name`] && v[`repeating_melee_${row}_weapon`]) {
setAttrs({
[`repeating_melee_${row}_name`]: v[`repeating_melee_${row}_weapon`],
[`repeating_melee_${row}_weapon`]: ''
});
}
});
});
});
// Update repeating_range_weapon to be repeating_range_name
getSectionIDs('repeating_range', (rows) => {
rows.forEach((row) => {
getAttrs([`repeating_range_${row}_weapon`, `repeating_range_${row}_name`], (v) => {
if(! v[`repeating_range_${row}_name`] && v[`repeating_range_${row}_weapon`]) {
setAttrs({
[`repeating_range_${row}_name`]: v[`repeating_range_${row}_weapon`],
[`repeating_range_${row}_weapon`]: ''
});
}
});
});
});
// Update repeating_grenade_weapon to be repeating_grenade_name
getSectionIDs('repeating_grenade', (rows) => {
rows.forEach((row) => {
getAttrs([`repeating_grenade_${row}_weapon`, `repeating_grenade_${row}_name`], (v) => {
if(! v[`repeating_grenade_${row}_name`] && v[`repeating_grenade_${row}_weapon`]) {
setAttrs({
[`repeating_grenade_${row}_name`]: v[`repeating_grenade_${row}_weapon`],
[`repeating_grenade_${row}_weapon`]: ''
});
}
});
});
});
};
var _v53_update = () => {
// Update repeating_IC_IC_note to be repeating_IC_notes
getSectionIDs('repeating_IC', (ICRows) => {
ICRows.forEach((row) => {
getAttrs([`repeating_IC_${row}_IC_note`], (v) => {
setAttrs({
[`repeating_IC_${row}_notes`]: v[`repeating_IC_${row}_IC_note`],
[`repeating_IC_${row}_IC_note`]: ''
});
});
});
});
};
var _v41_update = () => {
// Update repeating_skills_${x}_attribute and _display_attribute
getSectionIDs('repeating_skills', (skillRows) => {
skillRows.forEach((row) => {
getAttrs([`repeating_skills_${row}_name`], (v) => {
update_skill_attribute(`repeating_skills_${row}`, v[`repeating_skills_${row}_name`]);
});
});
});
};
var _v39_update = () => {
// this section updates the AR values that were set for attr_close - attr_extreme to be the value for the previously undefined attr_close_base - attr_extreme_base
['range', 'melee'].forEach((type) => {
getSectionIDs(`repeating_${type}`, (sections) => {
sections.forEach((section) => {
[`repeating_${type}_${section}_close`, `repeating_${type}_${section}_near`, `repeating_${type}_${section}_medium`, `repeating_${type}_${section}_far`, `repeating_${type}_${section}_extreme`, `repeating_${type}_${section}_dicepool`, `repeating_${type}_${section}_damage`, 'sheet_type'].forEach((attr) => {
getAttrs([`${attr}`], (v) => {
setAttrs({
[`${attr}_base`]: v[`${attr}`]
});
});
});
});
});
});
};
var _v38_update = () => {
getAttrs(['sheet_type'], (v) => {
if(v.sheet_type === 'grunt') {
// Grunt skills somehow ended up thinking they were all based on agility at least for the display part and for many apparently the actual selected attribute.
// this code just sets them to their default associated attribute which should annoy the fewest users.
getSectionIDs('repeating_skills', (skill) => {
skill.forEach((skillID) => {
getAttrs([`repeating_skills_${skillID}_attribute`, `repeating_skills_${skillID}_display_attribute`, `repeating_skills_${skillID}_name`], (attrs) => {
var attribute;
switch(attrs[`repeating_skills_${skillID}_name`]) {
case 'Athletics':
case 'Close Combat':
case 'Exotic Weapons':
case 'Firearms':
case 'Stealth':
attribute = 'Agility';
break;
case 'Con':
case 'Influence':
attribute = 'Charisma';
break;
case 'Astral':
case 'Outdoors':
case 'Perception':
attribute = 'Intuition';
break;
case 'Biotech':
case 'Cracking':
case 'Electronics':
case 'Engineering':
attribute = 'Logic';
break;
case 'Conjuring':
case 'Enchanting':
case 'Sorcery':
attribute = 'Magic';
break;
case 'Piloting':
attribute = 'Reaction';
break;
case 'Tasking':
attribute = 'Resonance';
break;
default:
attribute = 'Agility';
break;
}
setAttrs({
[`repeating_skills_${skillID}_attribute`]: '@{'+attribute.toLowerCase()+'}',
[`repeating_skills_${skillID}_display_attribute`]: attribute
});
});
});
});
}
});
}
var _pre_v37_update = () => {
// Update trigger sheetworkers for weapons to set attribute and attr_rating values
['melee', 'range'].forEach((type) => {
getSectionIDs(`${type}`, function(ids) {
for(var i = 0; i < ids.length; i++) {
let skill = `repeating_${type}_` + ids[i] + "_skill";
let attr = `repeating_${type}_` + ids[i] + "_attribute";
let rating = `repeating_${type}_` + ids[i] + "_attr_rating";
let prim = `repeating_${type}_` + ids[i] + "_primary";
let updme = `repeating_${type}_` + ids[i] + "_updateme";
getAttrs([skill, prim, 'agility', 'logic', `primary_${type}_weapon_dicepool_modifier`], (v) => {
var attribute = 'Agility';
var attr_rating = v.agility;
switch(v[`${skill}`]) {
case 'engineering':
attribute = 'Logic';
attr_rating = v.logic;
break;
case 'athletics':
case 'close combat':
case 'exotic weapons':
case 'firearms':
default:
attribute = 'Agility';
attr_rating = v.agility;
break;
}
setAttrs({
[attr]: attribute,
[rating]: attr_rating
});
if(v[`${prim}`] === "primary") {
var dpm = v[`primary_${type}_weapon_dicepool_modifier`] || 0;
setAttrs({
[`primary_${type}_weapon_attribute`]: attribute,
[`primary_${type}_weapon_attr_rating`]: attr_rating,
[`primary_${type}_weapon_dicepool_modifier`]: dpm,
[`${updme}`]: ".37"
});
}
});
}
});
});
}
/******************************************************************/
/* Notes Imports */
/* Allows changes to "notes" fields to act as a pseudo-importer */
/******************************************************************/
const repeating_sections = ['spell', 'npcspell', 'augmentations',
'quality', 'IC', 'range', 'melee',
'grenade', 'contacts', 'vehicle',
'devices', 'programs', 'preparations',
'ritual', 'spirits', 'powers',
'metamagic', 'forms', 'echoes', 'sprites',
'items', 'armor', 'skills', 'knowledges', 'effects', 'range-weapon-mods'];
repeating_sections.forEach((section) => {
on(`change:repeating_${section}:notes`, (eventInfo) => {
if(eventInfo.sourceType != 'player') {
return;
}
console.log("notes changed, looking for an import");
console.log(eventInfo);
var rep_row = eventInfo.sourceAttribute.match(/(repeating_[^_]+?)_([^_]+?)_(.+)/);
var note = eventInfo.newValue;
var dat = {};
if(typeof(note) !== 'undefined' && note.search("JSON=") == 0) {
note = note.slice(5);
dat = JSON.parse(note);
toSave = {};
Object.keys(dat).forEach(k => {
toSave[`${rep_row[1]}_${rep_row[2]}_${k}`] = dat[k];
});
setAttrs(toSave);
}
});
});
/*************************************************************
* Post Roll Processing *
*************************************************************/
// Roll Button Definitions
const rollButtons = {
d6: "@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=?{Roll Reason?|d6}}}{{dice=[[(?{d6s|0}d6>5cs>5cf<[[(1+@{bad_luck})]]?{Exploding 6s?|N, |Y,!})]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=@{rerolls}}}{{header=@{character_name}}}",
bump_fours: "@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{bump4s}}}{{desc=Bumping ?{How many?|-#-} fours to fives.\n+?{How many?} hits,\n-[[?{How many?} * 2]] Edge}}",
reroll: "@{gm_toggle} &{template:rolls-computed}{{dice=[[(?{Reroll how many?|-#-}d6>5cs>5cf<[[(1+@{bad_luck})]])]]}}{{dicepool=[[0]]}}{{header=@{character_name}}}{{base=^{rerolling} ?{Reroll how many?|-#-} ^{dice}}}",
body: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{dice=[[(@{body}+[[?{Attribute|None,0 [None]|Custom,?{Dice?&#124;0&#125; [Custom]|Body,@{body} [Body]|Agility,@{agility} [Agility]|Reaction,@{reaction} [Reaction]|Strength,@{strength} [Strength]|Willpower,@{willpower} [Willpower]|Logic,@{logic} [Logic]|Intuition,@{intuition} [Intuition]|Charisma,@{charisma} [Charisma]|Edge,@{edge} [Edge]|Magic,@{magic} [Magic]|Resonance,@{resonance} [Resonance]}]]+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{base=^{body} + ?{Attribute}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
agility: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{dice=[[(@{agility}+[[?{Attribute|None,0 [None]|Custom,?{Dice?&#124;0&#125; [Custom]|Body,@{body} [Body]|Agility,@{agility} [Agility]|Reaction,@{reaction} [Reaction]|Strength,@{strength} [Strength]|Willpower,@{willpower} [Willpower]|Logic,@{logic} [Logic]|Intuition,@{intuition} [Intuition]|Charisma,@{charisma} [Charisma]|Edge,@{edge} [Edge]|Magic,@{magic} [Magic]|Resonance,@{resonance} [Resonance]}]]+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{base=^{agility} + ?{Attribute}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
reaction: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{dice=[[(@{reaction}+[[?{Attribute|None,0 [None]|Custom,?{Dice?&#124;0&#125; [Custom]|Body,@{body} [Body]|Agility,@{agility} [Agility]|Reaction,@{reaction} [Reaction]|Strength,@{strength} [Strength]|Willpower,@{willpower} [Willpower]|Logic,@{logic} [Logic]|Intuition,@{intuition} [Intuition]|Charisma,@{charisma} [Charisma]|Edge,@{edge} [Edge]|Magic,@{magic} [Magic]|Resonance,@{resonance} [Resonance]}]]+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{base=^{reaction} + ?{Attribute}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
strength: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{dice=[[(@{strength}+[[?{Attribute|None,0 [None]|Custom,?{Dice?&#124;0&#125; [Custom]|Body,@{body} [Body]|Agility,@{agility} [Agility]|Reaction,@{reaction} [Reaction]|Strength,@{strength} [Strength]|Willpower,@{willpower} [Willpower]|Logic,@{logic} [Logic]|Intuition,@{intuition} [Intuition]|Charisma,@{charisma} [Charisma]|Edge,@{edge} [Edge]|Magic,@{magic} [Magic]|Resonance,@{resonance} [Resonance]}]]+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{base=^{strength} + ?{Attribute}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
willpower: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{dice=[[(@{willpower}+[[?{Attribute|None,0 [None]|Custom,?{Dice?&#124;0&#125; [Custom]|Body,@{body} [Body]|Agility,@{agility} [Agility]|Reaction,@{reaction} [Reaction]|Strength,@{strength} [Strength]|Willpower,@{willpower} [Willpower]|Logic,@{logic} [Logic]|Intuition,@{intuition} [Intuition]|Charisma,@{charisma} [Charisma]|Edge,@{edge} [Edge]|Magic,@{magic} [Magic]|Resonance,@{resonance} [Resonance]}]]+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{base=^{willpower} + ?{Attribute}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
logic: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{dice=[[(@{logic}+[[?{Attribute|None,0 [None]|Custom,?{Dice?&#124;0&#125; [Custom]|Body,@{body} [Body]|Agility,@{agility} [Agility]|Reaction,@{reaction} [Reaction]|Strength,@{strength} [Strength]|Willpower,@{willpower} [Willpower]|Logic,@{logic} [Logic]|Intuition,@{intuition} [Intuition]|Charisma,@{charisma} [Charisma]|Edge,@{edge} [Edge]|Magic,@{magic} [Magic]|Resonance,@{resonance} [Resonance]}]]+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{base=^{logic} + ?{Attribute}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
intuition: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{dice=[[(@{intuition}+[[?{Attribute|None,0 [None]|Custom,?{Dice?&#124;0&#125; [Custom]|Body,@{body} [Body]|Agility,@{agility} [Agility]|Reaction,@{reaction} [Reaction]|Strength,@{strength} [Strength]|Willpower,@{willpower} [Willpower]|Logic,@{logic} [Logic]|Intuition,@{intuition} [Intuition]|Charisma,@{charisma} [Charisma]|Edge,@{edge} [Edge]|Magic,@{magic} [Magic]|Resonance,@{resonance} [Resonance]}]]+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{base=^{intuition} + ?{Attribute}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
charisma: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{dice=[[(@{charisma}+[[?{Attribute|None,0 [None]|Custom,?{Dice?&#124;0&#125; [Custom]|Body,@{body} [Body]|Agility,@{agility} [Agility]|Reaction,@{reaction} [Reaction]|Strength,@{strength} [Strength]|Willpower,@{willpower} [Willpower]|Logic,@{logic} [Logic]|Intuition,@{intuition} [Intuition]|Charisma,@{charisma} [Charisma]|Edge,@{edge} [Edge]|Magic,@{magic} [Magic]|Resonance,@{resonance} [Resonance]}]]+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{base=^{charisma} + ?{Attribute}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
edge: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{dice=[[(@{edge}+[[?{Attribute|None,0 [None]|Custom,?{Dice?&#124;0&#125; [Custom]|Body,@{body} [Body]|Agility,@{agility} [Agility]|Reaction,@{reaction} [Reaction]|Strength,@{strength} [Strength]|Willpower,@{willpower} [Willpower]|Logic,@{logic} [Logic]|Intuition,@{intuition} [Intuition]|Charisma,@{charisma} [Charisma]|Edge,@{edge} [Edge]|Magic,@{magic} [Magic]|Resonance,@{resonance} [Resonance]}]]+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{base=^{edge} + ?{Attribute}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
composure: "@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{composure}}}{{dice=[[(@{composure}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
judge_intentions: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{judgeintentions}}}{{dice=[[(@{judge_intentions}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
memory: "@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{memory}}}{{dice=[[(@{memory}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
social_rating: "@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{social_rating}}}{{rating=@{social_rating}}}",
lift_carry: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{liftcarry}}}{{dice=[[(@{lift_carry}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
sprint: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{sprint_speed}+(Athletics + Agility hits * @{sprint_modifier}) meters}}{{dice=[[@{sprint_speed}+((@{athletics}+@{agility}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]] * @{sprint_modifier})]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{sprint=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
default: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{default} = @{default_display} - 1}}{{dice=[[((@{default_attribute}+@{unskilled_mod}+-1)+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
skill: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} + @{display_attribute}}}{{dice=[[((@{rating}+@{attribute}+@{mod})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=@{notes}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spec: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} + @{display_attribute} +2}}{{dice=[[((@{rating}+@{attribute}+@{mod}+2)+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=Spec: @{spec}\n@{notes}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
expert: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} + @{display_attribute} +3}}{{dice=[[((@{rating}+@{attribute}+@{mod}+3)+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=Expert: @{expert}\n@{notes}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
specialization: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} + @{display_attribute} + ^{specialization}}}{{dice=[[(@{dicepool}+@{attribute}+2+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=Spec: @{specialization}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
expertise: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} + @{display_attribute} + ^{expertise}}}{{dice=[[(@{dicepool}+@{attribute}+3+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=Expert: @{expertise}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
dr: "@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{defenserating}}}{{rating=@{defense_rating}}}",
defense: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{defense} = ^{reaction} + ^{intuition}}}{{dice=[[((@{defense})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{defense_rating=@{defense_rating}}}",
toxin_resist: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{toxin_resistance} = ^{body} + ^{willpower}}}{{dice=[[((@{body}+@{willpower}+?{Toxin Resistance Gear?|0})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
soak: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{soak} ^{damage}}}{{dice=[[((@{soak})+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
magic_ar: "@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{magic} ^{attack} ^{rating}}}{{rating=@{magic_ar}}}{{desc=^{magic} + @{tradition_attribute}}}",
direct_magic_defense: "@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{direct} ^{magic} ^{defense}}}{{dice=[[((@{willpower}+@{intuition})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{desc=Willpower + Intuition}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
indirect_magic_defense: "@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{indirect} ^{magic} ^{defense}}}{{dice=[[((@{reaction}+@{willpower})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{desc=Reaction + Willpower}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
soak_matrix: "@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{matrix} ^{soak} = ^{firewall}}}{{dice=[[((@{firewall})+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{desc=}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
soak_biofeedback: "@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{biofeedback} ^{soak} = ^{willpower}}}{{dice=[[((@{willpower})+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}]]}}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{desc=}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
primary_melee_weapon: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{primary_melee_weapon_name}}}{{dice=[[(@{primary_melee_weapon_rating}+@{primary_melee_weapon_attr_rating}+@{primary_melee_weapon_spec}+@{primary_melee_weapon_expert}+@{primary_melee_weapon_dicepool_modifier}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=@{primary_melee_weapon_notes}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{tip=**Next:** Target rolls Defense}}{{melee=1}}{{attackinfo=1}}{{ars=1}}{{arclose=@{primary_melee_weapon_close}}}{{arnear=@{primary_melee_weapon_near}}}{{armedium=@{primary_melee_weapon_medium}}}{{arfar=@{primary_melee_weapon_far}}}{{arextreme=@{primary_melee_weapon_extreme}}}{{damage=@{primary_melee_weapon_damage}}}{{skill=@{primary_melee_weapon_skill}}}{{attribute=@{primary_melee_weapon_attribute}}}{{weapspec=[[@{primary_melee_weapon_spec}]]}}{{weapexpert=[[@{primary_melee_weapon_expert}]]}}",
primary_range_weapon: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{primary_range_weapon}}}{{dice=[[(@{primary_range_weapon_rating}+@{primary_range_weapon_attr_rating}+@{primary_range_weapon_spec}+@{primary_range_weapon_expert}+@{primary_range_weapon_dicepool_mod}+@{primary_range_weapon_dicepool_modifier}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=@{primary_range_weapon_notes}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{tip=**Next:** Target rolls Defense}}{{attackinfo=1}}{{ars=1}}{{arclose=@{primary_range_weapon_close}}}{{arnear=@{primary_range_weapon_near}}}{{armedium=@{primary_range_weapon_medium}}}{{arfar=@{primary_range_weapon_far}}}{{arextreme=@{primary_range_weapon_extreme}}}{{firingmode=@{primary_range_weapon_mode}}}{{damage=@{primary_range_weapon_damage}}}{{ammotype=@{primary_range_weapon_ammo_type}}}{{skill=@{primary_range_weapon_skill}}}{{attribute=@{primary_range_weapon_attribute}}}{{weapspec=[[@{primary_range_weapon_spec}]]}}{{weapexpert=[[@{primary_range_weapon_expert}]]}}",
primary_range_weapon_split_pool_2: "@{gm_toggle} &{template:rolls-computed}{{roll1=[[[[ceil((@{primary_range_weapon_rating}+@{primary_range_weapon_attr_rating}+@{primary_range_weapon_spec}+@{primary_range_weapon_expert}+@{primary_range_weapon_dicepool_mod}+@{primary_range_weapon_dicepool_modifier}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})/@{primary_range_weapon_split_dicepool})]]d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{roll2=[[[[floor((@{primary_range_weapon_rating}+@{primary_range_weapon_attr_rating}+@{primary_range_weapon_spec}+@{primary_range_weapon_expert}+@{primary_range_weapon_dicepool_modifier}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})/@{primary_range_weapon_split_dicepool})]]d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{dice=[[(@{primary_range_weapon_rating}+@{primary_range_weapon_attr_rating}+@{primary_range_weapon_spec}+@{primary_range_weapon_expert}+@{primary_range_weapon_dicepool_modifier}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle})d6]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{primary_range_weapon}}}{{split_pool=[[@{primary_range_weapon_split_dicepool}]]}}{{desc=@{primary_range_weapon_notes}}}{{wilddie1=[[@{wild_die1}]]}}{{wilddie2=[[@{wild_die2}]]}}{{glitch1=[[0]]}}{{glitch2=[[0]]}}{{wilddie1_dice=[[0]]}}{{wilddie2_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{total_hits1=[[0]]}}{{total_hits2=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{split_pool_dicepool_1=[[0]]}}{{split_pool_dicepool_2=[[0]]}}{{tip=**Next:** Target rolls Defense}}{{attackinfo=1}}{{ars=1}}{{arclose=@{primary_range_weapon_close}}}{{arnear=@{primary_range_weapon_near}}}{{armedium=@{primary_range_weapon_medium}}}{{arfar=@{primary_range_weapon_far}}}{{arextreme=@{primary_range_weapon_extreme}}}{{firingmode=@{primary_range_weapon_mode}}}{{damage=@{primary_range_weapon_damage}}}{{ammotype=@{primary_range_weapon_ammo_type}}}{{skill=@{primary_range_weapon_skill}}}{{attribute=@{primary_range_weapon_attribute}}}{{weapspec=[[@{primary_range_weapon_spec}]]}}{{weapexpert=[[@{primary_range_weapon_expert}]]}}",
natural_healing_physical: "@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{natural} ^{healing} ^{physical}\n^{body} + ^{body}}}{{dice=[[(@{body}+@{body}+?{Medical Care?|No,0|Yes,2})d6>5cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=Natural Healing (Physical), This test can be performed once per 24 hours of rest to recover Overflow/Physical damage.\n\n&star; Duration is halved with the Quick Healer quality.}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
natural_healing_stun: "@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{natural} ^{healing} ^{stun}\n^{body} + ^{willpower}}}{{dice=[[(@{body}+@{willpower}+?{Medical Care?|No,0|Yes,2})d6>5cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=Natural Healing (Stun), This test can be performed once per hour of rest to recover stun damage. &star;Duration is halved with the Quick Healer quality}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
rangeweapon: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name}}}{{dice=[[(@{rating}+@{attr_rating}+@{spec}+@{expert}+@{dicepool_modifier}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=Mode @{mode}, Damage @{damage}, Skill: @{skill}, Attribute: @{attribute}, Notes @{notes}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
meleeweapon: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name}}}{{dice=[[(@{rating}+@{attr_rating}+@{spec}+@{expert}+@{dicepool_modifier}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=Damage @{damage}, Skill: @{skill}, Attribute: @{attribute}, Notes: @{notes}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
grenadeweaponnodicepool: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name}}}{{dice=[[(@{type}+@{spec}+@{expert}+@{dicepool_modifier}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=DV @{ground_zero}/@{close}/@{near}, Blast Area: @{blast}, Notes: @{notes} [GM Roll Scatter](~@{character_name}|GrenadeScatterAndDistance)}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
grenadeweapon: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name}}}{{dice=[[(@{dicepool}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=DV @{ground_zero}/@{close}/@{near}, Blast Area: @{blast}, Notes: @{notes} [GM Roll Scatter](~@{character_name}|GrenadeScatterAndDistance)}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
GrenadeScatterAndDistance: "/w GM &{template:multirow}{{header=Grenade}}{{base=Bounce & Scatter}}{{desc=Scatter Direction [[2d6]]}}{{desc2=Bounce Distance [[{[[2d6]]-(?{Hits?|0}?{Range?|Close,+4|Near,+2|Medium,+0|Far,-2|Extreme,-4}),0}kh1]]m}}",
spell: "@{gm_toggle} &{template:rolls-computed}{{dice=[[((@{skill}+@{magic}+@{dicepool_modifier}+@{specialization}+@{expertise})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{ampup=[[?{Amp Up|0|1|2|3|4|5|6|7|8|9|10}]]}}{{drain=[[?{Amp Up}*2+(@{drain})]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{damagetype=@{damage}}}{{desc=@{notes}}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{magicar=@{magic_ar}}}",
spellaoe: "@{gm_toggle} &{template:rolls-computed}{{dice=[[((@{skill}+@{magic}+@{dicepool_modifier}+@{specialization}+@{expertise})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{ampup=[[?{Amp Up|0|1|2|3|4|5|6|7|8|9|10}]]}}{{increasearea=[[?{Increase Area|0m,0|2m,1|4m,2|6m,3|8m,4|10m,5|12m,6|14m,7|16m,8|18m,9|20m,10}*2]]}}{{drain=[[?{Amp Up}*2+?{Increase Area}+(@{drain})]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{damagetype=@{damage}}}{{desc=@{notes}}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{magicar=@{magic_ar}}}",
noncombatspell: "@{gm_toggle} &{template:rolls-computed}{{dice=[[((@{skill}+@{magic}+@{dicepool_modifier}+@{specialization}+@{expertise})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{drain=[[@{drain}]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{damagetype=@{damage}}}{{desc=@{notes}}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
noncombatspellaoe: "@{gm_toggle} &{template:rolls-computed}{{dice=[[((@{skill}+@{magic}+@{dicepool_modifier}+@{specialization}+@{expertise})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{increasearea=[[?{Increase Area|0m,0|2m,1|4m,2|6m,3|8m,4|10m,5|12m,6|14m,7|16m,8|18m,9|20m,10}*2]]}}{{drain=[[?{Increase Area}+(@{drain})]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{damagetype=@{damage}}}{{desc=@{notes}}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
preparation: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name}}}{{dice=[[((@{magic}+@{potency}+@{expert}+@{spec})+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=@{notes}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
ritual: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name} (Sorcery + Magic + Teamwork Hits)}}{{dice=[[((@{skill}+@{magic}+@{spec}+@{expert}+@{dicepool_modifier}+?{Teamwork test hits?|0})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc= Threshold:@{threshold}\nTeamwork Test Hits: ?{Teamwork test hits?|}\nNotes:@{notes}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spell_drain: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{spell} ^{drain}}}{{dice=[[((@{spell_drain_attribute_1}+@{spell_drain_attribute_2}+@{spell_drain_modifier})+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
preparation_drain: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{preparation} ^{drain}}}{{dice=[[((@{spell_drain_attribute_1}+@{spell_drain_attribute_2}+@{spell_drain_modifier})+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
ritual_drain: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{ritual} ^{drain}}}{{dice=[[((@{spell_drain_attribute_1}+@{spell_drain_attribute_2}+@{spell_drain_modifier})+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
adept_drain: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{adept} ^{power} ^{drain}}}{{dice=[[((@{adept_drain_attribute_1}+@{adept_drain_attribute_2}+@{adept_drain_modifier})+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
conjuring_drain: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{conjuring} ^{drain}}}{{dice=[[((@{conjuring_drain_attribute_1}+@{conjuring_drain_attribute_2}+@{conjuring_drain_modifier})+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
conjuring: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Conjuring Spirit of ?{Spirit Type?|Air|Beasts|Earth|Fire|Kin|Water|Plant|Guardian|Guidance|Task} Force ?{Force?|1|2|3|4|5|6|7|8|9|10}}}{{dice=[[((@{conjuring}+@{magic}+?{Skill Level?|Skilled (+0),0|Specialization (+2),2|Expertise (+3),3})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=[Spirit Resist](~@{character_name}|SpiritResistForce?{Force?})}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{astralrep=@{astral_reputation}}}",
spiritresistforce1: "@{gm_toggle} &{template:rolls-computed}{{header=^{force} 1 ^{spirit}}}{{base=Summoning Resist}}{{dice=[[2d6>5]]}}{{desc=[Resist Drain](~@{character_name}|Conjuring_Drain)}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spiritresistforce2: "@{gm_toggle} &{template:rolls-computed}{{header=^{force} 2 ^{spirit}}}{{base=Summoning Resist}}{{dice=[[4d6>5]]}}{{desc=[Resist Drain](~@{character_name}|Conjuring_Drain)}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spiritresistforce3: "@{gm_toggle} &{template:rolls-computed}{{header=^{force} 3 ^{spirit}}}{{base=Summoning Resist}}{{dice=[[6d6>5]]}}{{desc=[Resist Drain](~@{character_name}|Conjuring_Drain)}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spiritresistforce4: "@{gm_toggle} &{template:rolls-computed}{{header=^{force} 4 ^{spirit}}}{{base=Summoning Resist}}{{dice=[[8d6>5]]}}{{desc=[Resist Drain](~@{character_name}|Conjuring_Drain)}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spiritresistforce5: "@{gm_toggle} &{template:rolls-computed}{{header=^{force} 5 ^{spirit}}}{{base=Summoning Resist}}{{dice=[[10d6>5]]}}{{desc=[Resist Drain](~@{character_name}|Conjuring_Drain)}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spiritresistforce6: "@{gm_toggle} &{template:rolls-computed}{{header=^{force} 6 ^{spirit}}}{{base=Summoning Resist}}{{dice=[[12d6>5]]}}{{desc=[Resist Drain](~@{character_name}|Conjuring_Drain)}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spiritresistforce7: "@{gm_toggle} &{template:rolls-computed}{{header=^{force} 7 ^{spirit}}}{{base=Summoning Resist}}{{dice=[[14d6>5]]}}{{desc=[Resist Drain](~@{character_name}|Conjuring_Drain)}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spiritresistforce8: "@{gm_toggle} &{template:rolls-computed}{{header=^{force} 8 ^{spirit}}}{{base=Summoning Resist}}{{dice=[[16d6>5]]}}{{desc=[Resist Drain](~@{character_name}|Conjuring_Drain)}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spiritresistforce9: "@{gm_toggle} &{template:rolls-computed}{{header=^{force} 9 ^{spirit}}}{{base=Summoning Resist}}{{dice=[[18d6>5]]}}{{desc=[Resist Drain](~@{character_name}|Conjuring_Drain)}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spiritresistforce10: "@{gm_toggle} &{template:rolls-computed}{{header=^{force} 10 ^{spirit}}}{{base=Summoning Resist}}{{dice=[[20d6>5]]}}{{desc=[Resist Drain](~@{character_name}|Conjuring_Drain)}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
matrix_device_rating: "&{template:rolls-computed}{{header=@{character_name}}}{{base=Matrix Device Rating}}{{rating=@{matrix_device_rating}}}",
matrix_attack_rating: "&{template:rolls-computed}{{header=@{character_name}}}{{base=Matrix Attack Rating}}{{rating=[[(@{attack}+@{sleaze})]]}}{{desc=Attack + Sleaze}}",
matrix_defense_rating: "&{template:rolls-computed}{{header=@{character_name}}}{{base=Matrix Defense Rating}}{{rating=[[@{matrix_defense_rating}]]}}{{desc=Data Processing + Firewall}}",
matrix_attack: "&{template:rolls-computed}{{header=@{character_name}}}{{dice=[[(@{attack}+[[?{Attribute|None,0 [None]|Custom,?{Dice?&#124;0&#125; [Custom]|Willpower,@{willpower} [Willpower]|Logic,@{logic} [Logic]|Intuition,@{intuition} [Intuition]|Charisma,@{charisma} [Charisma]|Attack,@{attack} [Attack]|Sleaze,@{sleaze} [Sleaze]|Data Processing,@{data_processing} [Data Processing]|Firewall,@{firewall} [Firewall]}]]+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{base=^{matrix} ^{attack} + ?{Attribute}}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
matrix_sleaze: "&{template:rolls-computed}{{header=@{character_name}}}{{dice=[[(@{sleaze}+[[?{Attribute|None,0 [None]|Custom,?{Dice?&#124;0&#125; [Custom]|Willpower,@{willpower} [Willpower]|Logic,@{logic} [Logic]|Intuition,@{intuition} [Intuition]|Charisma,@{charisma} [Charisma]|Attack,@{attack} [Attack]|Sleaze,@{sleaze} [Sleaze]|Data Processing,@{data_processing} [Data Processing]|Firewall,@{firewall} [Firewall]}]]+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{base=^{matrix} ^{sleaze} + ?{Attribute}}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
matrix_data_processing: "&{template:rolls-computed}{{header=@{character_name}}}{{dice=[[(@{data_processing}+[[?{Attribute|None,0 [None]|Custom,?{Dice?&#124;0&#125; [Custom]|Willpower,@{willpower} [Willpower]|Logic,@{logic} [Logic]|Intuition,@{intuition} [Intuition]|Charisma,@{charisma} [Charisma]|Attack,@{attack} [Attack]|Sleaze,@{sleaze} [Sleaze]|Data Processing,@{data_processing} [Data Processing]|Firewall,@{firewall} [Firewall]}]]+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{base=^{matrix} ^{data_processing} + ?{Attribute}}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
matrix_firewall: "&{template:rolls-computed}{{header=@{character_name}}}{{dice=[[(@{firewall}+[[?{Attribute|None,0 [None]|Custom,?{Dice?&#124;0&#125; [Custom]|Willpower,@{willpower} [Willpower]|Logic,@{logic} [Logic]|Intuition,@{intuition} [Intuition]|Charisma,@{charisma} [Charisma]|Attack,@{attack} [Attack]|Sleaze,@{sleaze} [Sleaze]|Data Processing,@{data_processing} [Data Processing]|Firewall,@{firewall} [Firewall]}]]+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{base=^{matrix} ^{firewall} + ?{Attribute}}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
fade: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{resistfade}}}{{dice=[[(@{willpower}+@{logic}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{desc=Willpower + Logic}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
fade_compiling: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{resistfade} ^{compiling}}}{{dice=[[(@{willpower}+@{charisma}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{desc=Willpower + Charisma}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
compiling: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Compiling ?{sprite Type?|Courier|Crack|Data|Fault|Machine|Other} Sprite, Level ?{Level?|1|2|3|4|5|6|7|8|9|10}}}{{dice=[[((@{tasking}+@{resonance}+?{Skill Level?|Skilled (+0),0|Specialization (+2),2|Expertise (+3),3})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=[Sprite Resist](~@{character_name}|spriteresistlevel?{Level?})}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spriteresistlevel1: "@{gm_toggle} &{template:rolls-computed}{{header=^{level} 1 ^{sprite}}}{{base=Compiling Resist}}{{dice=[[2d6>5]]}}{{desc=[Resist Fade](~@{character_name}|fade)}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spriteresistlevel2: "@{gm_toggle} &{template:rolls-computed}{{header=^{level} 2 ^{sprite}}}{{base=Compiling Resist}}{{dice=[[4d6>5]]}}{{desc=[Resist Fade](~@{character_name}|fade)}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spriteresistlevel3: "@{gm_toggle} &{template:rolls-computed}{{header=^{level} 3 ^{sprite}}}{{base=Compiling Resist}}{{dice=[[6d6>5]]}}{{desc=[Resist Fade](~@{character_name}|fade)}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spriteresistlevel4: "@{gm_toggle} &{template:rolls-computed}{{header=^{level} 4 ^{sprite}}}{{base=Compiling Resist}}{{dice=[[8d6>5]]}}{{desc=[Resist Fade](~@{character_name}|fade)}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spriteresistlevel5: "@{gm_toggle} &{template:rolls-computed}{{header=^{level} 5 ^{sprite}}}{{base=Compiling Resist}}{{dice=[[10d6>5]]}}{{desc=[Resist Fade](~@{character_name}|fade)}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spriteresistlevel6: "@{gm_toggle} &{template:rolls-computed}{{header=^{level} 6 ^{sprite}}}{{base=Compiling Resist}}{{dice=[[12d6>5]]}}{{desc=[Resist Fade](~@{character_name}|fade)}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spriteresistlevel7: "@{gm_toggle} &{template:rolls-computed}{{header=^{level} 7 ^{sprite}}}{{base=Compiling Resist}}{{dice=[[14d6>5]]}}{{desc=[Resist Fade](~@{character_name}|fade)}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spriteresistlevel8: "@{gm_toggle} &{template:rolls-computed}{{header=^{level} 8 ^{sprite}}}{{base=Compiling Resist}}{{dice=[[16d6>5]]}}{{desc=[Resist Fade](~@{character_name}|fade)}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spriteresistlevel9: "@{gm_toggle} &{template:rolls-computed}{{header=^{level} 9 ^{sprite}}}{{base=Compiling Resist}}{{dice=[[18d6>5]]}}{{desc=[Resist Fade](~@{character_name}|fade)}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spriteresistlevel10: "@{gm_toggle} &{template:rolls-computed}{{header=^{level} 10 ^{sprite}}}{{base=Compiling Resist}}{{dice=[[20d6>5]]}}{{desc=[Resist Fade](~@{character_name}|fade)}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
complexform: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{complexform} @{name}}}{{dice=[[((@{skill}+@{resonance}+@{dicepool_modifier}+@{spec}+@{expert})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=@{notes}}}{{fade=[[@{fade}]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
complexformdice: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{complexform} @{name}}}{{dice=[[((@{dice}+@{dicepool_modifier}+@{spec}+@{expert})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=@{notes}}}{{fade=[[@{fade}]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
complexformnoroll: "@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{complexform} @{name}}}{{desc=@{notes}}}{{fade=[[@{fade}]]}}",
connections1: "/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{connection} 1}}{{dice=[[(?{SRM Rule: Specialized Knowledge (+3 dice)?|N,0|Y,3}+2)d6>5]]}}{{glitch=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
connections2: "/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{connection} 2}}{{dice=[[(?{SRM Rule: Specialized Knowledge (+3 dice)?|N,0|Y,3}+4)d6>5]]}}{{glitch=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
connections3: "/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{connection} 3}}{{dice=[[(?{SRM Rule: Specialized Knowledge (+3 dice)?|N,0|Y,3}+6)d6>5]]}}{{glitch=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
connections4: "/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{connection} 4}}{{dice=[[(?{SRM Rule: Specialized Knowledge (+3 dice)?|N,0|Y,3}+8)d6>5]]}}{{glitch=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
connections5: "/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{connection} 5}}{{dice=[[(?{SRM Rule: Specialized Knowledge (+3 dice)?|N,0|Y,3}+10)d6>5]]}}{{glitch=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
connections6: "/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{connection} 6}}{{dice=[[(?{SRM Rule: Specialized Knowledge (+3 dice)?|N,0|Y,3}+12)d6>5]]}}{{glitch=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
connections7: "/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{connection} 7}}{{dice=[[(?{SRM Rule: Specialized Knowledge (+3 dice)?|N,0|Y,3}+14)d6>5]]}}{{glitch=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
connections8: "/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{connection} 8}}{{dice=[[(?{SRM Rule: Specialized Knowledge (+3 dice)?|N,0|Y,3}+16)d6>5]]}}{{glitch=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
connections9: "/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{connection} 9}}{{dice=[[(?{SRM Rule: Specialized Knowledge (+3 dice)?|N,0|Y,3}+18)d6>5]]}}{{glitch=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
connections10: "/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{connection} 10}}{{dice=[[(?{SRM Rule: Specialized Knowledge (+3 dice)?|N,0|Y,3}+20)d6>5]]}}{{glitch=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
loyalty1: "/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{loyalty} 1}}{{dice=[[(@{charisma}+@{influence}+1)d6>5]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
loyalty2: "/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{loyalty} 2}}{{dice=[[(@{charisma}+@{influence}+2)d6>5]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
loyalty3: "/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{loyalty} 3}}{{dice=[[(@{charisma}+@{influence}+3)d6>5]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
loyalty4: "/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{loyalty} 4}}{{dice=[[(@{charisma}+@{influence}+4)d6>5]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
loyalty5: "/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{loyalty} 5}}{{dice=[[(@{charisma}+@{influence}+5)d6>5]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
loyalty6: "/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{loyalty} 6}}{{dice=[[(@{charisma}+@{influence}+6)d6>5]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
loyalty7: "/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{loyalty} 7}}{{dice=[[(@{charisma}+@{influence}+7)d6>5]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
loyalty8: "/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{loyalty} 8}}{{dice=[[(@{charisma}+@{influence}+8)d6>5]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
loyalty9: "/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{loyalty} 9}}{{dice=[[(@{charisma}+@{influence}+9)d6>5]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
loyalty10: "/w GM &{template:rolls-computed}{{header=@{character_name}}}{{base=^{loyalty} 10}}{{dice=[[(@{charisma}+@{influence}+10)d6>5]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
pcclearsight: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name} / @{name}}}{{base=^{clearsight} = ^{clearsight} + ^{sensor}}}{{dice=[[(@{clearsight}+@{display_sensor}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
pcevasion: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name} / @{name}}}{{base=^{evasion} = ^{evasion} + ^{pilot}}}{{dice=[[(@{evasion}+@{display_pilot}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
pcstealth: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name} / @{name}}}{{base=^{stealth} = ^{stealth} + ^{pilot}}}{{dice=[[(@{stealth}+@{display_pilot}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
pcelectronicwarfare: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name} / @{name}}}{{base=^{electronicwarfare} = ^{electronicwarfare} + ^{sensor}}}{{dice=[[(@{electronicwarfare}+@{display_sensor}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
pcmaneuvering: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name} / @{name}}}{{base=^{maneuvering} = ^{maneuvering} + ^{pilot}}}{{dice=[[(@{maneuvering}+@{display_pilot}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
pctargeting: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name} / @{name}}}{{base=^{targeting} = ^{targeting} + ^{sensor}}}{{dice=[[(@{targeting}+@{display_sensor}+@{modifiers_toggle}+@{edge_toggle})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
matrixresist_int_f: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{selected|wounds_toggle}]]}}{{edge=[[@{selected|edge_toggle}]]}}{{header=@{selected|character_name}}}{{base=^{intuition} + ^{firewall}}}{{dice=[[(@{selected|intuition}+@{selected|firewall}+@{selected|wounds_toggle}+@{selected|modifiers_toggle}+@{selected|edge_toggle}+@{uda})d6>5@{selected|explode_toggle}cs>5cf<[[(1+@{selected|bad_luck})]]]]}}{{desc=}}{{wilddie=[[@{selected|wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
matrixresist_f_s: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{selected|wounds_toggle}]]}}{{edge=[[@{selected|edge_toggle}]]}}{{header=@{selected|character_name}}}{{base=^{firewall} + ^{sleaze}}}{{dice=[[(@{selected|firewall}+@{selected|sleaze}+@{selected|wounds_toggle}+@{selected|modifiers_toggle}+@{selected|edge_toggle}+@{uda})d6>5@{selected|explode_toggle}cs>5cf<[[(1+@{selected|bad_luck})]]]]}}{{desc=}}{{wilddie=[[@{selected|wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
matrixresist_w_f: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{selected|wounds_toggle}]]}}{{edge=[[@{selected|edge_toggle}]]}}{{header=@{selected|character_name}}}{{base=^{willpower} + ^{firewall}}}{{dice=[[(@{selected|willpower}+@{selected|firewall}+@{selected|wounds_toggle}+@{selected|modifiers_toggle}+@{selected|edge_toggle}+@{uda})d6>5@{selected|explode_toggle}cs>5cf<[[(1+@{selected|bad_luck})]]]]}}{{desc=}}{{wilddie=[[@{selected|wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
matrixresist_dp_f: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{selected|wounds_toggle}]]}}{{edge=[[@{selected|edge_toggle}]]}}{{header=@{selected|character_name}}}{{base=^{data_processing} + ^{firewall}}}{{dice=[[(@{selected|data_processing}+@{selected|firewall}+@{selected|wounds_toggle}+@{selected|modifiers_toggle}+@{selected|edge_toggle}+@{uda})d6>5@{selected|explode_toggle}cs>5cf<[[(1+@{selected|bad_luck})]]]]}}{{desc=}}{{wilddie=[[@{selected|wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
matrixresist_f_f: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{selected|wounds_toggle}]]}}{{edge=[[@{selected|edge_toggle}]]}}{{header=@{selected|character_name}}}{{base=^{firewall} + ^{firewall}}}{{dice=[[(@{selected|firewall}+@{selected|firewall}+@{selected|wounds_toggle}+@{selected|modifiers_toggle}+@{selected|edge_toggle}+@{uda})d6>5@{selected|explode_toggle}cs>5cf<[[(1+@{selected|bad_luck})]]]]}}{{desc=}}{{wilddie=[[@{selected|wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
matrixresist_int_dp: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{selected|wounds_toggle}]]}}{{edge=[[@{selected|edge_toggle}]]}}{{header=@{selected|character_name}}}{{base=^{intuition} + ^{data_processing}}}{{dice=[[(@{selected|intuition}+@{selected|data_processing}+@{selected|wounds_toggle}+@{selected|modifiers_toggle}+@{selected|edge_toggle}+@{uda})d6>5@{selected|explode_toggle}cs>5cf<[[(1+@{selected|bad_luck})]]]]}}{{desc=}}{{wilddie=[[@{selected|wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
matrixresist_dp_s: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{selected|wounds_toggle}]]}}{{edge=[[@{selected|edge_toggle}]]}}{{header=@{selected|character_name}}}{{base=^{data_processing} + ^{sleaze}}}{{dice=[[(@{selected|data_processing}+@{selected|sleaze}+@{selected|wounds_toggle}+@{selected|modifiers_toggle}+@{selected|edge_toggle}+@{uda})d6>5@{selected|explode_toggle}cs>5cf<[[(1+@{selected|bad_luck})]]]]}}{{desc=}}{{wilddie=[[@{selected|wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
matrixresist_c_dp: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{selected|wounds_toggle}]]}}{{edge=[[@{selected|edge_toggle}]]}}{{header=@{selected|character_name}}}{{base=^{charisma} + ^{data_processing}}}{{dice=[[(@{selected|charisma}+@{selected|data_processing}+@{selected|wounds_toggle}+@{selected|modifiers_toggle}+@{selected|edge_toggle}+@{uda})d6>5@{selected|explode_toggle}cs>5cf<[[(1+@{selected|bad_luck})]]]]}}{{desc=}}{{wilddie=[[@{selected|wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
matrixresist_dp_dr: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{selected|wounds_toggle}]]}}{{edge=[[@{selected|edge_toggle}]]}}{{header=@{selected|character_name}}}{{base=^{data_processing} + ^{devicerating}}}{{dice=[[(@{selected|firewall}+@{selected|matrix_device_rating}+@{selected|wounds_toggle}+@{selected|modifiers_toggle}+@{selected|edge_toggle}+@{uda})d6>5@{selected|explode_toggle}cs>5cf<[[(1+@{selected|bad_luck})]]]]}}{{desc=}}{{wilddie=[[@{selected|wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
matrixresist_a_dp: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{selected|wounds_toggle}]]}}{{edge=[[@{selected|edge_toggle}]]}}{{header=@{selected|character_name}}}{{base=^{attack} + ^{data_processing}}}{{dice=[[(@{selected|attack}+@{selected|data_processing}+@{selected|wounds_toggle}+@{selected|modifiers_toggle}+@{selected|edge_toggle}+@{uda})d6>5@{selected|explode_toggle}cs>5cf<[[(1+@{selected|bad_luck})]]]]}}{{desc=}}{{wilddie=[[@{selected|wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
matrixresist_w_s: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{selected|wounds_toggle}]]}}{{edge=[[@{selected|edge_toggle}]]}}{{header=@{selected|character_name}}}{{base=^{willpower} + ^{sleaze}}}{{dice=[[(@{selected|willpower}+@{selected|sleaze}+@{selected|wounds_toggle}+@{selected|modifiers_toggle}+@{selected|edge_toggle}+@{uda})d6>5@{selected|explode_toggle}cs>5cf<[[(1+@{selected|bad_luck})]]]]}}{{desc=}}{{wilddie=[[@{selected|wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
matrixresist_dr_dr: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{selected|wounds_toggle}]]}}{{edge=[[@{selected|edge_toggle}]]}}{{header=@{selected|character_name}}}{{base=^{devicerating} x 2}}{{dice=[[(@{selected|matrix_device_rating}+@{selected|matrix_device_rating}+@{selected|wounds_toggle}+@{selected|modifiers_toggle}+@{selected|edge_toggle}+@{uda})d6>5@{selected|explode_toggle}cs>5cf<[[(1+@{selected|bad_luck})]]]]}}{{desc=}}{{wilddie=[[@{selected|wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
matrixresist_l_f: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{selected|wounds_toggle}]]}}{{edge=[[@{selected|edge_toggle}]]}}{{header=@{selected|character_name}}}{{base=^{logic} + ^{firewall}}}{{dice=[[(@{selected|logic}+@{selected|firewall}+@{selected|wounds_toggle}+@{selected|modifiers_toggle}+@{selected|edge_toggle}+@{uda})d6>5@{selected|explode_toggle}cs>5cf<[[(1+@{selected|bad_luck})]]]]}}{{desc=}}{{wilddie=[[@{selected|wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
matrixresist_pilot_f: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{selected|wounds_toggle}]]}}{{edge=[[@{selected|edge_toggle}]]}}{{header=@{selected|character_name}}}{{base=^{firewall} + ^{pilot}}}{{dice=[[(@{selected|firewall}+@{selected|pilot}+@{selected|wounds_toggle}+@{selected|modifiers_toggle}+@{selected|edge_toggle}+@{uda})d6>5@{selected|explode_toggle}cs>5cf<[[(1+@{selected|bad_luck})]]]]}}{{desc=}}{{wilddie=[[@{selected|wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
matrixresist_s_s: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{selected|wounds_toggle}]]}}{{edge=[[@{selected|edge_toggle}]]}}{{header=@{selected|character_name}}}{{base=^{sleaze} + ^{sleaze}}}{{dice=[[(@{selected|sleaze}+@{selected|sleaze}+@{selected|wounds_toggle}+@{selected|modifiers_toggle}+@{selected|edge_toggle}+@{uda})d6>5@{selected|explode_toggle}cs>5cf<[[(1+@{selected|bad_luck})]]]]}}{{desc=}}{{wilddie=[[@{selected|wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
matrix_backdoor_entry: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Backdoor Entry}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{cracking}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Willpower + Firewall](~selected|matrixresist_w_f), CRB p.180}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_brute_force: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Brute Force}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{cracking}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Willpower + Firewall](~selected|matrixresist_w_f), CRB p.180}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_check_os: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Check OS}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{cracking}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), Threshold: 4, CRB p.180}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_control_device: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Control Device}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{electronics}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Legal), vs. [Willpower + Firewall](~selected|matrixresist_w_f), CRB p.180}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_crack_file: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Crack File}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{cracking}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. Encryption Rating x 2, CRB p.180}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_crash_program: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Crash Program}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{cracking}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Data Processing + Device Rating](~selected|matrixresist_dp_dr), CRB p.181}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_data_spike: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Data Spike}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{cracking}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Data Processing + Firewall](~selected|matrixresist_dp_f), CRB p.181}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_disarm_data_bomb: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Disarm Data Bomb}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{cracking}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Legal), vs. Data Bomb Rating x 2, CRB p.181}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_edit_file: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Edit File}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{electronics}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Legal), vs. [Intuition + Firewall](~selected|matrixresist_int_f) |or| [Firewall + Sleaze](~selected|matrixresist_f_s)}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_encrypt_file: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Encrypt File}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{electronics}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Legal), Hits = Encryption Rating, CRB p.181}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_erase_matrix_signature: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Erase Matrix Signature}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{electronics}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Willpower + Firewall](~selected|matrixresist_w_f) |or| [Firewall x 2](~selected|matrixresist_f_f), CRB p.181}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_format_device: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Format Device}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{electronics}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Legal), vs. [Willpower + Firewall](~selected|matrixresist_w_f) |or| [Firewall x 2](~selected|matrixresist_f_f), CRB p.181}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_hash_check: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Hash Check}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{electronics}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), CRB p.182}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_hide: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Hide}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{cracking}+@{intuition}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Intuition + Data Processing](~selected|matrixresist_int_dp) |or| [Data Processing + Sleaze](~selected|matrixresist_dp_s), CRB p.182}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_jackout: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Jack Out}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{electronics}+@{willpower}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Legal), vs. [Charisma + Data Processing](~selected|matrixresist_c_dp) |or| [Attack + Data Processing](~selected|matrixresist_a_dp), CRB p.182}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_jam_signals: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Jam Signals}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{cracking}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), CRB p.182}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_jump_into_rigged_device: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Jump Into Rigged Device}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{electronics}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Legal), vs. [Willpower + Firewall](~selected|matrixresist_w_f) |or| [Firewall x 2](~selected|matrixresist_f_f), CRB p.182}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_matrix_perception: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Matrix Perception}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{electronics}+@{intuition}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Legal), vs. [Willpower + Sleaze](~selected|matrixresist_w_s), CRB p.182}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_matrix_search: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Matrix Search}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{electronics}+@{intuition}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Legal), Extended Test, 10 Minute Interval, CRB p.183}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_probe: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Probe}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{cracking}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Willpower + Firewall](~selected|matrixresist_w_f) |or| [Firewall x 2](~selected|matrixresist_f_f), CRB p.183}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_reboot_device: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Reboot Device}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{electronics}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Legal), vs. [Willpower + Firewall](~selected|matrixresist_w_f) |or| [Firewall x 2](~selected|matrixresist_f_f), CRB p.183}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_set_data_bomb: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Set Data Bomb}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{electronics}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Device Rating x 2](~selected|matrixresist_dr_dr), CRB p.183}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_snoop: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Snoop}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{cracking}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Logic + Firewall](~selected|matrixresist_l_f) |or| [Data Processing + Firewall](~selected|matrixresist_dp_f), CRB p.184}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_spoof_command: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Spoof Command}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{cracking}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Data Processing + Firewall](~selected|matrixresist_dp_f) |or| [Pilot + Firewall](~selected|matrixresist_pilot_f), CRB p.184}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_tarpit: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Tar Pit}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{cracking}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Data Processing + Firewall](~selected|matrixresist_dp_f), CRB p.184}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_trace_icon: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Trace Icon}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{electronics}+@{intuition}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Willpower + Sleaze](~selected|matrixresist_w_s) |or| [Firewall + Sleaze](~selected|matrixresist_f_s), CRB p.184}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_calibration: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Calibration}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{cracking}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Legal), HS p.28}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_delayed_command: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Delayed Command}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{cracking}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Data Processing + Firewall](~selected|matrixresist_dp_f) |or| [Pilot + Firewall](~selected|matrixresist_pilot_f), HS p.28}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_denial_of_service: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Denial of Service}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{electronics}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Willpower + Firewall](~selected|matrixresist_w_f), HS p.28}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_device_lock: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Device Lock}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{cracking}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Willpower + Firewall](~selected|matrixresist_w_f), HS p.29}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_garbage_in_garbage_out: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Garbage/In Garbage Out}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{cracking}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Willpower + Firewall](~selected|matrixresist_w_f), HS p.29}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_known_exploit_backdoor_entry: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Known Exploit Backdoor Entry}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{cracking}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Willpower + Firewall](~selected|matrixresist_w_f) |or| [Firewall x 2](~selected|matrixresist_f_f), HS p.30}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_masquerade: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Masquerade}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{cracking}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Intuition + Data Processing](~selected|matrixresist_int_dp), HS p.30}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_metahuman_in_the_middle: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Metahuman in the Middle}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{cracking}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Intuition + Data Processing](~selected|matrixresist_int_dp), HS p.30}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_modify_icon: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Modify Icon}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{electronics}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Intuition + Data Processing](~selected|matrixresist_int_dp) |or| [Data Processing + Sleaze](~selected|matrixresist_dp_s), HS p.30}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_popup: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Popup}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{cracking}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Intuition + Data Processing](~selected|matrixresist_int_dp), HS p.30}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_squelch: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Squelch}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{electronics}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Intuition + Sleaze](~selected|matrixresist_int_s) |or| [Sleaze x 2](~selected|matrixresist_s_s), HS p.30}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_subvert_infrastructure: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Subvert Infrastructure}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{electronics}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Willpower + Firewall](~selected|matrixresist_w_f), HS p.30}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_threat_analysis: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Threat Analysis}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{electronics}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Legal), HS p.31}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
matrix_watchdog: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Matrix Watchdog}}{{?{Training Level?|Trained,0|Specialized,2|Expertise,3}}}{{dice=[[(@{cracking}+@{logic}+?{Training Level?|0}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle}+(@{matrix_overclock}*2)-@{matrix_noise}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=(Illegal), vs. [Willpower + Firewall](~selected|matrixresist_w_f), HS p.31}}{{wilddie=[[@{wild_die}+@{matrix_overclock}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{overclock=[[@{matrix_overclock}]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{matrix_noise=[[@{matrix_noise}]]}}",
extended_start: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Begin Extended Test}}{{reason=?{Extended Test Reason?}}}{{dice=[[(?{Dicepool?|1}+@{modifiers_toggle}+@{wounds_toggle}+@{edge_toggle})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=Extended Test Beginning}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{extendedtest=[[1]]}}{{newdicepool=[[(?{Dicepool?|1}-1)]]}}{{dicepool=[[?{Dicepool?|1}]]}}{{hitstotal=[[0]]}}{{intervals=[[1]]}}{{passthrough=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
extended_next: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=Continue Extended Test}}{{dice=[[(%DICEPOOL%+@{modifiers_toggle}+@{wounds_toggle})d6>5cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=Extended Test Continuing}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{extendedtest=[[2]]}}{{newdicepool=[[%NEWDICEPOOL%]]}}{{dicepool=[[%DICEPOOL%]]}}{{hitstotal=[[0]]}}{{intervals=[[%INTERVALS%]]}}{{reason=%REASON%}}{{passthrough=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
// NPC specific rolls
host_rating: "@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{host_rating}}}{{rating=@{host_rating}}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}",
host_attack: "&{template:rolls-computed}{{header=@{character_name}}}{{dice=[[(@{attack}+[[?{Attribute|None,0 [None]|Custom,?{Dice?&#124;0&#125; [Custom]|Willpower,@{willpower} [Willpower]|Logic,@{logic} [Logic]|Intuition,@{intuition} [Intuition]|Charisma,@{charisma} [Charisma]|Attack,@{attack} [Attack]|Sleaze,@{sleaze} [Sleaze]|Data Processing,@{data_processing} [Data Processing]|Firewall,@{firewall} [Firewall]}]]+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{base=^{matrix} ^{attack} + ?{Attribute}}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
host_sleaze: "&{template:rolls-computed}{{header=@{character_name}}}{{dice=[[(@{sleaze}+[[?{Attribute|None,0 [None]|Custom,?{Dice?&#124;0&#125; [Custom]|Willpower,@{willpower} [Willpower]|Logic,@{logic} [Logic]|Intuition,@{intuition} [Intuition]|Charisma,@{charisma} [Charisma]|Attack,@{attack} [Attack]|Sleaze,@{sleaze} [Sleaze]|Data Processing,@{data_processing} [Data Processing]|Firewall,@{firewall} [Firewall]}]]+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{base=^{matrix} ^{sleaze} + ?{Attribute}}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
host_data_processing: "&{template:rolls-computed}{{header=@{character_name}}}{{dice=[[(@{data_processing}+[[?{Attribute|None,0 [None]|Custom,?{Dice?&#124;0&#125; [Custom]|Willpower,@{willpower} [Willpower]|Logic,@{logic} [Logic]|Intuition,@{intuition} [Intuition]|Charisma,@{charisma} [Charisma]|Attack,@{attack} [Attack]|Sleaze,@{sleaze} [Sleaze]|Data Processing,@{data_processing} [Data Processing]|Firewall,@{firewall} [Firewall]}]]+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{base=^{matrix} ^{data_processing} + ?{Attribute}}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
host_firewall: "&{template:rolls-computed}{{header=@{character_name}}}{{dice=[[(@{firewall}+[[?{Attribute|None,0 [None]|Custom,?{Dice?&#124;0&#125; [Custom]|Willpower,@{willpower} [Willpower]|Logic,@{logic} [Logic]|Intuition,@{intuition} [Intuition]|Charisma,@{charisma} [Charisma]|Attack,@{attack} [Attack]|Sleaze,@{sleaze} [Sleaze]|Data Processing,@{data_processing} [Data Processing]|Firewall,@{firewall} [Firewall]}]]+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{base=^{matrix} ^{firewall} + ?{Attribute}}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
pilot: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=^{pilot}}}{{base=^{pilot}}}{{dice=[[(@{pilot}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
level: "@{gm_toggle} &{template:rolls-computed}{{header=@{character_name}}}{{base=^{level}}}{{rating=@{level}}}",
resonance: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{resonance}}}{{dice=[[(@{resonance}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
sprite_attack: "&{template:rolls-computed}{{header=@{character_name}}}{{dice=[[(@{attack}+[[?{Attribute|None,0 [None]|Custom,?{Dice?&#124;0&#125; [Custom]|Willpower,@{willpower} [Willpower]|Logic,@{logic} [Logic]|Intuition,@{intuition} [Intuition]|Charisma,@{charisma} [Charisma]|Attack,@{attack} [Attack]|Sleaze,@{sleaze} [Sleaze]|Data Processing,@{data_processing} [Data Processing]|Firewall,@{firewall} [Firewall]}]]+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{base=^{matrix} ^{attack} + ?{Attribute}}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
sprite_sleaze: "&{template:rolls-computed}{{header=@{character_name}}}{{dice=[[(@{sleaze}+[[?{Attribute|None,0 [None]|Custom,?{Dice?&#124;0&#125; [Custom]|Willpower,@{willpower} [Willpower]|Logic,@{logic} [Logic]|Intuition,@{intuition} [Intuition]|Charisma,@{charisma} [Charisma]|Attack,@{attack} [Attack]|Sleaze,@{sleaze} [Sleaze]|Data Processing,@{data_processing} [Data Processing]|Firewall,@{firewall} [Firewall]}]]+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{base=^{matrix} ^{sleaze} + ?{Attribute}}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
sprite_data_processing: "&{template:rolls-computed}{{header=@{character_name}}}{{dice=[[(@{data_processing}+[[?{Attribute|None,0 [None]|Custom,?{Dice?&#124;0&#125; [Custom]|Willpower,@{willpower} [Willpower]|Logic,@{logic} [Logic]|Intuition,@{intuition} [Intuition]|Charisma,@{charisma} [Charisma]|Attack,@{attack} [Attack]|Sleaze,@{sleaze} [Sleaze]|Data Processing,@{data_processing} [Data Processing]|Firewall,@{firewall} [Firewall]}]]+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{base=^{matrix} ^{data_processing} + ?{Attribute}}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
sprite_firewall: "&{template:rolls-computed}{{header=@{character_name}}}{{dice=[[(@{firewall}+[[?{Attribute|None,0 [None]|Custom,?{Dice?&#124;0&#125; [Custom]|Willpower,@{willpower} [Willpower]|Logic,@{logic} [Logic]|Intuition,@{intuition} [Intuition]|Charisma,@{charisma} [Charisma]|Attack,@{attack} [Attack]|Sleaze,@{sleaze} [Sleaze]|Data Processing,@{data_processing} [Data Processing]|Firewall,@{firewall} [Firewall]}]]+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{base=^{matrix} ^{firewall} + ?{Attribute}}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spriteskill:"@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{skill} @{level} + Attribute ?{Attribute|Logic,@{data_processing}|Intuition,@{sleaze}|Charisma,@{attack}|Willpower,@{firewall}|Resonance,@{resonance}|Level,@{level}|None,0}}}{{dice=[[(@{level}+?{Attribute}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
vehicle_dr: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{defenserating} = ^{piloting} (?{Piloting?|No Pilot,@{pilot}|1|2|3|4|5|6|7|8|9|10}) + ^{armor} (@{armor})}}{{rating=[[?{Piloting?}+@{armor}]]}}",
vehicle_defense: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{defense} = ^{piloting} (?{Piloting?|No Pilot,@{pilot}|1|2|3|4|5|6|7|8|9|10}) + ^{evasion} (?{Evasion Autosoft Rating or Pilot Reaction?| No Evasion Autosoft,0|1|2|3|4|5|6|7|8|9|10})}}{{dice=[[((?{Piloting?}+?{Evasion Autosoft Rating or Pilot Reaction?}+@{defense_modifier})+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{wilddie_dice=[[0]]}}",
npc_clearsight: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{clearsight} = ^{clearsight} + ^{sensor}}}{{dice=[[(@{clearsight}+@{sensor}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
npc_electronicwarfare: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{electronicwarfare} = ^{electronicwarfare} + ^{sensor}}}{{dice=[[(@{electronicwarfare}+@{sensor}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
npc_evasion: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{evasion} = ^{evasion} + ^{pilot}}}{{dice=[[(@{evasion}+@{pilot}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
npc_maneuvering: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{maneuvering} = ^{maneuvering} + ^{pilot}}}{{dice=[[(@{maneuvering}+@{pilot}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
npc_stealth: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{stealth} = ^{stealth} + ^{pilot}}}{{dice=[[(@{stealth}+@{pilot}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
npc_targeting: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{targeting_weapon} ^{targeting} = ^{targeting} + ^{sensor}}}{{dice=[[(@{targeting}+@{sensor}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
npc_targeting2: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{targeting2_weapon} ^{targeting} = ^{targeting} + ^{sensor}}}{{dice=[[(@{targeting2}+@{sensor}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
npc_targeting3: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{targeting3_weapon} ^{targeting} = ^{targeting} + ^{sensor}}}{{dice=[[(@{targeting3}+@{sensor}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
spirit_dr: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=^{defenserating}}}{{rating=@{defense_rating}}}",
spiritskill: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{skill} ^{force} (@{force}) + ^{attribute} (?{Attribute|Body,@{body}|Agility,@{agility}|Reaction,@{reaction}|Strength,@{strength}|Willpower,@{willpower}|Logic,@{logic}|Intuition,@{intuition}|Charisma,@{charisma}|Magic,@{magic}|Force,@{force}|None,0})}}{{dice=[[(@{force}+?{Attribute}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
npcrangeweapon: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name}}}{{dice=[[(@{dicepool}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=@{notes}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{tip=**Next:** Target rolls Defense}}{{npcattackinfo=1}}{{ars=1}}{{arclose=@{close}}}{{arnear=@{near}}}{{armedium=@{medium}}}{{arfar=@{far}}}{{arextreme=@{extreme}}}{{firingmode=@{mode}}}{{damage=@{damage}}}{{ammotype=}}{{skill=}}{{attribute=}}{{weapspec=}}{{weapexpert=}}",
npcrangeweaponnodicepool: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name}}}{{dice=[[(?{Skill / Autosoft Rating?|1,1|2,2|3,3|4,4|5,5|6,6|7,7|8,8|9,9|10,10}+?{Attribute / Sensor Rating?|1,1|2,2|3,3|4,4|5,5|6,6|7,7|8,8|9,9|10,10}+@{dicepool_modifier}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=@{notes}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{tip=**Next:** Target rolls Defense\n**Set Pool** for the weapon to remove prompt.}}{{npcattackinfo=1}}{{ars=1}}{{arclose=@{close}}}{{arnear=@{near}}}{{armedium=@{medium}}}{{arfar=@{far}}}{{arextreme=@{extreme}}}{{firingmode=@{mode}}}{{damage=@{damage}}}{{ammotype=}}{{skill=}}{{attribute=}}{{weapspec=}}{{weapexpert=}}",
npcmeleeweapon: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name}}}{{dice=[[(@{dicepool}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=@{notes}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{tip=**Next:** Target rolls Defense}}{{npcattackinfo=1}}{{ars=1}}{{arclose=@{close}}}{{arnear=@{near}}}{{armedium=@{medium}}}{{arfar=@{far}}}{{arextreme=@{extreme}}}{{firingmode=}}{{damage=@{damage}}}{{ammotype=}}{{skill=}}{{attribute=}}{{weapspec=}}{{weapexpert=}}{{melee=1}}",
npcmeleeweaponnodicepool: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{header=@{character_name}}}{{base=@{name}}}{{dice=[[(?{Skill / Autosoft Rating?|1,1|2,2|3,3|4,4|5,5|6,6|7,7|8,8|9,9|10,10}+?{Attribute / Sensor Rating?|1,1|2,2|3,3|4,4|5,5|6,6|7,7|8,8|9,9|10,10}+@{dicepool_modifier}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{desc=@{notes}}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{tip=**Next:** Target rolls Defense\n**Set Pool** for the weapon to remove prompt.}}{{npcattackinfo=1}}{{ars=1}}{{arclose=@{close}}}{{arnear=@{near}}}{{armedium=@{medium}}}{{arfar=@{far}}}{{arextreme=@{extreme}}}{{firingmode=}}{{damage=@{damage}}}{{ammotype=}}{{skill=}}{{attribute=}}{{weapspec=}}{{weapexpert=}}{{melee=1}}",
npcspell: "@{gm_toggle} &{template:rolls-computed}{{dice=[[(@{dicepool}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{ampup=[[?{Amp Up|0|1|2|3|4|5|6|7|8|9|10}]]}}{{drain=[[?{Amp Up}*2+(@{drain})]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{damagetype=@{damage}}}{{desc=@{notes}}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{magicar=@{magic_ar}}}",
npcspellaoe: "@{gm_toggle} &{template:rolls-computed}{{dice=[[(@{dicepool}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{ampup=[[?{Amp Up|0|1|2|3|4|5|6|7|8|9|10}]]}}{{increasearea=[[?{Increase Area|0m,0|2m,1|4m,2|6m,3|8m,4|10m,5|12m,6|14m,7|16m,8|18m,9|20m,10}*2]]}}{{drain=[[?{Amp Up}*2+?{Increase Area}+(@{drain})]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{damagetype=@{damage}}}{{desc=@{notes}}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{magicar=@{magic_ar}}}",
npcnoncombatspell: "@{gm_toggle} &{template:rolls-computed}{{dice=[[(@{dicepool}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{drain=[[@{drain}]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{damagetype=@{damage}}}{{desc=@{notes}}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
npcnoncombatspellaoe: "@{gm_toggle} &{template:rolls-computed}{{dice=[[(@{dicepool}+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{increasearea=[[?{Increase Area|0m,0|2m,1|4m,2|6m,3|8m,4|10m,5|12m,6|14m,7|16m,8|18m,9|20m,10}*2]]}}{{drain=[[?{Increase Area}+(@{drain})]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{damagetype=@{damage}}}{{desc=@{notes}}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
npcspellnodicepool: "@{gm_toggle} &{template:rolls-computed}{{dice=[[((@{skill}+@{magic}+@{spellcasting_specialist}+@{spellcasting_expert})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{ampup=[[?{Amp Up|0|1|2|3|4|5|6|7|8|9|10}]]}}{{drain=[[?{Amp Up}*2+(@{drain})]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{damagetype=@{damage}}}{{desc=@{notes}}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{magicar=@{magic_ar}}}",
npcspellaoenodicepool: "@{gm_toggle} &{template:rolls-computed}{{dice=[[((@{skill}+@{magic}+@{spellcasting_specialist}+@{spellcasting_expert})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{ampup=[[?{Amp Up|0|1|2|3|4|5|6|7|8|9|10}]]}}{{increasearea=[[?{Increase Area|0m,0|2m,1|4m,2|6m,3|8m,4|10m,5|12m,6|14m,7|16m,8|18m,9|20m,10}*2]]}}{{drain=[[?{Amp Up}*2+?{Increase Area}+(@{drain})]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{damagetype=@{damage}}}{{desc=@{notes}}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}{{magicar=@{magic_ar}}}",
npcnoncombatspellnodicepool: "@{gm_toggle} &{template:rolls-computed}{{dice=[[((@{skill}+@{magic}+@{spellcasting_specialist}+@{spellcasting_expert})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{drain=[[@{drain}]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{damagetype=@{damage}}}{{desc=@{notes}}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
npcnoncombatspellaoenodicepool: "@{gm_toggle} &{template:rolls-computed}{{dice=[[((@{skill}+@{magic}+@{spellcasting_specialist}+@{spellcasting_expert})+@{wounds_toggle}+@{modifiers_toggle}+@{edge_toggle}+@{uda})d6>5@{explode_toggle}cs>5cf<[[(1+@{bad_luck})]]]]}}{{wilddie=[[@{wild_die}]]}}{{glitch=[[0]]}}{{wilddie_dice=[[0]]}}{{dicepool=[[0]]}}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[@{wounds_toggle}]]}}{{edge=[[@{edge_toggle}]]}}{{increasearea=[[?{Increase Area|0m,0|2m,1|4m,2|6m,3|8m,4|10m,5|12m,6|14m,7|16m,8|18m,9|20m,10}*2]]}}{{drain=[[?{Increase Area}+(@{drain})]]}}{{header=@{character_name}}}{{base=@{name} (@{category} ^{magic})}}{{effecttype=@{effect_type}}}{{damagetype=@{damage}}}{{desc=@{notes}}}{{misses=[[0]]}}{{hits=[[0]]}}{{fours=[[0]]}}{{rerolls=[[@{rerolls}]]}}",
add_to_os_tracker: "{{name=[[0 [@{selected|character_name}]]]}}{{attack=[[0 [@{selected|attack}]]]}}{{sleaze=[[0 [@{selected|sleaze}]]]}}{{data_processing=[[0 [@{selected|data_processing}]]]}}{{firewall=[[0 [@{selected|firewall}]]]}}",
};
const initiatives = {
initiative: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[0]]}}{{edge=[[0]]}}{{combat_paralysis=[[@{combat_paralysis}]]}}{{header=@{character_name}}}{{base=^{initiative}}}{{initiative=[[(@{initiative_base}+@{modifiers_toggle})+(@{initiative_dice}d6cf0)]]}}",
astral_initiative: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[0]]}}{{edge=[[0]]}}{{combat_paralysis=[[@{combat_paralysis}]]}}{{header=@{character_name}}}{{base=^{astral} ^{initiative}}}{{initiative=[[(@{astral_initiative_base}+@{modifiers_toggle})+(@{astral_initiative_dice}d6cf0)]]}}",
cold_sim_initiative: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[0]]}}{{edge=[[0]]}}{{combat_paralysis=[[@{combat_paralysis}]]}}{{header=@{character_name}}}{{base=^{coldsiminitiative}}}{{initiative=[[(@{cold_sim_initiative_base}+@{modifiers_toggle})+(@{cold_sim_initiative_dice}d6cf0)]]}}",
hot_sim_initiative: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[0]]}}{{edge=[[0]]}}{{combat_paralysis=[[@{combat_paralysis}]]}}{{header=@{character_name}}}{{base=^{hotsiminitiative}}}{{initiative=[[(@{hot_sim_initiative_base}+@{modifiers_toggle})+(@{hot_sim_initiative_dice}d6cf0)]]}}",
matrix_initiative: "@{gm_toggle} &{template:rolls-computed}{{mod=[[@{modifiers_toggle}]]}}{{wound=[[0]]}}{{edge=[[0]]}}{{combat_paralysis=[[@{combat_paralysis}]]}}{{header=@{character_name}}}{{base=^{matrixinitiative}}}{{initiative=[[(@{matrix_initiative_base}+@{modifiers_toggle})+(@{matrix_initiative_dice}d6cf0)]]}}",
};
// Initiative Rollers"
Object.keys(initiatives).forEach((ini) => {
on(`clicked:${ini}`, (eventInfo) => {
const displayRoll = startRoll(initiatives[eventInfo.triggerName.slice(8)], (results) => {
var rolled = results.results.initiative.dice;
var init = results.results.initiative.result;
// combat_paralysis means initiative gets divided by 2 rounded up.
if(results.results.combat_paralysis.result) {
init = Math.ceil(init / 2);
}
let trueInitiative = init;
finishRoll(
results.rollId, {
initiative: init,
glitch: 0,
wilddie_dice: 0,
wilddie: 0,
}
);
// Roll with the API (!) to hide the roll and add the same value as the calculated initiative to the tracker
const trackerRoll = startRoll(`![[${trueInitiative}&{tracker}]]`, (tracker) => {
finishRoll(
tracker.rollId, {}
);
});
});
});
});
// Normal non-repeating rollers
['d6',
'body', 'agility', 'reaction', 'strength', 'willpower', 'logic', 'intuition', 'charisma', 'edge',
'composure', 'judge_intentions', 'memory', 'social_rating', 'lift_carry', 'sprint',
'default',
'dr', 'defense', 'toxin_resist', 'soak', 'magic_ar', 'direct_magic_defense', 'indirect_magic_defense', 'soak_matrix', 'soak_biofeedback', 'primary_range_weapon', 'primary_range_weapon_split_pool_2', 'primary_melee_weapon',
'natural_healing_physical', 'natural_healing_stun',
'spell_drain', 'preparation_drain', 'ritual_drain', 'adept_drain', 'conjuring_drain',
'conjuring', 'SpiritResistForce1', 'SpiritResistForce2', 'SpiritResistForce3', 'SpiritResistForce4', 'SpiritResistForce5', 'SpiritResistForce6', 'SpiritResistForce7', 'SpiritResistForce8', 'SpiritResistForce9', 'SpiritResistForce10',
'matrix_device_rating', 'matrix_attack_rating', 'matrix_defense_rating', 'matrix_attack', 'matrix_sleaze', 'matrix_data_processing', 'matrix_firewall',
'fade', 'fade_compiling', 'compiling', 'spriteresistlevel1', 'spriteresistlevel2', 'spriteresistlevel3', 'spriteresistlevel4', 'spriteresistlevel5', 'spriteresistlevel6', 'spriteresistlevel7', 'spriteresistlevel8', 'spriteresistlevel9', 'spriteresistlevel10',
'connections1', 'connections2', 'connections3', 'connections4', 'connections5', 'connections6', 'connections7', 'connections8', 'connections9', 'connections10',
'loyalty1', 'loyalty2', 'loyalty3', 'loyalty4', 'loyalty5', 'loyalty6', 'loyalty7', 'loyalty8', 'loyalty9', 'loyalty10',
'matrix_backdoor_entry', 'matrix_brute_force', 'matrix_check_os', 'matrix_control_device', 'matrix_crack_file', 'matrix_crash_program', 'matrix_data_spike', 'matrix_disarm_data_bomb', 'matrix_edit_file', 'matrix_encrypt_file', 'matrix_erase_matrix_signature', 'matrix_format_device', 'matrix_hash_check', 'matrix_hide', 'matrix_jackout', 'matrix_jam_signals', 'matrix_jump_into_rigged_device', 'matrix_matrix_perception', 'matrix_matrix_search', 'matrix_probe', 'matrix_reboot_device', 'matrix_set_data_bomb', 'matrix_snoop', 'matrix_spoof_command', 'matrix_tarpit', 'matrix_trace_icon',
'matrix_calibration', 'matrix_delayed_command', 'matrix_denial_of_service', 'matrix_device_lock', 'matrix_garbage_in_garbage_out', 'matrix_known_exploit_backdoor_entry', 'matrix_masquerade', 'matrix_metahuman_in_the_middle', 'matrix_modify_icon', 'matrix_popup', 'matrix_squelch', 'matrix_subvert_infrastructure', 'matrix_threat_analysis', 'matrix_watchdog',
'matrixresist_int_f', 'matrixresist_f_s', 'matrixresist_w_f', 'matrixresist_dp_f', 'matrixresist_f_f', 'matrixresist_int_dp', 'matrixresist_dp_s', 'matrixresist_c_dp', 'matrixresist_dp_dr', 'matrixresist_a_dp', 'matrixresist_w_s', 'matrixresist_dr_dr', 'matrixresist_l_f', 'matrixresist_pilot_f', 'matrixresist_s_s',
'host_rating', 'host_attack', 'host_sleaze', 'host_data_processing', 'host_firewall',
'pilot', 'vehicle_dr', 'vehicle_defense', 'npc_clearsight', 'npc_electronicwarfare', 'npc_evasion', 'npc_maneuvering', 'npc_stealth', 'npc_targeting', 'npc_targeting2', 'npc_targeting3',
'level', 'sprite_attack', 'sprite_sleaze', 'sprite_data_processing', 'sprite_firewall', 'resonance',
'spirit_dr', 'spiritskill',
].forEach((button) => {
on(`clicked:${button}`, (eventInfo) => {
console.log(eventInfo);
var rollButton = rollButtons[eventInfo.triggerName.slice(8)];
console.log(rollButton);
rollProcessor(rollButton);
});
});
// Add selected token to OS Tracker
on(`clicked:add_to_os_tracker`, (eventInfo) => {
console.log(eventInfo);
var rollButton = rollButtons.add_to_os_tracker;
startRoll(`!${rollButton}`, (results) => {
let exp_regex = /0 \[(.*?)\]/;
let os_tracker_row = {
name: results.results.name.expression.replace(exp_regex, "$1"),
attack: results.results.attack.expression.replace(exp_regex, "$1"),
sleaze: results.results.sleaze.expression.replace(exp_regex, "$1"),
data_processing: results.results.data_processing.expression.replace(exp_regex, "$1"),
firewall: results.results.firewall.expression.replace(exp_regex, "$1"),
};
// make a new repeatingRowID
var newId = generateRowID();
setAttrs({
[`repeating_os-tracker_${newId}_name`]: os_tracker_row.name,
[`repeating_os-tracker_${newId}_attack`]: os_tracker_row.attack,
[`repeating_os-tracker_${newId}_sleaze`]: os_tracker_row.sleaze,
[`repeating_os-tracker_${newId}_data_processing`]: os_tracker_row.data_processing,
[`repeating_os-tracker_${newId}_firewall`]: os_tracker_row.firewall,
[`repeating_os-tracker_${newId}_notes`]: `A: ${os_tracker_row.attack} | S: ${os_tracker_row.sleaze} | D: ${os_tracker_row.data_processing} | F: ${os_tracker_row.firewall}`,
[`repeating_os-tracker_${newId}_display_flag`]: "on",
[`repeating_os-tracker_${newId}_flag`]: 0,
});
finishRoll(
results.rollId, {
}
);
});
});
// Bump 4s 1-7
for(c = 1; c < 7; c++) {
on(`clicked:bump_fours${c}`, (eventInfo) => {
var to_bump = eventInfo.triggerName.slice(18);
var rollButton = rollButtons.bump_fours;
rollButton = rollButton.replace('-#-', to_bump);
rollProcessor(rollButton);
});
}
// Rerolls 1-50
for(c = 1; c < 50; c++) {
on(`clicked:reroll${c}`, (eventInfo) => {
var default_dice = eventInfo.triggerName.slice(14);
var rollButton = rollButtons.reroll;
rollButton = rollButton.replace('-#-', default_dice);
rollProcessor(rollButton);
});
}
// Repeating Skill Rolls
['repeating_skills:skill', 'repeating_skills:spec', 'repeating_skills:expert', 'repeating_skills:spriteskill', 'repeating_skills:spiritskill'].forEach((button) => {
on(`clicked:${button}`, (eventInfo) => {
var buttonType = eventInfo.triggerName.split('_')[eventInfo.triggerName.split('_').length - 1];
var rollButton = rollButtons[buttonType];
['name', 'spec', 'expert', 'display_spec', 'display_expert', 'rating', 'attribute', 'display_attribute', 'mod', 'notes', 'skill'].forEach((field) => {
var replacement = eventInfo.triggerName.slice(8);
var re = RegExp(buttonType+'$', "g");
replacement = replacement.replace(re, field);
rollButton = rollButton.replace('@{'+field+'}', '@{'+replacement+'}');
});
console.log(rollButton);
rollProcessor(rollButton);
});
});
// Repeating Weapon Rolls
['repeating_range:rangeweapon', 'repeating_melee:meleeweapon', 'repeating_grenade:grenadeweaponnodicepool', 'repeating_grenade:grenadeweapon', 'repeating_range:npcrangeweaponnodicepool', 'repeating_range:npcrangeweapon', 'repeating_melee:npcrangeweaponnodicepool', 'repeating_melee:npcmeleeweaponnodicepool', 'repeating_melee:npcmeleeweapon'].forEach((button) => {
on(`clicked:${button}`, (eventInfo) => {
var buttonType = eventInfo.triggerName.split('_')[eventInfo.triggerName.split('_').length - 1];
var rollButton = rollButtons[buttonType];
['name', 'type', 'spec', 'expert', 'dicepool_modifier', 'ground_zero', 'close', 'near', 'medium', 'far', 'extreme', 'blast', 'rating', 'attr_rating', 'damage', 'skill', 'attribute', 'mode', 'notes', 'dicepool', 'dicepool_mod'].forEach((field) => {
var replacement = eventInfo.triggerName.slice(8);
var re = RegExp(buttonType+'$', "g");
replacement = replacement.replace(re, field);
rollButton = rollButton.replace('@{'+field+'}', '@{'+replacement+'}');
});
console.log(rollButton);
rollProcessor(rollButton);
});
});
// Repeating Spell/Preparation/Ritual Rolls
['repeating_spell:spell', 'repeating_spell:spellaoe', 'repeating_spell:noncombatspell', 'repeating_spell:noncombatspellaoe', 'repeating_preparations:preparation', 'repeating_ritual:ritual', 'repeating_npcspell:npcspell', 'repeating_npcspell:npcspellaoe', 'repeating_npcspell:npcnoncombatspell', 'repeating_npcspell:npcnoncombatspellaoe', 'repeating_spell:npcspell', 'repeating_spell:npcspellaoe', 'repeating_spell:npcnoncombatspell', 'repeating_spell:npcnoncombatspellaoe', 'repeating_spell:npcspellnodicepool', 'repeating_spell:npcspellaoenodicepool', 'repeating_spell:npcnoncombatspellnodicepool', 'repeating_spell:npcnoncombatspellaoenodicepool'].forEach((button) => {
on(`clicked:${button}`, (eventInfo) => {
var buttonType = eventInfo.triggerName.split('_')[eventInfo.triggerName.split('_').length - 1];
var rollButton = rollButtons[buttonType];
['sheet_type', 'name', 'category', 'effect_type', 'skill', 'dicepool_modifier', 'specialization', 'expertise', 'drain', 'spec', 'expert', 'threshold', 'potency', 'notes', 'damage', 'dicepool', 'effect_type'].forEach((field) => {
var replacement = eventInfo.triggerName.slice(8);
var re = RegExp(buttonType+'$', "g");
replacement = replacement.replace(re, field);
rollButton = rollButton.replace('@{'+field+'}', '@{'+replacement+'}');
});
getAttrs(['spellcasting_specialist', 'spellcasting_expert'], (v) => {
rollButton = rollButton.replace('@{spellcasting_specialist}', v.spellcasting_specialist);
rollButton = rollButton.replace('@{spellcasting_expert}', v.spellcasting_expert);
});
rollProcessor(rollButton);
});
});
// Repeating Complex Form Rolls
['repeating_forms:complexform', 'repeating_forms:complexformdice', 'repeating_forms:complexformnoroll'].forEach((button) => {
on(`clicked:${button}`, (eventInfo) => {
var buttonType = eventInfo.triggerName.split('_')[eventInfo.triggerName.split('_').length - 1];
var rollButton = rollButtons[buttonType];
['name', 'skill', 'dice', 'dicepool_modifier', 'spec', 'expert', 'fade', 'notes'].forEach((field) => {
var replacement = eventInfo.triggerName.slice(8);
var re = RegExp(buttonType+'$', "g");
replacement = replacement.replace(re, field);
rollButton = rollButton.replace('@{'+field+'}', '@{'+replacement+'}');
});
rollProcessor(rollButton);
});
});
// Repeating Vehicle Rolls
['repeating_vehicle:pcclearsight', 'repeating_vehicle:pcevasion', 'repeating_vehicle:pcstealth', 'repeating_vehicle:pcelectronicwarfare', 'repeating_vehicle:pcmaneuvering', 'repeating_vehicle:pctargeting'].forEach((button) => {
on(`clicked:${button}`, (eventInfo) => {
var buttonType = eventInfo.triggerName.split('_')[eventInfo.triggerName.split('_').length - 1];
var rollButton = rollButtons[buttonType];
['name', 'display_sensor', 'display_pilot', 'clearsight', 'evasion', 'stealth', 'electronicwarfare', 'maneuvering', 'targeting', 'notes'].forEach((field) => {
var replacement = eventInfo.triggerName.slice(8);
var re = RegExp(buttonType+'$', "g");
replacement = replacement.replace(re, field);
rollButton = rollButton.replace('@{'+field+'}', '@{'+replacement+'}');
});
rollProcessor(rollButton);
});
});
// Generic Extended Test Rolls
['extended_start', 'extended_next'].forEach((button) => {
on(`clicked:${button}`, async (eventInfo) => {
//console.log(eventInfo);
//console.log("Extended Test!");
var buttonName = eventInfo.triggerName.slice(17);
rollButton = rollButtons[eventInfo.triggerName.slice(8)];
let passthrough = {};
if(eventInfo.originalRollId) {
let parts = eventInfo.originalRollId.split(',');
//console.log(parts);
passthrough = rollEscape.unescape(parts[0]);
//console.log("Passthrough unescaped.");
//console.log(passthrough);
// update the dicepool and new dicepool (-1 each) and update intervals (+1)
passthrough.dicepool -= 1;
passthrough.newdicepool -= 1;
passthrough.intervals++;
passthrough.reason = parts[1];
// replace placeholders in the rollButton string with the passthrough values
rollButton = rollButton.replace(/%BASE%/g, passthrough.base);
rollButton = rollButton.replace(/%DICEPOOL%/g, passthrough.dicepool);
rollButton = rollButton.replace(/%REASON%/g, passthrough.reason);
rollButton = rollButton.replace(/%DESC%/g, passthrough.desc);
rollButton = rollButton.replace(/%NEWDICEPOOL%/g, passthrough.newdicepool);
rollButton = rollButton.replace(/%INTERVALS%/g, passthrough.intervals);
}
//console.log("Passthrough parsed.");
//console.log("rollButton updated.");
//console.log(rollButton);
await rollProcessor(rollButton, eventInfo, passthrough);
});
});
/* Thanks to Oosh on the Roll20 forums for this bit of code
Helper - the data passed through in an action button needs these characters escaped
I have used a mongrel escape sequence to avoid triggering anything internal in Roll20
This may not be a complete list of characters that need escaping! If you have heavily
punctuated text, it might break the passthrough!
*/
const rollEscape = {
chars: {
'"': '%quot;',
',': '%comma;',
':': '%colon;',
'}': '%rcub;',
'{': '%lcub;',
},
escape(str) {
str = (typeof(str) === 'object') ? JSON.stringify(str) : (typeof(str) === 'string') ? str : null;
return (str) ? `${str}`.replace(new RegExp(`[${Object.keys(this.chars)}]`, 'g'), (r) => this.chars[r]) : null;
},
unescape(str) {
str = `${str}`.replace(new RegExp(`(${Object.values(this.chars).join('|')})`, 'g'), (r) => Object.entries(this.chars).find(e=>e[1]===r)[0]);
return JSON.parse(str);
}
};
/************************************
* Roll Processor
* - This does the heavy lifting
************************************/
var rollProcessor = async (rollButton, ev = {}, passthrough = {}) => {
//console.log(ev);
//console.log(passthrough);
//console.log(rollButton);
getAttrs(['bad_luck'], (v) => {
startRoll(rollButton, (results) => {
//console.log(results.results);
// setup our passthrough values
if(results.results.extendedtest && results.results.extendedtest.result == 1) {
//console.log("Setting up passthrough for start");
passthrough.dicepool = parseInt(results.results.dicepool.result);
passthrough.newdicepool = parseInt(results.results.dicepool.result - 1);
passthrough.hitstotal = parseInt(0);
passthrough.intervals = parseInt(1);
// passthrough.reason = results.results.reason.expression;
//console.log(passthrough);
}
//console.log(results.results);
if(! results.results.dice) {
results.results.dice = {dice: []}
}
if(! results.results.wilddie) {
results.results.wilddie = {dice: []}
}
var split_pool_dicepool_1 = 0;
var split_pool_dicepool_2 = 0;
// If they are splitting their pool we need to fudge the results.results.dice object
// to be roll1 and roll2 objects combined.
if(results.results.split_pool && results.results.split_pool.result && results.results.roll1 && results.results.roll2) {
split_pool_dicepool_1 = results.results.roll1.dice.length;
split_pool_dicepool_2 = results.results.roll2.dice.length;
results.results.dice.dice = results.results.roll1.dice.concat(results.results.roll2.dice);
results.results.dice.result = results.results.roll1.result + results.results.roll2.result;
} else {
results.results.roll1 = [];
results.results.roll2 = [];
}
var rolled = results.results.dice.dice;
var fours = rolled.reduce((a, v) => (v == 4 ? a + 1 : a), 0);
// deal with wild dice on normal rolls else split rolls
if(! results.results.split_pool) {
wd_out = process_wild_dice(results.results.wilddie.result, rolled);
hits = wd_out.hits;
total_hits = wd_out.total_hits;
wd_results = wd_out.wd_results;
hits1 = 0;
total_hits1 = 0;
roll1_wd_results = 0;
results.results.wilddie1 = [];
hits2 = 0;
total_hits2 = 0;
roll2_wd_results = 0;
results.results.wilddie2 = [];
} else {
wd_out = process_wild_dice(results.results.wilddie1.result, results.results.roll1.dice);
hits1 = wd_out.hits;
total_hits1 = wd_out.total_hits;
roll1_wd_results = wd_out.wd_results;
wd_out = process_wild_dice(results.results.wilddie2.result, results.results.roll2.dice);
hits2 = wd_out.hits;
total_hits2 = wd_out.total_hits;
roll2_wd_results = wd_out.wd_results;
hits = hits1 + hits2;
total_hits = total_hits1 + total_hits2;
wd_results = roll1_wd_results + roll2_wd_results;
}
// Check for glitches on normal rolls else split rolls
if(! results.results.split_pool) {
glitch = check_glitches(v, rolled, hits);
glitch1 = 0;
glitch2 = 0;
} else {
glitch = 0;
glitch1 = check_glitches(v, results.results.roll1.dice, hits);
glitch2 = check_glitches(v, results.results.roll2.dice, hits);
}
if(results.results.sprint) {
dice = results.results.dice.results;
}
var misses = results.results.dice.dice.length - hits;
// handle last second total hits tally for extended tests
if(results.results.extendedtest && results.results.extendedtest.result) {
passthrough.hitstotal = parseInt(passthrough.hitstotal + total_hits);
//console.log(passthrough);
}
finishRoll(
results.rollId, {
dice: total_hits,
roll1: total_hits1,
roll2: total_hits2,
glitch: glitch,
glitch1: glitch1,
glitch2: glitch2,
wilddie_dice: wd_results,
wilddie1_dice: roll1_wd_results,
wilddie2_dice: roll2_wd_results,
wilddie: results.results.wilddie.result,
wilddie1: results.results.wilddie1.result,
wilddie2: results.results.wilddie2.result,
dicepool: results.results.dice.dice.length,
split_pool_dicepool_1: split_pool_dicepool_1,
split_pool_dicepool_2: split_pool_dicepool_2,
misses: misses,
hits: hits,
hits1: hits1,
hits2: hits2,
fours: fours,
passthrough: rollEscape.escape(passthrough),
hitstotal: passthrough.hitstotal,
}
);
});
});
};
var process_wild_dice = (wd_result, rolled) => {
var wild_die_results = [];
var wilddie_dice = [];
if(wd_result) {
wild_die_results = rolled.slice(0, wd_result);
wilddie_dice = wild_die_results.join(', ');
} else {
wd_result = 0;
}
wd_results = wild_die_results.join(', ');
var wild_die_hits = 0;
var hits_threshold = 5;
var wd_hits = 0;
var wd_glitch = 0;
// deal with (potentially) multiple wild dice
// we sort these in ascending order because glitches impact other stuff
wild_die_results.sort(function(a, b){return a-b}).forEach((die) => {
if(die < 2) {
hits_threshold = 6;
wd_glitch++;
}
if(die >= hits_threshold) {
wd_hits += 2;
}
});
var hits = rolled.reduce((a, v) => (v >= hits_threshold ? a + 1 : a), 0);
var total_hits = hits + wd_hits;
return {hits: hits, total_hits: total_hits, wd_results: wd_results};
};
var check_glitches = (v, rolled, hits) => {
var glitch_threshold = 1;
if(parseInt(v.bad_luck) > 0) {
glitch_threshold = 2;
}
var glitches_ones = rolled.reduce((a, v) => (v == 1 ? a + 1 : a), 0);
var glitches = rolled.reduce((a, v) => (v <= glitch_threshold ? a + 1 : a), 0);
// bad luck will not cause critical glitches so if it would have been a critical glitch counting 2s it is just a glitch
var glitch = 0;
if(glitches > rolled.length / 2) {
if(hits) {
glitch = 1;
} else if(glitches_ones <= rolled.length / 2) {
// without bad luck it would not have been a glitch so critical glitch just becomes a glitch.
glitch = 1;
} else {
glitch = 2;
}
}
return glitch;
};
// Wild Die toggle changed
on("change:wild_die", (eventInfo) => {
//console.log(eventInfo);
if(eventInfo.newValue == 0) {
setAttrs({
wild_die1: eventInfo.newValue,
wild_die2: eventInfo.newValue
});
} else {
setAttrs({
wild_die1: "?{Wild Dice for First Roll?|0}",
wild_die2: "?{Wild Dice for Second Roll?|0}"
});
}
});
on("change:character_name", (eventInfo) => {
set_display_name(eventInfo.newValue);
});
var set_display_name = (name) => {
character_name = name.replace(/[\}\)\|]/g, '*');
setAttrs({
character_name: character_name
});
};
/*******************************************
* Modifications field processing *
* - This allows custom attribute overrides *
* via the 'Modifications' inputs *
*******************************************/
on("change:repeating_quality:modifications remove:repeating_quality change:repeating_augmentations:modifications remove:repeating_augmentations change:repeating_items:modifications remove:repeating_items change:repeating_devices:modifications remove:repeating_devices change:repeating_programs:modifications change:repeating_programs:powered_on remove:repeating_programs change:repeating_echoes:modifications remove:repeating_echoes change:repeating_forms:modifications remove:repeating_forms change:repeating_powers:modifications remove:repeating_powers change:repeating_metamagic:modifications remove:repeating_metamagic change:repeating_effects:modifications remove:repeating_effects change:repeating_effects:active remove:repeating_range-weapon-mods change:repeating_range-weapon-mods:modifications change:repeating_range-weapon-mods:active", (eventInfo) => {
var allowed_modifiers = [
'body_modifier', 'agility_modifier', 'reaction_modifier', 'strength_modifier', 'willpower_modifier', 'logic_modifier', 'intuition_modifier', 'charisma_modifier',
'magic_modifier', 'resonance_modifier',
'overflow_modifier', 'physical_modifier', 'stun_modifier',
'initiative_mod', 'initiative_dice_mod', 'astral_initiative_mod', 'astral_initiative_dice_mod', 'matrix_initiative_mod', 'matrix_initiative_dice_mod', 'cold_sim_initiative_mod', 'cold_sim_initiative_dice_mod', 'hot_sim_initiative_mod', 'hot_sim_initiative_dice_mod',
'composure_modifier', 'judge_intentions_modifier', 'memory_modifier', 'lift_carry_modifier', 'move_speed', 'sprint_speed', 'sprint_modifier',
'attack_modifier', 'sleaze_modifier', 'data_processing_modifier', 'firewall_modifier', 'matrix_defense_rating_modifier',
'combat_paralysis'
];
repName = /(.+-[^_]+)_(.*)$/.exec(eventInfo.triggerName);
var repAttr;
if(! repName) {
repName = eventInfo.triggerName;
} else {
repAttr = repName[2];
repName = repName[1];
}
// Unfortunately we were having issues letting this trigger on
// sheet worker changes to repeating-range-weapon-mods
if(repName.includes("repeating_range-weapon-mods_", 0) && repAttr == "active" && eventInfo.sourceType != "player") {
return;
}
var attrsToGet = ['enable_modifiers', 'enable_unrestricted_modifiers', `${repName}_powered_on`, `${repName}_active`, `${repName}_modifications`];
getAttrs(attrsToGet, (v) => {
if(v.enable_modifiers != "1") {
return;
}
// If we're using either powered_on or active buttons we need to make sure the toggle is on for one of them
// and we only do this if the modifications itself was changed
if(eventInfo.sourceAttribute.includes("modifications")) {
if(v[`${repName}_powered_on`] && v[`${repName}_powered_on`] !== "on") {
return;
}
if(v[`${repName}_active`] && v[`${repName}_active`] !== "on") {
return;
}
}
// If the change was triggered by a power_on or active toggle changing
// we need to update our newValue and previousValue appropriately to apply or remove the effect
if(eventInfo.sourceAttribute.includes("powered_on") || eventInfo.sourceAttribute.includes("active")) {
if(eventInfo.newValue === "on") {
eventInfo.previousValue = '';
eventInfo.newValue = v[`${repName}_modifications`];
} else {
eventInfo.newValue = '';
eventInfo.previousValue = v[`${repName}_modifications`];
}
}
// If it is actually a removal of the repeating item we need to make sure if the item has powered_on or active buttons that it's not off (if it's off the mods were already removed)
if(eventInfo.removedInfo) {
if(eventInfo.removedInfo[`${eventInfo.sourceAttribute}_powered_on`] && eventInfo.removedInfo[`${eventInfo.sourceAttribute}_powered_on`] !== "on") {
return;
}
if(eventInfo.removedInfo[`${eventInfo.sourceAttribute}_active`] && eventInfo.removedInfo[`${eventInfo.sourceAttribute}_active`] !== "on") {
return;
}
eventInfo.previousValue = eventInfo.removedInfo[`${eventInfo.sourceAttribute}_modifications`];
eventInfo.newValue = '';
}
// if previousValue and newValue are the same and it was not removed it was added. Not sure why roll20 gives us the newValue as previousValue when creating an entry
if(eventInfo.previousValue === eventInfo.newValue) {
eventInfo.previousValue = '';
}
var oldParts = (eventInfo.previousValue) ? eventInfo.previousValue.split(/\s*,\s*/) : [];
var newParts = (eventInfo.newValue) ? eventInfo.newValue.split(/\s*,\s*/) : [];
var op = {},
np = {},
mods = {},
keys = {};
mods.old = {};
mods.new = {};
oldParts.forEach(e => {
parts = e.split(/\s*:\s*/);
if(mods.old[parts[0]]) {
mods.old[parts[0]] += parseInt(parts[1]);
} else {
mods.old[parts[0]] = parseInt(parts[1]);
}
(typeof keys[parts[0]] === 'undefined') ? keys[parts[0]] = 1 : keys[parts[0]]++;
})
newParts.forEach(e => {
parts = e.split(/\s*:\s*/);
if(mods.new[parts[0]]) {
mods.new[parts[0]] += parseInt(parts[1]);
} else {
mods.new[parts[0]] = parseInt(parts[1]);
}
(typeof keys[parts[0]] === 'undefined') ? keys[parts[0]] = 1 : keys[parts[0]]++;
})
Object.keys(keys).forEach(k => {
if(mods.old[k] == mods.new[k]) {
// Nothing changed, skipping
} else {
if(! allowed_modifiers.includes(k) && v[`enable_unrestricted_modifiers`] != 1) {
console.log('Unrestricted Modifiers not enabled, tried to update ('+k+') which is not whitelisted');
} else if(k !== "0" && k !== "on") {
update_attribute({
'key': k,
'old': mods.old[k],
'new': mods.new[k]
});
}
}
})
});
});
var update_attribute = (attr) => {
getAttrs([`${attr.key}`], (v) => {
if(v[`${attr.key}`] !== 'NaN') {
currentV = /([+-]*\d+)(.*)/.exec(v[`${attr.key}`]);
} else {
v[`${attr.key}`] = 0;
currentV = [0, 0, ''];
}
// Sanity checking because js freaks out on undefined or NaN values when you try to do math with them
if(! v[`${attr.key}`]) {
v[`${attr.key}`] = 0;
}
if(! currentV) {
currentV = [0, 0, ''];
}
if(! attr.new) {
attr.new = 0;
}
if(! attr.old) {
attr.old = 0;
}
var newV = 0;
// the mod was removed, undo the old value
if(attr.old && ! attr.new) {
newV = parseInt(currentV[1]) - parseInt(attr.old)
}
// the mod was added, use the new value
if(! attr.old && attr.new) {
newV = parseInt(currentV[1]) + parseInt(attr.new);
}
// it's an update to the mod, figure out the difference and apply it
if(attr.old && attr.new && attr.old != attr.new) {
var diff = modify_value([attr.old, attr.new]);
newV = parseInt(v[`${attr.key}`]) + parseInt(diff)
}
setAttrs({
[`${attr.key}`]: newV + currentV[2]
});
});
};
var modify_value = (params) => {
var diff = 0;
var re = /([+-]*)(\d+)/;
var oldV = re.exec(params[0]);
var newV = re.exec(params[1]);
if(parseInt(oldV[0]) > parseInt(newV[0])) { // oldV is higher, we are subtracting
// subtracting
diff = -1 * (parseInt(oldV[0]) - parseInt(newV[0]));
} else if(parseInt(oldV[0]) < parseInt(newV[0])) { // newV is higher, we are adding
// adding
diff = parseInt(newV[0]) - parseInt(oldV[0]);
} else { // they are equal
// no change diff still 0;
}
return diff;
};
on("clicked:shots_remove clicked:shots_add", (eventInfo) => {
getAttrs([`shots_fired`], (v) => {
let shots = parseInt(v[`shots_fired`]) || 0;
const trigger = eventInfo.triggerName;
setAttrs({
shots_fired: (shots > 0 && trigger.includes("remove")) ? shots -= 1 : trigger.includes("add") ? shots += 1 : shots
});
});
});
on("clicked:primary_ammo", (eventInfo) => {
getAttrs([`primary_range_weapon_ammo`, `shots_fired`], (v) => {
let ammo = parseInt(v[`primary_range_weapon_ammo`]) || 0;
const shots = parseInt(v[`shots_fired`]) || 0;
setAttrs({
primary_range_weapon_ammo: ammo -= shots
});
});
});
on("change:primary_range_weapon_mode change:primary_range_weapon_ammo_type change:primary_range_weapon_dicepool_modifier change:primary_range_weapon_damage_mod change:primary_range_weapon_close_mod change:primary_range_weapon_near_mod change:primary_range_weapon_medium_mod change:primary_range_weapon_far_mod change:primary_range_weapon_extreme_mod", (eventInfo) => {
var rounds = 1;
var split_dicepool = 0;
getAttrs(['primary_range_weapon_mode', 'primary_range_weapon_ammo_type', 'primary_range_weapon_base_damage', 'primary_range_weapon_base_close', 'primary_range_weapon_base_near', 'primary_range_weapon_base_medium', 'primary_range_weapon_base_far', 'primary_range_weapon_base_extreme', 'primary_range_weapon_split_dicepool', 'primary_range_weapon_damage_mod', 'primary_range_weapon_dicepool_mod', 'primary_range_weapon_close_mod', 'primary_range_weapon_near_mod', 'primary_range_weapon_medium_mod', 'primary_range_weapon_far_mod', 'primary_range_weapon_extreme_mod', 'full_auto_penalty_mod', 'burst_fire_penalty_mod', 'burst_wide_penalty_mod', 'semi_auto_penalty_mod', 'single_shot_penalty_mod'], (v) => {
var toSet = {
primary_range_weapon_damage: v.primary_range_weapon_base_damage,
primary_range_weapon_close: v.primary_range_weapon_base_close,
primary_range_weapon_near: v.primary_range_weapon_base_near,
primary_range_weapon_medium: v.primary_range_weapon_base_medium,
primary_range_weapon_far: v.primary_range_weapon_base_far,
primary_range_weapon_extreme: v.primary_range_weapon_base_extreme
};
var mods = {
arMod: 0,
arModC: v.primary_range_weapon_close_mod | 0,
arModN: v.primary_range_weapon_near_mod | 0,
arModM: v.primary_range_weapon_medium_mod | 0,
arModF: v.primary_range_weapon_far_mod | 0,
arModE: v.primary_range_weapon_extreme_mod | 0,
dvMod: v.primary_range_weapon_damage_mod | 0,
dv_type: ''
};
// Setup mods for firing mode
switch(v.primary_range_weapon_mode) {
case "Full Auto":
// 10 rounds, AR -6
rounds = 10;
mods.arMod += v.full_auto_penalty_mod | 0;
mods.arMod += -6;
break;
case "Burst Fire":
// 4 rounds, AR -4, DV +2
rounds = 4;
mods.arMod += v.burst_fire_penalty_mod | 0;
mods.arMod += -4;
mods.dvMod += 2;
break;
case "Burst Fire Wide":
// 4 rounds, AR -4, split dice pool 2 parts
rounds = 4;
mods.arMod += v.burst_wide_penalty_mod | 0;
mods.arMod += -4;
mods.dvMod += 0;
split_dicepool = 2;
break;
case "Semi Auto":
// 2 rounds, AR -2, DV +1
rounds = 2;
mods.arMod += v.semi_auto_penalty_mod | 0;
mods.arMod += -2;
mods.dvMod += 1;
break;
case "Single Shot":
default:
// 1 round, No changes
rounds = 1;
mods.arMod += v.single_shot_penalty_mod | 0;
mods.arMod += 0;
mods.dvMod += 0;
}
// Setup mods for ammo type
switch(v.primary_range_weapon_ammo_type) {
case "APDS":
// AR +2, DV -1
mods.arMod += +2;
mods.dvMod += -1;
break;
case "Explosive":
// AR +0, DV +1
mods.arMod += 0;
mods.dvMod += +1;
break;
case "Flechette":
// AR +1, DV -1
mods.arMod += +1;
mods.dvMod += -1;
break;
case "Gel":
// AR +0, DV +0, Damage Type: S
mods.arMod += 0;
mods.dvMod += 0;
mods.dv_type = 'S';
break;
case "Handloaded":
// AR +1, DV +0
mods.arMod += +1;
mods.dvMod += 0;
break;
case "Match-Grade":
// AR +0, DV -1, C +1, N +2, M +3, F +3, E +2
mods.arMod += 0;
mods.dvMod += -1;
mods.arModC += +1;
mods.arModN += +2;
mods.arModM += +3;
mods.arModF += +3;
mods.arModE += +2;
break;
case "rEVO":
// AR +0, DV +1, C +1, N -1, M -1, F -2, E -2
mods.arMod += 0;
mods.dvMod += +1;
mods.arModC += +1;
mods.arModN += -1;
mods.arModM += -1;
mods.arModF += -2;
mods.arModE += -2;
break;
case "Stick-n-Shock":
// AR +1, DV -1, Damage Type: S(e)
mods.arMod += +1;
mods.dvMod += -1;
mods.dv_type = 'S(e)';
break;
case "Regular":
// AR +0, DV +0
mods.arMod += 0;
mods.dvMod += 0;
break;
default:
// No changes
mods.arMod += 0;
mods.dvMod += 0;
}
toSet = adjAttrs({
attrs: toSet,
arMod: mods.arMod,
arModC: mods.arModC,
arModN: mods.arModN,
arModM: mods.arModM,
arModF: mods.arModF,
arModE: mods.arModE,
dvMod: mods.dvMod,
dv_type: mods.dv_type,
});
toSet.shots_fired = rounds;
toSet.primary_range_weapon_split_dicepool = split_dicepool;
setAttrs(toSet);
});
});
var adjAttrs = (p) => {
Object.keys(p.attrs).forEach(a => {
mod = p.arMod;
mod_extra = 0;
if(a.endsWith("_damage")) {
mod = p.dvMod;
}
if(a.includes('close') && p.arModC) {
mod_extra = p.arModC;
}
if(a.includes('near') && p.arModN) {
mod_extra = p.arModN;
}
if(a.includes('medium') && p.arModM) {
mod_extra = p.arModM;
}
if(a.includes('far') && p.arModF) {
mod_extra = p.arModF;
}
if(a.includes('extreme') && p.arModE) {
mod_extra = p.arModE;
}
pieces = /(\d+)(.*)/.exec(p.attrs[`${a}`]);
var tot = p.attrs[`${a}`];
if(pieces) {
if(pieces[1] && pieces[1] >= 0) {
tot = parseInt(pieces[1]) + parseInt(mod) + parseInt(mod_extra);
if(tot < 0) {
tot = 0;
}
}
// if this was damage then there is a second piece (the damage type P, S, S(e), etc)
// if p.dv_type exists the firing mode or ammo type change the damage type
if(pieces[2] && p.dv_type) {
pieces[2] = p.dv_type;
}
p.attrs[`${a}`] = tot + pieces[2];
}
});
return p.attrs;
}
on("clicked:reload", (eventInfo) => {
getAttrs([`primary_range_weapon_ammo_max`], (v) => {
const reload = parseInt(v[`primary_range_weapon_ammo_max`]) || 0;
setAttrs({
primary_range_weapon_ammo: reload
});
});
});
// 2022-02-01 I don't think this does anything
["active", "knowledge", "language"].forEach((attr) => {
on(`clicked:repeating_${attr}:skill`, (eventInfo) => {
settingsToggle(eventInfo);
});
});
["quality", "martial", "items", "range", "melee", "armor", "spell", "preps", "ritual", "powers", "forms", "vehicle", "augementations", "lifestyle", "contacts", "programs"].forEach((attr) => {
on(`clicked:repeating_${attr}:${attr}`, (eventInfo) => {
settingsToggle(eventInfo);
});
});
// This triggers hiding settings when the player clicks one of the roll buttons
const settingsToggle = (eventInfo) => {
const split = eventInfo.sourceAttribute.split("_");
const source = `${split[0]}_${split[1]}_${split[2]}`;
getAttrs([`${source}_flag`], (v) => {
setAttrs({
[`${source}_flag`]: (v[`${source}_flag`] === "settings") ? "display" : "settings"
});
});
};
[`core`, `arms`, `augs`, `gear`, `magic`, `matrix`, `social`, `vehicle`, `options`, `notes`, `rolls`].forEach(attr => {
on(`clicked:tab_${attr}`, () => {
setAttrs({tab: attr});
});
});
on("change:body change:strength change:lift_carry_modifier", (eventInfo) => {
const source = eventInfo.sourceAttribute;
update_common_rolls(["body", "willpower", "lift_carry_modifier"]);
//ONLY RUN ON BODY CHANGE
if (source.includes("body")) {
update_common_rolls(["body", "body", "overflow_modifier"]);
update_common_rolls(["body", "soak_modifier", "soak_temp", `soak_temp_flag`]);
update_track("physical");
};
});
on("change:overflow_modifier", (eventInfo) => {
update_common_rolls(["body", "body", "overflow_modifier"]);
});
on("change:reaction change:intuition", (eventInfo) => {
const source = eventInfo.sourceAttribute;
update_common_rolls(["reaction", "intuition", "defense_modifier", "defense_temp", `defense_temp_flag`]);
update_initiative();
//ONLY RUN ON INTUITION CHANGE
(source.includes("intuition")) ? update_common_rolls(["willpower", "intuition", "judge_intentions_modifier"]) : false;
});
on("change:willpower", () => {
update_common_rolls(["intuition", "willpower", "judge_intentions_modifier"]);
update_common_rolls(["charisma", "willpower", "composure_modifier"]);
update_common_rolls(["body", "willpower", "lift_carry_modifier"]);
update_track("stun");
});
on("change:logic change:memory_modifier", (eventInfo) => {
const source = eventInfo.sourceAttribute;
update_common_rolls(["logic", "intuition", "memory_modifier"]);
});
on("change:intuition change:memory_modifier", (eventInfo) => {
const source = eventInfo.sourceAttribute;
update_common_rolls(["logic", "intuition", "memory_modifier"]);
});
on("change:charisma change:composure_modifier change:judge_intentions_modifier", (eventInfo) => {
const source = eventInfo.sourceAttribute;
//CHARISMA & COMPOSURE UPDATE COMPOSURE
(source.includes("charisma") || source.includes("composure")) ? update_common_rolls(["charisma", "willpower", "composure_modifier"]) : false;
//CHARISMA & JUDGE INTENTIONS UPDATE JUDGE INTENTIONS
(source.includes("charisma") || source.includes("judge")) ? update_common_rolls(["willpower", "intuition", "judge_intentions_modifier"]) : false;
});
on("change:essence", () => {
// This shouldn't be manually changed by the player it's a calculated value. See the update_essence function.
});
on("change:physical_modifier change:flag_drone", () => {
update_track("physical");
});
on("change:stun_modifier", () => {
update_track("stun");
});
on("change:combat_paralysis", (eventInfo) => {
if(eventInfo.newValue == 1) {
setAttrs({
'combat_paralysis_initiative_mod': '/2'
});
} else {
setAttrs({
'combat_paralysis_initiative_mod': ''
});
}
});
on("change:reaction change:intuition change:defense_modifier change:defense_temp change:defense_temp_flag", () => {
update_common_rolls(["reaction", "intuition", "defense_modifier", "defense_temp", `defense_temp_flag`]);
});
on("change:body change:soak_modifier change:soak_temp change:soak_temp_flag", () => {
update_common_rolls(["body", "doesntmatter", "soak_modifier", "soak_temp", `soak_temp_flag`]);
});
on("change:pain_tolerance change:resist_pain change:damage_compensator", () => {
update_wounds();
});
// Update the name of the attribute used when rolling Unskilled Skill Use
on("change:default_attribute", (eventInfo) => {
getAttrs(['default_attribute'], (v) => {
var new_attr;
if(eventInfo.newValue) {
new_attr = eventInfo.newValue;
} else {
new_attr = v.default_attribute;
}
// newValue will be something like "@{attribute_name}" so we cut out the @{ and } and capitalize the first letter
setAttrs({
'default_display': new_attr.charAt(2).toUpperCase() + new_attr.slice(3, -1)
});
});
});
//Calculate ATTRIBUTES
['tasks', 'body', 'agility', 'reaction', 'strength', 'willpower', 'logic', 'intuition', 'charisma', 'magic', 'resonance'].forEach(attr => {
// Attach listener
on(`change:${attr}_base change:${attr}_modifier change:${attr}_temp change:${attr}_temp_flag`, () => {
update_attributes(attr);
});
});
var update_attributes = (attr) => {
// Load attribute values
getAttrs([`${attr}_base`, `${attr}_modifier`, `${attr}_temp`, `${attr}_temp_flag`], (v) => {
// Do some math to calculate the total
const bas = parseInt(v[`${attr}_base`]) || 0;
const mod = parseInt(v[`${attr}_modifier`]) || 0;
const tem = (v[`${attr}_temp_flag`] === "on") ? parseInt(v[`${attr}_temp`]) || 0 : 0;
const bon = mod + tem;
const stat = bas + bon;
// Update the finalized total
setAttrs({
[attr]: stat,
[`display_${attr}`]: bon === 0 ? bas : `${bas} (${stat})`
});
});
};
// Update the essence count (6 + essence_mod - aug_mods - calculated augmentation costs = total)
var update_essence = (eventInfo) => {
let ess = 6;
getSectionIDs("augmentations", (ids) => {
// If there are no augmentations it was likely triggered by a deletion, need to reset aug_essence_cost to 0
if(ids.length == 0) {
setAttrs({
aug_essence_cost: 0
});
}
_.each(ids, (id) => {
getAttrs([`repeating_augmentations_${id}_essence_cost`, `repeating_augmentations_${id}_grade`, `repeating_augmentations_${id}_essence_base`, `repeating_augmentations_${id}_essence_cost_raw`, `repeating_augmentations_${id}_has_rating`, `repeating_augmentations_${id}_rating`], (aug_ess) => {
let toUpdate = {};
let ess_cost = aug_ess[`repeating_augmentations_${id}_essence_cost`] || 0,
rating = aug_ess[`repeating_augmentations_${id}_rating`] || '',
use_raw = aug_ess[`repeating_augmentations_${id}_essence_cost_raw`] || 0,
ess_base = aug_ess[`repeating_augmentations_${id}_essence_base`] || '',
grade = aug_ess[`repeating_augmentations_${id}_grade`] || 'Standard';
if(ess_cost == 'NaN') {
ess_cost = 0;
}
// If use_raw isn't checked we're expected to do magic
if(use_raw == 0) {
// regex to catch "rating x (*)" and use the * part for our essence base multiplied by the rating
let re = /\s*rating\s*x\s*(.*)/i;
let aug_base = aug_ess[`repeating_augmentations_${id}_essence_base`] || "";
let matches = [];
if(typeof aug_base == "string") {
matches = aug_base.match(re);
}
if(matches && matches[1]) {
ess_cost = parseFloat(rating * matches[1]).toFixed(2);
} else {
ess_cost = parseFloat(aug_base).toFixed(2);
}
// Update the essence cost based on the selected grade
switch(grade) {
case 'Standard':
case 'Gammaware':
ess_cost = parseFloat(ess_cost * 1).toFixed(2);
break;
case 'Used':
case 'Omega':
case 'Exoware':
ess_cost = parseFloat(ess_cost * 1.1).toFixed(2);
break;
case 'Alphaware':
ess_cost = parseFloat(ess_cost * 0.8).toFixed(2);
break;
case 'Betaware':
ess_cost = parseFloat(ess_cost * 0.7).toFixed(2);
break;
case 'Deltaware':
ess_cost = parseFloat(ess_cost * 0.5).toFixed(2);
break;
default:
ess_cost = parseFloat(ess_cost * 1.1).toFixed(2);
break;
};
} else {
// we're using the essence_cost raw without any modification so nothing to do here
}
// remove the essence cost of this aug from the current essence
ess = parseFloat(ess - ess_cost).toFixed(2);
toUpdate[`repeating_augmentations_${id}_essence_cost`] = parseFloat(ess_cost).toFixed(2);
toUpdate[`essence`] = parseFloat(ess).toFixed(2);
toUpdate[`aug_essence_cost`] = parseFloat(6 - parseFloat(ess)).toFixed(2);
// set the changes
setAttrs(toUpdate, { silent: true} );
});
});
getAttrs(['essence_mod', 'magic', 'matrix_device_essence_cost'], (a) => {
var ess_mod = 0;
if(! isNaN(a['essence_mod']) && a['essence_mod'] !== '') {
ess_mod = a['essence_mod'];
}
ess = parseFloat(ess) + parseFloat(ess_mod);
ess = parseFloat(ess) - parseFloat(a['matrix_device_essence_cost']) || 0;
setAttrs({
essence: parseFloat(ess).toFixed(2)
}, { silent: true });
});
});
};
//This function watches for changes to augmentations and updates recalculates essence
on("change:essence_mod remove:repeating_augmentations change:repeating_augmentations:essence_cost change:repeating_augmentations:rating change:repeating_augmentations:grade change:repeating_augmentations:essence_base change:repeating_augmentations:essence_cost_raw change:matrix_device_essence_cost", (eventInfo) => {
console.log(eventInfo);
update_essence(eventInfo);
});
// Catch changes to magic, tradition, logic, intuition or charisma to update magic AR
on("change:magic change:tradition change:logic change:intuition change:charisma change:spell_drain_attribute_1 change:spell_drain_attribute_2", (eventInfo) => {
getAttrs(["sheet_type", "magic", "tradition", "logic", "intuition", "charisma", "spell_drain_attribute_1", "spell_drain_attribute_2"], (v) => {
var magic_ar = v.magic;
// do magic_ar different for grunts and spirits
if(v.sheet_type === 'grunt' || v.sheet_type === 'spirit') {
var drain_attr = v.spell_drain_attribute_2;
drain_attr = drain_attr.replace("@{", "");
drain_attr = drain_attr.replace("}", "");
magic_ar = parseInt(v.magic) + parseInt(v[`${drain_attr}`]);
setAttrs({
'magic_ar': magic_ar
});
return;
}
tradition_attribute = 'Charisma';
switch(v.tradition) {
case "Hermeticism":
case "Hermeticism (Logic)":
case "Shamanism (Logic)":
magic_ar += v.logic;
tradition_attribute = 'Logic';
break;
case "Hermeticism (Intuition)":
case "Shamanism (Intuition)":
magic_ar += v.intuition;
tradition_attribute = 'Intuition';
break;
case "Shamanism":
case "Shamanism (Charisma)":
case "Hermeticism (Charisma)":
magic_ar += v.charisma;
tradition_attribute = 'Charisma';
break;
default:
magic_ar = 0;
break;
}
setAttrs({
'magic_ar': magic_ar,
'tradition_attribute': tradition_attribute
});
});
});
/********************************************************/
/* MATRIX TAB SHEET WORKERS */
/********************************************************/
// Show the skill assigned for NPC Complex Forms
on("change:repeating_forms:skill", (eventInfo) => {
let row_id = eventInfo.sourceAttribute.slice(0, -6);
let skillnames = {
'@{electronics}': "Electronics",
'@{cracking}': "Cracking",
'@{tasking}': "Tasking",
};
getAttrs([`${row_id}_skill`], (v) => {
let display = skillnames[v[`${row_id}_skill`]] || "No Roll";
let toUpdate = {};
setAttrs({
[`${row_id}_skillname`]: display
}, {silent: true});
});
});
//This function watches for changes to repeating_devices and updates the ASDF and Device Rating as needed
on("change:repeating_devices remove:repeating_devices", (eventInfo) => {
const source = eventInfo.sourceAttribute;
const newV = eventInfo.newValue;
// sum repeating device matrix initiative bonuses and essence costs
getSectionIDs('devices', function(ids) {
var matrix_bonus = 0;
var essence_cost = 0;
ids.forEach(id => {
getAttrs([`repeating_devices_${id}_matrix_initiative_bonus`, `repeating_devices_${id}_essence_cost`], (a) => {
matrix_bonus += parseInt(a[`repeating_devices_${id}_matrix_initiative_bonus`]) || 0;
essence_cost += parseFloat(a[`repeating_devices_${id}_essence_cost`]) || 0;
setAttrs({
matrix_device_initiative_bonus: matrix_bonus,
matrix_device_essence_cost: essence_cost
});
});
});
// If the device list is empty update these to 0 which triggers recalculations.
if(ids.length == 0) {
setAttrs({
matrix_device_initiative_bonus: 0,
matrix_device_essence_cost: 0,
matrix_device_rating: 0
});
}
});
// Get a bunch of attributes (device rating, primary, ASDF, condition monitor, condition monitor max)
getAttrs(['attr_matrix_con', 'attr_condition_monitor_link', 'repeating_device_name', 'repeating_device_device_rating', 'repeating_device_primary_device', 'repeating_device_attack', 'repeating_device_attack_primary', 'repeating_device_sleaze', 'repeating_device_sleaze_primary', 'repeating_device_data_processing', 'repeating_device_data_processing_primary', 'repeating_device_firewall', 'repeating_device_firewall_primary', 'repeating_device_condition_monitor', 'repeating_device_condition_monitor_max', 'repeating_device_matrix_initiative_bonus'], (v) => {
var toUpdate = {};
// Check if the event was related to the primary flag being turned on (we'll need to recalculate
if(source.includes('primary_device') && newV == '1') {
// Update the attr_matrix_device_rating
toUpdate['matrix_device_rating'] = v['repeating_device_device_rating'] || 0;
// Update condition_monitor_link with the full id of this device
toUpdate['condition_monitor_link'] = eventInfo.triggerName;
// Update matrix_hex with the new condition
toUpdate['matrix_hex'] = v['repeating_device_condition_monitor'] || 0;
// Update matrix_hex with the new condition
toUpdate['matrix_hex_max'] = v['repeating_device_condition_monitor_max'] || 0;
// Uncheck 'primary' from other devices
getSectionIDs('devices', function(ids) {
var updates = {};
ids.forEach(id => {
if('repeating_devices_'+id != eventInfo.triggerName) {
updates[`repeating_devices_${id}_primary_device`] = 0;
}
});
setAttrs(updates);
});
}
/* When the device rating changes so should the Condition Monitor Max ONLY IF they haven't entered something there already*/
if(source.includes('device_rating')) {
if(! v['repeating_device_condition_monitor_max']) {
var device_condition_monitor_max = 8 + Math.ceil(v['repeating_device_device_rating'] / 2)
toUpdate[`${eventInfo.triggerName}_condition_monitor_max`] = device_condition_monitor_max;
if(typeof(v['repeating_device_condition_monitor']) == 'undefined') {
toUpdate[`${eventInfo.triggerName}_condition_monitor`] = device_condition_monitor_max;
}
}
}
/* If they changed the device's condition monitor update the hexes ONLY IF THIS IS THE PRIMARY DEVICE */
if(source.includes('condition_monitor') && v['repeating_device_primary_device'] == '1') {
// Update matrix_hex with the new condition
toUpdate['matrix_hex'] = v['repeating_device_condition_monitor'] || 0;
}
/* If they changed an attribute
If the attribute from this device is used by the persona
Update the persona attribute as well
*/
['attack', 'sleaze', 'data_processing', 'firewall'].forEach(attr => {
if(source.includes(`${attr}`)) {
// one of the attrs changed, is it the primary for the persona?
if(v[`repeating_device_${attr}_primary`] == '1') {
toUpdate[`${attr}_base`] = v[`repeating_device_${attr}`] || 0;
}
if(source.includes(`${attr}_primary`) && newV == '1') {
// If they selected the button uncheck the attribute button from other devices
getSectionIDs('devices', function(ids) {
var updates = {};
ids.forEach(id => {
if('repeating_devices_'+id != eventInfo.triggerName) {
updates[`repeating_devices_${id}_${attr}_primary`] = 0;
}
});
setAttrs(updates);
});
}
}
});
// update everything in toUpdate
setAttrs(toUpdate);
});
});
on("sheet:opened change:attack change:sleaze", (eventInfo) => {
getAttrs(['attack', 'sleaze'], (v) => {
const attack = v['attack'] || 0;
const sleaze = v['sleaze'] || 0;
setAttrs({
matrix_attack_rating: parseInt(attack) + parseInt(sleaze)
});
});
});
on("sheet:opened change:data_processing change:firewall change:matrix_defense_rating_modifier", (eventInfo) => {
getAttrs(['data_processing', 'firewall', 'matrix_defense_rating_modifier'], (v) => {
const data_processing = v['data_processing'] || 0;
const firewall = v['firewall'] || 0;
const matrix_defense_rating_modifier = v['matrix_defense_rating_modifier'] || 0;
setAttrs({
matrix_defense_rating: parseInt(data_processing) + parseInt(firewall) + parseInt(matrix_defense_rating_modifier)
});
});
});
on("change:willpower change:logic change:intuition change:charisma change:flag_special", (eventInfo) => {
techno_update();
});
var techno_update = () => {
getAttrs(['willpower', 'logic', 'intuition', 'charisma', 'flag_special'], (v) => {
if(v['flag_special'] == 'resonance') {
setAttrs({
attack_base: v['charisma'],
sleaze_base: v['intuition'],
data_processing_base: v['logic'],
firewall_base: v['willpower'],
});
}
});
};
/* condition monitor hex change updates device condition monitor */
on("change:matrix_hex", (eventInfo) => {
getAttrs(['matrix_hex', 'condition_monitor_link'], (v) => {
setAttrs({
[`${v['condition_monitor_link']}_condition_monitor`]: v['matrix_hex']
});
});
});
/* Complex Forms Sheetworkers */
on("change:electronics change:resonance", (eventInfo) => {
getAttrs(['electronics', 'resonance'], (v) => {
var complex_forms_attack_rating = parseInt(v['electronics']) || 0;
complex_forms_attack_rating += parseInt(v['resonance']) || 0;
setAttrs({
'complex_form_attack_rating': complex_forms_attack_rating
});
});
});
//This function checks changes to repeating_armor and updates the Primary Armor if needed
on("change:repeating_armor change:body change:charisma remove:repeating_armor", (eventInfo) => {
const source = eventInfo.sourceAttribute;
const newV = eventInfo.newValue;
const arm = ["repeating_armor"];
const armors = [`${arm}_name`, `${arm}_rating`, `${arm}_chem_modifier`, `${arm}_elec_modifier`, `${arm}_cold_modifier`,`${arm}_fire_modifier`, `${arm}_dicepool_modifier`];
//Check if the event was related to the primary flag & armor is set to primary
if (source.includes('primary') && newV === 'primary') {
//Get attributes from the repeating_armor
getAttrs(armors, (v) => {
let update = {};
//Update the hidden static Primary Armor attributes with the repeating_armor attributes
_.each(armors, (armor) => {
const name = (armor.includes("name") || armor.includes("rating")) ? armor.split("repeating_")[1] : armor.split(`${arm}_`)[1];
update[`${name}`] = v[`${armor}`];
});
setAttrs(update);
});
//Set the other repeating_armor primary flags to 0 aka unchecked
getSectionIDs(`${arm}`, function(ids) {
let IDs = [];
let update = {};
for(var i=0; i < ids.length; i++) {
IDs.push(`${arm}_` + ids[i] + "_primary");
};
IDs.forEach(id => {
if (id != source) {
update[`${id}`] = 0;
};
});
setAttrs(update);
});
//Check if the event was for a relevant Primary Armor attribute
} else if (source.includes('name') || source.includes('rating') || source.includes('dicepool') || source.includes('chem') || source.includes('cold') || source.includes('elec') || source.includes('fire')) {
//Get the primary flag attribute for this armor. Also get the repeating_armor attribute we'll need for an update, doing it now is more efficient.
getAttrs([`${arm}_primary`, `${source}`], (v) => {
//Check if this armor is the designated Primary Armor.
if (v[`${arm}_primary`] === 'primary') {
let update = {};
//Apply the repeating_armor attribute to its static counterpart
switch (true) {
case /name/.test(source) :
update["armor_name"] = v[`${source}`];
break;
case /rating/.test(source) :
update["armor_rating"] = v[`${source}`];
break;
case /dicepool/.test(source) :
update["soak_modifier"] = v[`${source}`];
break;
case /chem/.test(source) :
update["chem_modifier"] = v[`${source}`];
break;
case /cold/.test(source) :
update["cold_modifier"] = v[`${source}`];
break;
case /elec/.test(source):
update["elec_modifier"] = v[`${source}`];
break;
case /fire/.test(source) :
update["fire_modifier"] = v[`${source}`];
break;
default:
console.log(`Source ${source} was invalid`);
}
setAttrs(update);
};
});
}
// Update DR and resists on Core Combat Info -> Armor section
getSectionIDs("armor", function(ids) {
// Update rating and resist totals
let ratingTot = 0,
chemTot = 0,
coldTot = 0,
elecTot = 0,
fireTot = 0,
socialTot = 0;
getAttrs(['body', 'charisma'], (v) => {
ratingTot = v['body'];
socialTot = v['charisma'];
});
ids.forEach(id => {
var armorFields = [`${arm}_${id}_rating`, `${arm}_${id}_chem`, `${arm}_${id}_cold`, `${arm}_${id}_elec`, `${arm}_${id}_fire`, `${arm}_${id}_social`, `${arm}_${id}_primary`, `${arm}_${id}_cumulative`];
getAttrs(armorFields, (af) => {
if(af[`${arm}_${id}_primary`] != 0 || af[`${arm}_${id}_cumulative`] != 0) {
ratingTot += parseInt(af[`${arm}_${id}_rating`]);
socialTot += parseInt(af[`${arm}_${id}_social`]);
}
chemTot += parseInt(af[`${arm}_${id}_chem`]);
coldTot += parseInt(af[`${arm}_${id}_cold`]);
elecTot += parseInt(af[`${arm}_${id}_elec`]);
fireTot += parseInt(af[`${arm}_${id}_fire`]);
setAttrs({
'defense_rating': ratingTot,
'resist_cold_total': coldTot,
'resist_chem_total': chemTot,
'resist_elec_total': elecTot,
'resist_fire_total': fireTot,
'social_rating': socialTot,
});
});
});
});
});
// COMMON ROLLS: MEMORY, JUDGE INTENTIONS, COMPOSURE, LIFT & CARRY, OVERFLOW, DEFENSE, & SOAK ROLLS
const update_common_rolls = (attrs) => {
getAttrs(attrs, (v) => {
const found = attrs.find((mod) => { return mod.includes("_modifier") });
const name = found.split("_modifier")[0];
let numbers = [];
//DEFENSE & SOAK HAVE TWO EXTRA ATTRIBUTES. TEMP IS NEEDED BUT ONLY IF THE FLAG IS CHECKED IN SETTINGS
const array = (name === "defense" || name === "soak") ? (v[`${name}_temp_flag`] === "on") ? attrs.splice(0, 4) : attrs.splice(0, 3) : attrs;
_.each(array, (attr) => {
numbers.push(parseInt(v[`${attr}`]) || 0);
});
const add = (a, b) => a + b, sum = numbers.reduce(add);
setAttrs({[`${name}`]: sum});
});
};
//Update condition tracks
const update_track = (track) => {
let attrs = [`${track}_modifier`, `${track}_damage`];
(track === "stun") ? attrs.push("willpower") : attrs.push("body", "sheet_type", "flag_drone");
attrs.push('compendium_drop_in_progress');
getAttrs(attrs, (v) =>{
// If we're in the middle of a compendium drop don't update the tracks, sometimes the compendiums set odd values
if(v.compendium_drop_in_progress) {
return;
}
const attr1 = attrs[2], stat1 = parseInt(v[`${attr1}`]) || 0; //Willpower or Body
const mod = parseInt(v[`${track}_modifier`]) || 0;
const dam = parseInt(v[`${track}_damage`]) || 0;
let update = {};
if (track === "stun" || v["sheet_type"] === "pc" || v["sheet_type"] === "grunt") {
tot = Math.ceil(stat1/2) + 8 + mod;
} else if (v["sheet_type"] === "vehicle" && v["flag_drone"] === "drone") {
tot = (Math.ceil(stat1/2) + 8 + mod);
} else if (v["sheet_type"] === "vehicle") {
tot = (Math.ceil(stat1/2) + 8 + mod);
} else if (v["sheet_type"] === "spirit") {
// spirits are auto calculated
return;
} else {
tot = 0; //Sprites don't have Stun or Physical track
};
const current = (dam != 0) ? tot - dam : tot;
update[`${track}`] = current;
update[`${track}_max`] = tot;
setAttrs(update, {silent:true});
});
};
//Calculate Device Rating Track
on("change:matrix_device_rating change:matrix_modifier change:sensor", () => {
getAttrs(["sheet_type", "matrix_device_rating", "device_rating", "matrix_modifier", "matrix", "sensor"], (v) =>{
if(v.sheet_type == "vehicle") {
dev = parseInt(v.sensor) || 0;
mod = parseInt(v.matrix_modifier) || 0;
} else {
dev = parseInt(v.matrix_device_rating) || parseInt(v.device_rating) || 0;
mod = parseInt(v.matrix_modifier) || 0;
}
const tot = Math.ceil(dev/2) + 8 + mod;
setAttrs({
matrix: tot,
matrix_hex: tot,
matrix_max: tot,
matrix_hex_max: tot,
});
});
});
//Convert physical into the physical damage track boxes and reverse
['physical', 'stun'].forEach(attr => {
on(`change:${attr} change:${attr}_damage`, (eventInfo) => {
getAttrs([`${attr}`, `${attr}_damage`, `${attr}_max`, 'sheet_type'], (v) => {
const stat = parseInt(v[`${attr}`]) || 0,
dam = parseInt(v[`${attr}_damage`]) || 0,
max = parseInt(v[`${attr}_max`]) || 0,
source = eventInfo.sourceAttribute;
const wou = (source === `${attr}`) ? max - stat : max - dam;
//console.log(v);
if (source === `${attr}`) {
(dam === wou) ? false : ((stat < max && dam != wou) ? setAttrs({[`${attr}_damage`]: wou}, {silent: true}) : setAttrs({[`${attr}_damage`]: 0}, {silent: true}));
} else {
(stat === wou) ? false : setAttrs({[`${attr}`]: wou}, {silent: true});
};
update_wounds();
});
});
});
const update_wounds = () => {
getAttrs(["sheet_type", "stun_damage", "physical_damage", "pain_tolerance", "phys_wound_threshold", "stun_wound_threshold", "resist_pain", "damage_compensator"], (v) => {
let stu = parseInt(v.stun_damage) || 0,
phy = parseInt(v.physical_damage) || 0,
pain_tolerance = parseInt(v.pain_tolerance) || 0,
phys_thresh = parseInt(v.phys_wound_threshold) || 3,
stun_thresh = parseInt(v.stun_wound_threshold) || 3;
//console.log(v);
if(v.sheet_type == 'grunt') {
phys_thresh = 2,
stun_thresh = 2;
}
//console.log(v);
//console.log("stu: "+stu+"\nphy: "+phy+"\npain_tolerance: "+pain_tolerance+"\nphys_thresh: "+phys_thresh+"\nstun_thresh: "+stun_thresh);
// Damage Compensator
if(v.damage_compensator > 0) {
p_int = Math.floor(phy / phys_thresh) || 0;
p_modulus = phy % phys_thresh || 0;
s_int = Math.floor(stu / stun_thresh) || 0;
s_modulus = stu % stun_thresh || 0;
dcomp = parseInt(v.damage_compensator);
//console.log("p_int: "+p_int+"\np_modulus: "+p_modulus+"\ns_int: "+s_int+"\ns_modulus: "+s_modulus);
//console.log("dcomp: "+dcomp);
if(p_int > 0 && s_int > 0) {
// both have wound mods
//console.log("both phys and stun");
// if dcomp can wipe out both modulus + 2 (effectively removing 2 penalty dice) do it
// if not but it is greater than p_modulus + 1 or s_modulus + 1 get rid of one of the penalty dice
if(dcomp >= (p_modulus + s_modulus + 2)) {
phy -= (p_modulus + 1);
stu -= (s_modulus + 1);
dcomp -= (p_modulus + s_modulus + 2);
} else if(dcomp > (p_modulus + 1)) {
phy -= (p_modulus + 1);
dcomp -= (p_modulus + 1);
} else if(dcomp > (s_modulus + 1)) {
stu -= (s_modulus + 1);
dcomp -= (s_modulus + 1);
}
//console.log("phy: "+phy+"\nstu: "+stu+"\ndcomp: "+dcomp);
// If there's still dcomp to use up if it's greater than phy_threshold or stu_threshold and they have penalties wipe them out.
//console.log((phy - (phys_thresh - 1)) + (stu - (stun_thresh - 1)));
if(dcomp >= (phy - (phys_thresh - 1)) + (stu - (stun_thresh - 1))) {
phy = phys_thresh - 1;
stu = stun_thresh - 1;
}
//console.log("phy: "+phy+"\nstu: "+stu+"\ndcomp: "+dcomp);
if(phys_thresh == stun_thresh || phys_thresh > stun_thresh) {
// stun has the lower threshold or they're the same, knock it's penalties out first
while((dcomp >= phys_thresh || dcomp >= stun_thresh) && (phy > phys_thresh || stu > stun_thresh)) {
if(dcomp >= stun_thresh && stu > stun_thresh - 1) {
stu -= stun_thresh;
dcomp -= stun_thresh;
//console.log("lowering stu by: "+stun_thresh+"\ndcomp: "+dcomp);
} else if(dcomp >= phys_thresh && phy > phys_thresh - 1) {
phy -= phys_thresh;
dcomp -= phys_thresh;
//console.log("lowering phy by: "+phys_thresh+"\ndcomp: "+dcomp);
} else {
//console.log("breaking, phy: "+phy+" stu: "+stu+" dcomp: "+dcomp);
break;
}
}
} else {
// physical has the lower threshold, knock it's penalties out first
while(dcomp >= phys_thresh && dcomp > stun_thresh && phy >= phys_thresh && stu > stun_thresh) {
if(dcomp >= phys_thresh && phy > phys_thresh - 1) {
phy -= phys_thresh;
dcomp -= phys_thresh;
} else if(dcomp >= stun_thresh && stu > stun_thresh - 1) {
stu -= stun_thresh;
dcomp -= stun_thresh;
} else {
break;
}
}
}
//console.log("phy: "+phy+"\nstu: "+stu);
} else if(p_int > 0) {
// physical is the only one impacting the PC
//console.log("just phys");
if(phy > v.damage_compensator) {
phy = phy - parseInt(v.damage_compensator);
} else {
phy = 0;
}
//console.log("phy now: "+phy);
} else if(s_int > 0) {
// stun is the only one impacting the PC
//console.log("just stun");
if(stu > v.damage_compensator) {
stu = stu - parseInt(v.damage_compensator);
} else {
stu = 0;
}
//console.log("stu now: "+stu);
} else {
// neither is impacting the PC
//console.log("neither phys nor stun");
}
}
//console.log("stu: "+stu+"\nphy: "+phy+"\npain_tolerance: "+pain_tolerance+"\nphys_thresh: "+phys_thresh+"\nstun_thresh: "+stun_thresh);
pMod = (phy > 0) ? (Math.floor(phy / phys_thresh)) : 0;
sMod = (stu > 0) ? (Math.floor(stu / stun_thresh)) : 0;
//console.log("pMod: "+pMod+"\nsMod: "+sMod);
wou = Math.floor(-(pMod) + -(sMod));
//console.log("wou: "+wou);
// Pain Tolerance (high or low)
if(pain_tolerance < 0) {
wou = wou * 2;
} else if(pain_tolerance > 0 && wou < 0) {
wou = wou + 1;
}
//console.log("post pain_tolerance wou: "+wou);
// Resist Pain
if(v.resist_pain > 0) {
wou = wou + parseInt(v.resist_pain);
if(wou > 0) {
wou = 0;
}
}
//console.log("post resist_pain wou: "+wou);
setAttrs({wounds: wou});
});
};
// Trigger initiative updates
['initiative_mod', 'initiative_dice_mod', 'initiative_temp', 'initiative_temp_flag', 'initiative_dice_temp', 'initiative_dice_temp_flag', 'pilot'].forEach(attr => {
on(`change:${attr}`, (eventInfo) => {
update_initiative();
});
});
//Calculate Initiative
var update_initiative = () => {
getAttrs(["sheet_type", "pilot", "reaction", "intuition", "initiative_mod", "initiative_temp", "initiative_temp_flag", "initiative_dice", "initiative_dice_mod", "initiative_dice_temp", "initiative_dice_temp_flag"], (v) => {
if(v.sheet_type === 'spirit') {
// spirit initiative is auto-calculated elsewhere
return;
}
//console.log("Initiative Updating");
//console.log(v);
const rea = parseInt(v.reaction) || 0;
const int = parseInt(v.intuition) || 0;
const mod = parseInt(v.initiative_mod) || 0;
const tmp = (v.initiative_temp_flag === "on") ? parseInt(v.initiative_temp) || 0 : 0;
var bas = rea + int;
var tot = rea + int + mod + tmp;
//console.log("bas: "+bas+"\ntot: "+tot);
// const dice = parseInt(v.initiative_dice) || 1;
const dice = 1;
const dice_mod = parseInt(v.initiative_dice_mod) || 0;
const dice_tmp = (v.initiative_dice_temp_flag === "on") ? parseInt(v.initiative_dice_temp) || 0 : 0;
var dice_tot = dice + dice_mod + dice_tmp;
//console.log("dice: "+dice+"\ndice_mod: "+dice_mod+"\ndice_tmp: "+dice_tmp+"\ndice_tot: "+dice_tot);
if(v.sheet_type === 'vehicle') {
bas = v.pilot * 2 || 0;
tot = bas + mod + tmp;
dice_tot = 4 + dice_mod + dice_tmp;
}
//console.log("dice_tot: "+dice_tot);
let update = {};
update["initiative_base"] = tot;
update["display_initiative_base"] = (mod != 0 || tmp != 0) ? `${bas} (${tot})` : bas;
update["initiative_dice"] = dice_tot;
setAttrs(update);
});
};
// Trigger astral initiative updates
['astral_initiative_mod', 'astral_initiative_dice_mod', 'astral_initiative_temp', 'astral_initiative_temp_flag', 'astral_initiative_dice_temp', 'astral_initiative_dice_temp_flag', 'intuition', 'logic'].forEach(attr => {
on(`change:${attr}`, (eventInfo) => {
update_astral_initiative();
});
});
//Calculate Astral Initiative
var update_astral_initiative = () => {
getAttrs(["intuition", "logic", "astral_initiative_mod", "astral_initiative_temp", "astral_initiative_temp_flag", "astral_initiative_dice_mod", "astral_initiative_dice_temp", "astral_initiative_dice_temp_flag", "astral_initiative_dice", "sheet_type"], (v) => {
// spirits have specifically defined initiatives, this is messing them up
if(v.sheet_type === 'spirit') {
return;
}
const int = parseInt(v.intuition) || 0;
const log = parseInt(v.logic) || 0;
const mod = parseInt(v.astral_initiative_mod) || 0;
const tmp = (v.astral_initiative_temp_flag === "on") ? parseInt(v.astral_initiative_temp) || 0 : 0;
const bas = int + log;
const tot = int + log + mod + tmp;
let dice_base = 2;
const dice_mod = parseInt(v.astral_initiative_dice_mod) || 0;
const dice_tmp = (v.astral_initiative_dice_temp_flag === "on") ? parseInt(v.astral_initiative_dice_temp) || 0 : 0;
const dice_tot = dice_base + dice_mod + dice_tmp;
let update = {};
update["astral_initiative_base"] = tot;
update["display_astral_initiative_base"] = (mod != 0 || tmp != 0) ? `${bas} (${tot})` : bas;
update["astral_initiative_dice"] = dice_tot;
setAttrs(update);
});
};
//Calculate Matrix Initiatve.
on("change:host_rating change:data_processing change:intuition change:reaction change:level change:matrix_initiative_mod change:matrix_initiative_dice_mod change:matrix_initiative_temp change:matrix_initiative_temp_flag change:matrix_initiative_dice_temp change:matrix_initiative_dice_temp_flag change:cold_sim_initiative_mod change:cold_sim_initiative_dice_mod change:cold_sim_initiative_temp change:cold_sim_initiative_temp_flag change:cold_sim_initiative_dice_temp change:cold_sim_initiative_dice_temp_flag change:hot_sim_initiative_mod change:hot_sim_initiative_dice_mod change:hot_sim_initiative_temp change:hot_sim_initiative_temp_flag change:hot_sim_initiative_dice_temp change:hot_sim_initiative_dice_temp_flag change:matrix_device_initiative_bonus", (eventInfo) => {
update_matrix_initiative();
});
var update_matrix_initiative = () => {
getAttrs(["sheet_type", "data_processing", "pilot", "intuition", "reaction", "host_rating", "level", "matrix_initiative_mod", "matrix_initiative_dice_mod", "matrix_initiative_temp", "matrix_initiative_temp_flag", "matrix_initiative_dice_temp", "matrix_initiative_dice_temp_flag", "cold_sim_initiative_mod", "cold_sim_initiative_dice_mod", "cold_sim_initiative_temp", "cold_sim_initiative_temp_flag", "cold_sim_initiative_dice_temp", "cold_sim_initiative_dice_temp_flag", "hot_sim_initiative_mod", "hot_sim_initiative_dice_mod", "hot_sim_initiative_temp", "hot_sim_initiative_temp_flag", "hot_sim_initiative_dice_temp", "hot_sim_initiative_dice_temp_flag", "matrix_device_initiative_bonus"], (v) => {
const dat = parseInt(v.data_processing) || 0;
const pil = parseInt(v.pilot) || 0;
const int = parseInt(v.intuition) || 0;
const rea = parseInt(v.reaction) || 0;
const hos = parseInt(v.host_rating) || 0;
const lev = parseInt(v.level) || 0;
const dev = parseInt(v.matrix_device_initiative_bonus) || 0;
const init_mod = parseInt(v.matrix_initiative_mod) || 0;
const cold_sim_init_mod = parseInt(v.cold_sim_initiative_mod) || 0;
const hot_sim_init_mod = parseInt(v.hot_sim_initiative_mod) || 0;
const dice_mod = parseInt(v.matrix_initiative_dice_mod) || 0;
const cold_sim_dice_mod = parseInt(v.cold_sim_initiative_dice_mod) || 0;
const hot_sim_dice_mod = parseInt(v.hot_sim_initiative_dice_mod) || 0;
const tmp = (v.matrix_initiative_temp_flag === "on") ? parseInt(v.matrix_initiative_temp) || 0 : 0;
const dice_tmp = (v.matrix_initiative_dice_temp_flag === "on") ? parseInt(v.matrix_initiative_dice_temp) || 0 : 0;
const cold_tmp = (v.cold_sim_initiative_temp_flag === "on") ? parseInt(v.cold_sim_initiative_temp) || 0 : 0;
const cold_dice_tmp = (v.cold_sim_initiative_dice_temp_flag === "on") ? parseInt(v.cold_sim_initiative_dice_temp) || 0 : 0;
const hot_tmp = (v.hot_sim_initiative_temp_flag === "on") ? parseInt(v.hot_sim_initiative_temp) || 0 : 0;
const hot_dice_tmp = (v.hot_sim_initiative_dice_temp_flag === "on") ? parseInt(v.hot_sim_initiative_dice_temp) || 0 : 0;
let update = {};
matrix_dice = 1;
cold_sim_dice = 2;
hot_sim_dice = 3;
switch(v.sheet_type) {
case 'pc':
matrix_tot = rea + int + init_mod + tmp;
matrix_dice = matrix_dice + dice_mod + dice_tmp;
cold_sim_tot = int + dat + cold_sim_init_mod + cold_tmp;
cold_sim_dice = cold_sim_dice + dev + cold_sim_dice_mod + cold_dice_tmp;
hot_sim_tot = int + dat + hot_sim_init_mod + hot_tmp;
hot_sim_dice = hot_sim_dice + dev + hot_sim_dice_mod + hot_dice_tmp;
break;
case 'sprite':
/* Handled when spirit_type and force are changed */
return;
case 'vehicle':
matrix_tot = pil + pil;
cold_sim_tot = pil + pil;
hot_sim_tot = pil + pil;
hot_sim_dice = 4;
break;
case 'host':
hot_sim_tot = dat + dat;
cold_sim_tot = hot_sim_tot;
matrix_tot = hot_sim_tot;
break;
case 'sprite':
/* Handled when sprite_type and level are changed */
return;
default:
matrix_tot = rea + int;
cold_sim_tot = int + dat;
hot_sim_tot = int + dat;
break;
}
update["matrix_initiative_base"] = matrix_tot;
update["matrix_initiative_dice"] = matrix_dice;
update["cold_sim_initiative_base"] = cold_sim_tot;
update["cold_sim_initiative_dice"] = cold_sim_dice;
update["hot_sim_initiative_base"] = hot_sim_tot;
update["hot_sim_initiative_dice"] = hot_sim_dice;
setAttrs(update);
});
};
//Edge toggle to include ! for exploding dice
on("change:edge_toggle", () => {
getAttrs(["edge_toggle"], (v) =>{
edg = (v.edge_toggle != 0) ? "!" : "";
setAttrs({explode_toggle: edg});
});
});
//Calculate Reset Condition Track
on("clicked:cond_reset", () => {
getAttrs(["sheet_type","physical_max","stun_max", "matrix_max"], (v) => {
var phy = parseInt(v.physical_max) || 0;
var stun = parseInt(v.stun_max) || 0;
var mat = parseInt(v.matrix_max) || 0;
let update = {};
if (v.sheet_type === "grunt" || v.sheet_type === "pc") {
update["physical"] = phy;
update["stun"] = stun;
} else if (v.sheet_type === "sprite") {
update["matrix"] = mat;
} else if (v.sheet_type === "vehicle") {
update["physical"] = phy;
update["matrix"] = mat;
} else {
return "Not a grunt or vehicle";
};
setAttrs(update);
});
});
on("clicked:cond_reset_physical clicked:cond_reset_stun", (eventInfo) => {
const attr = eventInfo.triggerName.split("_")[2];
setAttrs({
[`${attr}_damage`] : 0
});
});
//Weapon displays set into an Array
// Builder function to display details properly
// Note that since undefined are falsey if there's no label or sign we can leave the parameters blank
function repeatingStringBuilder(v, keyBase) {
return function(key, label, sign) {
// fetch the attr from v checking if it has a value
const val = v[`${keyBase}${key}`];
if (!val) return '';
// Apply the sign if needed
const disp = sign && val > 0 ? `+${val}` : val;
// Apply label if needed
return label ? `${label} ${disp}` : disp;
}
}
//IC displays are set into an Array
on("change:repeating_IC", () => {
getAttrs(["host_rating", "attack", "data_processing", "repeating_IC_attribute", "repeating_IC_matrix", "repeating_IC_notes"], (v) =>{
const host = v.host_rating;
const att = parseInt(v.attack) || 0;
const data = parseInt(v.data_processing) || 0;
const attr = v.repeating_IC_attribute;
const mat = v.repeating_IC_matrix;
const not = v.repeating_notes;
var def = 'None';
if(attr == 'None' && mat == 'None') {
def = 'None';
} else {
def = `${attr} \+ ${mat}`;
}
setAttrs({
repeating_IC_defense: def
});
});
});
//IC Attack Dice & Condition Track
on("change:host_rating", () => {
getAttrs(["host_rating"], (v) => {
var hos = parseInt(v.host_rating) || 0;
var tot = 8 + Math.ceil(hos/2);
var atk = Math.min(hos + hos);
setAttrs({matrix: tot});
setAttrs({ic_attack: atk});
});
});
//Sprite Condition Track
on("change:level", () => {
getAttrs(["level"], (v) => {
var lev = parseInt(v.level) || 0;
var tot = 8 + Math.ceil(lev/2);
setAttrs({matrix: tot, matrix_max: tot});
});
});
on("change:repeating_skills:name", (eventInfo) => {
update_skill_attribute(eventInfo.triggerName.replace('_name', ''), eventInfo.newValue);
// resynch the hidden attr_<SKILLNAME> attributes so the old skill gets wiped and the new one gets set.
update_skill_ratings();
});
var update_skill_attribute = (prefix, skill) => {
var skill_name_simplified = skill.toLowerCase().replace(/\s/g, '');
var skill_name_translated = getTranslationByKey(skill_name_simplified);
switch(skill) {
case 'Athletics':
case 'Close Combat':
case 'Exotic Weapons':
case 'Firearms':
case 'Stealth':
translation = getTranslationByKey("agility");
setAttrs({[`${prefix}_display_name`]: skill_name_translated, [`${prefix}_attribute`]: '@{agility}', [`${prefix}_display_attribute`]: translation});
break;
case 'Con':
case 'Influence':
translation = getTranslationByKey("charisma");
setAttrs({[`${prefix}_display_name`]: skill_name_translated, [`${prefix}_attribute`]: '@{charisma}', [`${prefix}_display_attribute`]: translation});
break;
case 'Astral':
case 'Outdoors':
case 'Perception':
translation = getTranslationByKey("intuition");
setAttrs({[`${prefix}_display_name`]: skill_name_translated, [`${prefix}_attribute`]: '@{intuition}', [`${prefix}_display_attribute`]: translation});
break;
case 'Biotech':
case 'Cracking':
case 'Electronics':
case 'Engineering':
translation = getTranslationByKey("logic");
setAttrs({[`${prefix}_display_name`]: skill_name_translated, [`${prefix}_attribute`]: '@{logic}', [`${prefix}_display_attribute`]: translation});
break;
case 'Conjuring':
case 'Enchanting':
case 'Sorcery':
translation = getTranslationByKey("magic");
setAttrs({[`${prefix}_display_name`]: skill_name_translated, [`${prefix}_attribute`]: '@{magic}', [`${prefix}_display_attribute`]: translation});
break;
case 'Piloting':
translation = getTranslationByKey("reaction");
setAttrs({[`${prefix}_display_name`]: skill_name_translated, [`${prefix}_attribute`]: '@{reaction}', [`${prefix}_display_attribute`]: translation});
break;
case 'Tasking':
translation = getTranslationByKey("resonance");
setAttrs({[`${prefix}_display_name`]: skill_name_translated, [`${prefix}_attribute`]: '@{resonance}', [`${prefix}_display_attribute`]: translation});
break;
default:
translation = getTranslationByKey("agility");
setAttrs({[`${prefix}_display_name`]: skill_name_translated, [`${prefix}_attribute`]: '@{agility}', [`${prefix}_display_attribute`]: translation});
break;
}
};
on("change:repeating_skills:specialization", (eventInfo) => {
let key = eventInfo.triggerName
key = key.substring(0, key.length - 10);
setAttrs({
[key]: eventInfo.newValue
});
});
//REFACTORED Skills
['repeating_skills','repeating_active','repeating_knowledge','repeating_language', 'agility', 'logic'].forEach(field => {
on(`change:${field}`, (eventInfo) => {
const source = eventInfo.sourceAttribute;
const type = eventInfo.sourceType;
// updating agility was causing this to trigger for "repeating_skills_attribute"
if(eventInfo.sourceAttribute == 'repeating_skills_attribute') {
return;
}
if (source.includes("rating") || source.includes("mod")) {
getAttrs([`${field}_rating`, `${field}_mod`, `${field}_name`, 'sheet_type'], (v) => {
if(v.sheet_type == 'spirit') {
return;
}
const bas = parseInt(v[`${field}_rating`]) || 0;
const mod = parseInt(v[`${field}_mod`]) || 0;
const tot = parseInt(bas) + parseInt(mod);
const skill = v[`${field}_name`] || '';
let display = bas;
if(mod) {
display += " ("+tot+")";
}
// Update repeating melee weapon skill and rating values
getSectionIDs("melee", function(ids) {
ids.forEach((id) => {
getAttrs([`repeating_melee_${id}_skill`], (v2) => {
if(v2[`repeating_melee_${id}_skill`] == v[`${field}_name`]) {
setAttrs({
[`repeating_melee_${id}_rating`]: parseInt(tot),
[`repeating_melee_${id}_dicepool`]: tot
});
}
});
});
});
// Update repeating range weapon skill and rating values
getSectionIDs("range", function(ids) {
for(var i = 0; i < ids.length; i++) {
let skillIdName = "repeating_range_" + ids[i] + "_skill";
let skillRating = "repeating_range_" + ids[i] + "_rating";
getAttrs([skillIdName], (v2) => {
if(v2[skillIdName] == v[`${field}_name`]) {
setAttrs({
[skillRating]: tot
});
}
});
}
});
setAttrs({
[`${field}_dicepool`]: tot,
[`${field}_rating`]: bas,
[`${field}_display_rating`]: display,
[skill]: tot
});
});
} else if (source.includes("logic") || source.includes("agility")) {
var diff = eventInfo.newValue - eventInfo.previousValue;
// Update repeating melee and range weapon dicepool if it uses this attribute
['range', 'melee'].forEach((type) => {
getSectionIDs(type, function(ids) {
for(var i = 0; i < ids.length; i++) {
let attr = `repeating_${type}_` + ids[i] + "_attribute";
let attr_rating = `repeating_${type}_` + ids[i] + "_attr_rating";
let pool = `repeating_${type}_` + ids[i] + "_dicepool";
getAttrs([attr, pool, 'sheet_type'], (v2) => {
if(v2.sheet_type == 'spirit' || v2.sheet_type == 'grunt' || v2.sheet_type == 'vehicle') {
return;
}
if(v2[`${attr}`].toLowerCase() == source.toLowerCase()) {
setAttrs({
[`${pool}`]: parseInt(v2[`${pool}`]) + diff,
[`${attr_rating}`]: eventInfo.newValue
});
}
});
}
});
});
} else if (source.includes("attribute") && type === "player") {
getAttrs([`${source}`], (v) => {
const attribute = v[`${source}`].slice(2, -1);
const translation = getTranslationByKey(`${attribute}`);
setAttrs({
[`${field}_display_attribute`]: translation
});
});
} else if (source.includes("spec") && type === "player") {
getAttrs([`${source}`], (v) => {
const bas = v[`${source}`];
const size = bas.length;
let display = (size >= 0 && size <= 15) ? `${bas}` : "(" + bas.slice(0, 15) + "...)";
setAttrs({
[`${field}_display_spec`]: display
});
});
} else if (source.includes("expert") && type === "player") {
getAttrs([`${source}`], (v) => {
const bas = v[`${source}`];
const size = bas.length;
let display = (size >= 0 && size <= 15) ? `${bas}` : "(" + bas.slice(0, 15) + "...)";
setAttrs({
[`${field}_display_expert`]: display
});
});
} else if (source.endsWith("skill")) {
getAttrs([`${source}`], (v) => {
const bas = v[`${source}`];
const size = bas.length;
let display = (size > 0 && size <= 20) ? bas : (size > 20 ) ? bas.slice(0, 20) + "..." : " ";
setAttrs({
[`${field}_display`]: display
});
});
} else if (source.includes("dicepool")) {
var rep_row = source.match(/(repeating_[^_]+?)_([^_]+?)_(.+)/);
var name = rep_row[1]+'_'+rep_row[2]+'_name';
getAttrs([`${source}`, `${name}`], (v) => {
const skill = v[`${name}`];
let lowercase = skill.toLowerCase();
let removeGroup = (lowercase.includes("group")) ? lowercase.slice(0, -6) : lowercase;
let skillSet = (removeGroup.includes(" ")) ? removeGroup.replace(/ /g,"") : removeGroup;
setAttrs({
[`${skillSet}`]: v[`${source}`]
});
});
} else {
// console.log('Change to '+source+' did not set attr');
};
});
});
on("remove:repeating_skills", (eventInfo) => {
console.log("Skill deleted");
console.log(eventInfo);
update_skill_ratings();
});
// Do some housekeeping on the hidden attr_<SKILLNAME> (ex: attr_closecombat, attr_sorcery, etc) attributes
var update_skill_ratings = () => {
let skill_list = {'astral': '-1', 'athletics': '-1', 'biotech': '-1', 'closecombat': '-1', 'con': '-1', 'conjuring': '-1', 'cracking': '-1', 'electronics': '-1', 'enchanting': '-1', 'engineering': '-1', 'exoticweapons': '-1', 'firearms': '-1', 'influence': '-1', 'outdoors': '-1', 'perception': '-1', 'piloting': '-1', 'sorcery': '-1', 'stealth': '-1', 'tasking': '-1'};
// walk the repeating skills section to grab the skills that the PC currently has
toGet = [];
getSectionIDs('repeating_skills', (skill_IDs) => {
// grab the name and rating attribute names for each of their skills
skill_IDs.forEach((rowID) => {
toGet.push('repeating_skills_'+rowID+'_name');
toGet.push('repeating_skills_'+rowID+'_rating');
});
// get all of the current skills and update skill_list with the current ratings for those skills
// leaving everything else at -1
getAttrs(toGet, (v) => {
skill_IDs.forEach((ID) => {
let skill_name_simplified = v[`repeating_skills_${ID}_name`].toLowerCase().replace(/\s/g, '');
skill_list[skill_name_simplified] = v[`repeating_skills_${ID}_rating`];
});
// update the hidden attr_<SKILLNAME> attributes with the current skill rank or -1.
setAttrs(skill_list);
});
});
};
var disable_ranged_mods = () => {
// Get the currently active mods and disable them
var enabled_mods = [];
getSectionIDs('repeating_range-weapon-mods', (rows) => {
toUpdate = {};
rows.forEach((row) => {
getAttrs([`repeating_range-weapon-mods_${row}_active`, `repeating_range-weapon-mods_${row}_name`], (mod) => {
if(mod[`repeating_range-weapon-mods_${row}_active`] == "on") {
enabled_mods.push(row);
setAttrs({
[`repeating_range-weapon-mods_${row}_active`]: 0,
});
}
});
});
setAttrs({
primary_range_weapon_close_mod: 0,
primary_range_weapon_near_mod: 0,
primary_range_weapon_medium_mod: 0,
primary_range_weapon_far_mod: 0,
primary_range_weapon_extreme_mod: 0,
primary_range_weapon_damage_mod: 0,
primary_range_weapon_dicepool_mod: 0
});
});
return enabled_mods;
};
// Deal with grenade type changes to attempt to calculate dicepool
on("change:repeating_grenade:type change:repeating_grenade:dicepool change:repeating_grenade:spec change:repeating_grenade:expert change:repeating_grenade:dicepool_modifier", (eventInfo) => {
console.log(eventInfo);
let key = '';
let changed = '';
if(eventInfo.triggerName.endsWith("type")) {
key = eventInfo.triggerName.slice(0, -5);
changed = "type";
} else if(eventInfo.triggerName.endsWith("dicepool")) {
key = eventInfo.triggerName.slice(0, -9);
changed = "dicepool";
} else if(eventInfo.triggerName.endsWith("spec")) {
key = eventInfo.triggerName.slice(0, -5);
changed = "spec";
} else if(eventInfo.triggerName.endsWith("expert")) {
key = eventInfo.triggerName.slice(0, -7);
changed = "expert";
} else if(eventInfo.triggerName.endsWith("dicepool_modifier")) {
key = eventInfo.triggerName.slice(0, -18);
changed = "dicepool_modifier";
}
getAttrs([`${key}_dicepool`, `${key}_type`, `${key}_spec`, `${key}_expert`, `${key}_dicepool_modifier`, "agility", "logic", "athletics", "engineering", "exotic weapons"], (v) => {
let toSet = {};
console.log(v);
if(changed === "dicepool") {
// just set the type to "Custom Dicepool" so the player knows it's being overridden
toSet[`${key}_type`] = 'custom';
toSet[`${key}_spec`] = 0;
toSet[`${key}_expert`] = 0;
toSet[`${key}_dicepool_modifier`] = 0;
} else if(changed === "spec" || changed === "expert" || changed === "dicepool_modifier") {
let dp = parseInt(v[`${key}_dicepool`]) || 0,
pv = parseInt(eventInfo.previousValue) || 0,
nv = parseInt(eventInfo.newValue) || 0;
dp -= pv;
dp += nv;
toSet[`${key}_dicepool`] = dp;
} else if(changed === "type") {
let dp = 0;
if(parseInt(v[`${key}_spec`])) {
dp += 2;
}
if(parseInt(v[`${key}_expert`])) {
dp += 3;
}
if(v[`${key}_dicepool_modifier`]) {
dp += parseInt(v[`${key}_dicepool_modifier`]);
}
console.log("dp after spec, expert, mod: "+dp);
if(v[`${key}_type`].includes("agility") && v.agility) {
dp += v.agility;
}
if(v[`${key}_type`].includes("logic") && v.logic) {
dp += v.logic;
}
console.log("dp after agility and logic: "+dp);
if(v[`${key}_type`].includes("athletics")) {
if(v.athletics) {
dp += v.athletics;
} else {
dp += -1;
}
}
if(v[`${key}_type`].includes("engineering")) {
if(v.engineering) {
dp += v.engineering;
} else {
dp += -1;
}
}
if(v[`${key}_type`].includes("exotic weapons")) {
if(v["exotic weapons"]) {
dp += v["exotic weapons"];
} else {
dp += -1;
}
}
console.log("dp after athletics, engineering and exotic weapons: "+dp);
if(v[`${key}_type`] == "custom") {
dp = v.dicepool || 0;
toSet[`${key}_spec`] = 0;
toSet[`${key}_expert`] = 0;
toSet[`${key}_dicepool_modifier`] = 0;
}
toSet[`${key}_dicepool`] = dp;
}
console.log(toSet);
setAttrs(toSet, {silent: true});
});
});
//REFACTORED RANGE & MELEE UPDATES
['repeating_range','repeating_melee'].forEach(weap => {
on(`change:${weap}`, (eventInfo) => {
const source = eventInfo.sourceAttribute;
const newV = eventInfo.newValue;
const type = weap.slice(-5);
const regex = /_(-.*)$/;
var rowID = eventInfo.triggerName.match(regex)[1];
getAttrs([`${weap}_name`, `${weap}_dicepool_modifier`, `${weap}_spec`, `${weap}_expert`, `${weap}_skill`, `${weap}_attribute`, `${weap}_attr_rating`, `${weap}_primary`, `${weap}_firing_modes`, `${weap}_default_mode`, `${weap}_damage`, `${weap}_close`, `${weap}_near`, `${weap}_medium`, `${weap}_far`, `${weap}_extreme`, `${weap}_has_mods`, `${weap}_notes`, `sheet_type`, `${weap}_dicepool`, `${weap}_dicepool_base`], (v) => {
// Trying to detect this firing on a remove: event and stop processing if it was
if(typeof eventInfo.newValue === 'undefined' && typeof eventInfo.previousValue === 'undefined' && ! v[`${weap}_name`]) {
console.log("do nothing!");
return;
}
if(eventInfo.sourceAttribute.endsWith("dicepool") && eventInfo.newValue && eventInfo.newValue != "0") {
if(eventInfo.sourceType === 'player') {
setAttrs({
[`${weap}_dicepool_base`]: v[`${weap}_dicepool`],
}, {silent: true});
}
// return;
} else if(eventInfo.sourceAttribute.endsWith("dicepool") && ! eventInfo.newValue) {
setAttrs({
[`${weap}_dicepool_base`]: 0,
[`${weap}_dicepool`]: 0
}, {silent: true});
} else if(v[`${weap}_dicepool_base`] && v[`${weap}_dicepool_base`] != v[`${weap}_dicepool`]) {
}
// If this is a vehicle/drone or spirit sheet there's nothing more to do
if(v.sheet_type == 'vehicle' || v.sheet_type == 'spirit') {
return;
}
// We only auto-fill the dicepool if it's empty or 0
if(v.sheet_type == 'pc' || (! v[`${weap}_dicepool`] || v[`${weap}_dicepool`] == 0)) {
const mod = parseInt(v[`${weap}_dicepool_modifier`]) || 0;
const spec = parseInt(v[`${weap}_spec`]) || 0;
const expert = parseInt(v[`${weap}_expert`]) || 0;
const skill = v[`${weap}_skill`] || '';
var attribute = 'Agility';
switch(skill) {
case 'Engineering':
attribute = 'Logic';
break;
case 'Firearms':
case 'Close Combat':
case 'Athletics':
case 'Exotic Weapons':
attribute = 'Agility';
break;
}
getAttrs([`${skill}`, `${attribute}`], (s) => {
rating = s[`${skill}`] || -1;
if(rating <= 0) {
rating = -1;
}
attr = s[`${attribute}`] || 1;
const tot = parseInt(attr) + parseInt(mod) + parseInt(spec) + parseInt(expert) + parseInt(rating);
setAttrs({
[`${weap}_rating`]: rating,
[`${weap}_dicepool`]: tot,
[`${weap}_dicepool_base`]: tot,
[`${weap}_attribute`]: attribute,
[`${weap}_attr_rating`]: attr
});
});
}
// Apply dicepool mod if that changed
if(eventInfo.sourceAttribute.endsWith('_dicepool_modifier')) {
let nv = parseInt(eventInfo.newValue) || 0;
let pv = parseInt(eventInfo.previousValue) || 0;
let delta = nv - pv;
let tot = parseInt(v[`${weap}_dicepool`]) + parseInt(delta);
setAttrs({
[`${weap}_dicepool`]: tot,
[`${weap}_dicepool_base`]: tot
}, {silent: true});
}
/* if it is the primary weapon any update needs to be reflected on Core->Arms */
if (v[`${weap}_primary`] === "primary") {
//Shared attributes names.
let array = ["dicepool", "dicepool_modifier", "name", "damage", "skill", "rating", "close", "near", "medium", "far", "extreme", "spec", "expert", "attribute", "attr_rating", "default_mode", "notes"];
//Add the range or melee specific ones
if(type === "range") {
array.push("ammo", "ammo_max", "mode");
// update the primary range firing modes available
var modes = v[`repeating_range_firing_modes`].split(/\s*\/\s*/i);
var toEnable = {
primary_range_weapon_mode_singleshot: 0,
[`${weap}_singleshot`]: 0,
primary_range_weapon_mode_semiauto: 0,
[`${weap}_semiauto`]: 0,
primary_range_weapon_mode_burst: 0,
[`${weap}_burst`]: 0,
primary_range_weapon_mode_burstwide: 0,
[`${weap}_burstwide`]: 0,
primary_range_weapon_mode_fullauto: 0,
[`${weap}_fullauto`]: 0,
primary_range_weapon_mode_other: 0,
[`${weap}_other`]: 0,
};
modes.forEach(mode => {
switch(mode.toUpperCase()) {
case 'SS':
toEnable.primary_range_weapon_mode_singleshot = 1;
toEnable[`${weap}_singleshot`] = 1;
break;
case 'SA':
toEnable.primary_range_weapon_mode_semiauto = 1;
toEnable[`${weap}_semiauto`] = 1;
break;
case 'BF':
toEnable.primary_range_weapon_mode_burst = 1;
toEnable[`${weap}_burst`] = 1;
break;
case 'BW':
toEnable.primary_range_weapon_mode_burstwide = 1;
toEnable[`${weap}_burstwide`] = 1;
break;
case 'FA':
toEnable.primary_range_weapon_mode_fullauto = 1;
toEnable[`${weap}_fullauto`] = 1;
break;
default:
toEnable.primary_range_weapon_mode_other = 1;
toEnable[`${weap}_other`] = 1;
break;
};
});
// save the weapon's damage and ARs to the primary base for use in the firing mode calculator
toEnable.primary_range_weapon_base_damage = v[`${weap}_damage`];
toEnable.primary_range_weapon_base_close = v[`${weap}_close`];
toEnable.primary_range_weapon_base_near = v[`${weap}_near`];
toEnable.primary_range_weapon_base_medium = v[`${weap}_medium`];
toEnable.primary_range_weapon_base_far = v[`${weap}_far`];
toEnable.primary_range_weapon_base_extreme = v[`${weap}_extreme`];
toEnable.primary_range_weapon_rowID = rowID;
setAttrs(toEnable);
}
// Add any melee specific attributes
if(type === "melee") {
}
//Add the repeating section to the begining of each attribute
let attrs = [];
for(var i=0; i < array.length; i++) {
attrs.push(`${weap}_` + array[i]);
};
attrs.push(`primary_${type}_weapon_mode`);
getAttrs(attrs, (v) => {
let update = {};
//Primary weapon name does not follow the naming scheme.
update[`primary_${type}_weapon`] = v[`${weap}_name`];
_.each(array, (value) => {
if (value != undefined || value != "weapon") {
update[`primary_${type}_weapon_${value}`] = (value === "ammo_max") ? v[`${weap}_ammo`] : v[`${weap}_${value}`];
};
});
// Update the selected firing mode to the default (if that or primary was the change)
if(source.includes('default_mode') || (source.includes('range') && source.includes('primary'))) {
update[`primary_${type}_weapon_mode`] = v[`${weap}_default_mode`];
} else {
update[`primary_${type}_weapon_mode`] = v[`primary_${type}_weapon_mode`];
}
setAttrs(update);
});
};
// If the player changed the primary status of the weapon, uncheck the other weapons
if (source.includes('primary') && eventInfo.sourceType === "player") {
// if it's a ranged weapon disabled any primary_ranged_mods that were active
if(type === "range") {
var enabled_mods = disable_ranged_mods();
// pop up the mods interface if there were mods
// so the user can enable the right ones
if(v[`${weap}_has_mods`] == 1) {
setAttrs({
[`mods-flag`]: "on",
tab: "core"
});
}
}
//Set the other repeating_weapon primarys to 0 aka unchecked
getSectionIDs(`${weap}`, function(ids) {
let IDs = [];
let update = {};
for(var i=0; i < ids.length; i++) {
IDs.push(`${weap}_` + ids[i] + "_primary");
};
IDs.forEach(id => {
if (id != source) {
update[`${id}`] = 0;
}
});
setAttrs(update);
});
} else if(source.includes('dicepool') || source.includes('weapon') || source.includes('damage') || source.includes('skill') || source.includes('rating') || source.includes('ammo') || source.includes('mode') || source.includes('close') || source.includes('near') || source.includes('medium') || source.includes('far') || source.includes('extreme') || source.includes('spec') || source.includes('expert')) {
getAttrs([`${weap}_primary`, `${source}`], (v) => {
if (v[`${weap}_primary`] === 'primary') {
let update = {};
//This whole process needs refactored in the future. Its working for now.
if (source.includes('ammo')) {
update[`primary_${type}_weapon_ammo`] = v[`${source}`];
update[`primary_${type}_weapon_ammo_max`] = v[`${source}`];
} else {
// console.log(eventInfo);
};
setAttrs(update);
};
});
} else {
console.log("Change was not relevant.");
};
});
});
});
// Grunt weapon AR change
['range', 'melee'].forEach((type) => {
on(`change:repeating_${type}:close_base change:repeating_${type}:near_base change:repeating_${type}:medium_base change:repeating_${type}:far_base change:repeating_${type}:extreme_base change:repeating_${type}:dicepool_base`, (eventInfo) => {
if(parseInt(eventInfo.newValue) < 0 || isNaN(eventInfo.newValue)) {
eventInfo.newValue = 0;
}
if(parseInt(eventInfo.previousValue) < 0 || isNaN(eventInfo.previousValue)) {
eventInfo.previousValue = 0;
}
delta = parseInt(eventInfo.newValue) - parseInt(eventInfo.previousValue);
display = eventInfo.sourceAttribute.slice(0,-5);
getAttrs(['sheet_type', display], (v) => {
// this only gets applied to grunts, spirits and vehicles
if(v.sheet_type != 'grunt' && v.sheet_type != 'spirit' && v.sheet_type != 'vehicle') {
return;
}
var newV = parseInt(v[`${display}`]) + delta || 0;
if(newV < 0) {
newV = 0;
}
setAttrs({
[`${display}`]: newV
});
});
});
});
// Grunt Groups Count changes
on("change:grunt_group_count change:grunt_group_member change:repeating_melee:mode change:repeating_range:mode change:repeating_melee:damage_base change:repeating_range:damage_base", (eventInfo) => {
['range', 'melee'].forEach((wtype) => {
getSectionIDs(`${wtype}`, (ids) => {
ids.forEach((id) => {
getAttrs([`repeating_${wtype}_${id}_dicepool_base`, `repeating_${wtype}_${id}_dicepool_modifier`, `repeating_${wtype}_${id}_close_base`, `repeating_${wtype}_${id}_near_base`, `repeating_${wtype}_${id}_medium_base`, `repeating_${wtype}_${id}_far_base`, `repeating_${wtype}_${id}_extreme_base`, `repeating_${wtype}_${id}_damage_base`, `repeating_${wtype}_${id}_mode`, 'mode', 'grunt_group_count', 'grunt_group_member', 'sheet_type'], (w) => {
if(w.sheet_type != 'grunt' && w.sheet_type != 'spirit' && w.sheet_type != 'vehicle') {
return;
}
var grunts = 0;
if(w.grunt_group_member == 0) {
grunts = 0;
} else {
grunts = w.grunt_group_count;
}
firing_mode_mods = {
SS: { AR: 0, DV: 0 },
SA: { AR: -2, DV: +1 },
BF: { AR: -4, DV: +2 },
FA: { AR: -6, DV: 0 },
Other: { AR: 0, DV: 0 }
};
var firing_mode = 'SS';
if(wtype == 'range') {
firing_mode = w[`repeating_${wtype}_${id}_mode`] || w.mode || 'SS';
}
var DV = adjAttrs({
dvMod: firing_mode_mods[firing_mode].DV,
arMod: firing_mode_mods[firing_mode].AR,
attrs: {
attr_damage: w[`repeating_${wtype}_${id}_damage_base`]
}
}).attr_damage;
var bonuses = {
AR: 0,
dice: 0
}
if(w.grunt_group_member != '0' && parseInt(w.grunt_group_count) > 1) {
bonuses = grunt_group_bonuses(w.grunt_group_count);
}
var c = parseInt(w[`repeating_${wtype}_${id}_close_base`]) || '';
c = (c > 0) ? c + parseInt(bonuses.AR) + parseInt(firing_mode_mods[firing_mode].AR) : '';
c = (c <= 0) ? '' : c;
var n = parseInt(w[`repeating_${wtype}_${id}_near_base`]) || '';
n = (n > 0) ? n + parseInt(bonuses.AR) + parseInt(firing_mode_mods[firing_mode].AR) : '';
n = (n <= 0) ? '' : n;
var m = parseInt(w[`repeating_${wtype}_${id}_medium_base`]) || '';
m = (m > 0) ? m + parseInt(bonuses.AR) + parseInt(firing_mode_mods[firing_mode].AR) : '';
m = (m <= 0) ? '' : m;
var f = parseInt(w[`repeating_${wtype}_${id}_far_base`]) || '';
f = (f > 0) ? f + parseInt(bonuses.AR) + parseInt(firing_mode_mods[firing_mode].AR) : '';
f = (f <= 0) ? '' : f;
var e = parseInt(w[`repeating_${wtype}_${id}_extreme_base`]) || '';
e = (e > 0) ? e + parseInt(bonuses.AR) + parseInt(firing_mode_mods[firing_mode].AR) : '';
e = (e <= 0) ? '' : e;
var dice = parseInt(w[`repeating_${wtype}_${id}_dicepool_base`]) || '';
var diceMod = parseInt(w[`repeating_${wtype}_${id}_dicepool_modifier`]) || 0;
if(w.grunt_group_member == 0) { // Not a grunt group member
var dp = parseInt(dice) - parseInt(bonuses.dice) || 0;
setAttrs({
[`repeating_${wtype}_${id}_damage`]: DV,
[`repeating_${wtype}_${id}_dicepool`]: dp,
[`repeating_${wtype}_${id}_close`]: c,
[`repeating_${wtype}_${id}_near`]: n,
[`repeating_${wtype}_${id}_medium`]: m,
[`repeating_${wtype}_${id}_far`]: f,
[`repeating_${wtype}_${id}_extreme`]: e
}, {silent: true});
} else { // they are now a grunt group member we need to adjust dicepool and ARs
var dp = parseInt(dice) + parseInt(bonuses.dice) || 0;
setAttrs({
[`repeating_${wtype}_${id}_damage`]: DV,
[`repeating_${wtype}_${id}_dicepool`]: dp,
[`repeating_${wtype}_${id}_close`]: c,
[`repeating_${wtype}_${id}_near`]: n,
[`repeating_${wtype}_${id}_medium`]: m,
[`repeating_${wtype}_${id}_far`]: f,
[`repeating_${wtype}_${id}_extreme`]: e
}, {silent: true});
}
});
});
});
});
});
var grunt_group_bonuses = (p) => {
var b = {
AR: p - 1,
dice: Math.floor((p - 1) / 2)
};
return b;
};
//Repeating contacts for PC sheet
on("change:repeating_contacts", () => {
getAttrs(["repeating_contacts_name"], (v) => {
const name = (v.repeating_contacts_name);
((name).length > 0 && (name).length <= 30) ? setAttrs({repeating_contacts_display: (name)}) :
((name).length > 30) ? setAttrs({repeating_contacts_display: (name).slice(0, 30) + "..."}) :
setAttrs({repeating_contacts_display: " "});
});
});
//Cyberdeck Calculations
['attack', 'sleaze', 'data_processing', 'firewall'].forEach(attr => {
on(`change:${attr}_base change:${attr}_modifier change:${attr}_temp`, () => {
update_common_rolls([`${attr}_base`, `${attr}_modifier`, `${attr}_temp`]);
});
});
on("change:repeating_vehicle", (eventInfo) => {
const id = eventInfo.triggerName;
getAttrs([`${id}_handling_onroad`, `${id}_handling_offroad`, `${id}_handling_modifier`, `${id}_acceleration_base`, `${id}_acceleration_modifier`, `${id}_speed_base`, `${id}_speed_modifier`, `${id}_speed_max`, `${id}_armor_base`, `${id}_armor_modifier`, `${id}_body_base`, `${id}_body_modifier`, `${id}_pilot_base`, `${id}_pilot_modifier`, `${id}_sensor_base`, `${id}_sensor_modifier`, `${id}_seats`], (v) => {
Object.keys(v).forEach(k => {
if(isNaN(parseInt(v[`${k}`]))) {
v[`${k}`] = 0;
}
});
var handling = parseInt(v[`${id}_handling_onroad`]) + parseInt(v[`${id}_handling_modifier`]);
if(v[`${id}_handling_offroad`] != 0) {
var handling_or = parseInt(v[`${id}_handling_offroad`]) + parseInt(v[`${id}_handling_modifier`]);
handling = handling + ' (' + handling_or + ')';
}
var speed = parseInt(v[`${id}_speed_base`]) + parseInt(v[`${id}_speed_modifier`]);
speed = speed + ' (' + v[`${id}_speed_max`] + ')';
setAttrs({
"repeating_vehicle_display_handling": handling,
"repeating_vehicle_display_speed": speed,
"repeating_vehicle_display_acceleration": parseInt(v[`${id}_acceleration_base`]) + parseInt(v[`${id}_acceleration_modifier`]),
"repeating_vehicle_display_body": parseInt(v[`${id}_body_base`]) + parseInt(v[`${id}_body_modifier`]),
"repeating_vehicle_display_armor": parseInt(v[`${id}_armor_base`]) + parseInt(v[`${id}_armor_modifier`]),
"repeating_vehicle_display_pilot": parseInt(v[`${id}_pilot_base`]) + parseInt(v[`${id}_pilot_modifier`]),
"repeating_vehicle_display_sensor": parseInt(v[`${id}_sensor_base`]) + parseInt(v[`${id}_sensor_modifier`])
});
});
});
/*
['acceleration', 'armor', 'body', 'data_processing', 'handling_onroad', 'handling_offroad', 'pilot', 'sensor','speed'].forEach(attr => {
// Attach listener
on(`change:repeating_vehicle:${attr}_base change:repeating_vehicle:${attr}_modifier change:repeating_vehicle:${attr}_temp change:repeating_vehicle:${attr}_max`, () => {
// Load attribute values
getAttrs([`repeating_vehicle_${attr}_base`, `repeating_vehicle_${attr}_modifier`, `repeating_vehicle_${attr}_temp`, `repeating_vehicle_${attr}_max`], (v) => {
// Do some math to calculate the total
const bas = parseInt(v[`repeating_vehicle_${attr}_base`]) || 0;
const mod = parseInt(v[`repeating_vehicle_${attr}_modifier`]) || 0;
const tem = parseInt(v[`repeating_vehicle_${attr}_temp`]) || 0;
const max = parseInt(v[`repeating_vehicle_${attr}_max`]) || 0;
const bon = mod + tem;
const stat = bas + bon;
// Update the finalized total
setAttrs({
[attr]: stat,
[`repeating_vehicle_display_${attr}`]: bon === 0 ? bas : `${bas} (${stat})`
}, {silent: true});
});
});
});
*/
/******************/
/* Sprite Scripts */
/******************/
on("change:sprite_type change:level", (eventInfo) => {
sprite_update();
});
var sprite_update = () => {
getAttrs(['level', 'sprite_type', 'sheet_type', 'compendium_drop_data', 'canvas_drop_data'], (v) => {
if(v.sheet_type != 'sprite') {
return;
}
var level = parseInt(v.level);
var attack = 1,
sleaze = 1,
dataproc = 1,
firewall = 1,
resonance = 1,
hot_base = 1,
hot_dice = 1;
var skills = ['Electronics', 'Cracking'];
var powers = [];
switch(v.sprite_type) {
case 'Courier':
attack = level;
sleaze = level + 3;
dataproc = level + 1;
firewall = level + 2;
resonance = level;
hot_base = (level * 2) + 1;
hot_dice = 4;
powers = ['Cookie', 'Hash'];
break;
case 'Crack':
attack = level;
sleaze = level + 3;
dataproc = level + 2;
firewall = level + 1;
resonance = level;
hot_base = (level * 2) + 2;
hot_dice = 4;
powers = ['Phantom', 'Suppression'];
break;
case 'Data':
attack = (level - 1) || 1;
sleaze = level;
dataproc = level + 4;
firewall = level + 1;
resonance = level;
hot_base = (level * 2) + 4;
hot_dice = 4;
powers = ['Camouflage', 'Watermark'];
break;
case 'Fault':
attack = level + 3;
sleaze = level;
dataproc = level + 1;
firewall = level + 2;
resonance = level;
hot_base = (level * 2) + 1;
hot_dice = 4;
powers = ['Electron Storm', 'Trap'];
break;
case 'Machine':
attack = level + 1;
sleaze = level;
dataproc = level + 3;
firewall = level + 2;
resonance = level;
hot_base = (level * 2) + 3;
hot_dice = 4;
skills = ['Electronics', 'Engineering'];
powers = ['Diagnostics', 'Override', 'Stability'];
break;
default:
attack = level;
sleaze = level;
dataproc = level;
firewall = level;
resonance = level;
hot_base = (level * 2) + 1;
hot_dice = 4;
break;
}
setAttrs({
'attack': attack,
'sleaze': sleaze,
'data_processing': dataproc,
'firewall': firewall,
'resonance': resonance,
'hot_sim_initiative_base': hot_base,
'hot_sim_initiative_dice': hot_dice
});
// Check if there are already skills
getSectionIDs(['repeating_skills'], function (ids) {
ids.forEach(rowId => {
removeRepeatingRow(`repeating_skills_${rowId}`);
});
let usedIDs = [];
skills.forEach(skill => {
// make a new repeatingRowID
var newId = generateRowID();
while(newId in usedIDs) {
newId = generateRowID();
}
usedIDs.push(newId);
setAttrs({
[`repeating_skills_${newId}_skill`]: skill,
[`repeating_skills_${newId}_level`]: level,
[`repeating_skills_${newId}_flag`]: 0
});
});
});
// Some notes for the powers, we don't want to infringe copyrights so we'll point to the Core Rule Book page,
// They can type whatever they want in later
var notes = {
'Camouflage': 'CRB pg.194',
'Cookie': 'CRB pg.194',
'Diagnostics': 'CRB pg.194',
'Electron Storm': 'CRB pg.194',
'Hash': 'CRB pg.194',
'Override': 'CRB pg.194',
'Phantom': 'CRB pg.194',
'Stability': 'CRB pg.194',
'Suppression': 'CRB pg.194',
'Trap': 'CRB pg.194',
'Watermark': 'CRB pg.195'
};
// Check if there are already powers
getSectionIDs(['repeating_powers'], function (ids) {
ids.forEach(rowId => {
removeRepeatingRow(`repeating_powers_${rowId}`);
});
let usedIDs = [];
powers.forEach(power => {
// make a new repeatingRowID
var newId = generateRowID();
while(newId in usedIDs) {
newId = generateRowID();
}
usedIDs.push(newId);
setAttrs({
[`repeating_powers_${newId}_name`]: power,
[`repeating_powers_${newId}_notes`]: notes[power],
[`repeating_powers_${newId}_flag`]: 0
});
});
});
});
};
/******************/
/* Spirit Scripts */
/******************/
on("change:spirit_type change:force", (eventInfo) => {
spirit_update();
});
var spirit_update = () => {
setAttrs({
grunt_group_member: 'grunt_group_member'
});
getAttrs(['force', 'spirit_type', 'sheet_type', 'spirit_reset_toggle'], (v) => {
if(v.sheet_type != 'spirit') {
return;
}
var force = parseInt(v.force);
var spirit = {
tasks_modifier: 0,
body: 1,
agility: 1,
reaction: 1,
strength: 1,
willpower: 1,
logic: 1,
intuition: 1,
charisma: 1,
edge: 0,
magic: force,
essence: force,
major_actions: 1,
minor_actions: 2,
physical: 9,
move_speed: 10,
sprint_speed: 15,
sprint_modifier: 1,
initiative_base: 6,
initiative_dice: 2,
astral_initiative_base: 2,
astral_initiative_dice: 3,
defense_rating: 1,
number_optional_powers: Math.floor(force / 3),
weaknesses: ''
};
var skills = ['Astral'];
var powers = ['Astral Form', 'Materialization', 'Sapience'];
var ranged = [];
var close = [];
switch(v.spirit_type) {
case 'Air':
spirit.tasks_modifier = '';
spirit.body = (force > 2) ? force - 2 : 1;
spirit.agility = force + 3;
spirit.reaction = force + 4;
spirit.strength = (force > 3) ? force - 3 : 1;
spirit.willpower = force;
spirit.logic = force;
spirit.intuition = force;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 8;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 5;
spirit.initiative_base = (force * 2) + 4;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = (force * 2);
spirit.astral_initiative_dice = 3;
spirit.defense_rating = (force > 2) ? force - 2 : 1;
spirit.weaknesses = 'Allergy (Inhalation vector toxins, Severe)';
skills = ['Astral', 'Athletics', 'Close Combat', 'Exotic Ranged Weapon', 'Perception'];
powers = ['Accident', 'Astral Form', 'Concealment', 'Confusion', 'Engulf (Air)', 'Materialization', 'Movement', 'Sapience', 'Search'];
optional_powers = ['Elemental Attack (Cold)', 'Elemental Attack (Electricity)', 'Energy Aura', 'Fear', 'Guard', 'Noxious Breath', 'Psychokinesis'];
ranged = [{
'name': 'Elemental Attack',
'pool': force + spirit.agility,
'skill': 'Magic',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': force + 'P',
'c': force * 2,
'n': ((force * 2) - 2),
'm': ((force * 2) - 8),
'f': ((force * 2) - 10),
'e': 0,
'notes': 'Requires Elemental Attack Optional Power'
}];
close = [{
'name': 'Engulf',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': parseInt(force + 2) + 'S',
'c': (force * 2) + 1,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': 'Damage adds Fatigue I'
}];
break;
case 'Beasts':
spirit.tasks_modifier = '';
spirit.body = force + 2;
spirit.agility = force + 1;
spirit.reaction = force;
spirit.strength = force + 2;
spirit.willpower = force;
spirit.logic = force;
spirit.intuition = force;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 8;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 3;
spirit.initiative_base = force * 2;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = force * 2;
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force + 2;
spirit.weaknesses = 'Allergy (silver, Severe)';
skills = ['Astral', 'Close Combat', 'Perception'];
powers = ['Animal Control', 'Astral Form', 'Enhanced Senses (Hearing)', 'Enhanced Senses (Low-Light Vision)', 'Enhanced Senses (Smell)', 'Fear', 'Materialization', 'Movement', 'Sapience'];
optional_powers = ['Concealment', 'Confusion', 'Guard', 'Natural Weapon', 'Noxious Breath', 'Search', 'Venom'];
ranged = [];
close = [{
'name': 'Claws/Bite',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'skill': 'Magic',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': parseInt(Math.ceil(force / 2)) + 'P',
'c': force * 2,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': 'Requires Natural Weapon (claws/bite) Optional Power'
}];
break;
case 'Earth':
spirit.tasks_modifier = '';
spirit.body = force + 4;
spirit.agility = (force > 2) ? force - 2 : 1;
spirit.reaction = (force > 1) ? force - 1 : 1;
spirit.strength = force + 4;
spirit.willpower = force;
spirit.logic = (force > 1) ? force - 1 : 1;
spirit.intuition = force;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 8;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 1;
spirit.initiative_base = (force * 2) - 1;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = force * 2;
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force + 4;
spirit.weaknesses = 'Allergy (Electricity, Severe)';
skills = ['Astral', 'Close Combat', 'Exotic Ranged Weapons', 'Perception'];
powers = ['Astral Form', 'Binding', 'Guard', 'Fear', 'Materialization', 'Movement', 'Sapience', 'Search'];
optional_powers = ['Concealment', 'Confusion', 'Elemental Attack (Chemical)', 'Engulf (Earth)', 'Fear'];
ranged = [{
'name': 'Elemental Attack',
'pool': force + spirit.agility,
'skill': 'Magic',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': force + 'P',
'c': force * 2,
'n': ((force * 2) - 2),
'm': ((force * 2) - 8),
'f': ((force * 2) - 10),
'e': 0,
'notes': 'Requires Elemental Attack Optional Power'
}];
close = [{
'name': 'Engulf',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': parseInt(force + 2) + 'S',
'c': (force * 2) + 1,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': 'Requires Engulf Optional Power, Damage adds Fatigue I'
}];
break;
case 'Fire':
spirit.tasks_modifier = '';
spirit.body = force + 1;
spirit.agility = force + 2;
spirit.reaction = force + 3;
spirit.strength = (force > 2) ? force - 2 : 1;
spirit.willpower = force;
spirit.logic = force;
spirit.intuition = force + 1;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 8;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 5;
spirit.initiative_base = (force * 2) + 4;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = (force * 2);
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force + 1;
spirit.weaknesses = 'Allergy (Cold, Severe), Vulnerability (fire extinguishers)';
skills = ['Astral', 'Athletics', 'Close Combat', 'Exotic Ranged Weapon', 'Perception'];
powers = ['Accident', 'Astral Form', 'Confusion', 'Elemental Attack (Fire)', 'Energy Aura (Fire)', 'Engulf (Fire)', 'Materialization', 'Sapience'];
optional_powers = ['Fear', 'Guard', 'Noxious Breath', 'Search'];
ranged = [{
'name': 'Elemental Attack',
'pool': force + spirit.agility,
'skill': 'Magic',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': force + 'P',
'c': force * 2,
'n': ((force * 2) - 2),
'm': ((force * 2) - 8),
'f': ((force * 2) - 10),
'e': 0,
'notes': ''
}];
close = [{
'name': 'Engulf',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': parseInt(force + 2) + 'S',
'c': (force * 2) + 1,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': 'Damage adds Fatigue I'
}];
break;
case 'Kin':
spirit.tasks_modifier = '';
spirit.body = force + 1;
spirit.agility = force;
spirit.reaction = force + 2;
spirit.strength = (force > 2) ? force - 2 : 1;
spirit.willpower = force;
spirit.logic = force;
spirit.intuition = force + 1;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 8;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 1;
spirit.initiative_base = (force * 2) + 3;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = (force * 2);
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force + 1;
spirit.weaknesses = ' Allergy (ferrous metal, Severe)';
skills = ['Astral', 'Close Combat', 'Perception', 'Sorcery'];
powers = ['Accident', 'Astral Form', 'Concealment', 'Confusion', 'Enhanced Senses (Low-Light Vision)', 'Enhanced Senses (Thermographic Vision)', 'Guard', 'Influence', 'Materialization', 'Sapience', 'Search'];
optional_powers = ['Fear', 'Innate Spell', 'Movement', 'Psychokinesis'];
ranged = [];
close = [{
'name': 'Fists',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': parseInt(Math.ceil(force / 2)) + 'S',
'c': force * 2,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': ''
}];
break;
case 'Water':
spirit.tasks_modifier = '';
spirit.body = force;
spirit.agility = force + 1;
spirit.reaction = force + 2;
spirit.strength = force;
spirit.willpower = force;
spirit.logic = force;
spirit.intuition = force;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 8;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 2;
spirit.initiative_base = (force * 2) + 2;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = (force * 2);
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force;
spirit.weaknesses = 'Allergy (fire, Severe)';
skills = ['Astral', 'Athletics (Swimming)', 'Close Combat', 'Exotic Ranged Weapon', 'Perception'];
powers = ['Astral Form', 'Concealment', 'Confusion', 'Engulf (Water)', 'Materialization', 'Movement', 'Sapience', 'Search'];
optional_powers = ['Accident', 'Binding', 'Elemental Attack (Cold)', 'Energy Aura (Cold)', 'Guard', 'Weather Control'];
ranged = [{
'name': 'Elemental Attack',
'pool': force + spirit.agility,
'skill': 'Magic',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': force + 'P',
'c': force * 2,
'n': ((force * 2) - 2),
'm': ((force * 2) - 8),
'f': ((force * 2) - 10),
'e': 0,
'notes': 'Requires Elemental Attack Optional Power'
}];
close = [{
'name': 'Engulf',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': parseInt(force + 2) + 'S',
'c': (force * 2) + 1,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': 'Damage adds Fatigue I'
}];
break;
case 'Plant':
spirit.tasks_modifier = '';
spirit.body = force + 2;
spirit.agility = (force > 1) ? force - 1 : 1;
spirit.reaction = force;
spirit.strength = force + 1;
spirit.willpower = force;
spirit.logic = (force > 1) ? force - 1 : 1;
spirit.intuition = force;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 8;
spirit.move_speed = 10;
spirit.sprint_speed = 15;
spirit.sprint_modifier = 1;
spirit.initiative_base = force * 2;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = force * 2;
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force + 2;
spirit.weaknesses = 'Allergy (fire, vulnerability)';
skills = ['Astral', 'Close Combat', 'Exotic Ranged Weapon', 'Perception', 'Spellcasting'];
powers = ['Astral Form', 'Concealment', 'Engulf', 'Fear', 'Guard', 'Magical Guard', 'Materialization', 'Sapience', 'Silence'];
optional_powers = ['Accident', 'Confusion', 'Movement', 'Noxious Breath', 'Search'];
ranged = [];
close = [{
'name': 'Engulf',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': force + 'S',
'c': force * 3,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': 'Damage adds Fatigue I'
}];
break;
case 'Guardian':
spirit.tasks_modifier = '';
spirit.body = force + 1;
spirit.agility = force + 2;
spirit.reaction = force + 3;
spirit.strength = force + 2;
spirit.willpower = force;
spirit.logic = force;
spirit.intuition = force;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 4;
spirit.physical = Math.ceil((force + 1) / 2) + 8;
spirit.move_speed = 10;
spirit.sprint_speed = 15;
spirit.sprint_modifier = 1;
spirit.initiative_base = (force * 2) + 3;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = (force * 2);
spirit.astral_initiative_dice = 3;
spirit.defense_rating = (force * 2) + 1;
spirit.weaknesses = 'Allergy (wood, severe)';
skills = ['Astral', 'Close Combat', 'Exotic Ranged Weapon', 'Perception'];
powers = ['Astral Form', 'Fear', 'Guard', 'Magical Guard', 'Materialization', 'Movement', 'Sapience'];
optional_powers = ['Animal Control', 'Concealment', 'Elemental Attack', 'Natural Weapon', 'Psychokinesis', 'Skill Specialization'];
ranged = [{
'name': 'Elemental Attack',
'pool': force + spirit.agility,
'skill': 'Magic',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': force + 'P',
'c': force * 2,
'n': ((force * 2) - 2),
'm': ((force * 2) - 8),
'f': ((force * 2) - 10),
'e': 0,
'notes': 'Requires Elemental Attack Optional Power'
}];
close = [{
'name': 'Natural Weapon',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': parseInt((force / 2) + 1) + 'P',
'c': force * 2,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': 'Requires Natural Weapon Optional Power'
}];
break;
case 'Guidance':
spirit.tasks_modifier = '';
spirit.body = force + 3;
spirit.agility = (force > 1) ? force - 1 : 1;
spirit.reaction = force + 2;
spirit.strength = force + 1;
spirit.willpower = force;
spirit.logic = force;
spirit.intuition = force;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 8;
spirit.move_speed = 10;
spirit.sprint_speed = 15;
spirit.sprint_modifier = 1;
spirit.initiative_base = (force * 2) + 2;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = force * 2;
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force + 3;
spirit.weaknesses = 'Allergy (gold, severe)';
skills = ['Astral', 'Close Combat', 'Perception', 'Spellcasting'];
powers = ['Astral Form', 'Confusion', 'Divining', 'Guard', 'Magical Guard', 'Materialization', 'Sapience', 'Search', 'Shadow Cloak'];
optional_powers = ['Engulf', 'Enhanced Senses (Hearing)', 'Enhanced Senses (Low-Light Vision)', 'Enhanced Senses (Thermographic Vision)', 'Enhanced Senses (Smell)', 'Fear', 'Influence'];
ranged = [];
close = [{
'name': 'Engulf',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': force + 'S',
'c': force * 3,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': 'Requires Engulf Optional Power, Damage adds Fatigue I'
}];
break;
case 'Task':
spirit.tasks_modifier = '1';
spirit.body = force;
spirit.agility = force;
spirit.reaction = force + 2;
spirit.strength = force + 2;
spirit.willpower = force;
spirit.logic = force;
spirit.intuition = force;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 8;
spirit.move_speed = 10;
spirit.sprint_speed = 15;
spirit.sprint_modifier = 1;
spirit.initiative_base = (force * 2) + 2;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = force * 2;
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force;
spirit.weaknesses = 'Allergy (corrosives, severe)';
skills = ['Astral', 'Close Combat', 'Perception'];
powers = ['Accident', 'Astral Form', 'Binding', 'Materialization', 'Movement', 'Sapience', 'Search', 'Skill', 'Skill Specialization'];
optional_powers = ['Concealment', 'Enhanced Senses (Hearing)', 'Enhanced Senses (Low-Light Vision)', 'Enhanced Senses (Thermographic Vision)', 'Enhanced Senses (Smell)', 'Influence', 'Psychokinesis', 'Skill'];
ranged = [];
close = [];
break;
case 'Blood':
spirit.tasks_modifier = '';
spirit.body = force + 4;
spirit.agility = force + 2;
spirit.reaction = force + 1;
spirit.strength = force + 3;
spirit.willpower = force + 1;
spirit.logic = force;
spirit.intuition = force;
spirit.charisma = (force > 1) ? force - 1 : 1;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 8;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 2;
spirit.initiative_base = (force * 2) + 1;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = force * 2;
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force + 4;
spirit.weaknesses = 'Essence Loss (1 point per day)';
skills = ['Astral', 'Athletics', 'Close Combat', 'Outdoors', 'Perception'];
powers = ['Astral Form', 'Binding', 'Engulf', 'Enhanced Senses (Smell)', 'Fear', 'Materialization'];
optional_powers = ['Concealment', 'Confusion', 'Guard', 'Movement', 'Natural Weapon (claws/bite)', 'Noxious Breath'];
ranged = [];
close = [{
'name': 'Engulf',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': parseInt(force + 2) + 'P',
'c': (force * 2) + 2,
'n': ((force * 2) - 2),
'm': ((force * 2) - 8),
'f': ((force * 2) - 10),
'e': 0,
'notes': ''
},
{
'name': 'Optional claw/bite',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': Math.ceil(force / 2) + 'P',
'c': (force * 2) + 2,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': 'Requires Natural Weapon Optional Power'
}];
break;
case 'Insect (Caretaker)':
spirit.tasks_modifier = '';
spirit.body = force;
spirit.agility = force + 1;
spirit.reaction = force + 1;
spirit.strength = force;
spirit.willpower = force;
spirit.logic = force;
spirit.intuition = force;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 8;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 1;
spirit.initiative_base = (force * 2) + 1;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = force * 2;
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force + 3;
spirit.weaknesses = 'Allergy (Insecticides, Severe), Evanescence';
skills = ['Astral', 'Close Combat', 'Influence', 'Perception'];
powers = ['Animal Control (Insect Type)', 'Astral Form', 'Guard', 'Hive Mind', 'Inhabitation (Living Vessels)', 'Innate Spell (Physical Barrier)', 'Sapience'];
optional_powers = ['Binding', 'Confusion', 'Enhanced Senses (Smell)', 'Thermographic Vision', 'Ultrasound'];
ranged = [];
close = [];
break;
case 'Insect (Nymph)':
spirit.tasks_modifier = '';
spirit.body = (force > 1) ? force - 1 : 1;
spirit.agility = force;
spirit.reaction = force + 3;
spirit.strength = (force > 1) ? force - 1 : 1;
spirit.willpower = force;
spirit.logic = force;
spirit.intuition = force;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 7;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 3;
spirit.initiative_base = (force * 2) + 3;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = force * 2;
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force + 2;
spirit.weaknesses = 'Allergy (Insecticides, Severe), Evanescence';
skills = ['Astral', 'Athletics', 'Close Combat', 'Perception', 'Sorcery'];
powers = ['Animal Control (Insect Type)', 'Astral Form', 'Enhanced Senses (Smell)', 'Thermographic Vision', 'Ultrasound', 'Hive Mind', 'Inhabitation (Living Vessels)', 'Innate Spell (any one Illusion Spell known to the summoner)', 'Sapience'];
optional_powers = ['Compulsion', 'Fear'];
ranged = [];
close = [];
break;
case 'Insect (Scout)':
spirit.tasks_modifier = '';
spirit.body = force;
spirit.agility = force + 2;
spirit.reaction = force + 2;
spirit.strength = force;
spirit.willpower = force;
spirit.logic = force;
spirit.intuition = force;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 4;
spirit.physical = Math.ceil(force / 2) + 8;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 3;
spirit.initiative_base = (force * 2) + 2;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = force * 2;
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force;
spirit.weaknesses = 'Allergy (Insecticides, Severe), Evanescence';
skills = ['Astral', 'Close Combat', 'Perception', 'Stealth'];
powers = ['Animal Control (Insect Type)', 'Astral Form', 'Hive Mind', 'Inhabitation (Living Vessels)', 'Innate Spell (Physical Barrier)', 'Movement', 'Sapience', 'Search'];
optional_powers = ['Confusion', 'Guard', 'Enhanced Senses (Smell)', 'Thermographic Vision', 'Ultrasound'];
ranged = [];
close = [{
'name': 'Natural Weapon (claw/bite)',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': Math.ceil(force / 2) + 'P',
'c': (force * 2) + 1,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': ''
}];
break;
case 'Insect (Soldier)':
spirit.tasks_modifier = '';
spirit.body = force + 2;
spirit.agility = force + 1;
spirit.reaction = force + 1;
spirit.strength = force + 3;
spirit.willpower = force;
spirit.logic = force;
spirit.intuition = force + 1;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 9;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 1;
spirit.initiative_base = (force * 2) + 2;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = force * 2;
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force + 3;
spirit.weaknesses = 'Allergy (Insecticides, Moderate), Evanescence';
skills = ['Astral', 'Athletics', 'Close Combat', 'Con', 'Perception', 'Stealth'];
powers = ['Animal Control', 'Astral Form', 'Fear', 'Hive Mind', 'Inhabitation (Living Vessels)', 'Natural Weapon', 'Sapience'];
optional_powers = ['Binding', 'Concealment', 'Noxious Breath', 'Venom'];
ranged = [];
close = [{
'name': 'Natural Weapon (claw/bite)',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': Math.ceil(force / 2) + 'P',
'c': (force * 2) + 1,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': ''
}];
break;
case 'Insect (Worker)':
spirit.tasks_modifier = '';
spirit.body = force;
spirit.agility = force;
spirit.reaction = force;
spirit.strength = force + 1;
spirit.willpower = force;
spirit.logic = force;
spirit.intuition = force;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 9;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 1;
spirit.initiative_base = force * 2;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = force * 2;
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force + 1;
spirit.weaknesses = 'Allergy (Insecticides, Severe), Evanescence';
skills = ['Astral', 'Athletics', 'Close Combat', 'Perception', 'Stealth'];
powers = ['Animal Control', 'Astral Form', 'Enhanced Senses (Smell)', 'Enhanced Senses (Thermographic Vision)', 'Hive Mind', 'Inhabitation (Living Vessels)', 'Movement', 'Natural Weapon', 'Sapience', 'Search'];
optional_powers = ['Concealment', 'Enhanced Senses (Ultrasound)', 'Venom'];
ranged = [];
close = [{
'name': 'Natural Weapon (claw/bite)',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': Math.ceil(force / 2) + 'P',
'c': force * 2,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': ''
}];
break;
case 'Insect (Queen)':
spirit.tasks_modifier = '';
spirit.body = force + 5;
spirit.agility = force + 3;
spirit.reaction = force + 4;
spirit.strength = force + 5;
spirit.willpower = force + 1;
spirit.logic = force + 1;
spirit.intuition = force;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 10;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 2;
spirit.initiative_base = (force * 2) + 4;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = force * 2;
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force + 5;
spirit.weaknesses = 'Allergy (Insecticides, Severe)';
skills = ['Astral', 'Athletics', 'Close Combat', 'Con', 'Influence', 'Perception', 'Spellcasting'];
powers = ['Animal Control (Insect Type)', 'Astral Gateway', 'Compulsion', 'Enhanced Senses (Smell or Thermographic Vision or Ultrasound)', 'Fear', 'Hive Mind', 'Inhabitation (Living Vessels)', 'Sapience', 'Search', 'Spirit Pact', 'Wealth'];
optional_powers = ['Concealment', 'Guard', 'Noxious Breath', 'Venom'];
ranged = [];
close = [{
'name': 'Natural Weapon (claw/bite)',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': parseInt(Math.ceil(force / 2) + 2) + 'P',
'c': (force * 2) + 9,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': ''
}];
break;
case 'Insect (Alpha)':
spirit.tasks_modifier = '';
spirit.body = force + 3;
spirit.agility = force + 2;
spirit.reaction = force + 2;
spirit.strength = force + 3;
spirit.willpower = force + 1;
spirit.logic = (force > 2) ? force - 2 : 1;
spirit.intuition = force + 1;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 4;
spirit.physical = Math.ceil(force / 2) + 9;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 1;
spirit.initiative_base = (force * 2) + 3;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = 0;
spirit.astral_initiative_dice = 0;
spirit.defense_rating = force + 4;
spirit.weaknesses = '';
skills = ['Astral (Perception only)', 'Athletics', 'Close Combat', 'Con', 'Influence', 'Outdoors', 'Perception', 'Stealth'];
powers = ['Animal Control', 'Enhanced Senses (Smell)', 'Enhanced Senses (Thermographic Vision)', 'Fear', 'Hive Mind', 'Inhabitation (Living Vessels)', 'Movement', 'Natural Weapon', 'Sapience'];
optional_powers = ['Binding', 'Concealment', 'Noxious Breath', 'Venom'];
ranged = [];
close = [{
'name': 'Natural Weapon (claw/bite)',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': parseInt(Math.ceil(force / 2) + 2) + 'P',
'c': (force * 2) + 4,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': ''
}];
break;
case 'Agwe':
spirit.tasks_modifier = '';
spirit.body = force;
spirit.agility = force + 1;
spirit.reaction = force;
spirit.strength = force + 2;
spirit.willpower = force;
spirit.logic = force;
spirit.intuition = force;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 8;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 2;
spirit.initiative_base = (force * 2);
spirit.initiative_dice = 2;
spirit.astral_initiative_base = (force * 2);
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force;
spirit.weaknesses = 'Allergy (Fire, Severe)';
skills = ['Astral', 'Athletics', 'Close Combat', 'Exotic Ranged Weapon', 'Perception'];
powers = ['Astral Form', 'Concealment', 'Confusion', 'Fear', 'Guard', 'Movement', 'Possession', 'Sapience', 'Search'];
optional_powers = ['Accident', 'Elemental Attack (Cold)', 'Energy Aura (Cold)', 'Weather Control'];
ranged = [{
'name': 'Elemental Attack',
'pool': force + spirit.agility,
'skill': 'Exotic Ranged Weapon',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': force + 'P',
'c': force * 2,
'n': ((force * 2) - 2),
'm': ((force * 2) - 8),
'f': ((force * 2) - 10),
'e': 0,
'notes': 'Requires Elemental Attack Optional Power'
}];
close = [{
'name': 'Strike',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': '2P',
'c': (force * 2) + 2,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': ''
}];
break;
case 'Azaca':
spirit.tasks_modifier = '';
spirit.body = force + 2;
spirit.agility = force;
spirit.reaction = force;
spirit.strength = force + 1;
spirit.willpower = force;
spirit.logic = force;
spirit.intuition = force;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 9;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 1;
spirit.initiative_base = (force * 2);
spirit.initiative_dice = 2;
spirit.astral_initiative_base = (force * 2);
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force + 2;
spirit.weaknesses = 'Allergy (Electricity, Severe)';
skills = ['Astral', 'Close Combat', 'Exotic Ranged Weapon', 'Perception'];
powers = ['Astral Form', 'Confusion', 'Guard', 'Movement', 'Possession', 'Sapience', 'Search'];
optional_powers = ['Concealment', 'Elemental Attack (Chemical)', 'Engulf (Earth)', 'Fear'];
ranged = [{
'name': 'Elemental Attack',
'pool': force + spirit.agility,
'skill': 'Exotic Ranged Weapon',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': force + 'P',
'c': force * 2,
'n': ((force * 2) - 2),
'm': ((force * 2) - 8),
'f': ((force * 2) - 10),
'e': 0,
'notes': 'Requires Elemental Attack Optional Power'
}];
close = [{
'name': 'Strike',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': '2P',
'c': (force * 2) + 1,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': ''
}];
break;
case 'Damballah':
spirit.tasks_modifier = '';
spirit.body = force;
spirit.agility = force + 1;
spirit.reaction = force + 2;
spirit.strength = force;
spirit.willpower = force;
spirit.logic = force + 1;
spirit.intuition = force;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 8;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 1;
spirit.initiative_base = (force * 2) + 2;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = (force * 2);
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force;
spirit.weaknesses = 'Allergy (Diseases, Severe)';
skills = ['Astral', 'Close Combat', 'Perception', 'Sorcery'];
powers = ['Animal Control (snakes)', 'Astral Form', 'Confusion', 'Guard', 'Magical Guard', 'Possession', 'Sapience', 'Search'];
optional_powers = ['Concealment', 'Corrosive Spit', 'Natural Weapon (claws/bite)', 'Noxious Breath', 'Search', 'Venom'];
ranged = [];
close = [{
'name': 'Bite',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': '2P',
'c': (force * 2) + 2,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': ''
}];
break;
case 'Erzulie':
spirit.tasks_modifier = '';
spirit.body = force;
spirit.agility = force;
spirit.reaction = force;
spirit.strength = force + 1;
spirit.willpower = force;
spirit.logic = force;
spirit.intuition = force + 1;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 8;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 1;
spirit.initiative_base = (force * 2) + 1;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = (force * 2) + 2;
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force;
spirit.weaknesses = '';
skills = ['Astral', 'Close Combat', 'Perception'];
powers = ['Astral Form', 'Confusion', 'Influence (love or lust)', 'Possession', 'Sapience', 'Search'];
optional_powers = ['Fear', 'Movement', 'Psychokinesis'];
ranged = [];
close = [{
'name': 'Strike',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': '2P',
'c': (force * 2) + 1,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': ''
}];
break;
case 'Ghede':
spirit.tasks_modifier = '';
spirit.body = force;
spirit.agility = force + 1;
spirit.reaction = force + 1;
spirit.strength = force + 1;
spirit.willpower = force;
spirit.logic = force;
spirit.intuition = force;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 8;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 1;
spirit.initiative_base = (force * 2) + 1;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = (force * 2);
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force;
spirit.weaknesses = '';
skills = ['Astral', 'Athletics', 'Close Combat', 'Exotic Ranged Weapon', 'Perception', 'Sorcery'];
powers = ['Accident', 'Astral Form', 'Confusion', 'Fear', 'Guard', 'Magical Guard', 'Possession', 'Sapience', 'Search'];
optional_powers = ['Concealment', 'Enhanced Sense (Hearing)', 'Enhanced Senses (Low-Light Vision)', 'Enhanced Senses (Thermographic Vision)', 'Enhanced Senses (Smell)', 'Influence', 'Psychokinesis'];
ranged = [];
close = [{
'name': 'Strike',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': '2P',
'c': (force * 2) + 2,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': ''
}];
break;
case 'Legba':
spirit.tasks_modifier = '';
spirit.body = (force > 1) ? force - 1 : 1;
spirit.agility = force + 1;
spirit.reaction = force;
spirit.strength = force + 1;
spirit.willpower = force;
spirit.logic = force;
spirit.intuition = force;
spirit.charisma = force + 2;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 8;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 1;
spirit.initiative_base = (force * 2);
spirit.initiative_dice = 2;
spirit.astral_initiative_base = (force * 2);
spirit.astral_initiative_dice = 3;
spirit.defense_rating = (force > 1) ? force - 1 : 1;
spirit.weaknesses = 'Allergy (Electricity, Severe)';
skills = ['Astral', 'Close Combat', 'Exotic Ranged Weapon', 'Perception', 'Sorcery'];
powers = ['Accident', 'Astral Form', 'Concealment', 'Confusion', 'Guard', 'Magical Guard', 'Possession', 'Sapience', 'Search'];
optional_powers = ['Enhanced Sense (Hearing)', 'Enhanced Senses (Low-Light Vision)', 'Enhanced Senses (Thermographic Vision)', 'Enhanced Senses (Smell)', 'Fear', 'Influence', 'Shadow Cloak'];
ranged = [];
close = [{
'name': 'Strike',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': '2P',
'c': (force * 2) + 1,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': ''
}];
break;
case 'Obatala':
spirit.tasks_modifier = '';
spirit.body = force + 1;
spirit.agility = force + 2;
spirit.reaction = force + 2;
spirit.strength = force + 1;
spirit.willpower = force + 1;
spirit.logic = force;
spirit.intuition = force;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 8;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 1;
spirit.initiative_base = (force * 2);
spirit.initiative_dice = 2;
spirit.astral_initiative_base = (force * 2);
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force + 1;
spirit.weaknesses = 'Allergy (Alcohol, Severe)';
skills = ['Astral', 'Close Combat', 'Exotic Ranged Weapon', 'Perception', 'Sorcery'];
powers = ['Astral Form', 'Confusion', 'Guard', 'Influence (peace and calm)', 'Magical Guard', 'Possession', 'Sapience', 'Search'];
optional_powers = ['Concealment', 'Elemental Attack (conjuror chooses element during summoning)', 'Natural Weapon', 'Psychokinesis', 'Skill Specialization (choose any Close Combat skill specialization)'];
ranged = [{
'name': 'Elemental Attack',
'pool': force + spirit.agility,
'skill': 'Exotic Ranged Weapon',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': force + 'P',
'c': force * 2,
'n': ((force * 2) - 2),
'm': ((force * 2) - 8),
'f': ((force * 2) - 10),
'e': 0,
'notes': 'Requires Elemental Attack Optional Power'
}];
close = [{
'name': 'Strike',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': '2P',
'c': (force * 2) + 3,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': ''
}];
break;
case 'Ogoun':
spirit.tasks_modifier = '';
spirit.body = force;
spirit.agility = force + 2;
spirit.reaction = force + 2;
spirit.strength = force;
spirit.willpower = force;
spirit.logic = force;
spirit.intuition = force;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 8;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 1;
spirit.initiative_base = (force * 2);
spirit.initiative_dice = 2;
spirit.astral_initiative_base = (force * 2);
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force;
spirit.weaknesses = 'Allergy (Water, Severe)';
skills = ['Astral', 'Close Combat', 'Exotic Ranged Weapon', 'Perception'];
powers = ['Astral Form', 'Concealment', 'Confusion', 'Elemental Attack (Fire)', 'Elemental Aura (Fire)', 'Fear', 'Possession', 'Sapience'];
optional_powers = ['Guard', 'Noxious Breath', 'Search'];
ranged = [{
'name': 'Elemental Attack',
'pool': force + spirit.agility,
'skill': 'Exotic Ranged Weapon',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': force + 'P',
'c': force * 2,
'n': ((force * 2) - 2),
'm': ((force * 2) - 8),
'f': ((force * 2) - 10),
'e': 0,
'notes': 'Requires Elemental Attack Optional Power'
}];
close = [{
'name': 'Strike',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': '2P',
'c': (force * 2) + 2,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': ''
}];
break;
case 'Shango':
spirit.tasks_modifier = '';
spirit.body = (force > 1) ? force - 1 : 1;
spirit.agility = force + 2;
spirit.reaction = force + 2;
spirit.strength = (force > 1) ? force - 1 : 1;
spirit.willpower = force;
spirit.logic = force;
spirit.intuition = force + 1;
spirit.charisma = force;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = Math.ceil(force / 2) + 8;
spirit.move_speed = 5;
spirit.sprint_speed = 10;
spirit.sprint_modifier = 1;
spirit.initiative_base = (force * 2) + 3;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = (force * 2) + 1;
spirit.astral_initiative_dice = 3;
spirit.defense_rating = force + 2;
spirit.weaknesses = 'Allergy (Toxins, Severe)';
skills = ['Astral', 'Close Combat', 'Exotic Ranged Weapon', 'Perception'];
powers = ['Astral Form', 'Concealment', 'Fear', 'Guard', 'Immunity (Fire)', 'Innate Spell (Lightning Bolt)', 'Possession', 'Sapience', 'Search'];
optional_powers = ['Elemental Attack (Cold or Electricity)', 'Energy Aura (Cold or Electricity)', 'Noxious Breath', 'Psychokinesis'];
ranged = [{
'name': 'Elemental Attack',
'pool': force + spirit.agility,
'skill': 'Exotic Ranged Weapon',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': force + 'P',
'c': force * 2,
'n': ((force * 2) - 2),
'm': ((force * 2) - 8),
'f': ((force * 2) - 10),
'e': 0,
'notes': 'Requires Elemental Attack Optional Power'
}];
close = [{
'name': 'Strike',
'pool': force + spirit.agility,
'skill': 'Close Combat',
'rating': force,
'attribute': 'Agility',
'attr_rating': spirit.agility,
'dam': '2P',
'c': (force * 2) + 1,
'n': 0,
'm': 0,
'f': 0,
'e': 0,
'notes': ''
}];
break;
default:
spirit.tasks_modifier = '';
spirit.body = 1;
spirit.agility = 1;
spirit.reaction = 1;
spirit.strength = 1;
spirit.willpower = 1;
spirit.logic = 1;
spirit.intuition = 1;
spirit.charisma = 1;
spirit.magic = 1;
spirit.major_actions = 1;
spirit.minor_actions = 3;
spirit.physical = 9;
spirit.move_speed = 10;
spirit.sprint_speed = 15;
spirit.sprint_modifier = 1;
spirit.initiative_base = 5;
spirit.initiative_dice = 2;
spirit.astral_initiative_base = 2;
spirit.astral_initiative_dice = 3;
spirit.defense_rating = 1;
spirit.weaknesses = '';
powers = [];
skills = [];
break;
}
setAttrs({
'tasks_modifier': spirit.tasks_modifier,
'body_base': spirit.body,
'agility_base': spirit.agility,
'reaction_base': spirit.reaction,
'strength_base': spirit.strength,
'willpower_base': spirit.willpower,
'logic_base': spirit.logic,
'intuition_base': spirit.intuition,
'charisma_base': spirit.charisma,
'edge': spirit.edge,
'magic': spirit.magic,
'essence': spirit.essence,
'major_actions': spirit.major_actions,
'minor_actions': spirit.minor_actions,
'physical': spirit.physical,
'physical_max': spirit.physical,
'move_speed': spirit.move_speed,
'sprint_speed': spirit.sprint_speed,
'sprint_modifier': spirit.sprint_modifier,
'initiative_base': spirit.initiative_base,
'initiative_dice': spirit.initiative_dice,
'astral_initiative_base': spirit.astral_initiative_base,
'astral_initiative_dice': spirit.astral_initiative_dice,
'defense_rating': spirit.defense_rating,
'weaknesses': spirit.weaknesses,
});
// Check if there are already skills
getSectionIDs(['repeating_skills'], function (ids) {
// if there are any skills already set up let's not mess with them
// the GM / player may have them how they want them.
toUpdate = {};
if(v.spirit_reset_toggle === 'reset') {
// The reset toggle is turned on, wipe out the skills
ids.forEach(rowId => {
removeRepeatingRow(`repeating_skills_${rowId}`);
});
}
let usedIDs = [];
if(ids.length == 0 || v.spirit_reset_toggle === 'reset') {
skills.forEach(skillname => {
// make a new repeatingRowID
var newId = generateRowID();
while(newId in usedIDs) {
newId = generateRowID();
}
usedIDs.push(newId);
toUpdate[`repeating_skills_${newId}_skill`] = skillname;
toUpdate[`repeating_skills_${newId}_flag`] = 0;
});
setAttrs(toUpdate);
}
});
// Some notes for the powers, we don't want to infringe copyrights so we'll point to the Core Rule Book page,
// They can type whatever they want in later
var notes = {
'Accident': 'CRB pg.221',
'Animal Control': 'CRB pg.221',
'Animal Control (Insect Type)': 'CRB pg.221',
'Astral Form': 'CRB pg.222',
'Astral Gateway': 'SW pg.66',
'Astral Projection': 'SW pg.66',
'Aura Masking': 'SW pg.66',
'Binding': 'CRB pg.222',
'Concealment': 'CRB pg.222',
'Confusion': 'CRB pg.222',
'Divining': 'SW pg.67',
'Elemental Attack': 'conjuror chooses element duiring summoning - CRB pg.223',
'Elemental Attack (Cold)': 'CRB pg.223',
'Elemental Attack (Chemical)': 'CRB pg.223',
'Elemental Attack (Electricity)': 'CRB pg.223',
'Elemental Attack (Fire)': 'CRB pg.223',
'Endowment': 'SW pg.67',
'Energy Aura (Cold)': 'CRB pg.223',
'Energy Aura (Electricity)': 'CRB pg.223',
'Energy Aura (Fire)': 'CRB pg.223',
'Energy Drain': 'SW pg.67',
'Engulf': 'CRB pg.223',
'Engulf (Air)': 'CRB pg.223',
'Engulf (Earth)': 'CRB pg.223',
'Engulf (Fire)': 'CRB pg.223',
'Engulf (Water)': 'CRB pg.223',
'Enhanced Senses (Hearing)': 'CRB pg.223',
'Enhanced Senses (Low-Light)': 'CRB pg.223',
'Enhanced Senses (Smell)': 'CRB pg.223',
'Enhanced Senses (Thermographic)': 'CRB pg.223',
'Enhanced Senses (Select One)': 'CRB pg.223',
'Fear': 'CRB pg.224',
'Guard': 'CRB pg.224',
'Hidden Life': 'SW pg.67',
'Influence': 'CRB pg.225',
'Inhabitation': 'SW pg.67',
'Inhabitation (Living Vessels)': 'SW pg.67',
'Innate Spell': 'any one spell known by the summoner; only one spell effect may be added - CRB pg.225',
'Magical Guard': 'SW pg.69',
'Materialization': 'CRB pg.225',
'Movement': 'CRB pg.226',
'Mutable Form': 'SW pg.69',
'Natural Weapon (claws/bite)': 'CRB pg.226',
'Noxious Breath': 'CRB pg.226',
'Personal Domain': 'SW pg.69',
'Possession': 'SW pg.69',
'Psychokinesis': 'CRB pg.227',
'Quake': 'SW pg.69',
'Realistic Form': 'SW pg.70',
'Regeneration': 'SW pg.70',
'Sapience': 'CRB pg.227',
'Search': 'CRB pg.227',
'Shadow Cloak': 'SW pg.70',
'Silence': 'SW pg.70',
'Skill': 'Choose one from Biotech, Electronics, Engineering, Outdoors or Piloting and a Specialization in the chosen skill as well as an appropriate Knowledge Skill - SW pg.56',
'Skill Specialization': 'choose any skill specialization appropriate to the spirit - SW pg.55',
'Storm': 'SW pg.70',
'Temporal Displacement': 'SW pg.71',
'Venom': 'CRB pg.228',
'Vessel Trading': 'SW pg.71',
'Weather Control': 'CRB pg.228',
'Wealth': 'SW pg.71',
};
// Check if there are already powers
getSectionIDs(['repeating_powers'], function (ids) {
// if there are any powers already set up let's not mess with them
// the GM / player may have them how they want them.
if(v.spirit_reset_toggle === 'reset') {
// The reset toggle is turned on, wipe out the skills
ids.forEach(rowId => {
removeRepeatingRow(`repeating_powers_${rowId}`);
});
}
if(ids.length == 0 || v.spirit_reset_toggle === 'reset') {
let usedIDs = [];
powers.forEach(power => {
// make a new repeatingRowID
var newId = generateRowID();
while(newId in usedIDs) {
newId = generateRowID();
}
usedIDs.push(newId);
setAttrs({
[`repeating_powers_${newId}_name`]: power,
[`repeating_powers_${newId}_notes`]: notes[power] || '',
[`repeating_powers_${newId}_flag`]: 0
});
});
}
});
// Check if there are already ranged weapons
if((ranged && Object.keys(ranged).length > 0) || v.spirit_reset_toggle === 'reset') {
getSectionIDs(['repeating_range'], function (ids) {
// if there are any ranged already set up let's not mess with them
// the GM / player may have them how they want them.
if(v.spirit_reset_toggle === 'reset') {
// The reset toggle is turned on, wipe out the skills
ids.forEach(rowId => {
removeRepeatingRow("repeating_range_"+rowId.toLowerCase());
});
}
if((ids.length == 0 || v.spirit_reset_toggle === 'reset') && ranged && ranged.length > 0) {
let usedIDs = [];
ranged.forEach(atk => {
// make a new repeatingRowID
let newId = generateRowID();
while(newId in usedIDs) {
newId = generateRowID();
}
usedIDs.push(newId);
setAttrs({
[`repeating_range_${newId}_name`]: atk.name,
[`repeating_range_${newId}_skill`]: atk.skill,
[`repeating_range_${newId}_rating`]: atk.rating,
[`repeating_range_${newId}_attribute`]: atk.attribute,
[`repeating_range_${newId}_attr_rating`]: atk.attr_rating,
[`repeating_range_${newId}_dicepool`]: atk.pool,
[`repeating_range_${newId}_dicepool_base`]: atk.pool,
[`repeating_range_${newId}_damage_base`]: atk.dam,
[`repeating_range_${newId}_close_base`]: (atk.c > 0) ? atk.c : 0,
[`repeating_range_${newId}_near_base`]: (atk.n > 0) ? atk.n : 0,
[`repeating_range_${newId}_medium_base`]: (atk.m > 0) ? atk.m : 0,
[`repeating_range_${newId}_far_base`]: (atk.f > 0) ? atk.f : 0,
[`repeating_range_${newId}_extreme_base`]: (atk.e > 0) ? atk.e : 0,
[`repeating_range_${newId}_notes`]: atk.notes,
[`repeating_range_${newId}_flag`]: 0
}, {silent: true});
});
}
});
}
// Check if there are already melee weapons
if((close && Object.keys(close).length > 0) || v.spirit_reset_toggle === 'reset') {
getSectionIDs(['repeating_melee'], function (ids) {
// if there are any melee already set up let's not mess with them
// the GM / player may have them how they want them.
if(v.spirit_reset_toggle === 'reset') {
// The reset toggle is turned on, wipe out the skills
ids.forEach(rowId => {
removeRepeatingRow(`repeating_melee_${rowId}`);
});
}
if((ids.length == 0 || v.spirit_reset_toggle === 'reset') && close && close.length > 0) {
let usedIDs = [];
close.forEach(atk => {
// make a new repeatingRowID
let newId = generateRowID();
while(newId in usedIDs) {
newId = generateRowID();
}
usedIDs.push(newId);
setAttrs({
[`repeating_melee_${newId}_name`]: atk.name,
[`repeating_melee_${newId}_skill`]: atk.skill,
[`repeating_melee_${newId}_rating`]: atk.rating,
[`repeating_melee_${newId}_attribute`]: atk.attribute,
[`repeating_melee_${newId}_attr_rating`]: atk.attr_rating,
[`repeating_melee_${newId}_dicepool`]: atk.pool,
[`repeating_melee_${newId}_dicepool_base`]: atk.pool,
[`repeating_melee_${newId}_damage_base`]: atk.dam,
[`repeating_melee_${newId}_close_base`]: (atk.c > 0) ? atk.c : 0,
[`repeating_melee_${newId}_near_base`]: (atk.n > 0) ? atk.n : 0,
[`repeating_melee_${newId}_medium_base`]: (atk.m > 0) ? atk.m : 0,
[`repeating_melee_${newId}_far_base`]: (atk.f > 0) ? atk.f : 0,
[`repeating_melee_${newId}_extreme_base`]: (atk.e > 0) ? atk.e : 0,
[`repeating_melee_${newId}_notes`]: atk.notes,
[`repeating_melee_${newId}_flag`]: 0
}, {silent: true});
});
}
});
}
setAttrs({
grunt_group_member: 0,
flag_special: 'magic'
});
});
};
on("change:measurement1 change:measurement2", (eventInfo) => {
if(eventInfo.sourceType !== "player") {
return;
}
getAttrs(['measurement1', 'measurement2', 'conversion'], (v) => {
switch (v.conversion) {
case 'lb-kg':
if(eventInfo.sourceAttribute === 'measurement1') {
var kg = v.measurement1 * .453592;
setAttrs({
'measurement2': kg.toFixed(2)
});
} else {
var lb = v.measurement2 / .453592;
setAttrs({
'measurement1': lb.toFixed(2)
});
}
break;
case 'ft-m':
if(eventInfo.sourceAttribute === 'measurement1') {
var ft = v.measurement1 * .3048;
setAttrs({
'measurement2': ft.toFixed(2)
});
} else {
var m = v.measurement2 / .3048;
setAttrs({
'measurement1': m.toFixed(2)
});
}
break;
case 'mi-km':
if(eventInfo.sourceAttribute === 'measurement1') {
var mi = v.measurement1 * 1.60934;
setAttrs({
'measurement2': mi.toFixed(2)
});
} else {
var km = v.measurement2 / 1.60934;
setAttrs({
'measurement1': km.toFixed(2)
});
}
break;
default:
break;
}
});
});
/********************************************************/
/* Matrix Encounter Sheet Workers */
/********************************************************/
// increment/decrement OS in the OS tracker
on("clicked:repeating_os-tracker:osadd clicked:repeating_os-tracker:osdel", (eventInfo) => {
let key = eventInfo.triggerName.slice(0, -6).slice(8);
key = key + '_os';
getAttrs([key], (v) => {
let newval = parseInt(v[`${key}`]);
if(eventInfo.triggerName.endsWith('add')) {
newval += parseInt(1);
} else {
newval -= parseInt(1);
if(newval < 0) {
newval = 0;
}
}
setAttrs({
[`${key}`]: parseInt(newval)
});
});
});
// Add character to the OS tracker
const add_to_OS_tracker = (attrs) => {
console.log(attrs);
};
//USEFUL FUNCTIONS
const capitialize = (string) => {
return string.charAt(0).toUpperCase() + string.slice(1);
};
const addFeedback = (attribute, value) => {
return `<p class="feedback"><strong>${capitialize(attribute)}:</strong> ${value} </p>`
};
const alphabatizeKeys = (unsortedJSON) => {
let alphabeticalKeys = {};
Object.keys(unsortedJSON).sort().forEach((key) => {
alphabeticalKeys[key] = unsortedJSON[key];
});
return alphabeticalKeys
};
const getValInParen = (value) => {
return value.split("(")[1].split(")")[0];
};
const getArray = (array) => {
return Array.isArray(array) ? array : [ array ];
};
const getSplitNum = (value) => {
return value.split("/")[0];
}
mylog = function(msg) {
let d = new Date();
let lines = new Error().stack.split("\n");
log(d.toUTCString() + " " + lines[2].trim() + " " + msg);
}
/*********************
* COMPENDIUM WORKERS *
*********************/
on("sheet:compendium-drop", (eventInfo) => {
console.info("/*************************************************/");
console.info("/* DROP EVENT */");
console.info("/*************************************************/");
console.log(eventInfo);
console.log("starting compendium_drop_done");
compendium_drop_done();
});
// Compendium Dropped to Canvas
on("change:canvas_drop_data", (eventInfo) => {
console.log("Compendium Item Dropped on Canvas!");
setAttrs({compendium_drop_in_progress: true}, {silent:true});
compendium_drop_handler('canvasdrop', eventInfo);
});
// Compendium Dropped to Sheet
on("change:compendium_drop_data", (eventInfo) => {
console.log("Compendium Item Dropped on Sheet!");
setAttrs({compendium_drop_in_progress: true}, {silent:true});
compendium_drop_handler('sheetdrop', eventInfo);
});
var compendium_drop_done = function() {
setAttrs({
compendium_drop_in_progress: ''
}, {silent:true});
}
let priorities = {
'NPCs': 0,
'Contacts': 1,
'Grunts': 2,
'Critters': 3,
'Drone': 4,
'Drones': 5,
'Vehicle': 6,
'Vehicles': 7,
'Spirits': 8,
'Hosts': 9,
'Sprites': 10,
'Qualities': 11,
'Spells': 12,
'Combat': 13,
'Detection': 14,
'Health': 15,
'Illusion': 16,
'Manipulation': 17,
'Rituals': 18,
'Powers': 19,
'Metamagic': 20,
'gear-misc': 21,
'Gear': 22,
'Complex Forms': 23,
'ICs': 24,
'Sprite Powers': 25,
'Augmentations': 26,
'gear-armor': 27,
'Armor': 28,
'Ranged': 29,
'weapon-ranged': 30,
'Melee': 31,
'weapon-melee': 32,
'Weapon Both': 33,
'Devices': 34,
'Programs': 35,
'Critter Powers': 36,
};
var compendium_drop_handler = ((dropType, eventInfo) => {
try{
data = JSON.parse(eventInfo.newValue) || false;
} catch(e) {
// wipe out compendium_drop_data until the next time
setAttrs({
'canvas_drop_data': '',
'compendium_drop_data': '',
'compendium_drop_content': ''
}, {silent: true});
return;
}
console.log(data);
// wipe out compendium_drop_data until the next time
// we're doing this here so errors don't leave ghost data
setAttrs({
'canvas_drop_data': '',
'compendium_drop_data': '',
'compendium_drop_content': ''
}, {silent: true});
if(eventInfo.sourceType != 'player' || ! data) {
console.log("not player triggered or compendium data empty");
return;
}
// if there are blobs, add those and ignore the parent (it should be one of the blobs?)
if(data.blobs && Object.keys(data.blobs).length > 0) {
console.log(data.blobs);
let orderedBlobs = {};
Object.keys(data.blobs).forEach((key) => {
blob = data.blobs[key];
if(! blob.Category) {
if(data.Category == "QSR Tool Cards") {
blob.Category = trans["qsr_blob_types"][data["data-type"]];
} else if(blob["data-Category"]) {
blob.Category = blob["data-Category"];
} else if(blob["data-category"]) {
blob.Category = blob["data-category"];
} else {
blob.Category = data.Category;
}
}
if(Object.keys(priorities).includes(blob.Category)) {
blob.sort_priority = priorities[blob.Category];
} else {
blob.sort_priority = 99;
}
orderedBlobs[key] = blob;
});
// Custom sort the orderedBlobs so they are processed in the order we want
let blobKeys = Object.keys(orderedBlobs);
blobKeys.sort(function(a, b) {
return orderedBlobs[a].sort_priority - orderedBlobs[b].sort_priority;
});
// Now process the blobs
blobKeys.forEach((key) => {
let blob = orderedBlobs[key];
if(! blob["data-name"]) {
blob["data-name"] = key;
}
if(dropType == 'canvasdrop') {
canvas_import(blob);
} else {
compendium_import(blob);
}
});
} else {
if(dropType == 'canvasdrop') {
canvas_import(data);
return;
} else {
compendium_import(data);
}
}
});
var canvas_import = function(data) {
// process the dropped data
switch(data.Category) {
case 'NPCs':
case 'Contacts':
case 'Grunts':
case 'Critters':
case 'Drone':
case 'Drones':
case 'Vehicles':
case 'Spirits':
case 'Hosts':
case 'Sprites':
console.log(data.Category + " dropped on canvas.");
canvasDroppedNPC(data);
break;
default:
console.log("Unknown Canvas Drop: "+data.Category+" Sending it to the compendium drop handler.");
compendium_import(data);
break;
}
console.log("done canvas_import");
};
var compendium_import = function(data) {
// process the dropped data
console.log("compendium item dropped: "+data.Category);
console.log(data);
switch(data.Category) {
case 'NPCs':
compendiumAddContact(data);
break;
case 'Drone':
case 'Drones':
case 'Vehicle':
case 'Vehicles':
compendiumAddDrone(data);
break;
/* sheet drop items below */
case 'Combat':
case 'Detection':
case 'Health':
case 'Illusion':
case 'Manipulation':
case 'Spells':
compendiumAddSpell(data);
break;
case 'Rituals':
compendiumAddRitual(data);
break;
case 'Powers':
compendiumAddPower(data);
break;
case 'Critter Powers':
compendiumAddCritterPower(data);
break;
case 'Metamagic':
compendiumAddMetamagic(data);
break;
case 'Qualities':
compendiumAddQuality(data);
break;
case 'gear-armor':
case 'Armor':
compendiumAddArmor(data);
break;
case 'gear-misc':
case 'Gear':
if(data["data-gear_type"] == "Ammunition" && (data["data-gear_subtype"] == "Grenades" || data["data-gear_subtype"] == "Rockets")) {
compendiumAddGrenade(data);
} else {
compendiumAddGear(data);
}
break;
case 'Ranged':
case 'weapon-ranged':
compendiumAddWeapon('range', data);
break;
case 'Melee':
case 'weapon-melee':
compendiumAddWeapon('melee', data);
break;
case 'Weapon Both':
compendiumAddWeapon('range', data);
compendiumAddWeapon('melee', data);
break;
case 'Devices':
compendiumAddDevice(data);
break;
case 'Programs':
compendiumAddProgram(data);
break;
case 'Complex Forms':
compendiumAddComplexForm(data);
break;
case 'ICs':
compendiumAddIC(data);
break;
case 'Sprite Powers':
compendiumAddSpritePower(data);
break;
case 'Augmentations':
compendiumAddAugmentation(data);
break;
default:
console.log("Unknown Compendium Drop: "+data.Category);
break;
}
}
var canvasDroppedNPC = function(data) {
console.log("processing canvasDroppedNPC");
var tokenAttrs = {
showname: 1,
width: data["data-token_width"] || 70,
height: data["data-token_height"] || 70
};
// default condition monitors for physical and matrix
let physical = 0, matrix = 0;
console.log("Category: "+data.Category);
switch(data.Category) {
case 'Spirits':
setAttrs({
sheet_type: 'spirit',
spirit_type: data["data-spirit_type"] || '',
});
// tokenAttrs.bar1_value = physical || 0;
// tokenAttrs.bar1_max = physical || 0;
tokenAttrs.bar1_link = 'physical';
tokenAttrs.bar3_value = 0;
tokenAttrs.bar3_max = 7;
break;
case 'Vehicle':
case 'Vehicles':
case 'Drone':
case 'Drones':
if(typeof data["data-physical"] !== 'undefined') {
physical = data["data-physical"];
} else if(typeof data["data-body_base"] !== 'undefined') {
physical = 8 + Math.ceil(data["data-body_base"] / 2);
}
console.log("Physical: "+physical);
if(typeof data["data-matrix"] !== 'undefined') {
matrix = data["data-matrix"];
} else if(typeof data["data-sensor_base"] !== 'undefined') {
matrix = 8 + Math.ceil(data["data-sensor_base"] / 2);
}
console.log("Matrix: "+matrix);
if(! data["data-physical"]) {
data["data-physical"] = physical;
}
if(! data["data-matrix"]) {
data["data-matrix"] = matrix;
}
canvasAddDrone(data);
tokenAttrs.bar1_value = physical;
tokenAttrs.bar1_max = physical;
tokenAttrs.bar2_value = matrix;
tokenAttrs.bar2_max = matrix;
tokenAttrs.bar3_value = 0;
tokenAttrs.bar3_max = data["data-speed_max"] || 0;
break;
case 'NPCs':
canvasAddNPC(data);
if(typeof data["data-physical"] !== 'undefined') {
physical = data["data-physical"];
} else if(typeof data["data-body_base"] !== 'undefined') {
physical = 8 + Math.ceil(data["data-body_base"] / 2);
}
if(typeof data["data-matrix"]) {
matrix = data["data-matrix"];
} else if(typeof data["data-device_rating"]) {
matrix = 8 + Math.ceil(data["data-device_rating"]);
}
tokenAttrs.bar1_value = physical;
tokenAttrs.bar1_max = physical;
tokenAttrs.bar2_value = matrix;
tokenAttrs.bar2_max = matrix;
tokenAttrs.bar3_value = data["data-edge"] || 0;
tokenAttrs.bar3_max = 7;
break;
case 'Sprites':
setAttrs({
sheet_type: 'sprite',
sprite_type: data["data-sprite_type"] || '',
tasks: 1,
matrix: 9,
matrix_max: 9,
});
tokenAttrs.bar1_link = 'sheetattr_matrix';
tokenAttrs.bar2_link = 'sheetattr_tasks';
break;
default:
break;
}
setup_token(tokenAttrs);
};
var setup_token = (tokenAttrs) => {
// setDefaultToken({
// bar1_value: tokenAttrs.bar1_value,
// bar1_max: tokenAttrs.bar1_value_max,
// bar1_link: "physical";
// bar2_value: tokenAttrs.bar2_value,
// bar2_max: tokenAttrs.bar2_value_max,
// bar2_link: "matrix";
// bar3_value: tokenAttrs.bar3_value,
// bar3_max: tokenAttrs.bar3_value_max,
// bar3_link: "speed";
// showname: tokenAttrs.showname,
// width: tokenAttrs.width,
// height: tokenAttrs.height
// });
console.log("setting token attrs");
console.log(tokenAttrs);
setDefaultToken(tokenAttrs);
};
/**************************************
* CANVAS IMPORTERS *
**************************************/
var canvasAddNPC = function(data) {
addattrs = {};
var type = 'vehicle';
addattrs.sheet_type = 'grunt';
addattrs["flag"] = false;
addattrs["stats_toggle"] = false;
// attributes that need no translation
["body_base", "agility_base", "reaction_base", "strength_base", "willpower_base", "logic_base", "intuition_base", "charisma_base", "edge", "magic", "resonance", "initiative_base", "defense_rating", "physical", "stun", "metatype", "pr", "move_speed", "sprint_speed", "sprint_modifier", "matrix_initiative_base", "cold_sim_initiative_base", "hot_sim_initiative_base", "pain_tolerance", "submersion", "initiate", "major_actions", "minor_actions", "alternate_movement"].forEach((attr) => {
if(data[`data-${attr}`]) {
addattrs[attr] = data[`data-${attr}`];
} else {
addattrs[attr] = '';
}
});
addattrs.physical_max = addattrs['physical'];
// Need to convert initiative dice to initiative dice and initiative dice mod
["initiative_dice", "matrix_initiative_dice", "cold_sim_initiative_dice", "hot_sim_initiative_dice"].forEach((die) => {
let dice_base = 1;
switch(die) {
case 'initiative_dice':
case 'matrix_initiative_dice':
dice_base = 1;
break;
case 'cold_sim_initiative_dice':
dice_base = 2;
break;
case 'hot_sim_initiative_dice':
dice_base = 3;
break;
default:
break;
}
let dice_mod = 0;
if(data[`data-${die}`]) {
dice_mod = parseInt(data[`data-${die}`] - dice_base);
}
addattrs[`${die}`] = dice_base;
addattrs[`${die}_mod`] = dice_mod;
});
// attribute mods need to be calculated and applied
["body", "agility", "reaction", "strength", "willpower", "logic", "intuition", "charisma"].forEach((attr) => {
if(data[`data-${attr}_modified`] && data[`data-${attr}_base`]) {
addattrs[`${attr}_modifier`] = parseInt(data[`data-${attr}_modified`] - data[`data-${attr}_base`]);
}
});
// if they have a resonance attribute make them a technomancer
if(data["data-resonance"]) {
addattrs["flag_special"] = "resonance";
}
// if they have a magic attribute make them awakened
// If there's magic compare logic intuition and charisma to figure out which to use for spell_drain_attribute_2
// check if they have sorcery_specialization or sorcery_expertise as "Spellcasting"
if(data["data-magic"]) {
addattrs["flag_special"] = "magic";
let drain_attr = '@{logic}';
let drain_val = addattrs.logic_base;
if(drain_val < addattrs.intuition_base) {
drain_attr = '@{intuition}';
drain_val = addattrs.intuition_base;
}
if(drain_val < addattrs.charisma_base) {
drain_attr = '@{charisma}';
drain_val = addattrs.charisma_base;
}
addattrs.spell_drain_attribute_2 = drain_attr;
if(data[`data-sorcery_rating`]) {
addattrs["spellcasting_expert"] = 0;
addattrs["spellcasting_specialist"] = 0;
if(data[`data-sorcery_expertise`] == 'Spellcasting') {
addattrs["spellcasting_expert"] = 3;
} else if(data[`data-sorcery_specialization`] == 'Spellcasting') {
addattrs["spellcasting_specialist"] = 2;
}
}
}
// Attributes that need translation
let blocks = {
"qualities_text": "quality",
"gear_text": "gear",
"augmentations_text": "augmentations",
"powers_text": "powers",
"weaknesses_text": "weaknesses",
"spells_text": "spells",
"metamagics_text": "metamagic",
"echoes_text": "echos",
"complex_forms_text": "complex_forms",
"essence": "essence_mod"
};
Object.keys(blocks).forEach((key) => {
if(key == "essence") {
addattrs[blocks[key]] = data[`data-${key}`] - 6;
} else {
addattrs[blocks[key]] = data[`data-${key}`] || '';
}
});
// if there are matrix attributes (ASDF) deal with them and turn "has matrix device" on
if(data["data-attack"] || data["data-sleaze"] || data["data-data_process"] || data["data-firewall"] || data["data-device_name"] || data["data-device_rating"]) {
addattrs["flag_matrix"] = "matrix";
addattrs["device_name"] = data["data-device_name"] || "";
addattrs["matrix_device_rating"] = data["data-device_rating"] || "";
addattrs["attack"] = data["data-attack"] || 0;
addattrs["sleaze"] = data["data-sleaze"] || 0;
addattrs["data_processing"] = data["data-data_processing"] || 0;
addattrs["firewall"] = data["data-firewall"] || 0;
// get them a matrix condition monitor
let matrix = 9;
if(data["data-matrix"]) {
matrix = data["data-matrix"];
} else if(data["data-device_rating"]) {
matrix = parseInt(8 + Math.ceil(data["data-device_rating"] / 2));
}
addattrs["matrix"] = matrix;
addattrs["matrix_max"] = matrix;
}
// Knowledges and Languages
if(data["data-knowledges"]) {
let usedIDs = [];
data["data-knowledges"].split(/,\s*/).forEach((knowledge) => {
let row_id = generateRowID();
while(row_id in usedIDs) {
row_id = generateRowID();
}
usedIDs.push(row_id);
addattrs["repeating_knowledge_" + row_id + "_flag"] = false;
addattrs["repeating_knowledge_" + row_id + "_name"] = knowledge;
addattrs["repeating_knowledge_" + row_id + "_type"] = 'Knowledge';
});
}
if(data["data-languages"]) {
let usedIDs = [];
data["data-languages"].split(/,\s*/).forEach((language) => {
let row_id = generateRowID();
while(row_id in usedIDs) {
row_id = generateRowID();
}
usedIDs.push(row_id);
addattrs["repeating_knowledge_" + row_id + "_flag"] = false;
addattrs["repeating_knowledge_" + row_id + "_name"] = language;
addattrs["repeating_knowledge_" + row_id + "_type"] = 'Language';
});
}
// Skills stuff
let usedIDs = [];
["astral", "athletics", "biotech", "close_combat", "con", "conjuring", "cracking", "electronics", "enchanting", "engineering", "exotic_weapons", "firearms", "influence", "outdoors", "perception", "piloting", "sorcery", "stealth", "tasking"].forEach((skill) => {
if(data["data-" + skill + "_rating"]) {
let row_id = generateRowID();
while(row_id in usedIDs) {
row_id = generateRowID();
}
usedIDs.push(row_id);
name = skill.split('_').map(word => ucfirst(word)).join(' ');
addattrs[skill] = data["data-"+skill+"_rating"];
addattrs["repeating_skills_" + row_id + "_rating"] = data["data-" + skill + "_rating"];
addattrs["repeating_skills_" + row_id + "_flag"] = false;
addattrs["repeating_skills_" + row_id + "_name"] = name;
if(data["data-" + skill + "_specialization"]) {
addattrs["repeating_skills_" + row_id + "_specialization"] = data["data-" + skill + "_specialization"];
}
if(data["data-" + skill + "_expertise"]) {
addattrs["repeating_skills_" + row_id + "_expertise"] = data["data-" + skill + "_expertise"];
}
}
});
addattrs["notes"] = '';
let labels = {"contact_uses": "Uses: ", "contact_places_to_meet": "Places To Meet: ", "contact_similar_contacts": "Similar Contacts: "};
["contact_uses", "contact_places_to_meet", "contact_similar_contacts", "description", "notes"].forEach((k) => {
if(typeof data[`data-${k}`] !== 'undefined') {
if(labels[k]) {
addattrs["notes"] += labels[k];
}
addattrs["notes"] += data[`data-${k}`] + "\n";
}
});
console.log("/*********************************************/");
console.log("Addattrs: ");
console.log(addattrs);
setAttrs(addattrs);
};
var canvasAddDrone = function(data) {
addattrs = {};
var type = 'vehicle';
addattrs.sheet_type = 'vehicle';
addattrs["stats_toggle"] = false;
addattrs["handling"] = data["data-handling_onroad"] || 0;
addattrs["handling_offroad"] = data["data-handling_offroad"] || 0;
addattrs["seating"] = data["data-seats"] || 0;
addattrs["acceleration"] = data["data-acceleration"] || 0;
addattrs["interval"] = data["data-speed_base"] || 0;
addattrs["speed_max"] = data["data-speed_max"] || 0;
addattrs["body_base"] = data["data-body_base"] || 0;
addattrs["armor"] = data["data-armor_base"] || 0;
addattrs["pilot"] = data["data-pilot_base"] || 0;
addattrs["sensor"] = data["data-sensor_base"] || 0;
addattrs["device_rating"] = data["data-sensor_base"] || 0;
addattrs["clearsight"] = data["data-clearsight"] || 0;
addattrs["electronicwarfare"] = data["data-electronicwarfare"] || 0;
addattrs["evasion"] = data["data-evasion"] || 0;
addattrs["maneuvering"] = data["data-maneuvering"] || 0;
addattrs["stealth"] = data["data-stealth"] || 0;
addattrs["targeting"] = data["data-targeting"] || 0;
addattrs["physical"] = data["data-physical"] || 0;
addattrs["physical_max"] = data["data-physical"] || 0;
addattrs["matrix"] = data["data-matrix"] || 0;
addattrs["matrix_max"] = data["data-matrix"] || 0;
addattrs["notes"] = data["data-description"] || '';
if(data["data-type"] == 'drone') {
addattrs["flag_drone"] = "drone";
}
setAttrs(addattrs);
};
/**************************************
* COMPENDIUM IMPORTERS *
**************************************/
var compendiumAddDrone = function(data) {
rowattrs = {};
row_id = generateRowID();
var type = 'vehicle';
rowattrs["repeating_" + type + "_" + row_id + "_flag"] = false;
rowattrs["repeating_" + type + "_" + row_id + "_display_flag"] = "on";
rowattrs["repeating_" + type + "_" + row_id + "_name"] = data["data-name"] || 'No Name';
rowattrs["repeating_" + type + "_" + row_id + "_type"] = data["data-drone_type"] || 'Other';
rowattrs["repeating_" + type + "_" + row_id + "_handling_onroad"] = data["data-handling_onroad"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_handling_offroad"] = data["data-handling_offroad"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_seats"] = data["data-seats"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_acceleration_base"] = data["data-acceleration"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_speed_base"] = data["data-speed_base"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_speed_max"] = data["data-speed_max"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_body_base"] = data["data-body_base"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_armor_base"] = data["data-armor_base"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_pilot_base"] = data["data-pilot_base"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_sensor_base"] = data["data-sensor_base"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_clearsight"] = data["data-clearsight"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_electronicwarfare"] = data["data-electronicwarfare"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_evasion"] = data["data-evasion"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_maneuvering"] = data["data-maneuvering"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_stealth"] = data["data-stealth"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_targeting"] = data["data-targeting"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_notes"] = data["data-description"] || '';
rowattrs.sheet_type = 'pc';
setAttrs(rowattrs);
};
var compendiumAddProgram = function(data) {
rowattrs = {};
row_id = generateRowID();
var type = 'programs';
rowattrs["repeating_" + type + "_" + row_id + "_flag"] = false;
rowattrs["repeating_" + type + "_" + row_id + "_display_flag"] = "on";
rowattrs["repeating_" + type + "_" + row_id + "_name"] = data["data-name"] || 'No Name';
rowattrs["repeating_" + type + "_" + row_id + "_notes"] = '';
if(data["data-rules"]) {
var rules = [];
try{
rules = JSON.parse(data["data-rules"]) || false;
} catch(e) {
// wipe out compendium_drop_data until the next time
}
rules.forEach((rule) => {
rowattrs["repeating_" + type + "_" + row_id + "_notes"] += rule.rule;
});
}
rowattrs["repeating_" + type + "_" + row_id + "_notes"] += data["data-description"] || '';
rowattrs["repeating_" + type + "_" + row_id + "_modifications"] = data["data-modifications"] || '';
setAttrs(rowattrs);
};
var compendiumAddDevice = function(data) {
rowattrs = {};
row_id = generateRowID();
var type = 'devices';
rowattrs["repeating_" + type + "_" + row_id + "_matrix_device_rating"] = data["data-device_rating"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_flag"] = false;
rowattrs["repeating_" + type + "_" + row_id + "_display_flag"] = "on";
rowattrs["repeating_" + type + "_" + row_id + "_name"] = data["data-name"] || 'No Name';
rowattrs["repeating_" + type + "_" + row_id + "_type"] = data["data-device_type"] || 'Commlink';
rowattrs["repeating_" + type + "_" + row_id + "_active_program_slots"] = data["data-active_program_slots"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_attack"] = data["data-attack"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_sleaze"] = data["data-sleaze"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_data_processing"] = data["data-data_processing"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_firewall"] = data["data-firewall"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_matrix_initiative_bonus"] = data["data-matrix_initiative_bonus"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_essence_cost"] = data["data-essence_cost"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_modifications"] = data["data-modifications"] || '';
rowattrs["repeating_" + type + "_" + row_id + "_notes"] = data["data-description"] || '';
getAttrs(['sheet_type', 'matrix', 'compendium_drop_category'], (v) => {
// we don't want to do this stuff to the PC sheet it'll mess things up
if(v.compendium_drop_category == 'NPCs' || v.sheet_type == 'grunt') {
if(! data["data-matrix"] && data["data-device_rating"]) {
rowattrs['matrix'] = 8 + Math.ceil(data["data-device_rating"] / 2);
rowattrs['matrix_max'] = rowattrs['matrix'];
} else if(data["data-matrix"]) {
rowattrs['matrix'] = data["data-matrix"];
rowattrs['matrix_max'] = data["data-matrix"];
}
rowattrs['flag_matrix'] = "matrix";
rowattrs['device_name'] = data["data-name"] || 'Matrix Device';
rowattrs['matrix_device_rating'] = data["data-device_rating"] || 1;
rowattrs['attack'] = data["data-attack"] || 0;
rowattrs['sleaze'] = data["data-sleaze"] || 0;
rowattrs['data_processing'] = data["data-data_processing"] || 0;
rowattrs['firewall'] = data["data-firewall"] || 0;
}
setAttrs(rowattrs);
});
};
var compendiumAddGrenade = function(data) {
rowattrs = {};
row_id = generateRowID();
if(data["data-gear_subtype"] == "Grenades") {
rowattrs["repeating_grenade_" + row_id + "_type"] = "@{athletics}+@{agility}";
} else {
rowattrs["repeating_grenade_" + row_id + "_type"] = "@{exotic_weapons}+@{logic}";
}
rowattrs["repeating_grenade_" + row_id + "_flag"] = false;
rowattrs["repeating_grenade_" + row_id + "_display_flag"] = "on";
rowattrs["repeating_grenade_" + row_id + "_name"] = data["data-name"] || 'No Name';
rowattrs["repeating_grenade_" + row_id + "_dicepool"] = 0;
rowattrs["repeating_grenade_" + row_id + "_ground_zero"] = data["data-dvgz"] || '-';
rowattrs["repeating_grenade_" + row_id + "_close"] = data["data-dvclose"] || '-';
rowattrs["repeating_grenade_" + row_id + "_near"] = data["data-dvnear"] || '-';
rowattrs["repeating_grenade_" + row_id + "_blast"] = data["data-blast"] || '-';
setAttrs(rowattrs);
};
var compendiumAddWeapon = function(type = 'range', data) {
rowattrs = {};
row_id = generateRowID();
rowattrs["repeating_" + type + "_" + row_id + "_flag"] = false;
rowattrs["repeating_" + type + "_" + row_id + "_display_flag"] = "on";
rowattrs["repeating_" + type + "_" + row_id + "_name"] = data["data-name"] || 'No Name';
rowattrs["repeating_" + type + "_" + row_id + "_skill"] = trans.Weapons[data["data-skill"]] || '';
rowattrs["repeating_" + type + "_" + row_id + "_dicepool"] = 0;
rowattrs["repeating_" + type + "_" + row_id + "_dicepool_base"] = 0;
rowattrs["repeating_" + type + "_" + row_id + "_damage"] = data["data-dv"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_damage_base"] = data["data-dv"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_close"] = data["data-close"] || '-';
rowattrs["repeating_" + type + "_" + row_id + "_close_base"] = data["data-close"] || '-';
rowattrs["repeating_" + type + "_" + row_id + "_near"] = data["data-near"] || '-';
rowattrs["repeating_" + type + "_" + row_id + "_near_base"] = data["data-near"] || '-';
rowattrs["repeating_" + type + "_" + row_id + "_medium"] = data["data-medium"] || '-';
rowattrs["repeating_" + type + "_" + row_id + "_medium_base"] = data["data-medium"] || '-';
rowattrs["repeating_" + type + "_" + row_id + "_far"] = data["data-far"] || '-';
rowattrs["repeating_" + type + "_" + row_id + "_far_base"] = data["data-far"] || '-';
rowattrs["repeating_" + type + "_" + row_id + "_extreme"] = data["data-extreme"] || '-';
rowattrs["repeating_" + type + "_" + row_id + "_extreme_base"] = data["data-extreme"] || '-';
rowattrs["repeating_" + type + "_" + row_id + "_dicepool_modifier"] = data["data-dicepool_modifier"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_has_mods"] = data["data-has_mods"] || '';
data["data-ammo"] = (data["data-ammo"]) ? data["data-ammo"].match(/^(\d+)/)[0] : '';
rowattrs["repeating_" + type + "_" + row_id + "_ammo"] = data["data-ammo"];
rowattrs["repeating_" + type + "_" + row_id + "_notes"] = (data["data-extras"]) ? data["data-extras"] : '';
rowattrs["repeating_" + type + "_" + row_id + "_notes"] += data["data-description"] || '';
if(type == 'range') {
// firing modes setup
rowattrs["repeating_" + type + "_" + row_id + "_firing_modes"] = data["data-firing_modes"] || 'SS';
var modes = rowattrs["repeating_" + type + "_" + row_id + "_firing_modes"].split(/\s*\/\s*/i);
modes.forEach(mode => {
switch(mode.toUpperCase()) {
case 'SS':
rowattrs["repeating_" + type + "_" + row_id + "_singleshot"] = 1;
break;
case 'SA':
rowattrs["repeating_" + type + "_" + row_id + "_semiauto"] = 1;
break;
case 'BF':
rowattrs["repeating_" + type + "_" + row_id + "_burstfire"] = 1;
break;
case 'BW':
rowattrs["repeating_" + type + "_" + row_id + "_burstwide"] = 1;
break;
case 'FA':
rowattrs["repeating_" + type + "_" + row_id + "_fullauto"] = 1;
break;
};
});
}
setAttrs(rowattrs);
};
var compendiumAddGear = function(data) {
rowattrs = {};
row_id = generateRowID();
var type = 'items';
rowattrs["repeating_" + type + "_" + row_id + "_flag"] = false;
rowattrs["repeating_" + type + "_" + row_id + "_display_flag"] = "on";
rowattrs["repeating_" + type + "_" + row_id + "_name"] = data["data-name"] || 'No Name';
rowattrs["repeating_" + type + "_" + row_id + "_rating"] = data["data-rating"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_quantity"] = data["data-quantity"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_modifications"] = data["data-modifications"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_notes"] = data["data-description"] || '';
setAttrs(rowattrs);
};
var compendiumAddArmor = function(data) {
rowattrs = {};
row_id = generateRowID();
var type = 'armor';
rowattrs["repeating_" + type + "_" + row_id + "_flag"] = false;
rowattrs["repeating_" + type + "_" + row_id + "_display_flag"] = "on";
rowattrs["repeating_" + type + "_" + row_id + "_name"] = data["data-name"] || 'No Name';
rowattrs["repeating_" + type + "_" + row_id + "_rating"] = data["data-rating"] || data["data-defense"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_chem"] = data["data-chem"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_cold"] = data["data-cold"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_elec"] = data["data-elec"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_fire"] = data["data-fire"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_cumulative"] = data["data-cumulative"] || '';
rowattrs["repeating_" + type + "_" + row_id + "_social"] = data["data-social"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_capacity"] = data["data-capacity"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_notes"] = data["data-description"] || '';
setAttrs(rowattrs);
};
var compendiumAddSpell = function(data) {
getAttrs(["magic", "sorcery", "force", "sheet_type"], (v) => {
rowattrs = {};
row_id = generateRowID();
['data-damage', 'data-duration', 'data-effect_type', 'data-range'].forEach((key) => {
if(typeof(data[key]) === 'undefined') {
data[key] = '';
}
});
let spell_type = 'spell';
console.log("Adding Spell: "+data["data-name"]);
if(v.sheet_type != 'pc' && v.magic > 0 && v.sorcery > 0) {
rowattrs["repeating_" + spell_type + "_" + row_id + "_dicepool"] = parseInt(v.magic) + parseInt(v.sorcery);
} else if(v.sheet_type == 'spirit' && (! v.sorcery || v.sorcery == '0')) {
rowattrs["repeating_" + spell_type + "_" + row_id + "_dicepool"] = parseInt(v.magic) + parseInt(v.force);
} else {
rowattrs["repeating_" + spell_type + "_" + row_id + "_dicepool"] = 0;
}
rowattrs["repeating_" + spell_type + "_" + row_id + "_flag"] = false;
rowattrs["repeating_" + spell_type + "_" + row_id + "_name"] = data["data-name"] || 'No Name';
rowattrs["repeating_" + spell_type + "_" + row_id + "_skill"] = '@{sorcery}';
rowattrs["repeating_" + spell_type + "_" + row_id + "_notes"] = data["data-description"] || '';
rowattrs["repeating_" + spell_type + "_" + row_id + "_category"] = ucfirst(data["data-category"]) || '';
rowattrs["repeating_" + spell_type + "_" + row_id + "_damage"] = trans.Spells.damage[data["data-damage"].toUpperCase()] || '';
rowattrs["repeating_" + spell_type + "_" + row_id + "_drain"] = data["data-drain"] || 0;
rowattrs["repeating_" + spell_type + "_" + row_id + "_duration"] = trans.Spells.duration[data["data-duration"].toUpperCase()] || '';
var eftype = '';
if(data["data-effect_type"]) {
eftype = data["data-effect_type"].toUpperCase();
} else if(data["data-typename"]) {
eftype = data["data-typename"];
var reg = /.*\((.*)\).*/;
eftype = eftype.match(reg) || ('', '');
eftype = eftype[1].toUpperCase();
}
rowattrs["repeating_" + spell_type + "_" + row_id + "_effect_type"] = trans.Spells.effect_type[eftype] || '';
rowattrs["repeating_" + spell_type + "_" + row_id + "_range"] = trans.Spells.range[data["data-range"].toUpperCase()] || '';
rowattrs["repeating_" + spell_type + "_" + row_id + "_type"] = ucfirst(data["data-type"]) || '';
rowattrs["repeating_" + spell_type + "_" + row_id + "_notes"] = data["data-notes"] || '';
setAttrs(rowattrs);
});
};
var compendiumAddQuality = function(data) {
rowattrs = {};
row_id = generateRowID();
var rep_type = 'quality';
['data-description', 'data-game_effect'].forEach((key) => {
if(typeof(data[key]) === 'undefined') {
data[key] = '';
}
});
rowattrs["repeating_" + rep_type + "_" + row_id + "_flag"] = false;
rowattrs["repeating_" + rep_type + "_" + row_id + "_display_flag"] = "on";
rowattrs["repeating_" + rep_type + "_" + row_id + "_name"] = data["data-name"] || 'No Name';
rowattrs["repeating_" + rep_type + "_" + row_id + "_type"] = (data["data-positive"] == "TRUE") ? 'P' : 'N';
rowattrs["repeating_" + rep_type + "_" + row_id + "_notes"] = data["data-description"] + data["data-game_effect"];
setAttrs(rowattrs);
};
var compendiumAddMetamagic = function(data) {
rowattrs = {};
row_id = generateRowID();
var rep_type = 'metamagic';
[].forEach((key) => {
if(typeof(data[key]) === 'undefined') {
data[key] = '';
}
});
rowattrs["repeating_" + rep_type + "_" + row_id + "_flag"] = false;
rowattrs["repeating_" + rep_type + "_" + row_id + "_display_flag"] = "on";
rowattrs["repeating_" + rep_type + "_" + row_id + "_name"] = data["data-name"] || 'No Name';
rowattrs["repeating_" + rep_type + "_" + row_id + "_notes"] = data["data-description"];
setAttrs(rowattrs);
};
var compendiumAddRitual = function(data) {
rowattrs = {};
row_id = generateRowID();
var rep_type = 'ritual';
[].forEach((key) => {
if(typeof(data[key]) === 'undefined') {
data[key] = '';
}
});
rowattrs["repeating_" + rep_type + "_" + row_id + "_flag"] = false;
rowattrs["repeating_" + rep_type + "_" + row_id + "_name"] = data["data-name"] || 'No Name';
rowattrs["repeating_" + rep_type + "_" + row_id + "_threshold"] = data["data-threshold"] || 0;
rowattrs["repeating_" + rep_type + "_" + row_id + "_notes"] = data["data-features"] + "\n" + data["data-description"];
setAttrs(rowattrs);
};
var compendiumAddPower = function(data) {
rowattrs = {};
row_id = generateRowID();
var rep_type = 'powers';
[].forEach((key) => {
if(typeof(data[key]) === 'undefined') {
data[key] = '';
}
});
rowattrs["repeating_" + rep_type + "_" + row_id + "_flag"] = false;
rowattrs["repeating_" + rep_type + "_" + row_id + "_display_flag"] = 'on';
rowattrs["repeating_" + rep_type + "_" + row_id + "_name"] = data["data-name"] || 'No Name';
rowattrs["repeating_" + rep_type + "_" + row_id + "_activation"] = trans['Powers']['activation'][data["data-activation"].toUpperCase()] || 'Passive';
rowattrs["repeating_" + rep_type + "_" + row_id + "_notes"] = data["data-description"];
rowattrs["repeating_" + rep_type + "_" + row_id + "_modifications"] = data["data-modifications"] || '';
setAttrs(rowattrs);
};
var compendiumAddCritterPower = function(data) {
console.log("Critter Power Drop");
getAttrs(['sheet_type', 'powers'], (v) => {
if(v.sheet_type == 'grunt') {
let powers = v.powers;
let re = /\((.*?)\)/gi;
let parens = powers.match(re);
powers.replace(re, parens);
powers = v.powers.split(/,\s*/);
let powerName = data["data-name"];
v.powers = [v.powers, powerName].join(', ');
setAttrs({
powers: v.powers
}, {silent: true});
} else if(v.sheet_type == 'spirit') {
rowattrs = {};
row_id = generateRowID();
var rep_type = 'powers';
rowattrs["repeating_" + rep_type + "_" + row_id + "_flag"] = false;
rowattrs["repeating_" + rep_type + "_" + row_id + "_display_flag"] = 'on';
rowattrs["repeating_" + rep_type + "_" + row_id + "_name"] = data["data-name"] || 'No Name';
rowattrs["repeating_" + rep_type + "_" + row_id + "_notes"] = data["data-description"];
setAttrs(rowattrs);
}
});
};
var compendiumAddComplexForm = function(data) {
rowattrs = {};
row_id = generateRowID();
var rep_type = 'forms';
['data-duration'].forEach((key) => {
if(typeof(data[key]) === 'undefined') {
data[key] = '';
}
});
let skill_keys = {
'Electronics': '@{electronics}',
'Cracking': '@{cracking}',
'Tasking': '@{tasking}'
};
if(data["data-skill"] && skill_keys[data["data-skill"]]) {
rowattrs["repeating_" + rep_type + "_" + row_id + "_skill"] = skill_keys[data["data-skill"]];
} else {
rowattrs["repeating_" + rep_type + "_" + row_id + "_skill"] = '';
}
rowattrs["repeating_" + rep_type + "_" + row_id + "_flag"] = false;
rowattrs["repeating_" + rep_type + "_" + row_id + "_display_flag"] = 'on';
rowattrs["repeating_" + rep_type + "_" + row_id + "_name"] = data["data-name"] || 'No Name';
rowattrs["repeating_" + rep_type + "_" + row_id + "_fade"] = data["data-fade"];
rowattrs["repeating_" + rep_type + "_" + row_id + "_duration"] = ucfirst(data["data-duration"]);
rowattrs["repeating_" + rep_type + "_" + row_id + "_notes"] = data["data-description"];
setAttrs(rowattrs);
};
var compendiumAddIC = function(data) {
rowattrs = {};
row_id = generateRowID();
var rep_type = 'IC';
[].forEach((key) => {
if(typeof(data[key]) === 'undefined') {
data[key] = '';
}
});
getAttrs(['sheet_type', 'host_rating', 'data_processing'], (v) => {
rowattrs["repeating_" + rep_type + "_" + row_id + "_flag"] = false;
rowattrs["repeating_" + rep_type + "_" + row_id + "_display_flag"] = 'on';
rowattrs["repeating_" + rep_type + "_" + row_id + "_powered_on_IC"] = 'off';
rowattrs["repeating_" + rep_type + "_" + row_id + "_name"] = data["data-name"] || 'No Name';
rowattrs["repeating_" + rep_type + "_" + row_id + "_dice"] = v.host_rating * 2;
rowattrs["repeating_" + rep_type + "_" + row_id + "_ar"] = v.host_rating * 2;
rowattrs["repeating_" + rep_type + "_" + row_id + "_cm"] = v.host_rating * 2;
rowattrs["repeating_" + rep_type + "_" + row_id + "_init"] = v.data_processing * 2;
rowattrs["repeating_" + rep_type + "_" + row_id + "_attribute"] = data["data-defense_attribute_1"];
rowattrs["repeating_" + rep_type + "_" + row_id + "_matrix"] = data["data-defense_attribute_2"];
rowattrs["repeating_" + rep_type + "_" + row_id + "_notes"] = data["data-description"];
setAttrs(rowattrs);
});
};
var compendiumAddSpritePower = function(data) {
rowattrs = {};
row_id = generateRowID();
var rep_type = 'powers';
[].forEach((key) => {
if(typeof(data[key]) === 'undefined') {
data[key] = '';
}
});
rowattrs["repeating_" + rep_type + "_" + row_id + "_flag"] = false;
rowattrs["repeating_" + rep_type + "_" + row_id + "_name"] = data["data-name"] || 'No Name';
rowattrs["repeating_" + rep_type + "_" + row_id + "_notes"] = data["data-description"];
setAttrs(rowattrs);
};
var compendiumAddContact = function(data) {
rowattrs = {};
row_id = generateRowID();
var rep_type = 'contacts';
["data-loyalty", "data-influence", "data-favors"].forEach((key) => {
if(typeof(data[key]) === 'undefined') {
data[key] = '';
}
});
rowattrs["repeating_" + rep_type + "_" + row_id + "_flag"] = false;
if(! data["data-loyalty"] || ! data["data-influence"]) {
rowattrs["repeating_" + rep_type + "_" + row_id + "_flag"] = "on";
}
rowattrs["repeating_" + rep_type + "_" + row_id + "_display_flag"] = "on";
rowattrs["repeating_" + rep_type + "_" + row_id + "_name"] = data["data-name"] || 'No Name';
rowattrs["repeating_" + rep_type + "_" + row_id + "_loyalty"] = data["data-loyalty"];
rowattrs["repeating_" + rep_type + "_" + row_id + "_influence"] = data["data-connections"];
rowattrs["repeating_" + rep_type + "_" + row_id + "_favors"] = data["data-favors"];
let labels = {"contact_uses": "Uses: ", "contact_places_to_meet": "Places To Meet: ", "contact_similar_contacts": "Similar Contacts: "};
rowattrs["repeating_" + rep_type + "_" + row_id + "_notes"] = '';
["contact_uses", "contact_places_to_meet", "contact_similar_contacts", "description", "notes"].forEach((k) => {
if(typeof data[`data-${k}`] !== 'undefined') {
if(labels[k]) {
rowattrs["repeating_" + rep_type + "_" + row_id + "_notes"] += labels[k];
}
rowattrs["repeating_" + rep_type + "_" + row_id + "_notes"] += data[`data-${k}`] + "\n";
}
});
setAttrs(rowattrs);
};
var compendiumAddAugmentation = function(data) {
rowattrs = {};
row_id = generateRowID();
var type = 'augmentations';
rowattrs["repeating_" + type + "_" + row_id + "_flag"] = false;
rowattrs["repeating_" + type + "_" + row_id + "_display_flag"] = "on";
rowattrs["repeating_" + type + "_" + row_id + "_name"] = data["data-name"] || 'No Name';
if(data["data-has_rating"] == 'true') {
rowattrs["repeating_" + type + "_" + row_id + "_rating"] = data["data-rating"] || 0;
} else {
rowattrs["repeating_" + type + "_" + row_id + "_rating"] = '';
}
rowattrs["repeating_" + type + "_" + row_id + "_essence_cost"] = parseFloat(data["data-essence_cost"]) || 0.0;
rowattrs["repeating_" + type + "_" + row_id + "_essence_base"] = data["data-essence_cost"] || 0;
rowattrs["repeating_" + type + "_" + row_id + "_capacity"] = data["data-capacity_cost"] || '';
rowattrs["repeating_" + type + "_" + row_id + "_modifications"] = data["data-modifications"] || '';
rowattrs["repeating_" + type + "_" + row_id + "_notes"] = data["data-description"] || '';
setAttrs(rowattrs);
};
const trans = {
'Spells': {
'range': {
'T': 'T',
'TOUCH': 'T',
'LOS': 'LOS',
'LOS(A)': 'LOS(A)'
},
'duration': {
'INSTANTANEOUS': 'Instant',
'I': 'Instant',
'SUSTAINED': 'Sustained',
'S': 'Sustained',
'LIMITED': 'Limited',
'L': 'Limited',
'PERMANENT': 'Permanent',
'P': 'Permanent',
},
'damage': {
'STUN': 'Stun',
'PHYSICAL': 'Physical',
'PHYSICAL_SPECIAL': 'Physical, Special',
'PHYSICAL, SPECIAL': 'Physical, Special',
},
'effect_type': {
'DIRECT COMBAT': 'Direct Combat',
'DIRECT COMBAT, AREA': 'Direct Combat, Area',
'INDIRECT COMBAT': 'Indirect Combat',
'INDIRECT COMBAT, AREA': 'Indirect Combat, Area',
'SENSE_SINGLE': 'Single-Sense',
'SENSE_MULTI': 'Multi-Sense'
}
},
'Powers': {
'activation': {
'MINOR ACTION': 'Minor',
'MAJOR ACTION': 'Major',
'PASSIVE': 'Passive'
}
},
'qsr_blob_types': {
'weapon-ranged': 'Ranged',
'weapon-melee': 'Melee',
'weapon-both': 'Weapon Both',
'spell': 'Spells',
'gear-misc': 'Gear',
'gear-armor': 'Armor',
'gear-commlink': 'Devices',
'gear-cyberdeck': 'Devices',
'program': 'Programs',
'drone': 'Vehicles',
'npc': 'NPC'
},
"Weapons": {
'athletics': 'Athletics',
'Athletics': 'Athletics',
'close_combat': 'Close Combat',
'Close Combat': 'Close Combat',
'exotic_weapons': 'Exotic Weapons',
'Exotic Weapons': 'Exotic Weapons',
'engineering': 'Engineering',
'Engineering': 'Engineering',
'firearms': 'Firearms',
'Firearms': 'Firearms',
'unarmed': 'Unarmed',
'Unarmed': 'Unarmed',
},
};
/********************/
/* GENESIS IMPORTER */
/********************/
on("clicked:import", (eventInfo) => {
let setText = {};
let applyEnabled = true;
getAttrs(['import_data'], (v) => {
// Verify the user entered a JSON in the textarea. If not, provide user feedabck.
let parsedData = '';
if (v.import_data) {
setText[`import-feedback`] = "";
// Try to parse the JSON
try{
parsedData = JSON.parse(v.import_data) || false;
} catch(e) {
setText[`import-feedback`] += `JSON Parse Error: ` + e + "\n";
}
// There is a value in the textarea! Check to see if its a valid JSON. Provide users feeadback
if (parsedData) {
setText[`import-feedback`] += `Valid JSON was imported.` + "\n";
} else {
setText[`import-feedback`] += `The text imported is not valid JSON. Verify the JSON is formatted correctly. Check the format at, JSONLint.com.` + "\n";
applyEnabled = false
};
} else {
setText[`import-feedback`] = `Nothing entered in the JSON text area.` + "\n";
applyEnabled = false
};
let import_feedback = '';
if(applyEnabled) {
let success = doImport(parsedData);
if(success) {
import_feedback = 'Import successful. ' + "\n";
} else {
import_feedback = 'Import failed. ' + "\n";
import_feedback += setText[`import-feedback`];
}
} else {
import_feedback = 'Import failed. ' + "\n";
import_feedback += setText[`import-feedback`];
}
setAttrs({
import_feedback: import_feedback
});
});
});
// clear the import_feedback when they change the contents of import_data
on("change:import_data", (eventInfo) => {
setAttrs({
import_feedback: " "
});
});
var doImport = (json) => {
setAttrs({
import_feedback: ' '
});
// wipe the current character
clean();
console.log("Doing character import");
// Mappings [Genesis attr]: [Roll20 attr]
// top level data
var base = {
name: "birth_name",
metaType: "metatype",
age: "age",
freeKarma: "karma",
gender: "sex",
karma: "total_karma",
notes: "notes",
nuyen: "nuyen",
streetName: "character_name",
weight: "weight",
size: "height",
initiation: "initiate_grade",
submersion: "submersion_level",
notes: "player_notes",
heat: "heat",
reputation: "reputation",
};
var attributes = {
BODY: "body_base",
AGILITY: "agility_base",
REACTION: "reaction_base",
STRENGTH: "strength_base",
WILLPOWER: "willpower_base",
LOGIC: "logic_base",
INTUITION: "intuition_base",
CHARISMA: "charisma_base",
EDGE: "edge",
MAGIC: "magic_base",
RESONANCE: "resonance_base",
POWER_POINTS: "power_points"
};
var attrs = {};
attrs.flag_special = 'mundane';
Object.keys(base).forEach(key => {
if(json[key]) {
attrs[base[`${key}`]] = json[`${key}`];
}
});
attrs.player_notes = 'Character imported on ' + new Date().toJSON() + "\n" + attrs.player_notes + "\n";
console.log("Character base imported.");
json.attributes.forEach(attribute => {
if(attribute.id && attribute.modifiedValue) {
attrs[attributes[attribute.id]] = attribute.modifiedValue;
// change character type (flag_special) for technomancers and awakened
if(attribute.id == "MAGIC" && attribute.modifiedValue > 0) {
attrs.flag_special = 'magic';
} else if (attribute.id == "RESONANCE" && attribute.modifiedValue > 0) {
attrs.flag_special = 'resonance';
}
// update edge hexes too
if(attribute.id == "EDGE") {
attrs.edge_hex = attribute.modifiedValue;
}
}
});
console.log("Character attributes imported.");
// Set the non-repeating attributes now
setAttrs(attrs);
// Process qualities
let usedIDs = [];
json.qualities.forEach(quality => {
rowattrs = {};
row_id = generateRowID();
while(row_id.toLowerCase() in usedIDs) {
row_id = generateRowID();
}
usedIDs.push(row_id.toLowerCase());
if(quality.choice) {
rowattrs["repeating_quality_" + row_id + "_name"] = quality.name + " (" + quality.choice + ")";
} else {
rowattrs["repeating_quality_" + row_id + "_name"] = quality.name;
}
rowattrs["repeating_quality_" + row_id + "_type"] = quality.positive ? "P" : "N";
rowattrs["repeating_quality_" + row_id + "_notes"] = quality.page + "\n" + quality.description;
rowattrs["repeating_quality_" + row_id + "_rating"] = quality.rating || '';
rowattrs["repeating_quality_" + row_id + "_flag"] = 'display';
setAttrs(rowattrs);
});
console.log("Character qualities imported.");
// Process skills, knowledges and languages
usedIDs = [];
json.skills.forEach(skill => {
rowattrs = {};
row_id = generateRowID();
while(row_id.toLowerCase() in usedIDs) {
row_id = generateRowID();
}
usedIDs.push(row_id.toLowerCase());
var skill_parts = [];
skill.id.split('_').map((part) => {
skill_parts.push(ucfirst(part));
});
var skill_name = skill_parts.join(' ');
if(skill.id != "knowledge" && skill.id != "language") {
rowattrs["repeating_skills_" + row_id + "_display_name"] = skill.name;
rowattrs["repeating_skills_" + row_id + "_name"] = skill_name;
rowattrs["repeating_skills_" + row_id + "_display_attribute"] = skill.attribute;
rowattrs["repeating_skills_" + row_id + "_attribute"] = skill.attribute;
rowattrs["repeating_skills_" + row_id + "_rating"] = skill.rating;
rowattrs["repeating_skills_" + row_id + "_dicepool"] = skill.rating;
rowattrs["repeating_skills_" + row_id + "_display_rating"] = skill.rating;
rowattrs["repeating_skills_" + row_id + "_flag"] = 'display';
rowattrs[skill.name] = skill.rating;
rowattrs[skill.id.charAt(0).toUpperCase() + skill.id.slice(1)] = skill.rating;
if(skill.specializations) {
skill.specializations.forEach(spec => {
if(spec.expertise) {
rowattrs["repeating_skills_" + row_id + "_expert"] = spec.name;
rowattrs["repeating_skills_" + row_id + "_display_expert"] = spec.name;
} else {
rowattrs["repeating_skills_" + row_id + "_spec"] = spec.name;
rowattrs["repeating_skills_" + row_id + "_display_spec"] = spec.name;
}
});
}
if(skill.influencedBy) {
rowattrs["repeating_skills_" + row_id + "_notes"] = skill.influencedBy.join(", ") + "\n" + skill.description;
}
} else {
rowattrs["repeating_knowledges_" + row_id + "_name"] = skill.name;
rowattrs["repeating_knowledges_" + row_id + "_type"] = skill.id.charAt(0).toUpperCase() + skill.id.slice(1);
rowattrs["repeating_knowledges_" + row_id + "_flag"] = 'display';
if(skill.influencedBy) {
rowattrs["repeating_knowledges_" + row_id + "_notes"] = skill.influencedBy.join(", ") + "\n" + skill.description;
}
}
setAttrs(rowattrs);
});
console.log("Character skills, knowledges and languages imported.");
// Process armor
usedIDs = [];
json.armors.forEach(armor => {
rowattrs = {};
row_id = generateRowID();
while(row_id.toLowerCase() in usedIDs) {
row_id = generateRowID();
}
usedIDs.push(row_id.toLowerCase());
rowattrs["repeating_armor_" + row_id + "_name"] = armor.name;
rowattrs["repeating_armor_" + row_id + "_rating"] = armor.rating;
rowattrs["repeating_armor_" + row_id + "_social"] = (armor.socialrating) ? armor.socialrating : 0;
rowattrs["repeating_armor_" + row_id + "_notes"] = armor.page + "\n" + armor.description;
rowattrs["repeating_armor_" + row_id + "_flag"] = 'display';
if(! armor.isIgnored && ! armor.primary) {
rowattrs["repeating_armor_" + row_id + "_cumulative"] = 'cumulative';
} else if(armor.primary) {
rowattrs["repeating_armor_" + row_id + "_primary"] = 'primary';
}
if(armor.accessories) {
armor.accessories.forEach(acc => {
rowattrs["repeating_armor_" + row_id + "_notes"] += ", " + acc.name;
if(acc.name.includes(" Protection", -11)) {
var resist = acc.name.slice(0, 4);
resist = resist.toLowerCase();
rowattrs["repeating_armor_" + row_id + "_" + resist] = acc.rating || 1;
} else if(acc.name.includes(" Resistance", -11)) {
var resist = acc.name.slice(0, 4);
resist = resist.toLowerCase();
rowattrs["repeating_armor_" + row_id + "_" + resist] = acc.rating || 1;
}
});
}
setAttrs(rowattrs);
});
console.log("Character armor imported");
// Process items
usedIDs = [];
console.log("Processing items...");
json.items.forEach(item => {
rowattrs = {};
row_id = generateRowID();
while(row_id.toLowerCase() in usedIDs) {
row_id = generateRowID();
}
usedIDs.push(row_id.toLowerCase());
rowattrs["repeating_items_" + row_id + "_name"] = item.name;
rowattrs["repeating_items_" + row_id + "_rating"] = item.rating;
rowattrs["repeating_items_" + row_id + "_quantity"] = item.count;
rowattrs["repeating_items_" + row_id + "_flag"] = 'display';
rowattrs["repeating_items_" + row_id + "_notes"] = '[' + item.type + ']{' + item.subType + '} ' + item.page + "\n" + item.description + "\n";
rowattrs["repeating_items_" + row_id + "_type"] = item.type;
rowattrs["repeating_items_" + row_id + "_sub_type"] = item.subType;
if(item.accessories) {
item.accessories.forEach(acc => {
rowattrs["repeating_items_" + row_id + "_notes"] += ", " + acc.name;
});
}
setAttrs(rowattrs);
});
console.log("Character items imported");
// Process augmentations
var aug_grades = {
'STANDARD': 'Standard',
'ALPHA': 'Alphaware',
'BETA': 'Betaware',
'DELTA': 'Deltaware',
'USED': 'Used'
};
usedIDs = [];
json.augmentations.forEach(augmentation => {
rowattrs = {};
row_id = generateRowID();
while(row_id.toLowerCase() in usedIDs) {
row_id = generateRowID();
}
usedIDs.push(row_id.toLowerCase());
if(augmentation.level == '-') {
augmentation.level = '';
}
// some augs have the rating in the name...
if(augmentation.name.includes("Rating")) {
const re = /^(.*), Rating (\d+)/i;
var m = augmentation.name.match(re);
if(m && m[1]) {
augmentation.name = m[1];
}
if(m && m[2] && ! augmentation.level) {
augmentation.level = parseInt(m[2]);
}
}
rowattrs["repeating_augmentations_" + row_id + "_name"] = augmentation.name;
rowattrs["repeating_augmentations_" + row_id + "_rating"] = augmentation.level;
rowattrs["repeating_augmentations_" + row_id + "_grade"] = aug_grades[augmentation.quality];
rowattrs["repeating_augmentations_" + row_id + "_essence_cost"] = augmentation.essence;
rowattrs["repeating_augmentations_" + row_id + "_essence_base"] = augmentation.essence;
rowattrs["repeating_augmentations_" + row_id + "_essence_cost_raw"] = 1;
rowattrs["repeating_augmentations_" + row_id + "_flag"] = 'display';
rowattrs["repeating_augmentations_" + row_id + "_notes"] = augmentation.page + "\n" + augmentation.description + "\n";
if(augmentation.accessories) {
augmentation.accessories.forEach(acc => {
rowattrs["repeating_augmentations_" + row_id + "_notes"] += ", " + acc.name;
});
}
setAttrs(rowattrs);
});
console.log("Character augmentations imported");
// Process vehicles and drones
veh_types = {
'VEHICLES': {
'BIKES': 'Bikes',
'ATVS': 'ATV',
'CARS': 'Car',
'TRUCKS': 'Truck',
'VANS': 'Van',
'BUS': 'Bus',
'TRACKED': 'Tracked',
'HOVERCRAFT': 'Hovercraft',
'PWC': 'PWC',
'BOATS': 'Boat',
'SHIPS': 'Ship',
'SUBMARINES': 'Submarine',
'FIXED_WING': 'Fixed Wing Aircraft',
'ROTORCRAFT': 'Rotorcraft',
'VTOL': 'VTOL/VSTOL',
'LTAV': 'LTAV',
'LAV': 'LAV',
'GRAV': 'Gravity',
'MOD_TRAILER': 'Trailer',
'OTHER': 'Other'
},
'DRONES': {
'DRONE_LARGE': 'Large Drone',
'DRONE_MEDIUM': 'Medium Drone',
'DRONE_SMALL': 'Small Drone',
'DRONE_MINI': 'Minidrone',
'DRONE_MICRO': 'Microdrone',
}
};
usedIDs = [];
json.vehicles.concat(json.drones).forEach(vehicle => {
rowattrs = {};
row_id = generateRowID();
while(row_id.toLowerCase() in usedIDs) {
row_id = generateRowID();
}
usedIDs.push(row_id.toLowerCase());
if(vehicle.type && vehicle.type == 'VEHICLES') {
rowattrs["repeating_vehicle_" + row_id + "_type"] = veh_types.VEHICLES[vehicle.subtype] || 'Other';
rowattrs["repeating_vehicle_" + row_id + "_subtype"] = vehicle.subtype || ' ';
} else {
rowattrs["repeating_vehicle_" + row_id + "_type"] = veh_types.DRONES[vehicle.type] || 'Drone';
rowattrs["repeating_vehicle_" + row_id + "_subtype"] = vehicle.subtype || ' ';
}
rowattrs["repeating_vehicle_" + row_id + "_name"] = vehicle.name;
rowattrs["repeating_vehicle_" + row_id + "_handling_onroad"] = vehicle.handlOn;
rowattrs["repeating_vehicle_" + row_id + "_handling_offroad"] = vehicle.handlOff;
rowattrs["repeating_vehicle_" + row_id + "_acceleration_base"] = vehicle.accelOn;
rowattrs["repeating_vehicle_" + row_id + "_speed_base"] = vehicle.speedIntOn;
rowattrs["repeating_vehicle_" + row_id + "_speed_max"] = vehicle.speed;
rowattrs["repeating_vehicle_" + row_id + "_body_base"] = vehicle.body;
rowattrs["repeating_vehicle_" + row_id + "_armor_base"] = vehicle.armor;
rowattrs["repeating_vehicle_" + row_id + "_pilot_base"] = vehicle.pilot;
rowattrs["repeating_vehicle_" + row_id + "_sensor_base"] = vehicle.sensor;
rowattrs["repeating_vehicle_" + row_id + "_seats"] = vehicle.seats || 0;
rowattrs["repeating_vehicle_" + row_id + "_flag"] = 'display';
rowattrs["repeating_vehicle_" + row_id + "_notes"] = vehicle.page + "\n" + vehicle.description + "\n";
if(vehicle.accessories) {
var accs = [];
vehicle.accessories.forEach(acc => {
accs.push(acc.name);
});
rowattrs["repeating_vehicle_" + row_id + "_notes"] += accs.join(', ');
}
setAttrs(rowattrs);
});
console.log("Character vehicles and drones imported");
// Process SINs
var sins = {};
json.sins.forEach(sin => {
sins[sin.name] = sin;
sins[sin.name].lifestyle = '';
sins[sin.name].licenses = '';
});
json.lifestyles.forEach(life => {
if(life.sin) {
sins[life.sin].lifestyle += '(' + life.customName + ', ' + life.name + ', ' + life.paidMonths + ' months)';
}
});
json.licenses.forEach(lic => {
sins[lic.sin].licenses += '(' + lic.name + ') ';
});
usedIDs = [];
Object.keys(sins).forEach(key => {
rowattrs = {};
row_id = generateRowID();
while(row_id.toLowerCase() in usedIDs) {
row_id = generateRowID();
}
usedIDs.push(row_id.toLowerCase());
rowattrs["repeating_lifestyle_" + row_id + "_name"] = sins[key].name;
rowattrs["repeating_lifestyle_" + row_id + "_rating"] = sins[key].quality;
rowattrs["repeating_lifestyle_" + row_id + "_lifestyle"] = sins[key].lifestyle;
rowattrs["repeating_lifestyle_" + row_id + "_licenses"] = sins[key].licenses;
rowattrs["repeating_lifestyle_" + row_id + "_notes"] = sins[key].description || '';
rowattrs["repeating_lifestyle_" + row_id + "_flag"] = 'display';
setAttrs(rowattrs);
});
console.log("Character sins, lifestyles and licenses imported");
// Process contacts
usedIDs = [];
json.contacts.forEach(contact => {
rowattrs = {};
row_id = generateRowID();
while(row_id.toLowerCase() in usedIDs) {
row_id = generateRowID();
}
usedIDs.push(row_id.toLowerCase());
rowattrs["repeating_contacts_" + row_id + "_favors"] = '0';
if(contact.name && contact.name.includes("FP")) {
const re = /\s*\((\d+)\s*FP\)/i;
var m = contact.name.match(re);
rowattrs["repeating_contacts_" + row_id + "_favors"] = m[1] || '';
contact.name = contact.name.replace(re, '');
}
rowattrs["repeating_contacts_" + row_id + "_name"] = contact.name || 'Anonymous ' + contact.type;
rowattrs["repeating_contacts_" + row_id + "_loyalty"] = contact.loyalty || 0;
rowattrs["repeating_contacts_" + row_id + "_influence"] = contact.influence || 0;
rowattrs["repeating_contacts_" + row_id + "_notes"] = contact.type + "\n" + contact.description;
rowattrs["repeating_contacts_" + row_id + "_flag"] = 'display';
setAttrs(rowattrs);
});
console.log("Character contacts imported");
// Process ranged weapons
var weapon_skills = {
'firearms': 'Firearms',
'exotic_weapons': 'Exotic Weapons',
'athletics': 'Athletics',
'close_combat': 'Close Combat',
'engineering': 'Engineering'
};
usedIDs = [];
json.longRangeWeapons.forEach(range => {
rowattrs = {};
row_id = generateRowID();
while(row_id.toLowerCase() in usedIDs) {
row_id = generateRowID();
}
usedIDs.push(row_id.toLowerCase());
rowattrs["repeating_range_" + row_id + "_name"] = range.name;
rowattrs["repeating_range_" + row_id + "_pool"] = range.pool;
rowattrs["repeating_range_" + row_id + "_dicepool_base"] = range.pool;
rowattrs["repeating_range_" + row_id + "_damage"] = range.damage;
rowattrs["repeating_range_" + row_id + "_skill"] = weapon_skills[range.skill];
rowattrs["repeating_range_" + row_id + "_type"] = range.type || '';
rowattrs["repeating_range_" + row_id + "_subtype"] = range.subtype || '';
rowattrs["repeating_range_" + row_id + "_flag"] = 'display';
var ARs = range.attackRating.split('/');
rowattrs["repeating_range_" + row_id + "_close"] = ARs[0];
rowattrs["repeating_range_" + row_id + "_near"] = ARs[1];
rowattrs["repeating_range_" + row_id + "_medium"] = ARs[2];
rowattrs["repeating_range_" + row_id + "_far"] = ARs[3];
rowattrs["repeating_range_" + row_id + "_extreme"] = ARs[4];
var re = /(\d+)/;
var m = range.ammunition.match(re);
if(m) {
rowattrs["repeating_range_" + row_id + "_ammo"] = m[1] || 0;
} else {
rowattrs["repeating_range_" + row_id + "_ammo"] = 0;
}
rowattrs["repeating_range_" + row_id + "_firing_modes"] = range.mode;
rowattrs["repeating_range_" + row_id + "_notes"] = range.page + "\n" + range.description + "\n";
if(range.wifi) {
range.wifi.forEach(wifi => {
rowattrs["repeating_range_" + row_id + "_notes"] += "Wireless: " + wifi + "\n";
});
}
var modifier = 0;
if(range.accessories) {
var accessories = [];
range.accessories.forEach(acc => {
accessories.push(acc.name);
if(acc.name.includes('martlink') || acc.name.includes('martgun')) {
modifier = 1;
}
});
rowattrs["repeating_range_" + row_id + "_notes"] += accessories.join(', ');
}
rowattrs["repeating_range_" + row_id + "_dicepool_modifier"] = modifier;
setAttrs(rowattrs);
});
console.log("Character long range weapons imported");
// Process melee weapons
usedIDs = [];
json.closeCombatWeapons.forEach(melee => {
rowattrs = {};
row_id = generateRowID();
while(row_id.toLowerCase() in usedIDs) {
row_id = generateRowID();
}
usedIDs.push(row_id.toLowerCase());
rowattrs["repeating_melee_" + row_id + "_name"] = melee.name;
rowattrs["repeating_melee_" + row_id + "_dicepool"] = melee.pool;
rowattrs["repeating_melee_" + row_id + "_dicepool_base"] = melee.pool;
rowattrs["repeating_melee_" + row_id + "_damage"] = melee.damage;
rowattrs["repeating_melee_" + row_id + "_type"] = melee.type || '';
rowattrs["repeating_melee_" + row_id + "_subtype"] = melee.subtype || '';
rowattrs["repeating_melee_" + row_id + "_skill"] = weapon_skills[melee.skill];
rowattrs["repeating_melee_" + row_id + "_flag"] = 'display';
var ARs = melee.attackRating.split('/');
rowattrs["repeating_melee_" + row_id + "_close"] = ARs[0];
rowattrs["repeating_melee_" + row_id + "_near"] = ARs[1];
rowattrs["repeating_melee_" + row_id + "_medium"] = ARs[2];
rowattrs["repeating_melee_" + row_id + "_far"] = ARs[3];
rowattrs["repeating_melee_" + row_id + "_extreme"] = ARs[4];
rowattrs["repeating_melee_" + row_id + "_notes"] = melee.page + "\n" + melee.description + "\n";
if(melee.wifi) {
melee.wifi.forEach(wifi => {
rowattrs["repeating_melee_" + row_id + "_notes"] += "Wireless: " + wifi + "\n";
});
}
var modifier = 0;
if(melee.accessories) {
var accessories = [];
melee.accessories.forEach(acc => {
accessories.push(acc.name);
});
rowattrs["repeating_melee_" + row_id + "_notes"] += accessories.join(', ');
}
rowattrs["repeating_melee_" + row_id + "_dicepool_modifier"] = modifier;
setAttrs(rowattrs);
});
console.log("Character melee weapons imported");
// Process spells and Preparations
var categories = {
'Combat spells': 'Combat',
'Detection spells': 'Detection',
'Heal spells': 'Health',
'Illusion spells': 'Illusion',
'Manipulation spells': 'Manipulation'
};
var effect_types = {
'Direct Combat': 'Direct Combat',
'Indirect Combat': 'Indirect Combat',
'Direct Combat, Area': 'Direct Combat, Area',
'Indirect Combat, Area': 'Indirect Combat, Area',
'Single-Sense': 'Single-Sense',
'Multi-Sense': 'Multi-Sense'
};
var durations = {
'Instantaneous': 'Instant',
'Sustained': 'Sustained',
'Limited': 'Limited',
'Permanent': 'Permanent'
};
var ranges = {
'Line of sight': 'LOS',
'Line of sight (Area)': 'LOS (A)',
'Special': 'Special',
'Touch': 'T'
};
usedIDs = [];
json.spells.forEach(spell => {
rowattrs = {};
row_id = generateRowID();
while(row_id.toLowerCase() in usedIDs) {
row_id = generateRowID();
}
usedIDs.push(row_id.toLowerCase());
var spell_type = 'spell';
if(spell.isAlchemistic) {
spell_type = 'preparations';
}
rowattrs["repeating_" + spell_type + "_" + row_id + "_name"] = spell.name;
rowattrs["repeating_" + spell_type + "_" + row_id + "_category"] = categories[spell.category];
rowattrs["repeating_" + spell_type + "_" + row_id + "_effect_type"] = '';
rowattrs["repeating_" + spell_type + "_" + row_id + "_type"] = spell.type;
rowattrs["repeating_" + spell_type + "_" + row_id + "_duration"] = durations[spell.duration];
rowattrs["repeating_" + spell_type + "_" + row_id + "_range"] = ranges[spell.range];
rowattrs["repeating_" + spell_type + "_" + row_id + "_drain"] = spell.drain;
rowattrs["repeating_" + spell_type + "_" + row_id + "_skill"] = '@{sorcery}';
if(spell.features) {
var effect_type = '';
var effect_area = '';
spell.features.forEach(fea => {
if(fea == 'area') {
effect_area = 'area';
} else {
effect_type = fea;
}
});
switch(effect_type) {
case 'direct':
effect_type = 'Direct Combat';
break;
case 'indirect':
effect_type = 'Indirect Combat';
break;
case 'sense_single':
effect_type = 'Single-Sense';
break;
case 'sense_multi':
effect_type = 'Multi-Sense';
break;
default:
effect_type = 'None';
break;
}
spell.effect_type = effect_type;
if(effect_area == 'area') {
spell.effect_type = spell.effect_type + ', Area';
}
rowattrs["repeating_" + spell_type + "_" + row_id + "_effect_type"] = spell.effect_type;
}
rowattrs["repeating_" + spell_type + "_" + row_id + "_display_flag"] = 'display';
rowattrs["repeating_" + spell_type + "_" + row_id + "_notes"] = spell.page + "\n" + spell.description + "\n";
if(spell.influencedBy[0]) {
rowattrs["repeating_" + spell_type + "_" + row_id + "_notes"] += "Influenced By: ";
var influences = [];
spell.influencedBy.forEach(inf => {
influences.push(inf);
});
rowattrs["repeating_" + spell_type + "_" + row_id + "_notes"] += influences.join(', ') + "\n";
}
setAttrs(rowattrs);
});
console.log("Character spells and preparations imported");
// Process rituals
usedIDs = [];
json.rituals.forEach(ritual => {
rowattrs = {};
row_id = generateRowID();
while(row_id.toLowerCase() in usedIDs) {
row_id = generateRowID();
}
usedIDs.push(row_id.toLowerCase());
rowattrs["repeating_ritual_" + row_id + "_name"] = ritual.name;
rowattrs["repeating_ritual_" + row_id + "_threshold"] = ritual.threshold;
rowattrs["repeating_ritual_" + row_id + "_flag"] = 'display';
rowattrs["repeating_ritual_" + row_id + "_notes"] = ritual.page + "\n" + ritual.description + "\n";
if(ritual.features[0]) {
rowattrs["repeating_ritual_" + row_id + "_notes"] += "Features: ";
var feats = [];
ritual.features.forEach(inf => {
feats.push(inf);
});
rowattrs["repeating_ritual_" + row_id + "_notes"] += feats.join(', ') + "\n";
}
console.log(rowattrs);
setAttrs(rowattrs);
});
console.log("Character rituals imported");
// Process adept powers
var powerActivations = {
'MAJOR_ACTION': 'Major',
'MINOR_ACTION': 'Minor',
'PASSIVE': 'Passive',
};
usedIDs = [];
json.adeptPowers.forEach(power => {
rowattrs = {};
row_id = generateRowID();
while(row_id.toLowerCase() in usedIDs) {
row_id = generateRowID();
}
usedIDs.push(row_id.toLowerCase());
power.rating = 1;
re = /\s*(\d+)$/;
var m = power.name.match(re);
if(m && m[1]) {
power.rating = m[1];
power.name = power.name.replace(re, '');
}
rowattrs["repeating_powers_" + row_id + "_name"] = power.name;
rowattrs["repeating_powers_" + row_id + "_rating"] = power.level || '';
rowattrs["repeating_powers_" + row_id + "_cost"] = power.cost;
rowattrs["repeating_powers_" + row_id + "_activation"] = powerActivations[power.activation];
rowattrs["repeating_powers_" + row_id + "_display_flag"] = 'display';
rowattrs["repeating_powers_" + row_id + "_notes"] = power.page + "\n" + power.description + "\n";
setAttrs(rowattrs);
});
console.log("Character adept powers imported");
// Process metamagic
usedIDs = [];
if(json.metamagic) {
json.metamagic.forEach(meta => {
rowattrs = {};
row_id = generateRowID();
while(row_id.toLowerCase() in usedIDs) {
row_id = generateRowID();
}
usedIDs.push(row_id.toLowerCase());
rowattrs["repeating_metamagic_" + row_id + "_name"] = meta.name;
rowattrs["repeating_metamagic_" + row_id + "_display_flag"] = 'display';
rowattrs["repeating_metamagic_" + row_id + "_notes"] = meta.page + "\n" + meta.description + "\n";
console.log(rowattrs);
setAttrs(rowattrs);
});
console.log("Character meta magics imported");
}
// Process echoes
usedIDs = [];
if(json.echoes) {
json.echoes.forEach(echo => {
rowattrs = {};
row_id = generateRowID();
while(row_id.toLowerCase() in usedIDs) {
row_id = generateRowID();
}
usedIDs.push(row_id.toLowerCase());
rowattrs["repeating_echoes_" + row_id + "_name"] = echo.name;
rowattrs["repeating_echoes_" + row_id + "_display_flag"] = 'display';
rowattrs["repeating_echoes_" + row_id + "_notes"] = echo.page + "\n" + echo.description + "\n";
setAttrs(rowattrs);
});
console.log("Character echoes imported");
}
// Process complex forms
var cf_durations = {
'Sustained': 'Sustained',
'Immediate': 'Instant',
'Permanent': 'Permanent'
};
usedIDs = [];
if(json.complexForms) {
json.complexForms.forEach(form => {
rowattrs = {};
row_id = generateRowID();
while(row_id.toLowerCase() in usedIDs) {
row_id = generateRowID();
}
usedIDs.push(row_id.toLowerCase());
rowattrs["repeating_forms_" + row_id + "_name"] = form.name;
rowattrs["repeating_forms_" + row_id + "_duration"] = cf_durations[form.duration];
rowattrs["repeating_forms_" + row_id + "_fade"] = form.fading;
rowattrs["repeating_forms_" + row_id + "_display_flag"] = 'display';
rowattrs["repeating_forms_" + row_id + "_notes"] = form.page + "\n" + form.description + "\n";
if(form.influences[0]) {
rowattrs["repeating_forms_" + row_id + "_notes"] += "Influenced By: ";
var influences = [];
form.influences.forEach(inf => {
influences.push(inf);
});
rowattrs["repeating_forms_" + row_id + "_notes"] += influences.join(', ') + "\n";
}
setAttrs(rowattrs);
});
console.log("Character complex forms imported");
}
// Process martial arts
usedIDs = [];
if(json.martialArts) {
json.martialArts.forEach(mart => {
if(mart.techniques[0]) {
mart.techniques.forEach(tech => {
rowattrs = {};
row_id = generateRowID();
while(row_id.toLowerCase() in usedIDs) {
row_id = generateRowID();
}
usedIDs.push(row_id.toLowerCase());
rowattrs["repeating_martial_" + row_id + "_technique"] = tech;
rowattrs["repeating_martial_" + row_id + "_style"] = mart.name;
rowattrs["repeating_martial_" + row_id + "_display_flag"] = 'display';
rowattrs["repeating_martial_" + row_id + "_notes"] = mart.page + "\n" + mart.description + "\n";
setAttrs(rowattrs);
});
}
});
console.log("Character martial arts imported");
}
// Process matrix devices
var programs = {};
var prog_list = [];
var matrix_device_types = {
'COMMLINK': 'Commlink',
'CYBERDECK': 'Cyberdeck',
'CYBER_HEADWARE': 'Cyberjack',
'RIGGER_CONSOLE': 'Command Console',
'CONTROL_RIG': 'Control Rig',
'TAC_NET': 'M-TOC'
}
usedIDs = [];
if(json.matrixItems) {
json.matrixItems.forEach(dev => {
rowattrs = {};
row_id = generateRowID();
while(row_id.toLowerCase() in usedIDs) {
row_id = generateRowID();
}
usedIDs.push(row_id.toLowerCase());
rowattrs["repeating_devices_" + row_id + "_name"] = dev.name;
rowattrs["repeating_devices_" + row_id + "_device_rating"] = dev.deviceRating;
rowattrs["repeating_devices_" + row_id + "_type"] = matrix_device_types[dev.subType];
rowattrs["repeating_devices_" + row_id + "_active_program_slots"] = dev.concurrentPrograms;
rowattrs["repeating_devices_" + row_id + "_attack"] = dev.attack;
rowattrs["repeating_devices_" + row_id + "_sleaze"] = dev.sleaze;
rowattrs["repeating_devices_" + row_id + "_data_processing"] = dev.dataProcessing;
rowattrs["repeating_devices_" + row_id + "_firewall"] = dev.firewall;
rowattrs["repeating_devices_" + row_id + "_display_flag"] = 'display';
rowattrs["repeating_devices_" + row_id + "_notes"] = dev.page + "\n" + dev.description + "\n";
if(dev.accessories) {
var accessories = [];
dev.accessories.forEach(acc => {
if(acc.rating) {
accessories.push(acc.name + ' ' + acc.rating);
} else {
accessories.push(acc.name);
}
});
rowattrs["repeating_devices_" + row_id + "_notes"] += accessories.join(', ');
}
// Build the list of programs to be used later
if(dev.programs) {
dev.programs.forEach(prog => {
if(! prog_list.includes(prog.name)) {
prog_list.push(prog.name);
programs[prog.name] = prog;
}
});
}
setAttrs(rowattrs);
});
console.log("Character matrix devices imported");
}
// Process programs
usedIDs = [];
if(programs) {
rowattrs = {};
Object.keys(programs).forEach(key => {
row_id = generateRowID();
while(row_id.toLowerCase() in usedIDs) {
row_id = generateRowID();
}
usedIDs.push(row_id.toLowerCase());
rowattrs["repeating_programs_" + row_id + "_name"] = programs[key].name;
rowattrs["repeating_programs_" + row_id + "_notes"] = programs[key].page + "\n" + programs[key].description;
});
setAttrs(rowattrs);
console.log("Character programs imported");
}
return true;
};
const clean = () => {
["quality", "skills", "knowledges", "armor", "items", "augmentations", "vehicle", "lifestyle", "contacts", "range", "melee", "spell", "ritual", "powers", "metamagic", "echoes", "forms", "martial", "devices", "programs"].forEach(group => {
getSectionIDs(`repeating_${group}`, (ids) => {
ids.forEach((id) => {
removeRepeatingRow(`repeating_${group}_${id}`);
});
});
});
};
/******************
* Utilities *
******************/
const ucfirst = (string = '') => {
return string.charAt(0).toUpperCase() + string.slice(1) || '';
};
</script>
</div>