summaryrefslogtreecommitdiff
path: root/src/engine/systems
diff options
context:
space:
mode:
authorElizabeth Hunt <elizabeth.hunt@simponic.xyz>2024-03-07 22:49:43 -0700
committerElizabeth Hunt <elizabeth.hunt@simponic.xyz>2024-03-07 22:49:43 -0700
commitebae24f5a3a251654a1e41be58f52ba2a777d9d7 (patch)
tree6641c3e5a5ec5d812c54be2bb38196f85f4e36c2 /src/engine/systems
parent808a44e8542ebc7542d833e5a30b51b7fb8f80d5 (diff)
downloadthe-abstraction-engine-ebae24f5a3a251654a1e41be58f52ba2a777d9d7.tar.gz
the-abstraction-engine-ebae24f5a3a251654a1e41be58f52ba2a777d9d7.zip
level system!
Diffstat (limited to 'src/engine/systems')
-rw-r--r--src/engine/systems/Collision.ts1
-rw-r--r--src/engine/systems/Grid.ts7
-rw-r--r--src/engine/systems/Level.ts57
-rw-r--r--src/engine/systems/SystemNames.ts1
-rw-r--r--src/engine/systems/index.ts1
5 files changed, 67 insertions, 0 deletions
diff --git a/src/engine/systems/Collision.ts b/src/engine/systems/Collision.ts
index 7d843cc..0bc6f5c 100644
--- a/src/engine/systems/Collision.ts
+++ b/src/engine/systems/Collision.ts
@@ -7,6 +7,7 @@ const collisionMap: Record<string, Set<string>> = {
[EntityNames.Key]: new Set([EntityNames.LockedDoor]),
[EntityNames.Curry]: new Set([EntityNames.Player]),
[EntityNames.FunctionApplication]: new Set([EntityNames.FunctionBox]),
+ [EntityNames.Portal]: new Set([EntityNames.Player]),
};
export class Collision extends System {
diff --git a/src/engine/systems/Grid.ts b/src/engine/systems/Grid.ts
index 1ec8ed9..c504bfe 100644
--- a/src/engine/systems/Grid.ts
+++ b/src/engine/systems/Grid.ts
@@ -377,4 +377,11 @@ export class Grid extends System {
this.grid[y][x].add(id);
});
}
+
+ public getCenterGrid() {
+ return {
+ x: Math.floor(this.grid[0].length / 2),
+ y: Math.floor(this.grid.length / 2),
+ };
+ }
}
diff --git a/src/engine/systems/Level.ts b/src/engine/systems/Level.ts
new file mode 100644
index 0000000..87e12a5
--- /dev/null
+++ b/src/engine/systems/Level.ts
@@ -0,0 +1,57 @@
+import { SystemNames, System } from ".";
+import { Game } from "..";
+import { type Level as LevelType, LEVELS, LEVEL_PROGRESSION } from "../levels";
+
+export class Level extends System {
+ private unlockedLevels: Set<string>;
+ private currentLevel: LevelType | null;
+ private moveToLevel: string | null;
+ private levelMap: Map<string, LevelType>;
+
+ constructor(initialLevel: string) {
+ super(SystemNames.Level);
+
+ this.levelMap = new Map();
+ LEVELS.forEach((level) => {
+ this.levelMap.set(level.name, level);
+ });
+
+ this.currentLevel = null;
+ this.moveToLevel = initialLevel;
+ this.unlockedLevels = new Set();
+ }
+
+ public setLevel(level: string) {
+ this.moveToLevel = level;
+ }
+
+ public update(_dt: number, game: Game) {
+ if (this.moveToLevel === this.currentLevel?.name || !this.moveToLevel) {
+ return;
+ }
+
+ if (this.currentLevel) {
+ game.resetState();
+ }
+
+ const unlockedLevels = LEVEL_PROGRESSION[this.moveToLevel];
+ if (unlockedLevels && unlockedLevels.length > 0) {
+ unlockedLevels.forEach((levelName) => {
+ if (!this.unlockedLevels.has(levelName)) {
+ this.unlockedLevels.add(levelName);
+ }
+ });
+ }
+
+ if (!this.unlockedLevels.has(this.moveToLevel)) {
+ this.unlockedLevels.add(this.moveToLevel);
+ }
+ this.currentLevel = this.levelMap.get(this.moveToLevel)!;
+ this.currentLevel.init(game);
+ this.moveToLevel = null;
+ }
+
+ public getUnlockedLevels() {
+ return this.unlockedLevels;
+ }
+}
diff --git a/src/engine/systems/SystemNames.ts b/src/engine/systems/SystemNames.ts
index 363c72c..63f83a4 100644
--- a/src/engine/systems/SystemNames.ts
+++ b/src/engine/systems/SystemNames.ts
@@ -7,4 +7,5 @@ export namespace SystemNames {
export const Collision = "Collision";
export const Life = "Life";
export const Music = "Music";
+ export const Level = "Level";
}
diff --git a/src/engine/systems/index.ts b/src/engine/systems/index.ts
index 46c534d..29dbc7e 100644
--- a/src/engine/systems/index.ts
+++ b/src/engine/systems/index.ts
@@ -8,3 +8,4 @@ export * from "./GridSpawner";
export * from "./Collision";
export * from "./Life";
export * from "./Music";
+export * from "./Level";