let effect = args[0]; let targets = args[1]; let extra = args[2]; if (!extra) { extra = {}; } if (!extra.name) { extra.name = effect.label } if (!extra.duration) { extra.duration = effect.duration.rounds } if (!extra.startMessage) { extra.startMessage = `${effect.label}'s effects start` } if (!extra.endMessage) { extra.endMessage = `${effect.label}'s effects end` } if (!extra.fadeMessage) { extra.fadeMessage = `${effect.label}'s effects start to fade` } if (canvas.tokens.controlled.length == 0) { ui.notifications.error("No tokens selected"); return; } for (let tgt of targets) { let actor = tgt.actor; let active = actor.effects.find(i => i.data.label === effect.label); let chatData = { speaker: ChatMessage.getSpeaker(tgt), type: CONST.CHAT_MESSAGE_TYPES.OTHER, emote: true } if (extra.flavor) { chatData.flavor = extra.flavor; } if (active) { await tgt.toggleEffect(effect, { active: false }) chatData.content = extra.endMessage; } else { await tgt.toggleEffect(effect, { active: true }) chatData.content = extra.startMessage; } if (chatData.content) { ChatMessage.create(chatData); } } if (game.combat && extra.duration) { let alertData = { round: extra.duration-1, roundAbsolute: false, turnId: game.combat.combatant._id, message: extra.fadeMessage } await TurnAlert.create(alertData); const targetIds = targets.map(t => t.id); alertData = { round: extra.duration-1, roundAbsolute: false, turnId: game.combat.combatant._id, endOfTurn: true, message: extra.endMessage, macro: "CancelSpellEffect", args: [effect, targetIds] } await TurnAlert.create(alertData); }