v2.11.0 : bestiaire etape 4 - les monstres du bestiaire apparaissent (2 modes)

game.js : buildBestiaryMonster(list, ageMults, ageNames, depth, x, y)
partage - tranche de niveau autour de la profondeur (bande +-3), age au
hasard dans [minAge,maxAge], multiplicateur applique, stats tirees dans
les plages, nom = prefixe d'age + nom, emoji de famille, attMag/degMag si
magic. makeMonster bascule dessus (repli ancien systeme si BESTIARY absent).
index.html charge js/bestiary.js (solo). mp.js spawnMonster -> bestiaire
(db.bestiaryAll + db.monsterAges, tunes admin) ; worldDepth borne a 45.
Editeur de niveaux + Behemoth gardent l'ancien systeme. Tests mp.js mis a
jour (anciens tests de spawn 7-monstres remplaces par tests bestiaire).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
perco
2026-06-15 19:28:59 +02:00
co-authored by Claude Opus 4.8
parent 618c0e6e76
commit 116ac7d063
5 changed files with 88 additions and 36 deletions
+7 -10
View File
@@ -24,6 +24,7 @@ const g = require("./js/game.js");
const p = require("./js/potions.js");
const sc = require("./js/scrolls.js");
const gearLib = require("./js/gear.js");
const bestiaryLib = require("./js/bestiary.js");
const db = require("./db.js");
/* ---------- Configuration par défaut (tout est réglable via l'admin) ---------- */
@@ -45,7 +46,7 @@ const DEFAULT_CONFIG = {
};
const CONFIG_BOUNDS = {
mapW: [24, 80], mapH: [16, 60], worldDepth: [1, 5],
mapW: [24, 80], mapH: [16, 60], worldDepth: [1, 45],
monsterDlaMinSec: [5, 3600], monsterDlaMaxSec: [5, 7200],
trollDlaSec: [5, 3600], pollSec: [1, 60],
monsterTarget: [0, 120], repopSec: [10, 3600],
@@ -158,16 +159,12 @@ function monsterDlaMs(config) {
function spawnMonster(world, now = Date.now()) {
const pos = randomFloor(world);
if (!pos) return null;
// même logique que makeMonster (pool par profondeur + gabarit d'âge),
// mais sur les types tunés par l'admin
// Bestiaire : on tire un monstre dont le niveau tombe dans la tranche de la
// profondeur, avec un âge au hasard. Données de la base (tunées admin) +
// multiplicateurs d'âge.
const depth = world.config.worldDepth;
const types = tunedMonsterTypes().filter(t => !t.boss);
const pool = types.filter(t => t.level <= depth + 1 && t.level >= Math.max(1, depth - 2));
const list = pool.length ? pool : types;
const type = list[Math.floor(Math.random() * list.length)];
const tplMax = Math.min(g.TEMPLATES.length - 1, depth - 1);
const tpl = g.TEMPLATES[Math.floor(Math.random() * (tplMax + 1))];
const m = g.applyTemplate(type, tpl, pos.x, pos.y);
const m = g.buildBestiaryMonster(db.bestiaryAll(), db.monsterAges().map(a => a.mult), bestiaryLib.AGE_NAMES, depth, pos.x, pos.y);
if (!m) return null;
m.id = world.nextId++;
m.dlaMs = Math.round(monsterDlaMs(world.config));
m.nextDla = now + m.dlaMs;