implement feature caching and inject Ikonis augment effects into actor calculations
This commit is contained in:
parent
810afba204
commit
7c52be79c3
2 changed files with 81 additions and 22 deletions
|
|
@ -10,6 +10,9 @@ export const DEFAULT_AUGMENTS = [
|
|||
{ id: "weight", name: "Gravity Plate", effect: "Weapon is Heavy (more damage)", cost: "4 Lead", precompile: 2 }
|
||||
];
|
||||
|
||||
// Global cache for resolved features to keep generators fast
|
||||
const _featureCache = new Map();
|
||||
|
||||
export function getAugments() {
|
||||
return game.settings.get('dh-ikonis', 'augmentsList') || DEFAULT_AUGMENTS;
|
||||
}
|
||||
|
|
@ -31,10 +34,11 @@ export function getSlotCount(item) {
|
|||
}
|
||||
|
||||
/**
|
||||
* Robust feature fetching with timeout to prevent sheet hangs.
|
||||
* Robust feature fetching with timeout and caching.
|
||||
*/
|
||||
export async function getAttachedFeature(uuid) {
|
||||
if (!uuid) return null;
|
||||
if (_featureCache.has(uuid)) return _featureCache.get(uuid);
|
||||
|
||||
const timeout = new Promise((_, reject) =>
|
||||
setTimeout(() => reject(new Error("Timeout fetching feature")), 2000)
|
||||
|
|
@ -42,6 +46,7 @@ export async function getAttachedFeature(uuid) {
|
|||
|
||||
try {
|
||||
const item = await Promise.race([fromUuid(uuid), timeout]);
|
||||
if (item) _featureCache.set(uuid, item);
|
||||
return item;
|
||||
} catch (err) {
|
||||
console.warn(`DH-Ikonis | Failed or timed out fetching feature [${uuid}]:`, err.message);
|
||||
|
|
@ -49,6 +54,57 @@ export async function getAttachedFeature(uuid) {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Patches the system to ensure Ikonis effects are applied to the actor.
|
||||
*/
|
||||
export function patchIkonisLogic() {
|
||||
console.log("DH-Ikonis | Patching Actor for Ikonis effect injection...");
|
||||
|
||||
// 1. Patch allApplicableEffects to inject Active Effects from Augments
|
||||
const originalAllEffects = Actor.prototype.allApplicableEffects;
|
||||
Actor.prototype.allApplicableEffects = function* () {
|
||||
// Yield standard effects
|
||||
yield* originalAllEffects.call(this);
|
||||
|
||||
// Inject effects from equipped Ikonis weapons
|
||||
for (const item of this.items) {
|
||||
if (item.type !== 'weapon' || !item.system.equipped) continue;
|
||||
|
||||
const installedIds = item.getFlag('dh-ikonis', 'installedAugments') || [];
|
||||
const allAugs = getAugments();
|
||||
|
||||
for (const id of installedIds) {
|
||||
const aug = allAugs.find(a => String(a.id) === String(id));
|
||||
if (!aug?.featureUuid) continue;
|
||||
|
||||
// We use sync lookup here because generators must be synchronous.
|
||||
// The features should already be in the cache from the sheet rendering.
|
||||
const feature = fromUuidSync(aug.featureUuid);
|
||||
if (!feature || !feature.effects) continue;
|
||||
|
||||
for (const effect of feature.effects) {
|
||||
// Only yield transfer effects (those meant to apply to the actor)
|
||||
if (effect.transfer) yield effect;
|
||||
}
|
||||
}
|
||||
|
||||
// Also check Bonded feature
|
||||
const bondedUuid = item.getFlag('dh-ikonis', 'bondedFeatureUuid');
|
||||
if (bondedUuid) {
|
||||
const feature = fromUuidSync(bondedUuid);
|
||||
if (feature?.effects) {
|
||||
for (const effect of feature.effects) {
|
||||
if (effect.transfer) yield effect;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
console.log("DH-Ikonis | Actor patches complete.");
|
||||
}
|
||||
|
||||
export function patchDHWeapon() {
|
||||
console.log("DH-Ikonis | Patching DH Weapon system...");
|
||||
// Future: Add damage type override logic here
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue