From 5da5cb0314014bf7ed4eb1fd087cd8d8144cc418 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Thu, 16 Oct 2025 00:33:24 +0200 Subject: [PATCH] Gestion des maladresses --- assets/ui/maladresse.svg | 1 + module/rdd-resolution-table.js | 7 ++++- module/roll/chat-roll-result.mjs | 33 +++++++++++++++++++- module/roll/roll-dialog-adapter.mjs | 7 +++++ module/roll/roll-part-attaque.mjs | 8 ----- module/roll/roll-part-defense.mjs | 3 -- module/roll/roll-type-attaque.mjs | 1 - templates/roll/result/chat-attaque.hbs | 10 ++---- templates/roll/result/chat-defense.hbs | 2 +- templates/roll/result/partial-maladresse.hbs | 13 ++++++++ 10 files changed, 63 insertions(+), 22 deletions(-) create mode 100644 assets/ui/maladresse.svg create mode 100644 templates/roll/result/partial-maladresse.hbs diff --git a/assets/ui/maladresse.svg b/assets/ui/maladresse.svg new file mode 100644 index 00000000..62aa72b8 --- /dev/null +++ b/assets/ui/maladresse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/module/rdd-resolution-table.js b/module/rdd-resolution-table.js index 18c7545f..b3adb522 100644 --- a/module/rdd-resolution-table.js +++ b/module/rdd-resolution-table.js @@ -156,11 +156,16 @@ export class RdDResolutionTable { } } + /* -------------------------------------------- */ + static replaceParticuliereDemiSurprise(chances){ + foundry.utils.mergeObject(chances, reussites.find(x => x.code == 'part'), { overwrite: true }); + } + /* -------------------------------------------- */ 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) { diff --git a/module/roll/chat-roll-result.mjs b/module/roll/chat-roll-result.mjs index 3e3653d5..8ebd592e 100644 --- a/module/roll/chat-roll-result.mjs +++ b/module/roll/chat-roll-result.mjs @@ -9,6 +9,9 @@ import { EMPOIGNADE } from "../item/arme.js" import { RdDTextEditor } from "../apps/rdd-text-roll-editor.js" import { RollTypeCuisine } from "./roll-type-cuisine.mjs" import { RollTypeMeditation } from "./roll-type-meditation.mjs" +import { PART_DEFENSE } from "./roll-part-defense.mjs" +import { PART_ATTAQUE } from "./roll-part-attaque.mjs" +import { RdDRollTables } from "../rdd-rolltables.js" export default class ChatRollResult { static init() { @@ -21,6 +24,7 @@ export default class ChatRollResult { foundry.applications.handlebars.loadTemplates({ 'partial-appel-chance': 'systems/foundryvtt-reve-de-dragon/templates/roll/result/partial-appel-chance.hbs', 'partial-attaque-particuliere': 'systems/foundryvtt-reve-de-dragon/templates/roll/result/partial-attaque-particuliere.hbs', + 'partial-maladresse': 'systems/foundryvtt-reve-de-dragon/templates/roll/result/partial-maladresse.hbs', 'partial-encaissement': 'systems/foundryvtt-reve-de-dragon/templates/roll/result/partial-encaissement.hbs', 'partial-recul-choc': 'systems/foundryvtt-reve-de-dragon/templates/roll/result/partial-recul-choc.hbs', 'partial-info-appel-moral': 'systems/foundryvtt-reve-de-dragon/templates/roll/result/partial-info-appel-moral.hbs', @@ -49,7 +53,7 @@ export default class ChatRollResult { roll.show.chance = this.isAppelChancePossible(roll) roll.show.encaissement = this.isShowEncaissement(roll) roll.show.recul = this.getRecul(roll) - //roll.show.particuliere = roll.show.particuliere ?? [] + roll.show.maladresse = this.getMaladresse(roll) } isAppelChancePossible(roll) { @@ -66,6 +70,23 @@ export default class ChatRollResult { return false } + getMaladresse(roll) { + switch (roll.type.current) { + case ROLL_TYPE_DEFENSE: + if (roll.rolled.isETotal) { + const arme = roll.current[PART_DEFENSE].arme + return arme ? 'avec-arme' : 'sans-arme' + } + break + case ROLL_TYPE_ATTAQUE: + if (roll.rolled.isETotal || (roll.rolled.isEchec && roll.active.surprise == 'demi')) { + const arme = roll.current[PART_ATTAQUE].arme + return arme.system.baseInit > 4 ? 'avec-arme' : 'sans-arme' + } + break + } + return undefined + } getRecul(roll, defender = roll.active.actor, attacker = roll.opponent?.actor) { switch (roll.type.current) { @@ -115,6 +136,7 @@ export default class ChatRollResult { $(html).on("click", '.faire-gouter', event => this.onClickFaireGouter(event)) $(html).on("click", '.monter-tmr-normale', event => this.onClickMonteeTMR(event, 'normal')) $(html).on("click", '.monter-tmr-rapide', event => this.onClickMonteeTMR(event, 'rapide')) + $(html).on("click", '.tirer-maladresse', event => this.onClickTirerMaladresse(event)) } @@ -247,4 +269,13 @@ export default class ChatRollResult { await this.updateChatMessage(chatMessage, savedRoll) } } + async onClickTirerMaladresse(event) { + const chatMessage = ChatUtility.getChatMessage(event) + const typeMaladresse = event.currentTarget.attributes['data-maladresse'].value + const savedRoll = this.loadChatMessageRoll(chatMessage) + await RdDRollTables.getMaladresse({ arme: typeMaladresse == 'avec-arme' }) + savedRoll.type.maladresse = true + savedRoll.type.retry = true + await this.updateChatMessage(chatMessage, savedRoll) + } } \ No newline at end of file diff --git a/module/roll/roll-dialog-adapter.mjs b/module/roll/roll-dialog-adapter.mjs index e9de2eb5..e6252591 100644 --- a/module/roll/roll-dialog-adapter.mjs +++ b/module/roll/roll-dialog-adapter.mjs @@ -27,6 +27,7 @@ export class RollDialogAdapter { RollDialogAdapter.setRollDataRolled(rollData, rolled, rollTitle) RollDialogAdapter.adjustRollDataForV1(rollData) RollDialogAdapter.adjustAttaqueParticuliere(rollData) + RollDialogAdapter.adjustDemiSurprise(rollData) return rolled } @@ -105,6 +106,12 @@ export class RollDialogAdapter { }) } + static adjustDemiSurprise(rollData) { + if (rollData.active.surprise == 'demi' && rollData.rolled.isPart) { + RdDResolutionTable.replaceParticuliereDemiSurprise(rollData.rolled) + } + } + static adjustAttaqueParticuliere(rollData) { if (rollData.type.current != ROLL_TYPE_ATTAQUE || !rollData.rolled.isPart) { return diff --git a/module/roll/roll-part-attaque.mjs b/module/roll/roll-part-attaque.mjs index a9f69731..4eedb0ad 100644 --- a/module/roll/roll-part-attaque.mjs +++ b/module/roll/roll-part-attaque.mjs @@ -50,14 +50,6 @@ export class RollPartAttaque extends RollPartSelect { choices(refs) { return refs.attaques } static $extractAttaque(attaque, actor) { - // const extracted = foundry.utils.mergeObject({ - // key: `${attaque.action}::${attaque.label}`, - // tactique: TACTIQUES[0] - // }, - // attaque - // ) - // return extracted - // extracted.initialDiff = attaque.comp?.system.default_diffLibre ?? 0 attaque.key = `${attaque.action}::${attaque.label}` attaque.tactique = TACTIQUES[0] attaque.initialDiff = attaque.comp?.system.default_diffLibre ?? 0 diff --git a/module/roll/roll-part-defense.mjs b/module/roll/roll-part-defense.mjs index e03dcfb0..5b63e7ef 100644 --- a/module/roll/roll-part-defense.mjs +++ b/module/roll/roll-part-defense.mjs @@ -1,9 +1,6 @@ import { ITEM_TYPES } from "../constants.js" -import { Grammar } from "../grammar.js" import { ATTAQUE_TYPE, RdDItemArme } from "../item/arme.js" -import { RdDBonus } from "../rdd-bonus.js" import { CARACS } from "../rdd-carac.js" -import { StatusEffects } from "../settings/status-effects.js" import { DIFF, ROLL_TYPE_DEFENSE } from "./roll-constants.mjs" import { PART_CARAC } from "./roll-part-carac.mjs" import { PART_COMP } from "./roll-part-comp.mjs" diff --git a/module/roll/roll-type-attaque.mjs b/module/roll/roll-type-attaque.mjs index f761e9be..794e8fb8 100644 --- a/module/roll/roll-type-attaque.mjs +++ b/module/roll/roll-type-attaque.mjs @@ -1,5 +1,4 @@ import { DIFF, ROLL_TYPE_ATTAQUE } from "./roll-constants.mjs" -import { PART_ATTAQUE } from "./roll-part-attaque.mjs" import { RollType } from "./roll-type.mjs" export class RollTypeAttaque extends RollType { diff --git a/templates/roll/result/chat-attaque.hbs b/templates/roll/result/chat-attaque.hbs index 26c7f82f..07fac787 100644 --- a/templates/roll/result/chat-attaque.hbs +++ b/templates/roll/result/chat-attaque.hbs @@ -22,15 +22,10 @@ {{#if (eq current.dmg.mortalite 'empoignade')}} ou {{active.name}} marquera un point d'empoignade {{else if (eq current.dmg.mortalite 'non-mortel')}} - ou encaisser à {{plusMoins current.dmg.total}} (non-mortel) + ou encaisser à {{plusMoins dmg.total}} (non-mortel) {{else}} - {{!-- {{~#if (eq current.dmg.mortalite 'mortel')}} --}} - ou encaisser à {{plusMoins current.dmg.total}} - {{!-- {{~#if (eq current.dmg.mortalite 'cauchemar')}} --}} - {{!-- {{else}} - {{plusMoins dmg.total}} (entités de cauchemar) --}} + ou encaisser à {{plusMoins dmg.total}} {{/if}} - {{#if show.recul}} @@ -65,6 +60,7 @@
{{> 'partial-attaque-particuliere'}} + {{> 'partial-maladresse'}} {{!-- TODO: maladresses --}}
diff --git a/templates/roll/result/chat-defense.hbs b/templates/roll/result/chat-defense.hbs index a16bee1e..dfa1cd4f 100644 --- a/templates/roll/result/chat-defense.hbs +++ b/templates/roll/result/chat-defense.hbs @@ -44,7 +44,7 @@ {{> 'partial-info-appel-moral'}}
- {{!-- TODO: maladresses --}} + {{> 'partial-maladresse'}} {{> 'partial-recul-choc'}} {{> 'partial-encaissement'}}
diff --git a/templates/roll/result/partial-maladresse.hbs b/templates/roll/result/partial-maladresse.hbs new file mode 100644 index 00000000..9f85f7e8 --- /dev/null +++ b/templates/roll/result/partial-maladresse.hbs @@ -0,0 +1,13 @@ +{{#if show.maladresse}} + {{#if type.maladresse}} + + Maladresse! + + {{else}} + + Tirer une maladresse + {{#if (eq show.maladresse 'avec-arme')}}armé{{else}}non armé{{/if}} + + {{/if}} +{{/if}} \ No newline at end of file