summaryrefslogtreecommitdiff
path: root/mm/2s2h/Rando/Logic/Regions/North.cpp
blob: 5e4d5aae17115b41dde7e20d5bfda1a745f10b94 (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
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
#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_GORON_GRAVEYARD] = RandoRegion{ .sceneId = SCENE_GORON_HAKA,
        .checks = {
            CHECK(RC_GORON_GRAVEYARD_DARMANI, CAN_PLAY_SONG(HEALING) && HAS_MAGIC && HAS_ITEM(ITEM_LENS_OF_TRUTH))
        },
        .exits = { //     TO                                         FROM
            EXIT(ENTRANCE(MOUNTAIN_VILLAGE_WINTER, 3),      ENTRANCE(GORON_GRAVERYARD, 0), true),
        },
        .events = {
            EVENT(RE_ACCESS_HOT_SPRING_WATER, CAN_BE_GORON),
            EVENT(RE_ACCESS_SPRING_WATER, CAN_BE_GORON),
        },
    };
    Regions[RR_GORON_SHRINE] = RandoRegion{ .sceneId = SCENE_16GORON_HOUSE,
        .checks = {
            CHECK(RC_GORON_SHRINE_FULL_LULLABY, CAN_BE_GORON && (CAN_PLAY_SONG(LULLABY) || CAN_PLAY_SONG(LULLABY_INTRO))),
            CHECK(RC_GORON_SHRINE_POT_01, true),
            CHECK(RC_GORON_SHRINE_POT_02, true),
            CHECK(RC_GORON_SHRINE_POT_03, true),
            CHECK(RC_GORON_SHRINE_POT_04, true),
            CHECK(RC_GORON_SHRINE_POT_05, true),
            CHECK(RC_GORON_SHRINE_POT_06, true),
            CHECK(RC_GORON_SHRINE_POT_07, true),
            CHECK(RC_GORON_SHRINE_POT_08, true),
            CHECK(RC_GORON_SHRINE_POT_09, true),
            CHECK(RC_GORON_SHRINE_POT_10, true),
            CHECK(RC_GORON_SHRINE_POT_11, true),
        },
        .exits = { //     TO                                         FROM
            EXIT(ENTRANCE(GORON_VILLAGE_WINTER, 2),      ENTRANCE(GORON_SHRINE, 0), true),
            EXIT(ENTRANCE(GORON_SHOP, 0),                ENTRANCE(GORON_SHRINE, 1), true)
        },
        .events = {
            // Can either play the song for the Goron child to light torches then use sticks, or shoot the chandelier with fire arrows to skip needing the song(or I guess the small torches themselves, same result)
            EVENT(RE_SPAWN_SIRLOIN, ((CAN_PLAY_SONG(LULLABY) && HAS_ITEM(ITEM_DEKU_STICK) || CAN_USE_MAGIC_ARROW(FIRE))) && CAN_BE_GORON && HAS_MAGIC),
        },
    };
    Regions[RR_GORON_RACETRACK] = RandoRegion{ .sceneId = SCENE_GORONRACE,
        .checks = {
            CHECK(RC_GORON_RACETRACK_GOLD_DUST, CAN_BE_GORON && HAS_MAGIC && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_GORON_RACETRACK_POT_01, true),
            CHECK(RC_GORON_RACETRACK_POT_02, true),
            CHECK(RC_GORON_RACETRACK_POT_03, true),
            CHECK(RC_GORON_RACETRACK_POT_04, true),
            CHECK(RC_GORON_RACETRACK_POT_05, true),
            CHECK(RC_GORON_RACETRACK_POT_06, true),
            CHECK(RC_GORON_RACETRACK_POT_07, true),
            CHECK(RC_GORON_RACETRACK_POT_08, true),
            CHECK(RC_GORON_RACETRACK_POT_09, true),
            CHECK(RC_GORON_RACETRACK_POT_10, true),
            CHECK(RC_GORON_RACETRACK_POT_11, true),
            CHECK(RC_GORON_RACETRACK_POT_12, true),
            CHECK(RC_GORON_RACETRACK_POT_13, true),
            CHECK(RC_GORON_RACETRACK_POT_14, true),
            CHECK(RC_GORON_RACETRACK_POT_15, true),
            CHECK(RC_GORON_RACETRACK_POT_16, true),
            CHECK(RC_GORON_RACETRACK_POT_17, true),
            CHECK(RC_GORON_RACETRACK_POT_18, true),
            CHECK(RC_GORON_RACETRACK_POT_19, true),
            CHECK(RC_GORON_RACETRACK_POT_20, true),
            CHECK(RC_GORON_RACETRACK_POT_21, true),
            CHECK(RC_GORON_RACETRACK_POT_22, true),
            CHECK(RC_GORON_RACETRACK_POT_23, true),
            CHECK(RC_GORON_RACETRACK_POT_24, true),
            CHECK(RC_GORON_RACETRACK_POT_25, true),
            CHECK(RC_GORON_RACETRACK_POT_26, true),
            CHECK(RC_GORON_RACETRACK_POT_27, true),
            CHECK(RC_GORON_RACETRACK_POT_28, true),
            CHECK(RC_GORON_RACETRACK_POT_29, true),
            CHECK(RC_GORON_RACETRACK_POT_30, true),
            CHECK(RC_GORON_RACETRACK_TREE_01, true),
            CHECK(RC_GORON_RACETRACK_TREE_02, true),
            CHECK(RC_GORON_RACETRACK_TREE_03, true),
            CHECK(RC_GORON_RACETRACK_TREE_04, true),
            CHECK(RC_GORON_RACETRACK_TREE_05, true),
            CHECK(RC_GORON_RACETRACK_TREE_06, true),
            CHECK(RC_GORON_RACETRACK_TREE_07, true),
            CHECK(RC_GORON_RACETRACK_TREE_08, true),
            CHECK(RC_GORON_RACETRACK_TREE_09, true),
            CHECK(RC_GORON_RACETRACK_TREE_10, true),
        },
        .exits = { //     TO                                         FROM
            EXIT(ENTRANCE(PATH_TO_GORON_VILLAGE_WINTER, 2),     ENTRANCE(GORON_RACETRACK, 0), true),
        },
        .events = {
            EVENT(RE_ACCESS_GOLD_DUST, CAN_BE_GORON && HAS_MAGIC && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
        }
    };
    Regions[RR_GORON_SHOP] = RandoRegion{ .sceneId = SCENE_GORONSHOP,
        .checks = {
            CHECK(RC_GORON_SHOP_ITEM_01, CAN_AFFORD(RC_GORON_SHOP_ITEM_01)),
            CHECK(RC_GORON_SHOP_ITEM_02, CAN_AFFORD(RC_GORON_SHOP_ITEM_02)),
            CHECK(RC_GORON_SHOP_ITEM_03, CAN_AFFORD(RC_GORON_SHOP_ITEM_03)),
        },
        .exits = { //     TO                                         FROM
            EXIT(ENTRANCE(GORON_SHRINE, 1),              ENTRANCE(GORON_SHOP, 0), true)
        },
    };
    Regions[RR_GORON_VILLAGE] = RandoRegion{ .sceneId = SCENE_11GORONNOSATO,
        .checks = {
            CHECK(RC_GORON_VILLAGE_PIECE_OF_HEART, Flags_GetRandoInf(RANDO_INF_OBTAINED_DEED_SWAMP) && CAN_BE_DEKU),
            CHECK(RC_GORON_VILLAGE_LARGE_CRATE, CAN_USE_MAGIC_ARROW(FIRE) || RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            // FIXME: Update logic for Entrance Rando to account for being able to access the Racetrack Boulder
            CHECK(RC_GORON_VILLAGE_MEDIGORON, (CAN_USE_MAGIC_ARROW(FIRE) || RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]) && CAN_BE_GORON),
            CHECK(RC_GORON_VILLAGE_SCRUB_BOMB_BAG, (GET_CUR_UPG_VALUE(UPG_WALLET) >= 1) && CAN_BE_GORON),
            CHECK(RC_GORON_VILLAGE_SCRUB_DEED, Flags_GetRandoInf(RANDO_INF_OBTAINED_DEED_SWAMP) && CAN_BE_DEKU),
            CHECK(RC_GORON_VILLAGE_LARGE_SNOWBALL_01, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_GORON_VILLAGE_LARGE_SNOWBALL_02, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_GORON_VILLAGE_LARGE_SNOWBALL_03, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_GORON_VILLAGE_LARGE_SNOWBALL_04, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_GORON_VILLAGE_LARGE_SNOWBALL_05, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_GORON_VILLAGE_LARGE_SNOWBALL_06, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_GORON_VILLAGE_LARGE_SNOWBALL_07, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_GORON_VILLAGE_LARGE_SNOWBALL_08, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_GORON_VILLAGE_LARGE_SNOWBALL_09, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_GORON_VILLAGE_SMALL_SNOWBALL_01, true),
            CHECK(RC_GORON_VILLAGE_SMALL_SNOWBALL_02, true),
            CHECK(RC_GORON_VILLAGE_SMALL_SNOWBALL_03, true),
            CHECK(RC_GORON_VILLAGE_SMALL_SNOWBALL_04, true),
            CHECK(RC_GORON_VILLAGE_SMALL_SNOWBALL_05, true),
            CHECK(RC_GORON_VILLAGE_SMALL_SNOWBALL_06, true),
            CHECK(RC_GORON_VILLAGE_SMALL_SNOWBALL_07, true),
            CHECK(RC_GORON_VILLAGE_SMALL_SNOWBALL_08, true),
            CHECK(RC_GORON_VILLAGE_SMALL_SNOWBALL_09, true),
            CHECK(RC_GORON_VILLAGE_SMALL_SNOWBALL_10, true),
            CHECK(RC_GORON_VILLAGE_SMALL_SNOWBALL_11, true),
            CHECK(RC_GORON_VILLAGE_SMALL_SNOWBALL_12, true),
            CHECK(RC_ENEMY_DROP_TEKTITE, CanKillEnemy(ACTOR_EN_TITE)),
        },
        .exits = { //     TO                                         FROM
            // During First Day a NPC Goron can open the door to the the Shrine
            EXIT(ENTRANCE(PATH_TO_GORON_VILLAGE_WINTER, 1),     ENTRANCE(GORON_VILLAGE_WINTER, 0), true),
            EXIT(ENTRANCE(GORON_SHRINE, 0),                     ENTRANCE(GORON_VILLAGE_WINTER, 2), FIRST_DAY() || CAN_BE_GORON),
        },
        .connections = {
            CONNECTION(RR_LONE_PEAK_SHRINE_ENTRANCE, true)
        }
    };
    Regions[RR_LONE_PEAK_SHRINE_ENTRANCE] = RandoRegion{ .name = "Lone Peak Entrance", .sceneId = SCENE_11GORONNOSATO,
        .exits = { //     TO                                         FROM
            EXIT(ENTRANCE(GROTTOS, 16),               ENTRANCE(GORON_VILLAGE_WINTER, 3), true)
        },
        .connections = {
            CONNECTION(RR_GORON_VILLAGE, HAS_MAGIC && HAS_ITEM(ITEM_LENS_OF_TRUTH))
        }
    };
    Regions[RR_LONE_PEAK_SHRINE] = RandoRegion{ .name = "Lone Peak", .sceneId = SCENE_KAKUSIANA,
        // Lone Peak Shrine behaves differently from Grottos despite sharing a map. Seems okay to add here.
        .checks = {
            CHECK(RC_LONE_PEAK_SHRINE_BOULDER_CHEST, CAN_USE_EXPLOSIVE),
            CHECK(RC_LONE_PEAK_SHRINE_INVISIBLE_CHEST, HAS_ITEM(ITEM_LENS_OF_TRUTH) && HAS_MAGIC),
            CHECK(RC_LONE_PEAK_SHRINE_LENS_CHEST, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_01, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_02, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_03, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_04, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_05, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_06, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_07, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_08, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_09, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_10, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_11, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_12, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_13, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_14, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_15, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_16, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_17, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_18, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_19, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_20, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_21, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_22, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_23, true),
            CHECK(RC_LONE_PEAK_SHRINE_GRASS_24, true),
            CHECK(RC_ENEMY_DROP_SKULLTULA, CanKillEnemy(ACTOR_EN_ST)),
        },
        .exits = { //     TO                                         FROM
            EXIT(ENTRANCE(GORON_VILLAGE_WINTER, 3),         ENTRANCE(GROTTOS, 16), true)
        },
    };
    Regions[RR_MOUNTAIN_SMITHY] = RandoRegion{ .sceneId = SCENE_KAJIYA,
        .checks = {
            CHECK(RC_MOUNTAIN_VILLAGE_SMITHY_RAZOR_SWORD, CAN_ACCESS(SMITHY) && GET_CUR_UPG_VALUE(UPG_WALLET) >= 1),
            CHECK(RC_MOUNTAIN_VILLAGE_SMITHY_GILDED_SWORD, CAN_ACCESS(SMITHY) && HAS_BOTTLE && CAN_ACCESS(GOLD_DUST) && (GET_CUR_UPG_VALUE(UPG_WALLET) >= 1)),
        },
        .exits = { //     TO                                         FROM
            EXIT(ENTRANCE(MOUNTAIN_VILLAGE_WINTER, 1),      ENTRANCE(MOUNTAIN_SMITHY, 0), true),
        },
        .events = {
            EVENT(RE_ACCESS_SMITHY, (RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE] || CAN_USE_MAGIC_ARROW(FIRE) || (HAS_BOTTLE && CAN_ACCESS(HOT_SPRING_WATER))) && (FIRST_DAY() || SECOND_DAY())),
        },
    };
    Regions[RR_MOUNTAIN_VILLAGE_TUNNEL_GROTTO] = RandoRegion{ .name = "Mountain Village Tunnel Grotto", .sceneId = SCENE_KAKUSIANA,
        .checks = {
            CHECK(RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_CHEST, true),
            CHECK(RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_01, true),
            CHECK(RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_02, true),
            CHECK(RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_03, true),
            CHECK(RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_04, true),
            CHECK(RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_05, true),
            CHECK(RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_06, true),
            CHECK(RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_07, true),
            CHECK(RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_08, true),
            CHECK(RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_09, true),
            CHECK(RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_10, true),
            CHECK(RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_11, true),
            CHECK(RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_12, true),
            CHECK(RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_13, true),
            CHECK(RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_14, true),
            CHECK(RC_ENEMY_DROP_MINI_BABA, CanKillEnemy(ACTOR_EN_KAREBABA)),
        },
        .exits = { //     TO                                         FROM
            EXIT(ENTRANCE(MOUNTAIN_VILLAGE_WINTER, 0),      ENTRANCE(GROTTOS, 23), true),
        },
    };
    Regions[RR_MOUNTAIN_VILLAGE] = RandoRegion{ .sceneId = SCENE_10YUKIYAMANOMURA,
        .checks = {
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_01, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_02, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_03, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_04, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_05, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_06, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_07, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_08, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_09, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_WONDER_ITEM, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE] && CAN_FULLY_CUT_KEATON_GRASS),
            CHECK(RC_KEATON_QUIZ,                                   HAS_ITEM(ITEM_MASK_KEATON)),
            CHECK(RC_MOUNTAIN_VILLAGE_DON_GERO_MASK,                RANDO_EVENTS[RE_SPAWN_SIRLOIN]), // TODO: For entrance rando we need to find a way to ensure the Rock Sirloin can be "walked" here
            CHECK(RC_MOUNTAIN_VILLAGE_FROG_CHOIR,                   HAS_ITEM(ITEM_MASK_DON_GERO) && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE] && FOUND_ALL_FROGS),
            CHECK(RC_MOUNTAIN_VILLAGE_OWL_STATUE,                   CAN_USE_SWORD),
            CHECK(RC_MOUNTAIN_VILLAGE_WATERFALL_CHEST,              RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE] && HAS_ITEM(ITEM_LENS_OF_TRUTH) && HAS_MAGIC),
            CHECK(RC_MOUNTAIN_VILLAGE_WINTER_POT,                   CAN_HOOK_SCARECROW),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_POT,                   CAN_HOOK_SCARECROW && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_BEEHIVE,               CAN_USE_PROJECTILE && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_FREESTANDING_RUPEE_01, CAN_BE_GORON && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_01, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_02, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_03, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_04, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_05, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_06, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_07, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_08, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_09, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_10, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_11, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_12, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_13, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_14, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_15, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_16, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_17, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_18, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_19, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_20, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_21, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_22, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_23, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_24, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_25, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_26, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_27, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_28, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_29, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_30, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_BUTTERFLY_01, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE] && IS_DAY() && HAS_ITEM(ITEM_DEKU_STICK)),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_BUTTERFLY_02, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE] && IS_DAY() && HAS_ITEM(ITEM_DEKU_STICK)),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_BUTTERFLY_03, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE] && IS_DAY() && HAS_ITEM(ITEM_DEKU_STICK)),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_BUTTERFLY_04, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE] && IS_DAY() && HAS_ITEM(ITEM_DEKU_STICK)),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_BUTTERFLY_05, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE] && IS_DAY() && HAS_ITEM(ITEM_DEKU_STICK)),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_BUTTERFLY_06, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE] && IS_DAY() && HAS_ITEM(ITEM_DEKU_STICK)),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_BUTTERFLY_07, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE] && IS_DAY() && HAS_ITEM(ITEM_DEKU_STICK)),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_BUTTERFLY_08, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE] && IS_DAY() && HAS_ITEM(ITEM_DEKU_STICK)),
            CHECK(RC_MOUNTAIN_VILLAGE_SPRING_BUTTERFLY_09, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE] && IS_DAY() && HAS_ITEM(ITEM_DEKU_STICK)),
            CHECK(RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_01, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_02, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_03, (FIRST_DAY() || SECOND_DAY()) && CanKillEnemy(ACTOR_OBJ_SNOWBALL)), // Goron Elder inside on Final Day
            CHECK(RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_04, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_05, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_MOUNTAIN_VILLAGE_SMALL_SNOWBALL_01, true),
            CHECK(RC_MOUNTAIN_VILLAGE_SMALL_SNOWBALL_02, true),
            CHECK(RC_MOUNTAIN_VILLAGE_SMALL_SNOWBALL_03, true),
            CHECK(RC_MOUNTAIN_VILLAGE_SMALL_SNOWBALL_04, true),
            CHECK(RC_MOUNTAIN_VILLAGE_SMALL_SNOWBALL_05, true),
            CHECK(RC_MOUNTAIN_VILLAGE_SMALL_SNOWBALL_06, true),
            CHECK(RC_MOUNTAIN_VILLAGE_SMALL_SNOWBALL_07, true),
            CHECK(RC_MOUNTAIN_VILLAGE_SMALL_SNOWBALL_08, true),
            CHECK(RC_MOUNTAIN_VILLAGE_SMALL_SNOWBALL_09, true),
            CHECK(RC_MOUNTAIN_VILLAGE_SMALL_SNOWBALL_10, HAS_ITEM(ITEM_LENS_OF_TRUTH) && HAS_MAGIC),
            CHECK(RC_MOUNTAIN_VILLAGE_SMALL_SNOWBALL_11, HAS_ITEM(ITEM_LENS_OF_TRUTH) && HAS_MAGIC),
            CHECK(RC_ENEMY_DROP_GUAY, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE] && CanKillEnemy(ACTOR_EN_CROW)),
            CHECK(RC_ENEMY_DROP_GIANT_BEE, CanKillEnemy(ACTOR_EN_BEE) && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_ENEMY_DROP_BOE, CanKillEnemy(ACTOR_EN_MKK) && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_ENEMY_DROP_TEKTITE, CanKillEnemy(ACTOR_OBJ_SNOWBALL) && CanKillEnemy(ACTOR_EN_TITE) && (FIRST_DAY() || FINAL_DAY())), // Day 1 and 3 only
            CHECK(RC_ENEMY_DROP_WOLFOS, CanKillEnemy(ACTOR_OBJ_SNOWBALL) && CanKillEnemy(ACTOR_EN_WF) && SECOND_DAY()), // Day 2 only
        },
        .exits = { //     TO                                         FROM
            EXIT(ENTRANCE(GROTTOS, 23),                     ENTRANCE(MOUNTAIN_VILLAGE_WINTER, 0), RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            EXIT(ENTRANCE(MOUNTAIN_SMITHY, 0),              ENTRANCE(MOUNTAIN_VILLAGE_WINTER, 1), true),
            EXIT(ENTRANCE(PATH_TO_GORON_VILLAGE_WINTER, 0), ENTRANCE(MOUNTAIN_VILLAGE_WINTER, 2), true),
            // TODO: When it's spring you need goron mask or zora mask instead?
            EXIT(ENTRANCE(GORON_GRAVERYARD, 0),             ENTRANCE(MOUNTAIN_VILLAGE_WINTER, 3), HAS_ITEM(ITEM_LENS_OF_TRUTH) && HAS_MAGIC),
            EXIT(ENTRANCE(PATH_TO_SNOWHEAD, 0),             ENTRANCE(MOUNTAIN_VILLAGE_WINTER, 4), true),
            EXIT(ENTRANCE(PATH_TO_MOUNTAIN_VILLAGE, 1),     ENTRANCE(MOUNTAIN_VILLAGE_WINTER, 6), true),
        },
        .oneWayEntrances = {
            ENTRANCE(MOUNTAIN_VILLAGE_WINTER, 8), // From Song of Soaring
        }
    };
    Regions[RR_PATH_TO_GORON_VILLAGE_HOT_SPRING_GROTTO] = RandoRegion{ .name = "Path to Goron Village Hot Spring Grotto", .sceneId = SCENE_KAKUSIANA,
        .checks = {
            CHECK(RC_TWIN_ISLANDS_FROZEN_GROTTO_CHEST, CAN_USE_EXPLOSIVE),
        },
        .exits = { //     TO                                         FROM
            EXIT(ENTRANCE(PATH_TO_GORON_VILLAGE_WINTER, 0), ENTRANCE(GROTTOS, 5), true),
        },
        .events = {
            EVENT(RE_ACCESS_HOT_SPRING_WATER, true),
        },
    };
    Regions[RR_PATH_TO_GORON_VILLAGE_RAMP_GROTTO] = RandoRegion{ .name = "Path to Goron Village Ramp Grotto", .sceneId = SCENE_KAKUSIANA,
        .checks = {
            CHECK(RC_TWIN_ISLANDS_RAMP_GROTTO_CHEST, true),
            CHECK(RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_01, true),
            CHECK(RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_02, true),
            CHECK(RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_03, true),
            CHECK(RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_04, true),
            CHECK(RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_05, true),
            CHECK(RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_06, true),
            CHECK(RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_07, true),
            CHECK(RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_08, true),
            CHECK(RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_09, true),
            CHECK(RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_10, true),
            CHECK(RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_11, true),
            CHECK(RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_12, true),
            CHECK(RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_13, true),
            CHECK(RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_14, true),
            CHECK(RC_ENEMY_DROP_MINI_BABA, CanKillEnemy(ACTOR_EN_KAREBABA)),
        },
        .exits = { //     TO                                         FROM
            EXIT(ENTRANCE(PATH_TO_GORON_VILLAGE_WINTER, 0), ENTRANCE(GROTTOS, 24), true),
        },
    };
    Regions[RR_PATH_TO_GORON_VILLAGE] = RandoRegion{ .sceneId = SCENE_17SETUGEN,
        .checks = {
            // TODO : Add Spring only checks.
            CHECK(RC_PATH_TO_GORON_VILLAGE_LULLABY_INTRO, CAN_BE_GORON && (CAN_USE_MAGIC_ARROW(FIRE) || (CAN_ACCESS(HOT_SPRING_WATER) && HAS_BOTTLE))),
            CHECK(RC_TWIN_ISLANDS_TINGLE_MAP_01,          CAN_USE_PROJECTILE && CAN_AFFORD(RC_TWIN_ISLANDS_TINGLE_MAP_01)),
            CHECK(RC_TWIN_ISLANDS_TINGLE_MAP_02,          CAN_USE_PROJECTILE && CAN_AFFORD(RC_TWIN_ISLANDS_TINGLE_MAP_02)),
            CHECK(RC_TWIN_ISLANDS_UNDERWATER_CHEST_01,    CAN_BE_ZORA && CAN_USE_ABILITY(SWIM) && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_TWIN_ISLANDS_UNDERWATER_CHEST_02,    CAN_BE_ZORA && CAN_USE_ABILITY(SWIM) && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_TWIN_ISLANDS_FREESTANDING_RUPEE_01, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM) && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_TWIN_ISLANDS_FREESTANDING_RUPEE_02, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM) && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_TWIN_ISLANDS_FREESTANDING_RUPEE_03, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM) && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_TWIN_ISLANDS_FREESTANDING_RUPEE_04, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM) && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_TWIN_ISLANDS_SPRING_GRASS_01, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_TWIN_ISLANDS_SPRING_GRASS_02, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_TWIN_ISLANDS_SPRING_GRASS_03, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_TWIN_ISLANDS_SPRING_GRASS_04, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_TWIN_ISLANDS_SPRING_GRASS_05, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_TWIN_ISLANDS_SPRING_GRASS_06, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_TWIN_ISLANDS_SPRING_GRASS_07, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_TWIN_ISLANDS_SPRING_GRASS_08, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_TWIN_ISLANDS_SPRING_GRASS_09, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_TWIN_ISLANDS_SPRING_GRASS_10, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_TWIN_ISLANDS_SPRING_GRASS_11, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_TWIN_ISLANDS_SPRING_GRASS_12, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_TWIN_ISLANDS_LARGE_SNOWBALL_01, (FIRST_DAY() || FINAL_DAY()) && CanKillEnemy(ACTOR_OBJ_SNOWBALL)), // Goron inside on Second Day
            CHECK(RC_TWIN_ISLANDS_LARGE_SNOWBALL_02, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_TWIN_ISLANDS_LARGE_SNOWBALL_03, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_TWIN_ISLANDS_LARGE_SNOWBALL_04, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_TWIN_ISLANDS_LARGE_SNOWBALL_05, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_TWIN_ISLANDS_LARGE_SNOWBALL_06, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_TWIN_ISLANDS_LARGE_SNOWBALL_07, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_TWIN_ISLANDS_LARGE_SNOWBALL_08, (SECOND_DAY() || FINAL_DAY()) && CanKillEnemy(ACTOR_OBJ_SNOWBALL)), // Goron inside on First Day
            CHECK(RC_TWIN_ISLANDS_LARGE_SNOWBALL_09, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_TWIN_ISLANDS_LARGE_SNOWBALL_10, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_TWIN_ISLANDS_LARGE_SNOWBALL_11, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_TWIN_ISLANDS_LARGE_SNOWBALL_12, (FIRST_DAY() || FINAL_DAY()) && CanKillEnemy(ACTOR_OBJ_SNOWBALL)), // Does not exist on Second Day
            CHECK(RC_TWIN_ISLANDS_LARGE_SNOWBALL_13, (FIRST_DAY() || FINAL_DAY()) && CanKillEnemy(ACTOR_OBJ_SNOWBALL)), // Goron inside on Second Day
            CHECK(RC_TWIN_ISLANDS_SMALL_SNOWBALL_01, true),
            CHECK(RC_TWIN_ISLANDS_SMALL_SNOWBALL_02, true),
            CHECK(RC_TWIN_ISLANDS_SMALL_SNOWBALL_03, true),
            CHECK(RC_TWIN_ISLANDS_SMALL_SNOWBALL_04, CAN_BE_GORON || HAS_ITEM(ITEM_HOOKSHOT)),
            CHECK(RC_TWIN_ISLANDS_SMALL_SNOWBALL_05, CAN_BE_GORON || HAS_ITEM(ITEM_HOOKSHOT)),
            CHECK(RC_TWIN_ISLANDS_SMALL_SNOWBALL_06, CAN_BE_GORON || HAS_ITEM(ITEM_HOOKSHOT)),
            CHECK(RC_TWIN_ISLANDS_SPRING_TREE_01, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_TWIN_ISLANDS_SPRING_TREE_02, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]),
            CHECK(RC_TWIN_ISLANDS_SPRING_TREE_03, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE] && (CAN_BE_GORON || HAS_ITEM(ITEM_HOOKSHOT))),
            CHECK(RC_TWIN_ISLANDS_TREE_01, true),
            CHECK(RC_TWIN_ISLANDS_TREE_02, true),
            CHECK(RC_TWIN_ISLANDS_TREE_03, CAN_BE_GORON || HAS_ITEM(ITEM_HOOKSHOT)),
            CHECK(RC_ENEMY_DROP_GUAY, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE] && CanKillEnemy(ACTOR_EN_CROW)),
            CHECK(RC_ENEMY_DROP_WOLFOS, CanKillEnemy(ACTOR_EN_WF)),
            CHECK(RC_ENEMY_DROP_TEKTITE, CanKillEnemy(ACTOR_EN_TITE)),
            CHECK(RC_ENEMY_DROP_SNAPPER, CanKillEnemy(ACTOR_OBJ_SNOWBALL) && CanKillEnemy(ACTOR_EN_KAME)),
        },
        .exits = { //     TO                                     FROM
            EXIT(ENTRANCE(GROTTOS, 5),                  ENTRANCE(PATH_TO_GORON_VILLAGE_WINTER, 0), RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE] || CAN_USE_MAGIC_ARROW(FIRE)),
            // TODO: This can be reached in entrance rando if coming from Goron Racetrack
            EXIT(ENTRANCE(GROTTOS, 24),                 ENTRANCE(PATH_TO_GORON_VILLAGE_WINTER, 0), CAN_USE_EXPLOSIVE && (CAN_BE_GORON || CAN_HOOK_SCARECROW)),
            EXIT(ENTRANCE(MOUNTAIN_VILLAGE_WINTER, 2),  ENTRANCE(PATH_TO_GORON_VILLAGE_WINTER, 0), true),
            EXIT(ENTRANCE(GORON_VILLAGE_WINTER, 0),     ENTRANCE(PATH_TO_GORON_VILLAGE_WINTER, 1), true),
            // This could also be opened by completing Medigoron's test without actually getting the Powder Keg as a item. Not sure what the flag for that is however.
            EXIT(ENTRANCE(GORON_RACETRACK, 0),          ENTRANCE(PATH_TO_GORON_VILLAGE_WINTER, 2), HAS_ITEM(ITEM_POWDER_KEG) && CAN_BE_GORON),
        },
        .events = {
            EVENT(RE_ACCESS_PICTOGRAPH_TINGLE, HAS_ITEM(ITEM_PICTOGRAPH_BOX)),
        },
    };
    Regions[RR_PATH_TO_MOUNTAIN_VILLAGE_LOWER] = RandoRegion{ .name = "Lower", .sceneId = SCENE_13HUBUKINOMITI,
        .checks = {
            CHECK(RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_01, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_02, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_03, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_04, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_PATH_TO_MOUNTAIN_VILLAGE_SMALL_SNOWBALL_01, true),
            CHECK(RC_PATH_TO_MOUNTAIN_VILLAGE_SMALL_SNOWBALL_02, true),
            CHECK(RC_PATH_TO_MOUNTAIN_VILLAGE_SMALL_SNOWBALL_03, true),
            CHECK(RC_PATH_TO_MOUNTAIN_VILLAGE_TREE_01, true),
            CHECK(RC_PATH_TO_MOUNTAIN_VILLAGE_TREE_02, true),
            CHECK(RC_ENEMY_DROP_TEKTITE, CanKillEnemy(ACTOR_EN_TITE)),
            CHECK(RC_ENEMY_DROP_BOE, CanKillEnemy(ACTOR_EN_MKK) && IS_NIGHT()), // Night only
            CHECK(RC_ENEMY_DROP_WOLFOS, CanKillEnemy(ACTOR_OBJ_SNOWBALL) && CanKillEnemy(ACTOR_EN_WF) && SECOND_DAY()), // Day 2 only
            CHECK(RC_ENEMY_DROP_SNAPPER, CanKillEnemy(ACTOR_OBJ_SNOWBALL) && CanKillEnemy(ACTOR_EN_KAME) && FINAL_DAY()), // Day 3 only
        },
        .exits = { //     TO                                         FROM
            EXIT(ENTRANCE(TERMINA_FIELD, 3),                ENTRANCE(PATH_TO_MOUNTAIN_VILLAGE, 0), true),
        },
        .connections = {
            CONNECTION(RR_PATH_TO_MOUNTAIN_VILLAGE_UPPER, CAN_BE_GORON || CAN_USE_EXPLOSIVE || CAN_USE_MAGIC_ARROW(FIRE)),
        },
    };
    Regions[RR_PATH_TO_MOUNTAIN_VILLAGE_UPPER] = RandoRegion{ .name = "Upper", .sceneId = SCENE_13HUBUKINOMITI,
        .checks = {
            CHECK(RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_05, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_06, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_07, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_08, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_09, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_10, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_11, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_PATH_TO_MOUNTAIN_VILLAGE_SMALL_SNOWBALL_04, true),
            CHECK(RC_PATH_TO_MOUNTAIN_VILLAGE_TREE_03, true),
            CHECK(RC_PATH_TO_MOUNTAIN_VILLAGE_TREE_04, true),
            CHECK(RC_ENEMY_DROP_BOE, CanKillEnemy(ACTOR_EN_MKK) && IS_NIGHT()), // Night only
            CHECK(RC_ENEMY_DROP_WOLFOS, CanKillEnemy(ACTOR_OBJ_SNOWBALL) && CanKillEnemy(ACTOR_EN_WF) && SECOND_DAY()), // Day 2 only
            CHECK(RC_ENEMY_DROP_SNAPPER, CanKillEnemy(ACTOR_OBJ_SNOWBALL) && CanKillEnemy(ACTOR_EN_KAME) && FINAL_DAY()), // Day 3 only
        },
        .exits = { //     TO                                         FROM
            EXIT(ENTRANCE(MOUNTAIN_VILLAGE_WINTER, 6),      ENTRANCE(PATH_TO_MOUNTAIN_VILLAGE, 1), true),
        },
        .connections = {
            CONNECTION(RR_PATH_TO_MOUNTAIN_VILLAGE_LOWER, CAN_BE_GORON || CAN_USE_EXPLOSIVE || CAN_USE_MAGIC_ARROW(FIRE)),
        },
    };
    Regions[RR_PATH_TO_SNOWHEAD_GROTTO] = RandoRegion{ .name = "Path To Snowhead Grotto", .sceneId = SCENE_KAKUSIANA,
        .checks = {
            CHECK(RC_PATH_TO_SNOWHEAD_GROTTO_CHEST, true),
            CHECK(RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_01, true),
            CHECK(RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_02, true),
            CHECK(RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_03, true),
            CHECK(RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_04, true),
            CHECK(RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_05, true),
            CHECK(RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_06, true),
            CHECK(RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_07, true),
            CHECK(RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_08, true),
            CHECK(RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_09, true),
            CHECK(RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_10, true),
            CHECK(RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_11, true),
            CHECK(RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_12, true),
            CHECK(RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_13, true),
            CHECK(RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_14, true),
            CHECK(RC_ENEMY_DROP_MINI_BABA, CanKillEnemy(ACTOR_EN_KAREBABA)),
        },
        .exits = { //     TO                                         FROM
            EXIT(ENTRANCE(PATH_TO_SNOWHEAD, 1),             ENTRANCE(GROTTOS, 25), true),
        },
    };
    Regions[RR_PATH_TO_SNOWHEAD_LOWER] = RandoRegion{ .sceneId = SCENE_14YUKIDAMANOMITI,
        .checks = {
            CHECK(RC_PATH_TO_SNOWHEAD_TREE_04, true),
            CHECK(RC_ENEMY_DROP_KEESE, CanKillEnemy(ACTOR_EN_FIREFLY)),
        },
        .exits = { //     TO                                         FROM
            EXIT(ENTRANCE(MOUNTAIN_VILLAGE_WINTER, 4),      ENTRANCE(PATH_TO_SNOWHEAD, 0), true),
        },
        .connections = {
            CONNECTION(RR_PATH_TO_SNOWHEAD_MIDDLE, CAN_BE_GORON && HAS_MAGIC),
        },
    };
    Regions[RR_PATH_TO_SNOWHEAD_MIDDLE] = RandoRegion{ .sceneId = SCENE_14YUKIDAMANOMITI,
        .checks = {
            CHECK(RC_PATH_TO_SNOWHEAD_PIECE_OF_HEART, HAS_ITEM(ITEM_LENS_OF_TRUTH) && HAS_MAGIC && CAN_HOOK_SCARECROW),
            CHECK(RC_PATH_TO_SNOWHEAD_LARGE_SNOWBALL_01, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_PATH_TO_SNOWHEAD_LARGE_SNOWBALL_02, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_ENEMY_DROP_KEESE, CanKillEnemy(ACTOR_EN_FIREFLY)),
        },
        .connections = {
            CONNECTION(RR_PATH_TO_SNOWHEAD_LOWER, CAN_BE_GORON && HAS_MAGIC),
            CONNECTION(RR_PATH_TO_SNOWHEAD_UPPER, CAN_BE_GORON && HAS_MAGIC),
        },
    };
    Regions[RR_PATH_TO_SNOWHEAD_UPPER] = RandoRegion{ .sceneId = SCENE_14YUKIDAMANOMITI,
        .checks = {
            CHECK(RC_PATH_TO_SNOWHEAD_LARGE_SNOWBALL_03, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_PATH_TO_SNOWHEAD_LARGE_SNOWBALL_04, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_PATH_TO_SNOWHEAD_SMALL_SNOWBALL_01, true),
            CHECK(RC_PATH_TO_SNOWHEAD_SMALL_SNOWBALL_02, true),
            CHECK(RC_PATH_TO_SNOWHEAD_SMALL_SNOWBALL_03, true),
            CHECK(RC_PATH_TO_SNOWHEAD_TREE_01, true),
            CHECK(RC_PATH_TO_SNOWHEAD_TREE_02, true),
            CHECK(RC_PATH_TO_SNOWHEAD_TREE_03, true),
        },
        .exits = { //     TO                                         FROM
            EXIT(ENTRANCE(SNOWHEAD, 0),                     ENTRANCE(PATH_TO_SNOWHEAD, 1), true),
            EXIT(ENTRANCE(GROTTOS, 25),                     ENTRANCE(PATH_TO_SNOWHEAD, 1), CAN_USE_EXPLOSIVE),
        },
        .connections = {
            CONNECTION(RR_PATH_TO_SNOWHEAD_MIDDLE, CAN_BE_GORON && HAS_MAGIC),
        },
    };
    Regions[RR_SNOWHEAD_GREAT_FAIRY_FOUNTAIN] = RandoRegion{ .sceneId = SCENE_YOUSEI_IZUMI,
        .checks = {
            CHECK(RC_SNOWHEAD_GREAT_FAIRY, HAS_ENOUGH_STRAY_FAIRIES(DUNGEON_SCENE_INDEX_SNOWHEAD_TEMPLE)),
        },
        .exits = { //     TO                                         FROM
            EXIT(ENTRANCE(SNOWHEAD, 2),                     ENTRANCE(FAIRY_FOUNTAIN, 2), true),
        },
    };
    Regions[RR_SNOWHEAD_NEAR_PATH] = RandoRegion{ .sceneId = SCENE_12HAKUGINMAE,
        .checks = {
            CHECK(RC_SNOWHEAD_OWL_STATUE, CAN_USE_SWORD),
            CHECK(RC_SNOWHEAD_SMALL_SNOWBALL_01, true),
            CHECK(RC_SNOWHEAD_SMALL_SNOWBALL_02, true),
            CHECK(RC_SNOWHEAD_SMALL_SNOWBALL_03, true),
            CHECK(RC_SNOWHEAD_SMALL_SNOWBALL_04, true),
        },
        .exits = { //     TO                                         FROM
            EXIT(ENTRANCE(PATH_TO_SNOWHEAD, 1),             ENTRANCE(SNOWHEAD, 0), true),
        },
        .connections = {
            CONNECTION(RR_SNOWHEAD_NEAR_TEMPLE, CanAccessDungeon(DUNGEON_SCENE_INDEX_SNOWHEAD_TEMPLE) && CAN_BE_GORON),
        },
        .oneWayEntrances = {
            ENTRANCE(SNOWHEAD, 3), // From Song of Soaring
        }
    };
    Regions[RR_SNOWHEAD_NEAR_TEMPLE] = RandoRegion{ .sceneId = SCENE_12HAKUGINMAE,
        .checks = {
            CHECK(RC_SNOWHEAD_LARGE_SNOWBALL_01, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_SNOWHEAD_LARGE_SNOWBALL_02, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_SNOWHEAD_LARGE_SNOWBALL_03, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_SNOWHEAD_LARGE_SNOWBALL_04, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_SNOWHEAD_LARGE_SNOWBALL_05, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_SNOWHEAD_LARGE_SNOWBALL_06, CanKillEnemy(ACTOR_OBJ_SNOWBALL)),
            CHECK(RC_ENEMY_DROP_KEESE, CanKillEnemy(ACTOR_EN_FIREFLY)),
            CHECK(RC_ENEMY_DROP_WOLFOS, CanKillEnemy(ACTOR_EN_WF)),
            CHECK(RC_ENEMY_DROP_BOE, CanKillEnemy(ACTOR_EN_MKK) && IS_NIGHT()), // Night only
        },
        .connections = {
            CONNECTION(RR_SNOWHEAD_NEAR_PATH, true),
            CONNECTION(RR_SNOWHEAD_OUTSIDE_FOUNTAIN, true),
            CONNECTION(RR_SNOWHEAD_OUTSIDE_TEMPLE_ENTRANCE, true),
        },
    };
    Regions[RR_SNOWHEAD_OUTSIDE_FOUNTAIN] = RandoRegion{ .sceneId = SCENE_12HAKUGINMAE,
        .exits = { //     TO                                         FROM
            EXIT(ENTRANCE(FAIRY_FOUNTAIN, 2),               ENTRANCE(SNOWHEAD, 2), true),
        },
        .connections = {
            CONNECTION(RR_SNOWHEAD_NEAR_TEMPLE, CanAccessDungeon(DUNGEON_SCENE_INDEX_SNOWHEAD_TEMPLE)),
            // CONNECTION(RR_SNOWHEAD_NEAR_PATH, true), // can void out to this RR
        },
    };
    Regions[RR_SNOWHEAD_OUTSIDE_TEMPLE_ENTRANCE] = RandoRegion{ .sceneId = SCENE_12HAKUGINMAE,
        .exits = { //     TO                                         FROM
            EXIT(ENTRANCE(SNOWHEAD_TEMPLE, 0),              ENTRANCE(SNOWHEAD, 1), true),
        },
        .connections = {
            CONNECTION(RR_SNOWHEAD_NEAR_TEMPLE, CanAccessDungeon(DUNGEON_SCENE_INDEX_SNOWHEAD_TEMPLE)),
            // CONNECTION(RR_SNOWHEAD_NEAR_PATH, true), // can void out to this RR
        },
    };
}, {});
// clang-format on