fix: Puiser dans ses ressources — JS dans render callback DialogV2

- Déplace la logique JS (update, show/hide puiser-row) du <script> inline
  vers le callback render: de DialogV2.wait() — les scripts inline ne
  s'exécutent pas via innerHTML dans Foundry v13
- Supprime hasMalus du dialogContext (plus nécessaire)
- Le bloc Puiser s'affiche dynamiquement dès que modifier ou aspect < 0

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
2026-03-29 21:28:11 +02:00
parent 63eb7f703a
commit 37335d3e9f
2 changed files with 56 additions and 48 deletions

View File

@@ -55,7 +55,6 @@ export class CelestopolRoll extends Roll {
skillValue,
woundMalus,
woundLabel,
hasMalus: woundMalus < 0,
difficultyChoices: SYSTEM.DIFFICULTY_CHOICES,
defaultDifficulty: options.difficulty ?? "normal",
destGaugeFull,
@@ -77,6 +76,60 @@ export class CelestopolRoll extends Roll {
window: { title },
classes: ["fvtt-celestopol", "roll-dialog"],
content,
render: (_event, dialog) => {
const wrap = dialog.element.querySelector('.roll-dialog-content')
if (!wrap) return
function hasMalus(mod, asp) {
return woundMalus < 0 || mod < 0 || asp < 0
}
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 useFort = wrap.querySelector('#useFortune')?.checked
const puiser = wrap.querySelector('#puiserRessources')?.checked
const ndice = useDestin ? 3 : 2
// Afficher/masquer le bloc "Puiser" selon les malus actifs
const puiserRow = wrap.querySelector('#puiser-row')
if (puiserRow) {
if (hasMalus(modifier, aspectMod)) {
puiserRow.style.display = ''
} else {
puiserRow.style.display = 'none'
const cb = wrap.querySelector('#puiserRessources')
if (cb) cb.checked = false
}
}
const effWound = puiser ? 0 : woundMalus
const effMod = puiser ? Math.max(0, modifier) : modifier
const effAspect = puiser ? Math.max(0, aspectMod) : aspectMod
const totalMod = skillValue + effWound + effMod + effAspect
let formula
if (useFort) {
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()
},
buttons: [
{
label: game.i18n.localize("CELESTOPOL.Roll.roll"),

View File

@@ -82,9 +82,8 @@
</label>
</div>
{{!-- Puiser dans ses ressources — si malus de blessures --}}
{{#if hasMalus}}
<div class="form-puiser-row">
{{!-- Puiser dans ses ressources — affiché dynamiquement via JS si malus --}}
<div class="form-puiser-row" id="puiser-row" style="display:none">
<label class="puiser-toggle" for="puiserRessources">
<input type="checkbox" id="puiserRessources" name="puiserRessources">
<span class="puiser-icon">💪</span>
@@ -95,7 +94,6 @@
<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}}
@@ -132,47 +130,4 @@
</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>