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
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
|
#include "2s2h/GameInteractor/GameInteractor.h"
#include "2s2h/ShipInit.hpp"
#include "2s2h/Rando/Logic/Logic.h"
using namespace Rando::Logic;
// clang-format off
static RegisterShipInitFunc initFunc([]() {
Regions[RR_DEKU_KINGS_CHAMBER_HOLDING_CELL] = RandoRegion{ .name = "Holding Cell", .sceneId = SCENE_DEKU_KING,
.checks = {
CHECK(RC_DEKU_KINGS_CHAMBER_MONKEY, CAN_BE_DEKU && HAS_ITEM(ITEM_OCARINA_OF_TIME)),
},
.exits = { // TO FROM
EXIT(ENTRANCE(DEKU_PALACE, 3), ENTRANCE(DEKU_KINGS_CHAMBER, 1), true),
},
};
Regions[RR_DEKU_KINGS_CHAMBER] = RandoRegion{ .sceneId = SCENE_DEKU_KING,
.exits = { // TO FROM
EXIT(ENTRANCE(DEKU_PALACE, 2), ENTRANCE(DEKU_KINGS_CHAMBER, 0), true),
},
.events = {
EVENT(RE_ACCESS_PICTOGRAPH_DEKU_KING, HAS_ITEM(ITEM_PICTOGRAPH_BOX) && CAN_BE_DEKU),
EVENT(RE_RETURN_DEKU_PRINCESS, HAS_BOTTLE && CAN_ACCESS(DEKU_PRINCESS)),
}
};
Regions[RR_DEKU_PALACE_BEAN_SALESMAN_GROTTO] = RandoRegion{ .name = "Deku Palace Bean Salesman Grotto", .sceneId = SCENE_KAKUSIANA,
.checks = {
CHECK(RC_DEKU_PALACE_GROTTO_CHEST, CAN_GROW_BEAN_PLANT || HAS_ITEM(ITEM_HOOKSHOT)),
CHECK(RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_01, true),
CHECK(RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_02, true),
CHECK(RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_03, true),
CHECK(RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_04, true),
CHECK(RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_05, true),
CHECK(RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_06, true),
CHECK(RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_07, true),
CHECK(RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_08, true),
CHECK(RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_09, true),
CHECK(RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_10, true),
CHECK(RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_11, true),
CHECK(RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_12, true),
// TODO: Bean salesman check
},
.exits = { // TO FROM
EXIT(ENTRANCE(DEKU_PALACE, 9), ENTRANCE(GROTTOS, 12), true), // TODO: Grotto mapping
},
};
Regions[RR_DEKU_PALACE_INSIDE] = RandoRegion{ .name = "Inside", .sceneId = SCENE_22DEKUCITY,
.checks = {
CHECK(RC_DEKU_PALACE_PIECE_OF_HEART, true),
CHECK(RC_DEKU_PALACE_POT_01, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_POT_02, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_01, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_02, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_03, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_04, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_05, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_06, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_07, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_08, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_09, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_10, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_11, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_12, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_13, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_14, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_15, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_16, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_17, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_18, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_19, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_20, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_21, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_22, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_23, CAN_BE_DEKU),
CHECK(RC_DEKU_PALACE_FREESTANDING_RUPEE_24, CAN_BE_DEKU),
},
.exits = { // TO FROM
EXIT(ENTRANCE(DEKU_KINGS_CHAMBER, 0), ENTRANCE(DEKU_PALACE, 2), true),
EXIT(ENTRANCE(DEKU_KINGS_CHAMBER, 1), ENTRANCE(DEKU_PALACE, 3), CAN_BE_DEKU), // Cell TODO: Is there something to do with beans here?
EXIT(ENTRANCE(GROTTOS, 12), ENTRANCE(DEKU_PALACE, 9), true), // TODO: Grotto mapping
},
.connections = {
CONNECTION(RR_DEKU_PALACE_OUTSIDE, true),
},
};
Regions[RR_DEKU_PALACE_OUTSIDE] = RandoRegion{ .name = "Outside", .sceneId = SCENE_22DEKUCITY,
.exits = { // TO FROM
EXIT(ENTRANCE(SOUTHERN_SWAMP_POISONED, 3), ENTRANCE(DEKU_PALACE, 0), true),
EXIT(ENTRANCE(SOUTHERN_SWAMP_POISONED, 4), ENTRANCE(DEKU_PALACE, 5), CAN_BE_DEKU), // Treetop
EXIT(ENTRANCE(DEKU_SHRINE, 0), ENTRANCE(DEKU_PALACE, 4), RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
},
.connections = {
CONNECTION(RR_DEKU_PALACE_INSIDE, CAN_BE_DEKU),
},
};
Regions[RR_DEKU_SHRINE_ENTRANCE] = RandoRegion{ .name = "Entrance", .sceneId = SCENE_DANPEI,
.exits = { // TO FROM
EXIT(ENTRANCE(DEKU_PALACE, 4), ENTRANCE(DEKU_SHRINE, 0), true),
},
.connections = {
CONNECTION(RR_DEKU_SHRINE, RANDO_EVENTS[RE_RETURN_DEKU_PRINCESS]),
},
};
Regions[RR_DEKU_SHRINE] = RandoRegion{ .sceneId = SCENE_DANPEI,
.checks = {
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_01, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_02, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_03, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_04, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_05, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_06, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_07, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_08, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_09, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_10, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_11, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_12, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_13, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_14, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_15, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_16, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_17, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_18, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_19, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_20, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_21, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_22, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_23, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_24, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_25, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_26, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_27, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_28, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_29, true),
CHECK(RC_DEKU_SHRINE_FREESTANDING_RUPEE_30, true),
CHECK(RC_DEKU_SHRINE_POT_01, true),
CHECK(RC_DEKU_SHRINE_POT_02, true),
CHECK(RC_DEKU_SHRINE_MASK_OF_SCENTS, true),
},
.connections = {
CONNECTION(RR_DEKU_SHRINE_ENTRANCE, RANDO_EVENTS[RE_RETURN_DEKU_PRINCESS]),
},
};
Regions[RR_MAGIC_HAGS_POTION_SHOP] = RandoRegion{ .sceneId = SCENE_WITCH_SHOP,
.checks = {
CHECK(RC_HAGS_POTION_SHOP_FREESTANDING_RUPEE, true),
// TODO: Add CAN_ACCESS(MUSHROOM) once that is shuffled.
CHECK(RC_HAGS_POTION_SHOP_ITEM_01, CAN_AFFORD(RC_HAGS_POTION_SHOP_ITEM_01) && HAS_ITEM(ITEM_MASK_SCENTS) && HAS_BOTTLE),
CHECK(RC_HAGS_POTION_SHOP_ITEM_02, CAN_AFFORD(RC_HAGS_POTION_SHOP_ITEM_02)),
CHECK(RC_HAGS_POTION_SHOP_ITEM_03, CAN_AFFORD(RC_HAGS_POTION_SHOP_ITEM_03)),
CHECK(RC_HAGS_POTION_SHOP_KOTAKE, true),
},
.exits = { // TO FROM
EXIT(ENTRANCE(SOUTHERN_SWAMP_POISONED, 5), ENTRANCE(MAGIC_HAGS_POTION_SHOP, 0), true),
},
.events = {
EVENT(RE_ACCESS_RED_POTION_REFILL, true),
},
};
Regions[RR_ROAD_TO_SOUTHERN_SWAMP_GROTTO] = RandoRegion{ .name = "Road to Southern Swamp Grotto", .sceneId = SCENE_KAKUSIANA,
.checks = {
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_CHEST, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_01, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_02, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_03, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_04, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_05, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_06, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_07, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_08, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_09, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_10, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_11, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_12, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_13, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_14, true),
},
.connections = {
CONNECTION(RR_ROAD_TO_SOUTHERN_SWAMP, true), // TODO: Grotto mapping
},
};
Regions[RR_ROAD_TO_SOUTHERN_SWAMP] = RandoRegion{ .sceneId = SCENE_24KEMONOMITI,
.checks = {
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_PIECE_OF_HEART, CAN_USE_PROJECTILE || HAS_ITEM(ITEM_BOMBCHU)),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_TINGLE_MAP_01, CAN_USE_PROJECTILE && CAN_AFFORD(RC_ROAD_TO_SOUTHERN_SWAMP_TINGLE_MAP_01)),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_TINGLE_MAP_02, CAN_USE_PROJECTILE && CAN_AFFORD(RC_ROAD_TO_SOUTHERN_SWAMP_TINGLE_MAP_02)),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_01, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_02, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_03, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_04, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_05, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_06, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_07, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_08, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_09, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_10, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_11, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_12, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_13, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_14, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_15, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_16, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_17, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_18, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_19, true),
CHECK(RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_20, true),
},
.exits = { // TO FROM
EXIT(ENTRANCE(TERMINA_FIELD, 1), ENTRANCE(ROAD_TO_SOUTHERN_SWAMP, 0), true),
EXIT(ENTRANCE(SOUTHERN_SWAMP_POISONED, 0), ENTRANCE(ROAD_TO_SOUTHERN_SWAMP, 1), true),
EXIT(ENTRANCE(SWAMP_SHOOTING_GALLERY, 0), ENTRANCE(ROAD_TO_SOUTHERN_SWAMP, 2), true),
},
.connections = {
CONNECTION(RR_ROAD_TO_SOUTHERN_SWAMP_GROTTO, true), // TODO: Grotto mapping
},
.events = {
EVENT(RE_ACCESS_PICTOGRAPH_TINGLE, HAS_ITEM(ITEM_PICTOGRAPH_BOX)),
EVENT(RE_ACCESS_SPRING_WATER, true),
},
};
Regions[RR_SOUTHERN_SWAMP_GROTTO] = RandoRegion{ .name = "Southern Swamp Grotto", .sceneId = SCENE_KAKUSIANA,
.checks = {
CHECK(RC_SOUTHERN_SWAMP_GROTTO_CHEST, true),
CHECK(RC_SOUTHERN_SWAMP_GROTTO_GRASS_01, true),
CHECK(RC_SOUTHERN_SWAMP_GROTTO_GRASS_02, true),
CHECK(RC_SOUTHERN_SWAMP_GROTTO_GRASS_03, true),
CHECK(RC_SOUTHERN_SWAMP_GROTTO_GRASS_04, true),
CHECK(RC_SOUTHERN_SWAMP_GROTTO_GRASS_05, true),
CHECK(RC_SOUTHERN_SWAMP_GROTTO_GRASS_06, true),
CHECK(RC_SOUTHERN_SWAMP_GROTTO_GRASS_07, true),
CHECK(RC_SOUTHERN_SWAMP_GROTTO_GRASS_08, true),
CHECK(RC_SOUTHERN_SWAMP_GROTTO_GRASS_09, true),
CHECK(RC_SOUTHERN_SWAMP_GROTTO_GRASS_10, true),
CHECK(RC_SOUTHERN_SWAMP_GROTTO_GRASS_11, true),
CHECK(RC_SOUTHERN_SWAMP_GROTTO_GRASS_12, true),
CHECK(RC_SOUTHERN_SWAMP_GROTTO_GRASS_13, true),
CHECK(RC_SOUTHERN_SWAMP_GROTTO_GRASS_14, true),
},
.connections = {
CONNECTION(RR_SOUTHERN_SWAMP_SOUTH, true), // TODO: Grotto mapping
},
};
Regions[RR_SOUTHERN_SWAMP_NORTH] = RandoRegion{ .name = "North Section", .sceneId = SCENE_20SICHITAI,
.checks = {
CHECK(RC_SOUTHERN_SWAMP_FROG, HAS_ITEM(ITEM_MASK_DON_GERO)),
CHECK(RC_SOUTHERN_SWAMP_PIECE_OF_HEART, CAN_BE_DEKU && Flags_GetRandoInf(RANDO_INF_OBTAINED_DEED_LAND)),
CHECK(RC_SOUTHERN_SWAMP_SCRUB_DEED, Flags_GetRandoInf(RANDO_INF_OBTAINED_DEED_LAND)),
CHECK(RC_SOUTHERN_SWAMP_SCRUB_BEANS, CAN_BE_DEKU),
CHECK(RC_SOUTHERN_SWAMP_OWL_STATUE, CAN_USE_SWORD),
CHECK(RC_SOUTHERN_SWAMP_POISON_POT_01, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_POT_02, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_POT_03, true),
CHECK(RC_SOUTHERN_SWAMP_CLEAR_POT_01, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEAR_POT_02, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEAR_POT_03, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_FREESTANDING_RUPEE_01, CAN_BE_DEKU || CAN_BE_ZORA),
CHECK(RC_SOUTHERN_SWAMP_FREESTANDING_RUPEE_02, CAN_BE_DEKU || CAN_BE_ZORA),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_01, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_02, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_03, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_04, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_05, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_06, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_07, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_08, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_09, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_10, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_11, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_12, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_13, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_14, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_15, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_16, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_17, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_18, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_19, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_20, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_21, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_22, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_23, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_24, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_25, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_26, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_27, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_28, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_29, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_30, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_01, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_02, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_03, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_04, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_05, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_06, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_07, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_08, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_09, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_10, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_11, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_12, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_13, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_14, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_15, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_16, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_17, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_18, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_19, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_20, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_21, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_22, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_23, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_24, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_25, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_26, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_27, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_28, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_29, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_30, true),
},
.exits = { // TO FROM
EXIT(ENTRANCE(ROAD_TO_SOUTHERN_SWAMP, 1), ENTRANCE(SOUTHERN_SWAMP_POISONED, 0), true),
EXIT(ENTRANCE(TOURIST_INFORMATION, 0), ENTRANCE(SOUTHERN_SWAMP_POISONED, 1), true),
EXIT(ENTRANCE(MAGIC_HAGS_POTION_SHOP, 0), ENTRANCE(SOUTHERN_SWAMP_POISONED, 5), true),
EXIT(ENTRANCE(WOODS_OF_MYSTERY, 0), ENTRANCE(SOUTHERN_SWAMP_POISONED, 7), true),
},
.connections = {
CONNECTION(RR_SOUTHERN_SWAMP_SOUTH, (RANDO_EVENTS[RE_SOUTHERN_SWAMP_KILL_OCTOROK] || RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE])),
},
.events = {
EVENT(RE_ACCESS_SPRING_WATER, true),
EVENT(RE_ACCESS_BEANS_REFILL, CAN_BE_DEKU && HAS_ITEM(ITEM_MAGIC_BEANS)),
EVENT(RE_SOUTHERN_SWAMP_KILL_OCTOROK, (HAS_ITEM(ITEM_BOW) || HAS_ITEM(ITEM_HOOKSHOT) || CAN_BE_ZORA)),
EVENT(RE_ACCESS_PICTOGRAPH_SWAMP_GENERIC, HAS_ITEM(ITEM_PICTOGRAPH_BOX)),
},
.oneWayEntrances = {
ENTRANCE(SOUTHERN_SWAMP_POISONED, 9), // From river in Ikana
ENTRANCE(SOUTHERN_SWAMP_POISONED, 10), // From Song of Soaring
}
};
Regions[RR_SOUTHERN_SWAMP_SOUTH] = RandoRegion{ .name = "South Section", .sceneId = SCENE_20SICHITAI,
.checks = {
CHECK(RC_SOUTHERN_SWAMP_SONG_OF_SOARING, CAN_BE_DEKU),
},
.exits = { // TO FROM
EXIT(ENTRANCE(WOODFALL, 0), ENTRANCE(SOUTHERN_SWAMP_POISONED, 2), CAN_BE_DEKU || RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
EXIT(ENTRANCE(DEKU_PALACE, 0), ENTRANCE(SOUTHERN_SWAMP_POISONED, 3), true),
EXIT(ENTRANCE(DEKU_PALACE, 5), ENTRANCE(SOUTHERN_SWAMP_POISONED, 4), CAN_BE_DEKU), // Treetop
EXIT(ENTRANCE(SWAMP_SPIDER_HOUSE, 0), ENTRANCE(SOUTHERN_SWAMP_POISONED, 8), CAN_LIGHT_TORCH_NEAR_ANOTHER && (CAN_BE_DEKU || RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE])),
},
.connections = {
CONNECTION(RR_SOUTHERN_SWAMP_NORTH, (RANDO_EVENTS[RE_SOUTHERN_SWAMP_KILL_OCTOROK] || RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE])),
CONNECTION(RR_SOUTHERN_SWAMP_GROTTO, CAN_BE_DEKU), // TODO: Grotto mapping
},
.events = {
EVENT(RE_ACCESS_PICTOGRAPH_SWAMP_GENERIC, HAS_ITEM(ITEM_PICTOGRAPH_BOX)) //Adding here to future proof for later when map shuffle is in.
}
};
Regions[RR_SWAMP_SHOOTING_GALLERY] = RandoRegion{ .sceneId = SCENE_SYATEKI_MORI,
.checks = {
CHECK(RC_SWAMP_SHOOTING_GALLERY_HIGH_SCORE, HAS_ITEM(ITEM_BOW)),
CHECK(RC_SWAMP_SHOOTING_GALLERY_PERFECT_SCORE, HAS_ITEM(ITEM_BOW)),
},
.exits = { // TO FROM
EXIT(ENTRANCE(ROAD_TO_SOUTHERN_SWAMP, 2), ENTRANCE(SWAMP_SHOOTING_GALLERY, 0), true),
},
};
Regions[RR_TOURIST_INFORMATION] = RandoRegion{ .sceneId = SCENE_MAP_SHOP,
.checks = {
// Also requires poison to not be cleared
CHECK(RC_TOURIST_INFORMATION_ARCHERY, RANDO_EVENTS[RE_SAVED_KOUME] && RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_TOURIST_INFORMATION_GOOD_PHOTO, CAN_ACCESS(PICTOGRAPH_TINGLE) || CAN_ACCESS(PICTOGRAPH_DEKU_KING)),
CHECK(RC_TOURIST_INFORMATION_PICTOBOX, RANDO_EVENTS[RE_SAVED_KOUME]),
},
.exits = { // TO FROM
EXIT(ENTRANCE(SOUTHERN_SWAMP_POISONED, 1), ENTRANCE(TOURIST_INFORMATION, 0), true),
},
.events = {
EVENT(RE_SOUTHERN_SWAMP_KILL_OCTOROK, RANDO_EVENTS[RE_SAVED_KOUME] || CAN_ACCESS(PICTOGRAPH_SWAMP_GENERIC)),
},
};
Regions[RR_WOODFALL_GREAT_FAIRY_FOUNTAIN] = RandoRegion{ .name = "Woodfall", .sceneId = SCENE_YOUSEI_IZUMI,
.checks = {
CHECK(RC_WOODFALL_GREAT_FAIRY, HAS_ENOUGH_STRAY_FAIRIES(DUNGEON_SCENE_INDEX_WOODFALL_TEMPLE)),
},
.exits = { // TO FROM
EXIT(ENTRANCE(WOODFALL, 2), ENTRANCE(FAIRY_FOUNTAIN, 1), true),
},
};
Regions[RR_WOODFALL] = RandoRegion{ .sceneId = SCENE_21MITURINMAE,
.checks = {
CHECK(RC_WOODFALL_ENTRANCE_CHEST, CAN_BE_DEKU || RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
CHECK(RC_WOODFALL_PIECE_OF_HEART_CHEST, CAN_BE_DEKU),
CHECK(RC_WOODFALL_OWL_STATUE, CAN_USE_SWORD),
CHECK(RC_WOODFALL_NEAR_OWL_CHEST, CAN_BE_DEKU),
CHECK(RC_WOODFALL_POT_01, CAN_BE_DEKU || CAN_OWL_WARP(OWL_WARP_WOODFALL)),
CHECK(RC_WOODFALL_POT_02, CAN_BE_DEKU || CAN_OWL_WARP(OWL_WARP_WOODFALL)),
CHECK(RC_WOODFALL_POT_03, CAN_BE_DEKU || CAN_OWL_WARP(OWL_WARP_WOODFALL)),
CHECK(RC_WOODFALL_FREESTANDING_RUPEE, CAN_BE_DEKU),
CHECK(RC_WOODFALL_GRASS_01, true),
CHECK(RC_WOODFALL_GRASS_02, true),
CHECK(RC_WOODFALL_GRASS_03, true),
CHECK(RC_WOODFALL_GRASS_04, true),
CHECK(RC_WOODFALL_GRASS_05, true),
CHECK(RC_WOODFALL_GRASS_06, true),
},
.exits = { // TO FROM
EXIT(ENTRANCE(SOUTHERN_SWAMP_POISONED, 2), ENTRANCE(WOODFALL, 0), true),
EXIT(ENTRANCE(WOODFALL_TEMPLE, 0), ENTRANCE(WOODFALL, 1), CanAccessDungeon(DUNGEON_SCENE_INDEX_WOODFALL_TEMPLE)),
EXIT(ENTRANCE(FAIRY_FOUNTAIN, 1), ENTRANCE(WOODFALL, 2), CAN_BE_DEKU),
EXIT(ENTRANCE(WOODFALL_TEMPLE, 2), ENTRANCE(WOODFALL, 3), RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
},
};
Regions[RR_WOODS_OF_MYSTERY_GROTTO] = RandoRegion{ .name = "Woods of Mystery Grotto", .sceneId = SCENE_KAKUSIANA,
.checks = {
CHECK(RC_WOODS_OF_MYSTERY_GROTTO_CHEST, true),
CHECK(RC_WOODS_OF_MYSTERY_GROTTO_GRASS_01, true),
CHECK(RC_WOODS_OF_MYSTERY_GROTTO_GRASS_02, true),
CHECK(RC_WOODS_OF_MYSTERY_GROTTO_GRASS_03, true),
CHECK(RC_WOODS_OF_MYSTERY_GROTTO_GRASS_04, true),
CHECK(RC_WOODS_OF_MYSTERY_GROTTO_GRASS_05, true),
CHECK(RC_WOODS_OF_MYSTERY_GROTTO_GRASS_06, true),
CHECK(RC_WOODS_OF_MYSTERY_GROTTO_GRASS_07, true),
CHECK(RC_WOODS_OF_MYSTERY_GROTTO_GRASS_08, true),
CHECK(RC_WOODS_OF_MYSTERY_GROTTO_GRASS_09, true),
CHECK(RC_WOODS_OF_MYSTERY_GROTTO_GRASS_10, true),
CHECK(RC_WOODS_OF_MYSTERY_GROTTO_GRASS_11, true),
CHECK(RC_WOODS_OF_MYSTERY_GROTTO_GRASS_12, true),
CHECK(RC_WOODS_OF_MYSTERY_GROTTO_GRASS_13, true),
CHECK(RC_WOODS_OF_MYSTERY_GROTTO_GRASS_14, true),
},
.connections = {
CONNECTION(RR_WOODS_OF_MYSTERY, true), // TODO: Grotto mapping
},
};
Regions[RR_WOODS_OF_MYSTERY] = RandoRegion{ .sceneId = SCENE_26SARUNOMORI,
.checks = {
CHECK(RC_WOODS_OF_MYSTERY_GRASS_01, true),
CHECK(RC_WOODS_OF_MYSTERY_GRASS_02, true),
CHECK(RC_WOODS_OF_MYSTERY_GRASS_03, true),
CHECK(RC_WOODS_OF_MYSTERY_GRASS_04, true),
CHECK(RC_WOODS_OF_MYSTERY_GRASS_05, true),
CHECK(RC_WOODS_OF_MYSTERY_GRASS_06, true),
CHECK(RC_WOODS_OF_MYSTERY_GRASS_07, true),
CHECK(RC_WOODS_OF_MYSTERY_GRASS_08, true),
CHECK(RC_WOODS_OF_MYSTERY_GRASS_09, true),
CHECK(RC_WOODS_OF_MYSTERY_GRASS_10, true),
CHECK(RC_WOODS_OF_MYSTERY_GRASS_11, true),
CHECK(RC_WOODS_OF_MYSTERY_GRASS_12, true),
CHECK(RC_WOODS_OF_MYSTERY_GRASS_13, true),
CHECK(RC_WOODS_OF_MYSTERY_GRASS_14, true),
CHECK(RC_WOODS_OF_MYSTERY_GRASS_15, true),
CHECK(RC_WOODS_OF_MYSTERY_GRASS_16, true),
CHECK(RC_WOODS_OF_MYSTERY_GRASS_17, true),
CHECK(RC_WOODS_OF_MYSTERY_GRASS_18, true),
CHECK(RC_WOODS_OF_MYSTERY_GRASS_19, true),
CHECK(RC_WOODS_OF_MYSTERY_GRASS_20, true),
CHECK(RC_WOODS_OF_MYSTERY_GRASS_21, true),
},
.exits = { // TO FROM
EXIT(ENTRANCE(SOUTHERN_SWAMP_POISONED, 7), ENTRANCE(WOODS_OF_MYSTERY, 0), true),
},
.connections = {
CONNECTION(RR_WOODS_OF_MYSTERY_GROTTO, true), // TODO: Grotto mapping
},
.events = {
EVENT(RE_SAVED_KOUME, HAS_BOTTLE && (CAN_ACCESS(RED_POTION_REFILL) || CAN_ACCESS(BLUE_POTION_REFILL))),
},
};
}, {});
// clang-format on
|