From 803b340ad0b349b6aded263b8f67df6543f2a78b Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Tue, 17 Nov 2020 00:40:52 +0100 Subject: [PATCH 1/6] =?UTF-8?q?Fix=20alignement=20dans=20Haut=20r=C3=AAve?= =?UTF-8?q?=20+=20lien=20inutile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- templates/actor-sheet.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index 575dcc7c..956a06d9 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -400,11 +400,11 @@
  1. - Points de Rêve actuels : + Points de Rêve actuels :
  2. - Seuil de Rêve : + Seuil de Rêve :
  3. {{#if data.isGM}} From fbe70e42ea2d7a77d396729e67a9e6ed3841e971 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Tue, 17 Nov 2020 11:35:05 +0100 Subject: [PATCH 2/6] Correction async pas utiles --- module/actor.js | 64 ++++++++++++++++++---------------- module/rdd-dice.js | 11 +++--- module/rdd-main.js | 18 +++++++--- module/rdd-resolution-table.js | 13 ++++--- module/rdd-tmr-dialog.js | 3 +- module/tmr-utility.js | 16 +++++---- 6 files changed, 69 insertions(+), 56 deletions(-) diff --git a/module/actor.js b/module/actor.js index 38c3b200..33c61970 100644 --- a/module/actor.js +++ b/module/actor.js @@ -122,7 +122,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async performRoll(rollData) { - let rolled = await RdDResolutionTable.roll(rollData.carac, rollData.finalLevel, true); + let rolled = RdDResolutionTable.roll(rollData.carac, rollData.finalLevel); //rolled.isPart = true; // Pour tester le particulières rollData.rolled = rolled; // garder le résultat console.log("performRoll", rollData, rolled) @@ -363,24 +363,23 @@ export class RdDActor extends Actor { ChatMessage.create( message ); } - async combattreReveDeDragon(force){ + combattreReveDeDragon(force){ let draconic = this.getBestDraconic(); let niveau = Math.max(0, draconic.data.niveau); let etat = this.data.data.compteurs.etat.value; let difficulte = niveau - etat - force; let reveActuel = this.getReveActuel(); - let roll = await RdDResolutionTable.roll(reveActuel, difficulte); - let message = "" - const resultatRdD = await this.appliquerReveDeDragon(roll, force); - return resultatRdD; + let rolled = RdDResolutionTable.roll(reveActuel, difficulte); + consome.log("combattreReveDeDragon", rolled ); + return this.appliquerReveDeDragon(rolled, force); } - async appliquerReveDeDragon(roll, force) { + appliquerReveDeDragon(roll, force) { let message = ""; if (roll.isSuccess) { message += "
    Vous gagnez " + force + " points de Rêve"; this.updatePointDeSeuil(); - await this.updatePointsDeReve(force); + this.updatePointsDeReve(force); } if (roll.isPart) { // TODO: Dialog pour choix entre HR opu général? @@ -716,9 +715,9 @@ export class RdDActor extends Actor { if ( data.value < 0 ) data.value = 0; if (name == "endurance" && this.data.type != 'entite' ) { - if ( sante.fatigue && inc < 0 ) // Each endurance lost -> fatigue lost + if ( sante.fatigue && inc < 0 ) { // Each endurance lost -> fatigue lost sante.fatigue.value = sante.fatigue.value - inc - + } // If endurance is 0 -> -1 vie if ( data.value == 0 && sante.vie.value > 0) { sante.vie.value = sante.vie.value - 1; @@ -829,9 +828,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async stressTest() { - let target = RdDResolutionTable.computeChances(this.data.data.carac.reve.value, 0); - let stressRoll = this._stressRoll(target); - + let stressRoll = this._stressRoll(); let compteurs = duplicate(this.data.data.compteurs); let convertion = Math.floor(compteurs.stress.value * stressRoll.factor); @@ -839,31 +836,36 @@ export class RdDActor extends Actor { compteurs.stress.value = Math.max(compteurs.stress.value - convertion - 1, 0); ChatMessage.create({ - title: "Jet de Stress", content: "Vous avez transformé " + convertion + " points de Stress en Expérience avec une réussite " + stressRoll.comment, + title: "Jet de Stress", content: "Vous avez transformé " + convertion + " points de Stress en Expérience" + stressRoll.comment, whisper: ChatMessage.getWhisperRecipients(game.user.name) }); await this.update({ "data.compteurs": compteurs }); } /* -------------------------------------------- */ - async _stressRoll(target) { - let result = await RdDResolutionTable.rollChances(target) - switch (result.quality) { - case "sign": return { factor: 0.75, comment: "Significative (75%) - " + result.roll } - case "norm": return { factor: 0.5, comment: "Normale (50%) - " + result.roll } - case "echec": return { factor: 0.2, comment: "Echec (20%) - " + result.roll } - case "epart": return { factor: 0.1, comment: "Echec particulier(10%) - " + result.roll } - case "etotal": return { factor: 0, comment: "Echec Total (0%) - " + result.roll } - } - let second = await RdDResolutionTable.rollChances(target) - switch (second.quality) { - case "part": case "sign": - return { factor: 1.5, comment: "Double Particulière (150%) - " + result.roll + " puis " + second.roll } - default: - return { factor: 1, comment: "Particulière (100%) - " + result.roll + " puis " + second.roll } - } +_stressRoll() { + let result = RdDResolutionTable.roll(this.data.data.carac.reve.value, 0); + console.log("_stressRoll", result); + switch (result.code) { + case "sign": return { factor: 0.75, comment: " (75%): " + result.quality + " - " + result.roll + " sur " + result.score + "%" } + case "norm": return { factor: 0.5, comment: " (50%): " + result.quality + " - " + result.roll + " sur " + result.score + "%" } + case "echec": return { factor: 0.2, comment: " (20%): " + result.quality + " - " + result.roll + " sur " + result.score + "%" } + case "epart": return { factor: 0.1, comment: " (10%): " + result.quality + " - " + result.roll + " sur " + result.score + "%" } + case "etotal": return { factor: 0, comment: " (0%): " + result.quality + " - " + result.roll + " sur " + result.score + "%" } + case "part": + { + let second = RdDResolutionTable.roll(this.data.data.carac.reve.value, 0); + console.log("_stressRoll", second); + switch (second.code) { + case "part": case "sign": + return { factor: 1.5, comment: " (150%): Double Particulière - " + result.roll + " puis " + second.roll + " sur " + result.score + "%" } + default: + return { factor: 1, comment: " (150%): " + result.quality + " - " + result.roll + " puis " + second.roll + " sur " + result.score + "%" } + } + } } - +} + /* -------------------------------------------- */ async rollUnSort(coord) { let draconicList = this.getDraconicList(); diff --git a/module/rdd-dice.js b/module/rdd-dice.js index 873fab56..e2524185 100644 --- a/module/rdd-dice.js +++ b/module/rdd-dice.js @@ -1,13 +1,16 @@ export class RdDDice { - static async deDraconique() { + static deDraconique(rollMode="selfroll") { let roll = new Roll("1d8x8").evaluate(); - await this.show(roll); + this.show(roll, rollMode); return roll.total - Math.ceil(roll.total / 8); } - static async show(roll, rollMode = "roll") { - await this.showDiceSoNice(roll, rollMode); + + static show(roll, rollMode = "roll") { + if (roll.showDice || game.settings.get("foundryvtt-reve-de-dragon", "dice-so-nice") == true) { + this.showDiceSoNice(roll, rollMode); + } return roll; } diff --git a/module/rdd-main.js b/module/rdd-main.js index 6e9e6cf5..e58281ce 100644 --- a/module/rdd-main.js +++ b/module/rdd-main.js @@ -103,11 +103,19 @@ Hooks.once("init", async function() { rollDataHandler: {} } // Create specific settings - game.settings.register("foundryvtt-reve-de-dragon", "configuration", { - name: "configuration", - scope: "world", - config: false, - type: Object + // game.settings.register("foundryvtt-reve-de-dragon", "configuration", { + // name: "configuration", + // scope: "world", + // config: false, + // type: Object + // }); + game.settings.register("foundryvtt-reve-de-dragon", "dice-so-nice", { + name: "Montrer les dés pour toutes les jets", + hint: "Utilise Dice So Nice pour tous les jets de dés possibles. Décocher pour limiter à la table de résolution", + scope: "client", + config: true, + default: false, + type: Boolean }); //game.settings.get("","") to retrieve it and game.settings.set("","", ) diff --git a/module/rdd-resolution-table.js b/module/rdd-resolution-table.js index 14d68645..3ea5d350 100644 --- a/module/rdd-resolution-table.js +++ b/module/rdd-resolution-table.js @@ -85,21 +85,20 @@ export class RdDResolutionTable { } /* -------------------------------------------- */ - static async roll(carac, finalLevel, showDice=false) { + static roll(carac, finalLevel) { let chances = this.computeChances(carac, finalLevel); - chances.showDice = showDice; - let rolled = await this.rollChances(chances); + chances.showDice = true; + let rolled = this.rollChances(chances); rolled.carac = carac; rolled.finalLevel = finalLevel; return rolled; } /* -------------------------------------------- */ - static async rollChances(chances) { + static rollChances(chances) { let myRoll = new Roll("d100").roll(); - if (chances.showDice) { - await RdDDice.showDiceSoNice(myRoll); - } + myRoll.showDice = chances.showDice; + RdDDice.show(myRoll); chances.roll = myRoll.total; mergeObject(chances, this._computeReussite(chances, chances.roll)); return chances; diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index 36df713a..46b77267 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -137,9 +137,8 @@ export class RdDTMRDialog extends Dialog { } this.currentRencontre = undefined; let rencontre = this.rencontresExistantes.find(prev => prev.coord == coordTMR); - let deRencontre = new Roll("d7").roll(); - console.log("manageRencontre", deRencontre, rencontre); if (rencontre == undefined) { + let deRencontre = new Roll("d7").roll(); if (deRencontre.total == 7) { rencontre = await TMRUtility.rencontreTMRRoll(coordTMR, cellDescr); } diff --git a/module/tmr-utility.js b/module/tmr-utility.js index c1099357..8f297aaf 100644 --- a/module/tmr-utility.js +++ b/module/tmr-utility.js @@ -271,7 +271,7 @@ export class TMRUtility { let rencontre = this.rencontreTMRTypeCase(cellDescr.type); if (rencontre){ rencontre = duplicate(rencontre); - rencontre.force = await this.evaluerForceRencontre(rencontre); + rencontre.force = this.evaluerForceRencontre(rencontre); rencontre.coord = coordTMR; } return rencontre; @@ -280,13 +280,15 @@ export class TMRUtility { static rencontreTMRTypeCase(typeTMR, roll=undefined) { if (!roll) { - roll = new Roll("d100").roll().total; + roll = RdDDice.show(new Roll("d100").evaluate()).total; + console.log("rencontreTMRTypeCase", roll); } typeTMR = typeTMR.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, ""); for( let rencontre of rencontresTable) { let scoreDef = rencontre.data[typeTMR]; let min = scoreDef.substr(0,2); let max = scoreDef.substr(3,2); + if (min=="00") min = 101; if (max=="00") max = 100; if (roll >= min && roll <= max) { return rencontre; @@ -300,7 +302,7 @@ export class TMRUtility { * @param {*} caseName * @param {*} roll */ - static async getRencontre( caseName, roll ) { + static getRencontre( caseName, roll ) { if (!roll) { roll = new Roll("1d100").roll().total; } @@ -310,8 +312,8 @@ export class TMRUtility { } let rencontre = this.rencontreTMRTypeCase(caseName, roll); - if (rencontre){ - let force = await this.evaluerForceRencontre(rencontre); + if (rencontre) { + let force = this.evaluerForceRencontre(rencontre); ChatMessage.create({ content: "Rencontre en " + caseName + "(jet : " + roll + "%)
    Vous rencontrez un " + rencontre.name + " d'une force de " + force + " Points de Rêve" }); } return false; @@ -323,9 +325,9 @@ export class TMRUtility { // TODO random get same type } - static async evaluerForceRencontre(rencontre) { + static evaluerForceRencontre(rencontre) { if (this.isReveDeDragon(rencontre)) { - let ddr = await RdDDice.deDraconique(); + let ddr = RdDDice.deDraconique(); return ddr + 7; } else { From d1a4774ce7e79246c633089ac8cabef41fcbadb5 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Tue, 17 Nov 2020 11:36:53 +0100 Subject: [PATCH 3/6] limitations endurance par blessures graves MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit le max est divisé par 2x le nombre de graves (divisé par 1 = pas divisé) --- module/actor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/actor.js b/module/actor.js index 33c61970..5702e4df 100644 --- a/module/actor.js +++ b/module/actor.js @@ -731,7 +731,7 @@ export class RdDActor extends Actor { let blessures = this.data.data.blessures; let nbGraves = this.GetNumberBlessures(blessures.graves.liste); let nbCritiques = this.GetNumberBlessures(blessures.critiques.liste); - let maxEnd = Math.floor( data.max / nbGraves); + let maxEnd = Math.floor( data.max / (2*nbGraves)); if (data.value > maxEnd ) data.value = maxEnd; if ( nbCritiques > 0 && data.value > 1) data.value = 1; From f46bcfd770836e41891a7085b68eeb888ef15fbb Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Tue, 17 Nov 2020 11:37:44 +0100 Subject: [PATCH 4/6] =?UTF-8?q?R=C3=A9duction=20spam?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Message d'accueil seulement envoyé à l'utilisateur se connectant --- module/rdd-main.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/module/rdd-main.js b/module/rdd-main.js index e58281ce..ccf8963d 100644 --- a/module/rdd-main.js +++ b/module/rdd-main.js @@ -175,8 +175,12 @@ Hooks.once("init", async function() { /* Foundry VTT Initialization */ /* -------------------------------------------- */ Hooks.once("ready", function() { - ChatMessage.create( { title: "Bienvenu dans le Rêve !", content : "Bienvenu dans le Rêve des Dragons !
    " + - "Vous trouverez quelques infos pour démarrer dans ce document : @Compendium[foundryvtt-reve-de-dragon.rappel-des-regles.7uGrUHGdPu0EmIu2]{Documentation MJ/Joueurs}" } ); + ChatMessage.create( { + whisper: [game.user], + title: "Bienvenu dans le Rêve !", + content : "Bienvenu dans le Rêve des Dragons !
    " + + "Vous trouverez quelques infos pour démarrer dans ce document : @Compendium[foundryvtt-reve-de-dragon.rappel-des-regles.7uGrUHGdPu0EmIu2]{Documentation MJ/Joueurs}" } + ); /* Affiche le calendrier */ let calendrier = new RdDCalendrier(); From 59be07b3e998b465e1fc05edf4e5c60e12b2019c Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Tue, 17 Nov 2020 11:42:52 +0100 Subject: [PATCH 5/6] Icones pour les actions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * dormir (bougée dans les compteurs/blessures) * monter/regarder dans les TMR --- templates/actor-sheet.html | 109 +++++++++++++++++++++---------------- 1 file changed, 61 insertions(+), 48 deletions(-) diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index 956a06d9..79a52457 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -278,10 +278,13 @@ {{!-- Compteurs/Blessures Tab --}}
    -
    +
    + Dormir une heure +
    +
      {{#each data.compteurs as |compteur key|}} -
    1. +
    2. {{compteur.label}} {{#if compteur.isInput}} @@ -385,57 +388,67 @@ {{!-- hautreve Tab --}}
      - - - - -
      -
        -
      1. - Points de Rêve actuels : - -
      2. -
      3. - Seuil de Rêve : - -
      4. +
        +
          +
        1. + Position en TMR : + {{#if data.isGM}} -
        2. - Position en TMR : - -
        3. -
        4. - Refoulement : - -
        5. + {{else}} -
        6. Position en TMR : {{data.reve.tmrpos.coord}}
        7. -
        8. Refoulement : {{data.reve.refoulement.value}}
        9. + {{data.reve.tmrpos.coord}} {{/if}} -
        -
        -
        - Sorts: -
          - {{#each data.sorts as |mysort key|}} -
        1. - {{mysort.name}} - {{mysort.data.draconic}} / {{mysort.data.difficulte}} -
          - + +
        2. +
        3. + +
          + Montée normale dans les Terres Medianes ! + Montée accélérée dans les Terres Medianes ! + Regarder les Terres Medianes
        4. - {{/each}} -
        -
        +
      5. + Points de Rêve actuels : + +
      6. +
      7. + Seuil de Rêve : + + {{#if data.isGM}} + + {{else}} + {{data.reve.seuil.value}} + {{/if}} + +
      8. +
      9. + Refoulement : + + {{#if data.isGM}} + + {{else}} + {{data.reve.refoulement.value}} + {{/if}} + +
      10. + +
      +
      +
      + Sorts: +
        + {{#each data.sorts as |mysort key|}} +
      1. + {{mysort.name}} + {{mysort.data.draconic}} / {{mysort.data.difficulte}} +
        + +
        +
      2. + {{/each}} +
      +
      {{!-- Equipment Tab --}} From a5ead0c77a1cc53a1d8ded83e527166f103a5eb7 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Tue, 17 Nov 2020 13:08:52 +0100 Subject: [PATCH 6/6] =?UTF-8?q?R=C3=A9cup=C3=A9ration=20de=20fatigue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/actor.js | 91 +++++++++++++++++++++++++---------- module/rdd-utility.js | 108 +++++++++++++++++++++++------------------- module/tmr-utility.js | 1 + 3 files changed, 126 insertions(+), 74 deletions(-) diff --git a/module/actor.js b/module/actor.js index 5702e4df..ca31cda2 100644 --- a/module/actor.js +++ b/module/actor.js @@ -329,38 +329,76 @@ export class RdDActor extends Actor { } async dormir(heures=1) { + let message = { title : "Récupération", content :"Vous dormez " + heures + " heure" + (heures > 1 ? "s": "") }; + this.recupereEndurance(message); for (let i=0; i0) { + message.content += "
      Vous récuperez " + recupere + " points d'endurance"; } } - async recuperationReve() { - const seuil = this.data.data.reve.seuil.value; - const reve = this.getReveActuel(); - console.log("recuperationReve", this.data.data); - let message = { title : "Récupération" } - if (reve > seuil) { - message.content = "Vous avez déjà récupéré suffisament (seuil " + seuil + ", rêve actuel "+reve+")"; - } - else { - let deRecuperation = await RdDDice.deDraconique(); - console.log("recuperationReve", deRecuperation); - if (deRecuperation>=7) - { - // Rêve de Dragon ! - message.content = "Vous faites un Rêve de Dragon de " + deRecuperation + " Points de rêve"; - message.content += await this.combattreReveDeDragon(deRecuperation); - } - else{ - message.content = "Vous récupérez " + deRecuperation + " Points de rêve"; - await this.updatePointsDeReve(deRecuperation); + async recupererFatigueUneHeure(message) { + let fatigue = duplicate(this.data.data.sante.fatigue) + if (fatigue.value == 0) { + message.content += "
      Vous êtes déjà reposé"; + return; + } + const segments = RdDUtility.getSegmentsFatigue(this.data.data.sante.endurance.max); + let cumul = 0; + console.log("recupererFatigue", segments); + + let i; + for (i=0; i <11; i++) { + cumul += segments[i]; + let diff = cumul - fatigue.value ; + if (diff >= 0) + { + const limit2Segments = Math.floor(segments[i] / 2); + if (diff > limit2Segments && i > 0) { + cumul -= segments[i-1]; // le segment est à moins de la moitié, il est récupéré } + cumul -= segments[i]; + break; } - ChatMessage.create( message ); + } + fatigue.value = cumul; + await this.update( {"data.sante.fatigue": fatigue } ); + if (fatigue.value == 0) + { + message.content += "
      Vous êtes bien reposé"; + } + } + + recuperationReve(message) { + const seuil = this.data.data.reve.seuil.value; + const reve = this.getReveActuel(); + if (reve >= seuil) { + message.content += "
      Vous avez suffisament rêvé (seuil " + seuil + ", rêve actuel "+reve+")"; + } + else { + let deRecuperation = RdDDice.deDraconique(); + console.log("recuperationReve", deRecuperation); + if (deRecuperation>=7) + { + // Rêve de Dragon ! + message.content += "
      Vous faites un Rêve de Dragon de " + deRecuperation + " Points de rêve"; + message.content += this.combattreReveDeDragon(deRecuperation); + } + else{ + message.content += "
      Vous récupérez " + deRecuperation + " Points de rêve"; + this.updatePointsDeReve(deRecuperation); + } + } } combattreReveDeDragon(force){ @@ -370,6 +408,7 @@ export class RdDActor extends Actor { let difficulte = niveau - etat - force; let reveActuel = this.getReveActuel(); let rolled = RdDResolutionTable.roll(reveActuel, difficulte); + // TODO: xp particulière consome.log("combattreReveDeDragon", rolled ); return this.appliquerReveDeDragon(rolled, force); } diff --git a/module/rdd-utility.js b/module/rdd-utility.js index d672e908..2195345b 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -27,22 +27,23 @@ const competence_xp_par_niveau = [ 5, 5, 5, 10, 10, 10, 10, 15, 15, 15, 15, 20, const carac_array = [ "taille", "apparence", "constitution", "force", "agilite", "dexterite", "vue", "ouie", "odoratgout", "volonte", "intellect", "empathie", "reve", "chance", "melee", "tir", "lancer", "derobee"]; const difficultesLibres = [0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10]; const ajustementsConditions = [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10]; -const fatigueMatrix = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, // Dummy filler for the array. - [2, 3, 3, 2, 3, 3, 2, 3, 3, 2, 3, 3 ], - [2, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3 ], - [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 ], - [3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 4 ], - [3, 3, 4, 3, 3, 4, 3, 3, 4, 3, 3, 4 ], - [3, 3, 4, 3, 4, 4, 3, 3, 4, 3, 4, 4 ], - [3, 4, 4, 3, 4, 4, 3, 4, 4, 3, 4, 4 ], - [3, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4 ], - [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ], - [4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 5 ], - [4, 4, 5, 4, 4, 5, 4, 4, 5, 4, 4, 5 ], - [4, 4, 5, 4, 5, 5, 4, 4, 5, 4, 5, 5 ], - [4, 5, 5, 4, 5, 5, 4, 5, 5, 4, 5, 5 ], - [4, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5 ], - [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 ] ]; + +function _buildAllSegmentsFatigue(max) { + const cycle = [5, 2, 4, 1, 3, 0]; + let fatigue = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]; + for (let i = 0; i <= 40; i++) { + const ligneFatigue= duplicate(fatigue[i]); + const caseIncrementee = cycle[i % 6]; + ligneFatigue[caseIncrementee]++; + ligneFatigue[caseIncrementee + 6]++; + ligneFatigue.fatigueMax = 2 * (i + 1); + fatigue[i + 1] = ligneFatigue ; + } + return fatigue; +} + +const fatigueMatrix = _buildAllSegmentsFatigue(30); + const fatigueMalus = [ 0, 0, 0, -1, -1, -1, -2, -3, -4, -5, -6, -7 ]; // Provides the malus for each segment of fatigue const fatigueLineSize = [ 3, 6, 7, 8, 9, 10, 11, 12]; const fatigueLineMalus = [ 0, -1, -2, -3, -4, -5, -6, -7 ]; @@ -84,7 +85,6 @@ const definitionsEncaissement = { /* -------------------------------------------- */ export class RdDUtility { - /* -------------------------------------------- */ static async preloadHandlebarsTemplates( ) { const templatePaths = [ @@ -255,12 +255,12 @@ export class RdDUtility { /* -------------------------------------------- */ static computeCarac( data) { - let fmax = parseInt(data.carac.taille.value) + 4; - if ( data.carac.force.value > fmax ) - data.carac.force.value = fmax; + data.carac.force.value = Math.min(data.carac.force.value, parseInt(data.carac.taille.value) + 4); data.carac.derobee.value = Math.floor(parseInt(((21 - data.carac.taille.value)) + parseInt(data.carac.agilite.value)) / 2); let bonusDomKey = Math.floor( (parseInt(data.carac.force.value) + parseInt(data.carac.taille.value)) / 2); + + // TODO: gérer table des bonus dommages (et autres) des créatures data.attributs.plusdom.value = 2 if (bonusDomKey < 8) data.attributs.plusdom.value = -1; @@ -275,15 +275,12 @@ export class RdDUtility { data.carac.lancer.value = Math.floor( (parseInt(data.carac.tir.value) + parseInt(data.carac.force.value)) / 2); data.sante.vie.max = Math.ceil( (parseInt(data.carac.taille.value) + parseInt(data.carac.constitution.value)) /2 ); - if ( data.sante.vie.value > data.sante.vie.max) - data.sante.vie.value = data.sante.vie.max; - let endurance = Math.max( parseInt(data.carac.taille.value) + parseInt(data.carac.constitution.value), parseInt(data.sante.vie.max) + parseInt(data.carac.volonte.value) ); - data.sante.endurance.max = endurance; - if ( data.sante.endurance.value > endurance) - data.sante.endurance.value = endurance; - data.sante.fatigue.max = endurance*2; - if ( data.sante.fatigue.value > data.sante.fatigue.max ) - data.sante.fatigue.value = data.sante.fatigue.max; + + data.sante.vie.value = Math.min(data.sante.vie.value, data.sante.vie.max) + data.sante.endurance.max = Math.max( parseInt(data.carac.taille.value) + parseInt(data.carac.constitution.value), parseInt(data.sante.vie.max) + parseInt(data.carac.volonte.value) ); + data.sante.endurance.value = Math.min(data.sante.endurance.value, data.sante.endurance.max); + data.sante.fatigue.max = data.sante.endurance.max*2; + data.sante.fatigue.value = Math.min(data.sante.fatigue.value, data.sante.fatigue.max); data.attributs.sconst.value = 5; // Max ! if ( data.carac.constitution.value < 9 ) @@ -305,36 +302,52 @@ export class RdDUtility { //data.compteurs.chance.value = data.carac.chance.value; data.compteurs.chance.max = data.carac.chance.value; } - + + static getSegmentsFatigue(endurance) { + endurance = Math.max(endurance, 1); + endurance = Math.min(endurance, fatigueMatrix.length); + return fatigueMatrix[endurance]; + } + + static cumulSegments(segments) { + let cumuls = [segments[0]]; + for (let i = 1; i < 12; i++) { + cumuls[i] = segments[i] + cumuls[i - 1]; + } + return cumuls; + } + /* -------------------------------------------- */ // Build the nice (?) html table used to manage fatigue. - // max should Mbe the endurance max value - static makeHTMLfatigueMatrix( value, max ) - { - max = (max < 16) ? 16 : max; - max = (max > 30) ? 30 : max; - value = (value > max*2) ? max*2 : value; - value = (value < 0) ? 0 : value; - - let fatigueTab = fatigueMatrix[max]; + // max should be the endurance max value + static makeHTMLfatigueMatrix( fatigue, maxEndurance) { + let segments = this.getSegmentsFatigue(maxEndurance); + return this.makeHTMLfatigueMatrixForSegment(fatigue, segments); + } - let table = $("").addClass('table-fatigue'); + static makeHTMLfatigueMatrixForSegment(fatigue, segments) { + fatigue = Math.max(fatigue, 0); + fatigue = Math.min(fatigue, segments.fatigueMax); + + let table = $("
      ").addClass('table-fatigue'); let segmentIdx = 0; let fatigueCount = 0; - for (var line=0; line < fatigueLineSize.length; line++) { + for (var line = 0; line < fatigueLineSize.length; line++) { let row = $(""); let segmentsPerLine = fatigueLineSize[line]; row.append(""); while (segmentIdx < segmentsPerLine) { - let freeSize = fatigueTab[segmentIdx]; - for (let col=0; col <5; col++) { - if ( col < freeSize ) { - if (fatigueCount < value ) + let freeSize = segments[segmentIdx]; + for (let col = 0; col < 5; col++) { + if (col < freeSize) { + if (fatigueCount < fatigue) row.append("
      " + fatigueLineMalus[line] + ""); + + else row.append(""); fatigueCount++; - } else { + } else { row.append(""); } } @@ -343,10 +356,9 @@ export class RdDUtility { } table.append(row); } - //console.log("fatigue", table); return table; } - + /* -------------------------------------------- */ static getLocalisation( ) { diff --git a/module/tmr-utility.js b/module/tmr-utility.js index 8f297aaf..996eb272 100644 --- a/module/tmr-utility.js +++ b/module/tmr-utility.js @@ -373,6 +373,7 @@ export class TMRUtility { msg += "Ce Tourbillon Noir disparait !" } else if (rencontre.name == "Rêve de Dragon") { + // TODO: xp particulière msg += "Vous maîtrisez le Rêve de Dragon !" msg += actor.appliquerReveDeDragon(rolled, rencontre.force); }