From 18180a8445373d7197d1a5923ad945114f756e07 Mon Sep 17 00:00:00 2001 From: LeRatierBretonnier Date: Wed, 5 Aug 2026 14:15:11 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20apprentissage=20de=20Groupe=20-=20d?= =?UTF-8?q?=C3=A9s=20d=C3=A9pens=C3=A9s=20en=20cas=20d'=C3=A9chec=20et=20g?= =?UTF-8?q?ardes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Les Dés d'Expérience du Groupe sont désormais dépensés que le jet d'apprentissage soit réussi ou raté (cohérent avec l'apprentissage de personnage et les règles ; le décompte est sorti de #applySuccess). - Garde sur le type Capacité : si aucune Capacité de Groupe n'est sélectionnée, le jet est bloqué avec un avertissement (avant, il marquait learned.ability et dépensait les dés sans rien apprendre). - Limites de Capacités de Totem (personnage) : seules les Capacités du Totem courant du personnage comptent dans les compteurs 3×N1 / 1×N2-N3 / max 5. --- module/system/dialogs/groupLearningDialog.mjs | 11 ++++++++--- module/system/dialogs/learningDialog.mjs | 6 +++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/module/system/dialogs/groupLearningDialog.mjs b/module/system/dialogs/groupLearningDialog.mjs index e8f080c..c70ca9f 100644 --- a/module/system/dialogs/groupLearningDialog.mjs +++ b/module/system/dialogs/groupLearningDialog.mjs @@ -179,6 +179,9 @@ export default class GroupLearningDialog extends HandlebarsApplicationMixin(foun return 'VERMINE.error_group_reserve_max'; } if (c.type === 'ability') { + if (!c.key) { + return 'VERMINE.no_group_ability'; + } const ability = c.key ? actor.items.get(c.key) : null; const requiredLevel = ability?.system?.level?.value ?? 1; if (ability && (actor.system?.level?.value || 1) < requiredLevel) { @@ -220,14 +223,16 @@ export default class GroupLearningDialog extends HandlebarsApplicationMixin(foun const required = 1 + c.handicap; if ((roll._total ?? 0) >= required) { - await this.#applySuccess(c, spent); + await this.#applySuccess(c); } + // Les Dés d'Expérience sont perdus que le jet soit réussi ou raté. + await actor.update({ "system.experience.dice": Math.max(0, (actor.system.experience.dice || 0) - spent) }); this.close(); } - async #applySuccess(c, spent) { + async #applySuccess(c) { const actor = this.#actor; - const updates = { 'system.experience.dice': (actor.system.experience.dice || 0) - spent }; + const updates = {}; if (c.type === 'level') { const current = actor.system.level.value || 1; updates['system.level.value'] = Math.min(10, current + 1); diff --git a/module/system/dialogs/learningDialog.mjs b/module/system/dialogs/learningDialog.mjs index 4aa1b2d..0acb372 100644 --- a/module/system/dialogs/learningDialog.mjs +++ b/module/system/dialogs/learningDialog.mjs @@ -132,7 +132,11 @@ export default class LearningDialog extends HandlebarsApplicationMixin(foundry.a } #totemCapacityCounts() { - const items = (this.#actor.itemTypes?.ability || []).filter(i => i.system?.type === "character" && i.system?.learned); + // Ne comptabilise que les Capacités du Totem courant du personnage + // (les Capacités liées à un autre Totem ne bloquent pas les limites). + const totem = this.#actor.system?.identity?.totem; + const items = (this.#actor.itemTypes?.ability || []).filter(i => + i.system?.type === "character" && i.system?.learned && i.system?.totem === totem); const byLevel = { 1: 0, 2: 0, 3: 0 }; for (const i of items) { const level = i.system?.level?.value || 0;