summaryrefslogtreecommitdiff
path: root/mm/2s2h/Rando
diff options
context:
space:
mode:
authorGarrett Cox <garrettjcox@gmail.com>2026-07-30 18:38:29 -0500
committerGitHub <noreply@github.com>2026-07-30 18:38:29 -0500
commitdd5a36d60a0f29dd500cb0e826e3d41780f46944 (patch)
treed60044f48d8059093a4d99a256611882b3861049 /mm/2s2h/Rando
parent630536f681e0b362f58793cd1d8d003c817621bf (diff)
Shuffle keaton grass and some more missed grass (#1822)
Diffstat (limited to 'mm/2s2h/Rando')
-rw-r--r--mm/2s2h/Rando/ActorBehavior/ObjGrass.cpp375
-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
-rw-r--r--mm/2s2h/Rando/StaticData/Checks.cpp174
-rw-r--r--mm/2s2h/Rando/Types.h174
14 files changed, 859 insertions, 41 deletions
diff --git a/mm/2s2h/Rando/ActorBehavior/ObjGrass.cpp b/mm/2s2h/Rando/ActorBehavior/ObjGrass.cpp
index 08e245124..3651e46c4 100644
--- a/mm/2s2h/Rando/ActorBehavior/ObjGrass.cpp
+++ b/mm/2s2h/Rando/ActorBehavior/ObjGrass.cpp
@@ -14,13 +14,21 @@ extern "C" {
#include "variables.h"
#include "overlays/actors/ovl_Obj_Grass/z_obj_grass.h"
#include "overlays/actors/ovl_En_Kusa/z_en_kusa.h"
+#include "overlays/actors/ovl_En_Kusa2/z_en_kusa2.h"
#include "overlays/actors/ovl_Obj_Grass_Carry/z_obj_grass_carry.h"
#include "overlays/actors/ovl_Obj_Mure2/z_obj_mure2.h"
void ObjGrass_OverrideMatrixCurrent(MtxF* matrix);
+void EnKusa_DrawGrass(Actor* thisx, PlayState* play);
extern ObjGrass* sGrassManager;
}
+struct KeatonGrassRing {
+ RandoCheckId baseCheckId = RC_UNKNOWN;
+ RandoCheckId wonderItemCheckId = RC_UNKNOWN;
+};
+static ObjectExtension::Register<KeatonGrassRing> keatonGrassRingRegister;
+
// clang-format off
// For large swathes of grass that share a singular actor
std::map<std::tuple<s16, u8>, std::tuple<s16, RandoCheckId>> grassObjMap = {
@@ -118,6 +126,160 @@ std::map<std::tuple<s16, s16, s16>, RandoCheckId> enKusaMap = {
{ { SCENE_KAKUSIANA, 2, 4 }, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_4_GRASS_05 },
{ { SCENE_KAKUSIANA, 11, 0 }, RC_TERMINA_FIELD_BIO_BABA_GROTTO_GRASS_01 },
{ { SCENE_KAKUSIANA, 11, 3 }, RC_TERMINA_FIELD_BIO_BABA_GROTTO_GRASS_02 },
+ // Sprout grass
+ { { SCENE_20SICHITAI, 0, 45 }, RC_SOUTHERN_SWAMP_POISON_TOURIST_GRASS_01 },
+ { { SCENE_20SICHITAI, 0, 46 }, RC_SOUTHERN_SWAMP_POISON_TOURIST_GRASS_02 },
+ { { SCENE_20SICHITAI, 2, 17 }, RC_SOUTHERN_SWAMP_POISON_WOODS_GRASS_01 },
+ { { SCENE_20SICHITAI, 2, 18 }, RC_SOUTHERN_SWAMP_POISON_WOODS_GRASS_02 },
+ { { SCENE_20SICHITAI2, 0, 39 }, RC_SOUTHERN_SWAMP_CLEARED_TOURIST_GRASS_01 },
+ { { SCENE_20SICHITAI2, 0, 40 }, RC_SOUTHERN_SWAMP_CLEARED_TOURIST_GRASS_02 },
+ { { SCENE_BOTI, 0, 16 }, RC_IKANA_GRAVEYARD_LOWER_GRASS_04 },
+ { { SCENE_BOTI, 0, 17 }, RC_IKANA_GRAVEYARD_LOWER_GRASS_03 },
+ { { SCENE_BOTI, 0, 18 }, RC_IKANA_GRAVEYARD_LOWER_GRASS_01 },
+ { { SCENE_BOTI, 0, 19 }, RC_IKANA_GRAVEYARD_LOWER_GRASS_02 },
+ { { SCENE_BOTI, 0, 20 }, RC_IKANA_GRAVEYARD_LOWER_GRASS_05 },
+ { { SCENE_BOTI, 0, 31 }, RC_IKANA_GRAVEYARD_LOWER_GRASS_01 },
+ { { SCENE_BOTI, 0, 39 }, RC_IKANA_GRAVEYARD_LOWER_GRASS_02 },
+ { { SCENE_BOTI, 0, 40 }, RC_IKANA_GRAVEYARD_LOWER_GRASS_03 },
+ { { SCENE_BOTI, 0, 41 }, RC_IKANA_GRAVEYARD_LOWER_GRASS_04 },
+ { { SCENE_BOTI, 0, 42 }, RC_IKANA_GRAVEYARD_LOWER_GRASS_05 },
+ { { SCENE_CASTLE, 0, 32 }, RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_01 },
+ { { SCENE_CASTLE, 0, 33 }, RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_02 },
+ { { SCENE_CASTLE, 0, 34 }, RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_03 },
+ { { SCENE_CASTLE, 0, 35 }, RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_04 },
+ { { SCENE_CASTLE, 0, 36 }, RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_05 },
+ { { SCENE_CASTLE, 0, 37 }, RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_06 },
+ { { SCENE_CASTLE, 0, 38 }, RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_07 },
+ { { SCENE_CASTLE, 0, 39 }, RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_08 },
+ { { SCENE_CASTLE, 0, 40 }, RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_09 },
+ { { SCENE_CASTLE, 0, 41 }, RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_10 },
+ { { SCENE_CASTLE, 0, 42 }, RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_11 },
+ { { SCENE_CASTLE, 0, 43 }, RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_12 },
+ { { SCENE_HAKUGIN, 4, 60 }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_01 },
+ { { SCENE_HAKUGIN, 4, 61 }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_02 },
+ { { SCENE_HAKUGIN, 4, 62 }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_03 },
+ { { SCENE_HAKUGIN, 4, 63 }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_04 },
+ { { SCENE_HAKUGIN, 4, 64 }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_05 },
+ { { SCENE_HAKUGIN, 4, 65 }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_06 },
+ { { SCENE_HAKUGIN, 4, 66 }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_07 },
+ { { SCENE_HAKUGIN, 4, 67 }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_08 },
+ { { SCENE_HAKUGIN, 4, 68 }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_09 },
+ { { SCENE_HAKUGIN, 4, 69 }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_10 },
+ { { SCENE_IKANA, 0, 29 }, RC_IKANA_CANYON_GRASS_01 },
+ { { SCENE_IKANA, 0, 30 }, RC_IKANA_CANYON_GRASS_02 },
+ { { SCENE_IKANA, 0, 31 }, RC_IKANA_CANYON_GRASS_03 },
+ { { SCENE_IKANA, 0, 32 }, RC_IKANA_CANYON_GRASS_04 },
+ { { SCENE_IKANA, 0, 59 }, RC_IKANA_CANYON_GRASS_01 },
+ { { SCENE_IKANA, 0, 60 }, RC_IKANA_CANYON_GRASS_02 },
+ { { SCENE_IKANA, 0, 61 }, RC_IKANA_CANYON_GRASS_03 },
+ { { SCENE_IKANA, 0, 62 }, RC_IKANA_CANYON_GRASS_04 },
+ { { SCENE_INISIE_N, 0, 10 }, RC_STONE_TOWER_TEMPLE_ENTRANCE_GRASS_01 },
+ { { SCENE_INISIE_N, 0, 11 }, RC_STONE_TOWER_TEMPLE_ENTRANCE_GRASS_02 },
+ { { SCENE_INISIE_N, 0, 12 }, RC_STONE_TOWER_TEMPLE_ENTRANCE_GRASS_03 },
+ { { SCENE_INISIE_N, 2, 18 }, RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_01 },
+ { { SCENE_INISIE_N, 2, 19 }, RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_02 },
+ { { SCENE_INISIE_N, 2, 20 }, RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_03 },
+ { { SCENE_INISIE_N, 2, 21 }, RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_04 },
+ { { SCENE_INISIE_N, 2, 22 }, RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_05 },
+ { { SCENE_INISIE_N, 2, 23 }, RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_06 },
+ { { SCENE_MITURIN, 0, 30 }, RC_WOODFALL_TEMPLE_PRE_BOSS_GRASS_01 },
+ { { SCENE_MITURIN, 0, 31 }, RC_WOODFALL_TEMPLE_PRE_BOSS_GRASS_02 },
+ { { SCENE_MITURIN, 0, 32 }, RC_WOODFALL_TEMPLE_PRE_BOSS_GRASS_03 },
+ { { SCENE_MITURIN, 0, 33 }, RC_WOODFALL_TEMPLE_PRE_BOSS_GRASS_04 },
+ { { SCENE_MITURIN, 0, 34 }, RC_WOODFALL_TEMPLE_PRE_BOSS_GRASS_05 },
+ { { SCENE_MITURIN, 1, 30 }, RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_GRASS_01 },
+ { { SCENE_MITURIN, 1, 32 }, RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_GRASS_02 },
+ { { SCENE_MITURIN, 1, 31 }, RC_WOODFALL_TEMPLE_MAIN_ROOM_UPPER_GRASS_01 },
+ { { SCENE_MITURIN, 2, 23 }, RC_WOODFALL_TEMPLE_ENTRANCE_GRASS_01 },
+ { { SCENE_MITURIN, 2, 24 }, RC_WOODFALL_TEMPLE_ENTRANCE_GRASS_02 },
+ { { SCENE_MITURIN, 2, 25 }, RC_WOODFALL_TEMPLE_ENTRANCE_GRASS_04 },
+ { { SCENE_MITURIN, 2, 26 }, RC_WOODFALL_TEMPLE_ENTRANCE_GRASS_05 },
+ { { SCENE_MITURIN, 2, 27 }, RC_WOODFALL_TEMPLE_ENTRANCE_GRASS_03 },
+ { { SCENE_MITURIN, 4, 5 }, RC_WOODFALL_TEMPLE_COMPASS_ROOM_GRASS_01 },
+ { { SCENE_MITURIN, 4, 6 }, RC_WOODFALL_TEMPLE_COMPASS_ROOM_GRASS_02 },
+ { { SCENE_MITURIN, 4, 7 }, RC_WOODFALL_TEMPLE_COMPASS_ROOM_GRASS_03 },
+ { { SCENE_MITURIN, 5, 18 }, RC_WOODFALL_TEMPLE_WATER_ROOM_GRASS_01 },
+ { { SCENE_MITURIN, 5, 19 }, RC_WOODFALL_TEMPLE_WATER_ROOM_GRASS_02 },
+ { { SCENE_MITURIN, 6, 6 }, RC_WOODFALL_TEMPLE_MAP_ROOM_GRASS_01 },
+ { { SCENE_MITURIN, 6, 7 }, RC_WOODFALL_TEMPLE_MAP_ROOM_GRASS_02 },
+ { { SCENE_MITURIN, 6, 8 }, RC_WOODFALL_TEMPLE_MAP_ROOM_GRASS_03 },
+ { { SCENE_MITURIN, 6, 9 }, RC_WOODFALL_TEMPLE_MAP_ROOM_GRASS_04 },
+ { { SCENE_MITURIN, 6, 10 }, RC_WOODFALL_TEMPLE_MAP_ROOM_GRASS_05 },
+ { { SCENE_MITURIN, 10, 6 }, RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_01 },
+ { { SCENE_MITURIN, 10, 7 }, RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_02 },
+ { { SCENE_MITURIN, 10, 8 }, RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_03 },
+ { { SCENE_MITURIN, 10, 9 }, RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_04 },
+ { { SCENE_MITURIN, 10, 10 }, RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_05 },
+ { { SCENE_MITURIN, 10, 11 }, RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_06 },
+ { { SCENE_MITURIN, 10, 12 }, RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_07 },
+ { { SCENE_MITURIN, 10, 13 }, RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_08 },
+ { { SCENE_MITURIN, 10, 14 }, RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_09 },
+ { { SCENE_MITURIN, 10, 15 }, RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_10 },
+ { { SCENE_MITURIN, 10, 16 }, RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_11 },
+ { { SCENE_MITURIN_BS, 0, 10 }, RC_WOODFALL_TEMPLE_BOSS_GRASS_01 },
+ { { SCENE_MITURIN_BS, 0, 11 }, RC_WOODFALL_TEMPLE_BOSS_GRASS_02 },
+ { { SCENE_MITURIN_BS, 0, 12 }, RC_WOODFALL_TEMPLE_BOSS_GRASS_03 },
+ { { SCENE_MITURIN_BS, 0, 13 }, RC_WOODFALL_TEMPLE_BOSS_GRASS_04 },
+ { { SCENE_MITURIN_BS, 0, 14 }, RC_WOODFALL_TEMPLE_BOSS_GRASS_05 },
+ { { SCENE_MITURIN_BS, 0, 15 }, RC_WOODFALL_TEMPLE_BOSS_GRASS_06 },
+ { { SCENE_MITURIN_BS, 0, 16 }, RC_WOODFALL_TEMPLE_BOSS_GRASS_07 },
+ { { SCENE_MITURIN_BS, 0, 17 }, RC_WOODFALL_TEMPLE_BOSS_GRASS_08 },
+ { { SCENE_MITURIN_BS, 0, 18 }, RC_WOODFALL_TEMPLE_BOSS_GRASS_09 },
+ { { SCENE_MITURIN_BS, 0, 19 }, RC_WOODFALL_TEMPLE_BOSS_GRASS_10 },
+ { { SCENE_MITURIN_BS, 0, 20 }, RC_WOODFALL_TEMPLE_BOSS_GRASS_11 },
+ { { SCENE_MITURIN_BS, 0, 21 }, RC_WOODFALL_TEMPLE_BOSS_GRASS_12 },
+ { { SCENE_MITURIN_BS, 0, 22 }, RC_WOODFALL_TEMPLE_BOSS_GRASS_13 },
+ { { SCENE_MITURIN_BS, 0, 23 }, RC_WOODFALL_TEMPLE_BOSS_GRASS_14 },
+ { { SCENE_MITURIN_BS, 0, 24 }, RC_WOODFALL_TEMPLE_BOSS_GRASS_15 },
+ { { SCENE_MITURIN_BS, 0, 25 }, RC_WOODFALL_TEMPLE_BOSS_GRASS_16 },
+ { { SCENE_RANDOM, 0, 26 }, RC_SECRET_SHRINE_ENTRANCE_GRASS_01 },
+ { { SCENE_RANDOM, 0, 27 }, RC_SECRET_SHRINE_ENTRANCE_GRASS_02 },
+ { { SCENE_RANDOM, 0, 28 }, RC_SECRET_SHRINE_ENTRANCE_GRASS_03 },
+ { { SCENE_RANDOM, 0, 29 }, RC_SECRET_SHRINE_ENTRANCE_GRASS_04 },
+ { { SCENE_RANDOM, 0, 30 }, RC_SECRET_SHRINE_ENTRANCE_GRASS_05 },
+ { { SCENE_RANDOM, 0, 31 }, RC_SECRET_SHRINE_ENTRANCE_GRASS_06 },
+ { { SCENE_RANDOM, 2, 4 }, RC_SECRET_SHRINE_DINOLFOS_GRASS_01 },
+ { { SCENE_RANDOM, 2, 5 }, RC_SECRET_SHRINE_DINOLFOS_GRASS_02 },
+ { { SCENE_RANDOM, 2, 6 }, RC_SECRET_SHRINE_DINOLFOS_GRASS_03 },
+ { { SCENE_RANDOM, 2, 7 }, RC_SECRET_SHRINE_DINOLFOS_GRASS_04 },
+ { { SCENE_RANDOM, 3, 6 }, RC_SECRET_SHRINE_WIZZROBE_GRASS_01 },
+ { { SCENE_RANDOM, 3, 7 }, RC_SECRET_SHRINE_WIZZROBE_GRASS_02 },
+ { { SCENE_RANDOM, 3, 8 }, RC_SECRET_SHRINE_WIZZROBE_GRASS_03 },
+ { { SCENE_RANDOM, 3, 9 }, RC_SECRET_SHRINE_WIZZROBE_GRASS_04 },
+ { { SCENE_RANDOM, 3, 10 }, RC_SECRET_SHRINE_WIZZROBE_GRASS_05 },
+ { { SCENE_RANDOM, 4, 5 }, RC_SECRET_SHRINE_WART_GRASS_01 },
+ { { SCENE_RANDOM, 4, 6 }, RC_SECRET_SHRINE_WART_GRASS_02 },
+ { { SCENE_RANDOM, 4, 7 }, RC_SECRET_SHRINE_WART_GRASS_03 },
+ { { SCENE_RANDOM, 4, 8 }, RC_SECRET_SHRINE_WART_GRASS_04 },
+ { { SCENE_RANDOM, 4, 9 }, RC_SECRET_SHRINE_WART_GRASS_05 },
+ { { SCENE_RANDOM, 4, 10 }, RC_SECRET_SHRINE_WART_GRASS_06 },
+ { { SCENE_RANDOM, 4, 11 }, RC_SECRET_SHRINE_WART_GRASS_07 },
+ { { SCENE_RANDOM, 4, 12 }, RC_SECRET_SHRINE_WART_GRASS_08 },
+ { { SCENE_RANDOM, 5, 2 }, RC_SECRET_SHRINE_GARO_MASTER_GRASS_01 },
+ { { SCENE_RANDOM, 5, 3 }, RC_SECRET_SHRINE_GARO_MASTER_GRASS_02 },
+ { { SCENE_RANDOM, 5, 4 }, RC_SECRET_SHRINE_GARO_MASTER_GRASS_03 },
+ { { SCENE_RANDOM, 5, 5 }, RC_SECRET_SHRINE_GARO_MASTER_GRASS_04 },
+ { { SCENE_RANDOM, 5, 6 }, RC_SECRET_SHRINE_GARO_MASTER_GRASS_05 },
+ { { SCENE_RANDOM, 5, 7 }, RC_SECRET_SHRINE_GARO_MASTER_GRASS_06 },
+ { { SCENE_ROMANYMAE, 0, 17 }, RC_MILK_ROAD_GRASS_01 },
+ { { SCENE_ROMANYMAE, 0, 18 }, RC_MILK_ROAD_GRASS_02 },
+ { { SCENE_ROMANYMAE, 0, 19 }, RC_MILK_ROAD_GRASS_03 },
+ { { SCENE_20SICHITAI2, 2, 14 }, RC_SOUTHERN_SWAMP_CLEARED_WOODS_GRASS_01 },
+ { { SCENE_20SICHITAI2, 2, 15 }, RC_SOUTHERN_SWAMP_CLEARED_WOODS_GRASS_02 },
+ { { SCENE_REDEAD, 3, 9 }, RC_BENEATH_THE_WELL_RIGHT_FIRE_KEESE_GRASS_01 },
+ { { SCENE_REDEAD, 3, 10 }, RC_BENEATH_THE_WELL_RIGHT_FIRE_KEESE_GRASS_02 },
+ { { SCENE_REDEAD, 3, 11 }, RC_BENEATH_THE_WELL_RIGHT_FIRE_KEESE_GRASS_03 },
+ { { SCENE_REDEAD, 3, 12 }, RC_BENEATH_THE_WELL_RIGHT_FIRE_KEESE_GRASS_04 },
+ { { SCENE_REDEAD, 5, 22 }, RC_BENEATH_THE_WELL_TWO_SPIKED_BARS_GRASS_01 },
+ { { SCENE_REDEAD, 5, 23 }, RC_BENEATH_THE_WELL_TWO_SPIKED_BARS_GRASS_02 },
+ { { SCENE_REDEAD, 7, 19 }, RC_BENEATH_THE_WELL_FOUR_SPIKED_BARS_GRASS_01 },
+ { { SCENE_REDEAD, 7, 20 }, RC_BENEATH_THE_WELL_FOUR_SPIKED_BARS_GRASS_02 },
+ { { SCENE_REDEAD, 7, 21 }, RC_BENEATH_THE_WELL_FOUR_SPIKED_BARS_GRASS_03 },
+ { { SCENE_REDEAD, 7, 22 }, RC_BENEATH_THE_WELL_FOUR_SPIKED_BARS_GRASS_04 },
+ { { SCENE_REDEAD, 7, 23 }, RC_BENEATH_THE_WELL_FOUR_SPIKED_BARS_GRASS_05 },
+ { { SCENE_REDEAD, 9, 6 }, RC_BENEATH_THE_WELL_COW_ROOM_GRASS_01 },
+ { { SCENE_REDEAD, 9, 7 }, RC_BENEATH_THE_WELL_COW_ROOM_GRASS_02 },
+ { { SCENE_REDEAD, 9, 8 }, RC_BENEATH_THE_WELL_COW_ROOM_GRASS_03 },
};
// For lone grass actors spawned in chest grottos
@@ -145,6 +307,16 @@ std::map<std::tuple<u16, u8, s16>, RandoCheckId> objMure2GrassMap = {
{ { SCENE_10YUKIYAMANOMURA2, 0, 30 }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_13 },
{ { SCENE_10YUKIYAMANOMURA2, 0, 31 }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_22 },
{ { SCENE_BOTI, 1, 47 }, RC_IKANA_GRAVEYARD_GRASS_01 },
+ { { SCENE_BOTI, 1, 7 }, RC_IKANA_GRAVEYARD_GRASS_01 }, // Night layer
+};
+
+// For rings of Keaton grass, mapped by their manager actor to the first RC of the ring and the RC of its bonus reward
+std::map<std::tuple<s16, s16, s16>, KeatonGrassRing> keatonGrassMap = {
+ { { SCENE_BACKTOWN, 0, 16 }, { RC_CLOCK_TOWN_NORTH_KEATON_GRASS_01, RC_CLOCK_TOWN_NORTH_KEATON_GRASS_WONDER_ITEM } },
+ { { SCENE_BACKTOWN, 0, 28 }, { RC_CLOCK_TOWN_NORTH_KEATON_GRASS_01, RC_CLOCK_TOWN_NORTH_KEATON_GRASS_WONDER_ITEM } },
+ { { SCENE_ROMANYMAE, 0, 6 }, { RC_MILK_ROAD_KEATON_GRASS_01, RC_MILK_ROAD_KEATON_GRASS_WONDER_ITEM } },
+ { { SCENE_10YUKIYAMANOMURA2, 0, 44 }, { RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_01, RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_WONDER_ITEM } },
+ { { SCENE_10YUKIYAMANOMURA2, 0, 50 }, { RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_01, RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_WONDER_ITEM } },
};
// clang-format on
@@ -165,53 +337,51 @@ void SpawnGrassDrop(Vec3f pos, RandoCheckId randoCheckId) {
});
}
-void EnKusaBush_RandoDraw(Actor* actor, PlayState* play) {
+Gfx* GetObjGrassDList(RandoCheckId randoCheckId) {
if (!CVarGetInteger("gRando.CSMC", 0)) {
- Gfx_DrawDListOpa(play, (Gfx*)gRandoBushDL);
- return;
+ return (Gfx*)gRandoBushDL;
}
- RandoCheckId randoCheckId = Rando::ActorBehavior::GetObjectRandoCheckId(actor);
RandoItemId randoItemId = Rando::ConvertItem(RANDO_SAVE_CHECKS[randoCheckId].randoItemId, randoCheckId);
RandoItemType randoItemType = Rando::StaticData::Items[randoItemId].randoItemType;
switch (randoItemType) {
case RITYPE_BOSS_KEY:
- Gfx_DrawDListOpa(play, (Gfx*)gRandoBushBossKeyDL);
+ return (Gfx*)gRandoBushBossKeyDL;
break;
case RITYPE_HEALTH:
- Gfx_DrawDListOpa(play, (Gfx*)gRandoBushHeartDL);
+ return (Gfx*)gRandoBushHeartDL;
break;
case RITYPE_LESSER:
- Gfx_DrawDListOpa(play, (Gfx*)gRandoBushMinorDL);
+ return (Gfx*)gRandoBushMinorDL;
break;
case RITYPE_MAJOR:
- Gfx_DrawDListOpa(play, (Gfx*)gRandoBushMajorDL);
+ return (Gfx*)gRandoBushMajorDL;
break;
case RITYPE_MASK:
- Gfx_DrawDListOpa(play, (Gfx*)gRandoBushMaskDL);
+ return (Gfx*)gRandoBushMaskDL;
break;
case RITYPE_SKULLTULA_TOKEN:
- Gfx_DrawDListOpa(play, (Gfx*)gRandoBushTokenDL);
+ return (Gfx*)gRandoBushTokenDL;
break;
case RITYPE_SMALL_KEY:
- Gfx_DrawDListOpa(play, (Gfx*)gRandoBushSmallKeyDL);
+ return (Gfx*)gRandoBushSmallKeyDL;
break;
case RITYPE_STRAY_FAIRY:
- Gfx_DrawDListOpa(play, (Gfx*)gRandoBushFairyDL);
+ return (Gfx*)gRandoBushFairyDL;
break;
case RITYPE_JUNK:
- Gfx_DrawDListOpa(play, (Gfx*)gRandoBushJunkDL);
+ return (Gfx*)gRandoBushJunkDL;
break;
default:
- Gfx_DrawDListOpa(play, (Gfx*)gRandoBushDL);
+ return (Gfx*)gRandoBushDL;
break;
}
}
-Gfx* GetObjGrassDList(RandoCheckId randoCheckId) {
+Gfx* GetObjGrassXluDList(RandoCheckId randoCheckId) {
if (!CVarGetInteger("gRando.CSMC", 0)) {
- return (Gfx*)gRandoBushDL;
+ return (Gfx*)gRandoBushXluDL;
}
RandoItemId randoItemId = Rando::ConvertItem(RANDO_SAVE_CHECKS[randoCheckId].randoItemId, randoCheckId);
@@ -219,41 +389,42 @@ Gfx* GetObjGrassDList(RandoCheckId randoCheckId) {
switch (randoItemType) {
case RITYPE_BOSS_KEY:
- return (Gfx*)gRandoBushBossKeyDL;
+ return (Gfx*)gRandoBushBossKeyXluDL;
break;
case RITYPE_HEALTH:
- return (Gfx*)gRandoBushHeartDL;
+ return (Gfx*)gRandoBushHeartXluDL;
break;
case RITYPE_LESSER:
- return (Gfx*)gRandoBushMinorDL;
+ return (Gfx*)gRandoBushMinorXluDL;
break;
case RITYPE_MAJOR:
- return (Gfx*)gRandoBushMajorDL;
+ return (Gfx*)gRandoBushMajorXluDL;
break;
case RITYPE_MASK:
- return (Gfx*)gRandoBushMaskDL;
+ return (Gfx*)gRandoBushMaskXluDL;
break;
case RITYPE_SKULLTULA_TOKEN:
- return (Gfx*)gRandoBushTokenDL;
+ return (Gfx*)gRandoBushTokenXluDL;
break;
case RITYPE_SMALL_KEY:
- return (Gfx*)gRandoBushSmallKeyDL;
+ return (Gfx*)gRandoBushSmallKeyXluDL;
break;
case RITYPE_STRAY_FAIRY:
- return (Gfx*)gRandoBushFairyDL;
+ return (Gfx*)gRandoBushFairyXluDL;
break;
case RITYPE_JUNK:
- return (Gfx*)gRandoBushJunkDL;
+ return (Gfx*)gRandoBushJunkXluDL;
break;
default:
- return (Gfx*)gRandoBushDL;
+ return (Gfx*)gRandoBushXluDL;
break;
}
}
-Gfx* GetObjGrassXluDList(RandoCheckId randoCheckId) {
+// Cuttable grass has its own set of models, as the bush ones above are far too large to stand in for a sprout.
+Gfx* GetCuttableGrassDList(RandoCheckId randoCheckId) {
if (!CVarGetInteger("gRando.CSMC", 0)) {
- return (Gfx*)gRandoBushXluDL;
+ return (Gfx*)gRandoCuttableGrassRandomDL;
}
RandoItemId randoItemId = Rando::ConvertItem(RANDO_SAVE_CHECKS[randoCheckId].randoItemId, randoCheckId);
@@ -261,34 +432,34 @@ Gfx* GetObjGrassXluDList(RandoCheckId randoCheckId) {
switch (randoItemType) {
case RITYPE_BOSS_KEY:
- return (Gfx*)gRandoBushBossKeyXluDL;
+ return (Gfx*)gRandoCuttableGrassBossKeyDL;
break;
case RITYPE_HEALTH:
- return (Gfx*)gRandoBushHeartXluDL;
+ return (Gfx*)gRandoCuttableGrassHeartDL;
break;
case RITYPE_LESSER:
- return (Gfx*)gRandoBushMinorXluDL;
+ return (Gfx*)gRandoCuttableGrassMinorDL;
break;
case RITYPE_MAJOR:
- return (Gfx*)gRandoBushMajorXluDL;
+ return (Gfx*)gRandoCuttableGrassMajorDL;
break;
case RITYPE_MASK:
- return (Gfx*)gRandoBushMaskXluDL;
+ return (Gfx*)gRandoCuttableGrassMaskDL;
break;
case RITYPE_SKULLTULA_TOKEN:
- return (Gfx*)gRandoBushTokenXluDL;
+ return (Gfx*)gRandoCuttableGrassTokenDL;
break;
case RITYPE_SMALL_KEY:
- return (Gfx*)gRandoBushSmallKeyXluDL;
+ return (Gfx*)gRandoCuttableGrassSmallKeyDL;
break;
case RITYPE_STRAY_FAIRY:
- return (Gfx*)gRandoBushFairyXluDL;
+ return (Gfx*)gRandoCuttableGrassFairyDL;
break;
case RITYPE_JUNK:
- return (Gfx*)gRandoBushJunkXluDL;
+ return (Gfx*)gRandoCuttableGrassJunkDL;
break;
default:
- return (Gfx*)gRandoBushXluDL;
+ return (Gfx*)gRandoCuttableGrassRandomDL;
break;
}
}
@@ -323,6 +494,52 @@ void ObjGrass_RandoDrawXlu(ObjGrass* objGrass, ObjGrassElement* grassElem, Rando
CLOSE_DISPS(gPlayState->state.gfxCtx);
}
+void EnKusaBush_RandoDraw(Actor* actor, PlayState* play) {
+ Gfx_DrawDListOpa(play, GetObjGrassDList(Rando::ActorBehavior::GetObjectRandoCheckId(actor)));
+}
+
+void EnKusaGrass_RandoDraw(Actor* actor, PlayState* play) {
+ EnKusa* grass = (EnKusa*)actor;
+ RandoCheckId randoCheckId = Rando::ActorBehavior::GetObjectRandoCheckId(actor);
+
+ if (RANDO_SAVE_CHECKS[randoCheckId].obtained) {
+ actor->draw = EnKusa_DrawGrass;
+ EnKusa_DrawGrass(actor, play);
+ return;
+ }
+
+ if (grass->isCut) {
+ EnKusa_DrawGrass(actor, play);
+ return;
+ }
+
+ Gfx_DrawDListOpa(play, GetCuttableGrassDList(randoCheckId));
+}
+
+void KeatonGrassRing_DrawWonderItemSparkle(EnKusa2* grassRingActor) {
+ static Vec3f sVelocity = { 0.0f, 1.2f, 0.0f };
+ static Vec3f sAccel = { 0.0f, -0.05f, 0.0f };
+ static Color_RGBA8 sPrimColor = { 255, 255, 255, 255 };
+ static Color_RGBA8 sEnvColor = { 255, 200, 64, 255 };
+
+ if (gGameState->frames % 4 != 0) {
+ return;
+ }
+
+ EnKusa2* grassBush = grassRingActor->unk_194[(s32)Rand_ZeroFloat(ARRAY_COUNT(grassRingActor->unk_194))];
+ if (grassBush == nullptr) {
+ return;
+ }
+
+ Vec3f pos = {
+ Rand_CenteredFloat(20.0f) + grassBush->actor.world.pos.x,
+ (Rand_ZeroOne() * 25.0f) + grassBush->actor.world.pos.y,
+ Rand_CenteredFloat(20.0f) + grassBush->actor.world.pos.z,
+ };
+
+ EffectSsKirakira_SpawnDispersed(gPlayState, &pos, &sVelocity, &sAccel, &sPrimColor, &sEnvColor, 1600, 16);
+}
+
void Rando::ActorBehavior::InitObjGrassBehavior() {
/*
* Identify directly spawned actor grass by scene ID, room, and actor list index. If this is a common chest grotto,
@@ -360,9 +577,40 @@ void Rando::ActorBehavior::InitObjGrassBehavior() {
});
/*
+ * Identify the manager actor of a ring of Keaton grass by scene ID, room, and actor list index, and remember which
+ * RCs the ring owns. Its bushes are spawned later, and each of them claims one of those RCs as it attaches.
+ */
+ COND_ID_HOOK(OnActorInit, ACTOR_EN_KUSA2, IS_RANDO, [](Actor* actor) {
+ if (ENKUSA2_GET_1(actor)) { // This is one of the ring's bushes, not the manager
+ return;
+ }
+
+ auto it = keatonGrassMap.find({ gPlayState->sceneId, actor->room, GetActorListIndex(actor) });
+ if (it == keatonGrassMap.end()) {
+ return;
+ }
+
+ ObjectExtension::GetInstance().Set<KeatonGrassRing>(actor, KeatonGrassRing{ it->second });
+ });
+
+ // Only a ring's manager actor is given this extension, so this skips the ring's bushes along with all other grass.
+ COND_ID_HOOK(OnActorUpdate, ACTOR_EN_KUSA2, IS_RANDO, [](Actor* actor) {
+ KeatonGrassRing* grassRing = ObjectExtension::GetInstance().Get<KeatonGrassRing>(actor);
+ if (grassRing == nullptr) {
+ return;
+ }
+
+ RandoSaveCheck& randoSaveCheck = RANDO_SAVE_CHECKS[grassRing->wonderItemCheckId];
+ if (randoSaveCheck.shuffled && !randoSaveCheck.obtained) {
+ KeatonGrassRing_DrawWonderItemSparkle((EnKusa2*)actor);
+ }
+ });
+
+ /*
* Identify actor grass that was spawned by a spawner actor, by scene ID, room, and the spawner's actor list index.
* The RCs and child grass are contiguous, so they can increment the base value to get their target RC.
*/
+
COND_VB_SHOULD(VB_OBJ_MURE2_SET_CHILD_ROOM, IS_RANDO, {
Actor* actor = va_arg(args, Actor*);
ObjMure2* objMure2 = (ObjMure2*)actor;
@@ -449,12 +697,42 @@ void Rando::ActorBehavior::InitObjGrassBehavior() {
}
});
- COND_VB_SHOULD(VB_KUSA_BUSH_DRAW_BE_OVERRIDDEN, IS_RANDO, {
+ COND_VB_SHOULD(VB_KUSA_DRAW_BE_OVERRIDDEN, IS_RANDO, {
Actor* actor = va_arg(args, Actor*);
RandoCheckId randoCheckId = GetObjectRandoCheckId(actor);
if (randoCheckId != RC_UNKNOWN && !RANDO_SAVE_CHECKS[randoCheckId].obtained) {
*should = false;
- actor->draw = EnKusaBush_RandoDraw;
+ actor->draw = KUSA_GET_TYPE(actor) == ENKUSA_TYPE_BUSH ? EnKusaBush_RandoDraw : EnKusaGrass_RandoDraw;
+ }
+ });
+
+ /*
+ * A ring's bushes always spawn in the same positions, so a bush's index within the ring is enough to tie it to a
+ * specific RC. The RCs are contiguous, so the ring's base value can just be incremented.
+ */
+ COND_VB_SHOULD(VB_KEATON_GRASS_ATTACH_CHILD, IS_RANDO, {
+ EnKusa2* grassBush = va_arg(args, EnKusa2*);
+ s32 i = va_arg(args, s32);
+ KeatonGrassRing* grassRing = ObjectExtension::GetInstance().Get<KeatonGrassRing>(grassBush->unk_1C0);
+
+ if (grassRing == nullptr) {
+ return;
+ }
+
+ RandoCheckId randoCheckId = static_cast<RandoCheckId>(grassRing->baseCheckId + i);
+ if (!RANDO_SAVE_CHECKS[randoCheckId].shuffled || RANDO_SAVE_CHECKS[randoCheckId].cycleObtained) {
+ return;
+ }
+
+ SetObjectRandoCheckId(grassBush, randoCheckId);
+ });
+
+ COND_VB_SHOULD(VB_KEATON_GRASS_DRAW, IS_RANDO, {
+ EnKusa2* grassBush = va_arg(args, EnKusa2*);
+ RandoCheckId randoCheckId = GetObjectRandoCheckId(grassBush);
+ if (randoCheckId != RC_UNKNOWN && !RANDO_SAVE_CHECKS[randoCheckId].obtained) {
+ *should = false;
+ Gfx_DrawDListOpa(gPlayState, GetObjGrassDList(randoCheckId));
}
});
@@ -494,7 +772,7 @@ void Rando::ActorBehavior::InitObjGrassBehavior() {
COND_VB_SHOULD(VB_GRASS_DROP_COLLECTIBLE, IS_RANDO, {
auto actorId = static_cast<ActorId>(va_arg(args, int32_t));
Vec3f collectiblePos = gZeroVec3f;
- RandoCheckId randoCheckId;
+ RandoCheckId randoCheckId = RC_UNKNOWN;
if (actorId == ACTOR_OBJ_GRASS) {
ObjGrassElement* grassElemActor = va_arg(args, ObjGrassElement*);
@@ -508,6 +786,21 @@ void Rando::ActorBehavior::InitObjGrassBehavior() {
ObjGrassCarry* grassCarryActor = va_arg(args, ObjGrassCarry*);
collectiblePos = grassCarryActor->actor.world.pos;
randoCheckId = GetObjectRandoCheckId(grassCarryActor);
+ } else if (actorId == ACTOR_EN_KUSA2) {
+ EnKusa2* grassBush = va_arg(args, EnKusa2*);
+ collectiblePos = grassBush->actor.world.pos;
+ randoCheckId = GetObjectRandoCheckId(grassBush);
+
+ // This bush is the one vanilla would have dropped the ring's red rupee from, so it also owes the check
+ // that took that reward's place.
+ EnKusa2* grassRingActor = grassBush->unk_1C0;
+ KeatonGrassRing* grassRing = ObjectExtension::GetInstance().Get<KeatonGrassRing>(grassRingActor);
+ if (grassRing != nullptr && grassRingActor->unk_1BC == 8 &&
+ RANDO_SAVE_CHECKS[grassRing->wonderItemCheckId].shuffled &&
+ !RANDO_SAVE_CHECKS[grassRing->wonderItemCheckId].cycleObtained) {
+ SpawnGrassDrop(collectiblePos, grassRing->wonderItemCheckId);
+ *should = false;
+ }
}
if (randoCheckId == RC_UNKNOWN) {
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
diff --git a/mm/2s2h/Rando/StaticData/Checks.cpp b/mm/2s2h/Rando/StaticData/Checks.cpp
index cfb0e9126..03d619e8d 100644
--- a/mm/2s2h/Rando/StaticData/Checks.cpp
+++ b/mm/2s2h/Rando/StaticData/Checks.cpp
@@ -1400,9 +1400,44 @@ std::map<RandoCheckId, RandoStaticCheck> Checks = {
RC(RC_WOODFALL_TEMPLE_GEKKO_FROG, RCTYPE_FROG, SCENE_MITURIN, FLAG_NONE, 0x00, RI_FROG_CYAN),
// Grass //
+ RC(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_01, RCTYPE_GRASS, SCENE_CASTLE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_02, RCTYPE_GRASS, SCENE_CASTLE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_03, RCTYPE_GRASS, SCENE_CASTLE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_04, RCTYPE_GRASS, SCENE_CASTLE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_05, RCTYPE_GRASS, SCENE_CASTLE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_06, RCTYPE_GRASS, SCENE_CASTLE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_07, RCTYPE_GRASS, SCENE_CASTLE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_08, RCTYPE_GRASS, SCENE_CASTLE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_09, RCTYPE_GRASS, SCENE_CASTLE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_10, RCTYPE_GRASS, SCENE_CASTLE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_11, RCTYPE_GRASS, SCENE_CASTLE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_12, RCTYPE_GRASS, SCENE_CASTLE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_BENEATH_THE_WELL_COW_ROOM_GRASS_01, RCTYPE_GRASS, SCENE_REDEAD, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_BENEATH_THE_WELL_COW_ROOM_GRASS_02, RCTYPE_GRASS, SCENE_REDEAD, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_BENEATH_THE_WELL_COW_ROOM_GRASS_03, RCTYPE_GRASS, SCENE_REDEAD, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_BENEATH_THE_WELL_FOUR_SPIKED_BARS_GRASS_01, RCTYPE_GRASS, SCENE_REDEAD, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_BENEATH_THE_WELL_FOUR_SPIKED_BARS_GRASS_02, RCTYPE_GRASS, SCENE_REDEAD, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_BENEATH_THE_WELL_FOUR_SPIKED_BARS_GRASS_03, RCTYPE_GRASS, SCENE_REDEAD, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_BENEATH_THE_WELL_FOUR_SPIKED_BARS_GRASS_04, RCTYPE_GRASS, SCENE_REDEAD, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_BENEATH_THE_WELL_FOUR_SPIKED_BARS_GRASS_05, RCTYPE_GRASS, SCENE_REDEAD, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_BENEATH_THE_WELL_RIGHT_FIRE_KEESE_GRASS_01, RCTYPE_GRASS, SCENE_REDEAD, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_BENEATH_THE_WELL_RIGHT_FIRE_KEESE_GRASS_02, RCTYPE_GRASS, SCENE_REDEAD, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_BENEATH_THE_WELL_RIGHT_FIRE_KEESE_GRASS_03, RCTYPE_GRASS, SCENE_REDEAD, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_BENEATH_THE_WELL_RIGHT_FIRE_KEESE_GRASS_04, RCTYPE_GRASS, SCENE_REDEAD, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_BENEATH_THE_WELL_TWO_SPIKED_BARS_GRASS_01, RCTYPE_GRASS, SCENE_REDEAD, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_BENEATH_THE_WELL_TWO_SPIKED_BARS_GRASS_02, RCTYPE_GRASS, SCENE_REDEAD, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_CLOCK_TOWN_LAUNDRY_POOL_GRASS_01, RCTYPE_GRASS, SCENE_ALLEY, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_CLOCK_TOWN_LAUNDRY_POOL_GRASS_02, RCTYPE_GRASS, SCENE_ALLEY, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_CLOCK_TOWN_LAUNDRY_POOL_GRASS_03, RCTYPE_GRASS, SCENE_ALLEY, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_CLOCK_TOWN_NORTH_KEATON_GRASS_01, RCTYPE_GRASS, SCENE_BACKTOWN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_CLOCK_TOWN_NORTH_KEATON_GRASS_02, RCTYPE_GRASS, SCENE_BACKTOWN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_CLOCK_TOWN_NORTH_KEATON_GRASS_03, RCTYPE_GRASS, SCENE_BACKTOWN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_CLOCK_TOWN_NORTH_KEATON_GRASS_04, RCTYPE_GRASS, SCENE_BACKTOWN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_CLOCK_TOWN_NORTH_KEATON_GRASS_05, RCTYPE_GRASS, SCENE_BACKTOWN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_CLOCK_TOWN_NORTH_KEATON_GRASS_06, RCTYPE_GRASS, SCENE_BACKTOWN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_CLOCK_TOWN_NORTH_KEATON_GRASS_07, RCTYPE_GRASS, SCENE_BACKTOWN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_CLOCK_TOWN_NORTH_KEATON_GRASS_08, RCTYPE_GRASS, SCENE_BACKTOWN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_CLOCK_TOWN_NORTH_KEATON_GRASS_09, RCTYPE_GRASS, SCENE_BACKTOWN, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_01, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_02, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_03, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
@@ -1530,6 +1565,10 @@ std::map<RandoCheckId, RandoStaticCheck> Checks = {
RC(RC_GREAT_BAY_COAST_GRASS_03, RCTYPE_GRASS, SCENE_30GYOSON, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_GREAT_BAY_COAST_GRASS_04, RCTYPE_GRASS, SCENE_30GYOSON, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_GREAT_BAY_COAST_GRASS_05, RCTYPE_GRASS, SCENE_30GYOSON, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_IKANA_CANYON_GRASS_01, RCTYPE_GRASS, SCENE_IKANA, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_IKANA_CANYON_GRASS_02, RCTYPE_GRASS, SCENE_IKANA, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_IKANA_CANYON_GRASS_03, RCTYPE_GRASS, SCENE_IKANA, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_IKANA_CANYON_GRASS_04, RCTYPE_GRASS, SCENE_IKANA, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_IKANA_CANYON_GROTTO_GRASS_01, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_IKANA_CANYON_GROTTO_GRASS_02, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_IKANA_CANYON_GROTTO_GRASS_03, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
@@ -1567,6 +1606,11 @@ std::map<RandoCheckId, RandoStaticCheck> Checks = {
RC(RC_IKANA_GRAVEYARD_GROTTO_GRASS_12, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_IKANA_GRAVEYARD_GROTTO_GRASS_13, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_IKANA_GRAVEYARD_GROTTO_GRASS_14, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_IKANA_GRAVEYARD_LOWER_GRASS_01, RCTYPE_GRASS, SCENE_BOTI, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_IKANA_GRAVEYARD_LOWER_GRASS_02, RCTYPE_GRASS, SCENE_BOTI, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_IKANA_GRAVEYARD_LOWER_GRASS_03, RCTYPE_GRASS, SCENE_BOTI, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_IKANA_GRAVEYARD_LOWER_GRASS_04, RCTYPE_GRASS, SCENE_BOTI, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_IKANA_GRAVEYARD_LOWER_GRASS_05, RCTYPE_GRASS, SCENE_BOTI, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_LONE_PEAK_SHRINE_GRASS_01, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_LONE_PEAK_SHRINE_GRASS_02, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_LONE_PEAK_SHRINE_GRASS_03, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
@@ -1591,6 +1635,18 @@ std::map<RandoCheckId, RandoStaticCheck> Checks = {
RC(RC_LONE_PEAK_SHRINE_GRASS_22, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_LONE_PEAK_SHRINE_GRASS_23, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_LONE_PEAK_SHRINE_GRASS_24, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_MILK_ROAD_GRASS_01, RCTYPE_GRASS, SCENE_ROMANYMAE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_MILK_ROAD_GRASS_02, RCTYPE_GRASS, SCENE_ROMANYMAE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_MILK_ROAD_GRASS_03, RCTYPE_GRASS, SCENE_ROMANYMAE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_MILK_ROAD_KEATON_GRASS_01, RCTYPE_GRASS, SCENE_ROMANYMAE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_MILK_ROAD_KEATON_GRASS_02, RCTYPE_GRASS, SCENE_ROMANYMAE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_MILK_ROAD_KEATON_GRASS_03, RCTYPE_GRASS, SCENE_ROMANYMAE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_MILK_ROAD_KEATON_GRASS_04, RCTYPE_GRASS, SCENE_ROMANYMAE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_MILK_ROAD_KEATON_GRASS_05, RCTYPE_GRASS, SCENE_ROMANYMAE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_MILK_ROAD_KEATON_GRASS_06, RCTYPE_GRASS, SCENE_ROMANYMAE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_MILK_ROAD_KEATON_GRASS_07, RCTYPE_GRASS, SCENE_ROMANYMAE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_MILK_ROAD_KEATON_GRASS_08, RCTYPE_GRASS, SCENE_ROMANYMAE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_MILK_ROAD_KEATON_GRASS_09, RCTYPE_GRASS, SCENE_ROMANYMAE, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_01, RCTYPE_GRASS, SCENE_10YUKIYAMANOMURA2, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_02, RCTYPE_GRASS, SCENE_10YUKIYAMANOMURA2, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_03, RCTYPE_GRASS, SCENE_10YUKIYAMANOMURA2, FLAG_NONE, 0x0, RI_JUNK),
@@ -1621,6 +1677,15 @@ std::map<RandoCheckId, RandoStaticCheck> Checks = {
RC(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_28, RCTYPE_GRASS, SCENE_10YUKIYAMANOMURA2, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_29, RCTYPE_GRASS, SCENE_10YUKIYAMANOMURA2, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_30, RCTYPE_GRASS, SCENE_10YUKIYAMANOMURA2, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_01, RCTYPE_GRASS, SCENE_10YUKIYAMANOMURA2, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_02, RCTYPE_GRASS, SCENE_10YUKIYAMANOMURA2, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_03, RCTYPE_GRASS, SCENE_10YUKIYAMANOMURA2, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_04, RCTYPE_GRASS, SCENE_10YUKIYAMANOMURA2, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_05, RCTYPE_GRASS, SCENE_10YUKIYAMANOMURA2, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_06, RCTYPE_GRASS, SCENE_10YUKIYAMANOMURA2, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_07, RCTYPE_GRASS, SCENE_10YUKIYAMANOMURA2, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_08, RCTYPE_GRASS, SCENE_10YUKIYAMANOMURA2, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_09, RCTYPE_GRASS, SCENE_10YUKIYAMANOMURA2, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_01, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_02, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_03, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
@@ -1754,6 +1819,45 @@ std::map<RandoCheckId, RandoStaticCheck> Checks = {
RC(RC_ROMANI_RANCH_GRASS_55, RCTYPE_GRASS, SCENE_F01, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_ROMANI_RANCH_GRASS_56, RCTYPE_GRASS, SCENE_F01, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_ROMANI_RANCH_GRASS_57, RCTYPE_GRASS, SCENE_F01, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_DINOLFOS_GRASS_01, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_DINOLFOS_GRASS_02, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_DINOLFOS_GRASS_03, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_DINOLFOS_GRASS_04, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_ENTRANCE_GRASS_01, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_ENTRANCE_GRASS_02, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_ENTRANCE_GRASS_03, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_ENTRANCE_GRASS_04, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_ENTRANCE_GRASS_05, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_ENTRANCE_GRASS_06, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_GARO_MASTER_GRASS_01, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_GARO_MASTER_GRASS_02, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_GARO_MASTER_GRASS_03, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_GARO_MASTER_GRASS_04, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_GARO_MASTER_GRASS_05, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_GARO_MASTER_GRASS_06, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_WART_GRASS_01, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_WART_GRASS_02, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_WART_GRASS_03, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_WART_GRASS_04, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_WART_GRASS_05, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_WART_GRASS_06, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_WART_GRASS_07, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_WART_GRASS_08, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_WIZZROBE_GRASS_01, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_WIZZROBE_GRASS_02, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_WIZZROBE_GRASS_03, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_WIZZROBE_GRASS_04, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SECRET_SHRINE_WIZZROBE_GRASS_05, RCTYPE_GRASS, SCENE_RANDOM, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_01, RCTYPE_GRASS, SCENE_HAKUGIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_02, RCTYPE_GRASS, SCENE_HAKUGIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_03, RCTYPE_GRASS, SCENE_HAKUGIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_04, RCTYPE_GRASS, SCENE_HAKUGIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_05, RCTYPE_GRASS, SCENE_HAKUGIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_06, RCTYPE_GRASS, SCENE_HAKUGIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_07, RCTYPE_GRASS, SCENE_HAKUGIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_08, RCTYPE_GRASS, SCENE_HAKUGIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_09, RCTYPE_GRASS, SCENE_HAKUGIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_10, RCTYPE_GRASS, SCENE_HAKUGIN, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_SOUTHERN_SWAMP_CLEARED_GRASS_01, RCTYPE_GRASS, SCENE_20SICHITAI2, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_SOUTHERN_SWAMP_CLEARED_GRASS_02, RCTYPE_GRASS, SCENE_20SICHITAI2, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_SOUTHERN_SWAMP_CLEARED_GRASS_03, RCTYPE_GRASS, SCENE_20SICHITAI2, FLAG_NONE, 0x0, RI_JUNK),
@@ -1784,6 +1888,10 @@ std::map<RandoCheckId, RandoStaticCheck> Checks = {
RC(RC_SOUTHERN_SWAMP_CLEARED_GRASS_28, RCTYPE_GRASS, SCENE_20SICHITAI2, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_SOUTHERN_SWAMP_CLEARED_GRASS_29, RCTYPE_GRASS, SCENE_20SICHITAI2, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_SOUTHERN_SWAMP_CLEARED_GRASS_30, RCTYPE_GRASS, SCENE_20SICHITAI2, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SOUTHERN_SWAMP_CLEARED_TOURIST_GRASS_01, RCTYPE_GRASS, SCENE_20SICHITAI2, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SOUTHERN_SWAMP_CLEARED_TOURIST_GRASS_02, RCTYPE_GRASS, SCENE_20SICHITAI2, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SOUTHERN_SWAMP_CLEARED_WOODS_GRASS_01, RCTYPE_GRASS, SCENE_20SICHITAI2, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SOUTHERN_SWAMP_CLEARED_WOODS_GRASS_02, RCTYPE_GRASS, SCENE_20SICHITAI2, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_SOUTHERN_SWAMP_GROTTO_GRASS_01, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_SOUTHERN_SWAMP_GROTTO_GRASS_02, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_SOUTHERN_SWAMP_GROTTO_GRASS_03, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
@@ -1829,6 +1937,19 @@ std::map<RandoCheckId, RandoStaticCheck> Checks = {
RC(RC_SOUTHERN_SWAMP_POISON_GRASS_28, RCTYPE_GRASS, SCENE_20SICHITAI, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_SOUTHERN_SWAMP_POISON_GRASS_29, RCTYPE_GRASS, SCENE_20SICHITAI, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_SOUTHERN_SWAMP_POISON_GRASS_30, RCTYPE_GRASS, SCENE_20SICHITAI, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SOUTHERN_SWAMP_POISON_TOURIST_GRASS_01, RCTYPE_GRASS, SCENE_20SICHITAI, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SOUTHERN_SWAMP_POISON_TOURIST_GRASS_02, RCTYPE_GRASS, SCENE_20SICHITAI, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SOUTHERN_SWAMP_POISON_WOODS_GRASS_01, RCTYPE_GRASS, SCENE_20SICHITAI, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_SOUTHERN_SWAMP_POISON_WOODS_GRASS_02, RCTYPE_GRASS, SCENE_20SICHITAI, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_STONE_TOWER_TEMPLE_ENTRANCE_GRASS_01, RCTYPE_GRASS, SCENE_INISIE_N, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_STONE_TOWER_TEMPLE_ENTRANCE_GRASS_02, RCTYPE_GRASS, SCENE_INISIE_N, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_STONE_TOWER_TEMPLE_ENTRANCE_GRASS_03, RCTYPE_GRASS, SCENE_INISIE_N, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_01, RCTYPE_GRASS, SCENE_INISIE_N, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_02, RCTYPE_GRASS, SCENE_INISIE_N, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_03, RCTYPE_GRASS, SCENE_INISIE_N, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_04, RCTYPE_GRASS, SCENE_INISIE_N, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_05, RCTYPE_GRASS, SCENE_INISIE_N, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_06, RCTYPE_GRASS, SCENE_INISIE_N, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_TERMINA_FIELD_BIO_BABA_GROTTO_GRASS_01, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_TERMINA_FIELD_BIO_BABA_GROTTO_GRASS_02, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_TERMINA_FIELD_COW_GROTTO_GRASS_01, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK),
@@ -2202,6 +2323,56 @@ std::map<RandoCheckId, RandoStaticCheck> Checks = {
RC(RC_WOODFALL_GRASS_04, RCTYPE_GRASS, SCENE_21MITURINMAE, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_WOODFALL_GRASS_05, RCTYPE_GRASS, SCENE_21MITURINMAE, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_WOODFALL_GRASS_06, RCTYPE_GRASS, SCENE_21MITURINMAE, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_BOSS_GRASS_01, RCTYPE_GRASS, SCENE_MITURIN_BS, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_BOSS_GRASS_02, RCTYPE_GRASS, SCENE_MITURIN_BS, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_BOSS_GRASS_03, RCTYPE_GRASS, SCENE_MITURIN_BS, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_BOSS_GRASS_04, RCTYPE_GRASS, SCENE_MITURIN_BS, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_BOSS_GRASS_05, RCTYPE_GRASS, SCENE_MITURIN_BS, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_BOSS_GRASS_06, RCTYPE_GRASS, SCENE_MITURIN_BS, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_BOSS_GRASS_07, RCTYPE_GRASS, SCENE_MITURIN_BS, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_BOSS_GRASS_08, RCTYPE_GRASS, SCENE_MITURIN_BS, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_BOSS_GRASS_09, RCTYPE_GRASS, SCENE_MITURIN_BS, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_BOSS_GRASS_10, RCTYPE_GRASS, SCENE_MITURIN_BS, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_BOSS_GRASS_11, RCTYPE_GRASS, SCENE_MITURIN_BS, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_BOSS_GRASS_12, RCTYPE_GRASS, SCENE_MITURIN_BS, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_BOSS_GRASS_13, RCTYPE_GRASS, SCENE_MITURIN_BS, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_BOSS_GRASS_14, RCTYPE_GRASS, SCENE_MITURIN_BS, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_BOSS_GRASS_15, RCTYPE_GRASS, SCENE_MITURIN_BS, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_BOSS_GRASS_16, RCTYPE_GRASS, SCENE_MITURIN_BS, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_COMPASS_ROOM_GRASS_01, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_COMPASS_ROOM_GRASS_02, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_COMPASS_ROOM_GRASS_03, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_ENTRANCE_GRASS_01, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_ENTRANCE_GRASS_02, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_ENTRANCE_GRASS_03, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_ENTRANCE_GRASS_04, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_ENTRANCE_GRASS_05, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_GRASS_01, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_GRASS_02, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_MAIN_ROOM_UPPER_GRASS_01, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_MAP_ROOM_GRASS_01, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_MAP_ROOM_GRASS_02, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_MAP_ROOM_GRASS_03, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_MAP_ROOM_GRASS_04, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_MAP_ROOM_GRASS_05, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_PRE_BOSS_GRASS_01, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_PRE_BOSS_GRASS_02, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_PRE_BOSS_GRASS_03, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_PRE_BOSS_GRASS_04, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_PRE_BOSS_GRASS_05, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_01, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_02, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_03, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_04, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_05, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_06, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_07, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_08, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_09, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_10, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_11, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_WATER_ROOM_GRASS_01, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
+ RC(RC_WOODFALL_TEMPLE_WATER_ROOM_GRASS_02, RCTYPE_GRASS, SCENE_MITURIN, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_WOODS_OF_MYSTERY_GRASS_01, RCTYPE_GRASS, SCENE_26SARUNOMORI, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_WOODS_OF_MYSTERY_GRASS_02, RCTYPE_GRASS, SCENE_26SARUNOMORI, FLAG_NONE, 0x0, RI_JUNK),
RC(RC_WOODS_OF_MYSTERY_GRASS_03, RCTYPE_GRASS, SCENE_26SARUNOMORI, FLAG_NONE, 0x0, RI_JUNK),
@@ -2405,6 +2576,7 @@ std::map<RandoCheckId, RandoStaticCheck> Checks = {
RC(RC_CLOCK_TOWN_EAST_WONDER_ITEM_07, RCTYPE_WONDER_ITEM, SCENE_TOWN, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
RC(RC_CLOCK_TOWN_EAST_WONDER_ITEM_08, RCTYPE_WONDER_ITEM, SCENE_TOWN, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
RC(RC_CLOCK_TOWN_EAST_WONDER_ITEM_09, RCTYPE_WONDER_ITEM, SCENE_TOWN, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_CLOCK_TOWN_NORTH_KEATON_GRASS_WONDER_ITEM, RCTYPE_WONDER_ITEM, SCENE_BACKTOWN, FLAG_NONE, 0x0, RI_RUPEE_RED),
RC(RC_CLOCK_TOWN_SOUTH_WONDER_ITEM_01, RCTYPE_WONDER_ITEM, SCENE_CLOCKTOWER, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
RC(RC_CLOCK_TOWN_SOUTH_WONDER_ITEM_02, RCTYPE_WONDER_ITEM, SCENE_CLOCKTOWER, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
RC(RC_CLOCK_TOWN_SOUTH_WONDER_ITEM_03, RCTYPE_WONDER_ITEM, SCENE_CLOCKTOWER, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
@@ -2426,6 +2598,8 @@ std::map<RandoCheckId, RandoStaticCheck> Checks = {
RC(RC_IKANA_GRAVEYARD_WONDER_ITEM_10, RCTYPE_WONDER_ITEM, SCENE_BOTI, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
RC(RC_IKANA_GRAVEYARD_WONDER_ITEM_11, RCTYPE_WONDER_ITEM, SCENE_BOTI, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
RC(RC_IKANA_GRAVEYARD_WONDER_ITEM_12, RCTYPE_WONDER_ITEM, SCENE_BOTI, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_MILK_ROAD_KEATON_GRASS_WONDER_ITEM, RCTYPE_WONDER_ITEM, SCENE_ROMANYMAE, FLAG_NONE, 0x0, RI_RUPEE_RED),
+ RC(RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_WONDER_ITEM, RCTYPE_WONDER_ITEM, SCENE_10YUKIYAMANOMURA2, FLAG_NONE, 0x0, RI_RUPEE_RED),
RC(RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_01, RCTYPE_WONDER_ITEM, SCENE_KINDAN2, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
RC(RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_02, RCTYPE_WONDER_ITEM, SCENE_KINDAN2, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
RC(RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_03, RCTYPE_WONDER_ITEM, SCENE_KINDAN2, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h
index 3000cade9..078634a67 100644
--- a/mm/2s2h/Rando/Types.h
+++ b/mm/2s2h/Rando/Types.h
@@ -1408,9 +1408,44 @@ typedef enum {
RC_WOODFALL_TEMPLE_GEKKO_FROG,
// Grass //
+ RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_01,
+ RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_02,
+ RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_03,
+ RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_04,
+ RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_05,
+ RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_06,
+ RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_07,
+ RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_08,
+ RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_09,
+ RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_10,
+ RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_11,
+ RC_ANCIENT_CASTLE_OF_IKANA_COURTYARD_GRASS_12,
+ RC_BENEATH_THE_WELL_COW_ROOM_GRASS_01,
+ RC_BENEATH_THE_WELL_COW_ROOM_GRASS_02,
+ RC_BENEATH_THE_WELL_COW_ROOM_GRASS_03,
+ RC_BENEATH_THE_WELL_FOUR_SPIKED_BARS_GRASS_01,
+ RC_BENEATH_THE_WELL_FOUR_SPIKED_BARS_GRASS_02,
+ RC_BENEATH_THE_WELL_FOUR_SPIKED_BARS_GRASS_03,
+ RC_BENEATH_THE_WELL_FOUR_SPIKED_BARS_GRASS_04,
+ RC_BENEATH_THE_WELL_FOUR_SPIKED_BARS_GRASS_05,
+ RC_BENEATH_THE_WELL_RIGHT_FIRE_KEESE_GRASS_01,
+ RC_BENEATH_THE_WELL_RIGHT_FIRE_KEESE_GRASS_02,
+ RC_BENEATH_THE_WELL_RIGHT_FIRE_KEESE_GRASS_03,
+ RC_BENEATH_THE_WELL_RIGHT_FIRE_KEESE_GRASS_04,
+ RC_BENEATH_THE_WELL_TWO_SPIKED_BARS_GRASS_01,
+ RC_BENEATH_THE_WELL_TWO_SPIKED_BARS_GRASS_02,
RC_CLOCK_TOWN_LAUNDRY_POOL_GRASS_01,
RC_CLOCK_TOWN_LAUNDRY_POOL_GRASS_02,
RC_CLOCK_TOWN_LAUNDRY_POOL_GRASS_03,
+ RC_CLOCK_TOWN_NORTH_KEATON_GRASS_01,
+ RC_CLOCK_TOWN_NORTH_KEATON_GRASS_02,
+ RC_CLOCK_TOWN_NORTH_KEATON_GRASS_03,
+ RC_CLOCK_TOWN_NORTH_KEATON_GRASS_04,
+ RC_CLOCK_TOWN_NORTH_KEATON_GRASS_05,
+ RC_CLOCK_TOWN_NORTH_KEATON_GRASS_06,
+ RC_CLOCK_TOWN_NORTH_KEATON_GRASS_07,
+ RC_CLOCK_TOWN_NORTH_KEATON_GRASS_08,
+ RC_CLOCK_TOWN_NORTH_KEATON_GRASS_09,
RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_01,
RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_02,
RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_03,
@@ -1538,6 +1573,10 @@ typedef enum {
RC_GREAT_BAY_COAST_GRASS_03,
RC_GREAT_BAY_COAST_GRASS_04,
RC_GREAT_BAY_COAST_GRASS_05,
+ RC_IKANA_CANYON_GRASS_01,
+ RC_IKANA_CANYON_GRASS_02,
+ RC_IKANA_CANYON_GRASS_03,
+ RC_IKANA_CANYON_GRASS_04,
RC_IKANA_CANYON_GROTTO_GRASS_01,
RC_IKANA_CANYON_GROTTO_GRASS_02,
RC_IKANA_CANYON_GROTTO_GRASS_03,
@@ -1575,6 +1614,11 @@ typedef enum {
RC_IKANA_GRAVEYARD_GROTTO_GRASS_12,
RC_IKANA_GRAVEYARD_GROTTO_GRASS_13,
RC_IKANA_GRAVEYARD_GROTTO_GRASS_14,
+ RC_IKANA_GRAVEYARD_LOWER_GRASS_01,
+ RC_IKANA_GRAVEYARD_LOWER_GRASS_02,
+ RC_IKANA_GRAVEYARD_LOWER_GRASS_03,
+ RC_IKANA_GRAVEYARD_LOWER_GRASS_04,
+ RC_IKANA_GRAVEYARD_LOWER_GRASS_05,
RC_LONE_PEAK_SHRINE_GRASS_01,
RC_LONE_PEAK_SHRINE_GRASS_02,
RC_LONE_PEAK_SHRINE_GRASS_03,
@@ -1599,6 +1643,18 @@ typedef enum {
RC_LONE_PEAK_SHRINE_GRASS_22,
RC_LONE_PEAK_SHRINE_GRASS_23,
RC_LONE_PEAK_SHRINE_GRASS_24,
+ RC_MILK_ROAD_GRASS_01,
+ RC_MILK_ROAD_GRASS_02,
+ RC_MILK_ROAD_GRASS_03,
+ RC_MILK_ROAD_KEATON_GRASS_01,
+ RC_MILK_ROAD_KEATON_GRASS_02,
+ RC_MILK_ROAD_KEATON_GRASS_03,
+ RC_MILK_ROAD_KEATON_GRASS_04,
+ RC_MILK_ROAD_KEATON_GRASS_05,
+ RC_MILK_ROAD_KEATON_GRASS_06,
+ RC_MILK_ROAD_KEATON_GRASS_07,
+ RC_MILK_ROAD_KEATON_GRASS_08,
+ RC_MILK_ROAD_KEATON_GRASS_09,
RC_MOUNTAIN_VILLAGE_SPRING_GRASS_01,
RC_MOUNTAIN_VILLAGE_SPRING_GRASS_02,
RC_MOUNTAIN_VILLAGE_SPRING_GRASS_03,
@@ -1629,6 +1685,15 @@ typedef enum {
RC_MOUNTAIN_VILLAGE_SPRING_GRASS_28,
RC_MOUNTAIN_VILLAGE_SPRING_GRASS_29,
RC_MOUNTAIN_VILLAGE_SPRING_GRASS_30,
+ RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_01,
+ RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_02,
+ RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_03,
+ RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_04,
+ RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_05,
+ RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_06,
+ RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_07,
+ RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_08,
+ RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_09,
RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_01,
RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_02,
RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_03,
@@ -1762,6 +1827,45 @@ typedef enum {
RC_ROMANI_RANCH_GRASS_55,
RC_ROMANI_RANCH_GRASS_56,
RC_ROMANI_RANCH_GRASS_57,
+ RC_SECRET_SHRINE_DINOLFOS_GRASS_01,
+ RC_SECRET_SHRINE_DINOLFOS_GRASS_02,
+ RC_SECRET_SHRINE_DINOLFOS_GRASS_03,
+ RC_SECRET_SHRINE_DINOLFOS_GRASS_04,
+ RC_SECRET_SHRINE_ENTRANCE_GRASS_01,
+ RC_SECRET_SHRINE_ENTRANCE_GRASS_02,
+ RC_SECRET_SHRINE_ENTRANCE_GRASS_03,
+ RC_SECRET_SHRINE_ENTRANCE_GRASS_04,
+ RC_SECRET_SHRINE_ENTRANCE_GRASS_05,
+ RC_SECRET_SHRINE_ENTRANCE_GRASS_06,
+ RC_SECRET_SHRINE_GARO_MASTER_GRASS_01,
+ RC_SECRET_SHRINE_GARO_MASTER_GRASS_02,
+ RC_SECRET_SHRINE_GARO_MASTER_GRASS_03,
+ RC_SECRET_SHRINE_GARO_MASTER_GRASS_04,
+ RC_SECRET_SHRINE_GARO_MASTER_GRASS_05,
+ RC_SECRET_SHRINE_GARO_MASTER_GRASS_06,
+ RC_SECRET_SHRINE_WART_GRASS_01,
+ RC_SECRET_SHRINE_WART_GRASS_02,
+ RC_SECRET_SHRINE_WART_GRASS_03,
+ RC_SECRET_SHRINE_WART_GRASS_04,
+ RC_SECRET_SHRINE_WART_GRASS_05,
+ RC_SECRET_SHRINE_WART_GRASS_06,
+ RC_SECRET_SHRINE_WART_GRASS_07,
+ RC_SECRET_SHRINE_WART_GRASS_08,
+ RC_SECRET_SHRINE_WIZZROBE_GRASS_01,
+ RC_SECRET_SHRINE_WIZZROBE_GRASS_02,
+ RC_SECRET_SHRINE_WIZZROBE_GRASS_03,
+ RC_SECRET_SHRINE_WIZZROBE_GRASS_04,
+ RC_SECRET_SHRINE_WIZZROBE_GRASS_05,
+ RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_01,
+ RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_02,
+ RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_03,
+ RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_04,
+ RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_05,
+ RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_06,
+ RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_07,
+ RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_08,
+ RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_09,
+ RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_GRASS_10,
RC_SOUTHERN_SWAMP_CLEARED_GRASS_01,
RC_SOUTHERN_SWAMP_CLEARED_GRASS_02,
RC_SOUTHERN_SWAMP_CLEARED_GRASS_03,
@@ -1792,6 +1896,10 @@ typedef enum {
RC_SOUTHERN_SWAMP_CLEARED_GRASS_28,
RC_SOUTHERN_SWAMP_CLEARED_GRASS_29,
RC_SOUTHERN_SWAMP_CLEARED_GRASS_30,
+ RC_SOUTHERN_SWAMP_CLEARED_TOURIST_GRASS_01,
+ RC_SOUTHERN_SWAMP_CLEARED_TOURIST_GRASS_02,
+ RC_SOUTHERN_SWAMP_CLEARED_WOODS_GRASS_01,
+ RC_SOUTHERN_SWAMP_CLEARED_WOODS_GRASS_02,
RC_SOUTHERN_SWAMP_GROTTO_GRASS_01,
RC_SOUTHERN_SWAMP_GROTTO_GRASS_02,
RC_SOUTHERN_SWAMP_GROTTO_GRASS_03,
@@ -1837,6 +1945,19 @@ typedef enum {
RC_SOUTHERN_SWAMP_POISON_GRASS_28,
RC_SOUTHERN_SWAMP_POISON_GRASS_29,
RC_SOUTHERN_SWAMP_POISON_GRASS_30,
+ RC_SOUTHERN_SWAMP_POISON_TOURIST_GRASS_01,
+ RC_SOUTHERN_SWAMP_POISON_TOURIST_GRASS_02,
+ RC_SOUTHERN_SWAMP_POISON_WOODS_GRASS_01,
+ RC_SOUTHERN_SWAMP_POISON_WOODS_GRASS_02,
+ RC_STONE_TOWER_TEMPLE_ENTRANCE_GRASS_01,
+ RC_STONE_TOWER_TEMPLE_ENTRANCE_GRASS_02,
+ RC_STONE_TOWER_TEMPLE_ENTRANCE_GRASS_03,
+ RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_01,
+ RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_02,
+ RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_03,
+ RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_04,
+ RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_05,
+ RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_GRASS_06,
RC_TERMINA_FIELD_BIO_BABA_GROTTO_GRASS_01,
RC_TERMINA_FIELD_BIO_BABA_GROTTO_GRASS_02,
RC_TERMINA_FIELD_COW_GROTTO_GRASS_01,
@@ -2210,6 +2331,56 @@ typedef enum {
RC_WOODFALL_GRASS_04,
RC_WOODFALL_GRASS_05,
RC_WOODFALL_GRASS_06,
+ RC_WOODFALL_TEMPLE_BOSS_GRASS_01,
+ RC_WOODFALL_TEMPLE_BOSS_GRASS_02,
+ RC_WOODFALL_TEMPLE_BOSS_GRASS_03,
+ RC_WOODFALL_TEMPLE_BOSS_GRASS_04,
+ RC_WOODFALL_TEMPLE_BOSS_GRASS_05,
+ RC_WOODFALL_TEMPLE_BOSS_GRASS_06,
+ RC_WOODFALL_TEMPLE_BOSS_GRASS_07,
+ RC_WOODFALL_TEMPLE_BOSS_GRASS_08,
+ RC_WOODFALL_TEMPLE_BOSS_GRASS_09,
+ RC_WOODFALL_TEMPLE_BOSS_GRASS_10,
+ RC_WOODFALL_TEMPLE_BOSS_GRASS_11,
+ RC_WOODFALL_TEMPLE_BOSS_GRASS_12,
+ RC_WOODFALL_TEMPLE_BOSS_GRASS_13,
+ RC_WOODFALL_TEMPLE_BOSS_GRASS_14,
+ RC_WOODFALL_TEMPLE_BOSS_GRASS_15,
+ RC_WOODFALL_TEMPLE_BOSS_GRASS_16,
+ RC_WOODFALL_TEMPLE_COMPASS_ROOM_GRASS_01,
+ RC_WOODFALL_TEMPLE_COMPASS_ROOM_GRASS_02,
+ RC_WOODFALL_TEMPLE_COMPASS_ROOM_GRASS_03,
+ RC_WOODFALL_TEMPLE_ENTRANCE_GRASS_01,
+ RC_WOODFALL_TEMPLE_ENTRANCE_GRASS_02,
+ RC_WOODFALL_TEMPLE_ENTRANCE_GRASS_03,
+ RC_WOODFALL_TEMPLE_ENTRANCE_GRASS_04,
+ RC_WOODFALL_TEMPLE_ENTRANCE_GRASS_05,
+ RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_GRASS_01,
+ RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_GRASS_02,
+ RC_WOODFALL_TEMPLE_MAIN_ROOM_UPPER_GRASS_01,
+ RC_WOODFALL_TEMPLE_MAP_ROOM_GRASS_01,
+ RC_WOODFALL_TEMPLE_MAP_ROOM_GRASS_02,
+ RC_WOODFALL_TEMPLE_MAP_ROOM_GRASS_03,
+ RC_WOODFALL_TEMPLE_MAP_ROOM_GRASS_04,
+ RC_WOODFALL_TEMPLE_MAP_ROOM_GRASS_05,
+ RC_WOODFALL_TEMPLE_PRE_BOSS_GRASS_01,
+ RC_WOODFALL_TEMPLE_PRE_BOSS_GRASS_02,
+ RC_WOODFALL_TEMPLE_PRE_BOSS_GRASS_03,
+ RC_WOODFALL_TEMPLE_PRE_BOSS_GRASS_04,
+ RC_WOODFALL_TEMPLE_PRE_BOSS_GRASS_05,
+ RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_01,
+ RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_02,
+ RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_03,
+ RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_04,
+ RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_05,
+ RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_06,
+ RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_07,
+ RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_08,
+ RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_09,
+ RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_10,
+ RC_WOODFALL_TEMPLE_UPPER_WALKWAY_GRASS_11,
+ RC_WOODFALL_TEMPLE_WATER_ROOM_GRASS_01,
+ RC_WOODFALL_TEMPLE_WATER_ROOM_GRASS_02,
RC_WOODS_OF_MYSTERY_GRASS_01,
RC_WOODS_OF_MYSTERY_GRASS_02,
RC_WOODS_OF_MYSTERY_GRASS_03,
@@ -2408,6 +2579,7 @@ typedef enum {
RC_CLOCK_TOWN_EAST_WONDER_ITEM_07,
RC_CLOCK_TOWN_EAST_WONDER_ITEM_08,
RC_CLOCK_TOWN_EAST_WONDER_ITEM_09,
+ RC_CLOCK_TOWN_NORTH_KEATON_GRASS_WONDER_ITEM,
RC_CLOCK_TOWN_SOUTH_WONDER_ITEM_01,
RC_CLOCK_TOWN_SOUTH_WONDER_ITEM_02,
RC_CLOCK_TOWN_SOUTH_WONDER_ITEM_03,
@@ -2429,6 +2601,8 @@ typedef enum {
RC_IKANA_GRAVEYARD_WONDER_ITEM_10,
RC_IKANA_GRAVEYARD_WONDER_ITEM_11,
RC_IKANA_GRAVEYARD_WONDER_ITEM_12,
+ RC_MILK_ROAD_KEATON_GRASS_WONDER_ITEM,
+ RC_MOUNTAIN_VILLAGE_SPRING_KEATON_GRASS_WONDER_ITEM,
RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_01,
RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_02,
RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_03,