1.5.2 : bonus DEG/REG des potions en valeurs fixes, pas en dés

- Seules les notations « X D3 » de Mountypedia sont des jets de dés ;
  « DEG +X » / « REG +X » sont des bonus fixes ajoutés au résultat
- Concerne Bonne Bouffe, Fertilité, Corruption, DjhinTonik,
  Rhume/Grippe/Pneumonie, Biskot, KouleMann, Glacier
- Régénération bornée à 0 sous malus + affichage du signe corrigé

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
perco
2026-06-11 23:18:42 +02:00
co-authored by Claude Fable 5
parent 1df822189c
commit 9b3e2c8455
4 changed files with 35 additions and 19 deletions
+5
View File
@@ -152,6 +152,11 @@ non affilié au jeu original de Mountyhall SARL.
## Versions ## Versions
- **1.5.2** (2026-06-11) — Les bonus/malus DEG et REG des potions sont des valeurs
fixes ajoutées au jet, plus des dés supplémentaires (seules les notations « X D3 »
de Mountypedia sont des jets). Concerne Bonne Bouffe, Fertilité, Corruption,
DjhinTonik, Rhume/Grippe/Pneumonie, Biskot, KouleMann et Glacier. La régénération
ne peut plus être négative sous malus.
- **1.5.1** (2026-06-11) — Potions fidèles à Mountypedia : toutes les potions à jet - **1.5.1** (2026-06-11) — Potions fidèles à Mountypedia : toutes les potions à jet
utilisent des D3 (Sang de Toh Réroh et PufPuff étaient à tort en D6), et chaque utilisent des D3 (Sang de Toh Réroh et PufPuff étaient à tort en D6), et chaque
fiole ne fait qu'un seul jet — le même total s'applique à toutes les caracs fiole ne fait qu'un seul jet — le même total s'applique à toutes les caracs
+3 -3
View File
@@ -4,7 +4,7 @@
"use strict"; "use strict";
const APP_VERSION = "1.5.1"; const APP_VERSION = "1.5.2";
/* Alpha : maîtrise initiale haute pour les tests. Remettre 15 % / 15 % à la v1.0 officielle. */ /* Alpha : maîtrise initiale haute pour les tests. Remettre 15 % / 15 % à la v1.0 officielle. */
const START_COMP_PCT = 90; const START_COMP_PCT = 90;
@@ -1043,9 +1043,9 @@ function passDLA() {
const te = effTroll(t); const te = effTroll(t);
if (t.pv < t.pvMax && t.pv > 0) { if (t.pv < t.pvMax && t.pv > 0) {
const r = rollDice(te.reg, 3); const r = rollDice(te.reg, 3);
const heal = r.total + (te.regFlat || 0); const heal = Math.max(0, r.total + (te.regFlat || 0));
t.pv = Math.min(t.pvMax, t.pv + heal); t.pv = Math.min(t.pvMax, t.pv + heal);
const regLbl = te.regFlat ? `${te.reg}D3 +${te.regFlat}` : `${te.reg}D3`; const regLbl = te.regFlat ? `${te.reg}D3 ${te.regFlat > 0 ? "+" : ""}${te.regFlat}` : `${te.reg}D3`;
log(`💤 Tour n°${t.tour} (DLA n°${t.dla}) : tu régénères ${heal} PV (${regLbl}).`, "info"); log(`💤 Tour n°${t.tour} (DLA n°${t.dla}) : tu régénères ${heal} PV (${regLbl}).`, "info");
} else { } else {
log(`💤 Tour n°${t.tour} (DLA n°${t.dla}).`, "info"); log(`💤 Tour n°${t.tour} (DLA n°${t.dla}).`, "info");
+12 -12
View File
@@ -51,7 +51,7 @@ const POTION_DEFS = {
troll.pv = Math.min(troll.pvMax, troll.pv + heal); troll.pv = Math.min(troll.pvMax, troll.pv + heal);
return { return {
log: `Biskot : +2 REG et +${heal} PV (${heal} = 2D3) pendant 2 tours.`, log: `Biskot : +2 REG et +${heal} PV (${heal} = 2D3) pendant 2 tours.`,
effects: [makeEffect("Biskot", "🍪", 2, { reg: 2, biskot: true })], effects: [makeEffect("Biskot", "🍪", 2, { regFlat: 2, biskot: true })],
}; };
}, },
}, },
@@ -72,10 +72,10 @@ const POTION_DEFS = {
duration: 5, duration: 5,
rollPower: () => potRand(3, 7), rollPower: () => potRand(3, 7),
build(_t, p) { build(_t, p) {
const lines = [`DEG +${p} dés`, `REG +${p} dés`]; const lines = [`DEG +${p}`, `REG +${p}`];
return { return {
log: `Elixir de Bonne Bouffe : ${lines.join(", ")} pendant 5 tours.`, log: `Elixir de Bonne Bouffe : ${lines.join(", ")} pendant 5 tours.`,
effects: [makeEffect("Elixir de Bonne Bouffe", "🍖", 5, { deg: p, reg: p }, lines)], effects: [makeEffect("Elixir de Bonne Bouffe", "🍖", 5, { degFlat: p, regFlat: p }, lines)],
}; };
}, },
}, },
@@ -92,7 +92,7 @@ const POTION_DEFS = {
return { return {
log: `Elixir de Corruption : ${lines.join(", ")} ; RM ${y} %, MM ${z} % (5 tours).`, log: `Elixir de Corruption : ${lines.join(", ")} ; RM ${y} %, MM ${z} % (5 tours).`,
effects: [makeEffect("Elixir de Corruption", "☠️", 5, { effects: [makeEffect("Elixir de Corruption", "☠️", 5, {
attFlat: attR.value, esqFlat: esqR.value, deg: p, reg: -p, vue: -p, armor: p, rmPct: -y, mmPct: -z, attFlat: attR.value, esqFlat: esqR.value, degFlat: p, regFlat: -p, vue: -p, armor: p, rmPct: -y, mmPct: -z,
}, lines)], }, lines)],
}; };
}, },
@@ -106,7 +106,7 @@ const POTION_DEFS = {
const lines = [`ATT ${attR.line}`, `DEG +${p}`]; const lines = [`ATT ${attR.line}`, `DEG +${p}`];
return { return {
log: `Elixir de Fertilité : ${lines.join(", ")} pendant 5 tours.`, log: `Elixir de Fertilité : ${lines.join(", ")} pendant 5 tours.`,
effects: [makeEffect("Elixir de Fertilité", "🌱", 5, { attFlat: attR.value, deg: p }, lines)], effects: [makeEffect("Elixir de Fertilité", "🌱", 5, { attFlat: attR.value, degFlat: p }, lines)],
}; };
}, },
}, },
@@ -144,7 +144,7 @@ const POTION_DEFS = {
troll.pv = Math.min(troll.pvMax, troll.pv + heal); troll.pv = Math.min(troll.pvMax, troll.pv + heal);
return { return {
log: `Essence de KouleMann : REG +${p}, VUE +${p}, +${heal} PV (${dice}D3) pendant 4 tours.`, log: `Essence de KouleMann : REG +${p}, VUE +${p}, +${heal} PV (${dice}D3) pendant 4 tours.`,
effects: [makeEffect("Essence de KouleMann", "🎵", 4, { reg: p, vue: p })], effects: [makeEffect("Essence de KouleMann", "🎵", 4, { regFlat: p, vue: p })],
}; };
}, },
}, },
@@ -155,10 +155,10 @@ const POTION_DEFS = {
build(troll, p, rollDice) { build(troll, p, rollDice) {
const heal = rollDice(2, 3).total; const heal = rollDice(2, 3).total;
troll.pv = Math.min(troll.pvMax, troll.pv + heal); troll.pv = Math.min(troll.pvMax, troll.pv + heal);
const lines = [`DEG +${p} dés`, `REG +${p} dés`, `PV +${heal} (2D3)`]; const lines = [`DEG +${p}`, `REG +${p}`, `PV +${heal} (2D3)`];
return { return {
log: `Extrait de DjhinTonik : ${lines.join(", ")} pendant 4 tours.`, log: `Extrait de DjhinTonik : ${lines.join(", ")} pendant 4 tours.`,
effects: [makeEffect("Extrait de DjhinTonik", "🧞", 4, { deg: p, reg: p }, lines)], effects: [makeEffect("Extrait de DjhinTonik", "🧞", 4, { degFlat: p, regFlat: p }, lines)],
}; };
}, },
}, },
@@ -169,7 +169,7 @@ const POTION_DEFS = {
build(_t, p) { build(_t, p) {
return { return {
log: `Extrait du Glacier : REG +${p}, Armure +${p} pendant 5 tours.`, log: `Extrait du Glacier : REG +${p}, Armure +${p} pendant 5 tours.`,
effects: [makeEffect("Extrait du Glacier", "🧊", 5, { reg: p, armor: p })], effects: [makeEffect("Extrait du Glacier", "🧊", 5, { regFlat: p, armor: p })],
}; };
}, },
}, },
@@ -197,7 +197,7 @@ const POTION_DEFS = {
return { return {
log: `Rhume en Conserve : ${lines.join(", ")} pendant 3 tours.`, log: `Rhume en Conserve : ${lines.join(", ")} pendant 3 tours.`,
effects: [makeEffect("Rhume en Conserve", "🤧", 3, { effects: [makeEffect("Rhume en Conserve", "🤧", 3, {
attFlat: attR.value, esqFlat: esqR.value, deg: -p, reg: -p, attFlat: attR.value, esqFlat: esqR.value, degFlat: -p, regFlat: -p,
}, lines)], }, lines)],
}; };
}, },
@@ -214,7 +214,7 @@ const POTION_DEFS = {
return { return {
log: `Grippe en Conserve : ${lines.join(", ")} pendant 3 tours.`, log: `Grippe en Conserve : ${lines.join(", ")} pendant 3 tours.`,
effects: [makeEffect("Grippe en Conserve", "🤒", 3, { effects: [makeEffect("Grippe en Conserve", "🤒", 3, {
attFlat: attR.value, esqFlat: esqR.value, deg: -p, reg: -p, attFlat: attR.value, esqFlat: esqR.value, degFlat: -p, regFlat: -p,
}, lines)], }, lines)],
}; };
}, },
@@ -231,7 +231,7 @@ const POTION_DEFS = {
return { return {
log: `Pneumonie en Conserve : ${lines.join(", ")} pendant 3 tours.`, log: `Pneumonie en Conserve : ${lines.join(", ")} pendant 3 tours.`,
effects: [makeEffect("Pneumonie en Conserve", "😷", 3, { effects: [makeEffect("Pneumonie en Conserve", "😷", 3, {
attFlat: attR.value, esqFlat: esqR.value, deg: -5, reg: -5, attFlat: attR.value, esqFlat: esqR.value, degFlat: -5, regFlat: -5,
}, lines)], }, lines)],
}; };
}, },
+15 -4
View File
@@ -165,7 +165,9 @@ assert.strictEqual(p.corruptionYZ(3).y, 0);
const item = p.makePotionItem("bonneBouffe", 5); const item = p.makePotionItem("bonneBouffe", 5);
p.drinkPotion(troll, item, g.rollDice, () => {}); p.drinkPotion(troll, item, g.rollDice, () => {});
assert.strictEqual(troll.potionEffects.length, 1); assert.strictEqual(troll.potionEffects.length, 1);
assert.strictEqual(p.effTroll(troll).deg, 8); assert.strictEqual(p.effTroll(troll).deg, 3, "Bonne Bouffe n'ajoute pas de dés de DEG");
assert.strictEqual(p.effTroll(troll).degFlat, 5, "Bonne Bouffe : DEG +5 fixe");
assert.strictEqual(p.effTroll(troll).regFlat, 5, "Bonne Bouffe : REG +5 fixe");
assert.strictEqual(p.effTroll(troll).attFlat, 0, "Bonne Bouffe ne modifie pas ATT"); assert.strictEqual(p.effTroll(troll).attFlat, 0, "Bonne Bouffe ne modifie pas ATT");
const fixedRoll = () => ({ total: 12, rolls: [4, 4, 4] }); const fixedRoll = () => ({ total: 12, rolls: [4, 4, 4] });
const t2 = { att: 3, esq: 3, deg: 3, reg: 1, vue: 3, armor: 0, armorDice: 0, degBonus: 0, pvMax: 30, pv: 20, potionEffects: [], blockCamoTurns: 0, tour: 1 }; const t2 = { att: 3, esq: 3, deg: 3, reg: 1, vue: 3, armor: 0, armorDice: 0, degBonus: 0, pvMax: 30, pv: 20, potionEffects: [], blockCamoTurns: 0, tour: 1 };
@@ -193,12 +195,21 @@ assert.strictEqual(p.corruptionYZ(3).y, 0);
assert.strictEqual(p.effTroll(troll).deg, 3); assert.strictEqual(p.effTroll(troll).deg, 3);
assert.strictEqual(p.effTroll(troll).attFlat, 0); assert.strictEqual(p.effTroll(troll).attFlat, 0);
} }
// DjhinTonik : +X dés de DEG et REG (pas un jet D3) // DjhinTonik : DEG +X et REG +X fixes (pas des dés en plus)
{ {
const t = { att: 3, esq: 3, deg: 4, reg: 1, vue: 3, armor: 0, armorDice: 0, degBonus: 0, pvMax: 30, pv: 20, potionEffects: [], blockCamoTurns: 0, tour: 1 }; const t = { att: 3, esq: 3, deg: 4, reg: 1, vue: 3, armor: 0, armorDice: 0, degBonus: 0, pvMax: 30, pv: 20, potionEffects: [], blockCamoTurns: 0, tour: 1 };
p.drinkPotion(t, p.makePotionItem("djhinTonik", 5), g.rollDice, () => {}); p.drinkPotion(t, p.makePotionItem("djhinTonik", 5), g.rollDice, () => {});
assert.strictEqual(p.effTroll(t).deg, 9, "DEG 4 + 5 dés potion = 9D3"); assert.strictEqual(p.effTroll(t).deg, 4, "DEG reste 4D3");
assert.strictEqual(p.effTroll(t).reg, 6, "REG 1 + 5 dés potion = 6D3"); assert.strictEqual(p.effTroll(t).degFlat, 5, "DEG +5 fixe");
assert.strictEqual(p.effTroll(t).reg, 1, "REG reste 1D3");
assert.strictEqual(p.effTroll(t).regFlat, 5, "REG +5 fixe");
}
// Fertilité : ATT en jet D3 partagé, DEG +X fixe
{
const t = { att: 3, esq: 3, deg: 4, reg: 1, vue: 3, armor: 0, armorDice: 0, degBonus: 0, pvMax: 30, pv: 20, potionEffects: [], blockCamoTurns: 0, tour: 1 };
p.drinkPotion(t, p.makePotionItem("fertilite", 6), g.rollDice, () => {});
assert.strictEqual(p.effTroll(t).deg, 4, "Fertilité n'ajoute pas de dés de DEG");
assert.strictEqual(p.effTroll(t).degFlat, 6, "Fertilité : DEG +6 fixe");
} }
// Jet d'attaque : bonus potion ajouté au total des D6 // Jet d'attaque : bonus potion ajouté au total des D6
{ {