diff --git a/module/actor.js b/module/actor.js index d28bb0e2..7c1426e5 100644 --- a/module/actor.js +++ b/module/actor.js @@ -1107,68 +1107,6 @@ export class RdDActor extends Actor { await this.update( { 'data.blessures': bList } ); } - /* -------------------------------------------- */ - manageBlessures( blessuresData ) - { - // Fast exit - if ( this.data.type == 'entite') return; // Une entité n'a pas de blessures - if ( blessuresData.legeres + blessuresData.graves + blessuresData.critiques == 0 ) return; - - let workData = duplicate(blessuresData); - let blessures = duplicate(this.data.data.blessures); - // Manage blessures - if ( workData.legeres > 0 ) { - for (let k=0; k 0 ) { - workData.graves += 1; - blessuresData.graves += 1; - } - - if ( workData.graves > 0) { - for (let k=0; k 0 ) { - workData.critiques = 1; - blessuresData.critiques = 1; - workData.from3Graves = true; - } - - if ( workData.critiques > 0 ) { - if ( blessures.critiques.liste[0].active ) { - ChatMessage.create(`${game.user.name} vient de succomber à une seconde blessure critique ! Que les Dragons gardent son Archétype en paix !`); - } else { - if ( workData.from3Graves) { // Si la blessure critique provient d'une quatrième grave - this.santeIncDec("endurance", -this.data.data.sante.endurance.value); // Endurance à 0; - this.santeIncDec("vie", -4); // Vie à -4; - } - blessures.critiques.liste[0].active = true; - blessures.critiques.liste[0].loc = workData.locName; - } - } - - this.update( { "data.blessures": blessures } ); - } - /* -------------------------------------------- */ async jetDeMoral(situation) { let jetMoral = new Roll("1d20").roll(); @@ -2132,28 +2070,24 @@ export class RdDActor extends Actor { } console.log("encaisserDommages", attackerRoll ) - const armure = this.computeArmure( attackerRoll ); - const rollEncaissement = new Roll("2d10 + @dmg - @armure",{ - dmg: attackerRoll.dmg.total, - armure: armure - }).roll(); - RdDDice.show(rollEncaissement); - let result = RdDUtility.computeBlessuresSante(rollEncaissement.total, attackerRoll.dmg.mortalite, attackerRoll.dmg.loc); - result.endurance = Math.max(result.endurance, -Number(this.data.data.sante.endurance.value)); - await this.santeIncDec("vie", result.vie); - await this.santeIncDec("endurance", result.endurance, (result.critiques > 0)); + let encaissement = this.jetEncaissement(attackerRoll); + + this.ajouterBlessure(encaissement); // Will upate the result table + + await this.santeIncDec("vie", encaissement.vie); + await this.santeIncDec("endurance", encaissement.endurance, (encaissement.critiques > 0)); + + const blessureLegere = (encaissement.legeres > 0 ? "une blessure légère" : ""); + const blessureGrave = (encaissement.graves > 0 ? "une blessure grave" : ""); + const blessureCritique = (encaissement.critiques > 0 ? "une blessure critique" : ""); - this.manageBlessures(result); // Will upate the result table - const blessureLegere = (result.legeres > 0 ? "une blessure légère" : ""); - const blessureGrave = (result.graves > 0 ? "une blessure grave" : ""); - const blessureCritique = (result.critiques > 0 ? "une blessure critique" : ""); let commonMsg = { title: "Blessures !", - roll: rollEncaissement , - content: this.data.name + " a encaissé " + blessureLegere + blessureGrave + blessureCritique + roll: encaissement.roll, + content: `${this.data.name} a encaissé ${blessureLegere}${blessureGrave}${blessureCritique} (${encaissement.locName})` } - let addonMsg = "
Et a perdu :
" + result.endurance + " Endurance et " + result.vie + " Points de Vie"; + let addonMsg = "
Et a perdu :
" + encaissement.endurance + " Endurance et " + encaissement.vie + " Points de Vie"; if ( this.hasPlayerOwner ) { commonMsg.content += addonMsg; // Message pour tout le monde ChatMessage.create( commonMsg ); @@ -2169,6 +2103,92 @@ export class RdDActor extends Actor { this.sheet.render(false); } + /* -------------------------------------------- */ + jetEncaissement(rollData) { + + rollData.dmg.loc = rollData.dmg.loc?? RdDUtility.getLocalisation(); + + const roll = new Roll("2d10 + @dmg - @armure", { + dmg: rollData.dmg.total, + armure: this.computeArmure( rollData ) + }).roll(); + RdDDice.show(roll, game.settings.get("core", "rollMode")); + + let encaissement = RdDUtility.selectEncaissement(roll.total, rollData.dmg.mortalite) + let over20 = Math.max(roll.total - 20, 0); + encaissement.roll = roll; + encaissement.vie = - RdDUtility._evaluatePerte(encaissement.vie, over20); + encaissement.endurance = - RdDUtility._evaluatePerte(encaissement.endurance, over20); + encaissement.loc = rollData.dmg.loc; + encaissement.locName = rollData.dmg.loc.label ?? "Corps"; + return encaissement; + } + + /* -------------------------------------------- */ + ajouterBlessure( encaissement ) + { + // Fast exit + if ( this.data.type == 'entite') return; // Une entité n'a pas de blessures + if ( encaissement.legeres + encaissement.graves + encaissement.critiques == 0 ) return; + + const endActuelle = Number(this.data.data.sante.endurance.value); + let blessures = duplicate(this.data.data.blessures); + + let count = encaissement.legeres; + // Manage blessures + while (count > 0) { + let legere = blessures.legeres.liste.find(it => !it.active); + if (legere) { + this._setBlessure(legere, encaissement); + count--; + } + else { + encaissement.graves += count; + encaissement.legeres -= count; + break; + } + } + + count = encaissement.graves; + while (count > 0) { + let grave = blessures.graves.liste.find(it => !it.active); + if (grave) { + this._setBlessure(grave, encaissement); + count--; + } + else{ + encaissement.critiques += count; + encaissement.graves -= count; + encaissement.endurance = -endActuelle; + encaissement.vie = -4; + break; + } + } + + count = encaissement.critique; + while( count > 0 ) { + let critique = blessures.critiques.liste[0]; + if (!critique.active ) { + this._setBlessure(critique, encaissement); + count--; + } else { + // TODO: status effect dead + ChatMessage.create({ content: `${this.name} vient de succomber à une seconde blessure critique ! Que les Dragons gardent son Archétype en paix !`}); + encaissement.critique -= count; + break; + } + } + + encaissement.endurance = Math.max(encaissement.endurance, -endActuelle); + this.update( { "data.blessures": blessures } ); + } + + /* -------------------------------------------- */ + _setBlessure(blessure, encaissement) { + blessure.active = true; + blessure.loc = encaissement.locName; + } + /* -------------------------------------------- */ /** @override */ getRollData() { diff --git a/module/rdd-bonus.js b/module/rdd-bonus.js index e2c5d622..10ecc156 100644 --- a/module/rdd-bonus.js +++ b/module/rdd-bonus.js @@ -18,7 +18,7 @@ export class RdDBonus { return conditionsTactiques.find(e => e.type == condition) || conditionsTactiques.find(e => e.type == 'pret'); } - + static isAjustementAstrologique(rollData) { return RdDCarac.isChance(rollData.selectedCarac) || rollData.selectedSort?.data.isrituel; @@ -27,10 +27,10 @@ export class RdDBonus { static isDefenseAttaqueFinesse(rollData) { return rollData.attackerRoll?.particuliere == 'finesse'; } - + /* -------------------------------------------- */ static dmg(rollData, dmgActor, isCauchemar = false) { - let dmg = { total: 0, loc: RdDUtility.getLocalisation() }; + let dmg = { total: 0 }; if (rollData.arme && rollData.arme.name.toLowerCase() == "esquive") { // Specific case management ui.notifications.warn("Calcul de bonus dégats sur eswquive"); @@ -55,26 +55,25 @@ export class RdDBonus { /* -------------------------------------------- */ static dmgBonus(condition) { return RdDBonus.find(condition).dmg; - } - + } + /* -------------------------------------------- */ static bonusAttaque(condition) { return RdDBonus.find(condition).attaque; - } + } /* -------------------------------------------- */ static _calculMortalite(rollData, isCauchemar) { - if (isCauchemar){ + if (isCauchemar) { return "cauchemar"; - }if (rollData.dmg && rollData.dmg.mortalite) { - return rollData.dmg.mortalite; } - if (rollData.arme && rollData.arme.data.mortalite) { - return rollData.arme.data.mortalite; - } - return "mortel"; + return isCauchemar + ? "cauchemar" + : rollData.dmg?.mortalite + ?? rollData.arme?.data.mortalite + ?? "mortel"; } - + /* -------------------------------------------- */ static _dmgArme(rollData) { return parseInt(rollData.arme?.data.dommages ?? 0); @@ -83,7 +82,7 @@ export class RdDBonus { static _peneration(rollData) { return parseInt(rollData.arme?.data.penetration ?? 0); } - + /* -------------------------------------------- */ static _dmgPerso(dmgActor, categorie, dmgArme) { switch (categorie) { @@ -92,7 +91,7 @@ export class RdDBonus { } return dmgActor; } - + /* -------------------------------------------- */ static _dmgParticuliere(rollData) { return rollData.particuliere == 'force' ? 5 : 0; diff --git a/module/rdd-utility.js b/module/rdd-utility.js index d277ee83..e7ebce50 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -626,6 +626,7 @@ export class RdDUtility { /* -------------------------------------------- */ static getLocalisation( ) { + // TODO: bouger dans une RollTable du compendium et chercher dans les RoolTable puis compendium pour permettre le changement? let result = new Roll("1d20").roll().total; let txt = "" if ( result <= 3 ) txt = "Jambe, genou, pied, jarret"; @@ -640,16 +641,6 @@ export class RdDUtility { return { result: result, label: txt }; } - /* -------------------------------------------- */ - static computeBlessuresSante( degats, mortalite, loc) { - let encaissement = RdDUtility.selectEncaissement(degats, mortalite) - let over20 = Math.max(degats - 20, 0); - encaissement.endurance = - RdDUtility._evaluatePerte(encaissement.endurance, over20); - encaissement.vie = - RdDUtility._evaluatePerte(encaissement.vie, over20); - encaissement.locName = loc ? loc.label : "Corps"; - return encaissement; - } - /* -------------------------------------------- */ static selectEncaissement( degats, mortalite ) { const table = definitionsEncaissement[mortalite] === undefined ? definitionsEncaissement["mortel"] : definitionsEncaissement[mortalite]; diff --git a/templates/chat-resultat-attaque.html b/templates/chat-resultat-attaque.html index 5c5d8538..7802cce2 100644 --- a/templates/chat-resultat-attaque.html +++ b/templates/chat-resultat-attaque.html @@ -24,7 +24,6 @@ {{numberFormat dmg.total decimals=0 sign=true}} (entités de cauchemar) {{~/if}}. {{#if show.isRecul}}Si votre adversaire n'esquive pas, il devra résister à l'impact ou reculer sous le choc!{{/if}} - Le coup vise: {{dmg.loc.label}}. {{#if (eq particuliere 'rapidite')}}