fix pertes de vie/ endurance

Lors de la 3eme grave changée en critique, la perte de vie n'était pas
bien affichée.

Dans le message, on avait:  "une blessure grave une blessure critique"

La localisation est maintenant donnée à l'encaissement
This commit is contained in:
Vincent Vandemeulebrouck 2021-01-06 16:24:05 +01:00
parent 5178d1f389
commit f2a99bc2f0
4 changed files with 115 additions and 106 deletions

View File

@ -1107,68 +1107,6 @@ export class RdDActor extends Actor {
await this.update( { 'data.blessures': bList } ); 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<blessures.legeres.liste.length; k++) {
let bless = blessures.legeres.liste[k];
if ( !bless.active ){
bless.active = true;
bless.loc = workData.locName;
workData.legeres--;
}
if (workData.legeres == 0) break;
}
}
if ( workData.legeres > 0 ) {
workData.graves += 1;
blessuresData.graves += 1;
}
if ( workData.graves > 0) {
for (let k=0; k<blessures.graves.liste.length; k++) {
let bless = blessures.graves.liste[k];
if ( !bless.active ) {
bless.active = true;
bless.loc = workData.locName;
workData.graves--;
}
if ( workData.graves == 0) break;
}
}
workData.from3Graves = false;
if ( workData.graves > 0 ) {
workData.critiques = 1;
blessuresData.critiques = 1;
workData.from3Graves = true;
}
if ( workData.critiques > 0 ) {
if ( blessures.critiques.liste[0].active ) {
ChatMessage.create(`<strong>${game.user.name} vient de succomber à une seconde blessure critique ! Que les Dragons gardent son Archétype en paix !</strong>`);
} 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) { async jetDeMoral(situation) {
let jetMoral = new Roll("1d20").roll(); let jetMoral = new Roll("1d20").roll();
@ -2132,28 +2070,24 @@ export class RdDActor extends Actor {
} }
console.log("encaisserDommages", attackerRoll ) console.log("encaisserDommages", attackerRoll )
const armure = this.computeArmure( attackerRoll );
const rollEncaissement = new Roll("2d10 + @dmg - @armure",{ let encaissement = this.jetEncaissement(attackerRoll);
dmg: attackerRoll.dmg.total,
armure: armure this.ajouterBlessure(encaissement); // Will upate the result table
}).roll();
RdDDice.show(rollEncaissement); await this.santeIncDec("vie", encaissement.vie);
let result = RdDUtility.computeBlessuresSante(rollEncaissement.total, attackerRoll.dmg.mortalite, attackerRoll.dmg.loc); await this.santeIncDec("endurance", encaissement.endurance, (encaissement.critiques > 0));
result.endurance = Math.max(result.endurance, -Number(this.data.data.sante.endurance.value));
await this.santeIncDec("vie", result.vie); const blessureLegere = (encaissement.legeres > 0 ? "une blessure légère" : "");
await this.santeIncDec("endurance", result.endurance, (result.critiques > 0)); 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 = { let commonMsg = {
title: "Blessures !", title: "Blessures !",
roll: rollEncaissement , roll: encaissement.roll,
content: this.data.name + " a encaissé " + blessureLegere + blessureGrave + blessureCritique content: `${this.data.name} a encaissé ${blessureLegere}${blessureGrave}${blessureCritique} (${encaissement.locName})`
} }
let addonMsg = "<br>Et a perdu : <br>" + result.endurance + " Endurance et " + result.vie + " Points de Vie"; let addonMsg = "<br>Et a perdu : <br>" + encaissement.endurance + " Endurance et " + encaissement.vie + " Points de Vie";
if ( this.hasPlayerOwner ) { if ( this.hasPlayerOwner ) {
commonMsg.content += addonMsg; // Message pour tout le monde commonMsg.content += addonMsg; // Message pour tout le monde
ChatMessage.create( commonMsg ); ChatMessage.create( commonMsg );
@ -2169,6 +2103,92 @@ export class RdDActor extends Actor {
this.sheet.render(false); 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: `<strong>${this.name} vient de succomber à une seconde blessure critique ! Que les Dragons gardent son Archétype en paix !</strong>`});
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 */ /** @override */
getRollData() { getRollData() {

View File

@ -18,7 +18,7 @@ export class RdDBonus {
return conditionsTactiques.find(e => e.type == condition) || conditionsTactiques.find(e => e.type == 'pret'); return conditionsTactiques.find(e => e.type == condition) || conditionsTactiques.find(e => e.type == 'pret');
} }
static isAjustementAstrologique(rollData) { static isAjustementAstrologique(rollData) {
return RdDCarac.isChance(rollData.selectedCarac) || return RdDCarac.isChance(rollData.selectedCarac) ||
rollData.selectedSort?.data.isrituel; rollData.selectedSort?.data.isrituel;
@ -27,10 +27,10 @@ export class RdDBonus {
static isDefenseAttaqueFinesse(rollData) { static isDefenseAttaqueFinesse(rollData) {
return rollData.attackerRoll?.particuliere == 'finesse'; return rollData.attackerRoll?.particuliere == 'finesse';
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static dmg(rollData, dmgActor, isCauchemar = false) { 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") { if (rollData.arme && rollData.arme.name.toLowerCase() == "esquive") {
// Specific case management // Specific case management
ui.notifications.warn("Calcul de bonus dégats sur eswquive"); ui.notifications.warn("Calcul de bonus dégats sur eswquive");
@ -55,26 +55,25 @@ export class RdDBonus {
/* -------------------------------------------- */ /* -------------------------------------------- */
static dmgBonus(condition) { static dmgBonus(condition) {
return RdDBonus.find(condition).dmg; return RdDBonus.find(condition).dmg;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static bonusAttaque(condition) { static bonusAttaque(condition) {
return RdDBonus.find(condition).attaque; return RdDBonus.find(condition).attaque;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static _calculMortalite(rollData, isCauchemar) { static _calculMortalite(rollData, isCauchemar) {
if (isCauchemar){ if (isCauchemar) {
return "cauchemar"; return "cauchemar";
}if (rollData.dmg && rollData.dmg.mortalite) {
return rollData.dmg.mortalite;
} }
if (rollData.arme && rollData.arme.data.mortalite) { return isCauchemar
return rollData.arme.data.mortalite; ? "cauchemar"
} : rollData.dmg?.mortalite
return "mortel"; ?? rollData.arme?.data.mortalite
?? "mortel";
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static _dmgArme(rollData) { static _dmgArme(rollData) {
return parseInt(rollData.arme?.data.dommages ?? 0); return parseInt(rollData.arme?.data.dommages ?? 0);
@ -83,7 +82,7 @@ export class RdDBonus {
static _peneration(rollData) { static _peneration(rollData) {
return parseInt(rollData.arme?.data.penetration ?? 0); return parseInt(rollData.arme?.data.penetration ?? 0);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static _dmgPerso(dmgActor, categorie, dmgArme) { static _dmgPerso(dmgActor, categorie, dmgArme) {
switch (categorie) { switch (categorie) {
@ -92,7 +91,7 @@ export class RdDBonus {
} }
return dmgActor; return dmgActor;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static _dmgParticuliere(rollData) { static _dmgParticuliere(rollData) {
return rollData.particuliere == 'force' ? 5 : 0; return rollData.particuliere == 'force' ? 5 : 0;

View File

@ -626,6 +626,7 @@ export class RdDUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static getLocalisation( ) 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 result = new Roll("1d20").roll().total;
let txt = "" let txt = ""
if ( result <= 3 ) txt = "Jambe, genou, pied, jarret"; if ( result <= 3 ) txt = "Jambe, genou, pied, jarret";
@ -640,16 +641,6 @@ export class RdDUtility {
return { result: result, label: txt }; 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 ) { static selectEncaissement( degats, mortalite ) {
const table = definitionsEncaissement[mortalite] === undefined ? definitionsEncaissement["mortel"] : definitionsEncaissement[mortalite]; const table = definitionsEncaissement[mortalite] === undefined ? definitionsEncaissement["mortel"] : definitionsEncaissement[mortalite];

View File

@ -24,7 +24,6 @@
<span class="rdd-roll-etotal">{{numberFormat dmg.total decimals=0 sign=true}}</span> (entités de cauchemar) <span class="rdd-roll-etotal">{{numberFormat dmg.total decimals=0 sign=true}}</span> (entités de cauchemar)
{{~/if}}. {{~/if}}.
{{#if show.isRecul}}Si votre adversaire n'esquive pas, il devra résister à l'impact ou reculer sous le choc!{{/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}}.
</span> </span>
</div> </div>
{{#if (eq particuliere 'rapidite')}} {{#if (eq particuliere 'rapidite')}}