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 } );
}
/* -------------------------------------------- */
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) {
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 = "<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 ) {
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: `<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 */
getRollData() {

View File

@ -30,7 +30,7 @@ export class RdDBonus {
/* -------------------------------------------- */
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");
@ -64,15 +64,14 @@ export class RdDBonus {
/* -------------------------------------------- */
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";
}
/* -------------------------------------------- */

View File

@ -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];

View File

@ -24,7 +24,6 @@
<span class="rdd-roll-etotal">{{numberFormat dmg.total decimals=0 sign=true}}</span> (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}}.
</span>
</div>
{{#if (eq particuliere 'rapidite')}}