mirror of
https://github.com/Nighthawk42/roll20-character-sheets.git
synced 2026-08-30 11:42:29 +00:00
2386 lines
91 KiB
HTML
2386 lines
91 KiB
HTML
<div class="sheet-wrapper">
|
|
<div class="sheet-header1">
|
|
<div class="sheet-input-group sheet-input-group-char-name">
|
|
<div class="sheet-lbl1 sheet-char-name">Character Name:</div>
|
|
<input type="text" name="attr_character_name"
|
|
class="sheet-header1-input"
|
|
style="height: 30px;"
|
|
placeholder="need a name" >
|
|
</div>
|
|
<div class="sheet-input-group sheet-input-group-type">
|
|
<span class="sheet-lbl1">Type:</span>
|
|
<select class="sheet-select sheet-select-type"
|
|
name="attr_char_type">
|
|
<option value="F">Fighter</option>
|
|
<option value="T">Thief</option>
|
|
<option value="M">Magician</option>
|
|
<option value="A">Alchemist</option>
|
|
<option value="P">Priest</option>
|
|
</select>
|
|
</div>
|
|
<div class="sheet-input-group sheet-input-group-race">
|
|
<span class="sheet-lbl1">Race:</span>
|
|
<select name="attr_char_race" id="select_char_race"
|
|
class="sheet-select">
|
|
<option value="M">Man</option>
|
|
<option value="D">Dwarf</option>
|
|
<option value="E">Elf</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<div class="sheet-tab-area">
|
|
<input type="radio" class="sheet-tab sheet-tab1"
|
|
name="attr_core-tab" value="1" id="tab1"
|
|
title="Stats" checked="checked"/>
|
|
<label class="sheet-tab sheet-tab1" for="tab1"
|
|
style='line-height: 20px;'>
|
|
Stats</label>
|
|
|
|
<input type="radio" class="sheet-tab sheet-tab2"
|
|
name="attr_core-tab" value="2" id="tab2"
|
|
title="Equipment/Notes" />
|
|
<label class="sheet-tab sheet-tab2"
|
|
for="tab2"
|
|
style='line-height: 20px;'>
|
|
Equipment / Notes</label>
|
|
|
|
<input type="radio" class="sheet-tab sheet-tab3"
|
|
name="attr_core-tab" value="3" id="tab3"
|
|
title="Experience" />
|
|
<label class="sheet-tab sheet-tab3"
|
|
for="tab3"
|
|
style='line-height: 20px;'>
|
|
Experience</label>
|
|
|
|
<!-- ====== Stats panel view ======= -->
|
|
<div class="sheet-tab-view1 sheet-tab-view">
|
|
<div class="sheet-stats-panel-view">
|
|
<div class="sheet-flexr sheet-jcsa sheet-stats-tlquad">
|
|
<div class="sheet-flexc sheet-jcfs sheet-panel-col">
|
|
<div class="sheet-input-group2">
|
|
<div class="sheet-lbl2">Strength:</div>
|
|
<input type="text" class="sheet-input2" name="attr_char_str">
|
|
</div>
|
|
|
|
<div class="sheet-input-group2">
|
|
<div class="sheet-lbl2">Intelligence:</div>
|
|
<input type="text" class="sheet-input2" name="attr_char_int">
|
|
</div>
|
|
|
|
<div class="sheet-input-group2">
|
|
<div class="sheet-lbl2">Dexterity:</div>
|
|
<input type="text" class="sheet-input2" name="attr_char_dex">
|
|
</div>
|
|
|
|
<div class="sheet-input-group2">
|
|
<div class="sheet-lbl2">Attack Lvl:</div>
|
|
<input type="text" class="sheet-input2" name="attr_al"
|
|
value="1">
|
|
<input type="hidden" name="attr_al_base" value="1">
|
|
<input type="hidden" name="attr_al_f" value="1">
|
|
<input type="hidden" name="attr_al_t" value="1">
|
|
<input type="hidden" name="attr_al_m" value="1">
|
|
<input type="hidden" name="attr_al_a" value="1">
|
|
<input type="hidden" name="attr_al_p" value="1">
|
|
</div>
|
|
|
|
<div class="sheet-input-group2">
|
|
<div class="sheet-lbl2">#of Attacks:</div>
|
|
<input type="text" class="sheet-input2" name="attr_numattacks">
|
|
</div>
|
|
|
|
<div class="sheet-row-spacer"></div>
|
|
|
|
<div class="sheet-flexr sheet-jcc" style="margin-top: 5px;">
|
|
<span class="sheet-info-col-lbl">Tactics:</span>
|
|
<input type="checkbox" name="attr_tactics"
|
|
class="sheet-cb-tactics">
|
|
</div>
|
|
|
|
|
|
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<span class="sheet-info-col-lbl">On a horse?:</span>
|
|
<input type="checkbox" name="attr_onhorse"
|
|
class="sheet-cb-onhorse">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<span class="sheet-info-col-lbl">Higher ground?:</span>
|
|
<input type="checkbox" name="attr_higherground"
|
|
class="sheet-cb-higherground">
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="sheet-flexc sheet-jcfs sheet-panel-col">
|
|
<div class="sheet-col-header">
|
|
Life Points
|
|
</div>
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<span class="">Base</span>
|
|
<input class="sheet-perm-value sheet-input2"
|
|
name="attr_lp_base" readonly/>
|
|
</div>
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<div class="sheet-flexc sheet-jcfs">
|
|
<input type="text" name="attr_lp"
|
|
class="sheet-input-lp">
|
|
<input type="hidden" name="attr_lp_max">
|
|
</div>
|
|
<div class="sheet-flexc sheet-jcsa">
|
|
<button type="action" name="act_lpadd"
|
|
class="sheet-btns-lp">
|
|
<span class="sheet-btn-lp-add sheet-btn-up">{</span>
|
|
</button>
|
|
<button type="action" name="act_lpminus"
|
|
class="sheet-btns-lp ">
|
|
<span class="sheet-btn-lp-minus sheet-btn-down">}</span>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
<div class="sheet-flexc sheet-jcfs sheet-panel-col">
|
|
|
|
<div class="sheet-col-header">
|
|
Brawl Strength
|
|
</div>
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<span class="">Base</span>
|
|
<input type="text" name="attr_bs_base"
|
|
class="sheet-perm-value sheet-input2"
|
|
readonly>
|
|
</div>
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<div class="sheet-flexc sheet-jcfs">
|
|
<input type="text" name="attr_bs"
|
|
class="sheet-input-bs sheet-input-bs">
|
|
<input type="hidden" name="attr_bs_max">
|
|
</div>
|
|
<div class="sheet-flexc sheet-jcsa">
|
|
<button type="action" name="act_bsadd"
|
|
class="sheet-btns-bs">
|
|
<span class="sheet-btn-bs-add sheet-btn-up">{</span>
|
|
</button>
|
|
<button type="action" name="act_bsminus"
|
|
class="sheet-btns-bs">
|
|
<span class="sheet-btn-down sheet-btn-bs-minus">}</span>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="sheet-row-spacer"></div>
|
|
|
|
<div class="sheet-col-header"
|
|
style="margin-top: 5px;">
|
|
Run Speeds
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<span class="sheet-info-col-lbl-sm"
|
|
style="">Full Load:</span>
|
|
<input type="text" name="attr_full_load"
|
|
class="sheet-perm-value sheet-input2-sm" readonly >
|
|
<span class="sheet-info-col-lbl-sm"
|
|
style="">lbs</span>
|
|
<input type="hidden" name="attr_run_idx">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<span class="sheet-info-col-lbl-sm"
|
|
style="">Load:</span>
|
|
<select name="attr_load_cat" id="select_load_cat"
|
|
class="sheet-select-load-cat">
|
|
<option value="no">No</option>
|
|
<option value="half">Half</option>
|
|
<option value="full">Full</option>
|
|
</select>
|
|
</div>
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<span class="sheet-info-col-lbl-sm"
|
|
style="">Max run:</span>
|
|
<input type="text" name="attr_max_run"
|
|
class="sheet-perm-value sheet-input2-sm" readonly>
|
|
<span class="sheet-info-col-lbl-sm"
|
|
style="">mph</span>
|
|
</div>
|
|
</div>
|
|
</div> <!-- end tlquad -->
|
|
|
|
<div class="sheet-flexr sheet-jcsa sheet-stats-trquad">
|
|
<div class="sheet-flexc sheet-jcfs sheet-col-money">
|
|
<div class="sheet-col-header">
|
|
Money
|
|
</div>
|
|
<!-- ================== copper ================= -->
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<input type="text" name="attr_copper"
|
|
class="sheet-input-dotted" value="0">
|
|
<span class="sheet-money-col-lbl">c</span>
|
|
</div>
|
|
<!-- ================== silver ================= -->
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<input type="text" name="attr_silver"
|
|
class="sheet-input-dotted" value="0">
|
|
<span class="sheet-money-col-lbl">s</span>
|
|
</div>
|
|
<!-- ================== gold ================= -->
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<input type="text" name="attr_gold"
|
|
class="sheet-input-dotted" value="0">
|
|
<span class="sheet-money-col-lbl">g</span>
|
|
</div>
|
|
<!-- ================== mythril ================= -->
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<input type="text" name="attr_mythril"
|
|
class="sheet-input-dotted" value="0">
|
|
<span class="sheet-money-col-lbl">m</span>
|
|
</div>
|
|
|
|
<div class="sheet-row-spacer"></div>
|
|
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<input type="text" name="attr_magicpoints"
|
|
class="sheet-input-dotted" value="0">
|
|
<span class="sheet-money-col-lbl">mp</span>
|
|
</div>
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<input type="text" name="attr_ing"
|
|
class="sheet-input-dotted" value="0">
|
|
<span class="sheet-money-col-lbl">ing</span>
|
|
</div>
|
|
</div> <!-- end col money -->
|
|
|
|
<div class="sheet-flexc sheet-jcfs sheet-col-info1">
|
|
<div class="sheet-col-header">
|
|
General Info
|
|
</div>
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<span class="sheet-info-col-lbl">Born in:</span>
|
|
<input type="text" name="attr_city_born"
|
|
class="sheet-input-dotted">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<span class="sheet-info-col-lbl">Home:</span>
|
|
<input type="text" name="attr_city_home"
|
|
class="sheet-input-dotted">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<span class="sheet-info-col-lbl">City in:</span>
|
|
<input type="text" name="attr_city_in"
|
|
class="sheet-input-dotted">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<span class="sheet-info-col-lbl">Date:</span>
|
|
<input type="text" name="attr_game_date"
|
|
class="sheet-input-dotted">
|
|
</div>
|
|
|
|
<div class="sheet-row-spacer"></div>
|
|
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<span class="sheet-info-col-lbl">Resurected?:</span>
|
|
<input type="checkbox" name="attr_resurected"
|
|
class="sheet-cb-resurected">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<span class="sheet-info-col-lbl">Holy Book?:</span>
|
|
<input type="checkbox" name="attr_holybook"
|
|
class="sheet-cb-holybook">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<span class="sheet-info-col-lbl">Silver Cross?:</span>
|
|
<input type="checkbox" name="attr_silver_cross"
|
|
class="sheet-cb-silvercross">
|
|
</div>
|
|
|
|
</div>
|
|
</div> <!-- end trquad -->
|
|
|
|
<div class="sheet-flexr sheet-jcsa sheet-stats-blquad">
|
|
<div class="sheet-flexc sheet-jcfs sheet-col-hth">
|
|
<div class="sheet-lbl3">Hand to Hand Combat</div>
|
|
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<span class="sheet-info-col-lbl-hth">Attack Factor:</span>
|
|
|
|
<input type="text" name="attr_af"
|
|
class="sheet-input-dotted-hth">
|
|
<input type="hidden" name="attr_af_base" id="af_base" value="">
|
|
<input type="hidden" name="attr_af_dmg" id="af_dmg" value="">
|
|
<input type="hidden" name="attr_af_plus">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<span class="sheet-info-col-lbl-hth">Defense Factor:</span>
|
|
|
|
<input type="text" name="attr_df"
|
|
class="sheet-input-dotted-hth">
|
|
<input type="hidden" name="attr_df_plus">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<span class="sheet-info-col-lbl-hth">Amor Type:</span>
|
|
|
|
<input type="text" name="attr_ar"
|
|
class="sheet-input-dotted-hth">
|
|
<input type="hidden" name="attr_ar_plus">
|
|
</div>
|
|
|
|
<div class="sheet-hth-attack-panel">
|
|
|
|
<div class="sheet-flexc sheet-grid-lbl-col">
|
|
<div class="sheet-lbl2g">Attacker's AL:</div>
|
|
<div class="sheet-lbl2g">Attack Order:</div>
|
|
<div class="sheet-lbl2g">Melee Number:</div>
|
|
</div>
|
|
<div class="sheet-flexc sheet-grid-input-col">
|
|
<input type="number" name="attr_atkr_al" value="1"
|
|
class="sheet-input-dotted-sm-grd">
|
|
<input type="number" name="attr_atk_order" value="1"
|
|
class="sheet-input-dotted-sm-grd">
|
|
<input type="number" name="attr_melee_num" value="1"
|
|
class="sheet-input-dotted-sm-grd">
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<span class="sheet-lbl">Volley Count:</span>
|
|
<div class="sheet-volley-cnt">
|
|
|
|
<label for="sheet-vc1">1</label>
|
|
<input type="radio" name="volleycnt"
|
|
checked id="sheet-vc1">
|
|
<label for="sheet-vc2">2</label>
|
|
<input type="radio" name="volleycnt" id="sheet-vc2">
|
|
<label for="sheet-vc3">3</label>
|
|
<input type="radio" name="volleycnt" id="sheet-vc3">
|
|
<label for="sheet-vc4">4</label>
|
|
<input type="radio" name="volleycnt" id="sheet-vc4">
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="sheet-flexc sheet-jcfs sheet-hth-col2">
|
|
<div class="sheet-col-header">
|
|
Weapon
|
|
</div>
|
|
<div class="sheet-col-header">
|
|
Slaying Types
|
|
</div>
|
|
<!-- Slaying types row 1 -->
|
|
<div class="sheet-flexr sheet-jcsa">
|
|
<div class="sheet-flexr sheet-jcfs">
|
|
<span class="sheet-col-lbl-slay">Me</span>
|
|
<input type="checkbox" name="attr_slay_men"
|
|
class="sheet-cb-slaying">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcfs">
|
|
<span class="sheet-col-lbl-slay">Dw</span>
|
|
<input type="checkbox" name="attr_slay_dwarf"
|
|
class="sheet-cb-slaying">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcfs">
|
|
<span class="sheet-col-lbl-slay">Ef</span>
|
|
<input type="checkbox" name="attr_slay_elf"
|
|
class="sheet-cb-slaying">
|
|
</div>
|
|
</div>
|
|
<!-- Slaying types row 2 -->
|
|
<div class="sheet-flexr sheet-jcsa">
|
|
<div class="sheet-flexr sheet-jcfs">
|
|
<span class="sheet-col-lbl-slay">Ok</span>
|
|
<input type="checkbox" name="attr_slay_ork"
|
|
class="sheet-cb-slaying">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcfs">
|
|
<span class="sheet-col-lbl-slay">Gi</span>
|
|
<input type="checkbox" name="attr_slay_giant"
|
|
class="sheet-cb-slaying">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcfs">
|
|
<span class="sheet-col-lbl-slay">Dr</span>
|
|
<input type="checkbox" name="attr_slay_dragon"
|
|
class="sheet-cb-slaying">
|
|
</div>
|
|
</div>
|
|
<div class="sheet-flexc sheet-jcc sheet-atk-btn-col">
|
|
<button type="roll" class="sheet-lbl-hth-btn"
|
|
name="roll_hth_attack" title="Hand To Hand Attack"
|
|
value="&{template:hth} {{name=@{character_name}}} {{af=@{af}}} {{afplus=@{af_plus}}} {{need=[[@{hth_need}]]}} {{val=[[d10]]}} {{dmg=[[@{af_dmg}]]}} {{whereto=[[d10]]}}"
|
|
>Attack</button>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
</div> <!-- end blquad -->
|
|
|
|
<div class="sheet-flexr sheet-jcsa sheet-stats-brquad">
|
|
|
|
<!-- ****************** Missile to hit ********* -->
|
|
<div class="sheet-flexc sheet-jcfs sheet-col-mth">
|
|
<div class="sheet-lbl3">Missile</div>
|
|
<div class="sheet-lbl3">to Hit#'s</div>
|
|
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<span class="sheet-info-col-lbl-mth">Weapon:</span>
|
|
|
|
<input type="text" name="attr_mth_af"
|
|
class="sheet-input-dotted-mth">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcsb">
|
|
<button type="roll" class="sheet-lbl-mth-btn"
|
|
name="roll_mth_short" title="Missile to Hit at short range"
|
|
value="&{template:mth} {{name=@{character_name}}} {{weapon=@{mth_af_base}}} {{afplus=@{mth_af_plus}}} {{need=[[@{mth_short}]]}} {{val=[[d10]]}} {{dmg=[[@{mth_weapon_dmg}]]}} {{range=short}} {{whereto=[[d10]]}}"
|
|
>Short</button>
|
|
|
|
<input type="text" name="attr_mth_short"
|
|
class="sheet-input-dotted-mth">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<button type="roll" class="sheet-lbl-mth-btn"
|
|
name="roll_mth_medium" title="Missile to Hit at medium range"
|
|
value="&{template:mth} {{name=@{character_name}}} {{weapon=@{mth_af_base}}} {{afplus=@{mth_af_plus}}} {{need=[[@{mth_medium}]]}} {{val=[[d10]]}} {{dmg=[[@{mth_weapon_dmg}]]}} {{range=medium}} {{whereto=[[d10]]}}"
|
|
>Medium</button>
|
|
|
|
<input type="text" name="attr_mth_medium"
|
|
class="sheet-input-dotted-mth">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<button type="roll" class="sheet-lbl-mth-btn"
|
|
name="roll_mth_long" title="Missile to Hit at long range"
|
|
value="&{template:mth} {{name=@{character_name}}} {{weapon=@{mth_af_base}}} {{afplus=@{mth_af_plus}}} {{need=[[@{mth_long}]]}} {{val=[[d10]]}} {{dmg=[[@{mth_weapon_dmg}]]}} {{range=long}} {{whereto=[[d10]]}}"
|
|
>Long</button>
|
|
|
|
<input type="text" name="attr_mth_long"
|
|
class="sheet-input-dotted-mth">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcc" style="margin-top: 5px;">
|
|
<span class="sheet-info-col-lbl">Armorments?:</span>
|
|
<input type="checkbox" name="attr_armorments"
|
|
class="sheet-cb-armorments">
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<!-- ****************** Saving rolls ********* -->
|
|
<div class="sheet-flexc sheet-jcfs sheet-col-saving">
|
|
<div class="sheet-lbl3">Saving Roll vs:</div>
|
|
<div class="sheet-flexr sheet-jcsb">
|
|
<div class="sheet-flexc sheet-jcfs sheet-col-luckycharms">
|
|
<div class="sheet-flexr sheet-jcc" style="">
|
|
<span class="sheet-lc-col-lbl-lc">4LC:</span>
|
|
<input type="number" name="attr_lc_4lc"
|
|
class="sheet-input-dotted-lc">
|
|
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcc" style="">
|
|
<span class="sheet-lc-col-lbl-lc">Dto:</span>
|
|
<input type="number" name="attr_lc_dto"
|
|
class="sheet-input-dotted-lc">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcc" style="">
|
|
<span class="sheet-lc-col-lbl-lc">Moo:</span>
|
|
<input type="number" name="attr_lc_moo"
|
|
class="sheet-input-dotted-lc">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcc" style="">
|
|
<span class="sheet-lc-col-lbl-lc">Lod:</span>
|
|
<input type="number" name="attr_lc_lod"
|
|
class="sheet-input-dotted-lc">
|
|
</div>
|
|
</div>
|
|
<div class="sheet-flexc sheet-jcfs sheet-col-lcbonus"
|
|
style="margin-left: 5px;">
|
|
<div class="sheet-flexr sheet-jcfe">
|
|
<span class="sheet-col-header sheet-lc-col-lbl-lc">SPELL:</span>
|
|
|
|
<input type="text" name="attr_sv_spell"
|
|
class="sheet-input-dotted-save">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcfe">
|
|
<span class="sheet-col-header sheet-lc-col-lbl-lc">THIEF:</span>
|
|
|
|
<input type="text" name="attr_sv_thief"
|
|
class="sheet-input-dotted-save">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcfe">
|
|
<span class="sheet-col-header sheet-lc-col-lbl-lc">POISON:</span>
|
|
|
|
<input type="text" name="attr_sv_poison"
|
|
class="sheet-input-dotted-save">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcfe">
|
|
<span class="sheet-lc-col-lbl">Immune?#</span>
|
|
|
|
<input type="number" name="attr_poi_immune"
|
|
class="sheet-input-dotted-save">
|
|
</div>
|
|
</div> <!-- col lc bonus -->
|
|
|
|
</div>
|
|
<div class="sheet-flexr sheet-jcfe">
|
|
<div class="sheet-flexr sheet-jcfe">
|
|
<span class="sheet-col-header sheet-lc-col-lbl-lc">EXPOSURE:</span>
|
|
|
|
<input type="text" name="attr_sv_exposure"
|
|
class="sheet-input-dotted-save">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
</div> <!-- end brquad -->
|
|
|
|
</div> <!-- end stats panel view -->
|
|
</div> <!-- end tab view -->
|
|
|
|
<!-- ====== Equipment panel view ======= -->
|
|
<div class="sheet-tab-view2 sheet-tab-view">
|
|
Equipment panel
|
|
</div> <!-- end Equipment tab view -->
|
|
|
|
<!-- ===== Experience panel view ====== -->
|
|
<div class="sheet-tab-view3 sheet-tab-view">
|
|
<div class="sheet-flexr sheet-jcfs sheet-experience-panel-view">
|
|
|
|
<div class="sheet-flexc sheet-jcfs sheet-fighter-thief-priest-col">
|
|
<!-- Fighter & Thief experience column -->
|
|
<div class="sheet-flexr sheet-jcfs sheet-fighter-thief-exp-row">
|
|
|
|
<!-- Fighter experience box -->
|
|
<div class="sheet-flexc sheet-jcsb" id="col-fighter-exp">
|
|
|
|
<div class="sheet-flexc sheet-jcs sheet-col-fighter-exp">
|
|
<div class="sheet-flexr sheet-jcfs">
|
|
<span class="sheet-lbl3">Fighter:</span>
|
|
<span class="sheet-lbl1">EL:</span>
|
|
<span class="sheet-val-lg" name="attr_el_fighter"
|
|
value="1">
|
|
</span>
|
|
</div>
|
|
<div class="sheet-lbl2">EP's:</div>
|
|
<input type="number" class="sheet-input-eps" name="attr_ep_fighter">
|
|
</div>
|
|
|
|
<!-- Thief experience box -->
|
|
<div class="sheet-flexc sheet-jcfs sheet-col-thief-exp"
|
|
id="col-thief-exp">
|
|
<div class="sheet-flexr sheet-jcfs">
|
|
<span class="sheet-lbl3">Thief:</span>
|
|
<span class="sheet-lbl1">EL:</span>
|
|
<span class="sheet-val-lg" name="attr_el_thief"
|
|
value="1"></span>
|
|
</div>
|
|
<div class="sheet-lbl2">EP's:</div>
|
|
<input type="number" class="sheet-input-eps" name="attr_ep_thief">
|
|
</div>
|
|
</div>
|
|
<!-- Thief skills box -->
|
|
<div class="sheet-flexc sheet-jcfe sheet-thief-skills-box"
|
|
style="padding-left: 5px;">
|
|
<div class="sheet-flexr sheet-jcfe">
|
|
<span class="sheet-lbl1">Dex Bonus</span>
|
|
<span class="sheet-val-tf" name="attr_dex_bonus"></span>%
|
|
</div>
|
|
|
|
<div class="sheet-flexr jcfe">
|
|
<button type="roll" class="sheet-lbl-btn"
|
|
name="roll_climb_walls" title="Climb Walls"
|
|
value="&{template:percent_func} {{name=@{character_name}}} {{act=Climb Walls}} {{need=[[@{cw} + @{dex_bonus} + @{cw_bonus}]]}} {{val=[[d100]]}} {{tries=[[d6]]}}"
|
|
>CW</button>
|
|
<span class="sheet-val-tf sheet-bold" name="attr_cw"></span>+
|
|
<span class="sheet-val-tf sheet-bold" name="attr_cw_bonus"></span>%
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcfe">
|
|
<button type="roll" class="sheet-lbl-btn" name="roll_climb_walls"
|
|
title="Pick Locks"
|
|
value="&{template:percent_func} {{name=@{character_name}}} {{act=Pick Locks}} {{need=[[@{pl} + @{dex_bonus} + @{pl_bonus}]]}} {{val=[[d100]]}} {{tries=[[d6]]}}">PL</button>
|
|
<span class="sheet-val-tf sheet-bold" name="attr_pl"></span>+
|
|
<span class="sheet-val-tf sheet-bold" name="attr_pl_bonus"></span>%
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcfe">
|
|
<button type="roll" class="sheet-lbl-btn" name="roll_climb_walls"
|
|
title="Notice/Neutralize/Set Trap"
|
|
value="&{template:percent_func} {{name=@{character_name}}} {{act=Notice/Neutralize/Set Trap}} {{need=[[@{nt} + @{dex_bonus} + @{nt_bonus}]]}} {{val=[[d100]]}} {{tries=[[d6]]}}">NT</button>
|
|
<span class="sheet-val-tf sheet-bold" name="attr_nt"></span>+
|
|
<span class="sheet-val-tf sheet-bold" name="attr_nt_bonus"></span>%
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcfe">
|
|
<button type="roll" class="sheet-lbl-btn" name="roll_climb_walls"
|
|
title="Pickpocket/Steal"
|
|
value="&{template:percent_func} {{name=@{character_name}}} {{act=Pickpocket/Steal}} {{need=[[@{ps} + @{dex_bonus} + @{ps_bonus}]]}} {{val=[[d100]]}} {{tries=[[d6]]}}">PS</button>
|
|
<span class="sheet-val-tf sheet-bold" name="attr_ps"></span>+
|
|
<span class="sheet-val-tf sheet-bold" name="attr_ps_bonus"></span>%
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcfe">
|
|
<button type="roll" class="sheet-lbl-btn" name="roll_climb_walls"
|
|
title="Move Quietly"
|
|
value="&{template:percent_func} {{name=@{character_name}}} {{act=Move Quietly}} {{need=[[@{mq} + @{dex_bonus} + @{mq_bonus}]]}} {{val=[[d100]]}} {{tries=[[d6]]}}">MQ</button>
|
|
<span class="sheet-val-tf sheet-bold" name="attr_mq"></span>+
|
|
<span class="sheet-val-tf sheet-bold" name="attr_mq_bonus"></span>%
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcfe">
|
|
<button type="roll" class="sheet-lbl-btn" name="roll_climb_walls"
|
|
title="Move Un-noticed"
|
|
value="&{template:percent_func} {{name=@{character_name}}} {{act=Move Un-noticed}} {{need=[[@{mu} + @{dex_bonus} + @{mu_bonus}]]}} {{val=[[d100]]}} {{tries=[[d6]]}}">MU</button>
|
|
<span class="sheet-val-tf sheet-bold" name="attr_mu"></span>+
|
|
<span class="sheet-val-tf sheet-bold" name="attr_mu_bonus"></span>%
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcfe">
|
|
<button type="roll" class="sheet-lbl-btn" name="roll_climb_walls"
|
|
title="Hear Noises"
|
|
value="&{template:percent_func} {{name=@{character_name}}} {{act=Hear Noises}} {{need=[[@{hn} + @{dex_bonus} + @{hn_bonus}]]}} {{val=[[d100]]}} {{tries=[[d6]]}}">HN</button>
|
|
<span class="sheet-val-tf sheet-bold" name="attr_hn"></span>+
|
|
<span class="sheet-val-tf sheet-bold" name="attr_hn_bonus"></span>%
|
|
</div>
|
|
</div> <!-- end Thief Skills col -->
|
|
</div> <!-- end Fighter Thief experience box -->
|
|
|
|
<div class="sheet-flexc sheet-jcfs sheet-priest-col1">
|
|
<div class="sheet-flexr sheet-jcfs">
|
|
<div class="sheet-flexc sheet-jcfs sheet-col-priest-exp">
|
|
<div class="sheet-flexr sheet-jcfs">
|
|
<span class="sheet-lbl3">Priest:</span>
|
|
<span class="sheet-lbl1">EL:</span>
|
|
<span class="sheet-val-lg" name="attr_el_priest"
|
|
value="1">
|
|
</span>
|
|
</div>
|
|
<div class="sheet-lbl2">EP's:</div>
|
|
<input type="number" class="sheet-input-eps" name="attr_ep_priest">
|
|
</div>
|
|
<div class="sheet-flexc sheet-jcfs sheet-priest-col2">
|
|
<div class="sheet-flexr sheet-jcfs">
|
|
<button type="roll" class="sheet-lbl-btn"
|
|
name="roll_divine_inspiration" title="Divine Inspiration"
|
|
value="&{template:percent_func} {{name=@{character_name}}} {{act=Divine Inspiration}} {{need=[[@{di} + @{di_bonus}]]}} {{val=[[d100]]}} {{tries=[[d6]]}}"
|
|
>DI</button>
|
|
<span class="sheet-val-lg sheet-bold" name="attr_di"></span>+
|
|
<span class="sheet-val-lg sheet-bold" name="attr_di_bonus"
|
|
value="0"
|
|
></span>%
|
|
</div>
|
|
<div class="sheet-flexr sheet-jcfs" style="padding-bottom: .5rem;
|
|
line-height: 2em;">
|
|
<span class="sheet-lbl1">BW:</span>
|
|
<span class="sheet-val-lg sheet-bold" name="attr_bwq1"></span>-
|
|
<span class="sheet-val-lg sheet-bold" name="attr_bwq2"></span>-
|
|
<span class="sheet-val-lg sheet-bold" name="attr_bwq3"></span>-
|
|
<span class="sheet-val-lg sheet-bold" name="attr_bwq4"></span>
|
|
</div> <!-- end Blessings per week -->
|
|
<div class="sheet-flexr sheet-jcfe sheet-preach-row">
|
|
<button type="roll" class="sheet-lbl-btn"
|
|
name="roll_preach" title="Preach"
|
|
value="&{template:preach} {{name=@{character_name}}}
|
|
{{act=Divine Inspiration}} {{need=[[@{preach} + @{preach_bonus}]]}}
|
|
{{val=[[d100]]}}"
|
|
>Preach</button>
|
|
<span class="sheet-val-lg sheet-bold" name="attr_preach"
|
|
value="[[@el]]"></span>+
|
|
<span class="sheet-val-lg sheet-bold" name="attr_preach_bonus"
|
|
></span>%
|
|
</div>
|
|
</div> <!-- end priest col2 -->
|
|
</div> <!-- end priest row-->
|
|
<div class="sheet-flexr sheet-jcse">
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<span class="sheet-info-col-lbl">Holy Book?:</span>
|
|
<input type="checkbox" name="attr_holybook"
|
|
class="sheet-cb-holybook">
|
|
</div>
|
|
|
|
<div class="sheet-flexr sheet-jcc">
|
|
<span class="sheet-info-col-lbl">Silver Cross?:</span>
|
|
<input type="checkbox" name="attr_silver_cross"
|
|
class="sheet-cb-silvercross">
|
|
</div>
|
|
</div> <!-- end priest has holybook and silver cross -->
|
|
</div> <!-- end priest col1-->
|
|
|
|
|
|
</div> <!-- end Fighter Thief Priest experience col -->
|
|
|
|
<!-- magician & alchemist eps -->
|
|
<div class="sheet-flexc sheet-jcsb sheet-magician-col">
|
|
<!-- magician eps container -->
|
|
<div class="sheet-flexr sheet-jcfs sheet-magician-eps-box">
|
|
<div class="sheet-flexc sheet-jcfs">
|
|
<span class="sheet-lbl3">Magician:</span>
|
|
<div class="sheet-lbl">EP's:</div>
|
|
<input type="number" class="sheet-input-eps" name="attr_ep_magician">
|
|
</div>
|
|
|
|
<div class="sheet-flexc sheet-jcfs magician-func-col">
|
|
<div class="sheet-flexr sheet-jcfs">
|
|
<span class="sheet-lbl1">EL:</span>
|
|
<span class="sheet-val-lg" name="attr_el_magician"
|
|
value="0">
|
|
</span>
|
|
|
|
<button type="roll" class="sheet-lbl-btn" name="roll_detect_magic"
|
|
title="Detect Magic"
|
|
value="&{template:percent_func} {{name=@{character_name}}} {{act=Detect Magic}} {{need=[[@{dm} + @{dm_bonus}]]}} {{val=[[d100]]}} {{tries=[[d6]]}}">
|
|
DM</button>
|
|
<span class="sheet-val-lg sheet-bold" name="attr_dm"></span>+
|
|
<span class="sheet-val-lg sheet-bold" name="attr_dm_bonus"></span>%
|
|
</div>
|
|
<div class="sheet-flexr sheet-jcfs" style="padding-top: 20px; line-height: 2em;">
|
|
<span class="sheet-lbl1">SW:</span>
|
|
<span class="sheet-val-lg sheet-bold" name="attr_swq1"></span>-
|
|
<span class="sheet-val-lg sheet-bold" name="attr_swq2"></span>-
|
|
<span class="sheet-val-lg sheet-bold" name="attr_swq3"></span>-
|
|
<span class="sheet-val-lg sheet-bold" name="attr_swq4"></span>
|
|
</div>
|
|
</div> <!-- end magician func col -->
|
|
</div><!-- end Magician ep's box -->
|
|
<!-- Spell book -->
|
|
<div class="sheet-flexc sheet-jcfs sheet-spbook-col">
|
|
<div class="sheet-spbook-header">
|
|
Spell Book
|
|
</div>
|
|
<div class="sheet-spell-lvl">
|
|
Level 1
|
|
</div>
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="spell_mlo">
|
|
<span class="sheet-spell-lbl">Magic Lock</span>
|
|
<span class="sheet-spell-abv">(MLo)</span>-
|
|
<p>Magically locks anything to anything, like doors, chests, &
|
|
windows shut, feet to ground, etc. It can be removed by dispell,
|
|
or broken by a combined Str greater than the caster's Int.</p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="spell_enc">
|
|
<span class="sheet-spell-lbl">Enchant</span>
|
|
<span class="sheet-spell-abv">(ech)</span>-
|
|
<p>Prepares a scroll to store a spell/blessing on or
|
|
an item to accept enchantment mp's in manufacturing thereof.</p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="spell_dis">
|
|
<span class="sheet-spell-lbl">Dispell</span>
|
|
<span class="sheet-spell-abv">(Dis)</span>-
|
|
<p>Undoes a magician's magic or a priest's curses
|
|
except damage related ones. Permanent spells must be dispelled
|
|
first. The %chance for successfully dispelling any given spell
|
|
or item is:</p>
|
|
<!-- Formula -->
|
|
<div class="sheet-flexr sheet-jcse">
|
|
<span class="sheet-flexc sheet-jcc sheet-formula-c1">
|
|
%Chance = 100 *
|
|
</span>
|
|
<div class="sheet-flexc sheet-jcfs sheet-formula-c2">
|
|
<span class="sheet-formula-numerator">
|
|
Displeller's EL
|
|
</span>
|
|
<span class="sheet-formula-c2 sheet-formula-denominator">
|
|
Caster's EL
|
|
</span>
|
|
</div>
|
|
<span class="sheet-flexc sheet-jcc" style="padding: 3px;">
|
|
or
|
|
</span>
|
|
<div class="sheet-flexc sheet-jcfs sheet-formula-c2">
|
|
<span class="sheet-formula-numerator">
|
|
Displeller's EL
|
|
</span>
|
|
<span class="sheet-formula-c2 sheet-formula-denominator">
|
|
Item mp's
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="spell_fda_ida">
|
|
<span class="sheet-spell-lbl">Fire/Icedarts</span>
|
|
<span class="sheet-spell-abv">(FDa/IDa)</span>-
|
|
<p>A 1 ft long missile explodes where the caster desires it,
|
|
when it hits an object, or at its <span class="sheet-rng">30yd</span>
|
|
limit, whichever comes first, doing <span class="sheet-dmg">D6
|
|
</span>pts magical <span class="sheet-formula-c1">fire</span>
|
|
or magical <span class="sheet-formula-c2">frost</span> damage
|
|
to a <span class="sheet-radius">6ft</span> radius. Victims
|
|
must save vs spell, those who save take half damage.</p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="spell_lrd_trd">
|
|
<span class="sheet-spell-lbl">Lightning/Thunderrod</span>
|
|
<span class="sheet-spell-abv">(Lrd/TRd)</span>-
|
|
<p>A 5 ft long <span class="sheet-rng">40yd</span> range
|
|
missile can be aimed in any direction the caster desires, doing
|
|
<span class="sheet-dmg">D6</span>pts magical lightning (electrocution)
|
|
or magical thunder (invisible shock wave) damage on all in its
|
|
path. Victims must save vs spell, those who save take half damage.
|
|
</p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-lvl">
|
|
Level 2
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="spell_mir">
|
|
<span class="sheet-spell-lbl">Mirage</span>
|
|
<span class="sheet-spell-abv">(Mir)</span>-
|
|
<p>Creates a <span class="sheet-rng">24hr</span> illusion of any
|
|
shape the caster desires. Each <span class="sheet-radius">100 EP</span>
|
|
the caster has can mirage a <span class="sheet-radius">6ft</span>
|
|
cube. Physical contact with the mirage negates it.</p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="spell_fba_iba">
|
|
<span class="sheet-spell-lbl">Fire/Iceball</span>
|
|
<span class="sheet-spell-abv">(FBa/IBa)</span>-
|
|
<p>Same as Darts except its range is <span class="sheet-rng">50yds</span>
|
|
and it does <span class="sheet-dmg">2D6</span>pts magical
|
|
damage to a <span class="sheet-radius">10ft</span> radius.</p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="spell_lbo_tbo">
|
|
<span class="sheet-spell-lbl">Lightning/Thunderbolt</span>
|
|
<span class="sheet-spell-abv">(Lbo/TBo)</span>-
|
|
<p>Same as Rods except range is <span class="sheet-rng">60yds
|
|
</span> and it does <span class="sheet-dmg">2D6</span>pts magical
|
|
damage to all in its path.</p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="spell_mlo">
|
|
<span class="sheet-spell-lbl">Charm</span>
|
|
<span class="sheet-spell-abv">(Chm)</span>-
|
|
<p>Charms <span class="sheet-radius">any flesh humanoid creature</span> that fails its save vs
|
|
spell. Charmed creatures serve their charmer and will fight in
|
|
battles, but wont hurt or kill themselfs. Charmed creatures may
|
|
break the charm as time passes:</p>
|
|
<div class="sheet-flexr sheet-jcsb">
|
|
<div class="sheet-flexc sheet-jcfe sheet-formula-charm-col">
|
|
<div class="sheet-formula-numerator sheet-formula-c2"
|
|
style="font-size: .7em">
|
|
TO BREAK CHARM:
|
|
</div>
|
|
<div class="sheet-denominator">
|
|
Roll save each:
|
|
</div>
|
|
</div>
|
|
<div class="sheet-flexc sheet-jcfs sheet-formula-charm-col">
|
|
Int-
|
|
</div>
|
|
<div class="sheet-flexc sheet-jcfs sheet-formula-charm-col">
|
|
<div class="sheet-formula-numerator sheet-formula-c2">
|
|
2-3
|
|
</div>
|
|
<div class="sheet-denominator">
|
|
Month
|
|
</div>
|
|
</div>
|
|
<div class="sheet-flexc sheet-jcfs sheet-formula-charm-col">
|
|
<div class="sheet-formula-numerator sheet-formula-c2">
|
|
4-5
|
|
</div>
|
|
<div class="sheet-denominator">
|
|
Week
|
|
</div>
|
|
</div>
|
|
<div class="sheet-flexc sheet-jcfs sheet-formula-charm-col">
|
|
<div class="sheet-formula-numerator sheet-formula-c2">
|
|
6-8
|
|
</div>
|
|
<div class="sheet-denominator">
|
|
4 Days
|
|
</div>
|
|
</div>
|
|
<div class="sheet-flexc sheet-jcfs sheet-formula-charm-col">
|
|
<div class="sheet-formula-numerator sheet-formula-c2">
|
|
9-10
|
|
</div>
|
|
<div class="sheet-denominator">
|
|
2 Days
|
|
</div>
|
|
</div>
|
|
<div class="sheet-flexc sheet-jcfs sheet-formula-charm-col">
|
|
<div class="sheet-formula-numerator sheet-formula-c2">
|
|
11-12
|
|
</div>
|
|
<div class="sheet-denominator">
|
|
Day
|
|
</div>
|
|
</div>
|
|
<div class="sheet-flexc sheet-jcfs sheet-formula-charm-col">
|
|
<div class="sheet-formula-numerator sheet-formula-c2">
|
|
13+
|
|
</div>
|
|
<div class="sheet-denominator">
|
|
Hour
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="sheet-spell-lvl">
|
|
Level 3
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="spell_ply">
|
|
<span class="sheet-spell-lbl">Polymorph</span>
|
|
<span class="sheet-spell-abv">(Ply)</span>-
|
|
<p>Changes <span class="sheet-radius">any living animal, wood, or plant</span> into another, but its
|
|
relative size must not increase. If directed at an enemy, he must
|
|
save vs spell or be polymorphed.</p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="spell_inv">
|
|
<span class="sheet-spell-lbl">Invisible</span>
|
|
<span class="sheet-spell-abv">(Inv)</span>-
|
|
<p>Makes anything <span class="sheet-radius">indefinitely</span>
|
|
invisible (area or object). If cast on invisible objects they will
|
|
turn visible. Each <span class="sheet-radius">100 EP</span> the
|
|
caster has will make a <span class="sheet-radius">6ft</span>
|
|
cube invisible.</p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="spell_pdo">
|
|
<span class="sheet-spell-lbl">Phase Door</span>
|
|
<span class="sheet-spell-abv">(PDr)</span>-
|
|
<p>Creates a <span class="sheet-radius">6hr</span> transparent
|
|
2-way door to anywhere (<span class="sheet-radius">must be ground
|
|
level</span>). The caster must be familiar with the terrain at
|
|
the other end. Only those that the caster wishes may pass thru it,
|
|
victims must want to go thru it.</p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="spell_IWa_SWa">
|
|
<span class="sheet-spell-lbl">Iron/Stone Wall</span>
|
|
<span class="sheet-spell-abv">(Iwa/Swa)</span>-
|
|
<p>Makes one of <span class="sheet-radius">iron</span> (3 inch thick)
|
|
or <span class="sheet-radius">stone</span> (12 inch thick) <span
|
|
class="sheet-rng">50ft</span> long by <span
|
|
class="sheet-rng">10ft</span> high from existing dirt/sand/
|
|
rock. It must have a foundation, and can be formed in any shape
|
|
(building/tower/castle), and cant be dispelled/negated.</p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-lvl">
|
|
Level 4
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="spell_fs">
|
|
<span class="sheet-spell-lbl">Flesh/Stone</span>
|
|
<span class="sheet-spell-abv">(F/S)</span>-
|
|
<p>Polymorphs any <span
|
|
class="sheet-radius">flesh to stone or vice-versa</span>;
|
|
if used on rocks/boulders they become giant blob-like amebas.
|
|
Characters turned to stone (adamant) <span
|
|
class="sheet-rng">retain all</span> attributes,
|
|
abilities, & scores if it is dispelled. <span
|
|
class="sheet-dmg">No saving roll is
|
|
permitted</span>.</p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="spell_tel">
|
|
<span class="sheet-spell-lbl">Telekinesis</span>
|
|
<span class="sheet-spell-abv">(Tel)</span>-
|
|
<p>The caster can move <span
|
|
class="sheet-radius">1lb</span> of anything per EP
|
|
he has indefinitely as long as he concentrates on it.</p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="spell_fst">
|
|
<span class="sheet-spell-lbl">Firestorm</span>
|
|
<span class="sheet-spell-abv">(FSt)</span>-
|
|
<p>Spontaneously combusts <span
|
|
class="sheet-rng">1 acre</span> per <span
|
|
class="sheet-radius">1000 EP</span> the magician has doing
|
|
<span class="sheet-dmg">D10pts</span> normal fire damage to
|
|
everything within that area, anything flammable will keep burning.
|
|
</p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="spell_per">
|
|
<span class="sheet-spell-lbl">Permanent</span>
|
|
<span class="sheet-spell-abv">(Per)</span>-
|
|
<p>Makes any <span class="sheet-rng">temporary</span> spell/curse
|
|
last <span class="sheet-radius">indefinitely</span>.</p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-lvl">
|
|
Misc Spells <span class="sheet-radius" style="font-size: .6em;">Wands
|
|
can't counter nor negate</span>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="spell_neg">
|
|
<span class="sheet-spell-lbl">Negate</span>
|
|
<span class="sheet-spell-abv">(Neg)</span>-
|
|
<p>Any magician at any time can negate any <span class="sheet-radius">
|
|
non-damage</span> oriented spell he or she has cast, without using
|
|
a SW quota.</p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="spell_cou">
|
|
<span class="sheet-spell-lbl">Counter</span>
|
|
<span class="sheet-spell-abv">(Cou)</span>-
|
|
<p>Spells being cast can be countered by another magician by
|
|
<span class="sheet-radius">using one of his or her SW
|
|
quotas</span> of that spell level, thus rendering the
|
|
original cast spell of no effect. Counter spells
|
|
<span class="sheet-radius">must be announced</span>
|
|
<span class="sheet-dmg">before damage or saving rolls</span> are
|
|
made.</p>
|
|
</div>
|
|
|
|
</div> <!-- end spellbook col -->
|
|
|
|
</div>
|
|
|
|
<!-- alchemist eps container -->
|
|
<div class="sheet-flexc sheet-jcfs sheet-alchemist-col">
|
|
<div class="sheet-flexr sheet-jcfs sheet-alchemist-eps-box">
|
|
<div class="sheet-flexc sheet-jcfs">
|
|
<span class="sheet-lbl3">Alchemist:</span>
|
|
<div class="sheet-lbl">EP's:</div>
|
|
<input type="number" class="sheet-input-eps" name="attr_ep_alchemist">
|
|
</div>
|
|
<div class="sheet-flexc sheet-jcfs">
|
|
<div class="sheet-flexr sheet-jcfs">
|
|
<span class="sheet-lbl1">EL:</span>
|
|
<span class="sheet-val-lg" name="attr_el_alchemist"
|
|
value="0">
|
|
</span>
|
|
<button type="roll" class="sheet-lbl-btn"
|
|
name="roll_identify_potion" title="Identify Potion"
|
|
value="&{template:percent_func} {{name=@{character_name}}} {{act=Identify Potion}} {{need=[[@{ip} + @{ip_bonus}]]}} {{val=[[d100]]}} {{tries=[[d6]]}}"
|
|
>IP</button>
|
|
<span class="sheet-val-lg sheet-bold" name="attr_ip"></span>+
|
|
<span class="sheet-val-lg sheet-bold" name="attr_ip_bonus"
|
|
value="0"></span>%
|
|
</div>
|
|
<div class="sheet-flexr sheet-jcfs" style="padding-top: 20px;
|
|
line-height: 2em;">
|
|
<span class="sheet-lbl1">PW:</span>
|
|
<span class="sheet-val-lg sheet-bold" name="attr_pwq1"></span>-
|
|
<span class="sheet-val-lg sheet-bold" name="attr_pwq2"></span>-
|
|
<span class="sheet-val-lg sheet-bold" name="attr_pwq3"></span>-
|
|
<span class="sheet-val-lg sheet-bold" name="attr_pwq4"></span>
|
|
</div> <!-- end Alchemist quota -->
|
|
</div> <!-- end Alchemist function box -->
|
|
</div> <!-- end Alchemist ep's box -->
|
|
|
|
<div class="sheet-flexc sheet-jcfs sheet-pobook-col">
|
|
<div class="sheet-spbook-header">
|
|
Potion Book
|
|
</div>
|
|
<div class="sheet-spell-lvl">
|
|
Level 1
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="potion_acd">
|
|
<span class="sheet-spell-lbl">Acid</span>
|
|
<span class="sheet-spell-abv">(Acd)</span>-
|
|
<p>Eats thru anything except mythril, glass, or clay. If
|
|
drank/tossed at someone it does <span class="sheet-dmg">
|
|
D6pts</span> normal damage. <span class="sheet-poi-clear">(Clear)
|
|
</span>
|
|
</p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="potion_poi">
|
|
<span class="sheet-spell-lbl">Poison</span>
|
|
<span class="sheet-spell-abv">(Poi)</span>-
|
|
<p>If tasted, drank, or contacts a wound the recipient must save vs
|
|
poison or die in <span class="sheet-radius">D6 melees</span>.
|
|
One dose poison tips a sword/axe, 2 spears/knifes, or 12 arrows for
|
|
1 battle/use. <span class="sheet-poi-clear">(Clear)</span></p>
|
|
</div>
|
|
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="potion_fl_oil">
|
|
<span class="sheet-spell-lbl">Flaming</span>
|
|
<span class="sheet-spell-abv">[Oil]</span>-
|
|
<p>If doused on someone it does <span class="sheet-dmg">
|
|
D6pts</span> normal fire damage for <span
|
|
class="sheet-radius">D6 melees</span>. Fuels 1
|
|
torch/lantern for 1 week; see Boiling Oil page i11.
|
|
<span class="sheet-poi-clear">(Clear)</span></p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="potion_glu">
|
|
<span class="sheet-spell-lbl">Glue</span>
|
|
<span class="sheet-spell-abv">(Glu)</span>-
|
|
<p>Roll <span
|
|
class="sheet-radius">D10</span> for bond Str; sets in <span
|
|
class="sheet-radius">D6</span> melees. Anyone with a combined
|
|
Str greater than the bond may break it. <span
|
|
class="sheet-poi-yellow">(Yellow)</span></p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="potion_exp">
|
|
<span class="sheet-spell-lbl">Explosive</span>
|
|
<span class="sheet-spell-abv">(Exp)</span>-
|
|
<p>Explodes on impact, jolts (character carrying them), when shocked,
|
|
or when contacts fire doing <span class="sheet-dmg">D8pts</span>
|
|
normal damage to an <span class="sheet-radius">8ft radius</span>.
|
|
They also chain react. <span class="sheet-poi-black">(Black)</span>
|
|
</p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-lvl">
|
|
Level 2
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="potion_hlg">
|
|
<span class="sheet-spell-lbl">Healing</span>
|
|
<span class="sheet-spell-abv">(Hlg)</span>-
|
|
<p>Heals <span class="sheet-radius">D6 LP's</span> presently unhealed
|
|
on any character/creature in <span class="sheet-radius">D6</span>
|
|
melees, but never more than his LP base. Healing used as
|
|
<span class="sheet-spell-lbl">Antidote</span>
|
|
<span class="sheet-spell-abv">(Atd)</span> counteracts the effects of
|
|
poison if the antidote effect occurs before the poison effect, if so
|
|
then a save vs poison roll is not required; effect takes
|
|
<span class="sheet-radius">D6</span> melees. <span class="sheet-rng">
|
|
A healing potion ceases to work when character is dead</span>.
|
|
<span class="sheet-poi-brown">(Brown)</span>
|
|
</p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="potion_gfm">
|
|
<span class="sheet-spell-lbl">Gaseous Form</span>
|
|
<span class="sheet-spell-abv">(GFm)</span>-
|
|
<p>Turns drinker into a yellow-green mist in
|
|
<span class="sheet-radius">D6</span> melees, returnable at will,
|
|
useful for passing thru cracks. Equipment other than
|
|
weapons/armor/special items fall off. The user will starve if he
|
|
remains gaseous too long. <span class="sheet-poi-green">(Green)
|
|
</span></p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="potion_str">
|
|
<span class="sheet-spell-lbl">Strength</span>
|
|
<span class="sheet-spell-abv">(Str)</span>-
|
|
<p>Increases the drinker's <span class="sheet-radius">Str 1pt</span>
|
|
for <span class="sheet-rng">1hr</span> giving the
|
|
user any bonuses he'd rate. Takes <span class="sheet-radius">
|
|
D6</span> melees. <span class="sheet-poi-orange">(Orange)
|
|
</span></p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="potion_slp">
|
|
<span class="sheet-spell-lbl">Sleep</span>
|
|
<span class="sheet-spell-abv">(Slp)</span>-
|
|
<p>Whoever drinks/tastes this will sleep for <span class="sheet-radius">
|
|
20yrs</span> (or til kissed by a royal princess). Takes
|
|
<span class="sheet-radius">D6</span> melees. <span
|
|
class="sheet-poi-milky">(Milky)</span></p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-lvl">
|
|
Level 3
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="potion_gse">
|
|
<span class="sheet-spell-lbl">Golden Secret</span>
|
|
<span class="sheet-spell-abv">(GSe)</span>-
|
|
<p>Converts the right combination of earth, wind,
|
|
fire, & rain into <span class="sheet-radius">
|
|
3D6</span> gold nuggets, see page w7. <span
|
|
class="sheet-poi-yellow">(Yellow)</span></p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="potion_npm">
|
|
<span class="sheet-spell-lbl">Napalm</span>
|
|
<span class="sheet-spell-abv">(NPm)</span>-
|
|
<p>Explodes in flame when contacts air and does <span
|
|
class="sheet-dmg">2D8pts</span> except flames on if normal damage to
|
|
all in a <span class="sheet-radius">15ft</span> radius.
|
|
<span class="sheet-poi-black">(Black)</span></p>
|
|
</div>
|
|
|
|
<div class="sheet-spell-entry">
|
|
<input type="checkbox" name="potion_fyo">
|
|
<span class="sheet-spell-lbl">Fountain of Youth</span>
|
|
<span class="sheet-spell-abv">(FYo)</span>-
|
|
<p>Keeps the drinker from aging for the next
|
|
year; each dose is cumulative. <span class="sheet-poi-violet">(Violet)
|
|
</span></p>
|
|
</div>
|
|
</div>
|
|
</div> <!-- end Alchemist col -->
|
|
|
|
|
|
|
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
</div> <!-- end Experience tab view -->
|
|
</div>
|
|
|
|
|
|
</div>
|
|
</div>
|
|
<!-- =============================== roll templates -->
|
|
<rolltemplate class="sheet-rolltemplate-percent_func">
|
|
<div class="sheet-tf-container">
|
|
<div class="sheet-header">
|
|
<div><h3>{{name}}</h3></div>
|
|
{{#rollTotal() tries 1}}
|
|
<span class="sheet-hlbl">Is attempting to</span>
|
|
{{/rollTotal() tries 1}}
|
|
{{#rollTotal() tries 2}}
|
|
<span class="sheet-hlbl">Attempts to</span>
|
|
{{/rollTotal() tries 2}}
|
|
{{#rollTotal() tries 3}}
|
|
<span class="sheet-hlbl">Wants to</span>
|
|
{{/rollTotal() tries 3}}
|
|
{{#rollTotal() tries 4}}
|
|
<span class="sheet-hlbl">Will try to</span>
|
|
{{/rollTotal() tries 4}}
|
|
{{#rollTotal() tries 5}}
|
|
<span class="sheet-hlbl">Might be able to</span>
|
|
{{/rollTotal() tries 5}}
|
|
{{#rollTotal() tries 6}}
|
|
<span class="sheet-hlbl">Thinks they can</span>
|
|
{{/rollTotal() tries 6}}
|
|
</div>
|
|
<div class="sheet-func">{{act}}</div>
|
|
<div class="sheet-results">
|
|
<div class="sheet-need-col">
|
|
<div class="sheet-need-header">Needs a</div>
|
|
<div class="sheet-needed">{{need}}</div>
|
|
<div class="sheet-need-footer">or lower</div>
|
|
</div>
|
|
<div class="sheet-roll-col">
|
|
<div class="sheet-roll-header">And got</div>
|
|
<div class="sheet-roll-val">{{val}}</div>
|
|
{{#^rollGreater() val need}}
|
|
<div class="sheet-roll-success"></div>
|
|
{{/^rollGreater() val need}}
|
|
{{#rollGreater() val need}}
|
|
<div class="sheet-roll-fail"></div>
|
|
{{/rollGreater() val need}}
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</rolltemplate>
|
|
|
|
<rolltemplate class="sheet-rolltemplate-mth">
|
|
<div class="sheet-mth-container">
|
|
<div class="sheet-header">
|
|
<div><h3>{{name}}</h3></div>
|
|
Throws/Shoots their {{weapon}}
|
|
</div>
|
|
<div>from <span>{{range}} range</span></div>
|
|
<div class="sheet-results">
|
|
<div class="sheet-need-col">
|
|
<div class="sheet-need-header">Needs a</div>
|
|
<div class="sheet-needed">{{need}}</div>
|
|
<div class="sheet-need-footer">or higher</div>
|
|
</div>
|
|
<div class="sheet-roll-col">
|
|
<div class="sheet-roll-header">And got</div>
|
|
<div class="sheet-roll-val">{{val}}</div>
|
|
{{#^rollLess() val need}}
|
|
<div class="sheet-roll-success"></div>
|
|
{{/^rollLess() val need}}
|
|
{{#rollLess() val need}}
|
|
<div class="sheet-roll-fail"></div>
|
|
{{/rollLess() val need}}
|
|
</div>
|
|
</div>
|
|
{{#rollLess() val need}}
|
|
That would be a miss
|
|
{{/rollLess() val need}}
|
|
{{#^rollLess() val need}}
|
|
<div class="sheet-dmg-done">
|
|
That is a hit doing <span class="sheet-mth-dmg">{{dmg}}</span>
|
|
{{#afplus}}
|
|
<span class="sheet-plus">+1</span>
|
|
{{/afplus}}
|
|
{{#rollTotal() dmg 1}}
|
|
pt
|
|
{{/rollTotal() dmg 1}}
|
|
{{#^rollTotal() dmg 1}}
|
|
pts
|
|
{{/^rollTotal() dmg 1}}
|
|
of Damage to the
|
|
{{#rollTotal() whereto 1}}
|
|
<span class="sheet-hlbl">Head</span>
|
|
{{#rollWasCrit() dmg }}
|
|
<div class="sheet-maxdmg">Mortal</div>
|
|
{{/rollWasCrit() dmg }}
|
|
{{/rollTotal() whereto 1}}
|
|
{{#rollTotal() whereto 2}}
|
|
<span class="sheet-hlbl">Neck</span>
|
|
{{#rollWasCrit() dmg }}
|
|
<div class="sheet-maxdmg">Mortal</div>
|
|
{{/rollWasCrit() dmg }}
|
|
{{/rollTotal() whereto 2}}
|
|
{{#rollTotal() whereto 3}}
|
|
<span class="sheet-hlbl">Left Shoulder</span>
|
|
{{/rollTotal() whereto 3}}
|
|
{{#rollTotal() whereto 4}}
|
|
<span class="sheet-hlbl">Right Shoulder</span>
|
|
{{/rollTotal() whereto 4}}
|
|
{{#rollTotal() whereto 5}}
|
|
<span class="sheet-hlbl">Left Arm</span>
|
|
{{/rollTotal() whereto 5}}
|
|
{{#rollTotal() whereto 6}}
|
|
<span class="sheet-hlbl">Right Arm</span>
|
|
{{/rollTotal() whereto 6}}
|
|
{{#rollTotal() whereto 7}}
|
|
<span class="sheet-hlbl">Chest</span>
|
|
{{#rollWasCrit() dmg }}
|
|
<div class="sheet-maxdmg">Mortal</div>
|
|
{{/rollWasCrit() dmg }}
|
|
{{/rollTotal() whereto 7}}
|
|
{{#rollTotal() whereto 8}}
|
|
<span class="sheet-hlbl">Back</span>
|
|
{{#rollWasCrit() dmg }}
|
|
<div class="sheet-maxdmg">Mortal</div>
|
|
{{/rollWasCrit() dmg }}
|
|
{{/rollTotal() whereto 8}}
|
|
{{#rollTotal() whereto 9}}
|
|
<span class="sheet-hlbl">Left Leg</span>
|
|
{{/rollTotal() whereto 9}}
|
|
{{#rollTotal() whereto 10}}
|
|
<span class="sheet-hlbl">Right Leg</span>
|
|
{{/rollTotal() whereto 10}}
|
|
</div>
|
|
{{/^rollLess() val need}}
|
|
</div>
|
|
</rolltemplate>
|
|
|
|
<!--============================================================-->
|
|
<!-- Hand to Hand Attack -->
|
|
|
|
<rolltemplate class="sheet-rolltemplate-hth">
|
|
{{#af}}
|
|
<div class="sheet-hth-container">
|
|
<div class="sheet-header">
|
|
<div><h3>{{name}}</h3></div>
|
|
attacks with {{af}}
|
|
</div>
|
|
<div class="sheet-results">
|
|
<div class="sheet-need-col">
|
|
<div class="sheet-need-header">Needs a</div>
|
|
<div class="sheet-needed">{{need}}</div>
|
|
<div class="sheet-need-footer">or higher</div>
|
|
</div>
|
|
<div class="sheet-roll-col">
|
|
<div class="sheet-roll-header">And got</div>
|
|
<div class="sheet-roll-val">{{val}}</div>
|
|
{{#^rollLess() val need}}
|
|
<div class="sheet-roll-success"></div>
|
|
{{/^rollLess() val need}}
|
|
{{#rollLess() val need}}
|
|
<div class="sheet-roll-fail"></div>
|
|
{{/rollLess() val need}}
|
|
</div>
|
|
</div>
|
|
{{#rollLess() val need}}
|
|
That would be a miss
|
|
{{/rollLess() val need}}
|
|
{{#^rollLess() val need}}
|
|
<div class="sheet-dmg-done">
|
|
That is a hit doing <span class="sheet-hth-dmg">{{dmg}}</span>
|
|
{{#afplus}}
|
|
<span class="sheet-plus">+1</span>
|
|
{{/afplus}}
|
|
{{#rollTotal() dmg 1}}
|
|
pt
|
|
{{/rollTotal() dmg 1}}
|
|
{{#^rollTotal() dmg 1}}
|
|
pts
|
|
{{/^rollTotal() dmg 1}}
|
|
of Damage to the
|
|
{{#rollTotal() whereto 1}}
|
|
<span class="sheet-hlbl">Head</span>
|
|
{{#rollWasCrit() dmg }}
|
|
<div class="sheet-maxdmg">Mortal</div>
|
|
{{/rollWasCrit() dmg }}
|
|
{{/rollTotal() whereto 1}}
|
|
{{#rollTotal() whereto 2}}
|
|
<span class="sheet-hlbl">Neck</span>
|
|
{{#rollWasCrit() dmg }}
|
|
<div class="sheet-maxdmg">Mortal</div>
|
|
{{/rollWasCrit() dmg }}
|
|
{{/rollTotal() whereto 2}}
|
|
{{#rollTotal() whereto 3}}
|
|
<span class="sheet-hlbl">Left Shoulder</span>
|
|
{{/rollTotal() whereto 3}}
|
|
{{#rollTotal() whereto 4}}
|
|
<span class="sheet-hlbl">Right Shoulder</span>
|
|
{{/rollTotal() whereto 4}}
|
|
{{#rollTotal() whereto 5}}
|
|
<span class="sheet-hlbl">Left Arm</span>
|
|
{{/rollTotal() whereto 5}}
|
|
{{#rollTotal() whereto 6}}
|
|
<span class="sheet-hlbl">Right Arm</span>
|
|
{{/rollTotal() whereto 6}}
|
|
{{#rollTotal() whereto 7}}
|
|
<span class="sheet-hlbl">Chest</span>
|
|
{{#rollWasCrit() dmg }}
|
|
<div class="sheet-maxdmg">Mortal</div>
|
|
{{/rollWasCrit() dmg }}
|
|
{{/rollTotal() whereto 7}}
|
|
{{#rollTotal() whereto 8}}
|
|
<span class="sheet-hlbl">Back</span>
|
|
{{#rollWasCrit() dmg }}
|
|
<div class="sheet-maxdmg">Mortal</div>
|
|
{{/rollWasCrit() dmg }}
|
|
{{/rollTotal() whereto 8}}
|
|
{{#rollTotal() whereto 9}}
|
|
<span class="sheet-hlbl">Left Leg</span>
|
|
{{/rollTotal() whereto 9}}
|
|
{{#rollTotal() whereto 10}}
|
|
<span class="sheet-hlbl">Right Leg</span>
|
|
{{/rollTotal() whereto 10}}
|
|
</div>
|
|
{{/^rollLess() val need}}
|
|
</div>
|
|
{{/af}}
|
|
</rolltemplate>
|
|
|
|
|
|
|
|
<script type="text/worker">
|
|
// I want to do somethings synchronously, and cannot using roll20's getAttrs()
|
|
// so keeping a copy of all attributes in a global object called characters.
|
|
// this object is global so is available to all players, but only written to
|
|
// by the player who has the character.
|
|
// characters = {
|
|
// character_name1: {character's stats},
|
|
// character_name2: {character's stats}
|
|
// }
|
|
var characters = {};
|
|
|
|
const race_base_lp = {
|
|
'M': 7,
|
|
'D': 6,
|
|
'E': 5
|
|
};
|
|
const run_str_bp = [3, 5, 8, 10, 12];
|
|
|
|
const all_attrs = [ 'character_name',
|
|
'char_str', 'char_int', 'char_dex',
|
|
'char_race', 'char_type',
|
|
'al', 'al_base', 'al_fighter', 'al_thief',
|
|
'al_magician', 'al_alchemist', 'al_priest',
|
|
'numattacks', 'af', 'af_plus', 'af_base', 'af_dmg',
|
|
'mth_af', 'mth_af_base', 'mth_af_plus',
|
|
'lp', 'lp_base', 'bs', 'bs_base',
|
|
'load_cat', 'full_load', 'run_idx', 'max_run',
|
|
'el', 'el_base', 'el_fighter', 'el_thief',
|
|
'el_magician', 'el_alchemist', 'el_priest',
|
|
'ep_fighter', 'ep_thief', 'ep_magician',
|
|
'ep_alchemist', 'ep_priest',
|
|
'dm', 'ip', 'di',
|
|
'swq1', 'swq2', 'swq3', 'swq4',
|
|
'pwq1', 'pwq2', 'pwq3', 'pwq4',
|
|
'bwq1', 'bwq2', 'bwq3', 'bwq4',
|
|
'lc_4lc', 'lc_dto', 'lc_moo', 'lc_lod',
|
|
'copper', 'silver', 'gold', 'mythril',
|
|
'mp', 'ing',
|
|
'hth_weapon_dmg', 'mth_weapon_dmg',
|
|
'mth_short', 'mth_medium', 'mth_long',
|
|
]
|
|
|
|
const Character = {
|
|
char_str: 0, char_int: 0, char_dex: 0,
|
|
char_race: 'M', char_type: 'fighter',
|
|
al: 1, al_base: 1, al_fighter: 1, al_thief: 1,
|
|
al_magician: 1, al_alchemist: 1, al_priest: 1,
|
|
numattacks: 1, af: '', af_plus: '', af_base: '', af_dmg: '',
|
|
mth_af: '', mth_af_base: '', mth_af_plus: '',
|
|
lp: '', lp_base: 0, bs: '', bs_base: 0,
|
|
load_cat: 'no', full_load: 0, run_idx: 0, max_run: 0,
|
|
el: 1, el_base: 1, el_fighter: 1, el_thief: 1,
|
|
el_magician: 0, el_alchemist: 0, el_priest: 1,
|
|
ep_fighter: '', ep_thief: '',
|
|
ep_magician: '', ep_alchemist: '', ep_priest: '',
|
|
dm: 0, ip: 0, di: 0,
|
|
swq1: 0, swq2: 0, swq3: 0, swq4: 0,
|
|
pwq1: 0, pwq2: 0, pwq3: 0, pwq4: 0,
|
|
bwq1: 0, bwq2: 0, bwq3: 0, bwq4: 0,
|
|
lc_4lc: 0, lc_dto: 0, lc_moo: 0, lc_lod: 0,
|
|
copper: 0, silver: 100, gold: 0, mythril: 0,
|
|
mp: 0, ing: 0,
|
|
hth_weapon_dmg: 'd8', mth_weapon_dmg: 'd6',
|
|
mth_short: '10', mth_medium: '--', mth_long: '--',
|
|
}
|
|
|
|
const num_attacks = [1, 1, 1, 2, 2, 3, 3];
|
|
|
|
const hthWeaponDmgMap = {
|
|
gsw: 'd10', bax: 'd10',
|
|
mst: 'd9',
|
|
sw: 'd8', ax: 'd8',
|
|
ssw: 'd7', sb: 'd7', wh: 'd7', mtk: 'd7', sp: 'd7', pk: 'd7',
|
|
cl: 'd6', hm: 'd6', to: 'd6', kn: 'd6', dg: 'd6', ha: 'd6'
|
|
}
|
|
|
|
const mthWeaponDmgMap = {
|
|
x: 'd5', sl: 'd5',
|
|
tKn: 'd6', bw: 'd6', lbw: 'd6',
|
|
sp: 'd7', pk: 'd7', xbw: 'd7'
|
|
}
|
|
|
|
const al_class_map = {
|
|
fighter: [1, 2, 3, 4, 5, 6, 7],
|
|
thief: [1, 2, 3, 4, 5, 6],
|
|
magician: [1, 1, 2, 2, 3, 3, 3, 3],
|
|
alchemist: [1, 1, 2, 2, 3, 3],
|
|
priest: [1, 1, 1, 1, 1, 1, 1]
|
|
};
|
|
|
|
const mpa_map = {
|
|
fighter: ['char_str', 2, 4, 6, 8, 10, 12, 13],
|
|
thief: ['char_dex', 5, 7, 9, 11, 12, 13],
|
|
magician: ['char_int', 11, 11, 11, 11, 12, 13, 14, 15],
|
|
alchemist: ['char_int', 10, 10, 10, 11, 12, 13],
|
|
priest: ['char_int', 2, 4, 6, 8, 10, 12, 13]
|
|
};
|
|
|
|
const mth_dex_bp = [3, 5, 8, 10, 12, 13, 14, 15];
|
|
|
|
// missile to hit map array
|
|
const mth_map = [
|
|
['10', '--', '--'],
|
|
[ '9', '10', '--'],
|
|
[ '8', '9', '10'],
|
|
[ '7', '8', '9'],
|
|
[ '5', '7', '8'],
|
|
[ '4', '6', '7'],
|
|
[ '3', '5', '6'],
|
|
[ '2', '4', '5'],
|
|
[ '1', '3', '4']
|
|
];
|
|
|
|
const sv_bp = [1, 3, 5, 8, 10, 12, 15];
|
|
const sv_map = [
|
|
[10, 9, 9, 8, 8],
|
|
[ 9, 8, 8, 7, 7],
|
|
[ 8, 7, 7, 6, 6],
|
|
[ 7, 7, 6, 6, 5],
|
|
[ 7, 6, 6, 5, 4],
|
|
[ 6, 6, 5, 4, 3],
|
|
[ 6, 5, 4, 3, 2],
|
|
[ 5, 4, 3, 2, 1]
|
|
];
|
|
|
|
const parseValues = function (values, stat, type = 'int') {
|
|
if (type === 'int') return parseInt(values[stat]) || 0;
|
|
else if (type === 'float') return parseFloat(values[stat]) || 0;
|
|
else if (type === 'str') return values[stat];
|
|
}
|
|
|
|
const set_numattacks = () => {
|
|
getAttrs(['el_fighter'], (v) => {
|
|
console.log('set_numattacks el_fighter:', v.el_fighter);
|
|
setAttrs({numattacks: num_attacks[parseInt(v.el_fighter) - 1]});
|
|
});
|
|
}
|
|
|
|
const getBaseLP = (_char) => {
|
|
if (_char.char_str === '') return;
|
|
let lp = 0;
|
|
lp = race_base_lp[_char.char_race];
|
|
if (_char.char_str > 9) lp += 1;
|
|
if (_char.char_str > 12) lp += 1;
|
|
if (_char.char_str === 15) lp += 1;
|
|
return lp;
|
|
};
|
|
|
|
const getElForKlass = (klass, ep, mpa) => {
|
|
const mpa_bp = mpa_map[klass].slice(1);
|
|
const bps = ep_el_breakpoints[klass];
|
|
let el = 0;
|
|
|
|
let mpa_el_cap = 0;
|
|
for (let bp of mpa_bp) {
|
|
if (mpa >= bp)
|
|
mpa_el_cap++;
|
|
}
|
|
|
|
for (let bp of bps) {
|
|
if (ep >= bp) el += 1;
|
|
}
|
|
if (el > mpa_el_cap) el = mpa_el_cap;
|
|
if (el === 0) {
|
|
if (klass === 'fighter' || klass === 'thief' || klass === 'priest')
|
|
el = 1;
|
|
}
|
|
|
|
return el;
|
|
};
|
|
|
|
const getMaxLoad = (str) => {
|
|
if (str === '') return;
|
|
|
|
let run_idx = 0;
|
|
const full_loads = [70, 80, 90, 100, 120, 150];
|
|
for (let bp of run_str_bp) {
|
|
if (str > bp) run_idx += 1;
|
|
}
|
|
const ml = full_loads[run_idx];
|
|
return {
|
|
"max": ml,
|
|
"run_idx": run_idx
|
|
};
|
|
};
|
|
|
|
const getMaxRunSpeed = (load) => {
|
|
const speeds = {
|
|
no: [7, 8, 9, 10, 10, 9],
|
|
half: [5, 6, 7, 8, 9, 8],
|
|
full: [4, 4, 5, 6, 7, 7]
|
|
}
|
|
return speeds[load.load_cat][load.run_idx];
|
|
};
|
|
|
|
const getMTHmap = (dex) => {
|
|
idx = 0;
|
|
for (let bp of mth_dex_bp) {
|
|
if (dex > bp) idx++;
|
|
}
|
|
return mth_map[idx];
|
|
};
|
|
|
|
const get_sv_idx = (atr) => {
|
|
let idx = 0;
|
|
for (let bp of sv_bp) {
|
|
if (atr >= bp) idx++;
|
|
}
|
|
return idx;
|
|
};
|
|
|
|
const getSaves = (_str, _int, el) => {
|
|
const saves = {};
|
|
let el_idx = el-1;
|
|
console.log('el_idx', el_idx);
|
|
if (el>4) el_idx = el - 1;
|
|
if (el_idx > 3) el_idx = -1;
|
|
if (el_idx < 0) el_idx = 0;
|
|
|
|
let idx = 0;
|
|
if (_str !== null ) {
|
|
for (bp of sv_bp) {
|
|
if(_str > bp) idx += 1;
|
|
}
|
|
saves.poison = saves.exposure = sv_map[idx][el_idx];
|
|
}
|
|
|
|
idx = 0;
|
|
if (_int !== null ) {
|
|
for (bp of sv_bp) {
|
|
if (_int > bp) idx++;
|
|
}
|
|
saves.spell = saves.thief = sv_map[idx][el_idx];
|
|
}
|
|
return saves;
|
|
}
|
|
|
|
class Dice {
|
|
|
|
constructor(rng = 6) {
|
|
this.seed = this.set_seed();
|
|
this.range = rng;
|
|
}
|
|
|
|
set_seed = () => {
|
|
const t = new Date().getTime();
|
|
const ts = "." + t.toString().split('').reverse().join('');
|
|
return parseFloat(ts);
|
|
}
|
|
|
|
next_seed = () => {
|
|
let s = Math.abs(Math.pow(Math.PI, this.seed) - Math.log2(this.seed));
|
|
s *= s * 1000000;
|
|
this.seed = s - Math.floor(s);
|
|
}
|
|
|
|
roll = (rng = null) => {
|
|
let q = 0;
|
|
if (rng) q = rng * this.seed;
|
|
else q = this.range * this.seed;
|
|
this.next_seed();
|
|
return Math.floor(q);
|
|
}
|
|
}
|
|
|
|
const d6 = new Dice(6);
|
|
|
|
const rollStat = function () {
|
|
let stat = d6.roll() + d6.roll() + 2;
|
|
if (stat === 12) {
|
|
if (d6.roll() > 4) {
|
|
stat += 1;
|
|
if (d6.roll() > 4) {
|
|
stat += 1;
|
|
if (d6.roll() > 4) {
|
|
stat += 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return stat;
|
|
};
|
|
|
|
const new_char = (_char) => {
|
|
for (key of Object.keys(Character)) {
|
|
_char[key] = Character[key];
|
|
}
|
|
}
|
|
|
|
const cp_char = (name, _char) => {
|
|
let c = characters[name];
|
|
if(c === undefined) {
|
|
c = characters[name] = {};
|
|
}
|
|
for( key in Object.keys(_char)) {
|
|
c[key] = _char[key];
|
|
}
|
|
};
|
|
|
|
const cp_values = (v, _char) => {
|
|
for (key of Object.keys(v)) {
|
|
_char[key] = v[key];
|
|
}
|
|
}
|
|
|
|
on('sheet:opened', function () {
|
|
getAttrs(all_attrs, (v) => {
|
|
console.log('sheet opened for:', v.character_name);
|
|
let _char = {};
|
|
|
|
let _str = parseValues(v, 'char_str');
|
|
let _int = parseValues(v, 'char_int');
|
|
let _dex = parseValues(v, 'char_dex');
|
|
|
|
|
|
|
|
if (_str === 0 && _int === 0 && _dex === 0) {
|
|
// if str, int, and dex are zero, assuming character is dead, so clear
|
|
// or reset all fields
|
|
new_char(_char);
|
|
|
|
// character now reset, roll new stats
|
|
_str = _char.char_str = rollStat();
|
|
_int = _char.char_int = rollStat();
|
|
_dex = _char.char_dex = rollStat();
|
|
_char.lp_base = getBaseLP({
|
|
char_str: _str, char_race: v.char_race
|
|
});
|
|
|
|
_char.bs_base = _str;
|
|
|
|
mthmap = getMTHmap(_dex);
|
|
_char.mth_short = mthmap[0];
|
|
_char.mth_short_base = mthmap[0];
|
|
_char.mth_medium = mthmap[1];
|
|
_char.mth_medium_base = mthmap[1];
|
|
_char.mth_long = mthmap[2];
|
|
_char.mth_long_base = mthmap[2];
|
|
|
|
const svs = getSaves(_str, _int, 1);
|
|
_char.sv_spell = svs.spell;
|
|
_char.sv_thief = svs.thief;
|
|
_char.sv_poison = svs.poison;
|
|
_char.sv_exposure = svs.exposure;
|
|
|
|
_char.numattacks = num_attacks[parseInt(v.al_fighter) - 1];
|
|
|
|
// new character setup done. now copy to back end copy
|
|
cp_char(v.character_name, _char);
|
|
} else {
|
|
// just open character card, and not a new chararacter
|
|
// so copy old values to back end copy of character
|
|
|
|
// get list of charater names in back end copy of characters
|
|
const chars = Object.keys(characters);
|
|
let ci = chars.indexOf(v.character_name);
|
|
|
|
// indexOf from above will return -1 if current characters
|
|
// name is not in the list. Proceed to copy current values
|
|
// to backend copy.
|
|
if(ci === -1) {
|
|
cp_values(v, _char);
|
|
characters[v.character_name] = _char;
|
|
} else {
|
|
// need to set characters name in current character data
|
|
_char = characters[v.character_name];
|
|
}
|
|
}
|
|
|
|
const load = getMaxLoad(_str);
|
|
load.load_cat = 'half'; // default to half load
|
|
_char.max_run = getMaxRunSpeed(load);
|
|
_char.full_load = load.max;
|
|
_char.run_idx = load.run_idx;
|
|
|
|
// console.log('_char:', _char);
|
|
setAttrs(_char, () => {
|
|
set_dex_bonus(v.char_dex);
|
|
set_Thief_Functions();
|
|
});
|
|
});
|
|
});
|
|
|
|
on('change:load_cat', () => {
|
|
getAttrs(['load_cat', 'char_str'], (v) => {
|
|
const _char = {};
|
|
const maxLoad = getMaxLoad(v.char_str);
|
|
_char.load_cat = v.load_cat;
|
|
_char.char_str = v.char_str;
|
|
_char.full_load = maxLoad.max;
|
|
_char.run_idx = maxLoad.run_idx;
|
|
_char.max_run = getMaxRunSpeed(_char);
|
|
|
|
setAttrs(_char);
|
|
});
|
|
});
|
|
|
|
on('change:lp', () => {
|
|
getAttrs(['lp', 'lp_max'], (values) => {
|
|
const lp = parseValues(values, 'lp');
|
|
const lpmax = parseValues(values, 'lp_max');
|
|
if (lp >= lpmax)
|
|
setAttrs({lp: ''});
|
|
})
|
|
});
|
|
|
|
on('change:char_race change:char_str', function () {
|
|
getAttrs(['char_str', 'char_dex', 'char_race', 'load_cat', 'mth_af_plus',
|
|
'lc_moo', 'armorments', 'ep_fighter', 'el'], (v) => {
|
|
const _str = parseValues(v, 'char_str');
|
|
const _dex = parseValues(v, 'char_dex');
|
|
const _el = parseInt(v.el) || 0;
|
|
if (_str === 0 || _dex === 0) return;
|
|
|
|
const load = getMaxLoad(_str);
|
|
const _char = {
|
|
char_str: _str, char_dex: _dex,
|
|
char_race: v.char_race,
|
|
load_cat: v.load_cat,
|
|
run_idx: load.run_idx
|
|
}
|
|
|
|
let _moo = parseValues(v, 'lc_moo');
|
|
if (_moo > 3) _moo = 3;
|
|
const saves = getSaves(_str, null, _el);
|
|
const ep = parseValues(v, 'ep_fighter');
|
|
const lp = getBaseLP(_char);
|
|
|
|
// determine weapon bonuses
|
|
const ench = parseInt(v.mth_af_plus) || 0;
|
|
const armorments = v.armorments === 'on' ? 1 : 0;
|
|
const mthmap = getMTHmap(_dex);
|
|
const elf_bonus = v.char_race === 'E' ? 1 : 0;
|
|
const mth_adj = armorments + ench + elf_bonus;
|
|
|
|
setAttrs({
|
|
mth_short_base: mthmap[0],
|
|
mth_short: mthmap[0] - mth_adj,
|
|
mth_medium_base: mthmap[1],
|
|
mth_medium: mthmap[1] - mth_adj,
|
|
mth_long_base: mthmap[2],
|
|
mth_long: mthmap[2] - mth_adj,
|
|
lp_base: lp,
|
|
lp_max: lp,
|
|
full_load: load.max,
|
|
run_idx: load.run_idx,
|
|
max_run: getMaxRunSpeed(_char),
|
|
base_bs: _str,
|
|
bs_max: _str,
|
|
el_fighter: getElForKlass('fighter', ep, _str),
|
|
sv_poison: saves.poison - _moo,
|
|
sv_exposure: saves.exposure
|
|
}, () => {
|
|
set_numattacks();
|
|
});
|
|
});
|
|
});
|
|
|
|
on('change:char_dex change:armorments', () => {
|
|
console.log('char_dex: changed');
|
|
getAttrs(['char_race', 'char_dex', 'mth_af_plus', 'armorments'], (v) => {
|
|
const _dex = parseValues(v, 'char_dex');
|
|
if (_dex === 0) return;
|
|
|
|
const ep = parseInt(v.ep_thief);
|
|
const ench = parseInt(v.mth_af_plus) || 0;
|
|
const el = getElForKlass('thief', ep, v.char_dex);
|
|
const armorments = v.armorments === 'on' ? 1 : 0;
|
|
const elf_bonus = v.char_race === 'E' ? 1 : 0;
|
|
const hit_adj = armorments + ench + elf_bonus;
|
|
const mthmap = getMTHmap(_dex);
|
|
let medium = mthmap[1];
|
|
if (medium !== '--') medium -= hit_adj;
|
|
let long = mthmap[2];
|
|
if (long !== '--') long -= hit_adj;
|
|
|
|
setAttrs({
|
|
el_thief: el,
|
|
mth_short_base: mthmap[0],
|
|
mth_short: mthmap[0] - hit_adj,
|
|
mth_medium_base: mthmap[1],
|
|
mth_medium: medium,
|
|
mth_long_base: mthmap[2],
|
|
mth_long: long
|
|
});
|
|
set_dex_bonus(parseInt(v.char_dex));
|
|
});
|
|
|
|
});
|
|
|
|
on('change:char_int', () => {
|
|
console.log('char_int: changed');
|
|
getAttrs(['ep_magician', 'ep_alchemist', 'ep_priest', 'lc_4lc', 'lc_dto', 'el'], (v) => {
|
|
const _int = parseValues(v, 'char_int');
|
|
if (_int === 0) return;
|
|
|
|
let ep = parseInt(v.ep_magician);
|
|
const el_m = getElForKlass('magician', ep, _int);
|
|
ep = parseInt(v.ep_alchemist);
|
|
const el_a = getElForKlass('alchemist', ep, _int);
|
|
ep = parseInt(v.ep_priest);
|
|
const el_p = getElForKlass('priest', ep, _int);
|
|
let _4lc = parseValues(v, 'lc_4lc');
|
|
if (_4lc > 3) _4lc = 3;
|
|
let _dto = parseValues(v, 'lc_dto');
|
|
if (_dto > 3) _dto = 3;
|
|
const saves = getSaves(null, _int, parseInt(v.el) || 0);
|
|
|
|
setAttrs({
|
|
el_magician: el_m,
|
|
el_alchemist: el_a,
|
|
el_priest: el_p,
|
|
sv_spell: saves.spell - _4lc,
|
|
sv_thief: saves.thief - _dto
|
|
});
|
|
});
|
|
|
|
});
|
|
|
|
on('clicked:lpadd clicked:bsadd', (event) => {
|
|
const att = event.triggerName.slice(8, 10);
|
|
getAttrs([att, att + '_max'], (values) => {
|
|
let q = parseValues(values, att, 'str');
|
|
let qmax = parseValues(values, att + '_max');
|
|
if (q === '') return;
|
|
else q = parseInt(q) + 1;
|
|
|
|
if (q >= qmax) q = '';
|
|
const _atts = {};
|
|
_atts[att] = q;
|
|
setAttrs(_atts);
|
|
});
|
|
});
|
|
|
|
on('clicked:lpminus clicked:bsminus', (event) => {
|
|
const att = event.triggerName.slice(8, 10);
|
|
getAttrs([att, att + '_max'], (values) => {
|
|
let q = parseValues(values, att, 'str');
|
|
let qmax = parseValues(values, att + '_max');
|
|
if (q === '') q = qmax - 1;
|
|
else q = parseInt(q) - 1;
|
|
const _atts = {};
|
|
_atts[att] = q;
|
|
setAttrs(_atts);
|
|
});
|
|
});
|
|
|
|
on('change:af', () => {
|
|
getAttrs(['af'], (values) => {
|
|
const af_update = {};
|
|
const hthList = Object.keys(hthWeaponDmgMap);
|
|
let keyIdx = null;
|
|
let plus = values.af.match(/(^[+]\d|^[m])/);
|
|
if (plus !== null) {
|
|
plus = plus[0];
|
|
af_update.af_base = values.af.slice(plus.length).toLowerCase();
|
|
af_update.af_plus = plus.length === 1 ? 4 : parseInt(plus.charAt(1));
|
|
} else {
|
|
af_update.af_base = values.af.toLowerCase();
|
|
af_update.af_plus = '';
|
|
}
|
|
keyIdx = hthList.indexOf(af_update.af_base);
|
|
af_update.af_dmg = '';
|
|
if(keyIdx >= 0) {
|
|
af_update.af_dmg = hthWeaponDmgMap[af_update.af_base];
|
|
}
|
|
|
|
console.log('af_update:', af_update);
|
|
setAttrs(af_update);
|
|
});
|
|
});
|
|
|
|
on('change:mth_af', () => {
|
|
console.log('mth attack factor changed:');
|
|
getAttrs(['mth_af', 'mth_short_base', 'mth_medium_base',
|
|
'mth_long_base', 'char_race', 'armorments'], (v) => {
|
|
const af = v.mth_af.toLowerCase();
|
|
let short = parseInt(v.mth_short_base);
|
|
let medium = parseInt(v.mth_medium_base) || '--';
|
|
let long = parseInt(v.mth_long_base) || '--';
|
|
const armorments = v.armorments === 'on' ? 1 : 0;
|
|
const elf_bonus = v.char_race === 'E' ? 1 : 0;
|
|
let mth_adj = armorments + elf_bonus;
|
|
const af_update = {};
|
|
let ench = af.match(/(^[+]\d|^[m])/);
|
|
if(ench == null) {
|
|
af_update.mth_af_base = af;
|
|
af_update.mth_af_plus = '';
|
|
af_update.mth_short = short - mth_adj;
|
|
af_update.mth_medium = medium - mth_adj;
|
|
af_update.mth_long = long - mth_adj;
|
|
} else {
|
|
ench = ench[0];
|
|
if (ench === 'm') {
|
|
af_update.mth_af_base = af.slice(1);
|
|
af_update.mth_short = 1;
|
|
af_update.mth_medium = 1;
|
|
af_update.mth_long = 1;
|
|
af_update.mth_af_plus = 4;
|
|
} else {
|
|
ench = parseInt(ench.charAt(1));
|
|
|
|
mth_adj += ench;
|
|
af_update.mth_af_base = af.slice(2);
|
|
af_update.mth_short = short - mth_adj;
|
|
if(medium !== '--')
|
|
af_update.mth_medium = medium - mth_adj;
|
|
if(long !== '--')
|
|
af_update.mth_long = long - mth_adj;
|
|
af_update.mth_af_plus = ench;
|
|
}
|
|
}
|
|
mth_af_base = af_update.mth_af_base;
|
|
af_update.mth_weapon_dmg = mthWeaponDmgMap[mth_af_base];
|
|
console.log('--=>', short, medium, long, af_update);
|
|
setAttrs(af_update);
|
|
});
|
|
});
|
|
|
|
on('change:atkr_al change:atk_order change:melee_num change:al change:af_plus', () => {
|
|
getAttrs(['al', 'atkr_al', 'tactics', 'atk_order', 'melee_num', 'af_plus'],
|
|
(v) => {
|
|
let al = parseInt(v.al) || 1;
|
|
const atk_al = parseInt(v.atkr_al) || 1;
|
|
const af_ench = parseInt(v.af_plus) || 0;
|
|
|
|
// tactics is only effective on first melee, so on first
|
|
// melee add one to al
|
|
if(v.tactics === 'on' && parseInt(v.melee_num) === 1) {
|
|
al += 1;
|
|
}
|
|
|
|
// order of attack, is this character 1st, 2nd, 3rd,
|
|
// 4th, 5th... attacker; get bonus if not first attacker.
|
|
let order = parseInt(v.atk_order);
|
|
if(order < 1) order = 1;
|
|
let order_bonus = [0, 1, 1, 2, 2, 3][order-1];
|
|
|
|
let toHit = [7, 6, 6, 5, 5, 4, 4, 3];
|
|
let al_diff = al - atk_al;
|
|
if(atk_al > al) {
|
|
toHit = [7, 7, 8, 8, 9, 9, 10, 10];
|
|
al_diff = atk_al - al;
|
|
}
|
|
let hth_idx = al_diff;
|
|
if( hth_idx > 6) hth_idx = 6;
|
|
setAttrs({
|
|
hth_need: toHit[hth_idx] - af_ench - order_bonus
|
|
});
|
|
|
|
|
|
});
|
|
});
|
|
|
|
on('change:df change:ar', (event) => {
|
|
const att = event.triggerName;
|
|
|
|
let plus = event.newValue.match(/^[+]\d/);
|
|
const _attrs = {};
|
|
if (plus !== null) {
|
|
plus = plus[0];
|
|
_attrs[att + '_plus'] = parseInt(plus.charAt(1));
|
|
} else {
|
|
_attrs[att + '_plus'] = '';
|
|
}
|
|
setAttrs(_attrs);
|
|
|
|
});
|
|
|
|
const ep_el_breakpoints = {
|
|
fighter: [0, 20, 60, 200, 1200, 4000, 10000],
|
|
thief: [0, 30, 100, 500, 1800, 7500],
|
|
magician: [1, 20, 70, 250, 1500, 5000, 15000, 30000],
|
|
alchemist: [1, 20, 50, 200, 1300, 6500],
|
|
priest: [0, 20, 100, 400, 1500, 7000, 20000]
|
|
};
|
|
|
|
on("change:ep_fighter change:ep_thief change:ep_magician \
|
|
change:ep_alchemist change:ep_priest", (event) => {
|
|
getAttrs(['char_str', 'char_int', 'char_dex', 'el_fighter',
|
|
'el_thief', 'el_magician', 'el_alchemist', 'el_priest' ], (v) => {
|
|
console.log('eps changed', event);
|
|
const all_ep = [
|
|
parseValues(v, 'el_fighter'),
|
|
parseValues(v, 'el_thief'),
|
|
parseValues(v, 'el_magician'),
|
|
parseValues(v, 'el_alchemist'),
|
|
parseValues(v, 'el_priest')]
|
|
|
|
const klass = event.sourceAttribute.slice(3);
|
|
let klass_el = 0;
|
|
const ep = parseInt(event.newValue);
|
|
|
|
klass_el = getElForKlass(klass, ep, v[mpa_map[klass][0]]);
|
|
|
|
attr = {el: Math.max(...all_ep)};
|
|
attr[`el_${klass}`] = klass_el;
|
|
|
|
if (klass === 'fighter') {
|
|
attr['numattacks'] = num_attacks[klass_el - 1];
|
|
}
|
|
|
|
setAttrs(attr);
|
|
|
|
if (klass === 'thief') set_Thief_Functions(klass_el);
|
|
if (klass === 'magician') set_detect_magic(klass_el);
|
|
if (klass === 'alchemist') set_identify_potion(klass_el);
|
|
if (klass === 'priest') set_divine_inspiration(klass_el);
|
|
|
|
set_al();
|
|
});
|
|
});
|
|
|
|
on('change:el_thief change:char_race', () => {
|
|
set_Thief_Functions();
|
|
});
|
|
|
|
on('change:tactics change:onhorse change:higherground', (event) => {
|
|
console.log('tactics, horse, or higher ground changed', event);
|
|
set_al();
|
|
});
|
|
|
|
const set_al = () => {
|
|
console.log('setting al');
|
|
getAttrs(['al_fighter', 'al_thief', 'al_magician', 'al_alchemist', 'al_priest',
|
|
'el_fighter', 'el_thief', 'el_magician', 'el_alchemist', 'el_priest',
|
|
'tactics', 'onhorse', 'higherground', 'al'], (values) => {
|
|
const klass = ['fighter', 'thief', 'magician', 'alchemist', 'priest'];
|
|
const als = [];
|
|
for (let k of klass) {
|
|
let idx = (parseValues(values, `el_${k}`) - 1);
|
|
if (idx < 0) idx = 0;
|
|
|
|
als.push(al_class_map[k][idx]);
|
|
}
|
|
|
|
let al_add = 0;
|
|
if (values.onhorse === 'on' || values.higherground === 'on')
|
|
al_add = 1;
|
|
|
|
const new_al = Math.max(...als) + al_add;
|
|
setAttrs({al: new_al});
|
|
|
|
});
|
|
};
|
|
|
|
const set_dex_bonus = (dex) => {
|
|
let bonus = 0;
|
|
if (dex > 8) bonus = dex - 8;
|
|
|
|
setAttrs({dex_bonus: bonus});
|
|
}
|
|
|
|
const thief_functions = {
|
|
CW: [30, 45, 60, 70, 79, 87],
|
|
PL: [25, 40, 52, 64, 76, 87],
|
|
NT: [20, 36, 49, 62, 75, 87],
|
|
PS: [15, 30, 45, 60, 73, 85],
|
|
MQ: [17, 33, 50, 67, 73, 85],
|
|
MU: [25, 38, 50, 62, 74, 85],
|
|
HN: [15, 25, 45, 65, 80, 90]
|
|
};
|
|
|
|
const thief_func_race_bonus = {
|
|
M: [0, 0, 0, 4, 0, 0, 0],
|
|
D: [0, 3, 3, 2, 0, 0, 0],
|
|
E: [2, 0, 0, 0, 3, 3, 3]
|
|
};
|
|
|
|
const set_Thief_Functions = () => {
|
|
console.log('setting thief functions');
|
|
getAttrs(['char_race', 'el_thief'], (v) => {
|
|
race = v.char_race;
|
|
const idx = parseInt(v.el_thief) - 1;
|
|
|
|
const rb = thief_func_race_bonus[race];
|
|
setAttrs({
|
|
cw: thief_functions.CW[idx],
|
|
pl: thief_functions.PL[idx],
|
|
nt: thief_functions.NT[idx],
|
|
ps: thief_functions.PS[idx],
|
|
mq: thief_functions.MQ[idx],
|
|
mu: thief_functions.MU[idx],
|
|
hn: thief_functions.HN[idx],
|
|
cw_bonus: rb[0],
|
|
pl_bonus: rb[1],
|
|
nt_bonus: rb[2],
|
|
ps_bonus: rb[3],
|
|
mq_bonus: rb[4],
|
|
mu_bonus: rb[5],
|
|
hn_bonus: rb[6]
|
|
});
|
|
|
|
})
|
|
};
|
|
|
|
const swpwbw = [
|
|
[0, 0, 0, 0],
|
|
[1, 0, 0, 0],
|
|
[2, 0, 0, 0],
|
|
[3, 1, 0, 0],
|
|
[4, 2, 0, 0],
|
|
[5, 3, 1, 0],
|
|
[6, 4, 2, 0],
|
|
[6, 5, 3, 1],
|
|
[6, 5, 4, 2]
|
|
];
|
|
const set_detect_magic = (el) => {
|
|
console.log('setting detect magic');
|
|
const dm_vals = [0, 10, 30, 50, 70, 85, 90, 93, 95];
|
|
|
|
const sw = swpwbw[el];
|
|
|
|
setAttrs({
|
|
swq1: sw[0],
|
|
swq2: sw[1],
|
|
swq3: sw[2],
|
|
swq4: sw[3],
|
|
dm: dm_vals[el]
|
|
});
|
|
};
|
|
|
|
const set_identify_potion = (el) => {
|
|
console.log('setting identify potion');
|
|
const ip_vals = [0, 10, 30, 50, 70, 90, 95];
|
|
const pw = swpwbw[el];
|
|
setAttrs({
|
|
pwq1: pw[0],
|
|
pwq2: pw[1],
|
|
pwq3: pw[2],
|
|
pwq4: pw[3],
|
|
ip: ip_vals[el]
|
|
});
|
|
};
|
|
|
|
const set_divine_inspiration = (el) => {
|
|
console.log('setting divine ispiration');
|
|
const di_vals = [10, 25, 40, 60, 80, 90, 95];
|
|
const bw = swpwbw[el];
|
|
|
|
setAttrs({
|
|
bwq1: bw[0],
|
|
bwq2: bw[1],
|
|
bwq3: bw[2],
|
|
bwq4: bw[3],
|
|
di: di_vals[el - 1]
|
|
});
|
|
};
|
|
|
|
const sv_lc_map = {
|
|
lc_4lc: 'sv_spell',
|
|
lc_dto: 'sv_thief',
|
|
lc_moo: 'sv_poison'
|
|
}
|
|
on('change:lc_4lc change:lc_dto change:lc_moo', (event) => {
|
|
console.log(`${event.sourceAttribute} changed`);
|
|
const lc_key = event.sourceAttribute;
|
|
const sv_key = sv_lc_map[lc_key];
|
|
|
|
getAttrs(['char_str', 'char_int', 'el', 'lc_4lc', 'lc_dto', 'lc_moo'], (v) => {
|
|
const svs = getSaves(parseValues(v, 'char_str'), parseValues(v, 'char_int'),
|
|
parseValues(v, 'el'));
|
|
const saves = {};
|
|
let lc = parseValues(v, lc_key);
|
|
if (lc > 3) lc = 3;
|
|
saves[sv_key] = svs[sv_key.slice(3)] - lc;
|
|
|
|
setAttrs(saves);
|
|
});
|
|
})
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|