From 77f2de2c5f0a9cca0096d2b39e0a50e863327c3a Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sun, 19 Oct 2025 23:45:30 +0200 Subject: [PATCH] =?UTF-8?q?Jet=20V2=20pour=20les=20cr=C3=A9atures?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog.md | 5 ++ module/actor.js | 6 +- module/actor/base-actor-reve.js | 65 +++++++++++----------- module/actor/base-actor-sheet.js | 3 +- module/actor/export-scriptarium/mapping.js | 5 +- module/item-competencecreature.js | 4 +- module/rdd-combat.js | 2 - module/roll/roll-constants.mjs | 2 +- module/roll/roll-part-attaque.mjs | 2 +- module/roll/roll-part-carac.mjs | 17 ++++-- module/roll/roll-part-meditation.mjs | 9 +-- templates/actor/combat.hbs | 2 +- templates/roll/result/chat-attaque.hbs | 3 +- templates/roll/result/chat-comp.hbs | 3 +- templates/roll/result/chat-cuisine.hbs | 3 +- templates/roll/result/chat-defense.hbs | 3 +- templates/roll/result/chat-jeu.hbs | 3 +- templates/roll/result/chat-meditation.hbs | 3 +- templates/roll/result/chat-oeuvre.hbs | 3 +- templates/roll/result/chat-sort.hbs | 3 +- templates/roll/result/chat-tache.hbs | 3 +- templates/roll/result/partial-infojet.hbs | 6 ++ 22 files changed, 83 insertions(+), 72 deletions(-) diff --git a/changelog.md b/changelog.md index bd15a1c3..3adce903 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,9 @@ # 13.0 +## 13.0.14 - Le familier d'Illysis + +- Nouvelle fenêtre de jets de dés + - Attaque/défense des créatures + ## 13.0.13 - L'épanouissement d'Illysis - Fix d'erreur au chargement de templates RollDialog diff --git a/module/actor.js b/module/actor.js index 914aa630..24368810 100644 --- a/module/actor.js +++ b/module/actor.js @@ -186,12 +186,12 @@ export class RdDActor extends RdDBaseActorSang { const uniques = [] const addAttaque = (arme, main = undefined, action = 'attaque') => { - const dommagesArme = RdDItemArme.valeurMain(arme.system.dommages, main) + const dommages = RdDItemArme.valeurMain(arme.system.dommages, main) const forceRequise = RdDItemArme.valeurMain(arme.system.force ?? 0, main) const ecaillesEfficacite = arme.system.magique ? arme.system.ecaille_efficacite : 0; const comp = this.getCompetence(RdDActor.$getCompetenceAction(arme, main)) - const unique = [comp.id, arme.name, dommagesArme, forceRequise, ecaillesEfficacite].join('|'); + const unique = [comp.id, arme.name, dommages, forceRequise, ecaillesEfficacite].join('|'); if (uniques.includes(unique)) { return } @@ -212,7 +212,7 @@ export class RdDActor extends RdDBaseActorSang { main: main, carac: { key: caracCode, value: caracValue }, equipe: arme.system.equipe, - dommagesArme: dommagesArme, + dommages: dommages, forceRequise: forceRequise, initiative: RdDInitiative.getRollInitiative(caracValue, niveau, ajustement) }) diff --git a/module/actor/base-actor-reve.js b/module/actor/base-actor-reve.js index 65dd8f57..9193dd5d 100644 --- a/module/actor/base-actor-reve.js +++ b/module/actor/base-actor-reve.js @@ -176,10 +176,11 @@ export class RdDBaseActorReve extends RdDBaseActor { } getCompetences(name = undefined, options = { onMessage: message => { } }) { + const all = [...this.itemTypes[ITEM_TYPES.competence], ...this.itemTypes[ITEM_TYPES.competencecreature]] if (name == undefined) { - return this.itemTypes[ITEM_TYPES.competence] + return all } - return RdDItemCompetence.findCompetences(this.itemTypes[ITEM_TYPES.competence], name, options) + return RdDItemCompetence.findCompetences(all, name, options) } getCompetenceCorpsACorps(options = { onMessage: message => { } }) { @@ -246,10 +247,10 @@ export class RdDBaseActorReve extends RdDBaseActor { if (this.isEffectAllowed(statusId)) { const effect = this.getEffectByStatus(statusId); if (!status && effect) { - await this.deleteEmbeddedDocuments('ActiveEffect', [effect.id], { render: true}) + await this.deleteEmbeddedDocuments('ActiveEffect', [effect.id], { render: true }) } if (status && !effect) { - await this.createEmbeddedDocuments("ActiveEffect", [StatusEffects.prepareActiveEffect(statusId)], { render: true}) + await this.createEmbeddedDocuments("ActiveEffect", [StatusEffects.prepareActiveEffect(statusId)], { render: true }) } } } @@ -309,6 +310,22 @@ export class RdDBaseActorReve extends RdDBaseActor { async rollCaracCompetence(caracName, compName, diff, options = { title: "" }) { RdDEmpoignade.checkEmpoignadeEnCours(this) + + if (OptionsAvancees.isUsing(ROLL_DIALOG_V2)) { + const competence = this.getCompetence(compName); + const rollData = { + ids: { actorId: this.id }, + type: { allowed: DEFAULT_ROLL_TYPES, current: PART_COMP }, + selected: { + carac: { key: caracName }, + comp: { key: competence.name }, + diff: { value: diff } + } + } + RollDialog.create(rollData, options) + return + } + const competence = this.getCompetence(compName); await this.openRollDialog({ name: 'jet-competence', @@ -423,32 +440,22 @@ export class RdDBaseActorReve extends RdDBaseActor { await RdDRollResult.displayRollData(rollData, this, 'chat-resultat-general.hbs'); } - /* -------------------------------------------- */ - async rollCompetenceV2(rollData) { - rollData.ids = rollData?.ids ?? {} - rollData.type = rollData.type ?? { allowed: DEFAULT_ROLL_TYPES } - rollData.ids.actorId = this.id - await RollDialog.create(rollData) - } - async rollCompetence(idOrName, options = { tryTarget: true, arme: undefined }) { RdDEmpoignade.checkEmpoignadeEnCours(this) const competence = this.getCompetence(idOrName); - if (competence.type != ITEM_TYPES.competencecreature && OptionsAvancees.isUsing(ROLL_DIALOG_V2)) { + if (OptionsAvancees.isUsing(ROLL_DIALOG_V2)) { const rollData = { + ids: { actorId: this.id }, + type: { allowed: options.arme ? ATTAQUE_ROLL_TYPES : DEFAULT_ROLL_TYPES }, selected: { + carac: competence.type == ITEM_TYPES.competencecreature ? { key: competence.name } : undefined, comp: { key: competence.name }, - diff: { type: DIFF.LIBRE, value: competence.system.default_diffLibre ?? 0 } + diff: { type: options.arme ? DIFF.ATTAQUE : DIFF.LIBRE, value: competence.system.default_diffLibre ?? 0 }, + attaque: options.arme ? { arme: { key: options.arme.id } } : undefined } } - if (options.arme) { - rollData.selected.attaque = { arme: { id: options.arme.id }, comp: { id: competence.id } } - rollData.type = { allowed: ATTAQUE_ROLL_TYPES } - } - - await this.rollCompetenceV2(rollData) - return + return await RollDialog.create(rollData) } let rollData = { @@ -512,19 +519,13 @@ export class RdDBaseActorReve extends RdDBaseActor { title: 'Ne pas utiliser les automatisation de combat', buttonLabel: "Pas d'automatisation", onAction: async () => { - this.rollCompetenceV2({ - ids: { - actorId: this.id, - actorTokenId: token?.id, - }, - selected: { - conditions: { value: 0 } - }, + const rollData = { + ids: { actorId: this.id, actorTokenId: token?.id, }, type: { - allowed: [ROLL_TYPE_COMP, ROLL_TYPE_ATTAQUE, ROLL_TYPE_OEUVRE, ROLL_TYPE_TACHE, ROLL_TYPE_JEU], - current: ROLL_TYPE_COMP + allowed: [ROLL_TYPE_ATTAQUE], current: ROLL_TYPE_ATTAQUE } - }) + }; + return await RollDialog.create(rollData) } }) } diff --git a/module/actor/base-actor-sheet.js b/module/actor/base-actor-sheet.js index bdbca38f..8be9575a 100644 --- a/module/actor/base-actor-sheet.js +++ b/module/actor/base-actor-sheet.js @@ -56,8 +56,7 @@ export class RdDBaseActorSheet extends foundry.appv1.sheets.ActorSheet { this._appliquerRechercheObjets(formData.conteneurs, formData.inventaires); formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs); formData.competences.filter(it => it.type == ITEM_TYPES.competencecreature) - .forEach(it => it.isdommages = it.isDommages() - ) + .forEach(it => it.isdommages = it.isDommages()) return formData; } diff --git a/module/actor/export-scriptarium/mapping.js b/module/actor/export-scriptarium/mapping.js index 3b0fa256..b16ca758 100644 --- a/module/actor/export-scriptarium/mapping.js +++ b/module/actor/export-scriptarium/mapping.js @@ -160,7 +160,7 @@ export class Mapping { return undefined } const categorie = Mapping.complementCategorie(arme, maniement) - const dommages = Mapping.dommagesArme(actor, arme, maniement) + const dommages = Mapping.dommages(actor, arme, maniement) return { name: arme.name + categorie, niveau: Misc.toSignedString(competence.system.niveau), @@ -170,7 +170,8 @@ export class Mapping { arme: arme } } - static dommagesArme(actor, arme, maniement) { + + static dommages(actor, arme, maniement) { const dmgArme = RdDItemArme.dommagesReels(arme, maniement) const dommages = Misc.toSignedString(dmgArme + RdDBonus.bonusDmg(actor, maniement, dmgArme)) switch (arme.system.mortalite) { diff --git a/module/item-competencecreature.js b/module/item-competencecreature.js index 35519b3f..80b735e6 100644 --- a/module/item-competencecreature.js +++ b/module/item-competencecreature.js @@ -32,6 +32,7 @@ export class RdDItemCompetenceCreature extends RdDItem { initiative: initative, mortalite: this.system.mortalite, dommages: this.system.dommages, + forceRequise: 0, equipe: true, resistance: 100, penetration: 0, @@ -43,7 +44,8 @@ export class RdDItemCompetenceCreature extends RdDItem { carac: { key: this.name, value: this.system.carac_value }, equipe: true, mortalite: this.system.mortalite, - dmg: this.system.dommages, + dommages: this.system.dommages, + //dmg: this.system.dommages, initiative: initative }; return attaque diff --git a/module/rdd-combat.js b/module/rdd-combat.js index 6bb9c2b0..58f01421 100644 --- a/module/rdd-combat.js +++ b/module/rdd-combat.js @@ -727,8 +727,6 @@ export class RdDCombat { RollBasicParts.loadSurprises(attackerRoll) attackerRoll.passeArme = attackerRoll.passeArme ?? foundry.utils.randomID(16) attackerRoll.dmg = RdDBonus.dmgRollV2(attackerRoll, attackerRoll.current.attaque) - // attackerRoll.current.attaque.dmg = attackerRoll.dmg - // attaque.dmg = attackerRoll.current.attaque.dmg const attaque = RollDialog.saveParts(attackerRoll) const defense = { attackerRoll: attaque, diff --git a/module/roll/roll-constants.mjs b/module/roll/roll-constants.mjs index 5a44584b..d99d3760 100644 --- a/module/roll/roll-constants.mjs +++ b/module/roll/roll-constants.mjs @@ -12,7 +12,7 @@ export const ROLL_TYPE_TACHE = 'tache' export const ATTAQUE_ROLL_TYPES = [ROLL_TYPE_ATTAQUE] export const COMBAT_ROLL_TYPES = [ROLL_TYPE_ATTAQUE, ROLL_TYPE_DEFENSE] export const DEMIREVE_ROLL_TYPES = [ROLL_TYPE_SORT] -export const DEFAULT_ROLL_TYPES = [ROLL_TYPE_COMP, ROLL_TYPE_TACHE, ROLL_TYPE_MEDITATION, ROLL_TYPE_CUISINE, ROLL_TYPE_OEUVRE, ROLL_TYPE_JEU] +export const DEFAULT_ROLL_TYPES = [ROLL_TYPE_COMP, ROLL_TYPE_ATTAQUE, ROLL_TYPE_TACHE, ROLL_TYPE_MEDITATION, ROLL_TYPE_CUISINE, ROLL_TYPE_OEUVRE, ROLL_TYPE_JEU] export const DIFF = { diff --git a/module/roll/roll-part-attaque.mjs b/module/roll/roll-part-attaque.mjs index 5519ede1..914260e8 100644 --- a/module/roll/roll-part-attaque.mjs +++ b/module/roll/roll-part-attaque.mjs @@ -36,7 +36,7 @@ export class RollPartAttaque extends RollPartSelect { restore(rollData) { const saved = this.getSaved(rollData) super.restore(rollData) - if (saved.dmg) { + if (saved.dmg != undefined) { this.getCurrent(rollData).dmg = this.getSaved(rollData).dmg } } diff --git a/module/roll/roll-part-carac.mjs b/module/roll/roll-part-carac.mjs index b143859f..065549ca 100644 --- a/module/roll/roll-part-carac.mjs +++ b/module/roll/roll-part-carac.mjs @@ -12,22 +12,30 @@ export class RollPartCarac extends RollPartSelect { loadRefs(rollData) { const refs = this.getRefs(rollData) - refs.all = this.$getActorCaracs(rollData) + const actor = rollData.active.actor + refs.all = [...this.$getActorCaracs(actor), ...this.$getCaracCompetenceCreature(actor)] refs.caracs = refs.all this.$selectCarac(rollData) } choices(refs) { return refs.caracs } - $getActorCaracs(rollData) { - return Object.entries(rollData.active.actor.getCarac()) + $getActorCaracs(actor) { + return Object.entries(actor.getCarac()) .filter(([key, c]) => key != 'taille') - /* TODO: filter by context */ .map(([key, carac]) => { return RollPartCarac.$extractCarac(key, carac) }) } + $getCaracCompetenceCreature(actor) { + if (actor.isPersonnage()) { + return [] + } + return actor.getCompetences() + .map(it => { return { key: it.name, label: it.name, value: parseInt(it.system.carac_value) } }) + } + static $extractCarac(key, carac) { return { key: key, @@ -40,7 +48,6 @@ export class RollPartCarac extends RollPartSelect { allowed = allowed.filter(it => it != undefined) const refs = this.getRefs(rollData) refs.caracs = allowed.length > 0 - // ? refs.all.filter(it => allowed.includes(Grammar.toLowerCaseNoAccent(it.key))) ? refs.all.filter(it => allowed.includes(it.key)) : refs.all this.$selectCarac(rollData) diff --git a/module/roll/roll-part-meditation.mjs b/module/roll/roll-part-meditation.mjs index 90b971dd..e892719c 100644 --- a/module/roll/roll-part-meditation.mjs +++ b/module/roll/roll-part-meditation.mjs @@ -1,10 +1,10 @@ import { ITEM_TYPES } from "../constants.js" import { Grammar } from "../grammar.js" -import { CARACS, RdDCarac } from "../rdd-carac.js" +import { CARACS } from "../rdd-carac.js" import { RdDTimestamp } from "../time/rdd-timestamp.js" import { TMRUtility } from "../tmr-utility.js" import { ROLL_TYPE_MEDITATION } from "./roll-constants.mjs" -import { PART_CARAC } from "./roll-part-carac.mjs" +import { PART_CARAC, RollPartCarac } 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" @@ -34,8 +34,9 @@ export class RollPartMeditation extends RollPartSelect { loadRefs(rollData) { const refs = this.getRefs(rollData) - refs.meditations = rollData.active.actor.itemTypes[ITEM_TYPES.meditation] - .map(it => RollPartMeditation.$extractMeditation(it, rollData.active.actor)) + const actor = rollData.active.actor + refs.meditations = actor.itemTypes[ITEM_TYPES.meditation] + .map(it => RollPartMeditation.$extractMeditation(it, actor)) if (refs.meditations.length > 0) { this.$selectMeditation(rollData) diff --git a/templates/actor/combat.hbs b/templates/actor/combat.hbs index 68f686e4..5c32a9f2 100644 --- a/templates/actor/combat.hbs +++ b/templates/actor/combat.hbs @@ -20,7 +20,7 @@ {{>"systems/foundryvtt-reve-de-dragon/templates/item/icon-arme-broken.hbs" action.arme}} {{plusMoins action.comp.system.niveau}} - {{plusMoins action.dommagesArme}} + {{plusMoins action.dommages}} diff --git a/templates/roll/result/chat-attaque.hbs b/templates/roll/result/chat-attaque.hbs index f4c81494..e1502e7f 100644 --- a/templates/roll/result/chat-attaque.hbs +++ b/templates/roll/result/chat-attaque.hbs @@ -10,8 +10,7 @@
- {{current.carac.label}} / {{current.comp.label}} à {{current.diff.value}} -
{{> 'partial-infojet'}} + {{> 'partial-infojet'}}
diff --git a/templates/roll/result/chat-comp.hbs b/templates/roll/result/chat-comp.hbs index b380b32a..080c1030 100644 --- a/templates/roll/result/chat-comp.hbs +++ b/templates/roll/result/chat-comp.hbs @@ -8,8 +8,7 @@
- {{current.carac.label}}{{#unless (eq current.comp.key '')}} / {{current.comp.label}}{{/unless}} à {{current.diff.value}} -
{{> 'partial-infojet'}} + {{> 'partial-infojet'}}
diff --git a/templates/roll/result/chat-cuisine.hbs b/templates/roll/result/chat-cuisine.hbs index a9469c70..0eeba85d 100644 --- a/templates/roll/result/chat-cuisine.hbs +++ b/templates/roll/result/chat-cuisine.hbs @@ -13,8 +13,7 @@
- {{current.carac.label}} / {{current.comp.label}} à {{current.diff.value}} -
{{> "partial-infojet"}} + {{> 'partial-infojet'}}
diff --git a/templates/roll/result/chat-defense.hbs b/templates/roll/result/chat-defense.hbs index 2000cfb8..f9851cc1 100644 --- a/templates/roll/result/chat-defense.hbs +++ b/templates/roll/result/chat-defense.hbs @@ -10,8 +10,7 @@
- {{current.carac.label}} / {{current.comp.label}} à {{current.diff.value}} -
{{> 'partial-infojet'}} + {{> 'partial-infojet'}}
diff --git a/templates/roll/result/chat-jeu.hbs b/templates/roll/result/chat-jeu.hbs index 2b0f53a5..a7246bf2 100644 --- a/templates/roll/result/chat-jeu.hbs +++ b/templates/roll/result/chat-jeu.hbs @@ -8,8 +8,7 @@
- {{current.carac.label}} / {{current.comp.label}} à {{current.diff.value}} -
{{> 'partial-infojet'}} + {{> 'partial-infojet'}}
diff --git a/templates/roll/result/chat-meditation.hbs b/templates/roll/result/chat-meditation.hbs index 1066de5e..5c18e7b2 100644 --- a/templates/roll/result/chat-meditation.hbs +++ b/templates/roll/result/chat-meditation.hbs @@ -8,8 +8,7 @@
- {{current.carac.label}} / {{current.comp.label}} à {{current.diff.value}} -
{{> 'partial-infojet'}} + {{> 'partial-infojet'}}
diff --git a/templates/roll/result/chat-oeuvre.hbs b/templates/roll/result/chat-oeuvre.hbs index f8c9559a..4978ff5c 100644 --- a/templates/roll/result/chat-oeuvre.hbs +++ b/templates/roll/result/chat-oeuvre.hbs @@ -8,8 +8,7 @@
- {{current.carac.label}} / {{current.comp.label}} à {{current.diff.value}} -
{{> 'partial-infojet'}} + {{> 'partial-infojet'}}
diff --git a/templates/roll/result/chat-sort.hbs b/templates/roll/result/chat-sort.hbs index 035a3f3b..5636af5b 100644 --- a/templates/roll/result/chat-sort.hbs +++ b/templates/roll/result/chat-sort.hbs @@ -15,8 +15,7 @@
- {{current.carac.label}} / {{current.comp.label}} à {{current.diff.value}} -
{{> 'partial-infojet'}} + {{> 'partial-infojet'}}

diff --git a/templates/roll/result/chat-tache.hbs b/templates/roll/result/chat-tache.hbs index 6829d90e..31c6206a 100644 --- a/templates/roll/result/chat-tache.hbs +++ b/templates/roll/result/chat-tache.hbs @@ -8,8 +8,7 @@
- {{current.carac.label}} / {{current.comp.label}} à {{current.diff.value}} -
{{> 'partial-infojet'}} + {{> 'partial-infojet'}}
diff --git a/templates/roll/result/partial-infojet.hbs b/templates/roll/result/partial-infojet.hbs index c373383d..18992ba5 100644 --- a/templates/roll/result/partial-infojet.hbs +++ b/templates/roll/result/partial-infojet.hbs @@ -1,3 +1,9 @@ +{{current.carac.label}} +{{#if (and (ne current.comp.key '') (ne current.carac.label current.comp.label))}} + / {{current.comp.label}} +{{/if}} + à {{current.diff.value}} +
{{#if ajustements}}