Drop sur un objet met dans le conteneur parent

Augmenter la zone pour lacher un objet:
* si c'est un objet similaire, on regroupe
* si c'est un conteneur: on met dans le conteneur
* si c'est un objet dans un conteneur, on met dans le conteneur
* si c'est un objet porté, on met dans les objets portés
This commit is contained in:
Vincent Vandemeulebrouck
2022-09-25 17:51:57 +02:00
parent 5a2bc69fbb
commit ebe19959fa
5 changed files with 51 additions and 103 deletions

View File

@ -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) {