/ src / Level.ts
Level.ts
 1  import { levels } from './levels'
 2  
 3  const DEFAULT_SCREEN_WIDTH = 9
 4  const DEFAULT_SCREEN_HEIGHT = 9
 5  
 6  export interface LevelUser {
 7    success: boolean
 8  }
 9  
10  export interface LevelFixed {
11    readonly map: Array<Array<string>>
12    readonly name: string
13    readonly number: number
14    readonly screenWidth: number
15    readonly screenHeight: number
16  }
17  
18  export interface LevelDynamic {
19    readonly accessible: boolean
20  }
21  
22  export interface Level {
23    // Statique. Ne change pas.
24    fixed: LevelFixed
25  
26    // Dynamique.
27    dynamic: LevelDynamic
28  
29    // Lié à ce que fait l'utilisateur.
30    user: LevelUser
31  }
32  
33  /*
34   * Parseur de niveau :
35   *
36   * - Les espaces sont ignorés au début de chaque ligne
37   * - Les lignes vides sont ignorées
38   * - Les espaces séparent les cellules
39   */
40  function parseStringLevel(level: string): Array<Array<string>> {
41    // Retire les espaces au début de chaque ligne
42    let levelWithoutSpace = level.replace(/^ +/gm, '')
43  
44    // Remplace les espaces consécutives par une seule espace
45    levelWithoutSpace = levelWithoutSpace.replace(/ +/g, ' ')
46  
47    // Coupe à chaque ligne
48    let lines = levelWithoutSpace.split(/\n/)
49  
50    // Retire les lignes vides
51    lines = lines.filter((el: string) => el.length > 0)
52  
53    const map = []
54  
55    for (const line of lines) {
56      const cells = line.split(' ')
57  
58      map.push(cells)
59    }
60  
61    return map
62  }
63  
64  export class LevelManager {
65    public getLevels(): { [key: string]: LevelFixed } {
66      const levelsReturned: { [key: string]: LevelFixed } = {}
67  
68      let i = 1
69  
70      for (const [ name, level ] of Object.entries(levels)) {
71        const l: LevelFixed = {
72          map: parseStringLevel(level.map),
73          number: i,
74          name,
75          screenWidth: 'screenWidth' in level ? level.screenWidth : DEFAULT_SCREEN_WIDTH,
76          screenHeight: 'screenHeight' in level ? level.screenHeight : DEFAULT_SCREEN_HEIGHT,
77        }
78  
79        levelsReturned[name] = l
80  
81        i += 1
82      }
83  
84      return levelsReturned
85    }
86  }