- CRITICAL: dsnSafeShow() guard on all 7 Dice So Nice awaits — a stalled DSN animation froze the whole roll pipeline (attack charged Bullet Tax but never posted its card). Rolls now always complete within 3.5s of a DSN stall. - RULES: racial Health/Resolve modifiers were silently dropped at runtime (RACE_DERIVED_MODS all zeros + three inconsistent race key sets). Canonical race keys via canonicalRaceKey(); Stormer +2 HP, Ebon/Wraith +1 RES, Shaktar/Frother +1 HP, Frother/Vevaphon -1 RES now actually apply. - Sheet race dropdown matched 'wraith' but actors store 'wraithraider' — showed '-- SELECT --' for every Wraith Raider. Fixed across all sheets. - Natural weapons (Wraith Teeth & Claw, Morphic Strike…) now appear in the Equipment tab's Melee Weapons list with a STRIKE button. - PC wizard: unspent attribute/skill points now require a second click with an explicit '<N> points unspent — Next anyway?' prompt. - First-run world setup: branded 'Mort — Downtown Grid' landing scene (user's SLA neon art) + 'START HERE' GM briefing journal on first GM login. - Removed Blade Runner splash/banner art (wrong game, third-party trademark). - CSS: push button no longer wraps mid-word; dice flow layout; GM toolbar chips unified into the v2 chrome; natural-weapon row accent. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
795 lines
36 KiB
Handlebars
795 lines
36 KiB
Handlebars
<form class="{{cssClass}} slazero2" autocomplete="off">
|
||
|
||
{{!-- SHEET HEADER --}}
|
||
<div class="sheet-header"
|
||
>
|
||
{{#if drugAlerts.length}}
|
||
<div class="drug-alerts">
|
||
{{#each drugAlerts}}
|
||
<div class="drug-alert {{this.state}}">
|
||
<div class="drug-alert-main">
|
||
<span class="drug-alert-title">{{this.name}}</span>
|
||
<span class="drug-alert-duration">{{this.duration}}</span>
|
||
</div>
|
||
<div class="drug-alert-meta">{{this.summary}}</div>
|
||
<div class="drug-alert-actions">
|
||
<button type="button" class="drug-off-btn" data-item-id="{{this.itemId}}" title="Stop Drug Effect">
|
||
<i class="fas fa-power-off"></i> Off
|
||
</button>
|
||
</div>
|
||
</div>
|
||
{{/each}}
|
||
</div>
|
||
{{/if}}
|
||
|
||
{{!-- TOP ROW: Portrait + Name + Key Stats --}}
|
||
<div class="header-top-row">
|
||
<div class="avatar">
|
||
<img class="profile" src="{{actor.img}}" data-edit="img" data-tooltip="{{actor.name}}"/>
|
||
</div>
|
||
<div class="header-top-info">
|
||
<div class="actor-name">
|
||
<input type="text" name="name" value="{{actor.name}}" placeholder="Character Name"/>
|
||
</div>
|
||
<div class="header-top-stats">
|
||
<div class="mini-stat">
|
||
<span class="mini-stat-label">SCL</span>
|
||
<input type="number" name="system.details.scl" value="{{system.details.scl}}" placeholder="10" />
|
||
</div>
|
||
<div class="mini-stat">
|
||
<span class="mini-stat-label">Credits</span>
|
||
<input type="number" name="system.details.credits" value="{{system.details.credits}}" placeholder="500" />
|
||
</div>
|
||
<div class="init-buttons-inline">
|
||
<button type="button" class="init-agi" title="Initiative: AGI + Mobility (base score) + roll successes">⚡ AGI+MOB</button>
|
||
<button type="button" class="init-wit" title="Initiative: WIT + Observation (base score) + roll successes">⚡ WIT+OBS</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
{{!-- CHARACTER DETAILS ROW --}}
|
||
<div class="header-details-row">
|
||
<div class="detail-field">
|
||
<label>Race/Species</label>
|
||
<select name="system.race">
|
||
<option value="">-- Select --</option>
|
||
<option value="human" {{#if (eq system.race "human")}}selected{{/if}}>Human</option>
|
||
<option value="ebon" {{#if (eq system.race "ebon")}}selected{{/if}}>Ebon</option>
|
||
<option value="brainwaster" {{#if (eq system.race "brainwaster")}}selected{{/if}}>Brain Waster</option>
|
||
<option value="stormer" {{#if (eq system.race "stormer")}}selected{{/if}}>Stormer (313 Malice)</option>
|
||
<option value="shaktar" {{#if (eq system.race "shaktar")}}selected{{/if}}>Shaktar</option>
|
||
<option value="wraithraider" {{#if (contains system.race "wraith")}}selected{{/if}}>Wraith Raider</option>
|
||
<option value="frother" {{#if (eq system.race "frother")}}selected{{/if}}>Frother</option>
|
||
</select>
|
||
</div>
|
||
<div class="detail-field">
|
||
<label>Training Package</label>
|
||
<select name="system.training">
|
||
<option value="">-- Select --</option>
|
||
<option value="scout" {{#if (eq system.training "scout")}}selected{{/if}}>Scout</option>
|
||
<option value="investigator" {{#if (eq system.training "investigator")}}selected{{/if}}>Investigator</option>
|
||
<option value="corporate" {{#if (eq system.training "corporate")}}selected{{/if}}>Corporate</option>
|
||
<option value="medic" {{#if (eq system.training "medic")}}selected{{/if}}>Medic / Field Surgeon</option>
|
||
<option value="ebon-investigator" {{#if (eq system.training "ebon-investigator")}}selected{{/if}}>Ebon - Investigator</option>
|
||
<option value="brainwaster-operative" {{#if (eq system.training "brainwaster-operative")}}selected{{/if}}>Brain Waster - Operative</option>
|
||
</select>
|
||
</div>
|
||
<div class="detail-field">
|
||
<label>Archetype</label>
|
||
<input list="list-of-archetypes" type="text" name="system.archetype" value="{{system.archetype}}" placeholder="Investigator"/>
|
||
<datalist id="list-of-archetypes">
|
||
<option value="Operative">
|
||
<option value="Investigator">
|
||
<option value="Scout">
|
||
<option value="Medic">
|
||
<option value="Tech Specialist">
|
||
<option value="Corporate Agent">
|
||
</datalist>
|
||
</div>
|
||
<div class="detail-field armor-roll-field">
|
||
<label>Armour</label>
|
||
<button type="button" class="manual-armor-button header-armor-roll-btn" data-actor-id="{{actor._id}}" title="Run Armor Check">
|
||
<i class="fas fa-shield-alt"></i> Armour Roll
|
||
</button>
|
||
</div>
|
||
</div>
|
||
|
||
{{!-- VITALS ROW: Health, Resolve, Stress, Ebb --}}
|
||
<div class="header-vitals-row">
|
||
<div class="vital-box health-box">
|
||
<label>Health</label>
|
||
<div class="vital-values">
|
||
<input type="number" name="system.derivedStats.health.value" value="{{system.derivedStats.health.value}}" />
|
||
<span class="vital-separator">/</span>
|
||
<input type="number" name="system.derivedStats.health.max" value="{{system.derivedStats.health.max}}" />
|
||
</div>
|
||
</div>
|
||
<div class="vital-box resolve-box">
|
||
<label>Resolve</label>
|
||
<div class="vital-values">
|
||
<input type="number" name="system.derivedStats.resolve.value" value="{{system.derivedStats.resolve.value}}" />
|
||
<span class="vital-separator">/</span>
|
||
<input type="number" name="system.derivedStats.resolve.max" value="{{system.derivedStats.resolve.max}}" />
|
||
</div>
|
||
</div>
|
||
<div class="vital-box stress-vital">
|
||
<label>Stress</label>
|
||
<div class="stress-group">
|
||
<input type="number" class="stress-value" name="system.derivedStats.stress" value="{{system.derivedStats.stress}}" />
|
||
<button type="button" class="manual-panic-button" data-actor-id="{{actor._id}}" title="Roll Panic Check (1d6 + Stress)">
|
||
<i class="fas fa-skull"></i> Panic
|
||
</button>
|
||
</div>
|
||
</div>
|
||
{{#if isEbbUser}}
|
||
<div class="vital-box flux-vital">
|
||
<label>Flux</label>
|
||
<div class="vital-values">
|
||
<input type="number" name="system.flux.value" value="{{system.flux.value}}" min="0" max="{{computedFluxMax}}" class="flux-current" />
|
||
<span class="vital-separator">/</span>
|
||
<span class="flux-max-display">{{computedFluxMax}}</span>
|
||
</div>
|
||
</div>
|
||
{{/if}}
|
||
</div>
|
||
|
||
{{!-- CRITICAL INJURIES ROW --}}
|
||
<div class="header-crits-row">
|
||
<div class="crit-buttons">
|
||
<button type="button" class="roll-physical-crit-btn" data-actor-id="{{actor._id}}" title="Roll Physical Critical (D66) - When Health = 0">
|
||
<i class="fas fa-heart-broken"></i> Physical Critical
|
||
</button>
|
||
<button type="button" class="roll-mental-crit-btn" data-actor-id="{{actor._id}}" title="Roll Mental Critical (D66) - When Resolve = 0">
|
||
<i class="fas fa-brain"></i> Mental Critical
|
||
</button>
|
||
</div>
|
||
|
||
{{!-- Active injuries display --}}
|
||
{{#if system.criticalInjuries.physical.length}}
|
||
<div class="active-injuries physical-injuries">
|
||
<h4><i class="fas fa-heart-broken"></i> Physical Injuries</h4>
|
||
{{#each system.criticalInjuries.physical}}
|
||
<div class="injury-item {{#if this.lethal}}lethal-injury{{/if}}">
|
||
<div class="injury-header">
|
||
<strong>{{this.name}}</strong>
|
||
{{#if this.lethal}}<span class="lethal-tag">LETHAL</span>{{/if}}
|
||
<button type="button" class="delete-injury-btn" data-injury-type="physical" data-injury-index="{{@index}}" title="Remove Injury">
|
||
<i class="fas fa-times"></i>
|
||
</button>
|
||
</div>
|
||
<p class="injury-effects">{{this.effects}}</p>
|
||
</div>
|
||
{{/each}}
|
||
</div>
|
||
{{/if}}
|
||
|
||
{{#if system.criticalInjuries.mental.length}}
|
||
<div class="active-injuries mental-injuries">
|
||
<h4><i class="fas fa-brain"></i> Mental Injuries</h4>
|
||
{{#each system.criticalInjuries.mental}}
|
||
<div class="injury-item {{#if this.lethal}}lethal-injury{{/if}}">
|
||
<div class="injury-header">
|
||
<strong>{{this.name}}</strong>
|
||
{{#if this.lethal}}<span class="lethal-tag">LETHAL</span>{{/if}}
|
||
<button type="button" class="delete-injury-btn" data-injury-type="mental" data-injury-index="{{@index}}" title="Remove Injury">
|
||
<i class="fas fa-times"></i>
|
||
</button>
|
||
</div>
|
||
<p class="injury-effects">{{this.effects}}</p>
|
||
</div>
|
||
{{/each}}
|
||
</div>
|
||
{{/if}}
|
||
</div>
|
||
|
||
</div>
|
||
|
||
{{!-- SHEET TABS --}}
|
||
<div class="sheet-tabs">
|
||
<a class="item" data-tab="stats">
|
||
<i class="fas fa-chart-bar"></i> Stats & Skills
|
||
</a>
|
||
<a class="item" data-tab="equipment">
|
||
<i class="fas fa-briefcase"></i> Equipment
|
||
</a>
|
||
{{#if isEbbUser}}
|
||
<a class="item" data-tab="ebb">
|
||
<i class="fas fa-bolt"></i> Ebb
|
||
</a>
|
||
{{/if}}
|
||
<a class="item" data-tab="bio">
|
||
<i class="fas fa-user"></i> Biography
|
||
</a>
|
||
</div>
|
||
|
||
{{!-- SHEET BODY --}}
|
||
<div class="sheet-body">
|
||
|
||
{{!-- STATS TAB --}}
|
||
<div class="tab" data-tab="stats">
|
||
<div class="section-header">Attributes & Skills</div>
|
||
|
||
<div class="attr-skill-table">
|
||
{{!-- STRENGTH COLUMN --}}
|
||
<div class="attr-column">
|
||
<div class="attr-header">
|
||
<div class="attr-name">Strength</div>
|
||
<div class="attr-value-row">
|
||
<button type="button" class="attr-btn" data-action="decrement" data-attribute="strength">−</button>
|
||
<div class="attr-value">{{system.attributes.strength.value}}</div>
|
||
<button type="button" class="attr-btn" data-action="increment" data-attribute="strength">+</button>
|
||
<button type="button" class="attr-roll-btn" data-attribute="strength" title="Roll Strength"><i class="fas fa-dice-d6"></i></button>
|
||
</div>
|
||
<input type="hidden" name="system.attributes.strength.value" value="{{system.attributes.strength.value}}" />
|
||
</div>
|
||
|
||
<div class="skill-row">
|
||
<label>Force</label>
|
||
<div class="skill-controls">
|
||
<button type="button" class="skill-roll" data-skill="force" data-attribute="strength"><i class="fas fa-dice-d6"></i></button>
|
||
<button type="button" class="skill-decrement" data-skill="force">−</button>
|
||
<div class="skill-value">{{system.skills.force.value}}</div>
|
||
<button type="button" class="skill-increment" data-skill="force">+</button>
|
||
<input type="hidden" name="system.skills.force.value" value="{{system.skills.force.value}}" />
|
||
</div>
|
||
</div>
|
||
|
||
<div class="skill-row">
|
||
<label>Melee</label>
|
||
<div class="skill-controls">
|
||
<button type="button" class="skill-roll" data-skill="melee" data-attribute="strength"><i class="fas fa-dice-d6"></i></button>
|
||
<button type="button" class="skill-decrement" data-skill="melee">−</button>
|
||
<div class="skill-value">{{system.skills.melee.value}}</div>
|
||
<button type="button" class="skill-increment" data-skill="melee">+</button>
|
||
<input type="hidden" name="system.skills.melee.value" value="{{system.skills.melee.value}}" />
|
||
</div>
|
||
</div>
|
||
|
||
<div class="skill-row">
|
||
<label>Stamina</label>
|
||
<div class="skill-controls">
|
||
<button type="button" class="skill-roll" data-skill="stamina" data-attribute="strength"><i class="fas fa-dice-d6"></i></button>
|
||
<button type="button" class="skill-decrement" data-skill="stamina">−</button>
|
||
<div class="skill-value">{{system.skills.stamina.value}}</div>
|
||
<button type="button" class="skill-increment" data-skill="stamina">+</button>
|
||
<input type="hidden" name="system.skills.stamina.value" value="{{system.skills.stamina.value}}" />
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
{{!-- AGILITY COLUMN --}}
|
||
<div class="attr-column">
|
||
<div class="attr-header">
|
||
<div class="attr-name">Agility</div>
|
||
<div class="attr-value-row">
|
||
<button type="button" class="attr-btn" data-action="decrement" data-attribute="agility">−</button>
|
||
<div class="attr-value">{{system.attributes.agility.value}}</div>
|
||
<button type="button" class="attr-btn" data-action="increment" data-attribute="agility">+</button>
|
||
<button type="button" class="attr-roll-btn" data-attribute="agility" title="Roll Agility"><i class="fas fa-dice-d6"></i></button>
|
||
</div>
|
||
<input type="hidden" name="system.attributes.agility.value" value="{{system.attributes.agility.value}}" />
|
||
</div>
|
||
|
||
<div class="skill-row">
|
||
<label>Marksmanship</label>
|
||
<div class="skill-controls">
|
||
<button type="button" class="skill-roll" data-skill="marksmanship" data-attribute="agility"><i class="fas fa-dice-d6"></i></button>
|
||
<button type="button" class="skill-decrement" data-skill="marksmanship">−</button>
|
||
<div class="skill-value">{{system.skills.marksmanship.value}}</div>
|
||
<button type="button" class="skill-increment" data-skill="marksmanship">+</button>
|
||
<input type="hidden" name="system.skills.marksmanship.value" value="{{system.skills.marksmanship.value}}" />
|
||
</div>
|
||
</div>
|
||
|
||
<div class="skill-row">
|
||
<label>Mobility</label>
|
||
<div class="skill-controls">
|
||
<button type="button" class="skill-roll" data-skill="mobility" data-attribute="agility"><i class="fas fa-dice-d6"></i></button>
|
||
<button type="button" class="skill-decrement" data-skill="mobility">−</button>
|
||
<div class="skill-value">{{system.skills.mobility.value}}</div>
|
||
<button type="button" class="skill-increment" data-skill="mobility">+</button>
|
||
<input type="hidden" name="system.skills.mobility.value" value="{{system.skills.mobility.value}}" />
|
||
</div>
|
||
</div>
|
||
|
||
<div class="skill-row">
|
||
<label>Stealth</label>
|
||
<div class="skill-controls">
|
||
<button type="button" class="skill-roll" data-skill="stealth" data-attribute="agility"><i class="fas fa-dice-d6"></i></button>
|
||
<button type="button" class="skill-decrement" data-skill="stealth">−</button>
|
||
<div class="skill-value">{{system.skills.stealth.value}}</div>
|
||
<button type="button" class="skill-increment" data-skill="stealth">+</button>
|
||
<input type="hidden" name="system.skills.stealth.value" value="{{system.skills.stealth.value}}" />
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
{{!-- WITS COLUMN --}}
|
||
<div class="attr-column">
|
||
<div class="attr-header">
|
||
<div class="attr-name">Wits</div>
|
||
<div class="attr-value-row">
|
||
<button type="button" class="attr-btn" data-action="decrement" data-attribute="wits">−</button>
|
||
<div class="attr-value">{{system.attributes.wits.value}}</div>
|
||
<button type="button" class="attr-btn" data-action="increment" data-attribute="wits">+</button>
|
||
<button type="button" class="attr-roll-btn" data-attribute="wits" title="Roll Wits"><i class="fas fa-dice-d6"></i></button>
|
||
</div>
|
||
<input type="hidden" name="system.attributes.wits.value" value="{{system.attributes.wits.value}}" />
|
||
</div>
|
||
|
||
<div class="skill-row">
|
||
<label>Crafting</label>
|
||
<div class="skill-controls">
|
||
<button type="button" class="skill-roll" data-skill="crafting" data-attribute="wits"><i class="fas fa-dice-d6"></i></button>
|
||
<button type="button" class="skill-decrement" data-skill="crafting">−</button>
|
||
<div class="skill-value">{{system.skills.crafting.value}}</div>
|
||
<button type="button" class="skill-increment" data-skill="crafting">+</button>
|
||
<input type="hidden" name="system.skills.crafting.value" value="{{system.skills.crafting.value}}" />
|
||
</div>
|
||
</div>
|
||
|
||
<div class="skill-row">
|
||
<label>Observation</label>
|
||
<div class="skill-controls">
|
||
<button type="button" class="skill-roll" data-skill="observation" data-attribute="wits"><i class="fas fa-dice-d6"></i></button>
|
||
<button type="button" class="skill-decrement" data-skill="observation">−</button>
|
||
<div class="skill-value">{{system.skills.observation.value}}</div>
|
||
<button type="button" class="skill-increment" data-skill="observation">+</button>
|
||
<input type="hidden" name="system.skills.observation.value" value="{{system.skills.observation.value}}" />
|
||
</div>
|
||
</div>
|
||
|
||
<div class="skill-row">
|
||
<label>Survival</label>
|
||
<div class="skill-controls">
|
||
<button type="button" class="skill-roll" data-skill="survival" data-attribute="wits"><i class="fas fa-dice-d6"></i></button>
|
||
<button type="button" class="skill-decrement" data-skill="survival">−</button>
|
||
<div class="skill-value">{{system.skills.survival.value}}</div>
|
||
<button type="button" class="skill-increment" data-skill="survival">+</button>
|
||
<input type="hidden" name="system.skills.survival.value" value="{{system.skills.survival.value}}" />
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
{{!-- EMPATHY COLUMN --}}
|
||
<div class="attr-column">
|
||
<div class="attr-header">
|
||
<div class="attr-name">Empathy</div>
|
||
<div class="attr-value-row">
|
||
<button type="button" class="attr-btn" data-action="decrement" data-attribute="empathy">−</button>
|
||
<div class="attr-value">{{system.attributes.empathy.value}}</div>
|
||
<button type="button" class="attr-btn" data-action="increment" data-attribute="empathy">+</button>
|
||
<button type="button" class="attr-roll-btn" data-attribute="empathy" title="Roll Empathy"><i class="fas fa-dice-d6"></i></button>
|
||
</div>
|
||
<input type="hidden" name="system.attributes.empathy.value" value="{{system.attributes.empathy.value}}" />
|
||
</div>
|
||
|
||
<div class="skill-row">
|
||
<label>Healing</label>
|
||
<div class="skill-controls">
|
||
<button type="button" class="skill-roll" data-skill="healing" data-attribute="empathy"><i class="fas fa-dice-d6"></i></button>
|
||
<button type="button" class="skill-decrement" data-skill="healing">−</button>
|
||
<div class="skill-value">{{system.skills.healing.value}}</div>
|
||
<button type="button" class="skill-increment" data-skill="healing">+</button>
|
||
<input type="hidden" name="system.skills.healing.value" value="{{system.skills.healing.value}}" />
|
||
</div>
|
||
</div>
|
||
|
||
<div class="skill-row">
|
||
<label>Insight</label>
|
||
<div class="skill-controls">
|
||
<button type="button" class="skill-roll" data-skill="insight" data-attribute="empathy"><i class="fas fa-dice-d6"></i></button>
|
||
<button type="button" class="skill-decrement" data-skill="insight">−</button>
|
||
<div class="skill-value">{{system.skills.insight.value}}</div>
|
||
<button type="button" class="skill-increment" data-skill="insight">+</button>
|
||
<input type="hidden" name="system.skills.insight.value" value="{{system.skills.insight.value}}" />
|
||
</div>
|
||
</div>
|
||
|
||
<div class="skill-row">
|
||
<label>Persuasion</label>
|
||
<div class="skill-controls">
|
||
<button type="button" class="skill-roll" data-skill="persuasion" data-attribute="empathy"><i class="fas fa-dice-d6"></i></button>
|
||
<button type="button" class="skill-decrement" data-skill="persuasion">−</button>
|
||
<div class="skill-value">{{system.skills.persuasion.value}}</div>
|
||
<button type="button" class="skill-increment" data-skill="persuasion">+</button>
|
||
<input type="hidden" name="system.skills.persuasion.value" value="{{system.skills.persuasion.value}}" />
|
||
</div>
|
||
</div>
|
||
{{#if isEbbUser}}
|
||
<div class="skill-row ebb-skill-row">
|
||
<label><i class="fas fa-bolt"></i> Ebb</label>
|
||
<div class="skill-controls">
|
||
<button type="button" class="skill-roll" data-skill="ebb" data-attribute="empathy" title="Roll Ebb (Empathy + Ebb)"><i class="fas fa-dice-d6"></i></button>
|
||
<button type="button" class="skill-decrement" data-skill="ebb">−</button>
|
||
<div class="skill-value">{{system.skills.ebb.value}}</div>
|
||
<button type="button" class="skill-increment" data-skill="ebb">+</button>
|
||
<input type="hidden" name="system.skills.ebb.value" value="{{system.skills.ebb.value}}" />
|
||
</div>
|
||
</div>
|
||
{{/if}}
|
||
</div>
|
||
|
||
</div>
|
||
|
||
{{!-- Specialties Section --}}
|
||
<div class="specialties-section">
|
||
<h2 class="section-header">
|
||
<i class="fas fa-star"></i> Specialties & Talents
|
||
</h2>
|
||
<div class="specialty-list">
|
||
{{#each specialties}}
|
||
<div class="specialty-item" data-item-id="{{this._id}}">
|
||
<img class="specialty-img" src="{{this.img}}" width="32" height="32"/>
|
||
<div class="specialty-info">
|
||
<div class="specialty-name-row">
|
||
<span class="specialty-name">{{this.name}}</span>
|
||
<span class="specialty-package">{{this.system.package}}</span>
|
||
<button type="button" class="delete-specialty-btn" data-item-id="{{this._id}}" title="Remove Specialty">
|
||
<i class="fas fa-times"></i>
|
||
</button>
|
||
</div>
|
||
<div class="specialty-effects">{{this.system.effects}}</div>
|
||
</div>
|
||
</div>
|
||
{{/each}}
|
||
{{#unless specialties.length}}
|
||
<div class="specialty-empty">
|
||
<em>Drag specialties from the compendium to add them here.</em>
|
||
</div>
|
||
{{/unless}}
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
{{!-- EQUIPMENT TAB --}}
|
||
<div class="tab" data-tab="equipment">
|
||
|
||
{{!-- RANGED WEAPONS --}}
|
||
<div class="weapons-section">
|
||
<h2 class="section-header"><i class="fas fa-crosshairs"></i> Ranged Weapons</h2>
|
||
<div class="weapon-list">
|
||
{{#each rangedWeapons}}
|
||
<div class="weapon-item" data-item-id="{{this._id}}">
|
||
<img class="weapon-img" src="{{this.img}}" width="36" height="36"/>
|
||
<div class="weapon-info">
|
||
<div class="weapon-name-row">
|
||
<span class="weapon-name">{{this.name}}</span>
|
||
<span class="weapon-type-badge ranged">{{this.system.weaponType}}</span>
|
||
</div>
|
||
<div class="weapon-stats-row">
|
||
<span class="weapon-stat"><strong>DMG</strong> {{this.system.damage}}</span>
|
||
<span class="weapon-stat"><strong>Range</strong> {{this.system.range}}</span>
|
||
<span class="weapon-stat"><strong>ROF</strong> {{this.system.rof}}</span>
|
||
<span class="weapon-stat"><strong>AP</strong> {{this.system.ap}}</span>
|
||
<span class="weapon-stat"><strong>Gear</strong> +{{this.system.gearBonus}}</span>
|
||
</div>
|
||
</div>
|
||
<div class="weapon-ammo-display">
|
||
<span class="ammo-count {{#if (eq this.system.ammo 0)}}ammo-empty{{/if}}">{{#if this.system.ammo}}{{this.system.ammo}}{{else}}0{{/if}}</span>
|
||
<span class="ammo-separator">/</span>
|
||
<span class="ammo-max">{{#if this.system.magazine}}{{this.system.magazine}}{{else}}0{{/if}}</span>
|
||
<button type="button" class="weapon-reload-btn" data-item-id="{{this._id}}" title="Reload to full magazine">
|
||
<i class="fas fa-redo-alt"></i>
|
||
</button>
|
||
</div>
|
||
<div class="weapon-actions">
|
||
<button type="button" class="toggle-equip-btn {{#if this.system.equipped}}equipped{{/if}}" data-item-id="{{this._id}}" title="Toggle Equipped">
|
||
<i class="fas fa-hand-paper"></i>
|
||
</button>
|
||
<button type="button" class="weapon-roll-btn" data-item-id="{{this._id}}" data-weapon-category="ranged" title="Roll Marksmanship + Gear Bonus">
|
||
<i class="fas fa-dice-d6"></i>
|
||
</button>
|
||
<button type="button" class="delete-weapon-btn" data-item-id="{{this._id}}" title="Remove Weapon">
|
||
<i class="fas fa-times"></i>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
{{/each}}
|
||
{{#unless rangedWeapons.length}}
|
||
<div class="weapon-empty"><em>Drag ranged weapons from the compendium.</em></div>
|
||
{{/unless}}
|
||
</div>
|
||
</div>
|
||
|
||
{{!-- MELEE WEAPONS --}}
|
||
<div class="weapons-section">
|
||
<h2 class="section-header"><i class="fas fa-fist-raised"></i> Melee Weapons</h2>
|
||
<div class="weapon-list">
|
||
{{#each meleeWeapons}}
|
||
<div class="weapon-item" data-item-id="{{this._id}}">
|
||
<img class="weapon-img" src="{{this.img}}" width="36" height="36"/>
|
||
<div class="weapon-info">
|
||
<div class="weapon-name-row">
|
||
<span class="weapon-name">{{this.name}}</span>
|
||
<span class="weapon-type-badge melee">{{this.system.weaponType}}</span>
|
||
</div>
|
||
<div class="weapon-stats-row">
|
||
<span class="weapon-stat"><strong>DMG</strong> {{this.system.damage}}</span>
|
||
<span class="weapon-stat"><strong>AP</strong> {{this.system.ap}}</span>
|
||
<span class="weapon-stat"><strong>Gear</strong> +{{this.system.gearBonus}}</span>
|
||
</div>
|
||
</div>
|
||
<div class="weapon-actions">
|
||
<button type="button" class="toggle-equip-btn {{#if this.system.equipped}}equipped{{/if}}" data-item-id="{{this._id}}" title="Toggle Equipped">
|
||
<i class="fas fa-hand-paper"></i>
|
||
</button>
|
||
<button type="button" class="weapon-roll-btn" data-item-id="{{this._id}}" data-weapon-category="melee" title="Roll Melee + Gear Bonus">
|
||
<i class="fas fa-dice-d6"></i>
|
||
</button>
|
||
<button type="button" class="delete-weapon-btn" data-item-id="{{this._id}}" title="Remove Weapon">
|
||
<i class="fas fa-times"></i>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
{{/each}}
|
||
{{#unless meleeWeapons.length}}
|
||
<div class="weapon-empty"><em>Drag melee weapons from the compendium.</em></div>
|
||
{{/unless}}
|
||
</div>
|
||
</div>
|
||
|
||
{{!-- ARMOUR --}}
|
||
<div class="weapons-section">
|
||
<h2 class="section-header"><i class="fas fa-shield-alt"></i> Armour</h2>
|
||
<div class="weapon-list">
|
||
{{#each armors}}
|
||
<div class="weapon-item armor-item" data-item-id="{{this._id}}">
|
||
<img class="weapon-img" src="{{this.img}}" width="36" height="36"/>
|
||
<div class="weapon-info">
|
||
<div class="weapon-name-row">
|
||
<span class="weapon-name armor-name">{{this.name}}</span>
|
||
<span class="weapon-type-badge">{{this.system.armorDice}}({{this.system.armorAuto}})</span>
|
||
</div>
|
||
<div class="weapon-stats-row">
|
||
<span class="weapon-stat"><strong>Armor</strong> {{this.system.armorDice}}({{this.system.armorAuto}})</span>
|
||
<span class="weapon-stat"><strong>Stat</strong> {{#if (gt this.system.statMod 0)}}+{{/if}}{{this.system.statMod}}</span>
|
||
<span class="weapon-stat"><strong>Skill</strong> {{#if (gt this.system.skillMod 0)}}+{{/if}}{{this.system.skillMod}}</span>
|
||
<span class="weapon-stat"><strong>INIT</strong> {{#if (gt this.system.initiativeMod 0)}}+{{/if}}{{this.system.initiativeMod}}</span>
|
||
</div>
|
||
<div class="weapon-stats-row">
|
||
<span class="weapon-stat"><strong>Stat Ref</strong> {{#if this.system.statModTarget}}{{capitalize this.system.statModTarget}}{{else}}—{{/if}}</span>
|
||
<span class="weapon-stat"><strong>Skill Ref</strong> {{#if this.system.skillModTarget}}{{capitalize this.system.skillModTarget}}{{else}}—{{/if}}</span>
|
||
</div>
|
||
</div>
|
||
<div class="weapon-actions">
|
||
<button type="button" class="toggle-equip-btn {{#if this.system.equipped}}equipped{{/if}}" data-item-id="{{this._id}}" title="Toggle Equipped">
|
||
<i class="fas fa-hand-paper"></i>
|
||
</button>
|
||
<button type="button" class="armor-roll-btn" data-item-id="{{this._id}}" title="Roll Armor Check for this armour">
|
||
<i class="fas fa-shield-alt"></i>
|
||
</button>
|
||
<button type="button" class="delete-armor-btn" data-item-id="{{this._id}}" title="Remove Armour">
|
||
<i class="fas fa-times"></i>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
{{/each}}
|
||
{{#unless armors.length}}
|
||
<div class="weapon-empty"><em>Drag armor items here.</em></div>
|
||
{{/unless}}
|
||
</div>
|
||
</div>
|
||
|
||
{{!-- GEAR ITEMS --}}
|
||
<div class="weapons-section">
|
||
<h2 class="section-header"><i class="fas fa-toolbox"></i> Gear Items</h2>
|
||
<div class="weapon-list">
|
||
{{#each gearItems}}
|
||
<div class="weapon-item gear-item" data-item-id="{{this._id}}">
|
||
<img class="weapon-img" src="{{this.img}}" width="36" height="36"/>
|
||
<div class="weapon-info">
|
||
<div class="weapon-name-row">
|
||
<span class="weapon-name gear-name">{{this.name}}</span>
|
||
<span class="weapon-type-badge">{{#if this.system.quantity}}{{this.system.quantity}}{{else}}1{{/if}}x</span>
|
||
</div>
|
||
<div class="weapon-stats-row">
|
||
<span class="weapon-stat"><strong>Weight</strong> {{#if this.system.weight}}{{this.system.weight}}{{else}}0{{/if}}</span>
|
||
<span class="weapon-stat"><strong>INIT</strong> {{#if (gt this.system.initiativeMod 0)}}+{{/if}}{{this.system.initiativeMod}}</span>
|
||
</div>
|
||
</div>
|
||
<div class="weapon-actions">
|
||
<button type="button" class="toggle-equip-btn {{#if this.system.equipped}}equipped{{/if}}" data-item-id="{{this._id}}" title="Toggle Equipped">
|
||
<i class="fas fa-hand-paper"></i>
|
||
</button>
|
||
<button type="button" class="delete-gear-btn" data-item-id="{{this._id}}" title="Remove Gear">
|
||
<i class="fas fa-times"></i>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
{{/each}}
|
||
{{#unless gearItems.length}}
|
||
<div class="weapon-empty"><em>Drag equipment items here.</em></div>
|
||
{{/unless}}
|
||
</div>
|
||
</div>
|
||
|
||
{{!-- DRUGS --}}
|
||
<div class="weapons-section">
|
||
<h2 class="section-header"><i class="fas fa-pills"></i> Drugs</h2>
|
||
<div class="weapon-list">
|
||
{{#each drugs}}
|
||
<div class="weapon-item drug-item {{#if this.system.active}}drug-active{{/if}} {{#if this.system.withdrawalActive}}drug-withdrawal{{/if}}" data-item-id="{{this._id}}">
|
||
<img class="weapon-img" src="{{this.img}}" width="36" height="36"/>
|
||
<div class="weapon-info">
|
||
<div class="weapon-name-row">
|
||
<span class="weapon-name drug-name">{{this.name}}</span>
|
||
<span class="weapon-type-badge">{{#if this.system.quantity}}{{this.system.quantity}}{{else}}0{{/if}}x</span>
|
||
</div>
|
||
<div class="weapon-stats-row">
|
||
{{#if this.system.active}}
|
||
<span class="weapon-stat"><strong>ACTIVE</strong> {{#if this.system.activeDuration}}{{this.system.activeDuration}}{{else}}—{{/if}}</span>
|
||
{{/if}}
|
||
{{#if this.system.withdrawalActive}}
|
||
<span class="weapon-stat"><strong>WITHDRAWAL</strong> {{#if this.system.withdrawalDuration}}{{this.system.withdrawalDuration}}{{else}}—{{/if}}</span>
|
||
{{/if}}
|
||
{{#unless this.system.active}}
|
||
{{#unless this.system.withdrawalActive}}
|
||
<span class="weapon-stat"><strong>Status</strong> Inactive</span>
|
||
{{/unless}}
|
||
{{/unless}}
|
||
</div>
|
||
</div>
|
||
<div class="weapon-actions">
|
||
{{#if this.system.active}}
|
||
<button type="button" class="drug-off-btn" data-item-id="{{this._id}}" title="Stop Drug and begin withdrawal">
|
||
<i class="fas fa-power-off"></i>
|
||
</button>
|
||
{{else}}
|
||
{{#if this.system.withdrawalActive}}
|
||
<button type="button" class="drug-clear-withdrawal-btn" data-item-id="{{this._id}}" title="Clear Withdrawal Effect">
|
||
<i class="fas fa-ban"></i>
|
||
</button>
|
||
{{else}}
|
||
<button type="button" class="drug-activate-btn" data-item-id="{{this._id}}" title="Activate Drug (consumes 1 dose)">
|
||
<i class="fas fa-bolt"></i>
|
||
</button>
|
||
{{/if}}
|
||
{{/if}}
|
||
<button type="button" class="delete-drug-btn" data-item-id="{{this._id}}" title="Remove Drug">
|
||
<i class="fas fa-times"></i>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
{{/each}}
|
||
{{#unless drugs.length}}
|
||
<div class="weapon-empty"><em>Drag drug items here.</em></div>
|
||
{{/unless}}
|
||
</div>
|
||
</div>
|
||
|
||
{{!-- GENERAL EQUIPMENT NOTES --}}
|
||
<div class="equipment-section">
|
||
<h2 class="section-header"><i class="fas fa-briefcase"></i> Equipment Notes</h2>
|
||
<div class="editor">
|
||
<textarea name="system.equipment" rows="10" placeholder="List armor, gear, consumables, etc...">{{system.equipment}}</textarea>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
{{!-- EBB TAB (Ebon / Brain Waster only) --}}
|
||
{{#if isEbbUser}}
|
||
<div class="tab" data-tab="ebb">
|
||
|
||
{{!-- FLUX STATUS BAR --}}
|
||
<div class="ebb-tab-header">
|
||
<div class="ebb-flux-status">
|
||
<div class="ebb-flux-label"><i class="fas fa-bolt"></i> FLUX</div>
|
||
<div class="ebb-flux-track">
|
||
{{!-- NO name attr here — system.flux.value is bound once in Stats tab; duplicate causes "X,X" corruption --}}
|
||
<input type="number" value="{{system.flux.value}}" min="0" max="{{computedFluxMax}}" class="ebb-flux-input ebb-flux-mirror"
|
||
data-mirrors="system.flux.value" />
|
||
<span class="ebb-flux-sep">/</span>
|
||
<span class="ebb-flux-max">{{computedFluxMax}}</span>
|
||
</div>
|
||
<div class="ebb-flux-actions">
|
||
<button type="button" class="ebb-flux-recover-btn" title="Recover 1 Flux (stretch rest)">
|
||
<i class="fas fa-plus-circle"></i> +1 Flux
|
||
</button>
|
||
<button type="button" class="ebb-flux-full-btn" title="Restore full Flux (shift rest)">
|
||
<i class="fas fa-battery-full"></i> Full Rest
|
||
</button>
|
||
</div>
|
||
</div>
|
||
|
||
{{!-- EBB SKILL --}}
|
||
<div class="ebb-skill-panel">
|
||
<div class="ebb-skill-label"><i class="fas fa-dice-d6"></i> Ebb Skill</div>
|
||
<div class="ebb-skill-controls">
|
||
<button type="button" class="skill-roll ebb-tab-skill-roll" data-skill="ebb" data-attribute="empathy" title="Roll Empathy + Ebb">
|
||
<i class="fas fa-dice-d6"></i> Roll
|
||
</button>
|
||
<button type="button" class="skill-decrement" data-skill="ebb">−</button>
|
||
<div class="ebb-skill-value skill-value">{{system.skills.ebb.value}}</div>
|
||
<button type="button" class="skill-increment" data-skill="ebb">+</button>
|
||
{{!-- NO hidden input here — the Stats tab already binds system.skills.ebb.value --}}
|
||
</div>
|
||
<div class="ebb-dice-summary">Pool: Empathy {{system.attributes.empathy.value}} + Ebb {{system.skills.ebb.value}}</div>
|
||
</div>
|
||
</div>
|
||
|
||
{{!-- FORMULAE LIST --}}
|
||
<div class="ebb-formulae-section">
|
||
<h2 class="section-header"><i class="fas fa-scroll"></i> Known Formulae
|
||
<span class="ebb-formula-count">{{ebbFormulae.length}} known</span>
|
||
</h2>
|
||
|
||
{{!-- Group formulae by discipline --}}
|
||
<div class="ebb-formulae-list">
|
||
{{#each ebbFormulae}}
|
||
<div class="ebb-formula-item" data-item-id="{{this._id}}">
|
||
<img class="ebb-formula-icon" src="{{this.img}}" width="40" height="40" title="{{this.system.discipline}}"/>
|
||
<div class="weapon-info">
|
||
<div class="weapon-name-row">
|
||
<span class="weapon-name">{{this.name}}</span>
|
||
<span class="weapon-type-badge ebb-discipline-badge ebb-disc-{{this.system.discipline}}">{{this.system.discipline}}</span>
|
||
</div>
|
||
<div class="weapon-stats-row">
|
||
<span class="weapon-stat ebb-flux-cost"><i class="fas fa-bolt"></i> {{this.system.fluxCost}}</span>
|
||
<span class="weapon-stat"><strong>SUC</strong> {{this.system.successes}}</span>
|
||
{{#if this.system.range}}<span class="weapon-stat"><strong>Range</strong> {{this.system.range}}</span>{{/if}}
|
||
{{#if this.system.duration}}<span class="weapon-stat"><strong>Dur</strong> {{this.system.duration}}</span>{{/if}}
|
||
</div>
|
||
{{#if this.system.effect}}
|
||
<div class="ebb-effect-row">
|
||
<span class="ebb-effect-text">{{this.system.effect}}</span>
|
||
</div>
|
||
{{/if}}
|
||
</div>
|
||
<div class="weapon-actions">
|
||
<button type="button" class="ebb-formula-roll-btn" data-item-id="{{this._id}}" title="Use {{this.name}} (costs {{this.system.fluxCost}} Flux)">
|
||
<i class="fas fa-bolt"></i>
|
||
</button>
|
||
<button type="button" class="ebb-formula-edit-btn" data-item-id="{{this._id}}" title="Edit Formula">
|
||
<i class="fas fa-edit"></i>
|
||
</button>
|
||
<button type="button" class="ebb-formula-delete-btn" data-item-id="{{this._id}}" title="Remove Formula">
|
||
<i class="fas fa-times"></i>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
{{/each}}
|
||
{{#unless ebbFormulae.length}}
|
||
<div class="weapon-empty">
|
||
<em>No formulae known. Drag Ebb items from the world item list.</em>
|
||
</div>
|
||
{{/unless}}
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
{{/if}}
|
||
|
||
{{!-- BIO TAB --}}
|
||
<div class="tab" data-tab="bio">
|
||
<div class="bio-section">
|
||
<h2>Biography</h2>
|
||
|
||
<h3>Background</h3>
|
||
<div class="editor">
|
||
<textarea name="system.bio.background" rows="8" placeholder="Character background and history...">{{system.bio.background}}</textarea>
|
||
</div>
|
||
|
||
<h3>Appearance</h3>
|
||
<div class="editor">
|
||
<textarea name="system.bio.appearance" rows="5" placeholder="Physical description...">{{system.bio.appearance}}</textarea>
|
||
</div>
|
||
|
||
<h3>Personality</h3>
|
||
<div class="editor">
|
||
<textarea name="system.bio.personality" rows="5" placeholder="Personality traits and behavior...">{{system.bio.personality}}</textarea>
|
||
</div>
|
||
|
||
<h3>Notes</h3>
|
||
<div class="editor">
|
||
<textarea name="system.bio.notes" rows="6" placeholder="Additional notes...">{{system.bio.notes}}</textarea>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</form>
|