Fix: calcul de la place dans un conteneur
Correction de l'ajout dans un conteneur, en faisant un calcul arrondi pour éviter les problèmes de virgule flotante
This commit is contained in:
		@@ -447,62 +447,33 @@ export class RdDBaseActor extends Actor {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* -------------------------------------------- */
 | 
					  /* -------------------------------------------- */
 | 
				
			||||||
  conteneurPeutContenir(dest, item) {
 | 
					  conteneurPeutContenir(dest, moved) {
 | 
				
			||||||
    if (!dest) {
 | 
					    if (!dest) {
 | 
				
			||||||
      return true;
 | 
					      return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (!dest.isConteneur()) {
 | 
					    if (!dest.isConteneur()) {
 | 
				
			||||||
      return false;
 | 
					      return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    const destData = dest
 | 
					    if (moved.isConteneurContenu(dest)) {
 | 
				
			||||||
    if (this._isConteneurContenu(item, dest)) {
 | 
					      ui.notifications.warn(`Impossible de déplacer un conteneur parent (${moved.name}) dans un de ses contenus ${dest.name} !`);
 | 
				
			||||||
      ui.notifications.warn(`Impossible de déplacer un conteneur parent (${item.name}) dans un de ses contenus ${destData.name} !`);
 | 
					      return false;
 | 
				
			||||||
      return false; // Loop detected !
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Calculer le total actuel des contenus
 | 
					    // Calculer le total actuel des contenus
 | 
				
			||||||
    let encContenu = this.getRecursiveEnc(dest) - Number(destData.system.encombrement);
 | 
					    const encContenu = dest.getEncContenu();
 | 
				
			||||||
    let newEnc = this.getRecursiveEnc(item); // Calculer le total actuel du nouvel objet
 | 
					    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
 | 
					    // 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(
 | 
					      ui.notifications.warn(
 | 
				
			||||||
        `Le conteneur ${dest.name} a une capacité de ${destData.system.capacite}, et contient déjà ${encContenu}.
 | 
					        `Le conteneur ${dest.name} a une capacité de ${dest.system.capacite}, et contient déjà ${encContenu}.
 | 
				
			||||||
        Impossible d'y ranger: ${item.name} d'encombrement ${newEnc}!`);
 | 
					        Impossible d'y ranger: ${moved.name} d'encombrement ${newEnc}!`);
 | 
				
			||||||
      return false;
 | 
					      return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return true;
 | 
					    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
 | 
					  /** Ajoute un item dans un conteneur, sur la base
 | 
				
			||||||
   * de leurs ID */
 | 
					   * de leurs ID */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -395,6 +395,16 @@ export class RdDItem extends Item {
 | 
				
			|||||||
    return Math.max(this.system.encombrement ?? 0, 0);
 | 
					    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() {
 | 
					  getEncHerbe() {
 | 
				
			||||||
    switch (this.system.categorie) {
 | 
					    switch (this.system.categorie) {
 | 
				
			||||||
      case 'Repos': case 'Soin': case 'Alchimie':
 | 
					      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() {
 | 
					  valeurTotale() {
 | 
				
			||||||
    return (this.isService() ? 1 : this.getQuantite()) * this.valeur()
 | 
					    return (this.isService() ? 1 : this.getQuantite()) * this.valeur()
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user