Initial commit

This commit is contained in:
Octoturge
2026-06-09 22:06:56 +02:00
commit fb42c6e8cc
121 changed files with 14976 additions and 0 deletions
+24
View File
@@ -0,0 +1,24 @@
{{!-- Actor-level Active Effects section — included by character and NPC sheets. --}}
<fieldset class="hbm-effects actor-effects">
<legend>{{localize 'HBM.activeEffect.title'}}</legend>
<button type="button" class="hbm-effect-add" data-action="actorEffectCreate">+ {{localize 'HBM.activeEffect.addEffect'}}</button>
{{#if actorEffects.length}}
<ul class="effect-list">
{{#each actorEffects as |e|}}
<li class="effect-row {{#if e.disabled}}disabled{{/if}} {{#if e.isTransferred}}transferred{{/if}}">
<img src="{{e.icon}}" width="20" height="20"/>
<span class="effect-name">{{e.name}}</span>
<span class="effect-meta">
{{#if e.isTransferred}}<span class="badge" title="{{localize 'HBM.activeEffect.fromItem'}}">← {{e.originName}}</span>{{/if}}
<span class="badge">{{e.changes.length}} {{localize 'HBM.activeEffect.changes'}}</span>
</span>
<button type="button" data-action="actorEffectToggle" data-effect-id="{{e.id}}" title="{{localize 'HBM.activeEffect.toggle'}}">{{#if e.disabled}}{{else}}{{/if}}</button>
<button type="button" data-action="actorEffectEdit" data-effect-id="{{e.id}}" title="{{localize 'HBM.activeEffect.edit'}}">✎</button>
{{#unless e.isTransferred}}<button type="button" data-action="actorEffectDelete" data-effect-id="{{e.id}}" title="{{localize 'HBM.activeEffect.deleteEffect'}}">✕</button>{{/unless}}
</li>
{{/each}}
</ul>
{{else}}
<p class="hbm-hint">{{localize 'HBM.activeEffect.emptyActor'}}</p>
{{/if}}
</fieldset>
+656
View File
@@ -0,0 +1,656 @@
<div class="sheet-wrapper">
<!-- ═══ STICKY HEADER ═══════════════════════════════════════════════════ -->
<header class="sheet-header">
<input class="charname" type="text" name="name" value="{{document.name}}" placeholder="{{localize 'HBM.ui.name'}}" />
<div class="meta-row">
<label>{{localize 'HBM.details.race'}}
<select name="system.details.race">
<option value="">--</option>
{{#each races as |r|}}
<option value="{{r.key}}" {{#if (eq ../system.details.race r.key)}}selected{{/if}}>{{r.label}}</option>
{{/each}}
</select>
</label>
<label>{{localize 'HBM.details.year'}}
<input type="number" name="system.details.year" value="{{system.details.year}}" min="1" max="4" />
</label>
<label>{{localize 'HBM.details.startingYear'}}
<input type="number" name="system.details.startingYear" value="{{system.details.startingYear}}" min="1900" />
</label>
<label>{{localize 'HBM.details.currentYear'}}
<input type="number" name="system.details.currentYear" value="{{system.details.currentYear}}" min="1900" />
</label>
<label>{{localize 'HBM.details.discipline'}}
<select name="system.details.discipline">
<option value="">--</option>
{{#each disciplines as |d|}}
<option value="{{d.key}}" {{#if (eq ../system.details.discipline d.key)}}selected{{/if}}>{{d.label}}</option>
{{/each}}
</select>
</label>
</div>
<!-- Tab navigation -->
<nav class="tabs" data-group="primary">
{{#each tabs as |tab|}}
<button type="button" class="tab-item {{tab.cssClass}}" data-tab="{{tab.id}}">
{{localize tab.label}}
</button>
{{/each}}
</nav>
</header>
<!-- ═══ SCROLLABLE BODY ══════════════════════════════════════════════════ -->
<div class="sheet-body">
<!-- ── STATS ──────────────────────────────────────────────────────────── -->
<section class="tab-panel {{#if (eq tabGroups.primary 'stats')}}active{{/if}}" data-tab="stats">
<div class="attributes-grid">
{{#each attributes as |attr|}}
<div class="attribute" data-attr="{{attr.key}}">
<label>{{attr.label}}</label>
{{#if (eq attr.key 'magic')}}
<select name="system.attributes.magic.value">
<option value="0" {{#if (eq attr.value 0)}}selected{{/if}}>0</option>
<option value="1" {{#if (eq attr.value 1)}}selected{{/if}}>I</option>
<option value="2" {{#if (eq attr.value 2)}}selected{{/if}}>II</option>
<option value="3" {{#if (eq attr.value 3)}}selected{{/if}}>III</option>
<option value="4" {{#if (eq attr.value 4)}}selected{{/if}}>IV</option>
<option value="5" {{#if (eq attr.value 5)}}selected{{/if}}>V</option>
<option value="6" {{#if (eq attr.value 6)}}selected{{/if}}>VI</option>
<option value="7" {{#if (eq attr.value 7)}}selected{{/if}}>VII</option>
<option value="8" {{#if (eq attr.value 8)}}selected{{/if}}>VIII</option>
<option value="9" {{#if (eq attr.value 9)}}selected{{/if}}>IX</option>
<option value="10" {{#if (eq attr.value 10)}}selected{{/if}}>X</option>
</select>
<span class="actual-magic-badge" title="{{localize 'HBM.attributes.actualMagicHint'}}" style="font-size: 0.75rem; margin-top: 0.15rem; color: #a03030; font-weight: bold;">
({{localize 'HBM.attributes.actual'}}: {{attr.actualLabel}})
</span>
{{else}}
<input type="number" name="system.attributes.{{attr.key}}.value" value="{{attr.value}}"
min="1" max="8" />
{{/if}}
<button type="button" class="roll-btn" data-action="rollAttribute" data-attribute="{{attr.key}}"
title="{{localize 'HBM.roll.roll'}}">⚂</button>
</div>
{{/each}}
</div>
<div class="resources-grid">
<div class="resource">
<label>{{localize 'HBM.resources.health'}}</label>
<span class="resource-value">
<input type="number" name="system.attributes.health.value" value="{{system.attributes.health.value}}" min="0" />
<span class="sep">/</span>
<input type="number" name="system.attributes.health.max" value="{{system.attributes.health.max}}" min="0" />
</span>
</div>
<div class="resource">
<label>{{localize 'HBM.resources.physicalArmor'}}</label>
<span class="resource-value">
<span class="static-value" title="{{localize 'HBM.resources.physicalArmor'}}">{{system.attributes.physicalArmor.value}}</span>
</span>
<small>{{localize 'HBM.resources.max'}}: {{system.attributes.physicalArmor.max}}</small>
<div style="display:flex; align-items:center; gap:0.3rem; margin-top:0.15rem;">
<small style="white-space:nowrap;">{{localize 'HBM.ui.physicalArmorBonus'}}:</small>
<input type="number" name="system.attributes.physicalArmor.bonus"
value="{{system.attributes.physicalArmor.bonus}}" min="0"
style="width:2.5rem; text-align:center; font-size:0.8rem; border:none; border-bottom:1px solid var(--hbm-border); background:transparent;" />
</div>
</div>
<div class="resource">
<label>{{localize 'HBM.resources.magicalShield'}}</label>
<span class="resource-value">
<input type="number" name="system.attributes.magicalShield.value"
value="{{system.attributes.magicalShield.value}}" min="0" />
</span>
</div>
<div class="resource">
<label>{{localize 'HBM.resources.magicalArmor'}}</label>
<span class="resource-value">
<input type="number" name="system.attributes.magicalArmor.value"
value="{{system.attributes.magicalArmor.value}}" min="0" />
<span class="sep">/</span>
<input type="number" name="system.attributes.magicalArmor.max" value="{{system.attributes.magicalArmor.max}}"
min="0" />
</span>
<small>{{localize 'HBM.resources.runicCounter'}}: {{system.attributes.magicalArmor.runicCounter}}/5</small>
</div>
<div class="resource">
<label>{{localize 'HBM.resources.mana'}}</label>
<span class="resource-value">
<input type="number" name="system.attributes.mana.value" value="{{system.attributes.mana.value}}" min="0" />
<span class="sep">/</span>
<input type="number" name="system.attributes.mana.max" value="{{system.attributes.mana.max}}" min="0" />
</span>
<small>{{localize 'HBM.resources.maxManaPerSpell'}}: {{system.attributes.mana.maxPerSpell}}</small>
</div>
<div class="resource">
<label>{{localize 'HBM.resources.zeal'}}</label>
<span class="resource-value">
<input type="number" name="system.attributes.zeal.value" value="{{system.attributes.zeal.value}}" min="0" />
<span class="sep">/</span>
<input type="number" name="system.attributes.zeal.max" value="{{system.attributes.zeal.max}}" min="0" />
</span>
</div>
{{#if hasBloodMagic}}
<div class="resource blood-pool">
<label>{{localize 'HBM.resources.blood'}}</label>
<span class="resource-value">
<input type="number" name="system.attributes.blood.value" value="{{system.attributes.blood.value}}" min="0" />
<span class="sep">/</span>
<input type="number" name="system.attributes.blood.max" value="{{system.attributes.blood.max}}" min="0" />
</span>
</div>
{{/if}}
<div class="resource">
<label>{{localize 'HBM.resources.elixirTolerance'}}</label>
<span class="resource-value">
<input type="number" name="system.attributes.elixirTolerance" value="{{system.attributes.elixirTolerance}}" min="0" />
</span>
<small>cap: {{elixirCap}}</small>
</div>
{{#if (gt system.attributes.insanity 0)}}
<div class="resource warn">
<label>{{localize 'HBM.resources.insanity'}}</label>
<span class="resource-value">
<input type="number" name="system.attributes.insanity" value="{{system.attributes.insanity}}" min="0" />
</span>
</div>
{{/if}}
<div class="resource">
<label>{{localize 'HBM.resources.initiative'}}</label>
<span class="static-value">{{system.attributes.initiative}}</span>
</div>
<div class="resource">
<label>{{localize 'HBM.resources.experience'}}</label>
<input type="number" name="system.details.experience" value="{{system.details.experience}}" min="0" />
</div>
<div class="resource">
<label>{{localize 'HBM.ui.attributePoints'}}</label>
<span class="resource-value">
<span class="static-value" title="{{localize 'HBM.ui.pointsAvailable'}}">{{system.advancement.attributePointsAvailable}}</span>
<span class="sep" title="Modyfikator MG">+</span>
<input type="number" name="system.advancement.bonusAttributePoints" value="{{system.advancement.bonusAttributePoints}}" min="0" style="width: 2.2rem; text-align: center; border: none; border-bottom: 1px solid var(--hbm-border); background: transparent;" />
</span>
</div>
<div class="resource">
<label>{{localize 'HBM.ui.skillPoints'}}</label>
<span class="resource-value">
<span class="static-value" title="{{localize 'HBM.ui.pointsAvailable'}}">{{system.advancement.skillPointsAvailable}}</span>
<span class="sep" title="Modyfikator MG">+</span>
<input type="number" name="system.advancement.bonusSkillPoints" value="{{system.advancement.bonusSkillPoints}}" min="0" style="width: 2.2rem; text-align: center; border: none; border-bottom: 1px solid var(--hbm-border); background: transparent;" />
</span>
</div>
<div class="resource">
<label>{{localize 'HBM.ui.freeTalents'}}</label>
<span class="resource-value">
<span class="static-value" title="{{localize 'HBM.ui.pointsAvailable'}}">{{system.advancement.freeTalentsAvailable}}</span>
<span class="sep" title="Modyfikator MG">+</span>
<input type="number" name="system.advancement.bonusFreeTalents" value="{{system.advancement.bonusFreeTalents}}" min="0" style="width: 2.2rem; text-align: center; border: none; border-bottom: 1px solid var(--hbm-border); background: transparent;" />
</span>
</div>
</div>
</section>
<!-- ── ACTIONS ────────────────────────────────────────────────────────── -->
<section class="tab-panel {{#if (eq tabGroups.primary 'actions')}}active{{/if}}" data-tab="actions">
<div class="actions-panel">
<h3>{{localize 'HBM.ui.actionsTitle'}}</h3>
<div class="actions-buttons-grid">
<button type="button" class="action-btn" data-action="rollInitiative">
<span class="icon">⚡</span>
<span class="label">{{localize 'HBM.resources.initiative'}}</span>
</button>
<button type="button" class="action-btn" data-action="applyDamage">
<span class="icon">⚔</span>
<span class="label">{{localize 'HBM.damage.apply'}}</span>
</button>
<button type="button" class="action-btn" data-action="takeBreather">
<span class="icon">🌬️</span>
<span class="label">{{localize 'HBM.rest.takeBreather'}}</span>
</button>
<button type="button" class="action-btn" data-action="shortRest">
<span class="icon">☕</span>
<span class="label">{{localize 'HBM.rest.shortRest'}}</span>
</button>
<button type="button" class="action-btn" data-action="longRest">
<span class="icon">🌙</span>
<span class="label">{{localize 'HBM.rest.longRest'}}</span>
</button>
</div>
</div>
</section>
<!-- ── SKILLS ─────────────────────────────────────────────────────────── -->
<section class="tab-panel {{#if (eq tabGroups.primary 'skills')}}active{{/if}}" data-tab="skills">
<div class="skills-grid">
{{#each skills as |sk|}}
<div class="skill">
<span class="skill-name">{{sk.label}}</span>
<input type="number" name="system.skills.{{sk.key}}.value" value="{{sk.value}}" min="0" max="8" />
<button type="button" class="roll-btn" data-action="rollSkill" data-skill="{{sk.key}}"
title="{{localize 'HBM.roll.roll'}}">⚂</button>
</div>
{{/each}}
</div>
</section>
<!-- ── SPELLS ─────────────────────────────────────────────────────────── -->
<section class="tab-panel {{#if (eq tabGroups.primary 'spells')}}active{{/if}}" data-tab="spells">
{{#if spells.length}}
{{#each spellSchoolGroups as |group|}}
<details class="spell-school-group" open>
<summary><strong>{{group.label}}</strong> <span class="count">({{group.items.length}})</span></summary>
<ul class="item-list spell-list">
{{#each group.items as |spell|}}
<li class="item-row spell-row" data-school="{{spell.system.school}}">
<span class="item-name">{{spell.name}}
{{#if spell.system.isSuperspell}}<span class="badge super" title="Superczar">★</span>{{/if}}
{{#if spell.system.requiresGroupCast}}<span class="badge group" title="Czar grupowy">⛧</span>{{/if}}
{{#if spell.system.nonCombatOnly}}<span class="badge noncombat" title="Tylko poza walką">☮</span>{{/if}}
{{#if spell.system.requirements.race.length}}<span class="badge race-lock" title="Wymagana rasa">🔒</span>{{/if}}
</span>
<span class="item-meta">
K{{spell.system.circle}}
· {{localize (concat 'HBM.spell.castingMode.' spell.system.castingMode)}}
· {{localize 'HBM.resources.mana'}}: {{spell.system.manaCost}}
{{#if (eq spell.system.castingMode 'sacred')}}{{#if spell.system.deity}} · {{spell.system.deity}}{{/if}}{{/if}}
{{#if (eq spell.system.castingMode 'blood')}} · krew: {{spell.system.bloodCost}}{{/if}}
{{#if spell.system.sourceBook}} · <span class="source-pip">{{spell.system.sourceBook}}</span>{{/if}}
</span>
<div class="item-controls">
<button type="button" class="cast-btn" data-action="castSpell" data-item-id="{{spell.id}}"
title="{{localize 'HBM.spell.cast'}}">✦</button>
<button type="button" class="edit-btn" data-action="editItem" data-item-id="{{spell.id}}"
title="{{localize 'HBM.ui.edit'}}">✎</button>
<button type="button" class="delete-btn" data-action="deleteItem" data-item-id="{{spell.id}}"
title="{{localize 'HBM.ui.delete'}}">✕</button>
</div>
</li>
{{/each}}
</ul>
</details>
{{/each}}
{{else}}
<p class="empty-drop">{{localize 'HBM.ui.dropItems'}}</p>
{{/if}}
</section>
<!-- ── TALENTS ────────────────────────────────────────────────────────── -->
<section class="tab-panel {{#if (eq tabGroups.primary 'talents')}}active{{/if}}" data-tab="talents">
<p class="empty-drop" style="font-size:0.8rem; color:#888; margin-bottom:10px;">{{localize 'HBM.ui.dropTalentsHint'}}</p>
{{#if talents.length}}
<ul class="item-list">
{{#each talents as |item|}}
<li class="item-row">
<span class="item-name">{{item.name}}</span>
<span class="item-meta">{{{item.system.description}}}</span>
<div class="item-controls">
<button type="button" class="edit-btn" data-action="editItem" data-item-id="{{item.id}}"
title="{{localize 'HBM.ui.edit'}}">✎</button>
<button type="button" class="delete-btn" data-action="deleteItem" data-item-id="{{item.id}}"
title="{{localize 'HBM.ui.delete'}}">✕</button>
</div>
</li>
{{/each}}
</ul>
{{else}}
<p class="empty-drop">{{localize 'HBM.ui.dropItems'}}</p>
{{/if}}
</section>
<!-- ── INVENTORY ──────────────────────────────────────────────────────── -->
<section class="tab-panel {{#if (eq tabGroups.primary 'inventory')}}active{{/if}}" data-tab="inventory">
<div class="money-panel" style="display: flex; gap: 15px; align-items: center; background: var(--hbm-card-bg); border: 1px solid var(--hbm-border); border-radius: var(--hbm-radius); padding: 0.75rem; margin-bottom: 15px;">
<div style="flex: 1; display: flex; align-items: center; gap: 10px;">
<span class="icon" style="font-size: 1.5rem;">🪙</span>
<strong>{{localize 'HBM.ui.money'}}:</strong>
<input type="number" name="system.details.money" value="{{system.details.money}}" min="0" style="width: 8rem; font-size: 1.1rem; text-align: center; border: none; border-bottom: 1px solid var(--hbm-border); background: transparent; color: var(--hbm-fg);" />
<span>PLN</span>
</div>
<button type="button" data-action="recalculateMoney" style="padding: 4px 10px; font-weight: bold; background: var(--hbm-accent); color: #fff; border: none; border-radius: var(--hbm-radius); cursor: pointer;">
{{localize 'HBM.ui.recalculate'}}
</button>
</div>
{{#if weapons.length}}
<div class="inventory-section">
<h3>{{localize 'HBM.gear.weapon'}}</h3>
<table class="inventory-table">
<thead>
<tr>
<th style="text-align: left;">{{localize 'HBM.ui.name'}}</th>
<th>{{localize 'HBM.gear.damage'}}</th>
<th>{{localize 'HBM.gear.weight'}}</th>
<th>{{localize 'HBM.gear.quantity'}}</th>
<th>{{localize 'HBM.gear.equipped'}}</th>
<th></th>
</tr>
</thead>
<tbody>
{{#each weapons as |item|}}
<tr class="item-tr" data-item-id="{{item.id}}">
<td><strong>{{item.name}}</strong></td>
<td style="text-align: center;">{{item.system.weapon.damage}} ({{localize (concat 'HBM.damageType.' item.system.weapon.damageType)}})</td>
<td style="text-align: center;">{{item.system.weight}}</td>
<td style="text-align: center;">{{item.system.quantity}}</td>
<td style="text-align: center;">
<input type="checkbox" data-action="toggleEquipped" data-item-id="{{item.id}}" {{#if item.system.equipped}}checked{{/if}} style="cursor: pointer;" />
</td>
<td style="text-align: right; white-space: nowrap;">
<button type="button" class="edit-btn" data-action="editItem" data-item-id="{{item.id}}" title="{{localize 'HBM.ui.edit'}}">✎</button>
<button type="button" class="delete-btn" data-action="deleteItem" data-item-id="{{item.id}}" title="{{localize 'HBM.ui.delete'}}">✕</button>
</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
{{/if}}
{{#if armors.length}}
<div class="inventory-section" style="margin-top: 15px;">
<h3>{{localize 'HBM.gear.armor'}}</h3>
<table class="inventory-table">
<thead>
<tr>
<th style="text-align: left;">{{localize 'HBM.ui.name'}}</th>
<th>{{localize 'HBM.gear.damageReduction'}}</th>
<th>{{localize 'HBM.gear.condition'}}</th>
<th>{{localize 'HBM.gear.weight'}}</th>
<th>{{localize 'HBM.gear.quantity'}}</th>
<th>{{localize 'HBM.gear.equipped'}}</th>
<th></th>
</tr>
</thead>
<tbody>
{{#each armors as |item|}}
<tr class="item-tr" data-item-id="{{item.id}}">
<td><strong>{{item.name}}</strong></td>
<td style="text-align: center;">{{item.system.armor.damageReduction}} DR</td>
<td style="text-align: center;">{{item.system.armor.condition}} / {{item.system.armor.conditionMax}}</td>
<td style="text-align: center;">{{item.system.weight}}</td>
<td style="text-align: center;">{{item.system.quantity}}</td>
<td style="text-align: center;">
<input type="checkbox" data-action="toggleEquipped" data-item-id="{{item.id}}" {{#if item.system.equipped}}checked{{/if}} style="cursor: pointer;" />
</td>
<td style="text-align: right; white-space: nowrap;">
<button type="button" class="edit-btn" data-action="editItem" data-item-id="{{item.id}}" title="{{localize 'HBM.ui.edit'}}">✎</button>
<button type="button" class="delete-btn" data-action="deleteItem" data-item-id="{{item.id}}" title="{{localize 'HBM.ui.delete'}}">✕</button>
</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
{{/if}}
{{#if equipment.length}}
<div class="inventory-section" style="margin-top: 15px;">
<h3>{{localize 'HBM.gear.equipment'}}</h3>
<table class="inventory-table">
<thead>
<tr>
<th style="text-align: left;">{{localize 'HBM.ui.name'}}</th>
<th>{{localize 'HBM.gear.weight'}}</th>
<th>{{localize 'HBM.gear.quantity'}}</th>
<th></th>
</tr>
</thead>
<tbody>
{{#each equipment as |item|}}
<tr class="item-tr" data-item-id="{{item.id}}">
<td>{{item.name}}</td>
<td style="text-align: center;">{{item.system.weight}}</td>
<td style="text-align: center;">{{item.system.quantity}}</td>
<td style="text-align: right; white-space: nowrap;">
<button type="button" class="edit-btn" data-action="editItem" data-item-id="{{item.id}}" title="{{localize 'HBM.ui.edit'}}">✎</button>
<button type="button" class="delete-btn" data-action="deleteItem" data-item-id="{{item.id}}" title="{{localize 'HBM.ui.delete'}}">✕</button>
</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
{{/if}}
{{#if (eq gear.length 0)}}
<p class="empty-drop">{{localize 'HBM.ui.dropItems'}}</p>
{{/if}}
<!-- Custom equipment rows -->
<div class="custom-equipment-section" style="margin-top: 20px;">
<div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:8px;">
<strong>{{localize 'HBM.ui.customEquipment'}}</strong>
<button type="button" data-action="addArrayEntry"
data-path="system.details.customItems"
data-template="{&quot;name&quot;:&quot;&quot;,&quot;qty&quot;:1,&quot;note&quot;:&quot;&quot;}"
style="padding:2px 8px; font-size:0.8rem; background:var(--hbm-success); color:#fff; border:none; border-radius:var(--hbm-radius); cursor:pointer;">
+ {{localize 'HBM.ui.add'}}
</button>
</div>
{{#if system.details.customItems.length}}
<table class="inventory-table" style="font-size:0.85rem;">
<thead>
<tr>
<th style="text-align:left;">{{localize 'HBM.ui.name'}}</th>
<th style="width:3rem;">{{localize 'HBM.gear.quantity'}}</th>
<th>{{localize 'HBM.ui.notes'}}</th>
<th></th>
</tr>
</thead>
<tbody>
{{#each system.details.customItems as |row i|}}
<tr>
<td><input type="text" name="system.details.customItems.{{i}}.name" value="{{row.name}}"
style="width:100%; border:none; border-bottom:1px solid var(--hbm-border); background:transparent; color:var(--hbm-fg); font-size:0.85rem;" /></td>
<td><input type="number" name="system.details.customItems.{{i}}.qty" value="{{row.qty}}" min="0"
style="width:3rem; text-align:center; border:none; border-bottom:1px solid var(--hbm-border); background:transparent; color:var(--hbm-fg); font-size:0.85rem;" /></td>
<td><input type="text" name="system.details.customItems.{{i}}.note" value="{{row.note}}"
style="width:100%; border:none; border-bottom:1px solid var(--hbm-border); background:transparent; color:var(--hbm-fg); font-size:0.8rem; color:#777;" /></td>
<td style="text-align:right;">
<button type="button" class="delete-btn" data-action="removeArrayEntry"
data-path="system.details.customItems" data-index="{{i}}"
title="{{localize 'HBM.ui.delete'}}">✕</button>
</td>
</tr>
{{/each}}
</tbody>
</table>
{{else}}
<p style="font-size:0.8rem; color:#888; font-style:italic;">{{localize 'HBM.ui.dropItems'}}</p>
{{/if}}
</div>
</section>
<!-- ── EFFECTS ────────────────────────────────────────────────────────── -->
<section class="tab-panel {{#if (eq tabGroups.primary 'effects')}}active{{/if}}" data-tab="effects">
{{> 'systems/hbm-rpg-v3/templates/actor/_actor-effects.hbs'}}
</section>
<!-- ── BIOGRAPHY ──────────────────────────────────────────────────────── -->
<section class="tab-panel {{#if (eq tabGroups.primary 'biography')}}active{{/if}}" data-tab="biography">
<div class="bio-grid" style="display: flex; gap: 20px; flex-direction: column;">
<div style="display: flex; gap: 20px;">
<div class="bio-image-container" style="display: flex; flex-direction: column; align-items: center; gap: 10px; flex-shrink: 0;">
<img class="profile-img" src="{{document.img}}" data-action="editImage" title="{{document.name}}" height="150" width="150" style="border: 2px solid #555; border-radius: 4px; cursor: pointer; background: #222;" />
<small style="color: #777;">{{localize 'HBM.ui.changeImageHint'}}</small>
</div>
<div class="bio-section" style="flex: 1; display: flex; flex-direction: column; gap: 10px;">
<div style="overflow-x: auto; margin-top: 5px;">
<table class="schedule-table">
<thead>
<tr style="background: rgba(0, 0, 0, 0.15); border-bottom: 2px solid var(--hbm-border);">
<th style="width: 3%;">#</th>
<th style="width: 12%;">{{localize 'HBM.schedule.hours'}}</th>
<th style="width: 14%;">{{localize 'HBM.schedule.monday'}}</th>
<th style="width: 14%;">{{localize 'HBM.schedule.tuesday'}}</th>
<th style="width: 14%;">{{localize 'HBM.schedule.wednesday'}}</th>
<th style="width: 14%;">{{localize 'HBM.schedule.thursday'}}</th>
<th style="width: 14%;">{{localize 'HBM.schedule.friday'}}</th>
<th style="width: 13%;">{{localize 'HBM.schedule.saturday'}}</th>
</tr>
</thead>
<tbody>
<!-- Row 1 -->
<tr>
<td style="font-weight: bold;">1</td>
<td><input type="text" name="system.details.schedule.row1.hours" value="{{system.details.schedule.row1.hours}}" /></td>
<td><input type="text" name="system.details.schedule.row1.mon" value="{{system.details.schedule.row1.mon}}" /></td>
<td><input type="text" name="system.details.schedule.row1.tue" value="{{system.details.schedule.row1.tue}}" /></td>
<td><input type="text" name="system.details.schedule.row1.wed" value="{{system.details.schedule.row1.wed}}" /></td>
<td><input type="text" name="system.details.schedule.row1.thu" value="{{system.details.schedule.row1.thu}}" /></td>
<td><input type="text" name="system.details.schedule.row1.fri" value="{{system.details.schedule.row1.fri}}" /></td>
<td><input type="text" name="system.details.schedule.row1.sat" value="{{system.details.schedule.row1.sat}}" /></td>
</tr>
<!-- Row 2 -->
<tr>
<td style="font-weight: bold;">2</td>
<td><input type="text" name="system.details.schedule.row2.hours" value="{{system.details.schedule.row2.hours}}" /></td>
<td><input type="text" name="system.details.schedule.row2.mon" value="{{system.details.schedule.row2.mon}}" /></td>
<td><input type="text" name="system.details.schedule.row2.tue" value="{{system.details.schedule.row2.tue}}" /></td>
<td><input type="text" name="system.details.schedule.row2.wed" value="{{system.details.schedule.row2.wed}}" /></td>
<td><input type="text" name="system.details.schedule.row2.thu" value="{{system.details.schedule.row2.thu}}" /></td>
<td><input type="text" name="system.details.schedule.row2.fri" value="{{system.details.schedule.row2.fri}}" /></td>
<td><input type="text" name="system.details.schedule.row2.sat" value="{{system.details.schedule.row2.sat}}" /></td>
</tr>
<!-- Row 3 -->
<tr>
<td style="font-weight: bold;">3</td>
<td><input type="text" name="system.details.schedule.row3.hours" value="{{system.details.schedule.row3.hours}}" /></td>
<td><input type="text" name="system.details.schedule.row3.mon" value="{{system.details.schedule.row3.mon}}" /></td>
<td><input type="text" name="system.details.schedule.row3.tue" value="{{system.details.schedule.row3.tue}}" /></td>
<td><input type="text" name="system.details.schedule.row3.wed" value="{{system.details.schedule.row3.wed}}" /></td>
<td><input type="text" name="system.details.schedule.row3.thu" value="{{system.details.schedule.row3.thu}}" /></td>
<td><input type="text" name="system.details.schedule.row3.fri" value="{{system.details.schedule.row3.fri}}" /></td>
<td><input type="text" name="system.details.schedule.row3.sat" value="{{system.details.schedule.row3.sat}}" /></td>
</tr>
<!-- Break -->
<tr style="background: rgba(0, 0, 0, 0.08); font-weight: bold;">
<td colspan="8" style="padding: 5px; text-align: center; letter-spacing: 0.1em; text-transform: uppercase; font-size: 0.75rem;">{{localize 'HBM.schedule.lunchBreak'}}</td>
</tr>
<!-- Row 4 -->
<tr>
<td style="font-weight: bold;">4</td>
<td><input type="text" name="system.details.schedule.row4.hours" value="{{system.details.schedule.row4.hours}}" /></td>
<td><input type="text" name="system.details.schedule.row4.mon" value="{{system.details.schedule.row4.mon}}" /></td>
<td><input type="text" name="system.details.schedule.row4.tue" value="{{system.details.schedule.row4.tue}}" /></td>
<td><input type="text" name="system.details.schedule.row4.wed" value="{{system.details.schedule.row4.wed}}" /></td>
<td><input type="text" name="system.details.schedule.row4.thu" value="{{system.details.schedule.row4.thu}}" /></td>
<td><input type="text" name="system.details.schedule.row4.fri" value="{{system.details.schedule.row4.fri}}" /></td>
<td><input type="text" name="system.details.schedule.row4.sat" value="{{system.details.schedule.row4.sat}}" /></td>
</tr>
<!-- Row 5 -->
<tr>
<td style="font-weight: bold;">5</td>
<td><input type="text" name="system.details.schedule.row5.hours" value="{{system.details.schedule.row5.hours}}" /></td>
<td><input type="text" name="system.details.schedule.row5.mon" value="{{system.details.schedule.row5.mon}}" /></td>
<td><input type="text" name="system.details.schedule.row5.tue" value="{{system.details.schedule.row5.tue}}" /></td>
<td><input type="text" name="system.details.schedule.row5.wed" value="{{system.details.schedule.row5.wed}}" /></td>
<td><input type="text" name="system.details.schedule.row5.thu" value="{{system.details.schedule.row5.thu}}" /></td>
<td><input type="text" name="system.details.schedule.row5.fri" value="{{system.details.schedule.row5.fri}}" /></td>
<td><input type="text" name="system.details.schedule.row5.sat" value="{{system.details.schedule.row5.sat}}" /></td>
</tr>
<!-- Row 6 -->
<tr>
<td style="font-weight: bold;">6</td>
<td><input type="text" name="system.details.schedule.row6.hours" value="{{system.details.schedule.row6.hours}}" /></td>
<td><input type="text" name="system.details.schedule.row6.mon" value="{{system.details.schedule.row6.mon}}" /></td>
<td><input type="text" name="system.details.schedule.row6.tue" value="{{system.details.schedule.row6.tue}}" /></td>
<td><input type="text" name="system.details.schedule.row6.wed" value="{{system.details.schedule.row6.wed}}" /></td>
<td><input type="text" name="system.details.schedule.row6.thu" value="{{system.details.schedule.row6.thu}}" /></td>
<td><input type="text" name="system.details.schedule.row6.fri" value="{{system.details.schedule.row6.fri}}" /></td>
<td><input type="text" name="system.details.schedule.row6.sat" value="{{system.details.schedule.row6.sat}}" /></td>
</tr>
<!-- Row 7 -->
<tr>
<td style="font-weight: bold;">7</td>
<td><input type="text" name="system.details.schedule.row7.hours" value="{{system.details.schedule.row7.hours}}" /></td>
<td><input type="text" name="system.details.schedule.row7.mon" value="{{system.details.schedule.row7.mon}}" /></td>
<td><input type="text" name="system.details.schedule.row7.tue" value="{{system.details.schedule.row7.tue}}" /></td>
<td><input type="text" name="system.details.schedule.row7.wed" value="{{system.details.schedule.row7.wed}}" /></td>
<td><input type="text" name="system.details.schedule.row7.thu" value="{{system.details.schedule.row7.thu}}" /></td>
<td><input type="text" name="system.details.schedule.row7.fri" value="{{system.details.schedule.row7.fri}}" /></td>
<td><input type="text" name="system.details.schedule.row7.sat" value="{{system.details.schedule.row7.sat}}" /></td>
</tr>
<!-- Break -->
<tr style="background: rgba(0, 0, 0, 0.08); font-weight: bold;">
<td colspan="8" style="padding: 5px; text-align: center; letter-spacing: 0.1em; text-transform: uppercase; font-size: 0.75rem;">{{localize 'HBM.schedule.dinnerBreak'}}</td>
</tr>
<!-- Row 8 -->
<tr>
<td style="font-weight: bold;">8</td>
<td><input type="text" name="system.details.schedule.row8.hours" value="{{system.details.schedule.row8.hours}}" /></td>
<td><input type="text" name="system.details.schedule.row8.mon" value="{{system.details.schedule.row8.mon}}" /></td>
<td><input type="text" name="system.details.schedule.row8.tue" value="{{system.details.schedule.row8.tue}}" /></td>
<td><input type="text" name="system.details.schedule.row8.wed" value="{{system.details.schedule.row8.wed}}" /></td>
<td><input type="text" name="system.details.schedule.row8.thu" value="{{system.details.schedule.row8.thu}}" /></td>
<td><input type="text" name="system.details.schedule.row8.fri" value="{{system.details.schedule.row8.fri}}" /></td>
<td><input type="text" name="system.details.schedule.row8.sat" value="{{system.details.schedule.row8.sat}}" /></td>
</tr>
<!-- Row 9 -->
<tr>
<td style="font-weight: bold;">9</td>
<td><input type="text" name="system.details.schedule.row9.hours" value="{{system.details.schedule.row9.hours}}" /></td>
<td><input type="text" name="system.details.schedule.row9.mon" value="{{system.details.schedule.row9.mon}}" /></td>
<td><input type="text" name="system.details.schedule.row9.tue" value="{{system.details.schedule.row9.tue}}" /></td>
<td><input type="text" name="system.details.schedule.row9.wed" value="{{system.details.schedule.row9.wed}}" /></td>
<td><input type="text" name="system.details.schedule.row9.thu" value="{{system.details.schedule.row9.thu}}" /></td>
<td><input type="text" name="system.details.schedule.row9.fri" value="{{system.details.schedule.row9.fri}}" /></td>
<td><input type="text" name="system.details.schedule.row9.sat" value="{{system.details.schedule.row9.sat}}" /></td>
</tr>
<!-- Break -->
<tr style="background: rgba(0, 0, 0, 0.08); font-weight: bold;">
<td colspan="8" style="padding: 5px; text-align: center; letter-spacing: 0.1em; text-transform: uppercase; font-size: 0.75rem;">{{localize 'HBM.schedule.supperBreak'}}</td>
</tr>
<!-- Row 10 -->
<tr>
<td style="font-weight: bold;">10</td>
<td><input type="text" name="system.details.schedule.row10.hours" value="{{system.details.schedule.row10.hours}}" /></td>
<td><input type="text" name="system.details.schedule.row10.mon" value="{{system.details.schedule.row10.mon}}" /></td>
<td><input type="text" name="system.details.schedule.row10.tue" value="{{system.details.schedule.row10.tue}}" /></td>
<td><input type="text" name="system.details.schedule.row10.wed" value="{{system.details.schedule.row10.wed}}" /></td>
<td><input type="text" name="system.details.schedule.row10.thu" value="{{system.details.schedule.row10.thu}}" /></td>
<td><input type="text" name="system.details.schedule.row10.fri" value="{{system.details.schedule.row10.fri}}" /></td>
<td><input type="text" name="system.details.schedule.row10.sat" value="{{system.details.schedule.row10.sat}}" /></td>
</tr>
<!-- Row 11 -->
<tr>
<td style="font-weight: bold;">11</td>
<td><input type="text" name="system.details.schedule.row11.hours" value="{{system.details.schedule.row11.hours}}" /></td>
<td><input type="text" name="system.details.schedule.row11.mon" value="{{system.details.schedule.row11.mon}}" /></td>
<td><input type="text" name="system.details.schedule.row11.tue" value="{{system.details.schedule.row11.tue}}" /></td>
<td><input type="text" name="system.details.schedule.row11.wed" value="{{system.details.schedule.row11.wed}}" /></td>
<td><input type="text" name="system.details.schedule.row11.thu" value="{{system.details.schedule.row11.thu}}" /></td>
<td><input type="text" name="system.details.schedule.row11.fri" value="{{system.details.schedule.row11.fri}}" /></td>
<td><input type="text" name="system.details.schedule.row11.sat" value="{{system.details.schedule.row11.sat}}" /></td>
</tr>
<!-- Row 12 -->
<tr>
<td style="font-weight: bold;">12</td>
<td><input type="text" name="system.details.schedule.row12.hours" value="{{system.details.schedule.row12.hours}}" /></td>
<td><input type="text" name="system.details.schedule.row12.mon" value="{{system.details.schedule.row12.mon}}" /></td>
<td><input type="text" name="system.details.schedule.row12.tue" value="{{system.details.schedule.row12.tue}}" /></td>
<td><input type="text" name="system.details.schedule.row12.wed" value="{{system.details.schedule.row12.wed}}" /></td>
<td><input type="text" name="system.details.schedule.row12.thu" value="{{system.details.schedule.row12.thu}}" /></td>
<td><input type="text" name="system.details.schedule.row12.fri" value="{{system.details.schedule.row12.fri}}" /></td>
<td><input type="text" name="system.details.schedule.row12.sat" value="{{system.details.schedule.row12.sat}}" /></td>
</tr>
</tbody>
</table>
</div>
<div>
<label><strong>{{localize 'HBM.details.personalDetails'}}</strong></label>
<textarea name="system.details.personalDetails" rows="4" style="width: 100%; resize: vertical; border: 1px solid var(--hbm-border); border-radius: var(--hbm-radius); padding: 5px; background: var(--hbm-card-bg); color: var(--hbm-fg);">{{system.details.personalDetails}}</textarea>
</div>
</div>
</div>
<div class="bio-section">
<label><strong>{{localize 'HBM.ui.biography'}}</strong></label>
<textarea name="system.details.biography" rows="8" style="width: 100%; resize: vertical; border: 1px solid var(--hbm-border); border-radius: var(--hbm-radius); padding: 5px; background: var(--hbm-card-bg); color: var(--hbm-fg);">{{system.details.biography}}</textarea>
</div>
</div>
</section>
</div><!-- .sheet-body -->
</div>
+197
View File
@@ -0,0 +1,197 @@
<div class="sheet-wrapper">
<header class="sheet-header" style="display: flex; gap: 15px; align-items: flex-start; padding-bottom: 10px;">
<div class="bio-image-container" style="display: flex; flex-direction: column; align-items: center; gap: 5px;">
<img class="profile-img" src="{{document.img}}" data-action="editImage" title="{{document.name}}" height="80" width="80" style="border: 2px solid #555; border-radius: 4px; cursor: pointer; background: #222;" />
</div>
<div style="flex: 1; display: flex; flex-direction: column; gap: 5px;">
<input type="text" name="name" value="{{document.name}}" placeholder="{{localize 'HBM.ui.name'}}" style="font-size: 1.4rem; font-weight: bold; background: transparent; border: none; border-bottom: 1px solid rgba(255,255,255,0.25); color: #f0e6d0; width: 100%;" />
<div class="meta" style="margin-top: 0px; margin-bottom: 0px; display: flex; flex-wrap: wrap; gap: 10px; align-items: center;">
<label>{{localize 'HBM.npc.type'}}: <input type="text" name="system.details.type" value="{{system.details.type}}" style="width: 7rem;"/></label>
<label>{{localize 'HBM.npc.size'}}: <input type="text" name="system.details.size" value="{{system.details.size}}" style="width: 5rem;"/></label>
<label>{{localize 'HBM.npc.xp'}}: <input type="number" name="system.details.xp" value="{{system.details.xp}}" min="0" style="width: 4rem;"/></label>
<label>{{localize 'HBM.details.startingYear'}}: <input type="number" name="system.details.startingYear" value="{{system.details.startingYear}}" min="1900" style="width: 4rem;"/></label>
<label>{{localize 'HBM.details.currentYear'}}: <input type="number" name="system.details.currentYear" value="{{system.details.currentYear}}" min="1900" style="width: 4rem;"/></label>
<button type="button" class="header-btn" data-action="rollInitiative" title="{{localize 'HBM.resources.initiative'}}" style="margin-left: auto;">⚡ {{localize 'HBM.resources.initiative'}}</button>
<button type="button" class="header-btn" data-action="applyDamage" title="{{localize 'HBM.damage.title'}}" style="margin-left: 10px;">⚔ {{localize
'HBM.damage.apply'}}</button>
</div>
</div>
</header>
<div class="sheet-body">
<section class="attributes-grid">
{{#each attributes as |attr|}}
<div class="attribute">
<label>{{attr.label}}</label>
{{#if (eq attr.key 'magic')}}
<select name="system.attributes.magic.value" style="width: 4rem; text-align: center; border: none; border-bottom: 1px solid var(--hbm-border); background: transparent; color: var(--hbm-fg);">
<option value="0" {{#if (eq attr.value 0)}}selected{{/if}}>0</option>
<option value="1" {{#if (eq attr.value 1)}}selected{{/if}}>I</option>
<option value="2" {{#if (eq attr.value 2)}}selected{{/if}}>II</option>
<option value="3" {{#if (eq attr.value 3)}}selected{{/if}}>III</option>
<option value="4" {{#if (eq attr.value 4)}}selected{{/if}}>IV</option>
<option value="5" {{#if (eq attr.value 5)}}selected{{/if}}>V</option>
<option value="6" {{#if (eq attr.value 6)}}selected{{/if}}>VI</option>
<option value="7" {{#if (eq attr.value 7)}}selected{{/if}}>VII</option>
<option value="8" {{#if (eq attr.value 8)}}selected{{/if}}>VIII</option>
<option value="9" {{#if (eq attr.value 9)}}selected{{/if}}>IX</option>
<option value="10" {{#if (eq attr.value 10)}}selected{{/if}}>X</option>
</select>
<span class="actual-magic-badge" title="{{localize 'HBM.attributes.actualMagicHint'}}" style="font-size: 0.75rem; margin-top: 0.15rem; color: #a03030; font-weight: bold;">
({{localize 'HBM.attributes.actual'}}: {{attr.actualLabel}})
</span>
{{else}}
<input type="number" name="system.attributes.{{attr.key}}.value" value="{{attr.value}}" min="0" max="20"/>
{{/if}}
<button type="button" class="roll-button" data-action="rollAttribute" data-attribute="{{attr.key}}"
title="{{localize 'HBM.roll.roll'}}">⚂</button>
</div>
{{/each}}
</section>
<section class="resources-grid">
<div class="resource">
<label>{{localize 'HBM.resources.health'}}</label>
<span class="resource-value">
<input type="number" name="system.attributes.health.value" value="{{system.attributes.health.value}}" min="0"/>
<span class="sep">/</span>
<input type="number" name="system.attributes.health.max" value="{{system.attributes.health.max}}" min="1"/>
</span>
</div>
<div class="resource">
<label>{{localize 'HBM.resources.physicalArmor'}}</label>
<input type="number" name="system.attributes.physicalArmor.value" value="{{system.attributes.physicalArmor.value}}"
min="0" />
</div>
<div class="resource">
<label>{{localize 'HBM.resources.magicalShield'}}</label>
<input type="number" name="system.attributes.magicalShield.value" value="{{system.attributes.magicalShield.value}}"
min="0" />
</div>
<div class="resource">
<label>{{localize 'HBM.resources.magicalArmor'}}</label>
<span class="resource-value">
<input type="number" name="system.attributes.magicalArmor.value" value="{{system.attributes.magicalArmor.value}}"
min="0" />
<span class="sep">/</span>
<input type="number" name="system.attributes.magicalArmor.max" value="{{system.attributes.magicalArmor.max}}" min="0" />
</span>
</div>
<div class="resource">
<label>{{localize 'HBM.npc.speed'}}</label>
<input type="text" name="system.attributes.speed" value="{{system.attributes.speed}}"/>
</div>
<div class="resource" style="display: flex; flex-direction: row; gap: 8px; align-items: center; justify-content: center;">
<label style="font-size: 0.75rem; text-transform: uppercase;">{{localize 'HBM.ui.money'}}</label>
<input type="number" name="system.details.money" value="{{system.details.money}}" min="0" style="width: 3.5rem; text-align: center; border: none; border-bottom: 1px solid var(--hbm-border); background: transparent; color: var(--hbm-fg);"/>
<span>PLN</span>
<button type="button" data-action="recalculateMoney" style="padding: 1px 5px; font-size: 0.75rem; background: var(--hbm-accent); color: #fff; border: none; border-radius: var(--hbm-radius); cursor: pointer;" title="{{localize 'HBM.ui.recalculate'}}">🪙</button>
</div>
</section>
<section class="npc-meta-section">
<label>{{localize 'HBM.npc.senses'}}: <input type="text" name="system.details.senses" value="{{system.details.senses}}"/></label>
<label>{{localize 'HBM.npc.languages'}}: <input type="text" name="system.details.languages" value="{{system.details.languages}}"/></label>
</section>
<section class="combat-lists">
<fieldset>
<legend>{{localize 'HBM.npc.attacks'}}
<button type="button" data-action="addArrayEntry" data-path="system.combat.attacks"
data-template='{"name":"","description":"","damage":"","damageType":"physical","bonus":0}'
title="{{localize 'HBM.ui.add'}}"></button>
</legend>
{{#each system.combat.attacks as |a idx|}}
<div class="row">
<input type="text" name="system.combat.attacks.{{idx}}.name" value="{{a.name}}"
placeholder="{{localize 'HBM.ui.name'}}" />
<input type="number" name="system.combat.attacks.{{idx}}.bonus" value="{{a.bonus}}" min="0"
title="{{localize 'HBM.roll.pool'}}" />
<input type="text" name="system.combat.attacks.{{idx}}.damage" value="{{a.damage}}"
placeholder="{{localize 'HBM.gear.damage'}}" />
<input type="text" name="system.combat.attacks.{{idx}}.description" value="{{a.description}}"
placeholder="{{localize 'HBM.gear.description'}}" />
<button type="button" data-action="rollNpcAttack" data-index="{{idx}}"
title="{{localize 'HBM.roll.roll'}}">⚂</button>
<button type="button" data-action="removeArrayEntry" data-path="system.combat.attacks" data-index="{{idx}}"
title="{{localize 'HBM.ui.delete'}}">✕</button>
</div>
{{/each}}
</fieldset>
<fieldset>
<legend>{{localize 'HBM.npc.specialAbilities'}}
<button type="button" data-action="addArrayEntry" data-path="system.combat.specialAbilities"
data-template='{"name":"","description":""}' title="{{localize 'HBM.ui.add'}}"></button>
</legend>
{{#each system.combat.specialAbilities as |a idx|}}
<div class="row">
<input type="text" name="system.combat.specialAbilities.{{idx}}.name" value="{{a.name}}" />
<input type="text" name="system.combat.specialAbilities.{{idx}}.description" value="{{a.description}}" />
<button type="button" data-action="removeArrayEntry" data-path="system.combat.specialAbilities"
data-index="{{idx}}">✕</button>
</div>
{{/each}}
</fieldset>
<fieldset>
<legend>{{localize 'HBM.npc.reactions'}}
<button type="button" data-action="addArrayEntry" data-path="system.combat.reactions"
data-template='{"name":"","description":""}' title="{{localize 'HBM.ui.add'}}"></button>
</legend>
{{#each system.combat.reactions as |a idx|}}
<div class="row">
<input type="text" name="system.combat.reactions.{{idx}}.name" value="{{a.name}}" />
<input type="text" name="system.combat.reactions.{{idx}}.description" value="{{a.description}}" />
<button type="button" data-action="removeArrayEntry" data-path="system.combat.reactions"
data-index="{{idx}}">✕</button>
</div>
{{/each}}
</fieldset>
<fieldset>
<legend>{{localize 'HBM.npc.legendaryActions'}}
<button type="button" data-action="addArrayEntry" data-path="system.combat.legendaryActions"
data-template='{"name":"","description":""}' title="{{localize 'HBM.ui.add'}}"></button>
</legend>
{{#each system.combat.legendaryActions as |a idx|}}
<div class="row">
<input type="text" name="system.combat.legendaryActions.{{idx}}.name" value="{{a.name}}" />
<input type="text" name="system.combat.legendaryActions.{{idx}}.description" value="{{a.description}}" />
<button type="button" data-action="removeArrayEntry" data-path="system.combat.legendaryActions"
data-index="{{idx}}">✕</button>
</div>
{{/each}}
</fieldset>
</section>
<section class="lore">
<label>{{localize 'HBM.gear.description'}}</label>
<textarea name="system.lore.description" rows="6">{{system.lore.description}}</textarea>
</section>
{{#if spells.length}}
<section class="spells-list">
<fieldset>
<legend>{{localize 'HBM.ui.tabs.spells'}}</legend>
{{#each spells as |sp|}}
<div class="row spell-row">
<span class="badge mode mode-{{sp.system.castingMode}}"
title="{{localize (concat 'HBM.spell.castingMode.' sp.system.castingMode)}}">{{sp.system.castingMode}}</span>
<span class="spell-name"><strong>{{sp.name}}</strong>{{#if sp.system.circle}}
<small>K{{sp.system.circle}}</small>{{/if}}</span>
<button type="button" data-action="castSpell" data-item-id="{{sp.id}}"
title="{{localize 'HBM.spell.cast'}}">✦ {{localize 'HBM.spell.cast'}}</button>
<button type="button" data-action="editItem" data-item-id="{{sp.id}}"
title="{{localize 'HBM.ui.edit'}}">✎</button>
<button type="button" data-action="deleteItem" data-item-id="{{sp.id}}"
title="{{localize 'HBM.ui.delete'}}">✕</button>
</div>
{{/each}}
</fieldset>
</section>
{{/if}}
<section class="actor-effects-section">
{{> 'systems/hbm-rpg-v3/templates/actor/_actor-effects.hbs'}}
</section>
</div>
</div>
+88
View File
@@ -0,0 +1,88 @@
<div class="hbm spell-cast-card" data-spell-name="{{spell.name}}">
<header class="hbm-card-header">
<h3>{{spell.name}}</h3>
<div class="hbm-card-meta">
{{#if mode}}<span class="badge mode mode-{{mode}}">{{localize (concat 'HBM.spell.castingMode.' mode)}}</span>{{/if}}
{{#if school}}<span class="badge school">{{localize (concat 'HBM.spellSchool.' school)}}</span>{{/if}}
{{#if circle}}<span class="badge circle">{{localize 'HBM.spell.circle'}} {{circle}}</span>{{/if}}
{{#if outcome.success}}
<span class="badge result success">✓ {{localize 'HBM.spellCast.success'}}</span>
{{else}}
<span class="badge result failure">✗ {{localize 'HBM.spellCast.failure'}}</span>
{{/if}}
</div>
</header>
{{#if costs.length}}
<ul class="hbm-card-costs">
{{#each costs as |c|}}
<li>{{c.label}}: <strong>{{c.amount}}</strong></li>
{{/each}}
</ul>
{{/if}}
{{#if outcome.success}}
{{#if damage}}
<section class="hbm-card-damage">
<h4>{{localize 'HBM.spellCast.damage'}}</h4>
<div class="damage-line">
<strong>{{damage.total}}</strong>
{{#if damage.type}}<span class="badge damage-type">{{localize (concat 'HBM.damageType.' damage.type)}}</span>{{/if}}
{{#if damage.ignoresArmor}}<span class="badge ignores-armor">{{localize 'HBM.spell.ignoresArmor'}}</span>{{/if}}
</div>
<div class="damage-formula"><code>{{damage.formula}}</code></div>
{{#if damage.targets}}
<div class="hbm-card-targets">
{{#each damage.targets as |t|}}
<button type="button" class="hbm-action" data-action="hbm-apply-damage" data-target-uuid="{{t.uuid}}" data-amount="{{../damage.total}}" data-type="{{../damage.type}}" data-ignores-armor="{{../damage.ignoresArmor}}">
{{t.name}}
</button>
{{/each}}
</div>
{{else}}
<p class="hbm-card-hint">{{localize 'HBM.spellCast.targetSomeone'}}</p>
{{/if}}
</section>
{{/if}}
{{#if save}}
<section class="hbm-card-save">
<strong>{{localize 'HBM.spellCast.saveTarget'}}:</strong>
{{localize (concat 'HBM.attributes.' save.attribute)}}
{{#if save.skill}}+ {{localize (concat 'HBM.skills.' save.skill)}}{{/if}}
</section>
{{/if}}
{{#if statusEffects.length}}
<section class="hbm-card-status">
<h4>{{localize 'HBM.spellCast.statusEffects'}}</h4>
<div class="status-buttons">
{{#each statusEffects as |s|}}
<button type="button" class="hbm-action" data-action="hbm-apply-status" data-effect-id="{{s.id}}">
{{s.label}}
</button>
{{/each}}
</div>
<p class="hbm-card-hint">{{localize 'HBM.spellCast.applyToTargets'}}</p>
</section>
{{/if}}
{{#if triggers.length}}
<section class="hbm-card-triggers">
<h4>{{localize 'HBM.spellCast.triggers'}}</h4>
<ul>
{{#each triggers as |t|}}
<li><span class="badge trigger-event">{{localize (concat 'HBM.triggerEvent.' t.event)}}</span> — {{t.effect}}</li>
{{/each}}
</ul>
</section>
{{/if}}
{{/if}}
{{#if description}}
<details class="hbm-card-description">
<summary>{{localize 'HBM.spell.description'}}</summary>
<div>{{{description}}}</div>
</details>
{{/if}}
</div>
+21
View File
@@ -0,0 +1,21 @@
<div class="hbm ts-roll">
<div class="formula">{{formula}}</div>
{{#if flavor}}<div class="flavor">{{flavor}}</div>{{/if}}
<div class="dice">
{{#each dice}}
<span class="{{cls}}" title="{{face}}">{{face}}</span>
{{/each}}
</div>
<div class="summary {{#if ts.isSuccess}}success{{else}}failure{{/if}}">
{{localize "HBM.roll.successes"}}: <strong>{{ts.successes}}</strong>
/ {{localize "HBM.roll.required"}}: {{ts.required}}
({{localize "HBM.roll.threshold"}} {{ts.threshold}})
{{#if ts.isSuccess}}{{localize "HBM.roll.success"}}{{else}}{{localize "HBM.roll.failure"}}{{/if}}
</div>
{{#if ts.criticalSuccesses}}
<div class="crit">{{localize "HBM.roll.criticalSuccess"}}: {{ts.criticalSuccesses}}</div>
{{/if}}
{{#if ts.criticalFailures}}
<div class="crit">{{localize "HBM.roll.criticalFailure"}}: {{ts.criticalFailures}}</div>
{{/if}}
</div>
+2
View File
@@ -0,0 +1,2 @@
{{!-- Body dispatcher: includes the partial chosen by the sheet's _prepareContext. --}}
{{> (lookup this 'bodyPartial') }}
+26
View File
@@ -0,0 +1,26 @@
{{!-- Active Effects partial — included by talent and gear sheets. --}}
{{#if supportsEffects}}
<fieldset class="hbm-effects">
<legend>{{localize 'HBM.activeEffect.title'}}</legend>
<button type="button" class="hbm-effect-add" data-action="effectCreate">+ {{localize 'HBM.activeEffect.addEffect'}}</button>
{{#if effects.length}}
<ul class="effect-list">
{{#each effects as |e|}}
<li class="effect-row {{#if e.disabled}}disabled{{/if}}">
<img src="{{e.icon}}" width="20" height="20"/>
<span class="effect-name">{{e.name}}</span>
<span class="effect-meta">
{{#if e.transfer}}<span class="badge">→ {{localize 'HBM.activeEffect.transferToActor'}}</span>{{/if}}
<span class="badge">{{e.changes.length}} {{localize 'HBM.activeEffect.changes'}}</span>
</span>
<button type="button" data-action="effectToggle" data-effect-id="{{e.id}}" title="{{localize 'HBM.activeEffect.toggle'}}">{{#if e.disabled}}{{else}}{{/if}}</button>
<button type="button" data-action="effectEdit" data-effect-id="{{e.id}}" title="{{localize 'HBM.activeEffect.edit'}}">✎</button>
<button type="button" data-action="effectDelete" data-effect-id="{{e.id}}" title="{{localize 'HBM.activeEffect.deleteEffect'}}">✕</button>
</li>
{{/each}}
</ul>
{{else}}
<p class="hbm-hint">{{localize 'HBM.activeEffect.empty'}}</p>
{{/if}}
</fieldset>
{{/if}}
+4
View File
@@ -0,0 +1,4 @@
<div class="hbm item-body unknown">
<p><strong>{{document.name}}</strong></p>
<p class="hint">{{localize 'HBM.ui.unknownItemType'}}: <code>{{itemType}}</code></p>
</div>
+18
View File
@@ -0,0 +1,18 @@
<div class="hbm item-body ability">
<div class="row">
<label>{{localize 'HBM.ability.type'}}:
<select name="system.type">
<option value="passive" {{#if (eq system.type 'passive')}}selected{{/if}}>{{localize 'HBM.ability.passive'}}</option>
<option value="active" {{#if (eq system.type 'active')}}selected{{/if}}>{{localize 'HBM.ability.active'}}</option>
<option value="reaction" {{#if (eq system.type 'reaction')}}selected{{/if}}>{{localize 'HBM.ability.reaction'}}</option>
<option value="freeAction" {{#if (eq system.type 'freeAction')}}selected{{/if}}>{{localize 'HBM.ability.freeAction'}}</option>
</select>
</label>
<label>{{localize 'HBM.ability.cost'}}: <input type="text" name="system.cost" value="{{system.cost}}"/></label>
<label>{{localize 'HBM.spell.manaCost'}}: <input type="number" name="system.manaCost" value="{{system.manaCost}}" min="0"/></label>
<label>{{localize 'HBM.resources.zeal'}}: <input type="number" name="system.zealCost" value="{{system.zealCost}}" min="0"/></label>
</div>
<label>{{localize 'HBM.ability.prerequisite'}}<input type="text" name="system.prerequisite" value="{{system.prerequisite}}"/></label>
<label>{{localize 'HBM.ability.description'}}<textarea name="system.description" rows="6">{{system.description}}</textarea></label>
<label>{{localize 'HBM.ability.mechanics'}}<textarea name="system.mechanics" rows="4">{{system.mechanics}}</textarea></label>
</div>
+51
View File
@@ -0,0 +1,51 @@
<div class="hbm item-body class">
<div class="row">
<label>{{localize 'HBM.class.year'}}: <input type="number" name="system.year" value="{{system.year}}" min="1" max="4"/></label>
<label>{{localize 'HBM.class.attributePoints'}}: <input type="number" name="system.attributePoints" value="{{system.attributePoints}}" min="0"/></label>
<label>{{localize 'HBM.class.skillPoints'}}: <input type="number" name="system.skillPoints" value="{{system.skillPoints}}" min="0"/></label>
</div>
<fieldset>
<legend>{{localize 'HBM.class.talents'}}
<button type="button" data-action="addArrayEntry" data-path="system.talents" data-template='""'
title="{{localize 'HBM.ui.add'}}"></button>
</legend>
{{#each system.talents as |t idx|}}
<div class="row">
<input type="text" name="system.talents.{{idx}}" value="{{t}}" />
<button type="button" data-action="removeArrayEntry" data-path="system.talents" data-index="{{idx}}">✕</button>
</div>
{{/each}}
</fieldset>
<fieldset>
<legend>{{localize 'HBM.class.spells'}}
<button type="button" data-action="addArrayEntry" data-path="system.spells" data-template='""'
title="{{localize 'HBM.ui.add'}}"></button>
</legend>
{{#each system.spells as |s idx|}}
<div class="row">
<input type="text" name="system.spells.{{idx}}" value="{{s}}" />
<button type="button" data-action="removeArrayEntry" data-path="system.spells" data-index="{{idx}}">✕</button>
</div>
{{/each}}
</fieldset>
<fieldset>
<legend>{{localize 'HBM.class.features'}}
<button type="button" data-action="addArrayEntry" data-path="system.features"
data-template='{"name":"","description":""}' title="{{localize 'HBM.ui.add'}}"></button>
</legend>
{{#each system.features as |f idx|}}
<div class="row">
<input type="text" name="system.features.{{idx}}.name" value="{{f.name}}"
placeholder="{{localize 'HBM.ui.name'}}" />
<input type="text" name="system.features.{{idx}}.description" value="{{f.description}}"
placeholder="{{localize 'HBM.gear.description'}}" />
<button type="button" data-action="removeArrayEntry" data-path="system.features" data-index="{{idx}}">✕</button>
</div>
{{/each}}
</fieldset>
<label>{{localize 'HBM.class.description'}}<textarea name="system.description"
rows="6">{{system.description}}</textarea></label>
</div>
+29
View File
@@ -0,0 +1,29 @@
<div class="hbm item-body discipline">
<div class="row">
<label>{{localize 'HBM.discipline.color'}}: <input type="text" name="system.color" value="{{system.color}}"/></label>
<label>{{localize 'HBM.discipline.suggestedAttribute'}}:
<select name="system.suggestedAttribute">
<option value="body" {{#if (eq system.suggestedAttribute 'body')}}selected{{/if}}>{{localize 'HBM.attributes.body'}}</option>
<option value="mind" {{#if (eq system.suggestedAttribute 'mind')}}selected{{/if}}>{{localize 'HBM.attributes.mind'}}</option>
<option value="soul" {{#if (eq system.suggestedAttribute 'soul')}}selected{{/if}}>{{localize 'HBM.attributes.soul'}}</option>
<option value="magic" {{#if (eq system.suggestedAttribute 'magic')}}selected{{/if}}>{{localize 'HBM.attributes.magic'}}</option>
</select>
</label>
</div>
<label>{{localize 'HBM.discipline.passiveAbility'}}<textarea name="system.passiveAbility" rows="3">{{system.passiveAbility}}</textarea></label>
<fieldset>
<legend>{{localize 'HBM.discipline.signatureSpells'}}
<button type="button" data-action="addArrayEntry" data-path="system.signatureSpells" data-template='""'
title="{{localize 'HBM.ui.add'}}"></button>
</legend>
{{#each system.signatureSpells as |s idx|}}
<div class="row">
<input type="text" name="system.signatureSpells.{{idx}}" value="{{s}}" />
<button type="button" data-action="removeArrayEntry" data-path="system.signatureSpells"
data-index="{{idx}}">✕</button>
</div>
{{/each}}
</fieldset>
<label>{{localize 'HBM.discipline.description'}}<textarea name="system.description" rows="6">{{system.description}}</textarea></label>
</div>
+60
View File
@@ -0,0 +1,60 @@
<div class="hbm item-body gear">
<div class="row">
<label>{{localize 'HBM.gear.category'}}:
<select name="system.category">
<option value="weapon" {{#if (eq system.category 'weapon')}}selected{{/if}}>{{localize 'HBM.gear.weapon'}}</option>
<option value="armor" {{#if (eq system.category 'armor')}}selected{{/if}}>{{localize 'HBM.gear.armor'}}</option>
<option value="equipment" {{#if (eq system.category 'equipment')}}selected{{/if}}>{{localize 'HBM.gear.equipment'}}</option>
</select>
</label>
<label>{{localize 'HBM.gear.rarity'}}: <input type="text" name="system.rarity" value="{{system.rarity}}"/></label>
<label>{{localize 'HBM.gear.quantity'}}: <input type="number" name="system.quantity" value="{{system.quantity}}" min="0"/></label>
<label>{{localize 'HBM.gear.weight'}}: <input type="number" name="system.weight" value="{{system.weight}}" min="0"/></label>
<label>{{localize 'HBM.gear.value'}}: <input type="number" name="system.value" value="{{system.value}}" min="0"/></label>
</div>
<div class="row">
<label><input type="checkbox" name="system.equipped" {{#if system.equipped}}checked{{/if}} /> {{localize
'HBM.gear.equipped'}}</label>
<label title="{{localize 'HBM.gear.damageReductionBonusHint'}}">{{localize 'HBM.gear.damageReductionBonus'}}: <input
type="number" name="system.damageReductionBonus" value="{{system.damageReductionBonus}}" min="0" /></label>
</div>
{{#if (eq system.category 'weapon')}}
<fieldset>
<legend>{{localize 'HBM.gear.weapon'}}</legend>
<label>{{localize 'HBM.gear.damage'}}: <input type="text" name="system.weapon.damage" value="{{system.weapon.damage}}"/></label>
<label>{{localize 'HBM.gear.damageType'}}:
<select name="system.weapon.damageType">
<option value="physical" {{#if (eq system.weapon.damageType 'physical')}}selected{{/if}}>{{localize 'HBM.gear.physical'}}</option>
<option value="magical" {{#if (eq system.weapon.damageType 'magical')}}selected{{/if}}>{{localize 'HBM.gear.magical'}}</option>
<option value="environmental" {{#if (eq system.weapon.damageType 'environmental')}}selected{{/if}}>{{localize 'HBM.gear.environmental'}}</option>
</select>
</label>
</fieldset>
{{/if}}
{{#if (eq system.category 'armor')}}
<fieldset>
<legend>{{localize 'HBM.gear.armor'}}</legend>
<label>{{localize 'HBM.gear.damageReduction'}}: <input type="number" name="system.armor.damageReduction"
value="{{system.armor.damageReduction}}" min="0" /></label>
<label>{{localize 'HBM.gear.condition'}}: <input type="number" name="system.armor.condition"
value="{{system.armor.condition}}" min="0" /> / <input type="number" name="system.armor.conditionMax"
value="{{system.armor.conditionMax}}" min="0" /></label>
<label>{{localize 'HBM.gear.armorType'}}:
<select name="system.armor.armorType">
<option value="light" {{#if (eq system.armor.armorType 'light')}}selected{{/if}}>{{localize 'HBM.gear.light'}}</option>
<option value="medium" {{#if (eq system.armor.armorType 'medium')}}selected{{/if}}>{{localize 'HBM.gear.medium'}}</option>
<option value="heavy" {{#if (eq system.armor.armorType 'heavy')}}selected{{/if}}>{{localize 'HBM.gear.heavy'}}</option>
<option value="shield" {{#if (eq system.armor.armorType 'shield')}}selected{{/if}}>{{localize 'HBM.gear.shield'}}</option>
</select>
</label>
<label>{{localize 'HBM.gear.strengthRequirement'}}: <input type="number" name="system.armor.strengthRequirement" value="{{system.armor.strengthRequirement}}" min="0"/></label>
<label><input type="checkbox" name="system.armor.stealthDisadvantage" {{#if system.armor.stealthDisadvantage}}checked{{/if}}/> {{localize 'HBM.gear.stealthDisadvantage'}}</label>
</fieldset>
{{/if}}
<label>{{localize 'HBM.gear.description'}}<textarea name="system.description" rows="6">{{system.description}}</textarea></label>
{{> 'systems/hbm-rpg-v3/templates/item/_effects.hbs'}}
</div>
+4
View File
@@ -0,0 +1,4 @@
<header class="hbm item-header">
<input type="text" name="name" value="{{document.name}}" placeholder="{{localize 'HBM.ui.name'}}"/>
<span class="item-type">{{localize (concat 'HBM.item.' itemType)}}</span>
</header>
+25
View File
@@ -0,0 +1,25 @@
<div class="hbm item-body race">
<div class="row">
<label>{{localize 'HBM.race.attributePoints'}}: <input type="number" name="system.attributePoints" value="{{system.attributePoints}}" min="0"/></label>
<label>{{localize 'HBM.race.skillPoints'}}: <input type="number" name="system.skillPoints" value="{{system.skillPoints}}" min="0"/></label>
</div>
<label>{{localize 'HBM.race.physicalDescription'}}<input type="text" name="system.physicalDescription" value="{{system.physicalDescription}}"/></label>
<fieldset>
<legend>{{localize 'HBM.race.traits'}}
<button type="button" data-action="addArrayEntry" data-path="system.traits"
data-template='{"name":"","description":""}' title="{{localize 'HBM.ui.add'}}"></button>
</legend>
{{#each system.traits as |t idx|}}
<div class="row">
<input type="text" name="system.traits.{{idx}}.name" value="{{t.name}}"
placeholder="{{localize 'HBM.ui.name'}}" />
<input type="text" name="system.traits.{{idx}}.description" value="{{t.description}}"
placeholder="{{localize 'HBM.gear.description'}}" />
<button type="button" data-action="removeArrayEntry" data-path="system.traits" data-index="{{idx}}">✕</button>
</div>
{{/each}}
</fieldset>
<label>{{localize 'HBM.race.description'}}<textarea name="system.description"
rows="6">{{system.description}}</textarea></label>
</div>
+252
View File
@@ -0,0 +1,252 @@
<div class="hbm item-body spell">
{{!-- ── Identification ──────────────────────────────────────────── --}}
<fieldset>
<legend>{{localize 'HBM.spell.label'}}</legend>
<div class="row">
<label>{{localize 'HBM.spell.circle'}}:
<input type="number" name="system.circle" value="{{system.circle}}" min="0" max="9" />
</label>
<label>{{localize 'HBM.spell.school'}}:
<select name="system.school">
{{#each @root.choices.schools as |label key|}}
<option value="{{key}}" {{#if (eq ../system.school key)}}selected{{/if}}>{{label}}</option>
{{/each}}
</select>
</label>
<label>{{localize 'HBM.spell.discipline'}}:
<input type="text" name="system.discipline" value="{{system.discipline}}" />
</label>
</div>
<div class="row">
<label>{{localize 'HBM.spell.castingMode.label'}}:
<select name="system.castingMode">
<option value="standard" {{#if (eq system.castingMode 'standard')}}selected{{/if}}>{{localize 'HBM.spell.castingMode.standard'}}</option>
<option value="sacred" {{#if (eq system.castingMode 'sacred')}}selected{{/if}}>{{localize 'HBM.spell.castingMode.sacred'}}</option>
<option value="witch" {{#if (eq system.castingMode 'witch')}}selected{{/if}}>{{localize 'HBM.spell.castingMode.witch'}}</option>
<option value="blood" {{#if (eq system.castingMode 'blood')}}selected{{/if}}>{{localize 'HBM.spell.castingMode.blood'}}</option>
</select>
</label>
{{#if (eq system.castingMode 'sacred')}}
<label>{{localize 'HBM.spell.deity'}}:
<select name="system.deity">
<option value="">—</option>
{{#each @root.choices.deities as |label key|}}
<option value="{{key}}" {{#if (eq ../system.deity key)}}selected{{/if}}>{{label}}</option>
{{/each}}
</select>
</label>
{{/if}}
<label>{{localize 'HBM.spell.sourceBook'}}:
<select name="system.sourceBook">
<option value="">—</option>
{{#each @root.choices.sourceBooks as |label key|}}
<option value="{{key}}" {{#if (eq ../system.sourceBook key)}}selected{{/if}}>{{label}}</option>
{{/each}}
</select>
</label>
</div>
<div class="row flags">
<label><input type="checkbox" name="system.isSuperspell" {{#if system.isSuperspell}}checked{{/if}}/> {{localize 'HBM.spell.isSuperspell'}}</label>
<label><input type="checkbox" name="system.requiresGroupCast"{{#if system.requiresGroupCast}}checked{{/if}}/> {{localize 'HBM.spell.requiresGroupCast'}}</label>
<label><input type="checkbox" name="system.nonCombatOnly" {{#if system.nonCombatOnly}}checked{{/if}}/> {{localize 'HBM.spell.nonCombatOnly'}}</label>
{{#if system.requiresGroupCast}}
<label>{{localize 'HBM.spell.minCasters'}}:
<input type="number" name="system.minCasters" value="{{system.minCasters}}" min="1" max="10" />
</label>
{{/if}}
</div>
</fieldset>
{{!-- ── Cost & Difficulty ───────────────────────────────────────── --}}
<fieldset>
<legend>{{localize 'HBM.spell.cost'}}</legend>
<div class="row">
<label>{{localize 'HBM.spell.difficultyThreshold'}}:
<input type="number" name="system.difficulty.threshold" value="{{system.difficulty.threshold}}" min="2" max="6" />
</label>
<label>{{localize 'HBM.spell.difficultySuccesses'}}:
<input type="number" name="system.difficulty.successes" value="{{system.difficulty.successes}}" min="1" max="10" />
</label>
<label>{{localize 'HBM.spell.manaCost'}}:
<input type="number" name="system.manaCost" value="{{system.manaCost}}" min="0" />
</label>
{{#if (eq system.castingMode 'blood')}}
<label>{{localize 'HBM.spell.bloodCost'}}:
<input type="number" name="system.bloodCost" value="{{system.bloodCost}}" min="0" />
</label>
{{/if}}
</div>
</fieldset>
{{!-- ── Timing & Geometry ──────────────────────────────────────── --}}
<fieldset>
<legend>{{localize 'HBM.spell.timing'}}</legend>
<div class="row">
<label>{{localize 'HBM.spell.castingTime'}}:
<input type="text" name="system.castingTime" value="{{system.castingTime}}" />
</label>
<label>{{localize 'HBM.spell.castingTimeRounds'}}:
<input type="number" name="system.castingTimeRounds" value="{{system.castingTimeRounds}}" min="0" />
</label>
<label>{{localize 'HBM.spell.castingTimeMinutes'}}:
<input type="number" name="system.castingTimeMinutes" value="{{system.castingTimeMinutes}}" min="0" />
</label>
</div>
<div class="row">
<label>{{localize 'HBM.spell.range'}}:
<input type="text" name="system.range" value="{{system.range}}" />
</label>
<label>{{localize 'HBM.spell.targets'}}:
<input type="text" name="system.targets" value="{{system.targets}}" />
</label>
<label>{{localize 'HBM.spell.duration'}}:
<input type="text" name="system.duration" value="{{system.duration}}" />
</label>
</div>
<div class="row">
<label>{{localize 'HBM.spell.aoeShape'}}:
<select name="system.areaOfEffect.shape">
{{#each @root.choices.aoeShapes as |label key|}}
<option value="{{key}}" {{#if (eq ../system.areaOfEffect.shape key)}}selected{{/if}}>{{label}}</option>
{{/each}}
</select>
</label>
<label>X: <input type="number" name="system.areaOfEffect.x" value="{{system.areaOfEffect.x}}" min="0" /></label>
<label>Y: <input type="number" name="system.areaOfEffect.y" value="{{system.areaOfEffect.y}}" min="0" /></label>
<label>{{localize 'HBM.spell.aoeUnit'}}:
<input type="text" name="system.areaOfEffect.unit" value="{{system.areaOfEffect.unit}}" />
</label>
</div>
</fieldset>
{{!-- ── Components ─────────────────────────────────────────────── --}}
<fieldset>
<legend>{{localize 'HBM.spell.components'}}</legend>
<div class="row">
<label><input type="checkbox" name="system.components.verbal" {{#if system.components.verbal}}checked{{/if}}/> {{localize 'HBM.spell.verbal'}}</label>
<label><input type="checkbox" name="system.components.somatic" {{#if system.components.somatic}}checked{{/if}}/> {{localize 'HBM.spell.somatic'}}</label>
<label>{{localize 'HBM.spell.material'}}:
<input type="text" name="system.components.material" value="{{system.components.material}}" />
</label>
</div>
{{#if (or (eq system.castingMode 'witch') (eq system.castingMode 'sacred'))}}
<div class="array-list">
<strong>{{localize 'HBM.spell.symbols'}}</strong>
{{#each system.components.symbols as |sym i|}}
<div class="array-row">
<input type="text" name="system.components.symbols.{{i}}" value="{{sym}}" />
<button type="button" data-action="removeArrayEntry" data-path="system.components.symbols" data-index="{{i}}">✕</button>
</div>
{{/each}}
<button type="button" data-action="addArrayEntry" data-path="system.components.symbols" data-template="&quot;&quot;">+ {{localize 'HBM.ui.add'}}</button>
</div>
{{/if}}
</fieldset>
{{!-- ── Damage & Status ────────────────────────────────────────── --}}
<fieldset>
<legend>{{localize 'HBM.spell.damage'}}</legend>
<div class="row">
<label>{{localize 'HBM.spell.damageBase'}}:
<input type="text" name="system.damageBase" value="{{system.damageBase}}" placeholder="np. 1d6+magicalAbilities" />
</label>
<label>{{localize 'HBM.spell.damageType'}}:
<select name="system.damageType">
{{#each @root.choices.damageTypes as |label key|}}
<option value="{{key}}" {{#if (eq ../system.damageType key)}}selected{{/if}}>{{label}}</option>
{{/each}}
</select>
</label>
<label><input type="checkbox" name="system.ignoresArmor" {{#if system.ignoresArmor}}checked{{/if}}/> {{localize 'HBM.spell.ignoresArmor'}}</label>
</div>
<div class="row">
<label>{{localize 'HBM.spell.saveAttribute'}}:
<input type="text" name="system.saveAttribute" value="{{system.saveAttribute}}" />
</label>
<label>{{localize 'HBM.spell.saveSkill'}}:
<input type="text" name="system.saveSkill" value="{{system.saveSkill}}" />
</label>
</div>
<div class="array-list">
<strong>{{localize 'HBM.spell.statusEffects'}}</strong>
{{#each system.statusEffects as |eff i|}}
<div class="array-row">
<input type="text" name="system.statusEffects.{{i}}" value="{{eff}}" />
<button type="button" data-action="removeArrayEntry" data-path="system.statusEffects" data-index="{{i}}">✕</button>
</div>
{{/each}}
<button type="button" data-action="addArrayEntry" data-path="system.statusEffects" data-template="&quot;&quot;">+ {{localize 'HBM.ui.add'}}</button>
</div>
</fieldset>
{{!-- ── Requirements ───────────────────────────────────────────── --}}
<fieldset>
<legend>{{localize 'HBM.spell.requirements'}}</legend>
<div class="array-list">
<strong>{{localize 'HBM.spell.requirementRace'}}</strong>
{{#each system.requirements.race as |x i|}}
<div class="array-row">
<input type="text" name="system.requirements.race.{{i}}" value="{{x}}" />
<button type="button" data-action="removeArrayEntry" data-path="system.requirements.race" data-index="{{i}}">✕</button>
</div>
{{/each}}
<button type="button" data-action="addArrayEntry" data-path="system.requirements.race" data-template="&quot;&quot;">+</button>
</div>
<div class="array-list">
<strong>{{localize 'HBM.spell.requirementTalent'}}</strong>
{{#each system.requirements.talent as |x i|}}
<div class="array-row">
<input type="text" name="system.requirements.talent.{{i}}" value="{{x}}" />
<button type="button" data-action="removeArrayEntry" data-path="system.requirements.talent" data-index="{{i}}">✕</button>
</div>
{{/each}}
<button type="button" data-action="addArrayEntry" data-path="system.requirements.talent" data-template="&quot;&quot;">+</button>
</div>
<div class="array-list">
<strong>{{localize 'HBM.spell.requirementDiscipline'}}</strong>
{{#each system.requirements.discipline as |x i|}}
<div class="array-row">
<input type="text" name="system.requirements.discipline.{{i}}" value="{{x}}" />
<button type="button" data-action="removeArrayEntry" data-path="system.requirements.discipline" data-index="{{i}}">✕</button>
</div>
{{/each}}
<button type="button" data-action="addArrayEntry" data-path="system.requirements.discipline" data-template="&quot;&quot;">+</button>
</div>
</fieldset>
{{!-- ── Overcast & Triggers ────────────────────────────────────── --}}
<fieldset>
<legend>{{localize 'HBM.spell.overcastOptions'}}</legend>
{{#each system.overcastOptions as |opt i|}}
<div class="array-row overcast-row">
<input type="text" name="system.overcastOptions.{{i}}.description" value="{{opt.description}}" placeholder="{{localize 'HBM.spell.overcastDesc'}}" />
<input type="number" name="system.overcastOptions.{{i}}.manaPerStep" value="{{opt.manaPerStep}}" min="0" />
<button type="button" data-action="removeArrayEntry" data-path="system.overcastOptions" data-index="{{i}}">✕</button>
</div>
{{/each}}
<button type="button" data-action="addArrayEntry" data-path="system.overcastOptions"
data-template='{"description":"","manaPerStep":1}'>+ {{localize 'HBM.ui.add'}}</button>
</fieldset>
<fieldset>
<legend>{{localize 'HBM.spell.triggers'}}</legend>
{{#each system.triggers as |t i|}}
<div class="array-row trigger-row">
<select name="system.triggers.{{i}}.event">
{{#each @root.choices.triggerEvents as |label key|}}
<option value="{{key}}" {{#if (eq ../t.event key)}}selected{{/if}}>{{label}}</option>
{{/each}}
</select>
<input type="text" name="system.triggers.{{i}}.effect" value="{{t.effect}}" placeholder="{{localize 'HBM.spell.triggerEffect'}}" />
<button type="button" data-action="removeArrayEntry" data-path="system.triggers" data-index="{{i}}">✕</button>
</div>
{{/each}}
<button type="button" data-action="addArrayEntry" data-path="system.triggers"
data-template='{"event":"killWithWeapon","effect":""}'>+ {{localize 'HBM.ui.add'}}</button>
</fieldset>
{{!-- ── Description ─────────────────────────────────────────────── --}}
<label>{{localize 'HBM.spell.description'}}<textarea name="system.description" rows="6">{{system.description}}</textarea></label>
<label>{{localize 'HBM.spell.higherCircles'}}<textarea name="system.higherCircles" rows="3">{{system.higherCircles}}</textarea></label>
</div>
+36
View File
@@ -0,0 +1,36 @@
<div class="hbm item-body talent">
{{!-- Top row: flags + cost + DR bonus --}}
<div class="row">
<label class="checkbox-label">
<input type="checkbox" name="system.multiSelect" {{#if system.multiSelect}}checked{{/if}}/>
{{localize 'HBM.talent.multiSelect'}}
</label>
<label>{{localize 'HBM.talent.cost'}}: <input type="text" name="system.cost" value="{{system.cost}}"/></label>
<label title="{{localize 'HBM.gear.damageReductionBonusHint'}}">
{{localize 'HBM.gear.damageReductionBonus'}}:
<input type="number" name="system.damageReductionBonus" value="{{system.damageReductionBonus}}" min="0" style="width:4rem;"/>
</label>
</div>
{{!-- Requirements fieldset --}}
<fieldset>
<legend>{{localize 'HBM.talent.requirements'}}</legend>
<div class="row">
<label>{{localize 'HBM.talent.requirementRace'}}: <input type="text" name="system.requirements.race" value="{{system.requirements.race}}"/></label>
<label>{{localize 'HBM.talent.requirementAttribute'}}: <input type="text" name="system.requirements.attribute" value="{{system.requirements.attribute}}"/></label>
<label>{{localize 'HBM.talent.requirementSkill'}}: <input type="text" name="system.requirements.skill" value="{{system.requirements.skill}}"/></label>
</div>
<div class="row">
<label>{{localize 'HBM.talent.requirementTalent'}}: <input type="text" name="system.requirements.talent" value="{{system.requirements.talent}}"/></label>
<label>{{localize 'HBM.talent.requirementTitle'}}: <input type="text" name="system.requirements.title" value="{{system.requirements.title}}"/></label>
<label>{{localize 'HBM.talent.requirementDiscipline'}}: <input type="text" name="system.requirements.discipline" value="{{system.requirements.discipline}}"/></label>
</div>
</fieldset>
{{!-- Description & effect textareas --}}
<label>{{localize 'HBM.talent.description'}}<textarea name="system.description" rows="5">{{system.description}}</textarea></label>
<label>{{localize 'HBM.talent.effect'}}<textarea name="system.effect" rows="3">{{system.effect}}</textarea></label>
{{> 'systems/hbm-rpg-v3/templates/item/_effects.hbs'}}
</div>