summaryrefslogtreecommitdiff
path: root/src/engine/systems/Level.ts
blob: 824895dd9e66a8892bc079fefcd8a839f62899a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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> = new Set();
  private currentLevel: LevelType | null = 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.moveToLevel = initialLevel;
  }

  public setLevel(level: string) {
    this.moveToLevel = level;
  }

  public reset(game: Game) {
    game.resetState();
    this.currentLevel?.init(game);
  }

  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;
  }
}