diff --git a/changelog.md b/changelog.md index b0e55232..b1faa6d6 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,19 @@ # v11.0 -## v11.1.3 - Werther de Zloth l'Onirique +## v11.1.5 - Werther de Zloth l'Onirique +- Fixes: + - la demande de défense ne marchait plus + - la tête réserve extensible crée bien une case de réserve extensible (à modifier) + - le souffle trou noir ajoute bien une case de trou noir + - la queue urgence draconique ne se transforme plus en idée fixe s'il y a des sorts en réserve + - l'ajout d'une nouvelle queue ne supprime plus l'insomnie +- Amélioration des jets de vie + - un 1 sur le jet de vie est une réussite même si le personnage est dans le coma + - le temps avant le prochain jet est calculé et affiché + - un 20 sur le jet de vie signifie la mort immédiate + - si on dépasse le S.Const, le personnage est bien indiqué comme mort + - pas de jets de vie pour les morts + +## v11.1.4 - Werther de Zloth l'Onirique - Ajout du facteur de significative à côté du pourcentage dans le résultat des jets de dés pour rappeler que le pourcentage n'est pas diviasé - Fix: dans les TMRs, les tooltips affichent bien les informations de tous les effets sur la case - Fix: la fatigue et l'éthylisme sont de nouveau pris en compte dans le calcul de l'éthylisme 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.js b/module/actor.js index a51c6ddf..2e839390 100644 --- a/module/actor.js +++ b/module/actor.js @@ -323,7 +323,9 @@ export class RdDActor extends RdDBaseActorSang { } async setInfoSommeilInsomnie() { - await this.update({ 'system.sommeil.insomnie': EffetsDraconiques.isSujetInsomnie(this) }); + if (EffetsDraconiques.isSujetInsomnie(this)) { + await this.update({ 'system.sommeil.insomnie': true }); + } } async setInfoSommeilMoral(situationMoral) { 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(); } } diff --git a/module/tmr/reserve-extensible.js b/module/tmr/reserve-extensible.js index f5d11211..ce0d8dab 100644 --- a/module/tmr/reserve-extensible.js +++ b/module/tmr/reserve-extensible.js @@ -13,8 +13,8 @@ export class ReserveExtensible extends Draconique { manualMessage() { return "Vous pouvez re-configurer votre Réserve extensible" } async onActorCreateOwned(actor, tete) { const existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord); - const tmr = await TMRUtility.getTMRAleatoire(it => !(it.type == 'fleuve' || existants.includes(it.system.coord))); - await this.createCaseTmr(actor, "Nouvelle Réserve extensible", tmr, tete.id); + const selectedTMR = await TMRUtility.getTMRAleatoire(tmr => !(tmr.type == 'fleuve' || existants.includes(tmr.coord))); + await this.createCaseTmr(actor, "Nouvelle Réserve extensible", selectedTMR, tete.id); } code() { return 'reserve_extensible' } diff --git a/module/tmr/trou-noir.js b/module/tmr/trou-noir.js index 7ab77d2a..23b995aa 100644 --- a/module/tmr/trou-noir.js +++ b/module/tmr/trou-noir.js @@ -14,8 +14,8 @@ export class TrouNoir extends Draconique { async onActorCreateOwned(actor, souffle) { const existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord); - const tmr = await TMRUtility.getTMRAleatoire(it => !(TMRUtility.isCaseHumide(it) || existants.includes(it.system.coord))); - await this.createCaseTmr(actor, 'Trou noir: ' + tmr.label, tmr, souffle.id); + const selectedTMR = await TMRUtility.getTMRAleatoire(tmr => !(TMRUtility.isCaseHumide(tmr) || existants.includes(tmr.coord))); + await this.createCaseTmr(actor, 'Trou noir: ' + selectedTMR.label, selectedTMR, souffle.id); } code() { return 'trounoir' } diff --git a/module/tmr/urgence-draconique.js b/module/tmr/urgence-draconique.js index db81794f..fda4fa19 100644 --- a/module/tmr/urgence-draconique.js +++ b/module/tmr/urgence-draconique.js @@ -8,15 +8,11 @@ import { Draconique } from "./draconique.js"; export class UrgenceDraconique extends Draconique { - constructor() { - super(); - } - type() { return 'queue' } match(item) { return Draconique.isQueueDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('urgence draconique'); } manualMessage() { return false } async onActorCreateOwned(actor, queue) { - const coordSortsReserve = (actor.system.reve.reserve?.list.map(it => it.coord)) ?? []; + const coordSortsReserve = actor.itemTypes[TYPES.sortreserve].map(it => it.system.coord) ?? []; if (coordSortsReserve.length == 0) { // La queue se transforme en idée fixe const ideeFixe = await RdDRollTables.getIdeeFixe(); @@ -26,7 +22,6 @@ export class UrgenceDraconique extends Draconique { }); await actor.createEmbeddedDocuments('Item', [ideeFixe]); await actor.deleteEmbeddedDocuments('Item', [queue.id]); - return; } else { const demiReve = actor.getDemiReve();