summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/engine/TheAbstractionEngine.ts2
-rw-r--r--src/engine/entities/EntityNames.ts1
-rw-r--r--src/engine/entities/Piston.ts48
-rw-r--r--src/engine/levels/CarCadr.ts3
-rw-r--r--src/engine/systems/RadialObserve.ts10
-rw-r--r--src/engine/systems/SystemNames.ts1
-rw-r--r--src/engine/systems/index.ts1
7 files changed, 61 insertions, 5 deletions
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<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);
+ }
+}
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<string, Set<string>> = {
- 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<RadialObserve>(
+ const entityObserve = entity.getComponent<RadialObserveComponent>(
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";