Skip to content

Shuffle Ganon Tower#5078

Merged
serprex merged 11 commits intoHarbourMasters:developfrom
Pepe20129:shuffle_ganon_tower
Jan 18, 2026
Merged

Shuffle Ganon Tower#5078
serprex merged 11 commits intoHarbourMasters:developfrom
Pepe20129:shuffle_ganon_tower

Conversation

@Pepe20129
Copy link
Contributor

@Pepe20129 Pepe20129 commented Feb 16, 2025

Also fixes an issue where logic would think that tower back to castle always lead to the vanilla version.

Build Artifacts

@serprex
Copy link
Contributor

serprex commented Mar 13, 2025

@Malkierian would it be easier to get the fix here merged if @Pepe20129 split out the logic fixes from the shuffle?

@Malkierian
Copy link
Contributor

All open shuffles are currently on hold until post 9.0.0, but it would be greatly appreciated to have all logic fixes pushed separately.

@Pepe20129
Copy link
Contributor Author

Moved logic fixes to #5115

@Pepper0ni
Copy link
Contributor

A blue warp in the ganon's tower entrance places the player back in ganons castle instead of checking where the start of the dungeon is.

@Pepe20129
Copy link
Contributor Author

I'm not sure how the blue warp handling works, there's 3 lists in entrance.cpp and all of them require the dungeon to have a vanilla blue warp as far as I understand.

@Malkierian
Copy link
Contributor

We don't even have a GT blue warp documented, I couldn't find it in the entrance table.

@Pepe20129
Copy link
Contributor Author

That's because ganon tower doesn't have a blue warp.

@Malkierian
Copy link
Contributor

Then I must be misunderstanding the problem.

@Pepe20129
Copy link
Contributor Author

I think that the problem is that if a boss room gets randomizer into ganon tower, the blue warp in that boss room will lead to outside ganon's castle instead of outside of the place that got randomizer to lead to ganon's castle.

@Malkierian
Copy link
Contributor

@Pepper0ni You wouldn't happen to have quick steps to reproduce or the save or spoiler that demonstrated this to use, would you?

@Pepper0ni
Copy link
Contributor

Probably not and if I do it was is buried in a huge mess of things in my recycle bin. I think i saw some blue warp issue get fixed soon after the fact as well which may have been the real source. I can look to reproduce though, it shouldn't be hard assuming it wasn't actually fixed.

@Malkierian
Copy link
Contributor

I mean, we do still have repeat blue warp usage taking people back to vanilla locations rather than the boss's shuffled parent region, so it's not like blue warps are fully functional yet otherwise.

@Pepper0ni
Copy link
Contributor

Probably not and if I do it was is buried in a huge mess of things in my recycle bin. I think i saw some blue warp issue get fixed soon after the fact as well which may have been the real source. I can look to reproduce though, it shouldn't be hard assuming it wasn't actually fixed.

Issue still exists, it is probably because the boss exit hasn't been declared in entrances.cpp

@serprex
Copy link
Contributor

serprex commented Jun 29, 2025

#5628 has entrance data for reference

@Pepe20129
Copy link
Contributor Author

I think I have fixed the issues with the blue warps.

@serprex
Copy link
Contributor

serprex commented Oct 4, 2025

tried to roll a seed,

[14:24:34.862] [entrance.cpp:1598] [debug] Setting Ganondorf's Lair -> Ganon's Tower Floor 1

[14:24:39.136] [CrashHandler.cpp:72] [critical] Signal: 11
INVALID ACCESS TO STORAGE
Registers:
RAX: 0x0000000000000000
RDI: 0x0000000000000000
RSI: 0x00007F48A8FF7B08
RDX: 0x0000000200000002
RCX: 0xF613F7505A1AC000
R8:  0x0000564BC28A3828
R9:  0x0000000000000000
R10: 0x0000000000000000
R11: 0x00007F48FC24B000
RSP: 0x00007F48A8FF7B80
RBX: 0x0000564BC8A3F370
RBP: 0x00007F48A8FF7B80
R12: 0x00007F48A8FFB6C0
R13: 0x00007FFD550EAD30
R14: 0x00007F48A8FFBCE4
R15: 0x00007FFD550EAE37
RIP: 0x0000564BA1741CDC
EFL: 0x0000000000210202
Traceback:
1 /usr/lib/libc.so.6(+0x3e540) [0x7f48fb23e540]
2 Rando::Entrance::GetIndex() const (+0xC)
3 Rando::EntranceShuffler::CreateEntranceOverrides() (+0x3FB)
4 Fill() (+0x19C5)
5 Playthrough::Playthrough_Init(unsigned int, std::set<RandomizerCheck, std::less<RandomizerCheck>, std::allocator<RandomizerCheck> >, std::set<RandomizerTrick, std::less<RandomizerTrick>, std::allocator<RandomizerTrick> >) (+0x767)
6 GenerateRandomizer(std::set<RandomizerCheck, std::less<RandomizerCheck>, std::allocator<RandomizerCheck> >, std::set<RandomizerTrick, std::less<RandomizerTrick>, std::allocator<RandomizerTrick> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) (+0x3E9)
7 RandoMain::GenerateRando(std::set<RandomizerCheck, std::less<RandomizerCheck>, std::allocator<RandomizerCheck> >, std::set<RandomizerTrick, std::less<RandomizerTrick>, std::allocator<RandomizerTrick> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) (+0xB5)
8 GenerateRandomizerImgui(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) (+0x72B)
9 void std::__invoke_impl<void, void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >), std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__invoke_other, void (*&&)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >), std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&) (+0x43)
10 std::__invoke_result<void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >), std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::type std::__invoke<void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >), std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(void (*&&)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >), std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&) (+0x1D)
11 void std::thread::_Invoker<std::tuple<void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >), std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::_M_invoke<0ul, 1ul>(std::_Index_tuple<0ul, 1ul>) (+0x32)
12 std::thread::_Invoker<std::tuple<void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >), std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::operator()() (+0x15)
13 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >), std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::_M_run() (+0x19)
14 /usr/lib/libstdc++.so.6(+0xe55a4) [0x7f48fb6e55a4]
15 /usr/lib/libc.so.6(+0x969cb) [0x7f48fb2969cb]
16 /usr/lib/libc.so.6(+0x11aa0c) [0x7f48fb31aa0c]
Build Information:
Game Version: Blair Foxtrot (9.0.5)
Git Branch: shuffle_ganon_tower
Git Commit: b721039
Build Date: Oct  4 2025 14:15:20

corrupted double-linked list

seems like bossExits / dungeonExits / bossRoomExitPairs needs to be extended. I took a stab at it, but afterwards entering Ganon's Tower warped me to the start of Death Mountain Trail somehow

Pepe20129 and others added 2 commits October 4, 2025 21:15
Co-authored-by: Philip Dubé <serprex@users.noreply.github.com>
@Pepe20129
Copy link
Contributor Author

I don't know what I should add in bossExits / dungeonExits / bossRoomExitPairs as the regular stuff doesn't apply (for example, there's no blue warp or even an equivalent boss -> outside entrance).

@Malkierian
Copy link
Contributor

I originally wrote this without understanding one critical thing: Is the transition from the lobby to the tower treated the same as a transition between a dungeon and a boss room elsewhere? That in itself might put a huge wrench in the whole process. Original message is below:


I believe, since savewarping in the tower takes you to the lower tower entrance, I can see most of what bossExits should be, the problem is that TOWER_ENTRYWAY leads both to vanilla and MQ IGC lobby, depending on which is enabled. Those would be where that is supposed to go, something like this:

// bossExits
            { EntranceNameByRegions(RR_GANONS_TOWER_GANONDORF_LAIR, RR_GANONS_TOWER_BEFORE_GANONDORF_LAIR),
              GetEntrance(RR_GANONS_TOWER_ENTRYWAY, RR_GANONS_CASTLE_LOBBY) },

The other two would be along these lines:

// dungeonExits
            { EntranceNameByRegions(RR_GANONS_TOWER_ENTRYWAY, RR_GANONS_CASTLE_LOBBY),
              GetEntrance(RR_GANONS_TOWER_GANONDORF_LAIR, RR_GANONS_CASTLE_LOBBY) },
// bossRoomExitPairs
            { GetEntrance(RR_GANONS_TOWER_GANONDORF_LAIR, RR_GANONS_TOWER_BEFORE_GANONDORF_LAIR),
              GetEntrance(RR_GANONS_TOWER_GANONDORF_LAIR, RR_GANONS_TOWER_ENTRYWAY) },

Of course, that would also be reliant on having the entrances properly paired in the entrance tracker stuff as well.

@serprex
Copy link
Contributor

serprex commented Oct 14, 2025

ENTRANCE_OVERRIDES_MAX_COUNT needs to be increased (I think by 3 just to be safe with new blue warp entrance)

@serprex
Copy link
Contributor

serprex commented Jan 18, 2026

updated with fixes, this now works with boss shuffle (entering boss from tower will have blue warp go to outside ganon's tower entrance)

@serprex
Copy link
Contributor

serprex commented Jan 18, 2026

A blue warp in the ganon's tower entrance places the player back in ganons castle instead of checking where the start of the dungeon is.

This seems fine to me

@serprex serprex requested a review from Pepper0ni January 18, 2026 22:30
@serprex
Copy link
Contributor

serprex commented Jan 18, 2026

talked with @Pepper0ni, their concerns are centered on dungeon chains / reverse entry. Problem manifests with ice cavern already, & will become particularly troublesome with doorsanity

fix to this is to track last overworld->dungeon entrance used in savefile, & give players option to either spawn at their last overworld/dungeon boundary, or at their overworld spawn location. out of scope here, I'll hopefully be able to try address it directly in its own PR soon as part of the 9.3 doorsanity effort

@serprex serprex merged commit f541c3f into HarbourMasters:develop Jan 18, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants