55 lines
1.9 KiB
JavaScript
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;
|
|
}
|