diff --git a/module/actor.js b/module/actor.js
index 6f679940..ca5560b7 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 95827deb..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,31 +788,18 @@ export class RdDCombat {
const attackerRoll = defenderRoll.attackerRoll;
if (this._isAttaqueCauseRecul(attackerRoll)) {
- let impactRecul = this._computeImpactRecul(attackerRoll);
- const agilite = 10;
- if ( this.defender.data.data.carac.agilite ) {
- agilite = this.defender.data.data.carac.agilite.value;
- } else if ( this.defender.data.data.carac.force) {
- agilite = this.defender.data.data.carac.force.value;
- } else if ( this.defender.isEntiteCauchemar()) {
- agilite = this.defender.data.data.carac.reve.value;
- } else
- ui.notifications.warn("Recul impossible pour cette créature/entité");
- return;
- }
-
- 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';
}
}
}
@@ -827,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);
}
/* -------------------------------------------- */
@@ -849,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é 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é
jusqu'à la fin du prochain round{{else}}n'est pas sonné{{/if}}
+ ({{jetEndurance}} / {{resteEndurance}})!
+ {{/if}}
+ {{/if}}
+ {{/if}}
+ {{#if (eq show.recul 'encaisse')}}