summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElizabeth Hunt <elizabeth@simponic.xyz>2025-03-02 19:11:33 -0700
committerElizabeth Hunt <elizabeth@simponic.xyz>2025-03-02 19:11:33 -0700
commit78797aa175651d53df21d3f8d5c51a55649aaced (patch)
treecd3c5e168e069c5ac2c18514f0f69543d077ec30
parent196773c3637f7dcf2a53a6cb9b3a8e8f790cce71 (diff)
downloadthe-abstraction-engine-78797aa175651d53df21d3f8d5c51a55649aaced.tar.gz
the-abstraction-engine-78797aa175651d53df21d3f8d5c51a55649aaced.zip
pistonsHEADmain
-rw-r--r--src/engine/components/RadialObserve.ts2
-rw-r--r--src/engine/entities/FunctionBox.ts3
-rw-r--r--src/engine/entities/Piston.ts33
-rw-r--r--src/engine/levels/CarCadr.ts1
-rw-r--r--src/engine/systems/FacingDirection.ts44
-rw-r--r--src/engine/systems/Grid.ts3
-rw-r--r--src/engine/systems/RadialObserve.ts10
7 files changed, 60 insertions, 36 deletions
diff --git a/src/engine/components/RadialObserve.ts b/src/engine/components/RadialObserve.ts
index 60962c2..d9d2fa5 100644
--- a/src/engine/components/RadialObserve.ts
+++ b/src/engine/components/RadialObserve.ts
@@ -8,7 +8,5 @@ export class RadialObserve extends Component {
public radius: number = 0,
) {
super(ComponentNames.RadialObserve);
-
- this.onObservation = onObservation;
}
}
diff --git a/src/engine/entities/FunctionBox.ts b/src/engine/entities/FunctionBox.ts
index 7493c8a..f381455 100644
--- a/src/engine/entities/FunctionBox.ts
+++ b/src/engine/entities/FunctionBox.ts
@@ -9,6 +9,7 @@ import {
LambdaTerm,
Modal,
Pushable,
+ RadialObserve,
Sprite,
} from "../components";
import { Coord2D } from "../interfaces";
@@ -40,6 +41,8 @@ export class FunctionBox extends Entity {
this.addComponent(new Pushable());
+ this.addComponent(new RadialObserve());
+
this.addComponent(new Grid(gridPosition));
this.addComponent(
diff --git a/src/engine/entities/Piston.ts b/src/engine/entities/Piston.ts
index 18b761b..214eaac 100644
--- a/src/engine/entities/Piston.ts
+++ b/src/engine/entities/Piston.ts
@@ -1,5 +1,11 @@
import { Entity, EntityNames } from ".";
-import { Colliding, ComponentNames, FacingDirection, Grid, RadialObserve } from "../components";
+import {
+ Colliding,
+ ComponentNames,
+ FacingDirection,
+ Grid,
+ RadialObserve,
+} from "../components";
import { Game } from "../Game";
import { Coord2D, Direction } from "../interfaces";
@@ -7,7 +13,7 @@ export class Piston extends Entity {
constructor(gridPosition: Coord2D, direction: Direction) {
super(EntityNames.Piston);
- const radius = 1 + .001;
+ const radius = 1;
this.addComponent(new RadialObserve(this.onObservation.bind(this), radius));
this.addComponent(new FacingDirection(direction));
@@ -18,24 +24,31 @@ export class Piston extends Entity {
}
private onObservation(_game: Game, entity: Entity) {
- const facingDirection = this.getComponent<FacingDirection>(ComponentNames.FacingDirection);
+ const facingDirection = this.getComponent<FacingDirection>(
+ ComponentNames.FacingDirection,
+ );
- const myPosition = this.getComponent<Grid>(ComponentNames.Grid).gridPosition;
+ 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 [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,
+ [dy]: Direction.RIGHT,
},
[1]: {
- [dy]: Direction.LEFT,
+ [dy]: Direction.LEFT,
},
[0]: {
- [-1]: Direction.UP,
- [1]: Direction.DOWN,
- }
+ [-1]: Direction.UP,
+ [1]: Direction.DOWN,
+ },
};
if (facingDirection.currentDirection !== v[dx][dy]) {
diff --git a/src/engine/levels/CarCadr.ts b/src/engine/levels/CarCadr.ts
index ee50ee9..10ff6d9 100644
--- a/src/engine/levels/CarCadr.ts
+++ b/src/engine/levels/CarCadr.ts
@@ -60,7 +60,6 @@ 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/FacingDirection.ts b/src/engine/systems/FacingDirection.ts
index 042484a..ec73d58 100644
--- a/src/engine/systems/FacingDirection.ts
+++ b/src/engine/systems/FacingDirection.ts
@@ -27,34 +27,38 @@ export class FacingDirection extends System {
game.forEachEntityWithComponent(
ComponentNames.FacingDirection,
(entity) => {
- if (!entity.hasComponent(ComponentNames.BoundingBox)) {
- return;
- }
-
- const boundingBox = entity.getComponent<BoundingBox>(
- ComponentNames.BoundingBox,
- )!;
const facingDirection = entity.getComponent<FacingDirectionComponent>(
ComponentNames.FacingDirection,
);
+ if (!entity.hasComponent(ComponentNames.Sprite)) {
+ return;
+ }
- const { center } = boundingBox;
- const angle = Math.atan2(
- mousePosition.y - center.y,
- mousePosition.x - center.x,
- );
+ if (entity.hasComponent(ComponentNames.Control)) {
+ const boundingBox = entity.getComponent<BoundingBox>(
+ ComponentNames.BoundingBox,
+ )!;
- const mouseInBoundingBox =
- boundingBox.isCollidingWith(mouseBoundingBox);
- const direction = mouseInBoundingBox
- ? Direction.NONE
- : angleToDirection(angle);
+ const { center } = boundingBox;
+ const angle = Math.atan2(
+ mousePosition.y - center.y,
+ mousePosition.x - center.x,
+ );
- facingDirection.setDirection(direction);
- entity.addComponent(facingDirection);
+ const mouseInBoundingBox =
+ boundingBox.isCollidingWith(mouseBoundingBox);
+ const direction = mouseInBoundingBox
+ ? Direction.NONE
+ : angleToDirection(angle);
+
+ facingDirection.setDirection(direction);
+ entity.addComponent(facingDirection);
+ }
const oldSprite = entity.getComponent<Sprite>(ComponentNames.Sprite);
- const sprite = facingDirection.directionSprites.get(direction)!;
+ const sprite = facingDirection.directionSprites.get(
+ facingDirection.currentDirection,
+ )!;
sprite.fillTimingsFromSprite(oldSprite);
entity.addComponent(sprite);
diff --git a/src/engine/systems/Grid.ts b/src/engine/systems/Grid.ts
index 2eea704..d5436f4 100644
--- a/src/engine/systems/Grid.ts
+++ b/src/engine/systems/Grid.ts
@@ -54,6 +54,9 @@ export class Grid extends System {
if (!entity.hasComponent(ComponentNames.Grid)) {
return;
}
+ if (!entity.hasComponent(ComponentNames.Control)) {
+ return;
+ }
const grid = entity.getComponent<GridComponent>(ComponentNames.Grid)!;
const facingDirection = entity.getComponent<FacingDirection>(
diff --git a/src/engine/systems/RadialObserve.ts b/src/engine/systems/RadialObserve.ts
index 581452c..f303219 100644
--- a/src/engine/systems/RadialObserve.ts
+++ b/src/engine/systems/RadialObserve.ts
@@ -1,5 +1,9 @@
import { System, SystemNames } from ".";
-import { ComponentNames, Grid, RadialObserve as RadialObserveComponent } from "../components";
+import {
+ ComponentNames,
+ Grid,
+ RadialObserve as RadialObserveComponent,
+} from "../components";
import { Entity, EntityNames } from "../entities";
import { Game } from "../Game";
import { cartesianDistance } from "../interfaces";
@@ -24,7 +28,7 @@ export class RadialObserve extends System {
ComponentNames.RadialObserve,
);
if (!entityObserve.onObservation) {
- return;
+ return;
}
const entityPosition = entity.getComponent<Grid>(
@@ -54,7 +58,7 @@ export class RadialObserve extends System {
});
for (const observation of observations) {
- entityObserve.onObservation!(game, observation);
+ entityObserve.onObservation!(game, observation);
}
});
}