Fix: le jet de vie indique la mort

Jusque là, le 20 indiquait la mort, mais ne diminuait pas la vie
en dessous de - SConst

Désormais:
- la vie passe à -SConst - 1 sur 20 au jet de vie
- Le message indique que le personnage est mort si sa vie est
  inférieure à -SConst
- le jet de vie n'est pas fait si le personnage est déjà mort
This commit is contained in:
Vincent Vandemeulebrouck 2023-11-11 19:51:26 +01:00
parent 3ca33e85b7
commit 381242c8d0
3 changed files with 44 additions and 27 deletions

View File

@ -348,7 +348,7 @@ export class RdDActorSheet extends RdDBaseActorReveSheet {
}); });
this.html.find('.jet-vie').click(async event => { this.html.find('.jet-vie').click(async event => {
this.actor.jetVie(); this.actor.jetDeVie();
}); });
this.html.find('.jet-endurance').click(async event => { this.html.find('.jet-endurance').click(async event => {
await this.jetEndurance(); await this.jetEndurance();

View File

@ -60,13 +60,21 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
return this.system.sante.vie.value < -this.getSConst() return this.system.sante.vie.value < -this.getSConst()
} }
nbBlessuresLegeres() {
return this.itemTypes[TYPES.blessure].filter(it => it.isLegere()).length;
}
nbBlessuresGraves() {
return this.itemTypes[TYPES.blessure].filter(it => it.isGrave()).length;
}
nbBlessuresCritiques() {
return this.itemTypes[TYPES.blessure].filter(it => it.isCritique()).length;
}
/* -------------------------------------------- */ /* -------------------------------------------- */
computeResumeBlessure() { computeResumeBlessure() {
const blessures = this.filterItems(it => it.system.gravite > 0, 'blessure') const nbLegeres = this.nbBlessuresLegeres()
const nbGraves = this.nbBlessuresGraves()
const nbLegeres = blessures.filter(it => it.isLegere()).length; const nbCritiques = this.nbBlessuresCritiques()
const nbGraves = blessures.filter(it => it.isGrave()).length;
const nbCritiques = blessures.filter(it => it.isCritique()).length;
if (nbLegeres + nbGraves + nbCritiques == 0) { if (nbLegeres + nbGraves + nbCritiques == 0) {
return "Aucune blessure"; return "Aucune blessure";
@ -206,26 +214,36 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async jetVie() { async jetDeVie() {
let roll = await RdDDice.roll("1d20"); if (this.isDead()) {
let msgText = "Jet de Vie : " + roll.total + " / " + this.system.sante.vie.value + "<br>"; ChatMessage.create({ content: `Jet de Vie: ${this.name} est déjà mort, ce n'est pas la peine d'en rajouter !!!!!`, whisper: ChatMessage.getWhisperRecipients(this.name) });
if (roll.total <= this.system.sante.vie.value) { return
msgText += "Jet réussi, pas de perte de point de vie (prochain jet dans 1 round pour 1 critique, SC minutes pour une grave)";
if (roll.total == 1) {
msgText += "La durée entre 2 jets de vie est multipliée par 20 (20 rounds pour une critique, SCx20 minutes pour une grave)";
}
} else {
msgText += "Jet échoué, vous perdez 1 point de vie";
await this.santeIncDec("vie", -1);
if (roll.total == 20) {
msgText += "Votre personnage est mort !!!!!";
}
} }
const message = { const jetDeVie = await RdDDice.roll("1d20");
content: msgText,
whisper: ChatMessage.getWhisperRecipients(this.name) const sConst = this.getSConst();
}; const vie = this.system.sante.vie.value;
ChatMessage.create(message); const isCritique = this.nbBlessuresCritiques() > 0;
const isGrave = this.nbBlessuresGraves();
const isEchecTotal = jetDeVie.total == 20;
const isSuccess = jetDeVie.total == 1 || jetDeVie.total <= vie;
const perte = isSuccess ? 0 : 1 + (isEchecTotal ? vie + sConst : 0)
const prochainJet = (jetDeVie.total == 1 && vie > 0 ? 20 : 1) * (isCritique ? 1 : isGrave > 0 ? sConst : 0)
let msgText = `Jet de Vie: <strong>${jetDeVie.total} / ${vie}</strong>`
if (isSuccess) {
msgText += "<br>Réussi, pas de perte de point de vie."
} else {
msgText += `<br>Echoué, perte ${perte} point de vie`;
await this.santeIncDec("vie", -perte);
}
if (this.isDead()) {
msgText += `<br><strong>${this.name} est mort !!!!</strong>`;
}
else if (prochainJet > 0) {
msgText += `<br>Prochain jet de vie dans ${prochainJet} ${isCritique ? 'round' : 'minute'}${prochainJet > 1 ? 's' : ''} ${isCritique ? '(état critique)' : '(état grave)'}`
}
ChatMessage.create({ content: msgText, whisper: ChatMessage.getWhisperRecipients(this.name) });
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -238,7 +256,6 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
return { jetEndurance, sonne } return { jetEndurance, sonne }
} }
async finDeRoundBlessures() { async finDeRoundBlessures() {
const nbGraves = this.filterItems(it => it.isGrave(), 'blessure').length; const nbGraves = this.filterItems(it => it.isGrave(), 'blessure').length;
if (nbGraves > 0) { if (nbGraves > 0) {

View File

@ -518,7 +518,7 @@ export class RdDCombat {
let token = canvas.tokens.placeables.find(t => t.id == tokenId) let token = canvas.tokens.placeables.find(t => t.id == tokenId)
const actor = token?.actor ?? game.actors.get(actorId); const actor = token?.actor ?? game.actors.get(actorId);
if (actor?.isOwner) { if (actor?.isOwner) {
actor.jetVie(); actor.jetDeVie();
} }
} }