From 196773c3637f7dcf2a53a6cb9b3a8e8f790cce71 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Sun, 2 Mar 2025 18:49:51 -0700 Subject: add a piston --- src/engine/entities/EntityNames.ts | 1 + src/engine/entities/Piston.ts | 48 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 src/engine/entities/Piston.ts (limited to 'src/engine/entities') 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); + } +} -- cgit v1.2.3-70-g09d2