110 lines
2.5 KiB
TypeScript
110 lines
2.5 KiB
TypeScript
|
import { IMAGES, SPRITE_SPECS, SpriteSpec, Sprites } from "../config";
|
||
|
import { Entity, EntityNames } from ".";
|
||
|
import {
|
||
|
BoundingBox,
|
||
|
Colliding,
|
||
|
ComponentNames,
|
||
|
Grid,
|
||
|
Highlight,
|
||
|
Interactable,
|
||
|
LambdaSpawn,
|
||
|
Sprite,
|
||
|
Text,
|
||
|
} from "../components";
|
||
|
import { Coord2D, Direction } from "../interfaces";
|
||
|
import { openModal, closeModal } from "../utils";
|
||
|
|
||
|
export class LambdaFactory extends Entity {
|
||
|
private static spriteSpec: SpriteSpec = SPRITE_SPECS.get(
|
||
|
Sprites.LAMBDA_FACTORY,
|
||
|
) as SpriteSpec;
|
||
|
|
||
|
private code: string;
|
||
|
private spawns: number;
|
||
|
|
||
|
constructor(gridPosition: Coord2D, code: string, spawns: number) {
|
||
|
super(EntityNames.LambdaFactory);
|
||
|
|
||
|
this.code = code;
|
||
|
this.spawns = spawns;
|
||
|
|
||
|
this.addComponent(
|
||
|
new BoundingBox(
|
||
|
{
|
||
|
x: 0,
|
||
|
y: 0,
|
||
|
},
|
||
|
{
|
||
|
width: LambdaFactory.spriteSpec.width,
|
||
|
height: LambdaFactory.spriteSpec.height,
|
||
|
},
|
||
|
0,
|
||
|
),
|
||
|
);
|
||
|
|
||
|
this.addComponent(new Text(spawns.toString()));
|
||
|
|
||
|
this.addComponent(new Colliding());
|
||
|
|
||
|
this.addComponent(new LambdaSpawn(this.spawns, this.code));
|
||
|
|
||
|
this.addComponent(new Grid(gridPosition));
|
||
|
|
||
|
this.addComponent(
|
||
|
new Sprite(
|
||
|
IMAGES.get(LambdaFactory.spriteSpec.sheet)!,
|
||
|
{ x: 0, y: 0 },
|
||
|
{
|
||
|
width: LambdaFactory.spriteSpec.width,
|
||
|
height: LambdaFactory.spriteSpec.height,
|
||
|
},
|
||
|
LambdaFactory.spriteSpec.msPerFrame,
|
||
|
LambdaFactory.spriteSpec.frames,
|
||
|
),
|
||
|
);
|
||
|
|
||
|
this.addComponent(
|
||
|
new Highlight(
|
||
|
(direction) => this.onHighlight(direction),
|
||
|
() => this.onUnhighlight(),
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
private onUnhighlight() {
|
||
|
closeModal();
|
||
|
this.removeComponent(ComponentNames.Interactable);
|
||
|
}
|
||
|
|
||
|
private onHighlight(direction: Direction) {
|
||
|
if (direction === Direction.LEFT || direction === Direction.RIGHT) {
|
||
|
const interaction = () => {
|
||
|
const spawner = this.getComponent<LambdaSpawn>(
|
||
|
ComponentNames.LambdaSpawn,
|
||
|
);
|
||
|
spawner.spawn(direction);
|
||
|
|
||
|
const text = this.getComponent<Text>(ComponentNames.Text);
|
||
|
text.text = spawner.spawnsLeft.toString();
|
||
|
this.addComponent(text);
|
||
|
};
|
||
|
|
||
|
this.addComponent(new Interactable(interaction));
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
let modalOpen = false;
|
||
|
const interaction = () => {
|
||
|
if (modalOpen) {
|
||
|
modalOpen = false;
|
||
|
closeModal();
|
||
|
return;
|
||
|
}
|
||
|
modalOpen = true;
|
||
|
openModal(this.code);
|
||
|
};
|
||
|
|
||
|
this.addComponent(new Interactable(interaction));
|
||
|
}
|
||
|
}
|