2086 lines
92 KiB
HTML
2086 lines
92 KiB
HTML
<rolltemplate class="sheet-rolltemplate-initiative">
|
||
<table class="sheet-swn-template-container">
|
||
<thead>
|
||
<tr class="sheet-swn-template-title">
|
||
<th class="sheet-swn-template-name">
|
||
{{characterName}}
|
||
</th>
|
||
</tr>
|
||
<tr class="sheet-swn-template-title">
|
||
<th class="sheet-swn-template-type">
|
||
Initiative
|
||
</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td class="sheet-swn-template-result">
|
||
<span class="sheet-black-text">{{rollValue}}</span>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</rolltemplate>
|
||
|
||
<rolltemplate class="sheet-rolltemplate-basicattack">
|
||
<table class="sheet-swn-template-container">
|
||
<thead>
|
||
<tr class="sheet-swn-template-title">
|
||
<th colspan="2" class="sheet-swn-template-name">
|
||
{{characterName}}
|
||
</th>
|
||
</tr>
|
||
<tr class="sheet-swn-template-title">
|
||
<th colspan="2" class="sheet-swn-template-type">
|
||
{{attackType}} Attack
|
||
</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td class="sheet-swn-template-result">
|
||
<span class="sheet-black-text">{{rollValue}}</span>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</rolltemplate>
|
||
|
||
<rolltemplate class="sheet-rolltemplate-save">
|
||
<table class="sheet-swn-template-container">
|
||
<thead>
|
||
<tr class="sheet-swn-template-title">
|
||
<th colspan="2" class="sheet-swn-template-name">
|
||
{{characterName}}
|
||
</th>
|
||
</tr>
|
||
<tr class="sheet-swn-template-title">
|
||
<th colspan="2" class="sheet-swn-template-type">
|
||
{{type}} Save
|
||
</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
{{#^rollLess() rollValue save}}
|
||
<td class="sheet-swn-template-result">
|
||
Success!
|
||
</td>
|
||
{{/^rollLess() rollValue save}}
|
||
{{#rollLess() rollValue save}}
|
||
<td class="sheet-swn-template-result sheet-fail-tabstyle">
|
||
Fail!
|
||
</td>
|
||
{{/rollLess() rollValue save}}
|
||
<td class="sheet-swn-template-result">
|
||
<span class="sheet-black-text">{{rollValue}}</span>
|
||
vs
|
||
<span class="sheet-black-text">{{save}}</span>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</rolltemplate>
|
||
|
||
<rolltemplate class="sheet-rolltemplate-attack">
|
||
<table class="sheet-swn-template-container">
|
||
<thead>
|
||
<tr class="sheet-swn-template-title">
|
||
<th colspan="2" class="sheet-swn-template-name">
|
||
{{characterName}}
|
||
</th>
|
||
</tr>
|
||
<tr class="sheet-swn-template-title">
|
||
<th colspan="2" class="sheet-swn-template-type">
|
||
{{#name}}
|
||
{{name}}
|
||
{{/name}}
|
||
{{#name}}
|
||
{{#attackType}}
|
||
<br>
|
||
{{/attackType}}
|
||
{{/name}}
|
||
{{#attackType}}
|
||
{{attackType}} Attack
|
||
{{/attackType}}
|
||
</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td class="sheet-swn-template-result">
|
||
<span class="sheet-black-text">{{rollValue}}</span>
|
||
</td>
|
||
</tr>
|
||
{{#damage}}
|
||
<tr>
|
||
<td class="sheet-swn-template-result" colspan="2">
|
||
<span class="sheet-swn sheet-results-element sheet-roll-output">
|
||
<span class="black-text">{{damage}}</span> damage!
|
||
</span>
|
||
</td>
|
||
</tr>
|
||
{{/damage}}
|
||
</tbody>
|
||
</table>
|
||
</rolltemplate>
|
||
|
||
<rolltemplate class="sheet-rolltemplate-skill">
|
||
<table class="sheet-swn-template-container">
|
||
<thead>
|
||
<tr class="sheet-swn-template-title">
|
||
<th class="sheet-swn-template-name" colspan="2">
|
||
{{characterName}}
|
||
</th>
|
||
</tr>
|
||
<tr class="sheet-swn-template-title">
|
||
<th class="sheet-swn-template-type" colspan="2">
|
||
{{type}}
|
||
</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td class="sheet-swn-template-result">
|
||
Check Result
|
||
</td>
|
||
<td class="sheet-swn-template-result">
|
||
<span class="sheet-black-text">{{rollValue}}</span>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</rolltemplate>
|
||
|
||
<div class="sheet-logo">
|
||
<img src="http://i.imgur.com/3U3Ibb7.png" alt="Stars Without Number">
|
||
</div>
|
||
<div class="sheet-version">Version 1.3.0</div>
|
||
|
||
<input type="radio" name="attr_tab" class="sheet-tab sheet-tab-character" value="1" title="Character" checked="checked" />
|
||
<input type="radio" name="attr_tab" class="sheet-tab sheet-tab-ship" value="2" title="Ship" />
|
||
|
||
<div class="sheet-tab-content sheet-tab-ship">
|
||
<div class="sheet-wrapper">
|
||
<h3>Core Stats</h3>
|
||
<div class="sheet-2colrow sheet-stats">
|
||
<div class="sheet-col">
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_ship_name">Name</label></div>
|
||
<div class="sheet-col"><input type="text" name="attr_ship_name"></div>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_ship_hulltype">Hull Type</label></div>
|
||
<div class="sheet-col"><input type="text" name="attr_ship_hulltype"></div>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_ship_speed">Speed</label></div>
|
||
<div class="sheet-col"><input type="text" name="attr_ship_speed"></div>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_ship_ac">Armor Class</label></div>
|
||
<div class="sheet-col"><input type="text" name="attr_ship_ac"></div>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_ship_armor">Armor</label></div>
|
||
<div class="sheet-col"><input type="text" name="attr_ship_armor"></div>
|
||
</div>
|
||
<div class="sheet-row sheet-stats-ship-min-max">
|
||
<div class="sheet-col sheet-stats-label">
|
||
<label for="attr_ship_crew_min">Crew Min/Max</label>
|
||
</div>
|
||
<div class="sheet-col sheet-stats-ship-value">
|
||
<input type="text" name="attr_ship_crew_min">
|
||
</div>
|
||
<div class="sheet-col sheet-stats-label sheet-stats-label-separator">
|
||
<label for="attr_ship_crew_max">/</label>
|
||
</div>
|
||
<div class="sheet-col sheet-stats-ship-value">
|
||
<input type="text" name="attr_ship_crew_max">
|
||
</div>
|
||
</div>
|
||
<div class="sheet-row sheet-stats-ship-min-max">
|
||
<div class="sheet-col sheet-stats-label">
|
||
<label for="attr_ship_hp_min">Hit Points</label>
|
||
</div>
|
||
<div class="sheet-col sheet-stats-ship-value">
|
||
<input type="text" name="attr_ship_hp_min">
|
||
</div>
|
||
<div class="sheet-col sheet-stats-label sheet-stats-label-separator">
|
||
<label for="attr_ship_hp_max">/</label>
|
||
</div>
|
||
<div class="sheet-col sheet-stats-ship-value">
|
||
<input type="text" name="attr_ship_hp_max">
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<div class="sheet-row">
|
||
<textarea name="attr_ship_notes"></textarea>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-2colrow sheet-stats">
|
||
<div class="sheet-col">
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_ship_free_power">Free Power</label></div>
|
||
<div class="sheet-col"><input type="text" name="attr_ship_free_power"></div>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_ship_free_mass">Free Mass</label></div>
|
||
<div class="sheet-col"><input type="text" name="attr_ship_free_mass"></div>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_ship_free_hardpoints">Free Hardpoints</label></div>
|
||
<div class="sheet-col"><input type="text" name="attr_ship_free_hardpoints"></div>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_ship_cargo_tonnage">Cargo Tonnage</label></div>
|
||
<div class="sheet-col"><input type="text" name="attr_ship_cargo_tonnage"></div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_ship_current_crew">Current Crew</label></div>
|
||
<div class="sheet-col"><input type="text" name="attr_ship_current_crew"></div>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_ship_operating_cost">Operating Cost</label></div>
|
||
<div class="sheet-col"><input type="text" name="attr_ship_operating_cost"></div>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_ship_maintenance_cost">Maintenance Cost</label></div>
|
||
<div class="sheet-col"><input type="text" name="attr_ship_maintenance_cost"></div>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_ship_last_maintenance_cost">Last Maintenance Date</label></div>
|
||
<div class="sheet-col"><input type="text" name="attr_ship_last_maintenance_cost"></div>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_ship_home_port">Home Port</label></div>
|
||
<div class="sheet-col"><input type="text" name="attr_ship_home_port"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<h3>Weapons</h3>
|
||
<div class="sheet-col sheet-ship-repeating-headers">
|
||
<div class="sheet-ship-weapons sheet-7colrow">
|
||
<div class="sheet-col sheet-ship-weapon"><label for="attr_ship_weapon_name">Name</label></div>
|
||
<div class="sheet-col sheet-ship-weapon"><label>Power</label></div>
|
||
<div class="sheet-col sheet-ship-weapon"><label>Attack Bonus</label></div>
|
||
<div class="sheet-col sheet-ship-weapon"><label>Damage</label></div>
|
||
<div class="sheet-col sheet-ship-weapon"><label>Ammo</label></div>
|
||
<div class="sheet-col sheet-ship-weapon"><label>Special Effects</label></div>
|
||
<div class="sheet-col sheet-ship-weapon"><label class="sheet-ship-item-halfsize">Broken?</label></div>
|
||
</div>
|
||
<fieldset class="repeating_weapons repeating repeating-ship-weapons">
|
||
<div class="sheet-ship-weapons sheet-7colrow">
|
||
<div class="sheet-col sheet-ship-weapon"><input type="text" name="attr_ship_weapon_name"></div>
|
||
<div class="sheet-col sheet-ship-weapon"><input type="number" name="attr_ship_weapon_power"></div>
|
||
<div class="sheet-col sheet-ship-weapon"><input class="sheet-ship-item-halfsize" type="number" name="attr_ship_weapon_ab"></div>
|
||
<div class="sheet-col sheet-ship-weapon"><input type="text" name="attr_ship_weapon_damage"></div>
|
||
<div class="sheet-col sheet-ship-weapon"><input class="sheet-ship-item-halfsize" type="number" min="0" name="attr_ship_weapon_ammo"></div>
|
||
<div class="sheet-col sheet-ship-weapon"><input type="text" min="0" name="attr_ship_weapon_special_effects"></div>
|
||
<div class="sheet-col sheet-ship-weapon"><input class="sheet-ship-item-halfsize" type="checkbox" min="0" name="attr_ship_weapon_broken"></div>
|
||
</div>
|
||
</fieldset>
|
||
</div>
|
||
<h3>Defenses</h3>
|
||
<div class="sheet-col sheet-ship-repeating-headers">
|
||
<div class="sheet-ship-weapons sheet-3colrow">
|
||
<div class="sheet-col sheet-ship-defense"><label>Name</label></div>
|
||
<div class="sheet-col sheet-ship-defense"><label>Special Effects</label></div>
|
||
<div class="sheet-col sheet-ship-defense"><label class="sheet-ship-item-halfsize">Broken?</label></div>
|
||
</div>
|
||
<fieldset class="repeating_defenses repeating repeating-ship-defenses">
|
||
<div class="sheet-ship-weapons sheet-3colrow">
|
||
<div class="sheet-col sheet-ship-defense"><input type="text" name="attr_ship_defense_name"></div>
|
||
<div class="sheet-col sheet-ship-defense"><input type="text" name="attr_ship_defense_special_effects"></div>
|
||
<div class="sheet-col sheet-ship-defense"><input class="sheet-ship-item-halfsize" type="checkbox" name="attr_ship_defense_broken"></div>
|
||
</div>
|
||
</fieldset>
|
||
</div>
|
||
<h3>Fittings</h3>
|
||
<div class="sheet-col sheet-ship-repeating-headers">
|
||
<div class="sheet-ship-weapons sheet-3colrow">
|
||
<div class="sheet-col sheet-ship-fitting"><label>Name</label></div>
|
||
<div class="sheet-col sheet-ship-fitting"><label>Special Effects</label></div>
|
||
<div class="sheet-col sheet-ship-fitting"><label class="sheet-ship-item-halfsize">Broken?</label></div>
|
||
</div>
|
||
<fieldset class="repeating_fittings repeating repeating-ship-fittings">
|
||
<div class="sheet-ship-weapons sheet-3colrow">
|
||
<div class="sheet-col sheet-ship-fitting"><input type="text" name="attr_ship_fitting_name"></div>
|
||
<div class="sheet-col sheet-ship-fitting"><input type="text" name="attr_ship_fitting_special_effects"></div>
|
||
<div class="sheet-col sheet-ship-fitting"><input class="sheet-ship-item-halfsize" type="checkbox" name="attr_ship_fitting_broken"></div>
|
||
</div>
|
||
</fieldset>
|
||
</div>
|
||
<h3>Other Notes</h3>
|
||
<div class="sheet-col sheet-ship-other-notes">
|
||
<textarea name="attr_ship_other_notes"></textarea>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="sheet-tab-content sheet-tab-character">
|
||
<div class="sheet-wrapper">
|
||
<h3>Core Stats</h3>
|
||
<div class="sheet-3colrow sheet-stats">
|
||
<div class="sheet-col">
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_name">Name</label></div>
|
||
<div class="sheet-col"><input type="text" name="attr_name" class="sheet-stats-input"></div>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_gender">Gender</label></div>
|
||
<div class="sheet-col"><input type="text" name="attr_gender" class="sheet-stats-input"></div>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_class">Class</label></div>
|
||
<div class="sheet-col">
|
||
<input type="text" name="attr_class" class="sheet-stats-input">
|
||
<input type="checkbox" class="sheet-toggle" title="show/hide" name="attr_class_ability_show" value="1">
|
||
<textarea name="attr_class_ability" style="width: 200%;" class="sheet-hide" placeholder="Class ability"></textarea>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_level">Level</label></div>
|
||
<div class="sheet-col"><input value="1" type="number" min="1" name="attr_level" class="sheet-stats-input"></div>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_xp">XP</label></div>
|
||
<div class="sheet-col"><input type="number" min="0" name="attr_xp" class="sheet-stats-input"></div>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_xp_max">Next Level XP</label></div>
|
||
<div class="sheet-col"><input type="number" min="0" name="attr_xp_max" class="sheet-stats-input"></div>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_homeworld">Homeworld</label></div>
|
||
<div class="sheet-col"><input type="text" name="attr_homeworld" class="sheet-stats-input"></div>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_background">Background</label></div>
|
||
<div class="sheet-col"><input type="text" name="attr_background" class="sheet-stats-input"></div>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-stats-label"><label for="attr_faction">Faction</label></div>
|
||
<div class="sheet-col"><input type="text" name="attr_faction" class="sheet-stats-input"></div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="sheet-col sheet-attribute-table">
|
||
<div class="sheet-row">
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th> </th>
|
||
<th><label>Base</label></th>
|
||
<th><label>Bonus</label></th>
|
||
<th><label>Modifier</label></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><span class="glyphicon glyphicon-question-sign"></span><label for="attr_str" title="Physical prowess, melee combat, carrying gear, brute forces">Strength</label></td>
|
||
<td><input type="number" name="attr_str" class="sheet-stats-half"></td>
|
||
<td><input type="number" name="attr_str_misc" class="sheet-stats-half"></td>
|
||
<td><input type="number" name="attr_str_bonus" readonly class="sheet-stats-half"></td>
|
||
</tr>
|
||
<tr>
|
||
<td><label for="attr_dex">Dexterity</label></td>
|
||
<td><input type="number" name="attr_dex" class="sheet-stats-half"></td>
|
||
<td><input type="number" name="attr_dex_misc" class="sheet-stats-half"></td>
|
||
<td><input type="number" name="attr_dex_bonus" readonly class="sheet-stats-half"></td>
|
||
</tr>
|
||
<tr>
|
||
<td><label for="attr_con">Constitution</label></td>
|
||
<td><input type="number" name="attr_con" class="sheet-stats-half"></td>
|
||
<td><input type="number" name="attr_con_misc" class="sheet-stats-half"></td>
|
||
<td><input type="number" name="attr_con_bonus" readonly class="sheet-stats-half"></td>
|
||
</tr>
|
||
<tr>
|
||
<td><label for="attr_int">Intelligence</label></td>
|
||
<td><input type="number" name="attr_int" class="sheet-stats-half"></td>
|
||
<td><input type="number" name="attr_int_misc" class="sheet-stats-half"></td>
|
||
<td><input type="number" name="attr_int_bonus" readonly class="sheet-stats-half"></td>
|
||
</tr>
|
||
<tr>
|
||
<td><label for="attr_wis">Wisdom</label></td>
|
||
<td><input type="number" name="attr_wis" class="sheet-stats-half"></td>
|
||
<td><input type="number" name="attr_wis_misc" class="sheet-stats-half"></td>
|
||
<td><input type="number" name="attr_wis_bonus" readonly class="sheet-stats-half"></td>
|
||
</tr>
|
||
<tr>
|
||
<td><label for="attr_cha">Charisma</label></td>
|
||
<td><input type="number" name="attr_cha" class="sheet-stats-half"></td>
|
||
<td><input type="number" name="attr_cha_misc" class="sheet-stats-half"></td>
|
||
<td><input type="number" name="attr_cha_bonus" readonly class="sheet-stats-half"></td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
<div class="sheet-row"> </div>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-attribute-ext-label"><label for="attr_attack_bonus">Base Attack Bonus</label></div>
|
||
<div class="sheet-col"><input type="number" name="attr_attack_bonus" class="sheet-stats-half" value="0"></div>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-attribute-ext-label"><label for="attr_innate_ac">Innate AC</label></div>
|
||
<div class="sheet-col"><input type="number" name="attr_innate_ac" class="sheet-stats-half"></div>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col sheet-attribute-ext-label"><label for="attr_AC">AC</label></div>
|
||
<div class="sheet-col"><input type="number" name="attr_AC" class="sheet-stats-half" readonly></div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="sheet-col">
|
||
<div class="sheet-row">
|
||
<label class="sheet-subhead">Hit Points</label>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<table>
|
||
<tr>
|
||
<td><label for="attr_hp">Current</label></td>
|
||
<td><input type="number" name="attr_hp" class="sheet-stats-half"></td>
|
||
</tr>
|
||
<tr>
|
||
<td><label for="attr_strain_max">Max</label></td>
|
||
<td><input type="number" name="attr_hp_max" class="sheet-stats-half"></td>
|
||
</tr>
|
||
</table>
|
||
</div>
|
||
<div class="sheet-row"> </div>
|
||
<div class="sheet-row">
|
||
<label class="sheet-subhead">System Strain</label>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<table>
|
||
<tbody>
|
||
<tr>
|
||
<td><label for="attr_strain">Base</label></td>
|
||
<td><input type="number" name="attr_strain" class="sheet-stats-half"></td>
|
||
</tr>
|
||
<tr>
|
||
<td><label for="attr_strain_max">Max</label></td>
|
||
<td><input type="number" name="attr_strain_max" readonly class="sheet-stats-half"></td>
|
||
</tr>
|
||
<tr>
|
||
<td><label for="attr_strain_perm">Perm</label></td>
|
||
<td><input type="number" name="attr_strain_perm" class="sheet-stats-half"></td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
<h3>Combat</h3>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col">
|
||
<label for="roll_initiative">Roll Initiative (Select your token first)</label>
|
||
<button type="roll" name="roll_initiative" value="&{template:initiative} {{characterName=@{name}}} {{rollValue=[[1d8+@{dex_bonus} &{tracker}]]}}" ></button>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-weapons-wrapper">
|
||
<label style="width: 105px">Weapon</label>
|
||
<label class="sheet-weapons-short" style="width: 65px">Weapon AB</label>
|
||
<label class="sheet-weapons-short" style="width: 95px">Skill</label>
|
||
<label class="sheet-weapons-short" style="width: 60px">Attribute</label>
|
||
<label class="sheet-weapons-short" style="width: 50px">Damage</label>
|
||
<label class="sheet-weapons-short" style="width: 75px">Burst?</label>
|
||
<label class="sheet-weapons-short" style="width: 100px">Add Skill to damage?</label>
|
||
<label style="width: 70px">Range</label>
|
||
<label class="sheet-weapons-short" style="width: 55px">Ammo</label>
|
||
<label class="sheet-weapons-short" style="width: 55px">Magazines</label>
|
||
<br>
|
||
<fieldset class="repeating_weapons">
|
||
<input type="text" name="attr_weapon_name" style="width: 105px">
|
||
<input type="number" name="attr_weapon_attack" value="0" style="width: 65px">
|
||
<select class="inputbox" name="attr_weapon_skill_bonus" style="width: 95px; height: 25px">
|
||
<option value="@{skill_shoot}">Shoot</option>
|
||
<option value="@{skill_punch}">Punch</option>
|
||
<option value="@{skill_stab}">Stab</option>
|
||
<option value="@{skill_telekinesis}">Telekinesis</option>
|
||
</select>
|
||
<select class="inputbox" name="attr_attribute_mod" style="width: 60px; height: 25px">
|
||
<option value="@{str_bonus}">STR</option>
|
||
<option value="@{dex_bonus}">DEX</option>
|
||
<option value="@{con_bonus}">CON</option>
|
||
<option value="@{int_bonus}">INT</option>
|
||
<option value="@{wis_bonus}">WIS</option>
|
||
<option value="@{cha_bonus}">CHA</option>
|
||
</select>
|
||
<input type="text" name="attr_weapon_damage" style="width: 50px">
|
||
<select class="inputbox" name="attr_weapon_burst" style="width: 75px; height: 25px">
|
||
<option value="0">No</option>
|
||
<option value="?{Burst|Yes, 2|No, 0}">Ask</option>
|
||
<option value="2">Always</option>
|
||
</select>
|
||
<input type="checkbox" name="attr_add_skill" value="@{weapon_skill_bonus}" style="width: 100px;">
|
||
<input type="text" name="attr_weapon_range" style="width: 70px">
|
||
<input type="number" name="attr_weapon_ammo" style="width: 55px">
|
||
<input type="number" name="attr_weapon_magazines" style="width: 55px">
|
||
<button type="roll" name="roll_weapon_to_hit" value="/me &{template:attack} {{characterName=@{name}}} {{name=@{weapon_name}}} {{rollValue=[[1d20 + @{attack_bonus}[AB] + @{weapon_attack}[Weapon AB] + [[{{@{weapon_skill_bonus},-1}>0}*(@{weapon_skill_bonus}+2) - 2]][Skill] + @{attribute_mod}[Attribute] + @{weapon_burst}[Burst] + ?{Other Modifier|0}[Modifier]]]}} {{damage=[[@{weapon_damage} + @{attribute_mod}[Attribute] + @{add_skill}[Skill] + @{weapon_burst}[Burst]]]}}" ></button>
|
||
</fieldset>
|
||
</div>
|
||
<h3>Saving Throws</h3>
|
||
<div class="sheet-3colrow sheet-saves">
|
||
<div class="sheet-col">
|
||
<label for="attr_save_physical">Physical Save</label>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<label for="attr_save_mental">Mental Save</label>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<label for="attr_save_evasion">Evasion Save</label>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-3colrow sheet-saves">
|
||
<div class="sheet-col">
|
||
<input readonly type="number" min="0" name="attr_save_physical" class="sheet-stats-save">
|
||
<button name="roll_save_physical" type="roll" value="/me &{template:save} {{rollValue=[[1d20]]}} {{save=[[@{save_physical}]]}} {{characterName=@{name}}} {{type=Physical}}"></button>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input readonly type="number" min="0" name="attr_save_mental" class="sheet-stats-save">
|
||
<button name="roll_save_mental" type="roll" value="/me &{template:save} {{rollValue=[[1d20]]}} {{save=[[@{save_mental}]]}} {{characterName=@{name}}} {{type=Mental}}"></button>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input readonly type="number" min="0" name="attr_save_evasion" class="sheet-stats-save">
|
||
<button name="roll_save_evasion" type="roll" value="/me &{template:save} {{rollValue=[[1d20]]}} {{save=[[@{save_evasion}]]}} {{characterName=@{name}}} {{type=Evasion}}"></button>
|
||
</div>
|
||
</div>
|
||
<h3>Skills</h3>
|
||
<div class="sheet-2colrow sheet-skills">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<label class="sheet-skill-label">Skill:</label>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<label class="sheet-skill-label">Level:</label>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<label class="sheet-skill-label">2d6</label>
|
||
<label class="sheet-skill-label">3d6</label>
|
||
<label class="sheet-skill-label">4d6</label>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<label class="sheet-skill-label">Skill:</label>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<label class="sheet-skill-label">Level:</label>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<label class="sheet-skill-label">2d6</label>
|
||
<label class="sheet-skill-label">3d6</label>
|
||
<label class="sheet-skill-label">4d6</label>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-2colrow sheet-skills">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col"><label for="attr_skill_administer">Administer</label></div>
|
||
<div class="sheet-col"><input type="number" min="-1" value="-1" name="attr_skill_administer"></div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input style="width: 30px" type="radio" name="attr_skill_administer_specialist" value="2d6" checked>
|
||
<input style="width: 30px" type="radio" name="attr_skill_administer_specialist" value="3d6d1">
|
||
<input style="width: 30px" type="radio" name="attr_skill_administer_specialist" value="4d6d2">
|
||
<button name="roll_skill_administer" type="roll" value="/me &{template:skill} {{type=Administer}} {{characterName=@{name}}} {{rollValue=[[@{skill_administer_specialist} + @{skill_administer} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0}]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col"><div class="sheet-2colrow">
|
||
<div class="sheet-col"><label for="attr_skill_program">Program</label></div>
|
||
<div class="sheet-col"><input type="number" min="-1" value="-1" name="attr_skill_program"></div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input style="width: 30px" type="radio" name="attr_skill_program_specialist" value="2d6" checked>
|
||
<input style="width: 30px" type="radio" name="attr_skill_program_specialist" value="3d6d1">
|
||
<input style="width: 30px" type="radio" name="attr_skill_program_specialist" value="4d6d2">
|
||
<button name="roll_skill_program" type="roll" value="/me &{template:skill} {{type=Program}} {{characterName=@{name}}} {{rollValue=[[@{skill_program_specialist} + @{skill_program} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0}]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-2colrow sheet-skills">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col"><label for="attr_skill_connect">Connect</label></div>
|
||
<div class="sheet-col"><input type="number" min="-1" value="-1" name="attr_skill_connect"></div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input style="width: 30px" type="radio" name="attr_skill_connect_specialist" value="2d6" checked>
|
||
<input style="width: 30px" type="radio" name="attr_skill_connect_specialist" value="3d6d1">
|
||
<input style="width: 30px" type="radio" name="attr_skill_connect_specialist" value="4d6d2">
|
||
<button name="roll_skill_connect" type="roll" value="/me &{template:skill} {{type=Connect}} {{characterName=@{name}}} {{rollValue=[[@{skill_connect_specialist} + @{skill_connect} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0}]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col"><label for="attr_skill_punch">Punch</label></div>
|
||
<div class="sheet-col"><input type="number" min="-1" value="-1" name="attr_skill_punch"></div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input style="width: 30px" type="radio" name="attr_skill_punch_specialist" value="2d6" checked>
|
||
<input style="width: 30px" type="radio" name="attr_skill_punch_specialist" value="3d6d1">
|
||
<input style="width: 30px" type="radio" name="attr_skill_punch_specialist" value="4d6d2">
|
||
<button name="roll_skill_punch" type="roll" value="/me &{template:skill} {{type=Punch}} {{characterName=@{name}}} {{rollValue=[[@{skill_punch_specialist} + @{skill_punch} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0}]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-2colrow sheet-skills">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col"><label for="attr_skill_exert">Exert</label></div>
|
||
<div class="sheet-col"><input type="number" min="-1" value="-1" name="attr_skill_exert"></div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input style="width: 30px" type="radio" name="attr_skill_exert_specialist" value="2d6" checked>
|
||
<input style="width: 30px" type="radio" name="attr_skill_exert_specialist" value="3d6d1">
|
||
<input style="width: 30px" type="radio" name="attr_skill_exert_specialist" value="4d6d2">
|
||
<button name="roll_skill_exert" type="roll" value="/me &{template:skill} {{type=Exert}} {{characterName=@{name}}} {{rollValue=[[@{skill_exert_specialist} + @{skill_exert} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0}]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col"><label for="attr_skill_shoot">Shoot</label></div>
|
||
<div class="sheet-col"><input type="number" min="-1" value="-1" name="attr_skill_shoot"></div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input style="width: 30px" type="radio" name="attr_skill_shoot_specialist" value="2d6" checked>
|
||
<input style="width: 30px" type="radio" name="attr_skill_shoot_specialist" value="3d6d1">
|
||
<input style="width: 30px" type="radio" name="attr_skill_shoot_specialist" value="4d6d2">
|
||
<button name="roll_skill_shoot" type="roll" value="/me &{template:skill} {{type=Shoot}} {{characterName=@{name}}} {{rollValue=[[@{skill_shoot_specialist} + @{skill_shoot} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0}]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-2colrow sheet-skills">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col"><label for="attr_skill_fix">Fix</label></div>
|
||
<div class="sheet-col"><input type="number" min="-1" value="-1" name="attr_skill_fix"></div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input style="width: 30px" type="radio" name="attr_skill_fix_specialist" value="2d6" checked>
|
||
<input style="width: 30px" type="radio" name="attr_skill_fix_specialist" value="3d6d1">
|
||
<input style="width: 30px" type="radio" name="attr_skill_fix_specialist" value="4d6d2">
|
||
<button name="roll_skill_fix" type="roll" value="/me &{template:skill} {{type=Fix}} {{characterName=@{name}}} {{rollValue=[[@{skill_fix_specialist} + @{skill_fix} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0}]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col"><label for="attr_skill_sneak">Sneak</label></div>
|
||
<div class="sheet-col"><input type="number" min="-1" value="-1" name="attr_skill_sneak"></div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input style="width: 30px" type="radio" name="attr_skill_sneak_specialist" value="2d6" checked>
|
||
<input style="width: 30px" type="radio" name="attr_skill_sneak_specialist" value="3d6d1">
|
||
<input style="width: 30px" type="radio" name="attr_skill_sneak_specialist" value="4d6d2">
|
||
<button name="roll_skill_sneak" type="roll" value="/me &{template:skill} {{type=Sneak}} {{characterName=@{name}}} {{rollValue=[[@{skill_sneak_specialist} + @{skill_sneak} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0}]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-2colrow sheet-skills">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col"><label for="attr_skill_heal">Heal</label></div>
|
||
<div class="sheet-col"><input type="number" min="-1" value="-1" name="attr_skill_heal"></div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input style="width: 30px" type="radio" name="attr_skill_heal_specialist" value="2d6" checked>
|
||
<input style="width: 30px" type="radio" name="attr_skill_heal_specialist" value="3d6d1">
|
||
<input style="width: 30px" type="radio" name="attr_skill_heal_specialist" value="4d6d2">
|
||
<button name="roll_skill_heal" type="roll" value="/me &{template:skill} {{type=Heal}} {{characterName=@{name}}} {{rollValue=[[@{skill_heal_specialist} + @{skill_heal} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0}]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col"><label for="attr_skill_stab">Stab</label></div>
|
||
<div class="sheet-col"><input type="number" min="-1" value="-1" name="attr_skill_stab"></div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input style="width: 30px" type="radio" name="attr_skill_stab_specialist" value="2d6" checked>
|
||
<input style="width: 30px" type="radio" name="attr_skill_stab_specialist" value="3d6d1">
|
||
<input style="width: 30px" type="radio" name="attr_skill_stab_specialist" value="4d6d2">
|
||
<button name="roll_skill_stab" type="roll" value="/me &{template:skill} {{type=Stab}} {{characterName=@{name}}} {{rollValue=[[@{skill_stab_specialist} + @{skill_stab} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0}]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-2colrow sheet-skills">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col"><label for="attr_skill_know">Know</label></div>
|
||
<div class="sheet-col"><input type="number" min="-1" value="-1" name="attr_skill_know"></div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input style="width: 30px" type="radio" name="attr_skill_know_specialist" value="2d6" checked>
|
||
<input style="width: 30px" type="radio" name="attr_skill_know_specialist" value="3d6d1">
|
||
<input style="width: 30px" type="radio" name="attr_skill_know_specialist" value="4d6d2">
|
||
<button name="roll_skill_know" type="roll" value="/me &{template:skill} {{type=Know}} {{characterName=@{name}}} {{rollValue=[[@{skill_know_specialist} + @{skill_know} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0}]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col"><label for="attr_skill_survive">Survive</label></div>
|
||
<div class="sheet-col"><input type="number" min="-1" value="-1" name="attr_skill_survive"></div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input style="width: 30px" type="radio" name="attr_skill_survive_specialist" value="2d6" checked>
|
||
<input style="width: 30px" type="radio" name="attr_skill_survive_specialist" value="3d6d1">
|
||
<input style="width: 30px" type="radio" name="attr_skill_survive_specialist" value="4d6d2">
|
||
<button name="roll_skill_survive" type="roll" value="/me &{template:skill} {{type=Survive}} {{characterName=@{name}}} {{rollValue=[[@{skill_survive_specialist} + @{skill_survive} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0}]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-2colrow sheet-skills">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col"><label for="attr_skill_lead">Lead</label></div>
|
||
<div class="sheet-col"><input type="number" min="-1" value="-1" name="attr_skill_lead"></div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input style="width: 30px" type="radio" name="attr_skill_lead_specialist" value="2d6" checked>
|
||
<input style="width: 30px" type="radio" name="attr_skill_lead_specialist" value="3d6d1">
|
||
<input style="width: 30px" type="radio" name="attr_skill_lead_specialist" value="4d6d2">
|
||
<button name="roll_skill_lead" type="roll" value="/me &{template:skill} {{type=Lead}} {{characterName=@{name}}} {{rollValue=[[@{skill_lead_specialist} + @{skill_lead} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0}]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col"><label for="attr_skill_talk">Talk</label></div>
|
||
<div class="sheet-col"><input type="number" min="-1" value="-1" name="attr_skill_talk"></div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input style="width: 30px" type="radio" name="attr_skill_talk_specialist" value="2d6" checked>
|
||
<input style="width: 30px" type="radio" name="attr_skill_talk_specialist" value="3d6d1">
|
||
<input style="width: 30px" type="radio" name="attr_skill_talk_specialist" value="4d6d2">
|
||
<button name="roll_skill_talk" type="roll" value="/me &{template:skill} {{type=Talk}} {{characterName=@{name}}} {{rollValue=[[@{skill_talk_specialist} + @{skill_talk} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0}]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-2colrow sheet-skills">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col"><label for="attr_skill_notice">Notice</label></div>
|
||
<div class="sheet-col"><input type="number" min="-1" value="-1" name="attr_skill_notice"></div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input style="width: 30px" type="radio" name="attr_skill_notice_specialist" value="2d6" checked>
|
||
<input style="width: 30px" type="radio" name="attr_skill_notice_specialist" value="3d6d1">
|
||
<input style="width: 30px" type="radio" name="attr_skill_notice_specialist" value="4d6d2">
|
||
<button name="roll_skill_notice" type="roll" value="/me &{template:skill} {{type=Notice}} {{characterName=@{name}}} {{rollValue=[[@{skill_notice_specialist} + @{skill_notice} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0}]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col"><label for="attr_skill_trade">Trade</label></div>
|
||
<div class="sheet-col"><input type="number" min="-1" value="-1" name="attr_skill_trade"></div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input style="width: 30px" type="radio" name="attr_skill_trade_specialist" value="2d6" checked>
|
||
<input style="width: 30px" type="radio" name="attr_skill_trade_specialist" value="3d6d1">
|
||
<input style="width: 30px" type="radio" name="attr_skill_trade_specialist" value="4d6d2">
|
||
<button name="roll_skill_trade" type="roll" value="/me &{template:skill} {{type=Trade}} {{characterName=@{name}}} {{rollValue=[[@{skill_trade_specialist} + @{skill_trade} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0}]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-2colrow sheet-skills">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col"><label for="attr_skill_perform">Perform</label></div>
|
||
<div class="sheet-col"><input type="number" min="-1" value="-1" name="attr_skill_perform"></div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input style="width: 30px" type="radio" name="attr_skill_perform_specialist" value="2d6" checked>
|
||
<input style="width: 30px" type="radio" name="attr_skill_perform_specialist" value="3d6d1">
|
||
<input style="width: 30px" type="radio" name="attr_skill_perform_specialist" value="4d6d2">
|
||
<button name="roll_skill_perform" type="roll" value="/me &{template:skill} {{type=Perform}} {{characterName=@{name}}} {{rollValue=[[@{skill_perform_specialist} + @{skill_perform} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0}]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col"><label for="attr_skill_work">Work</label></div>
|
||
<div class="sheet-col"><input type="number" min="-1" value="-1" name="attr_skill_work"></div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input style="width: 30px" type="radio" name="attr_skill_work_specialist" value="2d6" checked>
|
||
<input style="width: 30px" type="radio" name="attr_skill_work_specialist" value="3d6d1">
|
||
<input style="width: 30px" type="radio" name="attr_skill_work_specialist" value="4d6d2">
|
||
<button name="roll_skill_work" type="roll" value="/me &{template:skill} {{type=Work}} {{characterName=@{name}}} {{rollValue=[[@{skill_work_specialist} + @{skill_work} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0}]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-2colrow sheet-skills">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col"><label for="attr_skill_pilot">Pilot</label></div>
|
||
<div class="sheet-col"><input type="number" min="-1" value="-1" name="attr_skill_pilot"></div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input style="width: 30px" type="radio" name="attr_skill_pilot_specialist" value="2d6" checked>
|
||
<input style="width: 30px" type="radio" name="attr_skill_pilot_specialist" value="3d6d1">
|
||
<input style="width: 30px" type="radio" name="attr_skill_pilot_specialist" value="4d6d2">
|
||
<button name="roll_skill_pilot" type="roll" value="/me &{template:skill} {{type=Pilot}} {{characterName=@{name}}} {{rollValue=[[@{skill_pilot_specialist} + @{skill_pilot} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0}]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<label for="attr_skill_points" class="sheet-skill-points-unspent">Unspent Skill Points</label>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input type="number" min="-1" name="attr_skill_points">
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-row">
|
||
Cost to raise by 1: New Level + 1. Min level 1 for lvl 0 and 1, 3 for lvl 2, 6 for lvl 3, and 9 for lvl 4.
|
||
</div>
|
||
<h3>Psychic Skills and Techniques</h3>
|
||
<div class="sheet-2colrow sheet-skills">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<label for="attr_skill_biopsion">Biopsion</label>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input type="number" value="-1" min="-1" name="attr_skill_biopsion">
|
||
<button name="roll_skill_biopsion" type="roll" value="/me &{template:skill} {{type=Biopsion}} {{characterName=@{name}}} {{rollValue=[[ 2d6+@{skill_biopsion} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0} ]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<label for="attr_skill_metapsion">Metapsion</label>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input type="number" value="-1" min="-1" name="attr_skill_metapsion">
|
||
<button name="roll_skill_metapsion" type="roll" value="/me &{template:skill} {{type=Metapsion}} {{characterName=@{name}}} {{rollValue=[[ 2d6+@{skill_metapsion} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0} ]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-2colrow sheet-skills">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<label for="attr_skill_precognition">Precognition</label>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input type="number" value="-1" min="-1" name="attr_skill_precognition">
|
||
<button name="roll_skill_precognition" type="roll" value="/me &{template:skill} {{type=Precognition}} {{characterName=@{name}}} {{rollValue=[[ 2d6+@{skill_precognition} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0} ]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<label for="attr_skill_telekinesis">Telekinesis</label>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input type="number" value="-1" min="-1" name="attr_skill_telekinesis">
|
||
<button name="roll_skill_telekinesis" type="roll" value="/me &{template:skill} {{type=Telekinesis}} {{characterName=@{name}}} {{rollValue=[[ 2d6+@{skill_telekinesis} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0} ]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-2colrow sheet-skills">
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<label for="attr_skill_telepathy">Telepathy</label>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input type="number" value="-1" min="-1" name="attr_skill_telepathy">
|
||
<button name="roll_skill_telepathy" type="roll" value="/me &{template:skill} {{type=Telepathy}} {{characterName=@{name}}} {{rollValue=[[ 2d6+@{skill_telepathy} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0} ]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<label for="attr_skill_teleportation">Teleportation</label>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<input type="number" value="-1" min="-1" name="attr_skill_teleportation">
|
||
<button name="roll_skill_teleportation" type="roll" value="/me &{template:skill} {{type=Teleportation}} {{characterName=@{name}}} {{rollValue=[[ 2d6+@{skill_teleportation} + ?{Attribute|Str,@{str_bonus}|Int,@{int_bonus}|Dex,@{dex_bonus}|Wis,@{wis_bonus}|Con,@{con_bonus}|Cha,@{cha_bonus}|None,0} + ?{Assisted?|0} ]]}}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-row sheet-psionics-power"><label>Psionic Techniques</label></div>
|
||
<div class="sheet-row">
|
||
<fieldset class="repeating_technique">
|
||
<input type="text" name="attr_technique">
|
||
<input type="checkbox" class="sheet-toggle" title="show/hide" name="attr_technique_show" value="1">
|
||
<textarea name="attr_technique_description" class="sheet-hide" placeholder="Technique Description"></textarea>
|
||
</fieldset>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<div class="sheet-6colrow sheet-psionics-pp">
|
||
<div class="sheet-col"><label>Committed Effort Scene</label></div>
|
||
<div class="sheet-col"><input value="0" type="number" min="0" name="attr_psionics_committed_effort_scene"></div>
|
||
<div class="sheet-col"><label>Committed Effort Day</label></div>
|
||
<div class="sheet-col"><input value="0" type="number" min="0" name="attr_psionics_committed_effort_day"></div>
|
||
<div class="sheet-col"><label>Extra Effort</label></div>
|
||
<div class="sheet-col"><input value="0" type="number" min="0" name="attr_psionics_extra_effort"></div>
|
||
<div class="sheet-col"><label>Total Effort</label></div>
|
||
<div class="sheet-col"><input readonly type="number" min="0" name="attr_psionics_total_effort"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<h3>Foci</h3>
|
||
<div class="sheet-row">
|
||
<fieldset class="repeating_foci">
|
||
<div class="sheet-row sheet-gear">
|
||
<div class="sheet-col" style="width: 65%"><input style="width: 100%" type="text" name="attr_focus_name" placeholder="Focus"></div>
|
||
<div class="sheet-col" style="width: 60px"><input type="number" min="0" name="attr_focus_level" style="width: 100%" placeholder="Level"></div>
|
||
<input type="checkbox" class="sheet-toggle" title="show/hide" name="attr_focus_show" value="1">
|
||
<textarea name="attr_focus_description" class="sheet-hide" placeholder="Technique Description"></textarea>
|
||
</div>
|
||
</fieldset>
|
||
</div>
|
||
<h3>Gear</h3>
|
||
<div class="sheet-row">
|
||
<div class="sheet-col">
|
||
<div class="sheet-row sheet-gear-credits">
|
||
<div class="sheet-col"><label for="attr_credits">Credits</label></div>
|
||
<div class="sheet-col"><input type="number" min="0" name="attr_credits" class="sheet-gear-credits"></div>
|
||
<div class="sheet-col"><label for="attr_credits_owed">Credits Owed</label></div>
|
||
<div class="sheet-col"><input type="number" min="0" name="attr_credits_owed" class="sheet-gear-credits"></div>
|
||
</div>
|
||
<div class="sheet-row sheet-gear">
|
||
<div class="sheet-col"><label for="attr_gear_readied_current">Current Readied</label></div>
|
||
<div class="sheet-col"><input type="number" name="attr_gear_readied_current" value="0" readonly></div>
|
||
<div class="sheet-col"><label for="attr_gear_readied_max">Max Readied</label></div>
|
||
<div class="sheet-col"><input type="number" name="attr_gear_readied_max"></div>
|
||
<div class="sheet-col"><label for="attr_gear_stowed_current">Current Stowed</label></div>
|
||
<div class="sheet-col"><input type="number" name="attr_gear_stowed_current" value="0" readonly></div>
|
||
<div class="sheet-col"><label for="attr_gear_stowed_max">Max Stowed</label></div>
|
||
<div class="sheet-col"><input type="number" name="attr_gear_stowed_max"></div>
|
||
</div>
|
||
<div class="sheet-row sheet-gear">
|
||
<div class="sheet-col"><label class="sheet-subhead">Armor</label></div>
|
||
</div>
|
||
<div class="sheet-6colrow sheet-gear">
|
||
<div class="sheet-col"><label for="attr_armor_name">Name</label></div>
|
||
<div class="sheet-col"><input type="text" name="attr_armor_name" value=""></div>
|
||
<div class="sheet-col"><label for="attr_armor_ac">AC</label></div>
|
||
<div class="sheet-col"><input type="number" name="attr_armor_ac" value="0"></div>
|
||
<div class="sheet-col"><label for="attr_armor_enc">Encumberence</label></div>
|
||
<div class="sheet-col"><input type="number" name="attr_armor_enc" value="0"></div>
|
||
</div>
|
||
<div class="sheet-row sheet-gear" style="border-bottom: 1px solid black;">
|
||
<div class="sheet-col" style="width: 210px;"><label for="attr_gear_readied_current">Item(s)</label></div>
|
||
<div class="sheet-col" style="width: 150px"><label for="attr_gear_readied_max">Encumbrance</label></div>
|
||
<div class="sheet-col"><label for="attr_gear_stowed_current">Status</label></div>
|
||
</div>
|
||
<fieldset class="repeating_gear">
|
||
<div class="sheet-row sheet-gear">
|
||
<div class="sheet-col" style="width: 210px"><input type="text" name="attr_gear_name" placeholder="Item"></div>
|
||
<div class="sheet-col" style="width: 150px"><input type="number" min="0" name="attr_gear_encumbrance"></div>
|
||
<div class="sheet-col">
|
||
Readied <input type="radio" name="attr_gear_readied" value="1">
|
||
Stowed <input type="radio" name="attr_gear_readied" value="2">
|
||
Other <input type="radio" name="attr_gear_readied" value="0" checked>
|
||
</div>
|
||
</div>
|
||
</fieldset>
|
||
|
||
<div class="sheet-row sheet-gear">
|
||
<div class="sheet-col"><label class="sheet-subhead">Cyberware</label></div>
|
||
</div>
|
||
<fieldset class="repeating_cyberware">
|
||
<div class="sheet-row sheet-gear-cyberware">
|
||
<div class="sheet-col" style="width: 210px"><input type="text" name="attr_cyberware"></div>
|
||
</div>
|
||
</fieldset>
|
||
<div class="sheet-row sheet-gear">
|
||
<div class="sheet-col"><label class="sheet-subhead">Other Equipment</label></div>
|
||
</div>
|
||
<div class="sheet-row sheet-gear-other">
|
||
<textarea name="attr_gear_other"></textarea>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-row sheet-gear">
|
||
<div class="sheet-col"><label class="sheet-subhead">Weapons</label></div>
|
||
</div>
|
||
<div class="sheet-weapons-wrapper">
|
||
<label style="width: 105px">Weapon</label>
|
||
<label class="sheet-weapons-short" style="width: 65px">Weapon AB</label>
|
||
<label class="sheet-weapons-short" style="width: 95px">Skill</label>
|
||
<label class="sheet-weapons-short" style="width: 60px">Attribute</label>
|
||
<label class="sheet-weapons-short" style="width: 50px">Damage</label>
|
||
<label class="sheet-weapons-short" style="width: 75px">Burst?</label>
|
||
<label class="sheet-weapons-short" style="width: 100px">Add Skill to damage?</label>
|
||
<label style="width: 70px">Range</label>
|
||
<label class="sheet-weapons-short" style="width: 55px">Ammo</label>
|
||
<label class="sheet-weapons-short" style="width: 55px">Magazines</label>
|
||
<br>
|
||
<fieldset class="repeating_weapons">
|
||
<input type="text" name="attr_weapon_name" style="width: 105px">
|
||
<input type="number" name="attr_weapon_attack" value="0" style="width: 65px">
|
||
<select class="inputbox" name="attr_weapon_skill_bonus" style="width: 95px; height: 25px">
|
||
<option value="@{skill_shoot}">Shoot</option>
|
||
<option value="@{skill_punch}">Punch</option>
|
||
<option value="@{skill_stab}">Stab</option>
|
||
<option value="@{skill_telekinesis}">Telekinesis</option>
|
||
</select>
|
||
<select class="inputbox" name="attr_attribute_mod" style="width: 60px; height: 25px">
|
||
<option value="@{str_bonus}">STR</option>
|
||
<option value="@{dex_bonus}">DEX</option>
|
||
<option value="@{con_bonus}">CON</option>
|
||
<option value="@{int_bonus}">INT</option>
|
||
<option value="@{wis_bonus}">WIS</option>
|
||
<option value="@{cha_bonus}">CHA</option>
|
||
</select>
|
||
<input type="text" name="attr_weapon_damage" style="width: 50px">
|
||
<select class="inputbox" name="attr_weapon_burst" style="width: 75px; height: 25px">
|
||
<option value="0">No</option>
|
||
<option value="?{Burst|Yes, 2|No, 0}">Ask</option>
|
||
<option value="2">Always</option>
|
||
</select>
|
||
<input type="checkbox" name="attr_add_skill" value="@{weapon_skill_bonus}" style="width: 100px;">
|
||
<input type="text" name="attr_weapon_range" style="width: 70px">
|
||
<input type="number" name="attr_weapon_ammo" style="width: 55px">
|
||
<input type="number" name="attr_weapon_magazines" style="width: 55px">
|
||
<button type="roll" name="roll_weapon_to_hit" value="/me &{template:attack} {{characterName=@{name}}} {{name=@{weapon_name}}} {{rollValue=[[1d20 + @{attack_bonus}[AB] + @{weapon_attack}[Weapon AB] + [[{{@{weapon_skill_bonus},-1}>0}*(@{weapon_skill_bonus}+2) - 2]][Skill] + @{attribute_mod}[Attribute] + @{weapon_burst}[Burst] + ?{Other Modifier|0}[Modifier]]]}} {{damage=[[@{weapon_damage} + @{attribute_mod}[Attribute] + @{add_skill}[Skill] + @{weapon_burst}[Burst]]]}}" ></button>
|
||
</fieldset>
|
||
</div>
|
||
|
||
<h3>Miscellaneous</h3>
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-row sheet-misc-goal"><label>Current Goals</label></div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<div class="sheet-row sheet-misc-goal-xp"><label>XP</label></div>
|
||
</div>
|
||
</div>
|
||
<fieldset class="repeating_goals">
|
||
<div class="sheet-2colrow">
|
||
<div class="sheet-col">
|
||
<div class="sheet-row sheet-misc-goal"><input type="text" name="attr_misc_goal"></div>
|
||
</div>
|
||
<div class="sheet-col">
|
||
<div class="sheet-row sheet-misc-goal-xp"><input type="number" min="0" name="attr_misc_goal_xp"></div>
|
||
</div>
|
||
</div>
|
||
</fieldset>
|
||
<div class="sheet-row">
|
||
<label for="attr_languages" class="sheet-languages">Languages</label>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<textarea name="attr_languages" class="sheet-textarea-wide"></textarea>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<label for="attr_notes">Notes</label>
|
||
</div>
|
||
<div class="sheet-row">
|
||
<textarea name="attr_notes" class="sheet-textarea-wide"></textarea>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<script type="text/worker">
|
||
/* ---- BEGIN: TheAaronSheet.js ---- */
|
||
// Github: https://github.com/shdwjk/TheAaronSheet/blob/master/TheAaronSheet.js
|
||
// By: The Aaron, Arcane Scriptomancer
|
||
// Contact: https://app.roll20.net/users/104025/the-aaron
|
||
|
||
var TAS = TAS || (function(){
|
||
'use strict';
|
||
|
||
var version = '0.2.4',
|
||
lastUpdate = 1457098091,
|
||
|
||
loggingSettings = {
|
||
debug: {
|
||
key: 'debug',
|
||
title: 'DEBUG',
|
||
color: {
|
||
bgLabel: '#7732A2',
|
||
label: '#F2EF40',
|
||
bgText: '#FFFEB7',
|
||
text: '#7732A2'
|
||
}
|
||
},
|
||
error: {
|
||
key: 'error',
|
||
title: 'Error',
|
||
color: {
|
||
bgLabel: '#C11713',
|
||
label: 'white',
|
||
bgText: '#C11713',
|
||
text: 'white'
|
||
}
|
||
},
|
||
warn: {
|
||
key: 'warn',
|
||
title: 'Warning',
|
||
color: {
|
||
bgLabel: '#F29140',
|
||
label: 'white',
|
||
bgText: '#FFD8B7',
|
||
text: 'black'
|
||
}
|
||
},
|
||
info: {
|
||
key: 'info',
|
||
title: 'Info',
|
||
color: {
|
||
bgLabel: '#413FA9',
|
||
label: 'white',
|
||
bgText: '#B3B2EB',
|
||
text: 'black'
|
||
}
|
||
},
|
||
notice: {
|
||
key: 'notice',
|
||
title: 'Notice',
|
||
color: {
|
||
bgLabel: '#33C133',
|
||
label: 'white',
|
||
bgText: '#ADF1AD',
|
||
text: 'black'
|
||
}
|
||
},
|
||
log: {
|
||
key: 'log',
|
||
title: 'Log',
|
||
color: {
|
||
bgLabel: '#f2f240',
|
||
label: 'black',
|
||
bgText: '#ffff90',
|
||
text: 'black'
|
||
}
|
||
},
|
||
callstack: {
|
||
key: 'TAS',
|
||
title: 'function',
|
||
color: {
|
||
bgLabel: '#413FA9',
|
||
label: 'white',
|
||
bgText: '#B3B2EB',
|
||
text: 'black'
|
||
}
|
||
},
|
||
callstack_async: {
|
||
key: 'TAS',
|
||
title: 'ASYNC CALL',
|
||
color: {
|
||
bgLabel: '#413FA9',
|
||
label: 'white',
|
||
bgText: '#413FA9',
|
||
text: 'white'
|
||
}
|
||
},
|
||
TAS: {
|
||
key: 'TAS',
|
||
title: 'TAS',
|
||
color: {
|
||
bgLabel: 'grey',
|
||
label: 'black;background:linear-gradient(#304352,#d7d2cc,#d7d2cc,#d7d2cc,#304352)',
|
||
bgText: 'grey',
|
||
text: 'black;background:linear-gradient(#304352,#d7d2cc,#d7d2cc,#d7d2cc,#304352)'
|
||
}
|
||
}
|
||
},
|
||
|
||
|
||
config = {
|
||
debugMode: false,
|
||
logging: {
|
||
log: true,
|
||
notice: true,
|
||
info: true,
|
||
warn: true,
|
||
error: true,
|
||
debug: false
|
||
}
|
||
},
|
||
|
||
callstackRegistry = [],
|
||
queuedUpdates = {}, //< Used for delaying saves till the last momment.
|
||
|
||
complexType = function(o){
|
||
switch(typeof o){
|
||
case 'string':
|
||
return 'string';
|
||
case 'boolean':
|
||
return 'boolean';
|
||
case 'number':
|
||
return (_.isNaN(o) ? 'NaN' : (o.toString().match(/\./) ? 'decimal' : 'integer'));
|
||
case 'function':
|
||
return 'function: '+(o.name ? o.name+'()' : '(anonymous)');
|
||
case 'object':
|
||
return (_.isArray(o) ? 'array' : (_.isArguments(o) ? 'arguments' : ( _.isNull(o) ? 'null' : 'object')));
|
||
default:
|
||
return typeof o;
|
||
}
|
||
},
|
||
|
||
dataLogger = function(primaryLogger,secondaryLogger,data){
|
||
_.each(data,function(m){
|
||
var type = complexType(m);
|
||
switch(type){
|
||
case 'string':
|
||
primaryLogger(m);
|
||
break;
|
||
case 'undefined':
|
||
case 'null':
|
||
case 'NaN':
|
||
primaryLogger('['+type+']');
|
||
break;
|
||
case 'number':
|
||
case 'not a number':
|
||
case 'integer':
|
||
case 'decimal':
|
||
case 'boolean':
|
||
primaryLogger('['+type+']: '+m);
|
||
break;
|
||
default:
|
||
primaryLogger('['+type+']:=========================================');
|
||
secondaryLogger(m);
|
||
primaryLogger('=========================================================');
|
||
break;
|
||
}
|
||
});
|
||
},
|
||
|
||
|
||
colorLog = function(options){
|
||
var coloredLoggerFunction,
|
||
key = options.key,
|
||
label = options.title || 'TAS',
|
||
lBGColor = (options.color && options.color.bgLabel) || 'blue',
|
||
lTxtColor = (options.color && options.color.label) || 'white',
|
||
mBGColor = (options.color && options.color.bgText) || 'blue',
|
||
mTxtColor = (options.color && options.color.text) || 'white';
|
||
|
||
coloredLoggerFunction = function(message){
|
||
console.log(
|
||
'%c '+label+': %c '+message + ' ',
|
||
'background-color: '+lBGColor+';color: '+lTxtColor+'; font-weight:bold;',
|
||
'background-color: '+mBGColor+';color: '+mTxtColor+';'
|
||
);
|
||
};
|
||
return function(){
|
||
if('TAS'===key || config.logging[key]){
|
||
dataLogger(coloredLoggerFunction,function(m){console.log(m);},_.toArray(arguments));
|
||
}
|
||
};
|
||
},
|
||
|
||
logDebug = colorLog(loggingSettings.debug),
|
||
logError = colorLog(loggingSettings.error),
|
||
logWarn = colorLog(loggingSettings.warn),
|
||
logInfo = colorLog(loggingSettings.info),
|
||
logNotice = colorLog(loggingSettings.notice),
|
||
logLog = colorLog(loggingSettings.log),
|
||
log = colorLog(loggingSettings.TAS),
|
||
logCS = colorLog(loggingSettings.callstack),
|
||
logCSA = colorLog(loggingSettings.callstack_async),
|
||
|
||
registerCallstack = function(callstack,label){
|
||
var idx=_.findIndex(callstackRegistry,function(o){
|
||
return (_.difference(o.stack,callstack).length === _.difference(callstack,o.stack).length) &&
|
||
_.difference(o.stack,callstack).length === 0 &&
|
||
o.label === label;
|
||
});
|
||
if(-1 === idx){
|
||
idx=callstackRegistry.length;
|
||
callstackRegistry.push({
|
||
stack: callstack,
|
||
label: label
|
||
});
|
||
}
|
||
return idx;
|
||
},
|
||
|
||
setConfigOption = function(options){
|
||
var newconf =_.defaults(options,config);
|
||
newconf.logging=_.defaults(
|
||
(options && options.logging)||{},
|
||
config.logging
|
||
);
|
||
config=newconf;
|
||
},
|
||
|
||
debugMode = function(){
|
||
config.logging.debug=true;
|
||
config.debugMode = true;
|
||
},
|
||
|
||
getCallstack = function(){
|
||
var e = new Error('dummy'),
|
||
stack = _.map(_.rest(e.stack.replace(/^[^\(]+?[\n$]/gm, '')
|
||
.replace(/^\s+at\s+/gm, '')
|
||
.replace(/^Object.<anonymous>\s*\(/gm, '{anonymous}()@')
|
||
.split('\n')),function(l){
|
||
return l.replace(/\s+.*$/,'');
|
||
});
|
||
return stack;
|
||
},
|
||
logCallstackSub = function(cs){
|
||
var matches, csa;
|
||
_.find(cs,function(line){
|
||
matches = line.match(/TAS_CALLSTACK_(\d+)/);
|
||
if(matches){
|
||
csa=callstackRegistry[matches[1]];
|
||
logCSA( '===================='+(csa.label ? '> '+csa.label+' <' : '')+'====================');
|
||
logCallstackSub(csa.stack);
|
||
return true;
|
||
}
|
||
logCS(line);
|
||
return false;
|
||
});
|
||
},
|
||
logCallstack = function(){
|
||
var cs;
|
||
if(config.debugMode){
|
||
cs = getCallstack();
|
||
cs.shift();
|
||
log('==============================> CALLSTACK <==============================');
|
||
logCallstackSub(cs);
|
||
log('=========================================================================');
|
||
}
|
||
},
|
||
|
||
|
||
wrapCallback = function (label, callback, context){
|
||
var callstack;
|
||
if('function' === typeof label){
|
||
context=callback;
|
||
callback=label;
|
||
label=undefined;
|
||
}
|
||
if(!config.debugMode){
|
||
return (function(cb,ctx){
|
||
return function(){
|
||
cb.apply(ctx||{},arguments);
|
||
};
|
||
}(callback,context));
|
||
}
|
||
|
||
callstack = getCallstack();
|
||
callstack.shift();
|
||
|
||
return (function(cb,ctx,cs,lbl){
|
||
var ctxref=registerCallstack(cs,lbl);
|
||
|
||
/*jshint -W054 */
|
||
return new Function('cb','ctx','TASlog',
|
||
"return function TAS_CALLSTACK_"+ctxref+"(){"+
|
||
"TASlog('Entering: '+(cb.name||'(anonymous function)'));"+
|
||
"cb.apply(ctx||{},arguments);"+
|
||
"TASlog('Exiting: '+(cb.name||'(anonymous function)'));"+
|
||
"};")(cb,ctx,log);
|
||
/*jshint +W054 */
|
||
}(callback,context,callstack,label));
|
||
},
|
||
|
||
|
||
prepareUpdate = function( attribute, value ){
|
||
queuedUpdates[attribute]=value;
|
||
},
|
||
|
||
applyQueuedUpdates = function() {
|
||
setAttrs(queuedUpdates);
|
||
queuedUpdates = {};
|
||
},
|
||
|
||
namesFromArgs = function(args,base){
|
||
return _.chain(args)
|
||
.reduce(function(memo,attr){
|
||
if('string' === typeof attr) {
|
||
memo.push(attr);
|
||
} else if(_.isArray(args) || _.isArguments(args)){
|
||
memo = namesFromArgs(attr,memo);
|
||
}
|
||
return memo;
|
||
},(_.isArray(base) && base) || [])
|
||
.uniq()
|
||
.value();
|
||
},
|
||
|
||
addId = function(obj,value){
|
||
Object.defineProperty(obj,'id',{
|
||
value: value,
|
||
writeable: false,
|
||
enumerable: false
|
||
});
|
||
},
|
||
|
||
addProp = function(obj,prop,value,fullname){
|
||
(function(){
|
||
var pname=(_.contains(['S','F','I','D'],prop) ? '_'+prop : prop),
|
||
full_pname = fullname || prop,
|
||
pvalue=value;
|
||
|
||
_.each(['S','I','F'],function(p){
|
||
if( !_.has(obj,p)){
|
||
Object.defineProperty(obj, p, {
|
||
value: {},
|
||
enumerable: false,
|
||
readonly: true
|
||
});
|
||
}
|
||
});
|
||
if( !_.has(obj,'D')){
|
||
Object.defineProperty(obj, 'D', {
|
||
value: _.reduce(_.range(10),function(m,d){
|
||
Object.defineProperty(m, d, {
|
||
value: {},
|
||
enumerable: true,
|
||
readonly: true
|
||
});
|
||
return m;
|
||
},{}),
|
||
enumerable: false,
|
||
readonly: true
|
||
});
|
||
}
|
||
|
||
|
||
// Raw value
|
||
Object.defineProperty(obj, pname, {
|
||
enumerable: true,
|
||
set: function(v){
|
||
if(v!==pvalue) {
|
||
pvalue=v;
|
||
prepareUpdate(full_pname,v);
|
||
}
|
||
},
|
||
get: function(){
|
||
return pvalue;
|
||
}
|
||
});
|
||
|
||
// string value
|
||
Object.defineProperty(obj.S, pname, {
|
||
enumerable: true,
|
||
set: function(v){
|
||
var val=v.toString();
|
||
if(val !== pvalue) {
|
||
pvalue=val;
|
||
prepareUpdate(full_pname,val);
|
||
}
|
||
},
|
||
get: function(){
|
||
return pvalue.toString();
|
||
}
|
||
});
|
||
|
||
// int value
|
||
Object.defineProperty(obj.I, pname, {
|
||
enumerable: true,
|
||
set: function(v){
|
||
var val=parseInt(v,10) || 0;
|
||
if(val !== pvalue){
|
||
pvalue=val;
|
||
prepareUpdate(full_pname,val);
|
||
}
|
||
},
|
||
get: function(){
|
||
return parseInt(pvalue,10) || 0;
|
||
}
|
||
});
|
||
|
||
// float value
|
||
Object.defineProperty(obj.F, pname, {
|
||
enumerable: true,
|
||
set: function(v){
|
||
var val=parseFloat(v) || 0;
|
||
if(val !== pvalue) {
|
||
pvalue=val;
|
||
prepareUpdate(full_pname,val);
|
||
}
|
||
},
|
||
get: function(){
|
||
return parseFloat(pvalue) || 0;
|
||
}
|
||
});
|
||
_.each(_.range(10),function(d){
|
||
Object.defineProperty(obj.D[d], pname, {
|
||
enumerable: true,
|
||
set: function(v){
|
||
var val=(parseFloat(v) || 0).toFixed(d);
|
||
if(val !== pvalue){
|
||
pvalue=val;
|
||
prepareUpdate(full_pname,val);
|
||
}
|
||
},
|
||
get: function(){
|
||
return (parseFloat(pvalue) || 0).toFixed(d);
|
||
}
|
||
});
|
||
});
|
||
|
||
}());
|
||
},
|
||
|
||
repeating = function( section ) {
|
||
return (function(s){
|
||
var sectionName = s,
|
||
attrNames = [],
|
||
fieldNames = [],
|
||
operations = [],
|
||
after = [],
|
||
|
||
repAttrs = function TAS_Repeating_Attrs(){
|
||
attrNames = namesFromArgs(arguments,attrNames);
|
||
return this;
|
||
},
|
||
repFields = function TAS_Repeating_Fields(){
|
||
fieldNames = namesFromArgs(arguments,fieldNames);
|
||
return this;
|
||
},
|
||
repReduce = function TAS_Repeating_Reduce(func, initial, final, context) {
|
||
operations.push({
|
||
type: 'reduce',
|
||
func: (func && _.isFunction(func) && func) || _.noop,
|
||
memo: (_.isUndefined(initial) && 0) || initial,
|
||
final: (final && _.isFunction(final) && final) || _.noop,
|
||
context: context || {}
|
||
});
|
||
return this;
|
||
},
|
||
repMap = function TAS_Repeating_Map(func, final, context) {
|
||
operations.push({
|
||
type: 'map',
|
||
func: (func && _.isFunction(func) && func) || _.noop,
|
||
final: (final && _.isFunction(final) && final) || _.noop,
|
||
context: context || {}
|
||
});
|
||
return this;
|
||
},
|
||
repEach = function TAS_Repeating_Each(func, final, context) {
|
||
operations.push({
|
||
type: 'each',
|
||
func: (func && _.isFunction(func) && func) || _.noop,
|
||
final: (final && _.isFunction(final) && final) || _.noop,
|
||
context: context || {}
|
||
});
|
||
return this;
|
||
},
|
||
repTap = function TAS_Repeating_Tap(final, context) {
|
||
operations.push({
|
||
type: 'tap',
|
||
final: (final && _.isFunction(final) && final) || _.noop,
|
||
context: context || {}
|
||
});
|
||
return this;
|
||
},
|
||
repAfter = function TAS_Repeating_After(callback,context) {
|
||
after.push({
|
||
callback: (callback && _.isFunction(callback) && callback) || _.noop,
|
||
context: context || {}
|
||
});
|
||
return this;
|
||
},
|
||
repExecute = function TAS_Repeating_Execute(callback,context){
|
||
var rowSet = {},
|
||
attrSet = {},
|
||
fieldIds = [],
|
||
fullFieldNames = [];
|
||
|
||
repAfter(callback,context);
|
||
|
||
// call each operation per row.
|
||
// call each operation's final
|
||
getSectionIDs("repeating_"+sectionName,function(ids){
|
||
fieldIds = ids;
|
||
fullFieldNames = _.reduce(fieldIds,function(memo,id){
|
||
return memo.concat(_.map(fieldNames,function(name){
|
||
return 'repeating_'+sectionName+'_'+id+'_'+name;
|
||
}));
|
||
},[]);
|
||
getAttrs( _.uniq(attrNames.concat(fullFieldNames)), function(values){
|
||
_.each(attrNames,function(aname){
|
||
if(values.hasOwnProperty(aname)){
|
||
addProp(attrSet,aname,values[aname]);
|
||
}
|
||
});
|
||
|
||
rowSet = _.reduce(fieldIds,function(memo,id){
|
||
var r={};
|
||
addId(r,id);
|
||
_.each(fieldNames,function(name){
|
||
var fn = 'repeating_'+sectionName+'_'+id+'_'+name;
|
||
addProp(r,name,values[fn],fn);
|
||
});
|
||
|
||
memo[id]=r;
|
||
|
||
return memo;
|
||
},{});
|
||
|
||
_.each(operations,function(op){
|
||
var res;
|
||
switch(op.type){
|
||
case 'tap':
|
||
_.bind(op.final,op.context,rowSet,attrSet)();
|
||
break;
|
||
|
||
case 'each':
|
||
_.each(rowSet,function(r){
|
||
_.bind(op.func,op.context,r,attrSet,r.id,rowSet)();
|
||
});
|
||
_.bind(op.final,op.context,rowSet,attrSet)();
|
||
break;
|
||
|
||
case 'map':
|
||
res = _.map(rowSet,function(r){
|
||
return _.bind(op.func,op.context,r,attrSet,r.id,rowSet)();
|
||
});
|
||
_.bind(op.final,op.context,res,rowSet,attrSet)();
|
||
break;
|
||
|
||
case 'reduce':
|
||
res = op.memo;
|
||
_.each(rowSet,function(r){
|
||
res = _.bind(op.func,op.context,res,r,attrSet,r.id,rowSet)();
|
||
});
|
||
_.bind(op.final,op.context,res,rowSet,attrSet)();
|
||
break;
|
||
}
|
||
});
|
||
|
||
// finalize attrs
|
||
applyQueuedUpdates();
|
||
_.each(after,function(op){
|
||
_.bind(op.callback,op.context)();
|
||
});
|
||
});
|
||
});
|
||
};
|
||
|
||
return {
|
||
attrs: repAttrs,
|
||
attr: repAttrs,
|
||
|
||
column: repFields,
|
||
columns: repFields,
|
||
field: repFields,
|
||
fields: repFields,
|
||
|
||
reduce: repReduce,
|
||
inject: repReduce,
|
||
foldl: repReduce,
|
||
|
||
map: repMap,
|
||
collect: repMap,
|
||
|
||
each: repEach,
|
||
forEach: repEach,
|
||
|
||
tap: repTap,
|
||
'do': repTap,
|
||
|
||
after: repAfter,
|
||
last: repAfter,
|
||
done: repAfter,
|
||
|
||
execute: repExecute,
|
||
go: repExecute,
|
||
run: repExecute
|
||
};
|
||
}(section));
|
||
},
|
||
|
||
|
||
repeatingSimpleSum = function(section, field, destination){
|
||
repeating(section)
|
||
.attr(destination)
|
||
.field(field)
|
||
.reduce(function(m,r){
|
||
return m + (r.F[field]);
|
||
},0,function(t,r,a){
|
||
a.S[destination]=t;
|
||
})
|
||
.execute();
|
||
};
|
||
|
||
console.log('%c•.¸¸.•*´¨`*•.¸¸.•*´¨`*•.¸ The Aaron Sheet v'+version+' ¸.•*´¨`*•.¸¸.•*´¨`*•.¸¸.•','background: linear-gradient(to right,green,white,white,green); color:black;text-shadow: 0 0 8px white;');
|
||
console.log('%c•.¸¸.•*´¨`*•.¸¸.•*´¨`*•.¸ Last update: '+(new Date(lastUpdate*1000))+' ¸.•*´¨`*•.¸¸.•*´¨`*•.¸¸.•','background: linear-gradient(to right,green,white,white,green); color:black;text-shadow: 0 0 8px white;');
|
||
|
||
|
||
return {
|
||
/* Repeating Sections */
|
||
repeatingSimpleSum: repeatingSimpleSum,
|
||
repeating: repeating,
|
||
|
||
/* Configuration */
|
||
config: setConfigOption,
|
||
|
||
/* Debugging */
|
||
callback: wrapCallback,
|
||
callstack: logCallstack,
|
||
debugMode: debugMode,
|
||
_fn: wrapCallback,
|
||
|
||
/* Logging */
|
||
debug: logDebug,
|
||
error: logError,
|
||
warn: logWarn,
|
||
info: logInfo,
|
||
notice: logNotice,
|
||
log: logLog
|
||
};
|
||
}());
|
||
/* ---- END: TheAaronSheet.js ---- */
|
||
|
||
/**
|
||
* Events
|
||
*/
|
||
on("sheet:opened", function() {
|
||
validateAttrMods();
|
||
calculateMaxStrain();
|
||
validateStrain();
|
||
validateGear();
|
||
migrateTechniques();
|
||
migrateCyberware();
|
||
});
|
||
|
||
on("change:str change:int change:dex change:wis change:con change:cha", function(e) {
|
||
var attr = e.sourceAttribute;
|
||
calculateMod([attr]);
|
||
|
||
console.log(attr);
|
||
if (attr === 'con') {
|
||
calculateMaxStrain();
|
||
}
|
||
});
|
||
|
||
on("change:str_misc change:int_misc change:dex_misc change:wis_misc change:con_misc change:cha_misc", function(e) {
|
||
var attr = e.sourceAttribute.substr(0,3);
|
||
calculateMod([attr]);
|
||
});
|
||
|
||
on("change:strain", function() {
|
||
validateStrain();
|
||
});
|
||
|
||
on("change:strain_perm", function() {
|
||
validateStrain();
|
||
});
|
||
|
||
on("change:gear_readied_max", function() {
|
||
validateReadiedMax();
|
||
});
|
||
|
||
on("change:level", function() {
|
||
calculateSaves();
|
||
});
|
||
|
||
on("change:skill_biopsion change:skill_precognition change:skill_telepathy change:skill_teleportation, change:skill_telekinesis change:skill_metapsion change:psionics_extra_effort", function() {
|
||
calculateEffort();
|
||
})
|
||
|
||
on("change:armor_ac change:innate_ac", function() {
|
||
calculateAC();
|
||
});
|
||
|
||
on("change:repeating_gear", function() {
|
||
getAttrs(["gear_readied_current","gear_stowed_current"], function(v) {
|
||
setAttrs({gear_readied_current: parseInt(0)});
|
||
setAttrs({gear_stowed_current: parseInt(0)});
|
||
});
|
||
|
||
TAS.repeating("gear")
|
||
.attrs("gear_readied_current", "gear_stowed_current")
|
||
.fields("gear_encumbrance", "gear_readied")
|
||
.map(function(row, attrSet, id, rowSet) {
|
||
if (parseInt(row.gear_readied) === 1) {
|
||
attrSet.gear_readied_current += parseInt(row.gear_encumbrance);
|
||
} else if (parseInt(row.gear_readied) === 2){
|
||
attrSet.gear_stowed_current += parseInt(row.gear_encumbrance);
|
||
}
|
||
})
|
||
.execute();
|
||
});
|
||
|
||
/**
|
||
* Calculations
|
||
*/
|
||
calculateSaves = function() {
|
||
getAttrs(["str_bonus", "con_bonus", "cha_bonus", "wis_bonus", "dex_bonus", "int_bonus", "level"], function (v) {
|
||
setAttrs({
|
||
save_physical: 16 - v.level - Math.max(v.str_bonus, v.con_bonus),
|
||
save_mental: 16 - v.level - Math.max(v.cha_bonus, v.wis_bonus),
|
||
save_evasion: 16 - v.level - Math.max(v.int_bonus, v.dex_bonus)
|
||
});
|
||
});
|
||
}
|
||
calculateEffort = function() {
|
||
getAttrs(["wis_bonus", "con_bonus", "psionics_extra_effort", "skill_biopsion", "skill_precognition", "skill_telepathy", "skill_teleportation", "skill_telekinesis", "skill_metapsion"], function (v) {
|
||
setAttrs({
|
||
psionics_total_effort: 1 + Math.max(v.wis_bonus, v.con_bonus) + Math.max(v.skill_biopsion, v.skill_precognition, v.skill_telepathy, v.skill_teleportation, v.skill_telekinesis, v.skill_metapsion) + parseInt(v.psionics_extra_effort, 10)
|
||
});
|
||
});
|
||
}
|
||
calculateAC = function() {
|
||
getAttrs(["dex_bonus", "armor_ac", "innate_ac"], function (v) {
|
||
if (v.innate_ac === '' || v.innate_ac === undefined) {
|
||
v.innate_ac = 10;
|
||
}
|
||
setAttrs({
|
||
AC: Math.max(10, parseInt(v.armor_ac, 10), parseInt(v.innate_ac, 10)) + parseInt(v.dex_bonus)
|
||
});
|
||
});
|
||
}
|
||
calculateMod = function(attributes) {
|
||
attributes.map(function(attr) {
|
||
var attrModMisc = attr + '_misc';
|
||
|
||
getAttrs([attr, attrModMisc], function(v) {
|
||
var attrModName = attr + '_bonus';
|
||
var updatedVal = {};
|
||
|
||
if (v[attr] >= 18) {
|
||
updatedVal[attrModName] = 2;
|
||
} else if (v[attr] >= 14 && v[attr] <= 17) {
|
||
updatedVal[attrModName] = 1;
|
||
} else if (v[attr] >= 4 && v[attr] <= 7) {
|
||
updatedVal[attrModName] = -1;
|
||
} else if (v[attr] <= 3) {
|
||
updatedVal[attrModName] = -2;
|
||
} else {
|
||
updatedVal[attrModName] = 0
|
||
}
|
||
|
||
if (v[attrModMisc] === '' || v[attrModMisc] === undefined) {
|
||
v[attrModMisc] = 0;
|
||
}
|
||
updatedVal[attrModName] += parseInt(v[attrModMisc]);
|
||
setAttrs(updatedVal);
|
||
calculateSaves();
|
||
calculateEffort();
|
||
calculateAC();
|
||
});
|
||
});
|
||
}
|
||
|
||
calculateMaxStrain = function() {
|
||
getAttrs(['con'], function(v) {
|
||
setAttrs({strain_max: parseInt(v.con)});
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Validations
|
||
*/
|
||
validateAttrMods = function() {
|
||
calculateMod(['str', 'int', 'dex', 'wis', 'con', 'cha']);
|
||
}
|
||
|
||
validateStrain = function() {
|
||
getAttrs(["strain", "strain_perm", "strain_max"], function(v) {
|
||
if (!v.strain || (!v.strain_perm && !v.strain_max)) return false;
|
||
|
||
v.strain = +v.strain;
|
||
if (v.strain_perm) v.strain_perm = +v.strain_perm;
|
||
if (v.strain_max) v.strain_max = +v.strain_max;
|
||
|
||
if (v.strain_perm && v.strain < v.strain_perm) {
|
||
setAttrs({strain: v.strain_perm});
|
||
} else if (v.strain_max && v.strain > v.strain_max) {
|
||
setAttrs({strain: v.strain_max});
|
||
}
|
||
});
|
||
}
|
||
|
||
validateGear = function() {
|
||
validateReadiedMax();
|
||
validateStowedMax();
|
||
}
|
||
|
||
validateReadiedMax = function() {
|
||
getAttrs(["str","gear_readied_max"], function(v) {
|
||
if (!v.str) return false;
|
||
|
||
v.str = +v.str;
|
||
if (v.gear_readied_max) v.gear_readied_max = +v.gear_readied_max;
|
||
|
||
readied_max = Math.floor(v.str / 2);
|
||
if (readied_max === v.gear_readied_max) return false;
|
||
|
||
setAttrs({gear_readied_max: readied_max});
|
||
});
|
||
}
|
||
|
||
validateStowedMax = function() {
|
||
getAttrs(["str","gear_stowed_max"], function(v) {
|
||
if (!v.str) return false;
|
||
|
||
v.str = +v.str;
|
||
if (v.gear_stowed_max) v.gear_stowed_max = +v.gear_stowed_max;
|
||
|
||
stowed_max = v.str;
|
||
if (stowed_max === v.gear_stowed_max) return false;
|
||
|
||
setAttrs({gear_stowed_max: stowed_max});
|
||
});
|
||
}
|
||
/**
|
||
* Migrations
|
||
*/
|
||
|
||
migrateTechniques = function () {
|
||
console.log("Migrate started");
|
||
var technique, i, newRow, newRowId, newRowAttrs = {};
|
||
getAttrs(['psionics_mastered_1', 'psionics_mastered_2', 'psionics_mastered_3', 'psionics_mastered_4', 'psionics_mastered_5', 'psionics_mastered_6', 'psionics_mastered_7', 'psionics_mastered_8'], function (values) {
|
||
console.log(values);
|
||
for (i = 1; i < 9; i++){
|
||
technique = values["psionics_mastered_" + i];
|
||
console.log(technique);
|
||
if (technique !== "" && typeof technique === 'string') {
|
||
console.log("In need of update");
|
||
newRowId = generateRowID();
|
||
console.log(newRowId);
|
||
newRow = "repeating_technique_" + newRowId + "_technique";
|
||
console.log(newRow);
|
||
newRowAttrs[newRow] = technique;
|
||
console.log(newRowAttrs);
|
||
setAttrs(newRowAttrs, function (values) {
|
||
console.log("updated");
|
||
});
|
||
newRow = "psionics_mastered_" + i;
|
||
newRowAttrs[newRow] = "";
|
||
setAttrs(newRowAttrs);
|
||
} else {
|
||
console.log("no update");
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
migrateCyberware = function () {
|
||
console.log("Migrate started");
|
||
var cyberware, i, newRow, newRowId, newRowAttrs = {};
|
||
getAttrs(['cyberware_1', 'cyberware_2', 'cyberware_3', 'cyberware_4'], function (values) {
|
||
console.log(values);
|
||
for (i = 1; i < 5; i++){
|
||
cyberware = values["cyberware_" + i];
|
||
console.log(cyberware);
|
||
if (cyberware !== "" && typeof cyberware === 'string') {
|
||
console.log("In need of update");
|
||
newRowId = generateRowID();
|
||
console.log(newRowId);
|
||
newRow = "repeating_cyberware_" + newRowId + "_cyberware";
|
||
console.log(newRow);
|
||
newRowAttrs[newRow] = cyberware;
|
||
console.log(newRowAttrs);
|
||
setAttrs(newRowAttrs, function (values) {
|
||
console.log("updated");
|
||
});
|
||
newRow = "cyberware_" + i;
|
||
newRowAttrs[newRow] = "";
|
||
setAttrs(newRowAttrs);
|
||
} else {
|
||
console.log("no update");
|
||
}
|
||
}
|
||
});
|
||
}
|
||
</script>
|