import { Misc } from "./misc.js"; import { RdDUtility } from "./rdd-utility.js"; export class DialogItemAchat extends Dialog { static preparerAchat(chatButton) { const vendeurId = chatButton.attributes['data-vendeurId']?.value; const vendeur = vendeurId ? game.actors.get(vendeurId) : undefined; const acheteur = RdDUtility.getSelectedActor(); const json = chatButton.attributes['data-jsondata']?.value; if (!acheteur && !vendeur) { ui.notifications.info("Pas d'acheteur ni de vendeur, aucun changement"); return undefined; } if (!json) { ui.notifications.warn("Impossible d'acheter: informations sur l'objet manquantes") return undefined; } return { item: (json ? JSON.parse(json) : undefined), vendeur, acheteur, nbLots: parseInt(chatButton.attributes['data-quantiteNbLots']?.value), tailleLot: parseInt(chatButton.attributes['data-tailleLot']?.value ?? 1), prixLot: Number(chatButton.attributes['data-prixLot']?.value ?? 0), quantiteIllimite: chatButton.attributes['data-quantiteIllimite']?.value == 'true', chatMessageIdVente: RdDUtility.findChatMessageId(chatButton), }; } static async onAcheter({ item, vendeur, acheteur, service, tailleLot, prixLot, nbLots, quantiteIllimite, chatMessageIdVente }) { const venteData = { item, actingUserId: game.user.id, vendeurId: vendeur?.id, vendeur, acheteur, service, tailleLot, quantiteIllimite, quantiteNbLots: nbLots, choix: { seForcer: false, supprimerSiZero: true }, prixLot, isVente: prixLot > 0, isConsommable: item.type == 'nourritureboisson' && acheteur?.isPersonnage(), chatMessageIdVente }; DialogItemAchat.changeNombreLots(venteData, 1); const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-achat.html`, venteData); new DialogItemAchat(html, venteData).render(true); } static changeNombreLots(venteData, nombreLots) { venteData.choix.nombreLots = nombreLots; venteData.prixTotal = (nombreLots * venteData.prixLot).toFixed(2); if (venteData.isConsommable) { const doses = nombreLots * venteData.tailleLot; venteData.totalSust = Misc.keepDecimals(doses * (venteData.item.system.sust ?? 0), 2); venteData.totalDesaltere = venteData.item.system.boisson ? Misc.keepDecimals(doses * (venteData.item.system.desaltere ?? 0), 2) : 0; } } constructor(html, venteData) { let options = { classes: ["dialogachat"], width: 400, height: 'fit-content', 'z-index': 99999 }; const actionAchat = venteData.prixLot > 0 ? "Acheter" : "Prendre"; const buttons = {}; if (venteData.isConsommable) { buttons["consommer"] = { label: venteData.item.system.boisson ? "Boire" : "Manger", callback: it => this.onAchatConsommer() } } buttons[actionAchat] = { label: actionAchat, callback: it => { this.onAchat(); } }; buttons["decliner"] = { label: "Décliner", callback: it => { } }; const acheteur = venteData.acheteur?.name ?? 'Un acheteur'; const vendeur = (venteData.service ?? venteData.vendeur)?.name ?? 'Un vendeur'; let conf = { title: `${acheteur} - ${actionAchat} à ${vendeur}`, content: html, default: actionAchat, buttons: buttons }; super(conf, options); this.venteData = venteData; } async onAchat() { await this.html.find(".nombreLots").change(); (this.venteData.vendeur ?? this.venteData.acheteur).achatVente({ userId: game.user.id, serviceId: this.venteData.service?.id, vendeurId: this.venteData.vendeur?.id, acheteurId: this.venteData.acheteur?.id, prixTotal: this.venteData.prixTotal, chatMessageIdVente: this.venteData.chatMessageIdVente, choix: this.venteData.choix, vente: this.venteData }); } async onAchatConsommer() { this.venteData.choix.consommer = true; await this.onAchat(); } /* -------------------------------------------- */ activateListeners(html) { super.activateListeners(html); this.html = html; this.html.find(".nombreLots").change(event => this.setNombreLots(Number(event.currentTarget.value))); this.html.find(".se-forcer").change(event => this.setSeForcer(event)); } setSeForcer(event) { this.venteData.choix.seForcer = event.currentTarget.checked; } setNombreLots(nombreLots) { if (!this.venteData.quantiteIllimite) { if (!this.venteData.quantiteIllimite && nombreLots > this.venteData.quantiteNbLots) { ui.notifications.warn(`Seulement ${this.venteData.quantiteNbLots} lots disponibles, vous ne pouvez pas en prendre ${nombreLots}`) } nombreLots = Math.min(nombreLots, this.venteData.quantiteNbLots); } DialogItemAchat.changeNombreLots(this.venteData, nombreLots); this.html.find(".nombreLots").val(nombreLots); this.html.find(".prixTotal").text(this.venteData.prixTotal); this.html.find("span.total-sust").text(this.venteData.totalSust); this.html.find("span.total-desaltere").text(this.venteData.totalDesaltere); } }