Skip to content
This repository has been archived by the owner on May 16, 2024. It is now read-only.

Fix: Prevent stacking of Effects #18

Closed
wants to merge 5 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
170 changes: 87 additions & 83 deletions dist/VariantEncumbrance.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,17 @@ import { registerSettings } from './module/settings.js';
import { preloadTemplates } from './module/preloadTemplates.js';
import { DND5E } from "../../systems/dnd5e/module/config.js";

/* ------------------------------------ */
/* Constants */
/* ------------------------------------ */
const ENCUMBRANCE_TIERS = {
NONE: 0,
LIGHT: 1,
HEAVY: 2,
MAX: 3,
};


/* ------------------------------------ */
/* Initialize module */
/* ------------------------------------ */
Expand Down Expand Up @@ -72,13 +83,13 @@ Hooks.on('renderActorSheet', function (actorSheet, htmlElement, actorObject) {
encumbranceElements[0].classList.remove("medium");
encumbranceElements[0].classList.remove("heavy");

if (encumbranceData.encumbranceTier == 1) {
if (encumbranceData.encumbranceTier === ENCUMBRANCE_TIERS.LIGHT) {
encumbranceElements[0].classList.add("medium");
}
if (encumbranceData.encumbranceTier == 2) {
if (encumbranceData.encumbranceTier === ENCUMBRANCE_TIERS.HEAVY) {
encumbranceElements[0].classList.add("heavy");
}
if (encumbranceData.encumbranceTier == 3) {
if (encumbranceData.encumbranceTier === ENCUMBRANCE_TIERS.MAX) {
encumbranceElements[0].classList.add("max");
}

Expand Down Expand Up @@ -157,95 +168,88 @@ function updateEncumbrance(actorEntity, itemSet) {
let encumbranceData = calculateEncumbrance(actorEntity, itemSet);
console.log(encumbranceData);

let effectTiersPresent = 0;
let effectTierChanged = false;
let effectEntityPresent = null;

actorEntity.effects.forEach(effectEntity => {
if (effectEntity.data?.flags?.VariantEncumbrance) {
effectTiersPresent++;
if (effectEntity.data?.flags?.VariantEncumbrance?.tier != encumbranceData.encumbranceTier) {
console.log("DELETING");
if (typeof effectEntity.getFlag('VariantEncumbrance', 'tier') === 'number') {
if (!effectEntityPresent) {
effectEntityPresent = effectEntity;
} else {
// Cannot have more than one effect tier present at any one time
console.log("DELETING", effectEntity);
effectEntity.delete();
effectTiersPresent--;
effectTierChanged = true;
}
}
});

console.log("#### VE DEBUG: " + effectTierChanged + " | " + effectTiersPresent);
if (effectTierChanged || effectTiersPresent == 0) {
if (encumbranceData.encumbranceTier != 0) {
let changeMode = encumbranceData.encumbranceTier >= 3 ? 1 : 2;
let changeValue = encumbranceData.encumbranceTier >= 3 ? 0 : encumbranceData.speedDecrease * -1;
if (!game.settings.get("VariantEncumbrance", "useVariantEncumbrance")) {
changeMode = 2;
changeValue = 0;
}
let effectIconURL;
let effectName;
switch (encumbranceData.encumbranceTier) {
case 1:
effectName = "Lightly Encumbered";
break;
case 2:
effectName = "Heavily Encumbered";
break
case 3:
effectName = "Overburdened";
break;
default:
break;
}
const hasEncumbrance = !!effectEntityPresent;
const shouldHaveEncumbrance = encumbranceData.encumbranceTier > 0;

if (!shouldHaveEncumbrance && hasEncumbrance) {
effectEntityPresent.delete();
} else if (shouldHaveEncumbrance) {
let [changeMode, changeValue] = encumbranceData.encumbranceTier >= ENCUMBRANCE_TIERS.MAX ?
[ACTIVE_EFFECT_MODES.MULTIPLY, 0] :
[ACTIVE_EFFECT_MODES.ADD, encumbranceData.speedDecrease * -1];
if (!game.settings.get("VariantEncumbrance", "useVariantEncumbrance")) {
changeMode = ACTIVE_EFFECT_MODES.ADD;
changeValue = 0;
}
let effectName;
switch (encumbranceData.encumbranceTier) {
case ENCUMBRANCE_TIERS.LIGHT:
effectName = "Lightly Encumbered";
break;
case ENCUMBRANCE_TIERS.HEAVY:
effectName = "Heavily Encumbered";
break
case ENCUMBRANCE_TIERS.MAX:
effectName = "Overburdened";
break;
default:
break;
}

let effect = {
label: effectName,
icon: "icons/tools/smithing/anvil.webp",
changes: [
{
key: "data.attributes.movement.walk",
value: changeValue,
mode: changeMode,
priority: 1000
},
{
key: "data.attributes.movement.swim",
value: changeValue,
mode: changeMode,
priority: 1000
},
{
key: "data.attributes.movement.fly",
value: changeValue,
mode: changeMode,
priority: 1000
},
{
key: "data.attributes.movement.climb",
value: changeValue,
mode: changeMode,
priority: 1000
},
{
key: "data.attributes.movement.burrow",
value: changeValue,
mode: changeMode,
priority: 1000
}
],
flags: {
VariantEncumbrance: {
tier: encumbranceData.encumbranceTier
}
},
origin: `Actor.${actorEntity.data._id}`
const changes = ['walk', 'swim', 'fly', 'climb', 'burrow'].map((movementType) => {
const changeKey = "data.attributes.movement." + movementType;
return {
key: changeKey,
value: changeValue,
mode: changeMode,
priority: 1000
};
});

let effect = {
label: effectName,
icon: "icons/tools/smithing/anvil.webp",
changes: changes,
flags: {
VariantEncumbrance: {
tier: encumbranceData.encumbranceTier
}
},
origin: `Actor.${actorEntity.data._id}`
};

if (effectEntityPresent) {
effectEntityPresent.update(effect);
} else {
actorEntity.createEmbeddedEntity("ActiveEffect", effect);
}
}
actorEntity.applyActiveEffects();
actorEntity.setFlag("VariantEncumbrance", "speed", actorEntity.data.data.attributes.movement.walk);
actorEntity.setFlag("VariantEncumbrance", "tier", encumbranceData.encumbranceTier);
actorEntity.setFlag("VariantEncumbrance", "weight", encumbranceData.totalWeight);

const { speed, tier, weight } = (actorEntity.data.flags.VariantEncumbrance || {});
if (speed !== actorEntity.data.data.attributes.movement.walk) {
actorEntity.setFlag("VariantEncumbrance", "speed", actorEntity.data.data.attributes.movement.walk);
}
if (tier !== encumbranceData.encumbranceTier) {
actorEntity.setFlag("VariantEncumbrance", "tier", encumbranceData.encumbranceTier);
}
if (weight !== encumbranceData.totalWeight) {
actorEntity.setFlag("VariantEncumbrance", "weight", encumbranceData.totalWeight);
}
}

function calculateEncumbrance(actorEntity, itemSet) {
Expand Down Expand Up @@ -308,14 +312,14 @@ function calculateEncumbrance(actorEntity, itemSet) {
let encumbranceTier = 0;
if (totalWeight >= lightMax && totalWeight < mediumMax) {
speedDecrease = 10;
encumbranceTier = 1;
encumbranceTier = ENCUMBRANCE_TIERS.LIGHT;
}
if (totalWeight >= mediumMax && totalWeight < heavyMax) {
speedDecrease = 20;
encumbranceTier = 2;
encumbranceTier = ENCUMBRANCE_TIERS.HEAVY;
}
if (totalWeight >= heavyMax) {
encumbranceTier = 3;
encumbranceTier = ENCUMBRANCE_TIERS.MAX;
}

return {
Expand All @@ -326,4 +330,4 @@ function calculateEncumbrance(actorEntity, itemSet) {
encumbranceTier: encumbranceTier,
speedDecrease: speedDecrease
}
}
}