summaryrefslogtreecommitdiff
path: root/mm/2s2h/Rando/Logic
diff options
context:
space:
mode:
Diffstat (limited to 'mm/2s2h/Rando/Logic')
-rw-r--r--mm/2s2h/Rando/Logic/Logic.h3
-rw-r--r--mm/2s2h/Rando/Logic/Regions/BeneathTheWell.cpp14
-rw-r--r--mm/2s2h/Rando/Logic/Regions/Central.cpp10
-rw-r--r--mm/2s2h/Rando/Logic/Regions/East.cpp38
-rw-r--r--mm/2s2h/Rando/Logic/Regions/IkanaCastle.cpp12
-rw-r--r--mm/2s2h/Rando/Logic/Regions/MilkRoad.cpp13
-rw-r--r--mm/2s2h/Rando/Logic/Regions/North.cpp10
-rw-r--r--mm/2s2h/Rando/Logic/Regions/SnowheadTemple.cpp10
-rw-r--r--mm/2s2h/Rando/Logic/Regions/South.cpp8
-rw-r--r--mm/2s2h/Rando/Logic/Regions/StoneTowerTemple.cpp9
-rw-r--r--mm/2s2h/Rando/Logic/Regions/WoodfallTemple.cpp50
11 files changed, 177 insertions, 0 deletions
diff --git a/mm/2s2h/Rando/Logic/Logic.h b/mm/2s2h/Rando/Logic/Logic.h
index 4e4cf2393..582c91a19 100644
--- a/mm/2s2h/Rando/Logic/Logic.h
+++ b/mm/2s2h/Rando/Logic/Logic.h
@@ -195,6 +195,9 @@ void ValidateRegionTimeOwnership(RandoRegionId regionId, RandoCheckId checkId, u
(HAS_ITEM(ITEM_MASK_BLAST) && GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) > EQUIP_VALUE_SHIELD_NONE))
#define CAN_USE_HUMAN_SWORD (GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) >= EQUIP_VALUE_SWORD_KOKIRI)
#define CAN_USE_SWORD (CAN_USE_HUMAN_SWORD || HAS_ITEM(ITEM_SWORD_GREAT_FAIRY) || CAN_BE_DEITY)
+#define CAN_FULLY_CUT_KEATON_GRASS \
+ (HAS_MAGIC && (GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) >= EQUIP_VALUE_SWORD_RAZOR) && \
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_GREAT_SPIN_ATTACK))
// Be careful here, as some checks require you to play the song as a specific form
#define CAN_PLAY_SONG(song) \
(HAS_ITEM(ITEM_OCARINA_OF_TIME) && CHECK_QUEST_ITEM(QUEST_SONG_##song) && \
diff --git a/mm/2s2h/Rando/Logic/Regions/BeneathTheWell.cpp b/mm/2s2h/Rando/Logic/Regions/BeneathTheWell.cpp
index 21f459385..319276d9f 100644
--- a/mm/2s2h/Rando/Logic/Regions/BeneathTheWell.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/BeneathTheWell.cpp
@@ -52,6 +52,9 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_BENEATH_THE_WELL_COW_ROOM] = RandoRegion{ .name = "Cow Room", .sceneId = SCENE_REDEAD,
.checks = {
+ CHECK(RC_BENEATH_THE_WELL_COW_ROOM_GRASS_01, true),
+ CHECK(RC_BENEATH_THE_WELL_COW_ROOM_GRASS_02, true),
+ CHECK(RC_BENEATH_THE_WELL_COW_ROOM_GRASS_03, true),
CHECK(RC_BENEATH_THE_WELL_COW, CAN_PLAY_SONG(EPONA)),
CHECK(RC_BENEATH_THE_WELL_TREE, true),
},
@@ -91,6 +94,11 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_BENEATH_THE_WELL_FOUR_SPIKED_BARS] = RandoRegion{ .name = "Four Spikes Room", .sceneId = SCENE_REDEAD,
.checks = {
+ CHECK(RC_BENEATH_THE_WELL_FOUR_SPIKED_BARS_GRASS_01, true),
+ CHECK(RC_BENEATH_THE_WELL_FOUR_SPIKED_BARS_GRASS_02, true),
+ CHECK(RC_BENEATH_THE_WELL_FOUR_SPIKED_BARS_GRASS_03, true),
+ CHECK(RC_BENEATH_THE_WELL_FOUR_SPIKED_BARS_GRASS_04, true),
+ CHECK(RC_BENEATH_THE_WELL_FOUR_SPIKED_BARS_GRASS_05, true),
CHECK(RC_ENEMY_DROP_SKULLTULA, CanKillEnemy(ACTOR_EN_ST)),
CHECK(RC_ENEMY_DROP_WALLMASTER, CanKillEnemy(ACTOR_EN_WALLMAS)),
},
@@ -139,6 +147,10 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_BENEATH_THE_WELL_RIGHT_FIRE_KEESE] = RandoRegion{ .name = "Right Fire Keese Room", .sceneId = SCENE_REDEAD,
.checks = {
+ CHECK(RC_BENEATH_THE_WELL_RIGHT_FIRE_KEESE_GRASS_01, true),
+ CHECK(RC_BENEATH_THE_WELL_RIGHT_FIRE_KEESE_GRASS_02, true),
+ CHECK(RC_BENEATH_THE_WELL_RIGHT_FIRE_KEESE_GRASS_03, true),
+ CHECK(RC_BENEATH_THE_WELL_RIGHT_FIRE_KEESE_GRASS_04, true),
CHECK(RC_ENEMY_DROP_KEESE, CanKillEnemy(ACTOR_EN_FIREFLY)),
},
.connections = {
@@ -172,6 +184,8 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_BENEATH_THE_WELL_TWO_SPIKED_BARS] = RandoRegion{ .name = "Two Spikes Room", .sceneId = SCENE_REDEAD,
.checks = {
+ CHECK(RC_BENEATH_THE_WELL_TWO_SPIKED_BARS_GRASS_01, true),
+ CHECK(RC_BENEATH_THE_WELL_TWO_SPIKED_BARS_GRASS_02, true),
CHECK(RC_BENEATH_THE_WELL_LEFT_SIDE_POT_01, CAN_LIGHT_TORCH_NEAR_ANOTHER),
CHECK(RC_BENEATH_THE_WELL_LEFT_SIDE_POT_02, CAN_LIGHT_TORCH_NEAR_ANOTHER),
CHECK(RC_BENEATH_THE_WELL_LEFT_SIDE_POT_03, CAN_LIGHT_TORCH_NEAR_ANOTHER),
diff --git a/mm/2s2h/Rando/Logic/Regions/Central.cpp b/mm/2s2h/Rando/Logic/Regions/Central.cpp
index c4b811850..168fe2c2a 100644
--- a/mm/2s2h/Rando/Logic/Regions/Central.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/Central.cpp
@@ -157,6 +157,16 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_CLOCK_TOWN_NORTH] = RandoRegion{ .sceneId = SCENE_BACKTOWN,
.checks = {
+ CHECK(RC_CLOCK_TOWN_NORTH_KEATON_GRASS_01, true),
+ CHECK(RC_CLOCK_TOWN_NORTH_KEATON_GRASS_02, true),
+ CHECK(RC_CLOCK_TOWN_NORTH_KEATON_GRASS_03, true),
+ CHECK(RC_CLOCK_TOWN_NORTH_KEATON_GRASS_04, true),
+ CHECK(RC_CLOCK_TOWN_NORTH_KEATON_GRASS_05, true),
+ CHECK(RC_CLOCK_TOWN_NORTH_KEATON_GRASS_06, true),
+ CHECK(RC_CLOCK_TOWN_NORTH_KEATON_GRASS_07, true),
+ CHECK(RC_CLOCK_TOWN_NORTH_KEATON_GRASS_08, true),
+ CHECK(RC_CLOCK_TOWN_NORTH_KEATON_GRASS_09, true),
+ CHECK(RC_CLOCK_TOWN_NORTH_KEATON_GRASS_WONDER_ITEM, CAN_FULLY_CUT_KEATON_GRASS),
CHECK(RC_CLOCK_TOWN_NORTH_TINGLE_MAP_01, CAN_USE_PROJECTILE && CAN_AFFORD(RC_CLOCK_TOWN_NORTH_TINGLE_MAP_01) && IS_DAY()),
CHECK(RC_CLOCK_TOWN_NORTH_TINGLE_MAP_02, CAN_USE_PROJECTILE && CAN_AFFORD(RC_CLOCK_TOWN_NORTH_TINGLE_MAP_02) && IS_DAY()),
CHECK(RC_CLOCK_TOWN_NORTH_TREE_PIECE_OF_HEART, true),
diff --git a/mm/2s2h/Rando/Logic/Regions/East.cpp b/mm/2s2h/Rando/Logic/Regions/East.cpp
index 541f65420..5592f5e24 100644
--- a/mm/2s2h/Rando/Logic/Regions/East.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/East.cpp
@@ -168,6 +168,10 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_IKANA_CANYON_UPPER] = RandoRegion{ .name = "Upper", .sceneId = SCENE_IKANA,
.checks = {
+ CHECK(RC_IKANA_CANYON_GRASS_01, true),
+ CHECK(RC_IKANA_CANYON_GRASS_02, true),
+ CHECK(RC_IKANA_CANYON_GRASS_03, true),
+ CHECK(RC_IKANA_CANYON_GRASS_04, true),
CHECK(RC_IKANA_CANYON_OWL_STATUE, CAN_USE_SWORD),
CHECK(RC_IKANA_CANYON_TINGLE_MAP_01, CAN_USE_PROJECTILE && CAN_AFFORD(RC_IKANA_CANYON_TINGLE_MAP_01)),
CHECK(RC_IKANA_CANYON_TINGLE_MAP_02, CAN_USE_PROJECTILE && CAN_AFFORD(RC_IKANA_CANYON_TINGLE_MAP_02)),
@@ -219,6 +223,11 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_IKANA_GRAVEYARD_LOWER] = RandoRegion{ .name = "Lower", .sceneId = SCENE_BOTI,
.checks = {
+ CHECK(RC_IKANA_GRAVEYARD_LOWER_GRASS_01, true),
+ CHECK(RC_IKANA_GRAVEYARD_LOWER_GRASS_02, true),
+ CHECK(RC_IKANA_GRAVEYARD_LOWER_GRASS_03, true),
+ CHECK(RC_IKANA_GRAVEYARD_LOWER_GRASS_04, true),
+ CHECK(RC_IKANA_GRAVEYARD_LOWER_GRASS_05, true),
CHECK(RC_IKANA_GRAVEYARD_GRASS_01, true),
CHECK(RC_IKANA_GRAVEYARD_GRASS_02, true),
CHECK(RC_IKANA_GRAVEYARD_GRASS_03, true),
@@ -368,6 +377,12 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_SECRET_SHRINE_ENTRANCE] = RandoRegion{ .name = "Entrance", .sceneId = SCENE_RANDOM,
.checks = {
+ CHECK(RC_SECRET_SHRINE_ENTRANCE_GRASS_01, true),
+ CHECK(RC_SECRET_SHRINE_ENTRANCE_GRASS_02, true),
+ CHECK(RC_SECRET_SHRINE_ENTRANCE_GRASS_03, true),
+ CHECK(RC_SECRET_SHRINE_ENTRANCE_GRASS_04, true),
+ CHECK(RC_SECRET_SHRINE_ENTRANCE_GRASS_05, true),
+ CHECK(RC_SECRET_SHRINE_ENTRANCE_GRASS_06, true),
CHECK(RC_SECRET_SHRINE_FREESTANDING_RUPEE_01, CAN_GROW_BEAN_PLANT || CAN_BE_ZORA),
CHECK(RC_SECRET_SHRINE_FREESTANDING_RUPEE_02, CAN_GROW_BEAN_PLANT || CAN_BE_ZORA),
CHECK(RC_SECRET_SHRINE_FREESTANDING_RUPEE_03, CAN_GROW_BEAN_PLANT || CAN_BE_ZORA),
@@ -398,6 +413,29 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_SECRET_SHRINE] = RandoRegion{ .sceneId = SCENE_RANDOM,
.checks = {
+ CHECK(RC_SECRET_SHRINE_DINOLFOS_GRASS_01, true),
+ CHECK(RC_SECRET_SHRINE_DINOLFOS_GRASS_02, true),
+ CHECK(RC_SECRET_SHRINE_DINOLFOS_GRASS_03, true),
+ CHECK(RC_SECRET_SHRINE_DINOLFOS_GRASS_04, true),
+ CHECK(RC_SECRET_SHRINE_WIZZROBE_GRASS_01, true),
+ CHECK(RC_SECRET_SHRINE_WIZZROBE_GRASS_02, true),
+ CHECK(RC_SECRET_SHRINE_WIZZROBE_GRASS_03, true),
+ CHECK(RC_SECRET_SHRINE_WIZZROBE_GRASS_04, true),
+ CHECK(RC_SECRET_SHRINE_WIZZROBE_GRASS_05, true),
+ CHECK(RC_SECRET_SHRINE_WART_GRASS_01, true),
+ CHECK(RC_SECRET_SHRINE_WART_GRASS_02, true),
+ CHECK(RC_SECRET_SHRINE_WART_GRASS_03, true),
+ CHECK(RC_SECRET_SHRINE_WART_GRASS_04, true),
+ CHECK(RC_SECRET_SHRINE_WART_GRASS_05, true),
+ CHECK(RC_SECRET_SHRINE_WART_GRASS_06, true),
+ CHECK(RC_SECRET_SHRINE_WART_GRASS_07, true),
+ CHECK(RC_SECRET_SHRINE_WART_GRASS_08, true),
+ CHECK(RC_SECRET_SHRINE_GARO_MASTER_GRASS_01, true),
+ CHECK(RC_SECRET_SHRINE_GARO_MASTER_GRASS_02, true),
+ CHECK(RC_SECRET_SHRINE_GARO_MASTER_GRASS_03, true),
+ CHECK(RC_SECRET_SHRINE_GARO_MASTER_GRASS_04, true),
+ CHECK(RC_SECRET_SHRINE_GARO_MASTER_GRASS_05, true),
+ CHECK(RC_SECRET_SHRINE_GARO_MASTER_GRASS_06, true),
CHECK(RC_SECRET_SHRINE_DINOLFOS_CHEST, RANDO_EVENTS[RE_SECRET_SHRINE_DINOLFOS]),
CHECK(RC_SECRET_SHRINE_WIZZROBE_CHEST, RANDO_EVENTS[RE_SECRET_SHRINE_WIZZROBE]),
CHECK(RC_SECRET_SHRINE_WART_CHEST, RANDO_EVENTS[RE_SECRET_SHRINE_WART]),
diff --git a/mm/2s2h/Rando/Logic/Regions/IkanaCastle.cpp b/mm/2s2h/Rando/Logic/Regions/IkanaCastle.cpp
index 87cf46421..d36f4c7f3 100644
--- a/mm/2s2h/Rando/Logic/Regions/IkanaCastle.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/IkanaCastle.cpp
@@ -38,6 +38,18 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_IKANA_CASTLE_COURTYARD] = RandoRegion{ .name = "Courtyard", .sceneId = SCENE_CASTLE,
.checks = {
+ CHECK(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_01, true),
+ CHECK(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_02, true),
+ CHECK(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_03, true),
+ CHECK(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_04, true),
+ CHECK(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_05, true),
+ CHECK(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_06, true),
+ CHECK(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_07, true),
+ CHECK(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_08, true),
+ CHECK(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_09, true),
+ CHECK(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_10, true),
+ CHECK(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_11, true),
+ CHECK(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_12, true),
CHECK(RC_ANCIENT_CASTLE_OF_IKANA_EXTERIOR_POT, true),
CHECK(RC_ENEMY_DROP_GUAY, CanKillEnemy(ACTOR_EN_CROW)),
CHECK(RC_ENEMY_DROP_GARO, CanKillEnemy(ACTOR_EN_JSO)),
diff --git a/mm/2s2h/Rando/Logic/Regions/MilkRoad.cpp b/mm/2s2h/Rando/Logic/Regions/MilkRoad.cpp
index 75b7ae574..d7c58d228 100644
--- a/mm/2s2h/Rando/Logic/Regions/MilkRoad.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/MilkRoad.cpp
@@ -118,6 +118,19 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_MILK_ROAD] = RandoRegion{ .sceneId = SCENE_ROMANYMAE,
.checks = {
+ CHECK(RC_MILK_ROAD_GRASS_01, true),
+ CHECK(RC_MILK_ROAD_GRASS_02, true),
+ CHECK(RC_MILK_ROAD_GRASS_03, true),
+ CHECK(RC_MILK_ROAD_KEATON_GRASS_01, true),
+ CHECK(RC_MILK_ROAD_KEATON_GRASS_02, true),
+ CHECK(RC_MILK_ROAD_KEATON_GRASS_03, true),
+ CHECK(RC_MILK_ROAD_KEATON_GRASS_04, true),
+ CHECK(RC_MILK_ROAD_KEATON_GRASS_05, true),
+ CHECK(RC_MILK_ROAD_KEATON_GRASS_06, true),
+ CHECK(RC_MILK_ROAD_KEATON_GRASS_07, true),
+ CHECK(RC_MILK_ROAD_KEATON_GRASS_08, true),
+ CHECK(RC_MILK_ROAD_KEATON_GRASS_09, true),
+ CHECK(RC_MILK_ROAD_KEATON_GRASS_WONDER_ITEM, CAN_FULLY_CUT_KEATON_GRASS),
CHECK(RC_KEATON_QUIZ, HAS_ITEM(ITEM_MASK_KEATON)),
CHECK(RC_MILK_ROAD_OWL_STATUE, CAN_USE_SWORD),
CHECK(RC_MILK_ROAD_TINGLE_MAP_01, CAN_USE_PROJECTILE && CAN_AFFORD(RC_MILK_ROAD_TINGLE_MAP_01)),
diff --git a/mm/2s2h/Rando/Logic/Regions/North.cpp b/mm/2s2h/Rando/Logic/Regions/North.cpp
index 5bbe65931..5e4d5aae1 100644
--- a/mm/2s2h/Rando/Logic/Regions/North.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/North.cpp
@@ -225,6 +225,16 @@ static RegisterShipInitFunc initFunc([]() {
};
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),
diff --git a/mm/2s2h/Rando/Logic/Regions/SnowheadTemple.cpp b/mm/2s2h/Rando/Logic/Regions/SnowheadTemple.cpp
index 8d1540704..f8d22474b 100644
--- a/mm/2s2h/Rando/Logic/Regions/SnowheadTemple.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/SnowheadTemple.cpp
@@ -103,6 +103,16 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM] = RandoRegion{ .sceneId = SCENE_HAKUGIN,
.checks = {
+ CHECK(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_01, true),
+ CHECK(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_02, true),
+ CHECK(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_03, true),
+ CHECK(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_04, true),
+ CHECK(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_05, true),
+ CHECK(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_06, true),
+ CHECK(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_07, true),
+ CHECK(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_08, true),
+ CHECK(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_09, true),
+ CHECK(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_10, true),
CHECK(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_CHEST, CAN_BE_GORON),
CHECK(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_POT_01, true),
CHECK(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_POT_02, true),
diff --git a/mm/2s2h/Rando/Logic/Regions/South.cpp b/mm/2s2h/Rando/Logic/Regions/South.cpp
index 323ae3276..4962a5f50 100644
--- a/mm/2s2h/Rando/Logic/Regions/South.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/South.cpp
@@ -331,6 +331,10 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_SOUTHERN_SWAMP_NORTH] = RandoRegion{ .name = "North Tourist Section", .sceneId = SCENE_20SICHITAI,
.checks = {
+ CHECK(RC_SOUTHERN_SWAMP_POISON_TOURIST_GRASS_01, true),
+ CHECK(RC_SOUTHERN_SWAMP_POISON_TOURIST_GRASS_02, true),
+ CHECK(RC_SOUTHERN_SWAMP_CLEARED_TOURIST_GRASS_01, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
+ CHECK(RC_SOUTHERN_SWAMP_CLEARED_TOURIST_GRASS_02, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
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),
@@ -403,6 +407,10 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_SOUTHERN_SWAMP_NEAR_WOODS] = RandoRegion{ .name = "North Woods Section", .sceneId = SCENE_20SICHITAI,
.checks = {
+ CHECK(RC_SOUTHERN_SWAMP_CLEARED_WOODS_GRASS_01, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
+ CHECK(RC_SOUTHERN_SWAMP_CLEARED_WOODS_GRASS_02, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]),
+ CHECK(RC_SOUTHERN_SWAMP_POISON_WOODS_GRASS_01, true),
+ CHECK(RC_SOUTHERN_SWAMP_POISON_WOODS_GRASS_02, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_POT_01, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_POT_02, true),
CHECK(RC_SOUTHERN_SWAMP_POISON_POT_03, true),
diff --git a/mm/2s2h/Rando/Logic/Regions/StoneTowerTemple.cpp b/mm/2s2h/Rando/Logic/Regions/StoneTowerTemple.cpp
index cd300a0af..05aabfc38 100644
--- a/mm/2s2h/Rando/Logic/Regions/StoneTowerTemple.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/StoneTowerTemple.cpp
@@ -10,6 +10,9 @@ static RegisterShipInitFunc initFunc([]() {
// Rightside Temple.
Regions[RR_STONE_TOWER_TEMPLE_ENTRANCE] = RandoRegion{ .name = "Entrace", .sceneId = SCENE_INISIE_N,
.checks = {
+ CHECK(RC_STONE_TOWER_TEMPLE_ENTRANCE_GRASS_01, true),
+ CHECK(RC_STONE_TOWER_TEMPLE_ENTRANCE_GRASS_02, true),
+ CHECK(RC_STONE_TOWER_TEMPLE_ENTRANCE_GRASS_03, true),
CHECK(RC_STONE_TOWER_TEMPLE_ENTRANCE_CHEST, HAS_ITEM(ITEM_BOW)),
CHECK(RC_STONE_TOWER_TEMPLE_ENTRANCE_SMALL_CRATE_01, true),
CHECK(RC_STONE_TOWER_TEMPLE_ENTRANCE_SMALL_CRATE_02, true),
@@ -32,6 +35,12 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_STONE_TOWER_TEMPLE_SWITCH_ROOM] = RandoRegion{ .name = "Switch Room", .sceneId = SCENE_INISIE_N,
.checks = {
+ CHECK(RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_01, true),
+ CHECK(RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_02, true),
+ CHECK(RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_03, true),
+ CHECK(RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_04, true),
+ CHECK(RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_05, true),
+ CHECK(RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_06, true),
CHECK(RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_LARGE_CRATE_01, true),
CHECK(RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_LARGE_CRATE_02, true),
CHECK(RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_LARGE_CRATE_03, true),
diff --git a/mm/2s2h/Rando/Logic/Regions/WoodfallTemple.cpp b/mm/2s2h/Rando/Logic/Regions/WoodfallTemple.cpp
index 2b949fb61..f6d07e07d 100644
--- a/mm/2s2h/Rando/Logic/Regions/WoodfallTemple.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/WoodfallTemple.cpp
@@ -24,6 +24,22 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_WOODFALL_TEMPLE_BOSS_ROOM] = RandoRegion{ .sceneId = SCENE_MITURIN_BS,
.checks = {
+ CHECK(RC_WOODFALL_TEMPLE_BOSS_GRASS_01, true),
+ CHECK(RC_WOODFALL_TEMPLE_BOSS_GRASS_02, true),
+ CHECK(RC_WOODFALL_TEMPLE_BOSS_GRASS_03, true),
+ CHECK(RC_WOODFALL_TEMPLE_BOSS_GRASS_04, true),
+ CHECK(RC_WOODFALL_TEMPLE_BOSS_GRASS_05, true),
+ CHECK(RC_WOODFALL_TEMPLE_BOSS_GRASS_06, true),
+ CHECK(RC_WOODFALL_TEMPLE_BOSS_GRASS_07, true),
+ CHECK(RC_WOODFALL_TEMPLE_BOSS_GRASS_08, true),
+ CHECK(RC_WOODFALL_TEMPLE_BOSS_GRASS_09, true),
+ CHECK(RC_WOODFALL_TEMPLE_BOSS_GRASS_10, true),
+ CHECK(RC_WOODFALL_TEMPLE_BOSS_GRASS_11, true),
+ CHECK(RC_WOODFALL_TEMPLE_BOSS_GRASS_12, true),
+ CHECK(RC_WOODFALL_TEMPLE_BOSS_GRASS_13, true),
+ CHECK(RC_WOODFALL_TEMPLE_BOSS_GRASS_14, true),
+ CHECK(RC_WOODFALL_TEMPLE_BOSS_GRASS_15, true),
+ CHECK(RC_WOODFALL_TEMPLE_BOSS_GRASS_16, true),
CHECK(RC_WOODFALL_TEMPLE_BOSS_CONTAINER, CanKillEnemy(ACTOR_BOSS_01)),
CHECK(RC_WOODFALL_TEMPLE_BOSS_WARP, CanKillEnemy(ACTOR_BOSS_01)),
CHECK(RC_GIANTS_CHAMBER_OATH_TO_ORDER, CanKillEnemy(ACTOR_BOSS_01)),
@@ -49,6 +65,9 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_WOODFALL_TEMPLE_COMPASS_ROOM] = RandoRegion{ .name = "Compass Room", .sceneId = SCENE_MITURIN,
.checks = {
+ CHECK(RC_WOODFALL_TEMPLE_COMPASS_ROOM_GRASS_01, true),
+ CHECK(RC_WOODFALL_TEMPLE_COMPASS_ROOM_GRASS_02, true),
+ CHECK(RC_WOODFALL_TEMPLE_COMPASS_ROOM_GRASS_03, true),
CHECK(RC_WOODFALL_TEMPLE_COMPASS_CHEST, CanKillEnemy(ACTOR_EN_GRASSHOPPER)),
CHECK(RC_ENEMY_DROP_DRAGONFLY, CanKillEnemy(ACTOR_EN_GRASSHOPPER)),
},
@@ -79,6 +98,11 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_WOODFALL_TEMPLE_ENTRANCE] = RandoRegion{ .name = "Entrance", .sceneId = SCENE_MITURIN,
.checks = {
+ CHECK(RC_WOODFALL_TEMPLE_ENTRANCE_GRASS_01, true),
+ CHECK(RC_WOODFALL_TEMPLE_ENTRANCE_GRASS_02, true),
+ CHECK(RC_WOODFALL_TEMPLE_ENTRANCE_GRASS_03, true),
+ CHECK(RC_WOODFALL_TEMPLE_ENTRANCE_GRASS_04, CAN_BE_DEKU || HAS_ITEM(ITEM_HOOKSHOT)),
+ CHECK(RC_WOODFALL_TEMPLE_ENTRANCE_GRASS_05, CAN_BE_DEKU || HAS_ITEM(ITEM_HOOKSHOT)),
CHECK(RC_WOODFALL_TEMPLE_ENTRANCE_CHEST, CAN_BE_DEKU || HAS_ITEM(ITEM_HOOKSHOT)),
CHECK(RC_WOODFALL_TEMPLE_SF_ENTRANCE, CAN_USE_PROJECTILE),
CHECK(RC_WOODFALL_TEMPLE_ENTRANCE_POT, CAN_BE_DEKU),
@@ -95,6 +119,18 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_WOODFALL_TEMPLE_MAIN_ROOM_UPPER] = RandoRegion{ .name = "Main Room Upper", .sceneId = SCENE_MITURIN,
.checks = {
+ CHECK(RC_WOODFALL_TEMPLE_MAIN_ROOM_UPPER_GRASS_01, true),
+ CHECK(RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_01, true),
+ CHECK(RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_02, true),
+ CHECK(RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_03, true),
+ CHECK(RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_04, true),
+ CHECK(RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_05, true),
+ CHECK(RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_06, true),
+ CHECK(RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_07, true),
+ CHECK(RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_08, true),
+ CHECK(RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_09, true),
+ CHECK(RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_10, true),
+ CHECK(RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_11, true),
CHECK(RC_WOODFALL_TEMPLE_MAIN_ROOM_UPPER_POT_01, true),
CHECK(RC_WOODFALL_TEMPLE_MAIN_ROOM_UPPER_POT_02, true),
CHECK(RC_WOODFALL_TEMPLE_SF_MAIN_BUBBLE, true),
@@ -113,6 +149,8 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_WOODFALL_TEMPLE_MAIN_ROOM] = RandoRegion{ .name = "Main Room", .sceneId = SCENE_MITURIN,
.checks = {
+ CHECK(RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_GRASS_01, true),
+ CHECK(RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_GRASS_02, true),
CHECK(RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_POT_01, true),
CHECK(RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_POT_02, true),
CHECK(RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_POT_03, true),
@@ -133,6 +171,11 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_WOODFALL_TEMPLE_MAP_ROOM] = RandoRegion{ .name = "Map Room", .sceneId = SCENE_MITURIN,
.checks = {
+ CHECK(RC_WOODFALL_TEMPLE_MAP_ROOM_GRASS_01, true),
+ CHECK(RC_WOODFALL_TEMPLE_MAP_ROOM_GRASS_02, true),
+ CHECK(RC_WOODFALL_TEMPLE_MAP_ROOM_GRASS_03, true),
+ CHECK(RC_WOODFALL_TEMPLE_MAP_ROOM_GRASS_04, true),
+ CHECK(RC_WOODFALL_TEMPLE_MAP_ROOM_GRASS_05, true),
CHECK(RC_WOODFALL_TEMPLE_MAP_CHEST, CAN_BE_DEKU && CanKillEnemy(ACTOR_EN_KAME)),
CHECK(RC_ENEMY_DROP_SNAPPER, CAN_BE_DEKU && CanKillEnemy(ACTOR_EN_KAME)),
},
@@ -161,6 +204,11 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_WOODFALL_TEMPLE_PRE_BOSS_ROOM] = RandoRegion{ .name = "Pre Boss Room", .sceneId = SCENE_MITURIN,
.checks = {
+ CHECK(RC_WOODFALL_TEMPLE_PRE_BOSS_GRASS_01, true),
+ CHECK(RC_WOODFALL_TEMPLE_PRE_BOSS_GRASS_02, true),
+ CHECK(RC_WOODFALL_TEMPLE_PRE_BOSS_GRASS_03, true),
+ CHECK(RC_WOODFALL_TEMPLE_PRE_BOSS_GRASS_04, true),
+ CHECK(RC_WOODFALL_TEMPLE_PRE_BOSS_GRASS_05, true),
CHECK(RC_WOODFALL_TEMPLE_SF_PRE_BOSS_BOTTOM_RIGHT, CAN_BE_DEKU),
CHECK(RC_WOODFALL_TEMPLE_SF_PRE_BOSS_LEFT, CAN_BE_DEKU),
CHECK(RC_WOODFALL_TEMPLE_SF_PRE_BOSS_TOP_RIGHT, CAN_BE_DEKU),
@@ -199,6 +247,8 @@ static RegisterShipInitFunc initFunc([]() {
};
Regions[RR_WOODFALL_TEMPLE_WATER_ROOM] = RandoRegion{ .name = "Water Room", .sceneId = SCENE_MITURIN,
.checks = {
+ CHECK(RC_WOODFALL_TEMPLE_WATER_ROOM_GRASS_01, CAN_BE_DEKU),
+ CHECK(RC_WOODFALL_TEMPLE_WATER_ROOM_GRASS_02, CAN_BE_DEKU),
CHECK(RC_WOODFALL_TEMPLE_WATER_CHEST, CAN_BE_DEKU || HAS_ITEM(ITEM_HOOKSHOT)),
CHECK(RC_WOODFALL_TEMPLE_SF_WATER_ROOM_BEEHIVE, (
// Can they break it, leaving the fairy up high? // TODO: Trick for bombs & chus here