diff --git a/module/actor-sheet.js b/module/actor-sheet.js index 2659db9d..2cf90ea1 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -11,6 +11,7 @@ import { RdDBonus } from "./rdd-bonus.js"; import { Misc } from "./misc.js"; import { RdDCombatManager } from "./rdd-combat.js"; import { RdDCarac } from "./rdd-carac.js"; +import { RdDItem } from "./item.js"; /* -------------------------------------------- */ export class RdDActorSheet extends ActorSheet { @@ -183,7 +184,7 @@ export class RdDActorSheet extends ActorSheet { /* -------------------------------------------- */ async selectObjetType() { - let typeObjets = ["objet", "arme", "armure", "conteneur", "herbe", "ingredient", "livre", "potion", "munition", "monnaie"]; + let typeObjets = RdDItem.getTypeObjetsEquipement(); let options = `Selectionnez le type d'équipement`; for (let typeName of typeOeuvres) { options += `` @@ -256,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); @@ -545,7 +552,7 @@ export class RdDActorSheet extends ActorSheet { this.render(true); }); html.find('#ethylisme-test').click((event) => { - this.actor.ethylismeTest(); + this.actor.jetEthylisme(); this.render(true); }); diff --git a/module/actor.js b/module/actor.js index 3b85a032..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"; /* -------------------------------------------- */ @@ -227,8 +228,14 @@ export class RdDActor extends Actor { return Misc.toInt(Misc.templateData(this).attributs.protection.value); } /* -------------------------------------------- */ - getEtatGeneral() { - return Misc.toInt(Misc.templateData(this).compteurs.etat?.value); + getEtatGeneral(options = { ethylisme: false }) { + const tplData = Misc.templateData(this); + let etatGeneral = Misc.toInt(tplData.compteurs.etat?.value); + if (options.ethylisme) { + // Pour les jets d'Ethylisme, on ignore le degré d'éthylisme (p.162) + etatGeneral -= Math.min(0, tplData.compteurs.ethylisme.value); + } + return etatGeneral; } getMalusArmure() { return Misc.toInt(Misc.templateData(this).attributs?.malusarmure?.value); @@ -240,7 +247,7 @@ export class RdDActor extends Actor { return Math.floor(Misc.templateData(this).prixTotalEquipement ?? 0); } getSurenc() { - return Misc.toInt(Misc.templateData(this).compteurs.surenc?.value); + return Misc.templateData(this).compteurs.surenc?.value ?? 0; } /* -------------------------------------------- */ getCompetence(name) { @@ -349,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); } @@ -591,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 = { @@ -956,8 +984,9 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ detectSurEncombrement() { - return Math.max(0, Math.ceil(Number(this.data.encTotal) - this.getEncombrementMax())); + return Math.max(0, Math.ceil(Number(this.encTotal) - this.getEncombrementMax())); } + getEncombrementMax() { return (this.data.type == 'vehicule') ? Misc.templateData(this).capacite_encombrement @@ -980,17 +1009,11 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ computeEncombrement() { - Misc.templateData(this).encTotal = this.filterItemsData(it => it.data.encombrement) - .map(it => this._calcEncItem(it)) + const tplData = Misc.templateData(this); + tplData.encTotal = this.filterItemsData(it => it.data.encombrement != undefined) + .map(it => it.data.encTotal) .reduce(Misc.sum(), 0); - return Misc.templateData(this).encTotal; - } - - _calcEncItem(it) { - it.data.encombrement = Number(it.data.encombrement ?? 0); - it.data.quantite = Math.min(1, Number(it.data.quantite ?? 1)); - it.data.encTotal = it.data.encombrement * it.data.quantite; - return it.data.encTotal; + return tplData.encTotal; } /* -------------------------------------------- */ @@ -1007,17 +1030,12 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ computePrixTotalEquipement() { - let prixTotalEquipement = 0; - - // prix total de l'équipement est la somme du cout de chaque équipement multiplié par sa quantité. - for (const itemData of this.filterItemsData(it => it?.data.cout)) { - const cout = Math.min(Number(itemData.data.cout ?? 0), 0); - const quantite = Math.min(Number(itemData.data?.quantite ?? 1), 1); - prixTotalEquipement += cout * quantite; - } + const tplData = Misc.templateData(this); + tplData.prixTotalEquipement = this.filterItemsData(it => it.data.prixTotal) + .map(it => it.data.prixTotal ?? 0) + .reduce(Misc.sum(), 0); // Mise à jour valeur totale de l'équipement - Misc.templateData(this).prixTotalEquipement = prixTotalEquipement; - return prixTotalEquipement; + return tplData.prixTotalEquipement; } /* -------------------------------------------- */ @@ -1068,7 +1086,7 @@ export class RdDActor extends Actor { state += Math.min(0, (actorData.data.compteurs.ethylisme?.value ?? 0)); actorData.data.compteurs.etat.value = state; - if (actorData.data.compteurs && actorData.data.compteurs.surenc) { + if (actorData.data.compteurs?.surenc) { actorData.data.compteurs.surenc.value = - this.detectSurEncombrement(); } } @@ -1471,8 +1489,8 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ _calculAjustementMoral(succes, moral, situation) { switch (situation) { - case 'heureuse': return succes ? 1 : 0; - case 'malheureuse': return succes ? 0 : -1; + case 'heureux': case 'heureuse': return succes ? 1 : 0; + case 'malheureuse': case 'malheureux': return succes ? 0 : -1; case 'neutre': if (succes && moral <= 0) return 1; if (!succes && moral > 0) return -1; @@ -1492,19 +1510,18 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ - async ethylismeTest() { + async jetEthylisme(forceAlcool = 0) { const actorData = Misc.data(this); let rollData = { vieValue: actorData.data.sante.vie.value, - etat: this.getEtatGeneral() - Math.min(0, actorData.data.compteurs.ethylisme.value), // Pour les jets d'Ethylisme, on ignore le degré d'éthylisme (p.162) + forceAlcool: forceAlcool, + etat: this.getEtatGeneral({ ethylisme: true }), diffNbDoses: -Number(actorData.data.compteurs.ethylisme.nb_doses || 0), finalLevel: 0, - diffConditions: 0, - ajustementsConditions: CONFIG.RDD.ajustementsConditions, - forceAlcool: 0 + diffConditions: 0 } let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-roll-ethylisme.html', rollData); - new RdDRollDialogEthylisme(html, rollData, this).render(true); + new RdDRollDialogEthylisme(html, rollData, this, r => this.performEthylisme(r)).render(true); } /* -------------------------------------------- */ @@ -1531,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}`; @@ -1566,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); @@ -1979,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}`) @@ -1998,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; } /* -------------------------------------------- */ @@ -3095,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/item-sheet.js b/module/item-sheet.js index 4e49b82c..90b188e6 100644 --- a/module/item-sheet.js +++ b/module/item-sheet.js @@ -1,6 +1,6 @@ import { RdDItemSort } from "./item-sort.js"; import { RdDUtility } from "./rdd-utility.js"; -import { RdDItem } from "./item-rdd.js"; +import { RdDItem } from "./item.js"; import { RdDAlchimie } from "./rdd-alchimie.js"; import { RdDItemCompetence } from "./item-competence.js"; import { RdDHerbes } from "./rdd-herbes.js"; diff --git a/module/item-rdd.js b/module/item.js similarity index 84% rename from module/item-rdd.js rename to module/item.js index cb86ecaa..5bf3e624 100644 --- a/module/item-rdd.js +++ b/module/item.js @@ -1,9 +1,32 @@ import { Misc } from "./misc.js"; import { RdDUtility } from "./rdd-utility.js"; +const typesObjetsEquipement = ["objet", "arme", "armure", "conteneur", "herbe", "ingredient", "livre", "potion", "munition", "nourritureboisson"]; +const typesObjetsOeuvres = ["oeuvre", "recettecuisine", "musique", "chant", "danse", "jeu"]; /* -------------------------------------------- */ export class RdDItem extends Item { + static getTypeObjetsEquipement() { + return typesObjetsEquipement; + } + static getTypesOeuvres() { + return typesObjetsOeuvres; + } + prepareDerivedData() { + super.prepareDerivedData(); + const itemData = this.data; + const tplData = itemData.data; + if (RdDItem.getTypeObjetsEquipement().includes(itemData.type)) { + const quantite = itemData.type == 'conteneur' ? 1 : (tplData.quantite ?? 0); + if (tplData.encombrement != undefined) { + tplData.encTotal = Math.max(tplData.encombrement, 0) * quantite; + } + if (tplData.cout != undefined) { + tplData.prixTotal = Math.max(tplData.cout, 0) * quantite; + } + } + } + /* -------------------------------------------- */ async postItem() { console.log(this); @@ -17,13 +40,13 @@ export class RdDItem extends Item { chatData.data.cout_deniers = 0; let dialogResult = [-1, -1]; // dialogResult[0] = quantité, dialogResult[1] = prix - if (chatData.hasPrice ) - { + if (chatData.hasPrice) { let sols = chatData.data.cout; chatData.data.cout_deniers = Math.floor(sols * 100); - dialogResult = await new Promise( (resolve, reject) => {new Dialog({ - content : - `

Modifier la quantité?

+ dialogResult = await new Promise((resolve, reject) => { + new Dialog({ + content: + `

Modifier la quantité?

@@ -34,43 +57,40 @@ export class RdDItem extends Item {
`, - title : "Quantité & Prix", - buttons : { - post : { - label : "Soumettre", + title: "Quantité & Prix", + buttons: { + post: { + label: "Soumettre", callback: (dlg) => { - resolve( [ dlg.find('[name="quantity"]').val(), dlg.find('[name="price"]').val() ] ) + resolve([dlg.find('[name="quantity"]').val(), dlg.find('[name="price"]').val()]) } }, } }).render(true) }) - } - - if (dialogResult[0] > 0) - { - if (this.isOwned) - { + } + + if (dialogResult[0] > 0) { + if (this.isOwned) { if (itemData.data.quantite == 0) dialogResult[0] = -1 - else if (itemData.data.quantite < dialogResult[0]) - { + else if (itemData.data.quantite < dialogResult[0]) { dialogResult[0] = itemData.data.quantite; - ui.notifications.notify(`Impossible de poster plus que ce que vous avez. La quantité à été réduite à ${dialogResult[0]}.`) - this.update({"data.quantite" : 0}) + ui.notifications.notify(`Impossible de poster plus que ce que vous avez. La quantité à été réduite à ${dialogResult[0]}.`) + this.update({ "data.quantite": 0 }) } else { - ui.notifications.notify(`Quantité réduite par ${dialogResult[0]}.`) - this.update({"data.quantite" : itemData.data.quantite - dialogResult[0]}) + ui.notifications.notify(`Quantité réduite par ${dialogResult[0]}.`) + this.update({ "data.quantite": itemData.data.quantite - dialogResult[0] }) } } } - - if ( chatData.hasPrice ) { + + if (chatData.hasPrice) { if (dialogResult[0] > 0) chatData.postQuantity = Number(dialogResult[0]); if (dialogResult[1] > 0) { - chatData.postPrice = dialogResult[1]; + chatData.postPrice = dialogResult[1]; chatData.data.cout_deniers = Math.floor(dialogResult[1] * 100); // Mise à jour cout en deniers } chatData.finalPrice = Number(chatData.postPrice) * Number(chatData.postQuantity); @@ -81,14 +101,14 @@ export class RdDItem extends Item { // Don't post any image for the item (which would leave a large gap) if the default image is used if (chatData.img.includes("/blank.png")) chatData.img = null; - + // JSON object for easy creation chatData.jsondata = JSON.stringify( - { - compendium : "postedItem", - payload: itemData, - }); - + { + compendium: "postedItem", + payload: itemData, + }); + renderTemplate('systems/foundryvtt-reve-de-dragon/templates/post-item.html', chatData).then(html => { let chatOptions = RdDUtility.chatDataSetup(html); ChatMessage.create(chatOptions) diff --git a/module/rdd-compendium-organiser.js b/module/rdd-compendium-organiser.js index 1655b87d..7ee331a6 100644 --- a/module/rdd-compendium-organiser.js +++ b/module/rdd-compendium-organiser.js @@ -14,7 +14,7 @@ const typeDisplayName = { "ombre": "Ombre de Thanatos", "souffle": "Souffle de Dragon", "tete": "Tête de Dragon", - "ingredient": "Ingrédient", + "nourritureboisson": "Nourriture & boisson", "rencontresTMR": "Rencontre des TMR", "competencecreature": "Compétence de créature", "nombreastral": "Nombre astral", diff --git a/module/rdd-main.js b/module/rdd-main.js index 2a2b3f05..822b9b4b 100644 --- a/module/rdd-main.js +++ b/module/rdd-main.js @@ -29,6 +29,7 @@ import { TMRRencontres } from "./tmr-rencontres.js"; import { RdDHotbar } from "./rdd-hotbar-drop.js" import { EffetsDraconiques } from "./tmr/effets-draconiques.js"; import { RdDHerbes } from "./rdd-herbes.js"; +import { RdDItem } from "./item.js"; /* -------------------------------------------- */ /* Foundry VTT Initialization */ @@ -116,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 @@ -134,6 +149,7 @@ Hooks.once("init", async function () { /* -------------------------------------------- */ // Define custom Entity classes CONFIG.Actor.documentClass = RdDActor; + CONFIG.Item.documentClass = RdDItem; CONFIG.RDD = { resolutionTable: RdDResolutionTable.resolutionTable, carac_array: RdDUtility.getCaracArray(), diff --git a/module/rdd-roll-ethylisme.js b/module/rdd-roll-ethylisme.js index 0b4a9eca..6eb77c34 100644 --- a/module/rdd-roll-ethylisme.js +++ b/module/rdd-roll-ethylisme.js @@ -8,34 +8,39 @@ import { Misc } from "./misc.js"; export class RdDRollDialogEthylisme extends Dialog { /* -------------------------------------------- */ - constructor(html, rollData, actor) { - - let myButtons = { - rollButton: { label: "Test d'éthylisme", callback: html => this.actor.performEthylisme(this.rollData) } - }; - + constructor(html, rollData, actor, onRoll) { // Common conf - let dialogConf = { content: html, title: "Test d'éthylisme", buttons: myButtons, default: "rollButton" }; - let dialogOptions = { classes: ["rdddialog"], width: 400, height: 220, 'z-index': 99999 } + let dialogConf = { + title: "Test d'éthylisme", + content: html, + default: "rollButton", + buttons: { "rollButton": { label: "Test d'éthylisme", callback: html => this.onButton(html) } } + }; + let dialogOptions = { classes: ["rdddialog"], width: 400, height: 220, 'z-index': 99999 } super(dialogConf, dialogOptions) - + //console.log("ETH", rollData); + this.onRoll = onRoll; this.rollData = rollData; this.actor = actor; } + async onButton(html) { + this.onRoll(this.rollData); + } + /* -------------------------------------------- */ activateListeners(html) { super.activateListeners(html); - + this.bringToTop(); // Ensure top level // Get the rollData stuff var rollData = this.rollData; function updateRollResult(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(); @@ -47,7 +52,7 @@ export class RdDRollDialogEthylisme extends Dialog { $("#forceAlcool").val(Misc.toInt(rollData.forceAlcool)); updateRollResult(rollData); }); - + // Update ! html.find('#forceAlcool').change((event) => { rollData.forceAlcool = Misc.toInt(event.currentTarget.value); // Update the selected bonus/malus diff --git a/module/rdd-utility.js b/module/rdd-utility.js index 2b552514..4265bb8f 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -129,6 +129,7 @@ export class RdDUtility { 'systems/foundryvtt-reve-de-dragon/templates/item-ombre-sheet.html', 'systems/foundryvtt-reve-de-dragon/templates/item-monnaie-sheet.html', 'systems/foundryvtt-reve-de-dragon/templates/item-meditation-sheet.html', + 'systems/foundryvtt-reve-de-dragon/templates/item-nourritureboisson-sheet.html', 'systems/foundryvtt-reve-de-dragon/templates/competence-carac-defaut.html', 'systems/foundryvtt-reve-de-dragon/templates/competence-base.html', 'systems/foundryvtt-reve-de-dragon/templates/enum-aspect-tarot.html', @@ -248,6 +249,7 @@ export class RdDUtility { formData.tetes = this.checkNull(formData.itemsByType['tete']); formData.taches = this.checkNull(formData.itemsByType['tache']); formData.monnaie = this.checkNull(formData.itemsByType['monnaie']); + formData.nourritureboissons = this.checkNull(formData.itemsByType['nourritureboisson']); formData.meditations = this.checkNull(formData.itemsByType['meditation']); formData.chants = this.checkNull(formData.itemsByType['chant']); formData.danses = this.checkNull(formData.itemsByType['danse']); @@ -263,7 +265,8 @@ export class RdDUtility { .concat(formData.livres) .concat(formData.potions) .concat(formData.herbes) - .concat(formData.ingredients); + .concat(formData.ingredients) + .concat(formData.nourritureboissons); formData.competences = (formData.itemsByType.competence ?? []).concat(formData.itemsByType.competencecreature ?? []); } diff --git a/styles/simple.css b/styles/simple.css index c76e8e8a..1f8d248d 100644 --- a/styles/simple.css +++ b/styles/simple.css @@ -206,7 +206,9 @@ table {border: 1px solid #7a7971;} .flex-shrink { flex: 'flex-shrink' ; } - +.flex-grow { + flex-grow : 3; +} /* Styles limited to foundryvtt-reve-de-dragon sheets */ .foundryvtt-reve-de-dragon .sheet-header { diff --git a/system.json b/system.json index 6de0bc62..e4df8d80 100644 --- a/system.json +++ b/system.json @@ -2,11 +2,11 @@ "name": "foundryvtt-reve-de-dragon", "title": "Rêve de Dragon", "description": "Rêve de Dragon RPG for FoundryVTT", - "version": "1.4.2", + "version": "1.4.3", "manifestPlusVersion": "1.0.0", - "minimumCoreVersion": "0.7.5", - "compatibleCoreVersion": "0.7.9", - "templateVersion": 112, + "minimumCoreVersion": "0.8.0", + "compatibleCoreVersion": "0.8.1", + "templateVersion": 113, "author": "LeRatierBretonnien", "authors": [ { diff --git a/template.json b/template.json index 98fbdca9..6a4da18b 100644 --- a/template.json +++ b/template.json @@ -576,7 +576,7 @@ "Item": { "types": ["objet", "arme", "armure", "conteneur", "competence", "sort", "herbe", "ingredient", "livre", "potion", "munition", "rencontresTMR", "queue", "ombre", "souffle", "tete", "competencecreature", "tarot", "monnaie", "nombreastral", "tache", "meditation", "casetmr", "recettealchimique", - "musique", "chant", "danse", "jeu", "recettecuisine", "maladie", "poison", "oeuvre" ], + "musique", "chant", "danse", "jeu", "recettecuisine", "maladie", "poison", "oeuvre", "nourritureboisson" ], "objet": { "description": "", "quantite": 1, @@ -854,6 +854,18 @@ "remedes": "", "dommages":"", "description": "" + }, + "nourritureboisson": { + "description": "", + "sust": 0, + "boisson": false, + "desaltere": 0, + "alcoolise": false, + "force": 0, + "qualite": 0, + "encombrement": 0, + "quantite": 1, + "cout": 0 } } } diff --git a/templates/actor-inventaire-conteneur.html b/templates/actor-inventaire-conteneur.html index 8de6a09b..628f8bc8 100644 --- a/templates/actor-inventaire-conteneur.html +++ b/templates/actor-inventaire-conteneur.html @@ -2,15 +2,17 @@ {{#if (eq item.type 'conteneur')}} - +{{item.name}} + +{{item.name}} {{else}} - {{item.name}} + {{item.name}} {{/if}} - {{item.data.quantite}} {{numberFormat item.data.encTotal decimals=2}} -
+
+ {{#if (eq item.type 'nourritureboisson')}} + Consommer + {{/if}}
diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index 844b5890..fe460e2a 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -1,5 +1,3 @@ -{{log 'calc' calc}} -
{{!-- Sheet Header --}} @@ -748,23 +746,26 @@