import { MODULE_ID } from "../constants.js"; export async function executeApplyStatusAction(action, context) { const actor = context.targetTokenDocument?.actor ?? context.tokenDocument?.actor ?? context.targetActor ?? context.actor; if (!actor) return { success: false, consumed: false, reason: "NO_ACTOR" }; const statuses = action.statuses ?? []; if (!statuses.length) return { success: false, consumed: false, reason: "NO_STATUSES" }; const effects = statuses.map(statusId => buildStatusEffectData(statusId, action, context)); await actor.createEmbeddedDocuments("ActiveEffect", effects); return { success: true, consumed: true }; } function buildStatusEffectData(statusId, action, context) { const statusConfig = getStatusEffectConfig(statusId); return { name: statusConfig?.name ? game.i18n.localize(statusConfig.name) : statusId, icon: statusConfig?.img ?? "icons/svg/aura.svg", statuses: [statusId], origin: context.reactionOrigin, duration: buildEffectDuration(action.duration), changes: [], flags: { [MODULE_ID]: { managed: true, reactionId: context.reaction.id, actionId: action.id } } }; } function getStatusEffectConfig(statusId) { const statusEffects = CONFIG.statusEffects ?? []; if (statusEffects instanceof Map) return statusEffects.get(statusId); return statusEffects.find(status => status.id === statusId); } function buildEffectDuration(duration) { if (!duration || duration.type === "unlimited") return {}; if (duration.type === "rounds") { return { rounds: Number(duration.value) || 1, startRound: game.combat?.round, startTurn: game.combat?.turn }; } if (duration.type === "minutes") { return { seconds: (Number(duration.value) || 1) * 60, startTime: game.time.worldTime }; } return {}; }