Règle : si Fortune > 0, le joueur peut cocher 'Fortune' pour lancer 1d8 + 8 au lieu de 2d8 (contraint les probabilités vers le haut). - character.mjs : passe fortuneValue dans roll.prompt() - roll.mjs : checkbox Fortune, formule 1d8 + 8 + totalModifier si cochée - roll-dialog.hbs : bloc Fortune (visible si fortuneValue > 0), preview mis à jour - chat-message.hbs : affiche '+8' dans la zone dés, ligne formule avec badge Fortune - roll.less : styles .form-fortune-row, .fl-mod.fortune, .fortune-fixed-badge - lang/fr.json : Roll.fortune/fortuneBonus/fortuneFixed/usedFortune Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
159 lines
5.9 KiB
Handlebars
159 lines
5.9 KiB
Handlebars
<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>
|
||
|
||
{{!-- 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 ndice = useDestin ? 3 : 2;
|
||
const totalMod = skillVal + woundMalus + modifier + aspectMod;
|
||
|
||
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').forEach(el => {
|
||
el.addEventListener('change', update);
|
||
el.addEventListener('input', update);
|
||
});
|
||
|
||
update();
|
||
})();
|
||
</script>
|
||
|