summaryrefslogtreecommitdiff
path: root/src/engine/entities/Piston.ts
diff options
context:
space:
mode:
authorElizabeth Hunt <elizabeth@simponic.xyz>2025-03-02 18:49:51 -0700
committerElizabeth Hunt <elizabeth@simponic.xyz>2025-03-02 18:49:51 -0700
commit196773c3637f7dcf2a53a6cb9b3a8e8f790cce71 (patch)
tree49cb79e5728adac877ce321de7ea052e7f8b7e7e /src/engine/entities/Piston.ts
parent491a1d05a5f001d8f5155b9169547d461ac7e8b2 (diff)
downloadthe-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.ts48
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);
+ }
+}