From ebae24f5a3a251654a1e41be58f52ba2a777d9d7 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Thu, 7 Mar 2024 22:49:43 -0700 Subject: level system! --- src/engine/systems/Level.ts | 57 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/engine/systems/Level.ts (limited to 'src/engine/systems/Level.ts') 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; + private currentLevel: LevelType | null; + private moveToLevel: string | null; + private levelMap: Map; + + 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; + } +} -- cgit v1.2.3-70-g09d2