diff options
author | Elizabeth Hunt <elizabeth@simponic.xyz> | 2025-03-02 19:11:33 -0700 |
---|---|---|
committer | Elizabeth Hunt <elizabeth@simponic.xyz> | 2025-03-02 19:11:33 -0700 |
commit | 78797aa175651d53df21d3f8d5c51a55649aaced (patch) | |
tree | cd3c5e168e069c5ac2c18514f0f69543d077ec30 | |
parent | 196773c3637f7dcf2a53a6cb9b3a8e8f790cce71 (diff) | |
download | the-abstraction-engine-main.tar.gz the-abstraction-engine-main.zip |
-rw-r--r-- | src/engine/components/RadialObserve.ts | 2 | ||||
-rw-r--r-- | src/engine/entities/FunctionBox.ts | 3 | ||||
-rw-r--r-- | src/engine/entities/Piston.ts | 33 | ||||
-rw-r--r-- | src/engine/levels/CarCadr.ts | 1 | ||||
-rw-r--r-- | src/engine/systems/FacingDirection.ts | 44 | ||||
-rw-r--r-- | src/engine/systems/Grid.ts | 3 | ||||
-rw-r--r-- | src/engine/systems/RadialObserve.ts | 10 |
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); } }); } |