diff --git a/module/actor.js b/module/actor.js index 527f44c1..3084d0e9 100644 --- a/module/actor.js +++ b/module/actor.js @@ -1123,28 +1123,29 @@ export class RdDActor extends Actor { * de leurs ID */ async enleverDeConteneur(item, conteneur, onEnleverDeConteneur) { if (conteneur?.isConteneur()) { - let data2use = duplicate(conteneur); - let contenu = data2use.system.contenu; - let index = contenu.indexOf(item.id); - while (index >= 0) { // Force cleanup, itemId is unique - contenu.splice(index, 1); - index = contenu.indexOf(item.id); - } - item.system.estContenu = false; - await this.updateEmbeddedDocuments('Item', [data2use]); + item.estContenu = false; + await this.updateEmbeddedDocuments('Item', [{ + _id: conteneur.id, + 'system.contenu': conteneur.system.contenu.filter(id => id != item.id) + }]); onEnleverDeConteneur(); } } - + /* -------------------------------------------- */ /** Ajoute un item dans un conteneur, sur la base * de leurs ID */ async ajouterDansConteneur(item, conteneur, onAjouterDansConteneur) { - if (conteneur?.isConteneur()) { - let data2use = duplicate(conteneur); - data2use.system.contenu.push(item.id); - item.system.estContenu = true; - await this.updateEmbeddedDocuments('Item', [data2use]); + if (!conteneur) { + // TODO: afficher + item.estContenu = false; + } + else if (conteneur.isConteneur()) { + item.estContenu = true; + await this.updateEmbeddedDocuments('Item', [{ + _id: conteneur.id, + 'system.contenu': [...conteneur.system.contenu, item.id] + }]); onAjouterDansConteneur(item.id, conteneur.id); } } @@ -1182,23 +1183,39 @@ export class RdDActor extends Actor { if (item?.isEquipement() && sourceActorId == targetActorId) { // rangement if (srcId != destId && itemId != destId) { // déplacement de l'objet - const dest = this.getObjet(destId); const src = this.getObjet(srcId); - // changer de conteneur - if (this.conteneurPeutContenir(dest, item)) { - await this.enleverDeConteneur(item, src, params.onEnleverConteneur); - await this.ajouterDansConteneur(item, dest, params.onAjouterDansConteneur); - } - else if (dest?.isEquipementSimilaire(item)) { + const dest = this.getObjet(destId); + const cible = this.getContenantOrParent(dest); + const messageEquipementDifferent = item.messageEquipementDifferent(dest); + if (dest && !messageEquipementDifferent) { await this.regrouperEquipementsSimilaires(item, dest); result = false; } + // changer de conteneur + else if (!cible || this.conteneurPeutContenir(cible, item)) { + await this.enleverDeConteneur(item, src, params.onEnleverConteneur); + await this.ajouterDansConteneur(item, cible, params.onAjouterDansConteneur); + } + else { + ui.notifications.info(messageEquipementDifferent); + } } } await this.computeEncombrementTotalEtMalusArmure(); return result; } + getContenantOrParent(dest) { + if (!dest || dest.isConteneur()) { + return dest; + } + return this.getContenant(dest); + } + + getContenant(item) { + return this.itemTypes['conteneur'].find(it => it.system.contenu.includes(item.id)); + } + /* -------------------------------------------- */ conteneurPeutContenir(dest, item) { if (!dest) { diff --git a/module/item.js b/module/item.js index 7544d17d..88673ec4 100644 --- a/module/item.js +++ b/module/item.js @@ -198,8 +198,9 @@ export class RdDItem extends Item { /* -------------------------------------------- */ // détermine si deux équipements sont similaires: de même type, et avec les même champs hormis la quantité - isEquipementSimilaire(other) { - if (!this.isEquipement()) return false; + messageEquipementDifferent(other) { + if (!other || !this.isEquipement()) return undefined; + let message = undefined; if (this.type != other.type) { message = `Impossible de regrouper ${this.type} avec ${other.type}`; @@ -220,11 +221,7 @@ export class RdDItem extends Item { } } } - if (message){ - ui.notifications.info(message) - return false; - } - return true; + return message; } async proposerVente() { diff --git a/templates/actor-sheet-inventaire-conteneur.html b/templates/actor-sheet-inventaire-conteneur.html deleted file mode 100644 index 011e5f45..00000000 --- a/templates/actor-sheet-inventaire-conteneur.html +++ /dev/null @@ -1,52 +0,0 @@ -