Regrouper des équipements #169

This commit is contained in:
Vincent Vandemeulebrouck
2021-04-13 22:42:39 +02:00
parent b4eb66bef5
commit 91f532409b
2 changed files with 134 additions and 108 deletions

View File

@ -826,21 +826,6 @@ export class RdDActor extends Actor {
}
/* -------------------------------------------- */
validateConteneur(itemId, conteneurId) {
const dest = this.getObjet(conteneurId);
const item = this.getObjet(itemId);
const destData = Misc.data(dest);
if (destData?.type != 'conteneur') {
ui.notifications.warn(`Impossible de déplacer un objet (${item.name}) vers un ${destData.type} qui n'est pas un conteneur (${dest.name}) !`);
return false;
}
if (this._isConteneurContenu(item, conteneurId)) {
ui.notifications.warn(`Impossible de déplacer un conteneur parent (${item.name}) dans un de ses contenus ${dest.name} !`);
return false; // Loop detected !
}
return true;
}
_isConteneurContenu(item, conteneurId) {
if (Misc.data(item)?.type == 'conteneur') { // 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 Misc.templateData(item).contenu) {
@ -870,41 +855,6 @@ export class RdDActor extends Actor {
+ Number(tplData.encombrement) /* TODO? Number(tplData.quantite) -- on pourrait avoir plusieurs conteneurs...*/
}
/* -------------------------------------------- */
isConteneurSuffisant(itemId, conteneurId) {
if (!conteneurId) {
// on peut toujours vider son sac
return true;
}
return this.validateConteneur(itemId, conteneurId) && this.testConteneurCapacite(itemId, conteneurId);
}
/* -------------------------------------------- */
/** Teste si le conteneur de destination a suffisament de capacité
* pour recevoir le nouvel objet
*/
testConteneurCapacite(itemId, conteneurId) {
let conteneur = this.getObjet(conteneurId); // recup conteneur (ou undefined)
//console.log("Conteneur trouvé : ", conteneur);
if (conteneur?.type != "conteneur") {
return true;
}
const tplConteneur = Misc.templateData(conteneur);
// Calculer le total actuel des contenus
let encContenu = this.getRecursiveEnc(conteneur) - Number(tplConteneur.encombrement);
let nouvelObjet = this.getObjet(itemId);
let newEnc = this.getRecursiveEnc(nouvelObjet); // Calculer le total actuel du nouvel objet
//console.log( currentEnc, newEnc, tplConteneur.capacite, conteneur.name);
if (nouvelObjet && ((encContenu + newEnc) > Number(tplConteneur.capacite))) {
ui.notifications.warn(
`Le conteneur ${conteneur.name} a une capacité de ${tplConteneur.capacite}, et contient déjà ${encContenu}.
Impossible d'y ranger: ${nouvelObjet.name} d'encombrement ${newEnc}!`);
return false;
}
return true;
}
/* -------------------------------------------- */
buildSubConteneurObjetList(conteneurId, deleteList) {
let conteneur = this.getObjet(conteneurId);
@ -932,9 +882,8 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */
/** Supprime un item d'un conteneur, sur la base
* de leurs ID */
async enleverDeConteneur(itemId, conteneurId) {
let conteneur = this.getObjet(conteneurId);
if (conteneur?.type == 'conteneur') { // Si présent
async enleverDeConteneur(itemId, conteneur) {
if (conteneur?.isConteneur()) { // Si présent
let data2use = duplicate(Misc.data(conteneur));
//console.log("Suppression du conteneur1", conteneurId, itemId, data2use.data.contenu);
let contenu = data2use.data.contenu;
@ -950,9 +899,8 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */
/** Ajoute un item dans un conteneur, sur la base
* de leurs ID */
async ajouterAConteneur(itemId, conteneurId) {
let conteneur = this.getObjet(conteneurId);
if (conteneur?.type == 'conteneur') {
async ajouterDansConteneur(itemId, conteneur) {
if (conteneur?.isConteneur()) {
let data2use = duplicate(Misc.data(conteneur));
data2use.data.contenu.push(itemId);
await this.updateEmbeddedDocuments('Item', [data2use]);
@ -976,39 +924,71 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */
async processItemDropEvent(event, objetVersConteneur) {
let dragData = JSON.parse(event.dataTransfer.getData("text/plain"));
console.log(dragData, this.id);
let objetId = dragData.id || dragData.data._id;
console.log("DRAG", dragData);
console.log("DRAG", this.id, dragData);
let itemId = dragData.id || dragData.data._id;
if (dragData.type == 'Item') {
if (dragData.actorId) {
if (dragData.actorId != this.id) {
console.log("Moving objects", dragData);
this.moveItemsBetweenActors(objetId, dragData.actorId);
return false;
}
else {
// rangement
const destId = $(event.target).parents(".item").attr("data-item-id");
const srcId = objetVersConteneur[objetId];
if (srcId != destId && objetId != destId && this.isConteneurSuffisant(objetId, destId)) {
if (srcId) {
await this.enleverDeConteneur(objetId, srcId);
}
if (destId) { // Dropped over an item !!!
await this.ajouterAConteneur(objetId, destId);
}
if (dragData.actorId && dragData.actorId != this.id) {
console.log("Moving objects", dragData);
this.moveItemsBetweenActors(itemId, dragData.actorId);
return false;
}
if (dragData.actorId == this.id) {
// rangement
const destId = $(event.target).parents(".item").attr("data-item-id");
const srcId = objetVersConteneur[itemId];
if (srcId != destId && itemId != destId) { // déplacement de l'objet
const item = this.getObjet(itemId);
const dest = this.getObjet(destId);
const src = this.getObjet(srcId);
if (!dest) {
// on peut toujours vider son sac
await this.enleverDeConteneur(itemId, src);
}
else if (!dest.isConteneur()) {
// regrouper?
await this.regrouperEquipementsSimilaires(item, dest);
}
else if (this.conteneurPeutContenir(dest, item)) {
// déplacer?
await this.enleverDeConteneur(itemId, src);
await this.ajouterDansConteneur(itemId, dest);
}
}
}
this.computeEncombrementTotalEtMalusArmure();
}
}
if (dragData.type == "Actor") {
this.addSubacteur(objetId);
this.addSubacteur(itemId);
}
return true;
}
conteneurPeutContenir(dest, item) {
const destData = Misc.data(dest);
if (destData?.type != 'conteneur') {
ui.notifications.warn(`Impossible de déplacer un objet (${item.name}) vers un ${destData.type} qui n'est pas un conteneur (${dest.name}) !`);
return false;
}
if (this._isConteneurContenu(item, conteneurId)) {
ui.notifications.warn(`Impossible de déplacer un conteneur parent (${item.name}) dans un de ses contenus ${destData.name} !`);
return false; // Loop detected !
}
// Calculer le total actuel des contenus
let encContenu = this.getRecursiveEnc(dest) - Number(destData.data.encombrement);
let newEnc = this.getRecursiveEnc(item); // Calculer le total actuel du nouvel objet
// Teste si le conteneur de destination a suffisament de capacité pour recevoir le nouvel objet
if (Number(destData.data.capacite) < encContenu + newEnc) {
ui.notifications.warn(
`Le conteneur ${dest.name} a une capacité de ${destData.data.capacite}, et contient déjà ${encContenu}.
Impossible d'y ranger: ${item.name} d'encombrement ${newEnc}!`);
return false;
}
return true;
}
/* -------------------------------------------- */
async moveItemsBetweenActors(itemId, sourceActorId) {
let itemsList = []
@ -1042,6 +1022,13 @@ export class RdDActor extends Actor {
}
}
async regrouperEquipementsSimilaires(item, dest) {
if (item.isEquipementSimilaire(dest)) {
await dest.quantiteIncDec(Misc.templateData(item).quantite);
await this.deleteEmbeddedDocuments('Item', [item.id]);
}
}
/* -------------------------------------------- */
detectSurEncombrement() {
return Math.max(0, Math.ceil(Number(this.encTotal) - this.getEncombrementMax()));
@ -3423,7 +3410,7 @@ export class RdDActor extends Actor {
nbBrinsReste: newQuantite
}
this.diminuerQuantiteObjet(herbeData._id, herbeData.nbBrins);
ChatMessage.create({
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-fabriquer-potion-base.html`, messageData)
@ -3433,7 +3420,7 @@ export class RdDActor extends Actor {
async diminuerQuantiteObjet(id, nb, options = { supprimerSiZero: false }) {
const item = this.getObjet(id);
if (item){
if (item) {
await item.diminuerQuantite(nb, options);
}
}