Merge Visible Collision and Hammer Through Collision (#6317)

This commit is contained in:
Pepper0ni 2026-03-03 04:04:57 +00:00 committed by GitHub
parent 3882086677
commit 40ad4fed82
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 19 additions and 24 deletions

View file

@ -345,7 +345,7 @@ void RegionTable_Init_FireTemple() {
areaTable[RR_FIRE_TEMPLE_SOT_CAGE_SWITCH] = Region("Fire Temple Sot Cage Switch", SCENE_FIRE_TEMPLE, {}, {
//Locations
LOCATION(RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, (logic->CanUse(RG_SONG_OF_TIME) || ctx->GetTrickOption(RT_RUSTED_SWITCHES)) && logic->CanUse(RG_MEGATON_HAMMER) && logic->HasItem(RG_OPEN_CHEST)),
LOCATION(RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, (logic->CanUse(RG_SONG_OF_TIME) || ctx->GetTrickOption(RT_VISIBLE_COLLISION)) && logic->CanUse(RG_MEGATON_HAMMER) && logic->HasItem(RG_OPEN_CHEST)),
}, {
//Exits
ENTRANCE(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, false),
@ -702,7 +702,7 @@ void RegionTable_Init_FireTemple() {
//Explosives can also reach this room. Chus is relatively simple, they need to detonate on the first horizontal bar up from the floor while horizontally near the switch, but bombs are much harder
ENTRANCE(RR_FIRE_TEMPLE_MQ_MAZE_CRATE_CAGE, AnyAgeTime([]{return logic->CanJumpslash();})),
//it's possible to make the RT_FIRE_MQ_MAZE_HOVERS as child using bunny hood jumps, but not adult as adult bonks
ENTRANCE(RR_FIRE_TEMPLE_MQ_UPPER_LIZALFOS_MAZE, (logic->HasExplosives() || ctx->GetTrickOption(RT_RUSTED_SWITCHES)) && logic->CanUse(RG_MEGATON_HAMMER) && logic->CanUse(RG_HOOKSHOT)),
ENTRANCE(RR_FIRE_TEMPLE_MQ_UPPER_LIZALFOS_MAZE, (logic->HasExplosives() || ctx->GetTrickOption(RT_VISIBLE_COLLISION)) && logic->CanUse(RG_MEGATON_HAMMER) && logic->CanUse(RG_HOOKSHOT)),
ENTRANCE(RR_FIRE_TEMPLE_MQ_MAZE_SWITCH_DOOR, logic->HasExplosives() && ctx->GetTrickOption(RT_FIRE_MQ_MAZE_SIDE_ROOM)),
ENTRANCE(RR_FIRE_TEMPLE_MQ_NARROW_PATH_ROOM, false),
});

View file

@ -150,7 +150,7 @@ void RegionTable_Init_GanonsCastle() {
//Events
EVENT_ACCESS(LOGIC_FAIRY_ACCESS, logic->CanBreakPots()),
EVENT_ACCESS(LOGIC_WATER_TRIAL_RUSTED_SWITCH, logic->IsAdult && (logic->HasItem(RG_POWER_BRACELET) || (logic->CanMiddairGroundJump())) &&
(logic->BlueFire() || ctx->GetTrickOption(RT_RUSTED_SWITCHES)) &&
(logic->BlueFire() || ctx->GetTrickOption(RT_VISIBLE_COLLISION)) &&
logic->CanUse(RG_MEGATON_HAMMER)),
}, {
//Locations
@ -575,7 +575,7 @@ void RegionTable_Init_GanonsCastle() {
areaTable[RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_CHAIRS_ROOM] = Region("Ganon's Castle MQ Spirit Trial Chairs Room", SCENE_INSIDE_GANONS_CASTLE, {}, {}, {
//Exits
ENTRANCE(RR_GANONS_CASTLE_MQ_MAIN, true),
ENTRANCE(RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_BEFORE_SWITCH, AnyAgeTime([]{return (logic->CanHitEyeTargets() || ctx->GetTrickOption(RT_RUSTED_SWITCHES)) && logic->CanUse(RG_MEGATON_HAMMER);})),
ENTRANCE(RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_BEFORE_SWITCH, AnyAgeTime([]{return (logic->CanHitEyeTargets() || ctx->GetTrickOption(RT_VISIBLE_COLLISION)) && logic->CanUse(RG_MEGATON_HAMMER);})),
});
areaTable[RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_BEFORE_SWITCH] = Region("Ganon's Castle MQ Spirit Trial Before Switch", SCENE_INSIDE_GANONS_CASTLE, {}, {

View file

@ -51,7 +51,7 @@ void RegionTable_Init_IceCavern() {
LOCATION(RC_ICE_CAVERN_MAP_CHEST, logic->BlueFire() && logic->HasItem(RG_OPEN_CHEST)),
// very easy to break pot through ice
LOCATION(RC_ICE_CAVERN_FROZEN_POT_1, (logic->CanBreakPots() && logic->BlueFire()) || logic->HasExplosives() ||
(ctx->GetTrickOption(RT_RUSTED_SWITCHES) && ((logic->CanStandingShield() && logic->CanUse(RG_KOKIRI_SWORD)) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MEGATON_HAMMER))) ||
(ctx->GetTrickOption(RT_VISIBLE_COLLISION) && ((logic->CanStandingShield() && logic->CanUse(RG_KOKIRI_SWORD)) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MEGATON_HAMMER))) ||
(ctx->GetTrickOption(RT_HOOKSHOT_EXTENSION) && logic->CanUse(RG_HOOKSHOT))),
LOCATION(RC_ICE_CAVERN_MAP_ROOM_LEFT_HEART, true),
LOCATION(RC_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, true),

View file

@ -574,7 +574,7 @@ void RegionTable_Init_SpiritTemple() {
areaTable[RR_SPIRIT_TEMPLE_MQ_CHILD_SIDE_HUB] = Region("Spirit Temple MQ Child Side Hub", SCENE_SPIRIT_TEMPLE, {
//Events
//not technically a rusted switch, but a boulder through a wall, but is part of the same trick on N64
EVENT_ACCESS(LOGIC_SPIRIT_MQ_CRAWL_BOULDER, logic->CanUse(RG_BOMBCHU_5) || (ctx->GetTrickOption(RT_RUSTED_SWITCHES) && logic->CanUse(RG_MEGATON_HAMMER))),
EVENT_ACCESS(LOGIC_SPIRIT_MQ_CRAWL_BOULDER, logic->CanUse(RG_BOMBCHU_5) || (ctx->GetTrickOption(RT_VISIBLE_COLLISION) && logic->CanUse(RG_MEGATON_HAMMER))),
}, {
//Locations
LOCATION(RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, logic->Get(LOGIC_SPIRIT_MQ_TIME_TRAVEL_CHEST) && logic->HasItem(RG_OPEN_CHEST)),
@ -665,7 +665,7 @@ void RegionTable_Init_SpiritTemple() {
areaTable[RR_SPIRIT_TEMPLE_MQ_1F_CHEST_SWITCH] = Region("Spirit Temple MQ West 1F Rusted Switch", SCENE_SPIRIT_TEMPLE, {
//Events
EVENT_ACCESS(LOGIC_SPIRIT_MQ_TIME_TRAVEL_CHEST, logic->CanUse(RG_MEGATON_HAMMER) && logic->HasItem(RG_OPEN_CHEST)),
EVENT_ACCESS(LOGIC_SPIRIT_MQ_CRAWL_BOULDER, logic->CanUse(RG_BOMBCHU_5) || (ctx->GetTrickOption(RT_RUSTED_SWITCHES) && logic->CanUse(RG_MEGATON_HAMMER))),
EVENT_ACCESS(LOGIC_SPIRIT_MQ_CRAWL_BOULDER, logic->CanUse(RG_BOMBCHU_5) || (ctx->GetTrickOption(RT_VISIBLE_COLLISION) && logic->CanUse(RG_MEGATON_HAMMER))),
}, {}, {
//Exits
ENTRANCE(RR_SPIRIT_TEMPLE_MQ_CHILD_SIDE_HUB, logic->CanUse(RG_CRAWL) && logic->Get(LOGIC_SPIRIT_MQ_CRAWL_BOULDER)),
@ -709,7 +709,7 @@ void RegionTable_Init_SpiritTemple() {
//Logic can then allow child back into spirit, putting 1F west in logic with only 6 keys without forwards entry
ENTRANCE(RR_DESERT_COLOSSUS, logic->CanUse(RG_CRAWL) && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF) &&
logic->SmallKeys(SCENE_SPIRIT_TEMPLE, 6) && logic->MQSpiritStatueToSunBlock() &&
(logic->CanUse(RG_BOMBCHU_5) || (ctx->GetTrickOption(RT_RUSTED_SWITCHES) && AnyAgeTime([]{return logic->CanUse(RG_MEGATON_HAMMER);})))),
(logic->CanUse(RG_BOMBCHU_5) || (ctx->GetTrickOption(RT_VISIBLE_COLLISION) && AnyAgeTime([]{return logic->CanUse(RG_MEGATON_HAMMER);})))),
ENTRANCE(RR_SPIRIT_TEMPLE_MQ_SUN_ON_FLOOR, logic->SmallKeys(SCENE_SPIRIT_TEMPLE, 6)),
ENTRANCE(RR_SPIRIT_TEMPLE_MQ_POT_LEDGE, logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_SONG_OF_TIME)),
ENTRANCE(RR_SPIRIT_TEMPLE_MQ_INNER_RIGHT_HAND, logic->IsAdult || logic->CanJumpslash() || logic->CanUse(RG_HOVER_BOOTS)/* || CanBunnyJump()*/),

View file

@ -21,7 +21,6 @@ RANDO_ENUM_ITEM(RT_VISIBLE_COLLISION) // -- general tricks
RANDO_ENUM_ITEM(RT_GROTTOS_WITHOUT_AGONY)
RANDO_ENUM_ITEM(RT_FEWER_TUNIC_REQUIREMENTS)
RANDO_ENUM_ITEM(RT_UNINTUITIVE_JUMPS)
RANDO_ENUM_ITEM(RT_RUSTED_SWITCHES)
RANDO_ENUM_ITEM(RT_FLAMING_CHESTS)
RANDO_ENUM_ITEM(RT_BUNNY_HOOD_JUMPS)
RANDO_ENUM_ITEM(RT_DAMAGE_BOOST_SIMPLE)

View file

@ -1400,10 +1400,16 @@ void Settings::CreateOptions() {
Try to keep Name Tags less than 8 chars.
*/
OPT_TRICK(RT_VISIBLE_COLLISION, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::NOVICE },
"Pass Through Visible One-Way Collision", "VisCol",
"Allows climbing through the platform to reach Impa's House Back as adult with no items and going "
"through the Kakariko Village Gate as child when coming from the Mountain Trail side.");
OPT_TRICK(RT_VISIBLE_COLLISION, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::NOVICE }, "Ignore Visible Collision",
"VisCol",
"Allows ignoring visible barriers and objects that do not actually stop Link from walking, climbing or "
"hitting things, without clipping.\n\n"
"This notably allows for walking through Kak's gate backwards, climb into the back of Impa's house as "
"Adult from the coop,"
"and hitting Rusted Switches or boulders through Blocks, Ice and Walls.\n\n"
"This trick only applies to case where doing the thing is trivial, instances where it only works from "
"certain angles are not part of this trick,"
"niether are any form of clips, including clipping Link's hitbox inside boulders with jumpslash.");
OPT_TRICK(RT_GROTTOS_WITHOUT_AGONY, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::NOVICE },
"Hidden Grottos without Stone of Agony", "NoSoA",
"Allows entering hidden grottos without the Stone of Agony.");
@ -1413,15 +1419,6 @@ void Settings::CreateOptions() {
"Many ledges can be overcome with particular jumps which are simple to execute without items.\n"
"This includes jumping from heights to dive deeper without scales,\n"
"though this trick doesn't cover Water Temple's Dragon Room.");
OPT_TRICK(RT_RUSTED_SWITCHES, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::NOVICE }, "Hammer Through Collision", "HamCol",
"Applies to:\n"
"- Hitting Fire Temple Highest Goron Chest's Rusted Switch in the SoT Block without Song of Time.\n"
"- Hitting the rusted switch in Water Trial through the Ice."
"- Hitting MQ Fire Temple Lizalfos Maze's Rusted Switch in the wall.\n"
"- Having Adult hammer the rock in the west side crawlspace of MQ Spirit so child can get through "
"without bombchus."
"- MQ Spirit Trial's Rusted Switch between the thrones without hitting the eye target to drop an Iron "
"Knuckle.\n");
OPT_TRICK(RT_FLAMING_CHESTS, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::INTERMEDIATE }, "Flaming Chests", "FlaChst",
"The chests encircled in flames in Gerudo Training Ground and in Spirit Temple can be opened by running "
"into the flames while Link is invincible after taking damage.");

View file

@ -306,10 +306,9 @@ std::unordered_map<u32, RandomizerHint> StaticData::grottoChestParamsToHint{
// preexisting entries are for compatibility with Copper Charlie and should not be updated
std::unordered_map<std::string, RandomizerTrick> StaticData::trickToEnum = {
{ "0", RT_VISIBLE_COLLISION },
{ "1", RT_GROTTOS_WITHOUT_AGONY },
{ "2", RT_FEWER_TUNIC_REQUIREMENTS },
{ "3", RT_RUSTED_SWITCHES },
{ "3", RT_VISIBLE_COLLISION },
{ "4", RT_FLAMING_CHESTS },
{ "6", RT_DAMAGE_BOOST_SIMPLE },
{ "7", RT_HOVER_BOOST_SIMPLE },