From fd3f988a4f88ec2224df75c46dc959d8bb0bcfd2 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Fri, 28 Nov 2025 19:44:06 +0100 Subject: [PATCH] Roll V2 mode possession --- module/actor/base-actor-sang.js | 1 - module/rdd-roll-encaisser.js | 2 +- module/roll/roll-dialog.mjs | 4 ++ module/roll/roll-part-possession.mjs | 79 +++++++++++++++++++++++ module/roll/roll-type-possession.mjs | 2 +- templates/roll/result/chat-possession.hbs | 22 +++++++ templates/roll/roll-part-possession.hbs | 7 ++ 7 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 module/roll/roll-part-possession.mjs create mode 100644 templates/roll/result/chat-possession.hbs create mode 100644 templates/roll/roll-part-possession.hbs diff --git a/module/actor/base-actor-sang.js b/module/actor/base-actor-sang.js index 07922963..74bcc4f5 100644 --- a/module/actor/base-actor-sang.js +++ b/module/actor/base-actor-sang.js @@ -7,7 +7,6 @@ import { RdDDice } from "../rdd-dice.js"; import { RdDItemBlessure } from "../item/blessure.js"; import { ChatUtility } from "../chat-utility.js"; import { Misc } from "../misc.js"; -import { CARACS } from "../rdd-carac.js"; /** * Classe de base pour les acteurs qui peuvent subir des blessures diff --git a/module/rdd-roll-encaisser.js b/module/rdd-roll-encaisser.js index 813b1266..b24c65d4 100644 --- a/module/rdd-roll-encaisser.js +++ b/module/rdd-roll-encaisser.js @@ -16,7 +16,7 @@ export class RdDEncaisser extends Dialog { /* -------------------------------------------- */ constructor(html, actor) { - if (actor.isEntiteNonIncarnee([ENTITE_NONINCARNE])) { + if (actor.isEntiteNonIncarnee()) { throw `${actor.name} est une entité non incarnée et ne peut pas subnir de dommages` } diff --git a/module/roll/roll-dialog.mjs b/module/roll/roll-dialog.mjs index b179bb9e..d5863d87 100644 --- a/module/roll/roll-dialog.mjs +++ b/module/roll/roll-dialog.mjs @@ -48,6 +48,8 @@ import { RollPartEmpoignade } from "./roll-part-empoignade.mjs"; import { RollPartEmpoignadeTaille } from "./roll-part-empoignade-taille.mjs"; import { RollPartEcailles } from "./roll-part-ecailles.mjs"; import { RollPartResistance } from "./roll-part-resistance.mjs"; +import { RollTypePossession } from "./roll-type-possession.mjs"; +import { RollPartPossession } from "./roll-part-possession.mjs"; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api @@ -56,6 +58,7 @@ export const ALL_ROLL_TYPES = [ new RollTypeComp(), new RollTypeTache(), new RollTypeAttaque(), + new RollTypePossession(), new RollTypeDefense(), new RollTypeSort(), new RollTypeMeditation(), @@ -76,6 +79,7 @@ const ROLL_PARTS = [ new RollPartDiff(), new RollPartAttaque(), + new RollPartPossession(), new RollPartDefense(), new RollPartMeditation(), new RollPartSort(), diff --git a/module/roll/roll-part-possession.mjs b/module/roll/roll-part-possession.mjs new file mode 100644 index 00000000..b33a7ab5 --- /dev/null +++ b/module/roll/roll-part-possession.mjs @@ -0,0 +1,79 @@ +import { CATEGORIES_COMPETENCES_CREATURES } from "../item/base-items.js" +import { CARACS } from "../rdd-carac.js" +import { ROLL_TYPE_POSSESSION } from "./roll-constants.mjs" +import { PART_CARAC } from "./roll-part-carac.mjs" +import { PART_COMP } from "./roll-part-comp.mjs" +import { RollPartSelect } from "./roll-part-select.mjs" +import { ROLLDIALOG_SECTION } from "./roll-part.mjs" + +export const PART_POSSESSION = "possession" + +export class RollPartPossession extends RollPartSelect { + + /** TODO: remplacer selectOption par un sélecteur plus sympa (avec image de compétence, par exemple? */ + + get code() { return PART_POSSESSION } + get name() { return 'Possession' } + get section() { return ROLLDIALOG_SECTION.CHOIX } + + visible(rollData) { return this.isRollType(rollData, ROLL_TYPE_POSSESSION) } + + loadRefs(rollData) { + const refs = this.getRefs(rollData) + const selected = this.getSelected(rollData) + refs.all = this.$getActorConjurations(rollData) + refs.isPersonnage = rollData.active.actor.isPersonnage() + refs.isENI = rollData.active.actor.isEntiteNonIncarnee() + + this.$selectPossession(rollData) + } + + choices(refs) { return refs.all } + + $getActorConjurations(rollData) { + const competences = rollData.active.actor.getDraconicOuPossession() + return competences.map(RollPartPossession.extractPossession) + } + + static extractPossession(comp) { + return { + key: comp.id ?? comp.name, + label: `${comp.system.categorie == CATEGORIES_COMPETENCES_CREATURES.possession.key ? 'Possession': 'Conjuration'} (${comp.name})`, + value: comp.system.niveau, + comp: comp + } + } + + prepareContext(rollData) { + this.$selectPossession(rollData) + } + getAjustements(rollData) { + return [] + } + async _onRender(rollDialog, context, options) { + const select = rollDialog.element.querySelector(`roll-section[name="${this.code}"] select[name="select-possession"]`) + + select?.addEventListener("change", e => { + const selectOptions = e.currentTarget.options + const index = selectOptions.selectedIndex + this.$selectPossession(rollDialog.rollData, selectOptions[index]?.value) + rollDialog.render() + }) + } + + $selectPossession(rollData, key) { + this.selectByKey(rollData, key, 0) + } + + impactOtherPart(part, rollData) { + if (this.visible(rollData)) { + const current = this.getCurrent(rollData) + switch (part.code) { + case PART_CARAC: return part.filterCaracs(rollData, [this.getRefs(rollData).isPersonnage ? CARACS.REVE_ACTUEL : CARACS.REVE]) + case PART_COMP: return part.filterComps(rollData, [current.comp?.name]) + } + } + return undefined + } + +} diff --git a/module/roll/roll-type-possession.mjs b/module/roll/roll-type-possession.mjs index 81ba089c..64f1a64a 100644 --- a/module/roll/roll-type-possession.mjs +++ b/module/roll/roll-type-possession.mjs @@ -14,7 +14,7 @@ export class RollTypePossession extends RollType { title(rollData) { const isEntite = this.isEntite(rollData) if (this.isDefense(rollData)) { - return `résiste à la ${isEntite ? 'conjuration' : 'possession'}` + return `résiste à la ${isEntite ? 'conjuration' : 'possession'} de` } return `tente de ${isEntite ? 'posséder' : 'conjurer'}` } diff --git a/templates/roll/result/chat-possession.hbs b/templates/roll/result/chat-possession.hbs new file mode 100644 index 00000000..44377d02 --- /dev/null +++ b/templates/roll/result/chat-possession.hbs @@ -0,0 +1,22 @@ +
+
+ + +
+
+ {{active.name}} possession {{opponent.name}}: {{current}} +
+ +
+ {{> 'partial-infojet'}} +
+ +
+
+ +
+
+ +
+
+
diff --git a/templates/roll/roll-part-possession.hbs b/templates/roll/roll-part-possession.hbs new file mode 100644 index 00000000..62ac46f8 --- /dev/null +++ b/templates/roll/roll-part-possession.hbs @@ -0,0 +1,7 @@ + + + + +