1.3.2 : un jet de talent raté sous 50 % progresse quand même de 1 %
Plafonds inchangés : 90 % pour les compétences, 80 % pour les sortilèges. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -37,7 +37,7 @@ lance directement une partie (utilisé pour les captures d'écran et les tests).
|
|||||||
| Tour de jeu | DLA de 12 h, 6 PA | DLA instantanée quand les PA sont épuisés (ou bouton « Passer la DLA »), 6 PA |
|
| Tour de jeu | DLA de 12 h, 6 PA | DLA instantanée quand les PA sont épuisés (ou bouton « Passer la DLA »), 6 PA |
|
||||||
| Caractéristiques | ATT/ESQ en D6, DEG/REG en D3, PV, Vue | Identique, profils de base officiels des 5 races (`MH_Rules/Races_*.php`) |
|
| Caractéristiques | ATT/ESQ en D6, DEG/REG en D3, PV, Vue | Identique, profils de base officiels des 5 races (`MH_Rules/Races_*.php`) |
|
||||||
| Combat | Somme ATT D6 vs somme ESQ D6, dégâts DEG D3 − armure | Identique, avec le détail des jets dans le journal |
|
| Combat | Somme ATT D6 vs somme ESQ D6, dégâts DEG D3 − armure | Identique, avec le détail des jets dans le journal |
|
||||||
| Talents | Compétence + sortilège réservés par race, 15 % de maîtrise initiale, jet D100 sous le %, progression à l'usage (+1D6 % < 50, +1D3 % < 75, +1 % ensuite), plafonds 90 %/80 %, échec = PA partiellement remboursés | Identique |
|
| Talents | Compétence + sortilège réservés par race, 15 % de maîtrise initiale, jet D100 sous le %, progression à l'usage (+1D6 % < 50, +1D3 % < 75, +1 % ensuite ; sous 50 %, un échec donne quand même +1 %), plafonds 90 % compétences / 80 % sortilèges, échec = PA partiellement remboursés | Identique |
|
||||||
| Magie | Seuil de Résistance basé sur MM vs RM, borné 10–90 % | Identique : jet de résistance des monstres → effets de moitié |
|
| Magie | Seuil de Résistance basé sur MM vs RM, borné 10–90 % | Identique : jet de résistance des monstres → effets de moitié |
|
||||||
| Progression | PX → PI, le N-ième achat coûte N × coût de base racial (table de Rules_3.php) | Identique : 16 PI de base (12 pour la caractéristique favorite), REG 30 (Darkling 22), Armure naturelle 30 pour tous, PV par tranche de 10 |
|
| Progression | PX → PI, le N-ième achat coûte N × coût de base racial (table de Rules_3.php) | Identique : 16 PI de base (12 pour la caractéristique favorite), REG 30 (Darkling 22), Armure naturelle 30 pour tous, PV par tranche de 10 |
|
||||||
| Niveaux | 10 × N PI pour atteindre le niveau N | Identique |
|
| Niveaux | 10 × N PI pour atteindre le niveau N | Identique |
|
||||||
@@ -142,6 +142,8 @@ non affilié au jeu original de Mountyhall SARL.
|
|||||||
|
|
||||||
## Versions
|
## Versions
|
||||||
|
|
||||||
|
- **1.3.2** (2026-06-11) — Sous 50 % de maîtrise, un jet de talent raté fait quand
|
||||||
|
même progresser de 1 % (plafonds inchangés : 90 % compétences, 80 % sortilèges).
|
||||||
- **1.3.1** (2026-06-11) — Coûts d'amélioration officiels de Rules_3.php (N-ième
|
- **1.3.1** (2026-06-11) — Coûts d'amélioration officiels de Rules_3.php (N-ième
|
||||||
achat = N × base, favorisée 12 PI, REG 30/22, PV par 10) et armure naturelle
|
achat = N × base, favorisée 12 PI, REG 30/22, PV par 10) et armure naturelle
|
||||||
en D3 achetable (30 PI pour toutes les races).
|
en D3 achetable (30 PI pour toutes les races).
|
||||||
|
|||||||
+8
-3
@@ -36,15 +36,19 @@ function resolveAttack(attacker, defender, opts = {}) {
|
|||||||
|
|
||||||
/* Maîtrise d'un talent (compétence ou sortilège) : jet D100 sous le pourcentage.
|
/* Maîtrise d'un talent (compétence ou sortilège) : jet D100 sous le pourcentage.
|
||||||
* En cas de réussite, la maîtrise progresse comme à MountyHall :
|
* En cas de réussite, la maîtrise progresse comme à MountyHall :
|
||||||
* +1D6 % jusqu'à 50 %, +1D3 % jusqu'à 75 %, +1 % ensuite, plafond `cap`. */
|
* +1D6 % jusqu'à 50 %, +1D3 % jusqu'à 75 %, +1 % ensuite.
|
||||||
|
* Sous 50 %, un échec fait quand même progresser de 1 % (on apprend de ses ratés).
|
||||||
|
* Plafond `cap` : 90 % pour les compétences, 80 % pour les sortilèges. */
|
||||||
function masteryRoll(talent, cap) {
|
function masteryRoll(talent, cap) {
|
||||||
const roll = 1 + Math.floor(Math.random() * 100);
|
const roll = 1 + Math.floor(Math.random() * 100);
|
||||||
const success = roll <= talent.pct;
|
const success = roll <= talent.pct;
|
||||||
let gain = 0;
|
let gain = 0;
|
||||||
if (success) {
|
if (success) {
|
||||||
gain = talent.pct < 50 ? rollDice(1, 6).total : talent.pct < 75 ? rollDice(1, 3).total : 1;
|
gain = talent.pct < 50 ? rollDice(1, 6).total : talent.pct < 75 ? rollDice(1, 3).total : 1;
|
||||||
talent.pct = Math.min(cap, talent.pct + gain);
|
} else if (talent.pct < 50) {
|
||||||
|
gain = 1;
|
||||||
}
|
}
|
||||||
|
talent.pct = Math.min(cap, talent.pct + gain);
|
||||||
return { roll, success, gain };
|
return { roll, success, gain };
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -516,7 +520,8 @@ function tryTalent(talent, cap, cost, label) {
|
|||||||
const r = masteryRoll(talent, cap);
|
const r = masteryRoll(talent, cap);
|
||||||
if (!r.success) {
|
if (!r.success) {
|
||||||
G.troll.pa += Math.floor(cost / 2);
|
G.troll.pa += Math.floor(cost / 2);
|
||||||
log(`${label} : échec (jet ${r.roll} > ${talent.pct} %). La moitié des PA est remboursée.`, "combat");
|
const learn = r.gain ? ` Tu apprends de ton raté : maîtrise +1 % → ${talent.pct} %.` : "";
|
||||||
|
log(`${label} : échec (jet ${r.roll}). La moitié des PA est remboursée.${learn}`, "combat");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
G.troll.pi += 1; G.troll.totalPI += 1;
|
G.troll.pi += 1; G.troll.totalPI += 1;
|
||||||
|
|||||||
@@ -36,6 +36,21 @@ for (let i = 0; i < 50; i++) {
|
|||||||
const sure = { pct: 100 };
|
const sure = { pct: 100 };
|
||||||
const r = g.masteryRoll(sure, 200);
|
const r = g.masteryRoll(sure, 200);
|
||||||
assert(r.success && sure.pct > 100, "succès garanti doit faire progresser");
|
assert(r.success && sure.pct > 100, "succès garanti doit faire progresser");
|
||||||
|
|
||||||
|
// Sous 50 %, même un échec rapporte +1 %
|
||||||
|
const novice = { pct: 0 }; // 0 % : échec garanti, mais on apprend quand même
|
||||||
|
const rf = g.masteryRoll(novice, 90);
|
||||||
|
assert(!rf.success && rf.gain === 1 && novice.pct === 1, "échec sous 50 % doit donner +1 %");
|
||||||
|
for (let i = 0; i < 500; i++) g.masteryRoll(novice, 90);
|
||||||
|
assert(novice.pct === 90, "la maîtrise doit finir au plafond à force d'essais : " + novice.pct);
|
||||||
|
|
||||||
|
// À 50 % ou plus, l'échec ne rapporte plus rien (vérifiable à pct=50 : jet 51-100 → échec sec)
|
||||||
|
const adept = { pct: 50 };
|
||||||
|
for (let i = 0; i < 300; i++) {
|
||||||
|
const r2 = g.masteryRoll(adept, 90);
|
||||||
|
if (!r2.success) assert(r2.gain === 0, "échec à 50 %+ ne doit rien rapporter");
|
||||||
|
adept.pct = 50; // on fige pour garder la condition du test
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sortilège : SR borné [10, 90]
|
// Sortilège : SR borné [10, 90]
|
||||||
|
|||||||
Reference in New Issue
Block a user