From 1a5d2c73172ee0e8e96574f5cb225428df26dbde Mon Sep 17 00:00:00 2001 From: perco Date: Fri, 12 Jun 2026 10:53:16 +0200 Subject: [PATCH] =?UTF-8?q?2.0.0=20:=20multijoueur=20=E2=80=94=20monde=20p?= =?UTF-8?q?artag=C3=A9=20persistant,=20DLA=20param=C3=A9trables=20par=20mo?= =?UTF-8?q?nstre,=20admin=20=C3=A0=20chaud?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- Dockerfile | 2 +- README.md | 63 +++- admin.html | 190 +++++++++++ css/style.css | 31 ++ index.html | 46 +++ js/game.js | 7 +- js/mp-client.js | 343 ++++++++++++++++++++ mp.js | 812 ++++++++++++++++++++++++++++++++++++++++++++++++ server.js | 120 ++++++- test/mp.js | 236 ++++++++++++++ 10 files changed, 1839 insertions(+), 11 deletions(-) create mode 100644 admin.html create mode 100644 js/mp-client.js create mode 100644 mp.js create mode 100644 test/mp.js diff --git a/Dockerfile b/Dockerfile index 03e4238..74102d0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM node:22-alpine WORKDIR /app -COPY index.html server.js ./ +COPY index.html admin.html server.js mp.js ./ COPY css ./css COPY js ./js COPY img ./img diff --git a/README.md b/README.md index 75dc339..75e9c10 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,50 @@ Gobelin, Champignon Vénéneux, Araignée Géante, Gargouille, Momie, Sorcière, Pierre — déclinés en gabarits *Jeune / Vieux / Ancien / Mythique* selon la profondeur, et le **Béhémoth** comme boss final à la profondeur −5. +## Monde partagé (multijoueur) + +Depuis l'accueil : **🧌🧌 Monde partagé**. Un monde souterrain persistant et +commun à tous les joueurs, autoritaire côté serveur (`mp.js`) : + +- **Le monde vit en continu**, joueurs connectés ou non : chaque monstre a sa + propre **DLA** (période tirée dans une fourchette paramétrable) et agit à son + échéance — il erre, ou attaque le troll à portée de Vue. Les monstres ne + s'attaquent jamais entre eux. La population se repeuple automatiquement. +- **Chaque troll a 6 PA**, rechargés à sa DLA personnelle (paramétrable). Toutes + les actions du solo sont disponibles : déplacement, attaque, compétence et + sortilège de race, potions, parchemins, équipement, entraînement en PI. +- **À MountyHall on ne meurt jamais vraiment** : un troll terrassé réapparaît + après un délai paramétrable, PV pleins, en conservant tout son avoir. +- L'identité du troll (id + clé secrète) est gardée par le navigateur + (localStorage) : on retrouve son personnage d'une session à l'autre. +- Le client se rafraîchit par **polling** (intervalle conseillé par le serveur, + paramétrable) ; les autres trolls visibles apparaissent en bleu avec leur nom, + les camouflés sont invisibles. +- Persistance dans `WORLD_FILE` (défaut `/data/world.json`), sauvegarde + périodique et au SIGTERM. + +### Administration (`admin.html`) + +Page protégée par token (`MP_ADMIN_TOKEN`, sinon généré au premier démarrage +dans `/data/admin-token.txt` et affiché dans les logs). Tous les réglages sont +**appliqués à chaud** : DLA des monstres (min/max — les échéances déjà planifiées +sont re-tirées si besoin), DLA des trolls, intervalle de rafraîchissement client, +population de monstres et de trésors, délai de réapparition, profondeur du monde +(puissance des monstres), taille de carte (à la prochaine régénération), limite +de trolls. Plus : vue d'ensemble (trolls avec dernière activité, monstres avec +leur DLA individuelle et leur prochaine action), derniers échos du monde, et +bouton « Régénérer le monde » (trolls conservés et replacés). + +### API multijoueur + +- `POST /api/mp/join` `{name, race}` → `{id, secret, state}` +- `GET /api/mp/state?id=&secret=` → état visible (vue du troll) +- `POST /api/mp/action` `{id, secret, action}` — `move`, `attack`, `comp`, + `sort`, `pickup`, `use`, `train` +- `GET /api/mp/info` → compteurs publics (trolls en ligne…) +- `GET /api/mp/admin` · `PUT /api/mp/admin/config` · `POST /api/mp/admin/reset` + (header `X-Admin-Token`) + ## Éditeur de niveaux & partage Depuis l'écran d'accueil : **🛠️ Éditeur de niveaux**. @@ -139,11 +183,14 @@ Stockage : `/data/levels.json` dans le volume `/opt/container/mountycrawl/data`. ## Tests ```bash -node test/smoke.js +node test/smoke.js # cœur des règles : dés, combat, armures, talents, cavernes… +node test/mp.js # moteur multijoueur : DLA, tick, actions, admin, persistance ``` -Vérifie les dés, la résolution de combat, le Seuil de Résistance, les coûts -d'amélioration, les niveaux, la connexité des cavernes générées et le bestiaire. +Vérifie les dés, la résolution de combat (armures physique/magique), le Seuil de +Résistance, les coûts d'amélioration, les niveaux, la connexité des cavernes +générées, le bestiaire, et le monde partagé (DLA des monstres, mort/réapparition, +visibilité, réglages admin bornés, sauvegarde/rechargement). ## Sources @@ -154,6 +201,16 @@ non affilié au jeu original de Mountyhall SARL. ## Versions +- **2.0.0** (2026-06-12) — **Multijoueur** : monde souterrain partagé et persistant, + autoritaire côté serveur (`mp.js`, node pur). Le monde vit en continu : chaque + monstre agit à sa propre DLA paramétrable (fourchette min/max), erre ou attaque + les trolls à portée, repeuplement automatique ; jamais de combat monstre contre + monstre. Trolls : 6 PA rechargés à leur DLA personnelle, toutes les actions du + solo (talents de race compris), réapparition après la mort, identité conservée + en localStorage. Client par polling (intervalle paramétrable), autres trolls + visibles (sauf camouflés). Page `admin.html` protégée par token : tous les + réglages à chaud + tableau de bord (trolls, monstres et leurs DLA, échos du + monde, régénération du monde). Tests `test/mp.js`. - **1.9.0** (2026-06-12) — Bonus/malus **physiques** et **magiques** distincts, comme à MountyHall : l'équipement donne des bonus physiques (exceptions à venir), les potions et parchemins des bonus magiques. L'armure est scindée en **armure diff --git a/admin.html b/admin.html new file mode 100644 index 0000000..4e21a93 --- /dev/null +++ b/admin.html @@ -0,0 +1,190 @@ + + + + + +MountyCrawl — Administration du Monde Souterrain + + + + + +
+

⚙️ Administration du Monde Souterrain

+ +
+

Token admin

+

Le token est affiché dans les logs du serveur au démarrage + (ou dans /data/admin-token.txt), ou défini par la variable + d'environnement MP_ADMIN_TOKEN.

+ + +
+
+ + +
+ + + + diff --git a/css/style.css b/css/style.css index 1cbf23a..d2fcf61 100644 --- a/css/style.css +++ b/css/style.css @@ -513,6 +513,37 @@ header h1 { font-size: 1.3em; color: #FFFFCC; text-shadow: 1px 1px 2px #000; } #log .l-good { color: #008040; } #log .l-info { color: #666666; } +/* ---------- Multijoueur : journaux et statut ---------- */ +#mp-log, #mp-world-log { + flex: 1 1 50%; + background: #FFFFEE url("../img/mh/tableau1.jpg"); + border: 1px solid #000000; + padding: 8px 12px; + height: 190px; + overflow-y: auto; + font-size: .85em; + font-family: monospace; + line-height: 1.45; + box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.3); +} +#mp-world-log .cd-header { + color: #000000; + font-weight: bold; + border-bottom: 1px solid #000000; + margin-bottom: 6px; + position: sticky; + top: 0; + background: #EBEDAB url("../img/mh/tableau2.jpg"); + padding: 1px 4px; +} +#mp-log .l-combat, #mp-world-log .l-combat { color: #993300; } +#mp-log .l-bad, #mp-world-log .l-bad { color: #CC0000; } +#mp-log .l-good, #mp-world-log .l-good { color: #008040; } +#mp-log .l-info, #mp-world-log .l-info { color: #666666; } +#mp-status { font-weight: bold; } +#mp-effects .eq-line, #mp-effects .fx-empty { font-size: .88em; color: #333300; } +#screen-mp #panel-center { overflow: auto; } + /* ---------- Trésors du Hall (potions, parchemins & équipement) ---------- */ #treasures-body { max-width: 1100px; diff --git a/index.html b/index.html index e8c70bf..0d52eea 100644 --- a/index.html +++ b/index.html @@ -19,6 +19,7 @@
+ + + +