summaryrefslogtreecommitdiff
path: root/src/engine/systems/Level.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/systems/Level.ts')
-rw-r--r--src/engine/systems/Level.ts57
1 files changed, 57 insertions, 0 deletions
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;
+ }
+}