Skip to content

Split Gerudo Fortress#5099

Closed
Pepe20129 wants to merge 27 commits intoHarbourMasters:developfrom
Pepe20129:split_gerudo_fortress
Closed

Split Gerudo Fortress#5099
Pepe20129 wants to merge 27 commits intoHarbourMasters:developfrom
Pepe20129:split_gerudo_fortress

Conversation

@Pepe20129
Copy link
Contributor

@Pepe20129 Pepe20129 commented Feb 26, 2025

Splits the current RR_GERUDO_FORTRESS region into multiple regions in order to untangle logic.
The rooftops are named by color (included clarifying images).

Build Artifacts

Comment on lines +59 to +61
!soh/soh/Enhancements/randomizer/location_access/gerudo_fortress_regions.png
!soh/soh/Enhancements/randomizer/location_access/gerudo_fortress_regions_no_labels.png

Copy link
Contributor

@serprex serprex Feb 27, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
!soh/soh/Enhancements/randomizer/location_access/gerudo_fortress_regions.png
!soh/soh/Enhancements/randomizer/location_access/gerudo_fortress_regions_no_labels.png

think these paths are wrong given this is one level deep

@serprex
Copy link
Contributor

serprex commented Feb 27, 2025

-1 to basing names colors in arbitrary image

Some descriptive name suggestions:

  • Salmon: OUTSIDE_GTG
  • White: ABOVE_GTG
  • Purple: BELOW_VINES
  • Blue: ABOVE_VINES (or TOP_PLATFORM but ambiguous with chest platform)
  • Turquoise: CHEST_PLATFORM
  • Green: GS_DIP or GS_PLATFORM, not sure what to call green bit with door
  • Red: OUTSIDE_JAIL
  • Yellow: OUTSIDE_KITCHEN
  • Lime green: BELOW_CHEST
  • Magenta: BELOW_GS_DIP or BELOW_GS_PLATFORM
  • Orange: BEHIND_CRATES
  • Violet: can this not be combined with either ABOVE_VINES or BELOW_VINES? Looking at logic you seem to miss Blue->Violet being free. ISLAND_BELOW_VINES?
  • Cyan: DIP_BELOW_VINES
  • Grey: ABOVE_STAIRS

@Pepe20129
Copy link
Contributor Author

I'd also like to have actual names instead of colors but we haven't found a good set yet.
Regarding your suggestions:

  • BELOW_VINES, ABOVE_VINES & DIP_BELOW_VINES are ambiguous as there are 2 vines (one between purple & blue and one between lime & cyan)
  • GS_DIP & GS_PLATFORM only describe half of the green area, both spots/ledges are the same area.
  • OUTSIDE_KITCHEN should be OUTSIDE_BREAK_ROOM but is otherwise fine
  • BELOW_CHEST is ambiguous between yellow & lime green
  • BEHIND_CRATES is ambiguous between orange & grey depending on which crates (and depending on from which direction, it could also be red)
  • violet can't be combined with blue as violet->blue can only be done as adult (I did miss blue->violet, ty for that)
  • ISLAND_BELOW_VINES doesn't seem like a good name, not only because of the 2 vines, but also because naming it island is not very intuitive
  • OUTSIDE_JAIL is a little unintuitive due to the large height change but I think it's a fine name if we don't come up with anything better
  • The rest (OUTSIDE_GTG, ABOVE_GTG, CHEST_PLATFORM & ABOVE_STAIRS) are fine and I have no problems with them

@serprex
Copy link
Contributor

serprex commented Feb 27, 2025

Oh, wasn't sure about 2nd vines. But that helps even more, since names can be around LOWER_VINES & UPPER_VINES

@serprex
Copy link
Contributor

serprex commented Feb 27, 2025

Good: Salmon: OUTSIDE_GTG, White: ABOVE_GTG, Turquoise: CHEST_PLATFORM, Yellow: OUTSIDE_BREAK_AREA, Grey: ABOVE_STAIRS

Enough for now: Red: OUTSIDE_JAIL

Adjusted for vines:

  • Purple: BELOW_UPPER_VINES
  • Blue: ABOVE_UPPER_VINES
  • Lime green: BELOW_LOWER_VINES
  • Cyan: ABOVE_LOWER_VINES

Left: Green, Magenta, Orange, Violet

I'll try some more suggestions, but these 4 are rough

  • Orange: CRATE_ALCOVE
  • Purple: PLATFORM_IN_CORNER_BELOW_PLATFORM_ABOVE_UPPER_VINES, PLATFORM_ACROSS_FROM_PLATFORM_BELOW_UPPER_VINES (the adult/child distinction from Violet only matters to logic if the player can't climb to blue, ie in the future when Shuffle Climb is a thing)
  • Magenta: not sure, may clear up once name for Green is settled on
  • Green: HIGHEST_DOOR_AND_BELOW_GS

(edit: also overlooked Lime Green, maybe LONG_PLATFORM_BELOW_CHEST)

@Pepe20129
Copy link
Contributor Author

I think that BELOW_UPPER_VINES, ABOVE_UPPER_VINES, BELOW_LOWER_VINES & ABOVE_LOWER_VINES are good names.
CRATE_ALCOVE is fine for now (maybe CRATE_GROUND_ALCOVE?).
The other ones do need more work but I don't think there are any good short descriptive names for them.

@Pepper0ni
Copy link
Contributor

Pepper0ni commented Mar 14, 2025

Wading into the name discussion:

  • CHEST_ROOF makes sense for turqoise, as these are all rooves not platforms.
  • I would personally save myself the trouble of naming lime green and and gray by simply not declaring them, both have nothing of note and only act as transition to other areas. While I can see why you'd add them to better match the area, I can't help but see simplifying the entrance map being important when it's this messy. Ad advantage of this if you can name orange something like LOWER_CENTER
  • For red, having it as BELOW_WINDOW is an option, there's enough jails in this area that I don't want to call a specific jail jail. Alternativly it would be something like WEST_GROUND
  • BELOW_CHEST could also work for yellow, avoiding referncing a vanilla destination.
  • TOP_OF and BOTTOM_OF might be better than above/below for vines
  • Violet could be SLOPED_ROOF as it's the only obviously slanted section
  • Green could simply be NEAR_GS, though the existence of target GS is annoying for this. Otherwise it's comething like BETWEEN_ROOVES. This would make magenta into BELOW_GS

I Relabled the image for these changes
GF labls

Copy link
Contributor

@Pepper0ni Pepper0ni left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Couple of small things, will give a deeper review later

Copy link
Contributor

@Pepper0ni Pepper0ni left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A more in-depth review of the logic and some cleanups.

Entrance(RR_GF_GROUND_GREY, []{return true;}),
});

areaTable[RR_GF_GROUND_RED] = Region("GF Ground Red", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, {}, {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there any reason not to merge red with RR_GF_GROUND_BOTTOM? this would actually be a nice solution for what to name red.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RR_GF_GROUND_RED could be merged with RR_GF_GROUND_BOTTOM but RR_GF_GROUND_BOTTOM as a name doesn't really fit for both areas combined.

Entrance(RR_GERUDO_TRAINING_GROUND_LOBBY, []{return ctx->GetDungeon(GERUDO_TRAINING_GROUND)->IsVanilla();}),
Entrance(RR_GERUDO_TRAINING_GROUND_MQ_LOBBY, []{return ctx->GetDungeon(GERUDO_TRAINING_GROUND)->IsMQ();}),
Entrance(RR_GERUDO_FORTRESS, []{return true;}),
Entrance(RR_GF_GROUND_BOTTOM, []{return true;}),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm pretty sure this is already the case, but getting caught always gives access to GROUND_BOTTOM right?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure on how exactly getting caught is handled in every case as iirc it puts you in different places depending on if you have hookshot or not and on if ER is enabled or not

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's probably worth doing a quick testing sweep and noting them down in a comment, as coming out of GTG without gcard gets you instantly caught.

Entrance(RR_TH_KITCHEN_MAIN, []{return logic->CanPassEnemy(RE_GERUDO_GUARD) || ctx->GetTrickOption(RT_GF_KITCHEN);}),
});

areaTable[RR_TH_KITCHEN_MAIN] = Region("Thieves Hideout Kitchen Bottom", "Thieves Hideout", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what I think about this kitchen layout, while it functions just fine it's not how I previously handled areas where merely existing in them requires an item.

How I handled it before was that the offending item is checked on entry, and then I mark the area as "Assuming this thing", figuring it is marginally more efficient (less looping checks for that thing) and less cluttered in the logic. That being said it would force RR_TH_KITCHEN_TOP to be split if done here and is probably worse for reading the check's logic in the check tracker so there are upsides of this approach.

Regardless of what we do here, we should probably come up with a general policy, even if that policy is doing things case by case (Goron tunic checks in fire were the main reason I had for doing it my way, as there would be a lot of them repeated in the temple otherwise.)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

note a general policy with assumptions can't cross doors after #5105 (even thinking how to adjust fire timer by marking hot rooms & hot rooms would say how long it takes to get from entrance A to B, & logic would chain those times together)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That makes sense, then this kitchen layout is fine.

I did theorise a system for timer tracking between areas which would solve that fire temple problem, but it's not a small thing and was originally thought up to handle adult trade quest routes in entrance rando, so may need some adaption.

return GetSmallKeyCount(SCENE_TREASURE_BOX_SHOP) >= requiredAmountGlitchless;

case RR_GERUDO_FORTRESS:
case RR_GF_GROUND_BOTTOM:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably out of scope, but this should really take an area instead of a region.

@Pepper0ni
Copy link
Contributor

Another name idea for ORANGE would be NEAR_GROTTO

@Pepe20129
Copy link
Contributor Author

Renamed all regions except RR_GF_GROUND_RED, RR_GF_GROUND_GREY, RR_GF_ROOFTOP_YELLOW & RR_GF_ROOFTOP_LIMEGREEN.
"Below Chest" is ambiguous between RR_GF_ROOFTOP_YELLOW & RR_GF_ROOFTOP_LIMEGREEN, that's why I didn't use it.


areaTable[RR_GF_GROUND_RED] = Region("GF Ground Red", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, {}, {
//Exits
Entrance(RR_TH_NORTH_F1_CARPENTER_AREA, []{return true;}),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can reach upper vines with long shot

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So you saw the same zfg stream I did That shot was from salmon not red.

Copy link
Contributor

@serprex serprex Mar 22, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I even looked at map color, this is part of trouble with color coding. Still, applies to RR_GF_GROUND_OUTSIDE_GTG. Requires Gerudo Card

It'd be good to review hookshot access here in general. It's particularly important for Shuffle Climb

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Went & checked around, from what I could see only other useful case is long shot can go from crate alcove to lower vines

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added the connections.

@serprex serprex mentioned this pull request Mar 22, 2025
Copy link
Contributor

@Pepper0ni Pepper0ni left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

did a pass over the logic, found a bunch of issues and am giving ideas for better carpenter names which seem to be desperately needed.

Entrance(RR_GF_HBA_RANGE, []{return logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD);}),
Entrance(RR_GF_GROUND_BOTTOM, []{return true;}),
Entrance(RR_GF_ROOFTOP_ABOVE_GTG, []{return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD);}),
Entrance(RR_GF_ROOFTOP_TOP_OF_UPPER_VINES, []{return logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->CanUse(RG_LONGSHOT);}),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To prepare for equip swap, this should have IsChild as an OR to gcard

areaTable[RR_GF_GROUND_RED] = Region("GF Ground Red", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, {}, {
//Exits
Entrance(RR_TH_NORTH_F1_CARPENTER_AREA, []{return true;}),
Entrance(RR_GF_GROUND_GREY, []{return true;}),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can longshot from here to the jail windowsill, and from there jump to Yellow. It is also possible to reach Lime-Green from windowsill with a hovers backwalk into backflip but that's a trick.

The logical issue here is that it's possible to get onto the windowsill with only a hookshot, but only from jail, and there's no way to get thrown in jail if you have a g-card. The fix for this is likely some rando feature to get arrested while having the g-card, until then we cannot logically include jail + hookshot as a way to windowsill.

// 1 crate
}, {
//Exits
Entrance(RR_GF_GROUND_RED, []{return logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD);}),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

backflipping to red/bottom without taking damage isn't obvious, you have to go wide and aim for the rock which somehow doesn't hurt you, but you can do it without g-card if you time your backflip well. You also don't need a g-card if we say that getting caught in fortress always sends you to bottom. As getting arrested and sticking the landing have the same logical outcome.

More obvious and common is to backflip to yellow, take 1 heart of fall damage, and then walk down to Red. top ledge > yellow is definitely in logic with damage.

It's also possible with more hovers-backflip shenanigans to reach limegreen, this time going from the crate to the raised wall on the right, using the backflip to clear the rail, then carefully walking along the wall to reach the end and hover w/rolls to limegreen. This is more difficult than the windowsill movement but also skips taking damage.

//Exits
Entrance(RR_GF_ROOFTOP_YELLOW, []{return true;}),
Entrance(RR_GF_GROUND_RED, []{return true;}),
Entrance(RR_GF_GROUND_GREY, []{return true;}),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can longshot the chest from here, you can also hovers or do a kinda tight jump as adult to RR_GF_ROOFTOP_NEAR_GS, and jump down to RR_GF_ROOFTOP_BELOW_GS, which becomes relevant if the player gets here via hovers tricks from the jail area.

Entrance(RR_TH_SOUTH_F1_CARPENTER_AREA, []{return true;}),
Entrance(RR_GF_STORMS_GROTTO, []{return logic->IsAdult && logic->CanOpenStormsGrotto();}),
Entrance(RR_GF_GROUND_GREY, []{return true;}),
Entrance(RR_GF_ROOFTOP_TOP_OF_UPPER_VINES, []{return logic->CanUse(RG_LONGSHOT);}),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be top of lower vines.

areaTable[RR_TH_BREAK_ROOM] = Region("Thieves Hideout Break Room", "Thieves Hideout", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_TH_BREAK_ROOM_POT_1, logic->CanBreakPots()),
LOCATION(RC_TH_BREAK_ROOM_POT_2, logic->CanBreakPots()),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These pots are under constant watch by a purple guard, so a way to deal with them or boomerang is required

}, {
//Exits
Entrance(RR_GF_ROOFTOP_YELLOW, []{return true;}),
Entrance(RR_GF_TOP_LEDGE, []{return true;}),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Moving between the top ledge and the main section here needs hookshot to get over a wall. the corridor behind the blockage should be a separate region.

areaTable[RR_TH_KITCHEN_MAIN] = Region("Thieves Hideout Kitchen Bottom", "Thieves Hideout", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_TH_KITCHEN_POT_1, logic->CanBreakPots() && logic->CanPassEnemy(RE_GERUDO_GUARD)),
LOCATION(RC_TH_KITCHEN_POT_2, logic->CanBreakPots() && logic->CanPassEnemy(RE_GERUDO_GUARD)),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These pots can also be reached from top with rang, skipping the need to dodge the guards

}, {
//Exits
Entrance(RR_GF_GROUND_RED, []{return true;}),
Entrance(RR_GF_GROUND_NEAR_GROTTO, []{return true;}),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comes out in RR_GF_ROOFTOP_BOTTOM_OF_LOWER_VINES not RED

}, {
//Exits
Entrance(RR_GF_ROOFTOP_BELOW_GS, []{return true;}),
});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The dead end carpenter with 1 exit does not have any pots. Combined with the 2 pot carpenter stretching from south 1F to north 2F is why we need to rename these guys and the rooms to be less bad.

DEAD_END_CARPENTER is 1, POT_CELL_CARPENTER is another. STEEP_SLOPE_CARPENTER kinda works for the 2 pot guy, which just leaves what to name the initial carpenter.

@serprex
Copy link
Contributor

serprex commented Apr 4, 2025

for carpenter names in #4949 I've been calling them by name based on their names in code (Ichiro, Saboor, Jiro, Shiro)

@Pepper0ni
Copy link
Contributor

That makes sense, though it'll probably take some time for people to get used to those names and area names might want to be more obvious. I checked N64 and they seem to count torches(?) which I didn't even notice.

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.

3 participants