From cd4ee56d4874b694507008696132266cca8a916e Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Mon, 7 Oct 2024 10:25:09 -0500 Subject: Implement faster song playback enhancement (#801) --- mm/2s2h/BenGui/SearchableMenuItems.h | 8 +++++- mm/2s2h/Enhancements/Enhancements.cpp | 1 + mm/2s2h/Enhancements/Songs/FasterSongPlayback.cpp | 30 +++++++++++++++++++++++ mm/2s2h/Enhancements/Songs/Songs.h | 1 + 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 mm/2s2h/Enhancements/Songs/FasterSongPlayback.cpp diff --git a/mm/2s2h/BenGui/SearchableMenuItems.h b/mm/2s2h/BenGui/SearchableMenuItems.h index ab6768809..2bd672834 100644 --- a/mm/2s2h/BenGui/SearchableMenuItems.h +++ b/mm/2s2h/BenGui/SearchableMenuItems.h @@ -1226,7 +1226,13 @@ void AddEnhancements() { WIDGET_CVAR_SLIDER_INT, { 1, 7, 7 } }, { "Prevent Dropped Ocarina Inputs", "gEnhancements.Playback.NoDropOcarinaInput", - "Prevent dropping inputs when playing the ocarina quickly.", WIDGET_CVAR_CHECKBOX } } } }); + "Prevent dropping inputs when playing the ocarina quickly.", WIDGET_CVAR_CHECKBOX }, + { "Faster Song Playback", + "gEnhancements.Songs.FasterSongPlayback", + "Speeds up the playback of songs.", + WIDGET_CVAR_CHECKBOX, + {}, + [](widgetInfo& info) { RegisterFasterSongPlayback(); } } } } }); enhancementsSidebar.push_back( { "Time Savers", 3, diff --git a/mm/2s2h/Enhancements/Enhancements.cpp b/mm/2s2h/Enhancements/Enhancements.cpp index f7f1a4a1a..3afba3157 100644 --- a/mm/2s2h/Enhancements/Enhancements.cpp +++ b/mm/2s2h/Enhancements/Enhancements.cpp @@ -55,6 +55,7 @@ void InitEnhancements() { // Songs RegisterEnableSunsSong(); + RegisterFasterSongPlayback(); RegisterPauseOwlWarp(); RegisterZoraEggCount(); diff --git a/mm/2s2h/Enhancements/Songs/FasterSongPlayback.cpp b/mm/2s2h/Enhancements/Songs/FasterSongPlayback.cpp new file mode 100644 index 000000000..fe4dc02c0 --- /dev/null +++ b/mm/2s2h/Enhancements/Songs/FasterSongPlayback.cpp @@ -0,0 +1,30 @@ +#include "2s2h/GameInteractor/GameInteractor.h" +#include "libultraship/libultraship.h" + +extern "C" { +#include "variables.h" + +extern u8 sPlaybackState; +} + +void RegisterFasterSongPlayback() { + static uint32_t onPlayerUpdate = 0; + GameInteractor::Instance->UnregisterGameHookForID(onPlayerUpdate); + + onPlayerUpdate = 0; + + if (!CVarGetInteger("gEnhancements.Songs.FasterSongPlayback", 0)) { + return; + } + + onPlayerUpdate = + GameInteractor::Instance->RegisterGameHookForID(ACTOR_PLAYER, [](Actor* actor) { + if (gPlayState->msgCtx.msgMode >= MSGMODE_SONG_PLAYED && gPlayState->msgCtx.msgMode <= MSGMODE_17) { + if (gPlayState->msgCtx.stateTimer > 1) { + gPlayState->msgCtx.stateTimer = 1; + } + gPlayState->msgCtx.ocarinaSongEffectActive = 0; + sPlaybackState = 0; + } + }); +} diff --git a/mm/2s2h/Enhancements/Songs/Songs.h b/mm/2s2h/Enhancements/Songs/Songs.h index 22469f29e..ecd2a6942 100644 --- a/mm/2s2h/Enhancements/Songs/Songs.h +++ b/mm/2s2h/Enhancements/Songs/Songs.h @@ -2,6 +2,7 @@ #define SONGS_H void RegisterEnableSunsSong(); +void RegisterFasterSongPlayback(); void RegisterZoraEggCount(); void RegisterPauseOwlWarp(); -- cgit v1.2.3