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 @@
+