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:
parent
5178d1f389
commit
f2a99bc2f0
178
module/actor.js
178
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<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() {
|
||||
|
@ -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");
|
||||
@ -66,13 +66,12 @@ export class RdDBonus {
|
||||
static _calculMortalite(rollData, 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";
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
@ -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];
|
||||
|
@ -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')}}
|
||||
|
Loading…
Reference in New Issue
Block a user