File size: 3,478 Bytes
c670567
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/**
 * Level Manager - Manages game level order and navigation
 *
 * USAGE:
 *   1. Add your level scene keys to LEVEL_ORDER array
 *   2. Use getNextLevelScene() to get the next level
 *   3. Use isLastLevel() to check if current is the final level
 *
 * The LEVEL_ORDER array defines the sequence of levels in your game.
 * VictoryUIScene and GameCompleteUIScene use this to determine navigation.
 */
export class LevelManager {
  // ============================================================================
  // LEVEL ORDER CONFIGURATION
  // ============================================================================

  /**
   * TODO-LEVELS: Replace with YOUR scene keys from GDD Section 0 (Architecture).
   * Order matters: first entry = first scene after TitleScreen, last = final scene.
   * Every key here MUST also be registered in main.ts via game.scene.add().
   *
   * @example
   *   // For a ui_heavy game with character select → battle → endings:
   *   static readonly LEVEL_ORDER: string[] = [
   *     "CharacterSelectScene",
   *     "BattleScene",
   *     "VictoryScene",
   *     "DefeatScene",
   *   ];
   */
  static readonly LEVEL_ORDER: string[] = [
    'RoleRevealScene',
    'MainTableScene',
    'EndgameScene',
  ];

  // ============================================================================
  // NAVIGATION METHODS
  // ============================================================================

  /**
   * Get the key of the next level scene
   *
   * @param currentSceneKey - The current level scene key
   * @returns Next level scene key, or null if at last level
   */
  static getNextLevelScene(currentSceneKey: string): string | null {
    const currentIndex = LevelManager.LEVEL_ORDER.indexOf(currentSceneKey);

    // If it's the last level or current level not found, return null
    if (
      currentIndex === -1 ||
      currentIndex >= LevelManager.LEVEL_ORDER.length - 1
    ) {
      return null;
    }

    return LevelManager.LEVEL_ORDER[currentIndex + 1];
  }

  /**
   * Check if the current level is the last level
   *
   * @param currentSceneKey - The current level scene key
   * @returns True if this is the final level
   */
  static isLastLevel(currentSceneKey: string): boolean {
    const currentIndex = LevelManager.LEVEL_ORDER.indexOf(currentSceneKey);
    return currentIndex === LevelManager.LEVEL_ORDER.length - 1;
  }

  /**
   * Get the key of the first level scene
   *
   * @returns First level scene key, or null if no levels defined
   */
  static getFirstLevelScene(): string | null {
    return LevelManager.LEVEL_ORDER.length > 0
      ? LevelManager.LEVEL_ORDER[0]
      : null;
  }

  /**
   * Get the current level index (1-based for display)
   *
   * @param currentSceneKey - The current level scene key
   * @returns Level number (1-based), or 0 if not found
   */
  static getLevelNumber(currentSceneKey: string): number {
    const index = LevelManager.LEVEL_ORDER.indexOf(currentSceneKey);
    return index >= 0 ? index + 1 : 0;
  }

  /**
   * Get total number of levels
   *
   * @returns Total level count
   */
  static getTotalLevels(): number {
    return LevelManager.LEVEL_ORDER.length;
  }

  /**
   * Check if a scene key is a valid level scene
   *
   * @param sceneKey - Scene key to check
   * @returns True if this is a registered level scene
   */
  static isLevelScene(sceneKey: string): boolean {
    return LevelManager.LEVEL_ORDER.includes(sceneKey);
  }
}