diff --git a/changelog.md b/changelog.md index 7bb4e19d..a690eebf 100644 --- a/changelog.md +++ b/changelog.md @@ -1,12 +1,14 @@ # 13.0 ## 13.0.14 - Le familier d'Illysis +- Les réussites particulières en demi-surprise sont de simples réussites - Amélioration des entités: - l'attaquant ne sait plus que c'est une entité de cauchemar (surprise!) - l'encaissement indique une blessure dans le tchat... même si ce n'est que de l'endurance - les blurettes suivent les règles des entités de cauchemar (p322) - Nouvelle fenêtre de jets de dés - Attaque/défense des créatures + - les attaques/parades avec une arme trop lourde se font en demi-surprise ## 13.0.13 - L'épanouissement d'Illysis diff --git a/module/actor/base-actor-reve.js b/module/actor/base-actor-reve.js index 667253a0..6379cfd7 100644 --- a/module/actor/base-actor-reve.js +++ b/module/actor/base-actor-reve.js @@ -272,8 +272,8 @@ export class RdDBaseActorReve extends RdDBaseActor { return this.getEffectByStatus(STATUSES.StatusDemiReve) != undefined } - getSurprise(isCombat = undefined) { - return StatusEffects.getSurprise(this.getEffects(), isCombat) + getSurprise(isCombat = undefined, forceRequise = undefined) { + return StatusEffects.getSurprise(this.getEffects(e => true, isCombat, forceRequise), isCombat) } /* -------------------------------------------- */ diff --git a/module/rdd-resolution-table.js b/module/rdd-resolution-table.js index b3adb522..ed6f69f6 100644 --- a/module/rdd-resolution-table.js +++ b/module/rdd-resolution-table.js @@ -16,17 +16,20 @@ const levelDown = [ ]; const levelImpossible = { score: 0, norm: 0, sign: 0, part: 0, epart: 0, etotal: 1 }; +const reussiteNormale = { code: "norm", isPart: false, isSign: false, isSuccess: true, isEchec: false, isEPart: false, isETotal: false, ptTache: 1, ptQualite: 0, quality: "Réussite normale", condition: (target, roll) => (roll > target.sign && roll <= target.norm) }; +const reussiteSignificative = { code: "sign", isPart: false, isSign: true, isSuccess: true, isEchec: false, isEPart: false, isETotal: false, ptTache: 2, ptQualite: 1, quality: "Réussite significative", condition: (target, roll) => (roll > target.part && roll <= target.sign) }; +const reussiteInsuffisante = { code: "notSign", isPart: false, isSign: false, isSuccess: false, isEchec: true, isEPart: false, isETotal: false, ptTache: 0, ptQualite: -2, quality: "Réussite insuffisante", condition: (target, roll) => false } + const reussites = [ { code: "etotal", isPart: false, isSign: false, isSuccess: false, isEchec: true, isEPart: true, isETotal: true, ptTache: -4, ptQualite: -6, quality: "Echec total", condition: (target, roll) => roll >= target.etotal && roll <= 100 }, { code: "epart", isPart: false, isSign: false, isSuccess: false, isEchec: true, isEPart: true, isETotal: false, ptTache: -2, ptQualite: -4, quality: "Echec particulier", condition: (target, roll) => (roll >= target.epart && roll < target.etotal) }, { code: "echec", isPart: false, isSign: false, isSuccess: false, isEchec: true, isEPart: false, isETotal: false, ptTache: 0, ptQualite: -2, quality: "Echec normal", condition: (target, roll) => (roll > target.norm && roll < target.etotal) }, - { code: "norm", isPart: false, isSign: false, isSuccess: true, isEchec: false, isEPart: false, isETotal: false, ptTache: 1, ptQualite: 0, quality: "Réussite normale", condition: (target, roll) => (roll > target.sign && roll <= target.norm) }, - { code: "sign", isPart: false, isSign: true, isSuccess: true, isEchec: false, isEPart: false, isETotal: false, ptTache: 2, ptQualite: 1, quality: "Réussite significative", condition: (target, roll) => (roll > target.part && roll <= target.sign) }, + reussiteNormale, + reussiteSignificative, { code: "part", isPart: true, isSign: true, isSuccess: true, isEchec: false, isEPart: false, isETotal: false, ptTache: 3, ptQualite: 2, quality: "Réussite Particulière!", condition: (target, roll) => (roll > 0 && roll <= target.part) }, { code: "error", isPart: false, isSign: false, isSuccess: false, isEchec: true, isEPart: true, isETotal: true, ptTache: 0, ptQualite: 0, quality: "Jet de dés invalide", condition: (target, roll) => (roll <= 0 || roll > 100) } ]; -const reussiteInsuffisante = { code: "notSign", isPart: false, isSign: false, isSuccess: false, isEchec: true, isEPart: false, isETotal: false, ptTache: 0, ptQualite: -2, quality: "Réussite insuffisante", condition: (target, roll) => false } /* -------------------------------------------- */ const CARAC_MAXIMUM_RESOLUTION = 40; /* -------------------------------------------- */ @@ -157,7 +160,7 @@ export class RdDResolutionTable { } /* -------------------------------------------- */ - static replaceParticuliereDemiSurprise(chances){ + static replaceParticuliereDemiSurprise(chances) { foundry.utils.mergeObject(chances, reussites.find(x => x.code == 'part'), { overwrite: true }); } @@ -165,7 +168,7 @@ export class RdDResolutionTable { static significativeRequise(chances) { chances.roll = Math.min(chances.part + 1, chances.sign) foundry.utils.mergeObject(chances, reussites.find(x => x.code == 'sign'), { overwrite: true }); - } + } /* -------------------------------------------- */ static succesRequis(chances) { @@ -197,6 +200,7 @@ export class RdDResolutionTable { if (chances.norm < roll * diviseur) { return reussiteInsuffisante } + return reussiteSignificative } return reussite } diff --git a/module/roll/roll-basic-parts.mjs b/module/roll/roll-basic-parts.mjs index 513470a0..8e5365e2 100644 --- a/module/roll/roll-basic-parts.mjs +++ b/module/roll/roll-basic-parts.mjs @@ -26,7 +26,7 @@ export class RollBasicParts { static loadSurprise(who, forceRequise) { if (who?.actor) { foundry.utils.mergeObject(who, - StatusEffects.getActorEffetSurprise(who.actor, forceRequise), + StatusEffects.getActorEffetSurprise(who.actor), { overwrite: true, inPlace: true }) } } diff --git a/module/roll/roll-part-attaque.mjs b/module/roll/roll-part-attaque.mjs index ccf27bc4..20b0c52b 100644 --- a/module/roll/roll-part-attaque.mjs +++ b/module/roll/roll-part-attaque.mjs @@ -5,6 +5,7 @@ import { PART_CARAC } from "./roll-part-carac.mjs" import { PART_COMP } from "./roll-part-comp.mjs" import { PART_DIFF } from "./roll-part-diff.mjs" import { RollPartSelect } from "./roll-part-select.mjs" +import { PART_SIGN } from "./roll-part-sign.mjs" import { ROLLDIALOG_SECTION } from "./roll-part.mjs" export const PART_ATTAQUE = 'attaque' @@ -111,7 +112,9 @@ export class RollPartAttaque extends RollPartSelect { part.setDiff(rollData, { type: DIFF.ATTAQUE, value: current.initialDiff }) current.initialDiff = undefined } + break } + case PART_SIGN: return part.setArme(rollData, false, current.forceRequise) } } return undefined diff --git a/module/roll/roll-part-defense.mjs b/module/roll/roll-part-defense.mjs index 63ef5dcd..88a0c595 100644 --- a/module/roll/roll-part-defense.mjs +++ b/module/roll/roll-part-defense.mjs @@ -101,7 +101,7 @@ export class RollPartDefense extends RollPartSelect { case PART_CARAC: return part.filterCaracs(rollData, [current.carac]) case PART_COMP: return part.filterComps(rollData, [current.comp?.name]) case PART_DIFF: return part.setDiff(rollData, this.getDiffDefense(rollData)) - case PART_SIGN: return part.setArmeDisparate(rollData, this.isArmeDisparate(rollData)) + case PART_SIGN: return part.setArme(rollData, this.isArmeDisparate(rollData), current.forceRequise) } } return undefined diff --git a/module/roll/roll-part-sign.mjs b/module/roll/roll-part-sign.mjs index 12ec40ba..3fd26a2d 100644 --- a/module/roll/roll-part-sign.mjs +++ b/module/roll/roll-part-sign.mjs @@ -40,8 +40,8 @@ export class RollPartSign extends RollPart { const isCombat = this.isCombat(rollData) const current = this.getCurrent(rollData) current.armeDisparate = isCombat && current.armeDisparate - current.surprise = actor.getSurprise(isCombat) // TODO: could be from rollData.active.surprise?? - current.reasons = actor.getEffects(it => StatusEffects.niveauSurprise(it) > 0) + current.surprise = actor.getSurprise(isCombat, current.forceRequise ?? 0) + current.reasons = actor.getEffects(it => StatusEffects.niveauSurprise(it, isCombat) > 0, current.forceRequise ?? 0) .map(it => { return { img: it.img, label: game.i18n.localize(it.name) } }) current.diviseur = 1 if (current.surprise == 'demi') { @@ -102,7 +102,9 @@ export class RollPartSign extends RollPart { }) } - setArmeDisparate(rollData, armeDisparate) { - this.getCurrent(rollData).armeDisparate = armeDisparate + setArme(rollData, armeDisparate, forceRequise) { + const current = this.getCurrent(rollData) + current.armeDisparate = armeDisparate + current.forceRequise = forceRequise } } \ No newline at end of file diff --git a/module/settings/status-effects.js b/module/settings/status-effects.js index 0f8e8a9d..74589c8c 100644 --- a/module/settings/status-effects.js +++ b/module/settings/status-effects.js @@ -84,8 +84,8 @@ export class StatusEffects extends FormApplication { ) } - static getActorEffetSurprise(actor, forceRequise) { - const effets = actor?.getEffects(StatusEffects.isSurprise, forceRequise) ?? [] + static getActorEffetSurprise(actor) { + const effets = actor?.getEffects(StatusEffects.isSurprise) ?? [] return { effets: effets, surprise: effets.length > 0