Files
mountycrawl/js/treasures.js
T
percoandClaude Fable 5 61a8cee0fc 1.7.1 : bonus d'équipement fixes sur les jets, jamais en dés
ATT/ESQ/DEG/REG d'équipement alimentent attFlat/esqFlat/degFlat/regFlat
dans effTroll (Gourdin = DEG +5 sur le jet, pas +5D3).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 00:02:27 +02:00

143 lines
7.8 KiB
JavaScript
Raw 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.
/* Page « Trésors du Hall » : encyclopédie des potions et des parchemins,
* formules officielles de Mountypedia (X = niveau du trésor).
* Rappel : un trésor ne fait qu'un seul jet de dés — « X D3 » donne le même
* total partout où il s'applique. Partage les globales de potions.js/scrolls.js. */
"use strict";
/* [id, niveau X, durée affichée, effets] — ordre d'affichage de la page. */
const TREASURE_POTIONS = [
["biskot", "—", "2 tours", ["REG +2", "PV +2D3 (immédiat)"]],
["bonneBouffe", "3 à 7", "5 tours", ["DEG +X", "REG +X"]],
["calvok", "2 à 6", "1 tour", ["Concentration 5·X %"]],
["cervelle", "2 à 6", "1 tour", ["Concentration +5·X %"]],
["chronometre", "1 à 5", "3 tours", ["TOUR accéléré : +X PA par tour"]],
["corruption", "3 à 7", "5 tours", ["ATT +X D3", "ESQ X D3", "DEG +X", "REG X", "VUE X", "Armure +X", "RM Y %, MM Z % (selon X)"]],
["djhinTonik", "1 à 5", "4 tours", ["DEG +X", "REG +X", "PV +2D3 (immédiat)"]],
["doverPowa", "11 à 100", "2 tours", ["MM +Y %", "RM X %"]],
["fertilite", "3 à 7", "5 tours", ["ATT +X D3", "DEG +X"]],
["feu", "3 à 7", "5 tours", ["ESQ +X D3", "VUE +X"]],
["glacier", "3 à 7", "5 tours", ["REG +X", "Armure +X"]],
["grippe", "3 à 4", "3 tours", ["ATT X D3", "ESQ X D3", "DEG X", "REG X"]],
["guerison", "1 à 5", "immédiat", ["PV +2·X D3"]],
["kouleMann", "1 à 5", "4 tours", ["REG +X", "VUE +X", "PV +(X/2) D3 (immédiat)"]],
["longueVue", "1, 2, 3, 5 ou 8", "3 tours", ["VUE +X"]],
["metomol", "1 à 5", "2 tours", ["TOUR accéléré : +X PA par tour", "Armure 2·X"]],
["painture", "1 à 5", "X tours", ["Visible — camouflage impossible"]],
["pneumonie", "5 (fixe)", "3 tours", ["ATT 5 D3", "ESQ 5 D3", "DEG 5", "REG 5"]],
["pufPuff", "0 à 2", "3 tours", ["ATT X D3", "ESQ X D3", "VUE (X+1)", "PV 2D3 si X ≥ 2", "Effet de Zone"]],
["rhume", "1 à 2", "3 tours", ["ATT X D3", "ESQ X D3", "DEG X", "REG X"]],
["sangToh", "1 à 5", "4 tours", ["ATT +X D3", "ESQ +X D3", "VUE +X"]],
["sinneKhole", "11 à 100", "2 tours", ["RM +X %", "MM Y %"]],
["toxine", "1 à 5", "immédiat", ["PV 2·X D3"]],
["voiputrin", "1 à 5", "2 tours", ["VUE 10·X"]],
["zetCrak", "1 à 5", "3 tours", ["ATT X D3", "ESQ X D3", "VUE X", "PV +X D3 (immédiat)"]],
];
const TREASURE_SCROLLS = [
["runeCyclopes", "1 à 5", "4 tours", ["ATT +X D3", "DEG +X", "VUE X"]],
["clairvoyance", "1 à 5", "4 tours", ["VUE +X", "TOUR accéléré : +X PA par tour"]],
["ideesConfuses","1 à 5", "3 tours", ["ATT X D3", "TOUR ralenti : X PA par tour"]],
["runeExplosive","1 à 5", "immédiat", ["PV 2·X D3", "Effet de Zone (rayon 3 cases)"]],
["planGenial", "1 à 5", "3 tours", ["ATT +X D3", "DEG +X", "TOUR accéléré : +X/2 PA par tour"]],
["yeuKiPic", "1 à 5", "2 tours", ["VUE 3·X", "Effet de Zone (rayon 3 cases)"]],
["runeFoins", "1 à 5", "3 tours", ["DEG X", "VUE 1", "PV 2D3 ou 4D3 (immédiat)"]],
];
function treasureCard(def, x, duration, fx) {
const fxHtml = fx.map(f => {
const neg = f.includes("");
const pos = f.includes("+");
const cls = neg && !pos ? "tz-fx tz-bad" : pos && !neg ? "tz-fx tz-good" : "tz-fx";
return `<span class="${cls}">${f}</span>`;
}).join("");
return `
<div class="tz-card" style="--tz-color:${def.color}">
<div class="tz-head"><span class="tz-name">${def.emoji} ${def.name}</span></div>
<div class="tz-meta">Niveau X : <b>${x}</b> · Durée : <b>${duration}</b></div>
<div class="tz-fx-list">${fxHtml}</div>
</div>`;
}
function treasuresRender() {
const body = document.getElementById("treasures-body");
let html = `
<p class="tz-intro">Les trésors du Monde Souterrain, fidèles aux formules de la
<a href="https://mountypedia.mountyhall.com/Mountyhall/Potion" target="_blank" rel="noopener">Mountypedia</a>.
Un trésor ne fait qu'<b>un seul jet de dés</b> : une formule « X D3 » donne le même total
partout où elle s'applique. Les bonus « +X » sont des valeurs fixes ajoutées aux jets.
1 tour = 1 DLA. Boire une potion ou lire un parchemin coûte <b>1 PA</b>.</p>`;
html += `<h2 class="tz-section">🧪 Potions (${TREASURE_POTIONS.length})</h2><div class="tz-grid">`;
for (const [id, x, duration, fx] of TREASURE_POTIONS) {
html += treasureCard(POTION_DEFS[id], x, duration, fx);
}
html += "</div>";
html += `<h2 class="tz-section">📜 Parchemins standards (${TREASURE_SCROLLS.length})</h2><div class="tz-grid">`;
for (const [id, x, duration, fx] of TREASURE_SCROLLS) {
html += treasureCard(SCROLL_DEFS[id], x, duration, fx);
}
html += "</div>";
const gearCount = Object.values(GEAR).reduce((n, list) => n + list.length, 0);
html += `<h2 class="tz-section">⚔️ Équipement (${gearCount})</h2>
<p class="tz-intro">Six emplacements : ${Object.values(GEAR_SLOTS).map(s => s.label).join(", ")}.
Tous les bonus d'équipement sont <b>fixes</b> : ATT/ESQ/DEG/REG s'ajoutent aux jets
(jamais en dés), Armure/VUE/PV aussi, RM/MM en %.
Une arme <b>à 2 mains</b> est incompatible avec un bouclier. S'équiper coûte <b>2 PA</b>.
Valeurs de base de la Mountypedia (sans templates) ; les objets puissants ne se trouvent
qu'en profondeur.</p>`;
for (const [slot, info] of Object.entries(GEAR_SLOTS)) {
html += `<h3 class="tz-subsection">${info.emoji} ${info.label}s</h3><div class="tz-grid">`;
for (const def of GEAR[slot]) {
const fx = [];
for (const [key, label, unit] of GEAR_MOD_LABELS) {
const v = def.mods[key];
if (!v) continue;
const cls = v > 0 ? "tz-fx tz-good" : "tz-fx tz-bad";
fx.push(`<span class="${cls}">${label} ${v > 0 ? "+" : ""}${Math.abs(v)}${unit}</span>`);
}
if (def.twoHanded) fx.push('<span class="tz-fx">2 mains</span>');
if (def.note) fx.push(`<span class="tz-fx">${def.note}</span>`);
html += `
<div class="tz-card" style="--tz-color:#9a8a65">
<div class="tz-head"><span class="tz-name">${def.emoji} ${def.name}</span></div>
<div class="tz-meta">Profondeur : <b>${Math.max(1, def.tier - 1)} et au-delà</b></div>
<div class="tz-fx-list">${fx.join("")}</div>
</div>`;
}
html += "</div>";
}
html += `<p class="tz-note">Effet de Zone : touche le lecteur et tous les monstres à 3 cases
ou moins. « PV 2D3 ou 4D3 » (Rune des Foins) : la Mountypedia note « -2/4 D3 », interprété
ici comme un tirage au sort entre 2D3 et 4D3.</p>`;
body.innerHTML = html;
}
let treasuresReturnTo = "create";
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;
}
if (typeof document !== "undefined") {
document.addEventListener("DOMContentLoaded", () => {
document.getElementById("btn-treasures").onclick = () => treasuresShow("create");
document.getElementById("btn-treasures-game").onclick = () => treasuresShow("game");
document.getElementById("treasures-back").onclick = () => {
document.getElementById("screen-treasures").classList.add("hidden");
document.getElementById("screen-" + treasuresReturnTo).classList.remove("hidden");
};
if (new URLSearchParams(location.search).get("screen") === "treasures") {
treasuresShow("create");
}
});
}