This commit is contained in:
Elizabeth Hunt 2025-03-02 19:11:33 -07:00
parent 196773c363
commit 78797aa175
Signed by: simponic
GPG Key ID: 2909B9A7FF6213EE
7 changed files with 60 additions and 36 deletions

View File

@ -8,7 +8,5 @@ export class RadialObserve extends Component {
public radius: number = 0, public radius: number = 0,
) { ) {
super(ComponentNames.RadialObserve); super(ComponentNames.RadialObserve);
this.onObservation = onObservation;
} }
} }

View File

@ -9,6 +9,7 @@ import {
LambdaTerm, LambdaTerm,
Modal, Modal,
Pushable, Pushable,
RadialObserve,
Sprite, Sprite,
} from "../components"; } from "../components";
import { Coord2D } from "../interfaces"; import { Coord2D } from "../interfaces";
@ -40,6 +41,8 @@ export class FunctionBox extends Entity {
this.addComponent(new Pushable()); this.addComponent(new Pushable());
this.addComponent(new RadialObserve());
this.addComponent(new Grid(gridPosition)); this.addComponent(new Grid(gridPosition));
this.addComponent( this.addComponent(

View File

@ -1,5 +1,11 @@
import { Entity, EntityNames } from "."; 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 { Game } from "../Game";
import { Coord2D, Direction } from "../interfaces"; import { Coord2D, Direction } from "../interfaces";
@ -7,7 +13,7 @@ export class Piston extends Entity {
constructor(gridPosition: Coord2D, direction: Direction) { constructor(gridPosition: Coord2D, direction: Direction) {
super(EntityNames.Piston); super(EntityNames.Piston);
const radius = 1 + .001; const radius = 1;
this.addComponent(new RadialObserve(this.onObservation.bind(this), radius)); this.addComponent(new RadialObserve(this.onObservation.bind(this), radius));
this.addComponent(new FacingDirection(direction)); this.addComponent(new FacingDirection(direction));
@ -18,13 +24,20 @@ export class Piston extends Entity {
} }
private onObservation(_game: Game, entity: 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 observingGrid = entity.getComponent<Grid>(ComponentNames.Grid);
const observingPosition = observingGrid.gridPosition; 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>> = { const v: Record<typeof dx, Record<typeof dy, Direction>> = {
[-1]: { [-1]: {
[dy]: Direction.RIGHT, [dy]: Direction.RIGHT,
@ -35,7 +48,7 @@ export class Piston extends Entity {
[0]: { [0]: {
[-1]: Direction.UP, [-1]: Direction.UP,
[1]: Direction.DOWN, [1]: Direction.DOWN,
} },
}; };
if (facingDirection.currentDirection !== v[dx][dy]) { if (facingDirection.currentDirection !== v[dx][dy]) {

View File

@ -60,7 +60,6 @@ export class CarCadr extends Level {
new Wall({ x: 10, y: 5 }), new Wall({ x: 10, y: 5 }),
new Wall({ x: 12, y: 5 }), new Wall({ x: 12, y: 5 }),
new Wall({ x: 12, y: 3 }), new Wall({ x: 12, y: 3 }),
new Piston({ x: 10, y: 6 }, Direction.RIGHT),
new FunctionApplication({ x: 12, y: 6 }, "(_INPUT _KEY)"), new FunctionApplication({ x: 12, y: 6 }, "(_INPUT _KEY)"),
new Wall({ x: 10, y: 7 }), new Wall({ x: 10, y: 7 }),
new Wall({ x: 11, y: 7 }), new Wall({ x: 11, y: 7 }),

View File

@ -27,16 +27,17 @@ export class FacingDirection extends System {
game.forEachEntityWithComponent( game.forEachEntityWithComponent(
ComponentNames.FacingDirection, ComponentNames.FacingDirection,
(entity) => { (entity) => {
if (!entity.hasComponent(ComponentNames.BoundingBox)) {
return;
}
const boundingBox = entity.getComponent<BoundingBox>(
ComponentNames.BoundingBox,
)!;
const facingDirection = entity.getComponent<FacingDirectionComponent>( const facingDirection = entity.getComponent<FacingDirectionComponent>(
ComponentNames.FacingDirection, ComponentNames.FacingDirection,
); );
if (!entity.hasComponent(ComponentNames.Sprite)) {
return;
}
if (entity.hasComponent(ComponentNames.Control)) {
const boundingBox = entity.getComponent<BoundingBox>(
ComponentNames.BoundingBox,
)!;
const { center } = boundingBox; const { center } = boundingBox;
const angle = Math.atan2( const angle = Math.atan2(
@ -52,9 +53,12 @@ export class FacingDirection extends System {
facingDirection.setDirection(direction); facingDirection.setDirection(direction);
entity.addComponent(facingDirection); entity.addComponent(facingDirection);
}
const oldSprite = entity.getComponent<Sprite>(ComponentNames.Sprite); const oldSprite = entity.getComponent<Sprite>(ComponentNames.Sprite);
const sprite = facingDirection.directionSprites.get(direction)!; const sprite = facingDirection.directionSprites.get(
facingDirection.currentDirection,
)!;
sprite.fillTimingsFromSprite(oldSprite); sprite.fillTimingsFromSprite(oldSprite);
entity.addComponent(sprite); entity.addComponent(sprite);

View File

@ -54,6 +54,9 @@ export class Grid extends System {
if (!entity.hasComponent(ComponentNames.Grid)) { if (!entity.hasComponent(ComponentNames.Grid)) {
return; return;
} }
if (!entity.hasComponent(ComponentNames.Control)) {
return;
}
const grid = entity.getComponent<GridComponent>(ComponentNames.Grid)!; const grid = entity.getComponent<GridComponent>(ComponentNames.Grid)!;
const facingDirection = entity.getComponent<FacingDirection>( const facingDirection = entity.getComponent<FacingDirection>(

View File

@ -1,5 +1,9 @@
import { System, SystemNames } from "."; 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 { Entity, EntityNames } from "../entities";
import { Game } from "../Game"; import { Game } from "../Game";
import { cartesianDistance } from "../interfaces"; import { cartesianDistance } from "../interfaces";