diff --git a/module/actor.js b/module/actor.js index ca2898d6..27d2f041 100644 --- a/module/actor.js +++ b/module/actor.js @@ -1290,14 +1290,14 @@ export class RdDActor extends Actor { createCallbackExperience() { return { condition: r => r.rolled.isPart && r.finalLevel < 0 && game.settings.get("core", "rollMode") != 'selfroll', - action: r => this._appliquerAjoutExperience(r) + action: r => this._appliquerAjoutExperience(r, game.settings.get("core", "rollMode") != 'blindroll') }; } /* -------------------------------------------- */ - async _appliquerAjoutExperience(rollData) { - let xpResult = this.appliquerExperience( rollData.rolled, rollData.selectedCarac.label, (rollData.competence) ? rollData.competence.data.name: undefined ); - if (xpResult.result ) { + async _appliquerAjoutExperience(rollData, display=true) { + let xpResult = this.appliquerExperience( rollData.rolled, rollData.selectedCarac.label, rollData.competence); + if (display && xpResult.result ) { let xpmsg = "
Points d'expérience gagnés ! Carac: " + xpResult.xpCarac + ", Comp: " + xpResult.xpCompetence; let message = ChatUtility.prepareChatMessage('gmroll', this.name); message.content = "" + rollData.selectedCarac.label + "" @@ -1720,7 +1720,7 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ - async appliquerExperience( rolled, caracName, competenceName = undefined ) { + async appliquerExperience( rolled, caracName, competence = undefined ) { if ( rolled.isPart && rolled.finalLevel < 0) { // Cas de désir lancinant, pas d'expérience sur particulière @@ -1731,37 +1731,38 @@ export class RdDActor extends Actor { } if (caracName == 'derobee') caracName = 'agilite'; - let carac = duplicate(this.data.data.carac); - let xp = Math.abs(rolled.finalLevel); let xpCarac = Math.floor(xp / 2); // impair: arrondi inférieur en carac - let xpComp = 0; - if ( competenceName ) { + if ( competence ) { xpComp = xp - xpCarac; - let competence = duplicate( RdDUtility.findCompetence( this.data.items, competenceName ) ); - competence.data.xp += xpComp; + competence = duplicate(competence ); + competence.data.xp = Misc.toInt(competence.data.xp) + xpComp; await this.updateEmbeddedEntity( "OwnedItem", competence); } else { xpCarac = Math.max(xpCarac, 1); } - if ( !carac[caracName].isderivee) { - carac[caracName].xp += xpCarac; - await this.update( {"data.carac": carac } ); - } else { - ChatMessage.create( { content: `Vous avez ${xpCarac} à répartir pour la caractérisque dérivée ${caracName}. Vous devez le faire manuellement.`, - whisper: ChatMessage.getWhisperRecipients(game.user.name) } ); + if (xpCarac > 0) { + let carac = duplicate(this.data.data.carac); + let selectedCarac = RdDActor._findCaracByName(carac, caracName); + if ( !selectedCarac.derivee) { + selectedCarac.xp = Misc.toInt(selectedCarac.xp) + xpCarac; + await this.update( {"data.carac": carac } ); + } else { + ChatMessage.create( { content: `Vous avez ${xpCarac} à répartir pour la caractérisque dérivée ${caracName}. Vous devez le faire manuellement.`, + whisper: ChatMessage.getWhisperRecipients(game.user.name) } ); + } } return { result:true, xpcarac:xpCarac, xpCompetence: xpComp }; //XP } - return { result:false, xpcarac:0, xpCompetence: 0 }; // Pas d'XP } /* -------------------------------------------- */ async ajouteNombreAstral( data ) { // Gestion expérience (si existante) - this.appliquerExperience( data.rolled, "vue", "astrologie"); + let astrologie = RdDUtility.findCompetence( this.data.items, "astrologie"); + this.appliquerExperience( data.rolled, "vue", astrologie); // Ajout du nombre astral const item = {name: "Nombre Astral", type: "nombreastral", data: @@ -1788,23 +1789,39 @@ export class RdDActor extends Actor { getCaracByName(caracName) { switch (caracName) { - case 'reve-actuel': + case 'reve-actuel': case 'Rêve Actuel': return { label: 'Rêve Actuel', value: this.getReveActuel(), type: "number", ignoreEtatGeneral: true }; - case 'chance-actuelle': + case 'chance-actuelle': case 'Chance actuelle': return { - type: "number", - value: this.getChanceActuel(), label: 'Chance actuelle', + value: this.getChanceActuel(), + type: "number", ignoreEtatGeneral: true }; - default: - return this.data.data.carac[caracName]; // Per default } + return RdDActor._findCaracByName(this.data.data.carac, caracName); + } + + static _findCaracByName(carac, name) { + name = name.toLowerCase(); + switch (name) + { + case 'reve-actuel': case 'rêve actuel': + return carac.reve; + case 'chance-actuelle': case 'chance actuelle': + return carac.chance; + } + for (const [key, value] of Object.entries(carac)) { + if (name == key || name == value.label.toLowerCase()) { + return carac[key]; + } + } + return carac[name]; // Per default } /* -------------------------------------------- */