diff options
Diffstat (limited to 'src/engine/systems')
-rw-r--r-- | src/engine/systems/RadialObserve.ts | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/engine/systems/RadialObserve.ts b/src/engine/systems/RadialObserve.ts new file mode 100644 index 0000000..8d418df --- /dev/null +++ b/src/engine/systems/RadialObserve.ts @@ -0,0 +1,61 @@ +import { System, SystemNames } from "."; +import { ComponentNames, Grid, RadialObserve } from "../components"; +import { Entity, EntityNames } from "../entities"; +import { Game } from "../Game"; +import { cartesianDistance } from "../interfaces"; + +const radialObservations: Record<string, Set<string>> = { + TODO: new Set([]), +}; + +export class RadialObserver extends System { + constructor() { + super(SystemNames.RadialObserver); + } + + public update(_dt: number, game: Game) { + game.forEachEntityWithComponent(ComponentNames.RadialObserve, (entity) => { + if (!(entity.name in radialObservations)) { + return; + } + const observable = radialObservations[entity.name]; + + const entityObserve = entity.getComponent<RadialObserve>( + ComponentNames.RadialObserve, + ); + if (!entityObserve.onObservation) { + return; + } + + const entityPosition = entity.getComponent<Grid>( + ComponentNames.Grid, + ).gridPosition; + + const observations: Entity[] = []; + game.forEachEntityWithComponent(ComponentNames.RadialObserve, (other) => { + if (entity === other) { + return; + } + if (!observable.has(other.name)) { + return; + } + + const otherPosition = other.getComponent<Grid>( + ComponentNames.Grid, + ).gridPosition; + if ( + cartesianDistance(entityPosition, otherPosition) > + entityObserve.radius + ) { + return; + } + + observations.push(other); + }); + + for (const observation of observations) { + entityObserve.onObservation!(game, observation); + } + }); + } +} |