From 84b3dd3606d65cb1310593fd8e6653df08ad6eb6 Mon Sep 17 00:00:00 2001
From: perco
Date: Sat, 13 Jun 2026 19:18:28 +0200
Subject: [PATCH] v2.6.0 : page Tresors du Hall - listing equipement lu depuis
la BDD
Nouvel endpoint GET /api/reference/gear (db.gearAll()). treasures.js
recupere les equipements de la base de reference a chaque ouverture
(GEAR_DB) avec repli sur gear.js statique si injoignable (file://).
Les editions admin/sqlite-web sont desormais refletees sur le listing.
Intro de la section mise a jour (bonus phys + mag d'equipement).
Co-Authored-By: Claude Opus 4.8
---
README.md | 8 ++++++++
js/game.js | 2 +-
js/treasures.js | 49 ++++++++++++++++++++++++++++++++++++++++---------
server.js | 8 ++++++++
4 files changed, 57 insertions(+), 10 deletions(-)
diff --git a/README.md b/README.md
index e651a71..82c3df9 100644
--- a/README.md
+++ b/README.md
@@ -234,6 +234,14 @@ non affilié au jeu original de Mountyhall SARL.
## Versions
+- **2.6.0** (2026-06-13) — La page **« Trésors du Hall »** lit désormais les
+ équipements **en direct dans la base de référence** (BDD SQLite) au lieu des
+ valeurs figées du code : nouvel endpoint `GET /api/reference/gear`
+ (`db.gearAll()`), et l'encyclopédie récupère ces données à chaque ouverture
+ (repli automatique sur `gear.js` si la base est injoignable, ex. ouverture en
+ `file://`). Toute édition de l'équipement faite via l'admin / sqlite-web est
+ donc reflétée immédiatement sur le listing. L'intro de la section a aussi été
+ mise à jour (bonus physiques **et** magiques d'équipement).
- **2.5.1** (2026-06-13) — Correction des niveaux de potions : **le niveau 0
n'existe plus** (minimum 1). PufPuff passe de « 0 à 2 » à **« 1 à 3 »** (le
niveau 0 affichait des formules absurdes : `ATT −0 D3`, `VUE −(0+1)`,
diff --git a/js/game.js b/js/game.js
index d207183..8b57e9a 100644
--- a/js/game.js
+++ b/js/game.js
@@ -4,7 +4,7 @@
"use strict";
-const APP_VERSION = "2.5.1";
+const APP_VERSION = "2.6.0";
/* Alpha : maîtrise initiale haute pour les tests. Remettre 15 % / 15 % à la v1.0 officielle. */
const START_COMP_PCT = 90;
diff --git a/js/treasures.js b/js/treasures.js
index 23bdea9..282b0a7 100644
--- a/js/treasures.js
+++ b/js/treasures.js
@@ -82,18 +82,22 @@ function treasuresRender() {
}
html += "";
- const gearCount = Object.values(GEAR).reduce((n, list) => n + list.length, 0);
+ // Source des équipements : la base de référence (BDD SQLite, éditable) si elle
+ // a pu être chargée, sinon les valeurs statiques de gear.js (ex. hors-ligne).
+ const gearSource = GEAR_DB || GEAR;
+ const gearCount = Object.values(gearSource).reduce((n, list) => n + list.length, 0);
html += `⚔️ Équipement (${gearCount})
Six emplacements : ${Object.values(GEAR_SLOTS).map(s => s.label).join(", ")}.
- Tous les bonus d'équipement sont fixes et physiques : ATT/ESQ/DEG/REG
- s'ajoutent aux jets (jamais en dés), Armure physique/VUE/PV aussi, RM/MM en %.
- L'armure d'équipement réduit les dégâts physiques mais pas les dégâts magiques.
+ Les bonus d'équipement sont fixes (jamais en dés) et s'ajoutent toujours aux jets.
+ La plupart sont physiques ; certains objets portent aussi des bonus magiques
+ (ATT mag., DEG mag., Armure mag.), et les deux saveurs se cumulent. Les dégâts physiques
+ sont encaissés par l'armure totale, les dégâts magiques par la seule armure magique.
Une arme à 2 mains est incompatible avec un bouclier. S'équiper coûte 2 PA.
- Valeurs de base de la Mountypedia (sans templates) ; les objets puissants ne se trouvent
- qu'en profondeur.
`;
+ Valeurs lues dans la base de référence (modifiables côté admin) ; les objets
+ puissants ne se trouvent qu'en profondeur.
`;
for (const [slot, info] of Object.entries(GEAR_SLOTS)) {
html += `${info.emoji} ${info.label}s
`;
- for (const def of GEAR[slot]) {
+ for (const def of (gearSource[slot] || [])) {
const fx = [];
for (const [key, label, unit] of GEAR_MOD_LABELS) {
const v = def.mods[key];
@@ -122,12 +126,39 @@ function treasuresRender() {
let treasuresReturnTo = "create";
-function treasuresShow(from) {
+// Équipements de la base de référence (BDD), rechargés à chaque ouverture pour
+// refléter les éditions ; null tant qu'on n'a pas (ou pas pu) charger → repli
+// sur les valeurs statiques de gear.js.
+let GEAR_DB = null;
+async function loadGearReference() {
+ try {
+ const res = await fetch("api/reference/gear");
+ if (!res.ok) throw new Error("indisponible");
+ const rows = await res.json();
+ if (!Array.isArray(rows) || !rows.length) throw new Error("vide");
+ const bySlot = {};
+ for (const r of rows) {
+ const mods = {};
+ for (const [key] of GEAR_MOD_LABELS) mods[key] = r[key] || 0;
+ const staticDef = (GEAR[r.slot] || []).find(d => d.name === r.name);
+ (bySlot[r.slot] = bySlot[r.slot] || []).push({
+ emoji: r.emoji, name: r.name, tier: r.tier, twoHanded: !!r.twoHanded,
+ note: staticDef && staticDef.note, mods,
+ });
+ }
+ GEAR_DB = bySlot;
+ } catch {
+ GEAR_DB = null; // base injoignable (ex. ouverture en file://) → statique
+ }
+}
+
+async function treasuresShow(from) {
treasuresReturnTo = from;
document.getElementById("screen-" + from).classList.add("hidden");
document.getElementById("screen-treasures").classList.remove("hidden");
- treasuresRender();
document.getElementById("screen-treasures").scrollTop = 0;
+ await loadGearReference();
+ treasuresRender();
}
if (typeof document !== "undefined") {
diff --git a/server.js b/server.js
index 4b74df2..6a64da4 100644
--- a/server.js
+++ b/server.js
@@ -257,6 +257,14 @@ function handleMP(req, res, url) {
function handleAPI(req, res, url) {
if (url.pathname.startsWith("/api/mp/")) return handleMP(req, res, url);
+
+ // Valeurs de référence des équipements lues EN DIRECT dans la BDD SQLite :
+ // l'encyclopédie « Trésors du Hall » reflète ainsi les éditions de la base
+ // (DB Browser / sqlite-web) sans toucher au code.
+ if (req.method === "GET" && url.pathname === "/api/reference/gear") {
+ return sendJSON(res, 200, db.gearAll());
+ }
+
const idMatch = url.pathname.match(/^\/api\/levels\/([a-f0-9]{12})$/);
if (req.method === "GET" && url.pathname === "/api/levels") {