70 lines
1.8 KiB
JavaScript

import {
MODULE_ID,
EFFECT_FLAG,
ADAPTATION_CONFIG,
ADAPTATION_TYPES,
PROFANE_DAMAGE_TYPES,
PROFANE_BYPASSES
} from "./constants.js";
import { getDamageTypeLabel } from "./utils.js";
export async function removeOldAdaptiveEffects(actor) {
const oldEffects = actor.effects.filter(effect => effect.getFlag(MODULE_ID, EFFECT_FLAG));
if (!oldEffects.length) return;
await actor.deleteEmbeddedDocuments("ActiveEffect", oldEffects.map(effect => effect.id));
}
function getAdaptiveChanges(config, damageType) {
const changes = [
{
key: config.traitKey,
mode: CONST.ACTIVE_EFFECT_MODES.ADD,
value: damageType,
priority: 20
}
];
if (PROFANE_DAMAGE_TYPES.includes(damageType)) {
const bypassKey = config.traitKey.replace(/\.value$/, ".bypasses");
for (const bypass of PROFANE_BYPASSES) {
changes.push({
key: bypassKey,
mode: CONST.ACTIVE_EFFECT_MODES.ADD,
value: bypass,
priority: 20
});
}
}
return changes;
}
export async function createAdaptiveEffect(actor, damageType, adaptationType = ADAPTATION_TYPES.RESISTANCE) {
const config = ADAPTATION_CONFIG[adaptationType] ?? ADAPTATION_CONFIG[ADAPTATION_TYPES.RESISTANCE];
const label = getDamageTypeLabel(damageType);
await actor.createEmbeddedDocuments("ActiveEffect", [
{
name: game.i18n.format(config.effectNameKey, { type: label }),
icon: config.icon,
disabled: false,
transfer: false,
flags: {
[MODULE_ID]: {
[EFFECT_FLAG]: {
adaptationType: config.id,
damageType
}
}
},
changes: getAdaptiveChanges(config, damageType)
}
]);
}
export async function createAdaptiveResistanceEffect(actor, damageType) {
return createAdaptiveEffect(actor, damageType, ADAPTATION_TYPES.RESISTANCE);
}