Fix: écrasement quantité achats multiples

Quand plusieurs joueurs ouvraient la fenêtre d'achat en même temps, on
utilisait pour chaque acheteur la quantité d'origine, la quantité
disponible n'était diminuée que par le dernier acheteur.

En reprenant les infos disponibles dans le tchat, on peut appliquer la
diminution (le delta) à la quantité courante, et supporter plusieurs
acheteurs
This commit is contained in:
Vincent Vandemeulebrouck 2021-06-05 01:14:29 +02:00
parent e0666b074e
commit 7ba3b44c87
2 changed files with 66 additions and 62 deletions

View File

@ -30,6 +30,7 @@ import { Monnaie } from "./item-monnaie.js";
import { DialogConsommer } from "./dialog-item-consommer.js"; import { DialogConsommer } from "./dialog-item-consommer.js";
import { DialogFabriquerPotion } from "./dialog-fabriquer-potion.js"; import { DialogFabriquerPotion } from "./dialog-fabriquer-potion.js";
import { RollDataAjustements } from "./rolldata-ajustements.js"; import { RollDataAjustements } from "./rolldata-ajustements.js";
import { DialogItemAchat } from "./dialog-item-achat.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -3511,61 +3512,61 @@ export class RdDActor extends Actor {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async achatVente(vendeurId, acheteurId, venteData, chatMessageIdVente) { async achatVente(achat) {
if (vendeurId == acheteurId) { if (achat.vendeurId == achat.acheteurId) {
ui.notifications.info("Inutile de se vendre à soi-même"); ui.notifications.info("Inutile de se vendre à soi-même");
return; return;
} }
if (!Misc.isElectedUser()) { if (!Misc.isElectedUser()) {
RdDActor.remoteActorCall({ RdDActor.remoteActorCall({
actorId: vendeurId ?? acheteurId, actorId: achat.vendeurId ?? achat.acheteurId,
method: 'achatVente', args: [vendeurId, acheteurId, venteData, chatMessageIdVente] method: 'achatVente', args: [achat]
}); });
return; return;
} }
const acheteur = acheteurId ? game.actors.get(acheteurId) : undefined; const acheteur = achat.acheteurId ? game.actors.get(achat.acheteurId) : undefined;
const vendeur = vendeurId ? game.actors.get(vendeurId) : undefined; const vendeur = achat.vendeurId ? game.actors.get(achat.vendeurId) : undefined;
const itemId = venteData.item._id; const messageVente = game.messages.get(achat.chatMessageIdVente);
const html = await messageVente.getHTML();
const buttonAcheter = html.find(".button-acheter")[0];
const vente = DialogItemAchat.prepareVenteData(buttonAcheter, achat.vendeurId, vendeur, acheteur);
const itemId = vente.item._id;
const coutDeniers = Math.floor((venteData.prixTotal ?? 0) * 100); const coutDeniers = Math.floor((achat.prixTotal ?? 0) * 100);
venteData.quantiteTotal = (venteData.nombreLots ?? 1) * (venteData.tailleLot); achat.quantiteTotal = (achat.nombreLots ?? 1) * (vente.tailleLot);
if (acheteur) { if (acheteur) {
let resteAcheteur = await acheteur.depenser(coutDeniers); let resteAcheteur = await acheteur.depenser(coutDeniers);
if (resteAcheteur < 0) { if (resteAcheteur < 0) {
ui.notifications.warn(`Vous n'avez pas assez d'argent pour payer ${venteData.prixTotal} sols !`); ui.notifications.warn(`Vous n'avez pas assez d'argent pour payer ${vente.prixTotal} sols !`);
return; return;
} }
} }
if (vendeur) { if (vendeur) {
let itemData = Misc.data(vendeur.getObjet(itemId)); let itemVenduData = Misc.data(vendeur.getObjet(itemId));
// diminuer QuantiteVendeur if ("quantite" in itemVenduData.data ? itemVenduData.data.quantite < achat.quantiteTotal : achat.nombreLots != 1) {
if ("quantite" in itemData.data ?
itemData.data.quantite < venteData.quantiteTotal : venteData.nombreLots != 1) {
// pas assez de quantite
await acheteur?.ajouterDeniers(coutDeniers); await acheteur?.ajouterDeniers(coutDeniers);
ui.notifications.warn(`Le vendeur n'a plus assez de ${venteData.item.name} !`); ui.notifications.warn(`Le vendeur n'a plus assez de ${vente.item.name} !`);
return; return;
} }
vendeur.ajouterDeniers(coutDeniers); vendeur.ajouterDeniers(coutDeniers);
let qtReste = (itemData.data.quantite ?? 1) - venteData.quantiteTotal; let resteQuantite = (itemVenduData.data.quantite ?? 1) - achat.quantiteTotal;
if (qtReste == 0) { if (resteQuantite == 0) {
vendeur.deleteEmbeddedDocuments("Item", itemId); vendeur.deleteEmbeddedDocuments("Item", itemId);
} }
else { else {
vendeur.updateEmbeddedDocuments("Item", [{ _id: itemId, 'data.quantite': qtReste }]); vendeur.updateEmbeddedDocuments("Item", [{ _id: itemId, 'data.quantite': resteQuantite }]);
} }
} }
if (acheteur) { if (acheteur) {
const achat = { const achatData = {
type: venteData.item.type, type: vente.item.type,
img: venteData.item.img, img: vente.item.img,
name: venteData.item.name, name: vente.item.name,
data: venteData.item.data data: vente.item.data
} }
achat.data.quantite = venteData.quantiteTotal; achatData.data.quantite = achat.quantiteTotal;
await acheteur.createEmbeddedDocuments("Item", [achat]); await acheteur.createEmbeddedDocuments("Item", [achatData]);
} }
if (coutDeniers > 0) { if (coutDeniers > 0) {
RdDAudio.PlayContextAudio("argent"); RdDAudio.PlayContextAudio("argent");
@ -3573,19 +3574,16 @@ export class RdDActor extends Actor {
ChatMessage.create({ ChatMessage.create({
whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name),
content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-achat-item.html', venteData) content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-achat-item.html', vente)
}); });
if (!venteData.quantiteIllimite) { if (!vente.quantiteIllimite) {
if (venteData.quantiteNbLots <= venteData.nombreLots) { if (vente.quantiteNbLots <= achat.nombreLots) {
ChatUtility.removeChatMessageId(chatMessageIdVente); ChatUtility.removeChatMessageId(chatMessageIdVente);
} }
else { else {
venteData.quantiteNbLots -= venteData.nombreLots; vente.quantiteNbLots -= achat.nombreLots;
venteData.jsondata = JSON.stringify(venteData.item); messageVente.update({ content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-vente-item.html', vente) });
let newMessageVente = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-vente-item.html', venteData);
const messageVente = game.messages.get(chatMessageIdVente);
messageVente.update({ content: newMessageVente });
messageVente.render(true); messageVente.render(true);
} }
} }

View File

@ -1,17 +1,18 @@
import { RdDActor } from "./actor.js";
import { HtmlUtility } from "./html-utility.js";
import { Misc } from "./misc.js"; import { Misc } from "./misc.js";
import { RdDUtility } from "./rdd-utility.js"; import { RdDUtility } from "./rdd-utility.js";
export class DialogItemAchat extends Dialog { export class DialogItemAchat extends Dialog {
static async onButtonAcheter(event) { static async onButtonAcheter(event) {
let jsondata = event.currentTarget.attributes['data-jsondata']?.value; const buttonAcheter = event.currentTarget;
if (!jsondata) { if (!buttonAcheter.attributes['data-jsondata']?.value) {
ui.notifications.warn("Impossible d'acheter: informations sur l'objet manquantes") ui.notifications.warn("Impossible d'acheter: informations sur l'objet manquantes")
return; return;
} }
const vendeurId = event.currentTarget.attributes['data-vendeurId']?.value; const chatMessageIdVente = RdDUtility.findChatMessageId(buttonAcheter);
const vendeurId = buttonAcheter.attributes['data-vendeurId']?.value;
const vendeur = vendeurId ? game.actors.get(vendeurId) : undefined; const vendeur = vendeurId ? game.actors.get(vendeurId) : undefined;
const acheteur = RdDUtility.getSelectedActor(); const acheteur = RdDUtility.getSelectedActor();
@ -20,22 +21,7 @@ export class DialogItemAchat extends Dialog {
return; return;
} }
const chatMessageIdVente = RdDUtility.findChatMessageId(event.currentTarget); let venteData = DialogItemAchat.prepareVenteData(buttonAcheter, vendeurId, vendeur, acheteur);
const itemData = JSON.parse(jsondata);
const prixLot = event.currentTarget.attributes['data-prixLot']?.value ?? 0;
let venteData = {
item: itemData,
vendeurId: vendeurId,
vendeur: Misc.data(vendeur),
acheteur: Misc.data(acheteur),
tailleLot: event.currentTarget.attributes['data-tailleLot']?.value ?? 1,
quantiteIllimite : event.currentTarget.attributes['data-quantiteIllimite']?.value == 'true',
quantiteNbLots: event.currentTarget.attributes['data-quantiteNbLots']?.value,
nombreLots: 1,
prixLot: prixLot,
prixTotal: prixLot,
isVente: prixLot > 0
};
const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-achat.html`, venteData); const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-achat.html`, venteData);
const dialog = new DialogItemAchat(html, vendeur, acheteur, venteData, chatMessageIdVente); const dialog = new DialogItemAchat(html, vendeur, acheteur, venteData, chatMessageIdVente);
dialog.render(true); dialog.render(true);
@ -63,14 +49,34 @@ export class DialogItemAchat extends Dialog {
this.venteData = venteData; this.venteData = venteData;
} }
static prepareVenteData(buttonAcheter, vendeurId, vendeur, acheteur) {
const jsondata = buttonAcheter.attributes['data-jsondata']?.value;
const prixLot = buttonAcheter.attributes['data-prixLot']?.value ?? 0;
let venteData = {
item: JSON.parse(jsondata),
vendeurId: vendeurId,
vendeur: Misc.data(vendeur),
acheteur: Misc.data(acheteur),
tailleLot: parseInt(buttonAcheter.attributes['data-tailleLot']?.value ?? 1),
quantiteIllimite: buttonAcheter.attributes['data-quantiteIllimite']?.value == 'true',
quantiteNbLots: parseInt(buttonAcheter.attributes['data-quantiteNbLots']?.value),
nombreLots: 1,
prixLot: prixLot,
prixTotal: prixLot,
isVente: prixLot > 0
};
return venteData;
}
async onAchat() { async onAchat() {
await $(".nombreLots").change(); await $(".nombreLots").change();
(this.vendeur ?? this.acheteur).achatVente( (this.vendeur ?? this.acheteur).achatVente({
this.vendeur?.id, vendeurId: this.vendeur?.id,
this.acheteur?.id, acheteurId: this.acheteur?.id,
this.venteData, nombreLots: this.venteData.nombreLots,
this.chatMessageIdVente prixTotal: this.venteData.prixTotal,
); chatMessageIdVente: this.chatMessageIdVente
});
} }
/* -------------------------------------------- */ /* -------------------------------------------- */