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

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>