diff options
author | Elizabeth Hunt <elizabeth@simponic.xyz> | 2025-03-02 18:49:51 -0700 |
---|---|---|
committer | Elizabeth Hunt <elizabeth@simponic.xyz> | 2025-03-02 18:49:51 -0700 |
commit | 196773c3637f7dcf2a53a6cb9b3a8e8f790cce71 (patch) | |
tree | 49cb79e5728adac877ce321de7ea052e7f8b7e7e /src/engine/entities/Piston.ts | |
parent | 491a1d05a5f001d8f5155b9169547d461ac7e8b2 (diff) | |
download | the-abstraction-engine-196773c3637f7dcf2a53a6cb9b3a8e8f790cce71.tar.gz the-abstraction-engine-196773c3637f7dcf2a53a6cb9b3a8e8f790cce71.zip |
add a piston
Diffstat (limited to 'src/engine/entities/Piston.ts')
-rw-r--r-- | src/engine/entities/Piston.ts | 48 |
1 files changed, 48 insertions, 0 deletions
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<FacingDirection>(ComponentNames.FacingDirection); + + const myPosition = this.getComponent<Grid>(ComponentNames.Grid).gridPosition; + const observingGrid = entity.getComponent<Grid>(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<typeof dx, Record<typeof dy, Direction>> = { + [-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); + } +} |