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 }