Corrections sur factions, aspects, degats et fiches PNJs

This commit is contained in:
2026-04-11 15:02:46 +02:00
parent 36516c3b08
commit 3358dea306
44 changed files with 2308 additions and 148 deletions

View File

@@ -35,11 +35,8 @@
<div class="armure-stat-box">
<label>{{localize "CELESTOPOL.Armure.malus"}}</label>
<div class="armure-stat-value">
{{#if isEditable}}
<input type="number" name="system.malus" value="{{system.malus}}" min="0" max="2">
{{else}}
<span>{{system.malus}}</span>
{{/if}}
<input type="hidden" name="system.malus" value="{{system.protection}}">
<span data-armure-malus-value>{{system.protection}}</span>
</div>
<div class="armure-stat-hint">{{localize "CELESTOPOL.Armure.malusHint"}}</div>
</div>

View File

@@ -45,7 +45,7 @@
<img src="{{item.img}}" class="item-icon">
<span class="item-name">{{item.name}}</span>
<span class="item-tag prot"><i class="fas fa-shield"></i> {{item.system.protection}}</span>
{{#if item.system.malus}}<span class="item-tag malus">{{item.system.malus}} {{localize "CELESTOPOL.Armure.malus"}}</span>{{/if}}
{{#if item.system.protection}}<span class="item-tag malus">{{item.system.protection}} {{localize "CELESTOPOL.Armure.malus"}}</span>{{/if}}
<div class="item-controls">
<a data-action="toggleArmure" data-item-uuid="{{item.uuid}}"
class="equip-toggle {{#if item.system.equipped}}equipped{{/if}}"

View File

@@ -1,55 +1,124 @@
<div class="tab factions {{tab.cssClass}}" data-group="sheet" data-tab="factions">
<table class="factions-table">
<thead>
<tr>
<th>{{localize "CELESTOPOL.Faction.label"}}</th>
<th>{{localize "CELESTOPOL.Faction.relation"}}</th>
</tr>
</thead>
<tbody>
{{!-- Factions standard --}}
{{#each factionRows as |faction|}}
<tr class="faction-row" data-faction="{{faction.id}}">
<td class="faction-name">{{localize faction.label}}</td>
<td class="faction-value">
<div class="faction-checkboxes-container">
<div class="faction-checkboxes">
{{#each faction.dots as |dot|}}
<span class="faction-dot {{dot.type}} {{#if dot.filled}}filled{{/if}}"
{{#if @root.isEditable}}data-action="factionLevel" data-faction="{{../id}}" data-index="{{dot.index}}"{{/if}}></span>
{{/each}}
</div>
<span class="faction-count">{{faction.valueStr}}</span>
</div>
</td>
</tr>
{{/each}}
<div class="factions-layout">
<section class="faction-aspect-summary">
<div class="faction-aspect-summary-header">
<div class="faction-aspect-summary-title">{{localize "CELESTOPOL.FactionAspect.title"}}</div>
{{#if isGM}}
<a class="faction-aspect-manage" data-action="manageFactionAspects">
<i class="fa-solid fa-sliders"></i> {{localize "CELESTOPOL.FactionAspect.manage"}}
</a>
{{/if}}
</div>
{{!-- Factions personnalisées --}}
{{#each factionCustom as |faction|}}
<tr class="faction-row custom" data-faction="{{faction.id}}">
<td>
{{#if @root.isEditMode}}
<input type="text" name="system.factions.{{faction.id}}.label"
value="{{faction.label}}"
placeholder="{{localize 'CELESTOPOL.Faction.custom'}}">
{{else}}
<span>{{#if faction.label}}{{faction.label}}{{else}}{{/if}}</span>
{{/if}}
</td>
<td>
<div class="faction-checkboxes-container">
<div class="faction-checkboxes">
{{#each faction.dots as |dot|}}
<span class="faction-dot {{dot.type}} {{#if dot.filled}}filled{{/if}}"
{{#if @root.isEditable}}data-action="factionLevel" data-faction="{{../id}}" data-index="{{dot.index}}"{{/if}}></span>
{{/each}}
</div>
<span class="faction-count">{{faction.valueStr}}</span>
{{#if factionAspectSummary}}
<div class="faction-aspect-points">
<div class="faction-aspect-point">
<span class="label">{{localize "CELESTOPOL.FactionAspect.pointsMax"}}</span>
<span class="value">{{factionAspectSummary.pointsMax}}</span>
</div>
<div class="faction-aspect-point">
<span class="label">{{localize "CELESTOPOL.FactionAspect.pointsSpent"}}</span>
<span class="value">{{factionAspectSummary.pointsSpent}}</span>
</div>
<div class="faction-aspect-point">
<span class="label">{{localize "CELESTOPOL.FactionAspect.pointsRemaining"}}</span>
<span class="value">{{factionAspectSummary.pointsRemaining}}</span>
</div>
</div>
{{#if factionAspectSummary.sourceLabels.length}}
<div class="faction-aspect-source-line">
<strong>{{localize "CELESTOPOL.FactionAspect.sources"}} :</strong>
{{#each factionAspectSummary.sourceLabels as |label|}}
<span class="faction-aspect-source">{{label}}</span>
{{/each}}
</div>
{{else}}
<div class="faction-aspect-empty">{{localize "CELESTOPOL.FactionAspect.officialSourcesEmpty"}}</div>
{{/if}}
<div class="faction-aspect-active-block">
<div class="faction-aspect-active-title">{{localize "CELESTOPOL.FactionAspect.activeTitle"}}</div>
{{#if factionAspectSummary.activatedAspects.length}}
<div class="faction-aspect-active-list">
{{#each factionAspectSummary.activatedAspects as |aspect|}}
<div class="faction-aspect-chip {{#if aspect.relevantToActor}}is-relevant{{/if}}">
<span class="name">{{aspect.label}}</span>
<span class="value">+{{aspect.value}}</span>
</div>
</td>
</tr>
{{/each}}
</tbody>
</table>
{{/each}}
</div>
{{else}}
<div class="faction-aspect-empty">{{localize "CELESTOPOL.FactionAspect.noneActive"}}</div>
{{/if}}
</div>
{{/if}}
</section>
<table class="factions-table">
<thead>
<tr>
<th>{{localize "CELESTOPOL.Faction.label"}}</th>
<th>{{localize "CELESTOPOL.Faction.relation"}}</th>
</tr>
</thead>
<tbody>
{{!-- Factions standard --}}
{{#each factionRows as |faction|}}
<tr class="faction-row" data-faction="{{faction.id}}">
<td class="faction-name">{{localize faction.label}}</td>
<td class="faction-value">
<div class="faction-checkboxes-container">
<div class="faction-checkboxes">
{{#each faction.dots as |dot|}}
<span class="faction-dot {{dot.type}} {{#if dot.filled}}filled{{/if}}"
{{#if @root.isEditable}}data-action="factionLevel" data-faction="{{../id}}" data-index="{{dot.index}}"{{/if}}></span>
{{/each}}
</div>
<span class="faction-count">{{faction.valueStr}}</span>
</div>
</td>
</tr>
{{/each}}
{{!-- Factions personnalisées --}}
{{#each factionCustom as |faction|}}
<tr class="faction-row custom" data-faction="{{faction.id}}">
<td>
{{#if @root.isEditMode}}
<input type="text" name="system.factions.{{faction.id}}.label"
value="{{faction.label}}"
placeholder="{{localize 'CELESTOPOL.Faction.custom'}}">
{{else}}
<span>{{#if faction.label}}{{faction.label}}{{else}}{{/if}}</span>
{{/if}}
</td>
<td>
<div class="faction-checkboxes-container">
<div class="faction-checkboxes">
{{#each faction.dots as |dot|}}
<span class="faction-dot {{dot.type}} {{#if dot.filled}}filled{{/if}}"
{{#if @root.isEditable}}data-action="factionLevel" data-faction="{{../id}}" data-index="{{dot.index}}"{{/if}}></span>
{{/each}}
</div>
<span class="faction-count">{{faction.valueStr}}</span>
</div>
</td>
</tr>
{{/each}}
</tbody>
</table>
<aside class="factions-legend">
<div class="factions-legend-title">{{localize "CELESTOPOL.Faction.legendTitle"}}</div>
<div class="factions-legend-list">
{{#each factionLegend as |entry|}}
<div class="factions-legend-row">
<span class="factions-legend-value">{{entry.value}}</span>
<span class="factions-legend-label">{{entry.label}}</span>
</div>
{{/each}}
</div>
</aside>
</div>
</div>

View File

@@ -45,10 +45,18 @@
</div>
<div class="identity-field">
<label>{{localize "CELESTOPOL.Actor.faction"}}</label>
{{#if isEditMode}}
<input type="text" name="system.faction" value="{{system.faction}}" placeholder="{{localize 'CELESTOPOL.Actor.faction'}}">
{{#if isEditMode}}
<select name="system.faction">
<option value="" {{#unless selectedPrimaryFactionId}}{{#unless legacyPrimaryFactionValue}}selected{{/unless}}{{/unless}}>— {{localize "CELESTOPOL.NPC.factionNone"}} —</option>
{{#if legacyPrimaryFactionValue}}
<option value="{{legacyPrimaryFactionValue}}" selected>{{localize "CELESTOPOL.FactionAspect.legacyFactionValue"}} : {{legacyPrimaryFactionValue}}</option>
{{/if}}
{{#each factions as |faction key|}}
<option value="{{key}}" {{#if (eq key ../selectedPrimaryFactionId)}}selected{{/if}}>{{localize faction.label}}</option>
{{/each}}
</select>
{{else}}
<span>{{system.faction}}</span>
<span>{{primaryFactionLabel}}</span>
{{/if}}
</div>
</div>
@@ -92,6 +100,11 @@
</div>
<div class="header-buttons">
{{#if isGM}}
<a class="manage-faction-aspects-btn" data-action="manageFactionAspects" title="{{localize 'CELESTOPOL.FactionAspect.managerTitle'}}">
<i class="fa-solid fa-people-group"></i>
</a>
{{/if}}
<a class="moon-standalone-btn" data-action="rollMoonDie" title="{{localize 'CELESTOPOL.Moon.standaloneTitle'}}">
🌙
</a>

View File

@@ -55,6 +55,10 @@
<span class="fl-op"></span>
<span class="fl-mod wound" title="{{localize "CELESTOPOL.Roll.woundMalus"}}">{{abs woundMalus}}</span>
{{/if}}
{{#if armorMalus}}
<span class="fl-op"></span>
<span class="fl-mod armor" title="{{localize "CELESTOPOL.Roll.armorMalus"}}">🛡{{abs armorMalus}}</span>
{{/if}}
{{#if modifier}}
<span class="fl-op">{{#if (gt modifier 0)}}+{{else}}{{/if}}</span>
<span class="fl-mod">{{abs modifier}}</span>
@@ -63,6 +67,10 @@
<span class="fl-op">{{#if (gt aspectMod 0)}}+{{else}}{{/if}}</span>
<span class="fl-asp" title="{{localize "CELESTOPOL.Roll.usedAspect"}}">✦{{abs aspectMod}}</span>
{{/if}}
{{#if factionAspectBonus}}
<span class="fl-op">+</span>
<span class="fl-faction" title="{{localize "CELESTOPOL.FactionAspect.rollLabel"}}">⚑{{factionAspectBonus}}</span>
{{/if}}
{{#if situationMod}}
<span class="fl-op">{{#if (gt situationMod 0)}}+{{else}}{{/if}}</span>
<span class="fl-mod sit" title="{{localize "CELESTOPOL.Roll.situationMod"}}">◈{{abs situationMod}}</span>
@@ -103,6 +111,16 @@
<span>💪 {{localize "CELESTOPOL.Roll.usedPuiser"}}</span>
</div>
{{/if}}
{{#if armorMalus}}
<div class="used-info">
<span class="used-armor">🛡 {{localize "CELESTOPOL.Roll.armorMalus"}} ({{abs armorMalus}})</span>
</div>
{{/if}}
{{#if factionAspectBonus}}
<div class="used-info used-faction-aspect">
<span>⚑ {{factionAspectLabel}} (+{{factionAspectBonus}})</span>
</div>
{{/if}}
{{!-- Résultat du Dé de la Lune (narratif) --}}
{{#if hasMoonDie}}
@@ -136,7 +154,7 @@
{{#if isRangedDefense}}
<span class="result-desc">{{localize "CELESTOPOL.Combat.rangedDefenseSuccess"}}</span>
{{else}}
<span class="result-desc">{{localize "CELESTOPOL.Combat.successHit"}}{{#if (gt weaponDegats "0")}} +{{weaponDegats}} {{localize "CELESTOPOL.Combat.weaponDamage"}}{{/if}}</span>
<span class="result-desc">{{localize "CELESTOPOL.Combat.successHit"}}</span>
{{/if}}
{{/if}}
{{else if isFailure}}
@@ -154,6 +172,47 @@
{{/if}}
</div>
{{#if hasDamageSummary}}
<div class="weapon-damage-summary">
<div class="damage-header">{{localize "CELESTOPOL.Combat.damageLabel"}}</div>
<div class="damage-main">
<span class="damage-value">{{incomingWoundsDisplay}}</span>
<span class="damage-unit">{{localize "CELESTOPOL.Combat.damageUnit"}}</span>
</div>
{{#if hasVariableDamage}}
<div class="damage-note">{{localize "CELESTOPOL.Combat.damageManual"}}</div>
{{else}}
{{#if targetActorId}}
<div class="damage-breakdown">
<div><strong>{{localize "CELESTOPOL.Combat.targetLabel"}} :</strong> {{targetActorName}}</div>
<div><strong>{{localize "CELESTOPOL.Combat.damageArmorReduction"}} :</strong> {{selectedTargetProtection}}</div>
<div><strong>{{localize "CELESTOPOL.Combat.damageApplied"}} :</strong> {{selectedTargetAppliedWounds}}</div>
</div>
<div class="weapon-damage-actions">
<button type="button" class="damage-apply-button" data-action="apply-weapon-damage" data-actor-id="{{targetActorId}}" data-incoming-wounds="{{incomingWounds}}">
{{localize "CELESTOPOL.Combat.applyDamage"}}
</button>
</div>
{{else if availableTargets.length}}
<div class="weapon-damage-actions">
<select name="targetActorId">
<option value="">{{localize "CELESTOPOL.Combat.targetAuto"}}</option>
{{#each availableTargets as |target|}}
<option value="{{target.id}}" {{#if target.selected}}selected{{/if}}>{{target.name}}</option>
{{/each}}
</select>
<button type="button" class="damage-apply-button" data-action="apply-weapon-damage" data-incoming-wounds="{{incomingWounds}}">
{{localize "CELESTOPOL.Combat.applyDamage"}}
</button>
</div>
{{else}}
<div class="damage-note">{{localize "CELESTOPOL.Combat.noCharacterTargetAvailable"}}</div>
{{/if}}
{{/if}}
</div>
{{/if}}
{{!-- Blessure auto-cochée (résistance ratée ou combat mêlée raté) --}}
{{#if woundTaken}}
<div class="resistance-wound-notice">

View File

@@ -39,7 +39,7 @@
<img src="{{item.img}}" class="item-icon">
<span class="item-name">{{item.name}}</span>
<span class="item-tag prot"><i class="fas fa-shield"></i> {{item.system.protection}}</span>
{{#if item.system.malus}}<span class="item-tag malus">{{item.system.malus}} {{localize "CELESTOPOL.Armure.malus"}}</span>{{/if}}
{{#if item.system.protection}}<span class="item-tag malus">{{item.system.protection}} {{localize "CELESTOPOL.Armure.malus"}}</span>{{/if}}
<div class="item-controls">
<a data-action="toggleArmure" data-item-uuid="{{item.uuid}}"
title="{{#if item.system.equipped}}{{localize 'CELESTOPOL.Armure.unequip'}}{{else}}{{localize 'CELESTOPOL.Armure.equip'}}{{/if}}"
@@ -55,4 +55,27 @@
{{/each}}
</div>
{{!-- ── Équipements ──────────────────────────────────────────────────── --}}
<div class="equip-section">
<div class="section-header">
<i class="fas fa-briefcase"></i>
<span>{{localize "CELESTOPOL.Item.equipments"}}</span>
{{#if isEditMode}}
<a data-action="createEquipment" title="{{localize 'CELESTOPOL.Item.newEquipment'}}"><i class="fas fa-plus"></i></a>
{{/if}}
</div>
{{#each equipments as |item|}}
<div class="item-row equipment" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true">
<img src="{{item.img}}" class="item-icon">
<span class="item-name">{{item.name}}</span>
<div class="item-controls">
<a data-action="edit" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
{{#if ../isEditMode}}<a data-action="delete" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>{{/if}}
</div>
</div>
{{else}}
<p class="equip-empty">{{localize "CELESTOPOL.Item.noEquipments"}}</p>
{{/each}}
</div>
</div>

View File

@@ -52,7 +52,7 @@
<select id="targetSelect" name="targetSelect">
<option value="">— {{localize "CELESTOPOL.Combat.targetAuto"}} —</option>
{{#each availableTargets as |t|}}
<option value="{{t.corps}}">{{t.name}}</option>
<option value="{{t.id}}" data-corps="{{t.corps}}">{{t.name}}</option>
{{/each}}
</select>
</div>
@@ -85,7 +85,6 @@
</div>
{{!-- Test en opposition : le résultat sera masqué, MJ décide --}}
{{#unless isResistance}}
<div class="form-opposition-row">
<label class="opposition-toggle" for="isOpposition">
<input type="checkbox" id="isOpposition" name="isOpposition">
@@ -96,7 +95,6 @@
</span>
</label>
</div>
{{/unless}}
{{/if}}
@@ -137,6 +135,18 @@
{{/unless}}{{!-- /isResistance aspect --}}
{{#if factionAspectChoices.length}}
<div class="form-row-line form-faction-aspect">
<label for="factionAspectId">{{localize "CELESTOPOL.FactionAspect.rollLabel"}}</label>
<select id="factionAspectId" name="factionAspectId">
<option value="">{{localize "CELESTOPOL.FactionAspect.noneOption"}}</option>
{{#each factionAspectChoices as |choice|}}
<option value="{{choice.id}}" data-value="{{choice.value}}">{{choice.label}} (+{{choice.value}})</option>
{{/each}}
</select>
</div>
{{/if}}
{{!-- Options non disponibles en test de résistance (lune, destin, puiser, fortune) --}}
{{#unless isResistance}}
@@ -225,5 +235,3 @@
</div>
</div>