diff --git a/module/actor.js b/module/actor.js index ee5edea4..48a71bec 100644 --- a/module/actor.js +++ b/module/actor.js @@ -1571,34 +1571,7 @@ export class RdDActor extends RdDBaseActorSang { /* -------------------------------------------- */ async checkCompetenceXP(compName, newXP, display = true) { - let compData = this.getCompetence(compName); - if (compData && newXP && newXP == compData.system.xp) { // Si édition, mais sans changement XP - return; - } - newXP = (newXP) ? newXP : compData.system.xp; - if (compData && newXP > 0) { - let xpNeeded = RdDItemCompetence.getCompetenceNextXp(compData.system.niveau + 1); - if (newXP >= xpNeeded) { - let newCompData = foundry.utils.duplicate(compData); - newCompData.system.niveau += 1; - newCompData.system.xp = newXP; - let checkXp = { - alias: this.getAlias(), - competence: newCompData.name, - niveau: newCompData.system.niveau, - xp: newCompData.system.xp, - archetype: newCompData.system.niveau_archetype, - archetypeWarning: newCompData.system.niveau > compData.system.niveau_archetype - } - if (display) { - ChatMessage.create({ - whisper: ChatUtility.getOwners(this), - content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-competence-xp.hbs`, checkXp) - }); - } - return checkXp; - } - } + return this.getCompetence(compName)?.checkCompetenceXP( newXP, display) } /* -------------------------------------------- */ @@ -2250,7 +2223,7 @@ export class RdDActor extends RdDBaseActorSang { const from = Number(xpData.competence.system.xp); const to = from + xpData.xpCompetence; await this.updateEmbeddedDocuments('Item', [{ _id: xpData.competence._id, 'system.xp': to }]); - xpData.checkComp = await this.checkCompetenceXP(xpData.competence.name, undefined, false); + xpData.checkComp = await this.checkCompetenceXP(xpData.competence.name, undefined, false) await ExperienceLog.add(this, XP_TOPIC.XP, from, to, xpData.competence.name); return [xpData] } @@ -2891,12 +2864,6 @@ export class RdDActor extends RdDBaseActorSang { await this.diminuerQuantiteObjet(potion.id, 1, { supprimerSiZero: potion.supprimer }); } - /* -------------------------------------------- */ - async onPreUpdateItem(item, change, options, id) { - if (item.isCompetencePersonnage() && item.system.defaut_carac && item.system.xp) { - await this.checkCompetenceXP(item.name, item.system.xp); - } - } /* -------------------------------------------- */ async onCreateItem(item, options, id) { switch (item.type) { diff --git a/module/actor/base-actor-sang.js b/module/actor/base-actor-sang.js index 58d349eb..81b545f5 100644 --- a/module/actor/base-actor-sang.js +++ b/module/actor/base-actor-sang.js @@ -17,6 +17,14 @@ import { CARACS } from "../rdd-carac.js"; */ export class RdDBaseActorSang extends RdDBaseActorReve { + + async _preUpdate(changed, options, user) { + const updatedEndurance = changed?.system?.sante?.endurance + if (updatedEndurance && options.diff) { + await this.setEffect(STATUSES.StatusUnconscious, updatedEndurance.value == 0) + } + } + prepareActorData() { this.system.sante.vie.max = Math.ceil((this.getTaille() + this.getConstitution()) / 2) this.system.sante.vie.value = Math.min(this.system.sante.vie.value, this.system.sante.vie.max) @@ -281,14 +289,6 @@ export class RdDBaseActorSang extends RdDBaseActorReve { return Math.max(0, Math.min(maxEndVie, maxEndGraves, maxEndCritiques)); } - async onUpdateActor(update, options, actorId) { - const updatedEndurance = update?.system?.sante?.endurance - if (updatedEndurance && options.diff) { - await this.setEffect(STATUSES.StatusUnconscious, updatedEndurance.value == 0) - } - await super.onUpdateActor(update, options, actorId) - } - async onCreateItem(item, options, id) { await this.changeItemEffects(item) await super.onCreateItem(item, options, id) diff --git a/module/actor/base-actor.js b/module/actor/base-actor.js index e6236819..7b711bb9 100644 --- a/module/actor/base-actor.js +++ b/module/actor/base-actor.js @@ -49,11 +49,9 @@ export class RdDBaseActor extends Actor { static init() { Handlebars.registerHelper('actor-isFeminin', actor => actor.isFeminin()) - Hooks.on("preUpdateItem", (item, change, options, id) => Misc.documentIfResponsible(item.parent)?.onPreUpdateItem(item, change, options, id)) Hooks.on("createItem", (item, options, id) => Misc.documentIfResponsible(item.parent)?.onCreateItem(item, options, id)) Hooks.on("updateItem", (item, updates, options, id) => Misc.documentIfResponsible(item.parent)?.onUpdateItem(item, updates, options, id)) Hooks.on("deleteItem", (item, options, id) => Misc.documentIfResponsible(item.parent)?.onDeleteItem(item, options, id)) - Hooks.on("updateActor", (actor, change, options, actorId) => Misc.documentIfResponsible(actor)?.onUpdateActor(change, options, actorId)) } static onSocketMessage(sockmsg) { @@ -357,11 +355,8 @@ export class RdDBaseActor extends Actor { async updateCarac(caracName, to) { } - async onUpdateActor(change, options, actorId) { - } - /* -------------------------------------------- */ - async onPreUpdateItem(item, change, options, id) { } + async onCreateItem(item, options, id) { } diff --git a/module/item-competence.js b/module/item-competence.js index 5b9d201c..b36dae7a 100644 --- a/module/item-competence.js +++ b/module/item-competence.js @@ -1,4 +1,4 @@ - +import { ChatUtility } from "./chat-utility.js"; import { Grammar } from "./grammar.js"; import { RdDInitiative } from "./initiative.mjs"; import { RdDItem } from "./item.js"; @@ -71,6 +71,36 @@ export class RdDItemCompetence extends RdDItem { } return undefined } + + async _preUpdate(changed, options, user) { + await this.checkCompetenceXP(changed.system?.xp) + return super._preUpdate(changed, options, user) + } + + async checkCompetenceXP(newXP, display = true) { + if (this.actor?.isPersonnage() && newXP && newXP != this.system.xp && newXP > 0) { + const newNiv = this.system.niveau + 1 + let needed = RdDItemCompetence.getCompetenceNextXp(newNiv) + if (newXP >= needed) { + const xpData = { + alias: this.actor.getAlias(), + competence: this.name, + niveau: newNiv, + xp: newXP, + archetype: this.system.niveau_archetype, + archetypeWarning: newNiv > this.system.niveau_archetype + } + if (display) { + ChatMessage.create({ + whisper: ChatUtility.getOwners(this.actor), + content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-competence-xp.hbs`, xpData) + }) + } + return xpData + } + } + } + /* -------------------------------------------- */ static getLabelCategorie(category) { return CATEGORIES_COMPETENCES[category].label;