Files

920 lines
55 KiB
HTML

<div class="sheet-character">
<h1 class="main-title header-font" data-i18n="TOW RPG Character Sheet">TOW RPG Character Sheet</h1>
<div class="grid-container">
<div class="char-info-box">
<div class="info-line">
<label for="name" data-i18n="Name">Name</label>
<input type="text" id="character_name" name="attr_character_name">
</div>
<div class="info-line">
<label for="origin" data-i18n="Origin">Origin</label>
<input type="text" id="origin" name="attr_origin">
</div>
<div class="info-line">
<label for="career" data-i18n="Career">Career</label>
<input type="text" id="career" name="attr_career">
</div>
</div>
<div class="top-stats-box">
<div class="stat-box">
<div data-i18n="Fate">Fate</div>
<div class="fate-container">
<div class="fate-input-group">
<input type="number" id="fate_current" name="attr_fate_current">
<span class="sub-label" data-i18n="Remaining">Remaining</span>
</div>
<div class="fate-input-group">
<input type="number" id="fate_max" name="attr_fate_max">
<span class="sub-label" data-i18n="Maximum">Maximum</span>
</div>
</div>
</div>
<div class="stat-box">
<div data-i18n="XP">XP</div>
<div class="fate-container">
<div class="fate-input-group">
<input type="number" id="xp" name="attr_xp">
<span class="sub-label" data-i18n="Current">Current</span>
</div>
<div class="fate-input-group">
<input type="number" id="xp_total" name="attr_xp_total">
<span class="sub-label" data-i18n="Total">Total</span>
</div>
</div>
</div>
<div class="stat-box">
<div data-i18n="Speed">Speed</div>
<div class="fate-container">
<input type="text"
id="speed" name="attr_speed"
style="width: 80px;">
</div>
</div>
<div style="visibility: hidden; display: flex; gap: 0.5rem; justify-content: center;">
<div style="display: flex; flex-direction: column; gap: 0.25rem; justify-content: center;">
<button class="export-button" @click="triggerImport" data-i18n="Import Sheet">Import Sheet</button>
<button class="export-button" @click="clearSheet" data-i18n="Clear Sheet">Clear Sheet</button>
</div>
<div style="display: flex; flex-direction: column; gap: 0.25rem; justify-content: center;">
<button class="export-button" @click="exportSheet" data-i18n="Export Sheet">Export Sheet</button>
<button class="export-button" @click="printSheet" data-i18n="Print Sheet">Print Sheet</button>
</div>
</div>
<input type="file" id="sheet-import" @change="importSheet($event)" accept=".json" style="display: none;">
</div>
<div class="char-skills-box">
<div class="chars-and-skills-container">
<div class="char-skill-row">
<div class="char-side">
<div class="char-info">
<span class="char-abbr" data-i18n="WS">WS</span>
<span class="char-fullname" data-i18n="WEAPON SKILL">WEAPON SKILL</span>
</button>
</div>
<div class="char-value-container">
<input type="number" id="attr_ws" name="attr_ws">
<input type="checkbox" id="attr_ws_favoured" name="attr_ws_favoured">
</div>
</div>
<div class="skills-side">
<div class="skill-line">
<input type="number" id="attr_skill_melee" name="attr_skill_melee" style="width: 40px; text-align: center;">
<button type="action" value="ws|melee|skill" name="act_towroll"><span class="skill-name" data-i18n="Melee">Melee</span></button>
<div style="display: flex; align-items: center; gap: 0.5rem;">
<input type="number" id="attr_skill_melee_improvement" name="attr_skill_melee_improvement" style="width: 40px; text-align: center;">
</div>
</div>
<div class="skill-line">
<input type="number" id="attr_skill_defence" name="attr_skill_defence" style="width: 40px; text-align: center;">
<button type="action" value="ws|defence|skill" name="act_towroll"><span class="skill-name" data-i18n="Defence">Defence</span></button>
<div style="display: flex; align-items: center; gap: 0.5rem;">
<input type="number" id="attr_skill_defence_improvement" name="attr_skill_defence_improvement" style="width: 40px; text-align: center;">
</div>
</div>
</div>
</div>
<div class="char-skill-row">
<div class="char-side">
<div class="char-info">
<span class="char-abbr" data-i18n="BS">BS</span>
<span class="char-fullname" data-i18n="BALLISTIC SKILL">BALLISTIC SKILL</span>
</div>
<div class="char-value-container">
<input type="number" id="attr_bs" name="attr_bs">
<input type="checkbox" id="attr_bs_favoured" name="attr_bs_favoured">
</div>
</div>
<div class="skills-side">
<div class="skill-line">
<input type="number" id="attr_skill_shooting" name="attr_skill_shooting" style="width: 40px; text-align: center;">
<button type="action" value="bs|shooting|skill" name="act_towroll"><span class="skill-name" data-i18n="Shooting">Shooting</span></button>
<div style="display: flex; align-items: center; gap: 0.5rem;">
<input type="number" id="attr_skill_shooting_improvement" name="attr_skill_shooting_improvement" style="width: 40px; text-align: center;">
</div>
</div>
<div class="skill-line">
<input type="number" id="attr_skill_throwing" name="attr_skill_throwing" style="width: 40px; text-align: center;">
<button type="action" value="bs|throwing|skill" name="act_towroll"><span class="skill-name" data-i18n="Throwing">Throwing</span></button>
<div style="display: flex; align-items: center; gap: 0.5rem;">
<input type="number" id="attr_skill_throwing_improvement" name="attr_skill_throwing_improvement" style="width: 40px; text-align: center;">
</div>
</div>
</div>
</div>
<div class="char-skill-row">
<div class="char-side">
<div class="char-info">
<span class="char-abbr" data-i18n="S">S</span>
<span class="char-fullname" data-i18n="STRENGTH">STRENGTH</span>
</div>
<div class="char-value-container">
<input type="number" id="attr_s" name="attr_s">
<input type="checkbox" id="attr_s_favoured" name="attr_s_favoured">
</div>
</div>
<div class="skills-side">
<div class="skill-line">
<input type="number" id="attr_skill_brawn" name="attr_skill_brawn" style="width: 40px; text-align: center;">
<button type="action" value="s|brawn|skill" name="act_towroll"><span class="skill-name" data-i18n="Brawn">Brawn</span></button>
<div style="display: flex; align-items: center; gap: 0.5rem;">
<input type="number" id="attr_skill_brawn_improvement" name="attr_skill_brawn_improvement" style="width: 40px; text-align: center;">
</div>
</div>
<div class="skill-line">
<input type="number" id="attr_skill_toil" name="attr_skill_toil" style="width: 40px; text-align: center;">
<button type="action" value="s|toil|skill" name="act_towroll"><span class="skill-name" data-i18n="Toil">Toil</span></button>
<div style="display: flex; align-items: center; gap: 0.5rem;">
<input type="number" id="attr_skill_toil_improvement" name="attr_skill_toil_improvement" style="width: 40px; text-align: center;">
</div>
</div>
</div>
</div>
<div class="char-skill-row">
<div class="char-side">
<div class="char-info">
<span class="char-abbr" data-i18n="T">T</span>
<span class="char-fullname" data-i18n="TOUGHNESS">TOUGHNESS</span>
</div>
<div class="char-value-container">
<input type="number" id="attr_t" name="attr_t">
<input type="checkbox" id="attr_t_favoured" name="attr_t_favoured">
</div>
</div>
<div class="skills-side">
<div class="skill-line">
<input type="number" id="attr_skill_survival" name="attr_skill_survival" style="width: 40px; text-align: center;">
<button type="action" value="t|survival|skill" name="act_towroll"><span class="skill-name" data-i18n="Survival">Survival</span></button>
<div style="display: flex; align-items: center; gap: 0.5rem;">
<input type="number" id="attr_skill_survival_improvement" name="attr_skill_survival_improvement" style="width: 40px; text-align: center;">
</div>
</div>
<div class="skill-line">
<input type="number" id="attr_skill_endurance" name="attr_skill_endurance" style="width: 40px; text-align: center;">
<button type="action" value="t|endurance|skill" name="act_towroll"><span class="skill-name" data-i18n="Endurance">Endurance</span></button>
<div style="display: flex; align-items: center; gap: 0.5rem;">
<input type="number" id="attr_skill_endurance_improvement" name="attr_skill_endurance_improvement" style="width: 40px; text-align: center;">
</div>
</div>
</div>
</div>
<div class="char-skill-row">
<div class="char-side">
<div class="char-info">
<span class="char-abbr" data-i18n="I">I</span>
<span class="char-fullname" data-i18n="Initiative">Initiative</span>
</div>
<div class="char-value-container">
<input type="number" id="attr_i" name="attr_i">
<input type="checkbox" id="attr_i_favoured" name="attr_i_favoured">
</div>
</div>
<div class="skills-side">
<div class="skill-line">
<input type="number" id="attr_skill_awareness" name="attr_skill_awareness" style="width: 40px; text-align: center;">
<button type="action" value="i|awareness|skill" name="act_towroll"><span class="skill-name" data-i18n="Awareness">Awareness</span></button>
<div style="display: flex; align-items: center; gap: 0.5rem;">
<input type="number" id="attr_skill_awareness_improvement" name="attr_skill_awareness_improvement" style="width: 40px; text-align: center;">
</div>
</div>
<div class="skill-line">
<input type="number" id="attr_skill_dexterity" name="attr_skill_dexterity" style="width: 40px; text-align: center;">
<button type="action" value="i|dexterity|skill" name="act_towroll"><span class="skill-name" data-i18n="Dexterity">Dexterity</span></button>
<div style="display: flex; align-items: center; gap: 0.5rem;">
<input type="number" id="attr_skill_dexterity_improvement" name="attr_skill_dexterity_improvement" style="width: 40px; text-align: center;">
</div>
</div>
</div>
</div>
<div class="char-skill-row">
<div class="char-side">
<div class="char-info">
<span class="char-abbr" data-i18n="Ag">Ag</span>
<span class="char-fullname" data-i18n="AGILITY">AGILITY</span>
</div>
<div class="char-value-container">
<input type="number" id="attr_ag" name="attr_ag">
<input type="checkbox" id="attr_ag_favoured" name="attr_ag_favoured">
</div>
</div>
<div class="skills-side">
<div class="skill-line">
<input type="number" id="attr_skill_athletics" name="attr_skill_athletics" style="width: 40px; text-align: center;">
<button type="action" value="ag|athletics|skill" name="act_towroll"><span class="skill-name" data-i18n="Athletics">Athletics</span></button>
<div style="display: flex; align-items: center; gap: 0.5rem;">
<input type="number" id="attr_skill_athletics_improvement" name="attr_skill_athletics_improvement" style="width: 40px; text-align: center;">
</div>
</div>
<div class="skill-line">
<input type="number" id="attr_skill_stealth" name="attr_skill_stealth" style="width: 40px; text-align: center;">
<button type="action" value="ag|stealth|skill" name="act_towroll"><span class="skill-name" data-i18n="Stealth">Stealth</span></button>
<div style="display: flex; align-items: center; gap: 0.5rem;">
<input type="number" id="attr_skill_stealth_improvement" name="attr_skill_stealth_improvement" style="width: 40px; text-align: center;">
</div>
</div>
</div>
</div>
<div class="char-skill-row">
<div class="char-side">
<div class="char-info">
<span class="char-abbr" data-i18n="RE">RE</span>
<span class="char-fullname" data-i18n="REASON">REASON</span>
</div>
<div class="char-value-container">
<input type="number" id="attr_re" name="attr_re">
<input type="checkbox" id="attr_re_favoured" name="attr_re_favoured">
</div>
</div>
<div class="skills-side">
<div class="skill-line">
<input type="number" id="attr_skill_willpower" name="attr_skill_willpower" style="width: 40px; text-align: center;">
<button type="action" value="re|willpower|skill" name="act_towroll"><span class="skill-name" data-i18n="Willpower">Willpower</span></button>
<div style="display: flex; align-items: center; gap: 0.5rem;">
<input type="number" id="attr_skill_willpower_improvement" name="attr_skill_willpower_improvement" style="width: 40px; text-align: center;">
</div>
</div>
<div class="skill-line">
<input type="number" id="attr_skill_recall" name="attr_skill_recall" style="width: 40px; text-align: center;">
<button type="action" value="re|recall|skill" name="act_towroll"><span class="skill-name" data-i18n="Recall">Recall</span></button>
<div style="display: flex; align-items: center; gap: 0.5rem;">
<input type="number" id="attr_skill_recall_improvement" name="attr_skill_recall_improvement" style="width: 40px; text-align: center;">
</div>
</div>
</div>
</div>
<div class="char-skill-row">
<div class="char-side">
<div class="char-info">
<span class="char-abbr" data-i18n="Fel">Fel</span>
<span class="char-fullname" data-i18n="FELLOWSHIP">FELLOWSHIP</span>
</div>
<div class="char-value-container">
<input type="number" id="attr_fel" name="attr_fel">
<input type="checkbox" id="attr_fel_favoured" name="attr_fel_favoured">
</div>
</div>
<div class="skills-side">
<div class="skill-line">
<input type="number" id="attr_skill_leadership" name="attr_skill_leadership" style="width: 40px; text-align: center;">
<button type="action" value="fel|leadership|skill" name="act_towroll"><span class="skill-name" data-i18n="Leadership">Leadership</span></button>
<div style="display: flex; align-items: center; gap: 0.5rem;">
<input type="number" id="attr_skill_leadershp_improvement" name="attr_skill_leadershp_improvement" style="width: 40px; text-align: center;">
</div>
</div>
<div class="skill-line">
<input type="number" id="attr_skill_charm" name="attr_skill_charm" style="width: 40px; text-align: center;">
<button type="action" value="fel|charm|skill" name="act_towroll"><span class="skill-name" data-i18n="Charm">Charm</span></button>
<div style="display: flex; align-items: center; gap: 0.5rem;">
<input type="number" id="attr_skill_charm_improvement" name="attr_skill_charm_improvement" style="width: 40px; text-align: center;">
</div>
</div>
</div>
</div>
</div>
</div>
<div class="lore-talents-box box">
<h3 class="box-title" x-tooltip="tooltips.lore" data-i18n="Lore">Lore</h3>
<div class="lore-inputs">
<input type="text" id="attr_lore1" name="attr_lore1">
<input type="text" id="attr_lore2" name="attr_lore2">
<input type="text" id="attr_lore3" name="attr_lore3">
<input type="text" id="attr_lore4" name="attr_lore4">
<input type="text" id="attr_lore5" name="attr_lore5">
<input type="text" id="attr_lore6" name="attr_lore6">
</div>
<h3 class="box-title" x-tooltip="tooltips.talents" data-i18n="Talents">Talents</h3>
<div class="talents-inputs">
<textarea class="talents-textarea" id="attr-talent" name="attr_talent"></textarea>
<fieldset class="repeating_talents">
<textarea class="talents-textarea" id="attr-talent" name="attr_talent"></textarea>
</fieldset>
</div>
</div>
<div class="appearance-coin-box">
<div class="box">
<h3 class="box-title" data-i18n="Appearance">Appearance</h3>
<div class="talents-inputs">
<input type="text" id="attr_appearance1" name="attr_appearance1">
<input type="text" id="attr_appearance2" name="attr_appearance2">
<input type="text" id="attr_appearance3" name="attr_appearance3">
<input type="text" id="attr_appearance4" name="attr_appearance4">
<input type="text" id="attr_appearance5" name="attr_appearance5">
<input type="text" id="attr_appearance6" name="attr_appearance6">
</div>
</div>
<div class="box" style="margin-top: 1rem;">
<h3 class="box-title" data-i18n="Coin">Coin</h3>
<div class="info-line">
<label for="status" data-i18n="Status">Status</label>
<select id="status" name="attr_coin_status">
<option value="brass" data-i18n="Brass">Brass</option>
<option value="silver" data-i18n="Silver">Silver</option>
<option value="gold" data-i18n="Gold">Gold</option>
</select>
</div>
<div class="coin-grid-container" style="margin-top: 1rem;">
<label data-i18n="Brass">Brass</label>
<div class="coin-slots-container">
<input type="text" id="attr_coins_brass" name="attr_coins_brass">
</div>
<label data-i18n="Silver">Silver</label>
<div class="coin-slots-container">
<div class="coin-slots-container">
<input type="text" id="attr_coins_silver" name="attr_coins_silver">
</div>
</div>
<label data-i18n="Gold">Gold</label>
<div class="coin-slots-container">
<input type="text" id="attr_coins_gold" name="attr_coins_gold">
</div>
</div>
</div>
<div class="box" style="margin-top: 1rem; display: flex; gap: 1rem; justify-content: center;">
<div style="text-align: center;">
<h3 class="box-title" data-i18n="Resilience">Resilience</h3>
<div style="height: 30px; display: flex; align-items: center; justify-content: center;">
<input type="number" id="attr_resilience" name="attr_resilience" style="width: 50px; text-align: center; font-size: 1.5rem;">
</div>
<span class="sub-label" style="font-size: 0.8rem;" data-i18n="Toughness + Armour">Toughness + Armour</span>
</div>
<div style="text-align: center;">
<h3 class="box-title" data-i18n="Protection">Protection</h3>
<div style="height: 30px; display: flex; align-items: center; justify-content: center;">
<input type="number" id="attr_protection" name="attr_protection" style="width: 50px; text-align: center; font-size: 1.5rem;">
</div>
<span class="sub-label" style="font-size: 0.8rem;"data-i18n="Armour" >Armour</span>
</div>
</div>
</div>
<div class="weapons-box box">
<h3 class="box-title"data-i18n="Weapons" >Weapons</h3>
<div class="weapons">
<div class="weapons-row">
<h5 data-i18n="Action">Action</h5>
<h5 data-i18n="Name">Name</h5>
<h5 data-i18n="Range">Range</h5>
<h5 data-i18n="Dice Pool">Dice Pool</h5>
<h5 data-i18n="Skill">Skill</h5>
<h5 data-i18n="Damage">Damage</h5>
<h5 data-i18n="1h/2h">1h/2h</h5>
<h5 data-i18n="Traits">Traits</h5>
</div>
<fieldset class="repeating_weapons">
<div class="weapons-row">
<button type="action" value="bs|shooting|skill" name="act_towroll"><span class="skill-name" data-i18n="Roll">Roll</span></button>
<input type="text" name="attr_weapon_name">
<input type="text" name="attr_weapon_range">
<input type="number" name="attr_weapon_dice_pool" step="1">
<input type="number" name="attr_weapon_skill_value" step="1">
<input type="number" name="attr_weapon_damage" step="1">
<input type="text" name="attr_weapon_hands">
<input type="text" name="attr_weapon_traits">
</div>
</fieldset>
</div>
</div>
<div class="wounds-box box">
<h3 class="box-title" data-i18n="Wounds">Wounds</h3>
<ul class="wounds-list">
<li data-i18n="Treated">Treated</li>
<li><input type="checkbox" id="attr_wound_treated1" name="attr_wound_treated1"><input type="text" id="attr_wound_description1" name="attr_wound_description1"></li>
<li><input type="checkbox" id="attr_wound_treated2" name="attr_wound_treated2"><input type="text" id="attr_wound_description2" name="attr_wound_description2"></li>
<li><input type="checkbox" id="attr_wound_treated3" name="attr_wound_treated3"><input type="text" id="attr_wound_description3" name="attr_wound_description3"></li>
<li><input type="checkbox" id="attr_wound_treated4" name="attr_wound_treated4"><input type="text" id="attr_wound_description4" name="attr_wound_description4"></li>
<li><input type="checkbox" id="attr_wound_treated5" name="attr_wound_treated5"><input type="text" id="attr_wound_description5" name="attr_wound_description5"></li>
<li><input type="checkbox" id="attr_wound_treated6" name="attr_wound_treated6"><input type="text" id="attr_wound_description6" name="attr_wound_description6"></li>
<li><input type="checkbox" id="attr_wound_treated7" name="attr_wound_treated7"><input type="text" id="attr_wound_description7" name="attr_wound_description7"></li>
</ul>
<h3 class="box-title" style="margin-top: 1rem;" data-i18n="Conditions">Conditions</h3>
<ul class="wounds-list">
<li><span ><input type="checkbox" id="attr_staggered" name="attr_staggered" data-i18n="Staggered"> Staggered</span></li>
<li><input type="text" id="attr_condition1" name="attr_condition1"></li>
<li><input type="text" id="attr_condition2" name="attr_condition2"></li>
<li><input type="text" id="attr_condition3" name="attr_condition3"></li>
<li><input type="text" id="attr_condition4" name="attr_condition4"></li>
</ul>
</div>
<div class="trappings-box box">
<h3 class="box-title" x-tooltip="tooltips.trappings" data-i18n="Trappings">Trappings</h3>
<div class="talents-inputs">
<input type="text" id="attr_trappings" name="attr_trappings">
<fieldset class="repeating_trappings">
<input type="text" id="attr_trappings" name="attr_trappings">
</fieldset>
</div>
<h3 class="box-title" x-tooltip="tooltips.assets" style="margin-top: 1rem;" data-i18n="Assets">Assets</h3>
<div class="talents-inputs">
<input type="text" id="attr_assets" name="attr_assets">
<fieldset class="repeating_assets">
<input type="text" id="attr_assets" name="attr_assets">
</fieldset>
</div>
</div>
<div class="contacts-box box">
<h3 class="box-title" data-i18n="Contacts">Contacts</h3>
<ul class="contacts-list">
<li data-i18n="Name"><strong>Name</strong><strong style="margin-left: 80px;" data-i18n="Relationship">Relationship</strong></li>
<li><input type="text" id="attr_contact" name="attr_contact" style="width: 100px;"><input type="text" id="attr_relationship" name="attr_relationship"></li>
<fieldset class="repeating_contacts">
<li><input type="text" id="attr_contact" name="attr_contact" style="width: 100px;"><input type="text" id="attr_relationship" name="attr_relationship"></li>
</fieldset>
</ul>
</div>
<div class="magic-box box">
<h3 class="box-title" data-i18n="Magic">Magic</h3>
<div style="display: flex; justify-content: space-around; gap: 1rem; margin-bottom: 1rem;">
<div style="text-align: center;">
<label class="header-font" data-i18n="Wizard Level">Wizard Level</label>
<input type="number" id="attr_wizard_level" name="attr_wizard_level" style="width: 80px; text-align: center;">
</div>
<div style="text-align: center;">
<label class="header-font" data-i18n="Roll to Cast">Roll to Cast</label>
<button type="action" value="re|willpower|spell" name="act_towroll"><span class="skill-name" data-i18n="Cast">Cast</span></button>
</div>
</div>
<div style="border: 1px solid var(--ink-main); padding: 0.5rem; text-align: center;">
<h4 class="header-font" style="margin: 0 0 0.5rem 0; color: var(--ink-header);" data-i18n="Miscast Pool">Miscast Pool</h4>
<div style="display: flex; justify-content: center; align-items: center; gap: 5px;">
<input type="number" id="attr_miscast_pool" name="attr_miscast_pool" style="width: 80px; text-align: center;">
</div>
</div>
<div style="margin-top: 1rem;">
<h4 class="header-font" style="margin: 0 0 0.5rem 0; text-align: center; color: var(--ink-header);" data-i18n="Miscast Effects">Miscast Effects</h4>
<input type="text" id="attr_miscast_effects" name="attr_miscast_effects" style="margin-bottom: 0.5rem;">
</div>
</div>
<div class="other-characters-box box">
<h3 class="box-title" data-i18n="Other Characters">Other Characters</h3>
<ul class="contacts-list">
<li><strong>Name</strong><strong style="margin-left: 80px;" data-i18n="Relationship">Relationship</strong></li>
<li><input type="text" id="attr_other_character_name1" name="attr_other_character_name1" style="width: 100px;"><input type="text" id="attr_other_character_relationship1" name="attr_other_character_relationship1" ></li>
<li><input type="text" id="attr_other_character_name2" name="attr_other_character_name2" style="width: 100px;"><input type="text" id="attr_other_character_relationship2" name="attr_other_character_relationship2" ></li>
<li><input type="text" id="attr_other_character_name3" name="attr_other_character_name3" style="width: 100px;"><input type="text" id="attr_other_character_relationship3" name="attr_other_character_relationship3" ></li>
<li><input type="text" id="attr_other_character_name4" name="attr_other_character_name4" style="width: 100px;"><input type="text" id="attr_other_character_relationship4" name="attr_other_character_relationship4" ></li>
<li><input type="text" id="attr_other_character_name5" name="attr_other_character_name5" style="width: 100px;"><input type="text" id="attr_other_character_relationship5" name="attr_other_character_relationship5" ></li>
<li><input type="text" id="attr_other_character_name6" name="attr_other_character_name6" style="width: 100px;"><input type="text" id="attr_other_character_relationship6" name="attr_other_character_relationship6" ></li>
<li><input type="text" id="attr_other_character_name7" name="attr_other_character_name7" style="width: 100px;"><input type="text" id="attr_other_character_relationship7" name="attr_other_character_relationship7" ></li>
</ul>
</div>
<div class="spells-box box">
<h3 class="box-title" data-i18n="Spells">Spells</h3>
<div class="spells">
<div class="spells-row">
<h5 data-i18n="CV">CV</h5>
<h5 data-i18n="Target">Target</h5>
<h5 data-i18n="Range">Range</h5>
<h5 data-i18n="Duration">Duration</h5>
<h5 data-i18n="Formalised">Formalised</h5>
<h5 data-i18n="Memorised">Memorised</h5>
<h5 data-i18n="Effect">Effect</h5>
</div>
<fieldset class="repeating_spells">
<div class="spells-row">
<input type="number" id="attr_spell_cv" name="attr_spell_cv">
<input type="text" id="attr_spell_target" name="attr_spell_target">
<input type="text" id="attr_spell_range" name="attr_spell_range">
<input type="text" id="attr_spell_duration" name="attr_spell_duration">
<input type="checkbox" id="attr_spell_formalized" name="attr_spell_formalized">
<input type="checkbox" id="attr_spell_memorized" name="attr_spell_memorized">
<input type="text" id="attr_spell_effect" class="effect-input" name="attr_spell_effect">
</div>
</fieldset>
</div>
</div>
<div class="grim-portent-box box">
<h3 class="box-title" x-tooltip="tooltips.grimPortent" data-i18n="Grim Portent">Grim Portent</h3>
<div class="talents-inputs">
<input type="text" id="attr_grim_portent1" name="attr_grim_portent1">
<input type="text" id="attr_grim_portent2" name="attr_grim_portent2">
<input type="text" id="attr_grim_portent3" name="attr_grim_portent3">
<input type="text" id="attr_grim_portent4" name="attr_grim_portent4">
<input type="text" id="attr_grim_portent5" name="attr_grim_portent5">
<input type="text" id="attr_grim_portent6" name="attr_grim_portent6">
</div>
</div>
<div class="exacting-test-box box">
<h3 class="box-title" x-tooltip="tooltips.exactingTest" data-i18n="Exacting Test Progress">Exacting Test Progress</h3>
<div class="talents-inputs">
<input type="text" id="attr_exacting_test1" name="attr_exacting_test1">
<input type="text" id="attr_exacting_test2" name="attr_exacting_test2">
<input type="text" id="attr_exacting_test3" name="attr_exacting_test3">
<input type="text" id="attr_exacting_test4" name="attr_exacting_test4">
<input type="text" id="attr_exacting_test5" name="attr_exacting_test5">
<input type="text" id="attr_exacting_test6" name="attr_exacting_test6">
</div>
</div>
<div class="clues-insights-box box">
<h3 class="box-title" x-tooltip="tooltips.cluesAndInsights" data-i18n="Clues and Insights">Clues and Insights</h3>
<div class="talents-inputs">
<input type="text" id="attr_clues_insights1" name="attr_clues_insights1">
<input type="text" id="attr_clues_insights2" name="attr_clues_insights2">
<input type="text" id="attr_clues_insights3" name="attr_clues_insights3">
<input type="text" id="attr_clues_insights4" name="attr_clues_insights4">
<input type="text" id="attr_clues_insights5" name="attr_clues_insights5">
<input type="text" id="attr_clues_insights6" name="attr_clues_insights6">
</div>
</div>
<div class="favours-owed-box box">
<h3 class="box-title" x-tooltip="tooltips.favoursOwed" data-i18n="Favours Owed">Favours Owed</h3>
<div class="talents-inputs">
<input type="text" id="attr_favours_owed1" name="attr_favours_owed1">
<input type="text" id="attr_favours_owed2" name="attr_favours_owed2">
<input type="text" id="attr_favours_owed3" name="attr_favours_owed3">
<input type="text" id="attr_favours_owed4" name="attr_favours_owed4">
<input type="text" id="attr_favours_owed5" name="attr_favours_owed5">
<input type="text" id="attr_favours_owed6" name="attr_favours_owed6">
</div>
</div>
<div class="notes-box box">
<h3 class="box-title" x-tooltip="tooltips.notes" data-i18n="Notes">Notes</h3>
<textarea class="notes-textarea" id="attr_notes" name="attr_notes"></textarea>
</div>
</div>
</div>
</div>
<!--Roll Template-->
<rolltemplate class="sheet-rolltemplate-tow1ed">
<table>
<tr>
<th colspan="2" class="sheet-title"><b>{{ Character Name }}</b> {{selected_skill}}</th>
</tr>
<tr>
<td><span class="sheet-tcat" data-i18n="Skill: ">Skill: </span></td>
<td><span class="sheet-inlinerollresult">{{skill}}</span></td>
</tr>
<tr>
<td><span class="sheet-tcat" data-i18n="Dice Pool: ">Dice Pool: </span></td>
<td><span class="sheet-inlinerollresult">{{characteristic}}d + {{modifier}}d</span></td>
</tr>
<tr class="sheet-topline">
<th colspan="2"><span></span></th>
</tr>
<tr>
<td><span class="sheet-tcat" data-i18n="Numbers Rolled:">Numbers Rolled:</span></td>
<td><span class="sheet-inlinerollresult">{{computed::numbers_rolled}}</span></td>
</tr>
<tr>
<td><span class="sheet-tcat" data-i18n="Successes:">Successes:</span></td>
<td><span class="sheet-inlinerollresult">{{computed::successes}}</span></td>
</tr>
{{#rollTotal() glorious 1}}
<tr>
<td><span class="sheet-tcat" data-i18n="Rerolled Failures:">Rerolled Failures:</span></td>
<td><span class="sheet-inlinerollresult">{{computed::glorious_rerolled}}</span></td>
</tr>
<tr>
<td><span class="sheet-tcat" data-i18n="Total Successes:">Total Successes:</span></td>
<td><span class="sheet-inlinerollresult">{{computed::total_successes}}</span></td>
</tr>
{{/rollTotal() glorious 1}}
{{#rollTotal() glorious 2}}
<tr>
<td><span class="sheet-tcat" data-i18n="Rerolled Successes:">Rerolled Successes:</span></td>
<td><span class="sheet-inlinerollresult">{{computed::grim_rerolled}}</span></td>
</tr>
<tr>
<td><span class="sheet-tcat" data-i18n="Total Successes:">Total Successes:</span></td>
<td><span class="sheet-inlinerollresult">{{computed::total_successes}}</span></td>
</tr>
{{/rollTotal() glorious 2}}
<tr>
<td><span class="sheet-tcat" data-i18n="Success Type:">Success Type:</span></td>
<td><span class="sheet-inlinerollresult">{{computed::success_type}}</span></td>
</tr>
</table>
</rolltemplate>
<!--Roll Template-->
<rolltemplate class="sheet-rolltemplate-tow1ed2">
<table>
<tr>
<th colspan="2" class="sheet-title"><b>{{ Character Name }}</b> {{name}}</th>
</tr>
<tr>
<td><span class="sheet-tcat" data-i18n="Skill: ">Skill: </span></td>
<td><span class="sheet-inlinerollresult">{{skill}}</span></td>
</tr>
<tr>
<td><span class="sheet-tcat" data-i18n="Dice Pool: ">Dice Pool: </span></td>
<td><span class="sheet-inlinerollresult">{{dice_pool}}d + {{modifier}}d</span></td>
</tr>
<tr class="sheet-topline">
<th colspan="2"><span></span></th>
</tr>
<tr>
<td><span class="sheet-tcat" data-i18n="Numbers Rolled:">Numbers Rolled:</span></td>
<td><span class="sheet-inlinerollresult">{{computed::numbers_rolled}}</span></td>
</tr>
<tr>
<td><span class="sheet-tcat" data-i18n="Successes:">Successes:</span></td>
<td><span class="sheet-inlinerollresult">{{computed::successes}}</span></td>
</tr>
{{#rollTotal() glorious 1}}
<tr>
<td><span class="sheet-tcat" data-i18n="Rerolled Failures:">Rerolled Failures:</span></td>
<td><span class="sheet-inlinerollresult">{{computed::glorious_rerolled}}</span></td>
</tr>
<tr>
<td><span class="sheet-tcat" data-i18n="Total Successes:">Total Successes:</span></td>
<td><span class="sheet-inlinerollresult">{{computed::total_successes}}</span></td>
</tr>
{{/rollTotal() glorious 1}}
{{#rollTotal() glorious 2}}
<tr>
<td><span class="sheet-tcat" data-i18n="Rerolled Successes:">Rerolled Successes:</span></td>
<td><span class="sheet-inlinerollresult">{{computed::grim_rerolled}}</span></td>
</tr>
<tr>
<td><span class="sheet-tcat" data-i18n="Total Successes:">Total Successes:</span></td>
<td><span class="sheet-inlinerollresult">{{computed::total_successes}}</span></td>
</tr>
{{/rollTotal() glorious 2}}
<tr>
<td><span class="sheet-tcat" data-i18n="Weapon Damage:">Weapon Damage:</span></td>
<td><span class="sheet-inlinerollresult">{{computed::damage}} - Opponent SL</span></td>
</tr>
<tr>
<td><span class="sheet-tcat" data-i18n="Traits:">Traits:</span></td>
<td><span class="sheet-inlinerollresult">{{traits}}</span></td>
</tr>
</table>
</rolltemplate>
<!-- <script> -->
<script type="text/worker">
function rollattack(roll_string, debug=false) {
if (debug) {
console.log("ROLL STRING:");
console.log(roll_string);
}
startRoll(roll_string, (results) => {
if (debug) {
console.log("ROLL RESULTS:");
console.log(results);
}
let dice_pool = results.results.dice_pool.result;
let damage = results.results.damage.result;
let skill = results.results.skill.result;
let modifier = results.results.modifier.result;
// 0 = Normal, 1 = Glorious (reroll failures), 2 = Grim (reroll successes)
let glorious = results.results.glorious ? results.results.glorious.result : 0;
dice_pool = (dice_pool + modifier) > 0 ? (dice_pool + modifier) : 1;
// console.log("DICE POOL: " + dice_pool);
let successes = 0; // successes in the first set of rolls
let total_successes = 0; // successes after rerolls (drives damage)
let numbers_rolled = [];
let glorious_rerolled = []; // newly rerolled dice (Glorious)
let grim_rerolled = []; // newly rerolled dice (Grim)
for (let i = 0; i < dice_pool; i++) {
let dieRoll = Math.floor(Math.random() * 10) + 1;
numbers_rolled.push(dieRoll); // original first-set roll
let isSuccess = dieRoll <= skill;
if (isSuccess) {
successes += 1;
}
let finalRoll = dieRoll;
// Glorious rerolls failures, Grim rerolls successes.
if (glorious == 1 && !isSuccess) {
finalRoll = Math.floor(Math.random() * 10) + 1;
glorious_rerolled.push(finalRoll); // the newly rerolled die
} else if (glorious == 2 && isSuccess) {
finalRoll = Math.floor(Math.random() * 10) + 1;
grim_rerolled.push(finalRoll); // the newly rerolled die
}
if (finalRoll <= skill) {
total_successes += 1;
}
}
damage = damage + total_successes;
if (debug) {
console.log("NUMBERS ROLLED: " + numbers_rolled);
console.log("SUCCESSES: " + successes);
console.log("Damage: " + damage);
console.log("Skill: " + skill);
}
finishRoll(
results.rollId,
{
modifier: modifier,
skill: skill,
dice_pool: dice_pool,
successes: successes,
numbers_rolled: numbers_rolled,
damage: damage,
glorious_rerolled: glorious_rerolled.length ? glorious_rerolled.join(", ") : "None",
grim_rerolled: grim_rerolled.length ? grim_rerolled.join(", ") : "None",
total_successes: total_successes
}
);
if (debug) {
console.log('MODIFIER: '+modifier);
console.log('SKILL: '+skill);
console.log('DICE POOL: '+dice_pool);
console.log('SUCCESSES: '+successes);
console.log('NUMBERS ROLLED: '+numbers_rolled);
console.log(results.results);
}
});
}
const repeating_list = ["repeating_weapons"];
repeating_list.forEach(trigger => {
on(`clicked:${trigger}`, function(eventInfo) {
const source = eventInfo["sourceAttribute"] ? eventInfo["sourceAttribute"] : "";
let reroll = source ? source : "roll";
let key = trigger.replace("repeating_", "");
key = key.slice(0, key.length - 1);
let test_list = [];
getAttrs(test_list.concat([
`${trigger}_${key}_name`,
`${trigger}_${key}_dice_pool`,
`${trigger}_${key}_damage`,
`${trigger}_${key}_traits`,
`${trigger}_${key}_skill_value`,
]), function(values) {
let name = values[`${trigger}_${key}_name`];
let dice_pool = parseInt(values[`${trigger}_${key}_dice_pool`])||0;
let damage = parseInt(values[`${trigger}_${key}_damage`])||0;
let traits = values[`${trigger}_${key}_traits`];
let skill = values[`${trigger}_${key}_skill_value`];
console.log(name + " | " + dice_pool + " | " + damage + " | " + traits + " | " + skill);
let roll_string = "&{template:tow1ed2} [[?{Dice Mod | None,+0 | 1d,+1 | 2d,+2 | 3d,+3 | 4d,+4 | 5d,+5 | -1d,-1 | -2d,-2 | -3d,-3 | -4d,-4 | -5d,-5}]] {{modifier=$[[0]]}}{{name="+name+"}}{{dice_pool=[["+dice_pool+"]]}}{{damage=[["+damage+"]]}}{{traits="+traits+"}}{{skill=[["+skill+"]]}}{{glorious=[[?{GLORIOUS? | Normal,0 | Glorious,1 | Grim,2}]]}}{{Character Name=@{character_name} }}{{successes=[[d10]]}}{{numbers_rolled=[[d10]]}}{{glorious_rerolled=[[d10]]}}{{grim_rerolled=[[d10]]}}{{total_successes=[[d10]]}}";
rollattack(roll_string, true);
//rollTest(reroll, skill_name, skill_total, diff_roll, circ, superiority, dmg, dmg_info, slmod, critfum);
});
});
});
on('clicked:towroll', (info) => {
let characteristic = info.htmlAttributes.value;
const myArray = characteristic.split("|");
const selected_characteristic = myArray[0];
let selected_skill = myArray[1];
const selected_rolltype = myArray[2];
const debug = false;
if (debug) {
console.log("Selected Characteristic: " + selected_characteristic);
console.log("Selected Skill: " + selected_skill);
console.log("Selected Roll Type: " + selected_rolltype);
}
let roll_string = "&{template:tow1ed} [[?{Dice Mod | None,+0 | 1d,+1 | 2d,+2 | 3d,+3 | 4d,+4 | 5d,+5 | -1d,-1 | -2d,-2 | -3d,-3 | -4d,-4 | -5d,-5}]] {{characteristic=[[@{"+selected_characteristic+"}]]}}{{skill=[[@{skill_"+selected_skill+"}]]}}{{modifier=$[[0]]}}{{glorious=[[?{GLORIOUS? | Normal,0 | Glorious,1 | Grim,2}]]}}{{selected_skill="+selected_skill+"}}{{successes=[[d10]]}}{{numbers_rolled=[[d10]]}}{{success_type=[[d10]]}}{{glorious_rerolled=[[d10]]}}{{grim_rerolled=[[d10]]}}{{total_successes=[[d10]]}}{{Character Name=@{character_name} }}";
if (selected_rolltype == 'spell') {
roll_string = "&{template:tow1ed} [[?{Dice Mod | None,+0 | 1d,+1 | 2d,+2 | 3d,+3 | 4d,+4 | 5d,+5 | -1d,-1 | -2d,-2 | -3d,-3 | -4d,-4 | -5d,-5}]] {{characteristic=[[@{"+selected_characteristic+"}]]}}{{skill=[[@{skill_"+selected_skill+"}]]}}{{miscast_pool=[[@{miscast_pool}]]}}{{selected_skill="+selected_skill+"}}{{wizard_level=[[@{wizard_level}]]}}{{modifier=$[[0]]}}{{glorious=[[?{GLORIOUS? | Normal,0 | Glorious,1 | Grim,2}]]}}{{successes=[[d10]]}}{{numbers_rolled=[[d10]]}}{{success_type=[[d10]]}}{{glorious_rerolled=[[d10]]}}{{grim_rerolled=[[d10]]}}{{total_successes=[[d10]]}}{{Character Name=@{character_name} }}";
selected_skill = "magic";
}
rolltest(roll_string, selected_skill, debug);
});
function rolltest(roll_string, selected_skill, debug=false) {
startRoll(roll_string, (results) => {
if (debug) {
console.log("ROLL RESULTS:");
console.log(results);
}
let characteristic = results.results.characteristic.result;
let skill = results.results.skill.result;
let modifier = results.results.modifier.result;
let miscast_pool = results.results.miscast_pool ? results.results.miscast_pool.result : null;
let wizard_level = results.results.wizard_level ? results.results.wizard_level.result : null;
// 0 = Normal, 1 = Glorious (reroll failures), 2 = Grim (reroll successes)
let glorious = results.results.glorious ? results.results.glorious.result : 0;
let dice_pool = (characteristic + modifier) > 0 ? (characteristic + modifier) : 1;
// console.log("DICE POOL: " + dice_pool);
let successes = 0; // successes in the first set of rolls
let total_successes = 0; // successes after rerolls (drives success type)
let numbers_rolled = [];
let nines_rolled = [];
let glorious_rerolled = []; // newly rerolled dice (Glorious)
let grim_rerolled = []; // newly rerolled dice (Grim)
for (let i = 0; i < dice_pool; i++) {
let dieRoll = Math.floor(Math.random() * 10) + 1;
numbers_rolled.push(dieRoll); // original first-set roll
let isSuccess = dieRoll <= skill;
if (isSuccess) {
successes += 1;
}
let finalRoll = dieRoll;
// Glorious rerolls failures, Grim rerolls successes.
if (glorious == 1 && !isSuccess) {
finalRoll = Math.floor(Math.random() * 10) + 1;
glorious_rerolled.push(finalRoll); // the newly rerolled die
} else if (glorious == 2 && isSuccess) {
finalRoll = Math.floor(Math.random() * 10) + 1;
grim_rerolled.push(finalRoll); // the newly rerolled die
}
if (finalRoll == 9 && selected_skill == "magic") {
nines_rolled.push(finalRoll);
}
if (finalRoll <= skill) {
total_successes += 1;
}
}
if (debug) {
console.log("NUMBERS ROLLED: " + numbers_rolled);
console.log("SUCCESSES: " + successes);
console.log("Miscast Pool: " + miscast_pool);
console.log("Wizard Level: " + wizard_level);
console.log("Selected Skill: " + selected_skill);
console.log("Nines Rolled: " + nines_rolled.length);
}
if (((nines_rolled.length + miscast_pool) > wizard_level) && selected_skill == "magic") {
successes = 0;
total_successes = 0;
success_type = "Miscast Failure!";
} else if (total_successes >= 3) {
success_type = "Total Success!";
} else if (total_successes >= 2) {
success_type = "Success";
} else if (total_successes >= 1) {
success_type = "Marginal Success";
} else {
success_type = "Failure!";
}
finishRoll(
results.rollId,
{
modifier: modifier,
characteristic: characteristic,
skill: skill,
dice_pool: dice_pool,
successes: successes,
numbers_rolled: numbers_rolled,
success_type: success_type,
glorious_rerolled: glorious_rerolled.length ? glorious_rerolled.join(", ") : "None",
grim_rerolled: grim_rerolled.length ? grim_rerolled.join(", ") : "None",
total_successes: total_successes
}
);
if (debug) {
console.log('MODIFIER: '+modifier);
console.log('CHARACTERISTIC: '+characteristic);
console.log('SKILL: '+skill);
console.log('DICE POOL: '+dice_pool);
console.log('SUCCESSES: '+successes);
console.log('NUMBERS ROLLED: '+numbers_rolled);
console.log('SUCCESS_TYPE: '+success_type);
console.log(results.results);
}
});
}
</script>