From 51a3c4d04aa61d2e1f1eecbcb9cbe168c6cc84bd Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 8 May 2021 20:08:56 +0200 Subject: [PATCH] fatigue optionnelle #113 --- module/actor-sheet.js | 13 ++------- module/actor.js | 46 +++++++++++++++--------------- module/rdd-main.js | 2 +- module/rdd-tmr-dialog.js | 28 ++++++++++++------ module/rdd-utility.js | 32 ++++++++++++++------- module/regles-optionelles.js | 36 ++++++++++++----------- templates/actor-sheet.html | 4 +-- templates/chat-resultat-tache.html | 2 +- templates/dialog-tmr.html | 2 +- templates/regles-optionelles.html | 18 ++++-------- 10 files changed, 97 insertions(+), 86 deletions(-) diff --git a/module/actor-sheet.js b/module/actor-sheet.js index 455b3c98..4e6d70d2 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -13,6 +13,7 @@ import { RdDCombatManager } from "./rdd-combat.js"; import { RdDCarac } from "./rdd-carac.js"; import { RdDItem } from "./item.js"; import { DialogSplitItem } from "./dialog-split-item.js"; +import { ReglesOptionelles } from "./regles-optionelles.js"; /* -------------------------------------------- */ export class RdDActorSheet extends ActorSheet { @@ -68,10 +69,7 @@ export class RdDActorSheet extends ActorSheet { encTotal: await this.actor.computeEncombrementTotalEtMalusArmure(), prixTotalEquipement: this.actor.computePrixTotalEquipement(), surprise: RdDBonus.find(this.actor.getSurprise(false)).descr, - fatigue: { - malus: RdDUtility.calculMalusFatigue(formData.data.sante.fatigue.value, formData.data.sante.endurance.max), - html: "" + RdDUtility.makeHTMLfatigueMatrix(formData.data.sante.fatigue.value, formData.data.sante.endurance.max).html() + "
" - }, + fatigue: RdDUtility.calculFatigueHtml(formData.data.sante.fatigue.value, formData.data.sante.endurance.max), resumeBlessures: this.actor.computeResumeBlessure(formData.data.blessures), }; formData.calc.surEncombrementMessage = (formData.data.compteurs.surenc.value < 0) ? "Sur-Encombrement!" : ""; @@ -99,12 +97,6 @@ export class RdDActorSheet extends ActorSheet { formData.ajustementsConditions = CONFIG.RDD.ajustementsConditions; formData.difficultesLibres = CONFIG.RDD.difficultesLibres; - // low is normal, this the base used to compute the grid. - formData.fatigue = { - malus: RdDUtility.calculMalusFatigue(formData.data.sante.fatigue.value, formData.data.sante.endurance.max), - html: "" + RdDUtility.makeHTMLfatigueMatrix(formData.data.sante.fatigue.value, formData.data.sante.endurance.max).html() + "
" - } - formData.hautreve = { sortsReserve: formData.data.reve.reserve.list, rencontres: duplicate(formData.data.reve.rencontre.list), @@ -211,6 +203,7 @@ export class RdDActorSheet extends ActorSheet { super.activateListeners(html); HtmlUtility._showControlWhen($(".gm-only"), game.user.isGM); + HtmlUtility._showControlWhen($(".appliquerFatigue"), ReglesOptionelles.isUsing("appliquer-fatigue")); html.find('#show-hide-competences').click((event) => { this.options.showCompNiveauBase = !this.options.showCompNiveauBase; diff --git a/module/actor.js b/module/actor.js index 85d5ad2f..49587c5e 100644 --- a/module/actor.js +++ b/module/actor.js @@ -196,10 +196,10 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ getFatigueActuelle() { - if (!this.isPersonnage()) { - return 0; + if (ReglesOptionelles.isUsing("appliquer-fatigue") && this.isPersonnage()) { + return Misc.toInt(Misc.templateData(this).sante.fatigue?.value); } - return Misc.toInt(Misc.templateData(this).sante.fatigue?.value); + return 0; } /* -------------------------------------------- */ getFatigueMax() { @@ -544,7 +544,7 @@ export class RdDActor extends Actor { await this.santeIncDec("vie", actorData.data.sante.vie.max - actorData.data.sante.vie.value); await this.santeIncDec("endurance", actorData.data.sante.endurance.max - actorData.data.sante.endurance.value); - if (actorData.data.sante.fatigue) { + if (ReglesOptionelles.isUsing("appliquer-fatigue") && actorData.data.sante.fatigue) { await this.update({ "data.sante.fatigue.value": 0 }); } } @@ -594,17 +594,18 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async recupererFatigue(message) { - let fatigue = Misc.templateData(this).sante.fatigue.value; - const fatigueMin = this._computeFatigueMin(); - if (fatigue <= fatigueMin) { - message.content += "Vous êtes déjà reposé. "; - return; - } - fatigue = Math.max(fatigueMin, this._calculRecuperationSegment(fatigue)); - console.log("recupererFatigue", fatigue) - await this.update({ "data.sante.fatigue.value": fatigue }); - if (fatigue == 0) { - message.content += "Vous êtes complêtement reposé. "; + if (ReglesOptionelles.isUsing("appliquer-fatigue")) { + let fatigue = Misc.templateData(this).sante.fatigue.value; + const fatigueMin = this._computeFatigueMin(); + if (fatigue <= fatigueMin) { + message.content += "Vous êtes déjà reposé. "; + return; + } + fatigue = Math.max(fatigueMin, this._calculRecuperationSegment(fatigue)); + await this.update({ "data.sante.fatigue.value": fatigue }); + if (fatigue == 0) { + message.content += "Vous êtes complêtement reposé. "; + } } } @@ -1157,8 +1158,7 @@ export class RdDActor extends Actor { } // Pour les autres let state = - (actorData.data.sante.vie.max - actorData.data.sante.vie.value); - if (actorData.data.sante.fatigue) { - // Creatures n'ont pas de fatigue + if (ReglesOptionelles.isUsing("appliquer-fatigue") && actorData.data.sante.fatigue) { state += RdDUtility.currentFatigueMalus(actorData.data.sante.fatigue.value, actorData.data.sante.endurance.max); } // Ajout de l'éthylisme @@ -1471,7 +1471,9 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async santeIncDec(name, inc, options = { isCritique: false, ethylisme: false }) { - + if (name=='fatigue' && !ReglesOptionelles.isUsing("appliquer-fatigue")) { + return; + } const sante = duplicate(Misc.templateData(this).sante); let compteur = sante[name]; if (!compteur) { @@ -1511,7 +1513,7 @@ export class RdDActor extends Actor { compteur.value = result.newValue; //console.log(name, inc, data.value, result.newValue, minValue, data.max); // If endurance lost, then the same amount of fatigue cannot be recovered - if (sante.fatigue && fatigue > 0) { + if (ReglesOptionelles.isUsing("appliquer-fatigue") && sante.fatigue && fatigue > 0) { sante.fatigue.value = Math.max(sante.fatigue.value + fatigue, this._computeFatigueMin()); } await this.update({ "data.sante": sante }); @@ -2342,6 +2344,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async _tacheResult(rollData) { // Mise à jour de la tache + rollData.appliquerFatigue = ReglesOptionelles.isUsing("appliquer-fatigue"); rollData.tache = duplicate(rollData.tache); rollData.tache.data.points_de_tache_courant += rollData.rolled.ptTache; if (rollData.rolled.isETotal) { @@ -2800,10 +2803,7 @@ export class RdDActor extends Actor { const endurance = actorData.data.sante.endurance.max; let tmrFormData = { mode: mode, - fatigue: { - malus: RdDUtility.calculMalusFatigue(fatigue, endurance), - html: "" + RdDUtility.makeHTMLfatigueMatrix(fatigue, endurance).html() + "
" - }, + fatigue: RdDUtility.calculFatigueHtml(fatigue, endurance), draconic: this.getDraconicList(), sort: this.getSortList(), caracReve: actorData.data.carac.reve.value, diff --git a/module/rdd-main.js b/module/rdd-main.js index 5e9cadcc..258436cf 100644 --- a/module/rdd-main.js +++ b/module/rdd-main.js @@ -171,6 +171,7 @@ Hooks.once("init", async function () { CONFIG.Combat.documentClass = RdDCombatManager; // préparation des différents modules + ReglesOptionelles.init(); RdDUtility.init(); RdDDice.init(); RdDCommands.init(); @@ -179,7 +180,6 @@ Hooks.once("init", async function () { RdDTokenHud.init(); RdDActor.init(); RddCompendiumOrganiser.init(); - ReglesOptionelles.init(); EffetsDraconiques.init() TMRUtility.init(); TMRRencontres.init(); diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index bf5b309b..54ca9860 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -10,8 +10,9 @@ import { Poetique } from "./poetique.js"; import { EffetsDraconiques } from "./tmr/effets-draconiques.js"; import { PixiTMR } from "./tmr/pixi-tmr.js"; import { Draconique } from "./tmr/draconique.js"; -import { Grammar } from "./grammar.js"; import { Misc } from "./misc.js"; +import { HtmlUtility } from "./html-utility.js"; +import { ReglesOptionelles } from "./regles-optionelles.js"; /* -------------------------------------------- */ export class RdDTMRDialog extends Dialog { @@ -49,7 +50,7 @@ export class RdDTMRDialog extends Dialog { this.actor = actor; this.actor.tmrApp = this; // reference this app in the actor structure this.viewOnly = tmrData.mode == "visu" - this.fatigueParCase = this.viewOnly ? 0 : this.actor.getTMRFatigue(); + this.fatigueParCase = this.viewOnly || !ReglesOptionelles.isUsing("appliquer-fatigue") ? 0 : this.actor.getTMRFatigue(); this.cumulFatigue = 0; this.loadRencontres(); this.loadSortsReserve(); @@ -177,6 +178,7 @@ export class RdDTMRDialog extends Dialog { async activateListeners(html) { super.activateListeners(html); + HtmlUtility._showControlWhen($(".appliquerFatigue"), ReglesOptionelles.isUsing("appliquer-fatigue")); document.getElementById("tmrrow1").insertCell(0).append(this.pixiApp.view); if (this.viewOnly) { @@ -214,7 +216,9 @@ export class RdDTMRDialog extends Dialog { // Gestion du cout de montée en points de rêve let reveCout = ((this.tmrdata.isRapide && !EffetsDraconiques.isDeplacementAccelere(this.actor)) ? -2 : -1) - this.actor.countMonteeLaborieuse(); - this.cumulFatigue += this.fatigueParCase; + if (ReglesOptionelles.isUsing("appliquer-fatigue")){ + this.cumulFatigue += this.fatigueParCase; + } await this.actor.reveActuelIncDec(reveCout); // Le reste... @@ -245,9 +249,11 @@ export class RdDTMRDialog extends Dialog { let refoulement = document.getElementById("tmr-refoulement-value"); refoulement.innerHTML = actorData.data.reve.refoulement.value; - let fatigueItem = document.getElementById("tmr-fatigue-table"); - //console.log("Refresh : ", actorData.data.sante.fatigue.value); - fatigueItem.innerHTML = "" + RdDUtility.makeHTMLfatigueMatrix(actorData.data.sante.fatigue.value, actorData.data.sante.endurance.max).html() + "
"; + if (ReglesOptionelles.isUsing("appliquer-fatigue")){ + let fatigueItem = document.getElementById("tmr-fatigue-table"); + //console.log("Refresh : ", actorData.data.sante.fatigue.value); + fatigueItem.innerHTML = "" + RdDUtility.makeHTMLfatigueMatrix(actorData.data.sante.fatigue.value, actorData.data.sante.endurance.max).html() + "
"; + } } /* -------------------------------------------- */ @@ -333,7 +339,7 @@ export class RdDTMRDialog extends Dialog { return true; } const resteAvantInconscience = this.actor.getFatigueMax() - this.actor.getFatigueActuelle() - this.cumulFatigue; - if (resteAvantInconscience <= 0) { + if (ReglesOptionelles.isUsing("appliquer-fatigue") && resteAvantInconscience <= 0) { this._tellToGM("Vous vous écroulez de fatigue : vous quittez les Terres médianes !"); this.quitterLesTMRInconscient(); return true; @@ -408,7 +414,9 @@ export class RdDTMRDialog extends Dialog { else if (rencData.rolled.isEchec && rencData.rencontre.isPersistant) { setTimeout(() => { rencData.nbRounds++; - this.cumulFatigue += this.fatigueParCase; + if (ReglesOptionelles.isUsing("appliquer-fatigue")){ + this.cumulFatigue += this.fatigueParCase; + } this._tentativeMaitrise(rencData); this._deleteTmrMessages(rencData.actor, rencData.nbRounds); }, 2000); @@ -916,7 +924,9 @@ export class RdDTMRDialog extends Dialog { await this.actor.updateCoordTMR(tmr.coord); this._updateDemiReve(); - this.cumulFatigue += this.fatigueParCase; + if (ReglesOptionelles.isUsing("appliquer-fatigue")){ + this.cumulFatigue += this.fatigueParCase; + } this.updateValuesDisplay(); game.socket.emit("system.foundryvtt-reve-de-dragon", { msg: "msg_tmr_move", data: { diff --git a/module/rdd-utility.js b/module/rdd-utility.js index 3206e2b1..34b5a4e5 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -6,6 +6,7 @@ import { Misc } from "./misc.js"; import { Grammar } from "./grammar.js"; import { TMRUtility } from "./tmr-utility.js"; import { DialogItemAchat } from "./dialog-item-achat.js"; +import { ReglesOptionelles } from "./regles-optionelles.js"; /* -------------------------------------------- */ // This table starts at 0 -> niveau -10 @@ -388,6 +389,14 @@ export class RdDUtility { } return -7; } + + static calculFatigueHtml(fatigue, endurance) { + return ReglesOptionelles.isUsing("appliquer-fatigue") ? { + malus: RdDUtility.calculMalusFatigue(fatigue, endurance), + html: "" + RdDUtility.makeHTMLfatigueMatrix(fatigue, endurance).html() + "
" + } : { malus:0, html:''}; + } + /* -------------------------------------------- */ // Build the nice (?) html table used to manage fatigue. // max should be the endurance max value @@ -475,18 +484,21 @@ export class RdDUtility { /* -------------------------------------------- */ static currentFatigueMalus(value, max) { - max = Math.max(1, Math.min(max, 60)); - value = Math.min(max * 2, Math.max(0, value)); - - let fatigueTab = fatigueMatrix[max]; - let fatigueRem = value; - for (let idx = 0; idx < fatigueTab.length; idx++) { - fatigueRem -= fatigueTab[idx]; - if (fatigueRem <= 0) { - return fatigueMalus[idx]; + if (ReglesOptionelles.isUsing("appliquer-fatigue")) { + max = Math.max(1, Math.min(max, 60)); + value = Math.min(max * 2, Math.max(0, value)); + + let fatigueTab = fatigueMatrix[max]; + let fatigueRem = value; + for (let idx = 0; idx < fatigueTab.length; idx++) { + fatigueRem -= fatigueTab[idx]; + if (fatigueRem <= 0) { + return fatigueMalus[idx]; + } } + return -7; // This is the max ! } - return -7; // This is the max ! + return 0; } /* -------------------------------------------- */ diff --git a/module/regles-optionelles.js b/module/regles-optionelles.js index e2e16a4e..6b2d1955 100644 --- a/module/regles-optionelles.js +++ b/module/regles-optionelles.js @@ -1,13 +1,15 @@ +import { Misc } from "./misc.js"; const listeReglesOptionelles = [ - { name: 'recul', group: 'combat', descr: "Appliquer le recul en cas de particulière en force ou de charge" }, - { name: 'resistanceArmeParade', group: 'combat', descr: "Faire le jet de résistance des armes lors de parades pouvant les endommager" }, - { name: 'deteriorationArmure', group: 'combat', descr: "Tenir compte de la détérioration des armures" }, - { name: 'defenseurDesarme', group: 'combat', descr: "Le défenseur peut être désarmé en parant une particulière en force ou une charge avec une arme autre qu'un bouclier" }, - { name: 'categorieParade', group: 'combat', descr: "Le défenseur doit obtenir une significative en cas de parade avec des armes de catégories différentes" }, - { name: 'tripleSignificative', group: 'combat', descr: "En cas de demi-surprise, d'attaque particulière en finesse, et de catégories d'armes différentes, le défenseur doit obtenir 1/8 des chances de succès" }, - { name: 'astrologie', group: 'generale', descr: "Appliquer les ajustements astrologiques aux jets de chance et aux rituels", default: true }, - { name: 'afficher-prix-joueurs', group: 'generale', descr: "Afficher le prix de l'équipement des joueurs", default: true } + { name: 'recul', group: 'Règles de combat', descr: "Appliquer le recul en cas de particulière en force ou de charge" }, + { name: 'resistanceArmeParade', group: 'Règles de combat', descr: "Faire le jet de résistance des armes lors de parades pouvant les endommager" }, + { name: 'deteriorationArmure', group: 'Règles de combat', descr: "Tenir compte de la détérioration des armures" }, + { name: 'defenseurDesarme', group: 'Règles de combat', descr: "Le défenseur peut être désarmé en parant une particulière en force ou une charge avec une arme autre qu'un bouclier" }, + { name: 'categorieParade', group: 'Règles de combat', descr: "Le défenseur doit obtenir une significative en cas de parade avec des armes de catégories différentes" }, + { name: 'tripleSignificative', group: 'Règles de combat', descr: "En cas de demi-surprise, d'attaque particulière en finesse, et de catégories d'armes différentes, le défenseur doit obtenir 1/8 des chances de succès" }, + { name: 'astrologie', group: 'Règles de générales', descr: "Appliquer les ajustements astrologiques aux jets de chance et aux rituels", default: true }, + { name: 'afficher-prix-joueurs', group: 'Règles de générales', descr: "Afficher le prix de l'équipement des joueurs", default: true }, + { name: 'appliquer-fatigue', group: 'Règles de générales', descr: "Appliquer les règles de fatigue", default: true }, ]; export class ReglesOptionelles extends FormApplication { @@ -39,25 +41,27 @@ export class ReglesOptionelles extends FormApplication { static get defaultOptions() { const options = super.defaultOptions; mergeObject(options, { - id: "combat-settings", + id: "optional-settings", template: "systems/foundryvtt-reve-de-dragon/templates/regles-optionelles.html", height: 600, width: 350, minimizable: false, closeOnSubmit: true, - title: "Options de combat" + title: "Règles optionnelles" }); return options; } getData() { let formData = super.getData(); - formData.regles = listeReglesOptionelles.map(it => { - let r = duplicate(it); - r.id = ReglesOptionelles._getIdRegle(r.name); - r.active = ReglesOptionelles.isUsing(r.name); - return r; - }) + const regles = listeReglesOptionelles.map(it => { + it = duplicate(it); + it.id = ReglesOptionelles._getIdRegle(it.name); + it.active = ReglesOptionelles.isUsing(it.name); + return it; + }); + formData.regles = regles; + formData.groups = Misc.classify(regles, it => it.group); return formData; } diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index fdcd2367..3fd4cfeb 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -28,7 +28,7 @@
  • -