diff options
Diffstat (limited to 'src/engine/systems')
-rw-r--r-- | src/engine/systems/Collision.ts | 1 | ||||
-rw-r--r-- | src/engine/systems/Grid.ts | 7 | ||||
-rw-r--r-- | src/engine/systems/Level.ts | 57 | ||||
-rw-r--r-- | src/engine/systems/SystemNames.ts | 1 | ||||
-rw-r--r-- | src/engine/systems/index.ts | 1 |
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"; |