1.7.0 : équipement Mountypedia — 6 emplacements, 55 objets

- js/gear.js : Arme (12 + 3 à deux mains), Armure (13), Casque (9),
  Bouclier (5), Talisman (7), Bottes (6), valeurs de base officielles
- ATT/ESQ/DEG/REG en dés, Armure/VUE/PV fixes, RM/MM en % (spellMM/spellRM)
- equipGear : échange par emplacement, exclusion 2 mains/bouclier,
  PV max dynamique, gearMods intégré à effTroll
- Drops par tier ≤ profondeur + 1, butin éditeur par emplacement,
  rétrocompat des specs weapon/armor des niveaux publiés
- Page Trésors : section Équipement (6 sous-sections)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
perco
2026-06-11 23:56:30 +02:00
co-authored by Claude Fable 5
parent 6039497e72
commit 2f21f867a5
10 changed files with 314 additions and 51 deletions
+39 -1
View File
@@ -260,9 +260,47 @@ assert.strictEqual(p.corruptionYZ(3).y, 0);
assert(r.attRoll > 12, "attRoll = somme des D6 + bonus potion");
assert(r.attRoll <= 12 + 18, "attRoll borné (3D6 max 18 + 12)");
}
// Équipement Mountypedia (6 emplacements) + rétrocompat des anciens specs
const gear = require("../js/gear.js");
const sword = g.itemFromSpec({ x: 1, y: 1, kind: "weapon", idx: 2 });
assert.strictEqual(sword.kind, "gear");
assert(sword.bonus > 0);
assert.strictEqual(sword.slot, "arme");
assert.strictEqual(sword.name, "Épée Longue", "ancien idx 2 → Épée Longue");
assert.strictEqual(g.itemFromSpec({ x: 1, y: 1, kind: "armor", idx: 0 }).name, "Armure de cuir");
{
const t = { 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, bag: [],
equip: { arme: null, armure: null, casque: null, bouclier: null, talisman: null, bottes: null }, gearMods: null };
g.equipGear(t, gear.gearItemByName("arme", "Gourdin")); // att +2, esq 2, deg +5
g.equipGear(t, gear.gearItemByName("armure", "Armure de cuir")); // esq +3, arm +4, rm +40 %
let e = p.effTroll(t);
assert.strictEqual(e.att, 5, "Gourdin : ATT 3 + 2 dés");
assert.strictEqual(e.deg, 8, "Gourdin : DEG 3 + 5 dés");
assert.strictEqual(e.esq, 4, "ESQ 3 2 + 3");
assert.strictEqual(e.armor, 4, "Armure de cuir : armure +4");
assert.strictEqual(e.rmPct, 40, "Armure de cuir : RM +40 %");
// PV max d'équipement
g.equipGear(t, gear.gearItemByName("bouclier", "Rondache en Bois")); // pv +5
assert.strictEqual(t.pvMax, 35, "Rondache : PV max +5");
// arme à 2 mains : le bouclier retourne au sac
g.equipGear(t, gear.gearItemByName("arme", "Hallebarde"));
assert.strictEqual(t.equip.bouclier, null, "Hallebarde : bouclier déséquipé");
assert(t.bag.some(i => i.name === "Rondache en Bois"), "le bouclier est dans le sac");
assert.strictEqual(t.pvMax, 30, "PV max retombé après déséquipement de la Rondache");
assert(t.bag.some(i => i.name === "Gourdin"), "l'ancienne arme est dans le sac");
e = p.effTroll(t);
assert.strictEqual(e.att, 1, "Hallebarde : ATT 3 5 → min 1");
assert.strictEqual(e.deg, 15, "Hallebarde : DEG 3 + 12");
// rééquiper un bouclier range l'arme à 2 mains
g.equipGear(t, gear.gearItemByName("bouclier", "Targe"));
assert.strictEqual(t.equip.arme, null, "Targe : la Hallebarde est rangée");
// tirage par profondeur : tier ≤ depth + 1
for (let i = 0; i < 100; i++) {
const it = gear.makeRandomGear(1);
const def = gear.GEAR[it.slot][it.gearIdx];
assert(def.tier <= 2, "profondeur 1 : tier ≤ 2 (reçu " + def.tier + ")");
}
}
// Validation serveur des niveaux
const srv = require("../server.js");