From 4efa32169355d1f81777810e826d4d5796979ffb Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Tue, 6 Apr 2021 23:44:57 +0200 Subject: [PATCH] Consommer nourriture et boisson WIP --- module/actor-sheet.js | 6 + module/actor.js | 95 +++++++++++++++- module/dialog-consommer.js | 124 +++++++++++++++++++++ module/rdd-main.js | 14 +++ templates/actor-sheet.html | 5 +- templates/dialog-consommer-nourriture.html | 39 +++++++ 6 files changed, 277 insertions(+), 6 deletions(-) create mode 100644 module/dialog-consommer.js create mode 100644 templates/dialog-consommer-nourriture.html diff --git a/module/actor-sheet.js b/module/actor-sheet.js index 95a13276..2cf90ea1 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -257,6 +257,12 @@ export class RdDActorSheet extends ActorSheet { const li = $(ev.currentTarget).parents(".item"); RdDUtility.confirmerSuppression(this, li); }); + html.find('.item-consommer').click(ev => { + const li = $(ev.currentTarget).parents(".item"); + const itemId = li.data("item-id"); + const item = this.actor.getObjet(itemId); + this.actor.consommer(item); + }); html.find('.subacteur-delete').click(ev => { const li = $(ev.currentTarget).parents(".item"); RdDUtility.confirmerSuppressionSubacteur(this, li); diff --git a/module/actor.js b/module/actor.js index 06d8af97..5b554778 100644 --- a/module/actor.js +++ b/module/actor.js @@ -28,6 +28,7 @@ import { Draconique } from "./tmr/draconique.js"; import { RdDCarac } from "./rdd-carac.js"; import { Monnaie } from "./item-monnaie.js"; import { RdDHerbes } from "./rdd-herbes.js"; +import { DialogConsommer } from "./dialog-consommer.js"; /* -------------------------------------------- */ @@ -355,6 +356,7 @@ export class RdDActor extends Actor { await this.transformerStress(); await this.retourSeuilDeReve(message); this.bonusRecuperationPotion= 0; // Reset potion + await this.retourSust(message); message.content = `A la fin Chateau Dormant, ${message.content}
Un nouveau jour se lève`; ChatMessage.create(message); } @@ -597,6 +599,26 @@ export class RdDActor extends Actor { } } + async retourSust(message) { + const tplData = Misc.templateData(this); + const sustNeeded = tplData.attributs.sust.value; + const sustConsomme = tplData.compteurs.sust.value; + const eauConsomme = tplData.compteurs.eau.value; + if (game.settings.get("foundryvtt-reve-de-dragon", "appliquer-famine-soif").includes('famine') && sustConsomme < sustNeeded) { + const perte = sustConsomme < Math.min(0.5, sustNeeded) ? 3 : (sustConsomme <= (sustNeeded / 2) ? 2 : 1); + message.content += `
Vous ne vous êtes sustenté que de ${sustConsomme} pour un appétit de ${sustNeeded}, vous avez faim! + La famine devrait vous faire ${perte} points d'endurance non récupérables, notez le cumul de côté et ajustez l'endurance`; + } + + if (game.settings.get("foundryvtt-reve-de-dragon", "appliquer-famine-soif").includes('soif') && eauConsomme < sustNeeded) { + const perte = eauConsomme < Math.min(0.5, sustNeeded) ? 12 : (eauConsomme <= (sustNeeded / 2) ? 6 : 3); + message.content += `
Vous n'avez bu que ${eauConsomme} doses de liquide pour une soif de ${sustNeeded}, vous avez soif! + La soif devrait vous faire ${perte} points d'endurance non récupérables, notez le cumul de côté et ajustez l'endurance`; + } + await this.updateCompteurValue('sust', 0); + await this.updateCompteurValue('eau', 0); + } + /* -------------------------------------------- */ async combattreReveDeDragon(force) { let rollData = { @@ -1526,7 +1548,7 @@ export class RdDActor extends Actor { ? "vous êtes libre de continuer à boire ou pas." : "vous avez une envie irrépréssible de reprendre un verre."); - msgText += `Vous avez échoué à votre jet d'éthylisme, vous êtes + msgText += `Vous avez échoué à votre jet d'éthylisme, vous êtes maintenant ${RdDUtility.getNomEthylisme(ajustementEthylique)} (${ajustementEthylique}).
${RdDResolutionTable.explain(rollVolonte)}
Qui a bu boira : ${quiABuBoira}`; @@ -1561,6 +1583,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 manger(sust) { + if (sust > 0) { + await this.updateCompteurValue('sust', Misc.templateData(this).compteurs.sust.value + sust); + } + } + + async boire(eau) { + if (eau > 0) { + await this.actor.updateCompteurValue('eau', Misc.templateData(this).eau.value + this.consommerData.data.desaltere); + } + } + + async alcool(forceAlcool) { + const actorTplData = Misc.templateData(this); + const etatGeneral = this.getEtatGeneral({ ethylisme: true }); + const nbDoses = -Number(actorTplData.compteurs.ethylisme.nb_doses || 0); + let rollData = { + vieValue: actorTplData.sante.vie.value, + forceAlcool: forceAlcool, + etat: etatGeneral, + diffNbDoses: nbDoses, + finalLevel: nbDoses + forceAlcool + etatGeneral, + diffConditions: 0, + }; + await this.performEthylisme(rollData); + } + + async apprecierCuisine(consommerData) { + const cuisine = Misc.data(this.getCompetence('cuisine')); + const qualite = consommerData.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" }); + if (rolled.isSuccess) { + await this.jetDeMoral('heureux'); + } + } + } + + async surmonterExotisme(consommerData) { + const qualite = consommerData.data.qualite; + if (qualite < 0) { + const rolled = await this.rollCaracCompetence('volonte', 'cuisine', qualite, { title: "tente de surmonter l'exotisme" }); + if (rolled.isEchec) { + if (!consommerData.data.seForcer) { + return false; + } + await this.actor.jetDeMoral('malheureux'); + } + } + return true; + } + + async jetGoutCuisine() { + console.info('Jet de Gout/Cuisine'); + return true; + } + /* -------------------------------------------- */ async transformerStress() { const actorData = Misc.data(this); @@ -1974,7 +2060,7 @@ export class RdDActor extends Actor { RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-general.html'); } - async rollCaracCompetence(caracName, compName, diff) { + async rollCaracCompetence(caracName, compName, diff, options = { title: "" }) { const carac = this.getCaracByName(caracName); if (!carac) { ui.notifications.warn(`${this.name} n'a pas de caractéristique correspondant à ${caracName}`) @@ -1993,11 +2079,12 @@ export class RdDActor extends Actor { finalLevel: (competence?.data.niveau ?? 0) + diff, diffLibre: diff, showDice: true, - show: { title: "Jets multiples" } + show: { title: options?.title ?? '' } }; await RdDResolutionTable.rollData(rollData); this.appliquerExperience(rollData); RdDResolutionTable.displayRollData(rollData, this) + return rollData.rolled; } /* -------------------------------------------- */ @@ -3090,7 +3177,7 @@ export class RdDActor extends Actor { return guerisonData; } - /* -------------------------------------------- */ + /* -------------------------------------------- */ async consommerPotionSoin(potionData) { potionData.alias = this.name; diff --git a/module/dialog-consommer.js b/module/dialog-consommer.js new file mode 100644 index 00000000..f49c5d1c --- /dev/null +++ b/module/dialog-consommer.js @@ -0,0 +1,124 @@ +import { Grammar } from "./grammar.js"; +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; + } + + let conf = { + title: consommerData.title, + content: await renderTemplate(dialogConfig.html, consommerData), + 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(); + } + } + }; + + super(conf, options); + + this.actor = actor; + this.consommerData = consommerData; + } + + 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(".consommer-doses").change(event => { + this.u + }); + } + + /* -------------------------------------------- */ + 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/rdd-main.js b/module/rdd-main.js index 0160bd67..822b9b4b 100644 --- a/module/rdd-main.js +++ b/module/rdd-main.js @@ -117,6 +117,20 @@ Hooks.once("init", async function () { default: true, type: Boolean }); + /* -------------------------------------------- */ + game.settings.register("foundryvtt-reve-de-dragon", "appliquer-famine-soif", { + name: "Notifier de la famine et la soif pour", + hint: "Indique si les cas de famine et de soif seront indiqués durant Château Dormant", + scope: "world", + config: true, + type: String, + choices: { + "aucun": "ni la famine, ni la soif", + "famine": "seulement la famine", + "famine-soif": "la famine et la soif", + }, + default: "aucun" + }); /* -------------------------------------------- */ // Set an initiative formula for the system diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index c60404da..fe460e2a 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -1,5 +1,3 @@ -{{log 'calc' calc}} -
{{!-- Sheet Header --}} @@ -765,6 +763,9 @@ {{#if item.data.equipe}}{{else}}{{/if}} + {{#if (and (eq item.type 'nourritureboisson') item.data.quantite)}} + Consommer + {{/if}} {{/if}} diff --git a/templates/dialog-consommer-nourriture.html b/templates/dialog-consommer-nourriture.html new file mode 100644 index 00000000..58d50d98 --- /dev/null +++ b/templates/dialog-consommer-nourriture.html @@ -0,0 +1,39 @@ + +
+ + +
+
+ {{#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