From 282fb2794ae6e8457f87e03f49ec8fd7bc39be90 Mon Sep 17 00:00:00 2001 From: LeRatierBretonnier Date: Wed, 5 Aug 2026 20:58:46 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20validation=20de=20phase=20d'Exp=C3=A9ri?= =?UTF-8?q?ence=20(r=C3=A9initialisation=20des=20limites)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Nouveau bouton « Valider la phase » sur les fiches Personnage et Groupe : incrémente experience.phase et réinitialise les limites d'apprentissage (learned.*) pour recommencer une nouvelle phase, sans repasser par le dialogue d'attribution du MJ. - Helper VermineExperience.completePhase(actor) mutualisé (personnage ou Groupe) ; i18n FR/EN. --- lang/en.json | 2 ++ lang/fr.json | 2 ++ .../applications/sheets/character-sheet.mjs | 10 ++++++++- module/applications/sheets/group-sheet.mjs | 10 ++++++++- module/system/experience.mjs | 22 +++++++++++++++++++ .../actor/appv2/character-experience.hbs | 3 +++ templates/actor/appv2/group-reserve.hbs | 1 + 7 files changed, 48 insertions(+), 2 deletions(-) diff --git a/lang/en.json b/lang/en.json index 42d0864..d0a14d9 100644 --- a/lang/en.json +++ b/lang/en.json @@ -376,6 +376,8 @@ "evolution_dice": "Evolution dice", "open_experience_phase": "Experience phase", "open_learning": "Learning", + "validate_phase": "Validate phase", + "validate_phase_done": "Experience phase validated: learning limits reset.", "learning_limits": "Learning limits (per phase)", "learned_skill": "Skill", "learned_specialty": "Specialty", diff --git a/lang/fr.json b/lang/fr.json index 61a7cfe..2cfbbcb 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -359,6 +359,8 @@ "evolution_dice": "Dés d'Évolution", "open_experience_phase": "Phase d'Expérience", "open_learning": "Apprentissage", + "validate_phase": "Valider la phase", + "validate_phase_done": "Phase d'Expérience validée : limites d'apprentissage réinitialisées.", "learning_limits": "Limites d'apprentissage (par phase)", "learned_skill": "Compétence", "learned_specialty": "Spécialité", diff --git a/module/applications/sheets/character-sheet.mjs b/module/applications/sheets/character-sheet.mjs index 60aed07..a5e87f0 100644 --- a/module/applications/sheets/character-sheet.mjs +++ b/module/applications/sheets/character-sheet.mjs @@ -9,7 +9,8 @@ export default class VermineCharacterSheetV2 extends VermineBaseActorSheet { actions: { addSpecialty: VermineCharacterSheetV2.#onAddSpecialty, openExperiencePhase: VermineCharacterSheetV2.#onOpenExperiencePhase, - openLearning: VermineCharacterSheetV2.#onOpenLearning + openLearning: VermineCharacterSheetV2.#onOpenLearning, + validatePhase: VermineCharacterSheetV2.#onValidatePhase } } @@ -125,4 +126,11 @@ export default class VermineCharacterSheetV2 extends VermineBaseActorSheet { const dialog = await LearningDialog.create({ actorId: this.document.id }) if (dialog) dialog.render(true) } + + /** Valide la phase d'Expérience courante et réinitialise les limites. */ + static async #onValidatePhase() { + const { VermineExperience } = await import("../../system/experience.mjs") + await VermineExperience.completePhase(this.document) + ui.notifications.info(game.i18n.localize("VERMINE.validate_phase_done")) + } } diff --git a/module/applications/sheets/group-sheet.mjs b/module/applications/sheets/group-sheet.mjs index c1e3dcb..a89eaab 100644 --- a/module/applications/sheets/group-sheet.mjs +++ b/module/applications/sheets/group-sheet.mjs @@ -15,7 +15,8 @@ export default class VermineGroupSheetV2 extends VermineBaseActorSheet { addObjective: VermineGroupSheetV2.#onAddObjective, createTotemAbility: VermineGroupSheetV2.#onCreateTotemAbility, openLearning: VermineGroupSheetV2.#onOpenLearning, - openExperiencePhase: VermineGroupSheetV2.#onOpenExperiencePhase + openExperiencePhase: VermineGroupSheetV2.#onOpenExperiencePhase, + validatePhase: VermineGroupSheetV2.#onValidatePhase } } @@ -187,4 +188,11 @@ export default class VermineGroupSheetV2 extends VermineBaseActorSheet { const dialog = await GroupLearningDialog.create({ actorId: this.document.id }) if (dialog) dialog.render(true) } + + /** Valide la phase d'Expérience courante du Groupe et réinitialise les limites. */ + static async #onValidatePhase() { + const { VermineExperience } = await import("../../system/experience.mjs") + await VermineExperience.completePhase(this.document) + ui.notifications.info(game.i18n.localize("VERMINE.validate_phase_done")) + } } diff --git a/module/system/experience.mjs b/module/system/experience.mjs index 9c97e09..193d612 100644 --- a/module/system/experience.mjs +++ b/module/system/experience.mjs @@ -213,4 +213,26 @@ export class VermineExperience { const preferred = actor.system?.skill_categories?.preferred return Boolean(category && preferred && category === preferred) } + + /** + * Valide la phase d'Expérience courante : passe à la phase suivante et + * réinitialise toutes les limites d'apprentissage (learned.*), pour un + * personnage ou un Groupe. + * @param {foundry.abstract.Document} actor personnage ou Groupe + * @returns {Promise} + */ + static async completePhase(actor) { + const ex = actor.system?.experience + if (!ex) return + const phase = (ex.phase || 0) + 1 + const update = { "system.experience.phase": phase } + if (ex.learned && typeof ex.learned === "object") { + update["system.experience.learned.phase"] = phase + for (const key of Object.keys(ex.learned)) { + if (key === "phase") continue + update[`system.experience.learned.${key}`] = false + } + } + await actor.update(update) + } } diff --git a/templates/actor/appv2/character-experience.hbs b/templates/actor/appv2/character-experience.hbs index baa96d4..56626d5 100644 --- a/templates/actor/appv2/character-experience.hbs +++ b/templates/actor/appv2/character-experience.hbs @@ -25,6 +25,9 @@ +
diff --git a/templates/actor/appv2/group-reserve.hbs b/templates/actor/appv2/group-reserve.hbs index 0dc7645..f98eaa9 100644 --- a/templates/actor/appv2/group-reserve.hbs +++ b/templates/actor/appv2/group-reserve.hbs @@ -53,6 +53,7 @@
+