From da767c966d1102fa2dfe8f78627400ab23f4634c Mon Sep 17 00:00:00 2001 From: Caladius Date: Wed, 15 Oct 2025 12:39:07 -0400 Subject: [Rando] Shuffle Swim (#1087) * Shuffle Swim + Central Logic * East Logic * Great Bay Temple (hopefully) * North Logic * Pirates Logic (Hopefully) * South Logic * West Logic * Fix Termina Field Logic * Fix Great Bay Temple Logic * Feedback Changes * Split Southern Swamp North * Update Swamp and GBC logic * missed one * Feedback Updates * fix syntax * Split Marine Lab Exterior from GBC * replace Bronze Scale wording in Menu. * Additional logic pass for swim ability * Mimic Deku hop failure event when touching water Separate Woodfall owl statue platform into own region * Import Model * Add to 2ship.o2r * Add Model Selector * Update Model * Clean remove model for replacement * Import new model extract from Dana * Testing * pathing change * Pushing for someone to look at the model crash issue. * Enable DrawAbilityItem to take in multiple items when more get added. This is ready to go. * Feedback Changes * clang * Revert "clang" This reverts commit e09482f8b83c39f4678a9c349ed9061f2e002251. * Undo clang for once lol * Do not skip pushing Mikau if no swim ability * How did I mess that up * Fix changes * clang bullsh*t --------- Co-authored-by: Eblo <7004497+Eblo@users.noreply.github.com> --- .../MiscInteractions/SkipPushingMikau.cpp | 6 + mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp | 1 + mm/2s2h/Rando/ActorBehavior/ActorBehavior.h | 1 + mm/2s2h/Rando/ActorBehavior/Player.cpp | 33 +++ mm/2s2h/Rando/ConvertItem.cpp | 1 + mm/2s2h/Rando/DrawItem.cpp | 20 ++ mm/2s2h/Rando/GiveItem.cpp | 3 + mm/2s2h/Rando/Logic/Logic.cpp | 1 + mm/2s2h/Rando/Logic/Logic.h | 1 + mm/2s2h/Rando/Logic/Regions/Central.cpp | 6 +- mm/2s2h/Rando/Logic/Regions/East.cpp | 18 +- mm/2s2h/Rando/Logic/Regions/GreatBayTemple.cpp | 88 ++++---- mm/2s2h/Rando/Logic/Regions/North.cpp | 12 +- mm/2s2h/Rando/Logic/Regions/PiratesFortress.cpp | 48 ++--- mm/2s2h/Rando/Logic/Regions/South.cpp | 125 ++++++++--- mm/2s2h/Rando/Logic/Regions/TerminaField.cpp | 4 +- mm/2s2h/Rando/Logic/Regions/West.cpp | 89 +++++--- mm/2s2h/Rando/Menu.cpp | 5 +- mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp | 4 + mm/2s2h/Rando/StaticData/Items.cpp | 1 + mm/2s2h/Rando/StaticData/Options.cpp | 1 + mm/2s2h/Rando/Types.h | 9 + mm/assets/2s2h_assets.h | 3 + .../custom/objects/object_ability_swim/flippers | Bin 0 -> 604 bytes .../custom/objects/object_ability_swim/flippers2 | Bin 0 -> 604 bytes .../objects/object_ability_swim/gGiFlippersDL | 13 ++ .../object_ability_swim/gGiFlippersDL_tri_0 | 171 +++++++++++++++ .../object_ability_swim/gGiFlippersDL_tri_1 | 41 ++++ .../object_ability_swim/gGiFlippersDL_vtx_0 | 233 +++++++++++++++++++++ .../object_ability_swim/gGiFlippersDL_vtx_1 | 73 +++++++ .../object_ability_swim/mat_gGiFlippersDL_flippers | 21 ++ .../mat_gGiFlippersDL_flippers2 | 21 ++ 32 files changed, 900 insertions(+), 153 deletions(-) create mode 100644 mm/2s2h/Rando/ActorBehavior/Player.cpp create mode 100644 mm/assets/custom/objects/object_ability_swim/flippers create mode 100644 mm/assets/custom/objects/object_ability_swim/flippers2 create mode 100644 mm/assets/custom/objects/object_ability_swim/gGiFlippersDL create mode 100644 mm/assets/custom/objects/object_ability_swim/gGiFlippersDL_tri_0 create mode 100644 mm/assets/custom/objects/object_ability_swim/gGiFlippersDL_tri_1 create mode 100644 mm/assets/custom/objects/object_ability_swim/gGiFlippersDL_vtx_0 create mode 100644 mm/assets/custom/objects/object_ability_swim/gGiFlippersDL_vtx_1 create mode 100644 mm/assets/custom/objects/object_ability_swim/mat_gGiFlippersDL_flippers create mode 100644 mm/assets/custom/objects/object_ability_swim/mat_gGiFlippersDL_flippers2 diff --git a/mm/2s2h/Enhancements/Cutscenes/MiscInteractions/SkipPushingMikau.cpp b/mm/2s2h/Enhancements/Cutscenes/MiscInteractions/SkipPushingMikau.cpp index 8c2c7d4c9..1eb1cd16f 100644 --- a/mm/2s2h/Enhancements/Cutscenes/MiscInteractions/SkipPushingMikau.cpp +++ b/mm/2s2h/Enhancements/Cutscenes/MiscInteractions/SkipPushingMikau.cpp @@ -1,6 +1,8 @@ #include "public/bridge/consolevariablebridge.h" #include "2s2h/GameInteractor/GameInteractor.h" #include "2s2h/ShipInit.hpp" +#include "2s2h/Rando/Rando.h" +#include "2s2h/Rando/Logic/Logic.h" extern "C" { #include "functions.h" @@ -11,6 +13,10 @@ extern "C" { void RegisterSkipPushingMikau() { COND_ID_HOOK(ShouldActorInit, ACTOR_EN_ZOG, CVAR, [](Actor* actor, bool* should) { + if (IS_RANDO && !CAN_USE_ABILITY(SWIM)) { + // This skip would circumvent logical requirements if the player cannot swim yet + return; + } Flags_SetWeekEventReg(WEEKEVENTREG_88_10); Flags_SetWeekEventReg(WEEKEVENTREG_29_20); Flags_SetWeekEventReg(WEEKEVENTREG_91_01); diff --git a/mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp b/mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp index 6aa041370..75af9964f 100644 --- a/mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp +++ b/mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp @@ -139,6 +139,7 @@ void Rando::ActorBehavior::OnFileLoad() { Rando::ActorBehavior::InitObjTaruBehavior(); Rando::ActorBehavior::InitObjTsuboBehavior(); Rando::ActorBehavior::InitObjWarpstoneBehavior(); + Rando::ActorBehavior::InitPlayerBehavior(); Rando::ActorBehavior::InitSoulsBehavior(); COND_HOOK(ShouldVanillaBehavior, IS_RANDO, MiscVanillaBehaviorHandler); diff --git a/mm/2s2h/Rando/ActorBehavior/ActorBehavior.h b/mm/2s2h/Rando/ActorBehavior/ActorBehavior.h index 3d0727cbc..f1ec06fe4 100644 --- a/mm/2s2h/Rando/ActorBehavior/ActorBehavior.h +++ b/mm/2s2h/Rando/ActorBehavior/ActorBehavior.h @@ -95,6 +95,7 @@ void InitObjSnowballBehavior(); void InitObjTaruBehavior(); void InitObjTsuboBehavior(); void InitObjWarpstoneBehavior(); +void InitPlayerBehavior(); void InitSoulsBehavior(); } // namespace ActorBehavior diff --git a/mm/2s2h/Rando/ActorBehavior/Player.cpp b/mm/2s2h/Rando/ActorBehavior/Player.cpp new file mode 100644 index 000000000..b08bb384c --- /dev/null +++ b/mm/2s2h/Rando/ActorBehavior/Player.cpp @@ -0,0 +1,33 @@ +#include "ActorBehavior.h" +#include "public/bridge/consolevariablebridge.h" + +extern "C" { +#include "variables.h" +#include "functions.h" + +#include "include/z64player.h" +extern s32 Player_SetAction(PlayState* play, Player* player, PlayerActionFunc actionFunc, s32 arg3); +extern void Player_Action_1(Player* player, PlayState* play); +} + +void RespawnOnWaterTouch(Player* player) { + // This is Honey & Darlings Shop, touching the water ends the minigame as its vanilla behavior. + // No reason to handle it a second time here. + if (gPlayState->sceneId == SCENE_BOWLING) { + return; + } + + if (player->stateFlags1 & PLAYER_STATE1_8000000) { + // Mimic Deku Hop failure behavior + Player_SetAction(gPlayState, player, Player_Action_1, 0); + player->stateFlags1 |= PLAYER_STATE1_20000000; + } +} + +void Rando::ActorBehavior::InitPlayerBehavior() { + COND_ID_HOOK(OnActorUpdate, ACTOR_PLAYER, IS_RANDO && RANDO_SAVE_OPTIONS[RO_SHUFFLE_SWIM], [](Actor* actor) { + if (!Flags_GetRandoInf(RANDO_INF_OBTAINED_SWIM)) { + RespawnOnWaterTouch(GET_PLAYER(gPlayState)); + } + }); +} diff --git a/mm/2s2h/Rando/ConvertItem.cpp b/mm/2s2h/Rando/ConvertItem.cpp index 0c635b518..f2d7142fb 100644 --- a/mm/2s2h/Rando/ConvertItem.cpp +++ b/mm/2s2h/Rando/ConvertItem.cpp @@ -238,6 +238,7 @@ bool Rando::IsItemObtainable(RandoItemId randoItemId, RandoCheckId randoCheckId) case RI_FROG_CYAN: case RI_FROG_PINK: case RI_FROG_WHITE: + case RI_ABILITY_SWIM: if (hasObtainedCheck) { return false; } diff --git a/mm/2s2h/Rando/DrawItem.cpp b/mm/2s2h/Rando/DrawItem.cpp index 684e724a4..5fcfd13f5 100644 --- a/mm/2s2h/Rando/DrawItem.cpp +++ b/mm/2s2h/Rando/DrawItem.cpp @@ -2,6 +2,7 @@ #include "2s2h/Enhancements/FrameInterpolation/FrameInterpolation.h" #include "2s2h/ShipInit.hpp" #include "2s2h/Rando/DrawFuncs.h" +#include "2s2h_assets.h" extern "C" { #include "variables.h" @@ -296,6 +297,21 @@ void DrawSkulltulaToken(RandoItemId randoItemId, Actor* actor) { CLOSE_DISPS(gPlayState->state.gfxCtx); } +void DrawAbilityItem(RandoItemId randoItemId, Actor* actor) { + Gfx* abilityItemModel[1] = { + (Gfx*)gGiFlippersDL, + }; + + OPEN_DISPS(gPlayState->state.gfxCtx); + + Gfx_SetupDL25_Xlu(gPlayState->state.gfxCtx); + + MATRIX_FINALIZE_AND_LOAD(POLY_XLU_DISP++, gPlayState->state.gfxCtx); + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)abilityItemModel[randoItemId - RI_ABILITY_SWIM]); + + CLOSE_DISPS(gPlayState->state.gfxCtx); +} + void DrawSparkles(RandoItemId randoItemId, Actor* actor) { if (actor == NULL) { return; @@ -421,6 +437,9 @@ void Rando::DrawItem(RandoItemId randoItemId, Actor* actor) { case RI_FROG_WHITE: DrawMinifrog(randoItemId, actor); break; + case RI_ABILITY_SWIM: + DrawAbilityItem(randoItemId, actor); + break; case RI_NONE: case RI_UNKNOWN: break; @@ -431,6 +450,7 @@ void Rando::DrawItem(RandoItemId randoItemId, Actor* actor) { switch (randoItemId) { case RI_NONE: + case RI_ABILITY_SWIM: case RI_PROGRESSIVE_MAGIC: case RI_SINGLE_MAGIC: case RI_DOUBLE_MAGIC: diff --git a/mm/2s2h/Rando/GiveItem.cpp b/mm/2s2h/Rando/GiveItem.cpp index 8e0dfd3c7..44863637d 100644 --- a/mm/2s2h/Rando/GiveItem.cpp +++ b/mm/2s2h/Rando/GiveItem.cpp @@ -269,6 +269,9 @@ void Rando::GiveItem(RandoItemId randoItemId) { case RI_FROG_WHITE: SET_WEEKEVENTREG(WEEKEVENTREG_33_02); break; + case RI_ABILITY_SWIM: + Flags_SetRandoInf(RANDO_INF_OBTAINED_SWIM); + break; case RI_JUNK: case RI_NONE: break; diff --git a/mm/2s2h/Rando/Logic/Logic.cpp b/mm/2s2h/Rando/Logic/Logic.cpp index 005d98e34..80f10ff03 100644 --- a/mm/2s2h/Rando/Logic/Logic.cpp +++ b/mm/2s2h/Rando/Logic/Logic.cpp @@ -64,6 +64,7 @@ static RegisterShipInitFunc initFunc([]() { EXIT(ENTRANCE(SOUTH_CLOCK_TOWN, 0), ONE_WAY_EXIT, true), // Save warp EXIT(ENTRANCE(SOUTH_CLOCK_TOWN, 9), ONE_WAY_EXIT, CAN_PLAY_SONG(SOARING) && CAN_OWL_WARP(OWL_WARP_CLOCK_TOWN)), EXIT(ENTRANCE(SOUTHERN_SWAMP_POISONED, 10), ONE_WAY_EXIT, CAN_PLAY_SONG(SOARING) && CAN_OWL_WARP(OWL_WARP_SOUTHERN_SWAMP)), + EXIT(ENTRANCE(WOODFALL, 4), ONE_WAY_EXIT, CAN_PLAY_SONG(SOARING) && CAN_OWL_WARP(OWL_WARP_WOODFALL)), EXIT(ENTRANCE(MILK_ROAD, 4), ONE_WAY_EXIT, CAN_PLAY_SONG(SOARING) && CAN_OWL_WARP(OWL_WARP_MILK_ROAD)), EXIT(ENTRANCE(MOUNTAIN_VILLAGE_WINTER, 8), ONE_WAY_EXIT, CAN_PLAY_SONG(SOARING) && CAN_OWL_WARP(OWL_WARP_MOUNTAIN_VILLAGE)), EXIT(ENTRANCE(SNOWHEAD, 3), ONE_WAY_EXIT, CAN_PLAY_SONG(SOARING) && CAN_OWL_WARP(OWL_WARP_SNOWHEAD)), diff --git a/mm/2s2h/Rando/Logic/Logic.h b/mm/2s2h/Rando/Logic/Logic.h index 617c3c961..f759cd51b 100644 --- a/mm/2s2h/Rando/Logic/Logic.h +++ b/mm/2s2h/Rando/Logic/Logic.h @@ -98,6 +98,7 @@ extern std::unordered_map Regions; #define FOUND_ALL_FROGS \ (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_01) && CHECK_WEEKEVENTREG(WEEKEVENTREG_32_40) && \ CHECK_WEEKEVENTREG(WEEKEVENTREG_32_80) && CHECK_WEEKEVENTREG(WEEKEVENTREG_33_02)) +#define CAN_USE_ABILITY(ability) (Flags_GetRandoInf(RI_ABILITY_##ability - RI_ABILITY_SWIM + RANDO_INF_OBTAINED_SWIM)) #define EVENT(randoEvent, condition) \ { \ diff --git a/mm/2s2h/Rando/Logic/Regions/Central.cpp b/mm/2s2h/Rando/Logic/Regions/Central.cpp index 54131e04d..6edd31d71 100644 --- a/mm/2s2h/Rando/Logic/Regions/Central.cpp +++ b/mm/2s2h/Rando/Logic/Regions/Central.cpp @@ -120,9 +120,9 @@ static RegisterShipInitFunc initFunc([]() { Regions[RR_CLOCK_TOWN_LAUNDRY] = RandoRegion{ .sceneId = SCENE_ALLEY, .checks = { CHECK(RC_CLOCK_TOWN_STRAY_FAIRY, true), - CHECK(RC_CLOCK_TOWN_LAUNDRY_FREESTANDING_RUPEE_01, true), - CHECK(RC_CLOCK_TOWN_LAUNDRY_FREESTANDING_RUPEE_02, true), - CHECK(RC_CLOCK_TOWN_LAUNDRY_FREESTANDING_RUPEE_03, true), + CHECK(RC_CLOCK_TOWN_LAUNDRY_FREESTANDING_RUPEE_01, CAN_USE_ABILITY(SWIM) || CAN_BE_ZORA), + CHECK(RC_CLOCK_TOWN_LAUNDRY_FREESTANDING_RUPEE_02, CAN_USE_ABILITY(SWIM) || CAN_BE_ZORA), + CHECK(RC_CLOCK_TOWN_LAUNDRY_FREESTANDING_RUPEE_03, CAN_USE_ABILITY(SWIM) || CAN_BE_ZORA), CHECK(RC_CLOCK_TOWN_LAUNDRY_FROG, HAS_ITEM(ITEM_MASK_DON_GERO)), CHECK(RC_CLOCK_TOWN_LAUNDRY_GURU_GURU, true), CHECK(RC_CLOCK_TOWN_LAUNDRY_SMALL_CRATE, true), diff --git a/mm/2s2h/Rando/Logic/Regions/East.cpp b/mm/2s2h/Rando/Logic/Regions/East.cpp index 3f5a1031e..465b0d0da 100644 --- a/mm/2s2h/Rando/Logic/Regions/East.cpp +++ b/mm/2s2h/Rando/Logic/Regions/East.cpp @@ -146,12 +146,12 @@ static RegisterShipInitFunc initFunc([]() { Must have delivered the Letter to Kafei and met Kafei.(Sakon just does not show up otherwise, as odd as that may sound.) */ EXIT(ENTRANCE(SAKONS_HIDEOUT, 0), ENTRANCE(IKANA_CANYON, 6), Flags_GetRandoInf(RANDO_INF_OBTAINED_LETTER_TO_KAFEI)), - EXIT(ENTRANCE(SECRET_SHRINE, 0), ENTRANCE(IKANA_CANYON, 12), true), - EXIT(ENTRANCE(SOUTHERN_SWAMP_POISONED, 9), ONE_WAY_EXIT, true), + EXIT(ENTRANCE(SECRET_SHRINE, 0), ENTRANCE(IKANA_CANYON, 12), CAN_USE_ABILITY(SWIM)), + EXIT(ENTRANCE(SOUTHERN_SWAMP_POISONED, 9), ONE_WAY_EXIT, CAN_USE_ABILITY(SWIM)), }, .connections = { CONNECTION(RR_IKANA_CANYON_UPPER, HAS_ITEM(ITEM_HOOKSHOT) && CAN_USE_MAGIC_ARROW(ICE)), - CONNECTION(RR_IKANA_CANYON_GROTTO, true), // TODO: Grotto mapping + CONNECTION(RR_IKANA_CANYON_GROTTO, CAN_USE_ABILITY(SWIM)), // TODO: Grotto mapping }, .events = { EVENT(RE_ACCESS_BLUE_POTION_REFILL, CUR_UPG_VALUE(UPG_WALLET) >= 1), @@ -363,12 +363,12 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_SECRET_SHRINE_WART_CHEST, RANDO_EVENTS[RE_SECRET_SHRINE_WART]), CHECK(RC_SECRET_SHRINE_GARO_MASTER_CHEST, RANDO_EVENTS[RE_SECRET_SHRINE_GARO_MASTER]), CHECK(RC_SECRET_SHRINE_PIECE_OF_HEART_CHEST, RANDO_EVENTS[RE_SECRET_SHRINE_DINALFOS] && RANDO_EVENTS[RE_SECRET_SHRINE_WIZZROBE] && RANDO_EVENTS[RE_SECRET_SHRINE_WART] && RANDO_EVENTS[RE_SECRET_SHRINE_GARO_MASTER]), - CHECK(RC_SECRET_SHRINE_POT_04, CAN_BE_ZORA), - CHECK(RC_SECRET_SHRINE_POT_05, CAN_BE_ZORA), - CHECK(RC_SECRET_SHRINE_POT_06, CAN_BE_ZORA), - CHECK(RC_SECRET_SHRINE_POT_07, CAN_BE_ZORA), - CHECK(RC_SECRET_SHRINE_POT_08, CAN_BE_ZORA), - CHECK(RC_SECRET_SHRINE_POT_09, CAN_BE_ZORA), + CHECK(RC_SECRET_SHRINE_POT_04, (CAN_USE_PROJECTILE && CAN_USE_ABILITY(SWIM)) || CAN_BE_ZORA), + CHECK(RC_SECRET_SHRINE_POT_05, (CAN_USE_PROJECTILE && CAN_USE_ABILITY(SWIM)) || CAN_BE_ZORA), + CHECK(RC_SECRET_SHRINE_POT_06, (CAN_USE_PROJECTILE && CAN_USE_ABILITY(SWIM)) || CAN_BE_ZORA), + CHECK(RC_SECRET_SHRINE_POT_07, (CAN_USE_PROJECTILE && CAN_USE_ABILITY(SWIM)) || CAN_BE_ZORA), + CHECK(RC_SECRET_SHRINE_POT_08, (CAN_USE_PROJECTILE && CAN_USE_ABILITY(SWIM)) || CAN_BE_ZORA), + CHECK(RC_SECRET_SHRINE_POT_09, (CAN_USE_PROJECTILE && CAN_USE_ABILITY(SWIM)) || CAN_BE_ZORA), }, .connections = { CONNECTION(RR_SECRET_SHRINE_ENTRANCE, true), diff --git a/mm/2s2h/Rando/Logic/Regions/GreatBayTemple.cpp b/mm/2s2h/Rando/Logic/Regions/GreatBayTemple.cpp index 975840f38..685c3fad9 100644 --- a/mm/2s2h/Rando/Logic/Regions/GreatBayTemple.cpp +++ b/mm/2s2h/Rando/Logic/Regions/GreatBayTemple.cpp @@ -45,10 +45,10 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_GREAT_BAY_TEMPLE_BOSS_POT_02, true), CHECK(RC_GREAT_BAY_TEMPLE_BOSS_POT_03, true), CHECK(RC_GREAT_BAY_TEMPLE_BOSS_POT_04, true), - CHECK(RC_GREAT_BAY_TEMPLE_BOSS_UNDERWATER_POT_01, CAN_BE_ZORA), - CHECK(RC_GREAT_BAY_TEMPLE_BOSS_UNDERWATER_POT_02, CAN_BE_ZORA), - CHECK(RC_GREAT_BAY_TEMPLE_BOSS_UNDERWATER_POT_03, CAN_BE_ZORA), - CHECK(RC_GREAT_BAY_TEMPLE_BOSS_UNDERWATER_POT_04, CAN_BE_ZORA), + CHECK(RC_GREAT_BAY_TEMPLE_BOSS_UNDERWATER_POT_01, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_GREAT_BAY_TEMPLE_BOSS_UNDERWATER_POT_02, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_GREAT_BAY_TEMPLE_BOSS_UNDERWATER_POT_03, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_GREAT_BAY_TEMPLE_BOSS_UNDERWATER_POT_04, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), CHECK(RC_GIANTS_CHAMBER_OATH_TO_ORDER, CanKillEnemy(ACTOR_BOSS_03)), }, .exits = { // TO FROM @@ -66,14 +66,14 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_GREAT_BAY_TEMPLE_SF_CENTRAL_ROOM_BARREL, true), CHECK(RC_GREAT_BAY_TEMPLE_CENTRAL_ROOM_POT_01, true), CHECK(RC_GREAT_BAY_TEMPLE_CENTRAL_ROOM_POT_02, true), - CHECK(RC_GREAT_BAY_TEMPLE_SF_CENTRAL_ROOM_UNDERWATER_POT, CAN_BE_ZORA), + CHECK(RC_GREAT_BAY_TEMPLE_SF_CENTRAL_ROOM_UNDERWATER_POT, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), }, .connections = { - CONNECTION(RR_GREAT_BAY_TEMPLE_COMPASS_ROOM_TUNNEL, CAN_BE_ZORA && GBT_CAN_REVERSE_WATER_FLOW), + CONNECTION(RR_GREAT_BAY_TEMPLE_COMPASS_ROOM_TUNNEL, CAN_BE_ZORA && GBT_CAN_REVERSE_WATER_FLOW && CAN_USE_ABILITY(SWIM)), CONNECTION(RR_GREAT_BAY_TEMPLE_GREEN_PIPE_1, CAN_USE_MAGIC_ARROW(ICE)), - CONNECTION(RR_GREAT_BAY_TEMPLE_MAP_ROOM, CAN_BE_ZORA), - CONNECTION(RR_GREAT_BAY_TEMPLE_PRE_BOSS_ROOM, CAN_BE_ZORA && GBT_CAN_REVERSE_WATER_FLOW), - CONNECTION(RR_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART, CAN_BE_ZORA), + CONNECTION(RR_GREAT_BAY_TEMPLE_MAP_ROOM, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CONNECTION(RR_GREAT_BAY_TEMPLE_PRE_BOSS_ROOM, CAN_BE_ZORA && GBT_CAN_REVERSE_WATER_FLOW && CAN_USE_ABILITY(SWIM)), + CONNECTION(RR_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), CONNECTION(RR_GREAT_BAY_TEMPLE_WATER_WHEEL_ROOM, true) }, }; @@ -94,27 +94,27 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_TUNNEL_FREESTANDING_RUPEE_02, CAN_BE_ZORA), }, .connections = { - CONNECTION(RR_GREAT_BAY_TEMPLE_CENTRAL_ROOM, CAN_BE_ZORA), - CONNECTION(RR_GREAT_BAY_TEMPLE_GREEN_PIPE_2, GBT_CAN_REVERSE_WATER_FLOW), + CONNECTION(RR_GREAT_BAY_TEMPLE_CENTRAL_ROOM, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CONNECTION(RR_GREAT_BAY_TEMPLE_GREEN_PIPE_2, GBT_CAN_REVERSE_WATER_FLOW && CAN_USE_ABILITY(SWIM)), }, }; Regions[RR_GREAT_BAY_TEMPLE_COMPASS_ROOM] = RandoRegion{ .sceneId = SCENE_SEA, .checks = { CHECK(RC_GREAT_BAY_TEMPLE_COMPASS_CHEST, true), - CHECK(RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_UNDERWATER, CAN_BE_ZORA), + CHECK(RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_UNDERWATER, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), CHECK(RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_SURFACE_POT_01, true), CHECK(RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_SURFACE_POT_02, true), CHECK(RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_SURFACE_POT_03, true), CHECK(RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_SURFACE_POT_04, true), - CHECK(RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_WATER_POT_01, CAN_BE_ZORA), - CHECK(RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_WATER_POT_02, CAN_BE_ZORA), - CHECK(RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_WATER_POT_03, CAN_BE_ZORA), + CHECK(RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_WATER_POT_01, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_WATER_POT_02, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_WATER_POT_03, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), }, .connections = { CONNECTION(RR_GREAT_BAY_TEMPLE_BABA_CHEST_ROOM, true), CONNECTION(RR_GREAT_BAY_TEMPLE_COMPASS_ROOM_WITH_BOSS_KEY_CHEST, CAN_BE_ZORA && CAN_USE_MAGIC_ARROW(ICE)), // TODO : Decide if this should be considered a trick CONNECTION(RR_GREAT_BAY_TEMPLE_GEKKO, CAN_USE_MAGIC_ARROW(ICE) && CAN_USE_MAGIC_ARROW(FIRE)), - CONNECTION(RR_GREAT_BAY_TEMPLE_COMPASS_ROOM_TUNNEL, true) + CONNECTION(RR_GREAT_BAY_TEMPLE_COMPASS_ROOM_TUNNEL, CAN_USE_ABILITY(SWIM)) }, }; Regions[RR_GREAT_BAY_TEMPLE_ENTRANCE] = RandoRegion{ .sceneId = SCENE_SEA, @@ -174,7 +174,7 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_1_BARREL_03, HAS_ITEM(ITEM_HOOKSHOT)), }, .connections = { - CONNECTION(RR_GREAT_BAY_TEMPLE_CENTRAL_ROOM, true), + CONNECTION(RR_GREAT_BAY_TEMPLE_CENTRAL_ROOM, CAN_USE_ABILITY(SWIM)), }, .events = { EVENT(RE_GREAT_BAY_GREEN_SWITCH_1, CAN_USE_MAGIC_ARROW(ICE)), @@ -186,17 +186,17 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_BARREL_02, true), CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_LOWER_CHEST, HAS_ITEM(ITEM_HOOKSHOT)), CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_UPPER_CHEST, (HAS_ITEM(ITEM_HOOKSHOT) && CAN_USE_MAGIC_ARROW(ICE))), - CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_01, CAN_BE_ZORA), - CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_02, CAN_BE_ZORA), - CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_03, CAN_BE_ZORA), - CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_04, CAN_BE_ZORA), - CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_05, CAN_BE_ZORA), - CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_06, CAN_BE_ZORA), - CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_07, CAN_BE_ZORA), - CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_08, CAN_BE_ZORA), + CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_01, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_02, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_03, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_04, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_05, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_06, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_07, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_08, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), }, .connections = { - CONNECTION(RR_GREAT_BAY_TEMPLE_COMPASS_ROOM, CAN_BE_ZORA), + CONNECTION(RR_GREAT_BAY_TEMPLE_COMPASS_ROOM, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), CONNECTION(RR_GREAT_BAY_TEMPLE_GREEN_PIPE_3, CAN_USE_MAGIC_ARROW(ICE)), }, }; @@ -206,7 +206,7 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_LOWER_POT, true), CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_UPPER_POT_01, CAN_USE_MAGIC_ARROW(FIRE)), CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_UPPER_POT_02, CAN_USE_MAGIC_ARROW(FIRE)), - CHECK(RC_GREAT_BAY_TEMPLE_SF_GREEN_PIPE_3_BARREL, CAN_BE_ZORA && CAN_USE_MAGIC_ARROW(FIRE)), + CHECK(RC_GREAT_BAY_TEMPLE_SF_GREEN_PIPE_3_BARREL, CAN_BE_ZORA && CAN_USE_MAGIC_ARROW(FIRE) && CAN_USE_ABILITY(SWIM)), CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_LARGE_CRATE_01, true), CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_LARGE_CRATE_02, true), CHECK(RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_LARGE_CRATE_03, true), @@ -229,14 +229,14 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_GREAT_BAY_TEMPLE_MAP_ROOM_SURFACE_POT_01, true), CHECK(RC_GREAT_BAY_TEMPLE_MAP_ROOM_SURFACE_POT_02, true), CHECK(RC_GREAT_BAY_TEMPLE_MAP_ROOM_SURFACE_POT_03, CAN_BE_ZORA || CAN_USE_MAGIC_ARROW(ICE)), - CHECK(RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_01, CAN_BE_ZORA), - CHECK(RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_02, CAN_BE_ZORA), - CHECK(RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_03, CAN_BE_ZORA), - CHECK(RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_04, CAN_BE_ZORA), - CHECK(RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_05, CAN_BE_ZORA), - CHECK(RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_06, CAN_BE_ZORA), - CHECK(RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_07, CAN_BE_ZORA), - CHECK(RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_08, CAN_BE_ZORA), + CHECK(RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_01, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_02, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_03, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_04, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_05, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_06, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_07, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_08, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), CHECK(RC_GREAT_BAY_TEMPLE_SF_MAP_ROOM_POT, CAN_BE_ZORA || CAN_USE_MAGIC_ARROW(ICE)), }, .connections = { @@ -256,13 +256,13 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_GREAT_BAY_TEMPLE_PRE_BOSS_POT_07, CAN_BE_ZORA), CHECK(RC_GREAT_BAY_TEMPLE_PRE_BOSS_POT_08, CAN_BE_ZORA), CHECK(RC_GREAT_BAY_TEMPLE_SF_PRE_BOSS_ABOVE_WATER, CAN_USE_PROJECTILE && HAS_ITEM(ITEM_MASK_GREAT_FAIRY)), - CHECK(RC_GREAT_BAY_TEMPLE_SF_PRE_BOSS_UNDERWATER, CAN_BE_ZORA), + CHECK(RC_GREAT_BAY_TEMPLE_SF_PRE_BOSS_UNDERWATER, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), }, .exits = { // TO FROM EXIT(ENTRANCE(GYORGS_LAIR, 0), ONE_WAY_EXIT, CHECK_DUNGEON_ITEM(DUNGEON_BOSS_KEY, DUNGEON_SCENE_INDEX_GREAT_BAY_TEMPLE) && GBT_GREEN_SWITCH_FLOW), }, .connections = { - CONNECTION(RR_GREAT_BAY_TEMPLE_CENTRAL_ROOM, CAN_BE_ZORA), + CONNECTION(RR_GREAT_BAY_TEMPLE_CENTRAL_ROOM, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), }, .events = { EVENT(RE_GREAT_BAY_GREEN_SWITCH_3, true), @@ -270,13 +270,13 @@ static RegisterShipInitFunc initFunc([]() { }; Regions[RR_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART] = RandoRegion{ .sceneId = SCENE_SEA, .checks = { - CHECK(RC_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART_POT_01, CAN_BE_ZORA), - CHECK(RC_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART_POT_02, CAN_BE_ZORA), - CHECK(RC_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART_POT_03, CAN_BE_ZORA), - CHECK(RC_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART_POT_04, CAN_BE_ZORA), + CHECK(RC_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART_POT_01, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART_POT_02, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART_POT_03, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART_POT_04, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), }, .connections = { - CONNECTION(RR_GREAT_BAY_TEMPLE_CENTRAL_ROOM, CAN_BE_ZORA), + CONNECTION(RR_GREAT_BAY_TEMPLE_CENTRAL_ROOM, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), CONNECTION(RR_GREAT_BAY_TEMPLE_BEFORE_WART, KEY_COUNT(GREAT_BAY_TEMPLE) >= 1), }, .events = { @@ -321,7 +321,7 @@ static RegisterShipInitFunc initFunc([]() { }; Regions[RR_GREAT_BAY_TEMPLE_WATER_WHEEL_ROOM] = RandoRegion{ .sceneId = SCENE_SEA, .checks = { - CHECK(RC_GREAT_BAY_TEMPLE_SF_WATER_WHEEL_PLATFORM, CAN_BE_ZORA || (HAS_ITEM(ITEM_BOW) && (HAS_ITEM(ITEM_MASK_GREAT_FAIRY)))), + CHECK(RC_GREAT_BAY_TEMPLE_SF_WATER_WHEEL_PLATFORM, (CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)) || (HAS_ITEM(ITEM_BOW) && HAS_ITEM(ITEM_MASK_GREAT_FAIRY))), CHECK(RC_GREAT_BAY_TEMPLE_SF_WATER_WHEEL_SKULLTULA, true), CHECK(RC_GREAT_BAY_TEMPLE_WATER_WHEEL_FREESTANDING_RUPEE_01, true), CHECK(RC_GREAT_BAY_TEMPLE_WATER_WHEEL_FREESTANDING_RUPEE_02, true), @@ -330,7 +330,7 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_GREAT_BAY_TEMPLE_WATER_WHEEL_FREESTANDING_RUPEE_05, true), }, .connections = { - CONNECTION(RR_GREAT_BAY_TEMPLE_CENTRAL_ROOM, CAN_BE_ZORA), + CONNECTION(RR_GREAT_BAY_TEMPLE_CENTRAL_ROOM, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), CONNECTION(RR_GREAT_BAY_TEMPLE_ENTRANCE, true), } }; diff --git a/mm/2s2h/Rando/Logic/Regions/North.cpp b/mm/2s2h/Rando/Logic/Regions/North.cpp index 72d334eae..6cc57fef7 100644 --- a/mm/2s2h/Rando/Logic/Regions/North.cpp +++ b/mm/2s2h/Rando/Logic/Regions/North.cpp @@ -318,12 +318,12 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_PATH_TO_GORON_VILLAGE_LULLABY_INTRO, CAN_BE_GORON && (CAN_USE_MAGIC_ARROW(FIRE) || (CAN_ACCESS(HOT_SPRING_WATER) && HAS_BOTTLE))), CHECK(RC_TWIN_ISLANDS_TINGLE_MAP_01, CAN_USE_PROJECTILE && CAN_AFFORD(RC_TWIN_ISLANDS_TINGLE_MAP_01)), CHECK(RC_TWIN_ISLANDS_TINGLE_MAP_02, CAN_USE_PROJECTILE && CAN_AFFORD(RC_TWIN_ISLANDS_TINGLE_MAP_02)), - CHECK(RC_TWIN_ISLANDS_UNDERWATER_CHEST_01, CAN_BE_ZORA && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]), - CHECK(RC_TWIN_ISLANDS_UNDERWATER_CHEST_02, CAN_BE_ZORA && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]), - CHECK(RC_TWIN_ISLANDS_FREESTANDING_RUPEE_01, CAN_BE_ZORA && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]), - CHECK(RC_TWIN_ISLANDS_FREESTANDING_RUPEE_02, CAN_BE_ZORA && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]), - CHECK(RC_TWIN_ISLANDS_FREESTANDING_RUPEE_03, CAN_BE_ZORA && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]), - CHECK(RC_TWIN_ISLANDS_FREESTANDING_RUPEE_04, CAN_BE_ZORA && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]), + CHECK(RC_TWIN_ISLANDS_UNDERWATER_CHEST_01, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM) && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]), + CHECK(RC_TWIN_ISLANDS_UNDERWATER_CHEST_02, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM) && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]), + CHECK(RC_TWIN_ISLANDS_FREESTANDING_RUPEE_01, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM) && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]), + CHECK(RC_TWIN_ISLANDS_FREESTANDING_RUPEE_02, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM) && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]), + CHECK(RC_TWIN_ISLANDS_FREESTANDING_RUPEE_03, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM) && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]), + CHECK(RC_TWIN_ISLANDS_FREESTANDING_RUPEE_04, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM) && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]), CHECK(RC_TWIN_ISLANDS_SPRING_GRASS_01, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]), CHECK(RC_TWIN_ISLANDS_SPRING_GRASS_02, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]), CHECK(RC_TWIN_ISLANDS_SPRING_GRASS_03, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]), diff --git a/mm/2s2h/Rando/Logic/Regions/PiratesFortress.cpp b/mm/2s2h/Rando/Logic/Regions/PiratesFortress.cpp index f5fc49213..82d738220 100644 --- a/mm/2s2h/Rando/Logic/Regions/PiratesFortress.cpp +++ b/mm/2s2h/Rando/Logic/Regions/PiratesFortress.cpp @@ -31,7 +31,7 @@ static RegisterShipInitFunc initFunc([]() { EXIT(ENTRANCE(PIRATES_FORTRESS, 1), ENTRANCE(PIRATES_FORTRESS_INTERIOR, 0), true), }, .events = { - EVENT(RE_ACCESS_ZORA_EGG, HAS_ITEM(ITEM_HOOKSHOT) && HAS_BOTTLE && CAN_BE_ZORA), + EVENT(RE_ACCESS_ZORA_EGG, HAS_ITEM(ITEM_HOOKSHOT) && HAS_BOTTLE && CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), }, }; Regions[RR_PIRATES_FORTRESS_INSIDE_3_GUARD_ROOM] = RandoRegion{ .name = "3 Guard Room", .sceneId = SCENE_PIRATE, @@ -50,7 +50,7 @@ static RegisterShipInitFunc initFunc([]() { }; Regions[RR_PIRATES_FORTRESS_INSIDE_CHEST_EGG_ROOM] = RandoRegion{ .name = "Chest Egg Room", .sceneId = SCENE_PIRATE, .checks = { - CHECK(RC_PIRATE_FORTRESS_INTERIOR_AQUARIUM_CHEST, HAS_ITEM(ITEM_HOOKSHOT) && CAN_BE_ZORA), + CHECK(RC_PIRATE_FORTRESS_INTERIOR_AQUARIUM_CHEST, HAS_ITEM(ITEM_HOOKSHOT) && CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), CHECK(RC_PIRATE_FORTRESS_INTERIOR_CHEST_AQUARIUM_POT_01, true), CHECK(RC_PIRATE_FORTRESS_INTERIOR_CHEST_AQUARIUM_POT_02, true), CHECK(RC_PIRATE_FORTRESS_INTERIOR_CHEST_AQUARIUM_POT_03, true), @@ -62,7 +62,7 @@ static RegisterShipInitFunc initFunc([]() { CONNECTION(RR_PIRATES_FORTRESS_INSIDE_ORANGE_GUARD, true), }, .events = { - EVENT(RE_ACCESS_ZORA_EGG, HAS_ITEM(ITEM_HOOKSHOT) && HAS_BOTTLE && CAN_BE_ZORA), + EVENT(RE_ACCESS_ZORA_EGG, HAS_ITEM(ITEM_HOOKSHOT) && HAS_BOTTLE && CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), }, }; Regions[RR_PIRATES_FORTRESS_INSIDE_GREEN_GUARD] = RandoRegion{ .name = "Green Guard Room", .sceneId = SCENE_PIRATE, @@ -121,7 +121,7 @@ static RegisterShipInitFunc initFunc([]() { CONNECTION(RR_PIRATES_FORTRESS_LEFT_CLAM_EGG_ROOM, true), }, .events = { - EVENT(RE_ACCESS_ZORA_EGG, HAS_ITEM(ITEM_HOOKSHOT) && HAS_BOTTLE && CAN_BE_ZORA), + EVENT(RE_ACCESS_ZORA_EGG, HAS_ITEM(ITEM_HOOKSHOT) && HAS_BOTTLE && CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), }, }; Regions[RR_PIRATES_FORTRESS_LEFT_PLATFORM] = RandoRegion{ .name = "Left Platform", .sceneId = SCENE_KAIZOKU, @@ -135,11 +135,11 @@ static RegisterShipInitFunc initFunc([]() { }; Regions[RR_PIRATES_FORTRESS_MOAT_HIGHER] = RandoRegion{ .name = "Higher", .sceneId = SCENE_TORIDE, .exits = { // TO FROM - EXIT(ENTRANCE(PIRATES_FORTRESS, 0), ENTRANCE(PIRATES_FORTRESS_EXTERIOR, 1), true), - EXIT(ENTRANCE(PIRATES_FORTRESS_INTERIOR, 10), ENTRANCE(PIRATES_FORTRESS_EXTERIOR, 6), true), + EXIT(ENTRANCE(PIRATES_FORTRESS, 0), ENTRANCE(PIRATES_FORTRESS_EXTERIOR, 1), CAN_USE_ABILITY(SWIM)), + EXIT(ENTRANCE(PIRATES_FORTRESS_INTERIOR, 10), ENTRANCE(PIRATES_FORTRESS_EXTERIOR, 6), CAN_USE_ABILITY(SWIM)), }, .connections = { - CONNECTION(RR_PIRATES_FORTRESS_MOAT_LOWER, true), + CONNECTION(RR_PIRATES_FORTRESS_MOAT_LOWER, CAN_USE_ABILITY(SWIM)), }, .oneWayEntrances = { ENTRANCE(PIRATES_FORTRESS_EXTERIOR, 4), // From being captured in the inner part of Pirate Fortress @@ -147,16 +147,16 @@ static RegisterShipInitFunc initFunc([]() { }; Regions[RR_PIRATES_FORTRESS_MOAT_LOWER] = RandoRegion{ .name = "Lower", .sceneId = SCENE_TORIDE, .checks = { - CHECK(RC_PIRATE_FORTRESS_ENTRANCE_CHEST_01, CAN_BE_ZORA), - CHECK(RC_PIRATE_FORTRESS_ENTRANCE_CHEST_02, CAN_BE_ZORA), - CHECK(RC_PIRATE_FORTRESS_ENTRANCE_CHEST_03, CAN_BE_ZORA), + CHECK(RC_PIRATE_FORTRESS_ENTRANCE_CHEST_01, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_PIRATE_FORTRESS_ENTRANCE_CHEST_02, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_PIRATE_FORTRESS_ENTRANCE_CHEST_03, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), }, .exits = { // TO FROM - EXIT(ENTRANCE(GREAT_BAY_COAST, 5), ENTRANCE(PIRATES_FORTRESS_EXTERIOR, 0), CAN_BE_ZORA), - EXIT(ENTRANCE(PIRATES_FORTRESS_INTERIOR, 9), ENTRANCE(PIRATES_FORTRESS_EXTERIOR, 2), CAN_BE_ZORA && CAN_BE_GORON), + EXIT(ENTRANCE(GREAT_BAY_COAST, 5), ENTRANCE(PIRATES_FORTRESS_EXTERIOR, 0), CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + EXIT(ENTRANCE(PIRATES_FORTRESS_INTERIOR, 9), ENTRANCE(PIRATES_FORTRESS_EXTERIOR, 2), CAN_BE_ZORA && CAN_USE_ABILITY(SWIM) && CAN_BE_GORON), }, .connections = { - CONNECTION(RR_PIRATES_FORTRESS_MOAT_HIGHER, HAS_ITEM(ITEM_HOOKSHOT)), + CONNECTION(RR_PIRATES_FORTRESS_MOAT_HIGHER, HAS_ITEM(ITEM_HOOKSHOT) && CAN_USE_ABILITY(SWIM)), }, .events = { EVENT(RE_ACCESS_PIRATE_PICTURE, true), @@ -173,7 +173,7 @@ static RegisterShipInitFunc initFunc([]() { EXIT(ENTRANCE(PIRATES_FORTRESS, 12), ENTRANCE(PIRATES_FORTRESS_EXTERIOR, 5), true), }, .connections = { - CONNECTION(RR_PIRATES_FORTRESS_MOAT_LOWER, true), + CONNECTION(RR_PIRATES_FORTRESS_MOAT_LOWER, CAN_USE_ABILITY(SWIM)), }, }; Regions[RR_PIRATES_FORTRESS_PLAZA_LEFT_EXIT] = RandoRegion{ .name = "Left Side Exit", .sceneId = SCENE_KAIZOKU, @@ -283,29 +283,29 @@ static RegisterShipInitFunc initFunc([]() { CONNECTION(RR_PIRATES_FORTRESS_INSIDE_MAZE_GUARD, true), }, .events = { - EVENT(RE_ACCESS_ZORA_EGG, HAS_ITEM(ITEM_HOOKSHOT) && HAS_BOTTLE && CAN_BE_ZORA), + EVENT(RE_ACCESS_ZORA_EGG, HAS_ITEM(ITEM_HOOKSHOT) && HAS_BOTTLE && CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), }, }; Regions[RR_PIRATES_FORTRESS_SEWERS_POSTGATE] = RandoRegion{ .name = "Sewers Postgate", .sceneId = SCENE_PIRATE, .checks = { - CHECK(RC_PIRATE_FORTRESS_SEWERS_WATERWAY_POT_01, true), - CHECK(RC_PIRATE_FORTRESS_SEWERS_WATERWAY_POT_02, true), + CHECK(RC_PIRATE_FORTRESS_SEWERS_WATERWAY_POT_01, CAN_USE_ABILITY(SWIM)), + CHECK(RC_PIRATE_FORTRESS_SEWERS_WATERWAY_POT_02, CAN_USE_ABILITY(SWIM)), }, .exits = { // TO FROM - EXIT(ENTRANCE(PIRATES_FORTRESS_EXTERIOR, 3), ONE_WAY_EXIT, true) + EXIT(ENTRANCE(PIRATES_FORTRESS_EXTERIOR, 3), ONE_WAY_EXIT, CAN_USE_ABILITY(SWIM)) }, .connections = { - CONNECTION(RR_PIRATES_FORTRESS_TELESCOPE_ROOM, HAS_ITEM(ITEM_BOW) || HAS_ITEM(ITEM_HOOKSHOT) || CAN_BE_ZORA) + CONNECTION(RR_PIRATES_FORTRESS_TELESCOPE_ROOM, (HAS_ITEM(ITEM_BOW) || HAS_ITEM(ITEM_HOOKSHOT) || CAN_BE_ZORA) && CAN_USE_ABILITY(SWIM)) } }; Regions[RR_PIRATES_FORTRESS_SEWERS_PREGATE] = RandoRegion{ .name = "Sewers Pregate", .sceneId = SCENE_PIRATE, .checks = { - CHECK(RC_PIRATE_FORTRESS_INTERIOR_SEWERS_CHEST_01, CAN_BE_ZORA), - CHECK(RC_PIRATE_FORTRESS_INTERIOR_SEWERS_CHEST_02, CAN_BE_ZORA), - CHECK(RC_PIRATE_FORTRESS_INTERIOR_SEWERS_CHEST_03, CAN_BE_ZORA), + CHECK(RC_PIRATE_FORTRESS_INTERIOR_SEWERS_CHEST_01, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_PIRATE_FORTRESS_INTERIOR_SEWERS_CHEST_02, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_PIRATE_FORTRESS_INTERIOR_SEWERS_CHEST_03, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), CHECK(RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_POT_01, true), CHECK(RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_POT_02, true), - CHECK(RC_PIRATE_FORTRESS_INTERIOR_SEWERS_PIECE_OF_HEART, true), + CHECK(RC_PIRATE_FORTRESS_INTERIOR_SEWERS_PIECE_OF_HEART, true), CHECK(RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_01, true), CHECK(RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_02, true), CHECK(RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_03, true), @@ -355,7 +355,7 @@ static RegisterShipInitFunc initFunc([]() { EXIT(ENTRANCE(PIRATES_FORTRESS_EXTERIOR, 6), ENTRANCE(PIRATES_FORTRESS_INTERIOR, 10), CAN_USE_PROJECTILE) }, .connections = { - CONNECTION(RR_PIRATES_FORTRESS_SEWERS_POSTGATE, true) + CONNECTION(RR_PIRATES_FORTRESS_SEWERS_POSTGATE, CAN_USE_ABILITY(SWIM)) } }; }, {}); diff --git a/mm/2s2h/Rando/Logic/Regions/South.cpp b/mm/2s2h/Rando/Logic/Regions/South.cpp index 3f35c4473..9a21cda50 100644 --- a/mm/2s2h/Rando/Logic/Regions/South.cpp +++ b/mm/2s2h/Rando/Logic/Regions/South.cpp @@ -5,6 +5,31 @@ using namespace Rando::Logic; +inline bool CanGetPastBigOcto() { + // Boat ride. This takes Link to a landing in the next region and thus has no additional requirements. + if (RANDO_EVENTS[RE_SOUTHERN_SWAMP_RIDE_BOAT]) { + return true; + } + /* + * Kill the Big Octo. This means the water is still in a poison state, so swimming is not logically considered due + * to the damage boost method not being logically considered. This piece may need expanded as tricks and glitches + * are logically introduced. + */ + if (RANDO_EVENTS[RE_SOUTHERN_SWAMP_KILL_OCTOROK] && CAN_BE_DEKU) { + return true; + } + /* + * The water is clear in this state, so swimming comes into question. Either Link uses the swim ability, he hops + * over the water as Deku, or he uses one of the forms tall enough to walk through the water. This may also be + * expanded if FD is ever logically considered. + */ + if (RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE] && + (CAN_USE_ABILITY(SWIM) || CAN_BE_DEKU || CAN_BE_ZORA || CAN_BE_GORON)) { + return true; + } + return false; +} + // clang-format off static RegisterShipInitFunc initFunc([]() { Regions[RR_DEKU_KINGS_CHAMBER_HOLDING_CELL] = RandoRegion{ .name = "Holding Cell", .sceneId = SCENE_DEKU_KING, @@ -241,19 +266,12 @@ static RegisterShipInitFunc initFunc([]() { CONNECTION(RR_SOUTHERN_SWAMP_SOUTH, true), // TODO: Grotto mapping }, }; - Regions[RR_SOUTHERN_SWAMP_NORTH] = RandoRegion{ .name = "North Section", .sceneId = SCENE_20SICHITAI, + Regions[RR_SOUTHERN_SWAMP_NORTH] = RandoRegion{ .name = "North Tourist Section", .sceneId = SCENE_20SICHITAI, .checks = { - CHECK(RC_SOUTHERN_SWAMP_FROG, HAS_ITEM(ITEM_MASK_DON_GERO)), CHECK(RC_SOUTHERN_SWAMP_PIECE_OF_HEART, CAN_BE_DEKU && Flags_GetRandoInf(RANDO_INF_OBTAINED_DEED_LAND)), CHECK(RC_SOUTHERN_SWAMP_SCRUB_DEED, Flags_GetRandoInf(RANDO_INF_OBTAINED_DEED_LAND)), CHECK(RC_SOUTHERN_SWAMP_SCRUB_BEANS, CAN_BE_DEKU), CHECK(RC_SOUTHERN_SWAMP_OWL_STATUE, CAN_USE_SWORD), - CHECK(RC_SOUTHERN_SWAMP_POISON_POT_01, true), - CHECK(RC_SOUTHERN_SWAMP_POISON_POT_02, true), - CHECK(RC_SOUTHERN_SWAMP_POISON_POT_03, true), - CHECK(RC_SOUTHERN_SWAMP_CLEAR_POT_01, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), - CHECK(RC_SOUTHERN_SWAMP_CLEAR_POT_02, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), - CHECK(RC_SOUTHERN_SWAMP_CLEAR_POT_03, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), CHECK(RC_SOUTHERN_SWAMP_FREESTANDING_RUPEE_01, CAN_BE_DEKU || CAN_BE_ZORA), CHECK(RC_SOUTHERN_SWAMP_FREESTANDING_RUPEE_02, CAN_BE_DEKU || CAN_BE_ZORA), CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_01, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), @@ -268,6 +286,48 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_10, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_11, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_12, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), + CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_01, true), + CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_02, true), + CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_03, true), + CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_04, true), + CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_05, true), + CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_06, true), + CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_07, true), + CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_08, true), + CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_09, true), + CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_10, true), + CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_11, true), + CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_12, true), + }, + .exits = { // TO FROM + EXIT(ENTRANCE(ROAD_TO_SOUTHERN_SWAMP, 1), ENTRANCE(SOUTHERN_SWAMP_POISONED, 0), true), + EXIT(ENTRANCE(TOURIST_INFORMATION, 0), ENTRANCE(SOUTHERN_SWAMP_POISONED, 1), true), + }, + .connections = { + CONNECTION(RR_SOUTHERN_SWAMP_SOUTH, CanGetPastBigOcto()), + CONNECTION(RR_SOUTHERN_SWAMP_NEAR_WOODS, (CAN_BE_HUMAN && CAN_USE_ABILITY(SWIM)) || (CAN_BE_DEKU || CAN_BE_ZORA || CAN_BE_GORON)), + }, + .events = { + EVENT(RE_ACCESS_SPRING_WATER, true), + EVENT(RE_ACCESS_BEANS_REFILL, CAN_BE_DEKU && HAS_ITEM(ITEM_MAGIC_BEANS)), + EVENT(RE_SOUTHERN_SWAMP_KILL_OCTOROK, (HAS_ITEM(ITEM_BOW) || HAS_ITEM(ITEM_HOOKSHOT) || CAN_BE_ZORA)), + EVENT(RE_ACCESS_PICTOGRAPH_SWAMP_GENERIC, HAS_ITEM(ITEM_PICTOGRAPH_BOX)), + }, + .oneWayEntrances = { + ENTRANCE(SOUTHERN_SWAMP_POISONED, 10), // From Song of Soaring + } + }; + Regions[RR_SOUTHERN_SWAMP_NEAR_WOODS] = RandoRegion{ .name = "North Woods Section", .sceneId = SCENE_20SICHITAI, + .checks = { + CHECK(RC_SOUTHERN_SWAMP_FROG, HAS_ITEM(ITEM_MASK_DON_GERO)), + CHECK(RC_SOUTHERN_SWAMP_POISON_POT_01, true), + CHECK(RC_SOUTHERN_SWAMP_POISON_POT_02, true), + CHECK(RC_SOUTHERN_SWAMP_POISON_POT_03, true), + CHECK(RC_SOUTHERN_SWAMP_CLEAR_POT_01, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), + CHECK(RC_SOUTHERN_SWAMP_CLEAR_POT_02, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), + CHECK(RC_SOUTHERN_SWAMP_CLEAR_POT_03, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), + CHECK(RC_SOUTHERN_SWAMP_FREESTANDING_RUPEE_01, CAN_BE_DEKU || CAN_BE_ZORA), + CHECK(RC_SOUTHERN_SWAMP_FREESTANDING_RUPEE_02, CAN_BE_DEKU || CAN_BE_ZORA), CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_13, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_14, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_15, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), @@ -286,18 +346,6 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_28, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_29, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), CHECK(RC_SOUTHERN_SWAMP_CLEARED_GRASS_30, RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), - CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_01, true), - CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_02, true), - CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_03, true), - CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_04, true), - CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_05, true), - CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_06, true), - CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_07, true), - CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_08, true), - CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_09, true), - CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_10, true), - CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_11, true), - CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_12, true), CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_13, true), CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_14, true), CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_15, true), @@ -318,13 +366,12 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_30, true), }, .exits = { // TO FROM - EXIT(ENTRANCE(ROAD_TO_SOUTHERN_SWAMP, 1), ENTRANCE(SOUTHERN_SWAMP_POISONED, 0), true), - EXIT(ENTRANCE(TOURIST_INFORMATION, 0), ENTRANCE(SOUTHERN_SWAMP_POISONED, 1), true), EXIT(ENTRANCE(MAGIC_HAGS_POTION_SHOP, 0), ENTRANCE(SOUTHERN_SWAMP_POISONED, 5), true), EXIT(ENTRANCE(WOODS_OF_MYSTERY, 0), ENTRANCE(SOUTHERN_SWAMP_POISONED, 7), true), }, .connections = { - CONNECTION(RR_SOUTHERN_SWAMP_SOUTH, (RANDO_EVENTS[RE_SOUTHERN_SWAMP_KILL_OCTOROK] || RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE])), + CONNECTION(RR_SOUTHERN_SWAMP_SOUTH, CanGetPastBigOcto()), + CONNECTION(RR_SOUTHERN_SWAMP_NORTH, (CAN_BE_HUMAN && CAN_USE_ABILITY(SWIM)) || (CAN_BE_DEKU || CAN_BE_ZORA || CAN_BE_GORON)), }, .events = { EVENT(RE_ACCESS_SPRING_WATER, true), @@ -334,7 +381,6 @@ static RegisterShipInitFunc initFunc([]() { }, .oneWayEntrances = { ENTRANCE(SOUTHERN_SWAMP_POISONED, 9), // From river in Ikana - ENTRANCE(SOUTHERN_SWAMP_POISONED, 10), // From Song of Soaring } }; Regions[RR_SOUTHERN_SWAMP_SOUTH] = RandoRegion{ .name = "South Section", .sceneId = SCENE_20SICHITAI, @@ -348,7 +394,8 @@ static RegisterShipInitFunc initFunc([]() { EXIT(ENTRANCE(SWAMP_SPIDER_HOUSE, 0), ENTRANCE(SOUTHERN_SWAMP_POISONED, 8), CAN_LIGHT_TORCH_NEAR_ANOTHER && (CAN_BE_DEKU || RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE])), }, .connections = { - CONNECTION(RR_SOUTHERN_SWAMP_NORTH, (RANDO_EVENTS[RE_SOUTHERN_SWAMP_KILL_OCTOROK] || RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE])), + CONNECTION(RR_SOUTHERN_SWAMP_NORTH, CanGetPastBigOcto()), + CONNECTION(RR_SOUTHERN_SWAMP_NEAR_WOODS, CanGetPastBigOcto()), CONNECTION(RR_SOUTHERN_SWAMP_GROTTO, CAN_BE_DEKU), // TODO: Grotto mapping }, .events = { @@ -375,7 +422,7 @@ static RegisterShipInitFunc initFunc([]() { EXIT(ENTRANCE(SOUTHERN_SWAMP_POISONED, 1), ENTRANCE(TOURIST_INFORMATION, 0), true), }, .events = { - EVENT(RE_SOUTHERN_SWAMP_KILL_OCTOROK, RANDO_EVENTS[RE_SAVED_KOUME] || CAN_ACCESS(PICTOGRAPH_SWAMP_GENERIC)), + EVENT(RE_SOUTHERN_SWAMP_RIDE_BOAT, RANDO_EVENTS[RE_SAVED_KOUME] || CAN_ACCESS(PICTOGRAPH_SWAMP_GENERIC)), }, }; Regions[RR_WOODFALL_GREAT_FAIRY_FOUNTAIN] = RandoRegion{ .name = "Woodfall", .sceneId = SCENE_YOUSEI_IZUMI, @@ -388,13 +435,8 @@ static RegisterShipInitFunc initFunc([]() { }; Regions[RR_WOODFALL] = RandoRegion{ .sceneId = SCENE_21MITURINMAE, .checks = { - CHECK(RC_WOODFALL_ENTRANCE_CHEST, CAN_BE_DEKU || RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), + CHECK(RC_WOODFALL_ENTRANCE_CHEST, CAN_BE_DEKU || (RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE] && (CAN_BE_ZORA || CAN_BE_GORON || CAN_USE_ABILITY(SWIM)))), CHECK(RC_WOODFALL_PIECE_OF_HEART_CHEST, CAN_BE_DEKU), - CHECK(RC_WOODFALL_OWL_STATUE, CAN_USE_SWORD), - CHECK(RC_WOODFALL_NEAR_OWL_CHEST, CAN_BE_DEKU), - CHECK(RC_WOODFALL_POT_01, CAN_BE_DEKU || CAN_OWL_WARP(OWL_WARP_WOODFALL)), - CHECK(RC_WOODFALL_POT_02, CAN_BE_DEKU || CAN_OWL_WARP(OWL_WARP_WOODFALL)), - CHECK(RC_WOODFALL_POT_03, CAN_BE_DEKU || CAN_OWL_WARP(OWL_WARP_WOODFALL)), CHECK(RC_WOODFALL_FREESTANDING_RUPEE, CAN_BE_DEKU), CHECK(RC_WOODFALL_GRASS_01, true), CHECK(RC_WOODFALL_GRASS_02, true), @@ -405,10 +447,27 @@ static RegisterShipInitFunc initFunc([]() { }, .exits = { // TO FROM EXIT(ENTRANCE(SOUTHERN_SWAMP_POISONED, 2), ENTRANCE(WOODFALL, 0), true), - EXIT(ENTRANCE(WOODFALL_TEMPLE, 0), ENTRANCE(WOODFALL, 1), CanAccessDungeon(DUNGEON_SCENE_INDEX_WOODFALL_TEMPLE)), EXIT(ENTRANCE(FAIRY_FOUNTAIN, 1), ENTRANCE(WOODFALL, 2), CAN_BE_DEKU), EXIT(ENTRANCE(WOODFALL_TEMPLE, 2), ENTRANCE(WOODFALL, 3), RANDO_EVENTS[RE_CLEARED_WOODFALL_TEMPLE]), }, + .connections = { + CONNECTION(RR_WOODFALL_OWL_STATUE_PLATFORM, CAN_BE_DEKU), + }, + }; + Regions[RR_WOODFALL_OWL_STATUE_PLATFORM] = RandoRegion{ .name = "Owl Statue Platform", .sceneId = SCENE_21MITURINMAE, + .checks = { + CHECK(RC_WOODFALL_OWL_STATUE, CAN_USE_SWORD), + CHECK(RC_WOODFALL_NEAR_OWL_CHEST, CAN_BE_DEKU), + CHECK(RC_WOODFALL_POT_01, true), + CHECK(RC_WOODFALL_POT_02, true), + CHECK(RC_WOODFALL_POT_03, true), + }, + .exits = { // TO FROM + EXIT(ENTRANCE(WOODFALL_TEMPLE, 0), ENTRANCE(WOODFALL, 1), CAN_BE_DEKU && CanAccessDungeon(DUNGEON_SCENE_INDEX_WOODFALL_TEMPLE)), + }, + .connections = { + CONNECTION(RR_WOODFALL, CAN_BE_DEKU), + }, }; Regions[RR_WOODS_OF_MYSTERY_GROTTO] = RandoRegion{ .name = "Woods of Mystery Grotto", .sceneId = SCENE_KAKUSIANA, .checks = { diff --git a/mm/2s2h/Rando/Logic/Regions/TerminaField.cpp b/mm/2s2h/Rando/Logic/Regions/TerminaField.cpp index bb1b83a35..53b4bcdfc 100644 --- a/mm/2s2h/Rando/Logic/Regions/TerminaField.cpp +++ b/mm/2s2h/Rando/Logic/Regions/TerminaField.cpp @@ -25,7 +25,7 @@ static RegisterShipInitFunc initFunc([]() { }; Regions[RR_TERMINA_FIELD_BIO_BABA_GROTTO] = RandoRegion{ .name = "Termina Field Bio Baba", .sceneId = SCENE_KAKUSIANA, .checks = { - CHECK(RC_TERMINA_FIELD_BIO_BABA_GROTTO, CAN_BE_ZORA), + CHECK(RC_TERMINA_FIELD_BIO_BABA_GROTTO, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), CHECK(RC_TERMINA_FIELD_BIO_BABA_GROTTO_GRASS_01, true), CHECK(RC_TERMINA_FIELD_BIO_BABA_GROTTO_GRASS_02, true), }, @@ -249,7 +249,7 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_TERMINA_FIELD_POT, CAN_GROW_BEAN_PLANT), CHECK(RC_TERMINA_FIELD_TALL_GRASS_CHEST, true), CHECK(RC_TERMINA_FIELD_TREE_STUMP_CHEST, CAN_GROW_BEAN_PLANT || HAS_ITEM(ITEM_HOOKSHOT)), - CHECK(RC_TERMINA_FIELD_WATER_CHEST, CAN_BE_ZORA), + CHECK(RC_TERMINA_FIELD_WATER_CHEST, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), CHECK(RC_TERMINA_FIELD_FREESTANDING_RUPEE_01, true), // TODO: Fix duplicate item get... CHECK(RC_TERMINA_FIELD_GUAY_RUPEE_DROP_01, CAN_PLAY_SONG(SONATA) || CAN_PLAY_SONG(LULLABY) || CAN_PLAY_SONG(BOSSA_NOVA)), CHECK(RC_TERMINA_FIELD_GUAY_RUPEE_DROP_02, CAN_PLAY_SONG(SONATA) || CAN_PLAY_SONG(LULLABY) || CAN_PLAY_SONG(BOSSA_NOVA)), diff --git a/mm/2s2h/Rando/Logic/Regions/West.cpp b/mm/2s2h/Rando/Logic/Regions/West.cpp index fad9b3255..c91a17915 100644 --- a/mm/2s2h/Rando/Logic/Regions/West.cpp +++ b/mm/2s2h/Rando/Logic/Regions/West.cpp @@ -94,7 +94,7 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_72, true), }, .connections = { - CONNECTION(RR_GREAT_BAY_COAST, true), // TODO: Grotto mapping + CONNECTION(RR_GREAT_BAY_COAST_CLIFFSIDE, true), // TODO: Grotto mapping }, }; Regions[RR_GREAT_BAY_COAST_FISHERMAN_GROTTO] = RandoRegion{ .name = "Great Bay Coast Fisherman Grotto", .sceneId = SCENE_KAKUSIANA, @@ -122,26 +122,9 @@ static RegisterShipInitFunc initFunc([]() { Regions[RR_GREAT_BAY_COAST] = RandoRegion{ .sceneId = SCENE_30GYOSON, .checks = { CHECK(RC_GREAT_BAY_COAST_FISHERMAN_MINIGAME, RANDO_EVENTS[RE_CLEARED_GREAT_BAY_TEMPLE] && (HAS_ITEM(ITEM_HOOKSHOT) || CAN_USE_MAGIC_ARROW(ICE))), - CHECK(RC_GREAT_BAY_COAST_OWL_STATUE, CAN_USE_SWORD), - CHECK(RC_GREAT_BAY_COAST_MIKAU, CAN_PLAY_SONG(HEALING)), - CHECK(RC_GREAT_BAY_COAST_PIECE_OF_HEART, CAN_HOOK_SCARECROW && CAN_GROW_BEAN_PLANT), - CHECK(RC_GREAT_BAY_COAST_POT_01, true), - CHECK(RC_GREAT_BAY_COAST_POT_02, true), + CHECK(RC_GREAT_BAY_COAST_MIKAU, CAN_USE_ABILITY(SWIM) && CAN_PLAY_SONG(HEALING)), CHECK(RC_GREAT_BAY_COAST_POT_03, true), CHECK(RC_GREAT_BAY_COAST_POT_04, true), - CHECK(RC_GREAT_BAY_COAST_POT_05, true), - CHECK(RC_GREAT_BAY_COAST_POT_06, true), - CHECK(RC_GREAT_BAY_COAST_POT_07, true), - CHECK(RC_GREAT_BAY_COAST_POT_08, true), - CHECK(RC_GREAT_BAY_COAST_POT_09, true), - CHECK(RC_GREAT_BAY_COAST_POT_10, true), - CHECK(RC_GREAT_BAY_COAST_POT_11, true), - CHECK(RC_GREAT_BAY_COAST_POT_12, true), - CHECK(RC_GREAT_BAY_COAST_LEDGE_POT_01, HAS_ITEM(ITEM_HOOKSHOT)), - CHECK(RC_GREAT_BAY_COAST_LEDGE_POT_02, HAS_ITEM(ITEM_HOOKSHOT)), - CHECK(RC_GREAT_BAY_COAST_LEDGE_POT_03, HAS_ITEM(ITEM_HOOKSHOT)), - CHECK(RC_GREAT_BAY_COAST_TINGLE_MAP_01, (HAS_ITEM(ITEM_BOW) || HAS_ITEM(ITEM_HOOKSHOT)) && CAN_AFFORD(RC_GREAT_BAY_COAST_TINGLE_MAP_01)), - CHECK(RC_GREAT_BAY_COAST_TINGLE_MAP_02, (HAS_ITEM(ITEM_BOW) || HAS_ITEM(ITEM_HOOKSHOT)) && CAN_AFFORD(RC_GREAT_BAY_COAST_TINGLE_MAP_02)), CHECK(RC_GREAT_BAY_COAST_GRASS_01, true), CHECK(RC_GREAT_BAY_COAST_GRASS_02, true), CHECK(RC_GREAT_BAY_COAST_GRASS_03, true), @@ -151,22 +134,55 @@ static RegisterShipInitFunc initFunc([]() { .exits = { // TO FROM EXIT(ENTRANCE(TERMINA_FIELD, 2), ENTRANCE(GREAT_BAY_COAST, 0), true), EXIT(ENTRANCE(ZORA_CAPE, 0), ENTRANCE(GREAT_BAY_COAST, 1), true), - EXIT(ENTRANCE(PINNACLE_ROCK, 0), ENTRANCE(GREAT_BAY_COAST, 3), true), + EXIT(ENTRANCE(PINNACLE_ROCK, 0), ENTRANCE(GREAT_BAY_COAST, 3), CAN_USE_ABILITY(SWIM)), EXIT(ENTRANCE(FISHERMANS_HUT, 0), ENTRANCE(GREAT_BAY_COAST, 4), true), - EXIT(ENTRANCE(PIRATES_FORTRESS_EXTERIOR, 0), ENTRANCE(GREAT_BAY_COAST, 5), CAN_BE_ZORA), - EXIT(ENTRANCE(MARINE_RESEARCH_LAB, 0), ENTRANCE(GREAT_BAY_COAST, 7), true), + EXIT(ENTRANCE(PIRATES_FORTRESS_EXTERIOR, 0), ENTRANCE(GREAT_BAY_COAST, 5), CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), EXIT(ENTRANCE(OCEANSIDE_SPIDER_HOUSE, 0), ENTRANCE(GREAT_BAY_COAST, 8), true), }, .connections = { - CONNECTION(RR_GREAT_BAY_COAST_COW_GROTTO, CAN_HOOK_SCARECROW && CAN_GROW_BEAN_PLANT), // TODO: Grotto mapping + CONNECTION(RR_GREAT_BAY_COAST_CLIFFSIDE, CAN_USE_ABILITY(SWIM)), // TODO: Grotto mapping CONNECTION(RR_GREAT_BAY_COAST_FISHERMAN_GROTTO, true), // TODO: Grotto mapping + CONNECTION(RR_GREAT_BAY_COAST_MARINE_LAB_EXTERIOR, CAN_USE_ABILITY(SWIM)), + CONNECTION(RR_GREAT_BAY_COAST_PIRATE_LEDGE, CAN_USE_ABILITY(SWIM)), + }, + }; + Regions[RR_GREAT_BAY_COAST_MARINE_LAB_EXTERIOR] = RandoRegion{ .sceneId = SCENE_30GYOSON, + .checks = { + CHECK(RC_GREAT_BAY_COAST_OWL_STATUE, CAN_USE_SWORD), + CHECK(RC_GREAT_BAY_COAST_POT_09, true), + CHECK(RC_GREAT_BAY_COAST_POT_10, true), + CHECK(RC_GREAT_BAY_COAST_POT_11, true), + CHECK(RC_GREAT_BAY_COAST_POT_12, true), + CHECK(RC_GREAT_BAY_COAST_TINGLE_MAP_01, (HAS_ITEM(ITEM_BOW) || HAS_ITEM(ITEM_HOOKSHOT)) && CAN_AFFORD(RC_GREAT_BAY_COAST_TINGLE_MAP_01)), + CHECK(RC_GREAT_BAY_COAST_TINGLE_MAP_02, (HAS_ITEM(ITEM_BOW) || HAS_ITEM(ITEM_HOOKSHOT)) && CAN_AFFORD(RC_GREAT_BAY_COAST_TINGLE_MAP_02)), + }, + .exits = { // TO FROM + EXIT(ENTRANCE(MARINE_RESEARCH_LAB, 0), ENTRANCE(GREAT_BAY_COAST, 7), true), + }, + .connections = { + CONNECTION(RR_GREAT_BAY_COAST, CAN_USE_ABILITY(SWIM)), }, .events = { EVENT(RE_ACCESS_PICTOGRAPH_TINGLE, HAS_ITEM(ITEM_PICTOGRAPH_BOX)), }, .oneWayEntrances = { ENTRANCE(GREAT_BAY_COAST, 11), // From Song of Soaring - ENTRANCE(GREAT_BAY_COAST, 12), // From being captured in Pirate Fortress Moat + }, + }; + Regions[RR_GREAT_BAY_COAST_CLIFFSIDE] = RandoRegion{ .sceneId = SCENE_30GYOSON, + .checks = { + CHECK(RC_GREAT_BAY_COAST_PIECE_OF_HEART, CAN_HOOK_SCARECROW && CAN_GROW_BEAN_PLANT), + CHECK(RC_GREAT_BAY_COAST_POT_05, true), + CHECK(RC_GREAT_BAY_COAST_POT_06, true), + CHECK(RC_GREAT_BAY_COAST_POT_07, true), + CHECK(RC_GREAT_BAY_COAST_POT_08, true), + CHECK(RC_GREAT_BAY_COAST_LEDGE_POT_01, HAS_ITEM(ITEM_HOOKSHOT)), + CHECK(RC_GREAT_BAY_COAST_LEDGE_POT_02, HAS_ITEM(ITEM_HOOKSHOT)), + CHECK(RC_GREAT_BAY_COAST_LEDGE_POT_03, HAS_ITEM(ITEM_HOOKSHOT)), + }, + .connections = { + CONNECTION(RR_GREAT_BAY_COAST_COW_GROTTO, CAN_HOOK_SCARECROW && CAN_GROW_BEAN_PLANT), // TODO: Grotto mapping + CONNECTION(RR_GREAT_BAY_COAST, CAN_USE_ABILITY(SWIM)), }, }; Regions[RR_GREAT_BAY_GREAT_FAIRY_FOUNTAIN] = RandoRegion{ .sceneId = SCENE_YOUSEI_IZUMI, @@ -177,6 +193,19 @@ static RegisterShipInitFunc initFunc([]() { EXIT(ENTRANCE(ZORA_CAPE, 5), ENTRANCE(FAIRY_FOUNTAIN, 3), true), }, }; + Regions[RR_GREAT_BAY_COAST_PIRATE_LEDGE] = RandoRegion{ .sceneId = SCENE_30GYOSON, + .checks = { + CHECK(RC_GREAT_BAY_COAST_POT_01, true), + CHECK(RC_GREAT_BAY_COAST_POT_02, true), + }, + .connections = { + CONNECTION(RR_GREAT_BAY_COAST, CAN_USE_ABILITY(SWIM)), + }, + .oneWayEntrances = { + // This region can feel like overkill now, but this one-way entrance will be significant for entrance rando. + ENTRANCE(GREAT_BAY_COAST, 12), // From being captured in Pirate Fortress Moat + }, + }; Regions[RR_MARINE_RESEARCH_LAB] = RandoRegion{ .sceneId = SCENE_LABO, .checks = { CHECK(RC_GREAT_BAY_COAST_NEW_WAVE_BOSSA_NOVA, CAN_BE_ZORA && HAS_ITEM(ITEM_OCARINA_OF_TIME) && RANDO_EVENTS[RE_ACCESS_ZORA_EGG] >= 7), @@ -212,7 +241,7 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_PINNACLE_ROCK_REUNITE_SEAHORSE, CAN_BE_ZORA && HAS_MAGIC && RANDO_EVENTS[RE_ACCESS_SEAHORSE]), }, .connections = { - CONNECTION(RR_PINNACLE_ROCK_ENTRANCE, true) + CONNECTION(RR_PINNACLE_ROCK_ENTRANCE, CAN_USE_ABILITY(SWIM)) }, .events = { EVENT(RE_ACCESS_ZORA_EGG, HAS_MAGIC && HAS_BOTTLE && CAN_BE_ZORA), @@ -222,8 +251,8 @@ static RegisterShipInitFunc initFunc([]() { }; Regions[RR_WATERFALL_RAPIDS] = RandoRegion{ .sceneId = SCENE_35TAKI, .checks = { - CHECK(RC_WATERFALL_RAPIDS_BEAVER_RACE_01, CAN_BE_ZORA), - CHECK(RC_WATERFALL_RAPIDS_BEAVER_RACE_02, CAN_BE_ZORA), + CHECK(RC_WATERFALL_RAPIDS_BEAVER_RACE_01, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_WATERFALL_RAPIDS_BEAVER_RACE_02, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), }, .exits = { // TO FROM EXIT(ENTRANCE(ZORA_CAPE, 4), ENTRANCE(WATERFALL_RAPIDS, 0), true), @@ -275,14 +304,14 @@ static RegisterShipInitFunc initFunc([]() { .checks = { CHECK(RC_ZORA_CAPE_LEDGE_CHEST_01, HAS_ITEM(ITEM_HOOKSHOT)), CHECK(RC_ZORA_CAPE_LEDGE_CHEST_02, HAS_ITEM(ITEM_HOOKSHOT)), - CHECK(RC_ZORA_CAPE_UNDERWATER_CHEST, CAN_BE_ZORA), - CHECK(RC_ZORA_CAPE_WATERFALL_PIECE_OF_HEART, CAN_BE_ZORA), + CHECK(RC_ZORA_CAPE_UNDERWATER_CHEST, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_ZORA_CAPE_WATERFALL_PIECE_OF_HEART, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), CHECK(RC_ZORA_CAPE_NEAR_BEAVERS_POT_01, true), CHECK(RC_ZORA_CAPE_NEAR_BEAVERS_POT_02, true), }, .exits = { // TO FROM EXIT(ENTRANCE(GREAT_BAY_COAST, 1), ENTRANCE(ZORA_CAPE, 0), true), - EXIT(ENTRANCE(ZORA_HALL, 0), ENTRANCE(ZORA_CAPE, 1), CAN_BE_ZORA), + EXIT(ENTRANCE(ZORA_HALL, 0), ENTRANCE(ZORA_CAPE, 1), CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), EXIT(ENTRANCE(WATERFALL_RAPIDS, 0), ENTRANCE(ZORA_CAPE, 4), HAS_ITEM(ITEM_HOOKSHOT)), EXIT(ENTRANCE(FAIRY_FOUNTAIN, 3), ENTRANCE(ZORA_CAPE, 5), HAS_ITEM(ITEM_HOOKSHOT) && CAN_USE_EXPLOSIVE), }, diff --git a/mm/2s2h/Rando/Menu.cpp b/mm/2s2h/Rando/Menu.cpp index 3cbf76f23..e7fa06f78 100644 --- a/mm/2s2h/Rando/Menu.cpp +++ b/mm/2s2h/Rando/Menu.cpp @@ -270,8 +270,9 @@ static void DrawItemsTab() { f32 columnWidth = ImGui::GetContentRegionAvail().x / 3 - (ImGui::GetStyle().ItemSpacing.x * 2); f32 halfHeight = ImGui::GetContentRegionAvail().y / 3 - (ImGui::GetStyle().ItemSpacing.y * 2); ImGui::BeginChild("randoItemsColumn1", ImVec2(columnWidth, halfHeight)); - CVarCheckbox("Bronze Scale", "gPlaceholderBool", - CheckboxOptions({ { .disabled = true, .disabledTooltip = "Coming Soon" } })); + CVarCheckbox("Shuffle Swim", Rando::StaticData::Options[RO_SHUFFLE_SWIM].cvar, + CheckboxOptions({ { .tooltip = "Shuffles the ability to Swim, entering the Swim state or submerging\n" + "into deep water will respawn Link." } })); CVarCheckbox("Deku Stick Bag", "gPlaceholderBool", CheckboxOptions({ { .disabled = true, .disabledTooltip = "Coming Soon" } })); CVarCheckbox("Deku Nut Bag", "gPlaceholderBool", diff --git a/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp b/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp index 668f5e7ba..93b9621bd 100644 --- a/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp +++ b/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp @@ -245,6 +245,10 @@ void Rando::MiscBehavior::OnFileCreate(s16 fileNum) { } } + if (RANDO_SAVE_OPTIONS[RO_SHUFFLE_SWIM] == RO_GENERIC_YES) { + itemPool.push_back(RI_ABILITY_SWIM); + } + // Remove starting items from the pool (but only one per entry in startingItems) for (RandoItemId startingItem : startingItems) { auto it = std::find(itemPool.begin(), itemPool.end(), startingItem); diff --git a/mm/2s2h/Rando/StaticData/Items.cpp b/mm/2s2h/Rando/StaticData/Items.cpp index b0243aaf7..a2a127a97 100644 --- a/mm/2s2h/Rando/StaticData/Items.cpp +++ b/mm/2s2h/Rando/StaticData/Items.cpp @@ -22,6 +22,7 @@ namespace StaticData { // clang-format off std::map Items = { RI(RI_UNKNOWN, "", "Unknown", RITYPE_JUNK, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_ABILITY_SWIM, "the", "Ability to Swim", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_ARROW_FIRE, "", "Fire Arrows", RITYPE_MAJOR, ITEM_ARROW_FIRE, GI_ARROW_FIRE, GID_ARROW_FIRE), RI(RI_ARROW_ICE, "", "Ice Arrows", RITYPE_MAJOR, ITEM_ARROW_ICE, GI_ARROW_ICE, GID_ARROW_ICE), RI(RI_ARROW_LIGHT, "", "Light Arrows", RITYPE_MAJOR, ITEM_ARROW_LIGHT, GI_ARROW_LIGHT, GID_ARROW_LIGHT), diff --git a/mm/2s2h/Rando/StaticData/Options.cpp b/mm/2s2h/Rando/StaticData/Options.cpp index 66879099c..38a35e459 100644 --- a/mm/2s2h/Rando/StaticData/Options.cpp +++ b/mm/2s2h/Rando/StaticData/Options.cpp @@ -39,6 +39,7 @@ std::map Options = { RO(RO_SHUFFLE_POT_DROPS, RO_GENERIC_OFF), RO(RO_SHUFFLE_SHOPS, RO_GENERIC_OFF), RO(RO_SHUFFLE_SNOWBALL_DROPS, RO_GENERIC_OFF), + RO(RO_SHUFFLE_SWIM, RO_GENERIC_OFF), RO(RO_SHUFFLE_TINGLE_SHOPS, RO_GENERIC_OFF), RO(RO_STARTING_CONSUMABLES, RO_GENERIC_OFF), RO(RO_STARTING_HEALTH, 3), diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h index 73fd2913a..ef9725be7 100644 --- a/mm/2s2h/Rando/Types.h +++ b/mm/2s2h/Rando/Types.h @@ -2252,6 +2252,7 @@ typedef enum { typedef enum { RI_UNKNOWN, + RI_ABILITY_SWIM, RI_ARROW_FIRE, RI_ARROW_ICE, RI_ARROW_LIGHT, @@ -2480,9 +2481,12 @@ typedef enum { RR_GORON_SHOP, RR_GORON_SHRINE, RR_GORON_VILLAGE, + RR_GREAT_BAY_COAST_CLIFFSIDE, RR_GREAT_BAY_COAST_COW_GROTTO, RR_GREAT_BAY_COAST_FISHERMAN_GROTTO, RR_GREAT_BAY_COAST, + RR_GREAT_BAY_COAST_MARINE_LAB_EXTERIOR, + RR_GREAT_BAY_COAST_PIRATE_LEDGE, RR_GREAT_BAY_GREAT_FAIRY_FOUNTAIN, RR_GREAT_BAY_TEMPLE_BABA_CHEST_ROOM, RR_GREAT_BAY_TEMPLE_BEFORE_WART, @@ -2628,6 +2632,7 @@ typedef enum { RR_SNOWHEAD_TEMPLE_SNOW_ROOM, RR_SNOWHEAD_TEMPLE_UPPER_WIZZROBE_ROOM, RR_SOUTHERN_SWAMP_GROTTO, + RR_SOUTHERN_SWAMP_NEAR_WOODS, RR_SOUTHERN_SWAMP_NORTH, RR_SOUTHERN_SWAMP_SOUTH, RR_STONE_TOWER_BOTTOM, @@ -2698,6 +2703,7 @@ typedef enum { RR_TREASURE_SHOP, RR_WATERFALL_RAPIDS, RR_WOODFALL_GREAT_FAIRY_FOUNTAIN, + RR_WOODFALL_OWL_STATUE_PLATFORM, RR_WOODFALL_TEMPLE_BOSS_KEY_ROOM, RR_WOODFALL_TEMPLE_BOSS_ROOM, RR_WOODFALL_TEMPLE_BOW_ROOM, @@ -2754,6 +2760,7 @@ typedef enum { RO_SHUFFLE_POT_DROPS, RO_SHUFFLE_SHOPS, RO_SHUFFLE_SNOWBALL_DROPS, + RO_SHUFFLE_SWIM, RO_SHUFFLE_TINGLE_SHOPS, RO_STARTING_CONSUMABLES, RO_STARTING_HEALTH, @@ -2817,6 +2824,7 @@ typedef enum { RANDO_INF_OBTAINED_SOUL_OF_MAJORA, RANDO_INF_OBTAINED_SOUL_OF_ODOLWA, RANDO_INF_OBTAINED_SOUL_OF_TWINMOLD, + RANDO_INF_OBTAINED_SWIM, RANDO_INF_MAX, } RandoInf; @@ -2857,6 +2865,7 @@ typedef enum { RE_SECRET_SHRINE_WART, RE_SECRET_SHRINE_GARO_MASTER, RE_SOUTHERN_SWAMP_KILL_OCTOROK, + RE_SOUTHERN_SWAMP_RIDE_BOAT, RE_SWAMP_SPIDER_HOUSE_GOLD_ROOM_LADDER, RE_IKANA_CASTLE_MAIN_SUNLIGHT, RE_IKANA_CASTLE_RIGHT_SUNLIGHT, diff --git a/mm/assets/2s2h_assets.h b/mm/assets/2s2h_assets.h index 61e7effbd..5581dad87 100644 --- a/mm/assets/2s2h_assets.h +++ b/mm/assets/2s2h_assets.h @@ -370,3 +370,6 @@ static const ALIGN_ASSET(2) char gCrateTrackerIcon[] = dgCrateTrackerIcon; #define dgBarrelTrackerIcon "__OTR__textures/icons/gBarrelTrackerIcon" static const ALIGN_ASSET(2) char gBarrelTrackerIcon[] = dgBarrelTrackerIcon; + +#define dgGiFlippersDL "__OTR__objects/object_ability_swim/gGiFlippersDL" +static const ALIGN_ASSET(2) char gGiFlippersDL[] = dgGiFlippersDL; diff --git a/mm/assets/custom/objects/object_ability_swim/flippers b/mm/assets/custom/objects/object_ability_swim/flippers new file mode 100644 index 000000000..c133124a3 Binary files /dev/null and b/mm/assets/custom/objects/object_ability_swim/flippers differ diff --git a/mm/assets/custom/objects/object_ability_swim/flippers2 b/mm/assets/custom/objects/object_ability_swim/flippers2 new file mode 100644 index 000000000..0958ba4ed Binary files /dev/null and b/mm/assets/custom/objects/object_ability_swim/flippers2 differ diff --git a/mm/assets/custom/objects/object_ability_swim/gGiFlippersDL b/mm/assets/custom/objects/object_ability_swim/gGiFlippersDL new file mode 100644 index 000000000..cdf042fe9 --- /dev/null +++ b/mm/assets/custom/objects/object_ability_swim/gGiFlippersDL @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ability_swim/gGiFlippersDL_tri_0 b/mm/assets/custom/objects/object_ability_swim/gGiFlippersDL_tri_0 new file mode 100644 index 000000000..b687b1624 --- /dev/null +++ b/mm/assets/custom/objects/object_ability_swim/gGiFlippersDL_tri_0 @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ability_swim/gGiFlippersDL_tri_1 b/mm/assets/custom/objects/object_ability_swim/gGiFlippersDL_tri_1 new file mode 100644 index 000000000..6b5b57c0a --- /dev/null +++ b/mm/assets/custom/objects/object_ability_swim/gGiFlippersDL_tri_1 @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ability_swim/gGiFlippersDL_vtx_0 b/mm/assets/custom/objects/object_ability_swim/gGiFlippersDL_vtx_0 new file mode 100644 index 000000000..e8e529aef --- /dev/null +++ b/mm/assets/custom/objects/object_ability_swim/gGiFlippersDL_vtx_0 @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ability_swim/gGiFlippersDL_vtx_1 b/mm/assets/custom/objects/object_ability_swim/gGiFlippersDL_vtx_1 new file mode 100644 index 000000000..85dcede42 --- /dev/null +++ b/mm/assets/custom/objects/object_ability_swim/gGiFlippersDL_vtx_1 @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ability_swim/mat_gGiFlippersDL_flippers b/mm/assets/custom/objects/object_ability_swim/mat_gGiFlippersDL_flippers new file mode 100644 index 000000000..b456d6367 --- /dev/null +++ b/mm/assets/custom/objects/object_ability_swim/mat_gGiFlippersDL_flippers @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ability_swim/mat_gGiFlippersDL_flippers2 b/mm/assets/custom/objects/object_ability_swim/mat_gGiFlippersDL_flippers2 new file mode 100644 index 000000000..b3d6c1821 --- /dev/null +++ b/mm/assets/custom/objects/object_ability_swim/mat_gGiFlippersDL_flippers2 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3