Files
fvtt-celestopol/templates/roll-dialog.hbs
LeRatierBretonnier 63eb7f703a 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>
2026-03-29 20:38:55 +02:00

179 lines
6.8 KiB
Handlebars
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<div class="roll-dialog-content">
{{!-- En-tête : acteur + domaine + formule de base --}}
<div class="roll-info-block">
<div class="roll-actor">{{actorName}}</div>
<div class="roll-skill-line">
{{#if statLabel}}<span class="stat-label">{{localize statLabel}}</span><span class="sep"> </span>{{/if}}
<span class="skill-label">{{localize skillLabel}}</span>
</div>
<div class="roll-dice-summary">
<div class="dice-breakdown">
<span class="base-dice">2d8</span>
<span class="plus-sign"> + </span>
<span class="dval">{{skillValue}}</span>
{{#if woundMalus}}
<span class="dminus"> {{abs woundMalus}}</span>
{{/if}}
</div>
{{#if woundLabel}}
<div class="wound-info">⚠ {{woundLabel}}</div>
{{/if}}
</div>
</div>
<div class="roll-form-rows">
{{!-- Difficulté --}}
<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>
{{/each}}
</select>
</div>
{{!-- Modificateur & Aspect côte à côte --}}
<div class="form-two-col">
<div class="form-row-line">
<label for="modifier">{{localize "CELESTOPOL.Roll.modifier"}}</label>
<select id="modifier" name="modifier">
{{#each modifierChoices as |choice|}}
<option value="{{choice.value}}" {{#if (eq choice.value 0)}}selected{{/if}}>{{choice.label}}</option>
{{/each}}
</select>
</div>
<div class="form-row-line">
<label for="aspectModifier">{{localize "CELESTOPOL.Roll.aspect"}}</label>
<select id="aspectModifier" name="aspectModifier">
{{#each modifierChoices as |choice|}}
<option value="{{choice.value}}" {{#if (eq choice.value 0)}}selected{{/if}}>{{choice.label}}</option>
{{/each}}
</select>
</div>
</div>
{{!-- Dé de la Lune --}}
<div class="form-moon-row">
<label class="moon-toggle" for="rollMoonDie">
<input type="checkbox" id="rollMoonDie" name="rollMoonDie" {{#if defaultRollMoonDie}}checked{{/if}}>
<span class="moon-icon">🌑</span>
<span class="moon-text">{{localize "CELESTOPOL.Roll.rollMoonDie"}}</span>
</label>
</div>
{{!-- Destin (3d8) — seulement si jauge pleine --}}
<div class="form-destin-row {{#unless destGaugeFull}}destin-disabled{{/unless}}">
<label class="destin-toggle" for="useDestin">
<input type="checkbox" id="useDestin" name="useDestin" {{#unless destGaugeFull}}disabled{{/unless}}>
<span class="destin-icon">✦</span>
<span class="destin-text">
<span class="destin-main">{{localize "CELESTOPOL.Roll.destin"}}</span>
<span class="destin-bonus">{{localize "CELESTOPOL.Roll.destinBonus"}}</span>
</span>
{{#if destGaugeFull}}
<span class="destin-badge full">{{localize "CELESTOPOL.Roll.destGaugeFull"}}</span>
{{else}}
<span class="destin-badge empty">{{localize "CELESTOPOL.Roll.destGaugeEmpty"}}</span>
{{/if}}
</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">
<label class="fortune-toggle" for="useFortune">
<input type="checkbox" id="useFortune" name="useFortune">
<span class="fortune-icon">⚜</span>
<span class="fortune-text">
<span class="fortune-main">{{localize "CELESTOPOL.Roll.fortune"}}</span>
<span class="fortune-bonus">{{localize "CELESTOPOL.Roll.fortuneBonus"}}</span>
</span>
<span class="fortune-badge">{{fortuneValue}}</span>
</label>
</div>
{{/if}}
{{!-- Visibilité --}}
<div class="form-row-line form-visibility">
<label for="visibility">{{localize "CELESTOPOL.Roll.visibility"}}</label>
<select id="visibility" name="visibility">
<option value="publicroll">{{localize "CELESTOPOL.Roll.visibilityPublic"}}</option>
<option value="gmroll">{{localize "CELESTOPOL.Roll.visibilityGM"}}</option>
<option value="selfroll">{{localize "CELESTOPOL.Roll.visibilitySelf"}}</option>
</select>
</div>
</div>
{{!-- Prévisualisation formule --}}
<div class="dice-preview">
<span class="preview-label">{{localize "CELESTOPOL.Roll.formula"}}</span>
<span class="preview-formula" id="preview-formula">2d8</span>
</div>
</div>
<script>
(function() {
const wrap = document.querySelector('.roll-dialog-content');
if (!wrap) return;
const skillVal = {{skillValue}};
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 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) {
const fm = totalMod + 8;
formula = `1d8` + (fm > 0 ? ` + ${fm}` : fm < 0 ? ` ${Math.abs(fm)}` : ``);
} else {
formula = `${ndice}d8`;
if (totalMod > 0) formula += ` + ${totalMod}`;
if (totalMod < 0) formula += ` ${Math.abs(totalMod)}`;
}
const previewEl = wrap.querySelector('#preview-formula');
if (previewEl) previewEl.textContent = formula;
}
wrap.querySelectorAll('#modifier, #aspectModifier, #useDestin, #useFortune, #puiserRessources').forEach(el => {
el.addEventListener('change', update);
el.addEventListener('input', update);
});
update();
})();
</script>