Standardisation inventaire et prix

Les objets d'inventaire ont maintenant tous:
coût, encombrement, qualité, quantité

Le coût est toujours exprimé en sols, y compris pour les monnaies.
Les paiements et achat-ventes sont fait en sols.
This commit is contained in:
Vincent Vandemeulebrouck
2022-11-29 00:01:54 +01:00
parent 7557d33c73
commit b7a8b0c08d
21 changed files with 145 additions and 289 deletions

View File

@ -4,22 +4,22 @@ import { LOG_HEAD } from "./constants.js";
const MONNAIE_ETAIN = {
name: "Etain (1 denier)", type: 'monnaie',
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_etain_poisson.webp",
system: { quantite: 0, cout: 1, encombrement: 0.001, description: "" }
system: { quantite: 0, cout: 0.01, encombrement: 0.001, description: "" }
};
const MONNAIE_BRONZE = {
name: "Bronze (10 deniers)", type: 'monnaie',
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_bronze_epees.webp",
system: { quantite: 0, cout: 10, encombrement: 0.002, description: "" }
system: { quantite: 0, cout: 0.10, encombrement: 0.002, description: "" }
};
const MONNAIE_ARGENT = {
name: "Argent (1 sol)", type: 'monnaie',
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_argent_sol.webp",
system: { quantite: 0, cout: 100, encombrement: 0.003, description: "" }
system: { quantite: 0, cout: 1, encombrement: 0.003, description: "" }
};
const MONNAIE_OR = {
name: "Or (10 sols)", type: 'monnaie',
img: "systems/foundryvtt-reve-de-dragon/icons/objets/piece_or_sol.webp",
system: { quantite: 0, cout: 1000, encombrement: 0.004, description: "" }
system: { quantite: 0, cout: 10, encombrement: 0.004, description: "" }
};
const MONNAIES_STANDARD = [MONNAIE_ETAIN, MONNAIE_BRONZE, MONNAIE_ARGENT, MONNAIE_OR];
@ -40,15 +40,15 @@ export class Monnaie {
}
static deValeur(monnaie, valeur) {
return valeur == monnaie.system.cout
return Monnaie.valEntiere(valeur) == Monnaie.valEntiere(monnaie.system.cout)
}
static arrondiDeniers(sols) {
return Number(sols).toFixed(2);
static valEntiere(sols) {
return Math.max(Math.floor((sols??0)*100), 0);
}
static triValeurDenier() {
return Misc.ascending(item => item.system.cout)
static triValeurEntiere() {
return Misc.ascending(item => Monnaie.valEntiere(item.system.cout))
}
static async creerMonnaiesStandard(actor) {
@ -65,28 +65,28 @@ export class Monnaie {
return deniers;
}
static async optimiser(actor, fortune) {
let reste = fortune;
static async optimiserFortune(actor, fortune) {
let resteEnDeniers = Math.round(fortune*100);
let monnaies = actor.itemTypes['monnaie'];
let updates = [];
let parValeur = Misc.classifyFirst(monnaies, it => it.system.cout);
for (let valeur of [1000, 100, 10, 1]) {
const itemPiece = parValeur[valeur];
let parValeur = Misc.classifyFirst(monnaies, it => Monnaie.valEntiere(it.system.cout));
for (let valeurDeniers of [1000, 100, 10, 1]) {
const itemPiece = parValeur[valeurDeniers];
if (itemPiece) {
const quantite = Math.floor(reste / valeur);
const quantite = Math.floor(resteEnDeniers / valeurDeniers);
if (quantite != itemPiece.system.quantite) {
updates.push({ _id: parValeur[valeur].id, 'system.quantite': quantite });
updates.push({ _id: parValeur[valeurDeniers].id, 'system.quantite': quantite });
}
reste -= quantite*valeur;
resteEnDeniers -= quantite*valeurDeniers;
}
}
console.log('Monnaie.optimiser', actor.name, 'total', fortune, 'parValeur', parValeur, 'updates', updates, 'reste', reste);
console.log('Monnaie.optimiserFortune', actor.name, 'total', fortune, 'parValeur', parValeur, 'updates', updates, 'reste', resteEnDeniers);
if (updates.length > 0) {
await actor.updateEmbeddedDocuments('Item', updates);
}
if (reste > 0){
if (resteEnDeniers > 0){
// créer le reste en deniers fortune en deniers
await Monnaie.creerMonnaiesDeniers(actor, reste);
await Monnaie.creerMonnaiesDeniers(actor, resteEnDeniers);
}
}