* Overworld pretty much done.

* Known issue with Market Night + 2 bushes in KF
* Known issue with Adult bush in ZR
This commit is contained in:
Fredrik Andréasson 2025-01-16 01:32:14 +01:00
parent 323ea2df96
commit b754479ef8
28 changed files with 1317 additions and 32 deletions

View File

@ -302,6 +302,9 @@ typedef enum {
// Opt: *EnFr
// Vanilla condition: this->reward == GI_NONE
VB_FROGS_GO_TO_IDLE,
// Opt: *EnKusa
VB_GRASS_SETUP_DRAW,
VB_GRASS_DROP_ITEM,
/*** Play Cutscenes ***/

View File

@ -1936,5 +1936,41 @@ void StaticData::HintTable_Init_Exclude_Overworld() {
/*german*/ "!!!",
/*french*/ "Selon moi, jouer une mélodie orageuse pour une pierre étrange dans le côté d'un cratère révèle [[1]].", {QM_RED, QM_GREEN}));
hintTextTable[RHT_KF_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a forest# reveals #[[1]]#.",
/*german*/ "!!!",
/*french*/ "!!!", { QM_RED, QM_GREEN }));
hintTextTable[RHT_LW_GRASS] = HintText(CustomMessage("They say that #cutting some grass in the woods# reveals #[[1]]#.",
/*german*/ "!!!",
/*french*/ "!!!", { QM_RED, QM_GREEN }));
hintTextTable[RHT_MARKET_GRASS] = HintText(CustomMessage("They say that #cutting some grass in the market# reveals #[[1]]#.",
/*german*/ "!!!",
/*french*/ "!!!", { QM_RED, QM_GREEN }));
hintTextTable[RHT_HC_GRASS] = HintText(CustomMessage("They say that #cutting some grass near the castle# reveals #[[1]]#.",
/*german*/ "!!!",
/*french*/ "!!!", { QM_RED, QM_GREEN }));
hintTextTable[RHT_KAK_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a village# reveals #[[1]]#.",
/*german*/ "!!!",
/*french*/ "!!!", { QM_RED, QM_GREEN }));
hintTextTable[RHT_GY_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a graveyard# reveals #[[1]]#.",
/*german*/ "!!!",
/*french*/ "!!!", { QM_RED, QM_GREEN }));
hintTextTable[RHT_LH_GRASS] = HintText(CustomMessage("They say that #cutting some grass near a lake# reveals #[[1]]#.",
/*german*/ "!!!",
/*french*/ "!!!", { QM_RED, QM_GREEN }));
hintTextTable[RHT_HF_GRASS] = HintText(CustomMessage("They say that #cutting some grass on a field# reveals #[[1]]#.",
/*german*/ "!!!",
/*french*/ "!!!", { QM_RED, QM_GREEN }));
hintTextTable[RHT_ZR_GRASS] = HintText(CustomMessage("They say that #cutting some grass near a river# reveals #[[1]]#.",
/*german*/ "!!!",
/*french*/ "!!!", { QM_RED, QM_GREEN }));
}
}

View File

@ -931,6 +931,15 @@ void GenerateItemPool() {
PlaceItemsForType(RCTYPE_POT, overworldPotsActive, dungeonPotsActive, false);
}
// Shuffle Grass
bool overworldGrassActive = ctx->GetOption(RSK_SHUFFLE_GRASS).Is(RO_SHUFFLE_GRASS_OVERWORLD) ||
ctx->GetOption(RSK_SHUFFLE_GRASS).Is(RO_SHUFFLE_GRASS_ALL);
bool dungeonGrassActive = ctx->GetOption(RSK_SHUFFLE_GRASS).Is(RO_SHUFFLE_GRASS_DUNGEONS) ||
ctx->GetOption(RSK_SHUFFLE_GRASS).Is(RO_SHUFFLE_GRASS_ALL);
if (overworldGrassActive || dungeonGrassActive) {
PlaceItemsForType(RCTYPE_GRASS, overworldGrassActive, dungeonGrassActive, false);
}
auto fsMode = ctx->GetOption(RSK_FISHSANITY);
if (fsMode.IsNot(RO_FISHSANITY_OFF)) {
if (fsMode.Is(RO_FISHSANITY_POND) || fsMode.Is(RO_FISHSANITY_BOTH)) {

View File

@ -11,7 +11,17 @@ void RegionTable_Init_CastleTown() {
Entrance(RR_MARKET_GUARD_HOUSE, {[]{return true;}}),
});
areaTable[RR_THE_MARKET] = Region("Market", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, {}, {
areaTable[RR_THE_MARKET] = Region("Market", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, {
// Locations
LOCATION(RC_MARKET_GRASS_1, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_MARKET_GRASS_2, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_MARKET_GRASS_3, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_MARKET_GRASS_4, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_MARKET_GRASS_5, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_MARKET_GRASS_6, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_MARKET_GRASS_7, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_MARKET_GRASS_8, logic->IsChild && logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_MARKET_ENTRANCE, {[]{return true;}}),
Entrance(RR_TOT_ENTRANCE, {[]{return true;}}),
@ -105,6 +115,8 @@ void RegionTable_Init_CastleTown() {
LOCATION(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)),
LOCATION(RC_HC_MALON_GOSSIP_STONE, true),
LOCATION(RC_HC_ROCK_WALL_GOSSIP_STONE, true),
LOCATION(RC_HC_GRASS_1, logic->CanCutShrubs()),
LOCATION(RC_HC_GRASS_2, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_CASTLE_GROUNDS, {[]{return true;}}),

View File

@ -12,6 +12,54 @@ void RegionTable_Init_HyruleField() {
LOCATION(RC_HF_OCARINA_OF_TIME_ITEM, logic->IsChild && logic->StoneCount() == 3 && logic->HasItem(RG_BRONZE_SCALE)),
LOCATION(RC_SONG_FROM_OCARINA_OF_TIME, logic->IsChild && logic->StoneCount() == 3 && logic->HasItem(RG_BRONZE_SCALE)),
LOCATION(RC_HF_POND_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)),
LOCATION(RC_HF_CENTRAL_GRASS_1, logic->CanCutShrubs()),
LOCATION(RC_HF_CENTRAL_GRASS_2, logic->CanCutShrubs()),
LOCATION(RC_HF_CENTRAL_GRASS_3, logic->CanCutShrubs()),
LOCATION(RC_HF_CENTRAL_GRASS_4, logic->CanCutShrubs()),
LOCATION(RC_HF_CENTRAL_GRASS_5, logic->CanCutShrubs()),
LOCATION(RC_HF_CENTRAL_GRASS_6, logic->CanCutShrubs()),
LOCATION(RC_HF_CENTRAL_GRASS_7, logic->CanCutShrubs()),
LOCATION(RC_HF_CENTRAL_GRASS_8, logic->CanCutShrubs()),
LOCATION(RC_HF_CENTRAL_GRASS_9, logic->CanCutShrubs()),
LOCATION(RC_HF_CENTRAL_GRASS_10, logic->CanCutShrubs()),
LOCATION(RC_HF_CENTRAL_GRASS_11, logic->CanCutShrubs()),
LOCATION(RC_HF_CENTRAL_GRASS_12, logic->CanCutShrubs()),
LOCATION(RC_HF_SOUTH_GRASS_1, logic->CanCutShrubs()),
LOCATION(RC_HF_SOUTH_GRASS_2, logic->CanCutShrubs()),
LOCATION(RC_HF_SOUTH_GRASS_3, logic->CanCutShrubs()),
LOCATION(RC_HF_SOUTH_GRASS_4, logic->CanCutShrubs()),
LOCATION(RC_HF_SOUTH_GRASS_5, logic->CanCutShrubs()),
LOCATION(RC_HF_SOUTH_GRASS_6, logic->CanCutShrubs()),
LOCATION(RC_HF_SOUTH_GRASS_7, logic->CanCutShrubs()),
LOCATION(RC_HF_SOUTH_GRASS_8, logic->CanCutShrubs()),
LOCATION(RC_HF_SOUTH_GRASS_9, logic->CanCutShrubs()),
LOCATION(RC_HF_SOUTH_GRASS_10, logic->CanCutShrubs()),
LOCATION(RC_HF_SOUTH_GRASS_11, logic->CanCutShrubs()),
LOCATION(RC_HF_SOUTH_GRASS_12, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_GATE_GRASS_1, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_GATE_GRASS_2, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_GATE_GRASS_3, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_GATE_GRASS_4, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_GATE_GRASS_5, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_GATE_GRASS_6, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_GATE_GRASS_7, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_GATE_GRASS_8, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_GATE_GRASS_9, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_GATE_GRASS_10, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_GATE_GRASS_11, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_GATE_GRASS_12, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_KF_GRASS_1, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_KF_GRASS_2, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_KF_GRASS_3, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_KF_GRASS_4, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_KF_GRASS_5, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_KF_GRASS_6, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_KF_GRASS_7, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_KF_GRASS_8, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_KF_GRASS_9, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_KF_GRASS_10, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_KF_GRASS_11, logic->CanCutShrubs()),
LOCATION(RC_HF_NEAR_KF_GRASS_12, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_LW_BRIDGE, {[]{return true;}}),
@ -175,6 +223,48 @@ void RegionTable_Init_HyruleField() {
LOCATION(RC_LH_LAB_GOSSIP_STONE, true),
LOCATION(RC_LH_SOUTHEAST_GOSSIP_STONE, true),
LOCATION(RC_LH_SOUTHWEST_GOSSIP_STONE, true),
LOCATION(RC_LH_GRASS_1, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_2, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_3, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_4, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_5, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_6, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_7, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_8, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_9, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_10, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_11, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_12, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_13, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_14, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_15, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_16, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_17, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_18, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_19, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_20, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_21, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_22, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_23, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_24, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_25, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_26, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_27, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_28, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_29, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_30, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_31, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_32, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_33, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_34, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_35, logic->CanCutShrubs()),
LOCATION(RC_LH_GRASS_36, logic->CanCutShrubs()),
LOCATION(RC_LH_CHILD_GRASS_1, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_LH_CHILD_GRASS_2, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_LH_CHILD_GRASS_3, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_LH_CHILD_GRASS_4, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_LH_WARP_PAD_GRASS_1, logic->CanCutShrubs()),
LOCATION(RC_LH_WARP_PAD_GRASS_2, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_HYRULE_FIELD, {[]{return true;}}),

View File

@ -30,6 +30,14 @@ void RegionTable_Init_Kakariko() {
LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()),
LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()),
LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()),
LOCATION(RC_KAK_GRASS_1, logic->CanCutShrubs()),
LOCATION(RC_KAK_GRASS_2, logic->CanCutShrubs()),
LOCATION(RC_KAK_GRASS_3, logic->CanCutShrubs()),
LOCATION(RC_KAK_GRASS_4, logic->CanCutShrubs()),
LOCATION(RC_KAK_GRASS_5, logic->CanCutShrubs()),
LOCATION(RC_KAK_GRASS_6, logic->CanCutShrubs()),
LOCATION(RC_KAK_GRASS_7, logic->CanCutShrubs()),
LOCATION(RC_KAK_GRASS_8, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_HYRULE_FIELD, {[]{return true;}}),
@ -254,6 +262,18 @@ void RegionTable_Init_Kakariko() {
LOCATION(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)),
LOCATION(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)),
LOCATION(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)),
LOCATION(RC_GY_GRASS_1, logic->CanCutShrubs()),
LOCATION(RC_GY_GRASS_2, logic->CanCutShrubs()),
LOCATION(RC_GY_GRASS_3, logic->CanCutShrubs()),
LOCATION(RC_GY_GRASS_4, logic->CanCutShrubs()),
LOCATION(RC_GY_GRASS_5, logic->CanCutShrubs()),
LOCATION(RC_GY_GRASS_6, logic->CanCutShrubs()),
LOCATION(RC_GY_GRASS_7, logic->CanCutShrubs()),
LOCATION(RC_GY_GRASS_8, logic->CanCutShrubs()),
LOCATION(RC_GY_GRASS_9, logic->CanCutShrubs()),
LOCATION(RC_GY_GRASS_10, logic->CanCutShrubs()),
LOCATION(RC_GY_GRASS_11, logic->CanCutShrubs()),
LOCATION(RC_GY_GRASS_12, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_GRAVEYARD_SHIELD_GRAVE, {[]{return logic->IsAdult || logic->AtNight;}}),

View File

@ -38,6 +38,39 @@ void RegionTable_Init_LostWoods() {
LOCATION(RC_KF_SARIAS_ROOF_WEST_HEART, logic->IsChild),
LOCATION(RC_KF_SARIAS_ROOF_EAST_HEART, logic->IsChild),
LOCATION(RC_KF_SARIAS_ROOF_NORTH_HEART, logic->IsChild),
LOCATION(RC_KF_CHILD_GRASS_1, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_KF_CHILD_GRASS_2, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_KF_CHILD_GRASS_3, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_KF_CHILD_GRASS_4, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_KF_CHILD_GRASS_5, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_KF_CHILD_GRASS_6, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_KF_CHILD_GRASS_7, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_KF_CHILD_GRASS_8, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_KF_CHILD_GRASS_9, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_KF_CHILD_GRASS_10, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_KF_CHILD_GRASS_11, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_KF_CHILD_GRASS_12, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_KF_CHILD_GRASS_MAZE_1, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_KF_CHILD_GRASS_MAZE_2, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_KF_CHILD_GRASS_MAZE_3, logic->IsChild && logic->CanCutShrubs()),
LOCATION(RC_KF_ADULT_GRASS_1, logic->IsAdult && logic->CanCutShrubs()),
LOCATION(RC_KF_ADULT_GRASS_2, logic->IsAdult && logic->CanCutShrubs()),
LOCATION(RC_KF_ADULT_GRASS_3, logic->IsAdult && logic->CanCutShrubs()),
LOCATION(RC_KF_ADULT_GRASS_4, logic->IsAdult && logic->CanCutShrubs()),
LOCATION(RC_KF_ADULT_GRASS_5, logic->IsAdult && logic->CanCutShrubs()),
LOCATION(RC_KF_ADULT_GRASS_6, logic->IsAdult && logic->CanCutShrubs()),
LOCATION(RC_KF_ADULT_GRASS_7, logic->IsAdult && logic->CanCutShrubs()),
LOCATION(RC_KF_ADULT_GRASS_8, logic->IsAdult && logic->CanCutShrubs()),
LOCATION(RC_KF_ADULT_GRASS_9, logic->IsAdult && logic->CanCutShrubs()),
LOCATION(RC_KF_ADULT_GRASS_10, logic->IsAdult && logic->CanCutShrubs()),
LOCATION(RC_KF_ADULT_GRASS_11, logic->IsAdult && logic->CanCutShrubs()),
LOCATION(RC_KF_ADULT_GRASS_12, logic->IsAdult && logic->CanCutShrubs()),
LOCATION(RC_KF_ADULT_GRASS_13, logic->IsAdult && logic->CanCutShrubs()),
LOCATION(RC_KF_ADULT_GRASS_14, logic->IsAdult && logic->CanCutShrubs()),
LOCATION(RC_KF_ADULT_GRASS_15, logic->IsAdult && logic->CanCutShrubs()),
LOCATION(RC_KF_ADULT_GRASS_16, logic->IsAdult && logic->CanCutShrubs()),
LOCATION(RC_KF_ADULT_GRASS_17, logic->IsAdult && logic->CanCutShrubs()),
LOCATION(RC_KF_ADULT_GRASS_18, logic->IsAdult && logic->CanCutShrubs()),
LOCATION(RC_KF_GOSSIP_STONE, true),
}, {
//Exits
@ -193,6 +226,10 @@ void RegionTable_Init_LostWoods() {
LOCATION(RC_LW_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns()),
LOCATION(RC_LW_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)),
LOCATION(RC_LW_SHORTCUT_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)),
LOCATION(RC_LW_GRASS_1, logic->CanCutShrubs()),
LOCATION(RC_LW_GRASS_2, logic->CanCutShrubs()),
LOCATION(RC_LW_GRASS_3, logic->CanCutShrubs()),
LOCATION(RC_LW_GOSSIP_STONE, true),
}, {
//Exits
@ -217,6 +254,12 @@ void RegionTable_Init_LostWoods() {
LOCATION(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)),
LOCATION(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)),
LOCATION(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)),
LOCATION(RC_LW_GRASS_4, logic->CanCutShrubs()),
LOCATION(RC_LW_GRASS_5, logic->CanCutShrubs()),
LOCATION(RC_LW_GRASS_6, logic->CanCutShrubs()),
LOCATION(RC_LW_GRASS_7, logic->CanCutShrubs()),
LOCATION(RC_LW_GRASS_8, logic->CanCutShrubs()),
LOCATION(RC_LW_GRASS_9, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_LW_FOREST_EXIT, {[]{return true;}}),

View File

@ -6,7 +6,19 @@ using namespace Rando;
void RegionTable_Init_ZorasDomain() {
areaTable[RR_ZR_FRONT] = Region("ZR Front", "Zora River", {RA_ZORAS_RIVER}, DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_ZR_GS_TREE, logic->IsChild && logic->CanAttack()),
LOCATION(RC_ZR_GS_TREE, logic->IsChild && logic->CanAttack()),
LOCATION(RC_ZR_GRASS_1, logic->CanCutShrubs()),
LOCATION(RC_ZR_GRASS_2, logic->CanCutShrubs()),
LOCATION(RC_ZR_GRASS_3, logic->CanCutShrubs()),
LOCATION(RC_ZR_GRASS_4, logic->CanCutShrubs()),
LOCATION(RC_ZR_GRASS_5, logic->CanCutShrubs()),
LOCATION(RC_ZR_GRASS_6, logic->CanCutShrubs()),
LOCATION(RC_ZR_GRASS_7, logic->CanCutShrubs()),
LOCATION(RC_ZR_GRASS_8, logic->CanCutShrubs()),
LOCATION(RC_ZR_GRASS_9, logic->CanCutShrubs()),
LOCATION(RC_ZR_GRASS_10, logic->CanCutShrubs()),
LOCATION(RC_ZR_GRASS_11, logic->CanCutShrubs()),
LOCATION(RC_ZR_GRASS_12, logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_ZORAS_RIVER, {[]{return logic->IsAdult || logic->BlastOrSmash();}}),
@ -47,6 +59,7 @@ void RegionTable_Init_ZorasDomain() {
LOCATION(RC_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, logic->IsAdult && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG))),
LOCATION(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, true),
LOCATION(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, true),
LOCATION(RC_ZR_GRASS_13, logic->IsChild && logic->CanCutShrubs()),
}, {
//Exits
Entrance(RR_ZR_FRONT, {[]{return true;}}),

View File

@ -0,0 +1,95 @@
#include "ShuffleGrass.h"
#include "soh_assets.h"
#include "static_data.h"
extern "C" {
#include "variables.h"
#include "overlays/actors/ovl_En_Kusa/z_en_kusa.h"
#include <objects/gameplay_field_keep/gameplay_field_keep.h>
#include "objects/object_kusa/object_kusa.h"
extern PlayState* gPlayState;
}
extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play);
extern "C" void EnKusa_RandomizerDraw(Actor* thisx, PlayState* play) {
float grassSize = 0.5f;
OPEN_DISPS(play->state.gfxCtx);
Gfx_SetupDL_25Opa(play->state.gfxCtx);
Matrix_Scale(grassSize, grassSize, grassSize, MTXMODE_APPLY);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 100, 255, 0, 255);
gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__),
G_MTX_MODELVIEW | G_MTX_LOAD);
if (thisx->params == -255) {
gSPDisplayList(POLY_OPA_DISP++, (Gfx*)object_kusa_DL_000140);
} else {
gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gFieldBushDL);
}
CLOSE_DISPS(play->state.gfxCtx);
}
uint8_t EnKusa_RandomizerHoldsItem(EnKusa* grassActor, PlayState* play) {
RandomizerCheck rc = grassActor->grassIdentity.randomizerCheck;
//uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon();
//uint8_t potSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_POTS).GetContextOptionIndex();
// Don't pull randomized item if pot isn't randomized or is already checked
if (!IS_RANDO || /*(potSetting == RO_SHUFFLE_POTS_OVERWORLD && isDungeon) ||*/
/*(potSetting == RO_SHUFFLE_POTS_DUNGEONS && !isDungeon) ||*/
Flags_GetRandomizerInf(grassActor->grassIdentity.randomizerInf) ||
grassActor->grassIdentity.randomizerCheck == RC_UNKNOWN_CHECK) {
return false;
} else {
return true;
}
}
void EnKusa_RandomizerSpawnCollectible(EnKusa* grassActor, PlayState* play) {
EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &grassActor->actor.world.pos, ITEM00_SOH_DUMMY);
item00->randoInf = grassActor->grassIdentity.randomizerInf;
item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(grassActor->grassIdentity.randomizerCheck, true, GI_NONE);
item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem;
item00->actor.velocity.y = 8.0f;
item00->actor.speedXZ = 2.0f;
item00->actor.world.rot.y = Rand_CenteredFloat(65536.0f);
}
void EnKusa_RandomizerInit(void* actorRef) {
Actor* actor = static_cast<Actor*>(actorRef);
if (actor->id != ACTOR_EN_KUSA) return;
EnKusa* grassActor = static_cast<EnKusa*>(actorRef);
grassActor->grassIdentity = OTRGlobals::Instance->gRandomizer->IdentifyGrass(gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z);
}
void ShuffleGrass_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs) {
va_list args;
va_copy(args, originalArgs);
// Draw custom model for grass to indicate it holding a randomized item.
if (id == VB_GRASS_SETUP_DRAW) {
EnKusa* grassActor = va_arg(args, EnKusa*);
if (EnKusa_RandomizerHoldsItem(grassActor, gPlayState)) {
grassActor->actor.draw = (ActorFunc)EnKusa_RandomizerDraw;
*should = false;
}
}
// Do not spawn vanilla item from grass, instead spawn the randomized item.
if (id == VB_GRASS_DROP_ITEM) {
EnKusa* grassActor = va_arg(args, EnKusa*);
if (EnKusa_RandomizerHoldsItem(grassActor, gPlayState)) {
EnKusa_RandomizerSpawnCollectible(grassActor, gPlayState);
*should = false;
}
}
va_end(args);
}

View File

@ -0,0 +1,17 @@
#ifndef SHUFFLEGRASS_H
#define SHUFFLEGRASS_H
#include <z64.h>
#include <soh/OTRGlobals.h>
#ifdef __cplusplus
extern "C" {
#endif
void EnKusa_RandomizerInit(void* actorRef);
#ifdef __cplusplus
};
#endif
void ShuffleGrass_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs);
#endif //SHUFFLEGRASS_H

View File

@ -144,6 +144,11 @@ void Context::GenerateLocationPool() {
AddLocations(StaticData::GetOverworldPotLocations());
}
if (mSettings->GetOption(RSK_SHUFFLE_GRASS).Is(RO_SHUFFLE_GRASS_OVERWORLD) ||
mSettings->GetOption(RSK_SHUFFLE_GRASS).Is(RO_SHUFFLE_GRASS_ALL)) {
AddLocations(StaticData::GetOverworldGrassLocations());
}
AddLocations(StaticData::GetAllDungeonLocations());
}

View File

@ -11,12 +11,14 @@ DungeonInfo::DungeonInfo(std::string name_, const RandomizerHintTextKey hintKey_
const RandomizerSettingKey mqSetting_,
std::vector<RandomizerCheck> vanillaLocations_, std::vector<RandomizerCheck> mqLocations_,
std::vector<RandomizerCheck> vanillaPots_, std::vector<RandomizerCheck> mqPots_,
std::vector<RandomizerCheck> vanillaGrass_, std::vector<RandomizerCheck> mqGrass_,
std::vector<RandomizerCheck> sharedLocations_, std::vector<RandomizerCheck> bossRoomLocations_)
: name(std::move(name_)), hintKey(hintKey_), map(map_), compass(compass_), smallKey(smallKey_), keyRing(keyRing_),
bossKey(bossKey_), area(area_), vanillaKeyCount(vanillaKeyCount_), mqKeyCount(mqKeyCount_),
mqSetting(mqSetting_),
vanillaLocations(std::move(vanillaLocations_)), mqLocations(std::move(mqLocations_)),
vanillaPots(std::move(vanillaPots_)), mqPots(std::move(mqPots_)),
vanillaGrass(std::move(vanillaGrass_)), mqGrass(std::move(mqGrass_)),
sharedLocations(std::move(sharedLocations_)), bossRoomLocations(std::move(bossRoomLocations_)) {
}
DungeonInfo::DungeonInfo() : hintKey(RHT_NONE), map(RG_NONE), compass(RG_NONE), smallKey(RG_NONE), keyRing(RG_NONE),
@ -212,7 +214,18 @@ Dungeons::Dungeons() {
RC_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART,
RC_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART,
},
{}, {}, {},
{}, {},
{
// Vanilla Grass
RC_DEKU_TREE_LOBBY_GRASS_1,
RC_DEKU_TREE_LOBBY_GRASS_2,
RC_DEKU_TREE_LOBBY_GRASS_3,
RC_DEKU_TREE_LOBBY_GRASS_4,
},
{
// MQ Grass
},
{},
{
// Boss Room Locations
RC_DEKU_TREE_QUEEN_GOHMA_HEART,
@ -329,6 +342,12 @@ Dungeons::Dungeons() {
RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1,
RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2,
},
{
// Vanilla Grass
},
{
// MQ Grass
},
{},
{
// Boss Room Locations
@ -416,6 +435,10 @@ Dungeons::Dungeons() {
RC_JABU_JABUS_BELLY_BARINADE_POT_6,
},
{},
{
// MQ Grass
},
{},
{
// Boss Room Locations
RC_JABU_JABUS_BELLY_BARINADE_HEART,
@ -521,7 +544,7 @@ Dungeons::Dungeons() {
RC_FOREST_TEMPLE_MQ_BASEMENT_POT_3,
RC_FOREST_TEMPLE_MQ_BASEMENT_POT_4,
},
{},
{}, {}, {},
{
// Boss Room Locations
RC_FOREST_TEMPLE_PHANTOM_GANON_HEART,
@ -635,7 +658,7 @@ Dungeons::Dungeons() {
RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7,
RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8,
},
{},
{}, {}, {},
{
// Boos Room Locations
RC_FIRE_TEMPLE_VOLVAGIA_HEART,
@ -743,7 +766,7 @@ Dungeons::Dungeons() {
RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4,
RC_WATER_TEMPLE_MQ_BOSS_KEY_POT,
},
{},
{}, {}, {},
{
// Boss Room Locations
RC_WATER_TEMPLE_MORPHA_HEART,
@ -863,6 +886,7 @@ Dungeons::Dungeons() {
RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1,
RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2,
},
{}, {},
{
// Shared Locations
RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST,
@ -993,7 +1017,7 @@ Dungeons::Dungeons() {
RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1,
RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2,
},
{},
{}, {}, {},
{
// Boss Room Locations
RC_SHADOW_TEMPLE_BONGO_BONGO_HEART,
@ -1082,6 +1106,12 @@ Dungeons::Dungeons() {
RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2,
RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3,
},
{
// Vanilla Grass
},
{
// MQ Grass
},
{}, {});
dungeonList[ICE_CAVERN] = DungeonInfo("Ice Cavern", RHT_ICE_CAVERN, RG_ICE_CAVERN_MAP, RG_ICE_CAVERN_COMPASS,
RG_NONE, RG_NONE, RG_NONE, RA_ICE_CAVERN, 0, 0, RSK_MQ_ICE_CAVERN,
@ -1138,6 +1168,7 @@ Dungeons::Dungeons() {
RC_ICE_CAVERN_MQ_COMPASS_POT_1,
RC_ICE_CAVERN_MQ_COMPASS_POT_2,
},
{}, {},
{
// Shared Locations
RC_SHEIK_IN_ICE_CAVERN,
@ -1201,7 +1232,7 @@ Dungeons::Dungeons() {
RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2,
RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1,
RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2,
}, {}, {});
}, {}, {}, {}, {});
dungeonList[GANONS_CASTLE] =
DungeonInfo("Ganon's Castle", RHT_GANONS_CASTLE, RG_NONE, RG_NONE, RG_GANONS_CASTLE_SMALL_KEY,
RG_GANONS_CASTLE_KEY_RING, RG_GANONS_CASTLE_BOSS_KEY, RA_GANONS_CASTLE, 2, 3, RSK_MQ_GANONS_CASTLE,
@ -1347,6 +1378,7 @@ Dungeons::Dungeons() {
RC_GANONS_CASTLE_GANONS_TOWER_POT_17,
RC_GANONS_CASTLE_GANONS_TOWER_POT_18,
},
{}, {},
{
// Shared Locations
RC_GANONS_TOWER_BOSS_KEY_CHEST,

View File

@ -15,6 +15,7 @@ class DungeonInfo {
uint8_t vanillaKeyCount_, uint8_t mqKeyCount_, RandomizerSettingKey mqSetting_,
std::vector<RandomizerCheck> vanillaLocations_, std::vector<RandomizerCheck> mqLocations_,
std::vector<RandomizerCheck> vanillaPots_, std::vector<RandomizerCheck> mqPots_,
std::vector<RandomizerCheck> vanillaGrass_, std::vector<RandomizerCheck> mqGrass_,
std::vector<RandomizerCheck> sharedLocations_,
std::vector<RandomizerCheck> bossRoomLocations_);
DungeonInfo();
@ -64,6 +65,8 @@ class DungeonInfo {
std::vector<RandomizerCheck> mqLocations;
std::vector<RandomizerCheck> vanillaPots;
std::vector<RandomizerCheck> mqPots;
std::vector<RandomizerCheck> vanillaGrass;
std::vector<RandomizerCheck> mqGrass;
std::vector<RandomizerCheck> sharedLocations;
std::vector<RandomizerCheck> bossRoomLocations;
};

View File

@ -16,6 +16,7 @@
#include "soh/Notification/Notification.h"
#include "soh/SaveManager.h"
#include "soh/Enhancements/randomizer/ShuffleFairies.h"
#include "soh/Enhancements/randomizer/ShuffleGrass.h"
extern "C" {
#include "macros.h"
@ -2361,6 +2362,9 @@ void RandomizerRegisterHooks() {
static uint32_t shuffleFreestandingOnVanillaBehaviorHook = 0;
static uint32_t shuffleGrassOnActorInitHook = 0;
static uint32_t shuffleGrassOnVanillaBehaviorHook = 0;
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnLoadGame>([](int32_t fileNum) {
randomizerQueuedChecks = std::queue<RandomizerCheck>();
randomizerQueuedCheck = RC_UNKNOWN_CHECK;
@ -2394,6 +2398,9 @@ void RandomizerRegisterHooks() {
GameInteractor::Instance->UnregisterGameHook<GameInteractor::OnActorInit>(shuffleFreestandingOnVanillaBehaviorHook);
GameInteractor::Instance->UnregisterGameHook<GameInteractor::OnActorInit>(shuffleGrassOnActorInitHook);
GameInteractor::Instance->UnregisterGameHook<GameInteractor::OnVanillaBehavior>(shuffleGrassOnVanillaBehaviorHook);
onFlagSetHook = 0;
onSceneFlagSetHook = 0;
onPlayerUpdateForRCQueueHook = 0;
@ -2422,6 +2429,9 @@ void RandomizerRegisterHooks() {
shuffleFreestandingOnVanillaBehaviorHook = 0;
shuffleGrassOnActorInitHook = 0;
shuffleGrassOnVanillaBehaviorHook = 0;
ShuffleFairies_UnregisterHooks();
if (!IS_RANDO) return;
@ -2474,5 +2484,10 @@ void RandomizerRegisterHooks() {
if (RAND_GET_OPTION(RSK_SHUFFLE_FAIRIES)) {
ShuffleFairies_RegisterHooks();
}
if (RAND_GET_OPTION(RSK_SHUFFLE_GRASS)) {
shuffleGrassOnActorInitHook = GameInteractor::Instance->RegisterGameHook<GameInteractor::OnActorInit>(EnKusa_RandomizerInit);
shuffleGrassOnVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook<GameInteractor::OnVanillaBehavior>(ShuffleGrass_OnVanillaBehaviorHandler);
}
});
}

View File

@ -388,3 +388,10 @@ Rando::Location Rando::Location::Fairy(RandomizerCheck rc, RandomizerCheckQuest
RandomizerHintTextKey hintKey, SpoilerCollectionCheck collectionCheck) {
return {rc, quest_, RCTYPE_FAIRY, area_, ACTOR_EN_ELF, scene_, actorParams_, std::move(shortName_), std::move(spoilerName_), hintKey, RG_NONE, false, collectionCheck};
}
Rando::Location Rando::Location::Grass(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_,
SceneID scene_, int32_t actorParams_, std::string&& shortName_,
std::string&& spoilerName_, RandomizerHintTextKey hintKey,
RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) {
return { rc, quest_, RCTYPE_GRASS, area_, ACTOR_EN_KUSA, scene_, actorParams_, std::move(shortName_), std::move(spoilerName_), hintKey, vanillaItem, false, collectionCheck };
}

View File

@ -175,6 +175,11 @@ class Location {
RandomizerHintTextKey hintKey, RandomizerGet vanillaItem,
SpoilerCollectionCheck collectionCheck);
static Location Grass(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_,
int32_t actorParams_, std::string&& shortName_, std::string&& spoilerName_,
RandomizerHintTextKey hintKey, RandomizerGet vanillaItem,
SpoilerCollectionCheck collectionCheck);
static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, std::string&& shortName_,
std::string&& spoilerName_);

View File

@ -43,6 +43,16 @@ std::vector<RandomizerCheck> Rando::StaticData::GetOverworldPotLocations() {
return overworldPotLocations;
}
std::vector<RandomizerCheck> Rando::StaticData::GetOverworldGrassLocations() {
std::vector<RandomizerCheck> overworldGrassLocations = {};
for (Location& location : locationTable) {
if (location.GetRCType() == RCTYPE_GRASS && location.IsOverworld() && location.GetRandomizerCheck() != RC_UNKNOWN_CHECK) {
overworldGrassLocations.push_back(location.GetRandomizerCheck());
}
}
return overworldGrassLocations;
}
std::vector<RandomizerCheck> Rando::StaticData::GetStaticHintLocations() {
std::vector<RandomizerCheck> staticHintLocations = {};
for (Location& location : locationTable) {
@ -113,7 +123,8 @@ std::vector<RandomizerCheck> Rando::StaticData::GetOverworldLocations() {
location.GetRandomizerCheck() != RC_UNKNOWN_CHECK &&
location.GetRandomizerCheck() != RC_TRIFORCE_COMPLETED && //not really an overworld check
location.GetRCType() != RCTYPE_FISH && // temp fix while locations are properly sorted out
location.GetRCType() != RCTYPE_POT && // Same as fish
location.GetRCType() != RCTYPE_POT && // Same as fish
location.GetRCType() != RCTYPE_GRASS && // Same as fish
location.GetRCType() != RCTYPE_CHEST_GAME && //this is supposed to be excluded
(ctx->GetOption(RSK_SHUFFLE_ADULT_TRADE) || location.GetRCType() != RCTYPE_ADULT_TRADE) && //trade is handled elsewhere in location pool
location.GetRCType() != RCTYPE_STATIC_HINT &&
@ -1053,6 +1064,202 @@ void Rando::StaticData::InitLocationTable() { //
locationTable[RC_ZD_FISH_4] = Location::Fish(RC_ZD_FISH_4, RCQUEST_BOTH, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 3, RAND_INF_ZD_FISH_4, "Fish 4", RHT_ZD_FISH, RG_FISH);
locationTable[RC_ZD_FISH_5] = Location::Fish(RC_ZD_FISH_5, RCQUEST_BOTH, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 4, RAND_INF_ZD_FISH_5, "Fish 5", RHT_ZD_FISH, RG_FISH);
/* +-----------------+
| SHUFFLE GRASS |
+-----------------+ */
// Overworld Grass
// Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Spoiler Name Hint Text Key Vanilla Spoiler Collection Check
locationTable[RC_KF_CHILD_GRASS_1] = Location::Grass(RC_KF_CHILD_GRASS_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(678, 596), "KF Child Grass 1", "KF Child Grass 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_1));
locationTable[RC_KF_CHILD_GRASS_2] = Location::Grass(RC_KF_CHILD_GRASS_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(594, 542), "KF Child Grass 2", "KF Child Grass 2", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_2));
locationTable[RC_KF_CHILD_GRASS_3] = Location::Grass(RC_KF_CHILD_GRASS_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(572, 603), "KF Child Grass 3", "KF Child Grass 3", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_3));
locationTable[RC_KF_CHILD_GRASS_4] = Location::Grass(RC_KF_CHILD_GRASS_4, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(385, 643), "KF Child Grass 4", "KF Child Grass 4", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_4));
locationTable[RC_KF_CHILD_GRASS_5] = Location::Grass(RC_KF_CHILD_GRASS_5, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-498, 696), "KF Child/Adult Grass 5", "KF Child/Adult Grass 5", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_5));
locationTable[RC_KF_CHILD_GRASS_6] = Location::Grass(RC_KF_CHILD_GRASS_6, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-523, 771), "KF Child/Adult Grass 6", "KF Child/Adult Grass 6", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_6));
locationTable[RC_KF_CHILD_GRASS_7] = Location::Grass(RC_KF_CHILD_GRASS_7, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-612, 737), "KF Child Grass 7", "KF Child Grass 7", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_7));
locationTable[RC_KF_CHILD_GRASS_8] = Location::Grass(RC_KF_CHILD_GRASS_8, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-671, 671), "KF Child Grass 8", "KF Child Grass 8", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_8));
locationTable[RC_KF_CHILD_GRASS_9] = Location::Grass(RC_KF_CHILD_GRASS_9, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-748, 632), "KF Child Grass 9", "KF Child Grass 9", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_9));
locationTable[RC_KF_CHILD_GRASS_10] = Location::Grass(RC_KF_CHILD_GRASS_10, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-757, 708), "KF Child Grass 10", "KF Child Grass 10", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_10));
locationTable[RC_KF_CHILD_GRASS_11] = Location::Grass(RC_KF_CHILD_GRASS_11, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-823, 666), "KF Child Grass 11", "KF Child Grass 11", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_11));
locationTable[RC_KF_CHILD_GRASS_12] = Location::Grass(RC_KF_CHILD_GRASS_12, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-835, 605), "KF Child Grass 12", "KF Child Grass 12", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_12));
locationTable[RC_KF_CHILD_GRASS_MAZE_1] = Location::Grass(RC_KF_CHILD_GRASS_MAZE_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-995, 1531), "KF Child Grass Maze 1", "KF Child Grass Maze 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_MAZE_1));
locationTable[RC_KF_CHILD_GRASS_MAZE_2] = Location::Grass(RC_KF_CHILD_GRASS_MAZE_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-701, 1882), "KF Child Grass Maze 2", "KF Child Grass Maze 2", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_MAZE_2));
locationTable[RC_KF_CHILD_GRASS_MAZE_3] = Location::Grass(RC_KF_CHILD_GRASS_MAZE_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-295, 2297), "KF Child Grass Maze 3", "KF Child Grass Maze 3", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_CHILD_GRASS_MAZE_3));
locationTable[RC_KF_ADULT_GRASS_1] = Location::Grass(RC_KF_ADULT_GRASS_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(839, 685), "KF Adult Grass 1", "KF Adult Grass 1", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_1));
locationTable[RC_KF_ADULT_GRASS_2] = Location::Grass(RC_KF_ADULT_GRASS_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(809, 722), "KF Adult Grass 2", "KF Adult Grass 2", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_2));
locationTable[RC_KF_ADULT_GRASS_3] = Location::Grass(RC_KF_ADULT_GRASS_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(760, 714), "KF Adult Grass 3", "KF Adult Grass 3", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_3));
locationTable[RC_KF_ADULT_GRASS_4] = Location::Grass(RC_KF_ADULT_GRASS_4, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(725, 679), "KF Adult Grass 4", "KF Adult Grass 4", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_4));
locationTable[RC_KF_ADULT_GRASS_5] = Location::Grass(RC_KF_ADULT_GRASS_5, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(725, 606), "KF Adult Grass 5", "KF Adult Grass 5", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_5));
locationTable[RC_KF_ADULT_GRASS_6] = Location::Grass(RC_KF_ADULT_GRASS_6, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(797, 563), "KF Adult Grass 6", "KF Adult Grass 6", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_6));
locationTable[RC_KF_ADULT_GRASS_7] = Location::Grass(RC_KF_ADULT_GRASS_7, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(868, 606), "KF Adult Grass 7", "KF Adult Grass 7", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_7));
locationTable[RC_KF_ADULT_GRASS_8] = Location::Grass(RC_KF_ADULT_GRASS_8, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(797, 663), "KF Adult Grass 8", "KF Adult Grass 8", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_8));
locationTable[RC_KF_ADULT_GRASS_9] = Location::Grass(RC_KF_ADULT_GRASS_9, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(757, 649), "KF Adult Grass 9", "KF Adult Grass 9", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_9));
locationTable[RC_KF_ADULT_GRASS_10] = Location::Grass(RC_KF_ADULT_GRASS_10, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(773, 610), "KF Adult Grass 10", "KF Adult Grass 10", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_10));
locationTable[RC_KF_ADULT_GRASS_11] = Location::Grass(RC_KF_ADULT_GRASS_11, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(815, 607), "KF Adult Grass 11", "KF Adult Grass 11", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_11));
locationTable[RC_KF_ADULT_GRASS_12] = Location::Grass(RC_KF_ADULT_GRASS_12, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(836, 636), "KF Adult Grass 12", "KF Adult Grass 12", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_12));
locationTable[RC_KF_ADULT_GRASS_13] = Location::Grass(RC_KF_ADULT_GRASS_13, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-772, 654), "KF Adult Grass 13", "KF Adult Grass 13", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_13));
locationTable[RC_KF_ADULT_GRASS_14] = Location::Grass(RC_KF_ADULT_GRASS_14, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-785, 611), "KF Adult Grass 14", "KF Adult Grass 14", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_14));
locationTable[RC_KF_ADULT_GRASS_15] = Location::Grass(RC_KF_ADULT_GRASS_15, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-805, 691), "KF Adult Grass 15", "KF Adult Grass 15", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_15));
locationTable[RC_KF_ADULT_GRASS_16] = Location::Grass(RC_KF_ADULT_GRASS_16, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-822, 644), "KF Adult Grass 16", "KF Adult Grass 16", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_16));
locationTable[RC_KF_ADULT_GRASS_17] = Location::Grass(RC_KF_ADULT_GRASS_17, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-842, 601), "KF Adult Grass 17", "KF Adult Grass 17", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_17));
locationTable[RC_KF_ADULT_GRASS_18] = Location::Grass(RC_KF_ADULT_GRASS_18, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-867, 674), "KF Adult Grass 18", "KF Adult Grass 18", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_18));
//locationTable[RC_KF_ADULT_GRASS_19] = Location::Grass(RC_KF_ADULT_GRASS_19, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-498, 696), "KF Adult Grass 19", "KF Adult Grass 19", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_19));
//locationTable[RC_KF_ADULT_GRASS_20] = Location::Grass(RC_KF_ADULT_GRASS_20, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-523, 771), "KF Adult Grass 20", "KF Adult Grass 29", RHT_KF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_ADULT_GRASS_20));
locationTable[RC_LW_GRASS_1] = Location::Grass(RC_LW_GRASS_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(676, -651), "LW Grass 1", "LW Grass 1", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_1));
locationTable[RC_LW_GRASS_2] = Location::Grass(RC_LW_GRASS_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(633, -676), "LW Grass 2", "LW Grass 2", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_2));
locationTable[RC_LW_GRASS_3] = Location::Grass(RC_LW_GRASS_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(645, -638), "LW Grass 3", "LW Grass 3", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_3));
locationTable[RC_LW_GRASS_4] = Location::Grass(RC_LW_GRASS_4, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1476, -2251), "LW Grass 4", "LW Grass 4", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_4));
locationTable[RC_LW_GRASS_5] = Location::Grass(RC_LW_GRASS_5, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1433, -2276), "LW Grass 5", "LW Grass 5", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_5));
locationTable[RC_LW_GRASS_6] = Location::Grass(RC_LW_GRASS_6, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(1445, -2238), "LW Grass 6", "LW Grass 6", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_6));
locationTable[RC_LW_GRASS_7] = Location::Grass(RC_LW_GRASS_7, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(926, -2232), "LW Grass 7", "LW Grass 7", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_7));
locationTable[RC_LW_GRASS_8] = Location::Grass(RC_LW_GRASS_8, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(965, -2241), "LW Grass 8", "LW Grass 8", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_8));
locationTable[RC_LW_GRASS_9] = Location::Grass(RC_LW_GRASS_9, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(952, -2275), "LW Grass 9", "LW Grass 9", RHT_LW_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_GRASS_9));
locationTable[RC_MARKET_GRASS_1] = Location::Grass(RC_MARKET_GRASS_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-106, 277), "Market Grass 1", "Market Grass 1", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_1));
locationTable[RC_MARKET_GRASS_2] = Location::Grass(RC_MARKET_GRASS_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-131, 225), "Market Grass 2", "Market Grass 2", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_2));
locationTable[RC_MARKET_GRASS_3] = Location::Grass(RC_MARKET_GRASS_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(504, -546), "Market Grass 3", "Market Grass 3", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_3));
locationTable[RC_MARKET_GRASS_4] = Location::Grass(RC_MARKET_GRASS_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(465, -548), "Market Grass 4", "Market Grass 4", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_4));
locationTable[RC_MARKET_GRASS_5] = Location::Grass(RC_MARKET_GRASS_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(432, -548), "Market Grass 5", "Market Grass 5", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_5));
locationTable[RC_MARKET_GRASS_6] = Location::Grass(RC_MARKET_GRASS_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(73, -428), "Market Grass 6", "Market Grass 6", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_6));
locationTable[RC_MARKET_GRASS_7] = Location::Grass(RC_MARKET_GRASS_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(75, -310), "Market Grass 7", "Market Grass 7", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_7));
locationTable[RC_MARKET_GRASS_8] = Location::Grass(RC_MARKET_GRASS_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(76, -190), "Market Grass 8", "Market Grass 8", RHT_MARKET_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MARKET_GRASS_8));
locationTable[RC_HC_GRASS_1] = Location::Grass(RC_HC_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(1035, 882), "Hyrule Castle Grass 1", "Hyrule Castle Grass 1", RHT_HC_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_GRASS_1));
locationTable[RC_HC_GRASS_2] = Location::Grass(RC_HC_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(975, 919), "Hyrule Castle Grass 2", "Hyrule Castle Grass 2", RHT_HC_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_GRASS_2));
locationTable[RC_KAK_GRASS_1] = Location::Grass(RC_KAK_GRASS_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1116, 1581), "Kakariko Grass 1", "Kakariko Grass 1", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_1));
locationTable[RC_KAK_GRASS_2] = Location::Grass(RC_KAK_GRASS_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1103, 1532), "Kakariko Grass 2", "Kakariko Grass 2", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_2));
locationTable[RC_KAK_GRASS_3] = Location::Grass(RC_KAK_GRASS_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1072, 1592), "Kakariko Grass 3", "Kakariko Grass 3", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_3));
locationTable[RC_KAK_GRASS_4] = Location::Grass(RC_KAK_GRASS_4, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-800, 521), "Kakariko Grass 4", "Kakariko Grass 4", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_4));
locationTable[RC_KAK_GRASS_5] = Location::Grass(RC_KAK_GRASS_5, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-826, 585), "Kakariko Grass 5", "Kakariko Grass 5", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_5));
locationTable[RC_KAK_GRASS_6] = Location::Grass(RC_KAK_GRASS_6, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-827, 465), "Kakariko Grass 6", "Kakariko Grass 6", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_6));
locationTable[RC_KAK_GRASS_7] = Location::Grass(RC_KAK_GRASS_7, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-883, 582), "Kakariko Grass 7", "Kakariko Grass 7", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_7));
locationTable[RC_KAK_GRASS_8] = Location::Grass(RC_KAK_GRASS_8, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-887, 467), "Kakariko Grass 8", "Kakariko Grass 8", RHT_KAK_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_GRASS_8));
locationTable[RC_GY_GRASS_1] = Location::Grass(RC_GY_GRASS_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1059, 732), "Graveyard Grass 1", "Graveyard Grass 1", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_1));
locationTable[RC_GY_GRASS_2] = Location::Grass(RC_GY_GRASS_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1089, 769), "Graveyard Grass 2", "Graveyard Grass 2", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_2));
locationTable[RC_GY_GRASS_3] = Location::Grass(RC_GY_GRASS_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1138, 761), "Graveyard Grass 3", "Graveyard Grass 3", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_3));
locationTable[RC_GY_GRASS_4] = Location::Grass(RC_GY_GRASS_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1173, 726), "Graveyard Grass 4", "Graveyard Grass 4", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_4));
locationTable[RC_GY_GRASS_5] = Location::Grass(RC_GY_GRASS_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1173, 653), "Graveyard Grass 5", "Graveyard Grass 5", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_5));
locationTable[RC_GY_GRASS_6] = Location::Grass(RC_GY_GRASS_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1102, 610), "Graveyard Grass 6", "Graveyard Grass 6", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_6));
locationTable[RC_GY_GRASS_7] = Location::Grass(RC_GY_GRASS_7, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1030, 653), "Graveyard Grass 7", "Graveyard Grass 7", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_7));
locationTable[RC_GY_GRASS_8] = Location::Grass(RC_GY_GRASS_8, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1102, 710), "Graveyard Grass 8", "Graveyard Grass 8", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_8));
locationTable[RC_GY_GRASS_9] = Location::Grass(RC_GY_GRASS_9, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1141, 696), "Graveyard Grass 9", "Graveyard Grass 9", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_9));
locationTable[RC_GY_GRASS_10] = Location::Grass(RC_GY_GRASS_10, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1125, 657), "Graveyard Grass 10", "Graveyard Grass 10", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_10));
locationTable[RC_GY_GRASS_11] = Location::Grass(RC_GY_GRASS_11, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1083, 654), "Graveyard Grass 11", "Graveyard Grass 11", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_11));
locationTable[RC_GY_GRASS_12] = Location::Grass(RC_GY_GRASS_12, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1062, 683), "Graveyard Grass 12", "Graveyard Grass 12", RHT_GY_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_GRASS_12));
locationTable[RC_LH_GRASS_1] = Location::Grass(RC_LH_GRASS_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1637, 2796), "LH Grass 1", "LH Grass 1", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_1));
locationTable[RC_LH_GRASS_2] = Location::Grass(RC_LH_GRASS_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1667, 2833), "LH Grass 2", "LH Grass 2", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_2));
locationTable[RC_LH_GRASS_3] = Location::Grass(RC_LH_GRASS_3, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1716, 2825), "LH Grass 3", "LH Grass 3", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_3));
locationTable[RC_LH_GRASS_4] = Location::Grass(RC_LH_GRASS_4, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1751, 2790), "LH Grass 4", "LH Grass 4", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_4));
locationTable[RC_LH_GRASS_5] = Location::Grass(RC_LH_GRASS_5, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1751, 2717), "LH Grass 5", "LH Grass 5", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_5));
locationTable[RC_LH_GRASS_6] = Location::Grass(RC_LH_GRASS_6, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1680, 2674), "LH Grass 6", "LH Grass 6", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_6));
locationTable[RC_LH_GRASS_7] = Location::Grass(RC_LH_GRASS_7, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1608, 2717), "LH Grass 7", "LH Grass 7", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_7));
locationTable[RC_LH_GRASS_8] = Location::Grass(RC_LH_GRASS_8, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1680, 2774), "LH Grass 8", "LH Grass 8", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_8));
locationTable[RC_LH_GRASS_9] = Location::Grass(RC_LH_GRASS_9, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1719, 2760), "LH Grass 9", "LH Grass 9", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_9));
locationTable[RC_LH_GRASS_10] = Location::Grass(RC_LH_GRASS_10, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1703, 2721), "LH Grass 10", "LH Grass 10", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_10));
locationTable[RC_LH_GRASS_11] = Location::Grass(RC_LH_GRASS_11, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1661, 2718), "LH Grass 11", "LH Grass 11", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_11));
locationTable[RC_LH_GRASS_12] = Location::Grass(RC_LH_GRASS_12, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1640, 2747), "LH Grass 12", "LH Grass 12", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_12));
locationTable[RC_LH_GRASS_13] = Location::Grass(RC_LH_GRASS_13, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2028, 2542), "LH Grass 13", "LH Grass 13", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_13));
locationTable[RC_LH_GRASS_14] = Location::Grass(RC_LH_GRASS_14, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2058, 2579), "LH Grass 14", "LH Grass 14", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_14));
locationTable[RC_LH_GRASS_15] = Location::Grass(RC_LH_GRASS_15, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2107, 2571), "LH Grass 15", "LH Grass 15", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_15));
locationTable[RC_LH_GRASS_16] = Location::Grass(RC_LH_GRASS_16, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2142, 2536), "LH Grass 16", "LH Grass 16", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_16));
locationTable[RC_LH_GRASS_17] = Location::Grass(RC_LH_GRASS_17, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2142, 2463), "LH Grass 17", "LH Grass 17", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_17));
locationTable[RC_LH_GRASS_18] = Location::Grass(RC_LH_GRASS_18, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2071, 2420), "LH Grass 18", "LH Grass 18", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_18));
locationTable[RC_LH_GRASS_19] = Location::Grass(RC_LH_GRASS_19, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-1999, 2463), "LH Grass 19", "LH Grass 19", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_19));
locationTable[RC_LH_GRASS_20] = Location::Grass(RC_LH_GRASS_20, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2071, 2520), "LH Grass 20", "LH Grass 20", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_20));
locationTable[RC_LH_GRASS_21] = Location::Grass(RC_LH_GRASS_21, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2110, 2506), "LH Grass 21", "LH Grass 21", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_21));
locationTable[RC_LH_GRASS_22] = Location::Grass(RC_LH_GRASS_22, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2094, 2467), "LH Grass 22", "LH Grass 22", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_22));
locationTable[RC_LH_GRASS_23] = Location::Grass(RC_LH_GRASS_23, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2052, 2464), "LH Grass 23", "LH Grass 23", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_23));
locationTable[RC_LH_GRASS_24] = Location::Grass(RC_LH_GRASS_24, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2031, 2493), "LH Grass 24", "LH Grass 24", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_24));
locationTable[RC_LH_GRASS_25] = Location::Grass(RC_LH_GRASS_25, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2204, 3050), "LH Grass 25", "LH Grass 25", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_25));
locationTable[RC_LH_GRASS_26] = Location::Grass(RC_LH_GRASS_26, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2234, 3087), "LH Grass 26", "LH Grass 26", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_26));
locationTable[RC_LH_GRASS_27] = Location::Grass(RC_LH_GRASS_27, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2283, 3079), "LH Grass 27", "LH Grass 27", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_27));
locationTable[RC_LH_GRASS_28] = Location::Grass(RC_LH_GRASS_28, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2318, 3044), "LH Grass 28", "LH Grass 28", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_28));
locationTable[RC_LH_GRASS_29] = Location::Grass(RC_LH_GRASS_29, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2318, 2971), "LH Grass 29", "LH Grass 29", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_29));
locationTable[RC_LH_GRASS_30] = Location::Grass(RC_LH_GRASS_30, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2247, 2928), "LH Grass 30", "LH Grass 30", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_30));
locationTable[RC_LH_GRASS_31] = Location::Grass(RC_LH_GRASS_31, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2175, 2971), "LH Grass 31", "LH Grass 31", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_31));
locationTable[RC_LH_GRASS_32] = Location::Grass(RC_LH_GRASS_32, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2247, 3028), "LH Grass 32", "LH Grass 32", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_32));
locationTable[RC_LH_GRASS_33] = Location::Grass(RC_LH_GRASS_33, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2286, 3014), "LH Grass 33", "LH Grass 33", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_33));
locationTable[RC_LH_GRASS_34] = Location::Grass(RC_LH_GRASS_34, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2270, 2975), "LH Grass 34", "LH Grass 34", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_34));
locationTable[RC_LH_GRASS_35] = Location::Grass(RC_LH_GRASS_35, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2228, 2972), "LH Grass 35", "LH Grass 35", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_35));
locationTable[RC_LH_GRASS_36] = Location::Grass(RC_LH_GRASS_36, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-2207, 3001), "LH Grass 36", "LH Grass 36", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_GRASS_36));
locationTable[RC_LH_CHILD_GRASS_1] = Location::Grass(RC_LH_CHILD_GRASS_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(13, 2735), "LH Child Grass 1", "LH Child Grass 1", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_1));
locationTable[RC_LH_CHILD_GRASS_2] = Location::Grass(RC_LH_CHILD_GRASS_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-77, 2891), "LH Child Grass 2", "LH Child Grass 2", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_2));
locationTable[RC_LH_CHILD_GRASS_3] = Location::Grass(RC_LH_CHILD_GRASS_3, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-222, 2888), "LH Child Grass 3", "LH Child Grass 3", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_3));
locationTable[RC_LH_CHILD_GRASS_4] = Location::Grass(RC_LH_CHILD_GRASS_4, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-295, 2973), "LH Child Grass 4", "LH Child Grass 4", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_CHILD_GRASS_4));
locationTable[RC_LH_WARP_PAD_GRASS_1] = Location::Grass(RC_LH_WARP_PAD_GRASS_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-613, 7369), "LH Warp Pad Grass 1", "LH Warp Pad Grass 1", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_WARP_PAD_GRASS_1));
locationTable[RC_LH_WARP_PAD_GRASS_2] = Location::Grass(RC_LH_WARP_PAD_GRASS_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(-662, 7352), "LH Warp Pad Grass 2", "LH Warp Pad Grass 2", RHT_LH_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_WARP_PAD_GRASS_2));
locationTable[RC_HF_NEAR_KF_GRASS_1] = Location::Grass(RC_HF_NEAR_KF_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3186, 7571), "HF Near KF Grass 1", "HF Near KF Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_1));
locationTable[RC_HF_NEAR_KF_GRASS_2] = Location::Grass(RC_HF_NEAR_KF_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3156, 7608), "HF Near KF Grass 2", "HF Near KF Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_2));
locationTable[RC_HF_NEAR_KF_GRASS_3] = Location::Grass(RC_HF_NEAR_KF_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3107, 7600), "HF Near KF Grass 3", "HF Near KF Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_3));
locationTable[RC_HF_NEAR_KF_GRASS_4] = Location::Grass(RC_HF_NEAR_KF_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3072, 7565), "HF Near KF Grass 4", "HF Near KF Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_4));
locationTable[RC_HF_NEAR_KF_GRASS_5] = Location::Grass(RC_HF_NEAR_KF_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3072, 7492), "HF Near KF Grass 5", "HF Near KF Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_5));
locationTable[RC_HF_NEAR_KF_GRASS_6] = Location::Grass(RC_HF_NEAR_KF_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3144, 7449), "HF Near KF Grass 6", "HF Near KF Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_6));
locationTable[RC_HF_NEAR_KF_GRASS_7] = Location::Grass(RC_HF_NEAR_KF_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3215, 7492), "HF Near KF Grass 7", "HF Near KF Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_7));
locationTable[RC_HF_NEAR_KF_GRASS_8] = Location::Grass(RC_HF_NEAR_KF_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3144, 7549), "HF Near KF Grass 8", "HF Near KF Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_8));
locationTable[RC_HF_NEAR_KF_GRASS_9] = Location::Grass(RC_HF_NEAR_KF_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3104, 7535), "HF Near KF Grass 9", "HF Near KF Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_9));
locationTable[RC_HF_NEAR_KF_GRASS_10] = Location::Grass(RC_HF_NEAR_KF_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3120, 7496), "HF Near KF Grass 10", "HF Near KF Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_10));
locationTable[RC_HF_NEAR_KF_GRASS_11] = Location::Grass(RC_HF_NEAR_KF_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3162, 7493), "HF Near KF Grass 11", "HF Near KF Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_11));
locationTable[RC_HF_NEAR_KF_GRASS_12] = Location::Grass(RC_HF_NEAR_KF_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3183, 7522), "HF Near KF Grass 12", "HF Near KF Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KF_GRASS_12));
locationTable[RC_HF_NEAR_GATE_GRASS_1] = Location::Grass(RC_HF_NEAR_GATE_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(950, 3613), "HF Near Gate Grass 1", "HF Near Gate Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_GATE_GRASS_1));
locationTable[RC_HF_NEAR_GATE_GRASS_2] = Location::Grass(RC_HF_NEAR_GATE_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(920, 3650), "HF Near Gate Grass 2", "HF Near Gate Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_GATE_GRASS_2));
locationTable[RC_HF_NEAR_GATE_GRASS_3] = Location::Grass(RC_HF_NEAR_GATE_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(871, 3642), "HF Near Gate Grass 3", "HF Near Gate Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_GATE_GRASS_3));
locationTable[RC_HF_NEAR_GATE_GRASS_4] = Location::Grass(RC_HF_NEAR_GATE_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(836, 3607), "HF Near Gate Grass 4", "HF Near Gate Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_GATE_GRASS_4));
locationTable[RC_HF_NEAR_GATE_GRASS_5] = Location::Grass(RC_HF_NEAR_GATE_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(836, 3534), "HF Near Gate Grass 5", "HF Near Gate Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_GATE_GRASS_5));
locationTable[RC_HF_NEAR_GATE_GRASS_6] = Location::Grass(RC_HF_NEAR_GATE_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(908, 3491), "HF Near Gate Grass 6", "HF Near Gate Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_GATE_GRASS_6));
locationTable[RC_HF_NEAR_GATE_GRASS_7] = Location::Grass(RC_HF_NEAR_GATE_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(979, 3534), "HF Near Gate Grass 7", "HF Near Gate Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_GATE_GRASS_7));
locationTable[RC_HF_NEAR_GATE_GRASS_8] = Location::Grass(RC_HF_NEAR_GATE_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(908, 3591), "HF Near Gate Grass 8", "HF Near Gate Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_GATE_GRASS_8));
locationTable[RC_HF_NEAR_GATE_GRASS_9] = Location::Grass(RC_HF_NEAR_GATE_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(868, 3577), "HF Near Gate Grass 9", "HF Near Gate Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_GATE_GRASS_9));
locationTable[RC_HF_NEAR_GATE_GRASS_10] = Location::Grass(RC_HF_NEAR_GATE_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(884, 3538), "HF Near Gate Grass 10", "HF Near Gate Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_GATE_GRASS_10));
locationTable[RC_HF_NEAR_GATE_GRASS_11] = Location::Grass(RC_HF_NEAR_GATE_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(926, 3535), "HF Near Gate Grass 11", "HF Near Gate Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_GATE_GRASS_11));
locationTable[RC_HF_NEAR_GATE_GRASS_12] = Location::Grass(RC_HF_NEAR_GATE_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(947, 3564), "HF Near Gate Grass 12", "HF Near Gate Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_GATE_GRASS_12));
locationTable[RC_HF_SOUTH_GRASS_1] = Location::Grass(RC_HF_SOUTH_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-483, 11329), "HF South Grass 1", "HF South Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_1));
locationTable[RC_HF_SOUTH_GRASS_2] = Location::Grass(RC_HF_SOUTH_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-518, 11294), "HF South Grass 2", "HF South Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_2));
locationTable[RC_HF_SOUTH_GRASS_3] = Location::Grass(RC_HF_SOUTH_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-518, 11221), "HF South Grass 3", "HF South Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_3));
locationTable[RC_HF_SOUTH_GRASS_4] = Location::Grass(RC_HF_SOUTH_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-447, 11178), "HF South Grass 4", "HF South Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_4));
locationTable[RC_HF_SOUTH_GRASS_5] = Location::Grass(RC_HF_SOUTH_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-375, 11221), "HF South Grass 5", "HF South Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_5));
locationTable[RC_HF_SOUTH_GRASS_6] = Location::Grass(RC_HF_SOUTH_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-447, 11278), "HF South Grass 6", "HF South Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_6));
locationTable[RC_HF_SOUTH_GRASS_7] = Location::Grass(RC_HF_SOUTH_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-486, 11264), "HF South Grass 7", "HF South Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_7));
locationTable[RC_HF_SOUTH_GRASS_8] = Location::Grass(RC_HF_SOUTH_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-470, 11225), "HF South Grass 8", "HF South Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_8));
locationTable[RC_HF_SOUTH_GRASS_9] = Location::Grass(RC_HF_SOUTH_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-428, 11222), "HF South Grass 9", "HF South Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_9));
locationTable[RC_HF_SOUTH_GRASS_10] = Location::Grass(RC_HF_SOUTH_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-407, 11251), "HF South Grass 10", "HF South Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_10));
locationTable[RC_HF_SOUTH_GRASS_11] = Location::Grass(RC_HF_SOUTH_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-404, 11300), "HF South Grass 11", "HF South Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_11));
locationTable[RC_HF_SOUTH_GRASS_12] = Location::Grass(RC_HF_SOUTH_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-434, 11337), "HF South Grass 12", "HF South Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_SOUTH_GRASS_12));
locationTable[RC_HF_CENTRAL_GRASS_1] = Location::Grass(RC_HF_CENTRAL_GRASS_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-948, 9981), "HF Central Grass 1", "HF Central Grass 1", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_1));
locationTable[RC_HF_CENTRAL_GRASS_2] = Location::Grass(RC_HF_CENTRAL_GRASS_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-978, 10018), "HF Central Grass 2", "HF Central Grass 2", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_2));
locationTable[RC_HF_CENTRAL_GRASS_3] = Location::Grass(RC_HF_CENTRAL_GRASS_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1027, 10010), "HF Central Grass 3", "HF Central Grass 3", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_3));
locationTable[RC_HF_CENTRAL_GRASS_4] = Location::Grass(RC_HF_CENTRAL_GRASS_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1062, 9975), "HF Central Grass 4", "HF Central Grass 4", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_4));
locationTable[RC_HF_CENTRAL_GRASS_5] = Location::Grass(RC_HF_CENTRAL_GRASS_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1062, 9902), "HF Central Grass 5", "HF Central Grass 5", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_5));
locationTable[RC_HF_CENTRAL_GRASS_6] = Location::Grass(RC_HF_CENTRAL_GRASS_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-991, 9859), "HF Central Grass 6", "HF Central Grass 6", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_6));
locationTable[RC_HF_CENTRAL_GRASS_7] = Location::Grass(RC_HF_CENTRAL_GRASS_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-919, 9902), "HF Central Grass 7", "HF Central Grass 7", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_7));
locationTable[RC_HF_CENTRAL_GRASS_8] = Location::Grass(RC_HF_CENTRAL_GRASS_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-991, 9959), "HF Central Grass 8", "HF Central Grass 8", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_8));
locationTable[RC_HF_CENTRAL_GRASS_9] = Location::Grass(RC_HF_CENTRAL_GRASS_9, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1030, 9945), "HF Central Grass 9", "HF Central Grass 9", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_9));
locationTable[RC_HF_CENTRAL_GRASS_10] = Location::Grass(RC_HF_CENTRAL_GRASS_10, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1014, 9906), "HF Central Grass 10", "HF Central Grass 10", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_10));
locationTable[RC_HF_CENTRAL_GRASS_11] = Location::Grass(RC_HF_CENTRAL_GRASS_11, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-972, 9903), "HF Central Grass 11", "HF Central Grass 11", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_11));
locationTable[RC_HF_CENTRAL_GRASS_12] = Location::Grass(RC_HF_CENTRAL_GRASS_12, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-951, 9932), "HF Central Grass 12", "HF Central Grass 12", RHT_HF_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CENTRAL_GRASS_12));
locationTable[RC_ZR_GRASS_1] = Location::Grass(RC_ZR_GRASS_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1495, 1022), "ZR Grass 1", "ZR Grass 1", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_1));
locationTable[RC_ZR_GRASS_2] = Location::Grass(RC_ZR_GRASS_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1465, 985), "ZR Grass 2", "ZR Grass 2", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_2));
locationTable[RC_ZR_GRASS_3] = Location::Grass(RC_ZR_GRASS_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1544, 1014), "ZR Grass 3", "ZR Grass 3", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_3));
locationTable[RC_ZR_GRASS_4] = Location::Grass(RC_ZR_GRASS_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1579, 979), "ZR Grass 4", "ZR Grass 4", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_4));
locationTable[RC_ZR_GRASS_5] = Location::Grass(RC_ZR_GRASS_5, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1579, 906), "ZR Grass 5", "ZR Grass 5", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_5));
locationTable[RC_ZR_GRASS_6] = Location::Grass(RC_ZR_GRASS_6, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1508, 863), "ZR Grass 6", "ZR Grass 6", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_6));
locationTable[RC_ZR_GRASS_7] = Location::Grass(RC_ZR_GRASS_7, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1508, 963), "ZR Grass 7", "ZR Grass 7", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_7));
locationTable[RC_ZR_GRASS_8] = Location::Grass(RC_ZR_GRASS_8, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1547, 949), "ZR Grass 8", "ZR Grass 8", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_8));
locationTable[RC_ZR_GRASS_9] = Location::Grass(RC_ZR_GRASS_9, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1531, 910), "ZR Grass 9", "ZR Grass 9", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_9));
locationTable[RC_ZR_GRASS_10] = Location::Grass(RC_ZR_GRASS_10, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1489, 907), "ZR Grass 10", "ZR Grass 10", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_10));
locationTable[RC_ZR_GRASS_11] = Location::Grass(RC_ZR_GRASS_11, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1468, 936), "ZR Grass 11", "ZR Grass 11", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_11));
locationTable[RC_ZR_GRASS_12] = Location::Grass(RC_ZR_GRASS_12, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(-1436, 906), "ZR Grass 12", "ZR Grass 12", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_12));
locationTable[RC_ZR_GRASS_13] = Location::Grass(RC_ZR_GRASS_13, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(231, -1478), "ZR Grass 13", "ZR Grass 13", RHT_ZR_GRASS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_GRASS_13));
// Grotto Grass
//locationTable[RC_KF_STORMS_GROTTO_GRASS_1] = Location::Grass(RC_KF_STORMS_GROTTO_GRASS_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3, -257), "KF Storms Grotto Grass 1", "KF Storms Grotto Grass 1", RHT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_1));
//locationTable[RC_KF_STORMS_GROTTO_GRASS_2] = Location::Grass(RC_KF_STORMS_GROTTO_GRASS_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS(88, -449), "KF Storms Grotto Grass 2", "KF Storms Grotto Grass 2", RHT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_2));
//locationTable[RC_KF_STORMS_GROTTO_GRASS_3] = Location::Grass(RC_KF_STORMS_GROTTO_GRASS_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS(-3, -454), "KF Storms Grotto Grass 3", "KF Storms Grotto Grass 3", RHT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_3));
//locationTable[RC_KF_STORMS_GROTTO_GRASS_4] = Location::Grass(RC_KF_STORMS_GROTTO_GRASS_4, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS(13, -508), "KF Storms Grotto Grass 4", "KF Storms Grotto Grass 4", RHT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_STORMS_GROTTO_GRASS_4));
// Dungeon Grass
locationTable[RC_DEKU_TREE_LOBBY_GRASS_1] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_1, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(391, -156), "Deku Tree Lobby Grass 1", "Deku Tree Lobby Grass 1", RHT_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_1));
locationTable[RC_DEKU_TREE_LOBBY_GRASS_2] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_2, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(355, -233), "Deku Tree Lobby Grass 2", "Deku Tree Lobby Grass 2", RHT_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_2));
locationTable[RC_DEKU_TREE_LOBBY_GRASS_3] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_3, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(307, -289), "Deku Tree Lobby Grass 3", "Deku Tree Lobby Grass 3", RHT_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_3));
locationTable[RC_DEKU_TREE_LOBBY_GRASS_4] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_4, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(80, -414), "Deku Tree Lobby Grass 4", "Deku Tree Lobby Grass 4", RHT_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_4));
locationTable[RC_DEKU_TREE_LOBBY_GRASS_5] = Location::Grass(RC_DEKU_TREE_LOBBY_GRASS_5, RCQUEST_BOTH, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(142, -399), "Deku Tree Lobby Grass 5", "Deku Tree Lobby Grass 5", RHT_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_GRASS_5));
// MQ Dungeon Grass
/* +----------------+
| SHUFFLE POTS |

View File

@ -448,6 +448,7 @@ void Settings::CreateOptionDescriptions() {
"All Items - Shuffle all freestanding rupees & hearts.";
mOptionDescriptions[RSK_SHUFFLE_FAIRIES] =
"Shuffle fairy locations.";
mOptionDescriptions[RSK_SHUFFLE_GRASS] = "Shuffle grass patches.";
mOptionDescriptions[RSK_SHUFFLE_DUNGEON_REWARDS] =
"Shuffles the location of Spiritual Stones and medallions.\n"
"\n"

View File

@ -1010,6 +1010,198 @@ std::map<RandomizerCheck, RandomizerInf> rcToRandomizerInf = {
{ RC_ZD_FISH_4, RAND_INF_ZD_FISH_4 },
{ RC_ZD_FISH_5, RAND_INF_ZD_FISH_5 },
// Grass
{ RC_KF_CHILD_GRASS_1, RAND_INF_KF_CHILD_GRASS_1 },
{ RC_KF_CHILD_GRASS_2, RAND_INF_KF_CHILD_GRASS_2 },
{ RC_KF_CHILD_GRASS_3, RAND_INF_KF_CHILD_GRASS_3 },
{ RC_KF_CHILD_GRASS_4, RAND_INF_KF_CHILD_GRASS_4 },
{ RC_KF_CHILD_GRASS_5, RAND_INF_KF_CHILD_GRASS_5 },
{ RC_KF_CHILD_GRASS_6, RAND_INF_KF_CHILD_GRASS_6 },
{ RC_KF_CHILD_GRASS_7, RAND_INF_KF_CHILD_GRASS_7 },
{ RC_KF_CHILD_GRASS_8, RAND_INF_KF_CHILD_GRASS_8 },
{ RC_KF_CHILD_GRASS_9, RAND_INF_KF_CHILD_GRASS_9 },
{ RC_KF_CHILD_GRASS_10, RAND_INF_KF_CHILD_GRASS_10 },
{ RC_KF_CHILD_GRASS_11, RAND_INF_KF_CHILD_GRASS_11 },
{ RC_KF_CHILD_GRASS_12, RAND_INF_KF_CHILD_GRASS_12 },
{ RC_KF_CHILD_GRASS_MAZE_1, RAND_INF_KF_CHILD_GRASS_MAZE_1 },
{ RC_KF_CHILD_GRASS_MAZE_2, RAND_INF_KF_CHILD_GRASS_MAZE_2 },
{ RC_KF_CHILD_GRASS_MAZE_3, RAND_INF_KF_CHILD_GRASS_MAZE_3 },
{ RC_KF_ADULT_GRASS_1, RAND_INF_KF_ADULT_GRASS_1 },
{ RC_KF_ADULT_GRASS_2, RAND_INF_KF_ADULT_GRASS_2 },
{ RC_KF_ADULT_GRASS_3, RAND_INF_KF_ADULT_GRASS_3 },
{ RC_KF_ADULT_GRASS_4, RAND_INF_KF_ADULT_GRASS_4 },
{ RC_KF_ADULT_GRASS_5, RAND_INF_KF_ADULT_GRASS_5 },
{ RC_KF_ADULT_GRASS_6, RAND_INF_KF_ADULT_GRASS_6 },
{ RC_KF_ADULT_GRASS_7, RAND_INF_KF_ADULT_GRASS_7 },
{ RC_KF_ADULT_GRASS_8, RAND_INF_KF_ADULT_GRASS_8 },
{ RC_KF_ADULT_GRASS_9, RAND_INF_KF_ADULT_GRASS_9 },
{ RC_KF_ADULT_GRASS_10, RAND_INF_KF_ADULT_GRASS_10 },
{ RC_KF_ADULT_GRASS_11, RAND_INF_KF_ADULT_GRASS_11 },
{ RC_KF_ADULT_GRASS_12, RAND_INF_KF_ADULT_GRASS_12 },
{ RC_KF_ADULT_GRASS_13, RAND_INF_KF_ADULT_GRASS_13 },
{ RC_KF_ADULT_GRASS_14, RAND_INF_KF_ADULT_GRASS_14 },
{ RC_KF_ADULT_GRASS_15, RAND_INF_KF_ADULT_GRASS_15 },
{ RC_KF_ADULT_GRASS_16, RAND_INF_KF_ADULT_GRASS_16 },
{ RC_KF_ADULT_GRASS_17, RAND_INF_KF_ADULT_GRASS_17 },
{ RC_KF_ADULT_GRASS_18, RAND_INF_KF_ADULT_GRASS_18 },
//{ RC_KF_ADULT_GRASS_19, RAND_INF_KF_ADULT_GRASS_19 },
//{ RC_KF_ADULT_GRASS_20, RAND_INF_KF_ADULT_GRASS_20 },
{ RC_LW_GRASS_1, RAND_INF_LW_GRASS_1 },
{ RC_LW_GRASS_2, RAND_INF_LW_GRASS_2 },
{ RC_LW_GRASS_3, RAND_INF_LW_GRASS_3 },
{ RC_LW_GRASS_4, RAND_INF_LW_GRASS_4 },
{ RC_LW_GRASS_5, RAND_INF_LW_GRASS_5 },
{ RC_LW_GRASS_6, RAND_INF_LW_GRASS_6 },
{ RC_LW_GRASS_7, RAND_INF_LW_GRASS_7 },
{ RC_LW_GRASS_8, RAND_INF_LW_GRASS_8 },
{ RC_LW_GRASS_9, RAND_INF_LW_GRASS_9 },
{ RC_MARKET_GRASS_1, RAND_INF_MARKET_GRASS_1 },
{ RC_MARKET_GRASS_2, RAND_INF_MARKET_GRASS_2 },
{ RC_MARKET_GRASS_3, RAND_INF_MARKET_GRASS_3 },
{ RC_MARKET_GRASS_4, RAND_INF_MARKET_GRASS_4 },
{ RC_MARKET_GRASS_5, RAND_INF_MARKET_GRASS_5 },
{ RC_MARKET_GRASS_6, RAND_INF_MARKET_GRASS_6 },
{ RC_MARKET_GRASS_7, RAND_INF_MARKET_GRASS_7 },
{ RC_MARKET_GRASS_8, RAND_INF_MARKET_GRASS_8 },
{ RC_HC_GRASS_1, RAND_INF_HC_GRASS_1 },
{ RC_HC_GRASS_2, RAND_INF_HC_GRASS_2 },
{ RC_KAK_GRASS_1, RAND_INF_KAK_GRASS_1 },
{ RC_KAK_GRASS_2, RAND_INF_KAK_GRASS_2 },
{ RC_KAK_GRASS_3, RAND_INF_KAK_GRASS_3 },
{ RC_KAK_GRASS_4, RAND_INF_KAK_GRASS_4 },
{ RC_KAK_GRASS_5, RAND_INF_KAK_GRASS_5 },
{ RC_KAK_GRASS_6, RAND_INF_KAK_GRASS_6 },
{ RC_KAK_GRASS_7, RAND_INF_KAK_GRASS_7 },
{ RC_KAK_GRASS_8, RAND_INF_KAK_GRASS_8 },
{ RC_GY_GRASS_1, RAND_INF_GY_GRASS_1 },
{ RC_GY_GRASS_2, RAND_INF_GY_GRASS_2 },
{ RC_GY_GRASS_3, RAND_INF_GY_GRASS_3 },
{ RC_GY_GRASS_4, RAND_INF_GY_GRASS_4 },
{ RC_GY_GRASS_5, RAND_INF_GY_GRASS_5 },
{ RC_GY_GRASS_6, RAND_INF_GY_GRASS_6 },
{ RC_GY_GRASS_7, RAND_INF_GY_GRASS_7 },
{ RC_GY_GRASS_8, RAND_INF_GY_GRASS_8 },
{ RC_GY_GRASS_9, RAND_INF_GY_GRASS_9 },
{ RC_GY_GRASS_10, RAND_INF_GY_GRASS_10 },
{ RC_GY_GRASS_11, RAND_INF_GY_GRASS_11 },
{ RC_GY_GRASS_12, RAND_INF_GY_GRASS_12 },
{ RC_LH_GRASS_1, RAND_INF_LH_GRASS_1 },
{ RC_LH_GRASS_2, RAND_INF_LH_GRASS_2 },
{ RC_LH_GRASS_3, RAND_INF_LH_GRASS_3 },
{ RC_LH_GRASS_4, RAND_INF_LH_GRASS_4 },
{ RC_LH_GRASS_5, RAND_INF_LH_GRASS_5 },
{ RC_LH_GRASS_6, RAND_INF_LH_GRASS_6 },
{ RC_LH_GRASS_7, RAND_INF_LH_GRASS_7 },
{ RC_LH_GRASS_8, RAND_INF_LH_GRASS_8 },
{ RC_LH_GRASS_9, RAND_INF_LH_GRASS_9 },
{ RC_LH_GRASS_10, RAND_INF_LH_GRASS_10 },
{ RC_LH_GRASS_11, RAND_INF_LH_GRASS_11 },
{ RC_LH_GRASS_12, RAND_INF_LH_GRASS_12 },
{ RC_LH_GRASS_13, RAND_INF_LH_GRASS_13 },
{ RC_LH_GRASS_14, RAND_INF_LH_GRASS_14 },
{ RC_LH_GRASS_15, RAND_INF_LH_GRASS_15 },
{ RC_LH_GRASS_16, RAND_INF_LH_GRASS_16 },
{ RC_LH_GRASS_17, RAND_INF_LH_GRASS_17 },
{ RC_LH_GRASS_18, RAND_INF_LH_GRASS_18 },
{ RC_LH_GRASS_19, RAND_INF_LH_GRASS_19 },
{ RC_LH_GRASS_20, RAND_INF_LH_GRASS_20 },
{ RC_LH_GRASS_21, RAND_INF_LH_GRASS_21 },
{ RC_LH_GRASS_22, RAND_INF_LH_GRASS_22 },
{ RC_LH_GRASS_23, RAND_INF_LH_GRASS_23 },
{ RC_LH_GRASS_24, RAND_INF_LH_GRASS_24 },
{ RC_LH_GRASS_25, RAND_INF_LH_GRASS_25 },
{ RC_LH_GRASS_26, RAND_INF_LH_GRASS_26 },
{ RC_LH_GRASS_27, RAND_INF_LH_GRASS_27 },
{ RC_LH_GRASS_28, RAND_INF_LH_GRASS_28 },
{ RC_LH_GRASS_29, RAND_INF_LH_GRASS_29 },
{ RC_LH_GRASS_30, RAND_INF_LH_GRASS_30 },
{ RC_LH_GRASS_31, RAND_INF_LH_GRASS_31 },
{ RC_LH_GRASS_32, RAND_INF_LH_GRASS_32 },
{ RC_LH_GRASS_33, RAND_INF_LH_GRASS_33 },
{ RC_LH_GRASS_34, RAND_INF_LH_GRASS_34 },
{ RC_LH_GRASS_35, RAND_INF_LH_GRASS_35 },
{ RC_LH_GRASS_36, RAND_INF_LH_GRASS_36 },
{ RC_LH_CHILD_GRASS_1, RAND_INF_LH_CHILD_GRASS_1 },
{ RC_LH_CHILD_GRASS_2, RAND_INF_LH_CHILD_GRASS_2 },
{ RC_LH_CHILD_GRASS_3, RAND_INF_LH_CHILD_GRASS_3 },
{ RC_LH_CHILD_GRASS_4, RAND_INF_LH_CHILD_GRASS_4 },
{ RC_LH_WARP_PAD_GRASS_1, RAND_INF_LH_WARP_PAD_GRASS_1 },
{ RC_LH_WARP_PAD_GRASS_2, RAND_INF_LH_WARP_PAD_GRASS_2 },
{ RC_HF_NEAR_KF_GRASS_1, RAND_INF_HF_NEAR_KF_GRASS_1 },
{ RC_HF_NEAR_KF_GRASS_2, RAND_INF_HF_NEAR_KF_GRASS_2 },
{ RC_HF_NEAR_KF_GRASS_3, RAND_INF_HF_NEAR_KF_GRASS_3 },
{ RC_HF_NEAR_KF_GRASS_4, RAND_INF_HF_NEAR_KF_GRASS_4 },
{ RC_HF_NEAR_KF_GRASS_5, RAND_INF_HF_NEAR_KF_GRASS_5 },
{ RC_HF_NEAR_KF_GRASS_6, RAND_INF_HF_NEAR_KF_GRASS_6 },
{ RC_HF_NEAR_KF_GRASS_7, RAND_INF_HF_NEAR_KF_GRASS_7 },
{ RC_HF_NEAR_KF_GRASS_8, RAND_INF_HF_NEAR_KF_GRASS_8 },
{ RC_HF_NEAR_KF_GRASS_9, RAND_INF_HF_NEAR_KF_GRASS_9 },
{ RC_HF_NEAR_KF_GRASS_10, RAND_INF_HF_NEAR_KF_GRASS_10 },
{ RC_HF_NEAR_KF_GRASS_11, RAND_INF_HF_NEAR_KF_GRASS_11 },
{ RC_HF_NEAR_KF_GRASS_12, RAND_INF_HF_NEAR_KF_GRASS_12 },
{ RC_HF_NEAR_GATE_GRASS_1, RAND_INF_HF_NEAR_GATE_GRASS_1 },
{ RC_HF_NEAR_GATE_GRASS_2, RAND_INF_HF_NEAR_GATE_GRASS_2 },
{ RC_HF_NEAR_GATE_GRASS_3, RAND_INF_HF_NEAR_GATE_GRASS_3 },
{ RC_HF_NEAR_GATE_GRASS_4, RAND_INF_HF_NEAR_GATE_GRASS_4 },
{ RC_HF_NEAR_GATE_GRASS_5, RAND_INF_HF_NEAR_GATE_GRASS_5 },
{ RC_HF_NEAR_GATE_GRASS_6, RAND_INF_HF_NEAR_GATE_GRASS_6 },
{ RC_HF_NEAR_GATE_GRASS_7, RAND_INF_HF_NEAR_GATE_GRASS_7 },
{ RC_HF_NEAR_GATE_GRASS_8, RAND_INF_HF_NEAR_GATE_GRASS_8 },
{ RC_HF_NEAR_GATE_GRASS_9, RAND_INF_HF_NEAR_GATE_GRASS_9 },
{ RC_HF_NEAR_GATE_GRASS_10, RAND_INF_HF_NEAR_GATE_GRASS_10 },
{ RC_HF_NEAR_GATE_GRASS_11, RAND_INF_HF_NEAR_GATE_GRASS_11 },
{ RC_HF_NEAR_GATE_GRASS_12, RAND_INF_HF_NEAR_GATE_GRASS_12 },
{ RC_HF_SOUTH_GRASS_1, RAND_INF_HF_SOUTH_GRASS_1 },
{ RC_HF_SOUTH_GRASS_2, RAND_INF_HF_SOUTH_GRASS_2 },
{ RC_HF_SOUTH_GRASS_3, RAND_INF_HF_SOUTH_GRASS_3 },
{ RC_HF_SOUTH_GRASS_4, RAND_INF_HF_SOUTH_GRASS_4 },
{ RC_HF_SOUTH_GRASS_5, RAND_INF_HF_SOUTH_GRASS_5 },
{ RC_HF_SOUTH_GRASS_6, RAND_INF_HF_SOUTH_GRASS_6 },
{ RC_HF_SOUTH_GRASS_7, RAND_INF_HF_SOUTH_GRASS_7 },
{ RC_HF_SOUTH_GRASS_8, RAND_INF_HF_SOUTH_GRASS_8 },
{ RC_HF_SOUTH_GRASS_9, RAND_INF_HF_SOUTH_GRASS_9 },
{ RC_HF_SOUTH_GRASS_10, RAND_INF_HF_SOUTH_GRASS_10 },
{ RC_HF_SOUTH_GRASS_11, RAND_INF_HF_SOUTH_GRASS_11 },
{ RC_HF_SOUTH_GRASS_12, RAND_INF_HF_SOUTH_GRASS_12 },
{ RC_HF_CENTRAL_GRASS_1, RAND_INF_HF_CENTRAL_GRASS_1 },
{ RC_HF_CENTRAL_GRASS_2, RAND_INF_HF_CENTRAL_GRASS_2 },
{ RC_HF_CENTRAL_GRASS_3, RAND_INF_HF_CENTRAL_GRASS_3 },
{ RC_HF_CENTRAL_GRASS_4, RAND_INF_HF_CENTRAL_GRASS_4 },
{ RC_HF_CENTRAL_GRASS_5, RAND_INF_HF_CENTRAL_GRASS_5 },
{ RC_HF_CENTRAL_GRASS_6, RAND_INF_HF_CENTRAL_GRASS_6 },
{ RC_HF_CENTRAL_GRASS_7, RAND_INF_HF_CENTRAL_GRASS_7 },
{ RC_HF_CENTRAL_GRASS_8, RAND_INF_HF_CENTRAL_GRASS_8 },
{ RC_HF_CENTRAL_GRASS_9, RAND_INF_HF_CENTRAL_GRASS_9 },
{ RC_HF_CENTRAL_GRASS_10, RAND_INF_HF_CENTRAL_GRASS_10 },
{ RC_HF_CENTRAL_GRASS_11, RAND_INF_HF_CENTRAL_GRASS_11 },
{ RC_HF_CENTRAL_GRASS_12, RAND_INF_HF_CENTRAL_GRASS_12 },
{ RC_ZR_GRASS_1, RAND_INF_ZR_GRASS_1 },
{ RC_ZR_GRASS_2, RAND_INF_ZR_GRASS_2 },
{ RC_ZR_GRASS_3, RAND_INF_ZR_GRASS_3 },
{ RC_ZR_GRASS_4, RAND_INF_ZR_GRASS_4 },
{ RC_ZR_GRASS_5, RAND_INF_ZR_GRASS_5 },
{ RC_ZR_GRASS_6, RAND_INF_ZR_GRASS_6 },
{ RC_ZR_GRASS_7, RAND_INF_ZR_GRASS_7 },
{ RC_ZR_GRASS_8, RAND_INF_ZR_GRASS_8 },
{ RC_ZR_GRASS_9, RAND_INF_ZR_GRASS_9 },
{ RC_ZR_GRASS_10, RAND_INF_ZR_GRASS_10 },
{ RC_ZR_GRASS_11, RAND_INF_ZR_GRASS_11 },
{ RC_ZR_GRASS_12, RAND_INF_ZR_GRASS_12 },
{ RC_ZR_GRASS_13, RAND_INF_ZR_GRASS_13 },
// Grotto Grass
//{ RC_KF_STORMS_GROTTO_GRASS_1, RAND_INF_KF_STORMS_GROTTO_GRASS_1 },
//{ RC_KF_STORMS_GROTTO_GRASS_2, RAND_INF_KF_STORMS_GROTTO_GRASS_2 },
//{ RC_KF_STORMS_GROTTO_GRASS_3, RAND_INF_KF_STORMS_GROTTO_GRASS_3 },
//{ RC_KF_STORMS_GROTTO_GRASS_4, RAND_INF_KF_STORMS_GROTTO_GRASS_4 },
// Dungeon Grass
{ RC_DEKU_TREE_LOBBY_GRASS_1, RAND_INF_DEKU_TREE_LOBBY_GRASS_1 },
{ RC_DEKU_TREE_LOBBY_GRASS_2, RAND_INF_DEKU_TREE_LOBBY_GRASS_2 },
{ RC_DEKU_TREE_LOBBY_GRASS_3, RAND_INF_DEKU_TREE_LOBBY_GRASS_3 },
{ RC_DEKU_TREE_LOBBY_GRASS_4, RAND_INF_DEKU_TREE_LOBBY_GRASS_4 },
{ RC_DEKU_TREE_LOBBY_GRASS_5, RAND_INF_DEKU_TREE_LOBBY_GRASS_5 },
// MQ Dungeon Grass
// End Grass
{ RC_KF_LINKS_HOUSE_POT, RAND_INF_KF_LINKS_HOUSE_POT },
{ RC_KF_TWINS_HOUSE_POT_1, RAND_INF_KF_TWINS_HOUSE_POT_1 },
{ RC_KF_TWINS_HOUSE_POT_2, RAND_INF_KF_TWINS_HOUSE_POT_2 },
@ -1839,6 +2031,24 @@ FishIdentity Randomizer::IdentifyFish(s32 sceneNum, s32 actorParams) {
return fishIdentity;
}
GrassIdentity Randomizer::IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ) {
struct GrassIdentity grassIdentity;
grassIdentity.randomizerInf = RAND_INF_MAX;
grassIdentity.randomizerCheck = RC_UNKNOWN_CHECK;
s32 actorParams = TWO_ACTOR_PARAMS(posX, posZ);
Rando::Location* location = GetCheckObjectFromActor(ACTOR_EN_KUSA, sceneNum, actorParams);
if (location->GetRandomizerCheck() != RC_UNKNOWN_CHECK) {
grassIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()];
grassIdentity.randomizerCheck = location->GetRandomizerCheck();
}
return grassIdentity;
}
u8 Randomizer::GetRandoSettingValue(RandomizerSettingKey randoSettingKey) {
return Rando::Context::GetInstance()->GetOption(randoSettingKey).GetContextOptionIndex();
}

View File

@ -54,6 +54,7 @@ class Randomizer {
CowIdentity IdentifyCow(s32 sceneNum, s32 posX, s32 posZ);
PotIdentity IdentifyPot(s32 sceneNum, s32 posX, s32 posZ);
FishIdentity IdentifyFish(s32 sceneNum, s32 actorParams);
GrassIdentity IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ);
GetItemEntry GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogItemId, bool checkObtainability = true);
GetItemEntry GetItemFromActor(s16 actorId, s16 sceneNum, s16 actorParams, GetItemID ogItemId, bool checkObtainability = true);
ItemObtainability GetItemObtainabilityFromRandomizerCheck(RandomizerCheck randomizerCheck);

View File

@ -270,6 +270,7 @@ typedef enum {
RCTYPE_FISH, // Fishes
RCTYPE_FREESTANDING, // Freestanding rupees and hearts
RCTYPE_FAIRY, // Fairies
RCTYPE_GRASS // Grass
} RandomizerCheckType;
typedef enum { RCQUEST_VANILLA, RCQUEST_MQ, RCQUEST_BOTH } RandomizerCheckQuest;
@ -2821,6 +2822,199 @@ typedef enum {
RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY,
RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY,
RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY,
// Overworld Grass
RC_KF_CHILD_GRASS_1,
RC_KF_CHILD_GRASS_2,
RC_KF_CHILD_GRASS_3,
RC_KF_CHILD_GRASS_4,
RC_KF_CHILD_GRASS_5,
RC_KF_CHILD_GRASS_6,
RC_KF_CHILD_GRASS_7,
RC_KF_CHILD_GRASS_8,
RC_KF_CHILD_GRASS_9,
RC_KF_CHILD_GRASS_10,
RC_KF_CHILD_GRASS_11,
RC_KF_CHILD_GRASS_12,
RC_KF_CHILD_GRASS_MAZE_1,
RC_KF_CHILD_GRASS_MAZE_2,
RC_KF_CHILD_GRASS_MAZE_3,
RC_KF_ADULT_GRASS_1,
RC_KF_ADULT_GRASS_2,
RC_KF_ADULT_GRASS_3,
RC_KF_ADULT_GRASS_4,
RC_KF_ADULT_GRASS_5,
RC_KF_ADULT_GRASS_6,
RC_KF_ADULT_GRASS_7,
RC_KF_ADULT_GRASS_8,
RC_KF_ADULT_GRASS_9,
RC_KF_ADULT_GRASS_10,
RC_KF_ADULT_GRASS_11,
RC_KF_ADULT_GRASS_12,
RC_KF_ADULT_GRASS_13,
RC_KF_ADULT_GRASS_14,
RC_KF_ADULT_GRASS_15,
RC_KF_ADULT_GRASS_16,
RC_KF_ADULT_GRASS_17,
RC_KF_ADULT_GRASS_18,
//RC_KF_ADULT_GRASS_19,
//RC_KF_ADULT_GRASS_20,
RC_LW_GRASS_1,
RC_LW_GRASS_2,
RC_LW_GRASS_3,
RC_LW_GRASS_4,
RC_LW_GRASS_5,
RC_LW_GRASS_6,
RC_LW_GRASS_7,
RC_LW_GRASS_8,
RC_LW_GRASS_9,
RC_MARKET_GRASS_1,
RC_MARKET_GRASS_2,
RC_MARKET_GRASS_3,
RC_MARKET_GRASS_4,
RC_MARKET_GRASS_5,
RC_MARKET_GRASS_6,
RC_MARKET_GRASS_7,
RC_MARKET_GRASS_8,
RC_HC_GRASS_1,
RC_HC_GRASS_2,
RC_KAK_GRASS_1,
RC_KAK_GRASS_2,
RC_KAK_GRASS_3,
RC_KAK_GRASS_4,
RC_KAK_GRASS_5,
RC_KAK_GRASS_6,
RC_KAK_GRASS_7,
RC_KAK_GRASS_8,
RC_GY_GRASS_1,
RC_GY_GRASS_2,
RC_GY_GRASS_3,
RC_GY_GRASS_4,
RC_GY_GRASS_5,
RC_GY_GRASS_6,
RC_GY_GRASS_7,
RC_GY_GRASS_8,
RC_GY_GRASS_9,
RC_GY_GRASS_10,
RC_GY_GRASS_11,
RC_GY_GRASS_12,
RC_LH_GRASS_1,
RC_LH_GRASS_2,
RC_LH_GRASS_3,
RC_LH_GRASS_4,
RC_LH_GRASS_5,
RC_LH_GRASS_6,
RC_LH_GRASS_7,
RC_LH_GRASS_8,
RC_LH_GRASS_9,
RC_LH_GRASS_10,
RC_LH_GRASS_11,
RC_LH_GRASS_12,
RC_LH_GRASS_13,
RC_LH_GRASS_14,
RC_LH_GRASS_15,
RC_LH_GRASS_16,
RC_LH_GRASS_17,
RC_LH_GRASS_18,
RC_LH_GRASS_19,
RC_LH_GRASS_20,
RC_LH_GRASS_21,
RC_LH_GRASS_22,
RC_LH_GRASS_23,
RC_LH_GRASS_24,
RC_LH_GRASS_25,
RC_LH_GRASS_26,
RC_LH_GRASS_27,
RC_LH_GRASS_28,
RC_LH_GRASS_29,
RC_LH_GRASS_30,
RC_LH_GRASS_31,
RC_LH_GRASS_32,
RC_LH_GRASS_33,
RC_LH_GRASS_34,
RC_LH_GRASS_35,
RC_LH_GRASS_36,
RC_LH_CHILD_GRASS_1,
RC_LH_CHILD_GRASS_2,
RC_LH_CHILD_GRASS_3,
RC_LH_CHILD_GRASS_4,
RC_LH_WARP_PAD_GRASS_1,
RC_LH_WARP_PAD_GRASS_2,
RC_HF_NEAR_KF_GRASS_1,
RC_HF_NEAR_KF_GRASS_2,
RC_HF_NEAR_KF_GRASS_3,
RC_HF_NEAR_KF_GRASS_4,
RC_HF_NEAR_KF_GRASS_5,
RC_HF_NEAR_KF_GRASS_6,
RC_HF_NEAR_KF_GRASS_7,
RC_HF_NEAR_KF_GRASS_8,
RC_HF_NEAR_KF_GRASS_9,
RC_HF_NEAR_KF_GRASS_10,
RC_HF_NEAR_KF_GRASS_11,
RC_HF_NEAR_KF_GRASS_12,
RC_HF_NEAR_GATE_GRASS_1,
RC_HF_NEAR_GATE_GRASS_2,
RC_HF_NEAR_GATE_GRASS_3,
RC_HF_NEAR_GATE_GRASS_4,
RC_HF_NEAR_GATE_GRASS_5,
RC_HF_NEAR_GATE_GRASS_6,
RC_HF_NEAR_GATE_GRASS_7,
RC_HF_NEAR_GATE_GRASS_8,
RC_HF_NEAR_GATE_GRASS_9,
RC_HF_NEAR_GATE_GRASS_10,
RC_HF_NEAR_GATE_GRASS_11,
RC_HF_NEAR_GATE_GRASS_12,
RC_HF_SOUTH_GRASS_1,
RC_HF_SOUTH_GRASS_2,
RC_HF_SOUTH_GRASS_3,
RC_HF_SOUTH_GRASS_4,
RC_HF_SOUTH_GRASS_5,
RC_HF_SOUTH_GRASS_6,
RC_HF_SOUTH_GRASS_7,
RC_HF_SOUTH_GRASS_8,
RC_HF_SOUTH_GRASS_9,
RC_HF_SOUTH_GRASS_10,
RC_HF_SOUTH_GRASS_11,
RC_HF_SOUTH_GRASS_12,
RC_HF_CENTRAL_GRASS_1,
RC_HF_CENTRAL_GRASS_2,
RC_HF_CENTRAL_GRASS_3,
RC_HF_CENTRAL_GRASS_4,
RC_HF_CENTRAL_GRASS_5,
RC_HF_CENTRAL_GRASS_6,
RC_HF_CENTRAL_GRASS_7,
RC_HF_CENTRAL_GRASS_8,
RC_HF_CENTRAL_GRASS_9,
RC_HF_CENTRAL_GRASS_10,
RC_HF_CENTRAL_GRASS_11,
RC_HF_CENTRAL_GRASS_12,
RC_ZR_GRASS_1,
RC_ZR_GRASS_2,
RC_ZR_GRASS_3,
RC_ZR_GRASS_4,
RC_ZR_GRASS_5,
RC_ZR_GRASS_6,
RC_ZR_GRASS_7,
RC_ZR_GRASS_8,
RC_ZR_GRASS_9,
RC_ZR_GRASS_10,
RC_ZR_GRASS_11,
RC_ZR_GRASS_12,
RC_ZR_GRASS_13,
// Grotto Grass
// RC_KF_STORMS_GROTTO_GRASS_1,
// RC_KF_STORMS_GROTTO_GRASS_2,
// RC_KF_STORMS_GROTTO_GRASS_3,
// RC_KF_STORMS_GROTTO_GRASS_4,
// Dungeon Grass
RC_DEKU_TREE_LOBBY_GRASS_1,
RC_DEKU_TREE_LOBBY_GRASS_2,
RC_DEKU_TREE_LOBBY_GRASS_3,
RC_DEKU_TREE_LOBBY_GRASS_4,
RC_DEKU_TREE_LOBBY_GRASS_5,
// MQ Dungeon Grass
// End Grass
RC_MAX
} RandomizerCheck;
@ -5004,6 +5198,16 @@ typedef enum {
RHT_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY,
RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY,
RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY,
// GRASS
RHT_KF_GRASS,
RHT_LW_GRASS,
RHT_MARKET_GRASS,
RHT_HC_GRASS,
RHT_KAK_GRASS,
RHT_GY_GRASS,
RHT_LH_GRASS,
RHT_HF_GRASS,
RHT_ZR_GRASS,
// MAX
RHT_MAX
} RandomizerHintTextKey;
@ -5295,6 +5499,7 @@ typedef enum {
RSK_SHUFFLE_DEKU_NUT_BAG,
RSK_SHUFFLE_FREESTANDING,
RSK_SHUFFLE_FAIRIES,
RSK_SHUFFLE_GRASS,
RSK_MAX
} RandomizerSettingKey;
@ -5641,6 +5846,14 @@ typedef enum {
RO_SHUFFLE_POTS_ALL,
} RandoOptionShufflePots;
// Shuffle Pots settings (off, dungeons, overworld, all)
typedef enum {
RO_SHUFFLE_GRASS_OFF,
RO_SHUFFLE_GRASS_DUNGEONS,
RO_SHUFFLE_GRASS_OVERWORLD,
RO_SHUFFLE_GRASS_ALL,
} RandoOptionShuffleGrass;
//Link's Pocket Settings (dungeon reward, advancement, anything, nothing)
typedef enum {
RO_LINKS_POCKET_DUNGEON_REWARD,
@ -5737,6 +5950,11 @@ typedef struct FishIdentity {
RandomizerCheck randomizerCheck;
} FishIdentity;
typedef struct GrassIdentity {
RandomizerInf randomizerInf;
RandomizerCheck randomizerCheck;
} GrassIdentity;
typedef enum {
TRACKER_WINDOW_FLOATING,
TRACKER_WINDOW_WINDOW

View File

@ -172,6 +172,7 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() {
(location.GetRCType() != RCTYPE_BEEHIVE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleBeehives"), RO_GENERIC_NO)) &&
(location.GetRCType() != RCTYPE_COW || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCows"), RO_GENERIC_NO)) &&
(location.GetRCType() != RCTYPE_POT || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShufflePots"), RO_GENERIC_NO)) &&
(location.GetRCType() != RCTYPE_GRASS || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGrass"), RO_GENERIC_NO)) &&
(location.GetRCType() != RCTYPE_FISH || ctx->GetFishsanity()->GetFishLocationIncluded(&location, FSO_SOURCE_CVARS)) &&
(location.GetRCType() != RCTYPE_ADULT_TRADE ||
CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), RO_GENERIC_NO)) &&

View File

@ -58,6 +58,8 @@ bool showWeirdEgg;
bool showGerudoCard;
bool showOverworldPots;
bool showDungeonPots;
bool showOverworldGrass;
bool showDungeonGrass;
bool showFrogSongRupees;
bool showFairies;
bool showStartingMapsCompasses;
@ -1233,11 +1235,20 @@ void LoadSettings() {
showDungeonPots = false;
break;
}
switch (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_GRASS)) {
default:
showOverworldGrass = true;
showDungeonGrass = true;
break;
}
} else { // Vanilla
showOverworldTokens = true;
showDungeonTokens = true;
showOverworldPots = false;
showDungeonPots = false;
showOverworldGrass = false;
showDungeonGrass = false;
}
fortressFast = false;
@ -1317,6 +1328,9 @@ bool IsCheckShuffled(RandomizerCheck rc) {
(loc->GetRCType() != RCTYPE_POT ||
(showOverworldPots && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) ||
(showDungeonPots && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) &&
(loc->GetRCType() != RCTYPE_GRASS ||
(showOverworldGrass && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) ||
(showDungeonGrass && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) &&
(loc->GetRCType() != RCTYPE_COW || showCows) &&
(loc->GetRCType() != RCTYPE_FISH || OTRGlobals::Instance->gRandoContext->GetFishsanity()->GetFishLocationIncluded(loc)) &&
(loc->GetRCType() != RCTYPE_FREESTANDING ||

View File

@ -1271,6 +1271,198 @@ typedef enum {
RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY,
RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY,
RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY,
// Overworld Grass
RAND_INF_KF_CHILD_GRASS_1,
RAND_INF_KF_CHILD_GRASS_2,
RAND_INF_KF_CHILD_GRASS_3,
RAND_INF_KF_CHILD_GRASS_4,
RAND_INF_KF_CHILD_GRASS_5,
RAND_INF_KF_CHILD_GRASS_6,
RAND_INF_KF_CHILD_GRASS_7,
RAND_INF_KF_CHILD_GRASS_8,
RAND_INF_KF_CHILD_GRASS_9,
RAND_INF_KF_CHILD_GRASS_10,
RAND_INF_KF_CHILD_GRASS_11,
RAND_INF_KF_CHILD_GRASS_12,
RAND_INF_KF_CHILD_GRASS_MAZE_1,
RAND_INF_KF_CHILD_GRASS_MAZE_2,
RAND_INF_KF_CHILD_GRASS_MAZE_3,
RAND_INF_KF_ADULT_GRASS_1,
RAND_INF_KF_ADULT_GRASS_2,
RAND_INF_KF_ADULT_GRASS_3,
RAND_INF_KF_ADULT_GRASS_4,
RAND_INF_KF_ADULT_GRASS_5,
RAND_INF_KF_ADULT_GRASS_6,
RAND_INF_KF_ADULT_GRASS_7,
RAND_INF_KF_ADULT_GRASS_8,
RAND_INF_KF_ADULT_GRASS_9,
RAND_INF_KF_ADULT_GRASS_10,
RAND_INF_KF_ADULT_GRASS_11,
RAND_INF_KF_ADULT_GRASS_12,
RAND_INF_KF_ADULT_GRASS_13,
RAND_INF_KF_ADULT_GRASS_14,
RAND_INF_KF_ADULT_GRASS_15,
RAND_INF_KF_ADULT_GRASS_16,
RAND_INF_KF_ADULT_GRASS_17,
RAND_INF_KF_ADULT_GRASS_18,
//RAND_INF_KF_ADULT_GRASS_19,
//RAND_INF_KF_ADULT_GRASS_20,
RAND_INF_LW_GRASS_1,
RAND_INF_LW_GRASS_2,
RAND_INF_LW_GRASS_3,
RAND_INF_LW_GRASS_4,
RAND_INF_LW_GRASS_5,
RAND_INF_LW_GRASS_6,
RAND_INF_LW_GRASS_7,
RAND_INF_LW_GRASS_8,
RAND_INF_LW_GRASS_9,
RAND_INF_MARKET_GRASS_1,
RAND_INF_MARKET_GRASS_2,
RAND_INF_MARKET_GRASS_3,
RAND_INF_MARKET_GRASS_4,
RAND_INF_MARKET_GRASS_5,
RAND_INF_MARKET_GRASS_6,
RAND_INF_MARKET_GRASS_7,
RAND_INF_MARKET_GRASS_8,
RAND_INF_HC_GRASS_1,
RAND_INF_HC_GRASS_2,
RAND_INF_KAK_GRASS_1,
RAND_INF_KAK_GRASS_2,
RAND_INF_KAK_GRASS_3,
RAND_INF_KAK_GRASS_4,
RAND_INF_KAK_GRASS_5,
RAND_INF_KAK_GRASS_6,
RAND_INF_KAK_GRASS_7,
RAND_INF_KAK_GRASS_8,
RAND_INF_GY_GRASS_1,
RAND_INF_GY_GRASS_2,
RAND_INF_GY_GRASS_3,
RAND_INF_GY_GRASS_4,
RAND_INF_GY_GRASS_5,
RAND_INF_GY_GRASS_6,
RAND_INF_GY_GRASS_7,
RAND_INF_GY_GRASS_8,
RAND_INF_GY_GRASS_9,
RAND_INF_GY_GRASS_10,
RAND_INF_GY_GRASS_11,
RAND_INF_GY_GRASS_12,
RAND_INF_LH_GRASS_1,
RAND_INF_LH_GRASS_2,
RAND_INF_LH_GRASS_3,
RAND_INF_LH_GRASS_4,
RAND_INF_LH_GRASS_5,
RAND_INF_LH_GRASS_6,
RAND_INF_LH_GRASS_7,
RAND_INF_LH_GRASS_8,
RAND_INF_LH_GRASS_9,
RAND_INF_LH_GRASS_10,
RAND_INF_LH_GRASS_11,
RAND_INF_LH_GRASS_12,
RAND_INF_LH_GRASS_13,
RAND_INF_LH_GRASS_14,
RAND_INF_LH_GRASS_15,
RAND_INF_LH_GRASS_16,
RAND_INF_LH_GRASS_17,
RAND_INF_LH_GRASS_18,
RAND_INF_LH_GRASS_19,
RAND_INF_LH_GRASS_20,
RAND_INF_LH_GRASS_21,
RAND_INF_LH_GRASS_22,
RAND_INF_LH_GRASS_23,
RAND_INF_LH_GRASS_24,
RAND_INF_LH_GRASS_25,
RAND_INF_LH_GRASS_26,
RAND_INF_LH_GRASS_27,
RAND_INF_LH_GRASS_28,
RAND_INF_LH_GRASS_29,
RAND_INF_LH_GRASS_30,
RAND_INF_LH_GRASS_31,
RAND_INF_LH_GRASS_32,
RAND_INF_LH_GRASS_33,
RAND_INF_LH_GRASS_34,
RAND_INF_LH_GRASS_35,
RAND_INF_LH_GRASS_36,
RAND_INF_LH_CHILD_GRASS_1,
RAND_INF_LH_CHILD_GRASS_2,
RAND_INF_LH_CHILD_GRASS_3,
RAND_INF_LH_CHILD_GRASS_4,
RAND_INF_LH_WARP_PAD_GRASS_1,
RAND_INF_LH_WARP_PAD_GRASS_2,
RAND_INF_HF_NEAR_KF_GRASS_1,
RAND_INF_HF_NEAR_KF_GRASS_2,
RAND_INF_HF_NEAR_KF_GRASS_3,
RAND_INF_HF_NEAR_KF_GRASS_4,
RAND_INF_HF_NEAR_KF_GRASS_5,
RAND_INF_HF_NEAR_KF_GRASS_6,
RAND_INF_HF_NEAR_KF_GRASS_7,
RAND_INF_HF_NEAR_KF_GRASS_8,
RAND_INF_HF_NEAR_KF_GRASS_9,
RAND_INF_HF_NEAR_KF_GRASS_10,
RAND_INF_HF_NEAR_KF_GRASS_11,
RAND_INF_HF_NEAR_KF_GRASS_12,
RAND_INF_HF_NEAR_GATE_GRASS_1,
RAND_INF_HF_NEAR_GATE_GRASS_2,
RAND_INF_HF_NEAR_GATE_GRASS_3,
RAND_INF_HF_NEAR_GATE_GRASS_4,
RAND_INF_HF_NEAR_GATE_GRASS_5,
RAND_INF_HF_NEAR_GATE_GRASS_6,
RAND_INF_HF_NEAR_GATE_GRASS_7,
RAND_INF_HF_NEAR_GATE_GRASS_8,
RAND_INF_HF_NEAR_GATE_GRASS_9,
RAND_INF_HF_NEAR_GATE_GRASS_10,
RAND_INF_HF_NEAR_GATE_GRASS_11,
RAND_INF_HF_NEAR_GATE_GRASS_12,
RAND_INF_HF_SOUTH_GRASS_1,
RAND_INF_HF_SOUTH_GRASS_2,
RAND_INF_HF_SOUTH_GRASS_3,
RAND_INF_HF_SOUTH_GRASS_4,
RAND_INF_HF_SOUTH_GRASS_5,
RAND_INF_HF_SOUTH_GRASS_6,
RAND_INF_HF_SOUTH_GRASS_7,
RAND_INF_HF_SOUTH_GRASS_8,
RAND_INF_HF_SOUTH_GRASS_9,
RAND_INF_HF_SOUTH_GRASS_10,
RAND_INF_HF_SOUTH_GRASS_11,
RAND_INF_HF_SOUTH_GRASS_12,
RAND_INF_HF_CENTRAL_GRASS_1,
RAND_INF_HF_CENTRAL_GRASS_2,
RAND_INF_HF_CENTRAL_GRASS_3,
RAND_INF_HF_CENTRAL_GRASS_4,
RAND_INF_HF_CENTRAL_GRASS_5,
RAND_INF_HF_CENTRAL_GRASS_6,
RAND_INF_HF_CENTRAL_GRASS_7,
RAND_INF_HF_CENTRAL_GRASS_8,
RAND_INF_HF_CENTRAL_GRASS_9,
RAND_INF_HF_CENTRAL_GRASS_10,
RAND_INF_HF_CENTRAL_GRASS_11,
RAND_INF_HF_CENTRAL_GRASS_12,
RAND_INF_ZR_GRASS_1,
RAND_INF_ZR_GRASS_2,
RAND_INF_ZR_GRASS_3,
RAND_INF_ZR_GRASS_4,
RAND_INF_ZR_GRASS_5,
RAND_INF_ZR_GRASS_6,
RAND_INF_ZR_GRASS_7,
RAND_INF_ZR_GRASS_8,
RAND_INF_ZR_GRASS_9,
RAND_INF_ZR_GRASS_10,
RAND_INF_ZR_GRASS_11,
RAND_INF_ZR_GRASS_12,
RAND_INF_ZR_GRASS_13,
// Grotto Grass
// RAND_INF_KF_STORMS_GROTTO_GRASS_1,
// RAND_INF_KF_STORMS_GROTTO_GRASS_2,
// RAND_INF_KF_STORMS_GROTTO_GRASS_3,
// RAND_INF_KF_STORMS_GROTTO_GRASS_4,
// Dungeon Grass
RAND_INF_DEKU_TREE_LOBBY_GRASS_1,
RAND_INF_DEKU_TREE_LOBBY_GRASS_2,
RAND_INF_DEKU_TREE_LOBBY_GRASS_3,
RAND_INF_DEKU_TREE_LOBBY_GRASS_4,
RAND_INF_DEKU_TREE_LOBBY_GRASS_5,
// MQ Dungeon Grass
// End Grass
// If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16)
RAND_INF_MAX,

View File

@ -226,6 +226,7 @@ void Settings::CreateOptions() {
mOptions[RSK_FISHSANITY_POND_COUNT] = Option::U8("Pond Fish Count", {NumOpts(0,17,1)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("FishsanityPondCount"), mOptionDescriptions[RSK_FISHSANITY_POND_COUNT], WidgetType::Slider, 0, true, IMFLAG_NONE);
mOptions[RSK_FISHSANITY_AGE_SPLIT] = Option::Bool("Pond Age Split", CVAR_RANDOMIZER_SETTING("FishsanityAgeSplit"), mOptionDescriptions[RSK_FISHSANITY_AGE_SPLIT]);
mOptions[RSK_SHUFFLE_FAIRIES] = Option::Bool("Shuffle Fairies", CVAR_RANDOMIZER_SETTING("ShuffleFairies"), mOptionDescriptions[RSK_SHUFFLE_FAIRIES]);
mOptions[RSK_SHUFFLE_GRASS] = Option::Bool("Shuffle Grass", CVAR_RANDOMIZER_SETTING("ShuffleGrass"), mOptionDescriptions[RSK_SHUFFLE_GRASS]);
mOptions[RSK_SHUFFLE_MAPANDCOMPASS] = Option::U8("Maps/Compasses", {"Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), mOptionDescriptions[RSK_SHUFFLE_MAPANDCOMPASS], WidgetType::Combobox, RO_DUNGEON_ITEM_LOC_OWN_DUNGEON);
mOptions[RSK_KEYSANITY] = Option::U8("Small Key Shuffle", {"Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("Keysanity"), mOptionDescriptions[RSK_KEYSANITY], WidgetType::Combobox, RO_DUNGEON_ITEM_LOC_OWN_DUNGEON);
mOptions[RSK_GERUDO_KEYS] = Option::U8("Gerudo Fortress Keys", {"Vanilla", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GerudoKeys"), mOptionDescriptions[RSK_GERUDO_KEYS], WidgetType::Combobox, RO_GERUDO_KEYS_VANILLA);
@ -792,6 +793,7 @@ void Settings::CreateOptions() {
&mOptions[RSK_SHUFFLE_DEKU_STICK_BAG],
&mOptions[RSK_SHUFFLE_DEKU_NUT_BAG],
&mOptions[RSK_SHUFFLE_FREESTANDING],
&mOptions[RSK_SHUFFLE_GRASS],
}, WidgetContainerType::COLUMN);
mOptionGroups[RSG_SHUFFLE_NPCS_IMGUI] = OptionGroup::SubGroup("Shuffle NPCs & Merchants", {
&mOptions[RSK_SHOPSANITY],

View File

@ -47,6 +47,7 @@ class StaticData {
static std::vector<RandomizerCheck> GetPondFishLocations();
static std::vector<RandomizerCheck> GetOverworldFishLocations();
static std::vector<RandomizerCheck> GetOverworldPotLocations();
static std::vector<RandomizerCheck> GetOverworldGrassLocations();
static std::vector<RandomizerCheck> GetOverworldFairyLocations();
static std::array<std::pair<RandomizerCheck, RandomizerCheck>, 17> randomizerFishingPondFish;
static std::unordered_map<int8_t, RandomizerCheck> randomizerGrottoFishMap;

View File

@ -10,6 +10,7 @@
#include "objects/gameplay_field_keep/gameplay_field_keep.h"
#include "objects/object_kusa/object_kusa.h"
#include "vt.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_ALWAYS_THROWN)
@ -124,31 +125,58 @@ s32 EnKusa_SnapToFloor(EnKusa* this, PlayState* play, f32 yOffset) {
}
void EnKusa_DropCollectible(EnKusa* this, PlayState* play) {
s16 dropParams;
s16 dropParams = this->actor.params & 0x1F;
//s16 dropParams;
switch (this->actor.params & 3) {
case ENKUSA_TYPE_0:
case ENKUSA_TYPE_2:
dropParams = (this->actor.params >> 8) & 0xF;
if (GameInteractor_Should(VB_GRASS_DROP_ITEM, false, this)) {
switch (this->actor.params & 3) {
case ENKUSA_TYPE_0:
case ENKUSA_TYPE_2:
dropParams = (this->actor.params >> 8) & 0xF;
if (dropParams >= 0xD) {
dropParams = 0;
}
Item_DropCollectibleRandom(play, NULL, &this->actor.world.pos, dropParams << 4);
break;
case ENKUSA_TYPE_1:
if (CVarGetInteger(CVAR_ENHANCEMENT("NoRandomDrops"), 0)) {
}
else if (CVarGetInteger(CVAR_ENHANCEMENT("NoHeartDrops"), 0)) {
Item_DropCollectible(play, &this->actor.world.pos, ITEM00_SEEDS);
}
else if (Rand_ZeroOne() < 0.5f) {
Item_DropCollectible(play, &this->actor.world.pos, ITEM00_SEEDS);
} else {
Item_DropCollectible(play, &this->actor.world.pos, ITEM00_HEART);
}
break;
if (dropParams >= 0xD) {
dropParams = 0;
}
Item_DropCollectibleRandom(play, NULL, &this->actor.world.pos, dropParams << 4);
break;
case ENKUSA_TYPE_1:
if (CVarGetInteger(CVAR_ENHANCEMENT("NoRandomDrops"), 0)) {
} else if (CVarGetInteger(CVAR_ENHANCEMENT("NoHeartDrops"), 0)) {
Item_DropCollectible(play, &this->actor.world.pos, ITEM00_SEEDS);
} else if (Rand_ZeroOne() < 0.5f) {
Item_DropCollectible(play, &this->actor.world.pos, ITEM00_SEEDS);
} else {
Item_DropCollectible(play, &this->actor.world.pos, ITEM00_HEART);
}
break;
}
}
/*if (GameInteractor_Should(VB_GRASS_DROP_ITEM, false)) {
Item_DropCollectible(play, &this->actor.world.pos, (dropParams | (((this->actor.params >> 9) & 0x3F) << 8)));
} else {
switch (this->actor.params & 3) {
case ENKUSA_TYPE_0:
case ENKUSA_TYPE_2:
dropParams = (this->actor.params >> 8) & 0xF;
if (dropParams >= 0xD) {
dropParams = 0;
}
Item_DropCollectibleRandom(play, NULL, &this->actor.world.pos, dropParams << 4);
break;
case ENKUSA_TYPE_1:
if (CVarGetInteger(CVAR_ENHANCEMENT("NoRandomDrops"), 0)) {
} else if (CVarGetInteger(CVAR_ENHANCEMENT("NoHeartDrops"), 0)) {
Item_DropCollectible(play, &this->actor.world.pos, ITEM00_SEEDS);
} else if (Rand_ZeroOne() < 0.5f) {
Item_DropCollectible(play, &this->actor.world.pos, ITEM00_SEEDS);
} else {
Item_DropCollectible(play, &this->actor.world.pos, ITEM00_HEART);
}
break;
}
}*/
}
void EnKusa_UpdateVelY(EnKusa* this) {
@ -288,7 +316,11 @@ void EnKusa_WaitObject(EnKusa* this, PlayState* play) {
EnKusa_SetupMain(this);
}
this->actor.draw = EnKusa_Draw;
if (GameInteractor_Should(VB_GRASS_SETUP_DRAW, true, this)) {
this->actor.draw = EnKusa_Draw;
}
//this->actor.draw = EnKusa_Draw;
this->actor.objBankIndex = this->objBankIndex;
this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED;
}

View File

@ -20,6 +20,7 @@ typedef struct EnKusa {
/* 0x0150 */ ColliderCylinder collider;
/* 0x019C */ s16 timer;
/* 0x019E */ s8 objBankIndex;
/* */ GrassIdentity grassIdentity;
} EnKusa; // size = 0x01A0
#endif