-
Notifications
You must be signed in to change notification settings - Fork 0
/
baba.mar
117 lines (108 loc) · 2.82 KB
/
baba.mar
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
114
115
116
117
import stdlib.mar
struct Level {
width: Int,
height: Int,
objs: List[ObjAndPoint],
}
struct ObjAndPoint { obj: Obj, pos: Point }
enum Obj { word: Word, baba, flag }
enum Word { baba, is, you, flag, win }
fun @(obj: Obj, pos: Point): ObjAndPoint { ObjAndPoint { obj, pos } }
fun write[W](writer: W, level: Level) {
var map = uninitialized_slice[Slice[List[Obj]]](level.height)
for y in 0..level.height do {
var row = uninitialized_slice[List[Obj]](level.width)
for x in 0..level.width do
row.get_ref(x).* = list[Obj]()
map.get_ref(y).* = row
}
for obj in level.objs do
map.get_ref(obj.pos.y).get_ref(obj.pos.x).push(obj.obj)
for y in 0..level.height do {
for x in 0..level.width do {
var objs = map.get(y).get(x)
var tile = str_builder()
for obj in objs do {
tile.&."{obj}"
}
loop if tile.bytes.len < 4 then tile.&."_" else break
tile.&." "
writer."{tile}"
}
writer."\n"
}
}
fun write[W](writer: W, obj: Obj) {
switch obj
case word(w) writer."{debug(w)}"
case baba writer."BABA"
case flag writer."FLAG"
}
struct Rule {
what: What,
how: How,
}
enum What { word, baba, flag }
enum How { you, win }
fun =>(what: What, how: How): Rule { Rule { what, how } }
fun write[W](writer: W, rule: Rule) {
writer."{rule.what.debug()} is {rule.how.debug()}"
}
fun find_rules(level: Level): List[Rule] {
list(
What.baba => How.you,
What.flag => How.win,
)
}
fun find_rules(run: Slice[Word]): List[Rule] {
}
fun write_ansi_escape_sequence[W](writer: W, sequence: String) {
writer.write(27.lower_byte().to_char())
writer.write(sequence)
}
fun switch_to_alternate_screen() {
stderr.write_ansi_escape_sequence("[?1049h")
}
fun switch_from_alternate_screen() {
stderr.write_ansi_escape_sequence("[?1049l")
}
fun main(): Never {
var level = Level {
width = 10,
height = 10,
objs = list(
Obj.word(Word.baba) @ {0 @ 1},
Obj.word(Word.is) @ {1 @ 1},
Obj.word(Word.you) @ {2 @ 1},
Obj.word(Word.flag) @ {1 @ 0},
Obj.word(Word.win) @ {1 @ 2},
Obj.baba @ {0 @ 0},
Obj.flag @ {5 @ 0},
)
}
switch_to_alternate_screen()
loop {
println(level)
var rules = level.find_rules()
for rule in rules do println(rule)
print("> ")
var line = stdin.read_line().unwrap() or break
if line == "a" then {
for i in 0..level.objs.len do {
var obj = level.objs.get_ref(i)
if obj.obj is baba then
if obj.pos.x > 0 then obj.pos.x = obj.pos.x - 1
}
}
if line == "d" then {
for i in 0..level.objs.len do {
var obj = level.objs.get_ref(i)
if obj.obj is baba then
if obj.pos.x < {level.width - 1} then obj.pos.x = obj.pos.x + 1
}
}
}
switch_from_alternate_screen()
println("Thanks for playing!")
exit(0)
}