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 } );
|
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() {
|
||||||
|
@ -30,7 +30,7 @@ export class RdDBonus {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
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");
|
||||||
@ -64,15 +64,14 @@ export class RdDBonus {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
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";
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
@ -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];
|
||||||
|
@ -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')}}
|
||||||
|
Loading…
Reference in New Issue
Block a user