From 37de279a65a8d48b74342e346ab27092ffb6cbef Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Thu, 27 May 2021 22:40:12 +0200 Subject: [PATCH] Fix calcul encTotal --- module/actor.js | 1 + module/item.js | 2 +- module/rdd-utility.js | 57 ++++++++++++++++++++++++------------------- 3 files changed, 34 insertions(+), 26 deletions(-) diff --git a/module/actor.js b/module/actor.js index 77d31eac..873ed725 100644 --- a/module/actor.js +++ b/module/actor.js @@ -1143,6 +1143,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ computeEncombrement() { this.encTotal = this.filterItemsData(it => it.data.encombrement != undefined) + .filter(it => !it.estContenu) .map(it => it.data.encTotal) .reduce(Misc.sum(), 0); return this.encTotal; diff --git a/module/item.js b/module/item.js index 044ed59d..6f72cf3a 100644 --- a/module/item.js +++ b/module/item.js @@ -94,7 +94,7 @@ export class RdDItem extends Item { 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..e628228e 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,35 @@ 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); } } } + RdDUtility.calculEncObjets(objets); return objetVersConteneur; } - + + static calculEncObjets(objets) { + for (let objet of objets) { + objet.data.encTotal = RdDUtility.calculEnc(objet, objets); + } + } + + static calculEnc(objet, objets) { + const contenu = objet.data.contenu ?? []; + return contenu.map(id => objets.find(objet => (id == objet._id))) + .map(inside => RdDUtility.calculEnc(inside, objets)) + .reduce(Misc.sum(), Number(objet.data.encombrement ?? 0) * Number(objet.data.quantite ?? 1)); + } + // 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 +436,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 +520,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 +565,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 +594,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 +644,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 +812,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 +823,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})`);