From 6b8fb3267aeffffb7472d5a680dce27ae366f0a7 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 29 Jul 2023 23:42:05 +0200 Subject: [PATCH] Fix: calcul de la place dans un conteneur MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Correction de l'ajout dans un conteneur, en faisant un calcul arrondi pour éviter les problèmes de virgule flotante --- module/actor/base-actor.js | 53 +++++++++----------------------------- module/item.js | 24 ++++++++++++++++- 2 files changed, 35 insertions(+), 42 deletions(-) diff --git a/module/actor/base-actor.js b/module/actor/base-actor.js index 5d434b82..1d1b3b6b 100644 --- a/module/actor/base-actor.js +++ b/module/actor/base-actor.js @@ -144,7 +144,7 @@ export class RdDBaseActor extends Actor { .forEach(async it => await it.onFinPeriodeTemporel(oldTimestamp, newTimestamp)) } - async creerObjetParMJ(object){ + async creerObjetParMJ(object) { if (!Misc.isUniqueConnectedGM()) { RdDBaseActor.remoteActorCall({ actorId: this.id, @@ -262,7 +262,7 @@ export class RdDBaseActor extends Actor { const quantite = (achat.choix.nombreLots ?? 1) * (achat.vente.tailleLot); const itemVendu = vendeur?.getItem(achat.vente.item._id) ?? game.items.get(achat.vente.item._id); if (!itemVendu) { - ChatUtility.notifyUser(achat.userId, 'warn', vendeur ? `Le vendeur n'a pas plus de ${achat.vente.item.name} !`: `Impossible de retrouver: ${achat.vente.item.name} !`); + ChatUtility.notifyUser(achat.userId, 'warn', vendeur ? `Le vendeur n'a pas plus de ${achat.vente.item.name} !` : `Impossible de retrouver: ${achat.vente.item.name} !`); return; } if (vendeur && !vendeur.verifierQuantite(itemVendu, quantite)) { @@ -447,62 +447,33 @@ export class RdDBaseActor extends Actor { /* -------------------------------------------- */ - conteneurPeutContenir(dest, item) { + conteneurPeutContenir(dest, moved) { if (!dest) { return true; } if (!dest.isConteneur()) { return false; } - const destData = dest - if (this._isConteneurContenu(item, dest)) { - ui.notifications.warn(`Impossible de déplacer un conteneur parent (${item.name}) dans un de ses contenus ${destData.name} !`); - return false; // Loop detected ! + if (moved.isConteneurContenu(dest)) { + ui.notifications.warn(`Impossible de déplacer un conteneur parent (${moved.name}) dans un de ses contenus ${dest.name} !`); + return false; } // Calculer le total actuel des contenus - let encContenu = this.getRecursiveEnc(dest) - Number(destData.system.encombrement); - let newEnc = this.getRecursiveEnc(item); // Calculer le total actuel du nouvel objet + const encContenu = dest.getEncContenu(); + const newEnc = moved.getEncTotal(); // Calculer le total actuel du nouvel objet + const placeDisponible = Math.roundDecimals(dest.system.capacite - encContenu - newEnc, 4) // Teste si le conteneur de destination a suffisament de capacité pour recevoir le nouvel objet - if (Number(destData.system.capacite) < encContenu + newEnc) { + if (placeDisponible < 0) { ui.notifications.warn( - `Le conteneur ${dest.name} a une capacité de ${destData.system.capacite}, et contient déjà ${encContenu}. - Impossible d'y ranger: ${item.name} d'encombrement ${newEnc}!`); + `Le conteneur ${dest.name} a une capacité de ${dest.system.capacite}, et contient déjà ${encContenu}. + Impossible d'y ranger: ${moved.name} d'encombrement ${newEnc}!`); return false; } return true; } - /* -------------------------------------------- */ - _isConteneurContenu(item, conteneur) { - if (item?.isConteneur()) { // Si c'est un conteneur, il faut vérifier qu'on ne le déplace pas vers un sous-conteneur lui appartenant - for (let id of item.system.contenu) { - let subObjet = this.getItem(id); - if (subObjet?.id == conteneur.id) { - return true; // Loop detected ! - } - if (subObjet?.isConteneur()) { - return this._isConteneurContenu(subObjet, conteneur); - } - } - } - return false; - } - /* -------------------------------------------- */ - getRecursiveEnc(objet) { - if (!objet) { - return 0; - } - const tplData = objet.system; - if (objet.type != 'conteneur') { - return Number(tplData.encombrement) * Number(tplData.quantite); - } - const encContenus = tplData.contenu.map(idContenu => this.getRecursiveEnc(this.getItem(idContenu))); - return encContenus.reduce(Misc.sum(), 0) - + Number(tplData.encombrement) /* TODO? Number(tplData.quantite) -- on pourrait avoir plusieurs conteneurs...*/ - } - /* -------------------------------------------- */ /** Ajoute un item dans un conteneur, sur la base * de leurs ID */ diff --git a/module/item.js b/module/item.js index 3bda723e..946e0a3d 100644 --- a/module/item.js +++ b/module/item.js @@ -395,6 +395,16 @@ export class RdDItem extends Item { return Math.max(this.system.encombrement ?? 0, 0); } + getEncContenu() { + return this.getContenu() + .map(it => it.getRecursiveEnc()) + .reduce(Misc.sum(), 0); + } + + getRecursiveEnc() { + return this.getEncTotal() + this.getEncContenu() + } + getEncHerbe() { switch (this.system.categorie) { case 'Repos': case 'Soin': case 'Alchimie': @@ -404,6 +414,18 @@ export class RdDItem extends Item { } + getContenu() { + if (this.isConteneur()) { + return this.system.contenu.map(idContenu => this.actor.getItem(idContenu)); + } + return [] + } + + isConteneurContenu(conteneur) { + return this.getContenu() + .find(it => it.id == conteneur.id || it.isConteneurContenu(conteneur)) + } + valeurTotale() { return (this.isService() ? 1 : this.getQuantite()) * this.valeur() } @@ -675,7 +697,7 @@ export class RdDItem extends Item { _armeChatData() { return [ `Compétence: ${this.system.competence}`, - `Dommages: ${this.system.dommages} ${this.system.mortalite=='non-mortel'? '(Non mortel)':''}`, + `Dommages: ${this.system.dommages} ${this.system.mortalite == 'non-mortel' ? '(Non mortel)' : ''}`, `Force minimum: ${this.system.force}`, `Resistance: ${this.system.resistance}`, ...this._inventaireTemplateChatData()