From 491a1d05a5f001d8f5155b9169547d461ac7e8b2 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Sun, 2 Mar 2025 17:06:49 -0700 Subject: implement a radial observation system --- src/engine/systems/RadialObserve.ts | 61 +++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/engine/systems/RadialObserve.ts (limited to 'src/engine/systems/RadialObserve.ts') 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> = { + 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( + ComponentNames.RadialObserve, + ); + if (!entityObserve.onObservation) { + return; + } + + const entityPosition = entity.getComponent( + 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( + ComponentNames.Grid, + ).gridPosition; + if ( + cartesianDistance(entityPosition, otherPosition) > + entityObserve.radius + ) { + return; + } + + observations.push(other); + }); + + for (const observation of observations) { + entityObserve.onObservation!(game, observation); + } + }); + } +} -- cgit v1.2.3-70-g09d2