From 26722d26fda5d98fb6c1e7e40e7c8e2ea510c432 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 23 Jan 2021 18:36:30 +0100 Subject: [PATCH] Fixes recul/desarmement --- module/actor.js | 70 +++++++++++++++-------- module/rdd-combat.js | 41 ++++++------- module/rdd-resolution-table.js | 2 +- module/rdd-roll.js | 1 - templates/chat-resultat-encaissement.html | 22 ++++--- templates/chat-resultat-esquive.html | 5 -- templates/chat-resultat-parade.html | 39 ++++++------- 7 files changed, 95 insertions(+), 85 deletions(-) diff --git a/module/actor.js b/module/actor.js index 8bd31bbb..1b7f4336 100644 --- a/module/actor.js +++ b/module/actor.js @@ -179,18 +179,34 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ getReveActuel() { - return this.data.data.reve?.reve?.value ?? this.data.data.carac.reve.value; - } - - getChanceActuel() { - return this.data.data.compteurs.chance?.value ?? 10; + return Misc.toInt(this.data.data.reve?.reve?.value ?? this.data.data.carac.reve.value); } /* -------------------------------------------- */ - getForceValue() { - return this.data.data.carac.force?.force ?? this.data.data.carac.reve.value; + getChanceActuel() { + return Misc.toInt(this.data.data.compteurs.chance?.value ?? 10); + } + /* -------------------------------------------- */ + getTaille() { + return Misc.toInt(this.data.data.carac.taille?.value); + } + /* -------------------------------------------- */ + getForce() { + if (this.isEntiteCauchemar()) { + return Misc.toInt(this.data.data.carac.reve?.value); + } + return Misc.toInt(this.data.data.carac.force?.value); + } + /* -------------------------------------------- */ + getAgilite() { + switch(this.data.type) { + case 'personnage': return Misc.toInt(this.data.data.carac.agilite?.value); + case 'creature': return Misc.toInt(this.data.data.carac.force?.value); + case 'entite': return Misc.toInt(this.data.data.carac.reve?.value); + } + return 10; } getMoralTotal() { - return this.data.data.compteurs.moral?.value ?? 0; + return Misc.toInt(this.data.data.compteurs.moral?.value); } /* -------------------------------------------- */ getBonusDegat() { @@ -203,16 +219,16 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ getEtatGeneral() { - return this.data.data.compteurs.etat?.value ?? 0; + return Misc.toInt(this.data.data.compteurs.etat?.value); } getMalusArmure() { - return this.data.data.attributs?.malusarmure?.value ?? 0; + return Misc.toInt(this.data.data.attributs?.malusarmure?.value); } getEncTotal() { return Math.floor(this.encTotal ?? 0); } getSurenc() { - return this.data.data.compteurs.surenc?.value ?? 0; + return Misc.toInt(this.data.data.compteurs.surenc?.value); } /* -------------------------------------------- */ loadCompendiumNames() { @@ -229,7 +245,6 @@ export class RdDActor extends Actor { getMeditation(id) { return this.data.items.find(item => item.type == 'meditation' && item._id == id); } - /* -------------------------------------------- */ getBestDraconic() { const list = this.getDraconicList().sort((a, b) => b.data.niveau - a.data.niveau); @@ -559,8 +574,7 @@ export class RdDActor extends Actor { async updateCarac(caracName, caracValue) { let caracpath = "data.carac." + caracName + ".value" if (caracName == "force") { - let caracTaille = this.data.data.carac.taille; - if ( Number(caracValue) > Number(caracTaille.value)+4) { + if ( Number(caracValue) > this.getTaille() + 4) { ui.notifications.warn("Votre FORCE doit être au maximum de TAILLE+4"); return; } @@ -580,6 +594,9 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async updateCaracXP(caracName, caracXP) { + if (caracName == 'Taille') { + return; + } let caracpath = "data.carac." + caracName + ".xp"; await this.update({ [caracpath]: caracXP }); this.checkCaracXP(caracName); @@ -1971,7 +1988,9 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async appliquerExperience(rolled, caracName, competence = undefined) { - + if (this.isCreature()) { + return; + } if (rolled.isPart && rolled.finalLevel < 0) { // Cas de désir lancinant, pas d'expérience sur particulière if (this.checkDesirLancinant()) { @@ -2222,7 +2241,7 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ - async encaisserDommages(rollData, attacker = undefined) { + async encaisserDommages(rollData, attacker = undefined, defenderRoll = undefined) { if (attacker && !await attacker.accorder(this, 'avant-encaissement')) { return; } @@ -2241,15 +2260,16 @@ export class RdDActor extends Actor { this.computeEtatGeneral(); this.sheet.render(false); - let santeActuelle = duplicate(this.data.data.sante); - - encaissement.alias = this.data.name; - encaissement.hasPlayerOwner = this.hasPlayerOwner; - encaissement.resteEndurance = santeActuelle.endurance.value - encaissement.sonne = perteEndurance.sonne; - encaissement.jetEndurance = perteEndurance.jetEndurance; - encaissement.endurance = santeOrig.endurance.value - perteEndurance.newValue; - encaissement.vie = this.isEntiteCauchemar() ? 0 : (santeOrig.vie.value - perteVie.newValue); + mergeObject(encaissement, { + alias: this.data.name, + hasPlayerOwner: this.hasPlayerOwner, + resteEndurance: this.data.data.sante.endurance.value, + sonne: perteEndurance.sonne, + jetEndurance: perteEndurance.jetEndurance, + endurance: santeOrig.endurance.value - perteEndurance.newValue, + vie: this.isEntiteCauchemar() ? 0 : (santeOrig.vie.value - perteVie.newValue), + show: defenderRoll?.show ?? {} + }); ChatUtility.createChatWithRollMode(this.name, { roll: encaissement.roll, diff --git a/module/rdd-combat.js b/module/rdd-combat.js index fff177b3..4191f302 100644 --- a/module/rdd-combat.js +++ b/module/rdd-combat.js @@ -270,7 +270,7 @@ export class RdDCombat { /* -------------------------------------------- */ attaqueDestinee(attackerRoll) { ui.notifications.info('Attaque significative grâce à la destinée') - RdDResolutionTable.forceSignificative(attackerRoll.rolled); + RdDResolutionTable.significativeRequise(attackerRoll.rolled); this.removeChatMessageActionsPasseArme(attackerRoll.passeArme); this._onAttaqueNormale(attackerRoll); } @@ -289,7 +289,7 @@ export class RdDCombat { let defenderRoll = RdDCombat._getDefense(attackerRoll.passeArme); if (defenderRoll) { ui.notifications.info('Défense significative grâce à la destinée') - RdDResolutionTable.forceSignificative(defenderRoll.rolled); + RdDResolutionTable.significativeRequise(defenderRoll.rolled); this.removeChatMessageActionsPasseArme(defenderRoll.passeArme); if (defenderRoll.arme) { this._onParadeNormale(defenderRoll); @@ -601,7 +601,6 @@ export class RdDCombat { let rollData = { passeArme: attackerRoll.passeArme, - forceValue: this.defender.getForceValue(), diffLibre: attackerRoll.diffLibre, attackerRoll: attackerRoll, competence: this.defender.getCompetence(compName), @@ -698,7 +697,6 @@ export class RdDCombat { _prepareEsquive(attackerRoll, competence) { let rollData = { passeArme: attackerRoll.passeArme, - forceValue: this.defender.getForceValue(), diffLibre: attackerRoll.diffLibre, attackerRoll: attackerRoll, competence: competence, @@ -774,16 +772,13 @@ export class RdDCombat { } } // Si l'arme de parade n'est pas un bouclier, jet de désarmement (p.132) - if (resistance > 0 && !RdDItemArme.getCategorieParade(rollData.arme) == 'boucliers') { + if (resistance > 0 && RdDItemArme.getCategorieParade(rollData.arme) != 'boucliers') { let desarme = await RdDResolutionTable.rollData({ - caracValue: this.defender.data.data.carac.force.value, + caracValue: this.defender.getForce(), finalLevel: Misc.toInt(rollData.competence.data.niveau) - dmg, showDice: false }); rollData.show.desarme = desarme.rolled.isEchec; - if (desarme.rolled.isEchec) { - rollData.show.desarme = true; - } } } } @@ -793,23 +788,18 @@ export class RdDCombat { const attackerRoll = defenderRoll.attackerRoll; if (this._isAttaqueCauseRecul(attackerRoll)) { - let impactRecul = this._computeImpactRecul(attackerRoll); - const agilite = this.defender.isEntiteCauchemar() - ? this.defender.data.data.carac.reve.value - : this.defender.data.data.carac.agilite.value; - - let rollRecul = await RdDResolutionTable.rollData({ caracValue: 10, finalLevel: impactRecul, showDice: false }); - - if (rollRecul.isSuccess) { + const impact = this._computeImpactRecul(attackerRoll); + const rollRecul = await RdDResolutionTable.rollData({ caracValue: 10, finalLevel: impact }); + + if (rollRecul.rolled.isSuccess) { defenderRoll.show.recul = 'encaisse'; - } else if (rollRecul.isETotal) { + } else if (rollRecul.rolled.isETotal) { defenderRoll.show.recul = 'chute'; } else { - let chute = await RdDResolutionTable.rollData({ caracValue: agilite, finalLevel: impactRecul, showDice: false }); - defenderRoll.show.recul = (chute.isSuccess) - ? 'recul' - : 'chute'; + const agilite = this.defender.getAgilite(); + const chute = await RdDResolutionTable.rollData({ caracValue: agilite, finalLevel: impact }); + defenderRoll.show.recul = (chute.rolled.isSuccess) ? 'recul' : 'chute'; } } } @@ -819,7 +809,10 @@ export class RdDCombat { } _computeImpactRecul(attaque) { - return Misc.toInt(this.defender.data.data.carac.taille.value) - (attaque.forceValue + attaque.arme.data.dommagesReels); + const taille = this.defender.getTaille(); + const force = this.attacker.getForce(); + const dommages = attaque.arme.data.dommagesReels; + return taille - (force + dommages); } /* -------------------------------------------- */ @@ -841,7 +834,7 @@ export class RdDCombat { attackerRoll.defenderTokenId = defenderTokenId; await this.computeRecul(defenderRoll); - this.defender.encaisserDommages(attackerRoll, this.attacker); + this.defender.encaisserDommages(attackerRoll, this.attacker, defenderRoll); } else { // envoi à un GM: les joueurs n'ont pas le droit de modifier les personnages qu'ils ne possèdent pas game.socket.emit("system.foundryvtt-reve-de-dragon", { msg: "msg_encaisser", diff --git a/module/rdd-resolution-table.js b/module/rdd-resolution-table.js index 395b3659..226230b2 100644 --- a/module/rdd-resolution-table.js +++ b/module/rdd-resolution-table.js @@ -138,7 +138,7 @@ export class RdDResolutionTable { mergeObject(chances, this._computeCell(null, newScore), { overwrite: true }); } } - static forceSignificative(chances) { + static significativeRequise(chances) { chances.roll = Math.floor(chances.score / 2); mergeObject(chances, reussites.find(x => x.code == 'sign'), { overwrite: true }); } diff --git a/module/rdd-roll.js b/module/rdd-roll.js index 9f45752d..f10e285c 100644 --- a/module/rdd-roll.js +++ b/module/rdd-roll.js @@ -44,7 +44,6 @@ export class RdDRoll extends Dialog { diffLibre: rollData.competence?.data.default_diffLibre ?? 0, editLibre: true, editConditions: true, - forceValue: actor.getForceValue(), malusArmureValue: actor.getMalusArmure(), surencMalusFlag: actor.isPersonnage() ? (actor.data.data.compteurs.surenc.value < 0) : false, surencMalusValue: actor.getSurenc(), diff --git a/templates/chat-resultat-encaissement.html b/templates/chat-resultat-encaissement.html index 1c666f13..10a7ab0e 100644 --- a/templates/chat-resultat-encaissement.html +++ b/templates/chat-resultat-encaissement.html @@ -30,15 +30,19 @@ {{/if}} ({{dmg.loc.label}}) {{#if (gt endurance 0)}} - {{#if hasPlayerOwner}}, a perdu {{endurance}} points d'endurance - {{#if (ne vie 0)}}, {{vie}} points de vie{{/if}} - {{/if}} - {{#if (ne dmg.mortalite 'cauchemar')}} - {{#if (gt endurance 1)}}et - {{#if sonne}}est sonnécharge jusqu'à la fin du prochain round{{else}}n'est pas sonné{{/if}} - ({{jetEndurance}} / {{resteEndurance}})! - {{/if}} - {{/if}} + {{#if hasPlayerOwner}}, a perdu {{endurance}} points d'endurance + {{#if (ne vie 0)}}, {{vie}} points de vie{{/if}} + {{/if}} + {{#if (ne dmg.mortalite 'cauchemar')}} + {{#if (gt endurance 1)}}et + {{#if sonne}}est sonnécharge jusqu'à la fin du prochain round{{else}}n'est pas sonné{{/if}} + ({{jetEndurance}} / {{resteEndurance}})! + {{/if}} + {{/if}} + {{/if}} + {{#if (eq show.recul 'encaisse')}}
{{alias}} ne recule pas malgré la violence du coup.
+ {{else if (eq show.recul 'chute')}}
Sous la violence du coup, {{alias}} recule et chute au sol ! Il/elle ne pourra plus attaquer ce round.
+ {{else if (eq show.recul 'recul')}}
La violence du coup fait reculer {{alias}} de quelques mètres ! Il/elle ne pourra plus attaquer ce round.
{{/if}} {{/if}} \ No newline at end of file diff --git a/templates/chat-resultat-esquive.html b/templates/chat-resultat-esquive.html index e802e32f..471d5def 100644 --- a/templates/chat-resultat-esquive.html +++ b/templates/chat-resultat-esquive.html @@ -15,11 +15,6 @@ {{/if}} -{{#if (eq show.recul 'encaisse')}}
Vous ne reculez pas malgré la violence du coup.
-{{else if (eq show.recul 'chute')}}
Sous la violence du coup, vous reculez et chutez au sol ! Vous ne pouvez plus attaquer ce round.
-{{else if (eq show.recul 'recul')}}
La violence du choup vous fait reculer de quelques mètres ! Vous ne pouvez plus attaquer ce round.
-{{/if}} - {{#if attackerRoll.tactique}}
{{#if (eq attackerRoll.tactique 'charge')}} diff --git a/templates/chat-resultat-parade.html b/templates/chat-resultat-parade.html index dbff81a1..75c84e78 100644 --- a/templates/chat-resultat-parade.html +++ b/templates/chat-resultat-parade.html @@ -4,43 +4,42 @@ {{> "systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html"}}
- {{#if rolled.isSuccess}} - Attaque parée! - {{#if rolled.isPart}} - - Vous pouvez utiliser votre arme pour une deuxième parade! + + {{#if rolled.isSuccess}} + Attaque parée! + {{#if rolled.isPart}}{{alias}} pourra tenter une deuxième parade!{{/if}} + {{else}} + La parade a échoué! {{/if}} - {{else}} - Votre parade a échoué! - {{/if}} +
-{{#if (eq show.recul 'encaisse')}}
Vous ne reculez pas malgré la violence du coup.
-{{else if (eq show.recul 'brise')}}
Sous la violence du coup, vous reculez et chutez au sol ! Vous ne pouvez plus attaquer ce round.
-{{else if (eq show.recul 'perte')}}
La violence du choup vous fait reculer de quelques mètres ! Vous ne pouvez plus attaquer ce round.
+{{#if (eq show.recul 'encaisse')}}
{{alias}} ne recule pas malgré la violence du coup.
+{{else if (eq show.recul 'chute')}}
Sous la violence du coup, {{alias}} recule et chute au sol ! Il/elle ne pourra plus attaquer ce round.
+{{else if (eq show.recul 'recul')}}
La violence du coup fait reculer {{alias}} de quelques mètres ! Il/elle ne pourra plus attaquer ce round.
{{/if}} {{#if (eq show.deteriorationArme 'resiste')}} -
Votre {{arme.name}} résiste au choc de la parade.
-{{else if (eq show.deteriorationArme 'resiste')}} -
Sous la violence de la parade, votre {{arme.name}} s'est brisée!
-{{else if (eq show.deteriorationArme 'resiste')}} -
En parant, vous endommagez votre {{arme.name}} qui perd {{show.perteResistance}} de résistance.
+
L'arme résiste au choc de la parade.
+{{else if (eq show.deteriorationArme 'brise')}} +
Sous la violence de la parade, {{arme.name}} s'est brisée!
+{{else if (eq show.deteriorationArme 'perte')}} +
En parant, l'arme perd {{show.perteResistance}} de résistance.
{{/if}} {{#if show.desarme}} -
Vous ne parvenez pas à garder votre arme en main, elle tombe à vos pieds.
+
Le défenseur {{alias}} lâche son arme qui tombe à ses pieds.
{{/if}} {{#if attackerRoll.tactique}}
{{#if (eq attackerRoll.tactique 'charge')}} charge - C'était une charge, les parades de votre adversaire auront un -4 et il ne pourra pas esquiver! + C'était une charge, les parades de l'adversaire auront un -4 et il ne pourra pas esquiver! {{ else if (eq attackerRoll.tactique 'feinte')}} feinte + width="32" /> C'était une feinte! {{/if}}
-{{/if}} +{{/if}} \ No newline at end of file