summaryrefslogtreecommitdiff
path: root/mm/2s2h/Rando/Logic/Regions/South.cpp
blob: 3f35c4473f342e1b262679c4db0903c23ccbb0c1 (plain)
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