add a piston
This commit is contained in:
parent
491a1d05a5
commit
196773c363
@ -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,
|
||||
|
@ -11,4 +11,5 @@ export namespace EntityNames {
|
||||
export const Portal = "Portal";
|
||||
export const Grass = "Grass";
|
||||
export const Sign = "Sign";
|
||||
export const Piston = "Piston";
|
||||
}
|
||||
|
48
src/engine/entities/Piston.ts
Normal file
48
src/engine/entities/Piston.ts
Normal file
@ -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);
|
||||
}
|
||||
}
|
@ -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 }),
|
||||
|
@ -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) {
|
||||
|
@ -9,4 +9,5 @@ export namespace SystemNames {
|
||||
export const Music = "Music";
|
||||
export const Level = "Level";
|
||||
export const Modal = "Modal";
|
||||
export const RadialObserve = "RadialObserve";
|
||||
}
|
||||
|
@ -10,3 +10,4 @@ export * from "./Life";
|
||||
export * from "./Music";
|
||||
export * from "./Level";
|
||||
export * from "./Modal";
|
||||
export * from "./RadialObserve";
|
||||
|
Loading…
x
Reference in New Issue
Block a user