IMplémentation de la ajorité des remarques de Nepherius

This commit is contained in:
2026-04-06 17:48:30 +02:00
parent a3f7b11f82
commit 1022597bf8
51 changed files with 1900 additions and 443 deletions

View File

@@ -10,6 +10,17 @@
<div class="anomaly-body">
<div class="armure-stats">
<div class="armure-stat-box equipped-box">
<label>{{localize "CELESTOPOL.Armure.equipped"}}</label>
<div class="armure-stat-value">
<label class="equipped-switch">
<input type="checkbox" name="system.equipped" {{#if system.equipped}}checked{{/if}} {{#unless isEditable}}disabled{{/unless}}>
<span class="switch-label {{#if system.equipped}}on{{/if}}">
{{#if system.equipped}}{{localize "CELESTOPOL.Armure.equippedYes"}}{{else}}{{localize "CELESTOPOL.Armure.equippedNo"}}{{/if}}
</span>
</label>
</div>
</div>
<div class="armure-stat-box">
<label>{{localize "CELESTOPOL.Armure.protection"}}</label>
<div class="armure-stat-value">

View File

@@ -1,9 +1,15 @@
<div class="tab biography {{tab.cssClass}}" data-group="sheet" data-tab="biography">
{{!-- Description / Biographie --}}
{{!-- Description Physique --}}
<div class="biography-section">
<div class="section-header">{{localize "CELESTOPOL.Actor.description"}}</div>
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
<div class="section-header">{{localize "CELESTOPOL.Actor.descriptionPhysique"}}</div>
{{formInput systemFields.descriptionPhysique enriched=enrichedDescriptionPhysique value=system.descriptionPhysique name="system.descriptionPhysique" toggled=true}}
</div>
{{!-- Description Psychologique --}}
<div class="biography-section">
<div class="section-header">{{localize "CELESTOPOL.Actor.descriptionPsychologique"}}</div>
{{formInput systemFields.descriptionPsychologique enriched=enrichedDescriptionPsychologique value=system.descriptionPsychologique name="system.descriptionPsychologique" toggled=true}}
</div>
{{!-- Notes --}}

View File

@@ -2,7 +2,10 @@
{{!-- Blessures --}}
<section class="track-section">
<div class="track-header">
<span class="track-title">{{localize "CELESTOPOL.Track.blessures"}}</span>
<span class="track-title">
{{localize "CELESTOPOL.Track.blessures"}}
<span class="track-help" title="{{localize 'CELESTOPOL.Track.blessuresTooltip'}}">?</span>
</span>
<span class="wound-malus">{{localize "CELESTOPOL.Track.currentMalus"}} :
<strong>{{lookup @root.woundLevels system.blessures.lvl 'malus'}}</strong>
</span>
@@ -24,8 +27,9 @@
{{!-- Destin --}}
<section class="track-section">
<div class="track-header">
<span class="track-title track-title-destin"
title="{{localize 'CELESTOPOL.Track.destinTooltip'}}">{{localize "CELESTOPOL.Track.destin"}}</span>
<span class="track-title">{{localize "CELESTOPOL.Track.destin"}}
<span class="track-help" title="{{localize 'CELESTOPOL.Track.destinTooltip'}}">?</span>
</span>
</div>
<div class="track-boxes destin-boxes">
{{#each (range 8) as |lvl|}}
@@ -42,7 +46,10 @@
{{!-- Spleen --}}
<section class="track-section">
<div class="track-header">
<span class="track-title">{{localize "CELESTOPOL.Track.spleen"}}</span>
<span class="track-title">
{{localize "CELESTOPOL.Track.spleen"}}
<span class="track-help" title="{{localize 'CELESTOPOL.Track.spleenTooltip'}}">?</span>
</span>
</div>
<div class="track-boxes spleen-boxes">
{{#each (range 8) as |lvl|}}

View File

@@ -5,10 +5,11 @@
<div class="stat-block">
<div class="stat-header">
<span class="stat-name">{{localize stat.label}}</span>
<div class="stat-res {{#unless ../isEditMode}}rollable{{/unless}}" data-stat-id="{{statId}}"
<div class="stat-res-btn {{#unless ../isEditMode}}rollable{{/unless}}" data-stat-id="{{statId}}"
title="{{localize 'CELESTOPOL.Roll.resistanceClickToRoll'}}">
<label>{{localize "CELESTOPOL.Stat.res"}}</label>
<span class="stat-res-value">{{lookup (lookup ../system.stats statId) 'res'}}</span>
<i class="fas fa-dice-d8 res-die-icon"></i>
<span class="res-label">{{localize "CELESTOPOL.Stat.res"}}</span>
<span class="res-value">{{lookup (lookup ../system.stats statId) 'res'}}</span>
</div>
</div>
<div class="skills-list">
@@ -19,8 +20,9 @@
<div class="skill-checkboxes-container">
<div class="skill-checkboxes">
{{#each (range 8) as |lvl|}}
<span class="skill-level-dot {{#if (lte lvl (lookup @root.system.stats statId skillId 'value'))}}filled{{/if}}"
data-action="skillLevel" data-stat-id="{{statId}}" data-skill-id="{{skillId}}" data-index="{{lvl}}"></span>
<span class="skill-level-dot {{#if (lte lvl (lookup @root.system.stats statId skillId 'value'))}}filled{{/if}} {{#if (isResThreshold skillId lvl)}}res-threshold{{/if}}"
data-action="skillLevel" data-stat-id="{{statId}}" data-skill-id="{{skillId}}" data-index="{{lvl}}"
title="{{#if (isResThreshold skillId lvl)}}{{localize 'CELESTOPOL.Roll.resThresholdHint'}}{{/if}}"></span>
{{/each}}
</div>
</div>
@@ -33,7 +35,8 @@
<div class="skill-checkboxes-container">
<div class="skill-checkboxes">
{{#each (range 8) as |lvl|}}
<span class="skill-level-dot {{#if (lte lvl (lookup @root.system.stats statId skillId 'value'))}}filled{{/if}}"></span>
<span class="skill-level-dot {{#if (lte lvl (lookup @root.system.stats statId skillId 'value'))}}filled{{/if}} {{#if (isResThreshold skillId lvl)}}res-threshold{{/if}}"
title="{{#if (isResThreshold skillId lvl)}}{{localize 'CELESTOPOL.Roll.resThresholdHint'}}{{/if}}"></span>
{{/each}}
</div>
</div>

View File

@@ -41,12 +41,17 @@
{{/if}}
</div>
{{#each armures as |item|}}
<div class="item-row armure" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true">
<div class="item-row armure {{#if item.system.equipped}}is-equipped{{/if}}" 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>
<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}}
<div class="item-controls">
<a data-action="toggleArmure" data-item-uuid="{{item.uuid}}"
class="equip-toggle {{#if item.system.equipped}}equipped{{/if}}"
title="{{#if item.system.equipped}}{{localize 'CELESTOPOL.Armure.unequip'}}{{else}}{{localize 'CELESTOPOL.Armure.equip'}}{{/if}}">
<i class="fas fa-shield{{#unless item.system.equipped}}-halved{{/unless}}"></i>
</a>
<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>

View File

@@ -3,72 +3,53 @@
<thead>
<tr>
<th>{{localize "CELESTOPOL.Faction.label"}}</th>
<th>{{localize "CELESTOPOL.Faction.score"}}</th>
<th>{{localize "CELESTOPOL.Faction.relation"}}</th>
</tr>
</thead>
<tbody>
{{#each factions as |faction factionId|}}
<tr class="faction-row" data-faction="{{factionId}}">
{{!-- 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 (range 9) as |level|}}
<span class="faction-dot {{#if (lte level (lookup @root.system.factions factionId 'value'))}}filled{{/if}}"
{{#if @root.isEditable}}data-action="factionLevel" data-faction="{{factionId}}" data-index="{{level}}"{{/if}}></span>
{{#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">{{lookup @root.system.factions factionId 'value'}}</span>
<span class="faction-count">{{faction.valueStr}}</span>
</div>
</td>
</tr>
{{/each}}
{{!-- Factions personnalisées --}}
<tr class="faction-row custom" data-faction="perso1">
{{#each factionCustom as |faction|}}
<tr class="faction-row custom" data-faction="{{faction.id}}">
<td>
{{#if isEditMode}}
<input type="text" name="system.factions.perso1.label"
value="{{system.factions.perso1.label}}"
{{#if @root.isEditMode}}
<input type="text" name="system.factions.{{faction.id}}.label"
value="{{faction.label}}"
placeholder="{{localize 'CELESTOPOL.Faction.custom'}}">
{{else}}
<span>{{#if system.factions.perso1.label}}{{system.factions.perso1.label}}{{else}}{{/if}}</span>
<span>{{#if faction.label}}{{faction.label}}{{else}}{{/if}}</span>
{{/if}}
</td>
<td>
<div class="faction-checkboxes-container">
<div class="faction-checkboxes">
{{#each (range 9) as |level|}}
<span class="faction-dot {{#if (lte level ../system.factions.perso1.value)}}filled{{/if}}"
{{#if ../isEditable}}data-action="factionLevel" data-faction="perso1" data-index="{{level}}"{{/if}}></span>
{{#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">{{system.factions.perso1.value}}</span>
</div>
</td>
</tr>
<tr class="faction-row custom" data-faction="perso2">
<td>
{{#if isEditMode}}
<input type="text" name="system.factions.perso2.label"
value="{{system.factions.perso2.label}}"
placeholder="{{localize 'CELESTOPOL.Faction.custom'}}">
{{else}}
<span>{{#if system.factions.perso2.label}}{{system.factions.perso2.label}}{{else}}{{/if}}</span>
{{/if}}
</td>
<td>
<div class="faction-checkboxes-container">
<div class="faction-checkboxes">
{{#each (range 9) as |level|}}
<span class="faction-dot {{#if (lte level ../system.factions.perso2.value)}}filled{{/if}}"
{{#if ../isEditable}}data-action="factionLevel" data-faction="perso2" data-index="{{level}}"{{/if}}></span>
{{/each}}
</div>
<span class="faction-count">{{system.factions.perso2.value}}</span>
<span class="faction-count">{{faction.valueStr}}</span>
</div>
</td>
</tr>
{{/each}}
</tbody>
</table>
</div>

View File

@@ -82,10 +82,19 @@
</div>
{{/if}}
{{/with}}
{{#if system.armorMalus}}
<div class="header-stat armor-malus-badge">
<label>{{localize "CELESTOPOL.Armure.malusLabel"}}</label>
<span class="armor-malus-value">{{system.armorMalus}}</span>
</div>
{{/if}}
</div>
</div>
<div class="header-buttons">
<a class="moon-standalone-btn" data-action="rollMoonDie" title="{{localize 'CELESTOPOL.Moon.standaloneTitle'}}">
🌙
</a>
<a class="toggle-sheet" data-action="toggleSheet" title="{{#if isEditMode}}{{localize 'CELESTOPOL.Sheet.playMode'}}{{else}}{{localize 'CELESTOPOL.Sheet.editMode'}}{{/if}}">
<i class="fas {{#if isEditMode}}fa-eye{{else}}fa-edit{{/if}}"></i>
</a>

View File

@@ -0,0 +1,27 @@
<div class="celestopol chat-initiative">
{{!-- En-tête : acteur --}}
<div class="roll-header">
{{#if actorImg}}
<img src="{{actorImg}}" class="actor-img" alt="{{actorName}}">
{{/if}}
<div class="roll-info">
<span class="actor-name">{{actorName}}</span>
<span class="skill-info">
<span class="skill-lbl">⚡ {{localize "CELESTOPOL.Combat.initiative"}}</span>
</span>
</div>
</div>
{{!-- Bandeau initiative --}}
<div class="initiative-banner">
<div class="initiative-score-wrap">
<span class="initiative-icon">⚡</span>
<span class="initiative-score">{{value}}</span>
</div>
{{#if detail}}
<span class="initiative-detail">{{detail}}</span>
{{/if}}
</div>
</div>

View File

@@ -71,7 +71,8 @@
<span class="fl-total">{{total}}</span>
</div>
{{!-- Seuil et marge --}}
{{!-- Seuil et marge (masqué en opposition) --}}
{{#unless isOpposition}}
<div class="threshold-line">
<span class="vs-wrap">
<span class="vs-label">vs</span>
@@ -84,6 +85,7 @@
</span>
{{/if}}
</div>
{{/unless}}
{{!-- Infos bonus (Destin, Fortune, Aspect) --}}
{{#if useDestin}}
@@ -119,22 +121,14 @@
{{#if autoSuccess}}
<span class="result-icon">★</span>
<span class="result-label">{{localize "CELESTOPOL.Roll.autoSuccess"}}</span>
{{else if isOpposition}}
<span class="result-icon">⚔</span>
<span class="result-label">{{localize "CELESTOPOL.Roll.opposition"}}</span>
<span class="result-desc">{{localize "CELESTOPOL.Roll.oppositionResolved"}}</span>
{{else if isTie}}
<span class="result-icon">⚖</span>
<span class="result-label">{{localize "CELESTOPOL.Combat.tie"}}</span>
<span class="result-desc">{{localize "CELESTOPOL.Combat.tieDesc"}}</span>
{{else if isCriticalSuccess}}
<span class="result-icon">✦✦</span>
<span class="result-label">{{localize "CELESTOPOL.Roll.criticalSuccess"}}</span>
{{#if isCombat}}
{{#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>
{{/if}}
{{else}}
<span class="result-desc">{{localize "CELESTOPOL.Roll.criticalSuccessDesc"}}</span>
{{/if}}
{{else if isSuccess}}
<span class="result-icon">✦</span>
<span class="result-label">{{localize "CELESTOPOL.Roll.success"}}</span>
@@ -145,20 +139,6 @@
<span class="result-desc">{{localize "CELESTOPOL.Combat.successHit"}}{{#if (gt weaponDegats "0")}} +{{weaponDegats}} {{localize "CELESTOPOL.Combat.weaponDamage"}}{{/if}}</span>
{{/if}}
{{/if}}
{{else if isCriticalFailure}}
<span class="result-icon">✖✖</span>
<span class="result-label">{{localize "CELESTOPOL.Roll.criticalFailure"}}</span>
{{#if isCombat}}
{{#if (eq weaponType "melee")}}
<span class="result-desc">{{localize "CELESTOPOL.Combat.failureHit"}}</span>
{{else if isRangedDefense}}
<span class="result-desc">{{localize "CELESTOPOL.Combat.rangedDefenseFailure"}}</span>
{{else}}
<span class="result-desc">{{localize "CELESTOPOL.Combat.distanceNoWound"}}</span>
{{/if}}
{{else}}
<span class="result-desc">{{localize "CELESTOPOL.Roll.criticalFailureDesc"}}</span>
{{/if}}
{{else if isFailure}}
<span class="result-icon">✖</span>
<span class="result-label">{{localize "CELESTOPOL.Roll.failure"}}</span>

View File

@@ -0,0 +1,39 @@
<div class="celestopol-roll moon-standalone-card">
{{!-- En-tête --}}
<div class="moon-standalone-header">
<span class="moon-standalone-title">{{localize "CELESTOPOL.Moon.standaloneTitle"}}</span>
{{#if actorName}}
<span class="moon-standalone-actor">— {{actorName}}</span>
{{/if}}
</div>
{{!-- Résultat principal : phase + valeur --}}
<div class="moon-standalone-main {{moonResultClass}}">
<span class="moon-standalone-symbol">{{moonFaceSymbol}}</span>
<div class="moon-standalone-info">
<span class="moon-standalone-phase">{{moonFaceLabel}}</span>
<span class="moon-standalone-value">{{localize "CELESTOPOL.Moon.quantiteHint"}} : {{result}}</span>
</div>
</div>
{{!-- Interprétation Chance --}}
<div class="moon-interpret-row">
<span class="moon-interpret-label">{{localize "CELESTOPOL.Moon.chanceInterpret"}}</span>
{{#if isGoodFortune}}
<span class="moon-fortune bonne-fortune">{{localize "CELESTOPOL.Moon.bonneFortune"}}</span>
{{else}}
<span class="moon-fortune mauvaise-fortune">{{localize "CELESTOPOL.Moon.mauvaiseFortune"}}</span>
{{/if}}
</div>
{{!-- Interprétation Narrative --}}
<div class="moon-die-result {{moonResultClass}}">
<div class="moon-die-info">
<span class="moon-interpret-label">{{localize "CELESTOPOL.Moon.narrativeInterpret"}}</span>
<span class="moon-die-type">{{moonResultLabel}}</span>
<span class="moon-die-desc">{{moonResultDesc}}</span>
</div>
</div>
</div>

View File

@@ -0,0 +1,48 @@
<div class="tab biographie {{tab.cssClass}}" data-group="sheet" data-tab="biographie">
{{!-- Faction --}}
<div class="bio-section faction-section">
<div class="section-header">
<i class="fas fa-flag"></i>
<span>{{localize "CELESTOPOL.NPC.faction"}}</span>
</div>
{{#if isEditMode}}
<div class="form-row-line faction-select-row">
<label for="system.faction">{{localize "CELESTOPOL.NPC.factionLabel"}}</label>
<select name="system.faction" id="faction-select">
<option value="" {{#unless system.faction}}selected{{/unless}}>— {{localize "CELESTOPOL.NPC.factionNone"}} —</option>
{{#each factions as |faction key|}}
<option value="{{key}}" {{#if (eq key ../system.faction)}}selected{{/if}}>{{localize faction.label}}</option>
{{/each}}
</select>
</div>
{{else}}
<div class="faction-display">
{{#if system.faction}}
<span class="faction-name">{{localize (lookup (lookup factions system.faction) 'label')}}</span>
{{else}}
<span class="faction-none">{{localize "CELESTOPOL.NPC.factionNone"}}</span>
{{/if}}
</div>
{{/if}}
</div>
{{!-- Histoire --}}
<div class="bio-section">
<div class="section-header">
<i class="fas fa-scroll"></i>
<span>{{localize "CELESTOPOL.NPC.histoire"}}</span>
</div>
{{formInput systemFields.histoire enriched=enrichedHistoire value=system.histoire name="system.histoire" toggled=true}}
</div>
{{!-- Description Physique --}}
<div class="bio-section">
<div class="section-header">
<i class="fas fa-user"></i>
<span>{{localize "CELESTOPOL.NPC.descriptionPhysique"}}</span>
</div>
{{formInput systemFields.descriptionPhysique enriched=enrichedDescriptionPhysique value=system.descriptionPhysique name="system.descriptionPhysique" toggled=true}}
</div>
</div>

View File

@@ -1,7 +1,13 @@
<div class="tab blessures {{tab.cssClass}}" data-group="sheet" data-tab="blessures">
<section class="track-section">
<div class="track-header">
<span class="track-title">{{localize "CELESTOPOL.Track.blessures"}}</span>
<span class="track-title">
{{localize "CELESTOPOL.Track.blessures"}}
<span class="track-help" title="{{localize 'CELESTOPOL.Track.blessuresTooltip'}}">?</span>
</span>
<span class="wound-malus">{{localize "CELESTOPOL.Track.currentMalus"}} :
<strong>{{lookup @root.woundLevels system.blessures.lvl 'malus'}}</strong>
</span>
</div>
<div class="track-boxes">
{{#each (range 8) as |lvl|}}
@@ -17,8 +23,9 @@
</div>
</section>
{{!-- Description --}}
<div class="description-section">
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
{{!-- Notes (libres) --}}
<div class="description-section notes-section">
<div class="section-header"><i class="fas fa-note-sticky"></i> {{localize "CELESTOPOL.Actor.notes"}}</div>
{{formInput systemFields.notes enriched=enrichedNotes value=system.notes name="system.notes" toggled=true}}
</div>
</div>

View File

@@ -1,37 +1,65 @@
<div class="tab competences {{tab.cssClass}}" data-group="sheet" data-tab="competences">
<div class="stats-grid">
{{!-- Grille des 4 domaines --}}
<div class="npc-domains-grid">
{{#each stats as |stat statId|}}
<div class="stat-block">
<div class="stat-header">
<span class="stat-name">{{localize stat.label}}</span>
<div class="stat-res">
<label>{{localize "CELESTOPOL.Stat.res"}}</label>
{{#if ../isEditMode}}
<input type="number" name="system.stats.{{statId}}.res"
value="{{lookup ../system.stats statId 'res'}}" min="0" max="8">
<div class="npc-domain-block">
<div class="npc-domain-header">
{{!-- Double label : Âme / Emprise --}}
<div class="npc-domain-labels">
<span class="domain-label-primary">{{localize (lookup ../domainLabels statId)}}</span>
{{#if (eq ../system.npcType "antagoniste")}}
<span class="domain-label-secondary">{{localize (lookup ../stats statId 'label')}}</span>
{{else}}
<span class="stat-res-value">
{{lookup ../system.stats statId 'actuel'}} / {{lookup ../system.stats statId 'res'}}
</span>
<span class="domain-label-secondary">{{localize (lookup ../antagonisteStats statId 'label')}}</span>
{{/if}}
</div>
</div>
<div class="skills-list">
{{#each (lookup ../skills statId) as |skill skillId|}}
<div class="skill-row {{#unless ../isEditMode}}rollable{{/unless}}"
data-stat-id="{{statId}}" data-skill-id="{{skillId}}">
<span class="skill-name">{{localize skill.label}}</span>
{{!-- Valeur du domaine --}}
<div class="npc-domain-value-wrap">
{{#if ../isEditMode}}
<input type="number" name="system.stats.{{statId}}.{{skillId}}.value"
value="{{lookup (lookup ../system.stats statId) skillId 'value'}}"
min="0" max="8" class="skill-value-input">
<input type="number" name="system.stats.{{statId}}.res"
value="{{lookup ../system.stats statId 'res'}}" min="0" max="8" class="domain-value-input">
{{else}}
<span class="skill-value">{{lookup (lookup ../system.stats statId) skillId 'value'}}</span>
<div class="npc-domain-roll-btn rollable" data-stat-id="{{statId}}"
title="{{localize 'CELESTOPOL.Roll.clickToRoll'}}">
<i class="fas fa-dice-d8 domain-die-icon"></i>
<span class="domain-value">{{lookup ../system.stats statId 'actuel'}}</span>
<span class="domain-value-base">/{{lookup ../system.stats statId 'res'}}</span>
</div>
{{/if}}
</div>
{{/each}}
</div>
</div>
{{/each}}
</div>
{{!-- Aspects --}}
{{#if (or aspects.length isEditMode)}}
<div class="npc-aspects-section">
<div class="section-header">
<i class="fas fa-star"></i>
<span>{{localize "CELESTOPOL.Tab.aspects"}}</span>
{{#if isEditMode}}
<a data-action="createAspect" title="{{localize 'CELESTOPOL.Item.newAspect'}}"><i class="fas fa-plus"></i></a>
{{/if}}
</div>
{{#each aspects as |item|}}
<div class="item-row aspect-row" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}">
<span class="item-name">{{item.name}}</span>
<span class="aspect-value {{#if (gt item.system.valeur 0)}}positive{{else if (lt item.system.valeur 0)}}negative{{/if}}">
{{#if (gt item.system.valeur 0)}}+{{/if}}{{item.system.valeur}}
</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}}
{{#unless ../isEditMode}}
<p class="equip-empty">{{localize "CELESTOPOL.Item.noAspects"}}</p>
{{/unless}}
{{/each}}
</div>
{{/if}}
</div>

View File

@@ -0,0 +1,58 @@
<div class="tab equipement {{tab.cssClass}}" data-group="sheet" data-tab="equipement">
{{!-- ── Armes ─────────────────────────────────────────────────────────── --}}
<div class="equip-section">
<div class="section-header">
<i class="fas fa-khanda"></i>
<span>{{localize "CELESTOPOL.Item.weapons"}}</span>
{{#if isEditMode}}
<a data-action="createWeapon" title="{{localize 'CELESTOPOL.Item.newWeapon'}}"><i class="fas fa-plus"></i></a>
{{/if}}
</div>
{{#each weapons as |item|}}
<div class="item-row weapon" 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>
<span class="item-tag type">{{#if (eq item.system.type "melee")}}{{localize "CELESTOPOL.Weapon.typeMelee"}}{{else}}{{localize "CELESTOPOL.Weapon.typeDistance"}}{{/if}}</span>
<span class="item-tag dmg">{{localize "CELESTOPOL.Weapon.degats"}} {{item.system.degats}}</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.noWeapons"}}</p>
{{/each}}
</div>
{{!-- ── Armures ───────────────────────────────────────────────────────── --}}
<div class="equip-section">
<div class="section-header">
<i class="fas fa-shield-halved"></i>
<span>{{localize "CELESTOPOL.Item.armures"}}</span>
{{#if isEditMode}}
<a data-action="createArmure" title="{{localize 'CELESTOPOL.Item.newArmure'}}"><i class="fas fa-plus"></i></a>
{{/if}}
</div>
{{#each armures as |item|}}
<div class="item-row armure {{#if item.system.equipped}}is-equipped{{/if}}" 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>
<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}}
<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}}"
class="equip-toggle {{#if item.system.equipped}}equipped{{/if}}">
<i class="fas fa-shield{{#unless item.system.equipped}}-halved{{/unless}}"></i>
</a>
<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.noArmures"}}</p>
{{/each}}
</div>
</div>

View File

@@ -19,6 +19,22 @@
<span class="concept-display">{{system.concept}}</span>
{{/if}}
</div>
{{!-- Type PNJ (standard / antagoniste) --}}
<div class="npc-type-row">
{{#if isEditMode}}
<select name="system.npcType" class="npc-type-select">
{{#each npcTypes as |ntype key|}}
<option value="{{key}}" {{#if (eq key ../system.npcType)}}selected{{/if}}>{{localize ntype.label}}</option>
{{/each}}
</select>
{{else}}
{{#if (eq system.npcType "antagoniste")}}
<span class="npc-type-badge antagoniste">{{localize "CELESTOPOL.NPC.typeAntagoniste"}}</span>
{{/if}}
{{/if}}
</div>
<div class="header-stats-row">
<div class="header-stat">
<label>{{localize "CELESTOPOL.Actor.initiative"}}</label>
@@ -49,9 +65,20 @@
</div>
{{/if}}
{{/with}}
{{!-- Badge malus armure équipée --}}
{{#if armorMalus}}
<div class="header-stat armor-malus-badge">
<label>{{localize "CELESTOPOL.Armure.malusLabel"}}</label>
<span>{{armorMalus}}</span>
</div>
{{/if}}
</div>
</div>
<div class="header-buttons">
<a class="moon-standalone-btn" data-action="rollMoonDie" title="{{localize 'CELESTOPOL.Moon.standaloneTitle'}}">
🌙
</a>
<a data-action="toggleSheet">
<i class="fas {{#if isEditMode}}fa-eye{{else}}fa-edit{{/if}}"></i>
</a>

View File

@@ -27,38 +27,83 @@
{{#if woundMalus}}
<span class="dminus"> {{abs woundMalus}}</span>
{{/if}}
{{#if armorMalus}}
<span class="dminus armor-malus"> {{abs armorMalus}}</span>
{{/if}}
</div>
{{#if woundLabel}}
<div class="wound-info">⚠ {{woundLabel}}</div>
{{/if}}
{{#if armorMalus}}
<div class="wound-info armor-info">🛡 {{localize "CELESTOPOL.Roll.armorMalus"}}</div>
{{/if}}
</div>
</div>
<div class="roll-form-rows">
{{!-- Difficulté : sélect standard OU input Corps PNJ en combat --}}
{{!-- Difficulté : Corps PNJ en combat, fixe 11 en test normal --}}
{{#if isCombat}}
<div class="form-row-line form-corps-pnj">
<label for="corpsPnj">{{localize "CELESTOPOL.Combat.corpsPnj"}}</label>
<input type="number" id="corpsPnj" name="corpsPnj" value="7" min="1" max="30" class="corps-pnj-input">
</div>
{{else}}
<div class="form-row-line">
<label for="difficulty">{{localize "CELESTOPOL.Roll.difficulty"}}</label>
<select id="difficulty" name="difficulty">
{{#each difficultyChoices as |diff key|}}
<option value="{{key}}" {{#if (eq key ../defaultDifficulty)}}selected{{/if}}>
{{localize diff.label}}{{#if diff.value}} ({{diff.value}}){{/if}}
</option>
{{!-- Sélecteur de cible PNJ (si des tokens NPCs sont disponibles) --}}
{{#if availableTargets.length}}
<div class="form-row-line form-target-row">
<label for="targetSelect"><i class="fas fa-crosshairs"></i> {{localize "CELESTOPOL.Combat.targetLabel"}}</label>
<select id="targetSelect" name="targetSelect">
<option value="">— {{localize "CELESTOPOL.Combat.targetAuto"}} —</option>
{{#each availableTargets as |t|}}
<option value="{{t.corps}}">{{t.name}}</option>
{{/each}}
</select>
</div>
{{/if}}
<div class="form-row-line form-corps-pnj" id="corps-pnj-row">
<label for="corpsPnj">{{localize "CELESTOPOL.Combat.corpsPnj"}}</label>
<input type="number" id="corpsPnj" name="corpsPnj" value="7" min="1" max="30" class="corps-pnj-input">
</div>
<div class="form-row-line form-target-confirmed" id="target-confirmed-row" style="display:none">
<span class="target-confirmed-badge"><i class="fas fa-crosshairs"></i> <span id="target-confirmed-name"></span></span>
</div>
{{!-- Modificateurs tir (distance uniquement) --}}
{{#if isRangedAttack}}
<div class="form-row-line form-ranged-mod">
<label for="rangedMod"><i class="fas fa-bullseye"></i> {{localize "CELESTOPOL.Combat.rangedMod"}}</label>
<select id="rangedMod" name="rangedMod">
{{#each rangedModChoices as |choice|}}
<option value="{{choice.value}}" {{#if (eq choice.id "none")}}selected{{/if}}>{{choice.label}}</option>
{{/each}}
</select>
</div>
{{/if}}
{{else}}
<div class="form-row-line form-threshold-fixed">
<label>{{localize "CELESTOPOL.Roll.threshold"}}</label>
<span class="threshold-value" id="threshold-display">11</span>
</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">
<span class="opposition-icon">⚔</span>
<span class="opposition-text">
<span class="opposition-main">{{localize "CELESTOPOL.Roll.opposition"}}</span>
<span class="opposition-sub">{{localize "CELESTOPOL.Roll.oppositionDesc"}}</span>
</span>
</label>
</div>
{{/unless}}
{{/if}}
{{!-- Options non disponibles en test de résistance --}}
{{#unless isResistance}}
{{!-- Modificateur & Aspect côte à côte --}}
{{!-- Modificateur & Aspect côte à côte (tests normaux) --}}
<div class="form-two-col">
<div class="form-row-line">
<label for="modifier">{{localize "CELESTOPOL.Roll.modifier"}}</label>
@@ -78,6 +123,23 @@
</div>
</div>
{{else}}
{{!-- En résistance : Bonus/Malus d'Aspect disponible --}}
<div class="form-row-line form-resistance-aspect">
<label for="aspectModifier">{{localize "CELESTOPOL.Roll.aspect"}}</label>
<select id="aspectModifier" name="aspectModifier">
{{#each aspectChoices as |choice|}}
<option value="{{choice.value}}" {{#if (eq choice.value 0)}}selected{{/if}}>{{choice.label}}</option>
{{/each}}
</select>
</div>
{{/unless}}{{!-- /isResistance aspect --}}
{{!-- Options non disponibles en test de résistance (lune, destin, puiser, fortune) --}}
{{#unless isResistance}}
{{!-- Dé de la Lune --}}
<div class="form-moon-row">
<label class="moon-toggle" for="rollMoonDie">
@@ -132,7 +194,7 @@
</div>
{{/if}}
{{/unless}}{{!-- /isResistance --}}
{{/unless}}{{!-- /isResistance (lune, destin, puiser, fortune) --}}
{{!-- Modificateur de situation (-8 à +8) — tous les jets --}}
<div class="form-row-line form-situation-mod">