diff --git a/module/actor.js b/module/actor.js index af6f9760..fc90154b 100644 --- a/module/actor.js +++ b/module/actor.js @@ -3110,54 +3110,68 @@ export class RdDActor extends Actor { return; } /* -------------------------------------------- */ - async optimizeArgent(sumDenier, monnaies) { + getFortune() { + let monnaies = Monnaie.filtrerMonnaies(this.data.items); + if (monnaies.length < 4) { + ui.notifications.error("Problème de monnaies manquantes, impossible de payer correctement!") + return 0; + } + return monnaies.map(m => Misc.templateData(m)) + .map(tpl => tpl.valeur_deniers * Number(tpl.quantite)) + .reduce(Misc.sum(), 0); + } + /* -------------------------------------------- */ + async optimizeArgent(fortuneTotale) { + let monnaies = Monnaie.filtrerMonnaies(this.data.items); let parValeur = Misc.classifyFirst(monnaies, it => Misc.templateData(it).valeur_deniers); - let fortune = { - 1000: Math.floor(sumDenier / 1000), // or - 100: Math.floor(sumDenier / 100) % 10, // argent - 10: Math.floor(sumDenier / 10) % 10, // bronze - 1: sumDenier % 10 // étain + let nouvelleFortune = { + 1000: Math.floor(fortuneTotale / 1000), // or + 100: Math.floor(fortuneTotale / 100) % 10, // argent + 10: Math.floor(fortuneTotale / 10) % 10, // bronze + 1: fortuneTotale % 10 // étain } let updates = [] - for (const [valeur, nombre] of Object.entries(fortune)) { + for (const [valeur, nombre] of Object.entries(nouvelleFortune)) { updates.push({ _id: parValeur[valeur]._id, 'data.quantite': nombre }); } await this.updateEmbeddedDocuments('Item', updates); } /* -------------------------------------------- */ - async payerDenier(sumDenier, dataObj = undefined, quantite = 1) { - let monnaies = Monnaie.filtrerMonnaies(this.data.items); - if (monnaies.length < 4) { - ui.notifications.warn("Problème de monnaies manquantes, impossible de payer correctement!") - return; - } - - sumDenier = Number(sumDenier); - let denierDisponible = 0; - - for (let pieceData of monnaies.map(m => Misc.data(m))) { - denierDisponible += pieceData.data.valeur_deniers * Number(pieceData.data.quantite); - } - console.log("DENIER", game.user.character, sumDenier, denierDisponible); - + async depenserDeniers(depense, dataObj = undefined, quantite = 1, toActorId) { + depense = Number(depense); + let fortune = this.getFortune(); + console.log("depenserDeniers", game.user.character, depense, fortune); let msg = ""; - let isPayed = false; - if (denierDisponible >= sumDenier) { - denierDisponible -= sumDenier; - this.optimizeArgent(denierDisponible, monnaies); - msg = `Vous avez payé ${sumDenier} Deniers, qui ont été soustraits de votre argent.`; - RdDAudio.PlayContextAudio("argent"); // Petit son - isPayed = true; + if (depense == 0) { if (dataObj) { - dataObj.payload.data.cout = sumDenier / 100; // Mise à jour du prix en sols , avec le prix acheté + dataObj.payload.data.cout = depense / 100; // Mise à jour du prix en sols , avec le prix acheté dataObj.payload.data.quantite = quantite; await this.createEmbeddedDocuments('Item', [dataObj.payload]); - msg += `
Et l'objet ${dataObj.payload.name} a été ajouté à votre inventaire.`; + msg += `
L'objet ${dataObj.payload.name} a été ajouté gratuitement à votre inventaire.`; + } + } + else { + if (fortune >= depense) { + fortune -= depense; + const toActor = game.actors.get(toActorId) + if (toActor) { + toActor.ajouterDeniers(depense, this.id); + } + await this.optimizeArgent(fortune); + msg = `Vous avez payé ${depense} Deniers${toActor ? " à " + toActor.name : ''}, qui ont été soustraits de votre argent.`; + RdDAudio.PlayContextAudio("argent"); // Petit son + + if (dataObj) { + dataObj.payload.data.cout = depense / 100; // Mise à jour du prix en sols , avec le prix acheté + dataObj.payload.data.quantite = quantite; + await this.createEmbeddedDocuments('Item', [dataObj.payload]); + msg += `
Et l'objet ${dataObj.payload.name} a été ajouté à votre inventaire.`; + } + } else { + msg = "Vous n'avez pas assez d'argent pour payer cette somme !"; } - } else { - msg = "Vous n'avez pas assez d'argent pour payer cette somme !"; } let message = { @@ -3167,6 +3181,24 @@ export class RdDActor extends Actor { ChatMessage.create(message); } + async ajouterDeniers(gain, fromActorId = undefined) { + if (fromActorId && !game.user.isGM) { + RdDActor.remoteActorCall(this.id, 'ajouterDeniers', gain, fromActorId); + } + else { + const fromActor = game.actors.get(fromActorId) + let fortune = this.getFortune(); + fortune += Number(gain); + await this.optimizeArgent(fortune); + + RdDAudio.PlayContextAudio("argent"); // Petit son + ChatMessage.create({ + whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + content: `Vous avez reçu ${gain} Deniers ${fromActor ? " de " + fromActor.name : ''}, qui ont été ajoutés de votre argent.` + }); + } + } + /* -------------------------------------------- */ async monnaieIncDec(id, value) { let monnaie = this.getMonnaie(id); diff --git a/module/rdd-utility.js b/module/rdd-utility.js index a2fb6c2c..d1dd170a 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -529,8 +529,9 @@ export class RdDUtility { }); // Gestion du bouton payer html.on("click", '.payer-button', event => { - let sumdenier = event.currentTarget.attributes['data-somme-denier'].value; + let sumdenier = event.currentTarget.attributes['data-somme-denier']?.value ?? 0; let quantite = event.currentTarget.attributes['data-quantite']?.value ?? 1; + let fromActorId = event.currentTarget.attributes['data-actor-id']?.value; let jsondata = event.currentTarget.attributes['data-jsondata'] let objData if (jsondata) { @@ -538,7 +539,11 @@ export class RdDUtility { } let actor = RdDUtility.getSelectedActor("Pour effectuer le paiement:"); if (actor) { - actor.payerDenier(sumdenier, objData, quantite); + actor.depenserDeniers(sumdenier, objData, quantite, fromActorId); + // TODO: diminuer la quantité ou supprimer le message + // message: => document.querySelector("#chat-log > li:nth-child(61) > div > div > span > a") + // => ../../../..[@data-message-id] + } }); }