From 381242c8d0781b29f0526164ab252ac5e709be85 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 11 Nov 2023 19:51:26 +0100 Subject: [PATCH] Fix: le jet de vie indique la mort MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- module/actor-sheet.js | 2 +- module/actor/base-actor-sang.js | 67 +++++++++++++++++++++------------ module/rdd-combat.js | 2 +- 3 files changed, 44 insertions(+), 27 deletions(-) diff --git a/module/actor-sheet.js b/module/actor-sheet.js index e63c0411..fba45626 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -348,7 +348,7 @@ export class RdDActorSheet extends RdDBaseActorReveSheet { }); this.html.find('.jet-vie').click(async event => { - this.actor.jetVie(); + this.actor.jetDeVie(); }); this.html.find('.jet-endurance').click(async event => { await this.jetEndurance(); diff --git a/module/actor/base-actor-sang.js b/module/actor/base-actor-sang.js index e754674a..8398ac08 100644 --- a/module/actor/base-actor-sang.js +++ b/module/actor/base-actor-sang.js @@ -60,13 +60,21 @@ export class RdDBaseActorSang extends RdDBaseActorReve { 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() { - const blessures = this.filterItems(it => it.system.gravite > 0, 'blessure') - - const nbLegeres = blessures.filter(it => it.isLegere()).length; - const nbGraves = blessures.filter(it => it.isGrave()).length; - const nbCritiques = blessures.filter(it => it.isCritique()).length; + const nbLegeres = this.nbBlessuresLegeres() + const nbGraves = this.nbBlessuresGraves() + const nbCritiques = this.nbBlessuresCritiques() if (nbLegeres + nbGraves + nbCritiques == 0) { return "Aucune blessure"; @@ -206,26 +214,36 @@ export class RdDBaseActorSang extends RdDBaseActorReve { } /* -------------------------------------------- */ - async jetVie() { - let roll = await RdDDice.roll("1d20"); - let msgText = "Jet de Vie : " + roll.total + " / " + this.system.sante.vie.value + "
"; - if (roll.total <= this.system.sante.vie.value) { - 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 !!!!!"; - } + async jetDeVie() { + if (this.isDead()) { + 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) }); + return } - const message = { - content: msgText, - whisper: ChatMessage.getWhisperRecipients(this.name) - }; - ChatMessage.create(message); + const jetDeVie = await RdDDice.roll("1d20"); + + const sConst = this.getSConst(); + const vie = this.system.sante.vie.value; + 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: ${jetDeVie.total} / ${vie}` + if (isSuccess) { + msgText += "
Réussi, pas de perte de point de vie." + } else { + msgText += `
Echoué, perte ${perte} point de vie`; + await this.santeIncDec("vie", -perte); + } + if (this.isDead()) { + msgText += `
${this.name} est mort !!!!`; + } + else if (prochainJet > 0) { + msgText += `
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 } } - async finDeRoundBlessures() { const nbGraves = this.filterItems(it => it.isGrave(), 'blessure').length; if (nbGraves > 0) { diff --git a/module/rdd-combat.js b/module/rdd-combat.js index 01924c4b..b8dbb066 100644 --- a/module/rdd-combat.js +++ b/module/rdd-combat.js @@ -518,7 +518,7 @@ export class RdDCombat { let token = canvas.tokens.placeables.find(t => t.id == tokenId) const actor = token?.actor ?? game.actors.get(actorId); if (actor?.isOwner) { - actor.jetVie(); + actor.jetDeVie(); } }