From 95bcc2e77cbad9dfab815f80b7b0e0f8232d2cf4 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Thu, 27 May 2021 22:40:12 +0200 Subject: [PATCH] Fix calcul encTotal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Autant le calculer depuis les objets eux-mêmes --- module/actor.js | 4 +-- module/item.js | 6 ++++- module/rdd-utility.js | 62 ++++++++++++++++++++++++++----------------- 3 files changed, 43 insertions(+), 29 deletions(-) diff --git a/module/actor.js b/module/actor.js index 77d31eac..cdd90a49 100644 --- a/module/actor.js +++ b/module/actor.js @@ -1142,9 +1142,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ computeEncombrement() { - this.encTotal = this.filterItemsData(it => it.data.encombrement != undefined) - .map(it => it.data.encTotal) - .reduce(Misc.sum(), 0); + this.encTotal = this.items.map(it => it.getEncTotal()).reduce(Misc.sum(), 0); return this.encTotal; } diff --git a/module/item.js b/module/item.js index 044ed59d..21db5b80 100644 --- a/module/item.js +++ b/module/item.js @@ -88,13 +88,17 @@ export class RdDItem extends Item { return Misc.templateData(this).magique; } + getEncTotal() { + const itemData = Misc.data(this); + return Number(itemData.data.encombrement ?? 0) * Number(itemData.data.quantite ?? 1); + } getEnc() { const itemData = Misc.data(this); switch (itemData.type) { case 'herbe': return encBrin; } - return itemData.data.encombrement + return itemData.data.encombrement ?? 0; } prepareDerivedData() { diff --git a/module/rdd-utility.js b/module/rdd-utility.js index de4da058..44f5708a 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -177,7 +177,7 @@ export class RdDUtility { 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-surenc.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-enctotal.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-moral.html', - 'systems/foundryvtt-reve-de-dragon/templates/partial-select-carac.html', + 'systems/foundryvtt-reve-de-dragon/templates/partial-select-carac.html', // Calendrier 'systems/foundryvtt-reve-de-dragon/templates/calendar-template.html', 'systems/foundryvtt-reve-de-dragon/templates/calendar-editor-template.html', @@ -339,28 +339,40 @@ export class RdDUtility { // Attribution des objets aux conteneurs for (let conteneur of conteneurs) { conteneur.subItems = []; - conteneur.data.encTotal = conteneur.data.encombrement; - //conteneur.data.encTotal = ; Deja calculé - if (conteneur.data.contenu) { - for (let id of conteneur.data.contenu) { - let objet = objets.find(objet => (id == objet._id)); - if (objet) { - if (!objet.data.encombrement) - objet.data.encombrement = 0; // Auto-fix - objet.estContenu = true; // Permet de filtrer ce qifui est porté dans le template - objetVersConteneur[id] = conteneur._id; - conteneur.data.encTotal += Number(objet.data.encombrement) * Number(((objet.data.quantite) ? objet.data.quantite : 1)); - conteneur.subItems.push(objet); - } + for (let id of conteneur.data.contenu ?? []) { + let objet = objets.find(objet => (id == objet._id)); + if (objet) { + objet.estContenu = true; // Permet de filtrer ce qui est porté dans le template + objetVersConteneur[id] = conteneur._id; + conteneur.subItems.push(objet); } } } + for (let conteneur of conteneurs) { + conteneur.data.encTotal = RdDUtility.calculEncContenu(conteneur, objets); + } return objetVersConteneur; } - + + static calculEncContenu(conteneur, objets) { + const itemData = Misc.data(conteneur); + const contenuDatas = (itemData.data.contenu ?? []).filter(id => id != undefined) + .map(id => Misc.data(objets.find(it => (id == it._id)))); + let enc = Number(itemData.data.encombrement ?? 0) * Number(itemData.data.quantite ?? 1); + for (let itemData of contenuDatas){ + if (itemData.type == 'conteneur') { + enc += RdDUtility.calculEncContenu(itemData, objets); + } + else{ + enc += Number(itemData.data.encombrement ?? 0) * Number(itemData.data.quantite ?? 1); + } + } + return enc; + } + // Construit la liste des conteneurs de niveau 1 (c'est à dire non contenu eux-même dans un conteneur) static conteneursRacine(conteneurs) { - return conteneurs.filter( (conteneur, index, arr) => !conteneur.estContenu); + return conteneurs.filter((conteneur, index, arr) => !conteneur.estContenu); } /* -------------------------------------------- */ @@ -429,7 +441,7 @@ export class RdDUtility { return ReglesOptionelles.isUsing("appliquer-fatigue") ? { malus: RdDUtility.calculMalusFatigue(fatigue, endurance), html: "" + RdDUtility.makeHTMLfatigueMatrix(fatigue, endurance).html() + "
" - } : { malus:0, html:''}; + } : { malus: 0, html: '' }; } /* -------------------------------------------- */ @@ -513,7 +525,7 @@ export class RdDUtility { if (ReglesOptionelles.isUsing("appliquer-fatigue")) { max = Math.max(1, Math.min(max, 60)); value = Math.min(max * 2, Math.max(0, value)); - + let fatigueTab = fatigueMatrix[max]; let fatigueRem = value; for (let idx = 0; idx < fatigueTab.length; idx++) { @@ -558,7 +570,7 @@ export class RdDUtility { return RdDUtility.responseNombreAstral(sockmsg.data); case "msg_tmr_move": let actor = game.actors.get(sockmsg.data.actorId); - if (actor.isOwner || game.user.isGM ) { + if (actor.isOwner || game.user.isGM) { actor.refreshTMRView(sockmsg.data.tmrPos); } break; @@ -587,7 +599,7 @@ export class RdDUtility { // gestion bouton tchat Acheter html.on("click", '.button-acheter', event => DialogItemAchat.onButtonAcheter(event)); - + // Gestion du bouton payer html.on("click", '.payer-button', event => { let sumdenier = event.currentTarget.attributes['data-somme-denier']?.value ?? 0; @@ -637,14 +649,14 @@ export class RdDUtility { if (token.actor && token.data.actorLink) { return token.actor; } - if (msgPlayer != undefined){ + if (msgPlayer != undefined) { msgPlayer += "
le token sélectionné doit être lié à un personnage"; } } if (game.user.character) { return game.user.character; } - if (msgPlayer != undefined){ + if (msgPlayer != undefined) { msgPlayer += "
vous pouvez sélectionner un seul token lié à un personnage"; msgPlayer += "
vous devez être connecté comme joueur avec un personnage sélectionné"; ui.notifications.warn(msgPlayer); @@ -805,9 +817,9 @@ export class RdDUtility { } /*-------------------------------------------- */ - static distribuerStress( stressValue, raison = 'Inconnu', nomJoueur = undefined) { + static distribuerStress(stressValue, raison = 'Inconnu', nomJoueur = undefined) { if (game.user.isGM) { - if( nomJoueur == undefined) { + if (nomJoueur == undefined) { for (let actor of game.actors) { if (actor.hasPlayerOwner) { actor.addCompteurValue('stress', stressValue, raison); @@ -816,7 +828,7 @@ export class RdDUtility { } } else { //console.log(stressValue, nomJoueur); - let joueur = game.users.find( user => user.name.toLowerCase() == nomJoueur.toLowerCase() ); + let joueur = game.users.find(user => user.name.toLowerCase() == nomJoueur.toLowerCase()); //console.log("Player", joueur, joueur.character ); joueur.character.addCompteurValue('stress', stressValue, raison); ui.notifications.info(`${joueur.character.name} a reçu ${stressValue} points de Stress (raison : ${raison})`);