diff --git a/module/actor-sheet.js b/module/actor-sheet.js index 2cf90ea1..576f4c9f 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -261,7 +261,7 @@ export class RdDActorSheet extends ActorSheet { const li = $(ev.currentTarget).parents(".item"); const itemId = li.data("item-id"); const item = this.actor.getObjet(itemId); - this.actor.consommer(item); + this.actor.consommerDialog(item); }); html.find('.subacteur-delete').click(ev => { const li = $(ev.currentTarget).parents(".item"); diff --git a/module/actor.js b/module/actor.js index 915ba800..a3efca07 100644 --- a/module/actor.js +++ b/module/actor.js @@ -1610,25 +1610,70 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ - async consommer(item) { - DialogConsommer.create(this, item, { - html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-consommer-nourriture.html', - }, []); + async consommerDialog(item) { + if (!item.isConsommable()) return; + const dialog = await DialogConsommer.create(this, item); + dialog.render(true) } - async manger(sust) { + /* -------------------------------------------- */ + async consommer(item, choix) { + switch (Misc.data(item).type) { + case 'nourritureboisson': + return await this.consommerNourritureboisson(item, choix); + case 'potion': + return await this.consommerPotion(item) + } + } + + /* -------------------------------------------- */ + async consommerNourritureboisson(item, choix = { doses: 1, seForcer: false }) { + const itemData = Misc.data(item); + if (itemData.type != 'nourritureboisson') { + return; + } + if (choix.doses > itemData.data.quantite) { + ui.notifications.warn(`Il n'y a pas assez de ${itemData.name} poour manger ${choix.doses}`) + return; + } + const surmonteExotisme = await this.surmonterExotisme(item, choix); + if (!surmonteExotisme) { + ui.notifications.warn(`Vous n'arrivez pas à manger de ${itemData.name}`) + return; + } + await this.manger(item, choix.doses, { diminuerQuantite: false }); + await this.boire(item, choix.doses, { diminuerQuantite: false }); + await item.diminuerQuantite(choix.doses); + } + + /* -------------------------------------------- */ + async manger(item, doses, options = { diminuerQuantite: true }) { + if (!item.isConsommable()) return; + await this.apprecierCuisine(item); + const sust = Misc.templateData(item).sust; if (sust > 0) { - await this.updateCompteurValue('sust', Misc.templateData(this).compteurs.sust.value + sust); + await this.updateCompteurValue('sust', Misc.keepDecimals(Misc.templateData(this).compteurs.sust.value + sust * doses, 2)); } + await item.diminuerQuantite(doses, options); } - async boire(eau) { - if (eau > 0) { - await this.actor.updateCompteurValue('eau', Misc.templateData(this).eau.value + this.consommerData.data.desaltere); + /* -------------------------------------------- */ + async boire(item, doses, options = { diminuerQuantite: true }) { + if (!item.isConsommable()) return; + const tplData = Misc.templateData(item); + const desaltere = tplData.desaltere; + if (desaltere > 0) { + await this.updateCompteurValue('eau', Misc.keepDecimals(Misc.templateData(this).compteurs.eau.value + desaltere * doses, 2)); } + if (item.isAlcool()) { + for (let i = 0; i < doses; i++) { + await this.saouler(tplData.force); + } + } + await item.diminuerQuantite(doses, options); } - async alcool(forceAlcool) { + async saouler(forceAlcool) { const actorTplData = Misc.templateData(this); const etatGeneral = this.getEtatGeneral({ ethylisme: true }); const nbDoses = -Number(actorTplData.compteurs.ethylisme.nb_doses || 0); @@ -1643,26 +1688,28 @@ export class RdDActor extends Actor { await this.performEthylisme(rollData); } - async apprecierCuisine(consommerData) { + async apprecierCuisine(item) { const cuisine = Misc.data(this.getCompetence('cuisine')); - const qualite = consommerData.data.qualite; + const itemData = Misc.data(item); + const qualite = itemData.data.qualite; if (cuisine && qualite > 0 && qualite > cuisine.data.niveau) { - const rolled = await this.rollCaracCompetence('gout', 'cuisine', qualite, { title: consommerData.data.boisson ? "apprécie la boisson" : "apprécie le plat" }); + const rolled = await this.rollCaracCompetence('gout', 'cuisine', qualite, { title: itemData.data.boisson ? "apprécie la boisson" : "apprécie le plat" }); if (rolled.isSuccess) { await this.jetDeMoral('heureux'); } } } - - async surmonterExotisme(consommerData) { - const qualite = consommerData.data.qualite; + + async surmonterExotisme(item, choix = {}) { + const itemData = Misc.data(item); + const qualite = itemData.data.qualite; if (qualite < 0) { - const rolled = await this.rollCaracCompetence('volonte', 'cuisine', qualite, { title: "tente de surmonter l'exotisme" }); + const rolled = await this.rollCaracCompetence('volonte', 'cuisine', qualite, { title: `surmonte l'exotisme de ${itemData.name}` }); if (rolled.isEchec) { - if (!consommerData.data.seForcer) { + if (!choix.seForcer) { return false; } - await this.actor.jetDeMoral('malheureux'); + await this.jetDeMoral('malheureux'); } } return true; @@ -2102,7 +2149,7 @@ export class RdDActor extends Actor { caracValue: Number(carac.value), selectedCarac: carac, competence: competence, - finalLevel: (competence?.data.niveau ?? 0) + diff, + finalLevel: (Misc.templateData(competence)?.niveau ?? 0) + diff, diffLibre: diff, showDice: true, show: { title: options?.title ?? '' } diff --git a/module/dialog-consommer.js b/module/dialog-consommer.js index 13ea1387..37584bd5 100644 --- a/module/dialog-consommer.js +++ b/module/dialog-consommer.js @@ -3,56 +3,24 @@ import { Misc } from "./misc.js"; export class DialogConsommer extends Dialog { - static async create(actor, item, dialogConfig) { - let consommerData = DialogConsommer.prepareData(actor, item); - if (!consommerData) { - ui.notifications.warn(`Impossible de consommer un ${consommerData.name}, ce n'est pas de la nourriture, une boisson ou une potion`); - return; - } + static async create(actor, item, template = undefined, options = {}) { + const consommerData = DialogConsommer.prepareData(actor, item, options); + const html = await renderTemplate(template ?? `systems/foundryvtt-reve-de-dragon/templates/consommer/dialog-${Misc.data(item).type}.html`, consommerData); + return new DialogConsommer(actor, item, consommerData, html, options) + } + + constructor(actor, item, consommerData, html, options = {}) { + mergeObject(options, { classes: ["dialogconsommer"], width: 600, height: 500, 'z-index': 99999 }, { overwrite: false }) let conf = { title: consommerData.title, - content: await renderTemplate(dialogConfig.html, consommerData), + content: html, default: consommerData.buttonName, - }; - - - let options = { classes: ["dialogconsommer"], width: 600, height: 500, 'z-index': 99999 }; - mergeObject(options, dialogConfig.options ?? {}, { overwrite: true }) - - console.log('consommer', actor, consommerData, conf, options); - const dialog = new DialogConsommer(actor, consommerData, conf, options); - dialog.render(true); - return dialog; - } - - static prepareData(actor, item) { - let consommerData = duplicate(Misc.data(item)); - switch (consommerData.type) { - default: - return undefined; - case 'nourritureboisson': - consommerData.doses = 1; - consommerData.title = consommerData.data.boisson ? `${consommerData.name}: boire une dose` : `${consommerData.name}: manger une portion`; - consommerData.buttonName = consommerData.data.boisson ? "Boire" : "Manger"; - break; - case 'potion': - buttonName.title = `${consommerData.name}: boire la potion`; - consommerData.buttonName = "Boire"; - consommerData.alchimie = Misc.data(actor.getCompetence('alchimie')); - break; - } - consommerData.cuisine = Misc.data(actor.getCompetence('cuisine')); - consommerData.seForcer = false; - return consommerData; - } - - - constructor(actor, consommerData, conf, options) { - conf.buttons = { - [consommerData.buttonName]: { - label: consommerData.buttonName, callback: it => { - this.consommer(); + buttons: { + [consommerData.buttonName]: { + label: consommerData.buttonName, callback: it => { + this.actor.consommer(this.item, this.consommerData.choix); + } } } }; @@ -60,66 +28,55 @@ export class DialogConsommer extends Dialog { super(conf, options); this.actor = actor; + this.item = item; this.consommerData = consommerData; } + /* -------------------------------------------- */ + static prepareData(actor, item, options) { + const itemData = duplicate(Misc.data(item)); + let consommerData = { + item: itemData, + choix: { + doses: options.doses ?? 1, + seForcer: options.seForcer ?? false, + } + } + switch (itemData.type) { + case 'nourritureboisson': + consommerData.title = itemData.data.boisson ? `${itemData.name}: boire une dose` : `${itemData.name}: manger une portion`; + consommerData.buttonName = itemData.data.boisson ? "Boire" : "Manger"; + break; + case 'potion': + buttonName.title = `${itemData.name}: boire la potion`; + consommerData.buttonName = "Boire"; + break; + } + DialogConsommer.calculDoses(consommerData, consommerData.choix.doses) + return consommerData; + } + + static calculDoses(consommerData) { + const doses = consommerData.choix.doses; + consommerData.totalSust = Misc.keepDecimals(doses * (consommerData.item.data.sust ?? 0), 2); + consommerData.totalDesaltere = consommerData.item.data.boisson + ? Misc.keepDecimals(doses * (consommerData.item.data.desaltere ?? 0), 2) + : 0; + } + + /* -------------------------------------------- */ activateListeners(html) { super.activateListeners(html); - - function updateConsommerData(rollData) { - - rollData.finalLevel = Number(rollData.etat) + Number(rollData.forceAlcool) + rollData.diffNbDoses; - - // Mise à jour valeurs - $("#roll-param").text(rollData.vieValue + " / " + Misc.toSignedString(rollData.finalLevel)); - $(".table-resolution").remove(); - $("#resolutionTable").append(RdDResolutionTable.buildHTMLTableExtract(rollData.vieValue, rollData.finalLevel)); - } - + html.find(".se-forcer").change(event => { + this.consommerData.choix.seForcer = event.currentTarget.checked; + }); html.find(".consommer-doses").change(event => { - this.u + this.consommerData.choix.doses = Number(event.currentTarget.value); + DialogConsommer.calculDoses(this.consommerData); + $(".total-sust").text(this.consommerData.totalSust) + $(".total-desaltere").text(this.consommerData.totalDesaltere) }); } - /* -------------------------------------------- */ - async consommer() { - switch (this.consommerData.type) { - default: - return undefined; - case 'nourritureboisson': - return await this.consommerNourritureBoisson(); - case 'potion': - return await this.consommerPotion(); - } - } - - async consommerNourritureBoisson() { - const surmonteExotisme = await this.actor.surmonterExotisme(this.consommerData); - if (!surmonteExotisme) { - return; - } - await this.actor.apprecierCuisine(this.consommerData); - if (this.isAlcool()) { - await this.actor.alcool(this.consommerData.data.force); - } - await this.actor.manger(this.consommerData.data.sust); - await this.actor.boire(this.consommerData.data.desaltere); - } - - isAlcool() { - return this.consommerData.data.boisson && this.consommerData.data.alcoolise; - } - - async apprecierCuisine(qualite) { - const jetGoutCuisine = await this.jetGoutCuisine(); - if (jetGoutCuisine) { - await this.actor.jetDeMoral('heureux'); - } - } - - async consommerPotion() { - } - - } \ No newline at end of file diff --git a/module/item.js b/module/item.js index ab7f8ec3..190483c8 100644 --- a/module/item.js +++ b/module/item.js @@ -33,6 +33,31 @@ export class RdDItem extends Item { } + isConsommable(options = { warnIfNot: true }) { + const itemData = Misc.data(this); + if ((itemData.data.quantite ?? 0) <= 0) { + if (options.warnIfNot) { + ui.notifications.warn(`Vous n'avez plus de ${itemData.name}.`); + } + return false; + } + + switch (itemData.type) { + case 'nourritureboisson': + case 'potion': + return true; + } + if (options.warnIfNot) { + ui.notifications.warn(`Impossible de consommer un ${itemData.name}, ce n'est pas commestible.`); + } + return false; + } + + isAlcool() { + const itemData = Misc.data(this); + return itemData.type == 'nourritureboisson' && itemData.data.boisson && itemData.data.alcoolise; + } + async diminuerQuantite(nombre, options = { diminuerQuantite: true }) { if (!options.diminuerQuantite) return; const itemData = Misc.data(this); diff --git a/module/misc.js b/module/misc.js index 0661b44b..e0a07c61 100644 --- a/module/misc.js +++ b/module/misc.js @@ -47,7 +47,11 @@ export class Misc { const parsed = parseInt(value); return isNaN(parsed) ? 0 : parsed; } - + static keepDecimals(num, decimals) { + if (decimals<=0 || decimals>6) return num; + const decimal = Math.pow(10, parseInt(decimals)); + return Math.round(num * decimal) / decimal; + } static getFractionHtml(diviseur) { if (!diviseur || diviseur <= 1) return undefined; switch (diviseur || 1) { diff --git a/templates/consommer/dialog-nourritureboisson.html b/templates/consommer/dialog-nourritureboisson.html new file mode 100644 index 00000000..91a4f15f --- /dev/null +++ b/templates/consommer/dialog-nourritureboisson.html @@ -0,0 +1,36 @@ +
+
+ + +
+ {{#if item.data.sust}} +

Cette {{#if item.data.boisson}}boisson{{else}}nourriture{{/if}} vous apportera {{totalSust}} de sustantation.

+ {{/if}} + {{#if item.data.boisson}} +

{{#if item.data.alcoolise}} + C'est une boisson alcoolisée de force {{item.data.force}}, vous effectuerez un jet d'éthylisme. + {{/if}} + Cette boisson vous apportera {{totalDesaltere}} unités d'eau. +

+ {{/if}} + {{#if (gt item.data.qualite cuisine.data.niveau)}} +

La qualité du plat est telle qu'un jet de Goût/Cuisine à {{numberFormat item.data.qualite decimals=0 sign=true}} + vous permettra un jet de moral heureux.

+ {{/if}} + + {{#if (lt item.data.qualite 0)}} +

+ Pour surmonter l'exotisme, vous devez effectuer un jet de Volonté/Cuisine à + {{numberFormat item.data.qualite decimals=0 sign=true}}. +

+

+ + +

+ {{/if}} + +
\ No newline at end of file diff --git a/templates/dialog-consommer-nourriture.html b/templates/dialog-consommer-nourriture.html deleted file mode 100644 index 58d50d98..00000000 --- a/templates/dialog-consommer-nourriture.html +++ /dev/null @@ -1,39 +0,0 @@ -
-
- - -
-
- {{#if data.sust}} -

- Cette {{#if data.boisson}}boisson{{else}}nourriture{{/if}} vous apportera {{data.sust}} de - sustantation. -

- {{/if}} - {{#if data.boisson}} -

{{#if data.alcoolise}} - C'est une boisson alcoolisée de force {{data.force}}, vous effectuerez un jet d'éthylisme. - {{/if}} - Cette boisson vous apportera {{data.desaltere}} unités d'eau. -

- {{/if}} - {{#if (gt data.qualite cuisine.data.niveau)}} -

La qualité du plat est telle qu'un jet de Goût/Cuisine à {{numberFormat data.qualite decimals=0 sign=true}} - vous permettra un jet de moral heureux.

- {{/if}} -
- - {{#if (lt data.qualite 0)}} -
-

- Pour surmonter l'exotisme, vous devez effectuer un jet de Volonté/Cuisine à {{numberFormat data.qualite decimals=0 sign=true}}. -

-

- - -

-
- {{/if}} - -
\ No newline at end of file