74 lines
1.8 KiB
TypeScript
74 lines
1.8 KiB
TypeScript
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;
|
|
}
|
|
}
|