v2.13.0 : RM%/MM% d'equipement en plages (min/max) tirees au drop

db.js : GEAR_KEYS += rmPctMin, mmPctMin (les rmPct/mmPct existants = max) ;
vanillaGear : min defaut = la valeur (pas de plage) ; migration ALTER gear
ADD COLUMN rmPctMin/mmPctMin + UPDATE min=valeur. mp.js applyGearTuning :
mods construits hors cles Min, RM%/MM% tires au hasard dans [min,max] a la
creation (comme les potions). treasures.js : encyclopedie affiche la plage
'min a max %' (rmPctMin/mmPctMin portes sur le def). admin GEAR_LABELS :
RM%/MM% min + max. Solo : valeurs fixes (la plage vit dans la base / monde
partage).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
perco
2026-06-17 11:35:43 +02:00
co-authored by Claude Opus 4.8
parent dc3685de11
commit f31ac75e1d
6 changed files with 46 additions and 8 deletions
+16 -5
View File
@@ -30,7 +30,9 @@ const BESTIARY_TXT_KEYS = ["family", "speed", "capacities", "blason", "gender"];
const BESTIARY_KEYS = [...BESTIARY_INT_KEYS, ...BESTIARY_TXT_KEYS]; // hors `name` (clé)
const MONSTER_KEYS = ["level", "att", "attMag", "esq", "deg", "degMag", "pv", "armor", "armorMag", "vue"];
const GEAR_KEYS = ["att", "attMag", "esq", "deg", "degMag", "reg", "arm", "armMag", "vue", "pv", "rmPct", "mmPct"];
// rmPct/mmPct sont les MAX ; rmPctMin/mmPctMin les MIN → à la création d'un objet
// du monde partagé, RM% et MM% sont tirés au hasard dans leur plage (cf. mp.js).
const GEAR_KEYS = ["att", "attMag", "esq", "deg", "degMag", "reg", "arm", "armMag", "vue", "pv", "rmPct", "rmPctMin", "mmPct", "mmPctMin"];
/* Templates de drop façon MountyHall : des suffixes (« de l'Aigle », « des
* Mages »…) ajoutés aléatoirement à l'équipement qui tombe, selon une proba
@@ -85,10 +87,14 @@ function vanillaMonsters() {
}
function vanillaGear() {
return Object.entries(gearLib.GEAR).flatMap(([slot, list]) => list.map(def => ({
slot, name: def.name, emoji: def.emoji, tier: def.tier, twoHanded: !!def.twoHanded,
...Object.fromEntries(GEAR_KEYS.map(k => [k, def.mods[k] || 0])),
})));
return Object.entries(gearLib.GEAR).flatMap(([slot, list]) => list.map(def => {
const row = { slot, name: def.name, emoji: def.emoji, tier: def.tier, twoHanded: !!def.twoHanded };
for (const k of GEAR_KEYS) row[k] = def.mods[k] || 0;
// par défaut, min = la valeur (pas de plage tant que l'admin ne l'abaisse pas)
row.rmPctMin = def.mods.rmPct || 0;
row.mmPctMin = def.mods.mmPct || 0;
return row;
}));
}
function vanillaTemplates() {
@@ -150,6 +156,11 @@ function init(file = ":memory:") {
// Migration : la colonne `gender` du bestiaire a été ajoutée après coup → on
// l'ajoute aux bases déjà créées AVANT tout INSERT/UPDATE qui la référence.
try { DB.exec("ALTER TABLE bestiary ADD COLUMN gender TEXT"); } catch { /* déjà là */ }
// Migration : RM%/MM% min de l'équipement (les valeurs existantes = max).
try { DB.exec("ALTER TABLE gear ADD COLUMN rmPctMin INTEGER"); } catch {}
try { DB.exec("ALTER TABLE gear ADD COLUMN mmPctMin INTEGER"); } catch {}
DB.exec("UPDATE gear SET rmPctMin = rmPct WHERE rmPctMin IS NULL");
DB.exec("UPDATE gear SET mmPctMin = mmPct WHERE mmPctMin IS NULL");
const insM = DB.prepare(`INSERT OR IGNORE INTO monsters
(name, emoji, boss, isStatic, ${MONSTER_KEYS.join(", ")})
VALUES (?, ?, ?, ?, ${MONSTER_KEYS.map(() => "?").join(", ")})`);