« MediaWiki:Common.js » : différence entre les versions
aucun résumé des modifications
Aucun résumé des modifications Balise : Révocation manuelle |
Aucun résumé des modifications Balise : Révoqué |
||
| Ligne 75 : | Ligne 75 : | ||
window.addEventListener( 'load', initDoubleScroll ); | window.addEventListener( 'load', initDoubleScroll ); | ||
} | } | ||
}() ); | |||
/* ============================================ | |||
CALCULATEUR DE RÉSOLUTION — Nephilim 5e | |||
À ajouter dans MediaWiki:Common.js | |||
============================================ */ | |||
( function () { | |||
'use strict'; | |||
// Ne s'active que si le calculateur est présent sur la page | |||
var calc = document.querySelector( '.neph-calc' ); | |||
if ( !calc ) { | |||
return; | |||
} | |||
// Raccourci pour trouver les éléments par data-neph ou data-neph-out | |||
function input( name ) { | |||
return calc.querySelector( '[data-neph="' + name + '"]' ); | |||
} | |||
function output( name ) { | |||
return calc.querySelector( '[data-neph-out="' + name + '"]' ); | |||
} | |||
function val( name ) { | |||
var el = input( name ); | |||
return el ? ( parseInt( el.value, 10 ) || 0 ) : 0; | |||
} | |||
// Recalcule les scores à chaque changement de select | |||
function compute() { | |||
var vecu = val( 'vecu' ); | |||
var approche = val( 'approche' ); | |||
var metamorphe = val( 'metamorphe' ); | |||
var bonus = val( 'bonus' ); | |||
var malus = val( 'malus' ); | |||
var brut = vecu + approche + metamorphe; | |||
var net = Math.max( 0, brut + bonus - malus ); | |||
var seuil = Math.min( net * 10, 100 ); | |||
output( 'scoreBrut' ).textContent = brut; | |||
output( 'scoreNet' ).textContent = net; | |||
output( 'seuil' ).textContent = seuil + '%'; | |||
// Masquer le résultat précédent | |||
var panel = output( 'resultPanel' ); | |||
panel.className = 'neph-calc-result'; | |||
output( 'resetWrap' ).className = 'neph-calc-reset-wrap'; | |||
output( 'marginBar' ).style.display = 'none'; | |||
output( 'marginFill' ).style.width = '0'; | |||
} | |||
// Résout l'action | |||
function resolve() { | |||
var net = Math.max( 0, val( 'vecu' ) + val( 'approche' ) + val( 'metamorphe' ) + val( 'bonus' ) - val( 'malus' ) ); | |||
var seuil = Math.min( net * 10, 100 ); | |||
var jetEl = input( 'jet' ); | |||
var jetInput = jetEl.value.trim(); | |||
if ( jetInput === '' ) { | |||
jetEl.focus(); | |||
return; | |||
} | |||
var jetVal = parseInt( jetInput, 10 ); | |||
var isMaladresse = ( jetInput === '00' || jetInput === '000' || jetVal === 0 || jetVal === 100 ); | |||
if ( isMaladresse ) { | |||
jetVal = 100; | |||
} | |||
var panel = output( 'resultPanel' ); | |||
var verdict = output( 'resultVerdict' ); | |||
var detail = output( 'resultDetail' ); | |||
var marginText = output( 'resultMargin' ); | |||
var marginBar = output( 'marginBar' ); | |||
var marginFill = output( 'marginFill' ); | |||
var resetWrap = output( 'resetWrap' ); | |||
// Reset classes | |||
panel.className = 'neph-calc-result neph-visible'; | |||
marginBar.style.display = 'none'; | |||
marginFill.style.width = '0'; | |||
if ( isMaladresse ) { | |||
panel.className += ' neph-maladresse'; | |||
verdict.textContent = '\u2620 Maladresse !'; | |||
detail.textContent = 'Échec critique \u2014 le sort s\'acharne sur le Nephilim.'; | |||
marginText.textContent = ''; | |||
} else if ( jetVal <= seuil ) { | |||
// Réussite | |||
var dizaines = Math.floor( jetVal / 10 ); | |||
var bonusMarge = Math.max( 0, net - 10 ); | |||
var marge = dizaines + bonusMarge; | |||
panel.className += ' neph-success'; | |||
verdict.textContent = '\u2726 Réussite'; | |||
detail.textContent = 'Jet de ' + jetVal + ' \u2264 seuil de ' + seuil + '%'; | |||
var margeLabel = ''; | |||
if ( marge <= 1 ) { margeLabel = 'Réussite de justesse'; } | |||
else if ( marge <= 3 ) { margeLabel = 'Réussite convenable'; } | |||
else if ( marge <= 5 ) { margeLabel = 'Belle réussite'; } | |||
else if ( marge <= 7 ) { margeLabel = 'Réussite remarquable'; } | |||
else if ( marge <= 9 ) { margeLabel = 'Réussite mémorable'; } | |||
else { margeLabel = 'Réussite extraordinaire'; } | |||
var margeText = 'Marge de réussite : ' + marge; | |||
if ( bonusMarge > 0 ) { | |||
margeText += ' (' + dizaines + ' + ' + bonusMarge + ' bonus)'; | |||
} | |||
margeText += ' \u2014 ' + margeLabel; | |||
marginText.textContent = margeText; | |||
marginBar.style.display = 'block'; | |||
var pct = Math.min( 100, Math.round( ( marge / 15 ) * 100 ) ); | |||
setTimeout( function () { | |||
marginFill.style.width = pct + '%'; | |||
}, 50 ); | |||
} else { | |||
// Échec | |||
panel.className += ' neph-failure'; | |||
verdict.textContent = '\u2715 Échec'; | |||
detail.textContent = 'Jet de ' + jetVal + ' > seuil de ' + seuil + '%'; | |||
marginText.textContent = ''; | |||
} | |||
resetWrap.className = 'neph-calc-reset-wrap neph-visible'; | |||
} | |||
// Réinitialise tout | |||
function resetAll() { | |||
[ 'vecu', 'approche', 'metamorphe', 'bonus', 'malus' ].forEach( function ( name ) { | |||
var el = input( name ); | |||
if ( el ) { el.value = '0'; } | |||
} ); | |||
var jetEl = input( 'jet' ); | |||
if ( jetEl ) { jetEl.value = ''; } | |||
compute(); | |||
} | |||
// Attacher les événements aux selects | |||
var selects = calc.querySelectorAll( '.neph-calc-select' ); | |||
for ( var i = 0; i < selects.length; i++ ) { | |||
selects[ i ].addEventListener( 'change', compute ); | |||
} | |||
// Bouton Résoudre | |||
var btnResolve = calc.querySelector( '[data-neph-action="resolve"]' ); | |||
if ( btnResolve ) { | |||
btnResolve.addEventListener( 'click', resolve ); | |||
} | |||
// Bouton Réinitialiser | |||
var btnReset = calc.querySelector( '[data-neph-action="reset"]' ); | |||
if ( btnReset ) { | |||
btnReset.addEventListener( 'click', resetAll ); | |||
} | |||
// Entrée dans le champ dé → résoudre | |||
var jetEl = input( 'jet' ); | |||
if ( jetEl ) { | |||
jetEl.addEventListener( 'keydown', function ( e ) { | |||
if ( e.key === 'Enter' ) { | |||
resolve(); | |||
} | |||
} ); | |||
} | |||
}() ); | }() ); | ||