Files
percoandClaude Opus 4.8 f31ac75e1d 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>
2026-06-17 11:35:43 +02:00

548 lines
38 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🧌 MountyCrawl — Le Monde Souterrain
Un roguelike navigateur en hommage à [MountyHall](https://www.mountyhall.com), la Terre des Trõlls.
Tu incarnes un Trõll qui descend dans le Monde Souterrain à la recherche de monstres,
de trésors et de PX — jusqu'au Béhémoth qui rôde à la profondeur 5.
100 % vanilla HTML/CSS/JS, aucune dépendance, aucun build. Ouvrir `index.html` et jouer.
## Jouer
🎮 **https://mountycrawl.nas.percolouco.com** (déployé via Traefik, compose dans
`/opt/container/mountycrawl`, image node:22-alpine construite depuis ce repo).
En local :
```bash
PORT=8080 LEVELS_FILE=/tmp/levels.json node server.js
# → http://localhost:8080
```
(Le jeu solo fonctionne aussi en ouvrant `index.html` directement ; seuls l'éditeur
« Publier » et les niveaux communautaires ont besoin du serveur.)
Après une modification, redéployer avec :
```bash
cd /opt/container/mountycrawl && docker compose up -d --build
```
Paramètres d'URL pratiques : `index.html?autostart=1&race=Durakuir&name=Grosbill`
lance directement une partie (utilisé pour les captures d'écran et les tests).
## Mécaniques reprises de MountyHall
| Mécanique | Dans MountyHall | Dans MountyCrawl |
|---|---|---|
| Tour de jeu | DLA de 12 h, 6 PA | DLA instantanée quand les PA sont épuisés (ou bouton « Passer la DLA »), 6 PA |
| Caractéristiques | ATT/ESQ en D6, DEG/REG en D3, PV, Vue | Identique, profils de base officiels des 5 races (`MH_Rules/Races_*.php`) |
| Combat | Somme ATT D6 vs somme ESQ D6, dégâts DEG D3 armure, coup critique (attaque ≥ 2 × esquive) aux dégâts doublés | Identique, avec un panneau « Détail du combat » au format des rapports MH (jets, Seuil de Résistance, jet de Résistance, maîtrise, butin, PX) à droite du journal |
| Talents | Compétence + sortilège réservés par race, 15 % de maîtrise initiale, jet D100 sous le %, progression à l'usage (+1D6 % < 50, +1D3 % < 75, +1 % ensuite ; sous 50 %, un échec donne quand même +1 %), plafonds 90 % compétences / 80 % sortilèges, échec = PA partiellement remboursés | Identique |
| Magie | Seuil de Résistance basé sur MM vs RM, borné 1090 % | Identique : jet de résistance des monstres → effets de moitié |
| Bonus/malus | Physiques (équipement) et magiques (potions, sortilèges…) distincts | Identique : équipement = physique (exceptions à venir), potions/parchemins = magique ; décomposition « P/M » affichée dans le profil |
| Armure | L'armure réduit les dégâts physiques ; seule sa composante magique réduit les dégâts magiques | Identique : armure physique (naturelle en D3 + équipement) + armure magique (potions/parchemins) — troll et monstres |
| Progression | PX → PI, le N-ième achat coûte N × coût de base racial (table de Rules_3.php) | Identique : 16 PI de base (12 pour la caractéristique favorite), REG 30 (Darkling 22), Armure naturelle 30 pour tous, PV par tranche de 10 |
| Niveaux | 10 × N PI pour atteindre le niveau N | Identique |
| Races | 5 races, chacune avec sort/compétence propre | Les 5 races avec leur capacité signature (voir ci-dessous) |
| Coûts en PA | Déplacement 13, attaque, ramasser, équiper, potion… | Déplacement 1, attaque 3, ramasser 1, équiper 2, potion 1 |
Simplifications assumées : les PX sont convertis en PI immédiatement (pas de phase
d'entraînement), la DLA ne dure pas 12 h réelles (sinon la partie durerait trois mois),
et le Monde Souterrain est généré procéduralement à chaque descente.
## Les 5 races (profils et talents officiels)
Profils de base repris des pages officielles, compétence (🥋 2 PA) et sortilège
(🔮 4 PA) réservés avec les effets décrits sur la Mountypedia, adaptés à la grille :
| Race | Profil de base | 🥋 Compétence | 🔮 Sortilège |
|---|---|---|---|
| 🟢 Skrim | ATT 4D6 · ESQ 3D6 · DEG 3D3 · REG 1D3 · PV 30 · Vue 3 | **Botte Secrète** : attaque bonus 1/DLA (2D6 par 3 dés d'ATT, 1D3 par 2 dés d'ATT) | **Hypnotisme** : esquive ÷2 + la cible perd son tour |
| 🟤 Durakuir | ATT 3D6 · ESQ 3D6 · DEG 3D3 · REG 1D3 · PV 40 · Vue 3 | **Régénération Accrue** : +1D3 PV par tranche de 15 PV max | **Rafale Psychique** : imparable, 1D3 par dé de DEG, ignore l'armure |
| 🔴 Kastar | ATT 3D6 · ESQ 3D6 · DEG 4D3 · REG 1D3 · PV 30 · Vue 3 | **Accélération du Métabolisme** : sacrifie des PV (fatigue croissante) pour +4 PA | **Vampirisme** : dégâts magiques + vol de 50 % des dégâts |
| 🟡 Tomawak | ATT 3D6 · ESQ 3D6 · DEG 3D3 · REG 1D3 · PV 30 · Vue 4 | **Camouflage** : invisible, jet sous 75 % de la maîtrise à chaque pas | **Projectile Magique** : à distance (portée = Vue), bonus de proximité |
| 🟣 Darkling | ATT 3D6 · ESQ 3D6 · DEG 3D3 · REG 2D3 · PV 30 · Vue 3 | **Balayage** : déstabilise (la cible perd son tour) | **Siphon des Âmes** : 1D3 par dé de REG, ignore toute armure, nécrose ATT |
### Page « Règles des talents »
Accessible depuis l'accueil (📜 Règles des talents) et en jeu (bouton 📜 Règles
dans l'en-tête) : les 10 fiches au format MountyHall — Coût en PA, Type, Jet de
résistance, Effet de zone, limite par DLA, EFFET détaillé avec les formules de
jets, et DESCRIPTION d'ambiance. En cours de partie, la fiche des talents de ta
race affiche en plus un encart « **Mes infos** » : pourcentage actuel et plafond,
taux de réussite sur tes jets, dernière utilisation, et tes jets calculés
(ex. Vampirisme : Attaque 2 D6 · Dégâts 4 D3 · Vol de vie 50 %).
### Coûts d'amélioration (officiels, [Rules_3.php](https://www.mountyhall.com/MH_Rules/Rules_3.php))
Le N-ième achat d'une caractéristique coûte N × le coût de base :
| Amélioration | Skrim | Durakuir | Kastar | Tomawak | Darkling |
|---|---|---|---|---|---|
| +1D6 Attaque | **12** | 16 | 16 | 16 | 16 |
| +1D6 Esquive | 16 | 16 | 16 | 16 | 16 |
| +1D3 Dégâts | 16 | 16 | **12** | 16 | 16 |
| +1D3 Régénération | 30 | 30 | 30 | 30 | **22** |
| +1D3 Armure naturelle | 30 | 30 | 30 | 30 | 30 |
| +1 Vue | 16 | 16 | 16 | **12** | 16 |
| +10 PV | 16 | **12** | 16 | 16 | 16 |
(L'amélioration « 30 minutes de DLA » du jeu original n'a pas d'équivalent ici,
la DLA étant instantanée.)
## Contrôles
- **ZQSD / flèches** : se déplacer (1 PA) — marcher sur un monstre l'attaque (3 PA)
- **Espace** : passer la DLA (les monstres agissent, tu régénères REG D3)
- **E** : ramasser l'objet sous tes pieds (1 PA)
- Boutons à l'écran pour la capacité raciale, l'équipement, les potions et l'entraînement (PI)
## Bestiaire
Gobelin, Champignon Vénéneux, Araignée Géante, Gargouille, Momie, Sorcière, Golem de
Pierre — déclinés en gabarits *Jeune / Vieux / Ancien / Mythique* selon la profondeur,
et le **Béhémoth** comme boss final à la profondeur 5.
Comme l'armure, l'ATT et les DEG des monstres existent en **physique** et en
**magique** : un monstre doté d'une attaque magique (ATT mag et DEG mag > 0)
alterne au hasard entre ses deux attaques ; l'attaque magique n'est réduite que
par l'armure magique du troll. En vanilla toutes les valeurs magiques sont à 0
(comportement inchangé) — elles se règlent par type via l'admin du monde partagé.
## 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.
- **Connexion multi-appareils** : le troll vit côté serveur. À la création on
choisit un mot de passe (conseillé) ; « 🔑 Retrouver mon troll » permet ensuite
de le récupérer depuis n'importe quel appareil avec nom + mot de passe (les
noms sont uniques, le mot de passe est stocké hashé+salé). Sans mot de passe,
l'identité (id + clé secrète) reste gardée par le navigateur d'origine
(localStorage), comme avant.
- 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).
L'admin peut aussi **retoucher les règles du monde partagé**, à chaud (les
nouveaux spawns/drops utilisent les valeurs retouchées ; le solo reste vanilla) :
- **Tuning du bestiaire** : tableau éditable par type de monstre (niveau, ATT
phy/mag, ESQ, DEG phy/mag, PV, armure phy/mag, VUE) — valeurs de base, avant
gabarit d'âge (Jeune/Vieux/Ancien/Mythique).
- **Tuning de l'équipement** : les 55 objets avec tous leurs bonus modifiables
(ATT phy/mag, ESQ, DEG phy/mag, REG, armure phy/mag, VUE, PV fixes, RM/MM en %).
- **Tuning des potions & parchemins** : fourchette de puissance « niveau X »
(min/max) tirée à chaque drop, par trésor.
Les cases modifiées sont surlignées et chaque catégorie se remet d'origine d'un
clic. Depuis la 2.3.0, ces valeurs vivent dans une **base SQLite**
(`DB_FILE`, défaut `/data/mountycrawl.db`, via le module natif `node:sqlite`
toujours zéro dépendance npm) : tables `monsters`, `gear`, `potions`, `scrolls`,
seedées vanilla au premier démarrage puis jamais écrasées. On peut donc aussi
les éditer directement avec n'importe quel outil SQLite (DB Browser, DBeaver,
sqlite3) — chaque spawn/drop relit la base, c'est pris en compte à chaud.
L'état vivant du monde (trolls, monstres actifs, objets au sol) reste dans
`world.json` ; l'ancien `world.tuning` est migré automatiquement dans la base.
### API multijoueur
- `POST /api/mp/join` `{name, race, password}``{id, secret, state}`
- `POST /api/mp/login` `{name, password}``{id, secret, state}` (retrouver
son troll depuis un autre appareil)
- `GET /api/mp/state?id=&secret=` → état visible (vue du troll)
- `POST /api/mp/action` `{id, secret, action}``move`, `attack`, `comp`,
`sort`, `pickup`, `use`, `unequip`, `eat`, `drop`, `train`
- `GET /api/mp/info` → compteurs publics (trolls en ligne…)
- `GET /api/mp/admin` · `PUT /api/mp/admin/config` · `PUT /api/mp/admin/tuning`
· `POST /api/mp/admin/reset` (header `X-Admin-Token`)
## Éditeur de niveaux & partage
Depuis l'écran d'accueil : **🛠️ Éditeur de niveaux**.
- Peins le terrain à la souris (mur, sol, sortie ▼), place le départ 🧌, les monstres
(avec gabarit Jeune → Mythique) et les objets. Outils : tout sol / tout mur /
caverne aléatoire / nouveau niveau.
- **🚪 Portes** : une porte téléporte le troll vers un autre niveau publié, en
conservant PV, PI et équipement — de quoi chaîner des niveaux en campagne.
- **▶️ Tester** joue ton niveau immédiatement (retour à l'éditeur après la partie).
- **🌍 Publier** l'envoie au serveur ; il apparaît dans « Niveaux de la communauté ».
La publication renvoie une clé d'auteur gardée en localStorage : tes niveaux
restent modifiables via la section « Mes niveaux publiés » (bouton devient
« Mettre à jour »).
- Victoire d'un niveau custom : atteindre la sortie ▼ si elle existe, sinon
terrasser tous les monstres. Un niveau avec porte(s) sans sortie ne se termine
pas sur place : la suite est derrière la porte.
- Lien partageable : `https://mountycrawl.nas.percolouco.com/?level=<id>`.
### API
| Route | Description |
|---|---|
| `GET /api/levels` | Liste (id, nom, auteur, date, nb monstres, nb portes, nb parties) |
| `GET /api/levels/<id>` | Niveau complet (incrémente le compteur de parties ; la clé d'auteur n'est jamais renvoyée) |
| `POST /api/levels` | Publie un niveau ; renvoie `{id, secret}` — le `secret` est la clé d'auteur |
| `PUT /api/levels/<id>` | Met à jour un niveau ; exige l'en-tête `X-Level-Secret` (403 sinon) |
Validation serveur : grille 28×20, départ hors mur, max 60 monstres/objets et
10 portes (cible = id de niveau), au moins un objectif (monstre, porte ou sortie).
Stockage : `/data/levels.json` dans le volume `/opt/container/mountycrawl/data`.
## Tests
```bash
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 (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
Mécaniques reconstituées depuis le [site officiel](https://www.mountyhall.com),
les [règles](https://www.mountyhall.com/MH_Rules/Rules_4.php) et la
[Mountypedia](https://mountypedia.mountyhall.com). MountyCrawl est un hommage
non affilié au jeu original de Mountyhall SARL.
## Versions
- **2.13.0** (2026-06-17) — **RM% et MM% de l'équipement en plages.** Les valeurs
existantes deviennent les **maximums** et on ajoute un **minimum** par objet
(`rmPctMin`/`mmPctMin`, réglables côté admin). À la **création d'un objet du
monde partagé**, RM% et MM% sont **tirés au hasard dans leur plage** (comme la
puissance des potions) — ex. min 5 / max 10 → un objet entre 5 et 10. Par
défaut min = max (donc rien ne change tant qu'on n'abaisse pas le min).
L'encyclopédie affiche la plage. *(Le solo garde ses valeurs fixes — la plage
est une propriété de la base de référence, éditable et tirée côté monde
partagé.)*
- **2.12.0** (2026-06-17) — **L'éditeur de niveaux pose les monstres du
bestiaire.** On choisit la **famille → le monstre → l'âge** (« Xorn [Mineur] »,
« Nécrochore [Naissant] »…) et on place la créature voulue. L'**ancien Béhémoth
est retiré** : dans la partie aléatoire, le gardien du dernier niveau est
désormais le **monstre le plus puissant du bestiaire** ; et dans l'éditeur, plus
de pinceau « boss » — on place le monstre fort qu'on veut comme boss de fin.
Rétrocompatibilité conservée pour les niveaux déjà publiés (anciens types et
ancien boss → repris depuis le bestiaire). `monsterFromSpec` accepte le nouveau
format `{mob, age}` (validé côté serveur).
- **2.11.2** (2026-06-17) — Ménage admin : suppression de l'ancienne section
« 🐗 Tuning du bestiaire » (les 7 monstres d'avant), devenue inutile depuis que
le jeu utilise le nouveau bestiaire. Seule reste l'édition du bestiaire complet.
- **2.11.1** (2026-06-15) — Nom des monstres au format **« Nom [Âge] »**
(« Ankheg [Mûr] », « Lutin [Adulte] ») au lieu du préfixe. Gestion du
**féminin** : chaque monstre a un genre (m/f, éditable en admin), et l'âge
s'accorde (« Plante Carnivore [Doyenne] »). ~31 monstres détectés féminins par
défaut (liste curatée), corrigeable au cas par cas dans l'admin.
- **2.11.0** (2026-06-15) — Bestiaire, étape 4 : **les monstres du bestiaire
apparaissent dans le jeu** (solo ET monde partagé), à la place des 7 anciens.
À chaque apparition, on choisit un monstre dont le niveau de base tombe dans la
**tranche autour de la profondeur** (± quelques niveaux), un **âge au hasard**
dans sa fourchette (multiplicateur d'âge appliqué), puis chaque stat est tirée
dans sa plage ; le nom prend le préfixe d'âge (« Mûr Ankheg ») et un emoji de
famille. La **profondeur** du monde partagé est désormais réglable **jusqu'à 45**
(pour atteindre les monstres de haut niveau). Le multi lit la base (tunée
admin), le solo les valeurs statiques. *(Les monstres placés à la main dans
l'éditeur de niveaux et le Béhémoth gardent l'ancien système ; les capacités
spéciales et drapeaux sont portés mais pas encore actifs.)*
- **2.10.2** (2026-06-15) — Bestiaire, étape 3 : **encyclopédie**. Nouvelle
section « 🐲 Bestiaire » dans « Trésors du Hall » (accessible par le menu) qui
liste les 150 monstres **groupés par famille**, avec leur **blason**, leurs
plages de stats, leur fourchette d'âges (noms par famille) et leurs
drapeaux/capacités. *Reste : la bascule des apparitions du jeu sur ce
bestiaire (en attente du choix d'équilibrage profondeur → niveaux).*
- **2.10.1** (2026-06-15) — Bestiaire, étape 2 : **éditeur admin**. Nouvelle
section « 🐲 Bestiaire » dans la page admin pour régler les **multiplicateurs
d'âge** (les 8 âges) et **éditer chaque monstre** (filtre par famille +
recherche par nom, puis tous ses champs : plages de stats, capacités,
drapeaux, vitesse, blason). Sauvegarde à chaud via le tuning admin (mises à
jour ciblées, bouton « tout remettre d'origine » par catégorie).
- **2.10.0** (2026-06-15) — **Nouveau bestiaire** (étape 1 : les données). Le
bestiaire complet fourni (945 entrées monstre × âge) est replié, comme demandé,
en **1 ligne par monstre** (150 monstres, stats de base = âge le plus jeune, en
plages min/max) + une **table d'âges** (8 multiplicateurs appliqués à la
génération/croissance). Tout est dans la base de référence (`js/bestiary.js`
tables `bestiary` et `monster_ages`), exposé sur `/api/reference/bestiary` et
`/api/reference/ages`, et éditable comme le reste (sqlite-web). Chaque monstre
porte sa famille, ses plages de stats, ses capacités (listées, effets à venir),
ses drapeaux (vol, attaque à distance/magique, voit le caché), sa vitesse, son
nombre d'attaques et son blason. *Prochaines étapes : encyclopédie, éditeur
admin, puis bascule des apparitions du jeu sur ce bestiaire.*
(empilement des cases, rendu par coins avec le coin **lieu** ↘ qui affiche
enfin les portes 🚪 / la sortie ▼, cases ×2, attaque limitée à sa propre case,
drop empilable). Le **menu déroulant de cible s'affiche toujours**, même quand
il n'y a qu'un seul monstre/troll. Et comme les cases agrandies débordent du
cadre, une **caméra suit le troll** (le panneau défile pour le garder en vue),
dans les deux modes.
- **2.9.0** (2026-06-15) — Monde partagé : **cases deux fois plus grandes**
(48 px) pour la lisibilité de l'empilement par coins. **Portée d'attaque =
même case** : on ne peut frapper (attaque de base et compétences/sortilèges
d'attaque) que sur sa propre case ; seule exception, le **Projectile Magique**
(sortilège du Tomawak) reste à distance (jusqu'à la Vue). **PvP** : on peut
désormais attaquer les autres trolls comme les monstres (combat classique,
mise à mort → réapparition habituelle ; +1 PX par coup porté, pas de butin
transféré). Le menu déroulant de cible liste monstres **et** trolls présents
sur la case.
- **2.8.0** (2026-06-15) — **Empilement sur les cases** dans le monde partagé.
Une case accueille maintenant **plusieurs trolls, plusieurs monstres et
plusieurs trésors** (un seul « lieu » à terme). Se déplacer ne fait **plus
attaquer** : on se pose sur la case (cohabitation), et l'**attaque** passe par
le bouton ⚔️ — avec un **menu déroulant** pour choisir la cible quand
plusieurs monstres sont sur ta case ou adjacents. Rendu **par coins** pour
rester lisible : 🧌 trolls en haut-gauche, 👹 monstres en haut-droite,
💰 trésors en bas-gauche, lieux en bas-droite, avec un « ×N » quand il y en a
plusieurs. (Le PvP — taper d'autres trolls — et le portage en solo restent à
faire.)
- **2.7.1** (2026-06-14) — Encyclopédie « Trésors du Hall » : nouvelle section
**✨ Templates** (les 19 templates de drop, lus dans la base), un **menu de
navigation** collant en haut pour sauter directement à chaque section (Potions,
Parchemins, Équipement, Templates) et un bouton flottant **« remonter en
haut »** qui apparaît dès qu'on a défilé — la page étant devenue longue.
- **2.7.0** (2026-06-14) — **Templates de drop** façon MountyHall. 19 suffixes
(« de l'Aigle », « des Mages », « des Béhémoths »…) stockés dans une nouvelle
table `templates` de la base (seedés au démarrage, éditables comme le reste via
sqlite-web / `GET /api/reference/templates`). À chaque **drop d'équipement du
monde partagé**, l'objet reçoit jusqu'à **3 templates** (6 pour une arme à
**2 mains**), chaque emplacement étant rempli avec une **probabilité réglable
sur la page admin** (`templateChance`, 0100 %). Les bonus des templates
s'ajoutent aux mods de l'objet (nouveau mod `TOUR`, en minutes) et leurs
suffixes au nom (« Épée Courte de l'Aigle des Mages »). Le solo reste vanilla.
*Note : le bonus `TOUR` est affiché mais son effet de jeu (DLA) reste à câbler
une fois la règle confirmée.*
- **2.6.3** (2026-06-13) — **Cache-busting** des fichiers du jeu : les balises
`<script>`/`<link>` de `index.html` portent `?v=__V__`, jeton que le serveur
remplace par la version de l'appli (donc différent à chaque déploiement). Le
navigateur recharge ainsi forcément le nouveau code/CSS — fini les anciennes
versions servies depuis le cache même après une mise à jour (par ex. la page
« Trésors du Hall » qui n'affichait pas les bonus magiques d'équipement
fraîchement édités). Complète le `Cache-Control: no-cache` de la 2.6.1.
- **2.6.2** (2026-06-13) — La page admin et l'édition directe en base
(sqlite-web) **ne se marchent plus dessus**. Avant, sauver le tuning d'une
catégorie la **remettait entièrement au vanilla** puis réappliquait le
formulaire — donc une édition faite en base pouvait être écrasée par une
sauvegarde admin (et un onglet admin périmé écrasait les éditions récentes).
Désormais l'admin fait des **mises à jour ciblées** : seuls les objets
réellement modifiés dans la session sont écrits, le reste de la catégorie est
laissé tel quel. Le bouton « Tout remettre d'origine » passe par un reset
explicite (`patch.reset`). Les deux chemins d'édition cohabitent enfin.
- **2.6.1** (2026-06-13) — Suite du branchement de la base de référence sur
l'encyclopédie. Les **plages de puissance des potions et parchemins** sont
désormais lues dans la BDD (`/api/reference/potions`, `/api/reference/scrolls`,
`/api/reference/monsters` en plus de `gear`) — une plage simple « A à B » suit
la base, les libellés spéciaux (« — », « 5 (fixe) », « 1, 2, 3, 5 ou 8 ») sont
préservés. **Cache navigateur corrigé** : le HTML/JS/CSS est désormais envoyé
en `Cache-Control: no-cache` (toujours revalidé) pour qu'une mise à jour ou une
édition de la base soit prise immédiatement, sans vider le cache à la main
(les médias gardent un cache d'un jour). Enfin, **PufPuff** était encore en
« 0 à 2 » dans la base (le rollPower solo seul avait été corrigé en 2.5.1) :
défaut corrigé en « 1 à 3 » + migration automatique des bases déjà créées.
- **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)`,
`PV 2D3 si 0 ≥ 2`). Le Biskot, à effet **fixe**, n'affiche plus de niveau
du tout (au lieu de « niv. 0 »).
- **2.5.0** (2026-06-13) — **Cumul systématique des bonus physiques et
magiques.** On lance les dés, puis on ajoute **toujours les deux** bonus :
le physique (équipement) *et* le magique (potions/parchemins + équipement
magique) s'additionnent, comme le faisait déjà l'esquive (avant, l'attaque
et les dégâts ne prenaient qu'une seule saveur selon le type d'attaque). Les
colonnes phys/mag sont désormais **pures et sans recouvrement** (une potion
est un bonus magique, comptée une seule fois), donc l'affichage `+total
(phy +X · mag +Y)` est cohérent — fini le faux double comptage. `opts.magic`
ne sert plus qu'à choisir l'armure qui réduit (la magique seule pour une
attaque magique). **Armure** présentée comme l'attaque et l'esquive : une
seule ligne `XD3 +total (phy +P · mag +M)` au lieu des deux lignes « phy. »
et « mag. » séparées.
- **2.4.4** (2026-06-13) — Affichage des bonus fixes clarifié : quand le bonus
physique et le bonus magique sont **identiques**, on n'affiche plus qu'un
seul `+X` (avant : `+1 (phy +1 · mag +1)`, qui donnait l'illusion d'un triple
comptage). Le détail `(phy +X · mag +Y)` n'apparaît plus que lorsque les deux
saveurs **diffèrent réellement** (équipement magique, etc.), et le bonus de
dégâts fixe (`degBonus`) est correctement reporté des deux côtés. Le calcul de
combat lui-même était déjà correct (`pickFlat` choisit une seule saveur).
- **2.4.3** (2026-06-13) — Fin de l'harmonisation de la fiche : les règles
CSS de mise en page des caractéristiques (libellé à gauche, valeur alignée
à droite en chasse fixe, indice phys/mag) ne ciblaient que le solo (`#stats`)
et sont désormais **partagées avec le multi** (`#mp-stats`) ; suppression
d'un reliquat CSS multi qui désalignait le message « aucun effet ». Les deux
fiches sont maintenant strictement identiques au pixel près.
- **2.4.2** (2026-06-13) — **Fiche du troll harmonisée** entre le solo et le
monde partagé : le mode multi adopte le même **panneau à onglets**
« Caractéristiques / Effets » que le solo (avec le badge du nombre d'effets
actifs), et son onglet Effets utilise désormais le **même rendu**
(cartes buff/malus + « Total des modificateurs ») au lieu de la liste
simplifiée d'avant. Les deux modes partagent désormais strictement le même
code d'affichage (`fmtStatLine`, `renderEffectsPanel`, `switchLeftTab`) ;
seule subsiste la différence de fond entre les modes (compteur de **Tour**
en solo, compte à rebours **DLA** en temps réel en multi).
- **2.4.1** (2026-06-13) — Fiche du troll du monde partagé : les **bonus
physiques et magiques** de chaque caractéristique (attaque, esquive, dégâts,
régénération) sont désormais **toujours détaillés** (`phy +X · mag +Y`),
même quand un bonus s'applique aux deux saveurs — on voyait avant disparaître
la décomposition dès que les deux valeurs étaient égales. Les deux panneaux
latéraux ont été **légèrement agrandis** (230 → 270 px) pour les accueillir.
- **2.4.0** (2026-06-12) — Gestion du sac, en solo comme en multi :
**déséquiper** (↩️, 1 PA : la pièce revient au sac, PV max et bonus recalculés),
**jeter à terre** (🗑️, 1 PA : l'objet tombe sur la case du troll et peut être
ramassé — une seule chose à terre par case), et **goinfrer** l'équipement
(🍴, 1 PA : l'objet est dévoré et détruit contre un petit bonus aléatoire,
X = 1 à 3 — « MIAM » +XD3 PV immédiats, « CLONK » +X en armure pendant
X tours, « GRRROUAR » +X en dégâts pendant X tours, avec les textes
d'ambiance qui vont bien). Le sac est désormais **classé par type**
(potions, parchemins, puis l'équipement par emplacement) et chaque objet
affiche **ses effets** : formule du trésor avec son niveau X et sa durée
pour les potions/parchemins, bonus complets pour l'équipement.
Actions API : `unequip`, `eat`, `drop`. Les boutons du monde partagé
reprennent le style olive du pack parchemin.
- **2.3.0** (2026-06-12) — Les valeurs de référence du monde partagé passent dans
une **base SQLite** (`db.js`, module natif `node:sqlite` — toujours zéro
dépendance npm) : tables `monsters` (bestiaire), `gear` (55 objets),
`potions`/`scrolls` (fourchettes de puissance), dans `DB_FILE` (défaut
`/data/mountycrawl.db`). Seed vanilla au premier démarrage, jamais écrasé
ensuite ; chaque spawn/drop **relit la base**, donc une modification — page
admin ou édition directe au DB Browser/DBeaver/sqlite3 — s'applique à chaud.
L'ancien `world.tuning` de world.json est migré automatiquement puis retiré.
L'état vivant (trolls, monstres actifs, objets au sol) reste dans `world.json`.
Image Docker en node:24 (SQLite natif stable). API et page admin inchangées.
- **2.2.0** (2026-06-12) — Le couple **physique/magique partout** : comme l'armure,
l'ATT et les DEG existent désormais en deux saveurs pour les **monstres**
(`attMag`, `degMag` — un monstre qui en a alterne au hasard entre attaque
physique et magique, cette dernière n'étant réduite que par l'armure magique)
et pour l'**équipement** (`attMag`/`degMag`/`armMag` : bonus appliqués aux
sortilèges et à l'armure magique, là où `att`/`deg`/`arm` restent physiques).
ESQ, PV et VUE restent simples. Les bonus fixes du troll sont décomposés par
type d'action (`xxxFlatPhys`/`xxxFlatMag`) : les potions/parchemins modifient
le troll et comptent dans les deux, l'équipement selon sa saveur — au passage,
une arme physique ne booste plus les sortilèges (Vampirisme, Siphon des Âmes…).
Toutes les valeurs magiques vanilla sont à 0 (comportement inchangé) et se
règlent via le tuning admin, dont les tableaux gagnent les colonnes
ATT/DEG/Arm phy et mag. Admin : bouton 🗑️ pour **supprimer un troll**
(`POST /api/mp/admin/kick`).
- **2.1.0** (2026-06-12) — **Connexion multi-appareils** : à la création du troll
on choisit un mot de passe (stocké hashé+salé, jamais en clair) ; « 🔑 Retrouver
mon troll » (`POST /api/mp/login`) permet de récupérer son troll depuis
n'importe quel appareil avec nom + mot de passe. Les noms de troll deviennent
uniques (insensible à la casse). Structure prête pour une vraie inscription
plus tard. **Admin enrichie** (`PUT /api/mp/admin/tuning`, appliqué à chaud
aux nouveaux spawns/drops du monde partagé, solo vanilla) : bestiaire éditable
par type (niveau, ATT, ESQ, DEG, PV, armures phy/mag, VUE), les 55 objets
d'équipement avec tous leurs bonus modifiables, fourchette de puissance
« niveau X » min/max par potion et parchemin. Seuls les écarts au vanilla sont
stockés (`world.tuning`, persisté), cases modifiées surlignées, remise
d'origine par catégorie.
- **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
physique** (base + naturelle en D3 + équipement) et **armure magique** (effets
de potions/parchemins, ex. Extrait du Glacier) : les dégâts physiques sont
réduits par l'armure totale, les dégâts magiques (Rafale Psychique, Vampirisme,
Projectile Magique, Rune Explosive) par la seule armure magique — le Siphon des
Âmes continue d'ignorer toute armure. Les monstres ont eux aussi une armure
physique et une armure magique distinctes (valeurs du bestiaire à venir).
Affichage : Armure phy./mag. séparées dans le profil, décomposition « P/M » des
bonus fixes, absorption d'armure détaillée dans les rapports de combat.
- **1.8.0** (2026-06-12) — Habillage « pack parchemin » officiel de MountyHall
(https://www.mountyhall.com/MH_Pack/packMH_parchemin/) : fond lin, tableaux
crème à bordure noire (tableau1/2.jpg), liens rouge sombre #990000, boutons
olive #666633 façon `mh_form_submit`, bandeaux en boiseries (interfacehaut),
police Trebuchet MS. Assets dans `img/mh/`.
- **1.7.1** (2026-06-12) — Les bonus ATT/ESQ/DEG/REG de l'équipement sont des bonus
**fixes** ajoutés aux jets, jamais des dés supplémentaires (un Gourdin donne
DEG +5 sur le jet, pas +5D3).
- **1.7.0** (2026-06-11) — Équipement Mountypedia complet : 6 emplacements (Arme,
Armure, Casque, Bouclier, Talisman, Bottes) et 55 objets dropables aux valeurs
de base officielles (bonus fixes, RM/MM en %).
Armes à 2 mains incompatibles avec un bouclier, PV max d'équipement, tiers de
drop par profondeur, pinceaux d'éditeur par emplacement, rétrocompatibilité des
anciens niveaux publiés (specs weapon/armor mappées). Section « Équipement »
dans la page Trésors.
- **1.6.0** (2026-06-11) — Parchemins 📜 : les 7 parchemins standards de Mountypedia
(Rune des Cyclopes, Traité de Clairvoyance, Idées Confuses, Rune Explosive,
Plan Génial, Yeu'Ki'Pic, Rune des Foins) en trésors à trouver, butin de monstre
et pinceau d'éditeur. Effets de zone (rayon 3 cases : dégâts ou aveuglement des
monstres), TOUR accéléré/ralenti converti en PA (±30 min = ±1 PA, min. 1 PA par
tour). Nouvelle page « 🧪 Trésors du Hall » : fiches des 25 potions et des
7 parchemins (niveau X, durée, formules), accessible depuis l'accueil et en jeu.
- **1.5.2** (2026-06-11) — Les bonus/malus DEG et REG des potions sont des valeurs
fixes ajoutées au jet, plus des dés supplémentaires (seules les notations « X D3 »
de Mountypedia sont des jets). Concerne Bonne Bouffe, Fertilité, Corruption,
DjhinTonik, Rhume/Grippe/Pneumonie, Biskot, KouleMann et Glacier. La régénération
ne peut plus être négative sous malus.
- **1.5.1** (2026-06-11) — Potions fidèles à Mountypedia : toutes les potions à jet
utilisent des D3 (Sang de Toh Réroh et PufPuff étaient à tort en D6), et chaque
fiole ne fait qu'un seul jet — le même total s'applique à toutes les caracs
concernées (ex. Sang de Toh Réroh niv. 4 : un jet de 4D3 partagé par ATT et ESQ).
Affichage : suppression des mentions « (jet) » dans le panneau des effets.
- **1.5.0** (2026-06-11) — Page « Règles des talents » : les 10 fiches compétences/
sortilèges au format MountyHall (coût, type, jet de résistance, formules, lore),
avec encart « Mes infos » en partie (maîtrise, taux de réussite, jets calculés du
troll). Suivi des statistiques d'utilisation des talents.
- **1.4.0** (2026-06-11) — Panneau « Détail du combat » au format des rapports
MountyHall (jets d'Attaque/Esquive, coup critique, Seuil et jet de Résistance,
progression de Maîtrise, dégâts, mise à mort, butin, total de PX), pour chaque
action du troll et chaque attaque de monstre. Ajout des coups critiques
(dégâts ×2 quand l'attaque fait au moins le double de l'esquive) et du butin
lâché par les monstres (40 % de chance : potion ou Mountyzédons).
`?demo=combat` simule un combat pour les captures d'écran.
- **1.3.2** (2026-06-11) — Sous 50 % de maîtrise, un jet de talent raté fait quand
même progresser de 1 % (plafonds inchangés : 90 % compétences, 80 % sortilèges).
- **1.3.1** (2026-06-11) — Coûts d'amélioration officiels de Rules_3.php (N-ième
achat = N × base, favorisée 12 PI, REG 30/22, PV par 10) et armure naturelle
en D3 achetable (30 PI pour toutes les races).
- **1.3.0** (2026-06-11) — Races fidèles aux règles officielles : profils de base
exacts, dégâts en D3, compétence + sortilège réservés par race avec maîtrise en %
progressant à l'usage, jets de résistance des monstres, statuts (à terre, hypnose,
nécrose), fatigue du Kastar, camouflage persistant du Tomawak.
- **1.2.0** (2026-06-11) — Portes 🚪 entre niveaux (campagnes multi-niveaux, troll
conservé), édition post-publication avec clé d'auteur (`PUT` + localStorage),
section « Mes niveaux publiés », objectifs de victoire affinés.
- **1.1.0** (2026-06-11) — Mode création : éditeur de niveaux visuel, publication en
ligne, écran « Niveaux de la communauté », liens partageables `?level=<id>`,
backend node sans dépendance (`server.js`) avec validation et stockage JSON.
- **1.0.0** (2026-06-11) — Version initiale : 5 races, 5 profondeurs, combat aux dés
fidèle aux règles MH, progression PI, brouillard de guerre, boss Béhémoth.