diff --git a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTracker.cpp b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTracker.cpp index e825bc62ad..d600831bf0 100644 --- a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTracker.cpp +++ b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTracker.cpp @@ -83,6 +83,9 @@ extern TrackerImageObject GetTextureObject(int16_t itemId, bool isRandoItem) { case RI_OWL_ZORA_CAPE: itemObtained = GET_OWL_STATUE_ACTIVATED(OWL_WARP_ZORA_CAPE); break; + case RI_OWL_HIDDEN: + itemObtained = GET_OWL_STATUE_ACTIVATED(OWL_WARP_HIDDEN); + break; case RI_SOUL_GOHT: case RI_SOUL_GYORG: case RI_SOUL_MAJORA: @@ -120,7 +123,7 @@ extern TrackerImageObject GetTextureObject(int16_t itemId, bool isRandoItem) { (const char*)Rando::StaticData::GetIconTexturePath((RandoItemId)itemId)); randoImageObject.textureDimensions = ImVec2(ITEM_TEXTURE_SIZE, - itemId >= RI_OWL_CLOCK_TOWN_SOUTH && itemId <= RI_OWL_ZORA_CAPE ? 32.0f : ITEM_TEXTURE_SIZE); + itemId >= RI_OWL_CLOCK_TOWN_SOUTH && itemId <= RI_OWL_HIDDEN ? 32.0f : ITEM_TEXTURE_SIZE); return randoImageObject; } else { diff --git a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp index b20b576982..f0b703d039 100644 --- a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp +++ b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp @@ -44,7 +44,7 @@ std::map> defaultItemLists = std::map> randoItemLists = { { "Frogs", { RI_FROG_BLUE, RI_FROG_WHITE, 4 } }, { "Boss Souls", { RI_SOUL_GOHT, RI_SOUL_TWINMOLD, 5 } }, - { "Owl Statues", { RI_OWL_CLOCK_TOWN_SOUTH, RI_OWL_ZORA_CAPE, 5 } }, + { "Owl Statues", { RI_OWL_CLOCK_TOWN_SOUTH, RI_OWL_HIDDEN, 5 } }, { "Tingle Maps", { RI_TINGLE_MAP_CLOCK_TOWN, RI_TINGLE_MAP_WOODFALL, 6 } }, { "Misc", { RI_TRIFORCE_PIECE, RI_TRIFORCE_PIECE, 1 } }, }; diff --git a/mm/2s2h/Rando/ConvertItem.cpp b/mm/2s2h/Rando/ConvertItem.cpp index 26ba83a947..73a792f897 100644 --- a/mm/2s2h/Rando/ConvertItem.cpp +++ b/mm/2s2h/Rando/ConvertItem.cpp @@ -372,6 +372,8 @@ bool Rando::IsItemObtainable(RandoItemId randoItemId, RandoCheckId randoCheckId) return !CAN_OWL_WARP(OWL_WARP_WOODFALL); case RI_OWL_ZORA_CAPE: return !CAN_OWL_WARP(OWL_WARP_ZORA_CAPE); + case RI_OWL_HIDDEN: + return !CAN_OWL_WARP(OWL_WARP_HIDDEN); // These items are technically fine to receive again because they don't do anything, but we'll convert them to // ensure it's clear to the player something didn't go wrong. // Quest Items diff --git a/mm/2s2h/Rando/DrawItem.cpp b/mm/2s2h/Rando/DrawItem.cpp index fa96c72dbd..f344f43b1a 100644 --- a/mm/2s2h/Rando/DrawItem.cpp +++ b/mm/2s2h/Rando/DrawItem.cpp @@ -494,6 +494,7 @@ void Rando::DrawItem(RandoItemId randoItemId, Actor* actor) { case RI_OWL_SOUTHERN_SWAMP: case RI_OWL_STONE_TOWER: case RI_OWL_WOODFALL: + case RI_OWL_HIDDEN: case RI_OWL_ZORA_CAPE: DrawOwlStatue(); break; diff --git a/mm/2s2h/Rando/GiveItem.cpp b/mm/2s2h/Rando/GiveItem.cpp index 5d404db23d..19a89d7748 100644 --- a/mm/2s2h/Rando/GiveItem.cpp +++ b/mm/2s2h/Rando/GiveItem.cpp @@ -258,6 +258,9 @@ void Rando::GiveItem(RandoItemId randoItemId) { case RI_OWL_ZORA_CAPE: Sram_ActivateOwl(OWL_WARP_ZORA_CAPE); break; + case RI_OWL_HIDDEN: + Sram_ActivateOwl(OWL_WARP_HIDDEN); + break; case RI_HEART_CONTAINER: case RI_HEART_PIECE: gSaveContext.healthAccumulator = gSaveContext.save.saveInfo.playerData.healthCapacity + 0x10; diff --git a/mm/2s2h/Rando/Logic/Logic.cpp b/mm/2s2h/Rando/Logic/Logic.cpp index b763975571..9fc16a1b1c 100644 --- a/mm/2s2h/Rando/Logic/Logic.cpp +++ b/mm/2s2h/Rando/Logic/Logic.cpp @@ -62,16 +62,16 @@ static RegisterShipInitFunc initFunc([]() { }, .exits = { // TO FROM 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)), - EXIT(ENTRANCE(GREAT_BAY_COAST, 11), ONE_WAY_EXIT, CAN_PLAY_SONG(SOARING) && CAN_OWL_WARP(OWL_WARP_GREAT_BAY_COAST)), - EXIT(ENTRANCE(ZORA_CAPE, 6), ONE_WAY_EXIT, CAN_PLAY_SONG(SOARING) && CAN_OWL_WARP(OWL_WARP_ZORA_CAPE)), - EXIT(ENTRANCE(IKANA_CANYON, 4), ONE_WAY_EXIT, CAN_PLAY_SONG(SOARING) && CAN_OWL_WARP(OWL_WARP_IKANA_CANYON)), - EXIT(ENTRANCE(STONE_TOWER, 3), ONE_WAY_EXIT, CAN_PLAY_SONG(SOARING) && CAN_OWL_WARP(OWL_WARP_STONE_TOWER)), + EXIT(ENTRANCE(SOUTH_CLOCK_TOWN, 9), ONE_WAY_EXIT, CAN_PLAY_SONG(SOARING) && (CAN_OWL_WARP(OWL_WARP_CLOCK_TOWN) || CAN_OWL_WARP(OWL_WARP_HIDDEN))), + EXIT(ENTRANCE(SOUTHERN_SWAMP_POISONED, 10), ONE_WAY_EXIT, CAN_PLAY_SONG(SOARING) && (CAN_OWL_WARP(OWL_WARP_SOUTHERN_SWAMP) || CAN_OWL_WARP(OWL_WARP_HIDDEN))), + EXIT(ENTRANCE(WOODFALL, 4), ONE_WAY_EXIT, CAN_PLAY_SONG(SOARING) && (CAN_OWL_WARP(OWL_WARP_WOODFALL) || CAN_OWL_WARP(OWL_WARP_HIDDEN))), + EXIT(ENTRANCE(MILK_ROAD, 4), ONE_WAY_EXIT, CAN_PLAY_SONG(SOARING) && (CAN_OWL_WARP(OWL_WARP_MILK_ROAD) || CAN_OWL_WARP(OWL_WARP_HIDDEN))), + EXIT(ENTRANCE(MOUNTAIN_VILLAGE_WINTER, 8), ONE_WAY_EXIT, CAN_PLAY_SONG(SOARING) && (CAN_OWL_WARP(OWL_WARP_MOUNTAIN_VILLAGE) || CAN_OWL_WARP(OWL_WARP_HIDDEN))), + EXIT(ENTRANCE(SNOWHEAD, 3), ONE_WAY_EXIT, CAN_PLAY_SONG(SOARING) && (CAN_OWL_WARP(OWL_WARP_SNOWHEAD) || CAN_OWL_WARP(OWL_WARP_HIDDEN))), + EXIT(ENTRANCE(GREAT_BAY_COAST, 11), ONE_WAY_EXIT, CAN_PLAY_SONG(SOARING) && (CAN_OWL_WARP(OWL_WARP_GREAT_BAY_COAST) || CAN_OWL_WARP(OWL_WARP_HIDDEN))), + EXIT(ENTRANCE(ZORA_CAPE, 6), ONE_WAY_EXIT, CAN_PLAY_SONG(SOARING) && (CAN_OWL_WARP(OWL_WARP_ZORA_CAPE) || CAN_OWL_WARP(OWL_WARP_HIDDEN))), + EXIT(ENTRANCE(IKANA_CANYON, 4), ONE_WAY_EXIT, CAN_PLAY_SONG(SOARING) && (CAN_OWL_WARP(OWL_WARP_IKANA_CANYON) || CAN_OWL_WARP(OWL_WARP_HIDDEN))), + EXIT(ENTRANCE(STONE_TOWER, 3), ONE_WAY_EXIT, CAN_PLAY_SONG(SOARING) && (CAN_OWL_WARP(OWL_WARP_STONE_TOWER) || CAN_OWL_WARP(OWL_WARP_HIDDEN))), }, }; }, {}); diff --git a/mm/2s2h/Rando/Logic/Regions/Central.cpp b/mm/2s2h/Rando/Logic/Regions/Central.cpp index ac83416f94..813d6c4db1 100644 --- a/mm/2s2h/Rando/Logic/Regions/Central.cpp +++ b/mm/2s2h/Rando/Logic/Regions/Central.cpp @@ -138,8 +138,8 @@ static RegisterShipInitFunc initFunc([]() { }; Regions[RR_CLOCK_TOWN_NORTH] = RandoRegion{ .sceneId = SCENE_BACKTOWN, .checks = { - CHECK(RC_CLOCK_TOWN_NORTH_TINGLE_MAP_01, CAN_USE_PROJECTILE && CAN_AFFORD(RC_CLOCK_TOWN_NORTH_TINGLE_MAP_01)), - CHECK(RC_CLOCK_TOWN_NORTH_TINGLE_MAP_02, CAN_USE_PROJECTILE && CAN_AFFORD(RC_CLOCK_TOWN_NORTH_TINGLE_MAP_02)), + CHECK(RC_CLOCK_TOWN_NORTH_TINGLE_MAP_01, (CAN_USE_PROJECTILE || CAN_USE_SWORD) && CAN_AFFORD(RC_CLOCK_TOWN_NORTH_TINGLE_MAP_01)), + CHECK(RC_CLOCK_TOWN_NORTH_TINGLE_MAP_02, (CAN_USE_PROJECTILE || CAN_USE_SWORD) && CAN_AFFORD(RC_CLOCK_TOWN_NORTH_TINGLE_MAP_02)), CHECK(RC_CLOCK_TOWN_NORTH_TREE_PIECE_OF_HEART, true), CHECK(RC_CLOCK_TOWN_NORTH_BOMB_LADY, CAN_USE_SWORD || CAN_BE_ZORA || CAN_BE_GORON), CHECK(RC_CLOCK_TOWN_BOMBERS_NOTEBOOK, CAN_USE_PROJECTILE), // TODO: This will have to check for access with entrance rando diff --git a/mm/2s2h/Rando/RemoveItem.cpp b/mm/2s2h/Rando/RemoveItem.cpp index 6a3c79341b..e9bf030522 100644 --- a/mm/2s2h/Rando/RemoveItem.cpp +++ b/mm/2s2h/Rando/RemoveItem.cpp @@ -264,6 +264,9 @@ void Rando::RemoveItem(RandoItemId randoItemId) { case RI_OWL_ZORA_CAPE: CLEAR_OWL_WARP(OWL_WARP_ZORA_CAPE); break; + case RI_OWL_HIDDEN: + CLEAR_OWL_WARP(OWL_WARP_HIDDEN); + break; case RI_TINGLE_MAP_CLOCK_TOWN: CLEAR_WEEKEVENTREG(WEEKEVENTREG_TINGLE_MAP_BOUGHT_CLOCK_TOWN); break; diff --git a/mm/2s2h/Rando/StaticData/Items.cpp b/mm/2s2h/Rando/StaticData/Items.cpp index 8afe1c06d1..bf87b3f900 100644 --- a/mm/2s2h/Rando/StaticData/Items.cpp +++ b/mm/2s2h/Rando/StaticData/Items.cpp @@ -127,6 +127,7 @@ std::map Items = { RI(RI_OWL_STONE_TOWER, "the", "Stone Tower Owl Statue", RITYPE_LESSER, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_OWL_WOODFALL, "the", "Woodfall Owl Statue", RITYPE_LESSER, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_OWL_ZORA_CAPE, "the", "Zora Cape Owl Statue", RITYPE_LESSER, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_OWL_HIDDEN, "the", "Hidden Owl Statue", RITYPE_LESSER, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_PENDANT_OF_MEMORIES, "the", "Pendant of Memories", RITYPE_MAJOR, ITEM_PENDANT_OF_MEMORIES, GI_PENDANT_OF_MEMORIES, GID_PENDANT_OF_MEMORIES), RI(RI_PICTOGRAPH_BOX, "a", "Pictograph Box", RITYPE_MAJOR, ITEM_PICTOGRAPH_BOX, GI_PICTOGRAPH_BOX, GID_PICTOGRAPH_BOX), RI(RI_POWDER_KEG, "a", "Powder Keg", RITYPE_MAJOR, ITEM_POWDER_KEG, GI_POWDER_KEG, GID_POWDER_KEG), @@ -345,6 +346,7 @@ const char* GetIconTexturePath(RandoItemId randoItemId) { case RI_OWL_SOUTHERN_SWAMP: case RI_OWL_STONE_TOWER: case RI_OWL_WOODFALL: + case RI_OWL_HIDDEN: case RI_OWL_ZORA_CAPE: return (const char*)gWorldMapOwlFaceTex; case RI_TINGLE_MAP_CLOCK_TOWN: diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h index 6c640e59e5..39bca68e01 100644 --- a/mm/2s2h/Rando/Types.h +++ b/mm/2s2h/Rando/Types.h @@ -2412,6 +2412,7 @@ typedef enum { RI_OWL_STONE_TOWER, RI_OWL_WOODFALL, RI_OWL_ZORA_CAPE, + RI_OWL_HIDDEN, RI_PENDANT_OF_MEMORIES, RI_PICTOGRAPH_BOX, RI_POWDER_KEG, diff --git a/mm/include/z64scene.h b/mm/include/z64scene.h index d6cc660f2d..15b29735b0 100644 --- a/mm/include/z64scene.h +++ b/mm/include/z64scene.h @@ -607,6 +607,7 @@ typedef enum OwlWarpId { /* 0x9 */ OWL_WARP_STONE_TOWER, /* 0xA */ OWL_WARP_ENTRANCE, // Special index for warping to the entrance of a scene /* 0xB */ OWL_WARP_MAX, + /* 0xF */ OWL_WARP_HIDDEN = 0xF, /* 0xFF */ OWL_WARP_NONE = 0xFF } OwlWarpId;