configurable-reactions/scripts/engine/consumption-manager.js

55 lines
1.9 KiB
JavaScript

import { MODULE_ID } from "../constants.js";
export async function checkConsumptionAvailable(reaction, context) {
const consumption = reaction.consumption;
if (!consumption?.enabled || consumption.mode === "none") return true;
const document = getUsageDocument(context);
if (!document) return true;
const usage = document.getFlag(MODULE_ID, "usage") ?? {};
const reactionUsage = usage[reaction.id] ?? {};
if (consumption.mode === "perCombat") {
if (!game.combat?.id) return true;
return reactionUsage.combatId !== game.combat.id || (reactionUsage.uses ?? 0) < consumption.maxUses;
}
if (consumption.mode === "perRound") {
if (!game.combat?.id) return true;
return reactionUsage.combatId !== game.combat.id || reactionUsage.round !== game.combat.round || (reactionUsage.uses ?? 0) < consumption.maxUses;
}
if (consumption.mode === "perTurn") {
if (!game.combat?.id) return true;
return reactionUsage.combatId !== game.combat.id || reactionUsage.round !== game.combat.round || reactionUsage.turn !== game.combat.turn || (reactionUsage.uses ?? 0) < consumption.maxUses;
}
return true;
}
export async function consumeReactionUse(reaction, context) {
const consumption = reaction.consumption;
if (!consumption?.enabled || consumption.mode === "none") return;
const document = getUsageDocument(context);
if (!document) return;
const usage = foundry.utils.deepClone(document.getFlag(MODULE_ID, "usage") ?? {});
const current = usage[reaction.id] ?? {};
usage[reaction.id] = {
combatId: game.combat?.id ?? null,
round: game.combat?.round ?? null,
turn: game.combat?.turn ?? null,
uses: (current.uses ?? 0) + 1,
lastUsedAt: Date.now()
};
await document.setFlag(MODULE_ID, "usage", usage);
}
function getUsageDocument(context) {
return context.targetTokenDocument ?? context.tokenDocument ?? context.targetActor ?? context.actor ?? null;
}