feat: validation de phase d'Expérience (réinitialisation des limites)

- 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.
This commit is contained in:
2026-08-05 20:58:46 +02:00
parent 46b9512256
commit 282fb2794a
7 changed files with 48 additions and 2 deletions
+2
View File
@@ -376,6 +376,8 @@
"evolution_dice": "Evolution dice", "evolution_dice": "Evolution dice",
"open_experience_phase": "Experience phase", "open_experience_phase": "Experience phase",
"open_learning": "Learning", "open_learning": "Learning",
"validate_phase": "Validate phase",
"validate_phase_done": "Experience phase validated: learning limits reset.",
"learning_limits": "Learning limits (per phase)", "learning_limits": "Learning limits (per phase)",
"learned_skill": "Skill", "learned_skill": "Skill",
"learned_specialty": "Specialty", "learned_specialty": "Specialty",
+2
View File
@@ -359,6 +359,8 @@
"evolution_dice": "Dés d'Évolution", "evolution_dice": "Dés d'Évolution",
"open_experience_phase": "Phase d'Expérience", "open_experience_phase": "Phase d'Expérience",
"open_learning": "Apprentissage", "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)", "learning_limits": "Limites d'apprentissage (par phase)",
"learned_skill": "Compétence", "learned_skill": "Compétence",
"learned_specialty": "Spécialité", "learned_specialty": "Spécialité",
@@ -9,7 +9,8 @@ export default class VermineCharacterSheetV2 extends VermineBaseActorSheet {
actions: { actions: {
addSpecialty: VermineCharacterSheetV2.#onAddSpecialty, addSpecialty: VermineCharacterSheetV2.#onAddSpecialty,
openExperiencePhase: VermineCharacterSheetV2.#onOpenExperiencePhase, 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 }) const dialog = await LearningDialog.create({ actorId: this.document.id })
if (dialog) dialog.render(true) 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"))
}
} }
+9 -1
View File
@@ -15,7 +15,8 @@ export default class VermineGroupSheetV2 extends VermineBaseActorSheet {
addObjective: VermineGroupSheetV2.#onAddObjective, addObjective: VermineGroupSheetV2.#onAddObjective,
createTotemAbility: VermineGroupSheetV2.#onCreateTotemAbility, createTotemAbility: VermineGroupSheetV2.#onCreateTotemAbility,
openLearning: VermineGroupSheetV2.#onOpenLearning, 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 }) const dialog = await GroupLearningDialog.create({ actorId: this.document.id })
if (dialog) dialog.render(true) 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"))
}
} }
+22
View File
@@ -213,4 +213,26 @@ export class VermineExperience {
const preferred = actor.system?.skill_categories?.preferred const preferred = actor.system?.skill_categories?.preferred
return Boolean(category && preferred && category === 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<void>}
*/
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)
}
} }
@@ -25,6 +25,9 @@
<button type="button" data-action="openLearning"> <button type="button" data-action="openLearning">
<i class="fas fa-graduation-cap"></i> {{ localize 'VERMINE.open_learning' }} <i class="fas fa-graduation-cap"></i> {{ localize 'VERMINE.open_learning' }}
</button> </button>
<button type="button" data-action="validatePhase">
<i class="fas fa-check"></i> {{ localize 'VERMINE.validate_phase' }}
</button>
</div> </div>
<section class="exp-rewards"> <section class="exp-rewards">
+1
View File
@@ -53,6 +53,7 @@
<div class="group-experience-actions flexrow flex-group-center"> <div class="group-experience-actions flexrow flex-group-center">
<button type="button" data-action="openLearning"><i class="fas fa-graduation-cap"></i> {{ localize 'VERMINE.open_learning' }}</button> <button type="button" data-action="openLearning"><i class="fas fa-graduation-cap"></i> {{ localize 'VERMINE.open_learning' }}</button>
<button type="button" data-action="openExperiencePhase"><i class="fas fa-star"></i> {{ localize 'VERMINE.experience_phase' }}</button> <button type="button" data-action="openExperiencePhase"><i class="fas fa-star"></i> {{ localize 'VERMINE.experience_phase' }}</button>
<button type="button" data-action="validatePhase"><i class="fas fa-check"></i> {{ localize 'VERMINE.validate_phase' }}</button>
</div> </div>
</div> </div>