diff --git a/module/actor-sheet.js b/module/actor-sheet.js index 8e1fc851..1142e670 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -234,7 +234,7 @@ export class RdDActorSheet extends ActorSheet { html.find('.creer-une-oeuvre').click(async event => { RdDUtility.selectTypeOeuvre(this); }); - html.find('#nettoyer-conteneurs').click(async event => { + html.find('.nettoyer-conteneurs').click(async event => { this.actor.nettoyerConteneurs(); }); @@ -327,7 +327,7 @@ export class RdDActorSheet extends ActorSheet { this.actor.reinsertionAleatoire("Action MJ"); }); html.find('.afficher-tmr').click(async event => { - this.actor.afficheTMRetMessage(); + this.actor.changeTMRVisible(); }); // Points de reve actuel diff --git a/module/actor-vehicule-sheet.js b/module/actor-vehicule-sheet.js index 58699eb8..b2305320 100644 --- a/module/actor-vehicule-sheet.js +++ b/module/actor-vehicule-sheet.js @@ -125,7 +125,7 @@ export class RdDActorVehiculeSheet extends ActorSheet { html.find('.creer-un-objet').click(async event => { RdDUtility.selectObjetType(this); }); - html.find('#nettoyer-conteneurs').click(async event => { + html.find('.nettoyer-conteneurs').click(async event => { this.actor.nettoyerConteneurs(); }); diff --git a/module/actor.js b/module/actor.js index 9ad0b47b..892266d8 100644 --- a/module/actor.js +++ b/module/actor.js @@ -139,7 +139,6 @@ export class RdDActor extends Actor { // Dynamic computing fields this.encTotal = 0; - this.prixTotalEquipement = 0; // Make separate methods for each Actor type (character, npc, etc.) to keep // things organized. @@ -299,11 +298,6 @@ export class RdDActor extends Actor { return Math.floor(this.encTotal ?? 0); } - /* -------------------------------------------- */ - getPrixTotalEquipement() { - return Math.floor(this.system.prixTotalEquipement ?? 0) - } - /* -------------------------------------------- */ getCompetence(idOrName, options = {}) { return RdDItemCompetence.findCompetence(this.items, idOrName, options) @@ -1163,18 +1157,25 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ /** Fonction de remise à plat de l'équipement (ie vide les champs 'contenu') */ async nettoyerConteneurs() { - const corrections = []; - for (let item of this.items) { - if (item.estContenu) { - item.estContenu = undefined; + RdDUtility.confirmer({ + content: `
Etes vous certain de vouloir vider tous les conteneurs ?
`, + title: 'Vider les conteneurs', + buttonLabel: 'Vider', + onAction: async () => { + const corrections = []; + for (let item of this.items) { + if (item.estContenu) { + item.estContenu = undefined; + } + if (item.type == 'conteneur' && item.system.contenu.length > 0) { + corrections.push({ _id: item.id, 'system.contenu': [] }); + } + } + if (corrections.length > 0) { + await this.updateEmbeddedDocuments('Item', corrections); + } } - if (item.type == 'conteneur' && item.system.contenu.length > 0) { - corrections.push({ _id: item.id, 'system.contenu': [] }); - } - } - if (corrections.length > 0) { - await this.updateEmbeddedDocuments('Item', corrections); - } + }); } async processDropItem(params) { @@ -1368,11 +1369,10 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ computePrixTotalEquipement() { - this.prixTotalEquipement = this.filterItems(it => it.system.prixTotal) - .map(it => it.system.prixTotal ?? 0) + const deniers = this.items.filter(it => it.isEquipement()) + .map(it => it.prixTotalDeniers()) .reduce(Misc.sum(), 0); - // Mise à jour valeur totale de l'équipement - return this.prixTotalEquipement; + return deniers / 100; } /* -------------------------------------------- */ @@ -1486,12 +1486,16 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ - async cacheTMR() { - await this.update({ 'system.reve.tmrpos.cache': true }); + /* -------------------------------------------- */ + async changeTMRVisible() { + await this.setTMRVisible(this.system.reve.tmrpos.cache ? true : false); } - async montreTMR() { - await this.update({ 'system.reve.tmrpos.cache': false }); + + async setTMRVisible(newState) { + await this.update({ 'system.reve.tmrpos.cache': !newState }); + this.notifyRefreshTMR(); } + isTMRCache() { return this.system.reve.tmrpos.cache; } @@ -1505,11 +1509,6 @@ export class RdDActor extends Actor { }); } - /* -------------------------------------------- */ - async afficheTMRetMessage() { - await this.montreTMR(); - this.notifyRefreshTMR(); - } /* -------------------------------------------- */ async reinsertionAleatoire(raison, accessible = tmr => true) { @@ -1524,7 +1523,7 @@ export class RdDActor extends Actor { } async forcerPositionTMRInconnue(tmr) { - await this.cacheTMR(); + await this.setTMRVisible(false); await this.updateCoordTMR(tmr.coord); this.notifyRefreshTMR(); } diff --git a/module/item.js b/module/item.js index 88673ec4..35204f2f 100644 --- a/module/item.js +++ b/module/item.js @@ -1,12 +1,27 @@ import { DialogItemVente } from "./dialog-item-vente.js"; import { Grammar } from "./grammar.js"; -import { Misc } from "./misc.js"; import { RdDHerbes } from "./rdd-herbes.js"; import { RdDUtility } from "./rdd-utility.js"; -const typesObjetsEquipement = ["objet", "arme", "armure", "gemme", "conteneur", "herbe", "ingredient", "livre", "potion", "munition", "nourritureboisson", "monnaie"] +const typesObjetsEquipement = [ + "arme", + "armure", + "conteneur", + "gemme", + "herbe", + "ingredient", + "livre", + "monnaie", + "munition", + "nourritureboisson", + "objet", + "potion", +] const typesObjetsOeuvres = ["oeuvre", "recettecuisine", "musique", "chant", "danse", "jeu"] -const encBrin = 0.00005;// un brin = 1 décigramme = 1/10g = 1/10000kg = 1/20000 enc +const encBrin = 0.00005; // un brin = 1 décigramme = 1/10g = 1/10000kg = 1/20000 enc +const encPepin = 0.0007; /* un pépin de gemme = 1/10 cm3 = 1/1000 l = 3.5/1000 kg = 7/2000 kg = 7/1000 enc +densité 3.5 (~2.3 à 4, parfois plus) -- https://www.juwelo.fr/guide-des-pierres/faits-et-chiffres/ + */ export const defaultItemImg = { competence: "systems/foundryvtt-reve-de-dragon/icons/competence_defaut.webp", @@ -50,7 +65,7 @@ export class RdDItem extends Item { super(itemData, context); } - static getTypeObjetsEquipement() { + static getTypesObjetsEquipement() { return typesObjetsEquipement } @@ -62,6 +77,9 @@ export class RdDItem extends Item { return this.type == 'competence'; } + isEquipement() { + return typesObjetsEquipement.includes(this.type) + } isConteneur() { return this.type == 'conteneur'; } @@ -87,11 +105,6 @@ export class RdDItem extends Item { isPotion() { return this.type == 'potion'; } - - isEquipement() { - return RdDItem.getTypeObjetsEquipement().includes(this.type) - } - isCristalAlchimique() { return this.type == 'objet' && Grammar.toLowerCaseNoAccent(this.name) == 'cristal alchimique' && this.system.quantite > 0; } @@ -100,22 +113,36 @@ export class RdDItem extends Item { return this.system.magique } - getEncTotal() { - return Number(this.system.encombrement ?? 0) * Number(this.system.quantite ?? 1) + getQuantite() { + return Math.round(this.isConteneur() ? 1 : (this.system.quantite ?? 0)) } + + getEncTotal() { + return this.getEnc() * this.getQuantite(); + } + getEnc() { switch (this.type) { case 'herbe': return encBrin; + case 'gemme': + return encPepin * this.system.taille; } - return this.system.encombrement ?? 0; + return Math.max(this.system.encombrement ?? 0, 0); + } + + prixTotalDeniers() { + return this.getQuantite() * this.valeurDeniers() + } + + valeurDeniers() { + return Math.max(Math.round(this.system.cout ? (this.system.cout * 100) : (this.system.valeur_deniers ?? 0)), 0) } prepareDerivedData() { super.prepareDerivedData(); if (this.isEquipement()) { - this._calculsEquipement(); - + this.system.encTotal = this.getEncTotal(); if (this.isPotion()) { this.prepareDataPotion() } @@ -134,17 +161,6 @@ export class RdDItem extends Item { } } - _calculsEquipement() { - const quantite = this.isConteneur() ? 1 : (this.system.quantite ?? 0); - const enc = this.getEnc(); - if (enc != undefined) { - this.system.encTotal = Math.max(enc, 0) * quantite; - } - if (this.cout != undefined) { - this.system.prixTotal = Math.max(this.cout, 0) * quantite; - } - } - getActionPrincipale(options = { warnIfNot: true }) { const warn = options.warnIfNot; switch (this.type) { @@ -202,18 +218,18 @@ export class RdDItem extends Item { if (!other || !this.isEquipement()) return undefined; let message = undefined; - if (this.type != other.type) { - message = `Impossible de regrouper ${this.type} avec ${other.type}`; + if (this.system.quantite == undefined) { + message = `Impossible de regrouper des ${this.type}, ils ne sont pas empilables`; + } + else if (this.type != other.type) { + message = `Impossible de regrouper des ${this.type} avec des ${other.type}`; } else if (this.name != other.name) { message = `Impossible de regrouper ${this.name} avec ${other.name}`; } - else if (this.system.quantite == undefined) { - message = `Impossible de regrouper des ${this.type}, ils ne sont pas empilables`; - } else { const differences = Object.entries(this.system) - .filter(([key, value]) => !['quantite', 'encTotal', 'prixTotal', 'cout'].includes(key) && value != other.system[key]); + .filter(([key, value]) => !['quantite', 'cout'].includes(key) && value != other.system[key]); if (differences.length > 0) { message = `Impossible de regrouper les ${this.type} ${this.name}: `; for (const [key, value] of differences) { diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index 7d7d03d0..53557756 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -158,7 +158,7 @@ export class RdDTMRDialog extends Dialog { } _tokenDemiReve() { - return EffetsDraconiques.demiReve.token(this.pixiTMR, this.actor.system, () => this.actor.system.reve.tmrpos.coord); + return EffetsDraconiques.demiReve.token(this.pixiTMR, this.actor, () => this.actor.system.reve.tmrpos.coord); } forceDemiRevePositionView() { @@ -625,16 +625,16 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ isCaseHumide(tmr) { if (!(TMRUtility.isCaseHumide(tmr) || this.isCaseHumideAdditionelle(tmr))) { - return undefined; + return false; } if (this.isCaseMaitrisee(tmr.coord)) { ChatMessage.create({ content: tmr.label + ": cette case humide est déja maitrisée grâce à votre Tête Quête des Eaux", whisper: ChatMessage.getWhisperRecipients(game.user.name) }); - return undefined; + return false; } - return -7; + return true; } /* -------------------------------------------- */ @@ -878,11 +878,13 @@ export class RdDTMRDialog extends Dialog { if (this.isDemiReveCache()) { if (this.isTerreAttache(targetCoord) - || (this.isCaseHumide(currentCoord) && this.isCaseHumide(targetCoord)) + || this.isConnaissanceFleuve(currentCoord, targetCoord) || deplacementType == 'changeur') { // déplacement possible - await this.actor.montreTMR(); + await this.actor.setTMRVisible(true); + this.demiReve = this._tokenDemiReve(); + this._trackToken(this.demiReve); } else { diff --git a/module/rdd-utility.js b/module/rdd-utility.js index f5fd4d06..61a8c2a9 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -262,6 +262,7 @@ export class RdDUtility { Handlebars.registerHelper('caseTmr-type', coord => TMRUtility.getTMRType(coord)); Handlebars.registerHelper('typeTmr-name', coord => TMRUtility.typeTmrName(coord)); Handlebars.registerHelper('min', (...args) => Math.min(...args.slice(0, -1))); + Handlebars.registerHelper('regle-optionnelle', (option) => ReglesOptionelles.isUsing(option) ); Handlebars.registerHelper('filtreTriCompetences', competences => competences.filter(it => it.system.isVisible) .sort((a, b) => { @@ -307,7 +308,7 @@ export class RdDUtility { /* -------------------------------------------- */ static async selectObjetType(actorSheet) { - let typeObjets = RdDItem.getTypeObjetsEquipement(); + let typeObjets = RdDItem.getTypesObjetsEquipement(); let options = `Selectionnez le type d'équipement