diff --git a/mm/2s2h/Enhancements/Songs/SkipScarecrowSong.cpp b/mm/2s2h/Enhancements/Songs/SkipScarecrowSong.cpp index c5aac238bd..c3902a2c9e 100644 --- a/mm/2s2h/Enhancements/Songs/SkipScarecrowSong.cpp +++ b/mm/2s2h/Enhancements/Songs/SkipScarecrowSong.cpp @@ -1,6 +1,7 @@ #include #include "2s2h/GameInteractor/GameInteractor.h" #include "2s2h/ShipInit.hpp" +#include "2s2h/Rando/Logic/Logic.h" extern "C" { #include "variables.h" @@ -18,10 +19,18 @@ void RegisterSkipScarecrowSong() { * This is somewhat similar to the condition that the scarecrow normally checks, except it checks if the * instrument is being played at all instead of having played the Scarecrow's Song in particular, and it * bypasses the check that Link has taught Pierre a song this cycle. + * + * With Ocarina buttons shuffled, this enhancement will only apply if at least two buttons are obtained. This is + * consistent with the requirements to create the Scarecrow's Song, i.e. play at least two different notes. */ if ((enKakasi->picto.actor.xzDistToPlayer < enKakasi->songSummonDist) && ((BREG(1) != 0) || (gPlayState->msgCtx.ocarinaMode == OCARINA_MODE_ACTIVE))) { + if (IS_RANDO && !Rando::Logic::canPlaySong(OCARINA_SONG_SCARECROW_SPAWN)) { + return; + } + *should = true; + // Properly get out of the ocarina playing state AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); Message_CloseTextbox(gPlayState); diff --git a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTracker.cpp b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTracker.cpp index 15a2d8ec09..c8c4852f2f 100644 --- a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTracker.cpp +++ b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTracker.cpp @@ -40,7 +40,7 @@ extern TrackerImageObject GetTextureObject(int16_t itemId, bool isRandoItem) { if (isRandoItem) { TrackerImageObject randoImageObject; - randoImageObject.textureColor = ImVec4(1, 1, 1, 1); + randoImageObject.textureColor = Ship_GetRandoItemColorTint(itemId); switch (itemId) { case RI_FROG_BLUE: @@ -176,6 +176,13 @@ extern TrackerImageObject GetTextureObject(int16_t itemId, bool isRandoItem) { case RI_TRIFORCE_PIECE: itemObtained = gSaveContext.save.shipSaveInfo.rando.foundTriforcePieces > 0; break; + case RI_OCARINA_BUTTON_A: + case RI_OCARINA_BUTTON_C_DOWN: + case RI_OCARINA_BUTTON_C_LEFT: + case RI_OCARINA_BUTTON_C_RIGHT: + case RI_OCARINA_BUTTON_C_UP: + itemObtained = Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_A + (itemId - RI_OCARINA_BUTTON_A)); + break; default: break; } diff --git a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp index dec6e019dc..e02be5b4e0 100644 --- a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp +++ b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp @@ -27,7 +27,7 @@ std::vector listOrder = { }; std::vector randoListOrder = { - "Frogs", "Boss Souls", "Enemy Souls", "Owl Statues", "Time", "Tingle Maps", "Misc", + "Frogs", "Ocarina Buttons", "Boss Souls", "Enemy Souls", "Owl Statues", "Time", "Tingle Maps", "Misc", }; std::map> defaultItemLists = { @@ -43,6 +43,7 @@ std::map> defaultItemLists = std::map> randoItemLists = { { "Frogs", { RI_FROG_BLUE, RI_FROG_WHITE, 4 } }, + { "Ocarina Buttons", { RI_OCARINA_BUTTON_A, RI_OCARINA_BUTTON_C_UP, 5 } }, { "Boss Souls", { RI_SOUL_BOSS_GOHT, RI_SOUL_BOSS_TWINMOLD, 5 } }, { "Enemy Souls", { RI_SOUL_ENEMY_ALIEN, RI_SOUL_ENEMY_WOLFOS, 6 } }, { "Owl Statues", { RI_OWL_CLOCK_TOWN_SOUTH, RI_OWL_ZORA_CAPE, 5 } }, @@ -250,8 +251,9 @@ void DrawItemList(std::string listName, int columns) { ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(5, 5)); std::vector emptyList; - if (listName == "Frogs" || listName == "Boss Souls" || listName == "Enemy Souls" || - listName == "Owl Statues" || listName == "Tingle Maps" || listName == "Time" || listName == "Misc") { + if (listName == "Frogs" || listName == "Ocarina Buttons" || listName == "Boss Souls" || + listName == "Enemy Souls" || listName == "Owl Statues" || listName == "Tingle Maps" || + listName == "Time" || listName == "Misc") { for (int j = std::get<0>(randoItemLists.at(listName)); j <= std::get<1>(randoItemLists.at(listName)); j++) { ImGui::TableNextColumn(); diff --git a/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h b/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h index 0d84558fa3..c88c54d8ca 100644 --- a/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h +++ b/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h @@ -1502,6 +1502,15 @@ typedef enum { // - None VB_PLAY_LOW_HP_ALARM, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*u8` (current Ocarina button input index) + // - `*u8` (current Ocarina pitch) + VB_PLAY_OCARINA_NOTE, + // #### `result` // ```c // false @@ -2008,6 +2017,14 @@ typedef enum { // - `*EnBjt` (unused) VB_TOILET_HAND_TAKE_ITEM, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnToto` + VB_TOTO_START_SOUND_CHECK, + // #### `result` // ```c // true diff --git a/mm/2s2h/Rando/ActorBehavior/EnToto.cpp b/mm/2s2h/Rando/ActorBehavior/EnToto.cpp index 4b8dfd068a..c6889c5ce9 100644 --- a/mm/2s2h/Rando/ActorBehavior/EnToto.cpp +++ b/mm/2s2h/Rando/ActorBehavior/EnToto.cpp @@ -1,5 +1,6 @@ #include "ActorBehavior.h" #include +#include "2s2h/Rando/Logic/Logic.h" extern "C" { #include "variables.h" @@ -38,4 +39,19 @@ void Rando::ActorBehavior::InitEnTotoBehavior() { Message_BombersNotebookQueueEvent(gPlayState, BOMBERS_NOTEBOOK_EVENT_MET_TOTO); Message_BombersNotebookQueueEvent(gPlayState, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN); }); + + COND_VB_SHOULD(VB_TOTO_START_SOUND_CHECK, IS_RANDO && RANDO_SAVE_OPTIONS[RO_SHUFFLE_OCARINA_BUTTONS], { + EnToto* totoActor = va_arg(args, EnToto*); + if (totoActor->text->textId == 0x2B24) { + if (!(Rando::Logic::canPlaySong(OCARINA_SONG_WIND_FISH_HUMAN) && + Rando::Logic::canPlaySong(OCARINA_SONG_WIND_FISH_DEKU) && + Rando::Logic::canPlaySong(OCARINA_SONG_WIND_FISH_GORON) && + Rando::Logic::canPlaySong(OCARINA_SONG_WIND_FISH_ZORA))) { + Message_ContinueTextbox(gPlayState, 0x2B25); + func_80BA36C0(totoActor, gPlayState, 0); + Flags_UnsetSwitch(gPlayState, ENTOTO_GET_SWITCH_FLAG_1(&totoActor->actor)); + *should = false; + } + } + }); } diff --git a/mm/2s2h/Rando/ActorBehavior/Player.cpp b/mm/2s2h/Rando/ActorBehavior/Player.cpp index a96142805f..2e5cf5fb11 100644 --- a/mm/2s2h/Rando/ActorBehavior/Player.cpp +++ b/mm/2s2h/Rando/ActorBehavior/Player.cpp @@ -1,5 +1,6 @@ #include "ActorBehavior.h" #include +#include "2s2h/Rando/Logic/Logic.h" extern "C" { #include "variables.h" @@ -10,6 +11,8 @@ extern s32 Player_SetAction(PlayState* play, Player* player, PlayerActionFunc ac extern void Player_Action_1(Player* player, PlayState* play); } +static u8 lastOcarinaButton = OCARINA_BTN_INVALID; + 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. @@ -26,8 +29,26 @@ void RespawnOnWaterTouch(Player* player) { void Rando::ActorBehavior::InitPlayerBehavior() { COND_ID_HOOK(OnActorUpdate, ACTOR_PLAYER, IS_RANDO && RANDO_SAVE_OPTIONS[RO_SHUFFLE_SWIM], [](Actor* actor) { + Player* player = GET_PLAYER(gPlayState); if (!Flags_GetRandoInf(RANDO_INF_OBTAINED_SWIM)) { - RespawnOnWaterTouch(GET_PLAYER(gPlayState)); + RespawnOnWaterTouch(player); + } + }); + + COND_VB_SHOULD(VB_PLAY_OCARINA_NOTE, IS_RANDO && RANDO_SAVE_OPTIONS[RO_SHUFFLE_OCARINA_BUTTONS], { + u8* sCurOcarinaButtonIndex = va_arg(args, u8*); + u8* sCurOcarinaPitch = va_arg(args, u8*); + u8 currentOcarinaButton = *sCurOcarinaButtonIndex; + + if (!Flags_GetRandoInf(((*sCurOcarinaButtonIndex) - OCARINA_BTN_A) + RANDO_INF_OBTAINED_OCARINA_BUTTON_A)) { + *sCurOcarinaButtonIndex = OCARINA_BTN_INVALID; + *sCurOcarinaPitch = OCARINA_PITCH_NONE; + if (lastOcarinaButton != currentOcarinaButton) { + lastOcarinaButton = currentOcarinaButton; + if (currentOcarinaButton != OCARINA_BTN_INVALID) { + Audio_PlaySfx(NA_SE_SY_OCARINA_ERROR); + } + } } }); } diff --git a/mm/2s2h/Rando/ConvertItem.cpp b/mm/2s2h/Rando/ConvertItem.cpp index f6f6404bd4..d4e60c243c 100644 --- a/mm/2s2h/Rando/ConvertItem.cpp +++ b/mm/2s2h/Rando/ConvertItem.cpp @@ -486,6 +486,12 @@ bool Rando::IsItemObtainable(RandoItemId randoItemId, RandoCheckId randoCheckId) Rando::ClockItems::GetHalfDayIndexFromClockItem(randoItemId)); case RI_TIME_PROGRESSIVE: return true; + case RI_OCARINA_BUTTON_A: + case RI_OCARINA_BUTTON_C_DOWN: + case RI_OCARINA_BUTTON_C_LEFT: + case RI_OCARINA_BUTTON_C_RIGHT: + case RI_OCARINA_BUTTON_C_UP: + return !Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_A + (randoItemId - RI_OCARINA_BUTTON_A)); // 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. We just simply check the inventory state // Masks diff --git a/mm/2s2h/Rando/DrawItem.cpp b/mm/2s2h/Rando/DrawItem.cpp index dd8eae0ace..87c18cdf9c 100644 --- a/mm/2s2h/Rando/DrawItem.cpp +++ b/mm/2s2h/Rando/DrawItem.cpp @@ -401,6 +401,21 @@ void DrawAbilityItem(RandoItemId randoItemId, Actor* actor) { CLOSE_DISPS(gPlayState->state.gfxCtx); } +void DrawOcarinaButtonItem(RandoItemId randoItemId, Actor* actor) { + Gfx* ocarinaButtonModel[5] = { + (Gfx*)gOcarinaAButtonDL, (Gfx*)gOcarinaCDownButtonDL, (Gfx*)gOcarinaCRightButtonDL, + (Gfx*)gOcarinaCLeftButtonDL, (Gfx*)gOcarinaCUpButtonDL, + }; + + OPEN_DISPS(gPlayState->state.gfxCtx); + Gfx_SetupDL25_Opa(gPlayState->state.gfxCtx); + + MATRIX_FINALIZE_AND_LOAD(POLY_OPA_DISP++, gPlayState->state.gfxCtx); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)ocarinaButtonModel[randoItemId - RI_OCARINA_BUTTON_A]); + + CLOSE_DISPS(gPlayState->state.gfxCtx); +} + // clang-format off std::unordered_map> soulDrawMap = { { RI_SOUL_ENEMY_ALIEN, DrawAlien }, @@ -656,6 +671,13 @@ void Rando::DrawItem(RandoItemId randoItemId, Actor* actor) { case RI_MAX_TRAP: DrawTrapModel(); break; + case RI_OCARINA_BUTTON_A: + case RI_OCARINA_BUTTON_C_DOWN: + case RI_OCARINA_BUTTON_C_LEFT: + case RI_OCARINA_BUTTON_C_RIGHT: + case RI_OCARINA_BUTTON_C_UP: + DrawOcarinaButtonItem(randoItemId, actor); + break; case RI_NONE: case RI_UNKNOWN: break; diff --git a/mm/2s2h/Rando/GiveItem.cpp b/mm/2s2h/Rando/GiveItem.cpp index 8778fd5a00..6a774a9870 100644 --- a/mm/2s2h/Rando/GiveItem.cpp +++ b/mm/2s2h/Rando/GiveItem.cpp @@ -362,6 +362,13 @@ void Rando::GiveItem(RandoItemId randoItemId) { case RI_TRAP: Rando::MiscBehavior::OfferTrapItem(); break; + case RI_OCARINA_BUTTON_A: + case RI_OCARINA_BUTTON_C_DOWN: + case RI_OCARINA_BUTTON_C_LEFT: + case RI_OCARINA_BUTTON_C_RIGHT: + case RI_OCARINA_BUTTON_C_UP: + Flags_SetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_A + (randoItemId - RI_OCARINA_BUTTON_A)); + break; case RI_JUNK: case RI_NONE: break; diff --git a/mm/2s2h/Rando/Logic/GeneratePools.cpp b/mm/2s2h/Rando/Logic/GeneratePools.cpp index 99b1aac709..e917c2ec70 100644 --- a/mm/2s2h/Rando/Logic/GeneratePools.cpp +++ b/mm/2s2h/Rando/Logic/GeneratePools.cpp @@ -191,6 +191,13 @@ void GeneratePools(RandoSaveInfo& saveInfo, std::vector& checkPool itemPool.push_back(RI_ABILITY_SWIM); } + // Ocarina Buttons + if (saveInfo.randoSaveOptions[RO_SHUFFLE_OCARINA_BUTTONS] == RO_GENERIC_YES) { + for (int i = RI_OCARINA_BUTTON_A; i <= RI_OCARINA_BUTTON_C_UP; i++) { + itemPool.push_back((RandoItemId)i); + } + } + // Shuffle Triforce Pieces into the Pool if (saveInfo.randoSaveOptions[RO_SHUFFLE_TRIFORCE_PIECES] == RO_GENERIC_YES) { int piecesToShuffle = saveInfo.randoSaveOptions[RO_TRIFORCE_PIECES_MAX]; diff --git a/mm/2s2h/Rando/Logic/Logic.h b/mm/2s2h/Rando/Logic/Logic.h index f22e7bdd6a..7473ba9b63 100644 --- a/mm/2s2h/Rando/Logic/Logic.h +++ b/mm/2s2h/Rando/Logic/Logic.h @@ -185,14 +185,17 @@ void ValidateRegionTimeOwnership(RandoRegionId regionId, RandoCheckId checkId, u (IS_DEKU && HAS_ITEM(ITEM_MASK_DEKU)) || (IS_GORON && HAS_ITEM(ITEM_MASK_GORON))) #define CHECK_MAX_HP(TARGET_HP) ((TARGET_HP * 16) <= gSaveContext.save.saveInfo.playerData.healthCapacity) #define HAS_MAGIC (gSaveContext.save.saveInfo.playerData.isMagicAcquired) -#define CAN_HOOK_SCARECROW (HAS_ITEM(ITEM_OCARINA_OF_TIME) && HAS_ITEM(ITEM_HOOKSHOT)) +#define CAN_HOOK_SCARECROW \ + (HAS_ITEM(ITEM_OCARINA_OF_TIME) && HAS_ITEM(ITEM_HOOKSHOT) && canPlaySong(OCARINA_SONG_SCARECROW_SPAWN)) #define CAN_USE_EXPLOSIVE \ ((HAS_ITEM(ITEM_BOMB) || HAS_ITEM(ITEM_BOMBCHU) || HAS_ITEM(ITEM_MASK_BLAST) || \ (HAS_ITEM(ITEM_POWDER_KEG) && CAN_BE_GORON))) #define CAN_USE_HUMAN_SWORD (GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) >= EQUIP_VALUE_SWORD_KOKIRI) #define CAN_USE_SWORD (CAN_USE_HUMAN_SWORD || HAS_ITEM(ITEM_SWORD_GREAT_FAIRY) || CAN_BE_DEITY) // Be careful here, as some checks require you to play the song as a specific form -#define CAN_PLAY_SONG(song) (HAS_ITEM(ITEM_OCARINA_OF_TIME) && CHECK_QUEST_ITEM(QUEST_SONG_##song)) +#define CAN_PLAY_SONG(song) \ + (HAS_ITEM(ITEM_OCARINA_OF_TIME) && CHECK_QUEST_ITEM(QUEST_SONG_##song) && \ + Rando::Logic::canPlaySong((QUEST_SONG_##song - QUEST_SONG_SONATA) + OCARINA_SONG_SONATA)) #define CAN_RIDE_EPONA (CAN_PLAY_SONG(EPONA)) #define GBT_CAN_REVERSE_WATER_FLOW \ (RANDO_EVENTS[RE_GREAT_BAY_RED_SWITCH_1] && RANDO_EVENTS[RE_GREAT_BAY_RED_SWITCH_2] && \ @@ -271,6 +274,84 @@ inline std::string LogicString(std::string condition) { return condition; } +inline uint8_t FoundOcarinaButtons() { + uint8_t foundButtons = 0; + for (int i = RANDO_INF_OBTAINED_OCARINA_BUTTON_A; i <= RANDO_INF_OBTAINED_OCARINA_BUTTON_C_UP; i++) { + if (Flags_GetRandoInf((RandoInf)i)) { + foundButtons++; + } + } + return foundButtons; +} + +inline bool canPlaySong(u8 songId) { + switch (songId) { + case OCARINA_SONG_SONATA: + return (Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_UP) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_LEFT) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_A) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_RIGHT)); + case OCARINA_SONG_GORON_LULLABY: + case OCARINA_SONG_GORON_LULLABY_INTRO: + return (Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_A) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_RIGHT) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_LEFT)); + case OCARINA_SONG_NEW_WAVE: + case OCARINA_SONG_ELEGY: + return (Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_LEFT) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_UP) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_RIGHT) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_DOWN)); + case OCARINA_SONG_OATH: + case OCARINA_SONG_WIND_FISH_ZORA: + return (Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_RIGHT) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_LEFT) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_DOWN) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_A) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_UP)); + case OCARINA_SONG_TIME: + case OCARINA_SONG_INVERTED_TIME: + case OCARINA_SONG_DOUBLE_TIME: + case OCARINA_SONG_WIND_FISH_GORON: + case OCARINA_SONG_EVAN_PART1: + return (Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_RIGHT) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_A) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_DOWN)); + case OCARINA_SONG_HEALING: + case OCARINA_SONG_SARIAS: + case OCARINA_SONG_EVAN_PART2: + return (Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_LEFT) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_RIGHT) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_DOWN)); + case OCARINA_SONG_EPONAS: + case OCARINA_SONG_WIND_FISH_HUMAN: + return (Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_UP) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_LEFT) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_RIGHT)); + case OCARINA_SONG_SOARING: + return (Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_DOWN) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_LEFT) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_UP)); + case OCARINA_SONG_STORMS: + return (Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_A) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_DOWN) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_UP)); + case OCARINA_SONG_SUNS: + return (Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_RIGHT) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_DOWN) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_UP)); + case OCARINA_SONG_WIND_FISH_DEKU: + return (Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_RIGHT) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_A) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_DOWN) && + Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_LEFT)); + case OCARINA_SONG_SCARECROW_SPAWN: + return FoundOcarinaButtons() >= 2; + default: + return true; + } +} + inline bool CanAccessDungeon(DungeonSceneIndex dungeonIndex) { bool hasSongAccess = false; bool hasFormAccess = false; diff --git a/mm/2s2h/Rando/Logic/Regions/Central.cpp b/mm/2s2h/Rando/Logic/Regions/Central.cpp index 07c031ab41..b93f68c8e0 100644 --- a/mm/2s2h/Rando/Logic/Regions/Central.cpp +++ b/mm/2s2h/Rando/Logic/Regions/Central.cpp @@ -338,7 +338,12 @@ static RegisterShipInitFunc initFunc([]() { }; Regions[RR_MILK_BAR] = RandoRegion{ .sceneId = SCENE_MILK_BAR, .checks = { - CHECK(RC_MILK_BAR_CIRCUS_LEADER_MASK, CAN_BE_DEKU && CAN_BE_GORON && CAN_BE_ZORA && HAS_ITEM(ITEM_OCARINA_OF_TIME) && (BETWEEN(TIME_NIGHT1_PM_10_00, TIME_NIGHT1_AM_05_00) || BETWEEN(TIME_NIGHT2_PM_10_00, TIME_NIGHT2_AM_05_00))), + CHECK(RC_MILK_BAR_CIRCUS_LEADER_MASK, HAS_ITEM(ITEM_OCARINA_OF_TIME) && (BETWEEN(TIME_NIGHT1_PM_10_00, TIME_NIGHT1_AM_05_00) || + BETWEEN(TIME_NIGHT2_PM_10_00, TIME_NIGHT2_AM_05_00)) + && (canPlaySong(OCARINA_SONG_WIND_FISH_HUMAN) && + (CAN_BE_DEKU && canPlaySong(OCARINA_SONG_WIND_FISH_DEKU)) && + (CAN_BE_GORON && canPlaySong(OCARINA_SONG_WIND_FISH_GORON)) && + (CAN_BE_ZORA && canPlaySong(OCARINA_SONG_WIND_FISH_ZORA)))), CHECK(RC_MILK_BAR_MADAME_AROMA, HAS_ITEM(ITEM_MASK_KAFEIS_MASK) && Flags_GetRandoInf(RANDO_INF_OBTAINED_LETTER_TO_MAMA) && (BETWEEN(TIME_NIGHT3_PM_06_00, TIME_NIGHT3_PM_09_00) || AFTER(TIME_NIGHT3_PM_10_00))), CHECK(RC_MILK_BAR_PURCHASE_CHATEAU, CAN_AFFORD(RC_MILK_BAR_PURCHASE_CHATEAU) && HAS_ITEM(ITEM_MASK_ROMANI) && (BETWEEN(TIME_NIGHT1_PM_10_00, TIME_DAY2_AM_06_00) || BETWEEN(TIME_NIGHT2_PM_10_00, TIME_DAY3_AM_06_00) || BETWEEN(TIME_NIGHT3_PM_06_00, TIME_NIGHT3_PM_09_00) || AFTER(TIME_NIGHT3_PM_10_00))), CHECK(RC_MILK_BAR_PURCHASE_MILK, CAN_AFFORD(RC_MILK_BAR_PURCHASE_MILK) && HAS_ITEM(ITEM_MASK_ROMANI) && (BETWEEN(TIME_NIGHT1_PM_10_00, TIME_DAY2_AM_06_00) || BETWEEN(TIME_NIGHT2_PM_10_00, TIME_DAY3_AM_06_00) || BETWEEN(TIME_NIGHT3_PM_06_00, TIME_NIGHT3_PM_09_00) || AFTER(TIME_NIGHT3_PM_10_00))), diff --git a/mm/2s2h/Rando/Logic/Regions/West.cpp b/mm/2s2h/Rando/Logic/Regions/West.cpp index 97474397fd..6261851125 100644 --- a/mm/2s2h/Rando/Logic/Regions/West.cpp +++ b/mm/2s2h/Rando/Logic/Regions/West.cpp @@ -341,7 +341,7 @@ static RegisterShipInitFunc initFunc([]() { }; Regions[RR_ZORA_HALL_EVANS_ROOM] = RandoRegion{ .name = "Evan's Room", .sceneId = SCENE_BANDROOM, .checks = { - CHECK(RC_ZORA_HALL_EVANS_PIECE_OF_HEART, HAS_ITEM(ITEM_OCARINA_OF_TIME)), + CHECK(RC_ZORA_HALL_EVANS_PIECE_OF_HEART, HAS_ITEM(ITEM_OCARINA_OF_TIME) && (canPlaySong(OCARINA_SONG_EVAN_PART1) && canPlaySong(OCARINA_SONG_EVAN_PART2))), }, .exits = { // TO FROM EXIT(ENTRANCE(ZORA_HALL, 4), ENTRANCE(ZORA_HALL_ROOMS, 3), true), diff --git a/mm/2s2h/Rando/Menu.cpp b/mm/2s2h/Rando/Menu.cpp index 7e14418a94..d057b49800 100644 --- a/mm/2s2h/Rando/Menu.cpp +++ b/mm/2s2h/Rando/Menu.cpp @@ -41,6 +41,7 @@ std::vector incompatibleWithVanilla = { RO_SHUFFLE_BOSS_SOULS, RO_SHUFFLE_SWIM, RO_SHUFFLE_ENEMY_SOULS, + RO_SHUFFLE_OCARINA_BUTTONS, RO_PLENTIFUL_ITEMS, RO_CLOCK_SHUFFLE, }; @@ -214,6 +215,7 @@ static RegisterShipInitFunc refreshMetricsInit(RefreshMetrics, { "gRando.Options.RO_SHUFFLE_GOLD_SKULLTULAS", "gRando.Options.RO_SHUFFLE_GRASS_DROPS", "gRando.Options.RO_SHUFFLE_TRAPS", + "gRando.Options.RO_SHUFFLE_OCARINA_BUTTONS", "gRando.Options.RO_SHUFFLE_OWL_STATUES", "gRando.Options.RO_SHUFFLE_POT_DROPS", "gRando.Options.RO_SHUFFLE_SHOPS", @@ -408,6 +410,12 @@ static void DrawItemsTab() { "into deep water will respawn Link.", .disabled = IncompatibleWithLogicSetting(RO_SHUFFLE_SWIM), .disabledTooltip = "Incompatible with current Logic Setting" } })); + CVarCheckbox("Shuffle Ocarina Buttons", Rando::StaticData::Options[RO_SHUFFLE_OCARINA_BUTTONS].cvar, + CheckboxOptions({ { .tooltip = "Shuffles the Buttons used to play Ocarina Notes.\n" + "You will be unable to play a song until you find all\n" + "notes for the given melody.", + .disabled = IncompatibleWithLogicSetting(RO_SHUFFLE_OCARINA_BUTTONS), + .disabledTooltip = "Incompatible with current Logic Setting" } })); 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 1d4fab153e..a0f9332d9c 100644 --- a/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp +++ b/mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp @@ -39,6 +39,12 @@ void GrantStarters() { } } + if (RANDO_SAVE_OPTIONS[RO_SHUFFLE_OCARINA_BUTTONS] != RO_GENERIC_YES) { + for (int i = RI_OCARINA_BUTTON_A; i <= RI_OCARINA_BUTTON_C_UP; i++) { + startingItems.push_back((RandoItemId)i); + } + } + for (RandoItemId startingItem : startingItems) { Rando::GiveItem(Rando::ConvertItem(startingItem)); } diff --git a/mm/2s2h/Rando/Rando.h b/mm/2s2h/Rando/Rando.h index 4f592b0c5f..7d824e5a9b 100644 --- a/mm/2s2h/Rando/Rando.h +++ b/mm/2s2h/Rando/Rando.h @@ -11,8 +11,10 @@ #define RANDO_EVENTS gSaveContext.save.shipSaveInfo.rando.randoEvents #define RANDO_STARTING_ITEMS gSaveContext.save.shipSaveInfo.rando.randoStartingItems -#define RANDO_STARTING_ITEMS_DEFAULT \ - "109,126,91,146" // This includes a Progressive Sword, Hero's Shield, Ocarina of Time, and Song of Time +#define RANDO_STARTING_ITEMS_DEFAULT \ + (std::to_string(RI_PROGRESSIVE_SWORD) + "," + std::to_string(RI_SHIELD_HERO) + "," + std::to_string(RI_OCARINA) + \ + "," + std::to_string(RI_SONG_TIME)) \ + .c_str() namespace Rando { diff --git a/mm/2s2h/Rando/RemoveItem.cpp b/mm/2s2h/Rando/RemoveItem.cpp index f7bebe0a83..12c0ae1c29 100644 --- a/mm/2s2h/Rando/RemoveItem.cpp +++ b/mm/2s2h/Rando/RemoveItem.cpp @@ -444,6 +444,13 @@ void Rando::RemoveItem(RandoItemId randoItemId) { case RI_FROG_WHITE: CLEAR_WEEKEVENTREG(WEEKEVENTREG_33_02); break; + case RI_OCARINA_BUTTON_A: + case RI_OCARINA_BUTTON_C_DOWN: + case RI_OCARINA_BUTTON_C_LEFT: + case RI_OCARINA_BUTTON_C_RIGHT: + case RI_OCARINA_BUTTON_C_UP: + Flags_ClearRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_A + (randoItemId - RI_OCARINA_BUTTON_A)); + break; // Ignore Ammo case RI_BOMBCHU: case RI_DEKU_STICK: diff --git a/mm/2s2h/Rando/StaticData/Items.cpp b/mm/2s2h/Rando/StaticData/Items.cpp index 50b156fc92..9345290bae 100644 --- a/mm/2s2h/Rando/StaticData/Items.cpp +++ b/mm/2s2h/Rando/StaticData/Items.cpp @@ -117,6 +117,11 @@ std::map Items = { RI(RI_MUSHROOM, "a", "Magic Mushroom", RITYPE_MAJOR, ITEM_MUSHROOM, GI_MUSHROOM, GID_MUSHROOM), RI(RI_NONE, "", "literally nothing", RITYPE_JUNK, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_OCARINA, "the", "Ocarina of Time", RITYPE_MAJOR, ITEM_OCARINA_OF_TIME, GI_OCARINA_OF_TIME, GID_OCARINA), + RI(RI_OCARINA_BUTTON_A, "the", "A Button", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_OCARINA_BUTTON_C_DOWN, "the", "C Down Button", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_OCARINA_BUTTON_C_LEFT, "the", "C Left Button", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_OCARINA_BUTTON_C_RIGHT, "the", "C Right Button", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), + RI(RI_OCARINA_BUTTON_C_UP, "the", "C Up Button", RITYPE_MAJOR, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_OWL_CLOCK_TOWN_SOUTH, "the", "Clock Town Owl Statue", RITYPE_LESSER, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_OWL_GREAT_BAY_COAST, "the", "Great Bay Coast Owl Statue", RITYPE_LESSER, ITEM_NONE, GI_NONE, GID_NONE), RI(RI_OWL_IKANA_CANYON, "the", "Ikana Canyon Owl Statue", RITYPE_LESSER, ITEM_NONE, GI_NONE, GID_NONE), @@ -458,6 +463,16 @@ const char* GetIconTexturePath(RandoItemId randoItemId) { return (const char*)gItemIconTingleMapTex; case RI_TRIFORCE_PIECE: return (const char*)gTriforcePieceTex; + case RI_OCARINA_BUTTON_A: + return (const char*)gOcarinaATex; + case RI_OCARINA_BUTTON_C_DOWN: + return (const char*)gOcarinaCDownTex; + case RI_OCARINA_BUTTON_C_LEFT: + return (const char*)gOcarinaCLeftTex; + case RI_OCARINA_BUTTON_C_RIGHT: + return (const char*)gOcarinaCRightTex; + case RI_OCARINA_BUTTON_C_UP: + return (const char*)gOcarinaCUpTex; case RI_TIME_DAY_1: case RI_TIME_DAY_2: case RI_TIME_DAY_3: diff --git a/mm/2s2h/Rando/StaticData/Options.cpp b/mm/2s2h/Rando/StaticData/Options.cpp index 1af0b8d508..deb1cfb71b 100644 --- a/mm/2s2h/Rando/StaticData/Options.cpp +++ b/mm/2s2h/Rando/StaticData/Options.cpp @@ -47,6 +47,7 @@ std::map Options = { RO(RO_SHUFFLE_GRASS_DROPS, RO_GENERIC_OFF), RO(RO_SHUFFLE_TRAPS, RO_GENERIC_OFF), RO(RO_SHUFFLE_OWL_STATUES, RO_GENERIC_OFF), + RO(RO_SHUFFLE_OCARINA_BUTTONS, RO_GENERIC_OFF), RO(RO_SHUFFLE_POT_DROPS, RO_GENERIC_OFF), RO(RO_SHUFFLE_SHOPS, RO_GENERIC_OFF), RO(RO_SHUFFLE_SNOWBALL_DROPS, RO_GENERIC_OFF), diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h index 922dc68b27..202a135746 100644 --- a/mm/2s2h/Rando/Types.h +++ b/mm/2s2h/Rando/Types.h @@ -2402,6 +2402,11 @@ typedef enum { RI_MUSHROOM, RI_NONE, RI_OCARINA, + RI_OCARINA_BUTTON_A, + RI_OCARINA_BUTTON_C_DOWN, + RI_OCARINA_BUTTON_C_RIGHT, + RI_OCARINA_BUTTON_C_LEFT, + RI_OCARINA_BUTTON_C_UP, RI_OWL_CLOCK_TOWN_SOUTH, RI_OWL_GREAT_BAY_COAST, RI_OWL_IKANA_CANYON, @@ -2890,6 +2895,7 @@ typedef enum { RO_SHUFFLE_GOLD_SKULLTULAS, RO_SHUFFLE_TRAPS, RO_SHUFFLE_OWL_STATUES, + RO_SHUFFLE_OCARINA_BUTTONS, RO_SHUFFLE_POT_DROPS, RO_SHUFFLE_SHOPS, RO_SHUFFLE_SNOWBALL_DROPS, @@ -3020,6 +3026,11 @@ typedef enum { RANDO_INF_OBTAINED_CLOCK_NIGHT_2, RANDO_INF_OBTAINED_CLOCK_DAY_3, RANDO_INF_OBTAINED_CLOCK_NIGHT_3, + RANDO_INF_OBTAINED_OCARINA_BUTTON_A, + RANDO_INF_OBTAINED_OCARINA_BUTTON_C_DOWN, + RANDO_INF_OBTAINED_OCARINA_BUTTON_C_RIGHT, + RANDO_INF_OBTAINED_OCARINA_BUTTON_C_LEFT, + RANDO_INF_OBTAINED_OCARINA_BUTTON_C_UP, RANDO_INF_MAX, } RandoInf; diff --git a/mm/2s2h/ShipUtils.cpp b/mm/2s2h/ShipUtils.cpp index fb1c4ea39c..aac3b5fa57 100644 --- a/mm/2s2h/ShipUtils.cpp +++ b/mm/2s2h/ShipUtils.cpp @@ -61,7 +61,7 @@ extern u16 sOwlWarpEntrancesForMods[OWL_WARP_MAX - 1] = { }; // These textures are not in existing lists that we iterate over. -std::array miscellaneousTextures = { +std::array miscellaneousTextures = { gArcheryScoreIconTex, gBarrelTrackerIcon, gChestTrackerIcon, @@ -88,6 +88,11 @@ std::array miscellaneousTextures = { gItemIconTingleMapTex, gThreeDayClockSunHourTex, gThreeDayClockMoonHourTex, + gOcarinaATex, + gOcarinaCDownTex, + gOcarinaCLeftTex, + gOcarinaCRightTex, + gOcarinaCUpTex, }; std::array digitList = { gCounterDigit0Tex, gCounterDigit1Tex, gCounterDigit2Tex, gCounterDigit3Tex, @@ -211,6 +216,23 @@ ImVec4 Ship_GetItemColorTint(uint32_t itemId) { } } +std::map randoItemColorMap = { + { RI_OCARINA_BUTTON_A, ImVec4(0.085f, 0.494f, 0.796f, 1) }, + { RI_OCARINA_BUTTON_C_DOWN, ImVec4(0.84f, 0.768f, 0.089f, 1) }, + { RI_OCARINA_BUTTON_C_LEFT, ImVec4(0.84f, 0.768f, 0.089f, 1) }, + { RI_OCARINA_BUTTON_C_RIGHT, ImVec4(0.84f, 0.768f, 0.089f, 1) }, + { RI_OCARINA_BUTTON_C_UP, ImVec4(0.84f, 0.768f, 0.089f, 1) }, +}; + +ImVec4 Ship_GetRandoItemColorTint(uint32_t randoItemId) { + auto findColor = randoItemColorMap.find(randoItemId); + if (findColor != randoItemColorMap.end()) { + return findColor->second; + } else { + return ImVec4(1, 1, 1, 1); + } +} + std::map questIdToItemMap = { { QUEST_REMAINS_ODOLWA, ITEM_REMAINS_ODOLWA }, { QUEST_REMAINS_GOHT, ITEM_REMAINS_GOHT }, diff --git a/mm/2s2h/ShipUtils.h b/mm/2s2h/ShipUtils.h index eaa66841af..a1eaab4abe 100644 --- a/mm/2s2h/ShipUtils.h +++ b/mm/2s2h/ShipUtils.h @@ -32,6 +32,7 @@ extern std::vector> itemIdToItemNameMap; extern std::string Ship_GetItemNameById(int16_t itemId); extern std::map itemColorMap; extern ImVec4 Ship_GetItemColorTint(uint32_t itemId); +extern ImVec4 Ship_GetRandoItemColorTint(uint32_t randoItemId); uint32_t Ship_ConvertQuestIdToItem(uint32_t itemId); uint32_t Ship_ConvertItemIdToQuest(uint32_t itemId); extern uint32_t Ship_Hash(std::string str); diff --git a/mm/assets/2s2h_assets.h b/mm/assets/2s2h_assets.h index f196901528..36762027e5 100644 --- a/mm/assets/2s2h_assets.h +++ b/mm/assets/2s2h_assets.h @@ -388,3 +388,18 @@ static const ALIGN_ASSET(2) char gTriforcePieceCompletedDL[] = dgTriforcePieceCo #define dgTrapDL "__OTR__objects/object_trap/gTrapDL" static const ALIGN_ASSET(2) char gTrapDL[] = dgTrapDL; + +#define dgOcarinaAButtonDL "__OTR__objects/object_ocarina_a_button/gOcarinaAButtonDL" +static const ALIGN_ASSET(2) char gOcarinaAButtonDL[] = dgOcarinaAButtonDL; + +#define dgOcarinaCDownButtonDL "__OTR__objects/object_ocarina_c_down_button/gOcarinaCDownButtonDL" +static const ALIGN_ASSET(2) char gOcarinaCDownButtonDL[] = dgOcarinaCDownButtonDL; + +#define dgOcarinaCLeftButtonDL "__OTR__objects/object_ocarina_c_left_button/gOcarinaCLeftButtonDL" +static const ALIGN_ASSET(2) char gOcarinaCLeftButtonDL[] = dgOcarinaCLeftButtonDL; + +#define dgOcarinaCRightButtonDL "__OTR__objects/object_ocarina_c_right_button/gOcarinaCRightButtonDL" +static const ALIGN_ASSET(2) char gOcarinaCRightButtonDL[] = dgOcarinaCRightButtonDL; + +#define dgOcarinaCUpButtonDL "__OTR__objects/object_ocarina_c_up_button/gOcarinaCUpButtonDL" +static const ALIGN_ASSET(2) char gOcarinaCUpButtonDL[] = dgOcarinaCUpButtonDL; diff --git a/mm/assets/custom/objects/object_ocarina_a_button/gOcarinaAButtonDL b/mm/assets/custom/objects/object_ocarina_a_button/gOcarinaAButtonDL new file mode 100644 index 0000000000..0e068a1b2a --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_a_button/gOcarinaAButtonDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_a_button/gOcarinaAButtonDL_tri_0 b/mm/assets/custom/objects/object_ocarina_a_button/gOcarinaAButtonDL_tri_0 new file mode 100644 index 0000000000..39f541204b --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_a_button/gOcarinaAButtonDL_tri_0 @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_a_button/gOcarinaAButtonDL_tri_1 b/mm/assets/custom/objects/object_ocarina_a_button/gOcarinaAButtonDL_tri_1 new file mode 100644 index 0000000000..8b223d8e35 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_a_button/gOcarinaAButtonDL_tri_1 @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_a_button/gOcarinaAButtonDL_vtx_0 b/mm/assets/custom/objects/object_ocarina_a_button/gOcarinaAButtonDL_vtx_0 new file mode 100644 index 0000000000..266582a03a --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_a_button/gOcarinaAButtonDL_vtx_0 @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_a_button/gOcarinaAButtonDL_vtx_1 b/mm/assets/custom/objects/object_ocarina_a_button/gOcarinaAButtonDL_vtx_1 new file mode 100644 index 0000000000..dfcc8cc0de --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_a_button/gOcarinaAButtonDL_vtx_1 @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_a_button/gOcarinaAButtonDL_vtx_cull b/mm/assets/custom/objects/object_ocarina_a_button/gOcarinaAButtonDL_vtx_cull new file mode 100644 index 0000000000..38adb91be5 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_a_button/gOcarinaAButtonDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_a_button/mat_gOcarinaAButtonDL_f3dlite_ocarina_A_button_edge b/mm/assets/custom/objects/object_ocarina_a_button/mat_gOcarinaAButtonDL_f3dlite_ocarina_A_button_edge new file mode 100644 index 0000000000..45ceb1d429 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_a_button/mat_gOcarinaAButtonDL_f3dlite_ocarina_A_button_edge @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_a_button/mat_gOcarinaAButtonDL_f3dlite_ocarina_A_button_surface b/mm/assets/custom/objects/object_ocarina_a_button/mat_gOcarinaAButtonDL_f3dlite_ocarina_A_button_surface new file mode 100644 index 0000000000..0ed7292b81 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_a_button/mat_gOcarinaAButtonDL_f3dlite_ocarina_A_button_surface @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_a_button/noise_tex b/mm/assets/custom/objects/object_ocarina_a_button/noise_tex new file mode 100644 index 0000000000..aaf4e331f1 Binary files /dev/null and b/mm/assets/custom/objects/object_ocarina_a_button/noise_tex differ diff --git a/mm/assets/custom/objects/object_ocarina_c_down_button/gOcarinaCDownButtonDL b/mm/assets/custom/objects/object_ocarina_c_down_button/gOcarinaCDownButtonDL new file mode 100644 index 0000000000..0bcb321686 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_down_button/gOcarinaCDownButtonDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_down_button/gOcarinaCDownButtonDL_tri_0 b/mm/assets/custom/objects/object_ocarina_c_down_button/gOcarinaCDownButtonDL_tri_0 new file mode 100644 index 0000000000..825b236e81 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_down_button/gOcarinaCDownButtonDL_tri_0 @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_down_button/gOcarinaCDownButtonDL_tri_1 b/mm/assets/custom/objects/object_ocarina_c_down_button/gOcarinaCDownButtonDL_tri_1 new file mode 100644 index 0000000000..8b7f7ff56d --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_down_button/gOcarinaCDownButtonDL_tri_1 @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_down_button/gOcarinaCDownButtonDL_vtx_0 b/mm/assets/custom/objects/object_ocarina_c_down_button/gOcarinaCDownButtonDL_vtx_0 new file mode 100644 index 0000000000..f3d8371d49 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_down_button/gOcarinaCDownButtonDL_vtx_0 @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_down_button/gOcarinaCDownButtonDL_vtx_1 b/mm/assets/custom/objects/object_ocarina_c_down_button/gOcarinaCDownButtonDL_vtx_1 new file mode 100644 index 0000000000..682f39ebb8 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_down_button/gOcarinaCDownButtonDL_vtx_1 @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_down_button/gOcarinaCDownButtonDL_vtx_cull b/mm/assets/custom/objects/object_ocarina_c_down_button/gOcarinaCDownButtonDL_vtx_cull new file mode 100644 index 0000000000..38adb91be5 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_down_button/gOcarinaCDownButtonDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_down_button/mat_gOcarinaCDownButtonDL_f3dlite_ocarina_C_button_edge b/mm/assets/custom/objects/object_ocarina_c_down_button/mat_gOcarinaCDownButtonDL_f3dlite_ocarina_C_button_edge new file mode 100644 index 0000000000..b741478fb4 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_down_button/mat_gOcarinaCDownButtonDL_f3dlite_ocarina_C_button_edge @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_down_button/mat_gOcarinaCDownButtonDL_f3dlite_ocarina_C_button_surface b/mm/assets/custom/objects/object_ocarina_c_down_button/mat_gOcarinaCDownButtonDL_f3dlite_ocarina_C_button_surface new file mode 100644 index 0000000000..9b7410f6fa --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_down_button/mat_gOcarinaCDownButtonDL_f3dlite_ocarina_C_button_surface @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_down_button/noise_tex b/mm/assets/custom/objects/object_ocarina_c_down_button/noise_tex new file mode 100644 index 0000000000..aaf4e331f1 Binary files /dev/null and b/mm/assets/custom/objects/object_ocarina_c_down_button/noise_tex differ diff --git a/mm/assets/custom/objects/object_ocarina_c_left_button/gOcarinaCLeftButtonDL b/mm/assets/custom/objects/object_ocarina_c_left_button/gOcarinaCLeftButtonDL new file mode 100644 index 0000000000..be037cfe21 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_left_button/gOcarinaCLeftButtonDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_left_button/gOcarinaCLeftButtonDL_tri_0 b/mm/assets/custom/objects/object_ocarina_c_left_button/gOcarinaCLeftButtonDL_tri_0 new file mode 100644 index 0000000000..bda98fe0a6 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_left_button/gOcarinaCLeftButtonDL_tri_0 @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_left_button/gOcarinaCLeftButtonDL_tri_1 b/mm/assets/custom/objects/object_ocarina_c_left_button/gOcarinaCLeftButtonDL_tri_1 new file mode 100644 index 0000000000..937dd564d1 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_left_button/gOcarinaCLeftButtonDL_tri_1 @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_left_button/gOcarinaCLeftButtonDL_vtx_0 b/mm/assets/custom/objects/object_ocarina_c_left_button/gOcarinaCLeftButtonDL_vtx_0 new file mode 100644 index 0000000000..e84ec90461 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_left_button/gOcarinaCLeftButtonDL_vtx_0 @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_left_button/gOcarinaCLeftButtonDL_vtx_1 b/mm/assets/custom/objects/object_ocarina_c_left_button/gOcarinaCLeftButtonDL_vtx_1 new file mode 100644 index 0000000000..fd2bf7af91 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_left_button/gOcarinaCLeftButtonDL_vtx_1 @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_left_button/gOcarinaCLeftButtonDL_vtx_cull b/mm/assets/custom/objects/object_ocarina_c_left_button/gOcarinaCLeftButtonDL_vtx_cull new file mode 100644 index 0000000000..38adb91be5 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_left_button/gOcarinaCLeftButtonDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_left_button/mat_gOcarinaCLeftButtonDL_f3dlite_ocarina_C_button_edge b/mm/assets/custom/objects/object_ocarina_c_left_button/mat_gOcarinaCLeftButtonDL_f3dlite_ocarina_C_button_edge new file mode 100644 index 0000000000..5bef848677 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_left_button/mat_gOcarinaCLeftButtonDL_f3dlite_ocarina_C_button_edge @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_left_button/mat_gOcarinaCLeftButtonDL_f3dlite_ocarina_C_button_surface b/mm/assets/custom/objects/object_ocarina_c_left_button/mat_gOcarinaCLeftButtonDL_f3dlite_ocarina_C_button_surface new file mode 100644 index 0000000000..2d1b57f5b6 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_left_button/mat_gOcarinaCLeftButtonDL_f3dlite_ocarina_C_button_surface @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_left_button/noise_tex b/mm/assets/custom/objects/object_ocarina_c_left_button/noise_tex new file mode 100644 index 0000000000..aaf4e331f1 Binary files /dev/null and b/mm/assets/custom/objects/object_ocarina_c_left_button/noise_tex differ diff --git a/mm/assets/custom/objects/object_ocarina_c_right_button/gOcarinaCRightButtonDL b/mm/assets/custom/objects/object_ocarina_c_right_button/gOcarinaCRightButtonDL new file mode 100644 index 0000000000..9d41daa33d --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_right_button/gOcarinaCRightButtonDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_right_button/gOcarinaCRightButtonDL_tri_0 b/mm/assets/custom/objects/object_ocarina_c_right_button/gOcarinaCRightButtonDL_tri_0 new file mode 100644 index 0000000000..f008c7abcb --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_right_button/gOcarinaCRightButtonDL_tri_0 @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_right_button/gOcarinaCRightButtonDL_tri_1 b/mm/assets/custom/objects/object_ocarina_c_right_button/gOcarinaCRightButtonDL_tri_1 new file mode 100644 index 0000000000..1767f6fe30 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_right_button/gOcarinaCRightButtonDL_tri_1 @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_right_button/gOcarinaCRightButtonDL_vtx_0 b/mm/assets/custom/objects/object_ocarina_c_right_button/gOcarinaCRightButtonDL_vtx_0 new file mode 100644 index 0000000000..f3039179f8 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_right_button/gOcarinaCRightButtonDL_vtx_0 @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_right_button/gOcarinaCRightButtonDL_vtx_1 b/mm/assets/custom/objects/object_ocarina_c_right_button/gOcarinaCRightButtonDL_vtx_1 new file mode 100644 index 0000000000..1c79e5a867 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_right_button/gOcarinaCRightButtonDL_vtx_1 @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_right_button/gOcarinaCRightButtonDL_vtx_cull b/mm/assets/custom/objects/object_ocarina_c_right_button/gOcarinaCRightButtonDL_vtx_cull new file mode 100644 index 0000000000..38adb91be5 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_right_button/gOcarinaCRightButtonDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_right_button/mat_gOcarinaCRightButtonDL_f3dlite_ocarina_C_button_edge b/mm/assets/custom/objects/object_ocarina_c_right_button/mat_gOcarinaCRightButtonDL_f3dlite_ocarina_C_button_edge new file mode 100644 index 0000000000..1cb97f9e37 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_right_button/mat_gOcarinaCRightButtonDL_f3dlite_ocarina_C_button_edge @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_right_button/mat_gOcarinaCRightButtonDL_f3dlite_ocarina_C_button_surface b/mm/assets/custom/objects/object_ocarina_c_right_button/mat_gOcarinaCRightButtonDL_f3dlite_ocarina_C_button_surface new file mode 100644 index 0000000000..70fc9e85da --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_right_button/mat_gOcarinaCRightButtonDL_f3dlite_ocarina_C_button_surface @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_right_button/noise_tex b/mm/assets/custom/objects/object_ocarina_c_right_button/noise_tex new file mode 100644 index 0000000000..aaf4e331f1 Binary files /dev/null and b/mm/assets/custom/objects/object_ocarina_c_right_button/noise_tex differ diff --git a/mm/assets/custom/objects/object_ocarina_c_up_button/gOcarinaCUpButtonDL b/mm/assets/custom/objects/object_ocarina_c_up_button/gOcarinaCUpButtonDL new file mode 100644 index 0000000000..36b1ff7a2f --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_up_button/gOcarinaCUpButtonDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_up_button/gOcarinaCUpButtonDL_tri_0 b/mm/assets/custom/objects/object_ocarina_c_up_button/gOcarinaCUpButtonDL_tri_0 new file mode 100644 index 0000000000..f46f7c5655 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_up_button/gOcarinaCUpButtonDL_tri_0 @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_up_button/gOcarinaCUpButtonDL_tri_1 b/mm/assets/custom/objects/object_ocarina_c_up_button/gOcarinaCUpButtonDL_tri_1 new file mode 100644 index 0000000000..80954ffe27 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_up_button/gOcarinaCUpButtonDL_tri_1 @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_up_button/gOcarinaCUpButtonDL_vtx_0 b/mm/assets/custom/objects/object_ocarina_c_up_button/gOcarinaCUpButtonDL_vtx_0 new file mode 100644 index 0000000000..a35cf324ab --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_up_button/gOcarinaCUpButtonDL_vtx_0 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_up_button/gOcarinaCUpButtonDL_vtx_1 b/mm/assets/custom/objects/object_ocarina_c_up_button/gOcarinaCUpButtonDL_vtx_1 new file mode 100644 index 0000000000..09a4018d34 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_up_button/gOcarinaCUpButtonDL_vtx_1 @@ -0,0 +1,251 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_up_button/gOcarinaCUpButtonDL_vtx_cull b/mm/assets/custom/objects/object_ocarina_c_up_button/gOcarinaCUpButtonDL_vtx_cull new file mode 100644 index 0000000000..38adb91be5 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_up_button/gOcarinaCUpButtonDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_up_button/mat_gOcarinaCUpButtonDL_f3dlite_ocarina_C_button_edge b/mm/assets/custom/objects/object_ocarina_c_up_button/mat_gOcarinaCUpButtonDL_f3dlite_ocarina_C_button_edge new file mode 100644 index 0000000000..301ec9fc43 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_up_button/mat_gOcarinaCUpButtonDL_f3dlite_ocarina_C_button_edge @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_up_button/mat_gOcarinaCUpButtonDL_f3dlite_ocarina_C_button_surface b/mm/assets/custom/objects/object_ocarina_c_up_button/mat_gOcarinaCUpButtonDL_f3dlite_ocarina_C_button_surface new file mode 100644 index 0000000000..a9a701d154 --- /dev/null +++ b/mm/assets/custom/objects/object_ocarina_c_up_button/mat_gOcarinaCUpButtonDL_f3dlite_ocarina_C_button_surface @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_ocarina_c_up_button/noise_tex b/mm/assets/custom/objects/object_ocarina_c_up_button/noise_tex new file mode 100644 index 0000000000..aaf4e331f1 Binary files /dev/null and b/mm/assets/custom/objects/object_ocarina_c_up_button/noise_tex differ diff --git a/mm/src/audio/code_8019AF00.c b/mm/src/audio/code_8019AF00.c index 8bc60008bc..030023d2ba 100644 --- a/mm/src/audio/code_8019AF00.c +++ b/mm/src/audio/code_8019AF00.c @@ -2666,7 +2666,7 @@ void AudioOcarina_PlayControllerInput(u8 isOcarinaSfxSuppressedWhenCancelled) { sCurOcarinaButtonIndex = OCARINA_BTN_C_UP; } - if (sOcarinaInputButtonCur) {} + if (GameInteractor_Should(VB_PLAY_OCARINA_NOTE, true, &sCurOcarinaButtonIndex, &sCurOcarinaPitch)) {} // Pressing the R Button will raise the pitch by 1 semitone if ((sCurOcarinaPitch != OCARINA_PITCH_NONE) && CHECK_BTN_ANY(sOcarinaInputButtonCur, BTN_R) && diff --git a/mm/src/overlays/actors/ovl_En_Toto/z_en_toto.c b/mm/src/overlays/actors/ovl_En_Toto/z_en_toto.c index 310505bb92..24edc955e2 100644 --- a/mm/src/overlays/actors/ovl_En_Toto/z_en_toto.c +++ b/mm/src/overlays/actors/ovl_En_Toto/z_en_toto.c @@ -349,7 +349,9 @@ s32 func_80BA3EE8(EnToto* this, PlayState* play) { s32 func_80BA3F2C(EnToto* this, PlayState* play) { if (this->text->textId != 0) { - Message_ContinueTextbox(play, this->text->textId); + if (GameInteractor_Should(VB_TOTO_START_SOUND_CHECK, true, this)) { + Message_ContinueTextbox(play, this->text->textId); + } } else { Message_CloseTextbox(play); func_80BA3EE8(this, play);