-
Notifications
You must be signed in to change notification settings - Fork 3
/
Model.elm
100 lines (83 loc) · 2.35 KB
/
Model.elm
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
module Model exposing (..)
import Time exposing (Time)
import Levels exposing (level_01_str, level_list_str, level_error_str)
import Types exposing (Pos, Block(..))
import Definitions exposing (getPosByIndex)
type alias Tile =
{ pos : Pos
, block : Block
}
type GameState
= GSMenu
| GSPlaying
type alias LevelInfo =
{ id : Int
, level : Level
, unlocked : Bool
, beat : Bool
, bestStep : Int
, bestTime : Time
, failStep : Int -- interface only
}
type alias Model =
{ levels : List LevelInfo
, current : Level
, state : GameState
, selected : Int
, time : Time
, timeStart : Time
, player_animation : Bool
}
type alias Level =
{ tiles : List Tile
, holes : List Pos
, boxes : List Pos
, player : Pos
, steps : Int
}
init : Model
init =
Model levels level_01 GSMenu 1 0.0 0.0 False
level_01 : Level
level_01 =
strToLevel level_01_str
level_error : Level
level_error =
strToLevel level_error_str
levels : List LevelInfo
levels =
List.indexedMap
(\i level_str ->
LevelInfo (i + 1) (strToLevel level_str) (i == 0) False 999999 999999.0 0)
level_list_str
strToLevel : String -> Level
strToLevel str =
let
xs : List (Int, Char)
xs =
str
|> String.toLower
|> String.toList
|> List.indexedMap (\i a -> (i + 1, a))
tiles =
flip List.map xs (\(i, c) ->
Tile
(getPosByIndex i)
(if c == 'x' then
BWall
else if c == '.' then
BVoid
else BFloor))
holes = xs
|> List.filter (\(i, c) -> c == 'o' || c == 'k' )
|> List.map (Tuple.first >> getPosByIndex)
boxes = xs
|> List.filter (\(i, c) -> c == 'b' || c == 'k' )
|> List.map (Tuple.first >> getPosByIndex)
player = xs
|> List.filter (\(i, c) -> c == 'p' )
|> List.map (Tuple.first >> getPosByIndex)
|> List.head
|> Maybe.withDefault (5, 5)
in
Level tiles holes boxes player 0