feat: implement core Foundry VTT system framework, including actor/item data models, spellcasting logic, dice mechanics, and automation scripts

This commit is contained in:
Octoturge
2026-06-14 10:12:47 +02:00
parent fb42c6e8cc
commit 624fe2ee1a
70 changed files with 1645 additions and 1146 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
{{!-- Actor-level Active Effects section included by character and NPC sheets. --}}
{{!-- 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>
File diff suppressed because it is too large Load Diff
+29
View File
@@ -77,6 +77,19 @@
<input type="number" name="system.attributes.magicalArmor.max" value="{{system.attributes.magicalArmor.max}}" min="0" />
</span>
</div>
<div class="resource">
<label>{{localize 'HBM.resources.initiative'}}</label>
<span class="resource-value">
<span class="static-value"
title="{{localize 'HBM.resources.initiative'}}">{{system.attributes.initiative.value}}</span>
</span>
<div style="display:flex; align-items:center; gap:0.3rem; margin-top:0.15rem;">
<small style="white-space:nowrap;">{{localize 'HBM.ui.initiativeBonus'}}:</small>
<input type="number" name="system.attributes.initiative.bonus"
value="{{system.attributes.initiative.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.npc.speed'}}</label>
<input type="text" name="system.attributes.speed" value="{{system.attributes.speed}}"/>
@@ -93,6 +106,22 @@
<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="npc-skills-section">
<fieldset>
<legend>{{localize 'HBM.ui.tabs.skills'}}</legend>
<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>
</fieldset>
</section>
<section class="combat-lists">
<fieldset>
+4 -1
View File
@@ -5,6 +5,9 @@
{{#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 (or (eq mode "sacred") (eq mode "prayer"))}}
<span class="badge warning">{{localize 'HBM.spellCast.cannotBeUnraveled'}}</span>
{{/if}}
{{#if outcome.success}}
<span class="badge result success">✓ {{localize 'HBM.spellCast.success'}}</span>
{{else}}
@@ -72,7 +75,7 @@
<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>
<li><span class="badge trigger-event">{{localize (concat 'HBM.triggerEvent.' t.event)}}</span> - {{t.effect}}</li>
{{/each}}
</ul>
</section>
+1 -1
View File
@@ -10,7 +10,7 @@
{{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}}
- {{#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>
+1 -1
View File
@@ -1,4 +1,4 @@
{{!-- Active Effects partial included by talent and gear sheets. --}}
{{!-- Active Effects partial - included by talent and gear sheets. --}}
{{#if supportsEffects}}
<fieldset class="hbm-effects">
<legend>{{localize 'HBM.activeEffect.title'}}</legend>
+1 -1
View File
@@ -3,7 +3,7 @@
<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>
<label>{{localize 'HBM.race.physicalDescription'}}<textarea name="system.physicalDescription" rows="3">{{system.physicalDescription}}</textarea></label>
<fieldset>
<legend>{{localize 'HBM.race.traits'}}
<button type="button" data-action="addArrayEntry" data-path="system.traits"
+2 -2
View File
@@ -30,7 +30,7 @@
{{#if (eq system.castingMode 'sacred')}}
<label>{{localize 'HBM.spell.deity'}}:
<select name="system.deity">
<option value=""></option>
<option value="">-</option>
{{#each @root.choices.deities as |label key|}}
<option value="{{key}}" {{#if (eq ../system.deity key)}}selected{{/if}}>{{label}}</option>
{{/each}}
@@ -39,7 +39,7 @@
{{/if}}
<label>{{localize 'HBM.spell.sourceBook'}}:
<select name="system.sourceBook">
<option value=""></option>
<option value="">-</option>
{{#each @root.choices.sourceBooks as |label key|}}
<option value="{{key}}" {{#if (eq ../system.sourceBook key)}}selected{{/if}}>{{label}}</option>
{{/each}}