From e6aed2d5545e882b683ecadb76404b068f7b2bd9 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Tue, 30 Dec 2025 01:15:02 +0100 Subject: [PATCH] =?UTF-8?q?Am=C3=A9lioration=20des=20choix=20d'attaque?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog.md | 3 +++ module/combat/distance.mjs | 2 +- module/rdd-bonus.js | 2 +- module/rdd-combat.js | 4 ++++ module/roll/roll-part-attaque.mjs | 27 +++++++++++++++++---------- templates/roll/roll-part-attaque.hbs | 4 +++- 6 files changed, 29 insertions(+), 13 deletions(-) diff --git a/changelog.md b/changelog.md index ae38467e..83710a92 100644 --- a/changelog.md +++ b/changelog.md @@ -6,6 +6,9 @@ - Les conteneurs ouverts sont mis à jour si leur contenu change - Le style des icones d'objets est homogénéisé - Ajout d'icônes: coffre, tissu de soie, parchemin +- Amélioration des choix d'actions de combat + - le choix d'initiative limite les attaques disponibles + - les compétences sont triées dans l'ordre décroissant ## 13.0.26 - La ménagerie d'Illysis diff --git a/module/combat/distance.mjs b/module/combat/distance.mjs index d0ee26f7..3bf7d798 100644 --- a/module/combat/distance.mjs +++ b/module/combat/distance.mjs @@ -13,7 +13,7 @@ export class Distance { } return undefined } - switch (attaque.comp.type) { + switch (attaque.comp?.type) { case ITEM_TYPES.competence: return mapTypeAttaque(attaque.main) case ITEM_TYPES.competencecreature: return mapTypeAttaque(attaque.arme.system.categorie) } diff --git a/module/rdd-bonus.js b/module/rdd-bonus.js index 3541e5b1..7d0915b8 100644 --- a/module/rdd-bonus.js +++ b/module/rdd-bonus.js @@ -70,7 +70,7 @@ export class RdDBonus { dmgParticuliere: RdDBonus._dmgParticuliere(rollData), dmgSurprise: rollData.opponent?.surprise?.dmg ?? 0, mortalite: RdDBonus.mortalite(attaque.dmg?.mortalite, arme?.system.mortalite), - dmgActor: RdDBonus.bonusDmg(actor, attaque.carac.key, dmgArme, attaque.forceRequise), + dmgActor: RdDBonus.bonusDmg(actor, attaque.carac?.key, dmgArme, attaque.forceRequise), dmgForceInsuffisante: Math.min(0, actor.getForce() - (attaque.forceRequise ?? 0)), dmgDiffLibre: ReglesOptionnelles.isUsing('degat-ajout-malus-libre') ? Math.abs(attaque.diff ?? 0) : 0 } diff --git a/module/rdd-combat.js b/module/rdd-combat.js index 4ff555bf..7f3a8fb8 100644 --- a/module/rdd-combat.js +++ b/module/rdd-combat.js @@ -63,6 +63,10 @@ export class RdDCombatManager extends Combat { it.token.id == tokenId ) } + static getRangInitiativeCombatant(actorId, tokenId) { + const combatant = RdDCombatManager.getCombatant(actorId, tokenId) + return combatant?.system.init?.rang + } /* -------------------------------------------- */ async nextRound() { await this.finDeRound(); diff --git a/module/roll/roll-part-attaque.mjs b/module/roll/roll-part-attaque.mjs index f4fb5b4f..59d57330 100644 --- a/module/roll/roll-part-attaque.mjs +++ b/module/roll/roll-part-attaque.mjs @@ -1,8 +1,11 @@ import { Distance } from "../combat/distance.mjs" import { RDD_CONFIG } from "../constants.js" +import { MAP_PHASE, RdDInitiative } from "../initiative.mjs" import { ATTAQUE_TYPE_MELEE } from "../item/arme.js" +import { Misc } from "../misc.js" import { RdDBonus } from "../rdd-bonus.js" import { CARACS } from "../rdd-carac.js" +import { RdDCombatManager } from "../rdd-combat.js" import { RdDEmpoignade } from "../rdd-empoignade.js" import { DIFF, ROLL_TYPE_ATTAQUE, ROLL_TYPE_COMP } from "./roll-constants.mjs" import RollDialog from "./roll-dialog.mjs" @@ -17,9 +20,9 @@ export const PART_ATTAQUE = 'attaque' const TACTIQUES = RdDBonus.tactiques.filter(it => it.isTactique) -const FILTER_ATTAQUE_EMPOIGNADE = attaque => attaque.arme.isEmpoignade() -const FILTER_ATTAQUE_NON_EMPOIGNADE = attaque => !attaque.arme.isEmpoignade() -const FILTER_ATTAQUE_EMPOIGNE = attaque => attaque.arme.isUtilisableEmpoigne() && ATTAQUE_TYPE_MELEE.includes(attaque.main) +const FILTER_ATTAQUE_EMPOIGNADE = attaque => attaque.arme?.isEmpoignade() +const FILTER_ATTAQUE_RANG = rang => attaque => !attaque.arme?.isEmpoignade() && (attaque.rang == rang || rang == undefined) +const FILTER_ATTAQUE_EMPOIGNE = attaque => attaque.arme?.isUtilisableEmpoigne() && ATTAQUE_TYPE_MELEE.includes(attaque.main) export class RollPartAttaque extends RollPartSelect { @@ -33,8 +36,9 @@ export class RollPartAttaque extends RollPartSelect { loadRefs(rollData) { const refs = this.getRefs(rollData) const attaques = rollData.active.actor.listAttaques() + .sort(Misc.descending(it => it.comp?.system.niveau ?? -8)) refs.all = attaques.map(it => RollPartAttaque.$extractAttaque(it, rollData)) - this.filterAttaquesEmpoignade(rollData) + this.filterAttaquesInitiative(rollData) refs.tactiques = TACTIQUES if (refs.attaques.length > 0) { const attaque = this.findAttaque(refs.attaques, this.getSaved(rollData)) @@ -78,24 +82,27 @@ export class RollPartAttaque extends RollPartSelect { attaque.tactique = TACTIQUES[0] attaque.initialDiff = attaque.comp?.system.default_diffLibre ?? 0 attaque.distance = Distance.ajustements(rollData.active?.token, rollData.opponent?.token, attaque) + attaque.rang = RdDInitiative.phaseArme(attaque.comp?.system.categorie, attaque.arme)?.rang return attaque } prepareContext(rollData) { - this.filterAttaquesEmpoignade(rollData) + this.filterAttaquesInitiative(rollData) const current = this.getCurrent(rollData) current.dmg = RdDBonus.dmgRollV2(rollData, current) } - filterAttaquesEmpoignade(rollData) { + filterAttaquesInitiative(rollData) { const refs = this.getRefs(rollData) - const isEmpoignade = RdDEmpoignade.isCombatantEmpoignade(rollData.ids.actorId, rollData.ids.actorTokenId) + const rang = RdDCombatManager.getRangInitiativeCombatant(rollData.ids.actorId, rollData.ids.actorTokenId) + const isEmpoignade = MAP_PHASE.empoignade.rang == rang + //const isEmpoignade = RdDEmpoignade.isCombatantEmpoignade(rollData.ids.actorId, rollData.ids.actorTokenId) refs.isEmpoignadeEnCours = RdDEmpoignade.isEmpoignadeEnCours(rollData.active.actor) const filterAttaques = isEmpoignade ? FILTER_ATTAQUE_EMPOIGNADE : refs.isEmpoignadeEnCours ? FILTER_ATTAQUE_EMPOIGNE - : FILTER_ATTAQUE_NON_EMPOIGNADE + : FILTER_ATTAQUE_RANG(rang) refs.attaques = refs.all.filter(filterAttaques) } @@ -168,8 +175,8 @@ export class RollPartAttaque extends RollPartSelect { if (this.visible(rollData)) { const current = this.getCurrent(rollData) switch (part.code) { - case PART_CARAC: return part.filterCaracs(rollData, [current.carac.key]) - case PART_COMP: return part.filterComps(rollData, [current.comp.name]) + case PART_CARAC: return part.filterCaracs(rollData, [current.carac?.key]) + case PART_COMP: return part.filterComps(rollData, [current.comp?.name]) case PART_DIFF: { if (Distance.typeAttaqueDistance(current)) { part.setDiff(rollData, { type: DIFF.DEFAUT }) diff --git a/templates/roll/roll-part-attaque.hbs b/templates/roll/roll-part-attaque.hbs index c5dc9af7..4cdf191b 100644 --- a/templates/roll/roll-part-attaque.hbs +++ b/templates/roll/roll-part-attaque.hbs @@ -1,3 +1,4 @@ +{{#if current.key}}