This commit is contained in:
Demur Rumed 2025-06-09 02:30:39 +00:00
commit 07e3454bc0
12 changed files with 117 additions and 81 deletions

View file

@ -607,17 +607,16 @@ void GenerateItemPool() {
// Shuffle Trees // Shuffle Trees
bool treesActive = (bool)ctx->GetOption(RSK_SHUFFLE_TREES); bool treesActive = (bool)ctx->GetOption(RSK_SHUFFLE_TREES);
PlaceItemsForType(RCTYPE_TREE, treesActive, false); PlaceItemsForType(RCTYPE_TREE, treesActive, false);
PlaceItemsForType(RCTYPE_NLTREE, treesActive && ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC), false);
// Shuffle Crates // Shuffle Crates
bool overworldCratesActive = ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_OVERWORLD) || bool overworldCratesActive = ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_OVERWORLD) ||
ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL); ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL);
bool overworldNLCratesActive = ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) && bool overworldNLCratesActive = overworldCratesActive && ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC);
(ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_OVERWORLD) ||
ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL));
bool dungeonCratesActive = ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_DUNGEONS) || bool dungeonCratesActive = ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_DUNGEONS) ||
ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL); ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL);
PlaceItemsForType(RCTYPE_CRATE, overworldCratesActive, dungeonCratesActive); PlaceItemsForType(RCTYPE_CRATE, overworldCratesActive, dungeonCratesActive);
PlaceItemsForType(RCTYPE_NLCRATE, overworldNLCratesActive, dungeonCratesActive); PlaceItemsForType(RCTYPE_NLCRATE, overworldNLCratesActive, false);
PlaceItemsForType(RCTYPE_SMALL_CRATE, overworldCratesActive, dungeonCratesActive); PlaceItemsForType(RCTYPE_SMALL_CRATE, overworldCratesActive, dungeonCratesActive);
auto fsMode = ctx->GetOption(RSK_FISHSANITY); auto fsMode = ctx->GetOption(RSK_FISHSANITY);

View file

@ -145,11 +145,13 @@ void Rando::StaticData::RegisterTreeLocations() {
locationTable[RC_HC_NEAR_GUARDS_TREE_6] = Location::Tree(RC_HC_NEAR_GUARDS_TREE_6, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(1494, 2108), "Tree Near Guards 6", RHT_TREE_HYRULE_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_NEAR_GUARDS_TREE_6)); locationTable[RC_HC_NEAR_GUARDS_TREE_6] = Location::Tree(RC_HC_NEAR_GUARDS_TREE_6, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(1494, 2108), "Tree Near Guards 6", RHT_TREE_HYRULE_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_NEAR_GUARDS_TREE_6));
locationTable[RC_HC_SKULLTULA_TREE] = Location::Tree(RC_HC_SKULLTULA_TREE, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(-145, 2961), "HC GS Tree", RHT_TREE_HYRULE_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_SKULLTULA_TREE)); locationTable[RC_HC_SKULLTULA_TREE] = Location::Tree(RC_HC_SKULLTULA_TREE, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(-145, 2961), "HC GS Tree", RHT_TREE_HYRULE_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_SKULLTULA_TREE));
locationTable[RC_HC_GROTTO_TREE] = Location::Tree(RC_HC_GROTTO_TREE, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(924, 872), "Tree Near Storms Grotto", RHT_TREE_HYRULE_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_GROTTO_TREE)); locationTable[RC_HC_GROTTO_TREE] = Location::Tree(RC_HC_GROTTO_TREE, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(924, 872), "Tree Near Storms Grotto", RHT_TREE_HYRULE_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_GROTTO_TREE));
locationTable[RC_HC_NL_TREE_1] = Location::NLTree(RC_HC_NL_TREE_1, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(-331, 1438), "NL Tree Near Guards 1", RHT_TREE_HYRULE_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_NL_TREE_1));
locationTable[RC_HC_NL_TREE_2] = Location::NLTree(RC_HC_NL_TREE_2, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(1022, 1444), "NL Tree Near Guards 2", RHT_TREE_HYRULE_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_NL_TREE_2));
locationTable[RC_HF_NEAR_KAK_TREE] = Location::Tree(RC_HF_NEAR_KAK_TREE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3276, 971), "Tree Outside Kakariko", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KAK_TREE)); locationTable[RC_HF_NEAR_KAK_TREE] = Location::Tree(RC_HF_NEAR_KAK_TREE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(3276, 971), "Tree Outside Kakariko", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KAK_TREE));
locationTable[RC_HF_NEAR_KAK_SMALL_TREE] = Location::Tree(RC_HF_NEAR_KAK_SMALL_TREE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(2076, -91), "Small Tree Outside Kakariko", RHT_TREE_HYRULE_FIELD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KAK_SMALL_TREE)); locationTable[RC_HF_NEAR_KAK_SMALL_TREE] = Location::Tree(RC_HF_NEAR_KAK_SMALL_TREE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(2076, -91), "Small Tree Outside Kakariko", RHT_TREE_HYRULE_FIELD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_KAK_SMALL_TREE));
locationTable[RC_HF_TREE_NEAR_HC_GROTTO_1] = Location::Tree(RC_HF_TREE_NEAR_HC_GROTTO_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1041, 1022), "Tree Near HC Entrance Grotto 1", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_TREE_NEAR_HC_GROTTO_1)); locationTable[RC_HF_NEAR_MARKET_TREE_1] = Location::Tree(RC_HF_NEAR_MARKET_TREE_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1041, 1022), "Tree Near HC Entrance Grotto 1", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_TREE_1));
locationTable[RC_HF_TREE_NEAR_HC_GROTTO_2] = Location::Tree(RC_HF_TREE_NEAR_HC_GROTTO_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1244, 819), "Tree Near HC Entrance Grotto 2", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_TREE_NEAR_HC_GROTTO_2)); locationTable[RC_HF_NEAR_MARKET_TREE_2] = Location::Tree(RC_HF_NEAR_MARKET_TREE_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1244, 819), "Tree Near HC Entrance Grotto 2", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_TREE_2));
locationTable[RC_HF_TREE_NEAR_HC_GROTTO_3] = Location::Tree(RC_HF_TREE_NEAR_HC_GROTTO_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1448, 620), "Tree Near HC Entrance Grotto 3", RHT_TREE_HYRULE_FIELD, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_TREE_NEAR_HC_GROTTO_3)); locationTable[RC_HF_NEAR_MARKET_TREE_3] = Location::Tree(RC_HF_NEAR_MARKET_TREE_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1448, 620), "Tree Near HC Entrance Grotto 3", RHT_TREE_HYRULE_FIELD, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_MARKET_TREE_3));
locationTable[RC_HF_NEAR_LLR_TREE] = Location::Tree(RC_HF_NEAR_LLR_TREE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1907, 5409), "Tree Outside Lon Lon Ranch", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_LLR_TREE)); locationTable[RC_HF_NEAR_LLR_TREE] = Location::Tree(RC_HF_NEAR_LLR_TREE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-1907, 5409), "Tree Outside Lon Lon Ranch", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_LLR_TREE));
locationTable[RC_HF_NEAR_LH_TREE] = Location::Tree(RC_HF_NEAR_LH_TREE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-4377, 13662), "Tree Outside Lake Hylia", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_LH_TREE)); locationTable[RC_HF_NEAR_LH_TREE] = Location::Tree(RC_HF_NEAR_LH_TREE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-4377, 13662), "Tree Outside Lake Hylia", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_NEAR_LH_TREE));
locationTable[RC_HF_CHILD_NEAR_GV_TREE] = Location::Tree(RC_HF_CHILD_NEAR_GV_TREE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-6270, 8579), "Child Near Gerudo Valley Tree", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CHILD_NEAR_GV_TREE)); locationTable[RC_HF_CHILD_NEAR_GV_TREE] = Location::Tree(RC_HF_CHILD_NEAR_GV_TREE, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(-6270, 8579), "Child Near Gerudo Valley Tree", RHT_TREE_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_CHILD_NEAR_GV_TREE));

View file

@ -189,10 +189,12 @@ void Context::GenerateLocationPool() {
(location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OFF)) || (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OFF)) ||
(location.GetRCType() == RCTYPE_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF)) || (location.GetRCType() == RCTYPE_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF)) ||
(location.GetRCType() == RCTYPE_NLCRATE && (mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF) || (location.GetRCType() == RCTYPE_NLCRATE && (mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF) ||
!mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC))) || mOptions[RSK_LOGIC_RULES].IsNot(RO_LOGIC_NO_LOGIC))) ||
(location.GetRCType() == RCTYPE_SMALL_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF)) || (location.GetRCType() == RCTYPE_SMALL_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF)) ||
(location.GetRCType() == RCTYPE_FAIRY && !mOptions[RSK_SHUFFLE_FAIRIES]) || (location.GetRCType() == RCTYPE_FAIRY && !mOptions[RSK_SHUFFLE_FAIRIES]) ||
(location.GetRCType() == RCTYPE_TREE && !mOptions[RSK_SHUFFLE_TREES]) || (location.GetRCType() == RCTYPE_TREE && !mOptions[RSK_SHUFFLE_TREES]) ||
(location.GetRCType() == RCTYPE_NLTREE &&
(!mOptions[RSK_SHUFFLE_TREES] || mOptions[RSK_LOGIC_RULES].IsNot(RO_LOGIC_NO_LOGIC))) ||
(location.GetRCType() == RCTYPE_FREESTANDING && (location.GetRCType() == RCTYPE_FREESTANDING &&
mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OFF)) || mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OFF)) ||
(location.GetRCType() == RCTYPE_BEEHIVE && !mOptions[RSK_SHUFFLE_BEEHIVES])) { (location.GetRCType() == RCTYPE_BEEHIVE && !mOptions[RSK_SHUFFLE_BEEHIVES])) {

View file

@ -575,6 +575,15 @@ Rando::Location Rando::Location::Tree(RandomizerCheck rc, RandomizerCheckQuest q
false, collectionCheck }; false, collectionCheck };
} }
Rando::Location Rando::Location::NLTree(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_,
SceneID scene_, int32_t actorParams_, std::string&& shortName_,
RandomizerHintTextKey hintKey, RandomizerGet vanillaItem,
SpoilerCollectionCheck collectionCheck) {
return { rc, quest_, RCTYPE_NLTREE, area_, ACTOR_EN_WOOD02,
scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem,
false, collectionCheck };
}
Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_,
SceneID scene_, int32_t actorParams_, std::string&& shortName_) { SceneID scene_, int32_t actorParams_, std::string&& shortName_) {
return { rc, quest_, RCTYPE_GOSSIP_STONE, area_, ACTOR_EN_GS, return { rc, quest_, RCTYPE_GOSSIP_STONE, area_, ACTOR_EN_GS,

View file

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

View file

@ -34,6 +34,8 @@ void RegionTable_Init_CastleGrounds() {
LOCATION(RC_HC_GRASS_1, logic->CanCutShrubs()), LOCATION(RC_HC_GRASS_1, logic->CanCutShrubs()),
LOCATION(RC_HC_GRASS_2, logic->CanCutShrubs()), LOCATION(RC_HC_GRASS_2, logic->CanCutShrubs()),
LOCATION(RC_HC_GROTTO_TREE, logic->CanBonkTrees()), LOCATION(RC_HC_GROTTO_TREE, logic->CanBonkTrees()),
LOCATION(RC_HC_NL_TREE_1, logic->CanBonkTrees()),
LOCATION(RC_HC_NL_TREE_2, logic->CanBonkTrees()),
LOCATION(RC_HC_SKULLTULA_TREE, logic->CanBonkTrees()), LOCATION(RC_HC_SKULLTULA_TREE, logic->CanBonkTrees()),
LOCATION(RC_HC_NEAR_GUARDS_TREE_1, logic->CanBonkTrees()), LOCATION(RC_HC_NEAR_GUARDS_TREE_1, logic->CanBonkTrees()),
LOCATION(RC_HC_NEAR_GUARDS_TREE_2, logic->CanBonkTrees()), LOCATION(RC_HC_NEAR_GUARDS_TREE_2, logic->CanBonkTrees()),

View file

@ -68,9 +68,9 @@ void RegionTable_Init_HyruleField() {
LOCATION(RC_HF_NEAR_ZR_TREE, logic->CanBonkTrees()), LOCATION(RC_HF_NEAR_ZR_TREE, logic->CanBonkTrees()),
LOCATION(RC_HF_NEAR_KAK_TREE, logic->CanBonkTrees()), LOCATION(RC_HF_NEAR_KAK_TREE, logic->CanBonkTrees()),
LOCATION(RC_HF_NEAR_KAK_SMALL_TREE, logic->CanBonkTrees()), LOCATION(RC_HF_NEAR_KAK_SMALL_TREE, logic->CanBonkTrees()),
LOCATION(RC_HF_TREE_NEAR_HC_GROTTO_1, logic->CanBonkTrees()), LOCATION(RC_HF_NEAR_MARKET_TREE_1, logic->CanBonkTrees()),
LOCATION(RC_HF_TREE_NEAR_HC_GROTTO_2, logic->CanBonkTrees()), LOCATION(RC_HF_NEAR_MARKET_TREE_2, logic->CanBonkTrees()),
LOCATION(RC_HF_TREE_NEAR_HC_GROTTO_3, logic->CanBonkTrees()), LOCATION(RC_HF_NEAR_MARKET_TREE_3, logic->CanBonkTrees()),
LOCATION(RC_HF_NORTHWEST_TREE_1, logic->CanBonkTrees()), LOCATION(RC_HF_NORTHWEST_TREE_1, logic->CanBonkTrees()),
LOCATION(RC_HF_NORTHWEST_TREE_2, logic->CanBonkTrees()), LOCATION(RC_HF_NORTHWEST_TREE_2, logic->CanBonkTrees()),
LOCATION(RC_HF_NORTHWEST_TREE_3, logic->CanBonkTrees()), LOCATION(RC_HF_NORTHWEST_TREE_3, logic->CanBonkTrees()),

View file

@ -3267,11 +3267,13 @@ std::map<RandomizerCheck, RandomizerInf> rcToRandomizerInf = {
{ RC_HC_NEAR_GUARDS_TREE_6, RAND_INF_HC_NEAR_GUARDS_TREE_6 }, { RC_HC_NEAR_GUARDS_TREE_6, RAND_INF_HC_NEAR_GUARDS_TREE_6 },
{ RC_HC_SKULLTULA_TREE, RAND_INF_HC_SKULLTULA_TREE }, { RC_HC_SKULLTULA_TREE, RAND_INF_HC_SKULLTULA_TREE },
{ RC_HC_GROTTO_TREE, RAND_INF_HC_GROTTO_TREE }, { RC_HC_GROTTO_TREE, RAND_INF_HC_GROTTO_TREE },
{ RC_HC_NL_TREE_1, RAND_INF_HC_NL_TREE_1 },
{ RC_HC_NL_TREE_2, RAND_INF_HC_NL_TREE_2 },
{ RC_HF_NEAR_KAK_TREE, RAND_INF_HF_NEAR_KAK_TREE }, { RC_HF_NEAR_KAK_TREE, RAND_INF_HF_NEAR_KAK_TREE },
{ RC_HF_NEAR_KAK_SMALL_TREE, RAND_INF_HF_NEAR_KAK_SMALL_TREE }, { RC_HF_NEAR_KAK_SMALL_TREE, RAND_INF_HF_NEAR_KAK_SMALL_TREE },
{ RC_HF_TREE_NEAR_HC_GROTTO_1, RAND_INF_HF_TREE_NEAR_HC_GROTTO_1 }, { RC_HF_NEAR_MARKET_TREE_1, RAND_INF_HF_NEAR_MARKET_TREE_1 },
{ RC_HF_TREE_NEAR_HC_GROTTO_2, RAND_INF_HF_TREE_NEAR_HC_GROTTO_2 }, { RC_HF_NEAR_MARKET_TREE_2, RAND_INF_HF_NEAR_MARKET_TREE_2 },
{ RC_HF_TREE_NEAR_HC_GROTTO_3, RAND_INF_HF_TREE_NEAR_HC_GROTTO_3 }, { RC_HF_NEAR_MARKET_TREE_3, RAND_INF_HF_NEAR_MARKET_TREE_3 },
{ RC_HF_NEAR_LLR_TREE, RAND_INF_HF_NEAR_LLR_TREE }, { RC_HF_NEAR_LLR_TREE, RAND_INF_HF_NEAR_LLR_TREE },
{ RC_HF_NEAR_LH_TREE, RAND_INF_HF_NEAR_LH_TREE }, { RC_HF_NEAR_LH_TREE, RAND_INF_HF_NEAR_LH_TREE },
{ RC_HF_CHILD_NEAR_GV_TREE, RAND_INF_HF_CHILD_NEAR_GV_TREE }, { RC_HF_CHILD_NEAR_GV_TREE, RAND_INF_HF_CHILD_NEAR_GV_TREE },
@ -3752,6 +3754,10 @@ TreeIdentity Randomizer::IdentifyTree(s32 sceneNum, s32 posX, s32 posZ) {
s32 actorParams = TWO_ACTOR_PARAMS(posX + x, posZ + z); s32 actorParams = TWO_ACTOR_PARAMS(posX + x, posZ + z);
Rando::Location* location = GetCheckObjectFromActor(ACTOR_EN_WOOD02, sceneNum, actorParams); Rando::Location* location = GetCheckObjectFromActor(ACTOR_EN_WOOD02, sceneNum, actorParams);
if (location->GetRandomizerCheck() != RC_UNKNOWN_CHECK) { if (location->GetRandomizerCheck() != RC_UNKNOWN_CHECK) {
if (location->GetRCType() == RCTYPE_NLTREE &&
CVarGetInteger(CVAR_RANDOMIZER_SETTING("LogicRules"), RO_LOGIC_GLITCHLESS) != RO_LOGIC_NO_LOGIC) {
break;
}
treeIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; treeIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()];
treeIdentity.randomizerCheck = location->GetRandomizerCheck(); treeIdentity.randomizerCheck = location->GetRandomizerCheck();
return treeIdentity; return treeIdentity;

View file

@ -300,6 +300,7 @@ typedef enum {
RCTYPE_NLCRATE, // NL Crates RCTYPE_NLCRATE, // NL Crates
RCTYPE_SMALL_CRATE, // Small crates RCTYPE_SMALL_CRATE, // Small crates
RCTYPE_TREE, // Trees RCTYPE_TREE, // Trees
RCTYPE_NLTREE, // NL Trees
RCTYPE_DUNGEON_REWARD, // Dungeon rewards (blue warps) RCTYPE_DUNGEON_REWARD, // Dungeon rewards (blue warps)
RCTYPE_OCARINA, // Ocarina locations RCTYPE_OCARINA, // Ocarina locations
RCTYPE_BEEHIVE, // Beehives RCTYPE_BEEHIVE, // Beehives
@ -2656,6 +2657,8 @@ typedef enum {
RC_HC_NEAR_GUARDS_TREE_6, RC_HC_NEAR_GUARDS_TREE_6,
RC_HC_SKULLTULA_TREE, RC_HC_SKULLTULA_TREE,
RC_HC_GROTTO_TREE, RC_HC_GROTTO_TREE,
RC_HC_NL_TREE_1,
RC_HC_NL_TREE_2,
RC_HF_NEAR_LLR_TREE, RC_HF_NEAR_LLR_TREE,
RC_HF_NEAR_LH_TREE, RC_HF_NEAR_LH_TREE,
RC_HF_CHILD_NEAR_GV_TREE, RC_HF_CHILD_NEAR_GV_TREE,
@ -2663,9 +2666,9 @@ typedef enum {
RC_HF_NEAR_ZR_TREE, RC_HF_NEAR_ZR_TREE,
RC_HF_NEAR_KAK_TREE, RC_HF_NEAR_KAK_TREE,
RC_HF_NEAR_KAK_SMALL_TREE, RC_HF_NEAR_KAK_SMALL_TREE,
RC_HF_TREE_NEAR_HC_GROTTO_1, RC_HF_NEAR_MARKET_TREE_1,
RC_HF_TREE_NEAR_HC_GROTTO_2, RC_HF_NEAR_MARKET_TREE_2,
RC_HF_TREE_NEAR_HC_GROTTO_3, RC_HF_NEAR_MARKET_TREE_3,
RC_HF_NORTHWEST_TREE_1, RC_HF_NORTHWEST_TREE_1,
RC_HF_NORTHWEST_TREE_2, RC_HF_NORTHWEST_TREE_2,
RC_HF_NORTHWEST_TREE_3, RC_HF_NORTHWEST_TREE_3,

View file

@ -191,6 +191,8 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() {
CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_GENERIC_NO)) && CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_GENERIC_NO)) &&
(location.GetRCType() != RCTYPE_TREE || (location.GetRCType() != RCTYPE_TREE ||
CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleTrees"), RO_GENERIC_NO)) && CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleTrees"), RO_GENERIC_NO)) &&
(location.GetRCType() != RCTYPE_NLTREE ||
CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleTrees"), RO_GENERIC_NO)) &&
(location.GetRCType() != RCTYPE_FISH || (location.GetRCType() != RCTYPE_FISH ||
ctx->GetFishsanity()->GetFishLocationIncluded(&location, FSO_SOURCE_CVARS)) && ctx->GetFishsanity()->GetFishLocationIncluded(&location, FSO_SOURCE_CVARS)) &&
(location.GetRCType() != RCTYPE_ADULT_TRADE || (location.GetRCType() != RCTYPE_ADULT_TRADE ||

View file

@ -1533,69 +1533,74 @@ bool IsCheckShuffled(RandomizerCheck rc) {
auto identity = OTRGlobals::Instance->gRandomizer->IdentifyShopItem(loc->GetScene(), loc->GetActorParams() + 1); auto identity = OTRGlobals::Instance->gRandomizer->IdentifyShopItem(loc->GetScene(), loc->GetActorParams() + 1);
} }
if (IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOGIC_RULES) != RO_LOGIC_VANILLA) { if (IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOGIC_RULES) != RO_LOGIC_VANILLA) {
return (loc->GetArea() != RCAREA_INVALID) && // don't show Invalid locations return (loc->GetArea() != RCAREA_INVALID) && // don't show Invalid locations
(loc->GetRCType() != RCTYPE_GOSSIP_STONE) && // TODO: Don't show hints until tracker supports them (loc->GetRCType() != RCTYPE_GOSSIP_STONE) && // TODO: Don't show hints until tracker supports them
(loc->GetRCType() != RCTYPE_STATIC_HINT) && // TODO: Don't show hints until tracker supports them (loc->GetRCType() != RCTYPE_STATIC_HINT) && // TODO: Don't show hints until tracker supports them
(loc->GetRCType() != (loc->GetRCType() != RCTYPE_CHEST_GAME) && // don't show non final reward chest game checks until we
RCTYPE_CHEST_GAME) && // don't show non final reward chest game checks until we support shuffling them // support shuffling them
(rc != RC_HC_ZELDAS_LETTER) && // don't show zeldas letter until we support shuffling it (rc != RC_HC_ZELDAS_LETTER) && // don't show zeldas letter until we support shuffling it
(rc != RC_LINKS_POCKET || showLinksPocket) && (rc != RC_LINKS_POCKET || showLinksPocket) &&
OTRGlobals::Instance->gRandoContext->IsQuestOfLocationActive(rc) && OTRGlobals::Instance->gRandoContext->IsQuestOfLocationActive(rc) &&
(loc->GetRCType() != RCTYPE_SHOP || (loc->GetRCType() != RCTYPE_SHOP ||
(showShops && (showShops &&
OTRGlobals::Instance->gRandomizer->IdentifyShopItem(loc->GetScene(), loc->GetActorParams() + 1) OTRGlobals::Instance->gRandomizer->IdentifyShopItem(loc->GetScene(), loc->GetActorParams() + 1)
.enGirlAShopItem == 50)) && .enGirlAShopItem == 50)) &&
(rc != RC_TRIFORCE_COMPLETED) && (rc != RC_GANON) && (rc != RC_TRIFORCE_COMPLETED) && (rc != RC_GANON) &&
(loc->GetRCType() != RCTYPE_SCRUB || showScrubs || (loc->GetRCType() != RCTYPE_SCRUB || showScrubs ||
(showMajorScrubs && (rc == RC_LW_DEKU_SCRUB_NEAR_BRIDGE || // The 3 scrubs that are always randomized (showMajorScrubs &&
rc == RC_HF_DEKU_SCRUB_GROTTO || rc == RC_LW_DEKU_SCRUB_GROTTO_FRONT))) && (rc == RC_LW_DEKU_SCRUB_NEAR_BRIDGE || // The 3 scrubs that are always randomized
(loc->GetRCType() != RCTYPE_MERCHANT || showMerchants) && rc == RC_HF_DEKU_SCRUB_GROTTO || rc == RC_LW_DEKU_SCRUB_GROTTO_FRONT))) &&
(loc->GetRCType() != RCTYPE_SONG_LOCATION || showSongs) && (loc->GetRCType() != RCTYPE_MERCHANT || showMerchants) &&
(loc->GetRCType() != RCTYPE_BEEHIVE || showBeehives) && (loc->GetRCType() != RCTYPE_SONG_LOCATION || showSongs) &&
(loc->GetRCType() != RCTYPE_OCARINA || showOcarinas) && (loc->GetRCType() != RCTYPE_BEEHIVE || showBeehives) &&
(loc->GetRCType() != RCTYPE_SKULL_TOKEN || alwaysShowGS || (loc->GetRCType() != RCTYPE_OCARINA || showOcarinas) &&
(showOverworldTokens && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || (loc->GetRCType() != RCTYPE_SKULL_TOKEN || alwaysShowGS ||
(showDungeonTokens && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && (showOverworldTokens && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) ||
(loc->GetRCType() != RCTYPE_POT || (showDungeonTokens && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) &&
(showOverworldPots && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || (loc->GetRCType() != RCTYPE_POT ||
(showDungeonPots && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && (showOverworldPots && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) ||
(loc->GetRCType() != RCTYPE_GRASS || (showDungeonPots && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) &&
(showOverworldGrass && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || (loc->GetRCType() != RCTYPE_GRASS ||
(showDungeonGrass && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && (showOverworldGrass && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) ||
(loc->GetRCType() != RCTYPE_CRATE || (showDungeonGrass && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) &&
(showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || (loc->GetRCType() != RCTYPE_CRATE ||
(showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && (showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) ||
(loc->GetRCType() != RCTYPE_NLCRATE || (showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) &&
(showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea()) && (loc->GetRCType() != RCTYPE_NLCRATE ||
OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOGIC_RULES) == RO_LOGIC_NO_LOGIC) || (showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea()) &&
(showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOGIC_RULES) == RO_LOGIC_NO_LOGIC) ||
(loc->GetRCType() != RCTYPE_SMALL_CRATE || (showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) &&
(showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || (loc->GetRCType() != RCTYPE_SMALL_CRATE ||
(showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && (showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) ||
(loc->GetRCType() != RCTYPE_TREE || showTrees) && (loc->GetRCType() != RCTYPE_COW || showCows) && (showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) &&
(loc->GetRCType() != RCTYPE_TREE || showTrees) && (loc->GetRCType() != RCTYPE_COW || showCows) &&
(loc->GetRCType() != RCTYPE_NLTREE ||
(showTrees &&
OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOGIC_RULES) == RO_LOGIC_NO_LOGIC)) ||
(loc->GetRCType() != RCTYPE_FISH || (loc->GetRCType() != RCTYPE_FISH ||
OTRGlobals::Instance->gRandoContext->GetFishsanity()->GetFishLocationIncluded(loc)) && OTRGlobals::Instance->gRandoContext->GetFishsanity()->GetFishLocationIncluded(loc)) &&
(loc->GetRCType() != RCTYPE_FREESTANDING || (loc->GetRCType() != RCTYPE_FREESTANDING ||
(showOverworldFreestanding && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || (showOverworldFreestanding && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) ||
(showDungeonFreestanding && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && (showDungeonFreestanding && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) &&
(loc->GetRCType() != RCTYPE_ADULT_TRADE || showAdultTrade || (loc->GetRCType() != RCTYPE_ADULT_TRADE || showAdultTrade ||
rc == RC_KAK_ANJU_AS_ADULT || // adult trade checks that are always shuffled rc == RC_KAK_ANJU_AS_ADULT || // adult trade checks that are always shuffled
rc == RC_DMT_TRADE_CLAIM_CHECK // even when shuffle adult trade is off rc == RC_DMT_TRADE_CLAIM_CHECK // even when shuffle adult trade is off
) && ) &&
(rc != RC_KF_KOKIRI_SWORD_CHEST || showKokiriSword) && (rc != RC_TOT_MASTER_SWORD || showMasterSword) && (rc != RC_KF_KOKIRI_SWORD_CHEST || showKokiriSword) &&
(rc != RC_LH_HYRULE_LOACH || showHyruleLoach) && (rc != RC_ZR_MAGIC_BEAN_SALESMAN || showBeans) && (rc != RC_TOT_MASTER_SWORD || showMasterSword) && (rc != RC_LH_HYRULE_LOACH || showHyruleLoach) &&
(rc != RC_HC_MALON_EGG || showWeirdEgg) && (rc != RC_ZR_MAGIC_BEAN_SALESMAN || showBeans) && (rc != RC_HC_MALON_EGG || showWeirdEgg) &&
(loc->GetRCType() != RCTYPE_FROG_SONG || showFrogSongRupees) && (loc->GetRCType() != RCTYPE_FROG_SONG || showFrogSongRupees) &&
((loc->GetRCType() != RCTYPE_MAP && loc->GetRCType() != RCTYPE_COMPASS) || showStartingMapsCompasses) && ((loc->GetRCType() != RCTYPE_MAP && loc->GetRCType() != RCTYPE_COMPASS) ||
(loc->GetRCType() != RCTYPE_FAIRY || showFairies) && showStartingMapsCompasses) &&
(loc->GetRCType() != RCTYPE_SMALL_KEY || showKeysanity) && (loc->GetRCType() != RCTYPE_FAIRY || showFairies) &&
(loc->GetRCType() != RCTYPE_BOSS_KEY || showBossKeysanity) && (loc->GetRCType() != RCTYPE_SMALL_KEY || showKeysanity) &&
(loc->GetRCType() != RCTYPE_GANON_BOSS_KEY || showGanonBossKey) && (loc->GetRCType() != RCTYPE_BOSS_KEY || showBossKeysanity) &&
(rc != RC_KAK_100_GOLD_SKULLTULA_REWARD || show100SkullReward) && (loc->GetRCType() != RCTYPE_GANON_BOSS_KEY || showGanonBossKey) &&
(loc->GetRCType() != RCTYPE_GF_KEY && rc != RC_TH_FREED_CARPENTERS || (rc != RC_KAK_100_GOLD_SKULLTULA_REWARD || show100SkullReward) &&
(showGerudoCard && rc == RC_TH_FREED_CARPENTERS) || (loc->GetRCType() != RCTYPE_GF_KEY && rc != RC_TH_FREED_CARPENTERS ||
(fortressNormal && showGerudoFortressKeys && loc->GetRCType() == RCTYPE_GF_KEY) || (showGerudoCard && rc == RC_TH_FREED_CARPENTERS) ||
(fortressFast && showGerudoFortressKeys && rc == RC_TH_1_TORCH_CARPENTER)); (fortressNormal && showGerudoFortressKeys && loc->GetRCType() == RCTYPE_GF_KEY) ||
(fortressFast && showGerudoFortressKeys && rc == RC_TH_1_TORCH_CARPENTER));
} else if (loc->IsVanillaCompletion()) { } else if (loc->IsVanillaCompletion()) {
return (OTRGlobals::Instance->gRandoContext->IsQuestOfLocationActive(rc) || rc == RC_GIFT_FROM_RAURU) && return (OTRGlobals::Instance->gRandoContext->IsQuestOfLocationActive(rc) || rc == RC_GIFT_FROM_RAURU) &&
rc != RC_LINKS_POCKET; rc != RC_LINKS_POCKET;

View file

@ -1006,6 +1006,8 @@ DEFINE_RAND_INF(RAND_INF_HC_NEAR_GUARDS_TREE_5)
DEFINE_RAND_INF(RAND_INF_HC_NEAR_GUARDS_TREE_6) DEFINE_RAND_INF(RAND_INF_HC_NEAR_GUARDS_TREE_6)
DEFINE_RAND_INF(RAND_INF_HC_SKULLTULA_TREE) DEFINE_RAND_INF(RAND_INF_HC_SKULLTULA_TREE)
DEFINE_RAND_INF(RAND_INF_HC_GROTTO_TREE) DEFINE_RAND_INF(RAND_INF_HC_GROTTO_TREE)
DEFINE_RAND_INF(RAND_INF_HC_NL_TREE_1)
DEFINE_RAND_INF(RAND_INF_HC_NL_TREE_2)
DEFINE_RAND_INF(RAND_INF_HF_NEAR_LLR_TREE) DEFINE_RAND_INF(RAND_INF_HF_NEAR_LLR_TREE)
DEFINE_RAND_INF(RAND_INF_HF_NEAR_LH_TREE) DEFINE_RAND_INF(RAND_INF_HF_NEAR_LH_TREE)
DEFINE_RAND_INF(RAND_INF_HF_CHILD_NEAR_GV_TREE) DEFINE_RAND_INF(RAND_INF_HF_CHILD_NEAR_GV_TREE)
@ -1013,9 +1015,9 @@ DEFINE_RAND_INF(RAND_INF_HF_ADULT_NEAR_GV_TREE)
DEFINE_RAND_INF(RAND_INF_HF_NEAR_ZR_TREE) DEFINE_RAND_INF(RAND_INF_HF_NEAR_ZR_TREE)
DEFINE_RAND_INF(RAND_INF_HF_NEAR_KAK_TREE) DEFINE_RAND_INF(RAND_INF_HF_NEAR_KAK_TREE)
DEFINE_RAND_INF(RAND_INF_HF_NEAR_KAK_SMALL_TREE) DEFINE_RAND_INF(RAND_INF_HF_NEAR_KAK_SMALL_TREE)
DEFINE_RAND_INF(RAND_INF_HF_TREE_NEAR_HC_GROTTO_1) DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_TREE_1)
DEFINE_RAND_INF(RAND_INF_HF_TREE_NEAR_HC_GROTTO_2) DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_TREE_2)
DEFINE_RAND_INF(RAND_INF_HF_TREE_NEAR_HC_GROTTO_3) DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_TREE_3)
DEFINE_RAND_INF(RAND_INF_HF_NORTHWEST_TREE_1) DEFINE_RAND_INF(RAND_INF_HF_NORTHWEST_TREE_1)
DEFINE_RAND_INF(RAND_INF_HF_NORTHWEST_TREE_2) DEFINE_RAND_INF(RAND_INF_HF_NORTHWEST_TREE_2)
DEFINE_RAND_INF(RAND_INF_HF_NORTHWEST_TREE_3) DEFINE_RAND_INF(RAND_INF_HF_NORTHWEST_TREE_3)