From d25c6b7f1ca217d19ce33745bc1f46af768acf99 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Fri, 30 Sep 2022 01:55:04 +0200 Subject: [PATCH 1/7] Montrer/cacher les TMR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le bouton "Montrer les TMR" devient "Cacher les TMR"/"Montrer les TMR" selon qu'elles sont visibles ou pas Lors de l'utilisation d'une terre d'attache, c'un changeur ou de la connaissance du fleuve, le demi-rêve redevient visible --- module/actor-sheet.js | 2 +- module/actor.js | 19 +++++++++---------- module/rdd-tmr-dialog.js | 14 ++++++++------ templates/actor/haut-revant.html | 4 +++- 4 files changed, 21 insertions(+), 18 deletions(-) diff --git a/module/actor-sheet.js b/module/actor-sheet.js index 8e1fc851..64000d44 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -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.js b/module/actor.js index 9ad0b47b..9f87ef5d 100644 --- a/module/actor.js +++ b/module/actor.js @@ -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/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/templates/actor/haut-revant.html b/templates/actor/haut-revant.html index bee5f0ed..3f626600 100644 --- a/templates/actor/haut-revant.html +++ b/templates/actor/haut-revant.html @@ -4,7 +4,9 @@ Ré-insertion aléatoire (ie TMR cachée) - Montrer les TMR + + {{#if hautreve.cacheTMR}}Montrer les TMR{{else}}Cacher les TMR{{/if}} + {{/if}} From efdc676776394823a99663936ee7bee8b7571f45 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Tue, 4 Oct 2022 01:53:18 +0200 Subject: [PATCH 2/7] Ajout confirmation pour vider les conteneurs --- module/actor-sheet.js | 2 +- module/actor-vehicule-sheet.js | 2 +- module/actor.js | 29 ++++++++++++++++++----------- module/rdd-utility.js | 29 +++++++++++++++-------------- 4 files changed, 35 insertions(+), 27 deletions(-) diff --git a/module/actor-sheet.js b/module/actor-sheet.js index 64000d44..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(); }); 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 9f87ef5d..54fe111f 100644 --- a/module/actor.js +++ b/module/actor.js @@ -1163,18 +1163,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) { diff --git a/module/rdd-utility.js b/module/rdd-utility.js index f5fd4d06..2d023f74 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -855,17 +855,16 @@ export class RdDUtility { } /* -------------------------------------------- */ - static confirmerSuppression(sheet, htmlToDelete, options) { + static confirmer(options) { const d = new Dialog({ - title: options.title ?? 'Confirmer la suppression', - content: `

Etes vous certain de vouloir supprimer ${options.supprimer ?? 'cet objet'} ?

`, + title: options.title, + content: options.content, buttons: { - delete: { + action: { icon: '', - label: options.deleteLabel ?? 'Supprimer', + label: options.buttonLabel, callback: () => { - options.onDelete(); - RdDUtility.slideOnDelete(sheet, htmlToDelete); + options.onAction(); } }, cancel: { @@ -880,12 +879,14 @@ export class RdDUtility { /* -------------------------------------------- */ static confirmerSuppressionSubacteur(sheet, subActor, htmlToDelete) { - RdDUtility.confirmerSuppression(sheet, htmlToDelete,{ - supprimer: "le lien vers le véhicule/monture/suivant : " + subActor.name, - deleteLabel: "Supprimer le lien", - onDelete: () => { - console.log("Delete : ", subActor.id); + RdDUtility.confirmer({ + content: `

Etes vous certain de vouloir supprimer le lien vers le véhicule/monture/suivant : ${subActor.name} ?

`, + title: 'Confirmer la suppression', + buttonLabel: 'Supprimer le lien', + onAction: () => { + console.log('Delete : ', subActor.id); sheet.actor.removeSubacteur(subActor.id); + RdDUtility.slideOnDelete(sheet, htmlToDelete); } }) } @@ -898,13 +899,13 @@ export class RdDUtility { return; } - let msgTxt = "

Etes vous certain de vouloir supprimer cet objet ?"; + let msgTxt = '

Etes vous certain de vouloir supprimer cet objet ?'; let buttons = { delete: { icon: '', label: "Supprimer l'objet", callback: () => { - console.log("Delete : ", itemId); + console.log('Delete : ', itemId); sheet.actor.deleteEmbeddedDocuments('Item', [itemId], { renderSheet: false }); RdDUtility.slideOnDelete(sheet, htmlToDelete); } From 22091ef43101d4d7742306e9558869668c488e3f Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Tue, 4 Oct 2022 01:58:49 +0200 Subject: [PATCH 3/7] =?UTF-8?q?Corrections=20prix=20et=20enc.=20=C3=A9quip?= =?UTF-8?q?ement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Affichage de la valeur si option activée Utilisation de boutons au lieu des liens --- module/actor.js | 13 ++---- module/item.js | 78 ++++++++++++++++++++------------- module/rdd-utility.js | 3 +- module/regles-optionelles.js | 6 ++- templates/actor/inventaire.html | 18 +++++--- templates/actor/taches.html | 2 +- 6 files changed, 70 insertions(+), 50 deletions(-) diff --git a/module/actor.js b/module/actor.js index 54fe111f..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) @@ -1375,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; } /* -------------------------------------------- */ 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-utility.js b/module/rdd-utility.js index 2d023f74..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 - Utiliser {{#each system.compteurs as |compteur key|}} {{#if (eq compteur.label 'Chance')}} @@ -184,7 +184,7 @@ {{#select compteur.value}} {{>"systems/foundryvtt-reve-de-dragon/templates/niveau-ethylisme.html"}} {{/select}} - + {{else}} {{/if}} @@ -199,13 +199,12 @@ Jet de moral situation heureuse {{else}} - {{/if}} + {{/if}} {{/if}} {{/each}} - @@ -226,6 +225,8 @@ + +

From 34f2e33d6d5d0ef4024891de6eb9660a0d842c5f Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Tue, 4 Oct 2022 03:33:17 +0200 Subject: [PATCH 7/7] =?UTF-8?q?D=C3=A9placer=20la=20remise=20=C3=A0=20neuf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit C'est plus cohérent de grouper les boutons joueur pour avoir un même aspect que la feuille soit affichée en joueur ou MJ --- templates/actor-sheet.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index d4dafc9e..2ccf71e7 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -51,13 +51,13 @@
Appel à la chance Encaisser des dommages - Remise à neuf Se reposer {{#if system.attributs.hautrevant.value}} Montée dans les Terres Médianes ! Montée accélérée dans les Terres Médianes ! Regarder les Terres Médianes {{/if}} + Remise à neuf
Malus de fatigue : {{calc.fatigue.malus}}