import { System } from '../core/System.ts'; import { SystemName } from '../core/Constants.ts'; import type { Entity } from '../core/Entity.ts'; export interface SkillEffect { lifetime: number; time: number; type?: string; x?: number; y?: number; angle?: number; range?: number; coneAngle?: number; caster?: Entity; startX?: number; startY?: number; speed?: number; onUpdate?: (deltaTime: number) => void; onComplete?: () => void; } /** * System responsible for tracking and updating temporary active skill effects like fire breath or pounce trails. */ export class SkillEffectSystem extends System { activeEffects: SkillEffect[]; constructor() { super(SystemName.SKILL_EFFECT); this.requiredComponents = []; this.priority = 50; this.activeEffects = []; } /** * Update all active effects, removing them when their lifetime expires. * @param deltaTime - Time elapsed since last frame in seconds * @param _entities - Filtered entities */ process(deltaTime: number, _entities: Entity[]): void { for (let i = this.activeEffects.length - 1; i >= 0; i--) { const effect = this.activeEffects[i]; effect.lifetime -= deltaTime; effect.time += deltaTime; if (effect.onUpdate) { effect.onUpdate(deltaTime); } if (effect.lifetime <= 0) { if (effect.onComplete) { effect.onComplete(); } this.activeEffects.splice(i, 1); } } } /** * Add a new visual skill effect to the system. * @param effect - The effect data object */ addEffect(effect: SkillEffect): void { this.activeEffects.push(effect); } /** * Get the list of currently active skill effects. * @returns Array of active effects */ getEffects(): SkillEffect[] { return this.activeEffects; } }