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
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, {}, { areaTable[RR_FIRE_TEMPLE_SOT_CAGE_SWITCH] = Region("Fire Temple Sot Cage Switch", SCENE_FIRE_TEMPLE, {}, {
//Locations //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 //Exits
ENTRANCE(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, false), 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 //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();})), 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 //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_MAZE_SWITCH_DOOR, logic->HasExplosives() && ctx->GetTrickOption(RT_FIRE_MQ_MAZE_SIDE_ROOM)),
ENTRANCE(RR_FIRE_TEMPLE_MQ_NARROW_PATH_ROOM, false), ENTRANCE(RR_FIRE_TEMPLE_MQ_NARROW_PATH_ROOM, false),
}); });

View File

@@ -150,7 +150,7 @@ void RegionTable_Init_GanonsCastle() {
//Events //Events
EVENT_ACCESS(LOGIC_FAIRY_ACCESS, logic->CanBreakPots()), EVENT_ACCESS(LOGIC_FAIRY_ACCESS, logic->CanBreakPots()),
EVENT_ACCESS(LOGIC_WATER_TRIAL_RUSTED_SWITCH, logic->IsAdult && (logic->HasItem(RG_POWER_BRACELET) || (logic->CanMiddairGroundJump())) && 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)), logic->CanUse(RG_MEGATON_HAMMER)),
}, { }, {
//Locations //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, {}, {}, { areaTable[RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_CHAIRS_ROOM] = Region("Ganon's Castle MQ Spirit Trial Chairs Room", SCENE_INSIDE_GANONS_CASTLE, {}, {}, {
//Exits //Exits
ENTRANCE(RR_GANONS_CASTLE_MQ_MAIN, true), 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, {}, { 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)), LOCATION(RC_ICE_CAVERN_MAP_CHEST, logic->BlueFire() && logic->HasItem(RG_OPEN_CHEST)),
// very easy to break pot through ice // very easy to break pot through ice
LOCATION(RC_ICE_CAVERN_FROZEN_POT_1, (logic->CanBreakPots() && logic->BlueFire()) || logic->HasExplosives() || 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))), (ctx->GetTrickOption(RT_HOOKSHOT_EXTENSION) && logic->CanUse(RG_HOOKSHOT))),
LOCATION(RC_ICE_CAVERN_MAP_ROOM_LEFT_HEART, true), LOCATION(RC_ICE_CAVERN_MAP_ROOM_LEFT_HEART, true),
LOCATION(RC_ICE_CAVERN_MAP_ROOM_MIDDLE_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, { areaTable[RR_SPIRIT_TEMPLE_MQ_CHILD_SIDE_HUB] = Region("Spirit Temple MQ Child Side Hub", SCENE_SPIRIT_TEMPLE, {
//Events //Events
//not technically a rusted switch, but a boulder through a wall, but is part of the same trick on N64 //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 //Locations
LOCATION(RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, logic->Get(LOGIC_SPIRIT_MQ_TIME_TRAVEL_CHEST) && logic->HasItem(RG_OPEN_CHEST)), 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, { areaTable[RR_SPIRIT_TEMPLE_MQ_1F_CHEST_SWITCH] = Region("Spirit Temple MQ West 1F Rusted Switch", SCENE_SPIRIT_TEMPLE, {
//Events //Events
EVENT_ACCESS(LOGIC_SPIRIT_MQ_TIME_TRAVEL_CHEST, logic->CanUse(RG_MEGATON_HAMMER) && logic->HasItem(RG_OPEN_CHEST)), 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 //Exits
ENTRANCE(RR_SPIRIT_TEMPLE_MQ_CHILD_SIDE_HUB, logic->CanUse(RG_CRAWL) && logic->Get(LOGIC_SPIRIT_MQ_CRAWL_BOULDER)), 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 //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) && 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->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_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_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()*/), 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_GROTTOS_WITHOUT_AGONY)
RANDO_ENUM_ITEM(RT_FEWER_TUNIC_REQUIREMENTS) RANDO_ENUM_ITEM(RT_FEWER_TUNIC_REQUIREMENTS)
RANDO_ENUM_ITEM(RT_UNINTUITIVE_JUMPS) RANDO_ENUM_ITEM(RT_UNINTUITIVE_JUMPS)
RANDO_ENUM_ITEM(RT_RUSTED_SWITCHES)
RANDO_ENUM_ITEM(RT_FLAMING_CHESTS) RANDO_ENUM_ITEM(RT_FLAMING_CHESTS)
RANDO_ENUM_ITEM(RT_BUNNY_HOOD_JUMPS) RANDO_ENUM_ITEM(RT_BUNNY_HOOD_JUMPS)
RANDO_ENUM_ITEM(RT_DAMAGE_BOOST_SIMPLE) 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. Try to keep Name Tags less than 8 chars.
*/ */
OPT_TRICK(RT_VISIBLE_COLLISION, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::NOVICE }, OPT_TRICK(RT_VISIBLE_COLLISION, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::NOVICE }, "Ignore Visible Collision",
"Pass Through Visible One-Way Collision", "VisCol", "VisCol",
"Allows climbing through the platform to reach Impa's House Back as adult with no items and going " "Allows ignoring visible barriers and objects that do not actually stop Link from walking, climbing or "
"through the Kakariko Village Gate as child when coming from the Mountain Trail side."); "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 }, OPT_TRICK(RT_GROTTOS_WITHOUT_AGONY, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::NOVICE },
"Hidden Grottos without Stone of Agony", "NoSoA", "Hidden Grottos without Stone of Agony", "NoSoA",
"Allows entering hidden grottos without the Stone of Agony."); "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" "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" "This includes jumping from heights to dive deeper without scales,\n"
"though this trick doesn't cover Water Temple's Dragon Room."); "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", 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 " "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."); "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 // preexisting entries are for compatibility with Copper Charlie and should not be updated
std::unordered_map<std::string, RandomizerTrick> StaticData::trickToEnum = { std::unordered_map<std::string, RandomizerTrick> StaticData::trickToEnum = {
{ "0", RT_VISIBLE_COLLISION },
{ "1", RT_GROTTOS_WITHOUT_AGONY }, { "1", RT_GROTTOS_WITHOUT_AGONY },
{ "2", RT_FEWER_TUNIC_REQUIREMENTS }, { "2", RT_FEWER_TUNIC_REQUIREMENTS },
{ "3", RT_RUSTED_SWITCHES }, { "3", RT_VISIBLE_COLLISION },
{ "4", RT_FLAMING_CHESTS }, { "4", RT_FLAMING_CHESTS },
{ "6", RT_DAMAGE_BOOST_SIMPLE }, { "6", RT_DAMAGE_BOOST_SIMPLE },
{ "7", RT_HOVER_BOOST_SIMPLE }, { "7", RT_HOVER_BOOST_SIMPLE },