feat: implémente 'Puiser dans ses ressources'

Règle : le joueur peut ignorer tous les malus actifs contre une case de Spleen.

- roll.mjs : checkbox puiserRessources ; ignore woundMalus, modifier négatif
  et aspectMod négatif ; incrémente system.spleen.lvl +1 après le jet
- roll-dialog.hbs : bloc rouge foncé visible si woundMalus < 0 ; preview mis à jour
- chat-message.hbs : bandeau '💪 Ressources puisées' si utilisé
- roll.less : .form-puiser-row, .used-info.used-puiser
- lang/fr.json : Roll.puiser/puiserDesc/usedPuiser

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
2026-03-29 20:38:55 +02:00
parent c1c85762c5
commit 63eb7f703a
5 changed files with 148 additions and 18 deletions

View File

@@ -84,6 +84,11 @@
<span class="used-fortune">⚜ {{localize "CELESTOPOL.Roll.usedFortune"}}</span>
</div>
{{/if}}
{{#if puiserRessources}}
<div class="used-info used-puiser">
<span>💪 {{localize "CELESTOPOL.Roll.usedPuiser"}}</span>
</div>
{{/if}}
{{!-- Résultat du Dé de la Lune (narratif) --}}
{{#if hasMoonDie}}

View File

@@ -82,6 +82,21 @@
</label>
</div>
{{!-- Puiser dans ses ressources — si malus de blessures --}}
{{#if hasMalus}}
<div class="form-puiser-row">
<label class="puiser-toggle" for="puiserRessources">
<input type="checkbox" id="puiserRessources" name="puiserRessources">
<span class="puiser-icon">💪</span>
<span class="puiser-text">
<span class="puiser-main">{{localize "CELESTOPOL.Roll.puiser"}}</span>
<span class="puiser-sub">{{localize "CELESTOPOL.Roll.puiserDesc"}}</span>
</span>
<span class="puiser-cost">+1 <i class="fas fa-face-sad-tear"></i></span>
</label>
</div>
{{/if}}
{{!-- Fortune (1d8+8) — seulement si Fortune > 0 --}}
{{#if fortuneValue}}
<div class="form-fortune-row">
@@ -126,12 +141,17 @@
const woundMalus = {{woundMalus}};
function update() {
const modifier = parseInt(wrap.querySelector('#modifier')?.value ?? 0) || 0;
const aspectMod = parseInt(wrap.querySelector('#aspectModifier')?.value ?? 0) || 0;
const useDestin = wrap.querySelector('#useDestin')?.checked;
const useFortune= wrap.querySelector('#useFortune')?.checked;
const ndice = useDestin ? 3 : 2;
const totalMod = skillVal + woundMalus + modifier + aspectMod;
const modifier = parseInt(wrap.querySelector('#modifier')?.value ?? 0) || 0;
const aspectMod = parseInt(wrap.querySelector('#aspectModifier')?.value ?? 0) || 0;
const useDestin = wrap.querySelector('#useDestin')?.checked;
const useFortune = wrap.querySelector('#useFortune')?.checked;
const puiser = wrap.querySelector('#puiserRessources')?.checked;
const ndice = useDestin ? 3 : 2;
const effWound = puiser ? 0 : woundMalus;
const effMod = puiser ? Math.max(0, modifier) : modifier;
const effAspect = puiser ? Math.max(0, aspectMod) : aspectMod;
const totalMod = skillVal + effWound + effMod + effAspect;
let formula;
if (useFortune) {
@@ -147,7 +167,7 @@
if (previewEl) previewEl.textContent = formula;
}
wrap.querySelectorAll('#modifier, #aspectModifier, #useDestin, #useFortune').forEach(el => {
wrap.querySelectorAll('#modifier, #aspectModifier, #useDestin, #useFortune, #puiserRessources').forEach(el => {
el.addEventListener('change', update);
el.addEventListener('input', update);
});