configurable-reactions/scripts/actions/apply-status-action.js

54 lines
1.5 KiB
JavaScript

import { MODULE_ID } from "../constants.js";
export async function executeApplyStatusAction(action, context) {
const 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 => {
const statusConfig = CONFIG.statusEffects.find(status => status.id === 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
}
}
};
});
await actor.createEmbeddedDocuments("ActiveEffect", effects);
return { success: true, consumed: true };
}
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 {};
}