-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathlevel.js
213 lines (201 loc) · 12 KB
/
level.js
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
{
name: 'level-grammar',
stages:
[{ name: 'init',
limit: 1,
rules: [
// replace init--node with start-->end
{ lhs: { node: [{ id: "init", label: { name: "init" } },
{ id: "node", label: { name: "node" } }],
edge: [{ v: "init", w: "node", label: { name: "edge" } },
{ v: "node", w: "init", label: { name: "edge" } }] },
rhs: { node: [{ id: "start", head:["init"], tail:["init"], label: { $merge: [ { $eval: '$init.label' },
{ name: "start" }] } },
{ id: "end", head:["node"], tail:["node"], label: { $merge: [ { $eval: '$node.label' },
{ name: "end",
endpoint: true }] } }],
edge: [{ v: "start", w: "end", label: { name: "path" } }] } }
] },
{ name: 'extend',
rules: [
// replace b--x with mid-->end where b is an endpoint
{ weight: 2,
lhs: { node: [{ id: "b", label: { endpoint: true } },
{ id: "x", label: { name: "node" } }],
edge: [{ v: "b", w: "x", label: { name: "edge" } },
{ v: "x", w: "b", label: { name: "edge" } }] },
rhs: { node: [{ id: "mid", head:["b"], tail:["b"], label: { $merge: [ { $eval: '$b.label' },
{ name: "room" } ] } },
{ id: "end", head:["x"], tail:["x"], label: { $merge: [ { $eval: '$x.label' },
{ name: '${b.label.name}' } ] } }],
edge: [{ v: "mid", w: "end", label: { name: "path" } }] } },
// replace x--a-->... with herring<--a-->...
{ weight: .25,
limit: 2,
lhs: { node: [{ id: "a", label: { $and: [{ $not: { name: "node" } },
{ $not: { endpoint: true } }] } },
{ id: "x", label: { name: "node" } }],
edge: [{ v: "a", w: "x", label: { name: "edge" } },
{ v: "x", w: "a", label: { name: "edge" } }] },
rhs: { node: [{ id: "a" },
{ id: "side", head:["x"], tail:["x"], label: { $merge: [ { $eval: '$x.label' },
{ name: 'herring',
endpoint: true } ] } }],
edge: [{ v: "a", w: "side", label: { name: "path" } }] } },
// replace a->d with a->d
// | | | ^
// | | v |
// x--y b->c
// wrinkle in path (no a->d connection on rhs)
{ lhs: { node: [{ id: "a", label: { $not: { name: "node" } } },
{ id: "d", label: { $not: { name: "node" } } },
{ id: "x", label: { name: "node" } },
{ id: "y", label: { name: "node" } }],
edge: [{ v: "a", w: "d", label: { name: "path" } },
{ v: "a", w: "x", label: { name: "edge" } },
{ v: "x", w: "a", label: { name: "edge" } },
{ v: "x", w: "y", label: { name: "edge" } },
{ v: "y", w: "x", label: { name: "edge" } },
{ v: "y", w: "d", label: { name: "edge" } },
{ v: "d", w: "y", label: { name: "edge" } }] },
rhs: { node: [{ id: "a" },
{ id: "d" },
{ id: "b", head:["x"], tail:["x"], label: { $merge: [{ $eval: '$x.label' },
{ name: "room" }] } },
{ id: "c", head:["y"], tail:["y"], label: { $merge: [{ $eval: '$y.label' },
{ name: "room" }] } }],
edge: [{ v: "a", w: "b", label: { name: "path" } },
{ v: "b", w: "c", label: { name: "path" } },
{ v: "c", w: "d", label: { name: "path" } }] } },
// fork: a->d splits to a->d->c and a->b->c. endpoint moves from d to c
{ weight: .1,
limit: 4,
lhs: { node: [{ id: "a", label: { $not: { name: "node" } } },
{ id: "d", label: { endpoint: true } },
{ id: "x", label: { name: "node" } },
{ id: "y", label: { name: "node" } }],
edge: [{ v: "a", w: "d", label: { name: "path" } },
{ v: "a", w: "x", label: { name: "edge" } },
{ v: "x", w: "a", label: { name: "edge" } },
{ v: "x", w: "y", label: { name: "edge" } },
{ v: "y", w: "x", label: { name: "edge" } },
{ v: "y", w: "d", label: { name: "edge" } },
{ v: "d", w: "y", label: { name: "edge" } }] },
rhs: { node: [{ id: "a" },
{ id: "d2", head:["d"], tail:["d"], label: { $merge: [ { $eval: '$d.label' },
{ name: "room" } ] } },
{ id: "b", head:["x"], tail:["x"], label: { $merge: [ { $eval: '$x.label' },
{ name: "room" } ] } },
{ id: "c", head:["y"], tail:["y"], label: { $merge: [ { $eval: '$y.label' },
{ name: '${d.label.name}' } ] } }],
edge: [{ v: "a", w: "b", label: { name: "fork", dot: { style: "dotted" } } },
{ v: "b", w: "c", label: { name: "path" } },
{ v: "a", w: "d2", label: { name: "fork", dot: { style: "dotted" } } },
{ v: "d2", w: "c", label: { name: "path" } }] } },
// cave: a->b->c adds a corner d
{ weight: 1,
limit: 4,
lhs: { node: [{ id: "a", label: { $not: { name: "node" } } },
{ id: "b", label: { $not: { name: "node" } } },
{ id: "c", label: { $not: { name: "node" } } },
{ id: "x", label: { name: "node" } }],
edge: [{ v: "a", w: "b", label: { $or: [ { name: "path" }, { name: "cave" } ] } },
{ v: "b", w: "c", label: { $or: [ { name: "path" }, { name: "cave" } ] } },
{ v: "a", w: "x", label: { name: "edge" } },
{ v: "x", w: "a", label: { name: "edge" } },
{ v: "c", w: "x", label: { name: "edge" } },
{ v: "x", w: "c", label: { name: "edge" } }] },
rhs: { node: [{ id: "a" },
{ id: "b" },
{ id: "c" },
{ id: "d", head:["x"], tail:["x"], label: { $merge: [ { $eval: '$x.label' },
{ name: "room" } ] } }],
edge: [{ v: "a", w: "b", label: { name: "cave", dot: { style: "dotted" } } },
{ v: "b", w: "c", label: { name: "cave", dot: { style: "dotted" } } },
{ v: "a", w: "d", label: { name: "cave", dot: { style: "dotted" } } },
{ v: "d", w: "c", label: { name: "cave", dot: { style: "dotted" } } },
{ v: "a", w: "c", label: { dot: { style: "dotted" } } },
{ v: "b", w: "d", label: { dot: { style: "dotted" } } }] } },
// shortcut
{ limit: 3,
lhs: { node: [{ id: "a", label: { $not: { name: "node" } } },
{ id: "d", label: { $not: { name: "node" } } },
{ id: "x", label: { name: "node" } },
{ id: "y", label: { name: "node" } }],
edge: [{ v: "a", w: "d", label: { name: "path" } },
{ v: "a", w: "x", label: { name: "edge" } },
{ v: "x", w: "a", label: { name: "edge" } },
{ v: "x", w: "y", label: { name: "edge" } },
{ v: "y", w: "x", label: { name: "edge" } },
{ v: "y", w: "d", label: { name: "edge" } },
{ v: "d", w: "y", label: { name: "edge" } }] },
rhs: { node: [{ id: "a" },
{ id: "d" },
{ id: "b", head:["x"], tail:["x"], label: { $merge: [ { $eval: '$x.label' },
{ name: "room" } ] } },
{ id: "c", head:["y"], tail:["y"], label: { $merge: [ { $eval: '$y.label' },
{ name: "room" } ] } }],
edge: [{ v: "a", w: "d", label: { name: "shortcut", dot: { style: "dotted" } } },
{ v: "a", w: "b", label: { name: "path" } },
{ v: "b", w: "c", label: { name: "path" } },
{ v: "c", w: "d", label: { name: "path" } }] } },
// valves to side quest
{ limit: 3,
lhs: { node: [{ id: "a", label: { $not: { name: "node" } } },
{ id: "d", label: { $not: { name: "node" } } },
{ id: "x", label: { name: "node" } },
{ id: "y", label: { name: "node" } }],
edge: [{ v: "a", w: "d", label: { name: "path" } },
{ v: "a", w: "x", label: { name: "edge" } },
{ v: "x", w: "a", label: { name: "edge" } },
{ v: "x", w: "y", label: { name: "edge" } },
{ v: "y", w: "x", label: { name: "edge" } },
{ v: "y", w: "d", label: { name: "edge" } },
{ v: "d", w: "y", label: { name: "edge" } }] },
rhs: { node: [{ id: "a" },
{ id: "d" },
{ id: "b", head:["x"], tail:["x"], label: { $merge: [ { $eval: '$x.label' },
{ name: "room" } ] } },
{ id: "c", head:["y"], tail:["y"], label: { $merge: [ { $eval: '$y.label' },
{ name: "room" } ] } }],
edge: [{ v: "a", w: "d", label: { name: "path" } },
{ v: "a", w: "b", label: { name: "valve", dot: { style: "dotted" } } },
{ v: "b", w: "c", label: { name: "path" } },
{ v: "c", w: "d", label: { name: "valve", dot: { style: "dotted" } } }] } },
// key-door
{ limit: 1,
weight: .5,
lhs: { node: [{ id: "a", label: { $not: { name: "node" } } },
{ id: "d", label: { $not: { name: "node" } } },
{ id: "x", label: { name: "node" } },
{ id: "y", label: { name: "node" } }],
edge: [{ v: "a", w: "d", label: { name: "path" } },
{ v: "a", w: "x", label: { name: "edge" } },
{ v: "x", w: "a", label: { name: "edge" } },
{ v: "x", w: "y", label: { name: "edge" } },
{ v: "y", w: "x", label: { name: "edge" } },
{ v: "y", w: "d", label: { name: "edge" } },
{ v: "d", w: "y", label: { name: "edge" } }] },
rhs: { node: [{ id: "a" },
{ id: "d" },
{ id: "b", head:["x"], tail:["x"], label: { $merge: [ { $eval: '$x.label' },
{ name: "room" } ] } },
{ id: "c", head:["y"], tail:["y"], label: { $merge: [ { $eval: '$y.label' },
{ name: "room" } ] } }],
edge: [{ v: "a", w: "d", label: { name: "lock", dot: { style: "dotted" } } },
{ v: "a", w: "c", label: { name: "key", dot: { style: "dotted" } } },
{ v: "a", w: "b", label: { name: "path" } },
{ v: "b", w: "c", label: { name: "path" } },
{ v: "c", w: "a", label: { name: "valve", dot: { style: "dashed" } } }] } },
] },
{ name: 'trim',
rules: [
{ lhs: { node: [{ id: "a" },
{ id: "b" }],
edge: [{ v: "a", w: "b", label: { name: "edge" } }] },
rhs: { node: [{ id: "a" },
{ id: "b" }],
edge: [] } }
] }
]
}