From 080a8b51b3a4b65c08ce8ed0c2d8bb505d9693c5 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Fri, 4 Jun 2021 18:30:06 +0200 Subject: [PATCH 1/9] =?UTF-8?q?Support=20/astro=20avec=20noms=20partiels?= =?UTF-8?q?=20ou=20num=C3=A9riques?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit => fix /astro Château Dromant => support /astro chat => support /astro 12 --- module/rdd-calendrier.js | 28 +++++++++++++++++++++++----- module/rdd-commands.js | 12 +++++++++--- module/rdd-utility.js | 9 +++++++-- 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/module/rdd-calendrier.js b/module/rdd-calendrier.js index 3be674a6..df296080 100644 --- a/module/rdd-calendrier.js +++ b/module/rdd-calendrier.js @@ -325,11 +325,26 @@ export class RdDCalendrier extends Application { } } + findHeure(heure) { + heure = Grammar.toLowerCaseNoAccent(heure); + let parHeureOuLabel = Object.values(heuresDef).filter(it => (it.heure+1) == heure || Grammar.toLowerCaseNoAccent(it.label) == heure); + if (parHeureOuLabel.length == 1) { + return parHeureOuLabel[0]; + } + let parLabelPartiel = Object.values(heuresDef).filter(it => Grammar.toLowerCaseNoAccent(it.label).includes(heure)); + const matchLength = heure.length; + if(parLabelPartiel.length > 0) { + parLabelPartiel.sort((a,b)=> (a.label.length - matchLength)^2 - (b.label.length- matchLength)^2); + return parLabelPartiel[0]; + } + return undefined; + } + /* -------------------------------------------- */ - getAjustementAstrologique(heureNaissance, name = 'inconnu') { - let heure = Grammar.toLowerCaseNoAccent(heureNaissance); - if (heure && heuresDef[heure]) { - let hn = heuresDef[heure].heure; + getAjustementAstrologique(heureNaissance, name = undefined) { + let defHeure = this.findHeure(heureNaissance); + if (defHeure) { + let hn = defHeure.heure; let chiffreAstral = this.getCurrentNombreAstral() ?? 0; let heureCourante = this.calendrier.heureRdD; let ecartChance = (hn + chiffreAstral - heureCourante) % 12; @@ -340,9 +355,12 @@ export class RdDCalendrier extends Application { case 3: case 9: return -2; } } - else { + else if (name) { ui.notifications.warn(name + " n'a pas d'heure de naissance, ou elle est incorrecte : " + heureNaissance); } + else{ + ui.notifications.warn(heureNaissance+" ne correspond pas à une heure de naissance"); + } return 0; } diff --git a/module/rdd-commands.js b/module/rdd-commands.js index fe4c1cda..c6ff622f 100644 --- a/module/rdd-commands.js +++ b/module/rdd-commands.js @@ -79,9 +79,11 @@ export class RdDCommands {
/payer 10d permet d'envoyer un message pour payer 10 deniers` }); rddCommands.registerCommand({ - path: ["/astro"], func: (content, msg, params) => RdDUtility.afficherHeuresChanceMalchance(params[0]), - descr: `Affiche les heures de chance et de malchance selon l'heure de naissance donnée en argument. Exemples: -
/astro Lyre` + path: ["/astro"], func: (content, msg, params) => RdDUtility.afficherHeuresChanceMalchance(RdDCommands.toParamString(params)), + descr: `Affiche les heures de chance et de malchance selon l'heure de naissance donnée en argument. Exemples pour l'heure de la Lyre: +
/astro 7 +
/astro Lyre +
/astro Lyr` }); rddCommands.registerCommand({ @@ -109,6 +111,10 @@ export class RdDCommands { this.commandsTable = {}; } + static toParamString(params) { + return params.length == 1 ? params[0] : params.reduce((a, b) => `${a} ${b}`, ''); + } + /* -------------------------------------------- */ registerCommand(command) { this._addCommand(this.commandsTable, command.path, '', command); diff --git a/module/rdd-utility.js b/module/rdd-utility.js index e275a5e1..88cd4ddd 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -830,13 +830,18 @@ export class RdDUtility { /* -------------------------------------------- */ static afficherHeuresChanceMalchance(heureNaissance) { if ( game.user.isGM) { - if (heureNaissance) { + let heure = game.system.rdd.calendrier.findHeure(heureNaissance); + if (heureNaissance && heure) { let ajustement = game.system.rdd.calendrier.getAjustementAstrologique(heureNaissance); + const current = game.system.rdd.calendrier.findHeure(game.system.rdd.calendrier.getCurrentHeure()); ChatMessage.create({ - content: `A l'heure ${game.system.rdd.calendrier.getCurrentHeure()}, le modificateur de Chance/Malchance pour l'heure de naissance ${heureNaissance} est de : ${ajustement}.`, + content: `A l'heure de ${current.label}, le modificateur de Chance/Malchance est de ${Misc.toSignedString(ajustement)} pour l'heure de naissance ${heure.label}.`, whisper: ChatMessage.getWhisperRecipients("GM") }); } + else if (heureNaissance) { + ui.notifications.warn(heureNaissance+" ne correspond pas à une heure de naissance"); + } else { ui.notifications.warn("Pas d'heure de naissance selectionnée"); } From b5c8bb85fdf3b5ff36c254cb88d319e9302ef1ad Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Fri, 4 Jun 2021 19:30:29 +0200 Subject: [PATCH 2/9] =?UTF-8?q?Fix=20nbBrins=20par=20d=C3=A9faut=20pour=20?= =?UTF-8?q?potion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/dialog-fabriquer-potion.js | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/module/dialog-fabriquer-potion.js b/module/dialog-fabriquer-potion.js index c6b2096b..c23287aa 100644 --- a/module/dialog-fabriquer-potion.js +++ b/module/dialog-fabriquer-potion.js @@ -25,8 +25,8 @@ export class DialogFabriquerPotion extends Dialog { /* -------------------------------------------- */ static prepareData(actor, item) { let potionData = duplicate(Misc.data(item)); - potionData.nbBrinsSelect = RdDUtility.buildListOptions( 1, potionData.data.quantite); - potionData.nbBrins = potionData.data.quantite; + potionData.nbBrinsSelect = RdDUtility.buildListOptions(1, potionData.data.quantite); + potionData.nbBrins = Math.min(potionData.data.quantite, DialogFabriquerPotion.getNombreBrinOptimal(potionData)); potionData.buttonName = "Fabriquer"; return potionData; } @@ -35,9 +35,7 @@ export class DialogFabriquerPotion extends Dialog { constructor(actor, potionData, conf, options) { conf.buttons = { [potionData.buttonName]: { - label: potionData.buttonName, callback: it => { - this.fabriquer(); - } + label: potionData.buttonName, callback: it => this.onFabriquer(it) } }; @@ -47,18 +45,27 @@ export class DialogFabriquerPotion extends Dialog { this.potionData = potionData; } + static getNombreBrinOptimal(herbeData) { + switch (herbeData.data.categorie ?? '') { + case "Soin": return 12 - herbeData.data.niveau; + case "Repos": return 7 - herbeData.data.niveau; + } + return 1; + } + /* -------------------------------------------- */ activateListeners(html) { super.activateListeners(html); html.find("#nbBrins").change(event => { - this.potionData.nbBrins = Misc.toInt(event.currentTarget.value); + this.potionData.nbBrins = Misc.toInt(event.currentTarget.value); }); } /* -------------------------------------------- */ - async fabriquer() { - this.actor.fabriquerPotion( this.potionData ); + async onFabriquer(it) { + await $("#nbBrins").change(); + this.actor.fabriquerPotion(this.potionData); this.close(); } } \ No newline at end of file From 0524540f5affb15dbbced9ace0c5dc3712f5ebde Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Fri, 4 Jun 2021 19:35:27 +0200 Subject: [PATCH 3/9] fix: valider le champs des dialogs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Forcer la validation des champs saisis avant de fermer les dialogs et d'appeler le callback pour avoir la dernière valuer saisie par l'utilisateur --- module/dialog-create-signedraconique.js | 3 +++ module/dialog-item-achat.js | 1 + module/dialog-item-consommer.js | 32 +++++++++++++++---------- module/dialog-item-vente.js | 8 +++++-- module/dialog-split-item.js | 1 + 5 files changed, 31 insertions(+), 14 deletions(-) diff --git a/module/dialog-create-signedraconique.js b/module/dialog-create-signedraconique.js index c2ba0a14..acbcc916 100644 --- a/module/dialog-create-signedraconique.js +++ b/module/dialog-create-signedraconique.js @@ -39,6 +39,8 @@ export class DialogCreateSigneDraconique extends Dialog { } async _onCreerSigneActeurs() { + await $("[name='signe.data.ephemere']").change(); + await $(".signe-xp-sort").change(); this.validerSigne(); this.dialogData.actors.filter(it => it.selected).map(it => game.actors.get(it._id)) .forEach(actor => this._createSigneForActor(actor, this.dialogData.signe)); @@ -75,6 +77,7 @@ export class DialogCreateSigneDraconique extends Dialog { html.find(".select-actor").change((event) => this.onSelectActor(event)); html.find(".signe-xp-sort").change((event) => this.onValeurXpSort(event)); } + async setSigneAleatoire() { const newSigne = await RdDItemSigneDraconique.randomSigneDraconique({ephemere: true}); diff --git a/module/dialog-item-achat.js b/module/dialog-item-achat.js index ae1f0e5e..855c84a1 100644 --- a/module/dialog-item-achat.js +++ b/module/dialog-item-achat.js @@ -64,6 +64,7 @@ export class DialogItemAchat extends Dialog { } async onAchat() { + await $(".nombreLots").change(); (this.vendeur ?? this.acheteur).achatVente( this.vendeur?.id, this.acheteur?.id, diff --git a/module/dialog-item-consommer.js b/module/dialog-item-consommer.js index 07b12a6c..3a33072a 100644 --- a/module/dialog-item-consommer.js +++ b/module/dialog-item-consommer.js @@ -17,9 +17,7 @@ export class DialogConsommer extends Dialog { default: consommerData.buttonName, buttons: { [consommerData.buttonName]: { - label: consommerData.buttonName, callback: it => { - this.actor.consommer(this.item, this.consommerData.choix); - } + label: consommerData.buttonName, callback: it => this.onConsommer(it) } } }; @@ -31,6 +29,12 @@ export class DialogConsommer extends Dialog { this.consommerData = consommerData; } + async onConsommer(event) { + await $(".se-forcer").change(); + await $(".consommer-doses").change(); + this.actor.consommer(this.item, this.consommerData.choix); + } + /* -------------------------------------------- */ static prepareData(actor, item, options) { const itemData = duplicate(Misc.data(item)); @@ -68,15 +72,19 @@ export class DialogConsommer extends Dialog { /* -------------------------------------------- */ activateListeners(html) { super.activateListeners(html); - html.find(".se-forcer").change(event => { - this.consommerData.choix.seForcer = event.currentTarget.checked; - }); - html.find(".consommer-doses").change(event => { - this.consommerData.choix.doses = Number(event.currentTarget.value); - DialogConsommer.calculDoses(this.consommerData); - $(".total-sust").text(this.consommerData.totalSust) - $(".total-desaltere").text(this.consommerData.totalDesaltere) - }); + html.find(".se-forcer").change(event => this.setSeForcer(event)); + html.find(".consommer-doses").change(event => this.selectDoses(event)); } + + setSeForcer(event) { + this.consommerData.choix.seForcer = event.currentTarget.checked; + } + + selectDoses(event) { + this.consommerData.choix.doses = Number(event.currentTarget.value); + DialogConsommer.calculDoses(this.consommerData); + $(".total-sust").text(this.consommerData.totalSust); + $(".total-desaltere").text(this.consommerData.totalDesaltere); + } } \ No newline at end of file diff --git a/module/dialog-item-vente.js b/module/dialog-item-vente.js index 0354c884..a0a5dcf4 100644 --- a/module/dialog-item-vente.js +++ b/module/dialog-item-vente.js @@ -30,7 +30,7 @@ export class DialogItemVente extends Dialog { title: "Proposer", content: html, default: "proposer", - buttons: { "proposer": { label: "Proposer", callback: it => { this.onProposer(); } } } + buttons: { "proposer": { label: "Proposer", callback: it => { this.onProposer(it); } } } }; super(conf, options); @@ -38,7 +38,11 @@ export class DialogItemVente extends Dialog { this.venteData = venteData; } - async onProposer() { + async onProposer(it) { + await $(".tailleLot").change(); + await $(".quantiteNbLots").change(); + await $(".quantiteIllimite").change(); + await $(".prixLot").change(); this.callback(this.venteData); } diff --git a/module/dialog-split-item.js b/module/dialog-split-item.js index a3521493..1f3fe253 100644 --- a/module/dialog-split-item.js +++ b/module/dialog-split-item.js @@ -36,6 +36,7 @@ export class DialogSplitItem extends Dialog { } async onSplit(){ + await $(".choix-quantite").change(); this.callback(this.item, this.splitData.choix.quantite); } From 3a0186a15fd37037d48a40ba9d9af4a1fa959e28 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Fri, 4 Jun 2021 20:29:03 +0200 Subject: [PATCH 4/9] =?UTF-8?q?Fix:=20boissons=20exotiques&de=20mauvais=20?= =?UTF-8?q?go=C3=BBt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La qualité et l'exotisme sont maintenant appliqués aux boissons --- module/actor.js | 2 +- module/rdd-utility.js | 1 + templates/dialog-item-consommer.html | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/module/actor.js b/module/actor.js index f6b367fd..60a1467a 100644 --- a/module/actor.js +++ b/module/actor.js @@ -1940,7 +1940,7 @@ export class RdDActor extends Actor { const itemData = Misc.data(item); const exotisme = Math.min(itemData.data.exotisme, itemData.data.qualite, 0); if (exotisme < 0) { - const rolled = await this.rollCaracCompetence('volonte', 'cuisine', exotisme, { title: `surmonte l'exotisme de ${itemData.name}` }); + const rolled = await this.rollCaracCompetence('volonte', 'cuisine', exotisme, { title: `tente de surmonter l'exotisme de ${itemData.name}` }); if (rolled.isEchec) { if (!choix.seForcer) { return false; diff --git a/module/rdd-utility.js b/module/rdd-utility.js index 88cd4ddd..98d21036 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -222,6 +222,7 @@ export class RdDUtility { Handlebars.registerHelper('caseTmr-label', coord => TMRUtility.getTMRLabel(coord)); 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('sortCompetence', competences => competences.sort((a, b) => { if (a.name.startsWith("Survie") && b.name.startsWith("Survie")) { diff --git a/templates/dialog-item-consommer.html b/templates/dialog-item-consommer.html index 6fe38683..81ed53fe 100644 --- a/templates/dialog-item-consommer.html +++ b/templates/dialog-item-consommer.html @@ -24,9 +24,9 @@ {{/if}} {{/if}} - {{#if (lt item.data.exotisme 0)}} + {{#if (or (lt item.data.qualite 0) (lt item.data.exotisme 0))}}

- Pour surmonter l'exotisme, vous devez effectuer un jet de Volonté/Cuisine à {{numberFormat item.data.exotisme decimals=0 sign=true}}. + Pour surmonter {{#if (lt item.data.qualite 0)}}le mauvais goût{{else}}l'exotisme{{/if}}, vous devez effectuer un jet de Volonté/Cuisine à {{numberFormat (min item.data.exotisme item.data.qualite) decimals=0 sign=true}}.
From e0666b074e9a5a7aa90f9355a1220d615c4cf168 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 5 Jun 2021 00:55:39 +0200 Subject: [PATCH 5/9] typo tarot draconique --- packs/tarot-draconique.db | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packs/tarot-draconique.db b/packs/tarot-draconique.db index 14a61337..528dbf7b 100644 --- a/packs/tarot-draconique.db +++ b/packs/tarot-draconique.db @@ -18,4 +18,4 @@ {"_id":"yHvIWLb4TuUAbPGa","name":"Le Groin","permission":{"default":2,"Hp9ImM4o9YRTSdfu":3},"type":"tarot","data":{"concept":"Bêtise, Ignorance, Nullité","aspect":"Négatif","description":""},"folder":"LmM8c5pdDkCsDXka","sort":1750000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/tarots/dos-tarot.png","effects":[]} {"_id":"yIIUac5ehspmqDB2","name":"La Déchirure","permission":{"default":2,"Hp9ImM4o9YRTSdfu":3},"type":"tarot","data":{"concept":"Errance, Déroute, Désordre, Séparation","aspect":"Négatif","description":""},"folder":"LmM8c5pdDkCsDXka","sort":1250000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/tarots/dos-tarot.png","effects":[]} {"_id":"zP2OF8ZrAYEODxOn","name":"Le Rabot","permission":{"default":2,"Hp9ImM4o9YRTSdfu":3},"type":"tarot","data":{"concept":"Travail, Labeur, Peine, Chagrin","aspect":"Négatif","description":""},"folder":"LmM8c5pdDkCsDXka","sort":1500000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/tarots/dos-tarot.png","effects":[]} -{"_id":"zSqKPNeQTVjRuni6","name":"Le Soleil","permission":{"default":2,"Hp9ImM4o9YRTSdfu":3},"type":"tarot","data":{"concept":"Clarté, Evidence, Vérité, Franchiuse","aspect":"Positif","description":""},"folder":"LmM8c5pdDkCsDXka","sort":900000,"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/tarots/dos-tarot.png","effects":[]} +{"_id":"zSqKPNeQTVjRuni6","name":"Le Soleil","type":"tarot","img":"systems/foundryvtt-reve-de-dragon/icons/tarots/dos-tarot.png","data":{"concept":"Clarté, Evidence, Vérité, Franchise","aspect":"Positif","description":""},"effects":[],"folder":"LmM8c5pdDkCsDXka","sort":900000,"permission":{"default":2,"Hp9ImM4o9YRTSdfu":3},"flags":{}} From 7ba3b44c87c35bd3059ddb60a0f28218d357d3bf Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 5 Jun 2021 01:14:29 +0200 Subject: [PATCH 6/9] =?UTF-8?q?Fix:=20=C3=A9crasement=20quantit=C3=A9=20?= =?UTF-8?q?=20achats=20multiples?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- module/actor.js | 68 ++++++++++++++++++------------------- module/dialog-item-achat.js | 60 +++++++++++++++++--------------- 2 files changed, 66 insertions(+), 62 deletions(-) diff --git a/module/actor.js b/module/actor.js index 60a1467a..5d425962 100644 --- a/module/actor.js +++ b/module/actor.js @@ -30,6 +30,7 @@ import { Monnaie } from "./item-monnaie.js"; import { DialogConsommer } from "./dialog-item-consommer.js"; import { DialogFabriquerPotion } from "./dialog-fabriquer-potion.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) { - if (vendeurId == acheteurId) { + async achatVente(achat) { + if (achat.vendeurId == achat.acheteurId) { ui.notifications.info("Inutile de se vendre à soi-même"); return; } if (!Misc.isElectedUser()) { RdDActor.remoteActorCall({ - actorId: vendeurId ?? acheteurId, - method: 'achatVente', args: [vendeurId, acheteurId, venteData, chatMessageIdVente] + actorId: achat.vendeurId ?? achat.acheteurId, + method: 'achatVente', args: [achat] }); return; } - const acheteur = acheteurId ? game.actors.get(acheteurId) : undefined; - const vendeur = vendeurId ? game.actors.get(vendeurId) : undefined; - const itemId = venteData.item._id; + const acheteur = achat.acheteurId ? game.actors.get(achat.acheteurId) : undefined; + 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 itemId = vente.item._id; - const coutDeniers = Math.floor((venteData.prixTotal ?? 0) * 100); - venteData.quantiteTotal = (venteData.nombreLots ?? 1) * (venteData.tailleLot); + const coutDeniers = Math.floor((achat.prixTotal ?? 0) * 100); + achat.quantiteTotal = (achat.nombreLots ?? 1) * (vente.tailleLot); if (acheteur) { let resteAcheteur = await acheteur.depenser(coutDeniers); 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; } } if (vendeur) { - let itemData = Misc.data(vendeur.getObjet(itemId)); - // diminuer QuantiteVendeur - if ("quantite" in itemData.data ? - itemData.data.quantite < venteData.quantiteTotal : venteData.nombreLots != 1) { - // pas assez de quantite + let itemVenduData = Misc.data(vendeur.getObjet(itemId)); + if ("quantite" in itemVenduData.data ? itemVenduData.data.quantite < achat.quantiteTotal : achat.nombreLots != 1) { 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; } vendeur.ajouterDeniers(coutDeniers); - let qtReste = (itemData.data.quantite ?? 1) - venteData.quantiteTotal; - if (qtReste == 0) { + let resteQuantite = (itemVenduData.data.quantite ?? 1) - achat.quantiteTotal; + if (resteQuantite == 0) { vendeur.deleteEmbeddedDocuments("Item", itemId); } else { - vendeur.updateEmbeddedDocuments("Item", [{ _id: itemId, 'data.quantite': qtReste }]); + vendeur.updateEmbeddedDocuments("Item", [{ _id: itemId, 'data.quantite': resteQuantite }]); } } - if (acheteur) { - const achat = { - type: venteData.item.type, - img: venteData.item.img, - name: venteData.item.name, - data: venteData.item.data + const achatData = { + type: vente.item.type, + img: vente.item.img, + name: vente.item.name, + data: vente.item.data } - achat.data.quantite = venteData.quantiteTotal; - await acheteur.createEmbeddedDocuments("Item", [achat]); + achatData.data.quantite = achat.quantiteTotal; + await acheteur.createEmbeddedDocuments("Item", [achatData]); } if (coutDeniers > 0) { RdDAudio.PlayContextAudio("argent"); @@ -3573,19 +3574,16 @@ export class RdDActor extends Actor { ChatMessage.create({ 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 (venteData.quantiteNbLots <= venteData.nombreLots) { + if (!vente.quantiteIllimite) { + if (vente.quantiteNbLots <= achat.nombreLots) { ChatUtility.removeChatMessageId(chatMessageIdVente); } else { - venteData.quantiteNbLots -= venteData.nombreLots; - venteData.jsondata = JSON.stringify(venteData.item); - 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 }); + vente.quantiteNbLots -= achat.nombreLots; + messageVente.update({ content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-vente-item.html', vente) }); messageVente.render(true); } } diff --git a/module/dialog-item-achat.js b/module/dialog-item-achat.js index 855c84a1..7a7079cf 100644 --- a/module/dialog-item-achat.js +++ b/module/dialog-item-achat.js @@ -1,17 +1,18 @@ -import { RdDActor } from "./actor.js"; -import { HtmlUtility } from "./html-utility.js"; + import { Misc } from "./misc.js"; import { RdDUtility } from "./rdd-utility.js"; export class DialogItemAchat extends Dialog { static async onButtonAcheter(event) { - let jsondata = event.currentTarget.attributes['data-jsondata']?.value; - if (!jsondata) { + const buttonAcheter = event.currentTarget; + if (!buttonAcheter.attributes['data-jsondata']?.value) { ui.notifications.warn("Impossible d'acheter: informations sur l'objet manquantes") 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 acheteur = RdDUtility.getSelectedActor(); @@ -20,22 +21,7 @@ export class DialogItemAchat extends Dialog { return; } - const chatMessageIdVente = RdDUtility.findChatMessageId(event.currentTarget); - 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 - }; + let venteData = DialogItemAchat.prepareVenteData(buttonAcheter, vendeurId, vendeur, acheteur); const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-achat.html`, venteData); const dialog = new DialogItemAchat(html, vendeur, acheteur, venteData, chatMessageIdVente); dialog.render(true); @@ -63,14 +49,34 @@ export class DialogItemAchat extends Dialog { 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() { await $(".nombreLots").change(); - (this.vendeur ?? this.acheteur).achatVente( - this.vendeur?.id, - this.acheteur?.id, - this.venteData, - this.chatMessageIdVente - ); + (this.vendeur ?? this.acheteur).achatVente({ + vendeurId: this.vendeur?.id, + acheteurId: this.acheteur?.id, + nombreLots: this.venteData.nombreLots, + prixTotal: this.venteData.prixTotal, + chatMessageIdVente: this.chatMessageIdVente + }); } /* -------------------------------------------- */ From 9a7b01a98567810afc0a52c857bac074aa1f02cf Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 5 Jun 2021 01:53:30 +0200 Subject: [PATCH 7/9] =?UTF-8?q?Fix:=20suppression=20conqu=C3=AAte=20automa?= =?UTF-8?q?tique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/actor.js | 2 +- module/tmr/conquete.js | 2 +- templates/actor-sheet.html | 15 ++++++++------- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/module/actor.js b/module/actor.js index 5d425962..69b91f68 100644 --- a/module/actor.js +++ b/module/actor.js @@ -4079,7 +4079,7 @@ export class RdDActor extends Actor { if (Misc.isElectedUser()) { let draconique = Draconique.all().find(it => it.isCase(item)); if (draconique) { - draconique.onActorDeleteCaseTmr(this, item) + draconique.onActorDeleteCaseTmr(this, Misc.data(item)) } } } diff --git a/module/tmr/conquete.js b/module/tmr/conquete.js index b8c0ac53..0773aa93 100644 --- a/module/tmr/conquete.js +++ b/module/tmr/conquete.js @@ -32,7 +32,7 @@ export class Conquete extends Draconique { async _creerConquete(actor, queue) { let existants = actor.data.items.filter(it => this.isCase(it)).map(it => Misc.data(it).data.coord); let possibles = TMRUtility.filterTMR(tmr => !TMRUtility.isCaseHumide(tmr) && !existants.includes(tmr.coord)); - let conquete =await RdDDice.rollOneOf(possibles); + let conquete = await RdDDice.rollOneOf(possibles); await this.createCaseTmr(actor, 'Conquête: ' + conquete.label, conquete, queue.id); } diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index 629ea8f7..baad0b8f 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -437,11 +437,11 @@ {{data.reve.refoulement.value}} {{/if}} - - - -


- {{#if data.attributs.hautrevant.value}} + + + +
+ {{#if data.attributs.hautrevant.value}} {{#if options.isGM}}

Signes draconiques

    @@ -567,12 +567,13 @@ {{#each hautreve.casesTmr as |casetmr key|}}
  • {{casetmr.name}} - +
    - +
  • {{/each}}
+

{{/if}} From c7a417fc698ebc6eaead21825f331b60485d6fd2 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 5 Jun 2021 02:05:51 +0200 Subject: [PATCH 8/9] Fix: trier les monnaies par valeur --- module/item-monnaie.js | 8 ++++++-- module/rdd-utility.js | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/module/item-monnaie.js b/module/item-monnaie.js index 741765de..95783191 100644 --- a/module/item-monnaie.js +++ b/module/item-monnaie.js @@ -26,7 +26,7 @@ const monnaiesData = [ export class Monnaie { static isSystemMonnaie(item) { - let present = monnaiesData.find( monnaie => monnaie.data.valeur_deniers == item.data?.data?.valeur_deniers); + let present = monnaiesData.find(monnaie => monnaie.data.valeur_deniers == Misc.data(item)?.data?.valeur_deniers); return present; } @@ -39,7 +39,7 @@ export class Monnaie { } static monnaiesManquantes(items) { - const valeurs = Monnaie.filtrerMonnaies(items) + const valeurs = Monnaie.filtrerMonnaies(items) .map(it => Misc.templateData(it).valeur_deniers); const manquantes = monnaiesData.filter(monnaie => !valeurs.find(v => v != Misc.templateData(monnaie).valeur_deniers)); //const manquantes = monnaiesData.filter(monnaie => !valeurs.find(v => v != Misc.templateData(monnaie).valeur_deniers) ); @@ -54,4 +54,8 @@ export class Monnaie { static arrondiDeniers(sols) { return sols.toFixed(2); } + + static triValeurDenier() { + return Misc.ascending(item => Misc.data(item).data.valeur_deniers); + } } diff --git a/module/rdd-utility.js b/module/rdd-utility.js index 98d21036..3082ab5c 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -364,6 +364,7 @@ export class RdDUtility { .concat(formData.nourritureboissons) .concat(formData.monnaie); formData.competences = (formData.itemsByType.competence ?? []).concat(formData.itemsByType.competencecreature ?? []); + formData.monnaie.sort(Monnaie.triValeurDenier()); } /* -------------------------------------------- */ From 19d820243988dcf7aa99555fa94ef66364e51278 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 5 Jun 2021 02:21:28 +0200 Subject: [PATCH 9/9] =?UTF-8?q?Fix:=20position=20token=20de=20rencontre=20?= =?UTF-8?q?d=C3=A9rob=C3=A9es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/tmr/rencontre.js | 2 +- templates/actor-sheet.html | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/module/tmr/rencontre.js b/module/tmr/rencontre.js index bf18ab60..6ace25e5 100644 --- a/module/tmr/rencontre.js +++ b/module/tmr/rencontre.js @@ -13,7 +13,7 @@ export class Rencontre extends Draconique { async onActorCreateOwned(actor, item) { } code() { return 'rencontre' } - tooltip(linkData) { return `${linkData.rencontre.name} de force ${linkData.rencontre.force}` } + tooltip(rencontre) { return `${rencontre.name} de force ${rencontre.force}` } img() { return 'systems/foundryvtt-reve-de-dragon/icons/heures/hd06.webp' } createSprite(pixiTMR) { diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index baad0b8f..4358a4a1 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -550,10 +550,10 @@