Files
roll20-character-sheets/Shadowrun3e/shadowrun3e.html
T
2024-06-03 13:15:14 -04:00

10319 lines
568 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<input type='hidden' class='sheet-tabstoggle' name='attr_sheetTab' />
<div class="geninfo">
<div>
<div class="SRH2W" data-i18n="general-info">General Information</div>
<div class="geninfo-item">
<div class="SRH5" data-i18n="name">Name</div>
<input class="text-mid" type="text" name="attr_character_name" disabled="true">
<div></div>
<div></div>
<div class="SRH5" data-i18n="sheet-type">Sheet Type:</div>
<select name="attr_sheettype" class="largeselect" value="Character">
<option data-i18n="character" value="Character" selected>Character</option>
<option data-i18n="npc" value="NPC">NPC</option>
<option data-i18n="critter" value="Critter">Critter</option>
<option data-i18n="spirit" value="Spirit">Spirit</option>
<option data-i18n="drone" value="Drone">Drone</option>
<option data-i18n="vehicle" value="Vehicle">Vehicle</option>
<option data-i18n="matrix" value="Matrix">Matrix</option>
<option data-i18n="frame" value="Frame">Frame</option>
</select>
<div></div>
<div class="box text-mid"><a class="button" href="#popup1" data-i18n="import">Import</a><a class="button"
href="#popup2" data-i18n="export">Export</a></div>
</div>
<input type='hidden' class='buttontoggle' name='attr_sheettype' value="Character" />
<div class="metatype-info">
<div class="SRH5" data-i18n="metatype">MetaType:</div><select name="attr_metatype" class="largeselect">
<option value="Human" data-i18n="human" selected>Human</option>
<option value="Dwarf" data-i18n="dwarf">Dwarf</option>
<option value="Elf" data-i18n="efl">Elf</option>
<option value="Ork" data-i18n="ork">Ork</option>
<option value="Troll" data-i18n="troll">Troll</option>
<option>Cyclops</option>
<option>Fomori</option>
<option>Giant</option>
<option>Minotaur</option>
<option>Hobgoblin</option>
<option>Oni</option>
<option>Ogre</option>
<option>Satyr</option>
<option>Menehune</option>
<option>Koborokuru</option>
<option>Gnome</option>
<option>Wakyambi</option>
<option value="Nightone">Night One</option>
<option>Dryad</option>
</select>
<div class="SRH5" data-i18n="age">Age:</div> <input type="number" name="attr_age">
<div class="SRH5" data-i18n="height">Height:</div> <input type='number' name="attr_height">
<div class="SRH5" data-i18n="weight">Weight:</div> <input type='number' name="attr_weight" step='0.01'>
</div>
<div class="spirittype-info">
<div class="SRH5" data-i18n="spirit-type">Spirit Type: </div>
<select id="spirit-type" name="attr_spirit-type" class="mediumselect2">
<option value="watcher" data-i18n="watcher">Watcher</option>
<optgroup data-i18n-label="elementals" label="Elementals">
<option value="airelemental"data-i18n="air-elemental">Air Elemental</option>
<option value="waterelemental"data-i18n="water-elemental">Water Elemental</option>
<option value="earthelemental"data-i18n="earth-elemental">Earth Elemental</option>
<option value="fireelemental"data-i18n="fire-elemental">Fire Elemental</option>
</optgroup>
<optgroup data-i18n-label="spirit-of-man" label="Spirits of Man">
<option value="cityspirit" data-i18n="city-spirit">City Spirit</option>
<option value="fieldspirit" data-i18n="field-spirit">Field Spirit</option>
<option value="hearthspirit" data-i18n="hearth-spirit">Hearth Spirit</option>
</optgroup>
<optgroup data-i18n-label="spirit-of-land" label="Spirits of the Land">
<option value="desertspirit" data-i18n="desert-spirit">Desert Spirit</option>
<option value="forestspirit" data-i18n="forest-spirit">Forest Spirit</option>
<option value="mountainspirit" data-i18n="mountain-spirit">Mountain Spirit</option>
<option value="prairiespirit" data-i18n="prairie-spirit">Prairie Spirit</option>
</optgroup>
<optgroup data-i18n-label="spirit-of-sky" label="Spirits of the Sky">
<option value="mistspirit" data-i18n="mist-spirit">Mist Spirit</option>
<option value="stormspirit" data-i18n="storm-spirit">Storm Spirit</option>
<option value="windspirit" data-i18n="wind-spirit">Wind Spirit</option>
</optgroup>
<optgroup data-i18n-label="spirit-of-water" label="Spirits of the Waters">
<option value="lakespirit" data-i18n="lake-spirit">Lake Spirit</option>
<option value="riverspirit" data-i18n="river-spirit">River Spirit</option>
<option value="seaspirit" data-i18n="sea-spirit">Sea Spirit</option>
</optgroup>
<optgroup data-i18n-label="spirit-of-elements" label="Spirits of the Elements">
<option value="gnome" data-i18n="gnome">Gnome</option>
<option value="manitous" data-i18n="manitous">Manitous</option>
<option value="salamander" data-i18n="salamander">Salamander</option>
<option value="sylph" data-i18n="sylph">Sylphs</option>
<option value="ancestor" data-i18n="ancestor">Ancestor</option>
</optgroup>
</select>
<div class="SRH5" data-i18n="force">Force:</div>
<input type="number" name="attr_force">
</div>
</div>
<div><img src="https://raw.githubusercontent.com/bahornbeck/img/master/images/srlogo.png"
alt="Shadowrun Third Edition"></div>
</div>
<div class="hidden-constants">
<input type="hidden" name="attr_carrying-weight" value=0>
<input type="hidden" name="attr_carrying-max" value=0>
<input type="hidden" name="attr_carrying-stun" value=0>
<input type="hidden" name="attr_carrying-wound" value=0>
<input type="hidden" name="attr_rangedTN" value=0>
<input type="hidden" name="attr_meleeTN" value=0>
<input type="hidden" name="attr_meelereach" value=0>
<input type="hidden" name="attr_api-newsheet" value=0>
<input type="hidden" name="attr_stun_pen" value=0>
<input type="hidden" name="attr_wound_pen" value=0>
<input type="hidden" name="attr_meleevizTN" value=0>
<input type="hidden" name="attr_rangedvizTN" value=0>
<input type="hidden" name="attr_iconstatuscode" value=0>
<input type='hidden' name='attr_gyro-on' value=0 />
<input type='hidden' name='attr_armor-on' value=0 />
<input type='hidden' name='attr_wp-char' value="(@{stun_pen} + @{wound_pen})" />
<input type='hidden' name='attr_wp-matrix' value="(@{stun_pen} + @{wound_pen} + @{matrix-penalty})" />
<input type='hidden' name='attr_wp-vehicle'
value="(@{vehicle-penalty} +@{rccommand-penalty} + @{rcsimsense-penalty} +@{rcsystem-penalty})" />
<button type="action" name="act_init-aug" class="d6-button" title="Augmented Initiative">L</button>
<button type="action" name="act_endturn" class="d6-button" title="End Combat Turn">L</button>
<button type="action" name="act_resistroll" class="d6-button" title="Resist Roll">L</button>
<button type="action" name="act_resistspell" class="d6-button" title="Resist Spell">L</button>
<button type="action" name="act_checkaoe" class="d6-button" title="Check AoE result">L</button>
<button type="action" name="act_resist-ballistic-normal" class="d6-button"
title="Resist with Ballistic Armor">L</button>
<button type="action" name="act_resist-ballistic-half" class="d6-button"
title="Resist with 1/2 Ballistic Armor">L</button>
<button type="action" name="act_resist-ballistic-double" class="d6-button"
title="Resist with double Ballistic Armor">L</button>
<button type="action" name="act_resist-impact-normal" class="d6-button" title="Resist with Impact Armor">L</button>
<button type="action" name="act_resist-impact-half" class="d6-button"
title="Resist with 1/2 Impact Armor">L</button>
<button type="action" name="act_resist-impact-double" class="d6-button"
title="Resist with double Impact Armor">L</button>
<button type="action" name="act_rangedattack-primary" class="d6-button"
title="Attack with primary equipped ranged weapons">L</button>
<button type="action" name="act_meleeattack-primary" class="d6-button"
title="Attack with primary equipped melee weapons">L</button>
<button type="action" name="act_missed" class="d6-button" title="attack missed">L</button>
<button type="action" name="act_spellblocked" class="d6-button" title="spell fully blocked">L</button>
<button type="action" name="act_meleedefend" class="d6-button" title="melee defense test">L</button>
<button type="action" name="act_meleedefendfull" class="d6-button" title="melee full-defense test">L</button>
<button type="action" name="act_spiritcontrol" class="d6-button" title="spirit control test">L</button>
<button type="action" name="act_banishing" class="d6-button" title="banishing test">L</button>
<button type="action" name="act_summoning" class="d6-button" title="summoning test">L</button>
<button type="action" name="act_attrib-body" class="d6-button" title="body test">L</button>
<button type="action" name="act_attrib-willpower" class="d6-button" title="willpower test">L</button>
<button type="action" name="act_attrib-intelligence" class="d6-button" title="intelligence test">L</button>
<button type="action" name="act_attrib-force" class="d6-button" title="force test">L</button>
<button type="action" name="act_attrib-body-max" class="d6-button" title="body max test">L</button>
<button type="action" name="act_attrib-willpower-max" class="d6-button" title="willpower max test">L</button>
<button type="action" name="act_attrib-intelligence-max" class="d6-button" title="intelligence max test">L</button>
</div>
<input type='hidden' class='buttontoggle' name='attr_sheettype' value="Character" />
<div class="characters-npcs">
<input type='hidden' class='buttontoggle' name='attr_sheettype' value="Character" />
<div class="alwaysdisplayed-buttons">
<input type='hidden' class='magictype' name='attr_magic-type' value="mage" />
<input type='hidden' class='sheet-tabstoggle' name='attr_sheetTab' value="character" />
<button class="charbutton" type="action" name="act_character" title="Character Attributes and Karma"
data-i18n="attributes">Attributes</button>
<button class="skillsbutton" type="action" name="act_skills" title="Active and Knowledge Skills"
data-i18n="skills">Skills</button>
<button class="magicbutton" type="action" name="act_magic"
title="Magic Skills, Spells, Fetishes, Initiation and Adept Powers" data-i18n="magic">Magic</button>
<button class="adeptbutton" type="action" name="act_magic"
title="Magic Skills, Spells, Fetishes, Initiation and Adept Powers" data-i18n="adept">Adept</button>
<button class="decksbutton" type="action" name="act_decks"
title="Computer Skills, Cyberdeck configuration and Utilities" data-i18n="decking">Decking</button>
<button class="gearbutton" type="action" name="act_gear" title="Gear, Vehicles and Nuyen"
data-i18n="gear">Gear</button>
<button class="riggerbutton" type="action" name="act_rigger"
title="VCR, Remote Control Deck and Electronic Warfare" data-i18n="rigger">Rigger</button>
<button class="combatbutton" type="action" name="act_combat"
title="Combat Skills and Weapons for Ranged and Melee" data-i18n="combat">Combat</button>
<button class="cyberwarebutton" type="action" name="act_cyberware" title="Cyberware, Bioware and Nanotech"
data-i18n="cyberware">Cyberware</button>
<button class="contactsbutton" type="action" name="act_contacts" title="Contacts and Lifestyle Notes"
data-i18n="contacts-lifesytle">Contacts/Lifestyle</button>
<button class="karmabutton" type="action" name="act_karma" title="Karma and Karam expenditures"
data-i18n="karma">Karma</button>
</div>
<div class="critters-only critters-buttons">
<input type='hidden' class='sheet-tabstoggle' name='attr_sheetTab' value="character" />
<button class="charbutton" type="action" name="act_character" title="Character Attributes and Karma"
data-i18n="attributes">Attributes</button>
<button class="combatbutton" type="action" name="act_combat"
title="Combat Skills and Weapons for Ranged and Melee" data-i18n="combat">Combat</button>
<button class="critters-powers-button" type="action" name="act_critter-powers"
title="Critter Powers and Weaknesses" data-i18n="powers">Powers</button>
<button class="magicbutton" type="action" name="act_magic" title="Critter Magic"
data-i18n="magic">Magic</button>
</div>
<div class="spirits-only spirits-buttons">
<input type='hidden' class='sheet-tabstoggle' name='attr_sheetTab' value="character" />
<button class="charbutton" type="action" name="act_character" title="Spirit Attributes"
data-i18n="attributes">Attributes</button>
<button class="critters-powers-button" type="action" name="act_critter-powers"
title="Spirit Powers and Weaknesses" data-i18n="powers">Powers</button>
<button class="magicbutton" type="action" name="act_magic" title="Spirit Magic" data-i18n="magic">Magic</button>
</div>
<input type='hidden' class='sheet-tabstoggle' name='attr_sheetTab' value='character' />
<div class="alwaysdisplayed">
<input type='hidden' class='buttontoggle' name='attr_sheettype' value="Character" />
<div class="organism-condition">
<div class="SRH3" data-i18n="condition-monitor">Condition Monitor</div>
<br>
<div class="conditionstatus">
<div></div>
<div data-i18n="uninjured">Uninjured</div>
<div data-i18n="light-stun">Light Stun</div>
<div data-i18n="moderate-stun">Moderate Stun</div>
<div data-i18n="serious-stun">Serious Stun</div>
<div data-i18n="unconscious">Unconscious</div>
<div data-i18n="stun">Stun</div>
<div>
<input type="radio" name="attr_stun" value=0 checked>
</div>
<div>
<input type="radio" name="attr_stun" value=1>
<input type="radio" name="attr_stun" value=2>
</div>
<div>
<input type="radio" name="attr_stun" value=3>
<input type="radio" name="attr_stun" value=4>
<input type="radio" name="attr_stun" value=5>
</div>
<div>
<input type="radio" name="attr_stun" value=6>
<input type="radio" name="attr_stun" value=7>
<input type="radio" name="attr_stun" value=8>
<input type="radio" name="attr_stun" value=9>
</div>
<div><input type="radio" name="attr_stun" value=100></div>
<div data-i18n="physical">Physical</div>
<div>
<input type="radio" name="attr_wounds" value=0 checked>
</div>
<div>
<input type="radio" name="attr_wounds" value=1>
<input type="radio" name="attr_wounds" value=2>
</div>
<div>
<input type="radio" name="attr_wounds" value=3>
<input type="radio" name="attr_wounds" value=4>
<input type="radio" name="attr_wounds" value=5>
</div>
<div>
<input type="radio" name="attr_wounds" value=6>
<input type="radio" name="attr_wounds" value=7>
<input type="radio" name="attr_wounds" value=8>
<input type="radio" name="attr_wounds" value=9>
</div>
<div><input type="radio" name="attr_wounds" value=100></div>
<div></div>
<div data-i18n="uninjured">Uninjured</div>
<div data-i18n="light-wound">Light Wound</div>
<div data-i18n="moderate-wound">Moderate Wound</div>
<div data-i18n="serious-wound">Serious Wound</div>
<div data-i18n="deadly-wound">Deadly Wound</div>
<div></div>
</div>
<div><br></div>
</div>
<div class="dicepool">
<input type="hidden" name="attr_combatpool-used" value=0 />
<input type="hidden" name="attr_spellpool-used" value=0 />
<input type='hidden' name='attr_spellpool-used-total' value=0 />
<input type="hidden" name="attr_hackingpool-used" value=0 />
<input type="hidden" name="attr_hackingpool-used-total" value=0 />
<input type="hidden" name="attr_controlpool-used" value=0 />
<input type="hidden" name="attr_astralpool-used" value=0 />
<input type="hidden" name="attr_taskpool-used" value=0 />
<div class="SRH3" data-i18n="dice-pools">Dice Pools</div>
<div data-i18n="maxiumum-abreviation">Max</div>
<div data-i18n="used">Used</div>
<div data-i18n="combat-pool"> Combat Pool:</div>
<div><span name="attr_combatpool"></span></div>
<div><input type='hidden' class='combatpool-over' name='attr_combatpool-over' /><span
class="combatpool-over" name="attr_combatpool-used"></span></div>
<div data-i18n="spell-pool"> Spell Pool:</div>
<div><span type="number" name="attr_spellpool"></span> </div>
<div><input type='hidden' class='spellpool-over' name='attr_spellpool-over' /><span class="spellpool-over"
name="attr_spellpool-used-total"></span></div>
<div data-i18n="hacking-pool"> Hacking Pool:</div>
<div><span type="number" name="attr_hackingpool"></span> </div>
<div><input type='hidden' class='hackingpool-over' name='attr_hackingpool-over' /><span
class="hackingpool-over" name="attr_hackingpool-used-total"></span></div>
<div data-i18n="control-pool"> Control Pool:</div>
<div><span type="number" name="attr_controlpool"></span> </div>
<div><input type='hidden' class='controlpool-over' name='attr_controlpool-over' /><span
class="controlpool-over" name="attr_controlpool-used"></span></div>
<div data-i18n="astral-pool"> Astral Pool:</div>
<div><span type="number" name="attr_astralpool"></span> </div>
<div><input type='hidden' class='astralpool-over' name='attr_astralpool-over' /><span
class="astralpool-over" name="attr_astralpool-used"></span></div>
<div data-i18n="task-pool"> Task Pool:</div>
<div><span type="number" name="attr_taskpool"></span> </div>
<div><input type='hidden' class='taskpool-over' name='attr_taskpool-over' /><span class="taskpool-over"
name="attr_taskpool-used"></span></div>
</div>
</div>
<div class="conditionstatus2">
<div data-i18n="physical-damage-overflow">Physical Damage Overflow:</div>
<div><input type="number" name="attr_overflow" value=0 min=0 /></div>
<input type='hidden' class='buttontoggle' name='attr_sheettype' value="Character" />
<div></div>
<div class="normal-init text-mid" data-i18n="initiative-natural">Init Nat.</div>
<div class="normal-init"><button type="action" name="act_init" class="d6-button" title="Unaugmented Initiative"
id="natrualinit">L</button></div>
<div class="normal-init text-mid" data-i18n="initiative-augmented">Init. Aug.</div>
<div class="normal-init"><button type="action" name="act_init" class="d6-button" title="Augmented Initiative"
id="augmentedinit">L</button></div>
<div class="spirits-only text-mid" data-i18n="initiative-physical">Init. Phy.</div>
<div class="spirits-only"><button type="action" name="act_init" class="d6-button" title="Physical Initiative"
id="spiritinit">L</button></div>
<div class="spirits-only text-mid" data-i18n="initiative-astral">Init. Astr. </div>
<div class="spirits-only"><button type="action" name="act_init" class="d6-button" title="Astral Initiative"
id="astralinit">L</button></div>
<div class="text-mid" data-i18n="end-turn">End Turn</div>
<div><button type="action" name="act_endturn" class="d6-button" title="End Combat Turn" id="endturn">L</button>
</div>
<div class="conditionstatus2-attrs">
<div class="text-mid"> <span data-i18n="body-abbreviation">B:</span> <span class="number-span"
name="attr_body_max"></span></div>
<div class="text-mid"> <span data-i18n="quickness-abbreviation">Q:</span> <span class="number-span"
name="attr_quickness_max"></span></div>
<div class="text-mid"> <span data-i18n="strength-abbreviation">S:</span> <span class="number-span"
name="attr_strength_max"></span></div>
<div class="text-mid"> <span data-i18n="charisma-abbreviation">C:</span> <span class="number-span"
name="attr_charisma_max"></span></div>
<div class="text-mid"> <span data-i18n="intelligence-abbreviation">I:</span> <span class="number-span"
name="attr_intelligence_max"></span></div>
<div class="text-mid"> <span data-i18n="willpower-abbreviation">W:</span> <span class="number-span"
name="attr_willpower_max"></span></div>
<div class="text-mid"> <span data-i18n="reaction-abbreviation">R:</span> <span class="number-span"
name="attr_reaction_max"></span></div>
</div>
</div>
<div class="combat-always-visible">
<div class="SRH3" data-i18n="combat-conditions">Combat conditions</div>
<div class="combat-modifiers-total">
<div class="text-mid"><span data-i18n="ranged-modifiers">Ranged Modifiers:</span><span class="number-span"
name="attr_rangedTN"></span></div>
<div class="text-mid"><span data-i18n="melee-modifiers">Melee Modifiers:</span> <span class="number-span"
name="attr_meleeTN"></span></div>
<div class="text-mid"><span data-i18n="rounds-fired">Rounds Fired:</span> <span class="number-span"
name="attr_rounds-phase" value=0></span></div>
<div class="text-mid"><span data-i18n="dodge">Dodge</span><button type="action" name="act_dodge"
class="d6-button" title="Dodge Attack" id="dodge">L</button></div>
<div class="text-mid"><span data-i18n="ballistic">Ballistic:</span> <span class="number-span"
name="attr_ballistic" value=0></span><button type="action" name="act_resistdmg" class="d6-button"
title="Resist Damage with Ballistic Armor" id="ballistic">L</button> </div>
<div class="text-mid"><span data-i18n="impact">Impact:</span> <span class="number-span" name="attr_impact"
value=0></span><button type="action" name="act_resistdmg" class="d6-button"
title="Resist Damage with Impact Armor" id="impact">L</button> </div>
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="manual-gunnery">
<input type='hidden' class='gunnery-switch' name='attr_gunneryswitch' value="show" />
<div class="manual-gunnery-show">
<input type="hidden" class="manual-gunnery-tn" name="attr_manualgunneryTN" value=0>
<button class="gunneryswitch" type="action" name="act_gunneryswitch"
data-i18n="show-manual-gunnery">Show Manual Gunnery</button><span class="number-span"
name="attr_manualgunneryTN"></span>
</div>
<div class="manual-gunnery-hide">
<input type="hidden" class="manual-gunnery-tn" name="attr_manualgunneryTN" value=0>
<button class="gunneryswitch" type="action" name="act_gunneryswitch"
data-i18n="hide-manual-gunnery">Hide Manual Gunnery</button><span class="number-span"
name="attr_manualgunneryTN"></span>
</div>
</div>
</div>
<div class="combat-conditions">
<div class="text-mid" data-i18n="visibility">Visibility</div>
<div class="text-mid" data-i18n="vision-enhacement">Vision Enhacement</div>
<div class="text-mid" data-i18n="target-cover">Target Cover</div>
<div class="text-mid" data-i18n="movement">Movement</div>
<div data-i18n="dual-wield">Dual Wield</div>
<div data-i18n="called-shot">Called Shot</div>
<div data-i18n="aim-actions">Aim Actions</div>
<div data-i18n="melee-foes">Melee Foes</div>
<div data-i18n="melee-friends">Melee Friends</div>
<div class="text-mid" data-i18n="targets">Targets</div>
<div class="text-mid" data-i18n="position">Position</div>
<div data-i18n="miscellaneous-modifiers">Misc Modifiers</div>
<div class="center-checkbox"><select name="attr_visibility" class="mediumselect2">
<option data-i18n="normal" value=0 selected>Normal</option>
<option data-i18n="full-dark" value="@{fulldark}">Full Dark</option>
<option data-i18n="partial-light" value="@{partiallight}">Partail Light</option>
<option data-i18n="minimal-light" value="@{minlight}">Minimal Light</option>
<option data-i18n="glare" value="@{glare}">Glare</option>
<option data-i18n="mist" value="@{mist}">Mist</option>
<option data-i18n="light-smoke-rain" value="@{lightsmoke}">Light Smoke/Rain</option>
<option data-i18n="heavy-smoke-rain" value="@{fullsmoke}">Heavy Smoke/Rain</option>
<option data-i18n="thermal-smoke" value="@{thermalsmoke}">Thermal Smoke</option>
</select>
</div>
<div><select name="attr_visionenhancement" class="mediumselect2">
<option data-i18n="none" value="None" selected>None</option>
<option value="LowLight" data-i18n="low-light">LowLight</option>
<option value="Thermal" data-i18n="thermal">Thermal</option>
<option value="Cybernetic" data-i18n="cybernetic">Cybernetic</option>
<option value="Ultrasound" data-i18n="ultrasound">Ultrasound</option>
</select></div>
<div><select name="attr_cover" class="mediumselect2">
<optgroup data-i18n-label="standard" label="Standard">
<option value=0 SELECTED>None</option>
<option data-i18n="partial" value=4>Partial</option>
<option data-i18n="blind-fire" value=8>Blind Fire</option>
<optgroup data-i18n-label="gm-choice" label="GM's Choice">
<option value=1>+1</option>
<option value=2>+2</option>
<option value=3>+3</option>
<option value=4>+4</option>
<option value=5>+5</option>
<option value=6>+6</option>
</select></div>
<div><select name="attr_move" title="Movement actions taken" class="mediumselect2">
<option selected value=0 data-i18n="not-moving">not moving</option>
<option value=1 data-i18n="walk">walk</option>
<option value=2 data-i18n="walk-difficult-ground">walk (difficult ground)</option>
<option value=4 data-i18n="run">run</option>
<option value=6 data-i18n="run-difficult-ground">run (difficult ground)</option>s
</select></div>
<div class="center-checkbox"><input type='checkbox' name="attr_dualwield" value='2' title="2 Guns Equipped">
</div>
<div class="center-checkbox"><input type='checkbox' name="attr_calledshot" value='4' title="Called Shot">
</div>
<div class="center-checkbox"><input type='number' name="attr_aim" value="0" min="0"
title="Aim Actions Taken"></div>
<div><input type='number' name="attr_enemies" max="4" min="0" value="0" title="Enemies in Melee with you">
</div>
<div><input type='number' name="attr_friends" max="4" min="0" value="0" title="Friends in Melee with you">
</div>
<div><input type='number' name="attr_meleetargets" value="0" min="0"
title="How many targets are you attacking at one time"></div>
<div><select name="attr_position" title="Position of you vs. target in Melee" class="mediumselect2">
<option data-i18n="none" value=0 selected>None</option>
<option data-i18n="superior-position" value=1>Superior Position</option>
<option data-i18n="target-prone" value=2>Target Prone</option>
</select></div>
<div><input type='number' name="attr_misccombatmods" value="0" title="Any other modifiers for combat?">
</div>
</div>
<input type='hidden' class='gunnery-switch' name='attr_gunneryswitch' value="show" />
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="manual-gunnery-mods">
<div data-i18n="relative-motion">Relative Motion</div>
<div data-i18n="relative-speed">Relative Speed</div>
<div data-i18n="maneuver-score">Maneuver Score</div>
<div data-i18n="vehicle-damage">Vehicle Damage</div>
<div data-i18n="Weapon-mount">Weapon Mount</div>
<div data-i18n="terrain">Terrain</div>
<div data-i18n="target-type">Target Type</div>
<div><select name="attr_gunnerymotion" title="motion relative to target" class="mediumselect2">
<option value=0 selected>None</option>
<option data-i18n="towards" value=-1>Towards</option>
<option data-i18n="away" value=1>Away</option>
</select></div>
<div><select name="attr_gunneryspeed" title="speed relative to target" class="mediumselect2">
<option value=0 selected> = </option>
<option value=2> &LT;= 2X</option>
<option value=4> &LT;= 3X</option>
<option value=6> &GT; 3X</option>
</select></div>
<div><select name="attr_gunnerymaneuver" title="Maneuver score difference" class="mediumselect2">
<option data-i18n="none" value=0 selected>None</option>
<option data-i18n="attacker-greater" value=-1>Attacker Greaty by 10</option>
<option data-i18n="target-greater" value=1>Target Greater by 10</option>
</select></div>
<div><select name="attr_gunneryvehicledmg" title="Vehicle Damaged Modifiers" class="mediumselect2">
<option data-i18n="none" value=0 selected>None</option>
<option data-i18n="light-damage-abbreviation" value=1>L</option>
<option data-i18n="moderate-damage-abbreviation" value=2>M</option>
<option data-i18n="serious-damage-abbreviation" value=3>S</option>
</select></div>
<div><select name="attr_gunnerymount" title="Is weapon mounted?" class="mediumselect2">
<option data-i18n="unmounted" value=2>Unmounted</option>
<option data-i18n="mounted" value=0 selected>mounted</option>
</select></div>
<div><select name="attr_gunneryterrain" title="Moving through terrain" class="mediumselect2">
<option data-i18n="normal" value=0 selected>Normal</option>
<option data-i18n="restricted" value=2>Restricted</option>
<option data-i18n="tight" value=4>Tight</option>
<option data-i18n="combat-zone" value=2>Combat Zone</option>
</select></div>
<div><select name="attr_gunnerytargettype" title="Target type/size" class="mediumselect2">
<option data-i18n="metahuman-sized" value=0 selected>Metahuman sized</option>
<option data-i18n="small-critter" value=1>Small critter</option>
<option data-i18n="large-critter" value=-1>Large critter</option>
<option data-i18n="small-drone" value=1>Small drone</option>
<option data-i18n="motorcyle" value=0>Motorcyle</option>
<option data-i18n="automobile" value=-1>Automobile</option>
<option data-i18n="limo-Light-truck" value=-1>Limo/Light Truck</option>
<option data-i18n="heavy-truck-trailer" value=-3>Heavy Truck/Trailer</option>
<option data-i18n="boat" value=-1>Boat</option>
<option data-i18n="yacht" value=-3>Yacht</option>
<option data-i18n="freighter-tanker" value=-8>Freighter/Tanker</option>
<option data-i18n="ultralight-glider" value=0>Ultralight glider</option>
<option data-i18n="fixed-wing" value=-2>Fixed Wing</option>
<option data-i18n="commerical-airliner" value=-6>Commerical Airliner</option>
<option data-i18n="helicopter" value=-2>Helicopter</option>
<option data-i18n="zepplin-blimp" value=-6>Zepplin/Blimp</option>
<option data-i18n="lav" value=-3>LAV</option>
<option data-i18n="military-ground-vehicle" value=-3>Military Ground Vehicle</option>
</select></div>
</div>
</div>
</div>
<input type='hidden' class='sheet-tabstoggle' name='attr_sheetTab' value='character' />
<div class='sheet-character'>
<div class="attributes-init">
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div>
<div class="SRH3" data-i18n="attributes">Attributes</div>
<div class="char-attributes">
<header class="table-top-left" data-i18n="attribute">Attribute</header>
<header class="table-top-mid" data-i18n="base">Base</header>
<header class="table-top-mid" data-i18n="mods">Mods</header>
<header class="table-top-right" data-i18n="final">Final</header>
<header class="table-item-left" data-i18n="body">Body</header>
<div class="table-item">
<input type="number" name="attr_body" value=1 min=1 style='width:39px;' />
<div><button data-i18n-title="body-test-natural" title="Body Test without augmentation"
class="d6-button" type="action" name="act_attrib" id="body">L</button></div>
</div>
<div class="table-item">+<input type="number" name="attr_body-mods" value=0 style='width:39px;' />=
</div>
<div class="table-item">
<span name="attr_body_max"></span>
<div><button data-i18n-title="body-test-aug" title="Body Test with augmentation" class="d6-button"
type="action" name="act_attrib" id="body|max">L</button></div>
</div>
<header class="table-item-left" data-i18n="quickness">Quickness</header>
<div class="table-item">
<input type="number" name="attr_quickness" value=1 min=1 style='width:39px;' />
<div><button data-i18n-title="quickness-test-natural" title="Quickness Test without augmentation"
class="d6-button" type="action" name="act_attrib" id="quickness">L</button></div>
</div>
<div class="table-item">+<input type="number" name="attr_quickness-mods" value=0 style='width:39px;' />=
</div>
<div class="table-item">
<span name="attr_quickness_max"></span>
<div><button data-i18n-title="quickness-test-natural" title="Quickness Test witht augmentation"
class="d6-button" type="action" name="act_attrib" id="quickness|max">L</button></div>
</div>
<header class="table-item-left" data-i18n="strength">Strength</header>
<div class="table-item">
<input type="number" name="attr_strength" value=1 min=1 style='width:39px;' />
<div><button data-i18n-title="strength-test-natural" title="Strength Test without augmentation"
class="d6-button" type="action" name="act_attrib" id="strength">L</button></div>
</div>
<div class="table-item">+<input type="number" name="attr_strength-mods" value=0 style='width:39px;' />=
</div>
<div class="table-item">
<span name="attr_strength_max"></span>
<div><button data-i18n-title="strength-test-natural" title="Strength Test with augmentation"
class="d6-button" type="action" name="act_attrib" id="strength|max">L</button></div>
</div>
<header class="table-item-left" data-i18n="charisma">Charisma</header>
<div class="table-item">
<input type="number" name="attr_Charisma" value=1 min=1 style='width:39px;' />
<div><button data-i18n-title="charisma-test-natural" title="Charisma Test without augmentation"
class="d6-button" type="action" name="act_attrib" id="charisma">L</button></div>
</div>
<div class="table-item">+<input type="number" name="attr_charisma-mods" value=0 style='width:39px;' />=
</div>
<div class="table-item">
<span name="attr_charisma_max" value=1></span>
<div><button data-i18n-title="charisma-test-natural" title="Charisma Test with augmentation"
class="d6-button" type="action" name="act_attrib" id="charisma|max">L</button></div>
</div>
<header class="table-item-left" data-i18n="intelligence">Intelligence</header>
<div class="table-item">
<input type="number" name="attr_intelligence" value=1 min=1 style='width:39px;' />
<div><button data-i18n-title="intelligence-test-natural"
title="Intelligence Test without augmentation" class="d6-button" type="action"
name="act_attrib" id="intelligence">L</button></div>
</div>
<div class="table-item">+<input type="number" name="attr_intelligence-mods" value=0
style='width:39px;' />=</div>
<div class="table-item">
<span name="attr_intelligence_max" value=1></span>
<div><button data-i18n-title="intelligence-test-natural" title="Intelligence Test with augmentation"
class="d6-button" type="action" name="act_attrib" id="intelligence|max">L</button></div>
</div>
<header class="table-item-left" data-i18n="willpower">Willpower</header>
<div class="table-item">
<input type="number" name="attr_willpower" value=1 min=1 style='width:39px;' />
<div><button data-i18n-title="willpower-test-natural" title="Willpower Test without augmentation"
class="d6-button" type="action" name="act_attrib" id="willpower">L</button></div>
</div>
<div class="table-item">+<input type="number" name="attr_willpower-mods" value=0 style='width:39px;' />=
</div>
<div class="table-item">
<span name="attr_willpower_max" value=1></span>
<div><button data-i18n-title="willpower-test-natural" title="Willpower Test with augmentation"
class="d6-button" type="action" name="act_attrib" id="willpower|max">L</button></div>
</div>
<header class="table-item-left" data-i18n="essence">Essence</header>
<div class="table-item">
<input type="number" name="attr_essence" value=6 step='0.01' min='0.00' style='width:39px' />
<div><button data-i18n-title="essence-test" title="Essence Test" class="d6-button" type="action"
name="act_attrib" id="essence">L</button></div>
</div>
<div></div>
<div></div>
<header class="table-item-left" data-i18n="magic">Magic</header>
<div class="table-item">
<input type="number" name="attr_magic" value=0 style='width:39px;' />
<div><button data-i18n-title="magic-test" title="Magic Test" class="d6-button" type="action"
name="act_attrib" id="magic">L</button></div>
</div>
<input type="number" name="attr_signature" value=4 hidden="true">
</div>
</div>
<div class="critters-only spirits-only">
<div class="SRH3" data-i18n="attributes">Attributes</div>
<div class="critter-attributes">
<header class="table-top-left" data-i18n="attribute">Attribute</header>
<header class="table-top-right" data-i18n="level">Level</header>
<header class="table-item-left" data-i18n="perception">Perception</header>
<div class="table-item">
<div class="sidebyside"><input type="number" name="attr_perception" value=0 min=0 />
<button type="action" name="act_attrib" class="d6-button" data-i18n-title="perception-test"
title="Perception Test" id="perception">L</button>
</div>
</div>
<header class="table-item-left" data-i18n="reach">Reach</header>
<div class="table-item">
<div class="sidebyside"><input type="number" name="attr_meleereach" value=0 />
<div></div>
</div>
</div>
<header class="table-item-left" data-i18n="force">Force</header>
<div class="table-item">
<div class="sidebyside"><input type="number" name="attr_force" value=0 min=0 />
<div></div>
</div>
</div>
<header class="table-item-left" data-i18n="attacks">Attacks</header>
<div class="table-item">
<div class="critter-attack">
<input type="number" name="attr_attackpower" value=0 min=0 />
<select name="attr_attackdamage" class="mediumselect2">
<option data-i18n="light-damage-abbreviation" value="L">L</option>
<option data-i18n="moderate-damage-abbreviation" value="M" SELECTED>M</option>
<option data-i18n="serious-damage-abbreviation" value="S">S</option>
<option data-i18n="deadly-damage-abbreviation" value="D">D</option>
<option data-i18n="light-stun-abbreviation" value="L(stun)">L(s)</option>
<option data-i18n="moderate-stun-abbreviation" value="M(stun)">M(s)</option>
<option data-i18n="serious-stun-abbreviation" value="S(stun)">S(s)</option>
<option data-i18n="deadly-stun-abbreviation" value="D(stun)">D(s)</option>
<option></option>
</select>
<button type="action" name="act_melee" id="critterattack" class="d6-button"
title="Attack">L</button>
</div>
</div>
</div>
</div>
<div>
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="SRH3" data-i18n="reaction-init-speed">Reaction, Init & Speed</div>
<div class="reaction">
<div class="table-top-left"></div>
<div class="table-top-mid" data-i18n="natural">Natural</div>
<div class="table-top-mid" data-i18n="mods">Mods</div>
<div class="table-top-right" data-i18n="final">Final</div>
<header class="table-item-left" data-i18n="reaction">Reaction:</header>
<div class="table-item">
<input type="number" name="attr_reaction" value="1" min="1">
<button type="action" name="act_attrib" class="d6-button" title="Un-augmented Reaction Test"
id="reaction">L</button>
</div>
<div class="table-item">+<input type="number" name="attr_reaction-mods" value=0 min=0></div>
<div class="table-item"> <span name="attr_reaction_max"></span>
<button type="action" name="act_attrib" class="d6-button" title="Augmented Reaction Test"
id="reaction|max">L</button>
</div>
<header class="table-item-left" data-i18n="initiative">Initiative:</header>
<div class="table-item">
<input type="number" name="attr_initiative" value="1" min="1">d6
<button type="action" name="act_init" class="d6-button" title="Unaugmented Initiative"
id="natrualinit">L</button>
</div>
<div class="table-item">+<input type="number" name="attr_initiative-mods" value=0 min=0></div>
<div class="table-item"><span name="attr_initiative_max"></span>d6<button type="action" name="act_init"
class="d6-button" title="Augmented Initiative" id="augmentedinit">L</button>
</div>
<div clsss="table-item"></div>
<div clsss="table-item"></div>
<div clsss="table-item"></div>
</div>
<div class="reaction-spirit">
<div class="table-top-left"></div>
<div class="table-top-mid" data-i18n="physical">Physical</div>
<div class="table-top-right" data-i18n="astral">Astral</div>
<header class="table-item-left" data-i18n="reaction">Reaction:</header>
<div class="table-item">
<input type="number" name="attr_reaction" value="1" min="1">
<button type="action" name="act_attrib" class="d6-button" title="Reaction Test"
id="reaction">L</button>
</div>
<div class="table-item">
<input type="number" name="attr_astralreaction" value="1" min="1">
<button type="action" name="act_attrib" class="d6-button" title="Astral Reaction Test"
id="astralreaction">L</button>
</div>
<header class="table-item-left" data-i18n="initiative">Initiative:</header>
<div class="table-item">
<input type="number" name="attr_initiative" value="1" min="1">d6+<span
name="attr_spirit-initp"></span>
<button title="Physical Initiative" class="d6-button" type="action" name="act_init"
id="spiritinit">L</button>
</div>
<div class="table-item">
<input type="number" name="attr_initiative_max" value="1" min="1">d6+<span
name="attr_astralreaction"></span>
<button title="Astral Initiative" class="d6-button" type="action" name="act_init"
id="astralinit">L</button>
</div>
</div>
<div class="walk-run">
<input type="hidden" name="attr_run" value=0 />
<input type="hidden" name="attr_walk" value=0 />
<header class="table-item-left" data-i18n="walking-rate">Walking Rate:</header>
<div class="table-item"><span class="numberspan" name="attr_walk"></span></div>
<div class="table-item" data-i18n="meters-per-combat-turn">meters per combat turn</div>
<header class="table-item-left" data-i18n="running-rate">Running Rate:</header>
<div class="table-item"><span class="numberspan" name="attr_run"></span></div>
<div class="table-item" data-i18n="meters-per-combat-turn">meters per combat turn</div>
</div>
<div class="SRH3">Dice Pools</div>
<div class="dice-pools">
<header class="table-top-left" data-i18n="pool">Pool</header>
<header class="table-top-mid" data-i18n="calculated">Calculated</header>
<header class="table-top-mid" data-i18n="mods">Mods</header>
<header class="table-top-right" data-i18n="final">Final</header>
<div class="table-item-left" data-i18n="combat">Combat</div>
<div class="table-item"><span name="attr_combatpool-base"></span></div>
<div class="table-item"><input type="number" name="attr_combatpool-mods" value=0></div>
<div class="table-item"><span name="attr_combatpool"></span></div>
<div class="table-item-left" data-i18n="spell">Spell</div>
<div class="table-item"><span name="attr_spellpool-base"></span></div>
<div class="table-item"><input type="number" name="attr_spellpool-mods" value=0></div>
<div class="table-item"><span name="attr_spellpool"></span></div>
<div class="table-item-left" data-i18n="hacking">Hacking</div>
<div class="table-item"><span name="attr_hackingpool-base"></span></div>
<div class="table-item"><input type="number" name="attr_hackingpool-mods" value=0></div>
<div class="table-item"><span name="attr_hackingpool"></span></div>
<div class="table-item-left" data-i18n="control">Control</div>
<div class="table-item"><span name="attr_controlpool-base"></span></div>
<div class="table-item"><input type="number" name="attr_controlpool-mods" value=0></div>
<div class="table-item"><span name="attr_controlpool"></span></div>
<div class="table-item-left" data-i18n="astral">Astral</div>
<div class="table-item"><span name="attr_astralpool-base"></span></div>
<div class="table-item"><input type="number" name="attr_astralpool-mods" value=0></div>
<div class="table-item"><span name="attr_astralpool"></span></div>
<div class="table-item-left" data-i18n="task">Task</div>
<div class="table-item"></div>
<div class="table-item"></div>
<div class="table-item"><input type="number" name="attr_taskpool" value=0></div>
</div>
</div>
<div class="npc-chars-only">
<div class="SRH3">Karma</div>
<div class="karma-pool">
<header class="table-top-left" data-i18n="karma-pool">Karma Pool:</header>
<div class="table-top-right karma-max">
<input type="number" name="attr_karma-pool" value=0>
/
<input type="number" name="attr_karma-pool-used" value=0>
</div>
<header class="table-item-left" data-i18n="good-karma">Good Karma:</header>
<div class="table-item"><input type="number" name="attr_karma-good" value=0 /></div>
<header class="table-item-left" data-i18n="professional-rating">Professional Rating:</header>
<div class="table-item"><input type="number" name="attr_prorating" /></div>
</div>
</div>
</div>
</div>
<div class="sheet-skills">
<!-- Skills Tab -->
<div class="SRH2" data-i18n="skills-edges-flaws">Skills/Edges/Flaws</div>
<div class="skills-edges">
<div class="text-center">
<div class="SRH4">Skills</div>
<div class="skills-table">
<header class="table-top-left" data-i18n="name">Name</header>
<header class="table-top-mid" data-i18n="rating">Rating</header>
<header class="table-top-mid" data-i18n="pool">Pool</header>
<header class="table-top-right" data-i18n="roll">Roll</header>
</div>
<fieldset class="repeating_skills">
<div class="skills-table">
<div class="table-item-left"><input type="text" name="attr_skillname" class="myweapontxt"></div>
<div class="table-item"><input type="number" name="attr_skillrating" min=1 value=1></div>
<div class="table-item"><select name="attr_pool" class="mediumselect2">
<option SELECTED value="none">None</option>
<option data-i18n="combat" value="combat">Combat</option>
<option data-i18n="task" value="task">Task</option>
<option data-i18n="hacking" value="hacking">Hacking</option>
<option data-i18n="control" value="control">Control</option>
<option data-i18n="spell" value="spell">Spell</option>
<option data-i18n="astral" value="astral">Astral</option>
</select></div>
<div class="table-item"><button class="d6-button" type="action" name="act_skills">L</button></div>
</div>
</fieldset>
</div>
<div class="text-center">
<div class="SRH4">Edges</div>
<div class="edges-table">
<header class="table-top-left" data-i18n="type">Type</header>
<header class="table-top-right" data-i18n="rating">Rating</header>
</div>
<fieldset class='repeating_edges'>
<div class="edges-table">
<div class="table-item-left"><input type="text" name="attr_name"></div>
<div class="table-item"><input type="number" name="attr_rating"></div>
</div>
</fieldset>
</div>
<div class="text-center">
<div class="SRH4">Flaws</div>
<div class="edges-table">
<header class="table-top-left" data-i18n="type">Type</header>
<header class="table-top-right" data-i18n="rating">Rating</header>
</div>
<fieldset class='repeating_flaws'>
<div class="edges-table">
<div class="table-item-left"><input type="text" name="attr_name"></div>
<div class="table-item"><input type="number" name="attr_rating"></div>
</div>
</fieldset>
</div>
</div>
</div>
<div class='sheet-magic'>
<!-- Magic Tab -->
<input type='hidden' class='magictype' name='attr_magic-type' />
<input type='hidden' name='attr_spelldefmin' value=0 />
<input type='hidden' name='attr_sorcery-used' value=0 />
<input type='hidden' name='attr_sorcery-used-total' value=0 />
<input type='hidden' name='attr_conjuring-used' value=0 />
<input type='hidden' name='attr_conjuring-used' value=0 />
<input type='hidden' name='attr_spelldefensedice-used' value=0 />
<input type='hidden' class='astralattributes-switch' name='attr_astralattributesswitch' value="show" />
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="spells-status">
<div class="spells-status-tracking">
<div></div>
<div data-i18n="stacked">Stacked</div>
<div data-i18n="sustained">Sustained</div>
<div></div>
<div data-i18n="max">Max</div>
<div data-i18n="used">Used</div>
<div></div>
<div data-i18n="max">Max</div>
<div data-i18n="defense">Defense</div>
<div data-i18n="used">Used</div>
<div></div>
<div data-i18n="max">Max</div>
<div data-i18n="defense">Defense</div>
<div data-i18n="used">Used</div>
<div></div>
<div data-i18n="max">Max</div>
<div data-i18n="used">Used</div>
<div data-i18n="spells">Spells</div>
<div><input type="number" name='attr_spellstack' class="smallnumber" min=0 value=0></div>
<div><input type="number" name='attr_spellsus' min=0 value=0></div>
<div data-i18n="spell-defense">Spell Defense</div>
<div><input type="number" name='attr_spelldefensedice' min=0 value=0></div>
<div><span name="attr_spelldefensedice-used"></span></div>
<div data-i18n="sorcery">Sorcery</div>
<div><span class="sorcery-over" name="attr_sorcery"></span></div>
<div><input type="number" name="attr_sorcery-defense" min=0 value=0></input></div>
<div>
<input type='hidden' class='sorcery-over' name='attr_sorcery-over' />
<span class="sorcery-over" name="attr_sorcery-used-total"></span>
</div>
<div data-i18n="spell-pool">Spell Pool</div>
<div><span name="attr_spellpool"></span></div>
<div><input type="number" name="attr_spellpool-defense" min=0 value=0></input></div>
<div>
<input type='hidden' class='spellpool-over' name='attr_spellpool-over' />
<span class="spellpool-over" name="attr_spellpool-used-total"></span>
</div>
<div data-i18n="conjuring">Conjuring</div>
<div><span name="attr_conjuring"></span></div>
<div><span name="attr_conjuring-used"></span></div>
</div>
<div class="spells-status-buttons">
<div title="Miscelaneous Modifiers for Spell Casting and Conjuring" data-i18n="misc-modifiers">Misc.
Modifiers: </div>
<input type="number" name='attr_spellmisc' min=0 value=0>
<div data-i18n="defend">Defend: </div><button title="Spell Defense" type="action" class="d6-button"
name='act_spelldefense' id="spelldefense">L</button>
<div data-i18n="dispell">Dispell: </div><button title="Cancel an existing spell" type="action"
class="d6-button" name='act_dispell' id="dispelling">L</button>
<div data-i18n="summon">Summon: </div><button title="Summon a Spirit or Element" type="action"
class="d6-button" name='act_conjure' id="summoning">L</button>
<div data-i18n="banish">Banish: </div><button title="Banish a Spirit or Element" type="action"
class="d6-button" name='act_conjure' id="banishing">L</button>
<div data-i18n="control">Control: </div><button title="Take Control of a Spirit or Element" type="action"
class="d6-button" name='act_conjure' id="spiritcontrol">L</button>
</div>
</div>
<div class="spells-spirit-status">
<div data-i18n="spells-stacked">Spells Stacked:</div> <input type="number" name='attr_spellstack'
class="smallnumber" min=0 value=0>
<div data-i18n="spells-sustained">Spells Sustained:</div> <input type="number" name='attr_spellsus' min=0
value=0>
<div title="Miscelaneous Modifiers for Spell Casting and Conjuring" data-i18n="misc-modifiers">Misc. Modifiers:
</div> <input type="number" name='attr_spellmisc' min=0 value=0>
<div data-i18n="dispell">Dispell: </div><button title="Cancel an existing spell" type="action" class="d6-button"
name='act_dispell' id="dispelling">L</button>
<div data-i18n="resist-banish">Resist Banish: </div><button title="Resist a Banishing action by a Mage/Shaman "
type="action" class="d6-button" name='act_resistbanish' id="resistbanish">L</button>
</div>
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="magic-tabs">
<input type='hidden' class='magictype' name='attr_magic-type' />
<input type="hidden" class="magic-tabs-switch" name="attr_magictab" value="sorcery">
<button class="magic-tabs-astral" type="action" name="act_astral-tab" data-i8n="astral-uppercase" data-i18n-title="astral-state-combat" title="Astral State and Combat">ASTRAL</button>
<button class="magic-tabs-skills" type="action" name="act_sorcery-tab" data-i8n="skills-uppercase" data-i18n-title="magic-skills-configuration" title="Magic Skills and Configuration">SKILLS</button>
<button class="magic-tabs-spells" type="action" name="act_spells-tab">SPELLS</button>
<button class="magic-tabs-conjuring" type="action" name="act_conjuring-tab">CONJURING</button>
<div class="adept-only">
<button class="magic-tabs-adept" type="action" name="act_adept-tab" data-i8n="adept-uppercase"
data-i18n-title="adept-powers" title="Adept Powers">ADEPT</button>
</div>
<button class="magic-tabs-foci" type="action" name="act_foci-tab" data-i8n="foci-uppercase">FOCI</button>
<button class="magic-tabs-initiate" type="action" name="act_initiate-tab"
data-i8n="initiate-uppercase">INITIATE</button>
<button class="magic-tabs-geas" type="action" name="act_geas-tab" data-i8n="geas-uppercase">GAES</button>
<button class="magic-tabs-totem" type="action" name="act_totem-tab" data-i8n="totem-uppercase">TOTEM</button>
<div class="tabs-empty"></div>
</div>
<div class="spirit-magic-tabs">
<input type='hidden' class='magictype' name='attr_magic-type' />
<input type="hidden" class="magic-tabs-switch" name="attr_magictab" value="astral">
<button class="magic-tabs-astral" type="action" name="act_astral-tab" data-i8n="astral-uppercase" data-i18n-title="astral-state-combat" title="Astral State and Combat">ASTRAL</button>
<button class="magic-tabs-spells" type="action" name="act_spells-tab">SPELLS</button>
<div class="tabs-empty"></div>
</div>
<input type="hidden" class="magic-tabs-switch" name="attr_magictab" value="sorcery">
<input type="hidden" name="attr_astralreaction" value=0>
<div class="astralattributes">
<br>
<div class="astralspace">
<div><b>Astral State:</div>
<select name="attr_astralstate" class="mediumselect2">
<option data-i18n="physical" value="physical" selected>Physical</option>
<option data-i18n="astral-perception" value="astral-perception">Astral Perception</option>
<option data-i18n="astral-projection" value="astral-projection">Astral Projection</option>
</select>
<header class="text-mid" data-i18n="astral-reaction">Astral Reaction:</header>
<div class="text-mid"><span class="numberspan" name="attr_astralreaction" /></div>
<div class="text-mid"><button type="action" name="act_attrib" class="d6-button" title="Astral Reaction Test"
id="astralreaction">L</button></div>
<header class="text-mid" data-i18n="astral-initiative">Astral Initiative:</header>
<div class="text-mid">1d6+<span class="numberspan" name="attr_astralreaction" /></div>
<div class="text-mid">
<button title="Astral Initiative" class="d6-button" type="action" name="act_init"
id="astralinit">L</button>
</div>
<div></div>
</div>
<div class="astralcombat">
<header data-i18n="astral-combat">Astral Combat:</header>
<div class="text-mid"><button class="attack-dice" id="astralattack" type="action" name="act_melee"
title="Astral Combat"></button></div>
<div data-i18n="weapon-focus">Weapon Focus:</div>
<div> <span name="attr_weaponfocus-name"></span></div>
<div data-i18n="enabled">Enabled</div><input type="checkbox" name="attr_weaponfocus-equipped" checked>
<div></div>
<div data-i18n="force">Force:</div>
<div><span name="attr_weaponfocus-force"></span></div>
</div>
<br>
</div>
<div class="sorcery-skills">
<br>
<div class="sorcery-config">
<div></div>
<header data-i18n="adept">Adept</header><input type="radio" name="attr_magic-type" value="adept">
<div></div>
<header data-i18n="mage">Mage</header><input type="radio" name="attr_magic-type" value="mage" selected>
<div></div>
<header data-i18n="shaman">Shaman</header><input type="radio" name="attr_magic-type" value="shaman">
<div></div>
<header data-i18n="aspected-mage">Aspected Mage</header><input type="radio" name="attr_magic-type" value="aspect">
<div></div>
</div>
<div class="sorcery-table">
<div>
<input type="checkbox" name="attr_sorcery-spec-switch" class="sorcery-spec-switch hidden-checkbox"
value=1 />
<div class="sorcery-row table-top">
<header data-i18n="sorcer">Sorcery:</header>
<input type="number" name="attr_sorcery" value=0>
<button class="d6-button" type="action" name="act_skilltest" id="sorcery spell" title="Spell Casting Test">L</button>
<div class="skillspec" data-i18n="specialize">Specialize</div>
<input type="checkbox" name="attr_sorcery-spec-switch" class="sorcery-spec-switch" value=1 />
</div>
<div class="sorcery-spec-off table-row">
<div class="magic-skills-table">
<div class="table-item-left" data-i18n="spellcasting">Spellcasting:</div>
<div class="table-item"><span name="attr_spellcasting"></span></div>
<div class="table-item-left" data-i18n="spell-defense">Spell Defense:</div>
<div class="table-item"><span name="attr_spelldefense"></span></div>
<div class="table-item-left" data-i18n="dispelling">Dispelling:</div>
<div class="table-item"><span name="attr_dispelling"></span></div>
<div class="table-item-left" data-i18n="astral-combat">Astral Combat:</div>
<div class="table-item"><span name="attr_astralcombat"></span></div>
<div class="table-item-left" data-i18n="ritual-magic">Ritual Magic:</div>
<div class="table-item"><span name="attr_ritualsorcery"></span></div>
</div>
</div>
<div class="sorcery-spec-on">
<div class="magic-skills-table table-row">
<header class="table-item-left" data-i18n="spellcasting">Spellcasting:</header>
<div class="table-item"><input type="number" name="attr_spellcasting">
<button class="d6-button" type="action" name="act_skilltest" id="spellcasting spell"
title="Spell Casting Test">L</button>
</div>
<header class="table-item-left" data-i18n="spell-defense">Spell Defense:</header>
<div class="table-item"><input type="number" name="attr_spelldefense">
<button class="d6-button" type="action" name="act_skilltest" id="spelldefense spell"
title="Spell Defense Test">L</button>
</div>
<header class="table-item-left" data-i18n="dispelling">Dispelling:</header>
<div class="table-item"><input type="number" name="attr_dispelling">
<button class="d6-button" type="action" name="act_skilltest" id="dispelling spell"
title="Dispelling Test">L</button>
</div>
<header class="table-item-left" data-i18n="astral-combat">Astral Combat:</header>
<div class="table-item"><input type="number" name="attr_astralcombat">
<button class="d6-button" type="action" name="act_skilltest" id="astralcombat astral"
title="Ritual Magic Test">L</button>
</div>
<header class="table-item-left" data-i18n="ritual-magic">Ritual Magic:</header>
<div class="table-item"><input type="number" name="attr_ritualsorcery">
<button class="d6-button" type="action" name="act_skilltest" id="ritualsorcery spell"
title="Ritual Magic Test">L</button>
</div>
</div>
</div>
</div>
<div>
<input type="checkbox" style="opacity:0;" class="conjuring-spec-switch hidden-checkbox"
name="attr_conjuring-spec-switch" value="1" />
<div class="sorcery-row table-top">
<header data-i18n="conjuring">Conjuring:</header>
<div><input type="number" name="attr_conjuring" value=0 /></div>
<div><button class="d6-button" type="action" name="act_skilltest" id="conjuring spell"
title="Spirit Conjuring/Control/Banishing Test">L</button></div>
<div class="skillspec" data-i18n="specialize">Specialize</div>
<div class="text-center"><input type="checkbox" class="conjuring-spec-switch"
name="attr_conjuring-spec-switch" value="1" /></div>
</div>
<div class="conjuring-spec-off">
<div class="magic-skills-table">
<div class="table-item-left" data-i18n="summoning">Summoning:</div>
<div class="table-item"><span name="attr_summoning">
</div>
<div class="table-item-left" data-i18n="banishing">Banishing:</div>
<div class="table-item"><span name="attr_banishing">
</div>
<div class="table-item-left" data-i18n="controlling">Controlling:</div>
<div class="table-item"><span name="attr_spiritcontrol"></div>
</div>
</div>
<div class="conjuring-spec-on">
<div class="magic-skills-table">
<header class="table-item-left" data-i18n="summoning">Summoning:</header>
<div class="table-item"><input type="number" name="attr_summoning">
<button class="d6-button" type="action" name="act_skilltest" id="summoning spell"
title="Spirit Summoning Test">L</button>
</div>
<header class="table-item-left" data-i18n="banishing">Banishing:</header>
<div class="table-item"><input type="number" name="attr_banishing">
<button class="d6-button" type="action" name="act_skilltest" id="banishing spell"
title="Spirit Banishing Test">L</button>
</div>
<header class="table-item-left" data-i18n="controlling">Controlling:</header>
<div class="table-item"><input type="number" name="attr_spiritcontrol">
<button class="d6-button" type="action" name="act_skilltest" id="spiritcontrol spell"
title="Spirit Controlling Test">L</button>
</div>
</div>
</div>
</div>
<div>
<input type="checkbox" style="opacity:0;" class="auraread-spec-switch hidden-checkbox"
name="attr_auraread-spec-switch" value="1" />
<div class="sorcery-row table-top">
<header data-i18n="aura-reading">Aura Reading:</header>
<div><input type="number" name="attr_aurareading" value=0></div>
<div><button class="d6-button" type="action" name="act_skilltest" id="aurareading spell"
title="Aura Reading Test">L</button></div>
<div class="skillspec" data-i18n="specialize">Specialize</div>
<div class="text-center"><input type="checkbox" class="auraread-spec-switch"
name="attr_auraread-spec-switch" value="1" /></div>
</div>
<div class="auraread-spec-off">
<div class="magic-skills-table">
<div class="table-item-left" data-i18n="auras">Auras:</div>
<div class="table-item"><span name="attr_areadauras">
</div>
<div class="table-item-left" data-i18n="signatures">Signatures:</div>
<div class="table-item"><span name="attr_areadsignatures">
</div>
<div class="table-item-left" data-i18n="sorcery">Sorcery:</div>
<div class="table-item"><span name="attr_areadsorcery">
</div>
<div class="table-item-left" data-i18n="conjuring">Conjuring:</div>
<div class="table-item"><span name="attr_areadconjuring">
</div>
</div>
</div>
<div class="auraread-spec-on">
<div class="magic-skills-table">
<header class="table-item-left" data-i18n="auras">Auras:</header>
<div class="table-item"><input type="number" name="attr_areadauras" value=0>
<button class="d6-button" type="action" name="act_skilltest" id="areadauras spell"
title="Aura Reading Test">L</button>
</div>
<header class="table-item-left" data-i18n="signatures">Signatures:</header>
<div class="table-item"><input type="number" name="attr_areadsignatures">
<button class="d6-button" type="action" name="act_skilltest" id="areadsignatures spell"
title="Aura Signature Reading Test">L</button>
</div>
<header class="table-item-left" data-i18n="sorcery">Sorcery:</header>
<div class="table-item"><input type="number" name="attr_areadsorcery">
<button class="d6-button" type="action" name="act_skilltest" id="areadsorcery spell"
title="Aura Sorcery Reading Test">L</button>
</div>
<header class="table-item-left" data-i18n="conjuring">Conjuring:</header>
<div class="table-item"><input type="number" name="attr_areadconjuring">
<button class="d6-button" type="action" name="act_skilltest" id="areadconjuring spell"
title="Aura Conjuring Reading Test">L</button>
</div>
</div>
</div>
</div>
<div>
<div class="magic-skills-table table-top">
<header class="text-mid" data-i18n="magic">Magic:</header>
<div class="sidebyside"><span name="attr_magic"></span><button class="d6-button" type="action"
name="act_skilltest" id="magic spell" title="Magic Test">L</button></div>
<header class="text-mid" data-i18n="drain">Drain:</header>
<div class="sidebyside"><span name="attr_willpower_max"></span><button class="d6-button"
type="action" name="act_skilltest" id="willpower|max spell" title="Drain Test">L</button>
</div>
<header class="text-mid" data-i18n="enchanting">Enchanting:</header>
<div class="sidebyside"><input type="number" name="attr_enchanting" value=0>
<button class="d6-button" type="action" name="act_skilltest" id="enchanting spell"
title="Enchanting Test">L</button>
</div>
<header class="text-mid" data-i18n="divining">Divining:</header>
<div class="sidebyside"><input type="number" name="attr_divining" value=0>
<button class="d6-button" type="action" name="act_skilltest" id="divining spell"
title="Divining Test">L</button>
</div>
<header class="text-mid" data-i18n="centering">Centering:</header>
<div class="sidebyside"><input type="number" name="attr_centering" value=0>
<button class="d6-button" type="action" name="act_skilltest" id="centering spell"
title="Centering Test">L</button>
</div>
<header class="text-mid" data-i18n="creative-skill">Creative Skill:</header>
<input type="text" name="attr_centeringskillname">
</div>
</div>
</div>
</div>
<div class="adept-only">
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="hide-spirit-critter">
<input type="hidden" class="magic-tabs-switch" name="attr_magictab" value="skills">
<div class="adept-powers">
<br>
<div class="adept-skills-table">
<header class="table-top-left" data-i18n="power">Power</header>
<header class="table-top-mid" data-i18n="rating">Rating</header>
<header class="table-top-mid" data-i18n="cost">Cost</header>
<header class="table-top-mid" data-i18n="activate">Activate</header>
<header class="table-top-right" data-i18n="notes">Notes</header>
</div>
<div class="adept-skills-table">
<header class="table-item-left" data-i18n="improved-reflexes">Improved Reflexes: </header>
<div class="table-item"><input type="number" name="attr_adeptimprovedreflexes" value=0 /></div>
<div class="table-item"><input type="number" name="attr_adeptimprovedreflexescost" value=0 /></div>
<div class="table-item"><input type="checkbox" name="attr_adeptimprovedreflexesactive"></div>
<div class="table-item"><input type="text" name="attr_adeptimprovedreflexesnotes"></div>
</div>
<div class="adept-skills-table">
<header class="table-item-left" data-i18n="body-boost">Body Boost: </header>
<div class="table-item"><input type="number" name="attr_adeptbodyboost" value=0 /></div>
<div class="table-item"><input type="number" name="attr_adeptbodyboostcost" value=0></div>
<div class="table-item"><button class="d6-button" type="action" name="act_adeptpower" id="body"
title="Boost Body">L</button></div>
<div class="table-item"><input type="text" name="attr_aadeptbodyboostnotes"></div>
</div>
<div class="adept-skills-table">
<header class="table-item-left" data-i18n="strength-boost">Strength Boost: </header>
<div class="table-item"><input type="number" name="attr_adeptstrengthboost" value=0 /></div>
<div class="table-item"><input type="number" name="attr_adeptstrengthboostcost" value=0></div>
<div class="table-item"><button class="d6-button" type="action" name="act_adeptpower" id="strength"
title="Boost Strength">L</button></div>
<div class="table-item"><input type="text" name="attr_adeptstrengthboostnotes"></div>
</div>
<div class="adept-skills-table">
<header class="table-item-left" data-i18n="agility-boost">Agility Boost: </header>
<div class="table-item"><input type="number" name="attr_adeptquicknessboost" value=0></div>
<div class="table-item"><input type="number" name="attr_adeptagilityboostcost" value=0></div>
<div class="table-item"><button class="d6-button" type="action" name="act_adeptpower" id="quickness"
title="Boost Quickness">L</button></div>
<div class="table-item"><input type="text" name="attr_aadeptagilityboostnotes"></div>
</div>
<div class="adept-skills-table">
<header class="table-item-left" data-i18n="pain-resistance">Pain Resistance: </header>
<div class="table-item"><input type="number" name="attr_adeptpainres" value=0></div>
<div class="table-item"><input type="number" name="attr_adeptpainrescost" value=0></div>
<div class="table-item"><input type="checkbox" name="attr_adeptpainresactive"></div>
<div class="table-item"><input type="text" name="attr_adeptpainresnotes"></div>
</div>
<fieldset class="repeating_adeptpowers">
<div class="adept-skills-table">
<div class="table-item-left"><input type="text" name="attr_adeptpower" style="width:150px;">
</div>
<div class="table-item"><input type="number" name="attr_powerrating" min=1 "></div>
<div class=" table-item"><input type="number" name="attr_powercost" step=0.25 min=0.25"></div>
<div class="table-item"><input type="checkbox" name="attr_poweractivated"></div>
<div class="table-item"><input type="text" name="attr_powernotes"></div>
</div>
</fieldset>
</div>
</div>
</div>
<div class="spells-section">
<br>
<div class="spells-table">
<div class="magic-spells-table">
<div class="table-top-left header" data-i18n="name">Name</div>
<div class="table-top-mid header" title="Spell Category" data-i18n="category">Category</div>
<div class="table-top-mid header" data-i18n="plus-dice-abbreviation">+Dice</div>
<div class="table-top-mid header" title="Force of spell" data-i18n="force">Force</div>
<div class="table-top-mid header" title="Reusable Foci" data-i18n="foci">Foci</div>
<div class="table-top-mid header" title="Expendable Foci" data-i18n="expendable-abbreviation">Exp.</div>
<div class="table-top-mid header" title="Mana or Physical Spell" data-i18n="type">Type</div>
<div class="table-top-mid header" title="Line of Sight, Touch or AOE" data-i18n="range">Range</div>
<div class="table-top-mid header" title="attribute to target" data-i18n="target">Target</div>
<div class="table-top-mid header" title="Spell Damage" data-i18n="damage-abbreviation">Dmg.</div>
<div class="table-top-mid header" title="Spell Durration" data-i18n="durration-abbreviation">Dur.</div>
<div class="table-top-mid header" title="+/- modifier for Force/2 drain" data-i18n="drain">Drain</div>
<div class="table-top-mid header" data-i18n="drain-damage">Drain Damage</div>
<div class="table-top-mid header" data-i18n="roll">Roll</div>
<div class="table-top-right header" data-i18n="description">Description</div>
</div>
<fieldset class="repeating_spells">
<div class="magic-spells-row">
<input class="myweapontxt" type="text" name="attr_name">
<select class="mediumselect2" name="attr_spellcategory">
<option data-i18n="combat" value="Combat" SELECTED>Combat</option>
<option data-i18n="health" value="Health">Health</option>
<option data-i18n="detection" value="Detection">Detection</option>
<option data-i18n="illusion" value="Illusion">Illusion</option>
<option data-i18n="elemental" value="Elemental">Elemental</option>
<option data-i18n="control" value="Control">Control</option>
<option data-i18n="telekinetic" value="Telekinetic">Telekinetic</option>
<option data-i18n="transformation" value="Transformation">Transformation</option>
</select>
<input type="number" name="attr_specialized" value=0>
<input type="number" name="attr_force" min="1" value=1>
<input type="number" name="attr_foci" value=0>
<input type="number" name="attr_expendable-foci" value=0>
<select name="attr_spelltype" class="mediumselect2">
<option data-i18n="mana" value="mana">Mana</option>
<option data-i18n="physical" value="physical">Physical</option>
</select>
<select class="mediumselect2" type="text" name="attr_range">
<option data-i18n="line-of-sight-acronym" value="LoS" SELECTED title="Line of Sight Spell">LoS
</option>
<option data-i18n="area-of-effect-acronym" value="AoE" title="Area of Effect Spell">AoE</option>
<option data-i18n="touch" value="Touch" title="Must Touch Target">Touch</option>
</select>
<select name="attr_target" class="mediumselect2">
<option data-i18n="body" value="@{target|Target|body|max}">Body</option>
<option data-i18n="willpower" value="@{target|Target|willpower|max}">Willpower</option>
<option data-i18n="intelligence" value="@{target|Target|intelligence|max}">Intelligence</option>
<option data-i18n="elemental" value="@{target|Target|targetMove}">Elemental</option>
<option data-i18n="target-number" value="?{Target Number|4}">Target Number</option>
<option data-i18n="force" value="@{target|Target|force}">Force</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
</select>
<select name="attr_damage" class="mediumselect2">
<option value=0 SELECTED title="Choose for non combat spell">N/A</option>
<option value="?{Damage Level|M,2|S,3|L,1|D,4|L(stun),10|M(stun),11|S(stun),12|D(stun)13}"
title="Choose Damage at time of roll, default for combat spells">Choose</option>
<option data-i18n="light" value=1>Light</option>
<option data-i18n="moderate" value=2>Moderate</option>
<option data-i18n="serious" value=3>Serious</option>
<option data-i18n="deadly" value=4>Deadly</option>
<option data-i18n="light-stun-abbreviation" value=10>Light(s)</option>
<option data-i18n="moderate-stun-abbreviation" value=11>Moderate(s)</option>
<option data-i18n="serious-stun-abbreviation" value=12>Serious(s)</option>
<option data-i18n="deadly-stun-abbreviation" value=13>Deadly(s)</option>
</select>
<select name="attr_duration" class="mediumselect2">
<option data-i18n="instant-abbreviation" value="I" SELECTED>I</option>
<option data-i18n="sustained-abbreviation" value="S">S</option>
<option data-i18n="permanent-abbreviation" value="P">P</option>
</select>
<input type="number" title="modifier to force/2 for drain resistance test" name="attr_drain"
value=0>
<select name="attr_drainlvl" class="mediumselect2">
<option data-i18n="light" value=1>Light</option>
<option data-i18n="damage-level" value="dmglvl" SELECTED>Damage Lvl</option>
<option data-i18n="medium" value=2>Medium</option>
<option data-i18n="serious" value=3>Serious</option>
<option data-i18n="deadly" value=4>Deadly</option>
<option data-i18n="damage-level-add-1"
title="stages drain damage up 1 level from damage level of spell" value="dmglvl + 1">Damage
+1</option>
<option data-i18n="damage-level-add-2"
title="stages drain damage up 2levels from damage level of spell" value="dmglvl + 2">Damage
+2</option>
<option data-i18n="damage-level-subtract-1"
title="stages drain damage down 1 level from damage level of spell" value="dmglvl - 1">
Damage -1</option>
<option data-i18n="damage-level-subtract-2"
title="stages drain damage down 2 levels from damage level of spell" value="dmglvl - 2">
Damage -2</option>
</select>
<button class="d6-button" type="action" name="act_cast" id="spell" title="Cast Spell">L</button>
<input type="text" name="attr_description" class="myweapontxt2">
</div>
</fieldset>
</div>
<br>
</div>
<div class="fetish-foci">
<br>
<div class="foci-table">
<header class="table-top-left" data-i18n="type">Type</header>
<header class="table-top-mid" data-i18n="category">Category</header>
<header class="table-top-mid" data-i18n="force">Force</header>
<header class="table-top-right" data-i18n="quantity">Quantity</header>
</div>
<fieldset class="repeating_foci">
<div class="foci-table">
<select name="attr_type" class="mediumselect2">
<option data-i18n="none" value="none"></option>
<option data-i18n="expendable" value="expendable">Expendable</option>
<option data-i18n="reusable" value="reusable">Reusable</option>
<option data-i18n="power-focus" value="power">Power Focus</option>
<option data-i18n="spirit-focus" value="spirit">Spirit Focus</option>
</select>
<input type='hidden' class='focitype' name='attr_type' />
<div class="powerfocus">
<input name="attr_category" disabled value="power" />
</div>
<div class="reusable">
<select name="attr_category" class="mediumselect2">
<option data-i18n="none" value="none"></option>
<option data-i18n="combat" value="combat">Combat</option>
<option data-i18n="health" value="health">Health</option>
<option data-i18n="detection" value="detection">Detection</option>
<option data-i18n="illusion" value="illusion">Illusion</option>
<option data-i18n="manipulation" value="manipulation">Manipulation</option>
</select>
</div>
<div class="spiritfocus">
<input type='hidden' class='magictype' name='attr_magic-type' />
<div class="mage-foci"><select name="attr_category" class="mage-foci mediumselect2">
<option data-i18n="none" value="none"></option>
<option data-i18n="fire" value="fire-elem-focus">Fire</option>
<option data-i18n="water" value="water-elem-focus">Water</option>
<option data-i18n="earth" value="earth-elem-focus">Earth</option>
<option data-i18n="air" value="air-elem-focus">Air</option>
<option data-i18n="city-sprit" value="city-spirit-focus">City Spirit</option>
<option data-i18n="field-sprit" value="field-spirit-focus">Field Spirit</option>
<option data-i18n="hearth-sprit" value="hearth-spirit-focus">Hearth Spirit</option>
<option data-i18n="desert-sprit" value="desert-spirit-focus">Desert Spirit</option>
<option data-i18n="forest-sprit" value="forest-spirit-focus">Forest Spirit</option>
<option data-i18n="mountain-sprit" value="mountain-spirit-focus">Mountain Spirit</option>
<option data-i18n="prairie-sprit" value="prairie-spirit-focus">Prairie Spirit</option>
<option data-i18n="mist-sprit" value="mist-spirit-focus">Mist Spirit</option>
<option data-i18n="storm-sprit" value="storm-spirit-focus">Storm Spirit</option>
<option data-i18n="wind-sprit" value="wind-spirit-focus">Wind Spirit</option>
<option data-i18n="lake-sprit" value="lake-spirit-focus">Lake Spirit</option>
<option data-i18n="river-sprit" value="river-spirit-focus">River Spirit</option>
<option data-i18n="sea-sprit" value="sea-spirit-focus">Sea Spirit</option>
<option data-i18n="gnome" value="gnome-spirit-focus">Gnome</option>
<option data-i18n="manitous" value="manitous-spirit-focus">Manitous</option>
<option data-i18n="salamander" value="salamander-spirit-focus">Salamander</option>
<option data-i18n="sylphs" value="sylphs-spirit-focus">Sylphs</option>
<option data-i18n="ancestor" value="ancestor-spirit-focus">Ancestor</option>
</select></div>
</div>
<input type="number" name="attr_force" value=0 min=0 />
<div class="expendable-foci">
<input type="number" name="attr_qty" value=0 min=0 />
</div>
<div class="reusable-foci">
<input type="number" name="attr_qty" value=1 disabled />
</div>
<input type='hidden' name='attr_fociresource' />
</div>
</fieldset>
<br>
<input type='hidden' class='weaponfocus-show' name='attr_weaponfocus-show' value="false" />
<div class="weaponfocus-header">
<div class="table-top-left" data-i18n="equip">Equip</div>
<div class="table-top-mid" data-i18n="name">Name</div>
<div class="table-top-mid" data-i18n="reach">Reach</div>
<div class="table-top-mid" data-i18n="skill">Skill</div>
<div class="table-top-mid" data-i18n="conceal">Conceal</div>
<div class="table-top-mid" data-i18n="force">Force</div>
<div class="table-top-mid" data-i18n="power">Power</div>
<div class="table-top-mid" data-i18n="damage">Damage</div>
<div class="table-top-mid" data-i18n="plus-dice-abbreviation">+Dice</div>
<div class="table-top-mid" data-i18n="plus-target-number-abberviation">+TN</div>
<div class="table-top-mid" data-i18n="attack">Attack</div>
<div class="table-top-right" data-i18n="notes">Notes</div>
</div>
<div class="weaponfocus-attributes">
<div class="text-mid"><input type="checkbox" name="attr_weaponfocus-equipped" checked></div>
<input class="myweapontxt" type="text" name="attr_weaponfocus-name" value="Weapon Focus">
<input type="number" name="attr_weaponfocus-reach" value=0>
<select class="mediumselect2" name="attr_weaponfocus skill">
<option value="@{edged}" SELECTED data-i18n="edged">Edged</option>
<option value="@{clubs}" data-i18n="club">Club</option>
<option value="@{poles}" data-i18n="pole-arm">Pole Arm</option>
<option value="@{whips}" data-i18n="whip">Whip</option>
</select>
<input type="number" name="attr_weaponfocus-conceal" value=0>
<input type="number" name="attr_weaponfocus-force" value=0>
<input type="number" name="attr_weaponfocus-power" value=0>
<select name="attr_weaponfocus-damage" class="mediumselect2">
<option data-i18n="light-damage-abbreviation">L</option>
<option data-i18n="moderate-damage-abbreviation" SELECTED>M</option>
<option data-i18n="serious-damage-abbreviation">S</option>
<option data-i18n="deadly-damage-abbreviation">D</option>
</select>
<input type="number" name="attr_weaponfocus-specialized" value=0 \>
<input type="number" name="attr_weaponfocus-tnmods" value=0 \>
<div><button class="attack-dice" id="weaponfocus" type="action" name="act_melee"
title="Melee Attack"></button></div>
<input class="myweapontxt" type="text" name="attr_weaponfocus-notes">
</div>
</div>
<div class="magicinitiate">
<br>
<div class="magicinitiate-level">
<div class="SRH4" data-i18n="initiate-grade">Initiate Grade:</div>
<input type="number" name="attr_initiategrade" value=0>
</div>
<div class="metamagic-table">
<header class="table-top-left" data-i18n="metamagic">Metamagic</header>
<header class="table-top-right" data-i18n="notes">Notes</header>
</div>
<fieldset class="repeating_metamagic">
<div class="metamagic-table">
<div class="table-item-left"><input type="text" name="attr_metamagicname" /></div>
<div class="table-item"><input type="text" name="attr_metamagicnotes" /></div>
</div>
</fieldset>
<br>
</div>
<div class="geas">
<br>
<div class="geas-table">
<header class="table-top-left" data-i18n="geas-type">Geas Type</header>
<header class="table-top-right" data-i18n="geas-notes">Geas Notes</header>
</div>
<fieldset class='repeating_geas'>
<div class="geas-table">
<div class="table-item-left"><input type="text" name="attr_geastype"></div>
<div class="table-item"><input type="text" name="attr_geasnotes"></div>
</div>
</fieldset>
<br>
</div>
<div class="totem">
<br>
<div class="totem-table">
<header class="table-top-left" data-i18n="totem">Totem</header>
<header class="table-top-mid" data-i18n="environment">Environment</header>
<header class="table-top-mid" data-i18n="advantages">Advantages</header>
<header class="table-top-right" data-i18n="disadvantages">Disadvantages</header>
<div class="table-item-left"><input type='text' name="attr_totem" class="myweapontxt2"></div>
<div class="table-item"><input type='text' name="attr_totemenv" class="myweapontxt2"></div>
<div class="table-item"><input type="text" name="attr_totemadv" class="myweapontxt2"></div>
<div class="table-item"><input type="text" name="attr_totemdisadv" class="myweapontxt2"></div>
</div>
</div>
<div class="conjuring">
<br>
<div class="conjuring-table">
<div class="table-top-left header" data-i18n="spirit-name">Spirit Name</div>
<div class="table-top-mid header" data-i18n="spirit-type">Spirit Type</div>
<div class="table-top-mid header" data-i18n="force">Force</div>
<div class="table-top-mid header" data-i18n="fetish">Fetish</div>
<div class="table-top-mid header" data-i18n="expendable">Expendable</div>
<div class="table-top-mid header" data-i18n="summon">Summon</div>
<div class="table-top-right header" data-i18n="banish">Banish</div>
</div>
<fieldset class='repeating_conjuring'>
<div class="conjuring-table">
<input type="text" name="name">
<select name="attr_type" class="conjuring-type">
<option data-i18n="watcher">Watcher</option>
<option data-i18n="air-elemental">Air Elemental</option>
<option data-i18n="water-elemental">Water Elemental</option>
<option data-i18n="earth-elemental">Earth Elemental</option>
<option data-i18n="fire-elemental">Fire Elemental</option>
<option data-i18n="city-spirit">City Spirit</option>
<option data-i18n="field-spirit">Field Spirit</option>
<option data-i18n="hearth-spirit">Hearth Spirit</option>
<option data-i18n="desert-spirit">Desert Spirit</option>
<option data-i18n="forest-spirit">Forest Spirit</option>
<option data-i18n="mountain-spirit">Mountain Spirit</option>
<option data-i18n="prairie-spirit">Prairie Spirit</option>
<option data-i18n="mist-spirit">Mist Spirit</option>
<option data-i18n="storm-spirit">Storm Spirit</option>
<option data-i18n="wind-spirit">Wind Spirit</option>
<option data-i18n="lake-spirit">Lake Spirit</option>
<option data-i18n="river-spirit">River Spirit</option>
<option data-i18n="sea-spirit">Sea Spirit</option>
<option data-i18n="gnome">Gnome</option>
<option data-i18n="manitous">Manitous</option>
<option data-i18n="salamander">Salamander</option>
<option data-i18n="sylph">Sylphs</option>
<option data-i18n="ancestor">Ancestor</option>
</select>
<input type="number" value=1 name="attr_force">
<input type="number" value=0 name="attr_fetish">
<input type="number" value=0 name="attr_expendable">
<button class="pictos-button" data-i18n-title="summon-spirit" title="summon spirit" type="action"
id="summons" name="act_conjure-spirit">L</button>
<button class="pictos-button" data-i18n-title="banish-spirit" title="banish spirit" type="action"
id="banish" name="act_conjure-spirit">L</button>
</div>
</fieldset>
</div>
</div>
</div>
<div class='sheet-decks'>
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<!--Decks Tab -->
<div class="matrix-show-deck">
<div class="SRH2" data-i18n="cyberdecks-and-utilities">Cyberdecks and Utilities</div>
</div>
<div class="matrix-show-frame">
<div class="SRH2" data-i18n="smart-frames-and-agents">Smart Frames and Agents</div>
</div>
<div class="deck-combat">
<div>
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="SRH3" data-i18n="cyber-combat">Cyber Combat</div>
<div></div>
<div class="matrix-combat-condition">
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="matrix-show-deck">
<div class="SRH4" data-i18n="persona">Persona</div>
</div>
<div class="matrix-show-frame">
<div class="SRH4" data-i18n="core">Core</div>
</div>
<div data-i18n="undamaged">Undamaged</div>
<div data-i18n="light-damage">Light Damage</div>
<div data-i18n="moderate-damage">Moderate Damage</div>
<div data-i18n="serious-damage">Serious Damage</div>
<div data-i18n="crashed">Crashed</div>
<div class="SRH4" data-i18n="condition">Condition</div>
<div>
<input type="radio" name="attr_matrix-damage" value=0 CHECKED>
</div>
<div>
<input type="radio" name="attr_matrix-damage" value=1>
<input type="radio" name="attr_matrix-damage" value=2>
</div>
<div>
<input type="radio" name="attr_matrix-damage" value=3>
<input type="radio" name="attr_matrix-damage" value=4>
<input type="radio" name="attr_matrix-damage" value=5>
</div>
<div>
<input type="radio" name="attr_matrix-damage" value=6>
<input type="radio" name="attr_matrix-damage" value=7>
<input type="radio" name="attr_matrix-damage" value=8>
<input type="radio" name="attr_matrix-damage" value=9>
</div>
<div><input type="radio" name="attr_matrix-damage" value=100></div>
</div>
<div><input type="hidden" name="attr_hackingpool-icsuppress" value=0></div>
<div class="matrix-show-deck">
<div class="deck-summary">
<div class="text-mid">DNI</div>
<div data-i18n="hot-asist">Hot ASIST</div>
<div data-i18n="reality-filter">Reality Filter</div>
<div data-i18n="ic-suppressed">IC Suppressed</div>
<div class="text-mid" data-i18n="icon-status">Icon Status</div>
<div class="text-mid" data-i18n="host-grid-rating">Host/Grid Rating</div>
<div><input checked="checked" type="checkbox" name="attr_deck-dni" value=1></div>
<div><input type="checkbox" name="attr_deck-asist" value=1> </div>
<div><input type="checkbox" name="attr_deck-realityfilter" value=1></div>
<div><input type="number" name="attr_deck-icsuppressed" value=0></div>
<select name="attr_matrix-iconstatus" class="mediumselect2">
<option data-i18n="intruder" value="Intruder" SELECTED>Intruder</option>
<option data-i18n="legitimate" value="Legitimate">Legitimate</option>
</select>
<select name="attr_deck-systemrating" class="mediumselect2">
<option data-i18n="unknown" value="Unknown" SELECTED>Unknown</option>
<option data-i18n="blue" value="Blue">Blue</option>
<option data-i18n="green" value="Green">Green</option>
<option data-i18n="orange" value="Orange">Orange</option>
<option data-i18n="red" value="Red">Red</option>
</select>
</div>
</div>
<div class="matrix-show-frame">
<div class="frame-summary">
<div data-i18n="pilot-rating">Pilot Rating</div>
<div data-i18n="utility-payload">Utility Payload</div>
<div data-i18n="ic-suppressed">IC Suppressed</div>
<div class="text-mid" data-i18n="icon-status">Icon Status</div>
<div class="text-mid" data-i18n="host-grid-rating">Host/Grid Rating</div>
<div><input type="number" name="attr_decking" min=0 value=0> </div>
<div><input type="number" name="attr_deck-utilitypayload" min=0 value=0></div>
<div><input type="number" name="attr_deck-icsuppressed" min=0 value=0></div>
<select name="attr_matrix-iconstatus" style="width: 85px;">
<option data-i18n="intruder" value="Intruder" SELECTED>Intruder</option>
<option data-i18n="legitimate" value="Legitimate">Legitimate</option>
</select>
<select name="attr_deck-systemrating" class="mediumselect2">
<option data-i18n="unknown" value="Unknown" SELECTED>Unknown</option>
<option data-i18n="blue" value="Blue">Blue</option>
<option data-i18n="green" value="Green">Green</option>
<option data-i18n="orange" value="Orange">Orange</option>
<option data-i18n="red" value="Red">Red</option>
</select>
</div>
</div>
<input type='hidden' name='attr_deck-tn' value=0 />
<input type='hidden' name='attr_deck-util-size-loaded' value=0 />
<input type='hidden' name='attr_deck-util-rating-loaded' value=0 />
<input type='hidden' name='attr_deck-tn' value=0 />
<input type='hidden' name='attr_deck-initiative' value=0 />
<div class="deck-combat-system">
<div data-i18n="initiative">Initiative</div><span name=attr_deck-initiative></span>d6 + <span
name=attr_deck-reaction-final></span>
<button type="action" name="act_init" class="d6-button" title="Matrix Initiative"
id="matrixinit">L</button>
<div data-i18n="end-turn">End Turn</div><button type="action" name="act_endturn" class="d6-button" title="End Combat Turn" id="endturn">L</button>
<div data-i18n="attack">Attack></div><div><button type="action" name="act_matrixattack" class="pictos-custom-attack" title="Execute Attack vs. System Code or Icon" id="deckattack">[</button></div>
<div data-i18n="evade">Evade</div><button type="action" name="act_matrixmaneuvers" class="d6-button" title="Evade Detection" id="matrixevade">L</button>
<div data-i18n="parry">Parry</div><button type="action" name="act_matrixmaneuvers" class="d6-button" title="Parry Attack" id="matrixparry">L</button>
<div data-i18n="position">Posistion</div><button type="action" name="act_matrixmaneuvers"
class="d6-button" title="Position Attack" id="matrixposition">L</button>
</div>
<div class="deck-combat-system2">
<div class="numberspan" data-i18n="combat-tn">Combat TN</div><span name="attr_deck-tn"></span>
<div></div>
<div data-i18n="resist">Resist</div><div><button type="action" name="act_matrixresist" class="pictos3-button" title="Damage Resistance Test" id="matrixresist">b</button></div>
<div></div>
<div data-i18n="medic">Medic</div><div><button type="action" name="act_matrixmedic" class="pictos-button" title="Medic Utility" id="matrixmedic">k</button></div>
<div></div>
<div data-i18n="decking">Decking</div><button type="action" name="act_matrixtest" class="d6-button"
title="General Decking Test" id="decking">L</button>
<div></div>
<div data-i18n="hardening">Hardening</div> <span name="attr_deck-hardening"> </span>
<div></div>
<div data-i18n="armor">Armor</div> <span name="attr_deckarmor-rating-final"> </span>
<div></div>
</div>
<br>
<div class="hack-pool-option">
<div data-i18n="use-hacking-pool-for-ic-supression">Use Hacking Pool for IC supression</div><input
type="checkbox" name="attr_deck-icsuppresspool" value=1 checked="checked">
</div>
</div>
<div>
<div class="deck-summary-attributes">
<div></div>
<div></div>
<div data-i18n="full">Full</div>
<div data-i18n="mods">Mods</div>
<div data-i18n="final">Final</div>
<div class="mpcp-frame-toggle"><input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="matrix-show-deck">MPCP</div>
<div class="matrix-show-frame" data-i18n="core">Core</div>
</div>
<div><button type="action" name="act_matrixtest" class="d6-button" title="MPCP Test"
id="deck-mpcp-final">L</button></div>
<div><span name="attr_deck-mpcp-max"></span></div>
<div><input type="number" name="attr_deck-mpcp-mods" value=0></div>
<div><span name="attr_deck-mpcp-final"></span></div>
<div data-i18n="bod">Bod</div>
<div><button type="action" name="act_matrixtest" class="d6-button" title="Bod Test"
id="deck-bod-final">L</button></div>
<div> <span name="attr_deck-bod-max"></span></div>
<div><input type="number" name="attr_deck-bod-mods" value=0></div>
<div><span name="attr_deck-bod-final"></span></div>
<div data-i18n="evasion">Evasion</div>
<div><button type="action" name="act_matrixtest" class="d6-button" title="Evasion Test"
id="deck-evasion-final">L</button></div>
<div> <span name="attr_deck-evasion-max"></span></div>
<div><input type="number" name="attr_deck-evasion-mods" value=0></div>
<div><span name="attr_deck-evasion-final"></span></div>
<div data-i18n="masking">Masking</div>
<div><button type="action" name="act_matrixtest" class="d6-button" title="Masking Test"
id="deck-masking-final">L</button></div>
<div> <span name="attr_deck-masking-max"></span></div>
<div><input type="number" name="attr_deck-masking-mods" value=0></div>
<div><span name="attr_deck-masking-final"></span></div>
<div data-i18n="sensors">Sensors</div>
<div><button type="action" name="act_matrixtest" class="d6-button" title="Sensors Test" id="deck-sensors-final">L</button></div>
<div> <span name="attr_deck-sensors-max"></span></div>
<div><input type="number" name="attr_deck-sensors-mods" value=0></div>
<div><span name="attr_deck-sensors-final"></span></div>
<div data-i18n="detection-factor-abbreviation" title="Detection Factor">Detect.F</div>
<div></div>
<div title="Detection Factor Maximum"> <span name="attr_deck-detection-max"></span></div>
<div><input type="number" name="attr_deck-detection-mods" value=0></div>
<div title="Detection Factor Final Modified Number"><span name="attr_deck-detection-final"></span></div>
</div>
</div>
</div>
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="matrix-show-deck">
<div class='deck-memory-used'>
<input type='hidden' class='matrix-status' name='attr_matrix-status' value="out" />
<div data-i18n="jack-in">Jack In</div><button class="pictos-button matrix-status" type="action"
name="act_jackin">Q</button>
<div></div>
<div data-i18n="memory-in-use">Memory In Use:</div>
<div><input type='hidden' class='deck-mem-full' name='attr_deck-mem-overloaded' value=0 />
<span class="deck-overload" name="attr_deck-util-size-loaded"></span>
</div>
<div>/<span name="attr_deck-activemem"></div>
<div><button class="switch-button-hide" title="unload all utilities" type="action"
name="act_deck-utilities-unloadall" data-i18n="reset">Reset</button></div>
<div></div>
<div data-i18n="hacking-pool">Hacking Pool:</div>
<div><span name="attr_hackingpool"></span></div>
<div></div>
<div data-i18n="hacking-pool-used">Hacking Pool Used:</div>
<input type='hidden' class='hackingpool-over' name='attr_hackingpool-over' /> <span class="hackingpool-over"
name="attr_hackingpool-used"></span>
<input type='hidden' name='attr_matrix-penalty' value=0 />
<div></div>
<div data-i18n="penalties">Penalties:</div>
<div><span class="matrix-pens" name="attr_matrix-penalty"></span></div>
</div>
</div>
<input type="hidden" class="decking-tabs-switch" name="attr_deckingtab" value="decking">
<div class="decking-tabs">
<input type='hidden' class='buttontoggle' name='attr_sheettype' value="Character">
<input type="hidden" class="decking-tabs-switch" name="attr_deckingtab" value="decking">
<button class="decking-tabs-cyberdeck" type="action" name="act_cyberdeck-tab" data-i8n="cyberdeck-uppercase" data-i18n-title="cyberdeck-configuration" title="Cyberdeck Configuration">CYBERDECK</button>
<button class="decking-tabs-skills" type="action" name="act_decking-tab" data-i8n="computer-skills-uppercase" data-i18n-title="computer-skills" title="Computer Skills">COMPUTER SKILLS</button>
<button class="decking-tabs-frame" type="action" name="act_frame-tab" data-i8n="frame-core-uppercase" data-i18n-title="frame-configuration" title="Frame Configuration">FRAME CORE</button>
<button class="decking-tabs-utilities" type="action" name="act_utilities-tab" data-i8n="utilities-uppercase" data-i18n-title="utilities-configuration" title="Utilities Configuration">UTILITIES</button>
<div class="tabs-empty"></div>
</div>
<div class="deck-skills">
<div class="deck-skills-row table-top">
<header data-i18n="computer">Computer</header>
<input type="number" name="attr_computer" value=0>
<button class="d6-dice" type="action" name="act_skilltest" id="computer hacking"></button>
<div data-i18n="specialize">specialize</div>
<input type="checkbox" class="deck-spec-switch" name="attr_deck-spec-switch" value=1>
</div>
<input type="checkbox" class="deck-spec-switch hidden-checkbox" name="attr_deck-spec-switch" value=1>
<div class="deck-spec-off">
<div data-i18n="hardware" class="table-item-left">Hardware</div>
<div class="table-item"><span name="attr_computer"></div>
<div data-i18n="decking" class="table-item-left">Decking</div>
<div class="table-item"><span name="attr_computer"></div>
<div data-i18n="programming" class="table-item-left">Programming</div>
<div class="table-item"><span name="attr_computer"></div>
</div>
<div class="deck-spec-on">
<div data-i18n="hardware" class="table-item-left">Hardware</div>
<div class="table-item"><input type="number" name="attr_hardware">
<button class="d6-dice" type="action" name="act_skilltest" id="hardware hacking"></button>
</div>
<div data-i18n="decking" class="table-item-left">Decking</div>
<div class="table-item"><input type="number" name="attr_decking">
<button class="d6-dice" type="action" name="act_skilltest" id="decking hacking"></button>
</div>
<div data-i18n="programming" class="table-item-left">Programming</div>
<div class="table-item"><input type="number" name="attr_programming">
<button class="d6-dice" type="action" name="act_skilltest" id="programming hacking"></button>
</div>
</div>
</div>
<div class="deck-cyberdeck">
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="matrix-show-deck">
<div class="deck-attributes">
<div class="deck-name">
<div data-i18n="deck-name">Deck Name</div><input type=text name="attr_deck-name">
</div>
<div class="deck-persona">
<div>MPCP</div>
<input type="number" name="attr_deck-mpcp-max" value=0 min=0>
<input type="hidden" name="attr_deck-maxpersona" value=0>
<div data-i18n="bod">Bod</div>
<input type="number" name="attr_deck-bod-max" value=0 min=0>
<div data-i18n="evasion">Evasion</div>
<input type="number" name="attr_deck-evasion-max" value=0 min=0>
<div data-i18n="masking">Masking</div>
<input type="number" name="attr_deck-masking-max" value=0 min=0>
<div data-i18n="sensors">Sensors</div>
<input type="number" name="attr_deck-sensors-max" value=0 min=0>
</div>
<div class="deck-cyberdeck-specs">
<div data-i18n="hardening">Hardening</div>
<input type="number" name="attr_deck-hardening" value=0 min=0>
<div data-i18n="active-memory">Active Memory</div>
<input type="number" name="attr_deck-activemem" value=0 min=0>
<div data-i18n="storage-memory">Storage Memory</div>
<input type="number" name="attr_deck-storagemem" value=0 min=0>
<div data-i18n="io-speed">I/O Speed</div>
<input type="number" name="attr_deck-iospeed" value=0 min=0>
<div data-i18n="response-increase">Response Increase</div>
<input type="number" name="attr_deck-response" value=0 min=0>
<div>ICCM</div>
<input type="number" name="attr_deck-iccm" value=0 min=0>
<div data-i18n="offline-storage">Offline Storage</div>
<input type="number" name="attr_deck-offlinestorage" value=0 min=0>
</div>
<div class="deck-extras">
<div>Notes</div>
<textarea name="attr_deck-notes" style='width:300px;height:50%;margin-bottom:unset;'></textarea>
</div>
</div>
</div>
<div class="matrix-show-frame">
<div class="deck-attributes">
<div class="frame-core">
<div data-i18n="type">Type</div>
<div><select name="attr_frametype" style="width: 115px;">
<option value="Smart Frame" data-i18n="smart-frame">Smart Frame</option>
<option value="Agent" selected data-i18n="agent">Agent</option>
</select>
</div>
<div data-i18n="core-rating">Core Rating</div>
<div><input type="number" name="attr_frame-core" value=0 min=0></div>
<input type="hidden" name="attr_deck-maxpersona" value=0>
<div data-i18n="utility-payload">Utility Payload</div>
<div><input type="number" name="attr_deck-utilitypayload" value=0 min=0></div>
<div data-i18n="pilot">Pilot</div>
<div><input type="number" name="attr_decking" value=0 min=0></div>
<div data-i18n="initiative">Initiative</div>
<div><input type="number" name="attr_frame-initiative" value=0 min=0></div>
</div>
<div class="frame-attributes">
<div data-i18n="bod">Bod</div>
<input type="number" name="attr_deck-bod-max" value=0 min=0>
<div data-i18n="evasion">Evasion</div>
<input type="number" name="attr_deck-evasion-max" value=0 min=0>
<div data-i18n="masking">Masking</div>
<input type="number" name="attr_deck-masking-max" value=0 min=0>
<div data-i18n="sensors">Sensors</div>
<input type="number" name="attr_deck-sensors-max" value=0 min=0>
</div>
</div>
</div>
</div>
<div class="deck-utilities">
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="matrix-show-frame">
<div class='frame-util-used'>
<label data-i18n="utility-rating-sum">Utility Rating Sum</label>
<div><input type='hidden' class='frame-utility-full' name='attr_deck-util-overloaded' value=0 />
<span class="frame-overload" name="attr_deck-util-rating-loaded"></span>
</div>
<button class="switch-button-hide" type="action" name="act_deck-utilities-unloadall">Reset</button>
</div>
<div></div>
</div>
<div>
<div>
<div class="SRH4" data-i18n="special-utilities">Special Utilities</div>
<div class="deck-utilities-special">
<header data-i18n="utility" class="table-top-left">Utility</header>
<header data-i18n="rating" class="table-top-mid">Rating</header>
<header data-i18n="multiple" class="table-top-mid">Multiplier</header>
<header data-i18n="size" class="table-top-mid">Size</header>
<header data-i18n="loaded" class="table-top-mid">Loaded</header>
<header data-i18n="effective-rating" class="table-top-mid">Effective Rating</header>
<header data-i18n="test" class="table-top-mid">Test</header>
<header data-i18n="swap-memory" class="table-top-mid">Swap Memory</header>
<header data-i18n="notes" class="table-top-right">Notes</header>
<div data-i18n="sleaze" class="table-item-left">Sleaze</div>
<div class="table-item"><input type="number" name="attr_decksleaze-rating" value=0></div>
<div class="table-item"><input type="number" name="attr_decksleaze-multiplier" value=3></div>
<div class="table-item"><input type="number" name="attr_decksleaze-size" value=0></div>
<div class="table-item"><input type="checkbox" name="attr_decksleaze-loaded" class="text-mid"
value=1></div>
<div class="table-item"><input type="number" name="attr_decksleaze-rating-final" value=0></div>
<div class="table-item"><button type="action" name="act_matrixtest" class="pictos-button" title="Sleaze Utility Test" id="decksleaze-rating-final">2</button></div>
<div class="table-item"><button type="action" name="act_swapmemory" class="pictos-button" title="Reload Sleaze Utility from Disk" id="decksleaze-rating">0</button></div>
<div class="table-item"><input type="text" name="attr_decksleaze-notes"></div>
<div data-i18n="track" class="table-item-left">Track</div>
<div class="table-item"><input type="number" name="attr_decktrack-rating" value=0></div>
<div class="table-item"><input type="number" name="attr_decktrack-multiplier" value=8></div>
<div class="table-item"><input type="number" name="attr_decktrack-size" value=0></div>
<div class="table-item"><input type="checkbox" name="attr_decktrack-loaded" class="text-mid"
value=1></div>
<div class="table-item"><input type="number" name="attr_decktrack-rating-final" value=0></div>
<div class="table-item"><button type="action" name="act_matrixtest" class="pictos-button" title="Tracking Utility Test" id="decktrack-rating-final">2</button></div>
<div class="table-item"><button type="action" name="act_swapmemory" class="pictos-button" title="Reload Tracking Utility from Disk" id="decktrack-rating">0</button></div>
<div class="table-item"><input type="text" name="attr_decktrack-notes"></div>
</div>
<div data-i18n="defensive-utilities" class="SRH4">Defensive Utilities</div>
<div class="deck-utilities-defensive">
<header data-i18n="utility" class="table-top-left">Utility</header>
<header data-i18n="rating" class="table-top-mid">Rating</header>
<header data-i18n="multiplier" class="table-top-mid">Multiplier</header>
<header data-i18n="size" class="table-top-mid">size</header>
<header data-i18n="loaded" class="table-top-mid">loaded</header>
<header data-i18n="effective-rating" class="table-top-mid">Effective Rating</header>
<header data-i18n="test" class="table-top-mid">Test</header>
<header data-i18n="swap-memory" class="table-top-mid">Swap Memory</header>
<header data-i18n="notes" class="table-top-right">Notes</header>
<div data-i18n="armor" class="table-item-left">Armor</div>
<div class="table-item"><input type="number" name="attr_deckarmor-rating" value=0></div>
<div class="table-item"><input type="number" name="attr_deckarmor-multiplier" value=3></div>
<div class="table-item"><input type="number" name="attr_deckarmor-size" value=0></div>
<div class="table-item"><input type="checkbox" name="attr_deckarmor-loaded" class="text-mid"
value=1></div>
<div class="table-item"><input type="number" name="attr_deckarmor-rating-final" value=0></div>
<div class="table-item"><button type="action" name="act_matrixtest" class="pictos-button" title="Armor Utility Test" id="deckarmor-rating-final">2</button></div>
<div class="table-item"><button type="action" name="act_swapmemory" class="pictos-button" title="Reload Armor Utility from Disk" id="deckarmor-rating">0</button></div>
<div class="table-item"><input type="text" name="attr_deckarmor-notes"></div>
<div data-i18n="cloak" class="table-item-left">Cloak</div>
<div class="table-item"><input type="number" name="attr_deckcloak-rating" value=0></div>
<div class="table-item"><input type="number" name="attr_deckcloak-multiplier" value=3></div>
<div class="table-item"><input type="number" name="attr_deckcloak-size" value=0></div>
<div class="table-item"><input type="checkbox" name="attr_deckcloak-loaded" class="text-mid"
value=1> </div>
<div class="table-item"><input type="number" name="attr_deckcloak-rating-final" value=0></div>
<div class="table-item"><button type="action" name="act_matrixtest" class="pictos-button" title="Cloak Utility Test" id="deckcloak-rating-final">2</button></div>
<div class="table-item"><button type="action" name="act_swapmemory" class="pictos-button"
title="Reload Cloak Utility from Disk" id="deckcloak-rating">0</button></div>
<div class="table-item"><input type="text" name="attr_deckcloak-notes"></div>
<div data-i18n="lock-on" class="table-item-left">Lock-On</div>
<div class="table-item"><input type="number" name="attr_decklockon-rating" value=0></div>
<div class="table-item"><input type="number" name="attr_decklockon-multiplier" value=3></div>
<div class="table-item"><input type="number" name="attr_decklockon-size" value=0></div>
<div class="table-item"><input type="checkbox" name="attr_decklockon-loaded" class="text-mid"
value=1> </div>
<div class="table-item"><input type="number" name="attr_decklockon-rating-final" value=0></div>
<div class="table-item"><button type="action" name="act_matrixtest" class="pictos-button" title="Lock-On Utility Test" id="decklockon-rating-final">2</button></div>
<div class="table-item"><button type="action" name="act_swapmemory" class="pictos-button"
title="Reload Lock-On Utility from Disk" id="decklockon-rating">0</button></div>
<div class="table-item"><input type="text" name="attr_decklockon-notes"></div>
<div data-i18n="medic" class="table-item-left">Medic</div>
<div class="table-item"><input type="number" name="attr_deckmedic-rating" value=0></div>
<div class="table-item"><input type="number" name="attr_deckmedic-multiplier" value=4></div>
<div class="table-item"><input type="number" name="attr_deckmedic-size" value=0></div>
<div class="table-item"><input type="checkbox" name="attr_deckmedic-loaded" class="text-mid" value=1> </div>
<div class="table-item"><input type="number" name="attr_deckmedic-rating-final" value=0></div>
<div class="table-item"><button type="action" name="act_matrixmedic" class="pictos-button" title="Medic Utility Execute" id="deckmedic-rating-final">k</button></div>
<div class="table-item"><button type="action" name="act_swapmemory" class="pictos-button" title="Reload Medic Utility from Disk" id="deckmedic-rating">0</button></div>
<div class="table-item"><input type="text" name="attr_deckmedic-notes"></div>
</div>
<fieldset class="repeating_defensiveutils">
<div class="deck-utilities-defensive">
<div class="table-item-left"><input type="text" name="attr_utility"></div>
<div class="table-item"><input type="number" name="attr_rating" value=0></div>
<div class="table-item"><input type="number" name="attr_multiplier" value=0></div>
<div class="table-item"><input type="number" name="attr_size" value=0></div>
<div class="table-item "><input class="text-mid" type="checkbox" name="attr_loaded" value=1>
</div>
<div class="table-item"><input type="number" name="attr_rating-final" value=0></div>
<div class="table-item"><button type="action" name="act_matrixrepeatingtest" class="pictos-button" title="Utility Test" id="repeating">2</button></div>
<div class="table-item"><button type="action" name="act_swapmemory" class="pictos-button"
title="Reload Utility from Disk" id="repeating">0</button></div>
<div class="table-item"><input type="text" name="attr_utilitynotes"></div>
</div>
</fieldset>
</div>
<div>
<div data-i18n="offensive-utilities" class="SRH4">Offensive Utilities</div>
<div class="deck-utilities-offensive">
<header data-i18n="utility" class="table-top-left">Utility</header>
<header data-i18n="rating" class="table-top-mid">Rating</header>
<header data-i18n="multiplier" class="table-top-mid">Multiplier</header>
<header data-i18n="size" class="table-top-mid">size</header>
<header data-i18n="loaded" class="table-top-mid">loaded</header>
<header data-i18n="effective-rating" class="table-top-mid">Effective Rating</header>
<header data-i18n="execute" class="table-top-mid">Execute</header>
<header data-i18n="test" class="table-top-mid">Test</header>
<header data-i18n="swap-memory" class="table-top-mid">Swap Memory</header>
<header data-i18n="notes" class="table-top-right">Notes</header>
<div class="table-item-left"><select name="attr_deckattacklevel" class="mediumselect2">
<option data-i18n="attack-light-damage-abbreviation" value="L">Attack (L)</option>
<option data-i18n="attack-moderate-damage-abbreviation" value="M" selected>Attack (M)
</option>
<option data-i18n="attack-serious-damage-abbreviation" value="S">Attack (S)</option>
<option data-i18n="attack-deadly-damage-abbreviation" value="D">Attack (D)</option>
</select>
</div>
<div class="table-item"><input type="number" name="attr_deckattack-rating" value=0></div>
<div class="table-item"><input type="number" name="attr_deckattack-multiplier" value=4></div>
<div class="table-item"><input type="number" name="attr_deckattack-size" value=0></div>
<div class="table-item"><input type="checkbox" name="attr_deckattack-loaded" class="text-mid"
value=1></div>
<div class="table-item"><input type="number" name="attr_deckattack-rating-final" value=0></div>
<div class="table-item"><button type="action" name="act_matrixattack" class="pictos-custom-button" title="Execute Attack vs. System Code or Icon" id="deckattack">[</button></div>
<div class="table-item"><button type="action" name="act_matrixtest" class="pictos-button" title="Attack Utility Test" id="deckattack-rating-final">2</button></div>
<div class="table-item"><button type="action" name="act_swapmemory" class="pictos-button" title="Reload Attack Utility from Disk" id="deckattack-rating">0</button></div>
<div class="table-item"><input type="text" name="attr_deckattack-notes"></div>
<div data-i18n="black-hammer" class="table-item-left">Black Hammer</div>
<div class="table-item"><input type="number" name="attr_deckblackhammer-rating" value=0></div>
<div class="table-item"><input type="number" name="attr_deckblackhammer-multiplier" value=20></div>
<div class="table-item"><input type="number" name="attr_deckblackhammer-size" value=0></div>
<div class="table-item"><input type="checkbox" name="attr_deckblackhammer-loaded" class="text-mid"
value=1></div>
<div class="table-item"><input type="number" name="attr_deckblackhammer-rating-final" value=0></div>
<div class="table-item"><button type="action" name="act_matrixattack" class="pictos-custom-button" title="Blackhammer Utility Attack" id="deckblackhammer">[</button></div>
<div class="table-item"><button type="action" name="act_matrixtest" class="pictos-button" title="Blackhammer Utility Test" id="deckblackhammer-rating-final">2</button></div>
<div class="table-item"><button type="action" name="act_swapmemory" class="pictos-button" title="Reload Blackhammer Utility from Disk" id="deckblackhammer-rating">0</button></div>
<div class="table-item"><input type="text" name="attr_deckblackhammer-notes"></div>
<div data-i18n="killjoy" class="table-item-left">Killjoy</div>
<div class="table-item"><input type="number" name="attr_deckkilljoy-rating" value=0></div>
<div class="table-item"><input type="number" name="attr_deckkilljoy-multiplier" value=10></div>
<div class="table-item"><input type="number" name="attr_deckkilljoy-size" value=0></div>
<div class="table-item"><input type="checkbox" name="attr_deckkilljoy-loaded" class="text-mid"
value=1></div>
<div class="table-item"><input type="number" name="attr_deckkilljoy-rating-final" value=0></div>
<div class="table-item"><button type="action" name="act_matrixattack" class="pictos-custom-button" title="KillJoy Utility Attack" id="deckkilljoy">[</button></div>
<div class="table-item"><button type="action" name="act_matrixtest" class="pictos-button" title="KillJoy Utility Test" id="deckkilljoy-rating-final">2</button></div>
<div class="table-item"><button type="action" name="act_swapmemory" class="pictos-button" title="Reload KillJoy Utility from Disk" id="deckkilljoy-rating">0</button></div>
<div class="table-item"><input type="text" name="attr_deckkilljoy-notes"></div>
<div data-i18n="slow" class="table-item-left">Slow</div>
<div class="table-item"><input type="number" name="attr_deckslow-rating" value=0></div>
<div class="table-item"><input type="number" name="attr_deckslow-multiplier" value=4></div>
<div class="table-item"><input type="number" name="attr_deckslow-size" value=0></div>
<div class="table-item"><input type="checkbox" name="attr_deckslow-loaded" class="text-mid" value=1>
</div>
<div class="table-item"><input type="number" name="attr_deckslow-rating-final" value=0></div>
<div class="table-item"><button type="action" name="act_matrixattack" class="pictos-button" title="Slow Utility Attack" id="deckslow">t</button></div>
<div class="table-item"><button type="action" name="act_matrixtest" class="pictos-button" title="Slow Utility Test" id="deckslow-rating-final">2</button></div>
<div class="table-item"><button type="action" name="act_swapmemory" class="pictos-button" title="Reload Slow Utility from Disk" id="deckslow-rating">0</button></div>
<div class="table-item"><input type="text" name="attr_deckslow-notes"></div>
</div>
<fieldset class="repeating_offensiveutils">
<div class="deck-utilities-offensive">
<div class="table-item-left"><input type="text" name="attr_utility"></div>
<div class="table-item"><input type="number" name="attr_rating" value=0></div>
<div class="table-item"><input type="number" name="attr_multiplier" value=0></div>
<div class="table-item"><input type="number" name="attr_size" value=0></div>
<div class="table-item"><input type="checkbox" name="attr_loaded" class="text-mid" value=1>
</div>
<div class="table-item"><input type="number" name="attr_rating-final" value=0></div>
<div class="table-item"><button type="action" name="act_matrixrepeatingtest" class="pictos-custom-button" title="Utility Attack" id="matrixrepeatingattack">[</button></div>
<div class="table-item"><button type="action" name="act_matrixrepeatingtest" class="pictos-button" title="Utility Test" id="matrixrepeatingtest">2</button></div>
<div class="table-item"><button type="action" name="act_swapmemory" class="pictos-button" title="Reload Utility from Disk" id="repeating">0</button></div>
<div class="table-item"><input type="text" name="attr_utilitynotes"></div>
</div>
</fieldset>
</div>
<div class="deck-util-background">
<div class="SRH4" data-i18n="additional-utilities">Additional Utilities</div>
<div class="deck-utilities-additional">
<header data-i18n="utility" class="table-top-left">Utility</header>
<header data-i18n="rating" class="table-top-mid">Rating</header>
<header data-i18n="target" class="table-top-mid">Target</header>
<header data-i18n="multiplier" class="table-top-mid">Multiplier</header>
<header data-i18n="size" class="table-top-mid">Size</header>
<header data-i18n="loaded" class="table-top-mid">Loaded</header>
<header data-i18n="effective-rating" class="table-top-mid">Effective Rating</header>
<header data-i18n="execute" class="table-top-mid">Execute</header>
<header data-i18n="test" class="table-top-mid">Test</header>
<header data-i18n="swap-memory" class="table-top-mid">Swap Memory</header>
<header data-i18n="notes" class="table-top-right">Notes</header>
</div>
<fieldset class="repeating_deck-utilities">
<div class="deck-utilities-addrow">
<input type="text" name="attr_utility" class="myweapontxt">
<input type="number" name="attr_rating" value=0>
<select name="attr_target" class="mediumselect2">
<option data-i18n="access" value="@{target|Target|matrixaccessrating}">access</option>
<option data-i18n="control" value="@{target|Target|matrixcontrolrating}">control</option>
<option data-i18n="index" value="@{target|Target|matrixindexrating}">index</option>
<option data-i18n="files" value="@{target|Target|matrixfilesrating}">files</option>
<option data-i18n="slave" value="@{target|Target|matrixslaverating}">slave</option>
</select>
<input type="number" name="attr_multiplier" value=0>
<input type="number" name="attr_size" value=0>
<div class="text-mid"><input type="checkbox" name="attr_loaded" value=1></div>
<input type="number" name="attr_rating-final" value=0>
<div><button type="action" name="act_matrixrepeatingtest" class="d6-button" title="System Operation with Utility" id="matrixrepeatingexec">L</button></div>
<div><button type="action" name="act_matrixrepeatingtest" class="pictos-button" title="Utility Test - use vs. Tar programs" id="matrixrepeatingtest">2</button></div>
<div><button type="action" name="act_swapmemory" class="pictos-button"
title="Reload Utility from Disk" id="repeating">0</button></div>
<input type="text" name="attr_notes" class="myweapontxt">
</div>
<div class="table-bottom" />
</div>
</fieldset>
</div>
</div>
</div>
</div>
<div class='sheet-karma'>
<div data-i18n="karma" class="SRH3">Karma</div>
<div class="karma-summary">
<header data-i18n="karma-pool" class="table-top-left">Karma Pool:</header>
<header data-i18n="good-karma" class="table-top-mid">Good Karma:</header>
<header data-i18n="karma-total" class="table-top-right">Karma Total:</header>
<input type="number" name="attr_karma-pool" value=0>
<input type="number" name="attr_karma-good" value=0>
<input type="number" name="attr_karma-total" value=0>
</div>
<br>
<div class="karma-history">
<header data-i18n="attribute-skill-spell-etc" class="table-top-left">Attribute/Skill/Spell/etc.</header>
<header data-i18n="ammount-of-karma" class="table-top-mid">Ammount of Karma</header>
<header data-i18n="date" class="table-top-mid">Date</header>
<header data-i18n="notes" class="table-top-right">Notes</header>
</div>
<fieldset class="repeating_karma">
<div class="karma-history">
<div class="table-item-left"><input type="text" class="myweapontxt" name="attr_purchase"></div>
<div class="table-item"><input type="number" name="attr_cost" value=0 min=0></div>
<div class="table-item"><input type="text" name="attr_date"></div>
<div class="table-item"><input type="text" class="myweapontxt" name="attr_notes"></div>
</div>
</fieldset>
<br>
<div data-i18n="notes" class="SRH3">Notes</div>
<div class="character-notes">
<textarea name="attr_character-notes"></textarea>
</div>
</div>
<div class='sheet-gear'>
<input type="hidden" class="gear-tabs-switch" name="attr_geartab" value="gear">
<div class="gear-tabs">
<input type="hidden" class="gear-tabs-switch" name="attr_geartab" value="gear">
<button class="gear-tabs-gear nuyen-total" type="action" name="act_gear-tab" data-i18n-title="gear" title="Gear"><span data-i18n="gear">GEAR</span><span>&nbsp;</span><span name="attr_carrying-weight"></span><span>kg</span></button>
<button class="gear-tabs-credsticks nuyen-total" type="action" name="act_credsticks-tab" title="credsticks" data-i18n-title="credsticks"><span data-i18n="credsticks">Credsticks</span><span>&nbsp;</span><span name="attr_nuyen"></span><span>&#165;</span></button>
<button class="gear-tabs-vehiclelist" type="action" name="act_vehiclelist-tab"
data-i8n="vehicles-list-uppercase" data-i18n-title="vehilces-owned-by-character"
title="Vehicles Owned by Character">Vehicles List</button>
<div class="tabs-empty"></div>
</div>
<div class="gear">
<div class="SRH3" data-i18n="gear">Gear</div>
<div class="gear-table">
<header data-i18n="name" class="table-top-left">Name</header>
<header data-i18n="rating" class="table-top-mid">Rating</header>
<header data-i18n="weight" class="table-top-mid">Weight</header>
<header data-i18n="carrying" class="table-top-mid">Carrying</header>
<header data-i18n="in-stash" class="table-top-mid">In Stash</header>
<header data-i18n="conceal" class="table-top-mid">Conceal</header>
<header data-i18n="type" class="table-top-mid">Type</header>
<header data-i18n="quantity" class="table-top-mid">Quantity</header>
<header data-i18n="pool" class="table-top-mid">Pool</header>
<header data-i18n="roll" class="table-top-mid">Roll</header>
<header data-i18n="description" class="table-top-right">Description</header>
</div>
<fieldset class="repeating_gear">
<div class="gear-table">
<div class="table-item-left"><input type="text" class="myweapontxt" name="attr_name"></div>
<div class="table-item"><input type="number" name="attr_rating" value=0 min=0></div>
<div class="table-item"><input type="number" name="attr_weight" value=0 step='0.01' min='0.00'></div>
<div class="table-item"><input type="radio" name="attr_load" value=1 checked></div>
<div class="table-item"><input type="radio" name="attr_load" value=0></div>
<div class="table-item"><input type="number" name="attr_conceal" value=0></div>
<div class="table-item"><select name="attr_type" class="mediumselect2">
<option data-i18n="reusable" value='reuse'>Reusable</option>
<option data-i18n="consumeable" value='onetime'>Consumeable</option>
</select>
</div>
<div class="table-item"><input type="number" name="attr_quantity" value=0 min=0></div>
<div class="table-item"><select name="attr_pool" class="mediumselect2">
<option SELECTED value="none">None</option>
<option data-i18n="combat" value="combat">Combat</option>
<option data-i18n="task" value="task">Task</option>
<option data-i18n="hacking" value="hacking">Hacking</option>
<option data-i18n="control" value="control">Control</option>
<option data-i18n="spell" value="spell">Spell</option>
<option data-i18n="astral" value="astral">Astral</option>
</select>
</div>
<div class="table-item"><button type="action" class="d6-button" name="act_usegear"
title="Use Item">L</button></div>
<div class="table-item"><input type="text" name="attr_description"></div>
</div>
</fieldset>
<br>
<div class="SRH3" data-i18n="carrying">carrying</div>
<div class="weight-table">
<b class="table-top-left" data-i18n="category">Category</b>
<b class="table-top-right" data-i18n="weight">Weight</b>
<div class="table-item-left" data-i18n="ranged-weapons">Ranged Weapons</div>
<div class="table-item"><span name="attr_rangedweapons-weight"></span></div>
<div class="table-item-left" data-i18n="melee-weapons">Melee Weapons</div>
<div class="table-item"><span name="attr_melee-weight-final"></span></div>
<div class="table-item-left" data-i18n="explosives">Explosives</div>
<div class="table-item"><span name="attr_explosives-weight"></span></div>
<div class="table-item-left" data-i18n="armor">Armor</div>
<div class="table-item"><span name="attr_armor-weight"></span></div>
<div class="table-item-left" data-i18n="ammunition">Ammunition</div>
<div class="table-item"><span name="attr_ammunition-weight"></span></div>
<div class="table-item-left" data-i18n="gear">Gear</div>
<div class="table-item"><span name="attr_gear-weight"></span></div>
<b class="table-item-left" data-i18n="total">total</b>
<b class="table-item"><span name="attr_carrying-weight"></span></b>
</div>
</div>
<div class="credsticks-show">
<div class="SRH3" data-i18n="credsticks">Credsticks &#165;</div>
<div class="credsticks">
<header data-i18n="type" class="table-top-left">Type</header>
<header data-i18n="id" class="table-top-mid">ID</header>
<header data-i18n="rating" class="table-top-mid">Rating</header>
<header data-i18n="balance" class="table-top-mid">Balance &#165;</header>
<header data-i18n="roll" class="table-top-mid">Roll</header>
<header data-i18n="permits" class="table-top-right">Permits</header>
</div>
<fieldset class="repeating_credsticks">
<div class="credsticks">
<div class="table-item-left">
<select name="attr_type" class="mediumselect2">
<option data-i18n="certified" value="Certified" SELECTED>Certified</option>
<option data-i18n="standard" value="Standard" SELECTED>Standard</option>
<option data-i18n="silver" value="Silver" SELECTED>Silver</option>
<option data-i18n="gold" value="Gold" SELECTED>Gold</option>
<option data-i18n="platinum" value="Platinum" SELECTED>Platinum</option>
<option data-i18n="ebony" value="Ebony" SELECTED>Ebony</option>
</select>
</div>
<div class="table-item">
<select name="attr_id" class="mediumselect2">
<option data-i18n="legitimate" value="Legitimate" SELECTED>Legitimate</option>
<option data-i18n="forged" value="Forged" SELECTED>Forged</option>
</select>
</div>
<div class="table-item"><input type="number" name="attr_rating" value=1></div>
<div class="table-item"><input type="number" name="attr_balance" value=0><span>&#165;</span></div>
<div class="table-item"><button type="action" name="act_checkcredstick" class="d6-button">L</button>
</div>
<div class="table-item"><input type="text" class="myweapontxt" name="attr_notes"></div>
</div>
</fieldset>
</div>
<div class="vehicles-list">
<div class="SRH3" data-i18n="vehicles-list">Vehicles List</div>
<div class="table-top" data-i18n="vehicles-skill-message">Vehicle Details and Skill rating go on sepperate
Vehicle Character Sheet</div>
<div class="vehicles-table">
<header data-i18n="name" class="table-item-left">Name</header>
<header data-i18n="model" class="table-item">Model</header>
<header data-i18n="cost" class="table-item">Cost &#165;</header>
<header data-i18n="notes" class="table-item">Notes</header>
</div>
<fieldset class="repeating_vehicles">
<div class="vehicles-table">
<div class="table-item-left"><input type="text" name="attr_name" class="myweapontxt"></div>
<div class="table-item"><input type="text" name="attr_model" class="myweapontxt"></div>
<div class="table-item"><input type="number" name="attr_cost" value=0><span>&#165;</span></div>
<div class="table-item"><input type="text" name="attr_notes" class="myweapontxt"></div>
</div>
</fieldset>
</div>
</div>
<div class="sheet-rigger">
<div class="vcr-attributes">
<div data-i18n="vcr-rating" class="text-mid">VCR Rating:</div>
<div><input type="number" name="attr_vcr" value=0></div>
<div data-i18n="vehicle-reaction" class="text-mid">Vehicle Reaction:</div>
<div class="text-mid"><span class="numberspan" name="attr_vcr-reaction" \></div>
<div data-i18n="vehicle-initiative" class="text-mid">Vehicle Initiative:</div>
<div class="text-mid"><span class="numberspan" name="attr_vcr-initiative" \></div>
<div data-i18n="ivis-master-unit" class="text-mid">IVIS Master Unit:</div><input class="text-mid"
type="checkbox" name="attr_rcdeck-ivis-master" \>
<div data-i18n="fddm-master-unit" class="text-mid">FDDM Master Unit:</div>
<div class="text-mid"><input type="checkbox" name="attr_rcdeck-fddm-master" \></div>
</div>
<div class="rigger-tabs">
<input type="hidden" class="rigger-tabs-switch" name="attr_riggertab" value="rigger">
<button class="rigger-tabs-rcdeck" type="action" name="act_rcdeck-tab" data-i8n="remote-control-deck-uppercase"
data-i18n-title="remote control deck" title="Remote Control Deck Configuration">Remote Control Deck</button>
<button class="rigger-tabs-subscriber" type="action" name="act_subscriber-tab"
data-i8n="drone-subscriber-list-uppercase" data-i18n-title="drone-subscriber-list"
title="Drone Subscriber List">Subscriber List</button>
<button class="rigger-tabs-skills" type="action" name="act_rigger-tab"
data-i8n="vehicle-skills-uppercase">Vehicle Skills</button>
<div class="tabs-empty"></div>
</div>
<input type="hidden" class="rigger-tabs-switch" name="attr_riggertab" value="rigger">
<div class="drones-list">
<div class="drones-table">
<header data-i18n="name" class="table-top-left">Name</header>
<header data-i18n="type" class="table-top-mid">Type</header>
<header data-i18n="model" class="table-top-mid">Model</header>
<header data-i18n="cost" class="table-top-mid">Cost</header>
<header data-i18n="notes" class="table-top-right">Notes</header>
</div>
<fieldset class="repeating_drones">
<div class="drones-table">
<div class="table-item-left"><input type="text" name="attr_name"></div>
<div class="table-item"><input type="text" name="attr_type"></div>
<div class="table-item"><input type="text" name="attr_model"></div>
<div class="table-item"><input type="number" name="attr_cost"></div>
<div class="table-item"><input type="text" name="attr_notes"></input>
</div>
</div>
</fieldset>
</div>
<div class="rigger-rcdeck">
<div class="rcdeck-ew-border">
<div class="rcdeck-ew">
<div data-i18n="intrusion-factor-base" class="text-mid">Intrusion Factor Base:</div>
<span name="attr_ewarfare" class="spn-nc" />
<div data-i18n="intrusion-factor-modifier" class="text-mid">Intrusion Factor Mods:</div>
<input type="number" name="attr_rcdeck-intrusion-mods" />
<div data-i18n="intrusion-factor" class="text-mid">Intrusion Factor:</div>
<span name="attr_rcdeck-intrusion-factor" class="spn-nc"></span>
</div>
</div>
<div class="rc-deck">
<input type="hidden" name="attr_rcdeck-flux" value=2 />
<div class="rcdeck-flux">
<div class="table-top-left-nc"></div>
<header data-i18n="rating" class="table-top-mid-nc">Rating</header>
<header data-i18n="roll" class="table-top-mid-nc">Roll</header>
<header data-i18n="flux-rating" class="table-top-mid-nc">Flux Rating</header>
<header data-i18n="modified-flux" class="table-top-mid-nc">Modified Flux</header>
<header data-i18n="range" class="table-top-right-nc">Range</header>
<header data-i18n="deck" class="table-item-left-nc">Deck:</header>
<div class="table-item-nc"><input type="number" name="attr_rcdeck-rating" min=0 value=0></div>
<div class="table-item-nc"><button class="d6-button" type="action" name="act_skilltest"
id="rcdeck-rating control" title="Intrusion Detect Test">L</button></div>
<div class="table-item-nc"><span name="attr_rcdeck-flux"></div>
<div class="table-item-nc"><input type="number" name="attr_rcdeck-fluxmod" min=0 value=0></div>
<div class="table-item-nc"><span name="attr_rcdeck-range"></div>
<div data-i18n="eccm" class="table-item-left-nc">ECCM:</div>
<div class="table-item-nc"><input type="number" name="attr_eccm-rating" min=0 value=0></div>
<div class="table-item-nc"><button class="d6-button" type="action" name="act_skilltest"
id="eccm-rating control" title="ECCM Test">L</button></div>
<div class="table-item-nc"><span name="attr_eccm-flux"></div>
<div class="table-item-nc"><input type="number" name="attr_eccm-fluxmod" min=0 value=0></div>
<div class="table-item-nc"><span name="attr_eccm-range"></div>
<div data-i18n="electronic-warfare" class="table-item-left-nc">Electronic Warfare:</div>
<div class="table-item-nc"><input type="number" name="attr_ewarfare" value=0 /></div>
<div class="table-item-nc"><button class="d6-button" type="action" name="act_skilltest"
id="ewarfare control" title="Electronic Warfare or Signal Intercept Test">L</button></div>
<div class="table-item-nc"></div>
<div class="table-item-nc"></div>
<div class="table-item-nc"></div>
<div data-i18n="encryption-module" class="table-item-left-nc">Encryption Module:</div>
<div class="table-item-nc"><input type="number" name="attr_rcdeck-encryption-rating" value=0 /></div>
<div class="table-item-nc"></div>
<div class="table-item-nc"></div>
<div class="table-item-nc"></div>
<div class="table-item-nc"></div>
<div data-i18n="decryption-module" class="table-item-left-nc">Decryption Module:</div>
<div class="table-item-nc"><input type="number" name="attr_rcdeck-decryption-rating" value=0 /></div>
<div class="table-item-nc"><button class="d6-button" type="action" name="act_skilltest"
id="rcdeck-decryption-rating control" title="Decryption Test">L</button></div>
<div class="table-item-nc"></div>
<div class="table-item-nc"></div>
<div class="table-item-nc"></div>
<div data-i18n="protocol-emulation-module" class="table-item-left-nc">Protocol Emulation Module:</div>
<div class="table-item-nc"><input type="number" name="attr_rcdeck-pem-rating" value=0 /></div>
<div class="table-item-nc"></div>
<div class="table-item-nc"></div>
<div class="table-item-nc"></div>
<div class="table-item-nc"></div>
</div>
</div>
</div>
<input type="hidden" class="rigger-tabs-switch" name="attr_riggertab" value="rigger">
<div class="vehicle-skills">
<div data-i18n="update-vehicle-skill-here" class="SRH5">Update Vehicle Skill Here</div>
<div data-i18n="vehicle-specialize-message" class="SRH5">If specializing in a specif vehicle, add modifiers to
the vehicle/drone itself</div><br>
<div class="vehicle-skills-table">
<header data-i18n="skill" class="table-top-left-nc">Skill</header>
<header data-i18n="level" class="table-top-mid-nc">Level</header>
<header data-i18n="specialize" class="table-top-mid-nc">Specialize</header>
<header data-i18n="remote-operation" class="table-top-right-nc">Remote Operation</header>
<div></div>
<header data-i18n="skill" class="table-top-left-nc">Skill</header>
<header data-i18n="level" class="table-top-mid-nc">Level</header>
<header data-i18n="specialize" class="table-top-mid-nc">Specialize</header>
<header data-i18n="remote-operation" class="table-top-right-nc">Remote Operation</header>
<div></div>
<div data-i18n="bike" class="table-item-left-nc">Bike:</div>
<div class="table-item-nc"><input type="number" name="attr_bike" value=0></div>
<div class="table-item-nc"><input type="checkbox" name="attr_bike-specialize"
class="bike-spec-switch text-mid">
</div>
<div class="table-item-nc">
<input type="checkbox" name="attr_bike-specialize" class="bike-spec-switch hidden">
<div class="bike-spec-on"><input type="number" name="attr_bike-remote" value=0></div>
<div class="bike-spec-off"><span name="attr_bike"></span></div>
</div>
<div></div>
<div data-i18n="car" class="table-item-left-nc">Car:</div>
<div class="table-item-left-nc"><input type="number" name="attr_car" value=0></div>
<div class="table-item-nc"><input type="checkbox" name="attr_car-specialize"
class="car-spec-switch text-mid"></div>
<div class="table-item-nc">
<input type="checkbox" name="attr_car-specialize" class="car-spec-switch hidden">
<div class="car-spec-on"><input type="number" name="attr_car-remote" value=0></div>
<div class="car-spec-off"><span name="attr_car-remote"></span></div>
</div>
<div></div>
<div data-i18n="hovercraft" class="table-item-left-nc">Hovercraft:</div>
<div class="table-item-left-nc"><input type="number" name="attr_hovercraft" value=0></div>
<div class="table-item-nc"><input type="checkbox" name="attr_hovercraft-specialize"
class="hovercraft-spec-switch text-mid"></div>
<div class="table-item-nc">
<input type="checkbox" name="attr_hovercraft-specialize" class="hovercraft-spec-switch hidden">
<div class="hovercraft-spec-on"><input type="number" name="attr_hovercraft-remote" value=0></div>
<div class="hovercraft-spec-off"><span name="attr_hovercraft-remote"></span></div>
</div>
<div></div>
<div data-i18n="lighter-than-air-aircraft-abbreviated" class="table-item-left-nc">LTA Aircraft:</div>
<div class="table-item-left-nc"><input type="number" name="attr_lta" value=0></div>
<div class="table-item-nc"><input type="checkbox" name="attr_lta-specialize"
class="lta-spec-switch text-mid">
</div>
<div class="table-item-nc">
<input type="checkbox" name="attr_lta-specialize" class="lta-spec-switch hidden">
<div class="lta-spec-on"><input type="number" name="attr_lta-remote" value=0></div>
<div class="lta-spec-off"><span name="attr_lta-remote"></span></div>
</div>
<div></div>
<div data-i18n="motorboat" class="table-item-left-nc">Motorboat:</div>
<div class="table-item-left-nc"><input type="number" name="attr_motorboat" value=0> </div>
<div class="table-item-nc"><input type="checkbox" name="attr_motorboat-specialize"
class="motorboat-spec-switch text-mid"></div>
<div class="table-item-nc">
<input type="checkbox" name="attr_motorboat-specialize" class="motorboat-spec-switch hidden">
<div class="motorboat-spec-on"><input type="number" name="attr_motorboat-remote" value=0></div>
<div class="motorboat-spec-off"><span name="attr_motorboat-remote"></span></div>
</div>
<div></div>
<div data-i18n="rotor-aircraft" class="table-item-left-nc">Rotor Aircraft:</div>
<div class="table-item-left-nc"><input type="number" name="attr_rotor" value=0> </div>
<div class="table-item-nc"><input type="checkbox" name="attr_rotor-specialize"
class="rotor-spec-switch text-mid">
</div>
<div class="table-item-nc">
<input type="checkbox" name="attr_rotor-specialize" class="rotor-spec-switch hidden">
<div class="rotor-spec-on"><input type="number" name="attr_rotor-remote" value=0></div>
<div class="rotor-spec-off"><span name="attr_rotor-remote"></span></div>
</div>
<div></div>
<div data-i18n="sailboat" class="table-item-left-nc">Sailboat:</div>
<div class="table-item-nc"><input type="number" name="attr_sailboat" value=0> </div>
<div class="table-item-nc"><input type="checkbox" name="attr_sailboat-specialize"
class="sailboat-spec-switch text-mid"></div>
<div class="table-item-nc">
<input type="checkbox" name="attr_sailboat-specialize" class="sailboat-spec-switch hidden">
<div class="sailboat-spec-on"><input type="number" name="attr_sailboat-remote" value=0></div>
<div class="sailboat-spec-off"><span name="attr_sailboat-remote"></span></div>
</div>
<div></div>
<div data-i18n="ship" class="table-item-left-nc">Ship:</div>
<div class="table-item-nc"><input type="number" name="attr_ship" value=0> </div>
<div class="table-item-nc"><input type="checkbox" name="attr_ship-specialize"
class="ship-spec-switch text-mid">
</div>
<div class="table-item-nc">
<input type="checkbox" name="attr_ship-specialize" class="ship-spec-switch hidden">
<div class="ship-spec-on"><input type="number" name="attr_ship-remote" value=0></div>
<div class="ship-spec-off"><span name="attr_ship-remote"></span></div>
</div>
<div></div>
<div data-i18n="submarine" class="table-item-left-nc">Submarine:</div>
<div class="table-item-nc"><input type="number" name="attr_submarine" value=0></div>
<div class="table-item-nc"><input type="checkbox" name="attr_submarine-specialize"
class="submarine-spec-switch text-mid"></div>
<div class="table-item-nc">
<input type="checkbox" name="attr_submarine-specialize" class="submarine-spec-switch hidden">
<div class="submarine-spec-on"><input type="number" name="attr_submarine-remote" value=0></div>
<div class="submarine-spec-off"><span name="attr_submarine-remote"></span></div>
</div>
<div></div>
<div data-i18n="vectored-thrust" class="table-item-left-nc">Vectored Thrust:</div>
<div class="table-item-nc"><input type="number" name="attr_vectoredthrust" value=0></div>
<div class="table-item-nc"><input type="checkbox" name="attr_vectoredthrust-specialize"
class="vectoredthrust-spec-switch text-mid"></div>
<div class="table-item-nc">
<input type="checkbox" name="attr_vectoredthrust-specialize" class="vectoredthrust-spec-switch hidden">
<div class="vectoredthrust-spec-on"><input type="number" name="attr_vectoredthrust-remote" value=0>
</div>
<div class="vectoredthrust-spec-off"><span name="attr_vectoredthrust-remote"></span></div>
</div>
<div></div>
<div data-i18n="winged-aircraft" class="table-item-left-nc">Winged Aircraft:</div>
<div class="table-item-nc"><input type="number" name="attr_wingedaircraft" value=0></div>
<div class="table-item-nc"><input type="checkbox" name="attr_wingedaircraft-specialize"
class="wingedaircraft-spec-switch text-mid"></div>
<div class="table-item-nc">
<input type="checkbox" name="attr_wingedaircraft-specialize" class="wingedaircraft-spec-switch hidden">
<div class="wingedaircraft-spec-on"><input type="number" name="attr_wingedaircraft-remote" value=0>
</div>
<div class="wingedaircraft-spec-off"><span name="attr_wingedaircraft-remote"></span></div>
</div>
<div></div>
<div data-i18n="mechanical-arm" class="table-item-left-nc">Mechanical Arm:</div>
<div class="table-item-nc"><input type="number" name="attr_mecharm" value=0></div>
<div class="table-item-nc"><input type="checkbox" name="attr_mecharm-specialize"
class="mecharm-spec-switch text-mid"></div>
<div class="table-item-nc">
<input type="checkbox" name="attr_mecharm-specialize" class="mecharm-spec-switch hidden">
<div class="mecharm-spec-on"><input type="number" name="attr_mecharm-remote" value=0></div>
<div class="mecharm-spec-off"><span name="attr_mecharm-remote"></span></div>
</div>
<div></div>
<div data-i18n="semiballistic" class="table-item-left-nc">Semiballistic:</div>
<div class="table-item-nc"><input type="number" name="attr_semiballistic" value=0> </div>
<div class="table-item-nc"><input type="checkbox" name="attr_semiballistic-specialize"
class="semiballistic-spec-switch text-mid"></div>
<div class="table-item-nc">
<input type="checkbox" name="attr_semiballistic-specialize" class="semiballistic-spec-switch hidden">
<div class="semiballistic-spec-on"><input type="number" name="attr_semiballistic-remote" value=0>
</div>
<div class="semiballistic-spec-off"><span name="attr_semiballistic-remote"></span></div>
</div>
<div></div>
<div data-i18n="suborbital" class="table-item-left-nc">Suborbital:</div>
<div class="table-item-nc"><input type="number" name="attr_suborbital" value=0></div>
<div class="table-item-nc"><input type="checkbox" name="attr_suborbital-specialize"
class="suborbital-spec-switch text-mid"></div>
<div class="table-item-nc">
<input type="checkbox" name="attr_suborbital-specialize" class="suborbital-spec-switch hidden">
<div class="suborbital-spec-on"><input type="number" name="attr_suborbital-remote" value=0></div>
<div class="suborbital-spec-off"><span name="attr_suborbital-remote"></span></div>
</div>
<div></div>
<div data-i18n="tracks" class="table-item-left-nc">Tracks:</div>
<div class="table-item-nc"><input type="number" name="attr_tracks" value=0></div>
<div class="table-item-nc"><input type="checkbox" name="attr_tracks-specialize"
class="tracks-spec-switch text-mid">
</div>
<div class="table-item-nc">
<input type="checkbox" name="attr_tracks-specialize" class="tracks-spec-switch hidden">
<div class="tracks-spec-on"><input type="number" name="attr_tracks-remote" value=0></div>
<div class="tracks-spec-off"><span name="attr_tracks-remote"></span></div>
</div>
<div></div>
<div data-i18n="walkers" class="table-item-left-nc">Walkers:</div>
<div class="table-item-nc"><input type="number" name="attr_walkers" value=0> </div>
<div class="table-item-nc"><input type="checkbox" name="attr_walkers-specialize"
class="walkers-spec-switch text-mid"></div>
<div class="table-item-nc">
<input type="checkbox" name="attr_walkers-specialize" class="walkers-spec-switch hidden">
<div class="walkers-spec-on"><input type="number" name="attr_walkers-remote" value=0></div>
<div class="walkers-spec-off"><span name="attr_walkers-remote"></span></div>
</div>
<div></div>
</div>
</div>
</div>
</div>
<div class='sheet-combat'>
<!-- Combat Tab -->
<div data-i18n="combat-skills-weapons-armor-and-ammunition" class="SRH2">Combat Skills, Weapons, Armor and Ammo</div>
<input type="hidden" class="combat-tabs-switch" name="attr_combattab" value="combat">
<div class="combat-tabs">
<input type="hidden" class="combat-tabs-switch" name="attr_combattab" value="combat">
<button class="combat-tabs-combat" type="action" name="act_combat-tab" data-i8n="combat-skills-uppercase"
data-i18n-title="combat-skills" title="combat skills">COMBAT SKILLS</button>
<button class="combat-tabs-ranged" type="action" name="act_ranged-tab" data-i8n="ranged-weapons-uppercase"
data-i18n-title="ranged-weapons" title="ranged weapons">RANGED WEAPONS</button>
<button class="combat-tabs-melee" type="action" name="act_melee-tab" data-i8n="melee-weapons-uppercase"
data-i18n-title="melee-weapons" title="melee weapons">MELEE WEAPONS</button>
<button class="combat-tabs-explosives" type="action" name="act_explosives-tab" data-i8n="explosives-uppercase"
data-i18n-title="explosives" title="explosives weapons">EXPLOSIVES</button>
<button class="combat-tabs-armor" type="action" name="act_armor-tab" data-i8n="armor-uppercase"
data-i18n-title="armor" title="armor">ARMOR</button>
<button class="combat-tabs-ammo" type="action" name="act_ammo-tab" data-i8n="ammunition-uppercase"
data-i18n-title="ammunition" title="ammunition">AMMUNITION</button>
<div class="tabs-empty"></div>
</div>
<div class="combat-skills">
<div data-i18n="update-combat-skills-here" class="SRH5">Update Combat Skill Here</div>
<div data-i18n="combat-skills-specialization-message" class="SRH5">If specializing in a weapon, add modifiers to
the weapon itself</div><br>
<div class="combat-skills-table">
<div class="combat-skills-items">
<header data-i18n="assualt-rifle">Assualt Rifle:</header><input type="number" name="attr_assaultrifles"
value=0 />
</div>
<div class="combat-skills-items">
<header data-i18n="pistols">Pistols:</header><input type="number" name="attr_pistols" value=0>
</div>
<div class="combat-skills-items">
<header data-i18n="rifles">Rifles:</header><input type="number" name="attr_rifles" value=0>
</div>
<div class="combat-skills-items">
<header data-i18n="shotguns">Shotguns:</header><input type="number" name="attr_shotguns" value=0>
</div>
<div class="combat-skills-items">
<header data-i18n="sub-machine-gun-abbreviation">SMGs:</header><input type="number" name="attr_smgs"
value=0>
</div>
<div class="combat-skills-items">
<header data-i18n="throwing">Throwing:</header><input type="number" name="attr_throwing" value=0>
</div>
<div class="combat-skills-items">
<header data-i18n="edged">Edged:</header><input type="number" name="attr_edged" value=0>
</div>
<div class="combat-skills-items">
<header data-i18n="clubs">Clubs:</header><input type="number" name="attr_clubs" value=0 />
</div>
<div class="combat-skills-items">
<header data-i18n="cyber-implant">Cyper Implant:</header><input type="number" name="attr_cyberimplant"
value=0 />
</div>
<div class="combat-skills-items">
<header data-i18n="whip">Whip:</header><input type="number" name="attr_whips" value=0>
</div>
<div class="combat-skills-items">
<header data-i18n="pole-arm">Pole Arm:</header><input type="number" name="attr_poles" value=0>
</div>
<div class="combat-skills-items">
<header data-i18n="gunnery">Gunnery:</header><input type="number" name="attr_gunnery" value=0>
</div>
<div class="combat-skills-items">
<header data-i18n="heavy-weapons">Heavy Weapons:</header><input type="number" name="attr_heavyweapons"
value=0>
</div>
<div class="combat-skills-items">
<header data-i18n="lasers">Lasers:</header><input type="number" name="attr_lasers" value=0>
</div>
<div class="combat-skills-items">
<header data-i18n="launchers">Launchers:</header><input type="number" name="attr_launchers" value=0>
</div>
<div class="combat-skills-items">
<header data-i18n="spray">Spray:</header><input type="number" name="attr_spray" value=0>
</div>
<div class="combat-skills-items">
<header data-i18n="gyrojet">Gyrojet:</header><input type="number" name="attr_gyrojet" value=0>
</div>
<div class="combat-skills-items">
<header data-i18n="projectile">Projectile:</header><input type="number" name="attr_projectiles" value=0>
</div>
<div class="combat-skills-items">
<header data-i18n="demolitions">Demolitions:</header><input type="number" name="attr_demolitions"
value=0>
</div>
<div class="combat-skills-items">
<header data-i18n="under-water">Under Water:</header><input type="number" name="attr_underwatercombat"
value=0>
</div>
<div class="combat-skills-items">
<header data-i18n="blowgun">Blowgun:</header><input type="number" name="attr_blowgun" value=0>
</div>
<div class="combat-skills-items">
<header data-i18n="bracer">Bracer:</header><input type="number" name="attr_bracer" value=0>
</div>
<div class="combat-skills-items">
<header data-i18n="gun-cane">Gun Cane:</header><input type="number" name="attr_guncane" value=0>
</div>
<div class="combat-skills-items">
<header data-i18n="oral-gun">Oral Gun:</header><input type="number" name="attr_oralgun" value=0>
</div>
<div class="combat-skills-items">
<header data-i18n="oral-strike">Oral Strike:</header><input type="number" name="attr_oralstrike"
value=0>
</div>
<div class="combat-skills-items">
<header data-i18n="eye-gun">Eye Gun:</header><input type="number" name="attr_eyegun" value=0>
</div>
</div>
<div></div>
<div class="combat-unarmed">
<div data-i18n="unarmed">Unarmed:</div><input type="number" name="attr_unarmed" value=0>
<div></div>
<div data-i18n="martial-arts">Martial Arts:</div>
<div><input type="text" list="martialarts" value="Unarmed" name="attr_martialarts">
<datalist class="mediumselect" id="martialarts">
<option data-i18n="unarmed" selected>Unarmed</option>
<option data-i18n="brawling">Brawling</option>
<option data-i18n="mma">MMA</option>
<option data-i18n="karate">Karate</option>
<option data-i18n="arnis">Arnis</option>
<option data-i18n="muy-thai">Muy Thai</option>
<option data-i18n="tae-kwon-do">Tae Kwon Do</option>
<option data-i18n="wild-cat">Wild Cat</option>
</datalist>
</div>
<div></div>
<div data-i18n="notes">Notes:</div>
<textarea name="attr_martialartsnotes" style='width:300px;height:50%;margin-bottom:unset;'></textarea>
</div>
</div>
<div class="rangedweapons">
<div class="ranged-table-headers">
<div class="table-top-left-nc" data-i18n="equip">Equip</div>
<div class="table-top-mid-nc" data-i18n="general">General</div>
<div class="table-top-mid-nc" data-i18n="range">Range</div>
<div class="table-top-mid-nc" data-i18n="fire-mode">Fire Mode</div>
<div class="table-top-mid-nc" data-i18n="damage">Damage</div>
<div class="table-top-mid-nc" data-i18n="ammunition">Ammunition</div>
<div class="table-top-right-nc" data-i18n="show">Show</div>
</div>
<div class="ranged-table-items">
<div class="table-item-left-nc" title="Primary Hand" data-i18n="primary-abbreviation">Pri</div>
<div class="table-item-nc" title="Off Hand" data-i18n="secondary-abbreviation">Sec</div>
<div class="table-item-nc" data-i18n="name">Name</div>
<div class="table-item-nc" data-i18n="type">Type</div>
<div class="table-item-nc" data-i18n="conceal">Conceal</div>
<div class="table-item-nc" data-i18n="minimum-abbreviation">Min</div>
<div class="table-item-nc" data-i18n="short-abbreviation">S</div>
<div class="table-item-nc" data-i18n="medium-abbreviation">M</div>
<div class="table-item-nc" data-i18n="long-abbreviation">L</div>
<div class="table-item-nc" data-i18n="extreme-abbreviation">Ex</div>
<div class="table-item-nc" data-i18n="single-shot-abbreviation">SS</div>
<div class="table-item-nc" data-i18n="semi-automatic-abbreviation">SA</div>
<div class="table-item-nc" data-i18n="burst-fire-abbreviation">BF</div>
<div class="table-item-nc" data-i18n="full-automatic-abbreviation">FA</div>
<div class="table-item-nc" data-i18n="power">Power</div>
<div class="table-item-nc" data-i18n="damage-abbreviation">Dmg</div>
<div class="table-item-nc" data-i18n="maximum-abbreviation">Max</div>
<div class="table-item-nc" data-i18n="remain">Remain</div>
<div class="table-item-nc" data-i18n="reload">Reload</div>
<div class="table-item-nc" data-i18n="fire">Fire</div>
<div class="table-item-nc" data-i18n="more">More</div>
</div>
<fieldset class="repeating_rangedweapons">
<div class="ranged-table-row">
<div class="text-mid"><input title="Equipped in Primary Hand" type="checkbox"
name="attr_primary-ranged-equipped"></div>
<div class="text-mid"><input title="Equipped in Off Hand" type="checkbox"
name="attr_secondary-ranged-equipped"></div>
<input type="text" name="attr_name" class="myweapontxt">
<select name="attr_type" class="mediumselect2">
<option data-i18n="other" value="Other" SELECTED>Other</option>
<option data-i18n="hold-out-pistol " value="Hold-out Pistol">Hold-out Pistol</option>
<option data-i18n="light-pistol" value="Light Pistol">Light Pistol</option>
<option data-i18n="machine-pistol" value="Machine Pistol">Machine Pistol</option>
<option data-i18n="heavy-pistol" value="Heavy Pistol">Heavy Pistol</option>
<option data-i18n="sub-machine-gun-abbreviation" value="SMG">SMG</option>
<option data-i18n="taser" value="Taser">Taser</option>
<option data-i18n="shotgun" value="Shotgun">Shotgun</option>
<option data-i18n="sporting-rifle" value="Sporting Rifle">Sporting Rifle</option>
<option data-i18n="sniper-rifle" value="Sniper Rifle">Sniper Rifle</option>
<option data-i18n="assault-rifle" value="Assault Rifle">Assault Rifle</option>
<option data-i18n="light-machine-gun-abbreviation" value="Light Machine Gun">LMG</option>
<option data-i18n="medium-machine-gun-abbreviation" value="Medium Machine Gun">MMG</option>
<option data-i18n="heavy-machine-gun-abbreviation" value="Heavy Machine Gun">HMG</option>
<option data-i18n="assualt-cannon" value="Assault Cannon">Assault Cannon</option>
<option data-i18n="minigun" value="Minigun">Minigun</option>
<option data-i18n="bow" value="Bow">Bow</option>
<option data-i18n="light-crossbow" value="Light Crossbow">Light Crossbow</option>
<option data-i18n="medium-crossbow" value="Medium Crossbow">Medium Crossbow</option>
<option data-i18n="heavy-crossbow" value="Heavy Crossbow">Heavy Crossbow</option>
<option data-i18n="sling-shot" value="Sling Shot">Sling Shot</option>
<option data-i18n="sling-launcher" value="Sling Launcher">Sling Launcher</option>
<option data-i18n="thrown-knife" value="Thrown Knife">Thrown Knife</option>
<option data-i18n="shuriken" value="Shuriken">Shuriken</option>
<option data-i18n="caltrops" value="Caltrops">Caltrops</option>
<option data-i18n="nets" value="Nets">Nets</option>
<option data-i18n="bracer" value="Bracer">Bracer</option>
<option data-i18n="gun-cane" value="Gun Cane">Gun Cane</option>
<option data-i18n="speargun" value="Speargun">Speargun</option>
<option data-i18n="net-gun" value="Net Gun">Net Gun</option>
<option data-i18n="laser-pistol" value="Laser Pistol">Laser Pistol</option>
<option data-i18n="laser-rifle" value="Laser Rifle">Laser Rifle</option>
<option data-i18n="laser-sniper" value="Laser Sniper">Laser Sniper</option>
<option data-i18n="gyrojet-land" value="Gyrojet (land)">Gyrojet (land)</option>
<option data-i18n="gyrojet-water" value="Gyrojet (water)">Gyrojet (water)</option>
<option data-i18n="flamethrower" value="Flamethrower">Flamethrower</option>
<option data-i18n="blowgun" value="Blowgun">Blowgun</option>
</select>
<input type="number" name="attr_conceal">
<input type="number" name="attr_min">
<input type="number" name="attr_short">
<input type="number" name="attr_medium">
<input type="number" name="attr_long">
<input type="number" name="attr_extreme">
<input type="hidden" name="attr_firemode" value="sa">
<div class="text-mid"><input type="radio" name="attr_firemode" value="ss"></div>
<div class="text-mid"><input type="radio" name="attr_firemode" value="sa"></div>
<div class="text-mid"><input type="radio" name="attr_firemode" value="bf"></div>
<div class="text-mid"><input type="radio" name="attr_firemode" value="fa"></div>
<input type="number" name="attr_power" value=1>
<select name="attr_damage" title="Weapon Damage" class="mediumselect2">
<option data-i18n="light-damage-abbreviation" title="Light Damage" value="L" SELECTED>L</option>
<option data-i18n="moderate-damage-abbreviation" title="Moderate Damage" value="M">M</option>
<option data-i18n="serious-damage-abbreviation" title="Serious Damage" value="S">S</option>
<option data-i18n="deadly-damage-abbreviation" title="Deadly Damage" value="D">D</option>
<option data-i18n="light-stun-abbreviation" title="Light Stun" value="L(stun)">L(s)</option>
<option data-i18n="moderate-stun-abbreviation" title="Moderate Stun" value="M(stun)">M(s)</option>
<option data-i18n="serious-stun-abbreviation" title="Serious Stun" value="S(stun)">S(s)</option>
<option data-i18n="deadly-stun-abbreviation" title="Deadly Stun" value="D(stun)">D(s)</option>
</select>
<input type="number" name="attr_ammo" value=0>
<input type="number" name="attr_ammoremain" value=0>
<div><button class="pictos-button" id="reloadbutton" type="action" name="act_reload"
title="Reload Weapon">0</button></div>
<div><button class="attack-dice" type="action" id="rangedattack" name="act_rangedattack"
title="Fire Weapon"></button>
</div>
<div>
<input type="hidden" class="show-weaponmods" name="attr_showmore" value="show">
<button class="pictos-button" type="action" name="act_showmore" title="Show More">y</button>
</div>
<input type="hidden" class="show-weaponmods" name="attr_showmore" value="show">
<span class="show-weaponmods">
<div class="ranged-mods">
<input type="hidden" class="ammofilter" name="attr_type" >
<div class="text-mid"
title="choose weapon active skill, use Other if there is no match and put skill level in Specialized box">
<b data-i18n="skill">Skill
</div>
<div class="text-mid"
title="add or remove dice from skill rating. Used for defaulting (minus) or specializing (plus)"
data-i18n="plus-dice-abbreviation">+Dice</div>
<div class="text-mid"
title="add persistant target number modifiers. Used for defaulting or offseting modifiers based on perks"
data-i18n="plus-target-number-abberviation">+TN</div>
<header class="text-mid" title="Gas vents and other recoil accesories"
data-i18n="recoil-compensation-abbreviation">Recoil Comp</header>
<header data-i18n="gyro-stabalization">Gyro Stabalization</header>
<header title="accesories that improve to hit number for ranged combat"
data-i18n="targeting-assistance">Targeting Assistance</header>
<header class="text-mid" title="Clip, Belt, Cylinder, Magazine or Action Break"
data-i18n="reload-type">Reload Type</header>
<header class="text-mid" title="number or clips, belts or individual rounds" data-i18n="reloads">
Reloads</header>
<header class="text-mid" data-i18n="ammo-type">Ammo Type</header>
<header class="text-mid" data-i18n="weight">Weight</header>
<header class="text-mid" data-i18n="carrying">Carrying</header>
<header class="text-mid" data-i18n="in-stash">In Stash</header>
<header class="text-mid" data-i18n="ammo-weight">Ammo Weight</header>
<header class="text-mid" data-i18n="show-notes">Show Notes:</header>
<select name="attr_skill" class="mediumselect2"
title="choose weapon active skill, use Other if there is no match and put skill level in Specialized box">
<option data-i18n="pistol" SELECTED value="@{pistols}">Pistol</option>
<option data-i18n="assault-rifle" value="@{assaultrifles}">Assault Rifle</option>
<option data-i18n="heavy-weapon" value="@{heavyweapons}">Heavy Weapon</option>
<option data-i18n="laser" value="@{lasers}">Laser</option>
<option data-i18n="projectile" value="@{projectiles}">Projectile</option>
<option data-i18n="rifle" value="@{rifles}">Rifle</option>
<option data-i18n="shotgun" value="@{shotguns}">Shotgun</option>
<option data-i18n="sub-machine-gun-abbreviation" value="@{smgs}">SMG</option>
<option data-i18n="thrown" value="@{throwing}">Thrown</option>
<option data-i18n="blowgun" value="@{blowgun}">Blowgun</option>
<option data-i18n="bracer" value="@{bracer}">Bracer</option>
<option data-i18n="gun-cane" value="@{guncane}">Gun Cane</option>
<option data-i18n="oral-gun" value="@{oralgun}">Oral Gun</option>
<option data-i18n="oral-strike" value="@{oralstrike}">Oral Strike</option>
<option data-i18n="eye-gun" value="@{eyegun}">Eye Gun</option>
<option data-i18n="other" value=0>Other</option>
</select>
<div><input type="number" name="attr_specialized" value=0></div>
<div><input type="number" name="attr_tnmods" value=0></div>
<div><input type="number" name="attr_recoilcomp" title="Gas vents and other recoil accesories"
value=0></div>
<select class="mediumselect2" name="attr_gyro">
<option data-i18n="none" value="0" SELECTED>None</option>
<option data-i18n="cyberarm" value="3">Cyberarm</option>
<option data-i18n="regular" value="5">Regular</option>
<option data-i18n="deluxe" value="6">Deluxe</option>
</select>
<select class="mediumselect2" name="attr_targeting">
<option data-i18n="none" value="0" SELECTED>None</option>
<option data-i18n="smartlink" value="-2">Smartlink</option>
<option data-i18n="laser-sight" value="-1">LaserSight</option>
<option data-i18n="smart-goggles" value="-1.00">Smart Goggles</option>
</select>
<select name="attr_reloadmethod" class="mediumselect2">
<option data-i18n="clip" value="clip">clip</option>
<option data-i18n="break" value="break">break</option>
<option data-i18n="magazine" value="magazine">magazine</option>
<option data-i18n="speed-loader" value="speed loader">speed loader</option>
<option data-i18n="cylinder" value="cylinder">cylinder</option>
<option data-i18n="belt" value="belt">belt</option>
</select>
<div><input type="number" name="attr_reloads" value=0></div>
<select name="attr_ammotype" class="mediumselect2 ammotype">
<option data-i18n="regular" value="regular">Regular</option>
<option data-i18n="explosive" value="explosive">Explosive</option>
<option data-i18n="explosive-ex" value="explosive2">Explosive EX</option>
<option data-i18n="hammerheads" value="hammerheads">Hammerheads</option>
<option value="screamer">Screamer</option>
<option value="gyrojetplus">GyroJet Plus</option>
<option value="gyrojetplusseeker">GyroJet Plus Seeker</option>
<option value="gyrojetseeker">GyroJet Seeker</option>
<option value="largenet">Large Net</option>
<option data-i18n="adps" value="adps">ADPS</option>
<option data-i18n="flechette" value="flechette">Flechette</option>
<option data-i18n="gel" value="gel">Gel</option>
<option data-i18n="tracer" value="tracer">Tracer</option>
<option data-i18n="anti-vehicle" value="av">Anti-Vehicl</option>
<option data-i18n="capsule" value="capsule">Capsule</option>
<option data-i18n="glazer" value="glazer">Glazer</option>
<option data-i18n="Hi-C" value="hic">Hi-C</option>
<option data-i18n="hollow-point" value="hpoint">Hollow Point</option>
<option data-i18n="incendiary" value="incendiary">Incendiary</option>
<option data-i18n="mercury" value="mercury">Mercury</option>
<option data-i18n="tracker" value="tracker">Tracker</option>
<option value="bigd">Big D's Temper</option>
<option data-i18n="bola" value="bola">Bola</option>
<option data-i18n="flare" value="flare">Flare</option>
<option value="shocklock">Shock Lock</option>
<option data-i18n="stun-shell" value="stunshell">Stun Shell</option>
</select>
<div><input type="number" name="attr_weight" value=0 step='0.01'></div>
<div class="text-mid"><input type="radio" name="attr_load" value=1 checked></div>
<div class="text-mid"><input type="radio" name="attr_load" value=0></div>
<div><input type="number" name="attr_ammoweight" value=0 step='0.01'></div>
<div>
<input type="hidden" class="show-notes" name="attr_shownotes" value="show">
<button class="pictos-button" type="action" name="act_shownotes" data-i18n-title="show-notes" title="Show Notes">y</button>
</div>
</div>
<input type="hidden" class="show-notes" name="attr_shownotes" value="show">
<div class="ranged-notes">
<div data-i18n="notes">Notes</div>
<div></div>
<textarea name="attr_notes" style='width:300px;height:22px;'></textarea>
</div>
</span>
</div>
<div class="table-bottom" />
</fieldset>
<br>
<div class="weight">
<div data-i18n="weight">Weight</div>
<div></div>
<div class="numberspan"><span name="attr_rangedweapons-weight"></span>kg</div>
</div>
</div>
<div class="meleeweapons">
<input name="attr_armorselected" type="hidden" \>
<input name="attr_impact" type="hidden" value=0 \>
<input name="attr_ballistic" type="hidden" value=0 \>
<input name="attr_meleereach" value=0 type="hidden" \>
<input name="attr_meleereach_max" value=0 type="hidden" \>
<input name="attr_meleeselected" value="unarmed-equipped" type="hidden" \>
<div class="melee-table-header">
<div class="table-top-left-nc" data-i18n="equip">Equip</div>
<div class="table-top-mid-nc" data-i18n="name">Name</div>
<div class="table-top-mid-nc" data-i18n="skill">Skill</div>
<div class="table-top-mid-nc" data-i18n="conceal">Conceal</div>
<div class="table-top-mid-nc" data-i18n="reach">Reach</div>
<div class="table-top-mid-nc" data-i18n="power">Power</div>
<div class="table-top-mid-nc" data-i18n="damage">Damage</div>
<div class="table-top-mid-nc"
title="add or remove dice from skill rating. Used for defaulting (minus) or specializing (plus)"
data-i18n="plus-dice-abbreviation">+Dice</div>
<div class="table-top-mid-nc"
title="add persistant target number modifiers. Used for defaulting or offseting modifiers based on perks"
data-i18n="plus-target-number-abberviation">+TN</div>
<div class="table-top-mid-nc" data-i18n="weight">Weight</div>
<div class="table-top-mid-nc" data-i18n="carrying">Carrying</div>
<div class="table-top-mid-nc" data-i18n="in-stash">In Stash</div>
<div class="table-top-mid-nc" data-i18n="attack">Attack</div>
<div class="table-top-right-nc" data-i18n="notes">Notes</div>
</div>
<div class="melee-table-row">
<div class="text-mid"><input type="checkbox" name="attr_unarmed-equipped" checked></div>
<input class="myweapontxt" type="text" name="attr_unarmed-name" value="Unarmed Combat" disabled>
<select class="mediumselect2" name="attr_unarmedskill">
<option data-i18n="unarmed" value="@{unarmed}" selected>Unarmed</option>
</select>
<input type="number" name="attr_unarmed-conceal" value=0>
<input type="number" name="attr_unarmed-reach" value=0>
<div class="meleespan"><span name="attr_strength_max"></span></div>
<select name="attr_attackdamage" class="mediumselect2">
<option data-i18n="moderate-stun-abbreviation" value="M(stun)" SELECTED>M(stun)</option>
</select>
<input type="number" name="attr_unarmed-specialized" value=0 \>
<input type="number" name="attr_unarmed-miscmods" value=0 \>
<input type="number" name="attr_unarmed-weight" disabled value=0>
<div class="text-mid"></div>
<div class="text-mid"></div>
<div><button class="attack-dice" id="unarmedattack" type="action" name="act_melee" title="Melee Attack"></button></div>
<input name="attr_notes" type="text"></input>
</div>
<div class="table-bottom" />
<input type='hidden' class='weaponfocus-show' name='attr_weaponfocus-show' value="false" />
<div class="show-weaponfocus-melee">
<div class="weaponfocus">
<div class="text-mid"><input type="checkbox" name="attr_weaponfocus-equipped" checked></div>
<input class="myweapontxt" type="text" name="attr_weaponfocus-name" value="Weapon Focus">
<select class="mediumselect2" name="attr_weaponfocus skill">
<option value="@{edged}" SELECTED data-i18n="edged">Edged</option>
<option value="@{clubs}" data-i18n="club">Club</option>
<option value="@{poles}" data-i18n="pole-arm">Pole Arm</option>
<option value="@{whips}" data-i18n="whip">Whip</option>
</select>
<input type="number" name="attr_weaponfocus-conceal" value=0>
<input type="number" name="attr_weaponfocus-reach" value=0>
<input type="number" name="attr_weaponfocus-power" value=0>
<select name="attr_weaponfocus-damage" class="mediumselect2">
<option data-i18n="light-damage-abbreviation">L</option>
<option data-i18n="moderate-damage-abbreviation" SELECTED>M</option>
<option data-i18n="serious-damage-abbreviation">S</option>
<option data-i18n="deadly-damage-abbreviation">D</option>
</select>
<input type="number" name="attr_weaponfocus-specialized" value=0 \>
<input type="number" name="attr_weaponfocus-tnmods" value=0 \>
<input type="number" name="attr_weaponfocus-weight" value=0>
<div class="text-mid"><input type="radio" name="attr_weaponfocus-load" value=1 checked></div>
<div class="text-mid"><input type="radio" name="attr_weaponfocus-load" value=0></div>
<div><button class="attack-dice" id="weaponfocus" type="action" name="act_melee"
title="Melee Attack"></button></div>
<input class="myweapontxt" type="text" name="attr_weaponfocus-notes">
</div>
<div class="table-bottom" />
</div>
<fieldset class="repeating_meleeweapons">
<div class="melee-table-row">
<div class="text-mid"><input type="checkbox" name="attr_meleeequiped"></div>
<input type="text" name="attr_name">
<select name="attr_skill" class="mediumselect2">
<option data-i18n="club" value="@{clubs}">Club</option>
<option data-i18n="cyber-implant" value="@{cyberimplant}">Cyber Implant</option>
<option data-i18n="edged" value="@{edged}">Edged</option>
<option data-i18n="pole-arm" value="@{poles}">Pole Arm</option>
<option data-i18n="whip" value="@{whips}">Whip</option>
<option data-i18n="unarmed" value="@{unarmed}" selected>Unarmed</option>
</select>
<input type="number" name="attr_conceal" value=0 \>
<input type="number" name="attr_reach" value=0 \>
<input type="number" name="attr_power" value=0>
<select name="attr_damage" class="mediumselect2">
<option data-i18n="light-damage-abbreviation" title="Light Damage" value="L" SELECTED>L</option>
<option data-i18n="moderate-damage-abbreviation" title="Moderate Damage" value="M">M</option>
<option data-i18n="serious-damage-abbreviation" title="Serious Damage" value="S">S</option>
<option data-i18n="deadly-damage-abbreviation" title="Deadly Damage" value="D">D</option>
<option data-i18n="light-stun-abbreviation" title="Light Stun" value="L(stun)">L(s)</option>
<option data-i18n="moderate-stun-abbreviation" title="Moderate Stun" value="M(stun)">M(s)</option>
<option data-i18n="serious-stun-abbreviation" title="Serious Stun" value="S(stun)">S(s)</option>
<option data-i18n="deadly-stun-abbreviation" title="Deadly Stun" value="D(stun)">D(s)</option>
</select>
<input type="number" name="attr_specialized" value=0 \>
<input type="number" name="attr_tnmods" value=0 \>
<input type="number" name="attr_weight" value=0 step='0.01'>
<div class="text-mid"><input type="radio" name="attr_load" value=1 checked></div>
<div class="text-mid"><input type="radio" name="attr_load" value=0></div>
<input name="attr_miscnotes" type="text" hidden=true value="Reach Bonus: ">
<div><button class="attack-dice" type="action" name="act_attack" id="repeatingmelee"
title="Melee Attack"></button></div>
<div><input name="attr_notes" type="text"></input></div>
</div>
<div class="table-bottom" />
</fieldset>
<br>
<div class="weight">
<div data-i18n="weight">Weight</div>
<div></div>
<div class="numberspan"><span name="attr_melee-weight-final"></span>kg</div>
</div>
</div>
<div class="explosives">
<div class="explosives-table-header">
<div class="table-top-left-nc" data-i18n="name">Name</div>
<div class="table-top-mid-nc" data-i18n="type">Type</div>
<div class="table-top-mid-nc" data-i18n="conceal">Conceal</div>
<div class="table-top-mid-nc" data-i18n="minimum-abbreviation">Min</div>
<div class="table-top-mid-nc" data-i18n="short-abbreviation">S</div>
<div class="table-top-mid-nc" data-i18n="medium-abbreviation">M</div>
<div class="table-top-mid-nc" data-i18n="long-abbreviation">L</div>
<div class="table-top-mid-nc" data-i18n="extreme-abbreviation">Ex</div>
<div class="table-top-mid-nc" data-i18n="power">Power</div>
<div class="table-top-mid-nc" data-i18n="damage">Damage</div>
<div class="table-top-mid-nc" data-i18n="intelligence-abbreviation">Intel.</div>
<div class="table-top-mid-nc" data-i18n="blast">Blast</div>
<div class="table-top-mid-nc" data-i18n="scatter">Scatter</div>
<div class="table-top-mid-nc" data-i18n="quantity-abbreviation">Qty.</div>
<div class="table-top-mid-nc" data-i18n="manual">Manual</div>
<div class="table-top-mid-nc" data-i18n="sensor">Sensor</div>
<div class="table-top-right-nc" data-i18n="more">More</div>
</div>
<fieldset class="repeating_explosives">
<div class="explosives-table-row">
<input type="text" name="attr_name" class="myweapontxt">
<select name="attr_exptype" class="mediumselect2">
<option data-i18n="regular-offensive" value="Regular:O">R/O (Regular Offensive)</option>
<option data-i18n="regular-defensive" value="Regular:D">R/D (Regular Defensive)</option>
<option data-i18n="regular-concussion" value="Regular:C">R/C (Regular Concussion)</option>
<option data-i18n="aerodynamic-offensive" value="Aerodynamic:O">A/O (Aerodynamic Offensive)</option>
<option data-i18n="aerodynamic-defensive" value="Aerodynamic:D">A/D (Aerodynamic Defensive)</option>
<option data-i18n="aerodynamic-concussion" value="Aerodynamic:C">A/C (Aerodynamic Concussion)
</option>
<option data-i18n="launcher-offensive" value="Launcher:O">L/O (Launcher Offensive)</option>
<option data-i18n="launcher-defensive" value="Launcher:D">L/D (Launcher Defensive)</option>
<option data-i18n="launcher-concussion" value="Launcher:C">L/C (Launcher Concussion)</option>
<option data-i18n="other" selected value="Other:Other">Other</option>
</select>
<input type="number" name="attr_conceal" value=0>
<input type="number" name="attr_min" value=0>
<input type="number" name="attr_short" value=0>
<input type="number" name="attr_medium" value=0>
<input type="number" name="attr_long" value=0>
<input type="number" name="attr_extreme" value=0>
<input type="number" name="attr_power" value=1>
<div>
<select name="attr_damage" class="mediumselect2">
<option data-i18n="light-damage-abbreviation" title="Light Damage" value="L" SELECTED>L</option>
<option data-i18n="moderate-damage-abbreviation" title="Moderate Damage" value="M">M</option>
<option data-i18n="serious-damage-abbreviation" title="Serious Damage" value="S">S</option>
<option data-i18n="deadly-damage-abbreviation" title="Deadly Damage" value="D">D</option>
<option data-i18n="light-stun-abbreviation" title="Light Stun" value="L(stun)">L(s)</option>
<option data-i18n="moderate-stun-abbreviation" title="Moderate Stun" value="M(stun)">M(s)
</option>
<option data-i18n="serious-stun-abbreviation" title="Serious Stun" value="S(stun)">S(s)</option>
<option data-i18n="deadly-stun-abbreviation" title="Deadly Stun" value="D(stun)">D(s)</option>
</select>
</div>
<input type="number" name="attr_missleint" value=0>
<input type="number" name="attr_blast" value=0 step=0.05>
<input type="number" name="attr_scatter" value=1>
<input type="number" name="attr_ammoremain" value=0>
<div><button class="explosive-dice" type="action" name="act_rangedattack" id="explosive"
title="Explosives Attack"></button></div>
<div><button type="action" name="act_rangedattack" id="sensorexp"
title="Sensor Assisted Attack">f</button>
</div>
<div>
<input type="hidden" class="show-weaponmods" name="attr_showmore" value="show">
<button class="pictos-button" type="action" name="act_showmore" title="Show More">y</button>
</div>
<input type="hidden" class="show-weaponmods" name="attr_showmore" value="show">
</div>
<input type="hidden" name="attr_scatterredux">
<input type="hidden" class="show-weaponmods" name="attr_showmore" value="show">
<div class="explosive-mods-switch">
<div data-i18n="skill">Skill</div>
<div data-i18n="plus-dice-abbreviation"
title="add or remove dice from skill rating. Used for defaulting (minus) or specializing (plus)">
+Dice</div>
<div data-i18n="plus-target-number-abberviation"
title="add persistant target number modifiers. Used for defaulting or offseting modifiers based on perks">
+TN</div>
<div data-i18n="recoil-compensation-abbreviation">Recoil Comp</div>
<div data-i18n="gyro-stabalization">Gyro Stabalization</div>
<div data-i18n="target-assistance">Targeting Assistance</div>
<div data-i18n="range-finder">Range Finder</div>
<div data-i18n="weight">Weight</div>
<div data-i18n="carrying">Carrying</div>
<div data-i18n="in-stash">In Stash</div>
<div data-i18n="notes">Notes:</div>
<select name="attr_skill" class="mediumselect2">
<option data-i18n="throw" selected value="@{throwing}">Throw</option>
<option data-i18n="launcher" value="@{launchers}">Launcher</option>
<option data-i18n="demolition" value="@{demolitions}">Demolition</option>
</select>
<div><input type="number" name="attr_specialized" value=0></div>
<div><input type="number" name="attr_tnmods" value=0></div>
<div><input type="number" name="attr_recoilcomp" value=0></div>
<select class="mediumselect2" name="attr_gyro">
<option data-i18n="none" value="0" SELECTED>None</option>
<option data-i18n="regular" value="5">Regular</option>
<option data-i18n="deluxe" value="6">Deluxe</option>
</select>
<select class="mediumselect2" name="attr_targeting">
<option data-i18n="none" value="0" SELECTED>None</option>
<option data-i18n="smartlink" value="-2">Smartlink</option>
<option data-i18n="laser-sight" value="-1">LaserSight</option>
<option data-i18n="smart-goggles" value="-1.00">Smart Goggles</option>
</select>
<div><input name="attr_rangefinder" type="number"></div>
<div><input type="number" name="attr_weight" value=0 step='0.01'></div>
<div class="text-mid"><input type="radio" name="attr_load" value=1 checked></div>
<div class="text-mid"><input type="radio" name="attr_load" value=0></div>
<input name="attr_notes" type="text"></input>
</div>
</fieldset>
<br>
<div class="weight">
<div data-i18n="weight">Weight</div>
<div></div>
<div class="numberspan"><span name="attr_explosives-weight"></span>kg</div>
</div>
</div>
<div class="armor">
<input type="hidden" name="attr_armor-combatpool-pen" value=0>
<input type="hidden" name="attr_armor-quickness-pen" value=0>
<div class="armor-headers">
<header data-i18n="pain-resistance">Pain Resistance: </header><input type='number' name='attr_adeptpainres'
value="0" min="0">
<header data-i18n="ballistic">Ballistic: </header><input type='number' name='attr_ballistic' value="0"
min="0">
<header data-i18n="impact">Impact: </header><input type='number' name='attr_impact' value="0" min="0">
<header data-i18n="quickness-penalty">Quickness Penalty:</header>
<div> <span name="attr_armor-quickness-pen" value=0></span></div>
<header data-i18n="combat-pool-penalty">Combat Pool Penalty:</header>
<div> <span name="attr_armor-combatpool-pen" value=0></span></div>
<header data-i18n="dermal-armor">Dermal Armor:</header><input name="attr_dermal-armor" type="checkbox"
value=1>
</div>
<div class="armorsets-table-header">
<div class="table-top-left-nc" data-i18n="equip">Equip</div>
<div class="table-top-mid-nc" data-i18n="name">Name</div>
<div class="table-top-mid-nc" data-i18n="slot">Slot</div>
<div class="table-top-mid-nc" data-i18n="ballistic-rating">Ballistic Rating</div>
<div class="table-top-mid-nc" data-i18n="impact-rating">Impact Rating</div>
<div class="table-top-mid-nc" data-i18n="weight">Weight</div>
<div class="table-top-mid-nc" data-i18n="carrying">Carrying</div>
<div class="table-top-mid-nc" data-i18n="in-stash">In Stash</div>
<div class="table-top-right-nc" data-i18n="notes">Notes</div>
</div>
<fieldset class="repeating_armor">
<div class="armorsets-table-row">
<div class="text-mid"><input type="checkbox" name="attr_equipped">
</div>
<input type=text name="attr_armorname" class="myweapontxt">
<div><select name="attr_slot" class="mediumselect2">
<option SELECTED value="body" data-i18n="body">body</option>
<option value="helmet" data-i18n="helmet">helmet</option>
<option value="shield" data-i18n="shield">shield</option>
<option value="ware" data-i18n="cyberware">cyberware</option>
<option value="ware" data-i18n="bioware">bioware</option>
<option value="ware" data-i18n="nanoware">nanoware</option>
<option value="gyro" data-i18n="gyro-harness">gyro harness</option>
<option value="magic" data-i18n="magic">magic</option>
</select>
</div>
<input type="number" value=0 name="attr_ballistic">
<input type="number" value=0 name="attr_impact">
<div><input type="number" name="attr_weight" value=0 step='0.01'></div>
<div class="text-mid"><input type="radio" name="attr_load" value=1 checked></div>
<div class="text-mid"><input type="radio" name="attr_load" value=0></div>
<input name="attr_armornotes" type="text"></input>
</div>
<div class="table-bottom" />
</fieldset>
<br>
<div class="weight">
<div data-i18n="weight">Weight</div>
<div></div>
<div class="numberspan"><span name="attr_armor-weight"></span>kg</div>
</div>
</div>
<div class="ammo">
<div class="ammunition-list">
<div class="ammo-table-header">
<div class="table-top-left-nc" data-i18n="ammo-type">Ammo Type</div>
<div class="table-top-mid-nc" data-i18n="quantity">Quantity</div>
<div class="table-top-mid-nc" data-i18n="weight">Weight</div>
<div class="table-top-mid-nc" data-i18n="carrying">Carrying</div>
<div class="table-top-mid-nc" data-i18n="in-stash">In Stash</div>
<div class="table-top-right-nc" data-i18n="damage-modifier">Damage Modifier</div>
</div>
<fieldset class="repeating_ammunition">
<div class="ammo-table-row">
<select name="attr_ammotype" class="mediumselect2 ammotype">
<option data-i18n="regular" value="regular">Regular</option>
<option data-i18n="explosive" value="explosive">Explosive</option>
<option data-i18n="explosive-ex" value="explosive2">Explosive EX</option>
<option value="gyrojet">GyroJet</option>
<option value="gyrojetplus">GyroJet Plus</option>
<option value="gyrojetplusseeker">GyroJet Plus Seeker</option>
<option value="gyrojetseeker">GyroJet Seeker</option>
<option value="arrows">Arrows</option>
<option value="arrowsexp">Arrow Explosive</option>
<option value="arrowsexpex">Arrow Explosive EX</option>
<option value="screamer">Screamer</option>
<option data-i18n="hammerheads" value="hammerheads">Hammerheads</option>
<option value="net">Net</option>
<option value="largenet">Large Net</option>
<option data-i18n="adps" value="adps">ADPS</option>
<option data-i18n="flechette" value="flechette">Flechette</option>
<option data-i18n="gel" value="gel">Gel</option>
<option data-i18n="tracer" value="tracer">Tracer</option>
<option data-i18n="anti-vehicle" value="av">Anti-Vehicl</option>
<option data-i18n="capsule" value="capsule">Capsule</option>
<option data-i18n="glazer" value="glazer">Glazer</option>
<option data-i18n="Hi-C" value="hic">Hi-C</option>
<option data-i18n="hollow-point" value="hpoint">Hollow Point</option>
<option data-i18n="incendiary" value="incendiary">Incendiary</option>
<option data-i18n="mercury" value="mercury">Mercury</option>
<option data-i18n="tracker" value="tracker">Tracker</option>
<option value="bigd">Big D's Temper</option>
<option data-i18n="bola" value="bola">Bola</option>
<option data-i18n="flare" value="flare">Flare</option>
<option value="shocklock">Shock Lock</option>
<option data-i18n="stun-shell" value="stunshell">Stun Shell</option>
</select>
<div><input type="number" name="attr_ammocount" value=0></div>
<div><input type="number" name="attr_ammoweight" value=0 step='0.01'></div>
<div class="text-mid"><input type="radio" name="attr_ammoload" value=1 checked></div>
<div class="text-mid"><input type="radio" name="attr_ammoload" value=0></div>
<input name="attr_ammonotes" type="text"></input>
</div>
<div class="table-bottom" />
</fieldset>
<br>
<div class="weight">
<div data-i18n="weight">Weight</div>
<div></div>
<div class="numberspan"><span name="attr_ammunition-weight"></span>kg</div>
</div>
</div>
</div>
</div>
<div class="matrix">
<input class="matrixalert-format" type='hidden' name="attr_matrixalert" hidden=true value='None'>
<input type="number" name="attr_matrixsecuritynumber" hidden="true">
<div class="matrix-always-displayed">
<div class="matrix-attributes">
<div data-i18n="type">Type</div>
<div data-i18n="grid">Grid</div>
<div class="matrix-rating">
<div class="header" data-i18n="security-code">Security Code</div>
<div>-</div>
<div class="header" data-i18n="security-value"> Security Value</div>
<div>/</div>
<div class="header" data-i18n="access"> Acesss</div>
<div>/</div>
<div class="header" data-i18n="control"> Control</div>
<div>/</div>
<div class="header" data-i18n="index"> Index</div>
<div>/</div>
<div class="header" data-i18n="files"> Files</div>
<div>/</div>
<div class="header" data-i18n="slave"> Slave</div>
</div>
<div><select name="attr_matrixobject" class="mediumselect2">
<option data-i18n="grid" value="Grid">Grid</option>
<option data-i18n="host" value="Host">Host</option>
<option data-i18n="virtual-machine-abbreviation" value="VM">VM</option>
</select></div>
<input type="text" name="attr_parentgrid">
<div class="matrix-rating">
<div><select name="attr_matrixcode" class="mediumselect2">
<option data-i18n="blue" value="BLUE" SELECTED>BLUE</option>
<option data-i18n="green" value="GREEN">GREEN</option>
<option data-i18n="orange" value="ORANGE">ORANGE</option>
<option data-i18n="red" value="RED">RED</option>
</select></div>
<div>-</div>
<div><input type="number" name="attr_matrixsecurityrating"></div>
<div>/</div>
<div><input type="number" name="attr_matrixaccessrating"></div>
<div>/</div>
<div><input type="number" name="attr_matrixcontrolrating"></div>
<div>/</div>
<div><input type="number" name="attr_matrixindexrating"></div>
<div>/</div>
<div><input type="number" name="attr_matrixfilesrating"></div>
<div>/</div>
<div><input type="number" name="attr_matrixslaverating"></div>
</div>
</div>
<div class="matrix-status">
<div></div>
<div class="matrix-systemrating">
<div><span name="attr_matrixcode"></span> -
<span name="attr_matrixsecurityrating"></span> /
<span name="attr_matrixaccessrating"></span> /
<span name="attr_matrixcontrolrating"></span> /
<span name="attr_matrixindexrating"></span> /
<span name="attr_matrixfilesrating"></span> /
<span name="attr_matrixslaverating"></span>
</div>
</div>
<div></div>
<div data-i18n="detection-roll">Detection Roll</div>
<div><button type="action" class="d6-button" name="act_matrixdetect" title="Detection Roll"
id="systemdetect">L</button></div>
<div data-i18n="security-tally">Security Tally</div><input
title="Security Tally for all intruding icons in the system" type="number"
name="attr_matrixsecuritytally">
<div></div>
<div title="Reset Security Tally for all icons in the system">Reset Tally</div>
<div><button type="action" class="pictos-button" name="act_matrixdetect" title="Detection Roll"
id="resettally">0</button></div>
<div data-i18n="alert-status">Alert Status</div>
<select name="attr_matrixalert" class="mediumselect2">
<option data-i18n="none" value=0>None</option>
<option data-i18n="passive" value=4>Passive</option>
<option data-i18n="active" value=5>Active</option>
</select>
<input type="number" name="attr_matrixalertTN" hidden=true>
</div>
</div>
<div class="matrixhost">
<input type='hidden' class='securitysheaf-switch' name='attr_securitysheafswitch' value="show" />
<div class="securitysheaf-show">
<div class="SRH3">Security Sheaf</div>
<button class="switch-button-show" type="action" name="act_securitysheafswitch"
data-i18n="show">Show</button>
</div>
<div class="securitysheaf-hide">
<div class="SRH3">Security Sheaf</div>
<button class="switch-button-hide" type="action" name="act_securitysheafswitch"
data-i18n="hide">Hide</button>
</div>
<br>
<div class="securitysheaf">
<div class="securitytally-header">
<header data-i18n="trigger-step" class="table-top-left">Trigger Step</header>
<header data-i18n="event" class="table-top-right">Event</header>
</div>
<fieldset class="repeating_security">
<div class="securitytally">
<div class="table-item-left"><input type="number" name="attr_step"></div>
<div class="table-item"><input type="text" name="attr_event"></div>
</div>
</fieldset>
<br>
<div class="matrix-intruder-tally-header">
<header data-i18n="intruder" class="table-top-left">Intruder</header>
<header data-i18n="detection" class="table-top-mid">Detection</header>
<header data-i18n="security-tally" class="table-top-mid">Security Tally</header>
<header data-i18n="rest-tally" class="table-top-mid">Reset Tally</header>
<header data-i18n="select-token" class="table-top-right">Select Token</header>
</div>
<fieldset class="repeating_intruders">
<div class="matrix-intruder-tally">
<div class="table-item-left"><input type="text" name="attr_intrudername"></div>
<div class="table-item"><button type="action" class="d6-button" name="act_detect" id="systemdetect"
title="Detection Roll for intruding icon">L</button></div>
<div class="table-item"><input type="number" name="attr_securitytally" value=0></div>
<div class="table-item"><button type="action" class="pictos-button" name="act_detect"
id="resetsecuritytally" title="Reset Security Tally">0</button></div>
<div class="table-item"><button type="action" class="pictos-custom-button" name="act_settokenname"
id="ic" title="Set Token Name by Selecting Token">w</button></div>
</div>
</fieldset>
</div>
</div>
<br>
<input type='hidden' class='ic-switch' name='attr_ic-switch' value="show" />
<div class="ic-show">
<div class="SRH3" data-i18n="intrusion-countermeasures">Intrusion Countermeasures</div>
<button class="switch-button-show" type="action" name="act_ic-switch" data-i18n="show">Show</button>
</div>
<div class="ic-hide">
<div class="SRH3" data-i18n="intrusion-countermeasures">Intrusion Countermeasures</div>
<button class="switch-button-hide" type="action" name="act_ic-switch" data-i18n="hide">Hide</button>
</div>
<div class="ic">
<input type='hidden' name='attr_deck-tn' value=0 />
<div class="ic-attributes">
<header class="table-top-left" data-i18n="name">Name</header>
<header class="table-top-mid" data-i18n="rating">Rating</header>
<header class="table-top-mid" data-i18n="initiative">Initiative</header>
<header class="table-top-mid" data-i18n="damage">Damage</header>
<header class="table-top-mid" data-i18n="type">Type</header>
<header class="table-top-mid" data-i18n="test-target">Test Target</header>
<header class="table-top-mid" data-i18n="sensor">Sensor</header>
<header class="table-top-mid" data-i18n="evade">Evade</header>
<header class="table-top-mid" data-i18n="parry">Parry</header>
<header class="table-top-mid" data-i18n="position">Position</header>
<header class="table-top-mid" data-i18n="execute">Execute</header>
<header class="table-top-right" data-i18n="resist">Resist</header>
</div>
<fieldset class="repeating_ic">
<input type="hidden" name="attr_ic-penalty" value=0>
<div class="ic-attributes-table">
<div><input type="text" name="attr_icname"></div>
<div><input type="number" name="attr_icrating"></div>
<div><span name="attr_matrixsecuritynumber"></span>d6 +<span name="attr_icrating"></span><button
type="action" name="act_init" class="d6-button" title="IC Initiative Roll">L</button></div>
<div><input type="number" name="attr_ic-damage" value=0 min=0 max=10></div>
<div><select name="attr_ictype" class="mediumselect2">
<option data-i18n="crippler" value="Crippler">Crippler</option>
<option data-i18n="killer" value="Killer">Killer</option>
<option data-i18n="probe" value="Probe">Probe</option>
<option data-i18n="scramble" value="Scramble">Scramble</option>
<option data-i18n="tar-baby" value="Tar Baby">Tar Baby</option>
<option data-i18n="blaser" value="Blaster">Blaster</option>
<option data-i18n="ripper" value="Ripper">Ripper</option>
<option data-i18n="sparky" value="Sparky">Sparky</option>
<option data-i18n="tar-pi" value="Tar pit">Tar pit</option>
<option data-i18n="black-ic-lethal" value="blackiclethal">Black IC Lethal</option>
<option data-i18n="black-ic-non-lethal" value="blackicnonlethal">Black IC Non-Lethal</option>
<option data-i18n="data-bomb" value="Data Bomb">Data Bomb</option>
<option data-i18n="pavlov" value="Pavlov">Pavlov</option>
<option data-i18n="scout" value="Scout">Scout</option>
<option data-i18n="trace" value="Trace">Trace</option>
<option data-i18n="cerebropathic" value="cerebropathic">Cerebropathic</option>
<option data-i18n="psychotropic" value="psychotropic">Psychotropic</option>
</select></div>
<div><select name="attr_ictargettest" class="mediumselect2">
<option value="@{target|decker|deck-bod-final}" data-i18n="bod">Bod</option>
<option value="@{target|decker|deck-evasion-final}" data-i18n="evasion">Evasion</option>
<option value="@{target|decker|deck-sensors-final}" data-i18n="sensor">Sensor</option>
<option value="@{target|decker|deck-masking-final}" data-i18n="masking">Masking</option>
<option value="@{target|decker|deck-detection-final}" data-i18n="detection-factor">DetectionFactor</option>
<option data-i18n="attack" value="attack">Attack</option>
<option value="@{target|decker|computer}" data-i18n="computer-skill">Computer Skill</option>
<option value="?{Utility Rating?|4}" data-i18n="utility-target-number-abbreviation">Utility TN
</option>
<option value="@{target|decker|deck-mpcp-final}" data-i18n="mpcp">MPCP</option>
</select></div>
<div><button type="action" name="act_matrixtest" class="pictos-button" title="Sensors Test" id="deck-sensors-final">f</button></div>
<div><button type="action" class="d6-button" name="act_matrixmaneuvers" title="Evade Detection" id="icevade">L</button></div>
<div><button type="action" class="d6-button" name="act_matrixmaneuvers" title="Parry Attack" id="icparry">L</button></div>
<div><button type="action" class="d6-button" name="act_matrixmaneuvers" title="Position Attack" id="icposition">L</button></div>
<div><button type="action" class="pictos-custom-button" name="act_combat" title="IC Execute" id="icattack">[</button></div>
<div><button type="action" class="pictos3-button" name="act_matrixresist" title="IC Resist" id="icresist">b</button></div>
<div><textarea name="attr_icnotes" style='width:275px;height:25px;'></textarea>
</div>
</fieldset>
</div>
<br>
<div class="matrixrapid">
<div data-i18n="rapid-settings-system-rating">Rapid Settings System Rating</div><input type="text"
name="attr_matrixsystemset"><button class="quicksettings" type="action" name="act_matrixsystemset"
data-i18n="apply">Apply</button>
</div>
</div>
<div class="vehicles">
<input type='hidden' class='sheet-tabstoggle' name='attr_sheetTab'>
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="vehicle-only">
<div class="vehicle-buttons">
<input type='hidden' class='sheet-tabstoggle' name='attr_sheetTab' />
<button class="vehicle-attr-button" type="action" name="act_vehicle-attr-tab"
data-i18n="vehicle-attributes">Vehicle Attributes</button>
<button class="vehicle-combat-button" type="action" name="act_vehicle-combat-tab"
data-i18n="vehicle-combat">Vehicle Combat</button>
<button class="vehicle-notes-button" type="action" name="act_vehicle-notes-tab"
data-i18n="vehicle-notes">Vehicle Notes</button>
<button class="vehicle-ecm-button" type="action" name="act_vehicle-ecm-tab"
data-i18n="ecm-flux">ECM/FLUX</button>
</div>
</div>
<div class="drone-only">
<div class="vehicle-buttons">
<input type='hidden' class='sheet-tabstoggle' name='attr_sheetTab' />
<button class="vehicle-attr-button" type="action" name="act_vehicle-attr-tab"
data-i18n="drone-attributes">Drone Attributes</button>
<button class="vehicle-combat-button" type="action" name="act_vehicle-combat-tab"
data-i18n="drone-combat">Drone Combat</button>
<button class="vehicle-notes-button" type="action" name="act_vehicle-notes-tab"
data-i18n="drone-notes">Drone Notes</button>
<button class="vehicle-ecm-button" type="action" name="act_vehicle-ecm-tab"
data-i18n="ecm-flux">ECM/FLUX</button>
</div>
</div>
<div class="vehicle-always-displayed">
<div>
<div class="vehicle-combat-modifiers">
<div class="vehicle-interface">
<header class="table-close-nc" data-i18n="interface">Interface</header>
<div>
<div class="vehicle-interface-details">
<div data-i18n="none">None</div>
<div> <input type="radio" name="attr_vehicle-interface" value="none" checked="checked">
</div>
<div data-i18n="datajack">Datajack</div>
<div><input type="radio" name="attr_vehicle-interface" value="datajack"></div>
<div data-i18n="VCR">VCR</div>
<div><input type="radio" name="attr_vehicle-interface" value="vcr"></div>
<div data-i18n="autonav">Autonav</div>
<div><input type="checkbox" name="attr_vehicle-autonav" value=1></div>
</div>
</div>
</div>
<div class="vehicle-speed">
<header class="table-close-nc" data-i18n="speed">Speed</header>
<div>
<div class="vehicle-speed-details">
<div data-i18n="current">Current</div>
<div data-i18n="maximum">Maximum</div>
<div><input type="number" name="attr_speed-current" value=0 min=0></div>
<div><span name="attr_speed-max"></span></div>
</div>
<br>
<br>
</div>
</div>
<div class="vehicle-maneuever">
<header class="table-close-nc" data-i18n="maneuever">Maneuever</header>
<div>
<div class="vehicle-maneuever-details">
<div>Score</div>
<div><input type="number" name="attr_maneuver-score" value=0 min=0></div>
<div><button class="small-rollbutton" id="generate" title="Generate Maneuver Score" type="action" name="act_maneuever" data-i18n="generate">Generate</button></div>
<div><button class="small-rollbutton" id="compare" title="Compare Maneuver Score between two vehicles" type="action" name="act_maneuever" data-i18n="compare">Compare</button></div>
</div>
<br>
<br>
</div>
</div>
<div class="vehicle-env">
<header class="table-close-nc">Terrain</header>
<div>
<div class="vehicle-env-details">
<div data-i18n="off-road">Off Road:</div>
<div><input type="checkbox" name="attr_vehicle-offroad" value=1></div>
</div>
<div>
<div>Terrain</div>
<select name="attr_terrain" class="mediumselect2">
<option data-i18n="normal" value="Normal" SELECTED>Normal</option>
<option data-i18n="open" value="Open">Open</option>
<option data-i18n="restricted" value="Restricted">Restricted</option>
<option data-i18n="tight" value="Tight">Tight</option>
</select>
</div>
<br>
<br>
</div>
</div>
<div class="vehicle-env">
<header class="table-close-nc" data-i18n="environment">Environment</header>
<div>
<div class="vehicle-env-details table-close-nc">
<div data-i18n="urban-setting">Urban Setting:</div>
<div><input type="checkbox" name="attr_vehicle-urban" value=1></div>
<div data-i18n="combat-zone">Combat Zone:</div>
<div><input type="checkbox" name="attr_vehicle-combatzone" value=1></div>
</div>
<div class="vehicle-env-details2">
<div data-i18n="weather">Weather</div>
<select name="attr_weather" class="mediumselect2">
<option value="Normal" data-i18n="normal" SELECTED>Normal</option>
<option value="Bad" data-i18n="bad">Bad</option>
<option value="Terrible" data-i18n="terrible">Terrible</option>
<option value="Fog" data-i18n="fog">Fog</option>
<option value="Smog" data-i18n="smog">Smog</option>
<option value="Rain" data-i18n="rain">Rain</option>
<option value="Snow" data-i18n="snow">Snow</option>
<option value="ThunderStorm" data-i18n="thunderstorm">ThunderStorm</option>
<option value="Windy" data-i18n="windy">Windy</option>
<option value="Heavy Wind" data-i18n="heavy-wind">Heavy Wind</option>
</select>
</div>
</div>
</div>
<div class="vehicle-sensor">
<header class="table-close-nc" data-i18n="sensor-los">Sensor LOS</header>
<div class="vehicle-sensor-details table-close-nc">
<div>Direct</div>
<div><input type="radio" name="attr_sensor-los" value="direct" checked="checked"></div>
<div>Interupted</div>
<div><input type="radio" name="attr_sensor-los" value="interupted"></div>
</div>
<div class="table-close-nc" data-i18n="sensor-test">Sensor Test</div>
<div><button type="action" class="pictos-button" title="Sensor Test" name="act_vehiclesensor"
id="vehiclesensor">f</button></div>
</div>
</div>
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="vehicle-combat-condition">
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="SRH4 vehicle-only" data-i18n="vehicle">Vehicle</div>
<div class="SRH4 drone-only" data-i18n="drone">Drone</div>
<div data-i18n="undamaged">Undamaged</div>
<div data-i18n="light-damage">Light Damage</div>
<div data-i18n="moderate-damage">Moderate Damage</div>
<div data-i18n="serious-damage">Serious Damage</div>
<div data-i18n="destroyed">Destroyed</div>
<div data-i18n="condition">Condition</div>
<div>
<input type="radio" name="attr_vehicle-damage" value=0 CHECKED>
</div>
<div>
<input type="radio" name="attr_vehicle-damage" value=1>
<input type="radio" name="attr_vehicle-damage" value=2>
</div>
<div>
<input type="radio" name="attr_vehicle-damage" value=3>
<input type="radio" name="attr_vehicle-damage" value=4>
<input type="radio" name="attr_vehicle-damage" value=5>
</div>
<div>
<input type="radio" name="attr_vehicle-damage" value=6>
<input type="radio" name="attr_vehicle-damage" value=7>
<input type="radio" name="attr_vehicle-damage" value=8>
<input type="radio" name="attr_vehicle-damage" value=9>
</div>
<div><input type="radio" name="attr_vehicle-damage" value=100></div>
</div>
<div class="rc-condition">
<div class="rc-combat-condition">
<div class="SRH4" data-i18n="rc-signal">RC Signal</div>
<div data-i18n="full-strength">Full Strength</div>
<div data-i18n="light-degredation">Light Degredation</div>
<div data-i18n="moderate-degredation">Moderate Degredation</div>
<div data-i18n="serious-degredation">Serious Degredation</div>
<div data-i18n="disengaged">Disengaged</div>
<div class="text-mid-right" data-i18n="command-channel">Command Channel</div>
<div>
<input type="radio" name="attr_rccommand-damage" value=0 CHECKED>
</div>
<div>
<input type="radio" name="attr_rccommand-damage" value=1>
<input type="radio" name="attr_rccommand-damage" value=2>
</div>
<div>
<input type="radio" name="attr_rccommand-damage" value=3>
<input type="radio" name="attr_rccommand-damage" value=4>
<input type="radio" name="attr_rccommand-damage" value=5>
</div>
<div>
<input type="radio" name="attr_rccommand-damage" value=6>
<input type="radio" name="attr_rccommand-damage" value=7>
<input type="radio" name="attr_rccommand-damage" value=8>
<input type="radio" name="attr_rccommand-damage" value=9>
</div>
<div><input type="radio" name="attr_rccommand-damage" value=100></div>
<div class="text-mid-right" data-i18n="simsense-channel">Simsense Channel</div>
<div>
<input type="radio" name="attr_rcsimsense-damage" value=0 CHECKED>
</div>
<div>
<input type="radio" name="attr_rcsimsense-damage" value=1>
<input type="radio" name="attr_rcsimsense-damage" value=2>
</div>
<div>
<input type="radio" name="attr_rcsimsense-damage" value=3>
<input type="radio" name="attr_rcsimsense-damage" value=4>
<input type="radio" name="attr_rcsimsense-damage" value=5>
</div>
<div>
<input type="radio" name="attr_rcsimsense-damage" value=6>
<input type="radio" name="attr_rcsimsense-damage" value=7>
<input type="radio" name="attr_rcsimsense-damage" value=8>
<input type="radio" name="attr_rcsimsense-damage" value=9>
</div>
<div><input type="radio" name="attr_rcsimsense-damage" value=100></div>
<div class="text-mid-right" data-i18n="system-channel">System Channel</div>
<div>
<input type="radio" name="attr_rcsystem-damage" value=0 CHECKED>
</div>
<div>
<input type="radio" name="attr_rcsystem-damage" value=1>
<input type="radio" name="attr_rcsystem-damage" value=2>
</div>
<div>
<input type="radio" name="attr_rcsystem-damage" value=3>
<input type="radio" name="attr_rcsystem-damage" value=4>
<input type="radio" name="attr_rcsystem-damage" value=5>
</div>
<div>
<input type="radio" name="attr_rcsystem-damage" value=6>
<input type="radio" name="attr_rcsystem-damage" value=7>
<input type="radio" name="attr_rcsystem-damage" value=8>
<input type="radio" name="attr_rcsystem-damage" value=9>
</div>
<div><input type="radio" name="attr_rcsystem-damage" value=100></div>
</div>
</div>
</div>
<div class="vehicle-quickstats-border">
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="vehicle-driver">
<button type="action" name="act_setrigger" id="rigger"
title="Set Rigger/Vehicle Operator Name by Selecting Token" data-i18n="driver">Driver</button>
<input type="text" name="attr_rigger" class="myweapontxt" />
<button type="action" class="pictos-button" name="act_setrigger" id="refresh-rigger"
title="Update Control Pool and Gunnery skill for operator">0</button>
</div>
<div class="vehicle-quickstats">
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div></div>
<div data-i18n="maimum-abbreviation">Max</div>
<div data-i18n="used">Used</div>
<div data-i18n="control-pool">Control Pool:</div>
<input type="number" name="attr_controlpool" min=0 value=0>
<div><input type='hidden' class='controlpool-over' name='attr_controlpool-over' /><span
class="controlpool-over" name="attr_controlpool-used"></span></div>
</div>
<br>
<header class="table-top-nc" data-i18n="skills">Skills</header>
<div class="vehicle-quickstats">
<div data-i18n="vehicle">Vehicle:</div>
<input type="number" name="attr_vehicle-skill" min=0 value=0>
<div></div>
<div data-i18n="gunnery">Gunnery:</div>
<input type="number" name="attr_gunnery" min=0 value=0>
<div></div>
<div class="drone-only" data-i18n="pilot-rating">Pilot Rating:</div>
<div class="drone-only"><span name="attr_pilot" /></div>
<div></div>
</div>
<br>
<header class="table-top-nc drone-only" data-i18n="operative-mode">Operative Mode:</header>
<div class="vehicle-quickstats">
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="drone-only" data-i18n="primary">Primary:</div>
<div class="drone-only"></div>
<div class="drone-only"><input type="radio" name="attr_drone_mode" value="primary"></div>
<div class="drone-only" data-i18n="secondary">Secondary:</div>
<div class="drone-only"></div>
<div class="drone-only"><input type="radio" name="attr_drone_mode" value="secondary"></div>
</div>
</div>
</div>
<div class="vehicle-attr-tab">
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="SRH4 vehicle-only" data-i18n="vehicle-configuration">Vehicle Configuration</div>
<div class="SRH4 drone-only" data-i18n="drone-configuration">Drone Configuration</div>
<div class="vehicle-info">
<div class="text-mid-left" data-i18n="name">Name</div>
<div data-i18n="manual-control">Manual Control</div>
<div data-i18n="datajack-port">Datajack Port</div>
<div data-i18n="rigger-adaption">Rigger Adaption</div>
<div data-i18n="remote-control">Remote Control</div>
<div class="text-mid" data-i18n="vehicle-type">Vehicle Type </div>
<div class="text-mid" data-i18n="vehicle-size">Vehicle Size </div>
<input type="text" name="attr_character_name">
<div><input type="checkbox" name="attr_vehicle-control" value=0></div>
<div><input type="checkbox" name="attr_vehicle-datajack" value=0></div>
<div><input type="checkbox" name="attr_vehicle-riggeradapted" value=0></div>
<div><input type="checkbox" name="attr_vehicle-rc" value=0></div>
<select name="attr_vehicle-type" class="mediumselect2">
<option data-i18n="car-pickup-truck" value="cartruck" SELECTED>Car/Pickup Truck</option>
<option data-i18n="fighter-jet" value="jet">Fighter Jet</option>
<option data-i18n="heavy-truck" value="bigtruck">Heavy Truck</option>
<option data-i18n="helicopter" value="helicopter">Helicopter</option>
<option data-i18n="hovercraft" value="hovercraft">Hovercraft</option>
<option data-i18n="suborbital" value="suborbital">HSCT/Suborbital</option>
<option data-i18n="large-airplane" value="bigplane">Large Airplane</option>
<option data-i18n="lav" value="lav">LAV/T-bird</option>
<option data-i18n="limousine" value="limo">Limousine/Light Truck/Van</option>
<option data-i18n="lighter-than-air" value="lta">LTA/Zeppelin</option>
<option data-i18n="motorcycle" value="motorcycle">Motorcycle</option>
<option data-i18n="racing-boat" value="racingboat">Racing Boat</option>
<option data-i18n="semiballistic" value="semiballistic">Semiballistic</option>
<option data-i18n="small-airplane" value="smallplane">Small Airplane</option>
<option data-i18n="small-boat" value="smallboat">Small Motorboat</option>
<option data-i18n="sports-car" value="sportscar">Sports Car</option>
<option data-i18n="tracked-vehicle" value="tracked">Tracked Vehicle</option>
<option data-i18n="tractor-trailer" value="tractor">Tractor Trailer</option>
<option data-i18n="train" value="train">Train/Monorail</option>
<option data-i18n="ultralight" value="ultralight">Ultra-light Aircraft</option>
<option data-i18n="yacht" value="yacht">Yacht</option>
<option data-i18n="walkers" value="walkers">Walkers</option>
</select>
<select name="attr_vehicle-size" class="mediumselect2">
<option data-i18n="normal" value="Normal" SELECTED>Normal</option>
<option data-i18n="large" value="Large">Large</option>
<option data-i18n="extra-large" value="Extra-Large">Extra-Large</option>
</select>
</div>
<div class="vehicle-stats">
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="SRH4 vehicle-only" data-i18n="vehicle-attributes">Vehicle Attributes</div>
<div class="SRH4 drone-only" data-i18n="drone-attributes">Drone Attributes</div>
<div class="vehicle-stats-regular">
<div class="vehicle-attributes">
<div data-i18n="handling">Handling:</div>
<div class="vehicle-offroad"><input type="number" name="attr_handling-street" min=0 value=0 />
<input type="number" name="attr_handling-offroad" min=0 value=0 />
</div>
<div data-i18n="speed">Speed:</div>
<div class="vehicle-offroad">
<input type="number" name="attr_speed-rating" min=0 value=0>
<span name="attr_speed-max"></span>
</div>
<div data-i18n="acceleration">Acceleration:</div>
<input type="number" name="attr_acceleration" min=0 value=0>
<div data-i18n="body">Body:</div>
<input type="number" name="attr_body" min=0 value=0>
<div data-i18n="armor">Armor:</div>
<input type="number" name="attr_armor" min=0 value=0>
<div data-i18n="signature">Signature:</div>
<input type="number" name="attr_signature" min=0 value=0>
<div data-i18n="autonav">Autonav:</div>
<input type="number" name="attr_autonav" min=0 value=0>
<div data-i18n="pilot">Pilot:</div>
<input type="number" name="attr_pilot" min=0 value=0>
</div>
<div class="vehicle-config">
<div data-i18n="firmpoints">Firmpoints:</div>
<input type="number" name="attr_firmpoints" min=0 value=0>
<div data-i18n="hardpoint">Hardpoints:</div>
<input type="number" name="attr_hardpoints" min=0 value=0>
<div data-i18n="seating">Seating:</div>
<div><input type="text" name="attr_seating"></div>
<div data-i18n="entry-points">Entry Points:</div>
<div><input type="text" name="attr_entry"></div>
<div data-i18n="fuel">Fuel:</div>
<input type="text" name="attr_fuel">
<div data-i18n="economy">Economy:</div>
<input type="text" name="attr_economy">
<div data-i18n="cargo">Cargo:</div>
<input type="number" name="attr_cargo" min=0 value=0>
<div data-i18n="load">Load:</div>
<input type="number" name="attr_load" min=0 value=0>
</div>
<div class="vehicle-misc">
<div data-i18n="vehicle-skill">Vehicle Skill:</div>
<input type="number" name="attr_vehicle-skill" min=0 value=0>
<div data-i18n="gunnery">Gunnery:</div>
<input type="number" name="attr_gunnery" min=0 value=0>
<div data-i18n="walk">Walk:</div>
<div><span name="attr_walk"></span></div>
<div data-i18n="run">Run:</div>
<div><span name="attr_run"></span></div>
<div data-i18n="ivis-pool">IVIS Pool;</div>
<input type="number" name="attr_ivis-pool" min=0 value=0>
<div data-i18n="stress">Stress:</div>
<input type="number" name="attr_stress" min=0 value=0>
<div data-i18n="setup-breakdown">Setup/Breakdown:</div>
<input type="number" name="attr_setup" min=0 value=0>
<div data-i18n="total-cost">Total Cost:</div>
<input type="number" name="attr_totalcost" min=0 value=0>
</div>
</div>
<div class="SRH4" data-i18n="rapid-attributes-set">Rapid Attribute Set:</div><input type="text"
name="attr_vehicle-rapid-attributes">
<button class="quicksettings" type="action" name="act_vehicleset" data-i18n="apply">Apply</button>
</div>
</div>
</div>
<div class="vehicle-notes-tab">
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="SRH3 vehicle-only" data-i18n="vehicle-notes">Vehicle Notes</div>
<div class="SRH3 drone-only" data-i18n="drone-notes">Drone Notes</div>
<textarea data-i18n="modification-notes" name="attr_vehicle-notes"
style='width:500px;height:200px'>Modification Notes</textarea>
</div>
<div class="vehicle-ecm-tab">
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="SRH3 vehicle-only" data-i18n="vehicle-electronics-and-ecm-eccm">Vehicle Electornics and ECM/ECCM</div>
<div class="SRH3 drone-only" data-i18n="drone-electronics-and-ecm-eccm">Drone Electornics and ECM/ECCM</div>
<div class="vehicle-flux">
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="SRH4 vehicle-only" data-i18n="vehicle-flux-rating">Vehicle Flux Rating</div>
<div class="SRH4 drone-only" data-i18n="drone-flux-rating">Drone Flux Rating</div>
<span name="attr_vehicle-flux-max"></span>
<div class="SRH4 vehicle-only" data-i18n="vehicle-flux-used">Vehicle Flux Used</div>
<div class="SRH4 drone-only" data-i18n="drone-flux-used">Drone Flux Used</div>
<div><input type='hidden' class='vehicle-flux-overload' name='attr_vehicle-flux-overload' value=0 />
<span class="flux-overload" name="attr_vehicle-fluxtotal"></span>
</div>
</div>
<div class="vehicle-electronics">
<header class="table-top-left"></header>
<header class="table-top-mid" data-i18n="rating">Rating</header>
<header class="table-top-mid" data-i18n="flux-rating">Flux Rating</header>
<header class="table-top-mid" data-i18n="modified-flux">Modified Flux</header>
<header class="table-top-mid" data-i18n="max-flux">Max Flux</header>
<header class="table-top-mid" data-i18n="roll-test">Roll Test</header>
<header class="table-top-right" data-i18n="opposition-test">Opposition Test</header>
<div class="table-item-left" data-i18n="sensors">Sensors:</div>
<div class="table-item"><input type="number" name="attr_sensors-rating" min=0 value=0></div>
<div class="table-item"><span name="attr_sensors-flux"></div>
<div class="table-item"><input type="number" name="attr_sensors-fluxmod" min=0 value=0></div>
<div class="table-item"><span name="attr_sensors-fluxmax"></div>
<div class="table-item"><button type="action" class="pictos-button" title="Sensor Test" name="act_vehiclesensor"
id="vehiclesensor">f</button></div>
<div class="table-item"></div>
<div class="table-item-left" data-i18n="sonar">Sonar:</div>
<div class="table-item"><input type="number" name="attr_sonar-rating" min=0 value=0></div>
<div class="table-item"><span name="attr_sonar-flux"></div>
<div class="table-item"><input type="number" name="attr_sonar-fluxmod" min=0 value=0></div>
<div class="table-item"><span name="attr_sonar-fluxmax"></div>
<div class="table-item"><button type="action" class="d6-button" name="act_ewarfare" title="Sonar Test"
id="sonar">L</button></div>
<div class="table-item"></div>
<div class="table-item-left" data-i18n="ECM">ECM:</div>
<div class="table-item"><input type="number" name="attr_ecm-rating" min=0 value=0></div>
<div class="table-item"><span name="attr_ecm-flux"></div>
<div class="table-item"><input type="number" name="attr_ecm-fluxmod" min=0 value=0></div>
<div class="table-item"><span name="attr_ecm-fluxmax"></div>
<div class="table-item"><button type="action" class="d6-button" name="act_ewarfare" title="ECM Jamming"
id="ecmjamming">L</button></div>
<div class="table-item"><button type="action" class="d6-button" name="act_ewarfare" title="ECM Opposition Test"
id="ecmopposition">L</button></div>
<div class="table-item-left data-i18n=" ECCM"">ECCM:</div>
<div class="table-item"><input type="number" name="attr_eccm-rating" min=0 value=0></div>
<div class="table-item"><span name="attr_eccm-flux"></div>
<div class="table-item"><input type="number" name="attr_eccm-fluxmod" min=0 value=0></div>
<div class="table-item"><span name="attr_eccm-fluxmax"></div>
<div class="table-item"><button type="action" class="d6-button" name="act_ewarfare" title="ECCM Counter-Jamming"
id="eccmcounter">L</button></div>
<div class="table-item"><button type="action" class="d6-button" name="act_ewarfare" title="ECCM Opposition Test"
id="eccmopposition">L</button></div>
<div class="table-item-left" data-i18n="ED">ED:</div>
<div class="table-item"><input type="number" name="attr_ed-rating" min=0 value=0></div>
<div class="table-item"><span name="attr_ed-flux"></div>
<div class="table-item"><input type="number" name="attr_ed-fluxmod" min=0 value=0></div>
<div class="table-item"><span name="attr_ed-fluxmax"></div>
<header class="table-item" data-i18n="activate">Activate</header>
<div class="table-item"></div>
<div class="table-item-left" data-i18n="ECD">ECD:</div>
<div class="table-item"><input type="number" name="attr_ecd-rating" min=0 value=0></div>
<div class="table-item"><span name="attr_ecd-flux"></div>
<div class="table-item"><input type="number" name="attr_ecd-fluxmod" min=0 value=0></div>
<div class="table-item"><span name="attr_ecd-fluxmax"></div>
<div class="table-item"><input type="checkbox" name="attr_ecd-enabled" value=1></div>
<div class="table-item"></div>
</div>
</div>
<div class="vehicle-combat-tab">
<div class="vehicle-stats-mini">
<div class="text-mid" data-i18n="initiative">Initiative:</div>
<div class="center-checkbox"><button type="action" name="act_init" class="d6-button" title="Vehicle Initiative"
id="vehicleinit">L</button></div>
<div class="text-mid" data-i18n="end-turn">End Turn:</div>
<div class="center-checkbox"><button type="action" name="act_endturn" class="d6-button" title="End Combat Turn"
id="endturn">L</button></div>
<div class="text-mid" data-i18n="handling-abbreviation">Hand</div>
<div class="text-mid"><span name="attr_handling"></span><button type="action" class="d6-button"
title="Driving Test" name="act_vehicledriving" id="driving">L</button></div>
<div class="text-mid" data-i18n="accleration-abbreviation">Accel:</div>
<div class="text-mid"><span name="attr_acceleration"></span>
<button type="action" class="d6-button" title="Vehicle Acceleration Test" name="act_vehicleaction"
id="accelerating">L</button>
</div>
<div class="text-mid" data-i18n="body">Body:</div>
<div class="text-mid"><span name="attr_body"></span><button type="action" class="d6-button"
title="Resist Damage" name="act_resistvehicledmg" id="resistvehicledmg">L</button></div>
<div class="text-mid" data-i18n="armor">Armor:</div>
<div class="text-mid"><span name="attr_armor"></span></div>
<div class="text-mid" data-i18n="signature-abbreviation">Sig:</div>
<div class="text-mid"><span name="attr_signature"></span></div>
<div class="text-mid" data-i18n="auto-pilot-rating-abbreviation">Auto:</div>
<div class="text-mid"><span name="attr_autonav"></span></div>
<div class="text-mid" data-i18n="sensor">Sensor:</div>
<div class="text-mid"><span name="attr_sensors-rating"></span><button type="action" class="pictos-button"
title="Sensor Test" name="act_vehiclesensor" id="vehiclesensor">f</button></div>
</div>
<div class="vehicle-actions">
<input type='hidden' class='buttontoggle' name='attr_sheettype' />
<div class="SRH3 vehicle-only" data-i18n="vehicle-actions">Vehicle Actions</div>
<div class="SRH3 drone-only" data-i18n="drone-actions">Drone Actions</div>
<div><button type="action" class="basic-button" title="Vehicle Acceleration Test" name="act_vehicleaction"
id="accelerating" data-i18n="accelerate">Accelerate</button></div>
<div><button type="action" class="basic-button" title="Vehicle Breaking Test" name="act_vehicleaction"
id="breaking" data-i18n="brake">Brake</button></div>
<div><button type="action" class="basic-button" title="Vehicle Positioning Test" name="act_vehicleposition"
id="position">Position</button></div>
<div><button type="action" class="basic-button" title="Vehicle Ramming Test" name="act_vehicleaction" id="ram"
data-i18n="ram">Ram</button></div>
<div><button type="action" class="basic-button" title="Vehicle Hiding Test" name="act_vehicleaction" id="hide"
data-i18n="hide">Hide</button></div>
<div><button type="action" class="basic-button" title="Vehicle Relocate Test" name="act_vehicleaction"
id="relocate" data-i18n="relocate">Relocate</button></div>
<div><button type="action" class="basic-button" title="Vehicle Crash Test" name="act_vehiclecrash" id="crash"
data-i18n="crash">Crash</button></div>
</div>
<input type='hidden' class='gunnery-switch' name='attr_gunneryswitch' value="show" />
<div class="vehicle-manual-gunnery">
<div class="table-top-left" data-i18n="relative-motion">Relative Motion</div>
<div class="table-top-mid" data-i18n="movement">Movement</div>
<div class="table-top-mid" data-i18n="maneuver-score">Maneuver Score</div>
<div class="table-top-mid" data-i18n="visibility">Visibility</div>
<div class="table-top-mid" data-i18n="sensor-mode">Sensor Mode</div>
<div class="table-top-mid" data-i18n="target-type">Target Type</div>
<div class="table-top-mid" data-i18n="manual-target-nubmber-abbreviation">Manual TN</div>
<div class="table-top-mid" data-i18n="sensor-target-nubmber-abbreviation">Sensor TN</div>
<div class="table-top-right">Recoil</div>
<div class="table-item-left"><select name="attr_gunnerymotion" class="mediumselect2"
title="motion relative to target">
<option data-i18n="none" value=0 selected>None</option>
<option data-i18n="towards" value=-1>Towards</option>
<option data-i18n="away" value=1>Away</option>
</select></div>
<div class="table-item"><select name="attr_move" class="mediumselect2" title="relative movement target">
<option data-i18n="about-equal" value=0 selected>About Equal</option>
<option data-i18n="up-to-2x" value=2>Up to 2X</option>
<option data-i18n="up-to-3x" value=4>Up to 3X</option>
<option data-i18n="more-than-3x" value=6>More than 3X</option>
<option data-i18n="not-moving" value=0>Not Moving</option>
<option data-i18n="walk" value=1>walk</option>
<option data-i18n="walk-difficult-ground" value=2>walk (difficult ground)</option>
<option data-i18n="run" value=4>run</option>
<option data-i18n="run-difficult-ground" value=6>run (difficult ground)</option>s
</select></div>
<div class="table-item"><select name="attr_gunnerymaneuver" class="mediumselect2"
title="Maneuver score difference">
<option data-i18n="none" value=0 selected>None</option>
<option data-i18n="attacker-greater-by-10" value=-1>Attacker Greaty by 10</option>
<option data-i18n="target-greater-by-10" value=1>Target Greater by 10</option>
</select></div>
<div class="table-item"><select name="attr_visibility" class="mediumselect2">
<option data-i18n="normal" value=0 selected>Normal</option>
<option data-i18n="full-dark " value="@{fulldark}">Full Dark</option>
<option data-i18n="partial-light" value="@{partiallight}">Partail Light</option>
<option data-i18n="minimal-light" value="@{minlight}">Minimal Light</option>
<option data-i18n="glare" value="@{glare}">Glare</option>
<option data-i18n="mist" value="@{mist}">Mist</option>
<option data-i18n="light-smoke-rain" value="@{lightsmoke}">Light Smoke/Rain</option>
<option data-i18n="heavy-smoke-rain" value="@{fullsmoke}">Heavy Smoke/Rain</option>
<option data-i18n="thermal-smoke" value="@{thermalsmoke}">Thermal Smoke</option>
</select> </div>
<div class="table-item"><select name="attr_visionenhancement" class="mediumselect2">
<option value="None" data-i18n="none">None</option>
<option value="LowLight" SELECTED data-i18n="low-light">LowLight</option>
<option value="Thermal" data-i18n="thermal">Thermal</option>
</select></div>
<input type='hidden' name='attr_gunnermount' value=0" />
<div class="table-item"><select name="attr_gunnerytargettype" class="mediumselect2" title="Target type/size">
<option data-i18n="metahuman-sized" value=0 selected>Metahuman sized</option>
<option data-i18n="small-critter" value=1>Small critter</option>
<option data-i18n="large-critter" value=-1>Large critter</option>
<option data-i18n="small-drone" value=1>Small drone</option>
<option data-i18n="motorcycle" value=0>Motorcyle</option>
<option data-i18n="automobile" value=-1>Automobile</option>
<option data-i18n="limo-light-truck" value=-1>Limo/Light Truck</option>
<option data-i18n="heavy-truck-trailer" value=-3>Heavy Truck/Trailer</option>
<option data-i18n="boat" value=-1>Boat</option>
<option data-i18n="yacht" value=-3>Yacht</option>
<option data-i18n="freighter-tanker" value=-8>Freighter/Tanker</option>
<option data-i18n="ultralight-glider" value=0>Ultralight glider</option>
<option data-i18n="fixed-wing" value=-2>Fixed Wing</option>
<option data-i18n="commercial-airliner" value=-6>Commerical Airliner</option>
<option data-i18n="helicopter" value=-2>Helicopter</option>
<option data-i18n="zepplin-blimp" value=-6>Zepplin/Blimp</option>
<option data-i18n="lighter-than-air-aircraft-abbreviated" value=-3>LAV</option>
<option data-i18n="military-ground-vehicle" value=-3>Military Ground Vehicle</option>
</select></div>
<div class="table-item"><span class="text-mid" name="attr_rangedTN"></div>
<div class="table-item"><span class="text-mid" name="attr_sensor-gunnery-tn"></div>
<div class="table-item"><span class="text-mid" name="attr_recoilpen"></div>
</div>
<div class="SRH3" data-i18n="vehicle-weapons">Vehicle Weapons</div>
<div class="vehicles-weapons">
<div class="ranged-table-headers">
<div class="table-top-left" data-i18n="equip">Equip</div>
<div class="table-top-mid" data-i18n="general">General</div>
<div class="table-top-mid" data-i18n="range">Range</div>
<div class="table-top-mid" data-i18n="fire-mode">Fire Mode</div>
<div class="table-top-mid" data-i18n="damage">Damage</div>
<div class="table-top-mid" data-i18n="ammunition">Ammunition</div>
<div class="table-top-right" data-i18n="show">Show</div>
</div>
<div class="ranged-table-items">
<div class="table-item-left" title="Primary Hand"></div>
<div class="table-item" title="Off Hand"></div>
<div class="table-item" data-i18n="name">Name</div>
<div class="table-item" data-i18n="type">Type</div>
<div class="table-item" data-i18n="mount">Mount</div>
<div class="table-item" data-i18n="minimum-abbreviation">Min</div>
<div class="table-item" data-i18n="short-abbreviation">S</div>
<div class="table-item" data-i18n="medium-abbreviation">M</div>
<div class="table-item" data-i18n="long-abbreviation">L</div>
<div class="table-item" data-i18n="extreme-abbreviation">Ex</div>
<div class="table-item" data-i18n="single-shot-abbreviation">SS</div>
<div class="table-item" data-i18n="semi-automatic-abbreviation">SA</div>
<div class="table-item" data-i18n="burst-fire-abbreviation">BF</div>
<div class="table-item" data-i18n="full-automatic-abbreviation">FA</div>
<div class="table-item" data-i18n="power">Power</div>
<div class="table-item" data-i18n="damage">Damage</div>
<div class="table-item" data-i18n="maximum-abbreviation">Max</div>
<div class="table-item" data-i18n="remain">Remain</div>
<div class="table-item" data-i18n="manual">Manual</div>
<div class="table-item" data-i18n="sensor">Sensor</div>
<div class="table-item" data-i18n="more">More</div>
</div>
<fieldset class="repeating_rangedweapons">
<div class="ranged-table-row-bg">
<div></div>
<div></div>
<input type="text" name="attr_name" class="myweapontxt">
<select name="attr_type" class="mediumselect2">
<option SELECTED>Other</option>
<option>Hold-out Pistol</option>
<option>Light Pistol</option>
<option>Machine Pistol</option>
<option>Heavy Pistol</option>
<option>SMG</option>
<option>Taser</option>
<option>Shotgun</option>
<option>Sporting Rifle</option>
<option>Sniper Rifle</option>
<option>Assault Rifle</option>
<option>Light Machine Gun</option>
<option>Medium Machine Gun</option>
<option>Heavy Machine Gun</option>
<option>Assault Cannon</option>
<option>Minigun</option>
<option>Bow</option>
<option>Light Crossbow</option>
<option>Medium Crossbow</option>
<option>Heavy Crossbow</option>
<option>Sling Shot</option>
<option>Sling Launcher</option>
<option>Thrown Knife</option>
<option>Shuriken</option>
<option>Caltrops</option>
<option>Nets</option>
<option>Bracer</option>
<option>Gun Cane</option>
<option>Speargun</option>
<option>Net Gun</option>
<option>Laser Pistol</option>
<option>Laser Rifle</option>
<option>Laser Sniper</option>
<option>"Gyrojet (land)</option>
<option>"Gyrojet (water)</option>
<option>Flamethrower</option>
<option>Blowgun</option>
</select>
<select name="attr_weaponmont" class="mediumselect2">
<option SELECTED">Hard</option>
<option>Firm</option>
<option>Hard</option>
<option>Turret</option>
</select>
<input type="number" name="attr_min">
<input type="number" name="attr_short">
<input type="number" name="attr_medium">
<input type="number" name="attr_long">
<input type="number" name="attr_extreme">
<input type="hidden" name="attr_firemode" value="sa">
<div class="text-mid"><input type="radio" name="attr_firemode" value="ss"></div>
<div class="text-mid"><input type="radio" name="attr_firemode" value="sa"></div>
<div class="text-mid"><input type="radio" name="attr_firemode" value="bf"></div>
<div class="text-mid"><input type="radio" name="attr_firemode" value="fa"></div>
<input type="number" name="attr_power" value=1>
<select name="attr_damage" class="mediumselect2">
<option data-i18n="light-damage-abbreviation" title="Light Damage" value="L" SELECTED>L</option>
<option data-i18n="moderate-damage-abbreviation" title="Moderate Damage" value="M">M</option>
<option data-i18n="serious-damage-abbreviation" title="Serious Damage" value="S">S</option>
<option data-i18n="deadly-damage-abbreviation" title="Deadly Damage" value="D">D</option>
<option data-i18n="light-stun-abbreviation" title="Light Stun" value="L(stun)">L(s)</option>
<option data-i18n="moderate-stun-abbreviation" title="Moderate Stun" value="M(stun)">M(s)</option>
<option data-i18n="serious-stun-abbreviation" title="Serious Stun" value="S(stun)">S(s)</option>
<option data-i18n="deadly-stun-abbreviation" title="Deadly Stun" value="D(stun)">D(s)</option>
</select>
<input type="number" name="attr_ammo" value=0>
<input type="number" name="attr_ammoremain" value=0>
<div><button class="attack-dice" type="action" id="vehicleranged" name="act_rangedattack"
title="Manual Gunnery"></button></div>
<div><button type="action" id="vehiclesensor" name="act_rangedattack"
title="Sensor Enhanced Gunnery">f</button></div>
<div>
<input type="hidden" class="show-weaponmods" name="attr_showmore" value="show">
<button class="pictos-button" type="action" name="act_showmore" title="Show More">y</button>
</div>
<input type="hidden" class="show-weaponmods" name="attr_showmore" value="show">
<span class="show-weaponmods">
<div class="vranged-mods">
<div class="text-mid" data-i18n="skill" class="text-mid"
title="choose weapon active skill, use Other if there is no match and put skill level in Specialized box">
<b>Skill</div>
<div class="text-mid" data-i18n="plus-dice-abbreviation"
title="add or remove dice from skill rating. Used for defaulting (minus) or specializing (plus)">
+Dice</div>
<div class="text-mid" data-i18n="plus-target-number-abberviation"
title="add persistant target number modifiers. Used for defaulting or offseting modifiers based on perks">
+TN</div>
<div class="text-mid" title="Gas vents and other recoil accesories"
data-i18n="recoil-compensation-abbreviation">Recoil Comp</div>
<div class="text-mid" data-i18n="gyro-stabalization">Gyro Stabalization</div>
<div class="text-mid" title="accesories that improve to hit number for ranged combat"
data-i18n="none">Targeting Assistance </div>
<div class="text-mid" title="Clip, Belt, Cylinder, Magazine or Action Break"
data-i18n="reload-type">Reload Type </div>
<div class="text-mid" title="number or clips, belts or individual rounds" data-i18n="reloads">
Reloads</div>
<div class="text-mid" data-i18n="ammo-type">Ammo Type</div>
<div class="text-mid" data-i18n="weight">Weight:</div>
<div class="text-mid" data-i18n="notes">Notes:</div>
<select name="attr_skill" class="mediumselect2"
title="choose weapon active skill, use Other if there is no match and put skill level in Specialized box">
<option SELECTED value="@{gunnery}" data-i18n="gunnery">Gunnery</option>
</select>
<div><input type="number" name="attr_specialized" value=0></div>
<div><input type="number" name="attr_tnmods" value=0></div>
<div><input type="number" name="attr_recoilcomp" title="Gas vents and other recoil accesories"
value=0></div>
<select class="mediumselect2" name="attr_gyro">
<option data-i18n="none" value="0" SELECTED>None</option>
<option data-i18n="regular" value="5">Regular</option>
<option data-i18n="deluxe" value="6">Deluxe</option>
</select>
<select class="mediumselect2" name="attr_targeting">
<option data-i18n="none" value="0" SELECTED>None</option>
<option data-i18n="smartlink" value="-2">Smartlink</option>
<option data-i18n="laser-sight" value="-1">LaserSight</option>
<option data-i18n="smart-goggles" value="-1">Smart Goggles</option>
</select>
<select name="attr_reloadmethod" class="mediumselect2">
<option data-i18n="clip" value="clip">clip</option>
<option data-i18n="break" value="break">break</option>
<option data-i18n="magazine" value="magazine">magazine</option>
<option data-i18n="speed-loader" value="speed loader">speed loader</option>
<option data-i18n="cylinder" value="cylinder">cylinder</option>
<option data-i18n="belt" value="belt">belt</option>
</select>
<div><input type="number" name="attr_reloads" value=0></div>
<select name="attr_ammotype" class="mediumselect2 ammotype">
<option data-i18n="regular" value="regular">Regular</option>
<option data-i18n="explosive" value="explosive">Explosive</option>
<option data-i18n="explosive-ex" value="explosive2">Explosive EX</option>
<option data-i18n="hammerheads" value="hammerheads">Hammerheads</option>
<option value="screamer">Screamer</option>
<option value="gyrojetplus">GyroJet Plus</option>
<option value="gyrojetplusseeker">GyroJet Plus Seeker</option>
<option value="gyrojetseeker">GyroJet Seeker</option>
<option value="largenet">Large Net</option>
<option data-i18n="adps" value="adps">ADPS</option>
<option data-i18n="flechette" value="flechette">Flechette</option>
<option data-i18n="gel" value="gel">Gel</option>
<option data-i18n="tracer" value="tracer">Tracer</option>
<option data-i18n="anti-vehicle" value="av">Anti-Vehicl</option>
<option data-i18n="capsule" value="capsule">Capsule</option>
<option data-i18n="glazer" value="glazer">Glazer</option>
<option data-i18n="Hi-C" value="hic">Hi-C</option>
<option data-i18n="hollow-point" value="hpoint">Hollow Point</option>
<option data-i18n="incendiary" value="incendiary">Incendiary</option>
<option data-i18n="mercury" value="mercury">Mercury</option>
<option data-i18n="tracker" value="tracker">Tracker</option>
<option value="bigd">Big D's Temper</option>
<option data-i18n="bola" value="bola">Bola</option>
<option data-i18n="flare" value="flare">Flare</option>
<option value="shocklock">Shock Lock</option>
<option data-i18n="stun-shell" value="stunshell">Stun Shell</option>
</select>
<div><input type="number" name="attr_weight" value=0 step='0.01'></div>
<textarea name="attr_notes" style='width:190px;height:22px;'></textarea>
</div>
</span>
</div>
<div class="table-bottom" />
</fieldset>
<div class="SRH3">Missles/Rockets</div>
<div class="explosives-table-header">
<div class="table-top-left" data-i18n="name">Name</div>
<div class="table-top-mid" data-i18n="type">Type</div>
<div class="table-top-mid" data-i18n="mount">Mount</div>
<div class="table-top-mid" data-i18n="minimum-abbreviation">Min</div>
<div class="table-top-mid" data-i18n="short-abbreviation">S</div>
<div class="table-top-mid" data-i18n="medium-abbreviation">M</div>
<div class="table-top-mid" data-i18n="long-abbreviation">L</div>
<div class="table-top-mid" data-i18n="extreme-abbreviation">Ex</div>
<div class="table-top-mid" data-i18n="power">Power</div>
<div class="table-top-mid" data-i18n="damage">Damage</div>
<div class="table-top-mid" data-i18n="intelligence-abbreviation">Intel.</div>
<div class="table-top-mid" data-i18n="blast">Blast</div>
<div class="table-top-mid" data-i18n="scatter">Scatter</div>
<div class="table-top-mid" data-i18n="quantity-abbreviation">Qty.</div>
<div class="table-top-mid" data-i18n="manual">Manual</div>
<div class="table-top-mid" data-i18n="sensor">Sensor</div>
<div class="table-top-right" data-i18n="more">More</div>
</div>
<fieldset class="repeating_explosives">
<div class="explosives-table-row-bg">
<input type="text" name="attr_name" class="myweapontxt">
<select name="attr_exptype" class="mediumselect2">
<option data-i18n="launcher-offensive" value="Launcher:O">L/O (Launcher Offensive)</option>
<option data-i18n="launcher-defensive" value="Launcher:D">L/D (Launcher Defensive)</option>
<option data-i18n="launcher-concussion" value="Launcher:C">L/C (Launcher Concussion)</option>
<option data-i18n="other" selected value="Other:Other">Other</option>
</select>
<select name="attr_weaponmont" class="mediumselect2">
<option data-i18n="hardpoint" value="Hardpoint" SELECTED">Hardpoint</option>
<option data-i18n="firmpoint" value="Firmpoint">Firmpoint</option>
<option data-i18n="turret" value="Turret">Turret</option>
</select>
<div class="weaponronum"><span name="attr_min" value=0></span></div>
<div class="weaponronum"><span name="attr_short" value=0></span></div>
<div class="weaponronum"><span name="attr_medium" value=0></span></div>
<div class="weaponronum"><span name="attr_long" value=0></span></div>
<div class="weaponronum"><span name="attr_extreme" value=0></span></div>
<input type="number" name="attr_power" value=1>
<div>
<select name="attr_damage" class="mediumselect2">
<option data-i18n="light-damage-abbreviation" title="Light Damage" value="L" SELECTED>L</option>
<option data-i18n="moderate-damage-abbreviation" title="Moderate Damage" value="M">M</option>
<option data-i18n="serious-damage-abbreviation" title="Serious Damage" value="S">S</option>
<option data-i18n="deadly-damage-abbreviation" title="Deadly Damage" value="D">D</option>
<option data-i18n="light-stun-abbreviation" title="Light Stun" value="L(stun)">L(s)</option>
<option data-i18n="moderate-stun-abbreviation" title="Moderate Stun" value="M(stun)">M(s)
</option>
<option data-i18n="serious-stun-abbreviation" title="Serious Stun" value="S(stun)">S(s)</option>
<option data-i18n="deadly-stun-abbreviation" title="Deadly Stun" value="D(stun)">D(s)</option>
</select>
</div>
<input type="number" name="attr_missleint" value=0>
<input type="number" name="attr_blast" value=0 step=0.05>
<input type="number" name="attr_scatter" value=1>
<input type="number" name="attr_ammoremain" value=0>
<div><button class="explosive-dice" type="action" name="act_rangedattack" id="vehicle-explosive"
title="Explosives Attack"></button></div>
<div><button type="action" name="act_rangedattack" id="vehicle-sensorexp" title="Sensor Assisted Attack"
class="pictos-button">f</button></div>
<div>
<input type="hidden" class="show-weaponmods" name="attr_showmore" value="show">
<button class="pictos-button" type="action" name="act_showmore" title="Show More">y</button>
</div>
<input type="hidden" class="show-weaponmods" name="attr_showmore" value="show">
<input type="hidden" name="attr_scatterredux">
<div class="explosive-mods-switch">
<div data-i18n="skill">Skill</div>
<div data-i18n="plus-dice-abbreviation"
title="add or remove dice from skill rating. Used for defaulting (minus) or specializing (plus)">
+Dice</div>
<div data-i18n="plus-target-number-abberviation"
title="add persistant target number modifiers. Used for defaulting or offseting modifiers based on perks">
+TN</div>
<div data-i18n="recoil-compensation-abbreviation">Recoil Comp</div>
<div data-i18n="gyro-stabalization">Gyro Stabalization</div>
<div data-i18n="target-assistance">Targeting Assistance</div>
<div data-i18n="range-finder">Range Finder</div>
<div data-i18n="weight">Weight:</div>
<div></div>
<div></div>
<div data-i18n="notes">Notes:</div>
<select name="attr_skill" class="mediumselect2">
<option data-i18n="launcher" selected value="@{launchers}">Launcher</option>
<option data-i18n="demolition" value="@{demolitions}">Demolition</option>
</select>
<div><input type="number" name="attr_specialized" value=0></div>
<div><input type="number" name="attr_tnmods" value=0></div>
<div><input type="number" name="attr_recoilcomp" value=0></div>
<select class="mediumselect2" name="attr_gyro">
<option data-i18n="none" value="0" SELECTED>None</option>
<option data-i18n="regular" value="5">Regular</option>
<option data-i18n="deluxe" value="6">Deluxe</option>
</select>
<select class="mediumselect2" name="attr_targeting">
<option data-i18n="none" value="0" SELECTED>None</option>
<option data-i18n="smartlink" value="-2">Smartlink</option>
<option data-i18n="laser-sight" value="-1">LaserSight</option>
<option data-i18n="smart-goggles" value="-1">Smart Goggles</option>
</select>
<div><input name="attr_rangefinder" type="number"></div>
<div><input type="number" name="attr_weight" value=0 step='0.01'></div>
<div class="text-mid"></div>
<div class="text-mid"></div>
<textarea name="attr_notes" style='width:80px;height:20px'></textarea>
</div>
</div>
<div class="table-bottom" />
</fieldset>
<br>
</div>
</div>
</div>
</div>
<div class="sheet-cyberware">
<div class="cyberware-lists">
<div class="SRH2" data-i18n="cyberware-bioware-nanoware">Cyberware, Bioware and Nanoware</div>
<input type="hidden" class="ware-tabs-switch" name="attr_waretab" value="cyber">
<div class="ware-tabs">
<input type="hidden" class="ware-tabs-switch" name="attr_waretab" value="cyber">
<button class="ware-tabs-cyber" type="action" name="act_cyber-tab" data-i8n="cyberware-uppercase" >CYBERWARE</button>
<button class="ware-tabs-bio" type="action" name="act_bio-tab" data-i8n="bioware-uppercase" >BIOWARE</button>
<button class="ware-tabs-nano" type="action" name="act_nano-tab" data-i8n="nanoware-uppercase" >NANOWARE</button>
<div class="tabs-empty"></div>
</div>
<div class="cyberware">
<div class="cyberware-list">
<header class="table-top-left-nc" data-i18n="name">Name</header>
<header class="table-top-mid-nc" data-i18n="rating">Rating</header>
<header class="table-top-mid-nc" data-i18n="essence">Essence</header>
<header class="table-top-right-nc" data-i18n="description">Description</header>
</div>
<fieldset class="repeating_cyberware">
<div class="cyberware-list">
<div class="table-item-left-nc"><input type="text" name="attr_cyberware-name"></div>
<div class="table-item-nc"><input type="number" name="attr_cyberware-rating"></div>
<div class="table-item-nc"><input type='number' name='attr_cyberware-essence' step='0.01' value=0></div>
<div class="table-item-nc"><input type="text" name="attr_cyberware-notes"></div>
</fieldset>
</div>
<div class="bioware">
<div class="cyberware-list">
<header class="table-top-left-nc" data-i18n="name">Name</header>
<header class="table-top-mid-nc" data-i18n="rating">Rating</header>
<header class="table-top-mid-nc" data-i18n="bio-index">Bio Index</header>
<header class="table-top-right-nc" data-i18n="description">Description</header>
</div>
<fieldset class="repeating_bioware">
<div class="cyberware-list">
<div class="table-item-left-nc"><input type="text" name="attr_bioware-name"></div>
<div class="table-item-nc"><input type="number" name="attr_bioware-rating"></div>
<div class="table-item-nc"><input type='number' name='attr_bioware-index' step='0.01' value=0></div>
<div class="table-item-nc"><input type="text" name="attr_bioware-notes"></div>
</div>
</fieldset>
</div>
<div class="nanoware">
<div class="cyberware-list">
<header class="table-top-left-nc" data-i18n="name">Name</header>
<header class="table-top-mid-nc" data-i18n="rating">Rating</header>
<header class="table-top-mid-nc" data-i18n="essence">Essence</header>
<header class="table-top-right-nc" data-i18n="description">Description</header>
</div>
<fieldset class="repeating_nanotech">
<div class="cyberware-list">
<div class="table-item-left"><input type="text" name="attr_nanotech-name"></div>
<div class="table-item"><input type="number" name="attr_nanotech-rating"></div>
<div class="table-item"><input type='number' name='attr_nanotech-essence' step='0.01' value=0></div>
<div class="table-item"><input type="text" name="attr_nanotech-notes"></div>
</div>
</fieldset>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sheet-contacts">
<div class="SRH2" data-i18n="lifestyle">Lifestyle</div>
<div>
<div>
<div class="SRH3" data-i18n="contacts">Contacts</div>
<div class="contacts">
<header class="table-top-left" data-i18n="contact-type">Name</header>
<header class="table-top-mid" data-i18n="contact-type">Contact Type</header>
<header class="table-top-right" data-i18n="notes">Notes</header>
</div>
<fieldset class="repeating_contacts">
<div class="contacts">
<input type="text" name="attr_name">
<select name="attr_contacttype" class="mediumselect2">
<option SELECTED data-i18n="contact">Contact</option>
<option value="Buddy" data-i18n="buddy">Buddy</option>
<option value="Friend for Life" data-i18n="friend-for-life">Friend for Life</option>
<option value="Followers" data-i18n="followers">Followers</option>
</select>
<input name="attr_contactdetail" type="text" value="Name Occupation Upkeep">
</div>
</fieldset>
</div>
</div>
<div>
<div class="SRH3" data-i18n="lifesytle-class-gear-at-home">Lifestyle Class/Gear at Home</div>
<div class="lifestyles">
<header class="table-top-left" data-i18n="lifestyle">Lifestyle</header>
<header class="table-top-mid" data-i18n="cost">Cost</header>
<header class="table-top-mid" data-i18n="months-paid">Months Paid</header>
<header class="table-top-mid" data-i18n="address">Address</header>
<header class="table-top-mid" data-i18n="description">Description</header>
<header class="table-top-mid" data-i18n="edges-flaws">Edges/Flaws</header>
</div>
<fieldset class="repeating_lifestyles">
<div class="lifestyles">
<input type="text" name="attr_lifestyle">
<input type="number" name="attr_cost">
<input type="number" name="attr_monthspaid">
<input type="text" name="attr_address">
<input type="text" name="attr_description">
<input type="text" name="attr_edgesflaws">
</div>
</fieldset>
</div>
</div>
<div class="sheet-spirit">
</div>
<div class="sheet-critter-powers">
<div class="critter-powers">
<div>
<div class="SRH4" data-i18n="powers">Powers</div>
<div class="critter-powers-table-header">
<div class="table-top-left"><b data-i18n="power">Power</div>
<div class="table-top-right"><b data-i18n="description">Description</div>
</div>
<fieldset class='repeating_critter-powers'>
<div class="critter-powers-table">
<div class="table-item-left"><input type="text" name="attr_name" /></div>
<div class="table-item"><input type="text" name="attr_description" /></div>
</div>
</fieldset>
</div>
<div>
<div class="SRH4" data-i18n="weakness">Weakness</div>
<div class="critter-powers-table">
<div class="table-top-left"><b data-i18n="weakness">Weakness</div>
<div class="table-top-right"><b data-i18n="description">Description</div>
</div>
<fieldset class='repeating_critter-weaknesses'>
<div class="critter-powers-table">
<div class="table-item-left"><input type="text" name="attr_name" /></div>
<div class="table-item"><input type="text" name="attr_description" /></div>
</div>
</fieldset>
</div>
</div>
</div>
<div id="popup1" class="overlay">
<div class="popup">
<h2 data-i18n="json-import">JSON Import</h2>
<a class="close" href="#">×</a>
<div class="content">
<textarea name="attr_jsonnpc" style='width:500px;height:400px;resize:none; overlfow-y: scroll;'></textarea>
<button type="action" name="act_jsonimport-char" href="#" data-i18n="json-import">JSON Import</button>
</div>
</div>
</div>
<div id="popup2" class="overlay">
<div class="popup">
<h2 data-i18n="json-export">JSON Export</h2>
<a class="close" href="#">×</a>
<div class="content">
<textarea name="attr_jsonout" style='width:500px;height:400px;resize:none; overlfow-y: scroll;'></textarea>
<button type="action" name="act_jsonexport-char" href="#" data-i18n="json-export">JSON Export</button>
</div>
</div>
</div>
<script type="text/worker">
const buttonlist = ["character","skills","magic","decks","gear","combat","rigger", "contacts", "critter-powers", "karma", "cyberware","vehicle-attr-tab", "vehicle-combat-tab", "vehicle-notes-tab", "vehicle-ecm-tab"];
buttonlist.forEach(button => {
console.log(button)
on(`clicked:${button}`, function() {
setAttrs({ sheetTab: button });
});
});
const geartabs = ["gear", "credsticks", "vehiclelist"];
geartabs.forEach(tab => {
button=tab + "-tab";
console.log(button)
on(`clicked:${button}`, function() {
setAttrs({ geartab: tab });
});
});
const magictabs = ["astral", "sorcery", "adept", "conjuring", "geas", "totem", "initiate", "foci", "spells"];
magictabs.forEach(magic => {
button=magic + "-tab";
console.log(button)
on(`clicked:${button}`, function() {
setAttrs({ magictab: magic });
});
});
const combattabs = ["combat", "ranged", "melee", "explosives", "armor", "ammo"];
combattabs.forEach(tab => {
button=tab + "-tab";
console.log(button)
on(`clicked:${button}`, function() {
setAttrs({ combattab: tab });
});
});
const riggertabs = ["rcdeck", "subscriber", "rigger"];
riggertabs.forEach(tab => {
button=tab + "-tab";
console.log(button)
on(`clicked:${button}`, function() {
setAttrs({ riggertab: tab });
});
});
const waretabs = ["cyber", "bio", "nano"];
waretabs.forEach(tab => {
button=tab + "-tab";
console.log(button)
on(`clicked:${button}`, function() {
setAttrs({ waretab: tab });
});
});
const deckingtabs = ["decking", "frame", "cyberdeck", "utilities"];
deckingtabs.forEach(tab => {
button=tab + "-tab";
console.log(button)
on(`clicked:${button}`, function() {
setAttrs({ deckingtab: tab });
});
});
</script>
<script type="text/worker">
var lang={}
on("sheet:opened", function() {
geti18n();
});
const geti18n = function() {
console.log('calling i18n for roll query');
lang["blackic"] = getTranslationByKey("black-ic");
lang["blackiclethal"] = getTranslationByKey("black-ic-lethal");
lang["blackicnonlethal"] = getTranslationByKey("black-ic-non-lethal");
lang["cerebropathic"] = getTranslationByKey("cerebropathic");
lang["psychotropic"] = getTranslationByKey("psychotropic");
lang["use-reach-modifier"] = getTranslationByKey("use-reach-modifier");
lang["L"] = getTranslationByKey("light-damage-abbreviation");
lang["M"] = getTranslationByKey("moderate-damage-abbreviation");
lang["S"] = getTranslationByKey("serious-damage-abbreviation");
lang["D"] = getTranslationByKey("deadly-damage-abbreviation");
lang["L(stun)"] = getTranslationByKey("light-stun-abbreviation");
lang["M(stun)"] = getTranslationByKey("moderate-stun-abbreviation");
lang["S(stun)"] = getTranslationByKey("serious-stun-abbreviation");
lang["D(stun)"] = getTranslationByKey("deadly-stun-abbreviation");
lang["decker"] = getTranslationByKey("decker");
lang["evasion"] = getTranslationByKey("evasion");
lang["sensors"] = getTranslationByKey("sensors");
lang["masking"] = getTranslationByKey("masking");
lang["bod"] = getTranslationByKey("bod");
lang["none"] = getTranslationByKey("none");
lang["attack"] = getTranslationByKey("attack");
lang["probe"] = getTranslationByKey("probe");
lang["compare"] = getTranslationByKey("compare");
lang["swap-memory"] = getTranslationByKey("swap-memory");
lang["damage-resistance-test"] = getTranslationByKey("damage-resistance-test");
lang["maneuver-score"] = getTranslationByKey("maneuver-score");
lang["accelerate"] = getTranslationByKey("accelerate");
lang["position"] = getTranslationByKey("position");
lang["crash"] = getTranslationByKey("crash");
lang["driving"] = getTranslationByKey("driving");
lang["drain-damage"] = getTranslationByKey("drain-damage");
lang["drain-modifiers"] = getTranslationByKey("drain-modifiers");
lang["cover-modifiers"] = getTranslationByKey("cover-modifiers");
lang["spirit-focus-dice"] = getTranslationByKey("spirit-focus-dice");
lang["are-you-the-summoner"] = getTranslationByKey("are-you-the-summoner");
lang["additional-modifiers"] = getTranslationByKey("additional-modifiers");
lang["successes-from-hiding-test"] = getTranslationByKey("successes-from-hiding-test");
lang["urban-setting"] = getTranslationByKey("urban-setting");
lang["icon"] = getTranslationByKey("icon");
lang["range"] = getTranslationByKey("range");
lang["ic-rating"] = getTranslationByKey("ic-rating");
lang["light-stun"] = getTranslationByKey("light-stun");
lang["light"] = getTranslationByKey("light");
lang["moderate"] = getTranslationByKey("moderate");
lang["moderate-stun"] = getTranslationByKey("moderate-stun");
lang["serious"] = getTranslationByKey("serious");
lang["serious-stun"] = getTranslationByKey("serious-stun");
lang["deadly"] = getTranslationByKey("deadly");
lang["deadly-stun"] = getTranslationByKey("deadly-stun");
lang["damage"] = getTranslationByKey("damage");
lang["wound-level"] = getTranslationByKey("wound-level");
lang["system-operation-with"] = getTranslationByKey("system-operation-with");
lang["utility"] = getTranslationByKey("utility");
lang["utility-test"] = getTranslationByKey("utility-test");
lang["utility-rating"] = getTranslationByKey("utility-rating");
lang["yes"] = getTranslationByKey("yes");
lang["no"] = getTranslationByKey("no");
lang["miscellaneous-modifiers"] = getTranslationByKey("miscellaneous-modifiers");
lang["out-of-ammo"] = getTranslationByKey("out-of-ammo");
lang["simple"] = getTranslationByKey("simple");
lang["complex"] = getTranslationByKey("complex");
lang["rounds-already-fired-in-combat-phase"] = getTranslationByKey("rounds-already-fired-in-combat-phase");
lang["rounds"] = getTranslationByKey("rounds");
lang["spell-defense"] = getTranslationByKey("spell-defense");
lang["ally"] = getTranslationByKey("ally");
lang["resist-spell"] = getTranslationByKey("resist-spell");
lang["resist-banish"] = getTranslationByKey("resist-banish");
lang["result"] = getTranslationByKey("result");
lang["force"] = getTranslationByKey("force");
lang["dispell"] = getTranslationByKey("dispell");
lang["force-of-spell"] = getTranslationByKey("force-of-spell");
lang["modifiers"] = getTranslationByKey("modifiers");
lang["astral"] = getTranslationByKey("astral");
lang["attack"] = getTranslationByKey("attack");
lang["combat"] = getTranslationByKey("combat");
lang["task-pool"] = getTranslationByKey("task-pool");
lang["task-pool-dice"] = getTranslationByKey("task-pool-dice");
lang["modifiers"] = getTranslationByKey("modifiers");
lang["attacks-msg"] = getTranslationByKey("attacks-msg");
lang["astral-pool"] = getTranslationByKey("astral-pool");
lang["astral-pool-dice"] = getTranslationByKey("astral-pool-dice");
lang["spell-pool"] = getTranslationByKey("spell-pool");
lang["spell-pool-dice"] = getTranslationByKey("spell-pool-dice");
lang["spell-pool-dice-for-drain"] = getTranslationByKey("spell-pool-dice-for-drain");
lang["conjuring-dice-for-drain"] = getTranslationByKey("conjuring-dice-for-drain");
lang["sorcery-dice"] = getTranslationByKey("sorcery-dice");
lang["sorcery-dice-for-drain"] = getTranslationByKey("sorcery-dice-for-drain");
lang["control-pool"] = getTranslationByKey("control-pool");
lang["control-pool-dice"] = getTranslationByKey("control-pool-dice");
lang["hacking-pool"] = getTranslationByKey("hacking-pool");
lang["hacking-pool-dice"] = getTranslationByKey("hacking-pool-dice");
lang["combat-pool"] = getTranslationByKey("combat-pool");
lang["combat-pool-dice"] = getTranslationByKey("combat-pool-dice");
lang["attack-power"] = getTranslationByKey("attack-power");
lang["attack-type"] = getTranslationByKey("attack-type");
lang["distance-from-explosive-in-meters"] = getTranslationByKey("distance-from-explosive-in-meters");
lang["how-many-additional-enemy-vehicles"] = getTranslationByKey("how-many-additional-enemy-vehicles");
lang["normal"] = getTranslationByKey("normal");
lang["elemental"] = getTranslationByKey("elemental");
lang["adps"] = getTranslationByKey("adps");
lang["half"] = getTranslationByKey("half");
lang["double"] = getTranslationByKey("double");
lang["dodge"] = getTranslationByKey("dodge");
lang["target-number"] = getTranslationByKey("target-number");
lang["target"] = getTranslationByKey("target");
lang["spellbocked-msg"] = getTranslationByKey("spellblocked-msg");
lang["missed-msg"] = getTranslationByKey("missed-msg");
lang["verification-system-rating"] = getTranslationByKey("verification-system-rating");
lang["operator"] = getTranslationByKey("operator");
lang["short"] = getTranslationByKey("short");
lang["medium"] = getTranslationByKey("medium");
lang["long"] = getTranslationByKey("long");
lang["extreme"] = getTranslationByKey("extreme");
lang["rigger"] = getTranslationByKey("rigger");
lang["spell-resistance-test"] = getTranslationByKey("spell-resistance-test");
lang["set-vehicle-operator"] = getTranslationByKey("set-vehicle-operator");
lang["update-gunnery-and-control-pool"] = getTranslationByKey("update-gunnery-and-control-pool");
lang["set-decker-for-security-tally"] = getTranslationByKey("set-decker-for-security-tally");
console.log(lang);
};
console.log('loading rangedweapons stats');
const rangedstats = {
"Hold-out Pistol": { short: 5, medium: 15, long: 30, extreme: 50, skill: "@{pistols}", wfamily: "Firearms"},
"Bracer": { short: 5, medium: 15, long: 30, extreme: 50, skill: "@{bracer}", wfamily: "Special"},
"Gun Cane": { short: 5, medium: 15, long: 30, extreme: 50, skill: "@{guncane}", wfamily: "Special"},
"Light Pistol": { short: 5, medium: 15, long: 30, extreme: 50, skill: "@{pistols}", wfamily: "Firearms"},
"Machine Pistol": { short: 5, medium: 15, long: 30, extreme: 50, skill: "@{pistols}", wfamily: "Firearms"},
"Heavy Pistol": { short: 5, medium: 20, long: 40, extreme: 60, skill: "@{pistols}", wfamily: "Firearms"},
"Laser Pistol": { short: 5, medium: 20, long: 40, extreme: 60, skill: "@{lasers}", wfamily: "Laser"},
"SMG": { short: 10, medium: 40, long: 80, extreme: 150, skill: "@{smgs}", wfamily: "Firearms"},
"Speargun": { short: 10, medium: 40, long: 80, extreme: 150, skill: "@{smgs}", wfamily: "Special" },
"Taser": { short: 5, medium: 10, long: 12, extreme: 15, skill: "@{pistols}", wfamily: "Special"},
"Shotgun": { short: 10, medium: 20, long: 50, extreme: 100, skill: "@{shotguns}", wfamily: "Firearms"},
"Net Gun": { short: 10, medium: 20, long: 50, extreme: 100, skill: "@{shotguns}", wfamily: "Special"},
"Sporting Rifle": { short: 100, medium: 250, long: 500, extreme: 750, skill: "@{rifles}", wfamily: "Firearms"},
"Laser Rifle": { short: 100, medium: 250, long: 500, extreme: 750, skill: "@{lasers}", wfamily: "Laser"},
"Sniper Rifle": { short: 150, medium: 300, long: 700, extreme: 1000, skill: "@{rifles}", wfamily: "Firearms"},
"Laser Sniper": { short: 150, medium: 300, long: 700, extreme: 1000, skill: "@{lasers}", wfamily: "Laser"},
"Assault Rifle": { short: 50, medium: 150, long: 350, extreme: 550, skill: "@{assaultrifles}", wfamily: "Firearms"},
"Light Machine Gun": { short: 75, medium: 200, long: 400, extreme: 800, skill: "@{heavyweapons}", wfamily: "Heavy" },
"Medium Machine Gun": { short: 80, medium: 250, long: 750, extreme: 1200, skill: "@{heavyweapons}", wfamily: "Heavy" },
"Heavy Machine Gun": { short: 80, medium: 250, long: 800, extreme: 1500, skill: "@{heavyweapons}", wfamily: "Heavy" },
"Assault Cannon": { short: 100, medium: 300, long: 900, extreme: 2400, skill: "@{heavyweapons}", wfamily: "Heavy" },
"Minigun": { short: 75, medium: 200, long: 400, extreme: 800, skill: "@{heavyweapons}", wfamily: "Heavy" },
"Sling Shot": { short: "mystr", medium: "mystr * 2", long:"mystr * 5", extreme: "mystr * 7", skill: "@{projectiles}", wfamily: "Projectile" },
"Sling Launcher": { short: "mystr * 3", medium: "mystr * 5", long:"mystr * 20", extreme: "mystr * 30", skill: "@{projectiles}", wfamily: "Projectile" },
"Bow": { short: "mystr", medium: "mystr * 10", long:"mystr * 30", extreme: "mystr * 60", skill: "@{projectiles}", wfamily: "Projectile" },
"Light Crossbow": { short: "mystr * 2", medium: "mystr * 8", long: "mystr * 20", extreme: "mystr * 40", skill: "@{projectiles}", wfamily: "Projectile" },
"Medium Crossbow": { short: "mystr * 3", medium: "mystr * 12" , long: "mystr * 30", extreme: "mystr * 50", skill: "@{projectiles}", wfamily: "Projectile" },
"Heavy Crossbow": { short: "mystr * 5", medium: "mystr * 15", long: "mystr * 40", extreme: "mystr * 60", skill: "@{projectiles}", wfamily: "Projectile" },
"Thrown Knife": { short: "mystr", medium: "mystr * 3", long: "mystr * 5", extreme: "mystr * 7", skill: "@{throwing}", wfamily: "Throwing" },
"Shuriken": { short: "mystr", medium: "mystr * 2", long: "mystr * 5", extreme: "mystr * 7", skill: "@{throwing}", wfamily: "Throwing" },
"Caltrops": { short: "mystr * 3", medium: "mystr * 5", long: "mystr * 10", extreme: "mystr * 20", skill: "@{throwing}", wfamily: "Throwing" },
"Nets": { short: 2, medium: 4, long: 6, extreme: 10, skill: "@{throwing}", wfamily: "Throwing" },
"Gyrojet (land)": { short: 5, medium: 20, long: 40, extreme: 60, skill: "@{gyrojet}", wfamily: "Special" },
"Gyrojet (water)": { short: 10, medium: 20, long: 50, extreme: 100, skill: "@{gyrojet}", wfamily: "Special" },
"Blowgun": { short: 3, medium: 8, long: 12, extreme: 15, skill: "@{blowgun}", wfamily: "Special" },
"Flamethrower": { short: 10, medium: 20, long: 50, extreme: 100, skill: "@{spray}", wfamily: "Special" },
"Other": { short: 0, medium: 0, long: 0, extreme: 0, skill: 0, wfamily: "Other" }
}
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);
}
};
on('clicked:jackin', function(info) {
if (!("yes" in lang)) geti18n();
console.log(info);
getAttrs(["matrix-status"], function(myval) {
var sets={};
const mstatus=myval["matrix-status"];
var myroll="/w gm &{template:info}{{character=@{character_name}}}";
myroll+= (mstatus == "out")? "{{type=Jack In}}": "{{type=Jack Out}}";
myroll += "{{action=" + lang["complex"] + "}}";
sets["matrix-status"]= (mstatus == "out")? "in" : "out";
startRoll(myroll, (results) => {
setAttrs(sets);
finishRoll( results.rollId);
});
});
});
on("change:repeating_ammunition:ammotype change:repeating_ammunition:ammoload change:repeating_ammunition:ammocount", function() {
getAttrs(["repeating_ammunition_ammotype", "repeating_ammunition_ammocount", "repeating_ammunition_ammoload"], function(myval) {
const type=myval["repeating_ammunition_ammotype"];
const qty=parseInt(myval["repeating_ammunition_ammocount"]);
const load=parseInt(myval["repeating_ammunition_ammoload"]);
const aweight=(type in ammomods)? ammomods[type]["weight"] : .05;
const atts={};
atts["repeating_ammunition_ammoweight"]=Number((qty * aweight).toFixed(2));
console.log(atts);
setAttrs(atts);
});
});
on("change:ammunition-weight change:armor-weight change:weaponfocus-weight change:meleeweapons-weight change:explosives-weight change:rangedweapons-weight change:gear-weight change:weaponfocus-load", function() {
getAttrs(["ammunition-weight", "armor-weight", "weaponfocus-weight", "weaponfocus-load", "meleeweapons-weight", "explosives-weight", "rangedweapons-weight", "gear-weight"], function(myval) {
console.log(myval);
var sets={};
let ammo=parseFloat(myval["ammunition-weight"]);
let armor=parseFloat(myval["armor-weight"]);
let focus=parseFloat(myval["weaponfocus-weight"]) * parseInt(myval["weaponfocus-load"]);
let melee=parseFloat(myval["meleeweapons-weight"]);
let ranged=parseFloat(myval["rangedweapons-weight"]);
let exp=parseFloat(myval["explosives-weight"]);
let gear=parseFloat(myval["gear-weight"]);
console.log( ammo + ":" + armor + ":" + focus +":"+melee+":"+ranged+":"+exp+":"+gear);
sets["carrying-weight"]=ammo + armor + focus + melee + ranged + exp + gear;
sets["melee-weight-final"]=melee + focus;
console.log(sets);
setAttrs(sets);
});
});
on("change:repeating_rangedweapons:type", function() {
console.log('updating range based on weapon type');
getAttrs(["repeating_rangedweapons_type", "strength_max"], function(myval) {
var myatts={};
const mytype=myval["repeating_rangedweapons_type"];
const mystr=parseInt(myval.strength_max)
console.log('type: ' + mytype);
myatts["repeating_rangedweapons_short"]=eval(rangedstats[mytype]["short"]);
myatts["repeating_rangedweapons_medium"]=eval(rangedstats[mytype]["medium"]);
myatts["repeating_rangedweapons_long"]=eval(rangedstats[mytype]["long"]);
myatts["repeating_rangedweapons_extreme"]=eval(rangedstats[mytype]["extreme"]);
myatts["repeating_rangedweapons_wfamily"]=rangedstats[mytype]["wfamily"];
myatts["repeating_rangedweapons_skill"]=rangedstats[mytype]["skill"];
console.log(myatts);
setAttrs(myatts);
});
});
const matrixtn={BLUE: {Intruder: 6, Legitimate: 3, secrating: 1, wdmg: 2}, GREEN: {Intruder: 5, Legitimate: 4, secrating: 2, wdmg: 2}, ORANGE: {Intruder: 4, Legitimate: 5, secrating: 3, wdmg: 3}, RED: {Intruder: 3, Legitimate: 6, secrating: 4, wdmg: 3}};
const matrixsecnumber={1: "BLUE", 2: "GREEN", 3: "ORANGE",4: "RED"};
const attributes=[ "body", "quickness", "strength", "charisma", "willpower", "intelligence", "force" ];
const quicknesslinked=["@{blowgun}", "@{bracer}", "@{guncane}", "@{gyrojet}", "@{eyegun}", "@{oralgun}", "@{oralstrike}", "@{pistols}", "@{smgs}", "@{rifles}", "@{assaultrifles}", "@{lasers}", "@{whips}", "@{stealth}", "@{shotguns}"]
const damagetable = {
"None": 0,
"L": 1,
"M": 2,
"S": 3,
"D": 4,
0: "None",
9: "None",
1: "L",
2: "M",
3: "S",
4: "D",
"L(stun)": 10,
"M(stun)": 11,
"S(stun)": 12,
"D(stun)": 13,
10: "L(stun)",
11: "M(stun)",
12: "S(stun)",
13: "D(stun)"
}
var getRandomInt = function(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min) + min); //The maximum is exclusive and the minimum is inclusive
}
on("change:weaponfocus-force", function() {
atts=[];
getAttrs(["weaponfocus-force"], function (myval) {
atts["weaponfocus-show"]="false";
if ( myval["weaponfocus-force"] > 0 ) atts["weaponfocus-show"]="true";
setAttrs(atts);
});
});
on('clicked:missed', (info) => {
if (!("yes" in lang)) geti18n();
payload=rollEscape.unescape(info["originalRollId"]);
myroll="/w gm &{template:info}{{character=" + payload["target"] +"}}{{action=" + lang["missed-msg"]+"}}";
startRoll(myroll, (results) => {
finishRoll( results.rollId);
});
});
on('clicked:spellblocked', (info) => {
if (!("yes" in lang)) geti18n();
payload=rollEscape.unescape(info["originalRollId"]);
myroll="/w gm &{template:info}{{character=" + payload["target"] +"}}{{action=" + lang["spellblocked-msg"] +"}}";
startRoll(myroll, (results) => {
finishRoll( results.rollId);
});
});
on('clicked:repeating_gear:usegear', (info) => {
if (!("yes" in lang)) geti18n();
var atts=[];
var source=info['sourceAttribute'].split('_');
var sourceattr=source.pop();
var myrepeat=source.join('_').concat('_');
atts.push(myrepeat.concat("rating"));
atts.push(myrepeat.concat("quantity"));
atts.push(myrepeat.concat("type"));
atts.push(myrepeat.concat("pool"));
atts.push(myrepeat.concat("name"));
getAttrs(atts, function(myval) {
var sets={};
let rating=parseInt(myval[myrepeat.concat("rating")]);
let qty=parseInt(myval[myrepeat.concat("quantity")]);
let mypool=myval[myrepeat.concat("pool")];
const poolname = mypool.charAt(0).toUpperCase() + mypool.slice(1);
const pool=mypool + "pool";
let myname=myval[myrepeat.concat("name")];
let mytype=myval[myrepeat.concat("type")];
calcDice=rating;
if ( mypool != "none" ) calcDice += " + ?{" + lang[mypool + "-pool-dice"] + "?}";
var myroll="&{template:item} {{item=" + myname +"}}{{myname=@{character_name}}}";
myroll += "{{targetnumber=[[?{" + lang["target-number"] +"?|4}]]}}";
if ( mypool != "none" ) myroll += "{{poolname=" + lang[mypool + "-pool"] + "}}{{pooldice=[[?{" + lang[mypool + "-pool-dice"] + "?|0}]]}}";
myroll += "{{rolldice=[[" + calcDice + " ]]}}";
myroll += "{{result=[[ [[ " + calcDice + " ]]d6>[[?{" + lang["target-number"] +"?}]]!! ]]}}";
if ( ( mytype == "onetime" ) && ( qty < 1 ) ) myroll="/w gm &{template:info}{{character=@{character_name}}}{{action=You are out of " + myname + "}}";
console.log(myroll);
startRoll(myroll, (results) => {
if ( mypool != "none" ) updatepoolused("taskpool", results.results.pooldice.result);
if (( mytype == "onetime" ) && ( qty > 0 )) {
sets[myrepeat.concat("quantity")] = qty -1;
setAttrs(sets);
}
finishRoll( results.rollId);
});
});
});
on('clicked:repeating_credsticks:checkcredstick', (info) => {
if (!("yes" in lang)) geti18n();
var atts=[];
var source=info['sourceAttribute'].split('_');
var sourceattr=source.pop();
var myrepeat=source.join('_').concat('_');
atts.push(myrepeat.concat("rating"));
atts.push(myrepeat.concat("id"));
getAttrs(atts, function(myval) {
let rating=parseInt(myval[myrepeat.concat("rating")]);
let myid=myval[myrepeat.concat("id")];
var myroll="&{template:item} {{item=" + myid + " credstick}}{{myname=@{character_name}}}{{poolname=" + lang["task-pool"] +"}}{{targetnumber=[[?{" + lang["verification-system-rating"] + "?|4}]]}}";
myroll += "{{pooldice=[[?{" + lang["task-pool-dice"] +"?|0}]]}}{{rolldice=[[" + rating + " + ?{" + lang["task-pool-dice"] +"?} ]]}}";
myroll += "{{result=[[ [[ " + rating + " + ?{" + lang["task-pool-dice"] +"?} ]]d6>[[?{" + lang["verification-system-rating"] + "?}]]!! ]]}}";
console.log(myroll);
startRoll(myroll, (results) => {
updatepoolused("taskpool", results.results.pooldice.result);
finishRoll( results.rollId);
});
});
});
on('clicked:repeating_skills:skills', (info) => {
if (!("yes" in lang)) geti18n();
const attrlist=["skillname", "skillrating", "pool"];
var atts=["character_name"];
var source=info['sourceAttribute'].split('_');
var sourceattr=source.pop();
var myrepeat=source.join('_').concat('_');
attrlist.forEach(myatt=>{
atts.push(myrepeat.concat(myatt));
});
getAttrs(atts, function(myval) {
const skill=myval[myrepeat.concat("skillname")];
const rating=parseInt(myval[myrepeat.concat("skillrating")]);
const mypool=myval[myrepeat.concat("pool")];
const poolname = mypool.charAt(0).toUpperCase() + mypool.slice(1);
const pool=mypool + "pool";
console.log('start roll for ' + skill);
var calcDice= rating;
if ( mypool != "none" ) calcDice += " + ?{" + lang[mypool + "-pool-dice"] + "?}";
const calcTN="?{" + lang["target-number"] +"?|4} + @{stun_pen} + @{wound_pen}";
var myroll="&{template:skill} {{skill=" + skill + "}}{{myname=" + myval["character_name"] + "}}";
if ( mypool != "none" ) myroll += "{{pooldice=[[?{" + lang[mypool + "-pool-dice"] + "?|0}]]}}{{poolname=" + lang[mypool + "-pool"] + "}}";
myroll +="{{targetnumber=[[ " + calcTN + " ]]}}{{rolldice=[[ " + calcDice + " ]]}}";
myroll += "{{result=[[ [[ " + calcDice + " ]]d6>[[{2,( " + calcTN + " )}kh1]]!!} ]]}}";
startRoll(myroll, (results) => {
console.log('R: ' + results);
if ( mypool != "none" ) updatepoolused(pool, results.results.pooldice.result);
finishRoll( results.rollId);
});
});
});
on('clicked:skilltest', (info) => {
if (!("yes" in lang)) geti18n();
var [myskill,mypool]=info["htmlAttributes"]["id"].split(" ");
var skill = myskill.charAt(0).toUpperCase() + myskill.slice(1);
var pool = mypool.charAt(0).toUpperCase() + mypool.slice(1);
console.log('skill: ' + myskill + ' pool: ' + mypool);
const calcDice="@{" + myskill + "} + ?{" + lang[mypool + "-pool-dice"] + "?}";
const calcTN="?{" + lang["target-number"] +"?|4} + @{stun_pen} + @{wound_pen}";
var myroll="&{template:skill} {{myname=@{character_name}}}{{skill=" + skill + "}}{{poolname=" + lang[mypool + "-pool"] + "}}{{pooldice=[[?{" + lang[mypool + "-pool-dice"] +"?|0}]]}}"
myroll+="{{targetnumber=[[" + calcTN + "]]}}{{rolldice=[[" + calcDice + "]]}}";
myroll+="{{result= [[ [[" + calcDice + "]]d6>[[{2,(" + calcTN +")}kh1]]!! ]] }}";
console.log(myroll);
startRoll(myroll, (results) => {
updatepoolused(mypool.concat("pool"), results.results.pooldice.result);
finishRoll( results.rollId);
});
});
const updatepoolused = function(pool, used) {
poolused=pool.concat("-used");
sets={}
getAttrs([poolused], function (myval) {
sets[poolused]=used + parseInt(myval[poolused]);
console.log(sets);
setAttrs(sets);
});
}
on('clicked:repeating_defensiveutils:matrixrepeatingtest clicked:repeating_offensiveutils:matrixrepeatingtest clicked:repeating_deck-utilities:matrixrepeatingtest', (info) => {
if (!("yes" in lang)) geti18n();
var atts=[];
var source=info['sourceAttribute'].split('_');
const myid=info["htmlAttributes"]["id"]
var sourceattr=source.pop();
var myrepeat=source.join('_').concat('_');
var action;
var target;
var calcTN;
var calcDice;
var utiltarget;
const myutil=myrepeat.concat("utility");
const myrating=myrepeat.concat("rating-final");
atts.push(myutil, myrating);
if ( myid == "matrixrepeatingexec" ) utiltarget=myrepeat.concat("target");
atts.push(utiltarget);
if ( myid == "matrixrepeatingexec" ) console.log('utiltarget: ' + utiltarget);
console.log(atts);
getAttrs(atts, function(myval) {
console.log(myval);
const myutilvalue=myval[myutil];
const myratingvalue=myval[myrating];
const myutiltarget=myval[utiltarget];
if ( myid == "matrixrepeatingattack" ) {
action = "{{action=" + myutilvalue + " Attack}}";
target = "{{target=@{target|" + lang["target"] +"|token_name}}}";
calcTN="@{deck-tn} + @{wound_pen} + @{stun_pen} +@{matrix-penalty} +?{" + lang["miscellaneous-modifiers"] + "|0}";
calcDice="@{decking} + ?{" + lang["hacking-pool-dice"] + "}";
} else if ( myid == "matrixrepeatingexec" ) {
console.log('utiltarget ' + myutiltarget);
action="{{action=" + lang["system-operation-with"] + " " + myutilvalue + " }}";
target = "{{target=@{target|" + lang["target"] +"|token_name}}}";
calcTN= myutiltarget + " + floor(@{target|" + lang["target"] +"|matrixalert}/2) + @{wound_pen} + @{stun_pen} +@{matrix-penalty} - " + myratingvalue;
calcDice="@{decking} + ?{" + lang["hacking-pool-dice"] + "}";
} else {
action="{{action=" + myutilvalue + " Test}}";
target ="{{target=?{" + lang["target-number"] +"?|4}}}";
calcTN="?{" + lang["target-number"] +"?} + @{wound_pen} + @{stun_pen} + @{matrix-penalty}";
calcDice=myratingvalue + " + ?{" + lang["hacking-pool-dice"] + "}";
}
var myroll="&{template:matrix}{{myname=@{character_name}}}{{hackingpool=[[?{" + lang["hacking-pool-dice"] + "|0}]]}}";
myroll+= target + action;
myroll+="{{utilitylevel=" + myratingvalue + "}}"
myroll+="{{rolldice=[[" + calcDice + "]]}}{{targetnumber=[[" + calcTN + "]]}}";
myroll+="{{roll= [[ [[ " + calcDice + "]]d6>[[{2,(" + calcTN + ")}kh1]]!!]] }}"
console.log(myroll);
startRoll(myroll, (results) => {
updatepoolused("hackingpool", results.results.hackingpool.result);
finishRoll( results.rollId);
});
});
});
on("clicked:setrigger", function(info) {
if (!("yes" in lang)) geti18n();
console.log(info);
const myid=info["htmlAttributes"]["id"]
var myroll="/w gm &{template:info}{{character=@{character_name}}}";
var designator;
var sets={};
getAttrs(["sheettype", "rigger"], function(myval) {
console.log(myval);
if ((myid == "refresh-rigger") && (myval["rigger"])) {
myroll+="{{action=" + lang["update-gunnery-and-control-pool"] + "}}";
designator="@{" + myval["rigger"];
} else if (myval["sheettype"] == "Drone") {
myroll+="{{action=Set " + lang["rigger"] + "}}";
designator="@{target|" + lang["rigger"];
} else {
myroll+="{{action=" + lang["set-vehicle-operator"] + "}}";
designator="@{target|" + lang["operator"];
}
myroll+="{{name=[[0[" + designator + "|character_name}]]]}}";
myroll+="{{gunnery=[[" + designator + "|gunnery}]]}}";
myroll+="{{controlpool=[[" + designator + "|controlpool}]]}}";
console.log(myroll);
startRoll(myroll, (results) => {
sets["rigger"]=results.results.name.expression.match(/\[(.*)\]/)[1];
sets["controlpool"]=results.results.controlpool.result;
sets["gunnery"]=results.results.gunnery.result;
console.log(sets);
finishRoll( results.rollId);
setAttrs(sets);
});
});
});
on("clicked:repeating_intruders:settokenname", function(info) {
if (!("yes" in lang)) geti18n();
console.log(info);
const source=info['sourceAttribute'].split('_');
const sourceattr=source.pop();
const myrepeat=source.join('_').concat('_');
const intrudername=myrepeat + "intrudername";
var sets={};
const myroll="/w gm &{template:info}{{character=@{character_name}}}{{action=" + lang["set-decker-for-security-tally"] +"}}{{target=[[0[@{target|" + lang["icon"] + "|token_name}]]]}}";
startRoll(myroll, (results) => {
sets[intrudername]=results.results.target.expression.match(/\[(.*)\]/)[1];
console.log(sets);
finishRoll( results.rollId);
setAttrs(sets);
});
});
on("change:repeating_intruders:intrudername", function(){
getAttrs(["repeating_intruders_intrudername"], function (myval) {
var mydecker="@{";
mydecker=mydecker.concat(myval["repeating_intruders_intrudername"]);
mydecker=mydecker.concat("|");
setAttrs({"repeating_intruders_detecttarget": mydecker});
});
});
on('clicked:matrixdetect', (info) => {
if (!("yes" in lang)) geti18n();
sets={};
console.log(info);
const myid=info["htmlAttributes"]["id"];
const mytitle=info["htmlAttributes"]["title"];
getAttrs(["matrixsecuritytally"], function (myval) {
var mytally=parseInt(myval["matrixsecuritytally"]);
if ( myid == "systemdetect" ) {
var myroll="/w gm &{template:matrix}{{target=@{target|" + lang["target"] +"|token_name}}}{{myname=@{character_name}}}{{action=Detection Roll}}" ;
myroll+="{{targetnumber=@{target|" + lang["target"] +"|deck-detection-final}}}";
myroll+="{{rolldice=[[@{matrixsecurityrating}]]}}";
myroll+="{{roll=[[@{matrixsecurityrating}d6>[[{2,(@{target|" + lang["target"] +"|deck-detection-final})}kh1]]!! ]]}}";
console.log(myroll);
startRoll(myroll, (results) => {
mytally += results.results.roll.result;
sets["matrixsecuritytally"]=mytally;
console.log(sets);
setAttrs(sets);
finishRoll( results.rollId);
});
} else {
sets["matrixsecuritytally"]=0;
setAttrs(sets);
}
});
});
on('clicked:repeating_intruders:detect', (info) => {
if (!("yes" in lang)) geti18n();
sets={};
console.log(info);
const myid=info["htmlAttributes"]["id"];
const mytitle=info["htmlAttributes"]["title"];
var source=info['sourceAttribute'].split('_');
var sourceattr=source.pop();
var myrepeat=source.join('_').concat('_');
const intruder = myrepeat + "detecttarget"
const sectally = myrepeat + "securitytally";
getAttrs([intruder, sectally], function (myval) {
const mytarget=myval[intruder];
var mytally=parseInt(myval[sectally]);
if ( myid == "systemdetect" ) {
var myroll="/w gm &{template:matrix}{{target=@{" + intruder + "}character_name}}}{{myname=@{character_name}}}{{action=Detection Roll}}" ;
myroll+="{{targetnumber=@{" + intruder + "}deck-detection-final}}}";
myroll+="{{rolldice=[[@{matrixsecurityrating}]]}}";
myroll+="{{roll=[[@{matrixsecurityrating}d6>[[{2,(@{" + intruder + "}deck-detection-final})}kh1]]!! ]]}}";
console.log(myroll);
startRoll(myroll, (results) => {
mytally += results.results.roll.result;
sets[sectally]=mytally;
console.log(sets);
setAttrs(sets);
finishRoll( results.rollId);
});
} else {
sets[sectally]=0;
setAttrs(sets);
}
});
});
on('clicked:matrixresist clicked:repeating_ic:matrixresist', (info) => {
if (info['sourceAttribute']) {
var source=info['sourceAttribute'].split('_');
var sourceattr=source.pop();
var myrepeat=source.join('_').concat('_') + "ic-penalty";
atts.push(myrepeat);
}
if (!("yes" in lang)) geti18n();
var payload, myid, attacktest, wdmg;
if ( info["htmlAttributes"]["id"] != undefined) {
myid=info["htmlAttributes"]["id"];
} else if ( info["originalRollId"] != undefined ) {
payload=rollEscape.unescape(info["originalRollId"]);
}
var calcTN;
var calcDice;
var myroll="&{template:matrix}";
console.log(info);
if ( payload ) {
console.log(payload);
power=payload["power"];
wdmg=payload["wdmg"];
basetn=payload["basetn"];
attribute=payload["attribute"];
const myattr=attribute.split("-")[1];
attacktype=payload["attacktype"];
attacktest=payload["attacktest"];
attacker=payload["attacker"];
calcDice="@{deck-bod-final} + ?{" + lang["hacking-pool-dice"] + "|0}";
calcTN= "?{" + lang["attack-power"] +"?|" + power + "}";
myroll+="{{finaldamage=[[0]]}}{{attackdmg=[[0]]}}{{payload=[[0]]}}";
if (iclist["attack"].includes(attacktype)) calcTN += " - @{deckarmor-rating-final}";
if (iclist["blackic"].includes(attacktype)) {
myroll+="{{blackic=" + lang[attacktype] + "}}";
payload["ammotype"]=attacktype;
payload["wdmg"]=damagetable[wdmg];
payload["dodge"]=0;
payload["range"]="touch";
}
myroll+="{{target=" + attacker + "}}";
console.log('tst myattr: ' + myattr + ' lang: ' + lang[myattr]);
myroll+= (iclist["debuff"].includes(attacktype))? "{{debuff=" + lang[myattr] +"}}": "{{resist=yes}}";
} else {
console.log('no payload');
calcTN="?{" + lang["attack-power"] +"?|0} - @{deckarmor-rating-final}";
calcDice="@{deck-bod-final} + ?{" + lang["hacking-pool-dice"] + "|0}";
myroll+="{{target=?{" + lang["attack-power"] +"?|0}}}";
}
myroll+="{{action=" + lang["damage-resistance-test"] + "}}";
myroll+="{{rolldice=[[" + calcDice + "]]}}";
myroll+="{{targetnumber=[[" + calcTN + "]]}}";
myroll+="{{utilitylevel=Armor Rating @{deckarmor-rating-final}}}";
myroll+="{{myname=@{selected|token_name}}}{{hackingpool=[[?{" + lang["hacking-pool-dice"] + "|0}]]}}";
myroll+="{{roll= [[ [[ " + calcDice + "]]d6>[[ {2,( " + calcTN + ")}kh1 ]]!! ]] }}";
console.log(myroll);
startRoll(myroll, (results) => {
updatepoolused("hackingpool", results.results.hackingpool.result);
if ( payload ) {
const resistroll=results.results.roll.result;
const delta=attacktest - resistroll;
console.log('delta: ' + delta);
console.log('wdmg: ' + wdmg);
const finaldmg=(iclist["debuff"].includes(attacktype))? calcFinalDebuff(delta) : calcFinalDmg(wdmg, delta);
console.log('final dmg: ' + finaldmg);
finishRoll( results.rollId,
{
finaldamage: finaldmg,
payload: rollEscape.escape(payload),
});
}
else finishRoll( results.rollId);
});
});
const iclist = {
blackic: ["blackiclethal", "cerebropathic", "psychotropic", "blackicnonlethal", "deckblackhammer", "deckkilljoy"],
debuff: ["Crippler", "Ripper"],
attack: ["Killer", "Blaster", "Sparky", "blackiclethal", "cerebropathic", "psychotropic", "blackicnonlethal", "deckblackhammer", "deckkilljoy"],
proactive: ["Crippler", "Ripper", "Killer", "Blaster", "Sparky", "Scout", "blackiclethal", "cerebropathic", "psychotropic", "blackicnonlethal", "Trace"],
reactive: ["Probe", "Scramble", "Tar Baby", "Tar pit", "Data Bomb", "Pavlov"]
};
on('clicked:matrixattack', (info) => {
if (!("yes" in lang)) geti18n();
const myid=info["htmlAttributes"]["id"]
const mytitle=info["htmlAttributes"]["title"]
console.log(info);
getAttrs(["deck-systemrating", "character_name", "deckattacklevel"], function (myval) {
const myammo=(myid=="deckattack")? myval["deckattacklevel"] : myid;
var calcTN="0 + @{wound_pen} + @{stun_pen} + @{matrix-penalty} + ?{" + lang["miscellaneous-modifiers"] + "|0}";
const systemrating=myval["deck-systemrating"].toUpperCase();
var calcDice="@{decking} + ?{" + lang["hacking-pool-dice"] + "|0}"
var myaction="{{action=" + mytitle + "}}";
if (myid == "deckattack") myaction="{{action=Attack @{deckattacklevel}}}"
var myroll="&{template:matrix}"
myroll+="{{roll=[[[[" + calcDice + "]]d6>[[ {2,( " + calcTN + ")}kh1]]!!]]}}";
myroll+= myaction;
myroll+="{{senddata=[[0]]}}";
myroll+="{{wdmg=[[0]]}}";
myroll+="{{rolldice=[[" + calcDice + "]]}}"
myroll+="{{targetnumber=[[" + calcTN + "]]}}";
if ( systemrating == "UNKNOWN" ) myroll+="{{systemrating=[[@{target|Host|matrixsecuritynumber}]]}}";
else myroll+="{{systemrating=[[" + matrixtn[systemrating]["secrating"] + "]]}}";
myroll+="{{iconstatus=[[@{target|" + lang["target"] +"|iconstatuscode}]]}}";
myroll+="{{mytoken=[[0[@{selected|token_name}]]]}}{{target=@{target|" + lang["target"] +"|token_name}}}{{hackingpool=[[?{" + lang["hacking-pool-dice"] + "|0}]]}}";
myroll+="{{utilitylevel=@{deckattack-rating-final}}}";
myroll+="{{utilitylevel=[[@{" + myid + "-rating-final}]]}}"
myroll+="{{hackingpool=[[?{" + lang["hacking-pool-dice"] + "}]]}}"
myroll+="{{myname=@{selected|token_name}}}";
console.log(myroll);
startRoll(myroll, (results) => {
const mytoken=results.results.mytoken.expression.match(/\[(.*)\]/)[1];
if ( results.results.iconstatus.result == 0) myicon="Legitimate";
else myicon="Intruder";
var finaltn=results.results.targetnumber.result
const mysystem=matrixsecnumber[results.results.systemrating.result];
const myhosttn=matrixtn[mysystem][myicon];
finaltn += myhosttn;
console.log('final tn: ' + finaltn);
const finaldice = (results.results.roll.dice.filter(mydice=> mydice >= finaltn )).length;
console.log('dice : ' + results.results.roll.dice);
console.log('finaldice : ' + finaldice);
updatepoolused("hackingpool", results.results.hackingpool.result);
const mydamage=(myid=="deckattack")? damagetable[myval["deckattacklevel"]] : matrixtn[mysystem]["wdmg"];
let payload= {
ammotype: myammo,
wdmg: mydamage,
attacker: mytoken,
attacktest: finaldice,
power: results.results.utilitylevel.result,
attacktype: myammo,
attribute: "deck-bod-final"
}
finishRoll( results.rollId,
{
wdmg: damagetable[mydamage],
senddata: rollEscape.escape(payload),
targetnumber: finaltn,
roll: finaldice,
finalroll: finaldice,
});
});
});
});
on('clicked:matrixmedic', (info) => {
if (!("yes" in lang)) geti18n();
console.log(info);
const myid=info["htmlAttributes"]["id"]
const mytitle=info["htmlAttributes"]["title"]
getAttrs(["matrix-damage", "matrix-penalty", "deckmedic-rating-final"], function(myval) {
const pentn=parseInt(myval["matrix-penalty"]) + 3;
const dmg=myval["matrix-damage"];
var medicrating=parseInt(myval["deckmedic-rating-final"]);
var calcTN=pentn;
var calcDice=medicrating + " + ?{" + lang["hacking-pool-dice"] + "|0}"
var myroll="&{template:matrix}"
myroll+="{{action=Medic Utility}}"
myroll+="{{matrixdmg=[[" + dmg + "]]}}";
myroll+="{{rolldice=[[" + calcDice + "]]}}"
myroll+="{{targetnumber=[[" + calcTN + "]]}}";
myroll+="{{myname=@{selected|token_name}}}{{target=" + pentn +"}}";
myroll+="{{utilitylevel=@{deckmedic-rating-final}}}"
myroll+="{{roll= [[ [[ " + calcDice + "]]d6>[[ {2,( " + calcTN + ")}kh1 ]]!! ]] }}"
myroll+="{{hackingpool=[[?{" + lang["hacking-pool-dice"] + "}]]}}"
console.log(myroll);
startRoll(myroll, (results) => {
sets={};
updatepoolused("hackingpool", results.results.hackingpool.result);
medicrating -= 1;
var finaldmg = dmg - results.results.roll.result;
finaldmg = (finaldmg < 1 )? 0: finaldmg;
sets["matrix-damage"]=finaldmg;
sets["deckmedic-rating-final"]=medicrating;
setAttrs(sets);
finishRoll( results.rollId,
{
matrixdmg: finaldmg,
});
});
});
});
on('clicked:swapmemory clicked:repeating_defensiveutils:swapmemory clicked:repeating_offensiveutils:swapmemory clicked:repeating_deck-utilities:swapmemory', (info) => {
if (!("yes" in lang)) geti18n();
console.log(info);
var sets={};
var atts=[];
var myatt;
var myutil;
const mytitle=info["htmlAttributes"]["title"]
const myid=info["htmlAttributes"]["id"]
if ( info['sourceAttribute'] ) {
source=info['sourceAttribute'].split('_');
var sourceattr=source.pop();
var myrepeat=source.join('_').concat('_');
myatt=myrepeat + "rating";
atts.push(myrepeat + "utility");
} else {
myutil=myid.split("-")[0];
myutil=myutil.slice(4);
myatt=myid;
}
atts.push(myatt);
const myfinal=myatt + "-final";
console.log(atts);
getAttrs(atts, function (myval) {
console.log('myval');
console.log(myval);
sets[myfinal]=parseInt(myval[myatt]);
if ( myutil == null ) myutil=myval[myrepeat + "utility"];
console.log(sets);
setAttrs(sets);
myroll="&{template:info}{{character=@{character_name}}}{{action=" + lang["swap-memory"] + "}}{{type=" + lang["simple"] + "}}{{info1=Reloading Utility " + myutil + " into Memory}}";
startRoll(myroll, (results) => {
finishRoll( results.rollId);
});
});
});
on('clicked:matrixtest clicked:repeating_ic:matrixtest', (info) => {
console.log(info);
if (!("yes" in lang)) geti18n();
const mytitle=info["htmlAttributes"]["title"]
const myid=info["htmlAttributes"]["id"]
var atts=["stun_pen", "wound_pen", "matrix-penalty"];
atts.push(myid);
if (info['sourceAttribute']) {
var source=info['sourceAttribute'].split('_');
var sourceattr=source.pop();
var myrepeat=source.join('_').concat('_') + "ic-penalty";
atts.push(myrepeat);
}
getAttrs(atts, function(myval) {
const wpmatrix=(info['sourceAttribute'])? parseInt(myval[myrepeat]) : parseInt(myval["matrix-penalty"]) + parseInt(myval["stun_pen"]) + parseInt(myval["wound_pen"]);
var calcTN="?{" + lang["target-number"] + "?} + " + wpmatrix;
var calcDice= parseInt(myval[myid]) + " + ?{" + lang["hacking-pool-dice"] + "}";
var myroll="&{template:matrix}{{target=?{" + lang["target-number"] +"?|4}}}{{hackingpool=[[?{" + lang["hacking-pool-dice"] + "|0}]]}}"
myroll+="{{myname=@{selected|token_name}}}";
myroll+= "{{action=" + mytitle + "}}{{rolldice=[[" + calcDice + "]]}}{{targetnumber=[[" + calcTN + "]]}}";
myroll+= "{{roll= [[ [[ " + calcDice + "]]d6>[[{2,(" + calcTN + ")}kh1]]!!]] }}"
startRoll(myroll, (results) => {
updatepoolused("hackingpool", results.results.hackingpool.result);
finishRoll( results.rollId);
});
});
});
on('clicked:matrixmaneuvers clicked:repeating_ic:matrixmaneuvers', (info) => {
atts=["character_name", "deck-evasion-final", "deck-sensors-final", "decklockon-rating-final", "deckcloak-rating-final", "stun_pen", "wound_pen", "matrix-penalty", "decking"];
if (info['sourceAttribute']) {
var source=info['sourceAttribute'].split('_');
var sourceattr=source.pop();
var myrepeat=source.join('_').concat('_') + "ic-penalty";
atts.push(myrepeat);
}
if (!("yes" in lang)) geti18n();
getAttrs(atts, function(myval) {
const myid=info["htmlAttributes"]["id"]
var mytitle=info["htmlAttributes"]["title"]
const evasion=myval["deck-evasion-final"];
const sensors=myval["deck-sensors-final"];
const cloak=myval["deckcloak-rating-final"];
const lockon=myval["decklockon-rating-final"];
const wpmatrix=(info['sourceAttribute'])? parseInt(myval[myrepeat]) : parseInt(myval["matrix-penalty"]) + parseInt(myval["stun_pen"]) + parseInt(myval["wound_pen"]);
const decking=myval["decking"];
if ( info["originalRollId"] != undefined ) var payload=rollEscape.unescape(info["originalRollId"]);
var calcDice=evasion + " + ?{" + lang["hacking-pool-dice"] + "}";
var calcTN="@{target|" + lang["target"] +"|deck-sensors-final} + " + wpmatrix + " +?{" + lang["miscellaneous-modifiers"] + "|0} - " + cloak;
if (payload != null ) {
console.log('payload');
console.log(payload);
mytitle=payload["attacktype"];
calcDice=sensors + " + ?{" + lang["hacking-pool-dice"] + "}";
calcTN="@{target|" + lang["target"] +"|deck-evasion-final} + " + wpmatrix + " +?{" + lang["miscellaneous-modifiers"] + "|0} - " + lockon;
}
var myroll="&{template:matrix}";
if (payload == null) myroll+="{{senddata2=[[0]]}}";
else myroll+="{{testresult=[[0]]}}{{winner=[[0]]}}";
myroll+="{{mytoken=[[0[@{selected|token_name}]]]}}";
myroll+="{{myname=@{selected|token_name}}}";
myroll+="{{target=@{target|" + lang["target"] +"|token_name}}}{{hackingpool=[[?{" + lang["hacking-pool-dice"] + "|0}]]}}";
myroll+="{{rolldice=[[" + calcDice + "]]}}{{targetnumber=[[" + calcTN + "]]}}";
myroll+="{{action=" + mytitle + "}}";
myroll+="{{targetname=@{target|" + lang["target"] + "|character_name}}}";
myroll+="{{roll= [[ [[" + calcDice + "]]d6>[[ {2,(" + calcTN + ")}kh1]]!! ]] }}";
console.log(myroll);
startRoll(myroll, (results) => {
const mytoken=results.results.mytoken.expression.match(/\[(.*)\]/)[1];
updatepoolused("hackingpool", results.results.hackingpool.result);
if ( payload == null) {
payload={
successes: results.results.roll.result,
attacker: mytoken,
attacktype: mytitle + " Oppose"
};
finishRoll( results.rollId,
{
senddata2: rollEscape.escape(payload),
});
} else {
console.log('payload success is ' + payload["successes"]);
var delta = payload["successes"] - results.results.roll.result;
console.log('delta is ' + delta);
const mywinner=(delta > 0)? payload["attacker"]: (delta < 0)? mytoken : "none";
console.log('winner is ' + mywinner);
delta=(delta < 0)? (delta * -1) : delta;
console.log('delta is ' + delta);
finishRoll( results.rollId,
{
testresult: delta,
winner: mywinner,
});
}
});
});
});
on('clicked:adeptpower', (info) => {
if (!("yes" in lang)) geti18n();
const mytitle=info["htmlAttributes"]["title"]
const myid=info["htmlAttributes"]["id"]
const uppermyid=myid.charAt(0).toUpperCase() + myid.slice(1);
atts=["rbodymod", "rbodymax", "rquickmod", "rquickmax", "rstrmod", "rstrmax", "body", "strength", "quickness", "adeptbodyboost", "adeptquicknessbost", "adeptstrengthboost"];
getAttrs(atts, function(myval) {
var drainlvl;
const myboost=parseInt(myval["adept" + myid + "boost"]) + parseInt(myval[myid]);
const mymod=myval["r" + myid + "mod"];
const mymax=myval["r" + myid + "max"];
const my2x=mymax * 2;
if (myboost <= mymod) drainlvl="L";
else if (myboost <= mymax) drainlvl="M";
else drainlvl="S";
console.log('boost: ' + myboost);
console.log('mod: ' + mymod);
console.log('max: ' + mymax);
console.log('2x: ' + my2x);
console.log('Drain: ' + drainlvl);
var calcDice="@{magic}";
var calcTN="ceil(@{" + myid + "}/2 )";
var calcDrainTN="ceil((@{" + myid + "} + @{adept" + myid + "boost} ) /2 )";
var calcDrainDice="@{willpower|max}";
var myroll="&{template:adept}";
myroll+="{{myname=@{selected|token_name}}}";
myroll+="{{rolldice=[[" + calcDice + "]]}}";
myroll+="{{targetnumber=[[" + calcTN + "]]}}";
myroll+="{{targetofspell=@{" + uppermyid + "}}}";
myroll+="{{spellname=" + uppermyid + " Boost}}";
myroll+="{{draindamage=[[0]]}}{{powerlevel=@{adept" + myid + "boost}}}";
myroll+="{{draintest= [[ [[" + calcDrainDice + "]]d6>[[ {2, ( " + calcDrainTN + ")}kh1 ]]!! ]] }}";
myroll+="{{casttest=[[ [[" + calcDice + "]]d6>[[" + calcTN + "]]!! ]] }}";
console.log(myroll);
startRoll(myroll, (results) => {
finishRoll( results.rollId,
{
draindamage: drainlvl,
});
});
});
});
const refreshphase = function() {
atts=[];
atts["rounds-phase"]=0;
atts["sorcery-used"]=0;
setAttrs(atts);
};
const refreshpools = function () {
atts=[];
atts["rounds-phase"]=0;
atts["controlpool-used"]=0;
atts["hackingpool-used"]=0;
atts["astralpool-used"]=0;
atts["combatpool-used"]=0;
atts["spellpool-used"]=0;
atts["sorcery-used"]=0;
atts["spelldefensedice-used"]=0;
atts["taskpool-used"]=0;
setAttrs(atts);
};
on('clicked:repeating_spells:cast', (info) => {
if (!("yes" in lang)) geti18n();
var atts=["character_name", "magic", "spellpool-used", "sorcery-used", "astralstate"];
var source=info['sourceAttribute'].split('_');
const myid=info["htmlAttributes"]["id"]
var sourceattr=source.pop();
var myrepeat=source.join('_').concat('_');
const attlist=["target", "force", "drain", "drainlvl", "name", "description", "damage", "range", "spellcategory", "specialized"];
attlist.forEach(attr=>{
let myname=myrepeat + attr;
atts.push(myname);
});
console.log(atts);
getAttrs(atts, function(myval) {
console.log('vals');
console.log(myval);
const specdice=parseInt(myval["specialized"]);
const magic=myval["magic"];
const myname=myval["character_name"];
const plane=(myval["astralstate"]=="astral-projection")? "astral" : "physical";
const range=myval[myrepeat + "range"];
const spellcat=myval[myrepeat + "spellcategory"];
const force=myval[myrepeat + "force"];
const target=myval[myrepeat + "target"];
const drain=myval[myrepeat + "drain"];
const spused=parseInt(myval["spellpool-used"]);
const sorceryused=parseInt(myval["sorcery-used"]);
var drainlvl=myval[myrepeat + "drainlvl"];
const name=myval[myrepeat + "name"];
const description=myval[myrepeat + "description"];
const damage=myval[myrepeat + "damage"];
var resistattr, resisttype;
var targetofspell=target;
if (target.includes("@{target")) {
targetofspell="@{target|" + lang["target"] +"|token_name}";
resistattr=target.split("|")[2];
}
var myroll="&{template:spell}";
var calcDice="?{" + lang["sorcery-dice"] +"?} + ?{"+ lang["spell-pool-dice"] +"?} + " + specdice;
var calcDrainTN="floor(?{" + lang["force"] + "?}/2) + " + drain + " + ( 2 * @{spellsus} )";
/* var calcDrainDice="@{willpower|max} + ?{" + lang["sorcery-dice-for-drain"] + "?} + ?{"+ lang["spell-pool-dice-for-drain"] +"?}"; */
var calcDrainDice="@{willpower|max}d6!![willpower] + ?{" + lang["sorcery-dice-for-drain"] + "?}d6!![sorcery dice] + ?{"+ lang["spell-pool-dice-for-drain"] +"?}d6!![spell pool]";
var caldDrainDiceTotal="@{willpower|max}[willpower] + ?{" + lang["sorcery-dice-for-drain"] + "?}[sorcery dice] + ?{"+ lang["spell-pool-dice-for-drain"] +"?}[spell pool]";
myroll+="{{senddata=[[0]]}}";
myroll+="{{draindamage=[[0]]}}{{finaldrain=[[0]]}}";
myroll+="{{cast=[[0]]}}{{draintnfinal=[[0]]}}";
myroll+="{{sorcerydice=[[?{"+ lang["sorcery-dice"] +"?|@{spellcasting}} + ?{" + lang["sorcery-dice-for-drain"] + "?|0}]]}}";
myroll+="{{spellpool=[[?{"+ lang["spell-pool-dice"] +"?|0} + ?{"+ lang["spell-pool-dice-for-drain"] +"?|0}]]}}";
myroll+="{{spelldamage=[[" + damage + "]]}}"
myroll+="{{castforce=[[?{" + lang["force"] + "?|" + force + "}]]}}";
/* myroll+="{{draintest=[[[[" + calcDrainDice + "]]d6>[[ {2, ( " + calcDrainTN + ")}kh1]]!!]]}}"; */
myroll+="{{draintest=[[" + calcDrainDice + "]]}}";
myroll+="{{rolldice=[[" + calcDice + "]]}}";
myroll+="{{draindice=[[" + caldDrainDiceTotal + "]]}}";
if ( range == "AoE" ) {
targetofspell="AoE";
if ( spellcat == "Elemental" ) {
calcTN = "4 + @{rangedTN} + (2*(@{spellstack}+@{spellsus})) +@{spellmisc}";
myroll+="{{targetnumber=[[" + calcTN + "]] + Cover & Target Movement}}";
resisttype="resistroll";
} else {
if ( resistattr != null ) {
calcTN= " (2*(@{spellstack}+@{spellsus})) + @{spellmisc} + @{stun_pen} + @{wound_pen} + @{rangedvizTN}";
myroll+="{{targetnumber=[[" + calcTN + "]] + Cover & " + resistattr + "}}";
} else {
calcTN= target + " + (2*(@{spellstack}+@{spellsus})) + @{spellmisc} + @{stun_pen} + @{wound_pen} + @{rangedvizTN}";
myroll+="{{targetnumber=[[" + calcTN + "]] + Cover}}";
}
resisttype="resistspell";
}
myroll+="{{roll=[[ [[" + calcDice + "]]d6>[[" + calcTN + "]]!! ]] }}";
} else {
if ( spellcat == "Elemental" ) {
calcTN = target + " + 4 + @{rangedTN} + (2*(@{spellstack}+@{spellsus})) +@{spellmisc}";
myroll+="{{targetnumber=[[" + calcTN + "]]}}{{dodge=yes}}";
resisttype="resistroll";
} else {
calcTN= target + " + (2*(@{spellstack}+@{spellsus})) + @{spellmisc} + @{stun_pen} + @{wound_pen} + @{rangedvizTN} + @{cover}";
myroll+="{{targetnumber=[[" + calcTN + "]]}}";
resisttype="resistspell";
}
myroll+="{{targetname=[[0[@{target|" + lang["target"] +"|token_name}]]]}}";
myroll+="{{casttest=[[ [[" + calcDice + "]]d6>[[{2,(" + calcTN + ")}kh1]]!! ]] }}";
}
myroll+="{{resisttype2=" + resisttype + "}}";
myroll+="{{targetofspell=" + targetofspell + "}}";
myroll+="{{draintn=[[ " + calcDrainTN + "]]}}";
myroll+="{{spellname=" + name + "}}";
myroll+="{{description=" + description +"}}";
myroll+="{{myname=@{character_name}}}";
if (target.includes("@{target")) {
console.log('attr split: ' + resistattr);
if ( range != "AoE" ) {
myroll += "{{spelldefense=[" + lang["spell-defense"] + "](~selected|spelldefense)}}";
if (spellcat == "Elemental" ) myroll += "{{resistspell=[" + lang["resist-spell"] + "](~@{target|" + lang["target"] +"|character_name}|resist-impact-half)}}";
else if ( resistattr == "force" ) myroll += "{{resistspell=[" + lang["resist-spell"] + "](~@{target|" + lang["target"] +"|character_name}|attrib-force)}}";
else myroll += "{{resistspell=[" + lang["resist-spell"] + "](~@{target|" + lang["target"] +"|character_name}|attrib-" + resistattr +"-max)}}";
} else {
if ( spellcat == "Elemental" ) myroll += "{{resistspell=[" + lang["resist-spell"] + " ](~selected|resist-impact-half)}}"
else if ( resistattr == "force" ) myroll += "{{resistspell=[" + lang["resist-spell"] + "](~selected|attrib-force)}}"
else myroll += "{{resistspell=[" + lang["resist-spell"] + "](~selected|resistspell||}}"
}
}
console.log(myroll);
payload={
wdmg: damage,
rounds: 1,
ammotype: spellcat.toLowerCase(),
dodge: 0,
armortype: "impact",
plane: plane,
attacker: myname,
range: range,
attribute: resistattr,
weapon: name
}
startRoll(myroll, (results) => {
atts=[];
console.log(results.results.spelldamage.result);
const finaldmg=payload["wdmg"]=damagetable[results.results.spelldamage.result];
payload["targetnumber"]=results.results.targetnumber.result;
var draindmg, finalcast;
var draintn=results.results.draintn.result;
console.log('draintn before: ' + draintn);
if (drainlvl.includes("dmglvl")) {
var dmglvl=parseInt(results.results.spelldamage.result);
dmglvl=(dmglvl > 4)? dmglvl - 9 : dmglvl;
draindmg=eval(drainlvl);
draindmg = ( draindmg < 1 )? 1 : draindmg;
draintn += ( draindmg > 4 )? 2*(draindmg - 4) : 0;
console.log('drdmg calc: ' + draindmg);
} else {
console.log('drain straight');
draindmg = parseInt(drainlvl);
console.log('drdmg stright: ' + damagetable[draindmg]);
}
draintn = (draintn <= 2)? 2 : draintn;
console.log('draintn after: ' + draintn);
console.log('drain damage base ' + draindmg);
var dmgmax=4;
var dmgmin=0;
if (draindmg > dmgmax) draindmg=dmgmax;
if (draindmg < dmgmin) draindmg=dmgmin;
console.log('dmgmin ' + dmgmin + ' dmgmax ' + dmgmax);
/* set drain damage to stun damage if force of spell is less than magic rating*/
const finalforce = payload["power"] = results.results.castforce.result
if ( (draindmg < 10 ) && ( finalforce <= magic )) {
draindmg = draindmg + 9;
dmgmax=13;
dmgmin=9;
}
/* set drain damage to physical damage if force of spell is greater than magic rating*/
if ( (draindmg >= 10 ) && ( finalforce > magic )) {
draindmg = draindmg - 9;
dmgmax=4;
dmgmin=0;
}
const draintest=results.results.draintest.dice;
const finaldraintest = (results.results.draintest.dice.filter(mydice=> mydice >= draintn )).length;
var drainstaged=draindmg - Math.floor(finaldraintest/2);
console.log(' drain staged ' + drainstaged);
drainstaged=(drainstaged < dmgmin)? dmgmin :(drainstaged > dmgmax)? dmgmax : drainstaged;
console.log(' drain staged check min/max ' + drainstaged);
myfinaldrain=damagetable[drainstaged];
draindmg=damagetable[draindmg];
console.log('drdmg : ' + draindmg);
console.log('finaldrain : ' + myfinaldrain);
console.log('finaldrain test : ' + finaldraintest);
atts["sorcery-used"]= sorceryused + parseInt(results.results.sorcerydice.result);
atts["spellpool-used"]= spused + parseInt(results.results.spellpool.result);
if ( range == "AoE" ) {
finalcast=payload["attackdice"]=results.results.roll.dice;
console.log('finalcast ' + finalcast);
payload["attacktest"]=0;
finishRoll( results.rollId,
{
draintest: finaldraintest,
spelldamage: finaldmg,
draindamage: draindmg,
finaldrain: myfinaldrain,
cast: finalcast,
draintnfinal: draintn,
senddata: rollEscape.escape(payload),
});
} else {
payload["target"]=results.results.targetname.expression.match(/\[(.*)\]/)[1];
payload["attacktest"]=results.results.casttest.result;
payload["attackdice"]=results.results.casttest.dice;
finishRoll( results.rollId, {
senddata: rollEscape.escape(payload),
draintest: finaldraintest,
spelldamage: finaldmg,
finaldrain: myfinaldrain,
draindamage: draindmg,
draintnfinal: draintn,
});
}
console.log(atts);
setAttrs(atts);
});
});
});
const calcFinalDebuff = function(delta) {
delta=floor(delta/2);
return debuff=(delta <= 0)? 0 : delta;
};
const calcFinalDmg = function(dmgstart, resist) {
const dmgmax=(dmgstart >= 10)? 13 : 4;
const dmgmin=(dmgstart >= 10)? 9 : 0;
var dmgstaged=dmgstart + floor(resist/2);
console.log('dmgstaged: ' + dmgstaged);
dmgstaged = (dmgstaged > dmgmax)? dmgmax : (dmgstaged < dmgmin)? dmgmin : dmgstaged;
return(damagetable[dmgstaged]);
};
var initiative = function (init, reaction, dmgpen, mytitle, character) {
if (!("yes" in lang)) geti18n();
console.log('init ' + init + ' reaction ' + reaction + ' dmgpen ' + dmgpen + ' mytitle ' + mytitle + ' character ' + character );
penatts=["stun_pen", "wound_pen", "matrix-penalty", "vehicle-penalty", "rccommand-penalty", "rcsimsense-penalty", "rcsystem-penalty"];
getAttrs(penatts, function (myval) {
console.log(init, reaction)
var myroll="&{template:init} {{character=" + character + "}}{{type=" + mytitle + "}}"
myroll += "{{roll=[[" + init + "d6+" + reaction + dmgpen + " &{tracker}]]}}"
if (myval["matrix-penalty"] >= 10) {
myroll="&{template:info}{{character=@{character_name}}}{{action=Initiative}}{{type=" + mytitle + " }}{{info1=@{character_name}'s icon has crashed}}";
}
if (myval["vehicle-penalty"] >= 10) {
myroll="&{template:info}{{character=@{character_name}}}{{action=Initiative}}{{type=" + mytitle + " }}{{info1=@{character_name} is destroyed }}";
}
if ( (myval["rccommand-penalty"] >= 10) || (myval["rcsimsense-penalty"] >= 10) || (myval["rcsystem-penalty"] >= 10) ) {
myroll="&{template:info}{{character=@{character_name}}}{{action=Initiative}}{{type=" + mytitle + " }}{{info1=@{character_name} is disengaged }}";
}
console.log(myroll);
startRoll(myroll, (results) => {
finishRoll( results.rollId);
});
});
};
on('clicked:init-aug', (info) => {
const myid=info["htmlAttributes"]["id"]
let init="@{initiative|max}";
let reaction="@{reaction|max}";
let dmgpen=" -@{wp-char}";
let character="@{character_name}";
let mytitle="Augmented Initiative Roll";
initiative(init, reaction, dmgpen, mytitle, character);
});
on('clicked:repeating_ic:init', (info) => {
if (!("yes" in lang)) geti18n();
gets=[];
var source=info['sourceAttribute'].split('_');
var sourceattr=source.pop();
var myrepeat=source.join('_').concat('_');
const mytitle=info["htmlAttributes"]["title"]
gets.push(myrepeat.concat("icrating"));
gets.push(myrepeat.concat("icname"));
gets.push(myrepeat.concat("ic-penalty"));
getAttrs(gets, function (myval) {
var penalty;
console.log(myval);
const init = "@{matrixsecuritynumber}";
const reaction = parseInt(myval[myrepeat.concat("icrating")]);
const character = myval[myrepeat.concat("icname")];
var penalty = -1 * parseInt(myval[myrepeat.concat("ic-penalty")]);
if ( penalty == 0 ) penalty = " + 0 ";
initiative(init, reaction, penalty, mytitle, character);
});
});
on('clicked:init', (info) => {
if (!("yes" in lang)) geti18n();
console.log(info);
const mytitle=info["htmlAttributes"]["title"]
const myid=info["htmlAttributes"]["id"]
var dmgpen=" -@{wp-char}";
character="@{character_name}";
if ( myid == "augmentedinit" ) {
init="@{initiative|max}";
reaction="@{reaction|max}";
} else if ( myid == "astralinit" ) {
init=1;
reaction="@{astralreaction}";
} else if ( myid == "spiritinit" ) {
init="@{initiative}";
reaction="@{spirit-initp}";
} else if ( myid == "matrixinit" ) {
init="@{deck-initiative}";
reaction="@{deck-reaction-final}";
var dmgpen=" - ( @{wp-char} + @{matrix-penalty})";
} else if ( myid == "vehicleinit" ) {
init="(@{vehicle-driver}initiative} + @{vehicle-initbonus})";
reaction="@{vehicle-driver}reaction} + @{vehicle-reactbonus}";
var dmgpen=" - (@{vehicle-driver}stun_pen}-@{vehicle-driver}wound_pen} - @{wp-vehicle})";
} else if ( myid == "iceinit" ) {
init="@{deck-initiative}";
reaction="@{deck-reaction-final}";
var dmgpen=" - ( @{wp-char} + @{wp-matrix})";
} else {
init="@{initiative}";
reaction="@{reaction}";
}
initiative(init, reaction, dmgpen, mytitle, character);
refreshpools();
});
const getTokenName = async () => {
const rxGrab = /^0\[(.*)\]\s*$/;
let myroll = "! {{mytoken=[[0[@{selected|token_name}]]]}}";
rollresult = await startRoll(myroll),
tokenname = (rollresult.results.mytoken.expression.match(rxGrab) || [])[1];
finishRoll(rollresult.rollId);
console.log('debug getTokenName ' + tokenname );
return tokenname;
};
const endTurn = async() => {
const tokenname = await getTokenName();
console.log('token name ' + tokenname);
if (!("yes" in lang)) geti18n();
var myroll="&{template:init} {{character=" + tokenname + "}}{{type=[[0]]}}"
var endtypemsg="End Combat Pass";
myroll += "{{setinit=[[10 &{tracker:-}]]}}{{initval=[[@{tracker|" + tokenname + "}]]}}"
console.log(myroll);
startRoll(myroll, (results) => {
const initval=results.results.initval.result;
if ( initval <= 10 ) refreshpools();
else {
refreshphase();
endtypemsg="End Combat Turn";
}
console.log(results.results);
finishRoll( results.rollId);
});
};
on('clicked:endturn', (info) => {
endTurn(info);
});
on('clicked:resistbanish', (info) => {
if (!("yes" in lang)) geti18n();
const mytitle=info["htmlAttributes"]["title"]
const myid=info["htmlAttributes"]["id"]
var calcDice= "@{force}";
calcTN="@{target|" + lang["target"] +"|magic}";
var myroll="&{template:conjure}{{myname=@{character_name}}}";
myroll+="{{targetofspell=@{target|" + lang["target"] +"|character_name}}}";
myroll+="{{spellname=" + lang["resist-banish"] + "}}";
myroll+="{{rolldice=[[" + calcDice + "]]}}";
myroll+="{{targetnumber=[[" + calcTN + "]]}}";
myroll+="{{casttest=[[ [[" + calcDice + "]]d6>[[{2,(" + calcTN + ")}kh1]]!! ]] }}";
console.log(myroll);
startRoll(myroll, (results) => {
finishRoll( results.rollId);
});
});
const floor = function(v) {
return (v >= 0 || -1) * Math.floor(Math.abs(v));
}
const ammomods = {
deckblackhammer: { armorname: "'hardening'", armor: "hardening", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: "", weight: 0},
deckkilljoy: { armorname: "'hardening'", armor: "hardening", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:9, recoil: 0, barrier: 0, knockdown: 0 , amsg: "", weight: 0},
blackiclethal: { armorname: "'hardening'", armor: "hardening", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: "", weight: 0},
blackicnonlethal: { armorname: "'hardening'", armor: "hardening", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:9, recoil: 0, barrier: 0, knockdown: 0 , amsg: "", weight: 0},
cerebropathic: { armorname: "'hardening'", armor: "hardening", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: "", weight: 0},
psychotropic: { armorname: "'hardening'", armor: "hardening", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: "", weight: 0},
d: { armorname: "'impact'", armor: "impact", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: "", weight: 0},
c: { armorname: "'impact'", armor: "impact", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: "", weight: 0},
o: { armorname: "'impact'", armor: "impact", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: "", weight: 0},
elemental: { armorname: "'half impact'", armor: "Math.floor(impact/2)", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: "", weight: 0},
melee: { armorname: "'impact'", armor: "impact", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: "", weight: 0},
assualtcannon: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1 , amsg: "", weight: .125},
bigd: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 2, rpower: 0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1 , amsg: "Choke Rules not Applied", weight: .1},
bola: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 1, rpower: 0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 2 , amsg: "", weight: .1},
arrows: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1 , amsg: "", weight: 0.01},
arrowsexp: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1 , amsg: "", weight: 0.01},
arrowsexpex: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1 , amsg: "", weight: 0.01},
regular: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1 , amsg: "", weight: 0.05},
net: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1 , amsg: "", weight: .5},
largenet: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1 , amsg: "", weight: .7},
shocklock: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 1, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 2, knockdown: 1, amsg: "" , weight: .075},
flare: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1 , amsg: "", weight: .1},
adps: { armorname: "'half Ballistic'", armor: "Math.floor(ballistic * 0.5)", av: 0, power: 0, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 0.5, knockdown: 1, amsg: "" , weight: .025},
gyrojetplus: { armorname: "'half Ballistic'", armor: "Math.floor(ballistic * 0.5)", av: 1, power: 0, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 0.5, knockdown: 1, amsg: "" , weight: .2},
gyrojetplusseeker: { armorname: "'half Ballistic'", armor: "Math.floor(ballistic * 0.5)", av: 1, power: 0, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 0.5, knockdown: 1, amsg: "" , weight: .225},
gyrojetseeker: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1 , amsg: "", weight: .2},
gyrojet: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1 , amsg: "", weight: .175},
explosive: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 1, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" , weight: .075},
explosive2: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 2, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" , weight: .075},
flechette: { armorname: "(ballistic >(2*impact))? 'ballistic' : 'impact';", armor: "(Math.max(ballistic, (impact * 2)))", av: -0.5, power: 0, rpower:0, dmg:0, rdmg: "(armoron == 0)? 1 : 0;", recoil: 1, barrier: 2, knockdown: 1, amsg: "Final Damage Level depends on Armor" , weight: .05},
gel: { armorname: "'impact'", armor: "impact * 2", av: 0, power: -2, rpower:0, dmg: 9, rdmg:0, recoil: 1, barrier: 1, knockdown: 2, amsg: "" , weight: .025},
hammerheads: { armorname: "'impact'", armor: "impact * 2", av: 0, power: -2, rpower:0, dmg: 9, rdmg:0, recoil: 1, barrier: 1, knockdown: 2, amsg: "" , weight: .01},
screamer: { armorname: "'impact'", armor: "impact", av: 0, power: "-1 * (Math.ceil(wpower / 2))", rpower:0, dmg: 9, rdmg:0, recoil: 1, barrier: 1, knockdown: 2, amsg: "" , weight: .01},
stunshell: { armorname: "'impact'", armor: "impact", av: 0, power: 0, rpower:0, dmg: 9, rdmg:0, recoil: 1, barrier: 1, knockdown: 2, amsg: "" , weight: .05},
tracer: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 0, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" , weight: .05},
av: { armorname: "'half Ballistic'", armor: "Math.floor(ballistic * 0.5)", av: 1, power: 0, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 0.5, knockdown: 1, amsg: "" , weight: .1},
capsule: { armorname: "'impact'", armor: "impact", av: 0, power: -2, rpower:0, dmg: 9, rdmg:0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" , weight: .025},
glazer: { armorname: "(ballistic > impact)? 'ballistic' : 'impact';", armor: "Math.max((ballistic * 2), (impact * 2))", av: -0.5, power: 2, rpower:0, dmg:0, rdmg: "( armoron == 0)? 1 : 0;", recoil: 1, barrier: 2, knockdown: 1, amsg: "Final Damage Level depends on Armor" , weight: .05},
hic: { armorname: "(ballistic > impact)? 'ballistic' : 'impact';", armor: "Math.max(ballistic,impact)", av: 0, power: "(range==6)? -1 : (range==9)? -1", rpower:0, dmg: 0, rdmg:0, recoil: 2, barrier: 1, knockdown: 1, amsg: "" , weight: .025},
hpoint: { armorname: "'ballistic + Impact'", armor: "ballistic + impact", av: 0, power:0, rpower: "(armoron == 0)? 3 : 1", dmg: 0, rdmg:0, recoil: 2, barrier: 1, knockdown: 1, amsg: "Final Power Rating depends on Armor" , weight: .05},
incendiary: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" , weight: .075},
mercury: { armorname: "(ballistic > impact)? 'ballistic' : 'impact';", armor: "Math.max((ballistic * 2), (impact * 2))", av: -0.5, power: 0, rpower: 0, dmg: 0, rdmg: "( armoron == 0)? 1 : 0;", recoil: 1, barrier: 2, knockdown: 1, amsg: "Final Damage Level depends on Armor", weight: .075},
tracker: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 0, rpower: 0, dmg: 0, rdmg: 0, recoil: 1, barrier: 1, knockdown: 1, amsg: "", weight: .05}
}
const resistdmg = function (myid, mods) {
if (!("yes" in lang)) geti18n();
atts=["ballistic", "impact", "armor-on", "deck-hardening", "body_max", "willpower_max"];
getAttrs(atts, function (myval) {
console.log('myval');
console.log(myval);
const ballistic=myval["ballistic"];
const impact=myval["impact"];
const armoron=myval["armor-on"];
const hardening=myval["deck-hardening"];
const body = parseInt(myval["body_max"]);
const willpower = parseInt(myval["willpower_max"]);
var resistattr=body;
var armorname;
var wdmg;
var dmgcode=0;
var weapondmg="none";
var dodge=0;
if ( mods=="regular" ) mods=1;
if ( mods=="normal" ) mods=1;
if ( mods=="double" ) mods=2;
if ( mods=="half" ) mods=0.5;
if ( typeof mods === 'object' && mods !== null ) {
myroll="&{template:resistadv}";
const ammo=mods["ammotype"].toLowerCase();
weapondmg = mods["wdmg"];
dodge = mods["dodge"];
const range = mods["range"];
const armorval = eval(ammomods[ammo]["armor"]);
const powermod = eval(ammomods[ammo]["rpower"]);
const dmgmod = eval(ammomods[ammo]["rdmg"]);
dmgcode = damagetable[weapondmg] + dmgmod;
myroll +="{{Power=?{" + lang["attack-power"] + "|" + mods.power + "}}}";
myroll+="{{wpndmg=" + weapondmg + "}}";
myroll +="{{attacktest=[[" + mods["attacktest"] + "]]}}";
myroll+="{{dodge=[[" + mods["dodge"] + "]]}}";
myroll +="{{AttackType=" + ammo + "}}";
if (ammo=="deckkilljoy") resistattr = willpower;
calcTN="?{" + lang["attack-power"] + "} + " + powermod + " - " + armorval;
if ( mods["blast"] ) {
myroll+="{{distance=[[?{" + lang["distance-from-explosive-in-meters"] +"|0}]]}}"
myroll+="{{blastredux=[[?{" + lang["distance-from-explosive-in-meters"] +"|0} / " + mods["blast"] + "]]}}"
calcTN+=" - ( ?{" + lang["distance-from-explosive-in-meters"] +"} / " + mods["blast"] + ")";
}
myid=eval(ammomods[ammo]["armorname"]);
console.log('test 1 ' + myid);
myroll += "{{armorvalue=" + armorval + "}}";
} else {
myroll="&{template:resist}";
myroll +="{{Power=?{" + lang["attack-power"] + "|4}}}";
myroll +="{{attacktest=[[0}]]}}";
myroll+="{{dodge=[[0]]}}";
myroll +="{{AttackType=" + mods + "}}";
calcTN="?{" + lang["attack-power"] + "} - (floor(@{" + myid + "} * " + mods + "))";
myroll += "{{armorvalue=@{" + myid + "}}}"
}
let actionname = myid.charAt(0).toUpperCase() + myid.slice(1);
var calcDice= resistattr + " + ?{" + lang["combat-pool-dice"] + "}";
myroll +="{{finaldmg=[[0]]}}{{netresult=[[0]]}}";
myroll +="{{name=" + actionname + " Armor}}{{character=@{character_name}}}{{combatpool=[[?{" + lang["combat-pool-dice"] + "|0}]]}}";
myroll +="{{action=" + lang["damage-resistance-test"] + "}}";
myroll +="{{rolldice=[[" + calcDice + "]]}}";
myroll +="{{targetnumber=[[" + calcTN + "]]}}";
myroll +="{{roll= [[ [[" + calcDice + " ]]d6>[[ {2,(" + calcTN + ")}kh1 ]]!! ]]}}";
console.log(myroll);
console.log(' unmod weapons code ' + dmgcode);
startRoll(myroll, (results) => {
const netresult=results.results.attacktest.result - ( results.results.roll.result + dodge );
console.log('debug netresult ' + netresult);
const stage=floor(netresult/2);
var finaldmg=dmgcode + stage;
var dmgmax=4;
var dmgmin=0;
if (dmgcode >= 10) dmgmax=13;
if (dmgcode >= 10) dmgmin=9;
if (finaldmg > dmgmax) finaldmg=dmgmax;
if (finaldmg < dmgmin) finaldmg=dmgmin;
updatepoolused("combatpool", results.results.combatpool.result);
if (weapondmg != "none") {
finishRoll( results.rollId, {
finaldmg: damagetable[finaldmg],
netresult: netresult,
});
} else { finishRoll( results.rollId); }
});
});
};
on('clicked:resistdmg', (info) => {
if (!("yes" in lang)) geti18n();
console.log(info);
const mytitle=info["htmlAttributes"]["title"]
const myid=info["htmlAttributes"]["id"]
mods="?{" + lang["attack-type"] + "|" + lang["normal"] + ",1|" + lang["elemental"] + ",0.5|" + lang["adps"] + ",0.5|" + lang["half"] + ",0.5|" + lang["double"] + ",2}";
resistdmg(myid, mods);
});
on('clicked:checkaoe', (info) => {
if (!("yes" in lang)) geti18n();
const payload=rollEscape.unescape(info.originalRollId);
const attacktype=payload["ammotype"].toLowerCase();
const basetn=payload["targetnumber"];
const attacktest=payload["attacktest"];
const attackdice=payload["attackdice"];
const attribute=payload["attribute"] + "_max";
console.log(payload);
var myresisttype;
myroll="&{template:aoe}{{senddata=[[0]]}}{{resisttype=[[0]]}}";
getAttrs(["character_name", "targetMove", "body_max", "willpower_max", "intelligence_max", "force"], function(myval) {
payload["target"]=myval["character_name"];
if ( attacktype == "elemental") {
myroll+="{{dodge=yes}}";
calcTN=basetn + " + " + myval["targetMove"] + " + ?{" + lang["cover-modifiers"] + "|0}";
myresisttype="resistroll";
} else {
calcTN=basetn + " + " + myval[attribute] + " + ?{" + lang["cover-modifiers"] + "|0}";
myresisttype="resistspell";
}
myroll+="{{targetnumber=[[" + calcTN + "]]}}{{dice=" + attackdice + "}}";
myroll+="{{attacktest=[[0]]}}{{character=" + myval["character_name"] + "}}{{weapon=" + payload["weapon"] + "}}";
console.log('calcTN: ' + calcTN);
var attackresult;
startRoll(myroll, (results) => {
finaltn=results.results.targetnumber.result;
attackresult=payload["attacktest"]= (attackdice.filter(mydice=> mydice >= finaltn )).length;
if (attackresult < 1 ) {
attackresult="MISSED";
myresisttype="missed";
}
console.log('finaltn: ' + finaltn);
console.log('attackresult: ' + attackresult);
console.log('myresisttype: ' + myresisttype);
finishRoll( results.rollId,
{
resisttype: myresisttype,
attacktest: attackresult,
senddata: rollEscape.escape(payload),
});
});
});
});
on('clicked:resistspell', (info) => {
if (!("yes" in lang)) geti18n();
const payload=rollEscape.unescape(info.originalRollId);
console.log(payload);
const attribute=payload["attribute"] + "_max";
var wdmg=payload["wdmg"];
var dmgnumber= damagetable[wdmg];
var dmgmax=4; dmgmin=0;
if (dmgnumber >= 10) dmgmax=13, dmgmin=9;
const attacktest=payload["attacktest"] + "_max";
if (payload["attacktest"] < 1) missedattack(info);
else {
getAttrs(["character_name", "body_max", "willpower_max", "intelligence_max", "force"], function(myval) {
myroll="&{template:resistadv}{{character=" + myval["character_name"] + "}}{{target=" + payload["attacker"] + "}}";
myroll+="{{Power=" + payload["power"] + "}}{{wpndmg=" + payload["wdmg"] + "}}{{name=" + payload["attribute"] + "}}";
myroll+="{{armorvalue=" + myval[attribute] + "}}";
myroll +="{{attacktest=[[" + payload["attacktest"] + "]]}}";
calcDice=parseInt(myval[attribute])
calcTN=payload["power"];
myroll +="{{action=" + lang["spell-resistance-test"] + "}}";
myroll +="{{spelldmg=[[0]]}}{{netresult=[[0]]}}";
myroll +="{{rolldice=[[" + calcDice + "]]}}";
myroll +="{{targetnumber=[[" + calcTN + "]]}}";
myroll +="{{roll= [[ [[" + calcDice + " ]]d6>[[ {2,(" + calcTN + ")}kh1 ]]!! ]]}}";
console.log(myroll);
startRoll(myroll, (results) => {
const mynet=payload["attacktest"]-results.results.roll.result;
var delta = dmgnumber + floor(mynet/2);
delta = (delta > dmgmax)? dmgmax : delta;
delta = (delta < dmgmin)? dmgmin : delta;
finaldmg=damagetable[delta];
console.log('finaldmg ' + finaldmg);
finishRoll( results.rollId, {
netresult: mynet,
spelldmg: finaldmg,
});
});
});
}
});
on('clicked:resistroll', (info) => {
const payload=rollEscape.unescape(info.originalRollId);
console.log(payload);
resistdmg(payload["armortype"], payload);
});
const resistmods=["half", "normal", "double"];
resistmods.forEach(mod => {
var myball="resist-ballistic-" + mod;
var myimpact="resist-impact-" + mod;
on(`clicked:${myball}`, (info) => {
console.log(rollEscape.unescape(info.originalRollId));
resistdmg("ballistic", mod);
});
on(`clicked:${myimpact}`, (info) => {
console.log(rollEscape.unescape(info.originalRollId));
resistdmg("impact", mod);
});
});
on('clicked:resistvehicledmg', (info) => {
if (!("yes" in lang)) geti18n();
console.log(info);
const mytitle=info["htmlAttributes"]["title"]
const myid=info["htmlAttributes"]["id"]
var calcDice= "@{body|max} + ?{" + lang["control-pool-dice"] + "}";
calcTN="?{" + lang["attack-power"] + "}";
myroll="&{template:resist}";
myroll +="{{name=" + lang["damage-resistance-test"] + "}}{{character=@{character_name}}}{{armorvalue=@{armor}}}{{controlpool=[[?{" + lang["control-pool-dice"] + "|0}]]}}";
myroll +="{{action=" + lang["damage-resistance-test"] + "}}";
myroll +="{{rolldice=[[" + calcDice + "]]}}";
myroll +="{{targetnumber=[[" + calcTN + "]]}}";
myroll +="{{roll= [[ [[" + calcDice + " ]]d6>[[ {2,(" + calcTN + ")}kh1 ]]!! ]]}}";
console.log(myroll);
startRoll(myroll, (results) => {
updatepoolused("controlpool", results.results.controlpool.result);
finishRoll( results.rollId);
});
});
const dodge = function (mods) {
if (!("yes" in lang)) geti18n();
myroll="&{template:resistadv}";
console.log('debug ' + mods);
if ( typeof mods === 'object' && mods !== null ) {
payload=mods;
console.log(payload);
mods=(payload["rounds"])? "?{" + lang["modifiers"] + "?|" + Math.floor(payload["rounds"] / 3 ) + "}" : parseInt(payload["meleetn"] - 4);
myroll +="{{senddata=[[0]]}}";
} else payload={rounds: mods};
console.log('mods: ' + mods);
var calcDice= "?{" + lang["combat-pool-dice"] + "}";
calcTN="4 + " + mods;
calcTN +=(payload["rounds"])? " + @{wp-char}" : "";
myroll +="{{name=" + lang["dodge"] + "}}{{character=@{character_name}}}"
myroll +="{{combatpool=[[?{" + lang["combat-pool-dice"] + "|0}]]}}";
myroll +="{{action=" + lang["dodge"] + "}}";
myroll +="{{targetnumber=[[" + calcTN + "]]}}";
myroll +="{{rolldice=[[" + calcDice + "]]}}";
myroll +="{{roll= [[ [[" + calcDice + " ]]d6>[[ {2,(" + calcTN + ")}kh1 ]]!! ]]}}";
console.log(myroll);
startRoll(myroll, (results) => {
updatepoolused("combatpool", results.results.combatpool.result);
console.log(payload);
if ( payload ) {
payload["dodge"]=results.results.roll.result;
finishRoll( results.rollId, { senddata: rollEscape.escape(payload), });
} else {
finishRoll( results.rollId);
}
});
};
on('clicked:dodge', (info) => {
if (!("yes" in lang)) geti18n();
console.log(info);
if ( info["htmlAttributes"]["id"] != undefined) {
mods="?{" + lang["modifiers"] + "?|0}";
}
else if ( info["originalRollId"] != undefined ) {
mods=rollEscape.unescape(info["originalRollId"]);
}
dodge(mods);
});
const conjuring = function (myid, spirittype="spirit", force="ask", name="none") {
if (!("yes" in lang)) geti18n();
console.log('spirittype: ' + spirittype);
const atts=["charisma_max", "magic-type", "magic", "summoning", "banishing", "spiritcontrol", "character_name"]
getAttrs(atts, function(myval) {
if ( name == "none" ) {
name = (spirittype)? spirittype : "spirit";
}
const mycharisma=myval["charisma_max"];
const actionname = myid.charAt(0).toUpperCase() + myid.slice(1);
const calcDrainDice=mycharisma + " + ?{" + lang["conjuring-dice-for-drain"] + "?|0} + ?{" + lang["spirit-focus-dice"] +"}";
const myskill = parseInt(myval[myid]);
var calcDrainTN = (force=="ask")? "?{" + lang["force"] + "?}" : force;
var calcDice= myskill + " + ?{" + lang["spirit-focus-dice"] +"} + ?{" + lang["are-you-the-summoner"] +"?|" + lang["yes"] + "," + mycharisma + "|" + lang["no"] + ",0}"
var calcTN;
if (myid == "summoning" ) {
calcDice= myskill + " - ?{" + lang["conjuring-dice-for-drain"] + "?} + ?{" + lang["spirit-focus-dice"] +"}";
calcTN = (force=="ask")? "?{" + lang["force"] + "?}" : force;
} else {
calcTN="@{target|" + lang["target"] +"|force}";
}
var myroll="&{template:conjure}{{myname=" + myval["character_name"] + "}}";
myroll+="{{draindamage=[[0]]}}{{finaldrain=[[0]]}}";
if (myid == "summoning" ) {
if (force=="ask") myroll+="{{spiritforce=[[?{" + lang["force"] + "?|1}]]}}"
else myroll+="{{spiritforce=[[" + force + "]]}}";
myroll+="{{spirittype=" + spirittype + "}}";
myroll+="{{spiritname=" + name + "}}";
}
else {
myroll+="{{spiritforce=[[ @{target|" + lang["target"] +"|force} ]]}}"
myroll+="{{spirittype=Spirit}}";
}
myroll+="{{spellname=" + actionname + "}}{{skill=[[" + myskill + "]]}}";
myroll+="{{spiritdice=[[?{" + lang["spirit-focus-dice"] +"|0}]]}}";
myroll+="{{targetnumber=[[" + calcTN + "]]}}";
if (myid == "summoning" ) {
myroll+="{{draintn=[[" + calcDrainTN + "]]}}";
myroll+="{{draindice=[[" + calcDrainDice + "]]}}";
myroll+="{{conjuredicedrain=[[?{" + lang["conjuring-dice-for-drain"] + "?}]]}}";
myroll+="{{conjuredice=[[" + myskill + " - ?{" + lang["conjuring-dice-for-drain"] + "?}]]}}";
myroll+="{{draintest= [[ [[" + calcDrainDice + "]]d6>[[ {2, ( " + calcDrainTN + ")}kh1 ]]!! ]] }}";
}
myroll+="{{rolldice=[[" + calcDice + "]]}}";
myroll+="{{casttest=[[ [[" + calcDice + "]]d6>[[{2,(" + calcTN + ")}kh1]]!! ]] }}";
if (myid == "banishing" ) myroll += "{{resist=[" + lang["resist-banish"] + "](~@{target|" + lang["target"] +"|character_name}|resistbanish)}}"
console.log(myroll);
startRoll(myroll, (results) => {
if (myid == "summoning") {
var dmgmin=0, dmgmax=4;
const spiritforce=results.results.spiritforce.result;
var basedrain;
if ( spiritforce <= (mycharisma/2)) basedrain="L";
else if ( spiritforce <= mycharisma ) basedrain="M";
else if ( spiritforce >= ( mycharisma * 1.5 ) ) basedrain="D";
else basedrain="S";
if ( spiritforce <= myval["magic"] ) {
console.log('set to stun');
basedrain=basedrain.concat("(stun)");
dmgmin=9;
dmgmax=13;
}
console.log('debug base drain ' + basedrain);
var dmgnumber = damagetable[basedrain];
console.log('dmgnumber: ' + dmgnumber);
const staging = Math.floor(results.results.draintest.result / 2)
console.log('staging: ' + staging);
const conjuredicefinal=results.results.skill.result - results.results.conjuredicedrain.result;
dmgnumber -= staging;
console.log('debug dmgnumber unmodified: ' + dmgnumber + " dmgmax " + dmgmax + " dmgmin " + dmgmin);
dmgnumber = (dmgnumber > dmgmax)? dmgmax : (dmgnumber < dmgmin)? dmgmin : dmgnumber;
console.log('debug dmgnumber conjure: ' + dmgnumber);
const stageddrain=damagetable[dmgnumber];
console.log('debug finaldrain ' + stageddrain);
finishRoll( results.rollId, {
draindamage: basedrain,
finaldrain: stageddrain,
});
} else {
finishRoll( results.rollId, {});
}
});
});
};
const conjurelist = ["spiritcontrol","summoning","banishing"];
conjurelist.forEach(action => {
console.log(action)
on(`clicked:${action}`, conjuring(action) );
});
on('clicked:repeating_conjuring:conjure-spirit', (info) => {
if (!("yes" in lang)) geti18n();
var atts=[];
console.log(info);
var source=info['sourceAttribute'].split('_');
var sourceattr=source.pop();
const myrepeat=source.join('_').concat('_');
const attributes=["name", "force", "type"];
attributes.forEach( attr=> {
atts.push(myrepeat + attr);
});
console.log(atts);
getAttrs(atts, function(myval) {
console.log(myval);
var name=myval[myrepeat + "name"];
if (!name) name="none";
const force=parseInt(myval[myrepeat + "force"]);
const spirittype=myval[myrepeat + "type"];
console.log('spirit-type: ' + spirittype);
conjuring("summoning", spirittype, force, name);
});
});
on('clicked:conjure', (info) => {
const mytitle=info["htmlAttributes"]["title"]
const myid=info["htmlAttributes"]["id"]
console.log("clicked conjure: " + myid);
conjuring(myid);
});
on('clicked:dispell', (info) => {
if (!("yes" in lang)) geti18n();
console.log("clicked dispell");
var calcDice="?{" + lang["sorcery-dice"] +"?} + ?{"+ lang["spell-pool-dice"] +"?}";
var calcTN="?{" + lang["force-of-spell"] + "?}";
var calcDrainTN="floor( ?{" + lang["force-of-spell"] + "?|0}/2) + ( 2 * @{spellsus} + ?{" + lang["drain-modifiers"] + "?|0})";
var calcDrainDice="@{willpower|max} + ?{" + lang["sorcery-dice-for-drain"] + "?} + ?{"+ lang["spell-pool-dice-for-drain"] +"?}";
var myroll="&{template:spell}";
myroll+="{{finaldrain=[[0]]}}{{draintnfinal=[[" + calcDrainTN + "]]}}";
myroll+="{{sorcerydice=[[?{"+ lang["sorcery-dice"] +"?|@{spellcasting}} + ?{" + lang["sorcery-dice-for-drain"] + "?|0}]]}}";
myroll+="{{draindamage=[[?{" + lang["drain-damage"] + "?|" + lang["light"] + ",1|" + lang["moderate"] + ",2|" + lang["serious"] + ",3|" + lang["deadly"] + ",4|";
myroll+= lang["light-stun"] + ",10|" + lang["moderate-stun"] + ",11|" + lang["serious-stun"] + ",12|" + lang["deadly-stun"] + ",13|" + lang["none"] + ",0}]]}}";
myroll+="{{spellpool=[[?{"+ lang["spell-pool-dice"] +"?|0} + ?{"+ lang["spell-pool-dice-for-drain"] +"?|0}]]}}";
myroll+="{{castforce=[[?{" + lang["force-of-spell"] + "?}]]}}";
myroll+="{{draintest= [[ [[" + calcDrainDice + "]]d6>[[ {2, ( " + calcDrainTN + ")}kh1 ]]!! ]] }}";
myroll+="{{spellname=" + lang["dispell"] + "}}";
myroll+="{{rolldice=[[" + calcDice + "]]}}";
myroll+="{{targetnumber=[[" + calcTN + "]]}}";
myroll+="{{casttest=[[ [[" + calcDice + "]]d6>[[{2,(" + calcTN + ")}kh1]]!! ]] }}";
myroll+="{{draindice=[[" + calcDrainDice +"]]}}";
myroll+="{{myname=@{character_name}}}"
myroll+="{{dispell=yes}}"
console.log(myroll);
startRoll(myroll, (results) => {
updatepoolused("sorcery", results.results.sorcerydice.result);
updatepoolused("spellpool", results.results.spellpool.result);
const drainbase = damagetable[results.results.draindamage.result];
const finaldraintxt=calcFinalDmg(results.results.draindamage.result, (-1 * results.results.draintest.result));
finishRoll( results.rollId, {
draindamage: drainbase,
finaldrain: finaldraintxt,
});
});
});
on('clicked:spelldefense', (info) => {
if (!("yes" in lang)) geti18n();
console.log("clicked spelldefense");
const payload=( info["originalRollId"] != undefined )? rollEscape.unescape(info["originalRollId"]) : "none";
var myforce=0;
var mytarget="@{target|" + lang["ally"] + "|token_name}";
var myroll="&{template:spell}{{myname=@{character_name}}}{{resisttype=[[0]]}}";
if (payload != "none" ) {
console.log(payload);
myforce=(payload["power"])? payload["power"] : 0;
mytarget=payload["target"];
if ( payload["ammotype"].toLowerCase()=="elemental" ) myroll+="{{dodge=yes}}";
myroll+="{{defensetest=[[0]]}}";
myroll+="{{senddata=[[0]]}}";
myroll+="{{attacks=[[" + payload["attacktest"] + "]]}}";
myresist = (payload["ammotype"].toLowerCase() == "elemental")? "resistroll" : "resistspell";
}
var calcDice="?{"+ lang["sorcery-dice"] +"?} + ?{"+ lang["spell-pool-dice"] +"?}";
var calcTN="?{" + lang["force-of-spell"] + "?}";
myroll+="{{sorcerydice=[[?{" + lang["sorcery-dice"] +"?|@{sorcery-defense}}]]}}";
myroll+="{{castforce=[[?{" + lang["force-of-spell"] + "?|" + myforce + "}]]}}";
myroll+="{{targetnumber=[[" + calcTN + "]]}}";
myroll+="{{spellpool=[[?{"+ lang["spell-pool-dice"] +"?|@{spellpool-defense}}]]}}";
myroll+="{{spellname=" + lang["spell-defense"] + "}}";
myroll+="{{rolldice=[[" + calcDice + "]]}}";
myroll+="{{targetofspell=" + mytarget + "}}";
myroll+="{{casttest=[[ [[" + calcDice + "]]d6>[[{2,(" + calcTN + ")}kh1]]!! ]] }}";
console.log(myroll);
if (payload != "none" ) {
startRoll(myroll, (results) => {
updatepoolused("sorcery", results.results.sorcerydice.result);
updatepoolused("spellpool", results.results.spellpool.result);
updatepoolused("spelldefensedice", results.results.sorcerydice.result + results.results.spellpool.result);
const delta=parseInt(payload["attacktest"]) - results.results.casttest.result;
console.log(' delta ' + delta);
var finalattack=delta;
if (delta < 1) {
finalattack="SPELL BLOCKED";
myresist="spellblocked"
payload["attacktest"]=0;
} else {
payload["attacktest"]=finalattack;
}
console.log(' result ' + finalattack);
finishRoll( results.rollId, {
resisttype: myresist,
defensetest: finalattack,
senddata: rollEscape.escape(payload),
})
});
} else {
startRoll(myroll, (results) => {
updatepoolused("spellpool", results.results.spellpool.result);
updatepoolused("spelldefensedice", results.results.sorcerydice.result);
finishRoll( results.rollId, { })
});
}
});
on('clicked:vehicledriving', (info) => {
if (!("yes" in lang)) geti18n();
calcTN="@{handling} + @{vehicle-driver}stun_pen} +@{vehicle-driver}wound_pen} +@{wp-vehicle} - @{driving-test-interface} +@{driving-test-weather} +@{driving-test-terrain} +@{driving-test-size} +?{" + lang["miscellaneous-modifiers"] + "|0}";
calcDice="[[@{vehicle-skill-final} + @{driving-test-autonav} + ?{" + lang["control-pool-dice"] + "?}]]"
var myroll="&{template:vehicle}{{type=" + lang["driving"] + "}}{{controlpool=[[?{" + lang["control-pool-dice"] + "?|0}]]}}{{character=@{character_name}}}"
myroll += "{{targetnumber=[[" + calcTN + "]]}}"
myroll += "{{roll=[[ " + calcDice + "d6>[[{2,(" + calcTN + ")}kh1]]!! ]] }}"
console.log(myroll);
var atts=[];
startRoll(myroll, (results) => {
updatepoolused("controlpool", results.results.controlpool.result);
finishRoll( results.rollId, { })
});
});
on('clicked:vehiclesensor', (info) => {
if (!("yes" in lang)) geti18n();
calcTN="[[{2,(@{target|" + lang["target"] +"|signature} +@{wp-vehicle} +@{sensor-test-los} +@{sensor-test-weather} +@{sensor-test-terrain} +@{vehicle-urban} +?{" + lang["miscellaneous-modifiers"] + "|0})}kh1]]";
calcDice="[[@{sensors-rating}]]";
calcDiceECD="[[@{ecd-rating} * @{ecd-enabled} ]]";
var myroll="&{template:vehicle}{{type=Sensor Test}}{{character=@{character_name}}}";
myroll += "{{targetnumber=" + calcTN + "}}"
myroll += "{{roll=[[ " + calcDice + "d6>" + calcTN + "!! ]] }}"
myroll += "{{ecd=[[ " + calcDiceECD + "d6>" + calcTN + "!! ]] }}"
console.log(myroll);
var atts=[];
startRoll(myroll, (results) => {
finishRoll( results.rollId, { })
});
});
on('clicked:vehicleposition', (info) => {
if (!("yes" in lang)) geti18n();
calcTN="[[{2,(@{handling} + @{speed-exceeding} + @{driving-position-terrain} - @{vehicle-actionbonus} + (@{vehicle-autonav} * @{autonav}) + @{vehicle-driver}stun_pen} +@{vehicle-driver}wound_pen} + @{wp-vehicle} )}kh1]]";
calcDice="[[@{vehicle-skill-final} + ?{" + lang["control-pool-dice"] + "?}]]"
var myroll="&{template:vehicle}{{type=" + lang["position"] + "}}{{controlpool=[[?{" + lang["control-pool-dice"] + "?|0}]]}}{{character=@{character_name}}}"
myroll += "{{targetnumber=" + calcTN + "}}{{position=[[0]]}}"
myroll += "{{roll=[[ " + calcDice + "d6>" + calcTN + "!! ]] }}"
console.log(myroll);
var atts=[];
getAttrs(["maneuver-score"], function(myval) {
startRoll(myroll, (results) => {
const newscore = parseInt(myval["maneuver-score"]) + results.results.roll.result ;
atts["maneuver-score"] = newscore;
console.log('new man score: ' + atts["maneuver-score"]);
updatepoolused("controlpool", results.results.controlpool.result);
finishRoll( results.rollId, {
position: newscore,
})
setAttrs(atts);
});
});
});
on('clicked:vehiclecrash', (info) => {
if (!("yes" in lang)) geti18n();
calcTN="[[{2,(@{handling} + @{driving-crash-terrain} + @{vehicle-driver}stun_pen} +@{vehicle-driver}wound_pen} +@{wp-vehicle} )}kh1]]"
calcDice="[[@{vehicle-skill-final} + ?{" + lang["control-pool-dice"] + "?} + (@{vehicle-autonav} * @{autonav})]]"
var myroll="&{template:vehicle}{{type=" + lang["crash"] + "}}{{controlpool=[[?{" + lang["control-pool-dice"] + "?|0}]]}}{{character=@{character_name}}}"
myroll += "{{targetnumber=" + calcTN + "}}{{speed=[[@{speed-current}]]}}{{reaction=[[@{vehicle-driver}reaction|max}]]}}"
myroll += "{{roll=[[ " + calcDice + "d6>" + calcTN + "!! ]] }}"
console.log(myroll);
var atts=[];
startRoll(myroll, (results) => {
const speed = results.results.speed.result
const reaction = results.results.reaction.result
console.log('speed: ' + speed);
console.log('reaction: ' + reaction);
var speedmod=0;
if ( speed <= ( reaction * 20 )) speedmod=0;
else if ( speed <= ( reaction * 30 )) speedmod=1;
else if ( speed <= ( reaction * 40 )) speedmod=2;
else speedmod=4;
console.log('final: ' + speedmod );
var finaltn = results.results.targetnumber.result + speedmod;
if ( finaltn < 2 ) finaltn = 2;
const finaldice = (results.results.roll.dice.filter(mydice=> mydice >= finaltn )).length;
updatepoolused("controlpool", results.results.controlpool.result);
finishRoll( results.rollId,
{
targetnumber: finaltn,
roll: finaldice,
});
});
});
on('clicked:vehicleaction', (info) => {
if (!("yes" in lang)) geti18n();
var myaction=info["htmlAttributes"]["id"];
var myterrain="driving-ab-terrain";
var myaction = myaction.charAt(0).toUpperCase() + myaction.slice(1);
var autonav="@{autonav}";
var vcr = "@{vehicle-actionbonus}";
var miscmods="?{" + lang["how-many-additional-enemy-vehicles"] + "?";
var speeding=1;
var vmbelow10=4;
var vmbelow00=2;
var baseTN="@{handling}";
var calcDice="[[@{vehicle-skill-final} + ?{" + lang["control-pool-dice"] + "?}]]";
if ( myaction =="Ram" ) {
myterrain="driving-ram-terrain";
autonav="(@{autonav} + 2)";
enemies=0;
}
else if ( myaction =="Hide" ) {
myterrain="driving-hide-terrain";
vmbelow10=6;
vmbelow00=3;
speeding=2;
}
else if ( myaction =="Relocate" ) {
myterrain="driving-relocate-terrain";
miscmods="?{" + lang["successes-from-hiding-test"] + "?";
speeding=2;
vcr=0;
autonav="( @{autonav} * -1)";
calcDice="[[@{sensors-rating} + ?{" + lang["control-pool-dice"] + "?}]]";
baseTN="@{target|" + lang["target"] +"|signature}";
}
var vmsmod=0;
var calcTN="[[{2,(" + baseTN + " + " + miscmods + "} + ( @{speed-exceeding} * " + speeding + ") + @{" + myterrain + "} - " + vcr + " + (@{vehicle-autonav} * "
calcTN += autonav + ") + @{vehicle-driver}stun_pen} +@{vehicle-driver}wound_pen} +@{wp-vehicle} )}kh1]]"
var myroll="&{template:vehicle} {{type=" + lang["accelerate"] + "}}{{controlpool=[[?{" + lang["control-pool-dice"] + "?|0}]]}} {{character=@{character_name}}} {{miscmods=" + miscmods + "|0}}}"
myroll += "{{rolldice=" + calcDice + "}}"
myroll += "{{target=vs. @{target|" + lang["target"] +"|token_name}}}{{type=" + myaction + "}}"
myroll += "{{targetnumber=" + calcTN + "}}"
myroll += "{{delta=[[@{maneuver-score} - @{target|" + lang["target"] +"|maneuver-score} ]]}}"
myroll += "{{roll=[[ " + calcDice + "d6>" + calcTN + "!! ]] }}"
console.log(myroll);
startRoll(myroll, (results) => {
console.log(results);
console.log(results.results.roll.dice);
if ( results.results.delta.result >= 11 ) vmsmod=-4;
else if ( results.results.delta.result > 1 ) vmsmod=-2;
else if ( results.results.delta.result == 0 ) vmsmod=0;
else if ( results.results.delta.result >= -10 ) vmsmod=vmbelow00;
else if ( results.results.delta.result < -10 ) vmsmod=vmbelow10;
else vmsmod=0;
console.log(vmsmod);
var finaltn = results.results.targetnumber.result + vmsmod;
if (finaltn < 2) finaltn=2;
console.log(results.results.roll.dice);
const finaldice = (results.results.roll.dice.filter(mydice=> mydice >= finaltn )).length;
updatepoolused("controlpool", results.results.controlpool.result);
finishRoll( results.rollId,
{
targetnumber: finaltn,
roll: finaldice,
});
});
});
const rollattribute = function (attrib) {
if (!("yes" in lang)) geti18n();
console.log(attrib);
var mymode="";
var mybase=attrib.toUpperCase();
if (attrib.includes("max")) {
mymode="Augmented";
mybase=attrib.split("|")[0].toUpperCase();
}
console.log(attrib);
const attroll="&{template:attribute} {{character=@{character_name}}}{{Attribute=" + mybase + " " + mymode + "}} {{targetnumber=[[?{" + lang["target-number"] +"?|4}]]}}{{combatpool= [[?{" + lang["combat-pool-dice"] + "?|0}]]}}{{result= [[ [[@{" + attrib +"} + ?{" + lang["combat-pool-dice"] + "?}]]d6>[[{2,(?{" + lang["target-number"] +"?} + @{stun_pen} + @{wound_pen})}kh1]]!! ]] }}"
startRoll(attroll, (results) => {
console.log(results.results.combatpool.result)
finishRoll( results.rollId);
});
};
attributes.forEach(myatt => {
var myevent="attrib-" + myatt;
var myeventmax="attrib-" + myatt + "-max";
var myattmax = myatt + "|max";
on(`clicked:${myevent}`, (info) => {
console.log('running ' + myatt );
rollattribute(myatt);
});
on(`clicked:${myeventmax}`, (info) => {
console.log('running ' + myattmax );
rollattribute(myattmax);
});
});
on('clicked:attrib', (info) => {
console.log(info);
var attrib=info["htmlAttributes"]["id"];
rollattribute(attrib);
});
on('clicked:ewarfare', (info) => {
if (!("yes" in lang)) geti18n();
console.log(info);
var mytype=info["htmlAttributes"]["id"]
var mytitle=info["htmlAttributes"]["title"]
const mymap={
sonar: {dice: "sonar-rating", target: "signature", notes: ""},
ecmjamming: {dice: "ecm-fluxmod", target: "sensors-rating", notes: "Roll Oposition test for @{target|" + lang["target"] +"|token_name}"},
ecmopposition: {dice: "sensors-fluxmod", target: "ecm-rating", notes: "Compare net successes with @{target|" + lang["target"] +"|token_name}"},
eccmcounter: {dice: "eccm-fluxmod", target: "ecm-rating", notes: "Roll Oposition test for @{target|" + lang["target"] +"|token_name}"},
eccmopposition: {dice: "ecm-fluxmod", target: "eccm-rating", notes: "Compare net successes with @{target|" + lang["target"] +"|token_name}"}
};
var calcDice="@{" + mymap[mytype]["dice"] + "}";
calcTN="@{target|" + lang["target"] +"|" + mymap[mytype]["target"] + "}";
if (mytype=="sonar" ) calcTN+=" +@{wp-vehicle} +@{sensor-test-los} +@{sensor-test-weather} +@{sensor-test-terrain} +@{vehicle-urban}";
calcTN += "+?{" + lang["miscellaneous-modifiers"] + "|0}";
myroll="&{template:vehicle}{{type=" + mytitle + "}}{{character=@{character_name}}}{{target=@{target|" + lang["target"] +"|token_name}}}";
myroll+="{{rolldice=[[" + calcDice + "]]}}{{targetnumber=[[" + calcTN + "]]}}";
myroll+="{{roll=[[ [[ " + calcDice + "]]d6>[[{2,(" + calcTN + ")}kh1]]!!]]}}";
myroll+="{{notes=" + mymap[mytype]["notes"] + "}}";
console.log(myroll);
startRoll(myroll, (results) => {
finishRoll( results.rollId);
});
});
on('clicked:maneuever', (info) => {
if (!("yes" in lang)) geti18n();
var mytype=info["htmlAttributes"]["id"]
if ( mytype == "generate") {
var manroll="&{template:vehicle} {{type=" + lang["maneuver-score"] + "}} {{character=@{character_name}}}{{controlpool=[[?{" + lang["control-pool-dice"] + "?|0}]]}} {{roll=[[ [[@{vehicle-skill-final} + ?{" + lang["control-pool-dice"] + "?}]]d6KH1 + @{terrain-points} + @{speed-points} + @{vehicle-points} ]] }}"
startRoll(manroll, (results) => {
updatepoolused("controlpool", results.results.controlpool.result);
console.log('results: ' + results.results.roll.result)
finishRoll( results.rollId);
setAttrs({"maneuver-score": results.results.roll.result});
});
} else {
var manroll="&{template:vehicle} {{type=" + lang["compare"] + " " + lang["maneuver-score"] + "}} {{character=@{character_name}}} {{target=@{target|" + lang["target"] +"|character_name}}} {{charscore=[[@{maneuver-score}]]}} {{targetscore=[[@{target|" + lang["target"] +"|maneuver-score}]]}} {{roll=[[@{maneuver-score} - @{target|" + lang["target"] +"|maneuver-score} ]]}} "
startRoll(manroll, (results) => {
finishRoll( results.rollId);
});
}
});
on('clicked:repeating_rangedweapons:reload', (info) => {
if (!("yes" in lang)) geti18n();
console.log("reloading");
var setatts={};
var atts=[];
var source=info['sourceAttribute'].split('_');
var sourceattr=source.pop();
var myrepeat=source.join('_').concat('_');
var acttype="complex";
var myroll;
atts.push(myrepeat.concat("ammo"));
atts.push(myrepeat.concat("reloadmethod"));
atts.push(myrepeat.concat("ammoremain"));
atts.push(myrepeat.concat("name"));
atts.push(myrepeat.concat("reloads"));
atts.push("quickness_max");
console.log(atts);
getAttrs(atts, function(myval) {
console.log('myval');
console.log(myval);
const max=parseInt(myval[myrepeat.concat("ammo")]);
const myweapon=myval[myrepeat.concat("name")];
const myreload=myval[myrepeat.concat("reloadmethod")];
const remain=parseInt(myval[myrepeat.concat("ammoremain")]);
const maxload = max - remain
const quick=parseInt(myval["quickness_max"]);
var myreloads=myval[myrepeat.concat("reloads")];
var rounds=max;
var reloadaction="Complex";
var ammoused=1;
var reloadtxt=rounds + " rounds with a " + myreload;
if (myreload=="clip") acttype="simple";
if ( ( myreload == "cylinder" ) || ( myreload == "magazine" ) || ( myreload=="break" ) ) {
if ( quick > maxload ) {
console.log('loading max' );
ammoused = maxload;
} else {
console.log('too many');
ammoused = quick;
}
if ( ammoused > myreloads ) ammoused = myreloads;
rounds = ammoused + remain;
reloadtxt=ammoused + " rounds into " + myreload;
}
const reloadsleft=myreloads - ammoused;
if (myreloads < 1) {
console.log('out of ammo');
ammoused=0;
myroll="/w gm &{template:info}{{character=@{character_name}}}{{action=Reload: " + myweapon + "}}{{type=" + lang[acttype] +"}}{{info1=" + lang["out-of-ammo"] + " }}";
} else {
console.log('ammo okay');
myroll="/w gm &{template:info}{{character=@{character_name}}}{{action=Reload: " + myweapon + "}}{{type=" + lang[acttype] + "}}{{info1=Loaded " + reloadtxt + "}}";
if ( ( myreload == "cylinder" ) || ( myreload == "magazine" ) || ( myreload=="break" ) ) {
myroll += "{{info2=" + reloadsleft + " Spare Rounds Remaining}}";
} else {
myroll += "{{info2=" + reloadsleft +" Spare " + myreload + "s Remaining}}";
}
}
console.log(myroll);
setatts[myrepeat.concat("ammoremain")]=rounds;
setatts[myrepeat.concat("reloads")]=reloadsleft;
setAttrs(setatts);
startRoll(myroll, (results) => {
finishRoll( results.rollId);
});
});
});
on('clicked:repeating_rangedweapons:shownotes', (info) => {
if (!("yes" in lang)) geti18n();
var source=info['sourceAttribute'];
console.log('attribute is ' + source);
getAttrs([source], function(myval){
console.log('attribute value is ' + myval[source]);
if (myval[source] == "show") {
setAttrs({[source]: "hide"});
} else {
setAttrs({[source]: "show"});
}
});
});
on('clicked:repeating_rangedweapons:showmore clicked:repeating_explosives:showmore', (info) => {
if (!("yes" in lang)) geti18n();
var source=info['sourceAttribute'];
console.log('attribute is ' + source);
getAttrs([source], function(myval){
console.log('attribute value is ' + myval[source]);
if (myval[source] == "show") {
setAttrs({[source]: "hide"});
} else {
setAttrs({[source]: "show"});
}
});
});
on('clicked:repeating_rangedweapons:rangedattack', (info) => {
if (!("yes" in lang)) geti18n();
var setatts={};
var atts=["sensors-rating", "combatpool-used", "controlpool-used", "gyro-on", "armor-quickness-pen", "rounds-phase", "character_name", "move"];
var recoilx=1;
var rounds=1;
var source=info['sourceAttribute'].split('_');
var sourceattr=source.pop();
var myrepeat=source.join('_').concat('_');
var mymode=info["htmlAttributes"]["id"]
const weaponattrs=["damage", "power", "name", "skill", "wfamily", "specialized", "targeting", "recoilcomp", "gyro", "ammotype", "ammoremain", "sa", "ss","bf", "fa", "tnmods", "firemode"] ;
weaponattrs.forEach(myatt=>{
atts.push(myrepeat.concat(myatt));
});
getAttrs(atts, function(myval) {
if ( (myval[myrepeat.concat("wfamily")] == "Heavy" ) && ( ( mymode != "vehiclesensor" ) || ( mymode != "vehicleranged" )) ) recoilx=2;
var vehiclesensors=0, armorpen=0, armorpenroll="", pool, mypool, poolname, dmgmin=0, dmgmax=4, finalrounds;
if ( myval["sensors-rating"] ) vehiclesensors=myval["sensors-rating"] ;
const move=parseInt(myval["move"]);
const tnmods= myval[myrepeat.concat("tnmods")];
const myname= myval["character_name"];
const myweapon= myval[myrepeat.concat("name")];
const combatused=parseInt(myval["combatpool-used"]);
const controlused=parseInt(myval["controlpool-used"]);
var wdmg= myval[myrepeat.concat("damage")];
const ammoremain= myval[myrepeat.concat("ammoremain")];
const ammotype= myval[myrepeat.concat("ammotype")].toLowerCase();
const targetaim= parseInt(myval[myrepeat.concat("targeting")]);
const myskill=myval[myrepeat.concat("skill")];
var gyro= myval[myrepeat.concat("gyro")];
if ( myval["gyro-on"] == 0 ) gyro=0;
const firemode= myval[myrepeat.concat("firemode")];
console.log('original wdmg is ' + damagetable[wdmg]);
console.log('ammo modifier for wdmg is ' + ammomods[ammotype]["dmg"]);
var dmgnumber=(ammotype in ammomods)? damagetable[wdmg] + ammomods[ammotype]["dmg"]: damagetable[wdmg];
console.log('final wdmg is ' + dmgnumber)
if (dmgnumber >= 10) dmgmax=13, dmgmin=9;
var wpower= myval[myrepeat.concat("power")];
var ammoleft=myval[myrepeat.concat("ammoremain")];
const prevrounds=myval["rounds-phase"];
var recoilcomp= myval[myrepeat.concat("recoilcomp")];
if (( firemode == "bf") && ( ammoleft <= 3)) rounds ="?{" + lang["rounds"] + "|" + ammoleft + "}";
else if (( firemode == "bf") && ( ammoleft > 3)) rounds ="?{" + lang["rounds"] + "|3}";
else if (( firemode == "fa") && ( ammoleft <= 10)) rounds ="?{" + lang["rounds"] + "|" + ammoleft + "}";
else if (( firemode == "fa") && ( ammoleft > 10)) rounds ="?{" + lang["rounds"] + "|" + ( 10 - prevrounds ) +"}";
var recoil="";
if (( firemode == "bf") || (firemode == "fa")) {
recoil="{0,(" + recoilx + " * (( ?{" + lang["rounds-already-fired-in-combat-phase"] + "|" + prevrounds + "} + ?{" + lang["rounds"] + "} ) - (" + recoilcomp + " + " + gyro + ")))}kh1";
} else if (firemode == "sa" ) {
recoil="{0,(" + recoilx + " * ( ?{" + lang["rounds-already-fired-in-combat-phase"] + "|" + prevrounds + "} - (" + recoilcomp + " + " + gyro + ")))}kh1";
} else {
recoil=0;
}
if (ammoleft <= 0 ) {
roll="&{template:info}{{character=@{character_name}}}{{action=" + lang["attack"] + ": " + myweapon + "}}{{type=" + lang["simple"] + "}}{{info1=" + lang["out-of-ammo"] + " }}";
startRoll(roll, (results) => {
finishRoll( results.rollId,{});
});
} else {
specialized=myval[myrepeat.concat("specialized")] || 0
if ( quicknesslinked.includes(myskill) ) {
armorpen=myval["armor-quickness-pen"];
armorpenroll= "{{armorpen=@{armor-quickness-pen}}}";
}
var calcTN = "[[ "
if ( mymode == "vehiclesensor" ) {
calcTN += "@{sensor-gunnery-tn} + @{vehicle-driver}wp-char} + @{wp-vehicle}"
poolname="Control";
pool="controlpool";
mypool="control"
} else if ( mymode == "vehicleranged" ) {
const gyrobonus=((move - myval[myrepeat.concat("gyro")]) < 0 )? move: myval[myrepeat.concat("gyro")];
console.log('vehicle ranged')
console.log('move ' + move + ' gyro ' + myval[myrepeat.concat("gyro")] + ' gyrobonus ' + gyrobonus)
calcTN += " ?{" + lang["range"] + "} + @{rangedTN} + @{target|" + lang["target"] +"|targetMove} + " + targetaim + " + @{wp-vehicle} - " + gyrobonus;
poolname="Control";
pool="controlpool";
mypool="control"
} else {
calcTN += " ?{" + lang["range"] + "} + @{rangedTN} + @{target|" + lang["target"] +"|targetMove} + " + targetaim + " + " + armorpen;
poolname="Combat";
pool="combatpool";
mypool="combat"
}
calcTN += " + ?{" + lang["miscellaneous-modifiers"] + "|" + tnmods + "} + " + recoil;
calcTN += " ]]"
var calcDice = "[[ " + myskill + " + " + specialized + " + ?{" + lang[mypool + "-pool-dice"]+"|0}"
if ( mymode == "vehiclesensor" ) calcDice += " + " + Math.floor(vehiclesensors / 2 )
calcDice += " ]]"
var roll="&{template:attack}{{myname=@{character_name}}}{{target=@{target|" + lang["target"] +"|token_name}}}";
roll += "{{rounds=[[" + rounds + "]]}}{{range=[[?{" + lang["range"] + "|" + lang["short"] + ",4|" + lang["medium"] + ",5|" + lang["long"] + ",6|" + lang["extreme"] + ",9}]]}}";
roll += "{{targetnumber=" + calcTN + " }}{{rolldice=" + calcDice + "}}";
roll += "{{weaponname=" + myweapon + "}}{{weapondamage=[[" + dmgnumber + "]]}}{{weaponpower=[[" + wpower + "]]}}";
roll += "{{" + pool + "=[[?{" + lang[mypool + "-pool-dice"] +"}]]}}{{weaponname=" + myweapon + "}}{{ammotype=" + ammotype + "}}";
roll += "{{attacktest=[[ " + calcDice + "d6>[[ {2, " + calcTN + "}kh1 ]]!! ]] }}";
if ( mymode == "rangedattack" ) {
roll += "{{dodge=[Dodge](~@{target|" + lang["target"] +"|token_name}|dodge)}}";
roll += "{{senddata=[[0]]}}"
}
roll += armorpenroll;
roll += "{{rangedmods=@{rangedTN}}}";
roll += "{{movemods=[[{0,( @{move} - " + gyro + ") }kh1]]}}";
roll += "{{targetmods=" + targetaim + "}}";
if ( ammomods[ammotype]["amsg"] != null ) roll += "{{info=" + ammomods[ammotype]["amsg"] + "}}";
console.log(roll);
startRoll(roll, (results) => {
var poolresults;
var finaldamage;
setatts["rounds-phase"]=results.results.rounds.result + prevrounds;
const myrounds=results.results.rounds.result;
if ( mymode == "rangedattack" ) poolresults=results.results.combatpool.result + combatused;
else poolresults=results.results.controlpool.result + controlused;
finalrounds=myrounds;
if ( myrounds > ammoleft ) finalrounds=parseInt(ammoleft);
if ( finalrounds > 1 ) {
mythird=Math.floor(finalrounds/3);
wpower=(ammotype=="tracer")? parseInt(wpower) + (finalrounds - mythird) : parseInt(wpower) + finalrounds;
dmgnumber=dmgnumber + mythird;
}
wpower=parseInt(wpower) + eval(ammomods[ammotype]["power"]);
/* dmgnumber=dmgnumber + ammomods[ammotype]["dmg"]; */
if (dmgnumber > dmgmax) dmgnumber=dmgmax;
if (dmgnumber < dmgmin) dmgnumber=dmgmin;
console.log('dmgnumber' + dmgnumber);
console.log('finaldamage' + finaldamage);
finaldamage=damagetable[dmgnumber];
let payload= {
attacker: myname,
weapon: myweapon,
armortype: "ballistic",
range: results.results.range.result,
wdmg: finaldamage,
rounds: results.results.rounds.result,
dodge: 0,
attacktest: results.results.attacktest.result,
power: wpower,
ammotype: ammotype.toLowerCase(),
}
finishRoll( results.rollId,
{
weapondamage: finaldamage,
weaponpower: wpower,
rounds: finalrounds,
senddata: rollEscape.escape(payload),
})
setatts[myrepeat.concat("ammoremain")]=ammoremain - finalrounds;
setatts[pool.concat("-used")]=poolresults;
setAttrs(setatts);
});
}
});
});
const meleecombat = function (mymode, payload) {
if (!("yes" in lang)) geti18n();
console.log(payload);
var plane=(payload["plane"])? payload["plane"] : "physical";
const askreach=(payload["reachmode"])? payload["reachmode"] : 0;
var atts=[];
console.log(mymode);
var myfocus = 0;
var focus="";
var force="";
var mydamage, myskill, myweapon, mypower, defroll;
var pool="combatpool";
var defaultmsg=" ";
var defaultpen=0;
var myspec=0;
const repeatatts=["damage", "power", "name", "skill", "reach", "specialized", "notes", "tnmods"] ;
var meleeattrs=["sheettype", "character_name","strength_max", "martialarts", "attackdamage", "attackpower", "reaction_max", "charisma_max", "unarmed", "unarmed-specialized", "cyberimplant", "weaponfocus-equipped", "weaponfocus-damage", "gyro-on", "armor-quickness-pen", "unarmed-miscmods", "weaponfocus-specialized", "metatype", "meleeselected"];
if ( mymode.includes("repeating" )) {
console.log('using repeating');
repeatatts.forEach(myatt=>{
meleeattrs.push(mymode.concat(myatt));
});
};
console.log('ask reach ' + askreach);
getAttrs(meleeattrs, function(myval) {
const strmax=parseInt(myval["strength_max"]);
const attackdamage=myval["attackdamage"];
const attackpower=parseInt(myval["attackpower"]);
const myname=myval["character_name"];
const sheettype=myval["sheettype"];
var mynotes="";
var myspec=0;
var mytnmod=0;
var myreach="@{meleereach|max}";
var gyropenroll="";
var gyropen=0;
if (( myval["gyro-on"] == 1 ) && ( mymode != "astralattack" )) {
gyropen=4;
gyropenroll = "{{gyropen=" + gyropen + "}}";
} if (( mymode == "astralattack" ) || (plane=="astral")) {;
pool="astralpool";
plane="astral";
myweapon="Astral Attack";
var myskill="@{astralcombat}";
var mydamage="M"
if ( myval["weaponfocus-equipped"]=="on" ) {
myskill = "( " + myskill + " + @{weaponfocus-force} )"
myspec=myval["weaponfocus-specialized"];
mydamage=myval["weaponfocus-damage"];
}
mypower=parseInt(myval["charisma_max"]);
focus="{{weaponfocus=@{weaponfocus-name}}}"
force="{{focusforce=@{weaponfocus-force}}}"
}
else if (mymode.includes("repeating")) {
myrepeat=mymode;
console.log('repeating melee');
mynotes=myval[myrepeat.concat("mynotes")];
myweapon=myval[myrepeat.concat("name")];
mydamage=myval[myrepeat.concat("damage")];
mypower=parseInt(myval[myrepeat.concat("power")]);
myskill=myval[myrepeat.concat("skill")];
myspec=myval[myrepeat.concat("specialized")];
mytnmod=myval[myrepeat.concat("tnmods")];
if ( myval["metatype"] == "Troll" ) myreach=myval[myrepeat.concat("reach")] + 1;
else myreach=myval[myrepeat.concat("reach")];
} else if (( sheettype == "Critter" ) || (sheettype=="Spirit")) {
myskill=myval["reaction_max"];
mydamage=myval["attackdamage"];
mypower=parseInt(myval["attackpower"]);
myweapon=sheettype + " Attack";
} else {
console.log('unarmed melee');
mydamage=attackdamage;
myskill=myval["unarmed"];
myspec=myval["unarmed-specialized"];
mytnmod=myval["unarmed-miscmods"];
myweapon=myval["martialarts"];
mypower=strmax;
if ( myval["unarmed"] == 0 ) {
console.log('unarmed is 0');
if (myval["cyberimplant"] == 0) {
myskill=strmax;
defaultpen=4;
pool="false";
var defaultmsg="{{default=Skill Defaulted to Strength Attribute with +" + defaultpen + " to hit}}";
} else {
myskill=myval["cyberimplant"];
defaultpen=2;
var defaultmsg="{{default=Skill Defaulted to Cyber Implant skill with +" + defaultpen + " to hit}}";
}
}
}
var calcTN="4 + @{meleeTN} + " + mytnmod + " + " + defaultpen + " + " + gyropen;
if (askreach==0) calcTN += " + ( ( @{target|" + lang["target"] +"|meleereach|max} - " + myreach + " ) * ?{" + lang["use-reach-modifier"] +"?} )";
var calcDice=myskill + " + " + myspec ;
var myroll="&{template:melee}{{myname=" + myname + "}}{{target=@{target|" + lang["target"] +"|token_name}}}{{weapondamage=[[0]]}}{{finalwinner=[[0]]}}{{weaponpower=[[" + mypower + "]]}}"
if ( quicknesslinked.includes(myskill) ) {
console.log('quick pen');
armorpen=myval["armor-quickness-pen"];
console.log(armorpen);
myroll+= "{{armorpen=@{armor-quickness-pen}}}";
}
console.log('pool name is ' + pool);
if ( pool == "combatpool" ) {
calcDice += " + ?{" + lang["combat-pool-dice"] + "}"
myroll += "{{pooldice=[[?{" + lang["combat-pool-dice"] + "|0}]]}}"
myroll += "{{pooltype=" + lang["combat"] +"}}";
} else if ( pool == "astralpool" ) {
calcDice += " + ?{" + lang["astral-pool-dice"] +"}"
myroll += "{{pooldice=[[?{" + lang["astral-pool-dice"] +"|0}]]}}"
myroll += "{{pooltype=" + lang["astral"] +"}}";
} else {
myroll += "{{pooldice=[[0]]}}"
}
myroll+="{{senddata=[[0]]}}";
myroll+= "{{charreach=[[" + myreach + "]]}}{{targetreach=[[@{target|" + lang["target"] +"|meleereach|max}]]}}"
myroll+="{{weaponname=" + myweapon + "}}"
myroll+= (askreach==0)? "{{reachmod=[[?{" + lang["use-reach-modifier"] +"?|" + lang["yes"] + ",1|" + lang["no"] + ",0}]]}}{{reachbonus=[[(@{target|" + lang["target"] +"|meleereach|max} - @{meleereach|max} ) * ?{" + lang["use-reach-modifier"] +"?}]]}}" : "{{reachmod=[[0]]}}";
myroll+="{{rolldice=[[" + calcDice + "]]}}{{targetnumber=[[" + calcTN + "]]}}"
if ( payload == "none" ) {
myroll+="{{attacktest=[[ [[" + calcDice + "]]d6>[[ {2,[[ " + calcTN + "]]}kh1]]!! ]] }}"
myroll += "{{attackmode=Attack}}{{defend=yes}}";
payload={
dodge: 0,
weapon: myweapon,
armortype: "impact",
attacker: myname,
strength: strmax,
power: mypower,
wdmg: mydamage,
plane: plane,
maxd: 4 - damagetable[mydamage]
};
} else {
myroll += "{{attacknumber=[[" + payload["attacktest"] + "]]}}{{win=[[1]]}}{{attacker=" + payload["attacker"] + "}}{{defender=" + myname + "}}";
myroll += "{{defensetest=[[ [[" + calcDice + "]]d6>[[ {2,[[ " + calcTN + "]]}kh1]]!! ]] }}";
myroll += (payload["defmode"]=="regular")? "{{attackmode=Defend}}" : "{{attackmode=Full Defense}}{{dodge=yes}}";
payload["dmaxd"]= 4 - damagetable[mydamage];
}
myroll+=defaultmsg;
myroll+=gyropenroll;
console.log('wdmg ' + mydamage);
console.log(myroll);
startRoll(myroll, (results) => {
var delta, finalpower, finaldmg, mywinner, mylooser;
var reachmodtxt="Reach Bonus Applied" ;
if ( results.results.reachmod.result == 0 ) reachmodtxt="Reach Bonus Not Applied";
payload["reachmode"]=results.results.reachmod.result;
if (payload["attacktest"]) {
console.log('defense run');
defroll=results.results.defensetest.result;
payload["ammotype"]="melee";
payload["range"]="melee";
payload["meleetn"]=results.results.targetnumber.result;
if (payload["attacktest"] >= defroll ) {
mywinner=payload["attacker"];
mylooser=myname;
delta=Math.floor((payload["attacktest"] - defroll)/2);
payload["wdmg"]=finaldmg=damagetable[(delta >= payload["maxd"])? 4 : damagetable[payload["wdmg"]] + delta];
payload["power"]=finalpower=(delta >= payload["maxd"])? payload["power"] + (delta - payload["maxd"]) : payload["power"];
console.log('attacker wins');
} else {
console.log('defender wins');
mywinner=myname;
mylooser=payload["attacker"];
delta=Math.floor((defroll - payload["attacktest"])/2);
payload["weapon"]=myweapon;
if ( payload["defmode"] == "regular" ) {
payload["wdmg"]=finaldmg=damagetable[(delta >= payload["dmaxd"])? 4 : damagetable[mydamage] + delta];
payload["power"]=finalpower=(delta >= payload["dmaxd"])? mypower + (delta - payload["dmaxd"]) : mypower;
payload["strength"]=strmax;
} else {
console.log('full defense mode');
payload["wdmg"]="Attack";
payload["power"]="Parried";
}
}
payload["attacktest"]=0;
} else {
console.log('attack run');
payload["attacktest"]=results.results.attacktest.result;
}
console.log(payload);
if (defroll != null) {
console.log('finish dmg ' + finaldmg + ' power ' + finalpower + ' winner: ' + typeof mywinner + ' looser: ' + mylooser);
let testmsg='brad';
finishRoll( results.rollId, {
finalwinner: mylooser,
reachmod: reachmodtxt,
weapondamage: mydamage,
weapondamage: finaldmg,
weaponpower: finalpower,
senddata: rollEscape.escape(payload),
});
} else {
finishRoll( results.rollId, {
reachmod: reachmodtxt,
weapondamage: mydamage,
senddata: rollEscape.escape(payload),
});
}
if ( pool != "none" ) updatepoolused(pool, results.results.pooldice.result );
});
});
};
on('clicked:meleedefend', (info) => {
if (!("yes" in lang)) geti18n();
console.log(info);
payload=rollEscape.unescape(info["originalRollId"]);
getAttrs(["meleeselected"], function(myval) {
payload["defmode"]="regular";
const mselect=myval["meleeselected"];
mymode = (mselect == "unarmed-equipped")? "unarmedattack" : mselect.slice(0, -12);
meleecombat(mymode, payload);
});
});
on('clicked:meleedefendfull', (info) => {
if (!("yes" in lang)) geti18n();
console.log(info);
payload=rollEscape.unescape(info["originalRollId"]);
getAttrs(["meleeselected"], function(myval) {
payload["defmode"]="full";
const mselect=myval["meleeselected"];
mymode = (mselect == "unarmed-equipped")? "unarmedattack" : mselect.slice(0, -12);
meleecombat(mymode, payload);
});
});
on('clicked:repeating_meleeweapons:attack', (info) => {
if (!("yes" in lang)) geti18n();
var source=info['sourceAttribute'].split('_');
var sourceattr=source.pop();
var myrepeat=source.join('_').concat('_');
payload="none";
meleecombat(myrepeat, payload);
});
on('clicked:melee', (info) => {
payload="none";
const mymode=info["htmlAttributes"]["id"];
meleecombat(mymode, payload);
});
on('clicked:repeating_explosives:rangedattack', (info) => {
if (!("yes" in lang)) geti18n();
var setatts={};
var scatter="";
var atts=["combatpool-used", "controlpool-used", "character_name"];
var rounds=1;
var expint=0;
var source=info['sourceAttribute'].split('_');
var sourceattr=source.pop();
var myrepeat=source.join('_').concat('_');
var mymode=info["htmlAttributes"]["id"]
const scatimg="https://raw.githubusercontent.com/bahornbeck/img/master/images/scatterdiagram";
const weaponattrs=["damage", "power", "name", "exptype", "ammoremain", "skill", "wfamily", "specialized", "targeting", "recoilcomp", "gyro", "ammo", "scatter", "blast","scatterredux", "missleint", "tnmods"] ;
weaponattrs.forEach(myatt=>{
atts.push(myrepeat.concat(myatt));
});
getAttrs(atts, function(myval) {
const combatused= parseInt(myval["combatpool-used"]);
const controlused= parseInt(myval["controlpool-used"]);
const myname= myval["character_name"];
const myweapon= myval[myrepeat.concat("name")];
const wdmg= myval[myrepeat.concat("damage")];
const [grenadeshape,grenadetype]= myval[myrepeat.concat("exptype")].split(":");
const wpower= myval[myrepeat.concat("power")];
const ammoremain= myval[myrepeat.concat("ammoremain")];
const gyro= myval[myrepeat.concat("gyro")];
const targetaim= parseInt(myval[myrepeat.concat("targeting")]);
const tnmods= myval[myrepeat.concat("tnmods")];
var dmgnumber= damagetable[wdmg];
var range="{{range=[[?{" + lang["range"] + "|" + lang["short"] + ",4|" + lang["medium"] + ",5|" + lang["long"] + ",6|" + lang["extreme"] + ",9}]]}}";
var missleintel=0;
var calcTN;
if ( mymode=="sensorexp") {
range="";
missleintel=myval[myrepeat.concat("missleint")] || 0;
expint="{{expint=[[" + missleintel + "]]}}"
calcTN="[[ @{target|" + lang["target"] +"|signature} + ?{" + lang["urban-setting"] + "?|" + lang["yes"] + ",2|" + lang["no"] + ",0} + @{wp-char}";
poolname="Combat";
pool="combatpool";
mypool="combat";
} else if ( mymode=="vehicle-sensorexp" ) {
range="";
missleintel=myval[myrepeat.concat("missleint")] || 0;
expint="{{expint=[[" + missleintel + "]]}}"
calcTN="[[ @{target|" + lang["target"] +"|signature} + ?{" + lang["urban-setting"] + "?|" + lang["yes"] + ",2|" + lang["no"] + ",0} + @{wp-vehicle} + @{gunnery-test-los}";
poolname="Control";
pool="controlpool";
mypool="control";
} else if ( mymode=="vehicle-explosive" ) {
calcTN = "[[ ?{" + lang["range"] + "} + @{rangedTN} + @{target|" + lang["target"] +"|targetMove} + {0,( @{move} - " + gyro + ") }kh1 + " + targetaim + " + @{wp-vehicle}";
poolname="Control";
pool="controlpool";
mypool="control";
} else {
poolname="Combat";
pool="combatpool";
mypool="combat";
calcTN = "[[ ?{" + lang["range"] + "} + @{rangedTN} + @{target|" + lang["target"] +"|targetMove} + {0,( @{move} - " + gyro + ") }kh1 + " + targetaim + " + @{wp-char}";
}
let direction=getRandomInt(1, 7);
const myskill=myval[myrepeat.concat("skill")];
const myscat=myval[myrepeat.concat("scatter")];
const myblast=myval[myrepeat.concat("blast")];
const myredux=myval[myrepeat.concat("scatterredux")];
const specialized=myval[myrepeat.concat("specialized")] || 0;
if (ammoremain <= 0 ) {
roll="&{template:info}{{character=@{character_name}}}{{action=Attack: " + myweapon + "}}{{type=" + lang["simple"] + "}}{{info1=Out of Explosives }}";
startRoll(roll, (results) => {
finishRoll( results.rollId,{});
});
} else {
var calcDice = "[[ " + myskill + " + " + specialized + " + ?{" + lang[mypool + "-pool-dice"] + "|0} + " + missleintel + " ]]"
calcTN += " + ?{" + lang["miscellaneous-modifiers"] + "|" + tnmods + "} ]]"
var roll="&{template:explosive}{{mytoken=@{selected|token_id}}}{{myname=@{character_name}}}{{target=@{target|" + lang["target"] +"|token_name}}}{{targettoken=@{target|" + lang["target"] +"|token_id}}}" + range
roll += "{{rolldice=" + calcDice + "}}{{targetnumber=[[{2,( " + calcTN + ")}kh1]]}}";
roll += "{{weapondamage=" + wdmg + "}}{{senddata=[[0]]}}";
roll += "{{weaponpower=" + wpower + "}}" + expint;
if ( ( mymode=="vehicle-explosive" ) || ( mymode=="vehicle-sensorexp") ) roll += "{{controlpool=[[?{" + lang["control-pool-dice"] + "|0}]]}}";
else roll += "{{combatpool=[[?{" + lang["combat-pool-dice"] + "|0}]]}}";
roll += "{{weaponname=" + myval[myrepeat.concat("name")] + "}}";
roll += "{{attacktest=[[ " + calcDice + "d6>[[ {2, ( " + calcTN + ")}kh1 ]]!! ]] }}";
roll += "{{scatdir=[[1d6]]}}{{scatter=[[" + myscat + "d6]]}}{{blastradius=" + myblast ;
roll += "}}{{scatterredux=" + myredux + "}}{{scatdirnumber=[[" + direction ;
roll += "]]}}{{scatdir=" + scatimg + direction + ".png}}";
roll += "{{expresist=yes}}";
console.log(roll);
startRoll(roll, (results) => {
var myscatter = results.results.scatter.result;
const mysuccess = results.results.attacktest.result;
console.log('start scatter: ' + myscatter);
console.log('successes: ' + mysuccess);
myscatter = myscatter - ( mysuccess * myredux) - missleintel;
console.log('myscatter ' + myscatter);
if ( myscatter < 0 ) myscatter=0;
let payload= {
attacker: myname,
weapon: myweapon,
armortype: "impact",
wdmg: wdmg,
rounds: 1,
dodge: 0,
attacktest: results.results.attacktest.result,
power: wpower,
scatter: myscat,
blast: myblast,
ammotype: grenadetype.toLowerCase(),
}
if (( mymode=="sensorexp") || ( mymode=="vehicle-sensorexp")) payload["range"]="sensor";
else payload["range"]=results.results.range.result;
finishRoll( results.rollId,
{
scatter: myscatter,
senddata: rollEscape.escape(payload),
}
);
if (( mymode=="vehicle-explosive" ) || ( mymode=="vehicle-sensorexp")) setatts["controlpool-used"] = results.results.controlpool.result + controlused;
else setatts["combatpool-used"] = results.results.combatpool.result + combatused;
setatts[myrepeat.concat("ammoremain")]=ammoremain - 1;
setAttrs(setatts);
});
}
});
});
const matrixattrs={ props: ["security", "access", "control", "index", "files", "slave"],
attadd: "matrix", attappend: "rating"}
const otherattrs=["sheettype", "vcr", "initiategrade", "totem", "totemenv", "totemadv", "totemdisadv"];
const weaponfocus={
props: ["name", "reach", "conceal", "skill", "force", "power", "damage", "specialized", "tnmods", "notes"],
attadd: "weaponfocus-"
};
const adeptpowers={ attadd: "adept", props: ["cost", "notes", ""], list: ["improvedreflexes", "bodyboost", "strengthboost", "quicknessboost", "painres" ] };
const deckutils={
list: ["specialutils", "defensiveutils", "offensiveutils"],
specialutils: ["sleaze" , "track"], defensiveutils: ["armor", "cloak", "lockon", "medic"], offensiveutils: [ "attack", "blackhammer", "killjoy", "slow"],
props: ["-rating", "-notes", ""], attadd: "deck"
};
const otherskills=["computers"];
const loadattributes=[ "body", "quickness", "strength", "charisma", "willpower", "intelligence", "perception", "reaction", "initiative"];
const critteratts=[ "perception", "attacks", "force", "reach"];
const weaponskills=[ "clubs", "assaultrifles", "cyberimplant", "edged", "gunnery", "heavyweapons", "lasers", "launchers", "pistols", "poles", "projectiles", "rifles", "shotguns", "smgs", "whips", "throwing", "demolitions", "underwatercombat", "unarmed" ]
const magicskills=["sorcery", "spellcasting", "spelldefense","dispelling","astralcombat", "ritualsorcery", "conjuring", "summoning", "banishing", "spiritcontrol","aurareading", "areadauras", "areadsignatures","areadsorcery"]
const sorceryspec=["spellcasting", "spelldefense","dispelling","astralcombat", "ritualsorcery"];
const conjuringspec=["summoning", "banishing", "spiritcontrol"];
const auraspec=["aurareading", "areadauras", "areadsignatures","areadsorcery"];
const deckspec=["hardware", "decking", "programming"];
const vehiclespec={
props: ["vehicle-type", "vehicle-size", "handling-street", "handling-offroad", "speed-rating", "acceleration", "body", "armor", "signature", "autonav", "pilot", "firmpoints", "hardpoints", "seating", "entry", "fuel", "economy", "cargo", "load", "vehicle-skill", "gunnery", "ivis-pool", "totalcost", "driver", "rigger"],
attmap: {"vehicle-type": "type", "vehicle-size": "size", "handling-street": "street", "handling-offroad": "offroad", "speed-rating": "speed"}
};
const decklist=["mpcp", "bod", "evasion", "masking", "sensors"];
const deckopts=["name", "hardening", "activemem", "storagemem", "response", "iccm", "offlinestorage"];
const poollist=["combatpool-mods","spellpool-mods","spellpool-mods","hackingpool-mods","controlpool-mods","astralpool-mods","taskpool"];
const rcdeck={
props: ["ewarfare", "rcdeck-rating", "eccm-rating", "rcdeck-decryption-rating", "rcdeck-encryption-rating", "rcdeck-pem-rating"],
attmap: {'rcdeck-rating': "rating", 'eccm-rating': "eccm", 'rcdeck-decryption-rating': "decryption", 'rcdeck-encryption-rating': "encryption", 'rcdeck-pem-rating': "pem"}
};
const repeatprops={
armor: {
props: ["armorname", "ballistic", "impact", "slot", "weight", "load"],
attmap: {armorname: "name"}
},
skills: {
props: ["skillname", "skillrating", "pool" ],
attmap: {skillname: "name", skillrating: "rating"}
},
edges: {
props: ["name", "rating"]
},
flaws: {
props: ["name", "rating"]
},
adeptpowers: {
props: ["adeptpower", "powerrating", "powernotes", "powercost"],
attmap: {adeptpower: "name", powerrating: "rating", powercost: "cost", powernotes: "notes"}
},
spells: {
props: ["name", "spellcategory", "specialized", "force", "foci", "range", "target", "damage", "duration", "drain", "drainlvl", "description"]
},
geas: {
props: ["type", "notes"],
attadd: "geas"
},
conjuring: {
props: ["name", "type", "force", "fetish", "expendable"]
},
foci: {
props: ["type", "category", "force", "qty"]
},
metamagic: {
props: ["name", "notes"],
attadd: "metamagic"
},
cyberware: {
props: ["name", "rating", "essence", "notes"],
attadd: "cyberware-"
},
nanotech: {
props: ["name", "rating", "essence", "notes"],
attadd: "nanotech-"
},
bioware: {
props: ["name", "rating", "index", "notes"],
attadd: "bioware-"
},
rangedweapons: {
props: ["name", "type", "conceal", "power", "ammo", "damage", "specialized", "tnmods", "recoilcomp", "gyro", "targeting", "reloadmethod", "notes", "weight", "load", "ammoweight"]
},
meleeweapons: {
props: ["name", "skill", "conceal", "reach", "power", "damage", "specialized", "tnmods", "notes", "weight", "load"]
},
explosives: {
props: ["name", "type", "conceal", "power", "damage", "missleint", "specialized", "tnmods", "recoilcomp", "gyro", "targeting", "rangefinder", "notes", "weight", "load", "ammoremain"],
attmap: {exptype: "type"}
},
ammunition: {
props: ["type", "count", "weight", "notes", "load"],
attadd: "ammo"
},
security: {
props: ["step", "event"]
},
ic: {
props: ["name", "rating", "type", "targettest", "notes"],
attadd: "ic"
},
contacts: {
props: ["name", "contacttype", "contactdetail"],
attmap: {contacttype: "type", contactdetail: "detail"}
},
lifestyles: {
props: ["lifestyle", "cost", "months-paid", "address", "description", "edgesflaws"],
},
'critter-powers': {
props: ["name", "description"]
},
'critter-weaknesses': {
props: ["name", "description"]
},
karma: {
props: ["purchase", "cost", "date", "notes"]
},
gear: {
props: ["name", "rating", "weight", "conceal", "type", "quantity", "pool", "load"]
},
credsticks: {
props: ["type", "id", "rating", "balance", "notes"]
},
drones: {
props: ["name", "model", "type", "cost", "notes"]
},
vehicles: {
props: ["name", "model", "cost", "notes"]
},
offensiveutils: {
props: ["utility", "rating", "multiplier", "size", "utilitynotes"],
attmap: {utilitynotes: "notes"}
},
defensiveutils: {
props: ["utility", "rating", "multiplier", "size", "utilitynotes"],
attmap: {utilitynotes: "notes"}
},
'deck-utilities': {
props: ["utility", "rating", "target", "multiplier", "size", "notes"]
}
};
for ( const [key,val] of Object.entries(repeatprops)) {
var onevent ="sheet:opened remove:repeating_" + key + " ";
repeatprops[key]["props"].forEach( prop=>{
if ("attadd" in repeatprops[key]) prop=repeatprops[key]["attadd"] + prop;
onevent +="change:repeating_" + key + ":" + prop + " ";
});
onevent = onevent.substring(0, onevent.length - 1);
on(onevent, function() {
const jsonatt=key + "-json";
exportRepeat(key);
});
}
const exportRepeat = function(key) {
const calcweight=["gear", "rangedweapons", "meleeweapons", "armor"];
const jsonatt=key + "-json";
var sets={}
var mylist=[];
getSectionIDs(key, function(idarray) {
var gets=[];
idarray.forEach((m, id) => {
repeatprops[key]["props"].forEach( prop=>{
prop=("attadd" in repeatprops[key])? repeatprops[key]["attadd"] + prop : prop;
gets.push("repeating_" + key + "_" + m + "_" + prop)
});
});
getAttrs(gets, function(myval) {
var weight=0;
var nuyen=0;
console.log('debug ' + key );
console.log(myval);
idarray.forEach((m, id) => {
myobj={};
repeatprops[key]["props"].forEach( prop=>{
myprop=("attadd" in repeatprops[key])? repeatprops[key]["attadd"] + prop : prop;
if ("attmap" in repeatprops[key]) {
prop=(prop in repeatprops[key]["attmap"])? repeatprops[key]["attmap"][prop] : prop;
}
myobj[prop]=myval["repeating_" + key + "_" + m + "_" + myprop];
});
if ( calcweight.includes(key)) weight+= parseFloat(myval["repeating_" + key + "_" + m + "_weight"]) * parseInt(myval["repeating_" + key + "_" + m + "_load"]);
if (key == "ammunition") weight+= parseFloat(myval["repeating_" + key + "_" + m + "_ammoweight"]) * parseInt(myval["repeating_" + key + "_" + m + "_ammoload"]);
if (key == "rangedweapons" ) weight+=parseFloat(myval["repeating_" + key + "_" + m + "_ammoweight"]);
if (key == "explosives" ) {
console.log('explosives weight');
weight+=(parseFloat(myval["repeating_" + key + "_" + m + "_weight"]) * parseInt(myval["repeating_" + key + "_" + m + "_ammoremain"]) * parseInt(myval["repeating_" + key + "_" + m + "_load"]) );
};
if (key == "credsticks") nuyen += parseFloat(myval["repeating_" + key + "_" + m + "_balance"]);
mylist.push(myobj);
});
const myout=JSON.stringify(mylist);
sets[jsonatt]=myout;
let wkey=key + "-weight";
weight=Number((weight).toFixed(2));
nuyen=Number((nuyen).toFixed(2));
if (( calcweight.includes(key)) || (key == "explosives") || (key == "ammunition")) sets[wkey]=weight;
if (( calcweight.includes(key)) || (key=="explosives") || (key == "ammunition")) console.log('calc weight ' + key);
if (key == "credsticks") sets["nuyen"]=nuyen;
console.log(sets);
setAttrs(sets);
});
});
}
on("clicked:jsonimport-char", function(){
getAttrs(["jsonnpc"], function(myval) {
npc=JSON.parse(myval["jsonnpc"]);
console.log(npc);
loadCharacter(npc);
});
});
on("clicked:jsonexport-char", function(){
getAttrs(["sheettype"], function(myval) {
exportCharacter(myval["sheettype"]);
});
});
const exportCharacter = function(sheet) {
var cyberdeck=[];
var adeptlist=[];
var utillist=[];
var longlist=[];
var atts=[];
var matrixlist=[];
if (sheet == "Matrix") {
atts.push("matrixcode", "matrixobject", "parentgrid", "sheettype");
matrixattrs.props.forEach(myatt=>{
matrixlist.push(matrixattrs.attadd + myatt + matrixattrs.attappend);
atts.push(matrixattrs.attadd + myatt + matrixattrs.attappend);
});
} else {
longlist=longlist.concat(loadattributes);
longlist=longlist.concat(poollist);
longlist=longlist.concat(otherattrs);
longlist=longlist.concat(vehiclespec.props);
longlist=longlist.concat(rcdeck.props);
longlist.forEach(myatt=>{
atts.push(myatt);
atts.push(myatt + "-mods");
});
atts=atts.concat(critteratts);
atts=atts.concat(magicskills);
atts=atts.concat(weaponskills);
atts=atts.concat(deckspec);
decklist.forEach(myatt=>{
atts.push("deck-" + myatt + "-max");
cyberdeck.push("deck-" + myatt + "-max");
});
deckopts.forEach(opt=>{
atts.push("deck-" + opt);
cyberdeck.push("deck-" + opt);
});
weaponfocus.props.forEach(prop =>{
atts.push(weaponfocus.attadd + prop);
});
adeptpowers["list"].forEach(power =>{
adeptpowers["props"].forEach(prop =>{
atts.push(adeptpowers.attadd + power + prop);
adeptlist.push(adeptpowers.attadd + power + prop);
});
});
deckutils["list"].forEach( util => {
deckutils[util].forEach(u=> {
deckutils["props"].forEach(p=> {
let myatt=deckutils.attadd + u + p;
atts.push(myatt);
utillist.push(myatt);
});
});
});
}
getAttrs(atts, function(myval) {
var skillsother=[];
var adeptother=[];
var offensiveother=[];
var defensiveother=[];
const jsonout={
vehicle: {},
rcdeck: {},
cyberdeck: {},
weaponfocus: {},
skills: [],
securitysheaf: [],
adeptpowers: [],
offensiveutils: [],
defensiveutils: [],
specialutils: []
};
console.log(myval);
for ( const [key,val] of Object.entries(myval)) {
var obj={};
if ((magicskills.includes(key)) || (otherskills.includes(key)) || (weaponskills.includes(key)) || (deckspec.includes(key))){
obj["name"]=key;
obj["rating"]=val;
if (val != 0 ) skillsother.push(obj);
} else if (adeptlist.includes(key)) {
continue;
} else if (utillist.includes(key)) {
continue;
} else if (cyberdeck.includes(key)) {
if ( val != 0 ) jsonout["cyberdeck"][key]=val;
} else if ( key.startsWith(weaponfocus.attadd )) {
if ( myval["weaponfocus-force"] !=0 ) jsonout["weaponfocus"][key.replace(weaponfocus.attadd, "")]=val;
} else if (otherattrs.includes(key)) {
if ( val != 0 ) jsonout[key]=val;
} else if (vehiclespec.props.includes(key)) {
if (( myval["sheettype"] == "Drone" || myval["sheettype"]=="Vehicle")) {
let mykey=(key in vehiclespec.attmap)? vehiclespec.attmap[key] : key;
jsonout["vehicle"][mykey]=val;
}
} else if (rcdeck.props.includes(key)) {
if ( val != 0 ) {
let mykey=(key in rcdeck.attmap)? rcdeck.attmap[key] : key;
jsonout["rcdeck"][mykey]=val;
};
} else if ( key=="matrixcode" ) jsonout["code"]=val;
else if ( matrixlist.includes(key)) jsonout[(key.replace(matrixattrs.attadd, "")).replace(matrixattrs.attappend, "")]=val;
else if ( val !=0 ) jsonout[key]=val;
};
jsonatts=[]
for ( const [key,val] of Object.entries(repeatprops)) {
jsonatts.push(key + "-json");
};
getAttrs(jsonatts, function(v) {
console.log('v');
console.log(v);
for ( const [key,val] of Object.entries(repeatprops)) {
const jv=key + "-json";
console.log(jv);
const okey=(key=="security")? "securitysheaf" : key;
if ( jv in v ) jsonout[okey]=JSON.parse(v[key + "-json"]);
}
if ( "skills" in jsonout) jsonout["skills"] = jsonout["skills"].concat(skillsother);
else jsonout["skills"] = skillsother;
if ( "adeptpowers" in jsonout) {
jsonout["adeptpowers"] = jsonout["adeptpowers"].concat(adeptother);
}
console.log('starting adept out')
adeptpowers["list"].forEach(power =>{
const obj={};
obj["name"]=power;
console.log(adeptpowers.attadd + power);
console.log(myval[adeptpowers.attadd + power]);
obj["rating"]=myval[adeptpowers.attadd + power];
obj["cost"]=myval[adeptpowers.attadd + power + "-cost"];
obj["notes"]=myval[adeptpowers.attadd + power + "-notes"];
if (myval[adeptpowers.attadd + power] > 0 ) jsonout["adeptpowers"].push(obj);
});
console.log('starting deck util out')
deckutils["list"].forEach( util => {
deckutils[util].forEach(u=> {
const obj={};
let rating=deckutils.attadd + u + "-rating";
let notes=deckutils.attadd + u + "-notes";
obj["utility"]=u;
obj["rating"]=myval[rating];
obj["notes"]=myval[notes];
if ( myval[rating] > 0 ) jsonout[util].push(obj);
});
});
for ( const [key,val] of Object.entries(repeatprops)) {
if (key == "security") {
if (jsonout["securitysheaf"].length === 0 ) delete jsonout["securitysheaf"]
} else {
if (jsonout[key].length === 0 ) delete jsonout[key]
}
};
if ( jsonout.specialutils.length === 0 ) delete jsonout.specialutils;
if ( Object.keys(jsonout.cyberdeck).length === 0 ) delete jsonout.cyberdeck;
if ( Object.keys(jsonout.weaponfocus).length === 0 ) delete jsonout.weaponfocus;
if ( Object.keys(jsonout.vehicle).length === 0 ) delete jsonout.vehicle;
if ( Object.keys(jsonout.rcdeck).length === 0 ) delete jsonout.rcdeck;
console.log(jsonout);
myout=JSON.stringify(jsonout);
setAttrs({jsonout: myout});
});
});
};
const loadCharacter = function (npc) {
getAttrs(["jsonnpc"], function(myval) {
var atts={};
repeatskills=[];
npc=JSON.parse(myval["jsonnpc"]);
console.log(npc);
const skills = ( "skills" in npc )? npc["skills"] : [];
const pools = ( "pools" in npc )? npc["pools"] : [];
atts["essense"] = ("essense" in npc)? npc["essense"] : 6;
atts["metatype"] = ( "metatype" in npc )? npc["metatype"] : "Human";
if ( "character_name" in npc ) atts["character_name"]=npc["character_name"] ;
if ( "type" in npc ) atts["sheettype"]=npc["type"];
if ( "vcr" in npc ) atts["vcr"]=npc["vcr"];
if ( "magic" in npc ) atts["magic"]=npc["magic"];
const sheettype=("sheettype" in npc)? npc.sheettype : "Character";
if ( sheettype=="Matrix") {
console.log('loading matrix');
atts["sheettype"]=sheettype;
atts["matrixobject"]=("matrixobject" in npc)? npc["matrixobject"] : "Host";
atts["matrixcode"]=("code" in npc)? npc["code"] : "GREEN";
if ( "ic" in npc ) {
npc.ic.forEach( repeat => {
var newrowid = generateRowID();
repeatprops.ic.props.forEach( prop => {
myprop=prop;
prop=repeatprops.ic.attadd + prop;
atts["repeating_ic_" + newrowid + "_" + prop]=repeat[myprop];
});
});
}
if ( "securitysheaf" in npc ) {
npc.securitysheaf.forEach( repeat => {
var newrowid = generateRowID();
repeatprops.security.props.forEach( prop => {
myprop=prop;
atts["repeating_security_" + newrowid + "_" + prop]=repeat[myprop];
});
});
}
matrixattrs.props.forEach(attr=>{
if ( attr in npc ) atts[matrixattrs.attadd + attr + matrixattrs.attappend]=npc[attr];
});
} else {
console.log('loading attributes');
loadattributes.forEach(myatt=>{
let max=myatt.concat("_max");
let mod=myatt.concat("-mods");
if(npc[myatt]) atts[myatt]=npc[myatt];
if(npc[mod]) atts[mod]=npc[mod];
if(npc[max]) atts[mod]=npc[max] - npc[myatt];
if(npc[max] == 'initiative_max') console.log('initme' + npc[max]);
});
console.log('loading pools');
poollist.forEach(myatt=>{
if (npc[myatt]) atts[myatt]=npc[myatt];
});
console.log('loading critter attributes');
critteratts.forEach(myatt=>{
if (npc[myatt]) {
if (myatt == "attacks") {
myattack=npc[myatt].split('');
atts["attackdamage"]=myattack.pop();
atts["attackpower"]=parseInt(myattack.join(''));
} else if (myatt="reach"){
atts["meleereach"]=npc[myatt];
} else {
atts[myatt]=npc[myatt];
}
}
});
console.log('loading skills');
skills.forEach(skill=>{
let myskill = skill["name"].toLowerCase();
if ( weaponskills.includes(myskill) ) {
atts[myskill] = skill["rating"];
} else if (magicskills.includes(myskill)) {
if ( sorceryspec.includes(myskill)) atts["sorcery-spec-switch"]=1;
if ( conjuringspec.includes(myskill)) atts["conjuring-spec-switch"]=1;
if ( auraspec.includes(myskill)) atts["auraread-spec-switch"]=1;
atts[myskill] = skill["rating"];
} else if (atts[myskill]=="decking") {
atts[myskill] = skill["rating"];
} else if ( deckspec.includes(myskill)) {
atts["deck-spec-switch"]=1;
atts[myskill] = skill["rating"];
} else {
repeatskills.push(skill);
}
});
console.log('loading misc attributes');
otherattrs.forEach(miscatt=>{
if ( miscatt in npc) atts[miscatt]=npc[miscatt];
});
console.log('loading adept powers');
if ( "adeptpowers" in npc ) {
for (i = npc["adeptpowers"].length - 1; i >= 0; i -= 1) {
if ( adeptpowers["list"].includes(npc["adeptpowers"][i]["name"])) {
console.log('found non repeating power ' + npc["adeptpowers"][i]["name"]);
atts[adeptpowers.attadd + npc["adeptpowers"][i]["name"]]=npc["adeptpowers"][i]["rating"];
npc["adeptpowers"].splice(i, 1);
};
};
};
console.log('loading rcdeck');
if ( "rcdeck" in npc ) {
rcdeck.props.forEach(prop=>{
let mykey=(prop in rcdeck.attmap)? rcdeck.attmap[prop] : prop;
if (mykey in npc["rcdeck"]) atts[prop]=npc["rcdeck"][mykey];
})};
console.log('loading vehicle');
if ( "vehicle" in npc ) {
vehiclespec.props.forEach(prop=>{
let mykey=(prop in vehiclespec.attmap)? vehiclespec.attmap[prop] : prop;
if (mykey in npc["vehicle"]) atts[prop]=npc["vehicle"][mykey];
})};
console.log('loading cyberdeck');
if ( "cyberdeck" in npc ) {
for ( const [key,val] of Object.entries(npc.cyberdeck)) {
atts[key]=val;
}
};
console.log('loading weaponfocus');
if ( "weaponfocus" in npc ) {
for ( const [key,val] of Object.entries(npc.weaponfocus)) {
atts[key]=val;
}
};
deckutils["list"].forEach( util => {
console.log('loading deck utils ' + util);
if (npc[util]) {
for (i = npc[util].length - 1; i >= 0; i -= 1) {
console.log('u ' + npc[util][i]["utility"]);
if ( deckutils[util].includes(npc[util][i]["utility"])) {;
console.log('found non repeating utility ' + npc[util][i]["utility"]);
atts[deckutils.attadd + npc[util][i]["utility"]] = npc[util][i]["rating"];
npc[util].splice(i, 1);
}
};
}
});
console.log('loading repeat skills');
npc["skills"]=repeatskills;
for ( const [key,val] of Object.entries(repeatprops)) {
if ( key in npc ) {
console.log('loading ' + key);
npc[key].forEach( repeat => {
var newrowid = generateRowID();
repeatprops[key]["props"].forEach( prop => {
myprop=prop;
prop=("attadd" in repeatprops[key])? repeatprops[key]["attadd"] + prop : prop;
if ("attmap" in repeatprops[key]) {
myprop=(prop in repeatprops[key]["attmap"])? repeatprops[key]["attmap"][prop] : prop;
}
atts["repeating_" + key + "_" + newrowid + "_" + prop]=repeat[myprop];
});
});
}
};
}
console.log('before atts');
console.log(atts);
Object.keys(atts).forEach(key => atts[key] === undefined && delete atts[key])
console.log('final atts');
console.log(atts);
setAttrs(atts);
});
};
const switchbuttons1 = ["securitysheaf", "astralattributes", "sorceryskills", "spells", "adeptpowers", "magicinitiate", "foci", "geas", "totem", "combatskills", "cyberware", "deckingskills", "bioware", "gear", "contacts"];
const switchbuttons2 = ["gunnery","deck-utilities-","deck-skills-", "deck-cyberdeck-", "drones-skills-", "drones-models-", "vehicle-skills-", "drone-list-", "ic-", "rc-deck-" ];
const switchbuttons = switchbuttons1.concat(switchbuttons2)
switchbuttons.forEach(button => {
let mybutton=button.concat('switch');
on(`clicked:${mybutton}`, function() {
console.log(mybutton)
getAttrs([mybutton], function(myval){
if (myval[mybutton] == "show") {
setAttrs({[mybutton]: "hide"});
} else {
setAttrs({[mybutton]: "show"});
}
});
});
});
on("clicked:show-hide", (info) => {
const myid=info["htmlAttributes"]["id"]
console.log('clicked ' + myid);
getAttrs([myid], function(myval) {
if (myval[myid] == "show") setAttrs({[myid]: "hide"});
else setAttrs({[myid]: "show"});
});
});
const vehicleskills=["bike","car","hovercraft", "motorboat", "sailboat", "submarine", "wingedaircraft", "tracks", "semiballistic", "lta", "rotor", "ship", "vectoredthrust", "mecharm", "suborbital", "walkers"];
let vchangelist="";
let vonprefix=" change:";
let vonsuffix="-specialize";
let vattrs=[];
vehicleskills.forEach(skill => {
let myvonchange = vonprefix.concat(skill.concat(vonsuffix));
vchangelist += myvonchange;
});
on(vchangelist, function(eventinfo) {
var mybase=eventinfo["sourceAttribute"].split("-")[0]
var myspec=eventinfo["sourceAttribute"];
var myremote=mybase.concat("-remote")
vattrs.push(mybase);
vattrs.push(myspec);
console.log(vattrs);
getAttrs(vattrs, function(myval) {
if (myval[myspec] == 0) {
console.log('setting ' + myremote + ' to ' + myval[mybase]);
setAttrs({[myremote]: myval[mybase]});
}
});
});
const deckutilrepeat=["deck-utilities", "offensiveutils", "defensiveutils"]
const utilitylist=["decksleaze", "decktrack", "deckarmor", "deckcloak", "deckmedic", "decklockon", "deckattack", "deckblackhammer", "deckkilljoy", "deckslow"];
let changelist="change:deckattack-multiplier";
let onprefix=" change:";
let onsuffix="-rating";
utilitylist.forEach(util => {
let myonchange = onprefix.concat(util);
myonchange = myonchange.concat("-rating");
changelist += myonchange;
});
console.log('changelist');
console.log(changelist);
on(changelist, function(eventinfo) {
let myutil=eventinfo["sourceAttribute"].split("-")[0];
var myrating=myutil.concat("-rating");
var mymulti=myutil.concat("-multiplier");
var mysize=myutil.concat("-size");
getAttrs([myrating, mymulti], function(myval) {
let r = parseInt(myval[myrating]);
let m = parseInt(myval[mymulti]);
let s = (r * r) * m;
setAttrs({[mysize]: s});
});
});
const personalist=["deck-mpcp", "deck-bod", "deck-evasion", "deck-sensors", "deck-masking", "deck-detection"];
let pchangelist="sheet:opened change:deck-realityfilter change:deck-icsuppresspool change:deck-icsuppressed";
let ponprefix=" change:";
var pgetatts=["deck-realityfilter","deck-icsuppressed","deck-icsuppresspool", "hackingpool-used"];
personalist.forEach(p => {
pchangelist += ponprefix.concat(p.concat("-max"));
pchangelist += ponprefix.concat(p.concat("-mods"));
pgetatts.push(p.concat("-max"));
pgetatts.push(p.concat("-mods"));
});
on(pchangelist, function() {
console.log('deck-mpcp change');
getAttrs(pgetatts, function(myval) {
sets={};
console.log(myval);
console.log(myval["deck-realityfilter"]);
var hp = parseInt(myval["hackingpool"]);
var hackpool= hp || 0;
var mysuppress=parseInt(myval["deck-icsuppressed"]);
sets["deck-mpcp-final"] = parseInt(myval["deck-mpcp-max"]) + parseInt(myval["deck-mpcp-mods"]) - parseInt(myval["deck-realityfilter"]);
sets["deck-bod-final"] = parseInt(myval["deck-bod-max"]) + parseInt(myval["deck-bod-mods"]);
sets["deck-sensors-final"] = parseInt(myval["deck-sensors-max"]) + parseInt(myval["deck-sensors-mods"]);
sets["deck-evasion-final"] = parseInt(myval["deck-evasion-max"]) + parseInt(myval["deck-evasion-mods"]);
sets["deck-masking-final"] = parseInt(myval["deck-masking-max"]) + parseInt(myval["deck-masking-mods"]);
if ( myval["deck-icsuppresspool"] == 1) {
sets["hackingpool-icsuppress"] = mysuppress;
sets["deck-detection-final"] = parseInt(myval["deck-detection-max"]) + parseInt(myval["deck-detection-mods"]);
} else {
sets["deck-detection-final"] = parseInt(myval["deck-detection-max"]) + parseInt(myval["deck-detection-mods"]) - mysuppress;
}
console.log(sets);
setAttrs(sets);
});
});
on("change:frame-initiative change:frame-core", function () {
getAttrs(["frame-initiative", "frame-core"], function(myval) {
var mycore = parseInt(myval["frame-core"]);
var myinit = parseInt(myval["frame-initiative"] + 1 );
setAttrs({"deck-mpcp-max": mycore, "deck-reaction-final": mycore, "deck-initiative": myinit });
});
});
var utilsizechange;
const cprefix=" change:repeating_";
deckutilrepeat.forEach(p => {
utilsizechange += cprefix.concat(p.concat(":multiplier"));
utilsizechange += cprefix.concat(p.concat(":size"));
utilsizechange += cprefix.concat(p.concat(":rating"));
});
on(utilsizechange, function(info) {
console.log(info);
getAttrs(["repeating_deck-utilities_rating", "repeating_deck-utilities_multiplier"], function(myval) {
let r = parseInt(myval["repeating_deck-utilities_rating"]);
let m = parseInt(myval["repeating_deck-utilities_multiplier"]);
let s = (r * r) * m;
let myattr = "repeating_deck-utilities_size";
setAttrs({[myattr]: s});
});
});
on("change:matrixsecurityrating", function() {
console.log('change of sec rating');
const atlist=["deck-bod-max", "deck-evasion-max", "deck-masking-max", "deck-sensors-max", "deck-mpcp-max", "deck-detection-max", "decking"];
getAttrs(["matrixsecurityrating"], function(myval) {
sets={};
let sr = parseInt(myval["matrixsecurityrating"]);
atlist.forEach(at=> {
sets[at]=sr;
});
sets["matrix-iconstatus"]=(sr > 0 )? "Legitimate" : "Intruder";
console.log(sets);
setAttrs(sets);
});
});
var deckchangelist;
utilitylist.forEach(p => {
deckchangelist += ponprefix.concat(p.concat("-loaded"));
deckchangelist += ponprefix.concat(p.concat("-size"));
deckchangelist += ponprefix.concat(p.concat("-rating"));
});
deckutilrepeat.forEach(p => {
const utilatts=["loaded", "size", "rating"];
deckchangelist += " change:repeating_" + p + ":loaded";
deckchangelist += " change:repeating_" + p + ":size";
deckchangelist += " change:repeating_" + p + ":rating";
});
on(deckchangelist, function(info) {
var myatts=["deck-utilitypayload", "deck-activemem", "deck-util-size-loaded", "deck-util-rating-loaded"];
console.log(info);
myold=info["previousValue"];
mynew=info["newValue"];
var myattrib;
var myrepeat;
var mybase;
var mysizeattr;
var myloadattr;
var myratingattr;
if (info["sourceAttribute"].includes("repeating_")) {
mybase=info["sourceAttribute"].split("_");
myattrib=mybase.pop();
myrepeat=mybase.join('_');
mysizeattr=myrepeat.concat("_size");
myloadattr=myrepeat.concat("_loaded");
myratingattr=myrepeat.concat("_rating");
myratingfinal=myrepeat.concat("_rating-final");
} else {
mybase=info["sourceAttribute"].split("-");
myattrib=mybase.pop();
myrepeat=mybase;
mysizeattr=myrepeat +"-size";
myloadattr=myrepeat + "-loaded";
myratingattr=myrepeat + "-rating";
myratingfinal=myrepeat + "-rating-final";
}
myatts.push(mysizeattr, myloadattr, myratingattr, );
console.log('myatt: ' + myattrib);
console.log('myrepeat: ' + myrepeat);
console.log(myatts);
if (myattrib.includes("loaded")) console.log('change load');
if (myattrib.includes("rating")) console.log('change rating');
if (myattrib.includes("size")) console.log('change size');
getAttrs(myatts, function(myval){
var newsize;
var newratings;
setatts=[];
const currentsize=parseInt(myval["deck-util-size-loaded"]);
const currentrat=parseInt(myval["deck-util-rating-loaded"]);
if ( myattrib == "loaded" ) {
if ( myval[myloadattr] == 1 ) {
console.log('loading utility ' + myrepeat);
newsize=currentsize + parseInt(myval[mysizeattr]);
newratings=currentrat + parseInt(myval[myratingattr]);
setatts[myratingfinal]=parseInt(myval[myratingattr]);
} else {
console.log('un-loading utility ' + myrepeat);
newsize=currentsize - parseInt(myval[mysizeattr]);
newratings=currentrat - parseInt(myval[myratingattr]);
setatts[myratingfinal]=0;
}
} else if ( myattrib == "size" ) {
if ( myval[myloadattr] == 1 ) {
newsize = currentsize + ( parseInt(myval[mysizeattr]) - parseInt(myold));
console.log('change of size ' + myrepeat + ' from: ' + myold + ' to: ' + myval[mysizeattr]);
}
} else if ( myattrib == "rating") {
if ( myval[myloadattr] == 1 ) {
newratings = currentrat + ( parseInt(myval[myratingattr]) - parseInt(myold));
console.log('change of rating ' + myrepeat + ' from: ' + myold + ' to: ' + myval[myratingattr]);
}
} else {
console.log('invalid event');
}
console.log('debug size' + newsize);
console.log('debug rating' + newratings);
if (newsize != null) setatts["deck-util-size-loaded"]=newsize;
if (newratings != null) setatts["deck-util-rating-loaded"]=newratings;
console.log('setatts');
console.log(setatts);
setAttrs(setatts);
});
});
on("change:deck-systemrating change:matrix-iconstatus change:deck-activemem change:deck-utilitypayload change:deck-util-size-loaded change:deck-util-rating-loaded", function() {
getatts=["deck-systemrating", "matrix-iconstatus", "deck-activemem", "deck-utilitypayload", "deck-util-size-loaded", "deck-util-rating-loaded"];
getAttrs(getatts, function(myval) {
let myoverloaded = 0;
let myratingoload = 0;
if ( parseInt(myval["deck-util-size-loaded"]) > parseInt(myval["deck-activemem"]) ) {
myoverloaded=1;
}
if ( parseInt(myval["deck-util-rating-loaded"]) > parseInt(myval["deck-utilitypayload"]) ) {
myratingoload=1;
}
console.log('load:' + myoverloaded);
setAttrs({"deck-mem-overloaded": myoverloaded, "deck-util-overloaded": myratingoload});
});
});
on("sheet:opened change:deck-systemrating change:matrix-iconstatus change:matrixsecurityrating", function() {
getAttrs(["deck-systemrating","matrix-iconstatus", "matrixsecurityrating"], function(myval) {
sets={};
var mytn=0;
const rating=myval["deck-systemrating"].toUpperCase();
const icon=myval["matrix-iconstatus"];
const secrat=myval["matrixsecurityrating"];
if ( rating != "UNKNOWN") sets["deck-tn"]=matrixtn[rating][icon];
console.log('debug sec rat ' + secrat);
sets["iconstatuscode"]=(icon == "Legitimate")? 0 : (secrat > 0)? 0 : 1 ;
console.log(sets)
setAttrs(sets);
});
});
on("change:matrixcode", function() {
console.log('matrixsecuritynumber')
getAttrs(["matrixcode"], function (myvar) {
const rating=myvar["matrixcode"].toUpperCase();
sets={};
sets["matrixsecuritynumber"]=matrixtn[rating]["secrating"];
console.log(sets)
setAttrs(sets);
});
});
on("change:deckattacklevel", function() {
const multipliers={L:2, M:3, S:4, D:5};
getAttrs(["deckattacklevel"], function(myval) {
const mylevel=myval["deckattacklevel"];
console.log('test level: ' + multipliers[mylevel]);
setAttrs({"deckattack-multiplier": multipliers[mylevel]});
});
});
on('clicked:repeating_ic:combat', (info) => {
if (!("yes" in lang)) geti18n();
const mytitle=info["htmlAttributes"]["title"]
const myid=info["htmlAttributes"]["id"]
gets=["matrixcode"];
var source=info['sourceAttribute'].split('_');
var sourceattr=source.pop();
var myrepeat=source.join('_').concat('_');
gets.push(myrepeat.concat("icrating"));
gets.push(myrepeat.concat("ictargettest"));
gets.push(myrepeat.concat("icname"));
gets.push(myrepeat.concat("ictype"));
gets.push(myrepeat.concat("ic-penalty"));
gets.push(myrepeat.concat("matrix-iconstatus"));
getAttrs(gets, function (myval) {
var myroll;
var myatt="@{target|" + lang["target"] +"|deck-evasion-final}";
const name=myval[myrepeat.concat("icname")];
const ictype=myval[myrepeat.concat("ictype")];
const penalty=parseInt(myval[myrepeat.concat("ic-penalty")]);
const targeticon=myval[myrepeat.concat("matrix-iconstatus")];
var icmode = "proactive";
if ( iclist["reactive"].includes(ictype)) icmode="reactive";
const code=myval["matrixcode"].toUpperCase();
const rating=parseInt(myval[myrepeat.concat("icrating")]);
var ictest=myval[myrepeat.concat("ictargettest")];
var targetatt="bod";
if ( (icmode=="proactive") && (ictest.includes("target")) ) targetatt=ictest.split("-")[1];
const attacktn =matrixtn[code][targeticon];
var senddata="{{senddata=[[0]]}}";
var action=lang["attack"];
if ( icmode=="proactive" ) {
myroll="&{template:matrix}{{myname=" + name + "}}";
myroll+="{{iconstatus=[[@{target|" + lang["decker"] +"|iconstatuscode}]]}}";
myroll +="{{attack=yes}}";
ictest=0;
} else {
myroll="/w gm &{template:matrix}{{myname=" + name + "}}";
myroll +="{{basic=yes}}";
myroll += "{{sensor=[[[[@{target|" + lang["decker"] + "|deck-sensors-final}]]d6>[[" + rating + " + @{target|" + lang["decker"] + "|matrix-penalty} ]]!!]]}}";
ictest="?{" + lang["utility-rating"] + "?|6}";
}
const payload = {
wdmg: matrixtn[code]["wdmg"],
attacker: name,
power: rating,
attribute: "deck-" + targetatt + "-final",
attacktype: ictype
};
var target="{{target=@{target|" + lang["target"] +"|token_name}}}";
if ( mytitle == "Evade Detection" ) myatt = "@{target|" + lang["target"] +"|deck-sensors-final}";
if ( mytitle == "IC Resist" ) myatt = "?{" + lang["attack-power"] +"?|2}";
if ( mytitle == "IC Resist" ) target = "{{target=" + name + "}}";
if ( mytitle == "IC Execute" ) {
myatt = ictest;
target="{{target=@{target|" + lang["decker"] + "|token_name}}}";
}
var calcTN= myatt + " +?{" + lang["miscellaneous-modifiers"] + "|0} + " + penalty;
var calcDice="@{matrixsecurityrating}"
if (( ictype == "Probe") || (ictype == "Scramble")) calcDice=rating;
myroll+=target;
myroll+="{{rolldice=[[" + calcDice + "]]}}{{targetnumber=[[" + calcTN + "]]}}";
myroll+="{{basetn=[[" + myatt + "]]}}";
myroll+="{{action=" + action + "}}"
myroll+="{{roll= [[ [[" + calcDice + "]]d6>[[ {2,(" + calcTN + ")}kh1]]!! ]] }}"
if ( icmode=="proactive" ) {
myroll+="{{wdmg=[[" + matrixtn[code]["wdmg"] + "]]}}";
myroll+=senddata;
}
if ( ictype == "Probe") {
myroll += "{{target=@{target|" + lang["decker"] + "|token_name}}}";
myroll += "{{targetnumber=[[@{target|" + lang["decker"] + "|deck-detection-final}]]}}";
myroll += "{{action=" + lang["probe"] + "}}";
myroll += "{{basetn=[[0]]}}";
myroll += "{{rolldice=[[ " + rating + "]]}}";
myroll += "{{roll=[[[[" + rating +" ]]d6>[[ @{target|" + lang["decker"] + "|deck-detection-final} + " + penalty +"]]!!]]}}";
}
if (( ictype == "Tar Baby") || (ictype == "Tar pit")) {
myroll += "{{target=@{target|" + lang["decker"] + "|token_name}}}";
myroll += "{{targetnumber=[[?{" + lang["utility-rating"] + "?|4}]]}}";
myroll += "{{action=" + name + " Test}}";
myroll += "{{basetn=[[0]]}}";
myroll += "{{rolldice=[[ " + rating + "]]}}";
myroll += "{{roll=[[[[" + rating +" ]]d6>[[?{" + lang["utility-rating"] + "?} + " + penalty +"]]!!]]}}";
myroll += "{{oppose=[[[[?{" + lang["utility-rating"] + "?}]]d6>[[" + rating + " @{target|" + lang["decker"] + "|matrix-penalty}]]!!]]}}";
}
console.log(myroll);
const finalwdmg=(iclist["attack"].includes(ictype))? damagetable[matrixtn[code]["wdmg"]] : "";
console.log('finalwdmg: ' + finalwdmg);
startRoll(myroll, (results) => {
if ( icmode=="proactive" ) {
let iconstat=results.results.iconstatus.result;
const iconstatus =( results.results.iconstatus.result == 0 )? "Legitimate" : "Intruder";
const finaltn = results.results.targetnumber.result + matrixtn[code][iconstatus];
const finaldice = (results.results.roll.dice.filter(mydice=> mydice >= finaltn )).length;
console.log('final tn ' + finaltn);
console.log('dice : ' + results.results.roll.dice);
console.log('finaldice : ' + finaldice);
payload["basetn"]=finaltn;
payload["attacktest"]=finaldice;
finishRoll( results.rollId,
{
wdmg: finalwdmg,
targetnumber: finaltn,
roll: finaldice,
senddata: rollEscape.escape(payload),
});
} else {
payload["basetn"]=results.results.basetn.result;
payload["attacktest"]=results.results.roll.result;
finishRoll( results.rollId,
{
wdmg: finalwdmg,
senddata: rollEscape.escape(payload),
});
}
});
});
});
on("clicked:deck-utilities-unloadall", function() {
utilatts=[];
utilrepeatatts=[];
offenserepeatatts=[];
defenserepeatatts=[];
utilitylist.forEach(util=>{
let myattr=util.concat("-loaded");
utilatts[myattr]=0;
});
console.log('utilatts');
console.log(utilatts);
setAttrs(utilatts);
/* setAttrs(utilatts); */
deckutilrepeat.forEach(rsection=>{
getSectionIDs(rsection, function(idarray) {
console.log(rsection);
var myatts=[];
idarray.forEach((m, id) => {
let myrepeat="repeating_" + rsection +"_" + m + "_loaded";;
myatts[myrepeat]=0;
});
console.log(rsection);
console.log(myatts);
setAttrs(myatts);
});
});
var finalatts=[];
finalatts["deck-util-size-loaded"]=0;
finalatts["deck-util-rating-loaded"]=0;
setAttrs(finalatts);
});
on("sheet:opened change:eccm-fluxmod change:rcdeck-fluxmod", function() {
getAttrs(["eccm-fluxmod", "rcdeck-fluxmod"], function (myval) {
const mysystems = ["eccm", "rcdeck"];
myset={};
var myrange=0;
mysystems.forEach(mysys => {
let mod = mysys.concat("-fluxmod");
let range = mysys.concat("-range");
let myflux = (myval[mod])
if ( myflux == 0 ) myrange=.25;
if ( myflux == 1 ) myrange=1;
if ( myflux == 2 ) myrange=2;
if ( myflux == 3 ) myrange=4;
if ( myflux == 4 ) myrange=6;
if ( myflux == 5 ) myrange=9;
if ( myflux == 6 ) myrange=12;
if ( myflux == 7 ) myrange=16;
if ( myflux == 8 ) myrange=20;
if ( myflux == 9 ) myrange=25;
if ( myflux >= 10 ) myrange= ( 2 * myflux ) + 10;
myset[range] = myrange;
});
setAttrs(myset);
});
});
on("change:sensors-rating change:body change:sonar-rating change:ecm-rating change:eccm-rating change:ed-rating change:ecd-rating", function(){
getAttrs(["sensors-rating", "body", "sonar-rating", "ecm-rating", "eccm-rating", "ed-rating", "ecd-rating"], function (myval) {
var sensorflux = Math.ceil(parseInt(myval["sensors-rating"]) *1.5);
var sensormax = sensorflux + Math.floor(parseInt(myval["body"])/2);
var sonarflux = Math.ceil(parseInt(myval["sonar-rating"]) *1.5);
var sonarmax = sonarflux + Math.floor(parseInt(myval["body"])/2);
var ecmflux = Math.ceil(parseInt(myval["ecm-rating"]) *1.5);
var ecmmax = ecmflux + Math.floor(parseInt(myval["body"])/2);
var eccmflux = Math.ceil(parseInt(myval["eccm-rating"]) *1.5);
var eccmmax = eccmflux + Math.floor(parseInt(myval["body"])/2);
var edflux = Math.ceil(parseInt(myval["ed-rating"]) *1.5);
var edmax = edflux + Math.floor(parseInt(myval["body"])/2);
var ecdflux = Math.ceil(parseInt(myval["ecd-rating"]) *1.5);
var ecdmax = ecdflux + Math.floor(parseInt(myval["body"])/2);
setAttrs({"sensors-flux": sensorflux, "sensors-fluxmax": sensormax, "ecm-flux": ecmflux, "ecm-fluxmax": ecmmax, "eccm-flux": eccmflux, "eccm-fluxmax": eccmmax, "ed-flux": edflux, "ed-fluxmax": edmax, "ecd-flux": ecdflux, "ecd-fluxmax": ecdmax, "sonar-flux": sonarflux, "sonar-fluxmax": sonarmax, "sensors-fluxmod": sensorflux, "sonar-fluxmod": sonarflux, "ecm-fluxmod": ecmflux, "eccm-fluxmod": eccmflux, "ed-fluxmod": edflux, "ecd-fluxmod": ecdflux});
});
});
on("sheet:opened change:sensors-fluxmod change:sonar-fluxmod change:ecm-fluxmod change:eccm-fluxmod change:ed-fluxmod change:ecd-fluxmod change:body change:ecd-enabled", function () {
getAttrs(["sensors-fluxmod", "sonar-fluxmod", "ecm-fluxmod", "eccm-fluxmod", "ed-fluxmod", "ecd-fluxmod", "sensors-flux", "sonar-flux", "ecm-flux", "eccm-flux", "ed-flux", "ecd-flux", "body", "ecd-enabled"], function (myval) {
var overload=0;
var sensor=Math.max(0,myval["sensors-fluxmod"] - myval["sensors-flux"] );
var sonar=Math.max(0,myval["sonar-fluxmod"] - myval["sonar-flux"] );
var ecm=Math.max(0,myval["ecm-fluxmod"] - myval["ecm-flux"] );
var eccm=Math.max(0,myval["eccm-fluxmod"] - myval["eccm-flux"] );
var ed=Math.max(0,myval["ed-fluxmod"] - myval["ed-flux"] );
var ecd=Math.max(0,myval["ecd-fluxmod"] - myval["ecd-flux"] );
var total=sensor + sonar + ecm + eccm + ed + ecd;
var maxflux = parseInt(myval["body"]) - parseInt(myval["ecd-enabled"]);
if ( total > maxflux ) overload=1;
setAttrs({"vehicle-fluxtotal": total, "vehicle-flux-max": maxflux, "vehicle-flux-overload": overload});
});
});
on("change:vehicle-autonav change:autonav", function(){
getAttrs(["vehicle-autonav", "autonav"], function (myval) {
var autonav=0;
if (myval["vehicle-autonav"] == "0") autonav=0;
if (myval["vehicle-autonav"] == "1") autonav=myval["autonav"];
setAttrs({"driving-test-autonav": autonav});
});
});
on("change:vehicle-offroad change:handling-street change:handling-offroad", function(){
getAttrs(["vehicle-offroad", "handling-street", "handling-offroad"], function (myval) {
var handling=0;
if (myval["vehicle-offroad"] == "0") handling=myval["handling-street"];
if (myval["vehicle-offroad"] == "1") handling=myval["handling-offroad"];
console.log('handling set to ' + handling);
setAttrs({"handling": handling});
});
});
on("change:vehicle-size", function(){
getAttrs(["vehicle-size"], function (myval) {
var size=0;
if (myval["vehicle-size"] == "Large") size=2;
if (myval["vehicle-size"] == "Extra-Large") size=3;
setAttrs({"driving-test-size": size});
});
});
on("change:rigger", function(){
getAttrs(["rigger"], function (myval) {
var mydriver="@{";
mydriver=mydriver.concat(myval["rigger"]);
mydriver=mydriver.concat("|");
setAttrs({"vehicle-driver": mydriver});
});
});
on("sheet:opened change:vehicle-urban change:gunnery-test-los", function () {
getAttrs(["vehicle-urban", "gunnery-test-los"], function(myval) {
var sensorgun=(myval["vehicle-urban"] * 2 ) + myval["gunnery-test-los"];
console.log('sensor gunnery tn mods' + sensorgun);
setAttrs({"sensor-gunnery-tn": sensorgun });
});
});
on("change:speed-current change:speed-rating change:vehicle-penalty", function() {
getAttrs(["speed-current", "speed-rating", "vehicle-penalty"], function(myval) {
let speed=parseInt(myval["speed-current"]);
let speedrating=parseInt(myval["speed-rating"]);
var kph = Math.ceil(speedrating * 1.2);
var sp = Math.floor(speed / 10);
var exceed=0;
if (myval["vehicle-penalty"] == "2") speedrating=Math.ceil(speedrating*0.75);
if (myval["vehicle-penalty"] == "3") speedrating=Math.ceil(speedrating*0.50);
if (speed > speedrating ) {
exceed=1;
} else {
exceed=0;
}
let maxspeed=speedrating*1.5;
setAttrs({"speed-points": sp, "speed-kph": kph, "speed-exceeding": exceed, "speed-max": maxspeed});
});
});
on("sheet:opened change:vehicle-skill change:gunnery change:drone_mode change:pilot", function() {
getAttrs(["gunnery", "pilot", "drone_mode", "vehicle-skill"], function(myval) {
var mygunnery=myval["gunnery"];
var myskill=myval["vehicle-skill"];
if ( myval["drone_mode"] == "secondary" ) {
mygunnery=myval["pilot"];
myskill=myval["pilot"];
}
console.log('setting weapon skill to gunnery');
setAttrs({"weaponskill": mygunnery, "vehicle-skill-final": myskill});
});
});
on("sheet:opened change:rcdeck-intrusion-mods change:ewarfare", function () {
getAttrs(["rcdeck-intrusion-mods", "ewarfare"], function (myval) {
let myfinal=parseInt(myval["rcdeck-intrusion-mods"]) + parseInt(myval["ewarfare"]);
setAttrs({"rcdeck-intrusion-factor": myfinal});
});
});
on("change:sensor-los", function(){
const sensorlosmods={
direct: {sensor: -1, gunnery: -3 },
interupted: {sensor: 0, gunnery: 0}
};
getAttrs(["sensor-los"], function (myval) {
var sets={};
const los=myval["sensor-los"].toLowerCase();
console.log('los is: ' + los);
sets["sensor-test-los"]=sensorlosmods[los]["sensor"];
sets["gunnery-test-los"]=sensorlosmods[los]["gunnery"];
console.log(sets);
setAttrs(sets);
});
});
on("change:vehicle-type", function(){
getAttrs(["vehicle-type"], function (myval) {
var vp=0;
if ( myval["vehicle-type"] == "Car/Pickup Truck" ) vp=0 ;
if ( myval["vehicle-type"] == "Fighter Jet" ) vp=20 ;
if ( myval["vehicle-type"] == "Heavy Truck" ) vp=-5 ;
if ( myval["vehicle-type"] == "Helicopter" ) vp=5 ;
if ( myval["vehicle-type"] == "Hovercraft" ) vp=2 ;
if ( myval["vehicle-type"] == "HSCT/Suborbital" ) vp=-15 ;
if ( myval["vehicle-type"] == "Large Airplane" ) vp=-5 ;
if ( myval["vehicle-type"] == "LAV/T-bird" ) vp=10 ;
if ( myval["vehicle-type"] == "Limousine/Light Truck/Van" ) vp=-3 ;
if ( myval["vehicle-type"] == "LTA/Zeppelin" ) vp=-10 ;
if ( myval["vehicle-type"] == "Motorcycle" ) vp=5 ;
if ( myval["vehicle-type"] == "Racing Boat" ) vp=5 ;
if ( myval["vehicle-type"] == "Semiballistic" ) vp=-25 ;
if ( myval["vehicle-type"] == "Small Airplane" ) vp=0;
if ( myval["vehicle-type"] == "Small Motorboat" ) vp=0 ;
if ( myval["vehicle-type"] == "Sports Car" ) vp=3 ;
if ( myval["vehicle-type"] == "Tracked Vehicle" ) vp=-3 ;
if ( myval["vehicle-type"] == "Tractor Trailer" ) vp=-7 ;
if ( myval["vehicle-type"] == "Train/Monorail" ) vp=-10 ;
if ( myval["vehicle-type"] == "Ultra-light Aircraft" ) vp=10 ;
if ( myval["vehicle-type"] == "Yacht" ) vp=-10 ;
setAttrs({"vehicle-points": vp});
});
});
on("sheet:opened change:vcr", function() {
getAttrs(["reaction", "vcr"], function(myval) {
let myr = parseInt(myval["reaction"]) + (2 * parseInt(myval["vcr"]));
let myi = 1 + parseInt(myval["vcr"]);
setAttrs({"vcr-reaction": myr, "vcr-initiative": myi});
});
});
on("sheet:opened change:vehicle-interface", function(){
getAttrs(["vehicle-interface"], function (myval) {
const vi=myval["vehicle-interface"];
var sets={};
const interfaces={
none: { react: 0, init: 0, action: 0, driving: 0},
datajack: { react: 1, init: 0, action: 0, driving: 1 },
vcr: { react: "(@{vehicle-driver}vcr} * 2)", init: "@{vehicle-driver}vcr}", action: "(@{vehicle-driver}vcr} * 2)", driving: "@{vehicle-driver}vcr}" }
};
console.log('interfaces test: ' + interfaces[vi]["react"]);
sets["vehicle-reactbonus"]=interfaces[vi]["react"]
sets["vehicle-initbonus"]=interfaces[vi]["init"];
sets["vehicle-actionbonus"]=interfaces[vi]["action"];
sets["driving-test-interface"]=interfaces[vi]["driving"];
console.log(sets);
setAttrs(sets)
});
});
on("sheet:opened change:weather", function(){
getAttrs(["weather"], function (myval) {
var sets={};
const weather=myval["weather"].toLowerCase();
const weathermod={
normal: { driving:0, sensor:0},
bad: { driving:2, sensor:1},
terrible: { driving:4, sensor:1},
windy: { driving:2, sensor:0},
snow: { driving:2, sensor:1},
rain: { driving:2, sensor:1},
fog: { driving:2, sensor:1},
smog: { driving:2, sensor:1},
"heavy wind": { driving:4, sensor:0},
"thunderstorm": { driving:4, sensor:1}
};
sets["driving-test-weather"]=weathermod[weather]["driving"];
sets["sensor-test-weather"]=weathermod[weather]["sensor"];
console.log(sets);
setAttrs(sets);
});
});
on("change:terrain", function(){
sets={};
const terrainmods={
open: { driving: -1, sensor: 0, terrainpoints: 0, accelerate: -1, position: -1, ram: -1, hide: 4, relocate: -3, crash: -1, gunnery: 0},
normal: { driving: 0, sensor: 0, terrainpoints: -2, accelerate: 0, position: 0, ram: 0, hide: 2, relocate: -1, crash: 0, gunnery: 0},
restricted: { driving: 1, sensor: 0, terrainpoints: -4, accelerate: 1, position: 1, ram: 1, hide: 0, relocate: 0, crash: 2, gunnery: 2},
tight: { driving: 3, sensor: 1, terrainpoints: -10, accelerate: 3, position: 3, ram: 2, hide: -2, relocate: 3, crash: 4, gunnery: 3}
};
getAttrs(["terrain"], function (myval) {
const terrain=myval["terrain"].toLowerCase();
sets["driving-test-terrain"]=terrainmods[terrain]["driving"];
sets["sensor-test-terrain"]=terrainmods[terrain]["sensor"];
sets["driving-ab-terrain"]=terrainmods[terrain]["accelerate"];
sets["driving-position-terrain"]=terrainmods[terrain]["position"];
sets["driving-ram-terrain"]=terrainmods[terrain]["ram"];
sets["driving-hide-terrain"]=terrainmods[terrain]["hide"];
sets["driving-relocate-terrain"]=terrainmods[terrain]["relocate"];
sets["driving-crash-terrain"]=terrainmods[terrain]["crash"];
sets["terrain-points"]=terrainmods[terrain]["terrainpoints"];
sets["terrain-manual-gunnery"]=terrainmods[terrain]["gunnery"];
console.log(sets);
setAttrs(sets);
});
});
on("clicked:vehicleset", function(){
getAttrs(["vehicle-rapid-attributes"], function (myval) {
const [hand, speed, accel, body, armor, sig, auto, pilot, sensor, cargo, load] = myval["vehicle-rapid-attributes"].split(" ")
var [on, off] = hand.split("/");
if (off == null ) off =on;
setAttrs({"handling-street": on, "handling-offroad": off, "speed-rating": speed, "acceleration": accel, "body": body, "armor": armor, "signature": sig, "autonav": auto, "pilot": pilot, "sensors-rating": sensor, "cargo": cargo, "load": load });
console.log('on is ' + on + ' off is ' + off)
});
});
on("clicked:matrixsystemset", function(){
getAttrs(["matrixsystemset"], function (myval) {
setmatrixsystem(myval["matrixsystemset"]);
});
});
var setmatrixsystem = function (rating) {
console.log(rating);
atts=[];
const [mycode, myrating] = rating.split("-")
console.log('mycode:' + mycode + ' myrating ' + myrating);
let finalcode = mycode.toUpperCase()
const [system, access, control, index, files, slave ] = myrating.split("/")
atts["character_name"]=rating;
atts["matrixcode"]=finalcode;
atts["matrixsecurityrating"]=system;
atts["matrixcontrolrating"]=control;
atts["matrixaccessrating"]=access;
atts["matrixindexrating"]=index;
atts["matrixfilesrating"]=files;
atts["matrixslaverating"]=slave;
console.log(atts);
setAttrs(atts);
};
on("sheet:opened changed:api-newsheet", function(){
getAttrs(["first_time"], function(myval){
if (myval.first_time != "false") {
console.log('running firstime');
updateWoundPenalty();
updateStunPenalty();
updatepools();
updatePenalty("vehicle");
updatePenalty("rccommand");
updatePenalty("rcsystem");
updatePenalty("rcsimsense");
updatePenalty("matrix");
setupdefaults();
setattributelimits("Human")
setAttrs({first_time: "false"});
}
});
});
on("sheet:opened change:sorcery-spec-switch change:conjuring-spec-switch change:auraread-spec-switch change:sorcery change:conjuring change:aurareading", function()
{
getAttrs(["sorcery-spec-switch", "conjuring-spec-switch", "auraread-spec-switch", "sorcery", "conjuring", "aurareading"], function(myval) {
if ( parseInt(myval["sorcery-spec-switch"]) == 0 ) {
setAttrs({spellcasting: parseInt(myval.sorcery), spelldefense: parseInt(myval.sorcery),dispelling: parseInt(myval.sorcery),astralcombat: parseInt(myval.sorcery), ritualsorcery:parseInt(myval.sorcery)});
}
if ( parseInt(myval["conjuring-spec-switch"]) == 0 ) {
setAttrs({summoning: parseInt(myval.conjuring), banishing: parseInt(myval.conjuring),spiritcontrol: parseInt(myval.conjuring)});
}
if ( parseInt(myval["auraread-spec-switch"]) == 0 ) {
setAttrs({areadauras: parseInt(myval.aurareading),areadsignatures: parseInt(myval.aurareading),areadsorcery: parseInt(myval.aurareading),areadconjuring: parseInt(myval.aurareading)});
}
});
});
on("change:deck-spec-switch change:computer", function()
{
getAttrs(["deck-spec-switch", "computer"], function(myval) {
console.log(myval);
if ( parseInt(myval["deck-spec-switch"]) == 0 ) {
console.log('not specialized')
setAttrs({hardware: parseInt(myval.computer), decking: parseInt(myval.computer),programming: parseInt(myval.computer)});
}
});
});
const visionmods = {
elf: {normal: 0, fulldark: 8, minlight: 2, partiallight: 0, glare: 2, mist: 0, lightsmoke: 2, fullsmoke: 4, thermalsmoke: 4},
dryad: {normal: 0, fulldark: 8, minlight: 2, partiallight: 0, glare: 2, mist: 0, lightsmoke: 2, fullsmoke: 4, thermalsmoke: 4},
nightone: {normal: 0, fulldark: 8, minlight: 2, partiallight: 0, glare: 2, mist: 0, lightsmoke: 2, fullsmoke: 4, thermalsmoke: 4},
wakyambi: {normal: 0, fulldark: 8, minlight: 2, partiallight: 0, glare: 2, mist: 0, lightsmoke: 2, fullsmoke: 4, thermalsmoke: 4},
ork: {normal: 0, fulldark: 8, minlight: 2, partiallight: 0, glare: 2, mist: 0, lightsmoke: 2, fullsmoke: 4, thermalsmoke: 4},
satyr: {normal: 0, fulldark: 8, minlight: 2, partiallight: 0, glare: 2, mist: 0, lightsmoke: 2, fullsmoke: 4, thermalsmoke: 4},
oni: {normal: 0, fulldark: 8, minlight: 2, partiallight: 0, glare: 2, mist: 0, lightsmoke: 2, fullsmoke: 4, thermalsmoke: 4},
hobgoblin: {normal: 0, fulldark: 8, minlight: 2, partiallight: 0, glare: 2, mist: 0, lightsmoke: 2, fullsmoke: 4, thermalsmoke: 4},
troll: {normal: 0, fulldark: 2, minlight: 2, partiallight: 1, glare: 2, mist: 0, lightsmoke: 0, fullsmoke: 0, thermalsmoke: 6},
minotaur: {normal: 0, fulldark: 2, minlight: 2, partiallight: 1, glare: 2, mist: 0, lightsmoke: 0, fullsmoke: 0, thermalsmoke: 6},
giant: {normal: 0, fulldark: 2, minlight: 2, partiallight: 1, glare: 2, mist: 0, lightsmoke: 0, fullsmoke: 0, thermalsmoke: 6},
fomori: {normal: 0, fulldark: 2, minlight: 2, partiallight: 1, glare: 2, mist: 0, lightsmoke: 0, fullsmoke: 0, thermalsmoke: 6},
dwarf: {normal: 0, fulldark: 2, minlight: 2, partiallight: 1, glare: 2, mist: 0, lightsmoke: 0, fullsmoke: 0, thermalsmoke: 6},
gnome: {normal: 0, fulldark: 2, minlight: 2, partiallight: 1, glare: 2, mist: 0, lightsmoke: 0, fullsmoke: 0, thermalsmoke: 6},
menehune: {normal: 0, fulldark: 2, minlight: 2, partiallight: 1, glare: 2, mist: 0, lightsmoke: 0, fullsmoke: 0, thermalsmoke: 6},
human: {normal: 0, fulldark: 8, minlight: 6, partiallight: 2, glare: 2, mist: 2, lightsmoke: 4, fullsmoke: 6, thermalsmoke: 4},
ogre: {normal: 0, fulldark: 8, minlight: 6, partiallight: 2, glare: 2, mist: 2, lightsmoke: 4, fullsmoke: 6, thermalsmoke: 4},
cyclops: {normal: 0, fulldark: 8, minlight: 6, partiallight: 2, glare: 2, mist: 2, lightsmoke: 4, fullsmoke: 6, thermalsmoke: 4},
koborokuru: {normal: 0, fulldark: 2, minlight: 2, partiallight: 1, glare: 2, mist: 0, lightsmoke: 0, fullsmoke: 0, thermalsmoke: 6},
lowlight: {normal: 0, fulldark: 8, minlight: 4, partiallight: 1, glare: 4, mist: 2, lightsmoke: 4, fullsmoke: 6, thermalsmoke: 4},
thermal: {normal: 0, fulldark: 4, minlight: 4, partiallight: 2, glare: 4, mist: 0, lightsmoke: 0, fullsmoke: 1, thermalsmoke: 8},
cybernetic: {normal: 0, fulldark: 8, minlight: 6, partiallight: 2, glare: 2, mist: 2, lightsmoke: 4, fullsmoke: 6, thermalsmoke: 4},
ultrasound: {normal: 0, fulldark: 4, minlight: 3, partiallight: 1, glare: 1, mist: 1, lightsmoke: 2, fullsmoke: 3, thermalsmoke: 2}
};
on("change:metatype change:visionenhancement change:visibility", function() {
getAttrs(["metatype", "visionenhancement", "visibility"], function(myval){
sets={};
const metatype=myval["metatype"].toLowerCase();
const vision=myval["visionenhancement"].toLowerCase();
const visattr=myval["visibility"];
const visibility = (visattr == 0)? "normal" : visattr.match(/{(.*)}/)[1];
const rangedvizmods=(vision != "none")? visionmods[vision][visibility] : visionmods[metatype][visibility];
const meleevizmods=(rangedvizmods !=8 )? Math.floor(rangedvizmods/2) : 8;
sets["rangedvizTN"]=rangedvizmods;
sets["meleevizTN"]=meleevizmods;
console.log(sets);
setAttrs(sets);
});
});
on("change:metatype", function(){
getAttrs(["metatype"], function(myval){
console.log(myval.metatype)
setattributelimits(myval.metatype);
});
});
on("change:body change:body-mods", function(){
getAttrs([ "body","body-mods"], function(myval) {
let final_body = parseInt(myval.body) + parseInt(myval["body-mods"])
setAttrs({body_max: final_body, bodymax: final_body})
});
});
on("change:intelligence change:intelligence-mods", function(){
getAttrs([ "intelligence","intelligence-mods"], function(myval) {
let final_int = parseInt(myval.intelligence) + parseInt(myval["intelligence-mods"])
setAttrs({intelligence_max: final_int, intmax: final_int})
});
});
on("change:willpower change:willpower-mods", function(){
getAttrs([ "willpower","willpower-mods"], function(myval) {
let final_will = parseInt(myval.willpower) + parseInt(myval["willpower-mods"])
setAttrs({willpower_max: final_will, willmax: final_will})
});
});
on("change:charisma change:charisma-mods", function(){
getAttrs([ "charisma","charisma-mods"], function(myval) {
let final_char = parseInt(myval.charisma) + parseInt(myval["charisma-mods"])
setAttrs({charisma_max: final_char, charmax: final_char})
});
});
on("change:quickness change:quickness-mods", function(){
getAttrs([ "quickness","quickness-mods"], function(myval) {
let final_quickness = parseInt(myval.quickness) + parseInt(myval["quickness-mods"])
setAttrs({quickness_max: final_quickness, agilitymax: final_quickness})
});
});
on("change:strength change:strength-mods", function(){
getAttrs([ "strength","strength-mods"], function(myval) {
let final_str = parseInt(myval.strength) + parseInt(myval["strength-mods"])
setAttrs({strength_max: final_str, strmax: final_str})
});
});
on("change:meleereach change:metatype", function () {
getAttrs(["meleereach", "metatype"], function (myval) {
var meleemods=0;
if ( myval["metatype"] == "Troll" ) meleemods=1;
const meleemax=parseInt(myval["meleereach"]) + meleemods;
setAttrs({meleereach_max: meleemax});
});
});
on("change:repeating_rangedweapons:reloadmethod change:repeating_rangedweapons:reloads change:repeating_rangedweapons:ammotype change:repeating_rangedweapons:ammoremain change:repeating_rangedweapons:ammo change:repeating_rangedweapons:type change:repeating_rangedweapons:weight change:repeating_rangedweapons:load", function(eventinfo){
getAttrs(["repeating_rangedweapons_reloadmethod", "repeating_rangedweapons_reloads", "repeating_rangedweapons_ammotype", "repeating_rangedweapons_ammoremain", "repeating_rangedweapons_ammo", "repeating_rangedweapons_type", "repeating_rangedweapons_weight", "repeating_rangedweapons_load"], function(myval) {
console.log(myval);
const sets={};
const wtype=myval["repeating_rangedweapons_type"];
const myload=myval["repeating_rangedweapons_load"];
const single=["break", "magazine", "cylinder"];
const multi=["clip", "belt", "speed-loader"];
const arrows=["Bow", "Heavy Crossbow", "Light Crossbow", "Medium Crossbow"];
const individual=["Nets", "Shuriken", "Thrown Knife", "Caltrops"];
const method=myval["repeating_rangedweapons_reloadmethod"];
const reloads=parseInt(myval["repeating_rangedweapons_reloads"]);
const type=myval["repeating_rangedweapons_ammotype"];
const remaining=parseInt(myval["repeating_rangedweapons_ammoremain"]);
const baseweight=parseFloat(myval["repeating_rangedweapons_weight"]);
const max=parseInt(myval["repeating_rangedweapons_ammo"]);
let reloadtotal = (single.includes(method))? reloads : reloads * max;
var aweight = (arrows.includes(wtype))? .01 : (wtype=="Assault Cannon")? .125 : (wtype=="Speargun")? 1 : ( type in ammomods )? ammomods[type]["weight"] : .1;
if (wtype == "Net Gun") {
aweight = ( type=="regular")? 5 : ( type in ammomods )? ammomods[type]["weight"] : 5;
}
if ((wtype=="Gyrojet (land)") || (wtype=="Gyrojet (water)")) {
aweight = ( type=="regular")? .175 : ( type in ammomods )? ammomods[type]["weight"] : .175;
}
console.log('aweight ' + aweight);
var finalweight = (individual.includes(wtype))? remaining * baseweight : Number(((aweight * (remaining + reloadtotal))).toFixed(2));
sets["repeating_rangedweapons_ammoweight"]=(individual.includes(wtype))? myload * remaining * baseweight : Number((myload * aweight * (remaining + reloadtotal)).toFixed(2));
console.log(sets);
setAttrs(sets);
});
});
on("change:repeating_rangedweapons:firemode", function(eventinfo){
getAttrs(["repeating_rangedweapons_firemode", "repeating_rangedweapons_name", "repeating_rangedweapons_targeting"], function(myval) {
const firemode=myval["repeating_rangedweapons_firemode"];
const weapon=myval["repeating_rangedweapons_name"];
const targeting=myval["repeating_rangedweapons_targeting"];
var myroll="/w gm &{template:info}{{character=@{character_name}}}{{type=Switched Weapon " + weapon + " to " + firemode + " firing mode }}";
if ( targeting == -2 ) myroll += "{{action=Free}}";
else myroll += "{{action=" + lang["simple"] + "}}";
startRoll(myroll, (results) => {
finishRoll( results.rollId);
});
});
});
on("change:repeating_rangedweapons:primary-ranged-equipped change:repeating_rangedweapons:secondary-ranged-equipped", function(eventinfo){
const myweapon=eventinfo.sourceAttribute
console.log(myweapon);
setatts=[];
var mybase=myweapon.split("_");
var myattr=mybase.pop();
const myrepeat=mybase.join('_');
const r1equipped=myrepeat.concat("_primary-ranged-equipped");
const r2equipped=myrepeat.concat("_secondary-ranged-equipped");
getatts=[myweapon, r1equipped, r2equipped, "rangedselected", "ranged2selected"]
getAttrs(getatts, function(myval) {
console.log('myatt ' + myattr);
console.log('values');
console.log(myval);
const lastused=myval["rangedselected"];
const lastused2=myval["ranged2selected"];
if (myval[myweapon] == "on") {
if ( myattr == "primary-ranged-equipped" ) {
console.log('in ranged1');
if ( myval[r2equipped] == "on" ) {
console.log('equipeed as secondary');
setatts[r2equipped]=0;
}
setatts["rangedselected"]=myweapon;
setatts[lastused]=0;
} else if ( myattr == "secondary-ranged-equipped" ) {
console.log('in ranged2');
if ( myval[r1equipped] == "on" ) {
console.log('equipeed as primary');
setatts[r1equipped]=0;
}
setatts["ranged2selected"]=myweapon;
setatts[lastused2]=0;
setatts["dualwield"]=2;
} else {
console.log('wrong event for ' + myattr);
}
console.log(setatts);
} else if ( myval[myweapon] == 0 ) {
console.log(' weapon unselected');
if (( myattr == "primary-ranged-equipped" ) && ( lastused == myweapon )) {
setatts["rangedselected"]="None";
} else if ( ( myattr == "secondary-ranged-equipped" ) && ( lastused2 == myweapon )) {
setatts["ranged2selected"]="None";
setatts["dualwield"]=0;
}
}
setAttrs(setatts);
});
});
on("change:repeating_meleeweapons:meleeequiped change:repeating_meleeweapons:2ndmeleeequiped change:unarmed-equipped change:weaponfocus-equipped", function(eventinfo){
const myweapon=eventinfo.sourceAttribute
console.log(myweapon);
setatts=[];
var getatts=["meleeselected"]
if ( myweapon == "unarmed-equipped" ) {
console.log('defualt unarmed' );
getatts.push("unarmed-equipped");
getAttrs(getatts, function(myval) {
const ue = myval["unarmed-equipped"];
console.log('ue: ' + ue);
const m1 = myval["meleeselected"];
if ( ue == "on" ) {
if ( m1 != "unarmed-equipped" ) setatts[m1]=0;
setatts["meleeselected"]="unarmed-equipped";
setatts["meleereach"]=0;
setAttrs(setatts);
}
});
} else if ( myweapon == "weaponfocus-equipped" ) {
console.log('weaponfocus' );
getatts.push("weaponfocus-equipped");
getatts.push("weaponfocus-reach");
getAttrs(getatts, function(myval) {
const ue = myval["weaponfocus-equipped"];
console.log('ue: ' + ue);
const m1 = myval["meleeselected"];
if ( ue == "on" ) {
if ( m1 != "weaponfocus-equipped" ) setatts[m1]=0;
setatts["meleeselected"]="weaponfocus-equipped";
setatts["meleereach"]=myval["weaponfocus-reach"];
setAttrs(setatts);
}
});
} else {
var mybase=myweapon.split("_");
var myattr=mybase.pop();
const myrepeat=mybase.join('_');
const reach=myrepeat.concat("_reach");
const m1equipped=myrepeat.concat("_meleeequiped");
getatts.push(myweapon, reach, m1equipped);
getAttrs(getatts, function(myval) {
console.log('myatt ' + myattr);
console.log('values');
console.log(myval);
const lastused=myval["meleeselected"];
if (myval[myweapon] == "on") {
if ( myattr == "meleeequiped" ) {
console.log('in melee1');
setatts["meleeselected"]=myweapon;
setatts[lastused]=0;
setatts["meleereach"]=myval[reach];
} else {
console.log('wrong event for ' + myattr);
}
console.log(setatts);
} else if ( myval[myweapon] == 0 ) {
console.log(' weapon unselected');
if (( myattr == "meleeequiped" ) && ( lastused == myweapon )) {
setatts["meleereach"]=0;
setatts["meleeselected"]="unarmed-equipped";
setatts["unarmed-equipped"]="on";
}
}
setAttrs(setatts);
});
}
});
on("change: change:repeating_meleeweapons:reach", function(eventinfo){
getAttrs(["repeating_meleeweapons_reach", "repeating_meleeweapons_meleeequiped"], function(myval) {
if ( myval.repeating_meleeweapons_meleeequiped == "on" ) {
setAttrs({meleereach: myval.repeating_meleeweapons_reach});
}
});
});
on("change:dermal-armor change:repeating_armor:equipped change:repeating_armor:ballistic change:repeating_armor:impact", function(eventinfo){
var sets={};
var ballistic=0;
var impact=0;
var armorval={"body-bal": [0,0], "body-im": [0,0], "helmet-bal": [0], "helmet-im": [0], "shield-bal": [0], "shield-im": [0], "ware-bal": [0], "ware-im": [0], "gyro-bal": [0], "gyro-im": [0], "magic-bal": [0], "magic-im": [0]};
fields=["equipped", "ballistic", "impact", "slot"];
getSectionIDs("repeating_armor", idArray => {
var attrArray = idArray.reduce((m, id) => [ ...m, ...(fields.map(field => `repeating_armor_${id}_${field}`))], []);
attrArray.push("quickness_max","dermal-armor");
getAttrs(attrArray, function(myval) {
console.log('myval');
console.log(myval);
console.log(idArray);
const myquick=parseInt(myval["quickness_max"]);
const mydermal=parseInt(myval["dermal-armor"]);
idArray.forEach(m => {
if (myval["repeating_armor_" + m + "_equipped"] == "on" ) {
let bal=myval["repeating_armor_" + m + "_slot"] + "-bal";
let imp=myval["repeating_armor_" + m + "_slot"] + "-im";
armorval[bal].push(parseInt(myval["repeating_armor_" + m + "_ballistic"]));
armorval[imp].push(parseInt(myval["repeating_armor_" + m + "_impact"]));
}
});
console.log(armorval);
let shield_bal=Math.max(...armorval["shield-bal"]);
let shield_im=Math.max(...armorval["shield-im"]);
let gyro_bal=Math.max(...armorval["gyro-bal"]);
let gyro_im=Math.max(...armorval["gyro-im"]);
let helmet_bal=Math.max(...armorval["helmet-bal"]);
let helmet_im=Math.max(...armorval["helmet-im"]);
let ware_bal= armorval["ware-bal"].reduce((a, b) => a + b, 0);
let ware_im= armorval["ware-im"].reduce((a, b) => a + b, 0);
let magic_bal=Math.max(...armorval["magic-bal"]);
let magic_im=Math.max(...armorval["magic-im"]);
armorval["body-bal"].sort();
armorval["body-im"].sort();
let body_bal = armorval["body-bal"].pop() + Math.floor( armorval["body-bal"].pop() / 2 );
let body_im = armorval["body-im"].pop() + Math.floor( armorval["body-im"].pop() / 2 );
ballistic= body_bal + shield_bal + helmet_bal;
impact= body_im + shield_im + helmet_im;
let ballover = ballistic - myquick;
let impactover = impact - myquick;
if ( ballover < 0 ) ballover=0;
if ( impactover < 0 ) impactover=0;
let combatpen= -1 * (Math.floor((ballover + impactover) / 2 ));
if ( gyro_bal > 0 ) sets["gyro-on"]=1;
else sets["gyro-on"]=0;
if (((ballistic + impact) >= 1 ) || (mydermal == 1)) sets["armor-on"]=1;
else sets["armor-on"]=0;
sets["ballistic"]=ballistic + ware_bal + gyro_bal + magic_bal;
sets["impact"]=impact + ware_im + gyro_im + magic_im;;
sets["armor-quickness-pen"]=ballover;
sets["armor-combatpool-pen"]=combatpen;
console.log(sets);
setAttrs(sets);
});
});
});
on("sheet:opened change:rangedvizTN change:meleevizTN change:cover change:move change:dualwield change:calledshot change:aim change:enemies change:friends change:meleetargets change:position change:misccombatmods change:stun_pen change:wound_pen change:manualgunneryTN change:rangedselected change:gryo-on", function() {
updateRangeTNs();
updateMeleeTNs();
});
on("change:gunnerymotion change:gunneryspeed change:gunnerymaneuver change:gunneryvehicledmg change:gunnerymount change:gunneryterrain change:gunnerytargettype", function() {
updateManualGunneryTNs();
});
on("sheet:opened change:perception change:strength change:magic change:deck-mpcp-final change:willpower change:intelligence change:quickness change:charisma change:body change:frametype change:reaction change:vcr", function() {
updatepools();
});
on("change:stun change:adeptpainres", function() {
updateStunPenalty();
});
on("change:wounds change:adeptpainres", function() {
updateWoundPenalty();
});
on("change:repeating_ic:ictype", function(eventinfo) {
if (!("yes" in lang)) geti18n();
console.log(eventinfo);
var mybase=eventinfo["sourceAttribute"].split("_");
var myattr=mybase.pop();
const myrepeat=mybase.join('_');
sets={};
const ictype=myrepeat + "_ictype"
const ictarget=myrepeat + "_ictargettest"
gets=[ictype];
console.log(gets);
attackic=["Killer", "Blaster", "Sparky", "blackiclethal", "Scout", "cerebropathic", "psychotropic", "blackicnonlethal"]
getAttrs(gets, function(myval) {
console.log(gets);
const mytype=myval[ictype];
console.log(mytype);
if (mytype=="Probe") sets[ictarget]="@{target|" + lang["decker"] + "|deck-detection-final}";
else if (attackic.includes(mytype)) sets[ictarget]="Attack";
else if ((mytype=="Tar Baby") || (mytype=="Tar pit")) sets[ictarget]="?{" + lang["utility-rating"] + "?|4}";
console.log(sets);
setAttrs(sets);
});
});
on("change:matrix-damage change:rccommand-damage change:rcsimsense-damage change:rcsystem-damage change:vehicle-damage change:repeating_ic:ic-damage", function(eventinfo) {
let myattribute=""
console.log(eventinfo);
if ( eventinfo["sourceAttribute"].startsWith("repeating") ) {
console.log("found");
myattribute=eventinfo["sourceAttribute"].split("-").slice(0, -1).join('-');
} else {
console.log("not");
myattribute=eventinfo["sourceAttribute"].split("-")[0];
}
updatePenalty(myattribute);
});
on("change:sheettype", function(){
getAttrs(["sheettype"], function (myval) {
var myatts={};
const mysheet=myval["sheettype"];
if ((mysheet == "Vehicle") || (mysheet == "Drone")) {
myatts["sheettab"]="vehicle-attr-tab";
} else {
myatts["sheettab"]="character";
}
if ((mysheet == "Critter") || (mysheet == "Spirit")) myatts["gunneryswitch"]="hide";
if (mysheet == "Matrix") {
myatts["iconstatuscode"]=0;
myatts["matrix-iconstatus"]="Legitimate";
}
setAttrs(myatts);
});
});
on("change:metatype change:quickness change:acceleration change:handling-street change:speed", function() {
console.log('setting running and walking rates');
getAttrs(["quickness_max", "metatype" ,"sheettype", "speed", "handling-street", "acceleration"], function (myval) {
const atts={};
const vehicles=["Vehicle", "Drone"];
const metatype=myval["metatype"];
const sheettype=myval["sheettype"];
console.log('sheet type is: ' + myval["sheettype"]);
atts["walk"]=mywalk=(vehicles.includes(sheettype))? myval["acceleration"] : parseInt(myval["quickness_max"]);
atts["run"]=(vehicles.includes(sheettype))? Math.floor( parseInt(myval["speed"]) / parseInt(myval["handling-street"])) : mywalk * racemaximum[metatype]["run"];
console.log(atts);
setAttrs(atts);
});
});
on("change:deck-dni change:intelligence_max change:reaction change:deck-asist change:deck-response change:deck-realityfilter", function() {
getAttrs(["deck-dni", "intelligence_max", "reaction", "deck-response", "deck-asist", "deck-realityfilter"], function (myval) {
var dnibonus=0;
var response=0;
var initiative=1;
if ((myval["deck-dni"] == "1") && (myval["deck-asist"]== "1")) {
dnibonus= myval["intelligence_max"] + 2;
} else if ((myval["deck-dni"] == "1") && (myval["deck-asist"]== "0")) {
dnibonus= myval["intelligence_max"];
} else {
dnibonus= myval["reaction"];
}
if (myval["deck-asist"] == "1" ) {
response=( dnibonus + (parseInt(myval["deck-response"]) *2 ) + ( parseInt(myval["deck-realityfilter"]) *2 ));
initiative +=(parseInt(myval["deck-response"]) + parseInt(myval["deck-realityfilter"]));
} else {
response=dnibonus;
}
console.log('reaction:' + response);
console.log('initiative:' + initiative);
setAttrs({"deck-reaction-final": response, "deck-initiative": initiative});
});
});
on("change:spelldefense", function() {
getAttrs(["sorcery", "spelldefense"], function (myval) {
spd=parseInt(myval["spelldefense"]) - parseInt(myval["sorcery"]);
if ( spd < 0 ) spd=0;
setAttrs({spelldefmin: spd});
});
});
on("change:sorcery-defense change:spellpool-defense change:sorcery-used change:spellpool-used change:spelldefmin", function() {
getAttrs(["sorcery-defense", "spellpool", "sorcery", "spellpool-defense", "spellpool-used", "sorcery-used", "spelldefmin"], function (myval) {
atts=[];
console.log('updating defense dice');
var poolover=0;
var sorceryover=0;
let sorcery=parseInt(myval["sorcery"]);
let pool=parseInt(myval["spellpool"]);
let spd=parseInt(myval["spelldefmin"]);
let md=parseInt(myval["spellpool-defense"]);
let sd=parseInt(myval["sorcery-defense"]);
let mpu=parseInt(myval["spellpool-used"]);
let su=parseInt(myval["sorcery-used"]);
let sorcerytotal= sd + su;
let pooltotal= md + mpu;
if ( sorcerytotal > sorcery ) sorceryover=1;
if ( pooltotal > pool ) poolover=1;
atts["sorcery-over"]=sorceryover;
atts["spellpool-over"]=poolover;
atts["spelldefensedice"]=spd + md + sd;
atts["sorcery-used-total"]=sd + su;
atts["spellpool-used-total"]=md + mpu;
console.log(atts);
setAttrs(atts);
});
});
on("sheet:opened change:deck-masking-final change:decksleaze-rating-final", function() {
getAttrs(["deck-masking-final", "decksleaze-rating-final"], function (myval) {
console.log(myval["deck-masking-final"]);
let mymask=parseInt(myval["deck-masking-final"]) || 0;
let mysleaze=parseInt(myval["decksleaze-rating-final"]) || 0;
let mydf = Math.ceil((mymask + mysleaze ) / 2);
setAttrs({"deck-detection-max": mydf});
});
});
on("sheet:opened change:reaction change:reaction-mods change:initiative-mods", function () {
getAttrs(["reaction", "reaction-mods", "initiative-mods", "initiative"], function (myval) {
myatts={};
myatts["reaction_max"]=parseInt(myval["reaction-mods"]) + parseInt(myval["reaction"]);
myatts["initiative_max"]=parseInt(myval["initiative-mods"]) + parseInt(myval["initiative"]);
setAttrs(myatts);
console.log(myatts);
});
});
console.log('loading explosive ranges');
const explosiveranges={
"Regular": { min: 0, short: "mystr * 3", "medium": "mystr * 5", long: "mystr * 10", extreme: "mystr * 20", scatter: 1, scatterredux: 2, skill: "@{throwing}" },
"Aerodynamic": { min:0, short: "mystr * 3", "medium": "mystr * 5", long: "mystr * 20", extreme: "mystr * 30", scatter: 2, scatterredux: 4, skill: "@{throwing}" },
"Launcher": { min: 5, short: 50, medium: 100, long: 150, extreme: 300, scatter: 3, scatterredux: 4, skill: "@{launchers}" },
"Other": { min:0, short: 0, medium: 0, long: 0, extreme: 0, scatter: 0, scatterredux: 0, skill: "@{throwing}" },
"O": { power: 10, damage: "S", blast: 1 },
"D": { power: 10, damage: "S", blast: 0.5 },
"C": { power: 12, damage: "M(stun)", blast: 1 }
};
on("change:strength_max", function() {
getSectionIDs("explosives", function(idarray) {
idarray.forEach((m, id) => {
var myrepeat="repeating_explosives_" + m;
console.log('myrepeat: ' + myrepeat);
updaeteexplosives(myrepeat);
});
});
});
on("change:hackingpool-icsuppress change:hackingpool-used change:hackingpool change:controlpool change:controlpool-used change:combatpool change:combatpool-used change:taskpool change:taskpool-used change:astralpool change:astralpool-used", function() {
getAttrs(["hackingpool-used", "hackingpool-icsuppress", "hackingpool", "controlpool", "controlpool-used", "combatpool", "combatpool-used", "taskpool", "taskpool-used", "astralpool", "astralpool-used"], function(myval) {
sets={"hackingpool-over": 0, "controlpool-over": 0, "combatpool-over": 0, "astralpool-over": 0, "taskpool-over": 0};
hackusedic=parseInt(myval["hackingpool-icsuppress"]);
hackused=parseInt(myval["hackingpool-used"]);
hackpool=parseInt(myval["hackingpool"]);
hackpoolfinal=hackused + hackusedic;
sets["hackingpool-used-total"]=hackpoolfinal;
controlused=parseInt(myval["controlpool-used"]);
controlpool=parseInt(myval["controlpool"]);
combatused=parseInt(myval["combatpool-used"]);
combatpool=parseInt(myval["combatpool"]);
taskused=parseInt(myval["taskpool-used"]);
taskpool=parseInt(myval["taskpool"]);
astralused=parseInt(myval["astralpool-used"]);
astralpool=parseInt(myval["astralpool"]);
console.log(myval);
console.log('cu: ' + combatused);
console.log('cp: ' + combatpool);
if ( taskused > taskpool ) sets["taskpool-over"]=1;
if ( astralused > astralpool ) sets["astralpool-over"]=1;
if ( combatused > combatpool ) sets["combatpool-over"]=1;
if ( controlused > controlpool ) sets["controlpool-over"]=1;
if ( hackpoolfinal > hackpool ) sets["hackingpool-over"]=1;
console.log(sets);
setAttrs(sets);
});
});
on("change:repeating_explosives:exptype", function(eventinfo){
console.log(eventinfo)
var mybase=eventinfo["sourceAttribute"].split("_");
var myattr=mybase.pop();
const myrepeat=mybase.join('_');
console.log('mybase: ' + mybase + ' repeat: ' + myrepeat) ;
updaeteexplosives(myrepeat);
})
var updaeteexplosives = function(repeatingattr) {
const exptype=repeatingattr.concat("_exptype");
var mygetatts=[exptype]
mygetatts.push("strength_max");
getAttrs(mygetatts, function(myval) {
console.log(myval);
console.log(exptype);
console.log(repeatingattr);
const mystr=parseInt(myval.strength_max)
const etype=myval[exptype].split(":")
console.log(etype)
var atts={};
/* strenght based calcs */
console.log('strenght is ' + mystr);
atts[repeatingattr.concat("_min")]=explosiveranges[etype[0]]["min"];
atts[repeatingattr.concat("_skill")]=explosiveranges[etype[0]]["skill"];
atts[repeatingattr.concat("_short")]=eval(explosiveranges[etype[0]]["short"]);
atts[repeatingattr.concat("_medium")]=eval(explosiveranges[etype[0]]["medium"]);
atts[repeatingattr.concat("_long")]=eval(explosiveranges[etype[0]]["long"]);
atts[repeatingattr.concat("_extreme")]=eval(explosiveranges[etype[0]]["extreme"]);
atts[repeatingattr.concat("_scatter")]=explosiveranges[etype[0]]["scatter"];
atts[repeatingattr.concat("_scatterredux")]=explosiveranges[etype[0]]["scatterredux"];
atts[repeatingattr.concat("_power")]=explosiveranges[etype[1]]["power"];
atts[repeatingattr.concat("_damage")]=explosiveranges[etype[1]]["damage"];
atts[repeatingattr.concat("_blast")]=explosiveranges[etype[1]]["blast"];
console.log('setting repeating explosive atts: ');
console.log(atts);
setAttrs(atts);
});
};
on("sheet:opened change:combatpool-mods change:armor-combatpool-pen change:combatpool-base change:spellpool-mods change:spellpool-base change:hackingpool-mods change:hackingpool-base change:controlpool-mods change:controlpool-base change:astralpool-mods change:astralpool-base change:gyro-on", function () {
sets={};
atts=["combatpool-mods", "combatpool-base", "armor-combatpool-pen","spellpool-mods", "spellpool-base", "hackingpool-mods", "hackingpool-base", "controlpool-mods", "controlpool-base", "astralpool-mods", "astralpool-base", "gyro-on"]
getAttrs(atts, function (myval) {
console.log('pool setup atts');
console.log(myval);
if ( myval["gyro-on"] == 1 ) sets["combatpool"] = Math.floor(( parseInt(myval["combatpool-mods"]) + parseInt(myval["combatpool-base"]) + parseInt(myval["armor-combatpool-pen"]) ) / 2);
else sets["combatpool"] = parseInt(myval["combatpool-mods"]) + parseInt(myval["combatpool-base"]) + parseInt(myval["armor-combatpool-pen"]);
sets["spellpool"] = parseInt(myval["spellpool-mods"]) + parseInt(myval["spellpool-base"]);
sets["hackingpool"] = parseInt(myval["hackingpool-mods"]) + parseInt(myval["hackingpool-base"]);
sets["controlpool"] = parseInt(myval["controlpool-mods"]) + parseInt(myval["controlpool-base"]);
sets["hackingpool"] = parseInt(myval["hackingpool-mods"]) + parseInt(myval["hackingpool-base"]);
sets["astralpool"] = parseInt(myval["astralpool-mods"]) + parseInt(myval["astralpool-base"]);
setAttrs(sets);
console.log(sets);
});
});
var updatepools = function() {
getAttrs(["strength_max","magic","deck-mpcp-final","perception", "willpower_max","intelligence_max", "quickness_max", "charisma_max", "body_max", "frametype", "reaction", "vcr", "sheettype"], function(myval) {
var myatts={}
var myvcr = parseInt(myval.vcr);
var myperception = parseInt(myval.perception) || 0;
var myreact = parseInt(myval.reaction);
var mymagic = parseInt(myval.magic);
var mympcp = parseInt(myval["deck-mpcp-final"]);
var myagil = parseInt(myval.quickness_max);
var mystr = parseInt(myval.strength_max);
var mywill = parseInt(myval.willpower_max);
var myint = parseInt(myval.intelligence_max);
var mychar = parseInt(myval.charisma_max);
var mybody = parseInt(myval.body_max);
console.log('combat pool agil ' + myagil + ' int ' + Math.max(myint,myperception) + ' will ' + mywill);
myatts["combatpool-base"]= Math.floor((myagil + Math.max(myint,myperception) + mywill)/2);
if (myval.sheettype != "Spirit" ) myatts["reaction"] = Math.floor((myagil + myint)/2);
if (mymagic > 0 ) {
console.log("magic is not 0");
myatts["spellpool-base"] = Math.floor((mymagic + myint + mywill)/3);
myatts["astralpool-base"] = Math.floor( (mychar + mywill + myint) /2 );
myatts["astralreaction"]= ( 20 + myval.intelligence_max);
} else if (myval.sheettype == "Spirit" ) {
myatts["spellpool-base"] = 0;
myatts["astralpool-base"] = 0;
} else {
myatts["spellpool-base"] = 0;
myatts["astralpool-base"] = 0;
myatts["astralreaction"] = 0;
}
if ( mympcp > 0 ) {
myatts["hackingpool-base"] = Math.floor( (mympcp + myint) /3 );
} else {
myatts["hackingpool-base"] = 0;
}
if (myval.frametype == "Smart Frame") {
myatts["hackingpool-base"] = 0;
}
if (myvcr > 0) {
myatts["controlpool-base"] = myreact + ( 2 * myvcr);
} else {
myatts["controlpool-base"] = 0;
}
console.log('setting update pool');
console.log(myatts);
setAttrs(myatts);
});
};
var setupdefaults = function() {
setAttrs({ targetMove: -1, charisma_max: 1, strength_max: 1, willpower_max: 1, body_max: 1, quickness_max: 1, intelligence_max: 1, attr_rangedTN: 0, attr_meleeTN: 0, attr_misccombatmods: 0, signature: 4 })
};
var updatePenalty = function(attribute) {
console.log('calculating penalty for ' + attribute)
let myatt = attribute.concat("-damage");
let mypen = attribute.concat("-penalty");
getAttrs([myatt], function(myval) {
sets={};
console.log('dmg ' + myval[myatt]);
console.log('pen ' + mypen);
var penalty = 0;
var dmg = parseInt(myval[myatt]);
if ( dmg > 10) penalty = 4;
else if (dmg > 5) penalty = 3;
else if (dmg > 2) penalty = 2;
else if (dmg > 0) penalty = 1;
sets[mypen]=penalty;
console.log(sets);
setAttrs(sets);
});
};
var updateWoundPenalty = function () {
getAttrs(["wounds","adeptpainres"], function(v) {
var penalty = 0;
var wounds = parseInt(v.wounds);
var res = parseInt(v.adeptpainres);
if (wounds > res) {
if ( wounds > 10) penalty = 4;
else if (wounds > 5) penalty = 3;
else if (wounds > 2) penalty = 2;
else if (wounds > 0) penalty = 1;
}
setAttrs({"wound_pen": penalty});
});
};
var updateStunPenalty = function () {
getAttrs(["stun","adeptpainres"], function(v) {
var penalty = 0;
var stun = parseInt(v.stun);
var res = parseInt(v.adeptpainres);
if (stun > res) {
if (stun > 10 ) penalty = 100;
else if (stun > 5) penalty = 3;
else if (stun > 2) penalty = 2;
else if (stun > 0) penalty = 1;
}
setAttrs({"stun_pen": penalty});
});
};
console.log('loading racial maxes');
const racemaximum={
"Human": {B: 6, Q: 6, S: 6, C: 6, I: 6, W: 6, Bm: 9, Qm: 9, Sm: 9, Cm: 9, Im: 9, Wm: 9, run: 3 },
"Elf": {B: 6, Q: 7, S: 6, C: 8, I: 6, W: 6, Bm: 9, Qm: 11, Sm: 9, Cm: 12, Im: 9, Wm: 9, run: 3 },
"Dwarf": {B: 7, Q: 6, S: 8, C: 6, I: 6, W: 7, Bm: 11, Qm: 9, Sm: 12, Cm: 9, Im: 9, Wm: 11, run: 2 },
"Ork": {B: 9, Q: 6, S: 8, C: 5, I: 5, W: 6, Bm: 14, Qm: 9, Sm: 12, Cm: 8, Im: 8, Wm: 9, run: 3 },
"Troll": {B: 11, Q: 5, S: 10, C: 4, I: 4, W: 6, Bm: 17, Qm: 8, Sm: 15, Cm: 6, Im: 6, Wm: 9, run: 3 },
"Cyclops": {B: 11, Q: 5, S: 12, C: 4, I: 4, W: 6, Bm: 17, Qm: 8, Sm: 18, Cm: 6, Im: 6, Wm: 9, run: 3 },
"Fomori": {B: 10, Q: 5, S: 9, C: 6, I: 4, W: 6, Bm: 15, Qm: 8, Sm: 14, Cm: 9, Im: 6, Wm: 9, run: 3 },
"Giant": {B: 11, Q: 5, S: 11, C: 4, I: 4, W: 6, Bm: 17, Qm: 8, Sm: 17, Cm: 6, Im: 6, Wm: 9, run: 3 },
"Minotaur": {B: 10, Q: 5, S: 9, C: 5, I: 5, W: 6, Bm: 15, Qm: 8, Sm: 14, Cm: 8, Im: 8, Wm: 9, run: 3 },
"Hobgoblin": {B: 8, Q: 6, S: 8, C: 5, I: 6, W: 6, Bm: 12, Qm: 9, Sm: 12, Cm: 8, Im: 9, Wm: 9, run: 3 },
"Oni": {B: 8, Q: 6, S: 8, C: 5, I: 5, W: 7, Bm: 12, Qm: 9, Sm: 12, Cm: 8, Im: 8, Wm: 11, run: 3 },
"Ogre": {B: 9, Q: 6, S: 8, C: 6, I: 5, W: 6, Bm: 14, Qm: 9, Sm: 12, Cm: 9, Im: 8, Wm: 9, run: 3 },
"Satyr": {B: 9, Q: 5, S: 8, C: 5, I: 5, W: 7, Bm: 14, Qm: 8, Sm: 12, Cm: 8, Im: 8, Wm: 11, run: 4 },
"Menehune": {B: 8, Q: 6, S: 7, C: 6, I: 6, W: 7, Bm: 12, Qm: 9, Sm: 11, Cm: 9, Im: 9, Wm: 11, run: 2 },
"Koborokuru": {B: 7, Q: 6, S: 8, C: 6, I: 6, W: 7, Bm: 11, Qm: 9, Sm: 12, Cm: 9, Im: 9, Wm: 11, run: 3 },
"Gnome": {B: 7, Q: 6, S: 7, C: 6, I: 6, W: 8, Bm: 11, Qm: 9, Sm: 11, Cm: 9, Im: 9, Wm: 12, run: 2 },
"Wakyambi": {B: 6, Q: 6, S: 6, C: 8, I: 6, W: 7, Bm: 9, Qm: 9, Sm: 9, Cm: 12, Im: 9, Wm: 11, run: 3 },
"Nightone": {B: 6, Q: 8, S: 6, C: 8, I: 6, W: 6, Bm: 9, Qm: 12, Sm: 9, Cm: 12, Im: 9, Wm: 9, run: 3 },
"Dryad": {B: 5, Q: 7, S: 5, C: 9, I: 6, W: 6, Bm: 8, Qm: 11, Sm: 8, Cm: 14, Im: 9, Wm: 9, run: 3 }
};
var setattributelimits = function(metatype) {
console.log ("setting racial limits based on metatype: " + metatype)
var atts={};
atts["rbodymod"]=racemaximum[metatype]["B"];
atts["rbodymax"]=racemaximum[metatype]["Bm"];
atts["rquickmod"]=racemaximum[metatype]["Q"];
atts["rquickmax"]=racemaximum[metatype]["Qm"];
atts["rstrmod"]=racemaximum[metatype]["S"];
atts["rstrmax"]=racemaximum[metatype]["Sm"];
atts["rchamod"]=racemaximum[metatype]["C"];
atts["rchamax"]=racemaximum[metatype]["Cm"];
atts["rintmod"]=racemaximum[metatype]["I"];
atts["rintmax"]=racemaximum[metatype]["Im"];
atts["rwillmod"]=racemaximum[metatype]["W"];
atts["rwillmax"]=racemaximum[metatype]["Wm"];
console.log(atts);
setAttrs(atts);
};
var updateMeleeTNs = function() {
getAttrs(["meleevizTN", "cover", "move", "dualwield", "calledshot", "aim", "enemies", "friends", "meleetargets", "position", "misccombatmods", "stun_pen","wound_pen"], function(myval) {
console.log("updateMeleeTN")
console.log(myval);
targetNumberMelee = parseInt(myval.calledshot) + parseInt(myval.meleevizTN) + parseInt(myval.enemies) - parseInt(myval.friends) + parseInt(myval.misccombatmods) + ( 2 * parseInt(myval.meleetargets) ) - parseInt(myval.position) + parseInt(myval.stun_pen) + parseInt(myval.wound_pen);
console.log('meleeTN ' + targetNumberMelee)
setAttrs({meleeTN: targetNumberMelee});
});
};
var updateRangeTNs = function() {
getAttrs(["rangedvizTN", "cover", "move", "dualwield", "calledshot", "aim", "enemies", "friends", "meleetargets", "position", "misccombatmods", "stun_pen","wound_pen", "manualgunneryTN", "rangedselected", "gyro-on", "sheettype" ], function(myval) {
console.log(myval);
moreatts=["rangedselected"];
const gyroon=parseInt(myval["gyro-on"]);
const sheettype=myval["sheettype"];
var rselect="None";
if (( myval["rangedselected"] != "None") && ( myval["gyro-on"] == 1 )) {
let mybase= myval["rangedselected"].split("_");
const myattr=mybase.pop();
const myrepeat=mybase.join('_');
rselect=myrepeat + "_gyro";
moreatts.push(rselect);
}
getAttrs(moreatts, function(mygyro) {
const gyro=(rselect == "None")? 0 : parseInt(mygyro[rselect]) * gyroon ;
console.log('gyro val ' + gyro);
var sets={};
console.log('updating ranged tn');
const move=parseInt(myval.move);
const called=parseInt(myval.calledshot);
const viz=parseInt(myval.rangedvizTN);
const cover=parseInt(myval.cover);
const dual=parseInt(myval.dualwield);
const enemies=parseInt(myval.enemies);
const aim=parseInt(myval.aim);
const misc=parseInt(myval.misccombatmods);
const stun=parseInt(myval.stun_pen);
const wound=parseInt(myval.wound_pen);
const gunnery=parseInt(myval.manualgunneryTN);
const movepen=((move - gyro) < 0 )? 0: move - gyro;
console.log('movepen ' + movepen);
targetNumberRange = called + viz + cover + dual + (2 * enemies) - aim + misc + stun + wound + gunnery + movepen;
mytargetMove = (move == 0)? -1 : (move ==4)? 2: (move ==6)? 2: 0;
sets["rangedTN"]=targetNumberRange;
sets["targetMove"]=mytargetMove;
console.log(sets);
setAttrs(sets);
});
});
};
var updateManualGunneryTNs = function() {
getAttrs(["gunnerymotion", "gunneryspeed", "gunnerymaneuver", "gunneryvehicledmg", "gunnerymount", "gunneryterrain", "gunnerytargettype" ], function(myval) {
console.log("updateGunneryTN")
targetNumberGunnery = parseInt(myval.gunnerymotion) + parseInt(myval.gunneryspeed) + parseInt(myval.gunnerymaneuver) + parseInt(myval.gunneryvehicledmg) + parseInt(myval.gunnerymount) + parseInt(myval.gunneryterrain) + parseInt(myval.gunnerytargettype)
console.log(targetNumberGunnery)
setAttrs({manualgunneryTN: targetNumberGunnery});
});
};
on("change:repeating_spells:range change:repeating_spells:spellcategory", function(myval) {
if (!("yes" in lang)) geti18n();
getAttrs(["repeating_spells_spellcategory", "repeating_spells_range"], function(myval) {
const spellcategory=myval["repeating_spells_spellcategory"];
const range=myval["repeating_spells_range"];
console.log(spellcategory)
console.log(range)
atts=[];
if ( spellcategory == "Elemental" ) {
atts["repeating_spells_target"]="@{target|" + lang["target"] +"|targetMove}";
console.log(atts);
setAttrs(atts);
}
});
});
</script>
<script type="text/worker">
const spirits= {
"watcher":
{B: "(F)", Q: "(F)", S: "(F)", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F)",
astral_init: "(F + 20)", init: 0, attackpower: "(F)", attackdmg: "L(stun)", reach: 0,
powers: ["Air Cover", "Alarm", "Attack Dog", "Bug", "Courier", "Irritant"]},
"airelemental":
{B: "( F - 2 )", Q: "(( F + 3)*4)", S: "( F - 3)", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F + 2)",
astral_init: "(F + 20)", init: "(F + 12)", attackpower: 0, attackdmg: "L", reach: 0,
powers: ["Engulf", "Materialization", "Movement", "Noxious Breath", "Psychokinesis" ],
weaknesses: ["airtight seals", "Vulnerability (Earth)"] },
"earthelemental":
{ B: "( F + 4 )", Q: "((F - 2) * 2)", S: "( F + 4)", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F - 2)",
astral_init: "(F + 20 )", init: "(F + 8 )", attackpower: "(F+4)", attackdmg: "S", reach: 0,
powers: ["Engulf", "Materialization", "Movement"],
weaknesses: ["Vulnerability (Air)"] },
"fireelemental":
{B: "( F + 1 )", Q: "((F + 2) * 3)", S: "( F - 2)", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F + 1)",
astral_init: "(F + 20 )", init: "(F + 11 )", attackpower: "(F-2)", attackdmg: "M", reach: 1,
powers: [ "Engulf", "Flame Aura", "Guard", "Materialization", "Innate Spell (Flamethrower)"],
weaknesses: ["Vulnerability (Water)"] },
"waterelemental":
{B: "( F + 2 )", Q: "(F * 2)", S: "(F)", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F + 1)",
astral_init: "(F + 20 )", init: "(F + 11 )", attackpower: "(F)", attackdmg: "S(stun)", reach: 0,
powers: [ "Engulf", "Materialization", "Movement" ],
weaknesses: ["Vulnerability (Fire)"] },
"cityspirit": {
B: "( F + 1 )", Q: "((F + 2) * 3)", S: "(F - 2 )", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F + 1)",
astral_init: "(F + 20 )" , init: "(F + 11 )", attackpower: "(F - 2)", attackdmg: "M", reach: 0,
powers: ["Accident", "Concealment", "Confusion", "Fear", "Guard", "Materialization", "Search"]
},
"fieldspirit": {
B: "( F + 1 )", Q: "((F + 2) * 3)", S: "(F - 2 )", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F + 1)",
astral_init: "(F + 20 )", init: "(F + 11 )", attackpower: "(F - 2)", attackdmg: "M", reach: 0,
powers: [ "Accident", "Concealment", "Guard", "Materialization", "Search"]
},
"hearthspirit": {
B: "( F + 1 )", Q: "((F + 2) * 3)", S: "(F - 2 )", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F + 1)",
astral_init: "(F + 20 )", init: "(F + 11 )", attackpower: "(F - 2)", attackdmg: "M", reach: 0,
powers: [ "Accident", "Concealment", "Confusion", "Guard" ]
},
"desertspirit": {
B: "( F + 4 )", Q: "((F - 2) * 2)", S: "(F + 4 )", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F - 2)",
astral_init: "(F + 20 )", init: "(F + 8 )", attackpower: "(F + 4)", attackdmg: "S", reach: 0,
powers: [ "Concealment", "Guard", "Materialization", "Movement", "Search" ]
},
"forestspirit": {
B: "( F + 4 )", Q: "((F - 2) * 2)", S: "(F + 4 )", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F - 2)",
astral_init: "(F + 20 )", init: "(F + 8 )", attackpower: "(F + 4)", attackdmg: "S", reach: 0,
powers: ["Accident", "Concealment", "Confusion", "Fear", "Guard", "Materialization" ]
},
"mountainspirit": {
B: "( F + 4 )", Q: "((F - 2) * 2)", S: "(F + 4 )", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F - 2)",
astral_init: "(F + 20 )", init: "(F + 8 )", attackpower: "(F + 4)", attackdmg: "S", reach: 0,
powers: ["Accident", "Concealment", "Guard", "Materialization", "Movement", "Search"]
},
"prairiespirit": {
B: "( F + 4 )", Q: "((F - 2) * 2)", S: "(F + 4 )", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F - 2)",
astral_init: "(F + 20 )", init: "(F + 8 )", attackpower: "(F + 4)", attackdmg: "S", reach: 0,
powers: ["Accident", "Concealment", "Guard", "Materialization", "Movement", "Search"]
},
"mistspirit": {
B: "( F - 2 )", Q: "((F + 3) * 4)", S: "(F - 3 )", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F + 2)",
astral_init: "(F + 20 )", init: "(F + 12 )", attackpower: "(F - 3)", attackdmg: "M(stun)", reach: 0,
powers: [ "Accident", "Concealment", "Confusion", "Guard", "Materialization", "Movement" ]
},
"stormspirit": {
B: "( F - 2 )", Q: "((F + 3) * 4)", S: "(F - 3 )", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F + 2)",
astral_init: "(F + 20 )", init: "(F + 12 )", attackpower: "(F - 3)", attackdmg: "M(stun)", reach: 0,
powers: [ "Concealment", "Confusion", "Fear", "Materialization", "Innate Spell (Lightning Bolt)"]
},
"windspirit": {
B: "( F - 2 )", Q: "((F + 3) * 4)", S: "(F - 3 )", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F + 2)",
astral_init: "(F + 20 )", init: "(F + 12 )", attackpower: 0, attackdmg: "L", reach: 0,
powers: [ "Accident", "Confusion", "Guard", "Materialization", "Movement", "Search"]
},
"lakespirit": {
B: "( F + 2 )", Q: "(F * 2)", S: "(F)", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F - 1)",
astral_init: "(F + 20 )", init: "(F + 9 )", attackpower: "(F)", attackdmg: "S(stun)", reach: 0,
powers: ["Accident", "Engulf", "Fear", "Guard", "Materialization", "Movement", "Search"]
},
"riverspirit": {
B: "( F + 2 )", Q: "(F * 2)", S: "(F)", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F - 1)",
astral_init: "(F + 20 )", init: "(F + 9 )", attackpower: "(F)", attackdmg: "S(stun)", reach: 0,
powers: ["Accident", "Concealment", "Engulf", "Fear", "Guard", "Materialization", "Movement", "Search"]
},
"seaspirit": {
B: "( F + 2 )", Q: "(F * 2)", S: "(F)", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F - 1)",
astral_init: "(F + 20 )", init: "(F + 9 )", attackpower: "(F)", attackdmg: "S(stun)", reach: 0,
powers: ["Accident", "Concealment", "Confusion", "Engulf", "Fear", "Guard", "Materialization", "Movement", "Search"]
},
"gnome": {
B: "( F + 4 )", Q: "((F - 2) * 2)", S: "(F + 4 )", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F - 2)",
astral_init: "(F + 20 )", init: "(F + 8 )", attackpower: "(F + 4)", attackdmg: "S", reach: 1,
powers: ["Concealment", "Engulf", "Fear", "Guard", "Materialization", "Magical Guard"],
weaknesses: ["Vulnerability (Air)"]
},
"manitous": {
B: "( F + 3 )", Q: "(F * 2)", S: "(F + 1 )", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F)",
astral_init: "(F + 20 )", init: "(F + 10 )", attackpower: "(F + 3)", attackdmg: "S", reach: 1,
powers: ["Accident", "Concealment", "Confusion", "Engulf", "Fear", "Guard", "Materialization", "Magical Guard"]
},
"salamander": {
B: "( F + 1 )", Q: "(( F + 2) * 3)", S: "(F - 2 )", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F + 1)",
astral_init: "(F + 20 )", init: "(F + 10 )", attackpower: "(F - 2)", attackdmg: "M", reach: 0,
powers: [ "Engulf", "Flame Aura", "Immunity (Fire)", "Guard", "Materialization", "Innate Spell (Flamethrower)", "Magical Guard", "Psychokinesis"],
weaknesses: ["Vulnerability (Water)"]
},
"sylph": {
B: "( F - 2 )", Q: "(( F + 3) * 4)", S: "(F - 3 )", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F + 2)",
astral_init: "(F + 20 )", init: "(F + 12 )", attackpower: "(F - 3)", attackdmg: "M(stun)", reach: 0,
powers: ["Concealment", "Confusion", "Engulf", "Guard", "Materialization", "Magical Guard", "Movement", "Psychokinesis"],
weaknesses: ["Vulnerability (Earth)"]
},
"ancestor": {
B: "( F + 2 )", Q: "(F * 3)", S: "(F + 1)", C: "(F)", I: "(F)", W: "(F)", E: "(F)", R: "(F)",
astral_init: "(F + 20 )" , init: "(F + 10 )", attackpower: "(F + 1)", attackdmg: "M(stun)", reach: 0,
powers: ["Accident", "Divination", "Guard", "Materialization", "Search"]
}
}
const spiritatts=[ "body", "quickness", "strength", "charisma", "willpower", "intelligence", "perception", "reaction", "initiative", "attacks", "force", "reach"];
on("change:spirit-type change:force", function() {
getAttrs(["spirit-type", "sheettype", "force"], function(myval) {
var atts={};
const sheettype=myval["sheettype"];
const spirittype=myval["spirit-type"];
const F=parseInt(myval["force"]);
if (sheettype != "Spirit") {
console.log('not a spirit');
} else {
console.log('setting spirit attributes based on type and force');
if (spirittype == "Watcher") {
atts["initiative"]=0;
atts["initiative-mods"]=1;
} else {
atts["initiative"]=1;
atts["initiative-mods"]=0;
}
atts["body"]=eval(spirits[spirittype]["B"]);
atts["quickness"]=eval(spirits[spirittype]["Q"]);
atts["strength"]=eval(spirits[spirittype]["S"]);
atts["charisma"]=eval(spirits[spirittype]["C"]);
atts["intelligence"]=eval(spirits[spirittype]["I"]);
atts["perception"]=eval(spirits[spirittype]["I"]);
atts["willpower"]=eval(spirits[spirittype]["W"]);
atts["essence"]=eval(spirits[spirittype]["E"]);
atts["reaction"]=eval(spirits[spirittype]["R"]);
atts["spirit-initp"]=eval(spirits[spirittype]["init"]);
atts["astralreaction"]=eval(spirits[spirittype]["astral_init"]);
atts["attackpower"]=eval(spirits[spirittype]["attackpower"]);
atts["attackdamage"]=spirits[spirittype]["attackdmg"];
atts["ballistic"]=F * 2;
atts["impact"]=F * 2;
const powers=spirits[spirittype]["powers"];
console.log(atts);
getSectionIDs("critter-powers", function(idarray) {
idarray.forEach(id=>{
removeRepeatingRow("repeating_critter-powers_" + id);
});
});
getSectionIDs("critter-weaknesses", function(idarray) {
idarray.forEach(id=>{
removeRepeatingRow("repeating_critter-weaknesses_" + id);
});
});
if (spirits[spirittype]["weaknesses"]) {
const weaknesses=spirits[spirittype]["weaknesses"];
weaknesses.forEach(weak=>{
var newrowid = generateRowID();
atts["repeating_critter-weaknesses_" + newrowid + "_name" ] = weak;
});
};
if (spirits[spirittype]["powers"]) {
const powers=spirits[spirittype]["powers"];
powers.forEach(power=>{
var newrowid = generateRowID();
atts["repeating_critter-powers_" + newrowid + "_name" ] = power;
});
};
console.log('setting atts ');
console.log(JSON.stringify(atts));
setAttrs(atts);
}
});
})
on("remove:repeating_foci change:repeating_foci", function(eventinfo) {
const attribs=["category", "force", "type"];
console.log(eventinfo);
mytrigger=eventinfo["triggerName"];
console.log('mytrigger ' + mytrigger);
atts=[];
if (mytrigger == "remove:repeating_foci" ) {
myrepeat=eventinfo["sourceAttribute"];
myattrib="remove";
} else {
mybase=eventinfo["sourceAttribute"].split("_");
myattrib=mybase.pop();
myrepeat=mybase.join('_');
}
if (myattrib == "remove" ) {
let cat = eventinfo["removedInfo"][myrepeat.concat("_category")];
let type = eventinfo["removedInfo"][myrepeat.concat("_type")];
if ( type == "power" ) atts["power-focus"]=0;
else if ( type == "spirit") atts[cat]=0;
else if ( type == "expendable" ) atts["exp-" + cat]=0;
else if ( type == "reusable" ) atts["reusable-" + cat]=0;
else return;
console.log(atts);
setAttrs(atts);
} else if (myattrib != "qty" ) {
gets=[];
gets.push(myrepeat.concat("_category"));
gets.push(myrepeat.concat("_force"));
gets.push(myrepeat.concat("_type"));
getAttrs(gets, function(myval) {
let cat=myval[myrepeat.concat("_category")];
let force=myval[myrepeat.concat("_force")];
let type=myval[myrepeat.concat("_type")];
if (type == "Power Focus") {
atts["power-focus"]=force
} else if ( type == "Spirit Focus" ) {
atts[cat]=force;
} else if ( type == "Expendable" ) {
if ( cat == "none" ) return;
var myatt="exp-" + cat;
atts[myatt]=force;
} else if ( type == "Reusable" ) {
if ( cat == "none" ) return;
var myatt="reusable-" + cat;
atts[myatt]=force;
} else {
console.log('skipping');
}
console.log(atts);
setAttrs(atts);
});
}
});
</script>
<rolltemplate class="sheet-rolltemplate-conjure">
<div class="sheet-rtcontainer">
<div class="sheet-rtheader">{{myname}}: {{spellname}} {{spiritforce}} {{spirittype}}</div>
<div class="sheet-rtrow">Rolling: {{rolldice}}d6 <span data=i18n="versus">vs.</span> {{targetnumber}} = {{casttest}}</div>
{{#conjuredice}}
<div class="sheet-conjure-resist-table">
<div data=i18n="total">Total</div>
<div></div>
<div data=i18n="summon">Summon</div>
<div></div>
<div data=i18n="drain">Drain</div>
<div>{{skill}}</div>
<div></div>
<div>{{conjuredice}}</div>
<div></div>
<div>{{conjuredicedrain}}</div>
</div>{{/conjuredice}}
{{#roll}}<div class="sheet-rtrow">Casting Test: {{computed::cast}} {{computed::roll}}</div>{{/roll}}
{{#draintest}}
<div class="sheet-conjure-resist-table">
<div data=i18n="drain">Drain</div>
<div></div>
<div data=i18n="resist-test">Resist Test</div>
<div></div>
<div data=i18n="final">Final</div>
<div>{{computed::draindamage}}</div>
<div></div>
<div>{{draintest}}</div>
<div></div>
<div>{{computed::finaldrain}}</div>
</div>
{{/draintest}}
{{#description}}<div class="rtrow">{{description}}</div>{{/description}}
{{#notes}}<div class="sheet-rtrow"> {{notes}}</div>{{/notes}}
{{#notes2}}<div class="sheet-rtrow"> {{notes2}}</div>{{/notes2}}
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-spell">
<div class="sheet-rtcontainer">
<div class="sheet-rtheader">{{myname}}: {{spellname}} <span data=i18n="versus">vs.</span> {{targetofspell}}</div>
<div class="sheet-rtrow"><span data-i18n="rolling">Rolling</span>: {{rolldice}}d6 <span data=i18n="versus">vs.</span> {{targetnumber}} = {{casttest}}</div>
{{#spelldamage}}<div class="sheet-rtrow"><span data-i18n="force">Force</span>: {{castforce}} <span data-i18n="damage">Damage</span>: {{computed::spelldamage}} </div> {{/spelldamage}}
{{#sorcerydice}}<div class="sheet-rtrow"><span data-i18n="sorcery-dice">Sorcery Dice</span>: {{sorcerydice}} </div>{{/sorcerydice}}
{{#spellpool}}<div class="sheet-rtrow"><span data-i18n="spell-pool">Spell Pool</span>: {{spellpool}} </div>{{/spellpool}}
{{#roll}}<div class="sheet-rtrow"><span data-i18n="casting-test">Casting Test</span>: {{computed::cast}} {{computed::roll}}</div>{{/roll}}
{{#draintest}}
{{#cast}}<div><span data-i18n="drain"></span>{{draindice}}d6 vs {{computed::draintnfinal}} = {{computed::draintest}}</div>{{/cast}}
{{#dispell}}<div><span data-i18n="drain"></span>{{draindice}}d6 vs {{computed::draintnfinal}} = {{draintest}}</div>{{/dispell}}
<div class="sheet-spell-resist-table">
<div data-i18n="drain">Drain</div>
<div></div>
<div data-i18n="resist-test">Resist Test</div>
<div></div>
<div data-i18n="final">Final</div>
<div>{{computed::draindamage}}</div>
<div></div>
{{#cast}}<div>{{computed::draintest}}</div>{{/cast}}
{{#dispell}}<div>{{draintest}}</div>{{/dispell}}
<div></div>
<div>{{computed::finaldrain}}</div>
</div>
{{/draintest}}
{{#description}}<div class="rtrow">{{description}}</div>{{/description}}
{{#notes}}<div class="sheet-rtrow"> {{notes}}</div>{{/notes}}
{{#notes2}}<div class="sheet-rtrow"> {{notes2}}</div>{{/notes2}}
{{#resist}}<div class="sheet-rtrow">{{targetofspell}}: {{resist}}</div>{{/resist}}
{{#defensetest}}<div class="sheet-spell-resist-table">
<div data-i18n="attack">Attack</div>
<div></div>
<div data-i18n="defense">Defense</div>
<div></div>
<div data-i18n="result">Result</div>
<div>{{attacks}}</div>
<div>-</div>
<div>{{casttest}}</div>
<div>=</div>
<div>{{computed::defensetest}}</div>
</div>{{/defensetest}}
<div class="sheet-rtrow">{{#spelldefense}}[<span data-i18n="spell-defense">Spell Defense</span>](~selected|spelldefense||{{computed::senddata}}){{/spelldefense}}
{{#casttest}}{{targetofspell}}:
{{#dodge}}[Dodge](~{{targetofspell}}|dodge||{{computed::senddata}}){{/dodge}}
{{#resisttype}}[<span data-i18n="resist">Resist</span>](~{{targetofspell}}|{{computed::resisttype}}||{{computed::senddata}}){{/resisttype}}
{{#resisttype2}}[<span data-i18n="resist">Resist</span>](~{{targetofspell}}|{{resisttype2}}||{{computed::senddata}}){{/resisttype2}}
</div>{{/casttest}}
{{#roll}}<div class="sheet-rtrow">{{targetofspell}}: [<span data-i18n="area-of-effect-acronym">AOE</span>](~selected|checkaoe||{{computed::senddata}})</div>
{{/roll}}
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-adept">
<div class="sheet-rtcontainer">
<div class="sheet-rtheader">{{myname}}: {{spellname}} {{powerlevel}} <span data=i18n="versus">vs.</span> {{targetofspell}}</div>
<div class="sheet-rtrow"><b data-i18n="rolling">Rolling</b>: {{rolldice}}d6 <span data=i18n="versus">vs.</span> {{targetnumber}} </div>
{{#description}}<div class="rtrow">{{description}}</div>{{/description}}
<div class="sheet-rtrow"><span data-i18n="spell-pool-used">Spell Pool Used</span>: {{spellpool}}</div>
<div class="sheet-rtrow"><span data-i18n="casting-test">Casting Test</span>: {{casttest}}</div>
<div class="sheet-rtrow"><span data-i18n="drain-test">Drain Test</span>: {{draintest}} <span data=i18n="versus">vs.</span> {{computed::draindamage}}</div>
{{#notes}}<div class="sheet-rtrow"> {{notes}}</div>{{/notes}}
{{#notes2}}<div class="sheet-rtrow"> {{notes2}}</div>{{/notes2}}
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-melee">
<div class="sheet-rtcontainer">
<div class="sheet-rtheader"><b>{{myname}}:</b> {{weaponname}} <span data=i18n="versus">vs.</span> {{target}}</div>
<div class="sheet-rtrow"><b data-i18n="mode">Mode</b>: {{attackmode}}</div>
<div class="sheet-rtrow"><b data-i18n="rolling">Rolling:</b> {{rolldice}}d6 <span data=i18n="versus">vs.</span> {{targetnumber}} </div>
{{#attacktest}}<div class="sheet-rtrow"><b>Attack Test:</b> {{attacktest}}</div>{{/attacktest}}
{{#defensetest}}<div class="sheet-rtrow"><b>{{attacker}}:</b> {{attacknumber}} <span data=i18n="versus">vs.</span>
<b>{{defender}}</b>:{{defensetest}}</div>{{/defensetest}}
<div class="sheet-rtrow"><b data-i18n="weapon-damage">Weapon Damage:</b> {{computed::weaponpower}} <b>{{computed::weapondamage}}</div>
{{#combatpool}}<div class="sheet-rtrow"><b data-i18n="combat-pool">Combat Pool Used:</b> {{combatpool}} </div>{{/combatpool}}
{{#pooldice}}<div class="sheet-rtrow"><b data-i18n="pool-used">{{pooltype}} Pool Used:</b> {{pooldice}}</div>{{/pooldice}}
{{#weaponfocus}}<div class="sheet-rtrow"><b data-i18n="weapon-focus">Weapon Focus:</b> {{weaponfocus}} {{focusforce}}</div>
{{/weaponfocus}}
{{#attacktest}}<div class="sheet-rtrow"><b>{{target}}:</b> [<span data-i18n="defend">Defend</span>](~{{target}}|meleedefend||{{computed::senddata}})
[<span data-i18n="full-defense">Full Defense</span>](~selected|meleedefendfull||{{computed::senddata}})</div>{{/attacktest}}
{{#defensetest}}<div class="sheet-rtrow"><b>Loser:</b> {{computed::finalwinner}}
{{#dodge}}[<span data-i18n="dodge">Dodge</span>](~{{computed::finalwinner}}|dodge||{{computed::senddata}}){{/dodge}}
[<span data-i18n="resist">Resist</span>](~{{computed::finalwinner}}|resistroll||{{computed::senddata}})</div>{{/defensetest}}
<div class="sheet-rtrow"><b data-i18n="reach">Reach: </b>{{myname}}: {{charreach}} <span data=i18n="versus">vs.</span> {{target}}: {{targetreach}}</div>
<div class="sheet-rtrow"><b data-i18n="mods">Mods:</b>
{{#reachmod}} <span data-i18n="reach">Reach</span>:{{computed::reachmod}}{{/reachmod}}
{{#meleemods}} <span data-i18n="reach">Melee</span>:{{meleemods}}{{/meleemods}}
{{#armorpen}} <span data-i18n="reach">Armor Penalty</span>:{{armorpen}}{{/armorpen}}
{{#gyropen}} <span data-i18n="reach">Gyro Penalty</span>:{{gyropen}}{{/gyropen}}
{{#movemods}} <span data-i18n="move-penalty">Move Penalty</span>:{{movemods}}{{/movemods}}</div>
{{#default}}<div class="sheet-rtrow">{{default}}</div>{{/default}}
{{#info}}<div class="sheet-rtrow">{{info}}</div>{{/info}}
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-attack">
<div class="sheet-rtcontainer">
<div class="sheet-rtheader"><b>{{myname}}</b>: {{weaponname}} <span data=i18n="versus">vs.</span> {{target}}</div>
<div class="sheet-rtrow"><b data-i18n="rolling">Rolling</b>: {{rolldice}}d6 <span data=i18n="versus">vs.</span> {{targetnumber}} </div>
<div class="sheet-rtrow"><b data-i18n="attack-test">Attack Test</b>: {{attacktest}}</div>
{{#combatpool}}<div class="sheet-rtrow"><b data-i18n="combat-pool-used">Combat Pool Used</b>: {{combatpool}} </div>{{/combatpool}}
{{#controlpool}}<div class="sheet-rtrow"><b data-i18n="control-pool-used">Control Pool Used</b>: {{controlpool}} </div>{{/controlpool}}
<div class="sheet-rtrow"><b data-i18n="weapon-damage">Weapon Damage</b>: {{computed::weaponpower}} <b>{{computed::weapondamage}}</div>
{{#rounds}}<div class="sheet-rtrow">{{ammotype}} <b data-i18n="rounds">Rounds</b>: {{computed::rounds}}</div>{{/rounds}}
{{#weaponfocus}}<div class="sheet-rtrow"><b data-i18n="weapon-focus">Weapon Focus</b>: {{weaponfocus}} {{focusforce}}</div>
{{/weaponfocus}}
{{#charreach}}<div class="sheet-rtrow"><b>{{myname}} <span data-i18n="reach">Reach</span></b>: {{charreach}}</div>{{/charreach}}
{{#targetreach}}<div class="sheet-rtrow"><b>{{target}} <span data-i18n="reach">Reach</span></b>: {{targetreach}}</div>{{/targetreach}}
{{#default}}<div class="sheet-rtrow">{{default}}</div>{{/default}}
{{#senddata}}<div class="sheet-rtrow"><b>{{target}}:</b> [<span data-i18n="dodge">dodge</span>](~selected|dodge||{{computed::senddata}})
[<span data-i18n="resist">Resist</span>](~selected|resistroll||{{computed::senddata}})</div>{{/senddata}}
<div class="sheet-rtrow"><b data-i18n="mods">Mods:</b>{{#rangedmods}}Ranged: {{rangedmods}} {{/rangedmods}}
{{#meleemods}} <span data-i18n="reach">Melee</span>:{{meleemods}}{{/meleemods}}
{{#armorpen}} <span data-i18n="reach">Armor Penalty</span>:{{armorpen}}{{/armorpen}}
{{#gyropen}} <span data-i18n="reach">Gyro Penalty</span>:{{gyropen}}{{/gyropen}}
{{#movemods}} <span data-i18n="move-penalty">Move Penalty</span>:{{movemods}}{{/movemods}}</div>
{{#targetmods}} <span data-i18n="aim-assist">aim assit</span> {{targetmods}}{{/targetmods}}
</div>
{{#info}}<div class="sheet-rtrow">{{info}}</div>{{/info}}
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-explosive">
<div class="sheet-rtcontainer">
<div class="sheet-rtheader"><b>{{myname}}:</b> {{weaponname}} <span data=i18n="versus">vs.</span> {{target}}</div>
<div class="sheet-rtrow"><b data-i18n="rolling">Rolling</b>: {{rolldice}}d6 <span data=i18n="versus">vs.</span> {{targetnumber}} </div>
<div class="sheet-rtrow"><b data-i18n="attack-test">Attack Test</b>: {{attacktest}}</div>
{{#combatpool}}<div class="sheet-rtrow"><b data-i18n="combat-pool-used">Combat Pool Used</b>: {{combatpool}} </div>{{/combatpool}}
{{#controlpool}}<div class="sheet-rtrow"><b data-i18n="control-pool-used">Control Pool Used</b>: {{controlpool}} </div>{{/controlpool}}
<div class="sheet-rtrow"><b data-i18n="weapon-damage">Weapon Damage</b>: {{weaponpower}}{{weapondamage}}</div>
<div class="sheet-rtrow"><b data-i18n="scatter">Scatter</b>: {{computed::scatter}}m in {{scatdirnumber}} <span data-i18n="direction">Direction</span></div>
{{#scatdir}}[img]({{scatdir}}){{/scatdir}}
<div class="sheet-rtrow"><span data-i18n="power-reduced-by-1-each">Power reduces by 1 each</span> {{blastradius}}<span data-i18n="meters-away">m away</span></div>
{{#description}}<div class="rtrow">{{description}}</div>{{/description}}
{{#notes}}<div class="sheet-rtrow"> {{notes}}</div>{{/notes}}
{{#notes2}}<div class="sheet-rtrow"> {{notes2}}</div>{{/notes2}}
{{#senddata}}<div class="sheet-rtrow"><b>{{target}}:</b> [<span data-i18n="resist-explosive">Resist Explosive</span>](~selected|resistroll||{{computed::senddata}})</div>{{/senddata}}
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-item">
<div class="sheet-rtcontainer">
<div class="sheet-rtheader">{{myname}} <span data-i18n="uses">uses</span> {{item}}</div>
<div class="sheet-rtrow"><b data-i18n="rolling">Rolling:</b> {{rolldice}}d6 <span data=i18n="versus">vs.</span> {{targetnumber}} </div>
<div class="sheet-rtrow"><span data-i18n="item-test">Item Test</span>: {{result}}</div>
{{#description}}<div class="rtrow">{{description}}</div>{{/description}}
{{#poolname}}<div class="sheet-rtrow">{{poolname}}: {{pooldice}}</div>{{/poolname}}
{{#notes}}<div class="sheet-rtrow"> {{notes}}</div>{{/notes}}
{{#dicepool}}<div class="sheet-rtrow"><span data-i18n="dice-pool-used">Dice Pool Used</span>: {{dicepool}}</div>{{/dicepool}}
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-skill">
<div class="sheet-rtcontainer">
<div class="sheet-rtheader">{{myname}}: {{skill}}</div>
<div class="sheet-rtrow"><b data-i18n="rolling">Rolling:</b> {{rolldice}}d6 <span data=i18n="versus">vs.</span> {{targetnumber}} </div>
{{#description}}<div class="rtrow">{{description}}</div>{{/description}}
<div class="sheet-rtrow"><span data-i18n="skill-test">Skill Test</span>: {{result}}</div>
{{#poolname}}<div class="sheet-rtrow">{{poolname}}: {{pooldice}}</div>{{/poolname}}
{{#notes}}<div class="sheet-rtrow"> {{notes}}</div>{{/notes}}
{{#dicepool}}<div class="sheet-rtrow"><span data-i18n="dice-pool-used">Dice Pool Used</span>: {{dicepool}}</div>{{/dicepool}}
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-attribute">
<div class="sheet-rtcontainer">
<div class="sheet-rtheader">{{character}}: {{Attribute}}</div>
{{#description}}<div class="rtrow">{{description}}</div>{{/description}}
<div class="sheet-rtrow"><span data-i18n="success-test">Success Test</span>: {{result}}</div>
<div class="sheet-rtrow"><span data-i18n="target-number">Target Number</span>: {{targetnumber}}</div>
<div class="sheet-rtrow"><span data-i18n="combat-pool">Combat Pool</span>: {{combatpool}}</div>
{{#notes}}<div class="sheet-rtrow"> {{notes}}</div>{{/notes}}
{{#notes2}}<div class="sheet-rtrow"> {{notes2}}</div>{{/notes2}}
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-init">
<div class="sheet-rtcontainer">
<div class="sheet-rtheader">{{character}} {{type}}</div>
{{#description}}<div class="rtrow">{{description}}</div>{{/description}}
{{#roll}}<div class="sheet-rtrow"><b data-i18n="roll">Roll</b>: {{roll}}</div>{{/roll}}
<div class="rtrow" data-i18n="all-pools-refreshed">All pools refreshed</div>
{{#notes}}<div class="sheet-rtrow"> {{notes}}</div>{{/notes}}
{{#notes2}}<div class="sheet-rtrow"> {{notes2}}</div>{{/notes2}}
{{#rollGreater() roll 10}}<div></div> {{character}} <span data-i18n="multi-combat-phase-message">has qualified for multiple combat phases!</span>
</div> {{/rollGreater() roll 10}}
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-aoe">
<div class="sheet-rtcontainer">
<div class="sheet-rtheader">{{character}} <span data=i18n="versus">vs.</span> {{weapon}} </div>
<div class="sheet-rtrow"><b data-i18n="target-number">Target Number:</b> {{targetnumber}}</div>
<div class="sheet-rtrow"><b data-i18n="dice">Dice</b>: {{dice}}</div>
<div class="sheet-rtrow"><b data-i18n="result">Result</b>: {{computed::attacktest}} </div>
{{#senddata}}<div class="sheet-rtrow"><b>{{character}}:</b>
[<span data-i18n="spell-defense">Spell Defense</span>](~selected|spelldefense||{{computed::senddata}})
{{#dodge}} [<span data-i18n="dodge">Dodge</span>](~{{character}}|dodge||{{computed::senddata}}){{/dodge}}
[<span data-i18n="resist">Resist</span>](~{{character}}|{{computed::resisttype}}||{{computed::senddata}})
</div>{{/senddata}}
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-resist">
<div class="sheet-rtheader">{{character}}: {{Power}}{{wpndmg}} <span data=i18n="versus">vs</span> {{name}} {{armorvalue}}</div>
<div class="sheet-rtrow"><span data-i18n="rolling">Rolling</span>: {{rolldice}}d6 vs. {{targetnumber}} = {{roll}}</div>
<div class="sheet-rtrow">Combat Pool Used: {{combatpool}}</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-resistadv">
<div class="sheet-rtcontainer">
<div class="sheet-rtheader">{{character}}: {{Power}}{{wpndmg}} <span data=i18n="versus">vs</span> {{name}} {{armorvalue}}</div>
<div class="sheet-rtrow"><span data-i18n="rolling">Rolling</span>: {{rolldice}}d6 vs. {{targetnumber}} = {{roll}}</div>
{{#distance}}<div class="rtrow"><span data-i18n="distance-from-explosion">Distance from Explosion</span>: {{distance}}<span data-i18n="meters-power-reduced-by">meter(s) Power Reduced by</span> {{blastredux}}
</div>{{/distance}}
{{#description}}<div class="rtrow">{{description}}</div>{{/description}}
{{#finaldmg}}
<div class="sheet-resist-table">
<div data-i18n="attack">Attack</div>
<div></div>
<div data-i18n="resist">Resist</div>
<div></div>
<div data-i18n="dodge">Dodge</div>
<div></div>
<div data-i18n="result">Result</div>
<div>{{attacktest}}</div>
<div>-</div>
<div>({{roll}}</div>
<div>+</div>
<div>{{dodge}})</div>
<div>=</div>
<div>{{computed::netresult}}</div>
</div>
<div class="rtrow"><span data-i18n="final-damage-staged-to">Final Damage: staged to</span> {{computed::finaldmg}}</div>{{/finaldmg}}
{{#spelldmg}}
<div class="sheet-spell-resist-table">
<div data-i18n="attack">Attack</div>
<div></div>
<div data-i18n="resist">Resist</div>
<div></div>
<div data-i18n="result">Result</div>
<div>{{attacktest}}</div>
<div>-</div>
<div>{{roll}}</div>
<div>=</div>
<div>{{computed::netresult}}</div>
</div>
<div class="rtrow"><span data-i18n="final-damage-staged-to">Final Damage: staged to </span>{{computed::spelldmg}}</div>{{/spelldmg}}
<div class="sheet-rtrow">Combat Pool Used: {{combatpool}}</div>
{{#senddata}}<div class="sheet-rtrow">{{character}}: [Resist](~selected|resistroll||{{computed::senddata}})
</div>{{/senddata}}
{{#notes}}<div class="sheet-rtrow"> {{notes}}</div>{{/notes}}
{{#notes2}}<div class="sheet-rtrow"> {{notes2}}</div>{{/notes2}}
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-matrix">
<div class="sheet-rtcontainer">
<div class="sheet-rtheader"><b>{{myname}} vs. {{target}}</b></div>
<div class="sheet-rtrow"><b data-i18n="rolling">Rolling</b>: {{rolldice}}d6 vs. {{computed::targetnumber}} </div>
{{#hackingpool}}<div class="rtrow"><b data-i18n="hacking-pool-dice">Hacking Pool Dice:</b> {{hackingpool}}</div>{{/hackingpool}}
{{#description}}<div class="rtrow">{{description}}</div>{{/description}}
<div class="sheet-rtrow"><b>{{action}} {{utilitylevel}}:</b> {{computed::roll}} {{computed::wdmg}}</div>
{{#resist}}<div class="sheet-rtrow"><b data-i18n="final-damage-staged-to">Final Damage staged to</b> {{computed::finaldamage}}</div>{{/resist}}
{{#debuff}}<div class="sheet-rtrow"><b>{{debuff}}</b> <span data-i18n="reduce-by">Reduce by</span> {{computed::finaldamage}}</div>{{/debuff}}
{{#senddata}}<div class="sheet-rtrow"><b>{{target}}:</b> [<span data-i18n="resist">Resist</span>](~selected|matrixresist||{{computed::senddata}})</div>{{/senddata}}
{{#senddata2}}<div class="sheet-rtrow"><b>{{target}}:</b> [<span data-i18n="oppose">Oppose</span>](~{{targetname}}|matrixmaneuvers||{{computed::senddata2}})</div>{{/senddata2}}
{{#oppose}}<div class="sheet-rtrow"><b data-i18n="utility-test">Utility Test</b> {{oppose}}</div>{{/oppose}}
{{#sensor}}<div class="sheet-rtrow"><b data-i18n="sensor-test">Sensor Test</b> {{sensor}}</div>{{/sensor}}
{{#blackic}}<div class="sheet-rtrow">[{{blackic}} <span data-i18n="resist">Resist</span>](~selected|resistroll||{{computed::payload}})</div>{{/blackic}}
{{#notes}}<div class="sheet-rtrow"> {{notes}}</div>{{/notes}}
{{#winner}}<div class="sheet-rtrow"><b data-i18n="winner">Winner</b> {{computed::winner}} : {{computed::testresult}} </div>{{/winner}}
{{#detect}}<div class="sheet-rtrow"><b>{{target}}:</b> {{detect}}</div>{{/detect}}
{{#clickme}}<div class="sheet-rtrow">{{clickme}}</div>{{/clickme}}
{{#matrixdmg}}<div class="sheet-rtrow">{{matrixdmg}} <span data-i18n="damage-reduced-by"></span>{{computed::roll}}{{/matrixdmg}}
{{#matrixdmg}}<div class="sheet-rtrow"><b>{{utilitylevel}}</b> <span data-i18n="utility-rating-reduced-by"></span><b> 1</b></div>{{/matrixdmg}}
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-silent">
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-vehicle">
<div class="sheet-rtcontainer">
<div class="sheet-rtheader"><b>{{character}}</b>: {{target}}</div>
<div class="sheet-rtrow"><span><b>{{type}}:</b> </span>{{computed::roll}}</div>
{{#controlpool}}<div class="sheet-rtrow"><b data-i18n="control-pool-dice-used">Control Pool Dice Used:</b> {{controlpool}}</div>{{/controlpool}}
{{#targetnumber}}<div class="sheet-rtrow"><b data-i18n="target-number">Target Number</b> {{computed::targetnumber}}</div>{{/targetnumber}}
{{#description}}<div class="sheet-rtrow">{{description}}</div>{{/description}}
{{#charscore}}<div class="sheet-rtrow"><b>{{character}} <span data-i18n="score">score:</b> {{charscore}}</div>{{/charscore}}
{{#targetscore}}<div class="sheet-rtrow"><b>{{target}} <span data-i18n="score">score:</b> {{targetscore}}</div>{{/targetscore}}
{{#delta}}<div class="sheet-rtrow"><b data-i18n="maneuever-score-difference">Maneuever Score Difference</b>: {{delta}}</div>{{/delta}}
{{#ecd}}<div class="sheet-rtrow"><span data-i18n="ecd-test">ECD Test</span>: {{ecd}}</div>{{/ecd}}
{{#notes}}<div class="sheet-rtrow"> {{notes}}</div>{{/notes}}
{{#position}}<div class="sheet-rtrow"><b data-i18n="new-position-score">New Position Score:</b> {{computed::position}}</div>{{/position}}
</div>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-info">
<div class="sheet-rtcontainer">
<div class="sheet-rtheader">{{character}}: Info</div>
<div class="sheet-rtrow"><span data-i18n="action">Action</span>: {{action}}</div>
{{#type}}<div class="sheet-rtrow">Type: {{type}}</div>{{/type}}
{{#info1}}<div class="sheet-rtrow">{{info1}}</div>{{/info1}}
{{#info2}}<div class="sheet-rtrow">{{info2}}</div>{{/info2}}
</div>
</rolltemplate>