diff --git a/src/engine/TheAbstractionEngine.ts b/src/engine/TheAbstractionEngine.ts index 886b50f..63c6274 100644 --- a/src/engine/TheAbstractionEngine.ts +++ b/src/engine/TheAbstractionEngine.ts @@ -12,6 +12,7 @@ import { Music, Level, Modal, + RadialObserve, } from "./systems"; export class TheAbstractionEngine { @@ -35,6 +36,7 @@ export class TheAbstractionEngine { const isDev = document.location.hostname.includes("localhost"); [ + new RadialObserve(), new Modal(), new Level(isDev ? LevelNames.CarCadr : LevelNames.LevelSelection), inputSystem, diff --git a/src/engine/entities/EntityNames.ts b/src/engine/entities/EntityNames.ts index 17b5519..dd508c9 100644 --- a/src/engine/entities/EntityNames.ts +++ b/src/engine/entities/EntityNames.ts @@ -11,4 +11,5 @@ export namespace EntityNames { export const Portal = "Portal"; export const Grass = "Grass"; export const Sign = "Sign"; + export const Piston = "Piston"; } diff --git a/src/engine/entities/Piston.ts b/src/engine/entities/Piston.ts new file mode 100644 index 0000000..18b761b --- /dev/null +++ b/src/engine/entities/Piston.ts @@ -0,0 +1,48 @@ +import { Entity, EntityNames } from "."; +import { Colliding, ComponentNames, FacingDirection, Grid, RadialObserve } from "../components"; +import { Game } from "../Game"; +import { Coord2D, Direction } from "../interfaces"; + +export class Piston extends Entity { + constructor(gridPosition: Coord2D, direction: Direction) { + super(EntityNames.Piston); + + const radius = 1 + .001; + this.addComponent(new RadialObserve(this.onObservation.bind(this), radius)); + + this.addComponent(new FacingDirection(direction)); + + this.addComponent(new Grid(gridPosition)); + + this.addComponent(new Colliding()); + } + + private onObservation(_game: Game, entity: Entity) { + const facingDirection = this.getComponent(ComponentNames.FacingDirection); + + const myPosition = this.getComponent(ComponentNames.Grid).gridPosition; + const observingGrid = entity.getComponent(ComponentNames.Grid); + const observingPosition = observingGrid.gridPosition; + + const [dx, dy] = [myPosition.x - observingPosition.x, myPosition.y - observingPosition.y].map(x => Math.round(x)); + const v: Record> = { + [-1]: { + [dy]: Direction.RIGHT, + }, + [1]: { + [dy]: Direction.LEFT, + }, + [0]: { + [-1]: Direction.UP, + [1]: Direction.DOWN, + } + }; + + if (facingDirection.currentDirection !== v[dx][dy]) { + return; + } + + observingGrid.movingDirection = facingDirection.currentDirection; + entity.addComponent(observingGrid); + } +} diff --git a/src/engine/levels/CarCadr.ts b/src/engine/levels/CarCadr.ts index 8875623..ee50ee9 100644 --- a/src/engine/levels/CarCadr.ts +++ b/src/engine/levels/CarCadr.ts @@ -9,6 +9,8 @@ import { Player, Wall, } from "../entities"; +import { Piston } from "../entities/Piston"; +import { Direction } from "../interfaces"; import { Grid, SystemNames } from "../systems"; import { normalRandom } from "../utils"; @@ -58,6 +60,7 @@ export class CarCadr extends Level { new Wall({ x: 10, y: 5 }), new Wall({ x: 12, y: 5 }), new Wall({ x: 12, y: 3 }), + new Piston({ x: 10, y: 6 }, Direction.RIGHT), new FunctionApplication({ x: 12, y: 6 }, "(_INPUT _KEY)"), new Wall({ x: 10, y: 7 }), new Wall({ x: 11, y: 7 }), diff --git a/src/engine/systems/RadialObserve.ts b/src/engine/systems/RadialObserve.ts index 8d418df..581452c 100644 --- a/src/engine/systems/RadialObserve.ts +++ b/src/engine/systems/RadialObserve.ts @@ -1,16 +1,16 @@ import { System, SystemNames } from "."; -import { ComponentNames, Grid, RadialObserve } from "../components"; +import { ComponentNames, Grid, RadialObserve as RadialObserveComponent } from "../components"; import { Entity, EntityNames } from "../entities"; import { Game } from "../Game"; import { cartesianDistance } from "../interfaces"; const radialObservations: Record> = { - TODO: new Set([]), + [EntityNames.Piston]: new Set([EntityNames.FunctionBox]), }; -export class RadialObserver extends System { +export class RadialObserve extends System { constructor() { - super(SystemNames.RadialObserver); + super(SystemNames.RadialObserve); } public update(_dt: number, game: Game) { @@ -20,7 +20,7 @@ export class RadialObserver extends System { } const observable = radialObservations[entity.name]; - const entityObserve = entity.getComponent( + const entityObserve = entity.getComponent( ComponentNames.RadialObserve, ); if (!entityObserve.onObservation) { diff --git a/src/engine/systems/SystemNames.ts b/src/engine/systems/SystemNames.ts index 430ee48..33e39ac 100644 --- a/src/engine/systems/SystemNames.ts +++ b/src/engine/systems/SystemNames.ts @@ -9,4 +9,5 @@ export namespace SystemNames { export const Music = "Music"; export const Level = "Level"; export const Modal = "Modal"; + export const RadialObserve = "RadialObserve"; } diff --git a/src/engine/systems/index.ts b/src/engine/systems/index.ts index 16ff911..a8c40b9 100644 --- a/src/engine/systems/index.ts +++ b/src/engine/systems/index.ts @@ -10,3 +10,4 @@ export * from "./Life"; export * from "./Music"; export * from "./Level"; export * from "./Modal"; +export * from "./RadialObserve";