From 4792e3692275d3c067b4d43a4376dc80c29e68be Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sun, 4 Apr 2021 16:32:23 +0200 Subject: [PATCH 1/6] Compatible v0.8.x --- system.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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": [ { From 674582d6e8fb8b20de2340436f50908ed71324bb Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Tue, 6 Apr 2021 23:36:35 +0200 Subject: [PATCH 2/6] Fixes sur calculs enc et prix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ajout de la classe de base RdDItem qui se charge du calcul pour un Item Formatage de la zone d'équipement pour avoir de la place pour le Nom Simplification des calculs de totaux --- module/actor-sheet.js | 5 +- module/actor.js | 36 ++++------ module/item-sheet.js | 2 +- module/{item-rdd.js => item.js} | 82 ++++++++++++++--------- module/rdd-main.js | 2 + styles/simple.css | 4 +- templates/actor-inventaire-conteneur.html | 10 +-- templates/actor-sheet.html | 18 ++--- 8 files changed, 88 insertions(+), 71 deletions(-) rename module/{item-rdd.js => item.js} (84%) diff --git a/module/actor-sheet.js b/module/actor-sheet.js index 2659db9d..72674ea8 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 += `` diff --git a/module/actor.js b/module/actor.js index 3b85a032..93b6e66d 100644 --- a/module/actor.js +++ b/module/actor.js @@ -240,7 +240,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) { @@ -956,8 +956,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 +981,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 +1002,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 +1058,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(); } } 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-main.js b/module/rdd-main.js index 2a2b3f05..0160bd67 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 */ @@ -134,6 +135,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/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/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..c60404da 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -748,23 +748,23 @@
  • - Nom - Q. - Enc. - Equiper/Editer/Suppr. + Nom + Q. + Enc. + Equiper/Editer/Suppr.
  • {{#each objets as |item id|}} {{#unless item.estContenu}} {{#if (ne item.type 'conteneur')}}
  • - {{item.name}} + {{item.name}} {{item.data.quantite}} {{numberFormat item.data.encTotal decimals=2}} - - {{#if item.data.equipe}}{{else}}{{/if}} - - + + {{#if item.data.equipe}}{{else}}{{/if}} + +
  • {{/if}} From e8626f356661ddeb20c5683c0e660f45ab6ce379 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Tue, 6 Apr 2021 23:39:27 +0200 Subject: [PATCH 3/6] =?UTF-8?q?Option=20pour=20=C3=A9tat=20g=C3=A9n=C3=A9r?= =?UTF-8?q?al=20hors=20=C3=A9thylisme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Préparation pour les abus de nourriture et boissons --- module/actor-sheet.js | 2 +- module/actor.js | 25 +++++++++++++++---------- module/rdd-roll-ethylisme.js | 31 ++++++++++++++++++------------- 3 files changed, 34 insertions(+), 24 deletions(-) diff --git a/module/actor-sheet.js b/module/actor-sheet.js index 72674ea8..95a13276 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -546,7 +546,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 93b6e66d..06d8af97 100644 --- a/module/actor.js +++ b/module/actor.js @@ -227,8 +227,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); @@ -1461,8 +1467,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; @@ -1482,19 +1488,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); } /* -------------------------------------------- */ 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 From 8770b29a5e248397c2de49b479b073fe058d3d21 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Tue, 6 Apr 2021 23:43:53 +0200 Subject: [PATCH 4/6] Ajout Item nourritureboisson --- module/rdd-compendium-organiser.js | 2 +- module/rdd-utility.js | 5 +- template.json | 14 ++++- templates/item-nourritureboisson-sheet.html | 64 +++++++++++++++++++++ 4 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 templates/item-nourritureboisson-sheet.html 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-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/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/item-nourritureboisson-sheet.html b/templates/item-nourritureboisson-sheet.html new file mode 100644 index 00000000..ff11e4fd --- /dev/null +++ b/templates/item-nourritureboisson-sheet.html @@ -0,0 +1,64 @@ +
    +
    + +
    +

    +
    +
    + + {{!-- Sheet Body --}} +
    +
    + + +
    +
    + + +
    + {{#if data.boisson}} +
    + + +
    +
    + + +
    + {{#if data.alcoolise}} +
    + + +
    + {{/if}} + {{/if}} +
    + {{#if (lt data.qualite 0)}} + + {{else}} + + {{/if}} + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + +
    + {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} +
    +
    +
    + +
    \ No newline at end of file From 4efa32169355d1f81777810e826d4d5796979ffb Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Tue, 6 Apr 2021 23:44:57 +0200 Subject: [PATCH 5/6] 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 From 35004547dda1d7ad37a533d644e507b9ceeecc4a Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Tue, 6 Apr 2021 23:45:55 +0200 Subject: [PATCH 6/6] dialogs ne sont pas pour un sort --- templates/dialog-roll-alchimie.html | 2 +- templates/dialog-roll-chant.html | 2 +- templates/dialog-roll-ethylisme.html | 2 +- templates/dialog-roll-jeu.html | 2 +- templates/dialog-roll-musique.html | 2 +- templates/dialog-roll-oeuvre.html | 2 +- templates/dialog-roll-recettecuisine.html | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/templates/dialog-roll-alchimie.html b/templates/dialog-roll-alchimie.html index 5062e3ea..325d530c 100644 --- a/templates/dialog-roll-alchimie.html +++ b/templates/dialog-roll-alchimie.html @@ -1,4 +1,4 @@ -
    +
    • diff --git a/templates/dialog-roll-chant.html b/templates/dialog-roll-chant.html index cff88cd8..ad65341b 100644 --- a/templates/dialog-roll-chant.html +++ b/templates/dialog-roll-chant.html @@ -1,4 +1,4 @@ - +
      • diff --git a/templates/dialog-roll-ethylisme.html b/templates/dialog-roll-ethylisme.html index 613d6e0b..172a7f19 100644 --- a/templates/dialog-roll-ethylisme.html +++ b/templates/dialog-roll-ethylisme.html @@ -1,4 +1,4 @@ - +
        diff --git a/templates/dialog-roll-jeu.html b/templates/dialog-roll-jeu.html index c8336994..c67bbcdc 100644 --- a/templates/dialog-roll-jeu.html +++ b/templates/dialog-roll-jeu.html @@ -1,4 +1,4 @@ - +
        • diff --git a/templates/dialog-roll-musique.html b/templates/dialog-roll-musique.html index c54c5552..eeb693ea 100644 --- a/templates/dialog-roll-musique.html +++ b/templates/dialog-roll-musique.html @@ -1,4 +1,4 @@ - +
          • diff --git a/templates/dialog-roll-oeuvre.html b/templates/dialog-roll-oeuvre.html index 1022a0ae..bd776e3e 100644 --- a/templates/dialog-roll-oeuvre.html +++ b/templates/dialog-roll-oeuvre.html @@ -1,4 +1,4 @@ - +
            • diff --git a/templates/dialog-roll-recettecuisine.html b/templates/dialog-roll-recettecuisine.html index 667c8834..c324755a 100644 --- a/templates/dialog-roll-recettecuisine.html +++ b/templates/dialog-roll-recettecuisine.html @@ -1,4 +1,4 @@ - +