diff --git a/src/module/powers/basePowers.js b/src/module/powers/basePowers.js index d5d902f..7da8799 100644 --- a/src/module/powers/basePowers.js +++ b/src/module/powers/basePowers.js @@ -171,7 +171,7 @@ export class PowerEffect { await moduleHelpers.socket.executeAsUser( addActiveEffectsToToken, owner.id, - token.scene.id, + token?.scene?.id ?? token.parent.id, token.id, effectDocuments, ); @@ -834,7 +834,7 @@ export class ActorFolderEffect extends PowerEffect { async parseValues() { await super.parseValues(); - this.data.maintid = randomID(); + this.data.maintId = randomID(); this.targetActor = await game.actors.get(this.data.actorId); this.targetTokenDoc = await this.targetActor.getTokenDocument(); const sourceUpdates = { @@ -874,15 +874,17 @@ export class ActorFolderEffect extends PowerEffect { } const activeEffects = await this.secondaryDocsForTarget(secondaryDocs, token); activeEffects.push(await this.primaryDocForTarget(primaryDoc, token)); - promises.push(token.actor.createEmbeddedDocuments('ActiveEffect', activeEffects)); - } - const maintainDoc = await this.createMaintainEffect(this.data.maintId); - if (this.duration > 0) { - promises.push(this.applyActiveEffects(this.source, [maintainDoc])); + promises.push(this.applyActiveEffects(token, activeEffects)); } await Promise.all(promises); } + async createPrimaryEffect(maintId) { + const doc = await super.createPrimaryEffect(maintId); + doc.flags[moduleName].spawnedTempToken = true; + return doc; + } + async sideEffects() { if (this.data.fatigue) { for (const target of this.data.spawned) { diff --git a/src/module/powers/powers.js b/src/module/powers/powers.js index 1c25459..4e150d0 100644 --- a/src/module/powers/powers.js +++ b/src/module/powers/powers.js @@ -187,6 +187,11 @@ export async function powerEffectManagementHook(effect, data, userId) { if (!maintId) { return; } + const isSpawned = effect.getFlag(moduleName, 'spawnedTempToken') ?? false; + if (isSpawned) { + const token = effect.parent.token; + await token.delete(); + } const targetIds = effect.getFlag(moduleName, 'targetIds') || []; for (const targetId of targetIds) { const target = canvas.tokens.get(targetId); diff --git a/src/module/powers/shapeChange.js b/src/module/powers/shapeChange.js index 7d706c0..f3d6c7a 100644 --- a/src/module/powers/shapeChange.js +++ b/src/module/powers/shapeChange.js @@ -135,6 +135,19 @@ export class ShapeChangeEffect extends ActorFolderEffect { return this.source.scene.createEmbeddedDocuments('Token', [this.targetTokenDoc]); } + async apply() { + await super.apply(); + const maintainDoc = await this.createMaintainEffect(this.data.maintId); + maintainDoc.flags[moduleName].targetIds = this.data.spawned.map((t) => t.id); + maintainDoc.flags[moduleName].shapeChangeSourceId = this.target.id; + maintainDoc.flags[moduleName].shapeChangeTempTokenId = this.data.spawned[0].id; + let maintainer = this.source; + if (this.source.id === this.target.id) { + maintainer = this.data.spawned[0]; + } + await this.applyActiveEffects(maintainer, [maintainDoc]); + } + get effectName() { return `Shape Change into ${this.targetActor.prototypeToken.name}`; }