diff --git a/mods/randomizer/generator/data/entrance_shuffle_data.yaml b/mods/randomizer/generator/data/entrance_shuffle_data.yaml index 510bbbb3fc..6dc3fac36a 100644 --- a/mods/randomizer/generator/data/entrance_shuffle_data.yaml +++ b/mods/randomizer/generator/data/entrance_shuffle_data.yaml @@ -2122,7 +2122,7 @@ Connection: Sacred Grove Lower -> Lost Woods Lower Battle Arena Alias: Sacred Grove -> Lost Woods Lower Battle Arena Stage: 54 - Room: 1 + Room: 3 Spawn: 1 Spawn Type: "50" Parameters: "F01F" @@ -2157,7 +2157,7 @@ Spawn: 0 Spawn Type: "00" Parameters: "F012" - State: 2 + State: -1 Return: Connection: Sacred Grove Past -> Sacred Grove Upper Alias: Sacred Grove Past -> Sacred Grove @@ -2166,7 +2166,7 @@ Spawn: 5 Spawn Type: "10" Parameters: "F032" - State: 2 + State: -1 - Type: Overworld Forward: diff --git a/mods/randomizer/src/hooks.cpp b/mods/randomizer/src/hooks.cpp index 82102caa7f..b89c3c7ab7 100644 --- a/mods/randomizer/src/hooks.cpp +++ b/mods/randomizer/src/hooks.cpp @@ -658,7 +658,8 @@ HookAction hookPreSetNextStage(ModContext*, void* args, void*, void*) { mods::arg_ref(args, 0), mods::arg_ref(args, 2), mods::arg_ref(args, 1), - mods::arg_ref(args, 3) + mods::arg_ref(args, 3), + mods::arg_ref(args, 5) ); return HOOK_CONTINUE; } diff --git a/mods/randomizer/src/randomizer_context.cpp b/mods/randomizer/src/randomizer_context.cpp index 3165436437..2b3df256be 100644 --- a/mods/randomizer/src/randomizer_context.cpp +++ b/mods/randomizer/src/randomizer_context.cpp @@ -861,7 +861,7 @@ int randomizer_getItemAtLocation(const std::string& locationName) { return randomizer_GetContext().mItemLocations[nameLookupOverride(locationName)].itemId; } -void randomizer_checkAndOverrideEntranceData(const char*& stageName, s8& roomNo, s16& pointNo, s8& mapLayer) { +void randomizer_checkAndOverrideEntranceData(const char*& stageName, s8& roomNo, s16& pointNo, s8& mapLayer, u32& lastMode) { RandomizerContext::EntranceOverride override = { .stageId = static_cast(getStageID(stageName)), .roomNo = roomNo, .mapLayer = mapLayer, .pointNo = static_cast(pointNo)}; @@ -871,12 +871,28 @@ void randomizer_checkAndOverrideEntranceData(const char*& stageName, s8& roomNo, // } // mods::log::info("Original Stage:{}, {}, {}, {}",stageName,roomNo,pointNo,mapLayer); - if (randomizer_GetContext().mEntranceOverrides.contains(override)) { - auto& newOverride = randomizer_GetContext().mEntranceOverrides[override]; + + auto it = randomizer_GetContext().mEntranceOverrides.find(override); + if (it == randomizer_GetContext().mEntranceOverrides.end()) { + // If the specific layer specified isn't found, search the overrides again for layer -1 + // This is used to resolve issues where a transition (like the door to the past) requests + // A specific layer to load + override.mapLayer = -1; + it = randomizer_GetContext().mEntranceOverrides.find(override); + } + + if (it != randomizer_GetContext().mEntranceOverrides.end()) { + const auto& newOverride = it->second; stageName = allStages[newOverride.stageId]; pointNo = newOverride.pointNo; roomNo = newOverride.roomNo; mapLayer = newOverride.mapLayer; + + // Override the lastSceneMode if we are coming from a wolf dig hole + if ((lastMode&0xF) == 9) { + lastMode = (lastMode&0xFFFFFFF0); + } + // mods::log::info("New Stage:{}, {}, {}, {}",stageName,roomNo,pointNo,mapLayer); } } diff --git a/mods/randomizer/src/randomizer_context.hpp b/mods/randomizer/src/randomizer_context.hpp index 7e789a500c..3f129df0b5 100644 --- a/mods/randomizer/src/randomizer_context.hpp +++ b/mods/randomizer/src/randomizer_context.hpp @@ -229,7 +229,7 @@ int randomizer_getItemAtLocation(const std::string& locationName); * @brief Overrides the given entrance paramaters if an override exists for them */ void randomizer_checkAndOverrideEntranceData( - const char*& i_Name, s8& i_RoomNo, s16& i_Point, s8& i_Layer); + const char*& i_Name, s8& i_RoomNo, s16& i_Point, s8& i_Layer, u32& lastMode); /* * @brief Puts the associated flag into the randomizer state's temporary flag * variable. This allows the tracker/Archipelago to know a location has been checked