Portraits et corrections sur valeurs des PNJ
Some checks failed
Release Creation / build (release) Failing after 1m24s

This commit is contained in:
2026-04-12 11:52:17 +02:00
parent 7a2be0cc0e
commit 44cc07db73
91 changed files with 4612 additions and 212 deletions

View File

@@ -1,92 +1,122 @@
<div class="tab biography {{tab.cssClass}}" data-group="sheet" data-tab="biography">
{{!-- Description Physique --}}
<div class="biography-section">
<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 --}}
<div class="notes-section">
<div class="section-header">{{localize "CELESTOPOL.Actor.notes"}}</div>
{{formInput systemFields.notes enriched=enrichedNotes value=system.notes name="system.notes" toggled=true}}
</div>
{{!-- Section XP --}}
<div class="xp-section">
<div class="section-header">{{localize "CELESTOPOL.XP.title"}}</div>
<div class="xp-counters">
<div class="xp-counter">
<label>{{localize "CELESTOPOL.XP.actuel"}}</label>
{{formInput systemFields.xp.fields.actuel value=system.xp.actuel name="system.xp.actuel"}}
<div class="biography-layout">
<div class="biography-main">
{{!-- Description Physique --}}
<div class="biography-section">
<div class="section-header">{{localize "CELESTOPOL.Actor.descriptionPhysique"}}</div>
{{formInput systemFields.descriptionPhysique enriched=enrichedDescriptionPhysique value=system.descriptionPhysique name="system.descriptionPhysique" toggled=true}}
</div>
<div class="xp-counter xp-depense-counter">
<label>{{localize "CELESTOPOL.XP.depense"}}</label>
<span class="xp-depense-value">{{system.xp.depense}}</span>
{{!-- 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>
{{!-- Historique --}}
<div class="biography-section">
<div class="section-header">{{localize "CELESTOPOL.Actor.historique"}}</div>
{{formInput systemFields.historique enriched=enrichedHistorique value=system.historique name="system.historique" toggled=true}}
</div>
{{!-- Notes --}}
<div class="notes-section">
<div class="section-header">{{localize "CELESTOPOL.Actor.notes"}}</div>
{{formInput systemFields.notes enriched=enrichedNotes value=system.notes name="system.notes" toggled=true}}
</div>
{{!-- Section XP --}}
<div class="xp-section">
<div class="section-header">{{localize "CELESTOPOL.XP.title"}}</div>
<div class="xp-counters">
<div class="xp-counter">
<label>{{localize "CELESTOPOL.XP.actuel"}}</label>
{{formInput systemFields.xp.fields.actuel value=system.xp.actuel name="system.xp.actuel"}}
</div>
<div class="xp-counter xp-depense-counter">
<label>{{localize "CELESTOPOL.XP.depense"}}</label>
<span class="xp-depense-value">{{system.xp.depense}}</span>
</div>
{{#if isPlayMode}}
<button type="button" class="xp-btn-depenser" data-action="depenseXp">
<i class="fa-solid fa-coins"></i> {{localize "CELESTOPOL.XP.depenser"}}
</button>
{{/if}}
</div>
{{!-- Log des dépenses --}}
{{#unless xpLogEmpty}}
<table class="xp-log-table">
<thead>
<tr>
<th>{{localize "CELESTOPOL.XP.date"}}</th>
<th>{{localize "CELESTOPOL.XP.raison"}}</th>
<th>{{localize "CELESTOPOL.XP.montant"}}</th>
{{#if isEditMode}}<th></th>{{/if}}
</tr>
</thead>
<tbody>
{{#each system.xp.log}}
<tr>
<td class="xp-date">{{this.date}}</td>
<td class="xp-raison">{{this.raison}}</td>
<td class="xp-montant">{{this.montant}}</td>
{{#if ../isEditMode}}
<td class="xp-suppr-cell">
<button type="button" class="xp-btn-suppr" data-action="supprimerXpLog"
data-idx="{{@index}}" title="{{localize 'CELESTOPOL.XP.supprimer'}}">
<i class="fa-solid fa-trash"></i>
</button>
</td>
{{/if}}
</tr>
{{/each}}
</tbody>
</table>
{{/unless}}
{{!-- Tableau de référence des coûts --}}
<details class="xp-ref">
<summary>{{localize "CELESTOPOL.XP.refTitle"}}</summary>
<table class="xp-ref-table">
<thead>
<tr>
<th>{{localize "CELESTOPOL.XP.refAmelioration"}}</th>
<th>{{localize "CELESTOPOL.XP.refCout"}}</th>
</tr>
</thead>
<tbody>
<tr><td>{{localize "CELESTOPOL.XP.refAugmenterSpec"}}</td><td>{{localize "CELESTOPOL.XP.refCoutNiveau"}}</td></tr>
<tr><td>{{localize "CELESTOPOL.XP.refAcquerirAspect"}}</td><td>5</td></tr>
<tr><td>{{localize "CELESTOPOL.XP.refAugmenterAspect"}}</td><td>5</td></tr>
<tr><td>{{localize "CELESTOPOL.XP.refAcquerirAttribut"}}</td><td>{{localize "CELESTOPOL.XP.refCoutAttributTotal"}}</td></tr>
</tbody>
</table>
</details>
</div>
{{#if isPlayMode}}
<button type="button" class="xp-btn-depenser" data-action="depenseXp">
<i class="fa-solid fa-coins"></i> {{localize "CELESTOPOL.XP.depenser"}}
</button>
{{/if}}
</div>
{{!-- Log des dépenses --}}
{{#unless xpLogEmpty}}
<table class="xp-log-table">
<thead>
<tr>
<th>{{localize "CELESTOPOL.XP.date"}}</th>
<th>{{localize "CELESTOPOL.XP.raison"}}</th>
<th>{{localize "CELESTOPOL.XP.montant"}}</th>
{{#if isEditMode}}<th></th>{{/if}}
</tr>
</thead>
<tbody>
{{#each system.xp.log}}
<tr>
<td class="xp-date">{{this.date}}</td>
<td class="xp-raison">{{this.raison}}</td>
<td class="xp-montant">{{this.montant}}</td>
{{#if ../isEditMode}}
<td class="xp-suppr-cell">
<button type="button" class="xp-btn-suppr" data-action="supprimerXpLog"
data-idx="{{@index}}" title="{{localize 'CELESTOPOL.XP.supprimer'}}">
<i class="fa-solid fa-trash"></i>
</button>
</td>
{{/if}}
</tr>
{{/each}}
</tbody>
</table>
{{/unless}}
{{!-- Tableau de référence des coûts --}}
<details class="xp-ref">
<summary>{{localize "CELESTOPOL.XP.refTitle"}}</summary>
<table class="xp-ref-table">
<thead>
<tr>
<th>{{localize "CELESTOPOL.XP.refAmelioration"}}</th>
<th>{{localize "CELESTOPOL.XP.refCout"}}</th>
</tr>
</thead>
<tbody>
<tr><td>{{localize "CELESTOPOL.XP.refAugmenterSpec"}}</td><td>{{localize "CELESTOPOL.XP.refCoutNiveau"}}</td></tr>
<tr><td>{{localize "CELESTOPOL.XP.refAcquerirAspect"}}</td><td>5</td></tr>
<tr><td>{{localize "CELESTOPOL.XP.refAugmenterAspect"}}</td><td>5</td></tr>
<tr><td>{{localize "CELESTOPOL.XP.refAcquerirAttribut"}}</td><td>{{localize "CELESTOPOL.XP.refCoutAttributTotal"}}</td></tr>
</tbody>
</table>
</details>
<aside class="biography-portrait-panel">
<div class="section-header">{{localize "CELESTOPOL.Actor.portraitImage"}}</div>
<div class="biography-portrait-preview">
{{#if hasBiographyPortrait}}
<img src="{{biographyPortrait}}" alt="{{actor.name}}" class="biography-portrait-image">
{{else}}
<div class="biography-portrait-empty">{{localize "CELESTOPOL.Actor.portraitImageEmpty"}}</div>
{{/if}}
</div>
<div class="biography-portrait-actions">
<button type="button" class="biography-portrait-send" data-action="sendBiographyPortrait" {{#unless hasBiographyPortrait}}disabled{{/unless}}>
<i class="fa-solid fa-image"></i> {{localize "CELESTOPOL.Actor.sendPortraitToChat"}}
</button>
</div>
{{#if isEditMode}}
<div class="biography-portrait-field">
<file-picker type="image" name="system.portraitImage" value="{{system.portraitImage}}"></file-picker>
</div>
<p class="biography-portrait-hint">{{localize "CELESTOPOL.Actor.portraitImageHint"}}</p>
{{/if}}
</aside>
</div>
</div>

View File

@@ -1,48 +1,72 @@
<div class="tab biographie {{tab.cssClass}}" data-group="sheet" data-tab="biographie">
<div class="biography-layout">
<div class="biography-main">
{{!-- 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>
{{!-- Faction --}}
<div class="bio-section faction-section">
<div class="section-header">
<i class="fas fa-flag"></i>
<span>{{localize "CELESTOPOL.NPC.faction"}}</span>
{{!-- 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>
{{#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>
<aside class="biography-portrait-panel">
<div class="section-header">{{localize "CELESTOPOL.Actor.portraitImage"}}</div>
<div class="biography-portrait-preview">
{{#if hasBiographyPortrait}}
<img src="{{biographyPortrait}}" alt="{{actor.name}}" class="biography-portrait-image">
{{else}}
<div class="biography-portrait-empty">{{localize "CELESTOPOL.Actor.portraitImageEmpty"}}</div>
{{/if}}
</div>
<div class="biography-portrait-actions">
<button type="button" class="biography-portrait-send" data-action="sendBiographyPortrait" {{#unless hasBiographyPortrait}}disabled{{/unless}}>
<i class="fa-solid fa-image"></i> {{localize "CELESTOPOL.Actor.sendPortraitToChat"}}
</button>
</div>
{{#if isEditMode}}
<div class="biography-portrait-field">
<file-picker type="image" name="system.portraitImage" value="{{system.portraitImage}}"></file-picker>
</div>
<p class="biography-portrait-hint">{{localize "CELESTOPOL.Actor.portraitImageHint"}}</p>
{{/if}}
</div>
{{/if}}
</aside>
</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

@@ -18,7 +18,7 @@
<div class="npc-domain-value-wrap">
{{#if ../isEditMode}}
<input type="number" name="system.stats.{{statId}}.res"
value="{{lookup ../system.stats statId 'res'}}" min="0" max="8" class="domain-value-input">
value="{{lookup ../system.stats statId 'res'}}" min="0" class="domain-value-input">
{{else}}
<div class="npc-domain-roll-btn rollable" data-stat-id="{{statId}}"
title="{{localize 'CELESTOPOL.Roll.clickToRoll'}}">