Correction des monnaies

* Des deniers sont créés si on n'a rien d'autre
* Gagner ou dépenser de l'argent fonctionne même si on n'a pas
  tous les types de pièces
* Tous les acteurs peuvent acheter/vendre s'ils ont de l'argent
  => Pratique pour créer une auberge!
* Seuls les personnages peuvent boire et manger
* plus de problèmes de monnaies manquantes
This commit is contained in:
Vincent Vandemeulebrouck
2022-10-07 19:05:56 +02:00
parent 5382fb5df3
commit 9621d72f92
7 changed files with 166 additions and 190 deletions

View File

@ -116,17 +116,13 @@ export class RdDActor extends Actor {
const isPersonnage = actorData.type == "personnage";
// If the created actor has items (only applicable to duplicated actors) bypass the new actor creation logic
if (actorData.items) {
let actor = await super.create(actorData, options);
if (isPersonnage) {
await actor.checkMonnaiePresence();
}
return actor;
return await super.create(actorData, options);
}
if (isPersonnage) {
const competences = await RdDUtility.loadCompendium(RdDItemCompetence.actorCompendium(actorData.type));
actorData.items = competences.map(i => i.toObject());
actorData.items = actorData.items.concat(Monnaie.monnaiesData());
actorData.items = actorData.items.concat(Monnaie.monnaiesStandard());
}
else {
actorData.items = [];
@ -180,8 +176,6 @@ export class RdDActor extends Actor {
await this.cleanupConteneurs();
await this.computeEncombrementTotalEtMalusArmure();
this.computeEtatGeneral();
// Sanity check
await this.checkMonnaiePresence();
}
/* -------------------------------------------- */
@ -194,15 +188,6 @@ export class RdDActor extends Actor {
}
}
/* -------------------------------------------- */
async checkMonnaiePresence() { // Ajout opportuniste si les pièces n'existent pas.
if (!this.items) return; // Sanity check during import
let manquantes = Monnaie.monnaiesManquantes(this);
if (manquantes.length > 0) {
await this.createEmbeddedDocuments('Item', manquantes, { renderSheet: false });
}
}
/* -------------------------------------------- */
isCreature() {
return this.type == 'creature' || this.type == 'entite';
@ -3610,33 +3595,11 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */
getFortune() {
let monnaies = this.itemTypes['monnaie'];
if (monnaies.length < 4) {
ui.notifications.error("Problème de monnaies manquantes, impossible de payer correctement!")
throw "Problème de monnaies manquantes, impossible de payer correctement!";
}
return monnaies.map(m => Number(m.system.valeur_deniers) * Number(m.system.quantite))
return this.itemTypes['monnaie']
.map(m => Number(m.system.valeur_deniers) * Number(m.system.quantite))
.reduce(Misc.sum(), 0);
}
/* -------------------------------------------- */
async optimizeArgent(fortuneTotale) {
let monnaies = this.itemTypes['monnaie'];
let parValeur = Misc.classifyFirst(monnaies, it => it.system.valeur_deniers);
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
}
console.log('RdDActor.optimizeArgent', fortuneTotale, 'nouvelleFortune', nouvelleFortune, 'monnaie_par_valeur', parValeur);
let updates = [];
for (const [valeur, nombre] of Object.entries(nouvelleFortune)) {
updates.push({ _id: parValeur[valeur].id, 'system.quantite': nombre });
}
await this.updateEmbeddedDocuments('Item', updates);
}
/* -------------------------------------------- */
async depenserDeniers(depense, dataObj = undefined, quantite = 1, toActorId) {
depense = Number(depense);
@ -3653,10 +3616,9 @@ export class RdDActor extends Actor {
}
else {
if (fortune >= depense) {
fortune -= depense;
const toActor = game.actors.get(toActorId)
await toActor?.ajouterDeniers(depense, this.id);
await this.optimizeArgent(fortune);
await Monnaie.optimiser(this, fortune - depense);
msg = `Vous avez payé <strong>${depense} Deniers</strong>${toActor ? " à " + toActor.name : ''}, qui ont été soustraits de votre argent.`;
RdDAudio.PlayContextAudio("argent"); // Petit son
@ -3679,18 +3641,19 @@ export class RdDActor extends Actor {
}
async depenser(depense) {
depense = Number(depense);
let fortune = this.getFortune();
let reste = fortune - depense;
let reste = this.getFortune() - Number.parseInt(depense);
if (reste >= 0) {
fortune -= depense;
await this.optimizeArgent(fortune);
await Monnaie.optimiser(this, reste);
}
return reste;
}
async ajouterDeniers(gain, fromActorId = undefined) {
gain = Number.parseInt(gain);
if (gain < 0) {
ui.notifications.error(`Impossible d'ajouter un gain de ${gain} <0`);
return;
}
if (gain == 0) {
return;
}
@ -3703,9 +3666,7 @@ export class RdDActor extends Actor {
}
else {
const fromActor = game.actors.get(fromActorId)
let fortune = this.getFortune();
fortune += gain;
await this.optimizeArgent(fortune);
await Monnaie.optimiser(this, gain + this.getFortune());
RdDAudio.PlayContextAudio("argent"); // Petit son
ChatMessage.create({
@ -3744,8 +3705,8 @@ export class RdDActor extends Actor {
const vendeur = achat.vendeurId ? game.actors.get(achat.vendeurId) : undefined;
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 button = html.find(".button-acheter")[0];
const vente = DialogItemAchat.venteData(button);
const itemId = vente.item._id;
const isItemEmpilable = "quantite" in vente.item.system;