From 450287e4d05d0f3dd3f3d5f3e29558d8462e4c9c Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Mon, 13 Jul 2026 22:57:43 +0200 Subject: [PATCH] [Fix] Summon Wildcard Handling (#2086) --- module/data/action/baseAction.mjs | 3 ++- module/data/fields/action/summonField.mjs | 18 +++++++++-------- module/data/fields/actionField.mjs | 4 ++-- module/documents/tokenManager.mjs | 24 +++++++++++++---------- templates/ui/chat/action.hbs | 6 +++--- 5 files changed, 31 insertions(+), 24 deletions(-) diff --git a/module/data/action/baseAction.mjs b/module/data/action/baseAction.mjs index be7224cd..5b871c9a 100644 --- a/module/data/action/baseAction.mjs +++ b/module/data/action/baseAction.mjs @@ -256,7 +256,8 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel if (Hooks.call(`${CONFIG.DH.id}.postUseAction`, this, config) === false) return; - if (this.chatDisplay && !config.skips.createMessage && !config.actionChatMessageHandled) await this.toChat(); + if (this.chatDisplay && !config.skips.createMessage && !config.actionChatMessageHandled) + await this.toChat(null, config); return config; } diff --git a/module/data/fields/action/summonField.mjs b/module/data/fields/action/summonField.mjs index 6845d2ba..fef6625a 100644 --- a/module/data/fields/action/summonField.mjs +++ b/module/data/fields/action/summonField.mjs @@ -23,7 +23,7 @@ export default class DHSummonField extends fields.ArrayField { super(summonFields, options, context); } - static async execute() { + static async execute(config) { if (!canvas.scene) { ui.notifications.warn(game.i18n.localize('DAGGERHEART.ACTIONS.TYPES.summon.error')); return; @@ -36,6 +36,7 @@ export default class DHSummonField extends fields.ArrayField { const rolls = []; const summonData = []; + const chatMessageData = []; for (const summon of this.summon) { const roll = new Roll(itemAbleRollParse(summon.count, this.actor, this.item)); await roll.evaluate(); @@ -54,17 +55,18 @@ export default class DHSummonField extends fields.ArrayField { tokenPreviewName: `${actor.prototypeToken.name}${remaining > 1 ? ` (${remaining}x)` : ''}` }); } + + chatMessageData.push({ + data: actor, + quantity: countNumber + }); } if (rolls.length) await triggerChatRollFx(rolls); this.actor.sheet?.minimize(); - DHSummonField.handleSummon(summonData, this.actor); - } - - static async handleSummon(summonData, actionActor) { - await CONFIG.ux.TokenManager.createTokensWithPreview(summonData, { elevation: actionActor.token?.elevation }); - - return actionActor.sheet?.maximize(); + await CONFIG.ux.TokenManager.createTokensWithPreview(summonData, { elevation: this.actor.token?.elevation }); + this.actor.sheet?.maximize(); + config.summonData = chatMessageData; } } diff --git a/module/data/fields/actionField.mjs b/module/data/fields/actionField.mjs index 83672c8e..af8f338e 100644 --- a/module/data/fields/actionField.mjs +++ b/module/data/fields/actionField.mjs @@ -269,7 +269,7 @@ export function ActionMixin(Base) { return this.delete(); } - async toChat(origin) { + async toChat(origin, config) { const autoExpandDescription = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance) .expandRollMessage?.desc; @@ -282,7 +282,7 @@ export function ActionMixin(Base) { img: this.baseAction ? this.parent.parent.img : this.img, tags: this.tags ? this.tags : ['Spell', 'Arcana', 'Lv 10'], areas: this.areas, - summon: this.summon + summon: config?.summonData }, source: { actor: this.actor.uuid, diff --git a/module/documents/tokenManager.mjs b/module/documents/tokenManager.mjs index 7678d2c7..062a22ee 100644 --- a/module/documents/tokenManager.mjs +++ b/module/documents/tokenManager.mjs @@ -19,10 +19,10 @@ export default class DhTokenManager { } } - return await canvas.tokens.placeTokens( + const placedData = await canvas.tokens.placeTokens( [ { - ...actor.prototypeToken.toObject(), + ...(await actor.getTokenDocument()).toObject(), actorId: actor.id, displayName: 50, ...tokenData @@ -30,6 +30,8 @@ export default class DhTokenManager { ], { create: false } ); + + return placedData[0] ?? null; } /** @@ -46,22 +48,24 @@ export default class DhTokenManager { const createElevation = elevation ?? level.elevation.bottom; for (const tokenData of tokensData) { - const previewTokens = await this.createPreview(tokenData.actor, { + const previewToken = await this.createPreview(tokenData.actor, { name: tokenData.tokenPreviewName, level: game.user.viewedLevel, elevation: createElevation, flags: { daggerheart: { createPlacement: true } } }); - if (!previewTokens?.length) return null; + if (!previewToken) return null; + + const finalTokenData = { + ...previewToken.toObject(), + name: tokenData.actor.prototypeToken.name, + displayName: tokenData.actor.prototypeToken.displayName, + flags: tokenData.actor.prototypeToken.flags + }; await canvas.scene.createEmbeddedDocuments( 'Token', - previewTokens.map(x => ({ - ...x.toObject(), - name: tokenData.actor.prototypeToken.name, - displayName: tokenData.actor.prototypeToken.displayName, - flags: tokenData.actor.prototypeToken.flags - })), + [finalTokenData], { controlObject: true, parent: canvas.scene } ); } diff --git a/templates/ui/chat/action.hbs b/templates/ui/chat/action.hbs index 51840363..d9ceb417 100644 --- a/templates/ui/chat/action.hbs +++ b/templates/ui/chat/action.hbs @@ -16,10 +16,10 @@ {{#each action.summon}}