diff --git a/README.md b/README.md index 9eb83d8..73c94b0 100644 --- a/README.md +++ b/README.md @@ -152,6 +152,11 @@ non affilié au jeu original de Mountyhall SARL. ## 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 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 diff --git a/js/game.js b/js/game.js index ade405a..f16e215 100644 --- a/js/game.js +++ b/js/game.js @@ -4,7 +4,7 @@ "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. */ const START_COMP_PCT = 90; @@ -1043,9 +1043,9 @@ function passDLA() { const te = effTroll(t); if (t.pv < t.pvMax && t.pv > 0) { 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); - 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"); } else { log(`💤 Tour n°${t.tour} (DLA n°${t.dla}).`, "info"); diff --git a/js/potions.js b/js/potions.js index dd1b0b0..a71e981 100644 --- a/js/potions.js +++ b/js/potions.js @@ -51,7 +51,7 @@ const POTION_DEFS = { troll.pv = Math.min(troll.pvMax, troll.pv + heal); return { 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, rollPower: () => potRand(3, 7), build(_t, p) { - const lines = [`DEG +${p} dés`, `REG +${p} dés`]; + const lines = [`DEG +${p}`, `REG +${p}`]; return { 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 { log: `Elixir de Corruption : ${lines.join(", ")} ; RM −${y} %, MM −${z} % (5 tours).`, 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)], }; }, @@ -106,7 +106,7 @@ const POTION_DEFS = { const lines = [`ATT ${attR.line}`, `DEG +${p}`]; return { 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); return { 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) { const heal = rollDice(2, 3).total; 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 { 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) { return { 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 { log: `Rhume en Conserve : ${lines.join(", ")} pendant 3 tours.`, 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)], }; }, @@ -214,7 +214,7 @@ const POTION_DEFS = { return { log: `Grippe en Conserve : ${lines.join(", ")} pendant 3 tours.`, 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)], }; }, @@ -231,7 +231,7 @@ const POTION_DEFS = { return { log: `Pneumonie en Conserve : ${lines.join(", ")} pendant 3 tours.`, 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)], }; }, diff --git a/test/smoke.js b/test/smoke.js index e2327b5..2998c04 100644 --- a/test/smoke.js +++ b/test/smoke.js @@ -165,7 +165,9 @@ assert.strictEqual(p.corruptionYZ(3).y, 0); const item = p.makePotionItem("bonneBouffe", 5); p.drinkPotion(troll, item, g.rollDice, () => {}); 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"); 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 }; @@ -193,12 +195,21 @@ assert.strictEqual(p.corruptionYZ(3).y, 0); assert.strictEqual(p.effTroll(troll).deg, 3); 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 }; 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).reg, 6, "REG 1 + 5 dés potion = 6D3"); + assert.strictEqual(p.effTroll(t).deg, 4, "DEG reste 4D3"); + 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 {