diff --git a/src/openrct2-ui/windows/Options.cpp b/src/openrct2-ui/windows/Options.cpp index 93e6b272fc..172f485e31 100644 --- a/src/openrct2-ui/windows/Options.cpp +++ b/src/openrct2-ui/windows/Options.cpp @@ -1349,34 +1349,22 @@ private: break; case WIDX_TITLE_MUSIC_DROPDOWN: { - if (!IsRCT1TitleMusicAvailable()) + const bool rct1MusicThemeIsAvailable = IsRCT1TitleMusicAvailable(); + int32_t numItems{}; + int32_t checkedIndex{}; + for (auto theme : TitleThemeOptions) { - // Only show None and RCT2 - int32_t numItems{}; + if (theme.Kind == TitleMusicKind::RCT1 && !rct1MusicThemeIsAvailable) + continue; + + if (gConfigSound.TitleMusic == theme.Kind) + checkedIndex = numItems; + gDropdownItems[numItems].Format = STR_DROPDOWN_MENU_LABEL; - gDropdownItems[numItems++].Args = TitleMusicNames[0]; - gDropdownItems[numItems].Format = STR_DROPDOWN_MENU_LABEL; - gDropdownItems[numItems++].Args = TitleMusicNames[2]; - gDropdownItems[numItems].Format = STR_DROPDOWN_MENU_LABEL; - gDropdownItems[numItems++].Args = TitleMusicNames[3]; - ShowDropdown(widget, numItems); - if (gConfigSound.TitleMusic == TitleMusicKind::None) - Dropdown::SetChecked(0, true); - else if (gConfigSound.TitleMusic == TitleMusicKind::RCT2) - Dropdown::SetChecked(1, true); - } - else - { - // Show None, RCT1, RCT2 and random - int32_t numItems{}; - for (auto musicName : TitleMusicNames) - { - gDropdownItems[numItems].Format = STR_DROPDOWN_MENU_LABEL; - gDropdownItems[numItems++].Args = musicName; - } - ShowDropdown(widget, numItems); - Dropdown::SetChecked(EnumValue(gConfigSound.TitleMusic), true); + gDropdownItems[numItems++].Args = theme.Name; } + ShowDropdown(widget, numItems); + Dropdown::SetChecked(checkedIndex, true); break; } } @@ -1409,18 +1397,12 @@ private: break; case WIDX_TITLE_MUSIC_DROPDOWN: { - auto titleMusic = static_cast(dropdownIndex); - if (!IsRCT1TitleMusicAvailable() && dropdownIndex >= EnumValue(TitleMusicKind::RCT1)) - { - titleMusic = static_cast(EnumValue(titleMusic) + 1); - } - - gConfigSound.TitleMusic = titleMusic; + gConfigSound.TitleMusic = TitleThemeOptions[dropdownIndex].Kind; ConfigSaveDefault(); Invalidate(); OpenRCT2::Audio::StopTitleMusic(); - if (titleMusic != TitleMusicKind::None) + if (gConfigSound.TitleMusic != TitleMusicKind::None) { OpenRCT2::Audio::PlayTitleMusic(); } @@ -1467,14 +1449,14 @@ private: return { 500, 0 }; } - StringId GetTitleMusicName() + StringId GetTitleMusicName() const { - auto index = EnumValue(gConfigSound.TitleMusic); - if (index < 0 || static_cast(index) >= std::size(TitleMusicNames)) - { - index = EnumValue(TitleMusicKind::None); - } - return TitleMusicNames[index]; + auto theme = std::find_if(std::begin(TitleThemeOptions), std::end(TitleThemeOptions), [](auto&& theme) { + return gConfigSound.TitleMusic == theme.Kind; + }); + if (theme != std::end(TitleThemeOptions)) + return theme->Name; + return STR_OPENRCT2_DROPDOWN; } void AudioPrepareDraw() @@ -2148,9 +2130,16 @@ private: STR_SAVE_EVERY_30MINUTES, STR_SAVE_EVERY_HOUR, STR_SAVE_NEVER, }; - static constexpr StringId TitleMusicNames[] = { - STR_OPTIONS_MUSIC_VALUE_NONE, STR_ROLLERCOASTER_TYCOON_1_DROPDOWN, STR_ROLLERCOASTER_TYCOON_2_DROPDOWN, - STR_OPENRCT2_DROPDOWN, STR_OPTIONS_MUSIC_VALUE_RANDOM, + static constexpr struct + { + TitleMusicKind Kind; + StringId Name; + } TitleThemeOptions[] = { + { TitleMusicKind::None, STR_OPTIONS_MUSIC_VALUE_NONE }, + { TitleMusicKind::OpenRCT2, STR_OPENRCT2_DROPDOWN }, + { TitleMusicKind::RCT1, STR_ROLLERCOASTER_TYCOON_1_DROPDOWN }, + { TitleMusicKind::RCT2, STR_ROLLERCOASTER_TYCOON_2_DROPDOWN }, + { TitleMusicKind::Random, STR_OPTIONS_MUSIC_VALUE_RANDOM }, }; static constexpr StringId FullscreenModeNames[] = { diff --git a/src/openrct2/config/Config.cpp b/src/openrct2/config/Config.cpp index d6caff1787..1e75cff005 100644 --- a/src/openrct2/config/Config.cpp +++ b/src/openrct2/config/Config.cpp @@ -362,7 +362,8 @@ namespace Config model->Device = reader->GetString("audio_device", ""); model->MasterSoundEnabled = reader->GetBoolean("master_sound", true); model->MasterVolume = reader->GetInt32("master_volume", 100); - model->TitleMusic = static_cast(reader->GetInt32("title_music", EnumValue(TitleMusicKind::RCT2))); + model->TitleMusic = static_cast( + reader->GetInt32("title_theme", EnumValue(TitleMusicKind::OpenRCT2))); model->SoundEnabled = reader->GetBoolean("sound", true); model->SoundVolume = reader->GetInt32("sound_volume", 100); model->RideMusicEnabled = reader->GetBoolean("ride_music", true); @@ -378,7 +379,7 @@ namespace Config writer->WriteString("audio_device", model->Device); writer->WriteBoolean("master_sound", model->MasterSoundEnabled); writer->WriteInt32("master_volume", model->MasterVolume); - writer->WriteInt32("title_music", EnumValue(model->TitleMusic)); + writer->WriteInt32("title_theme", EnumValue(model->TitleMusic)); writer->WriteBoolean("sound", model->SoundEnabled); writer->WriteInt32("sound_volume", model->SoundVolume); writer->WriteBoolean("ride_music", model->RideMusicEnabled); diff --git a/src/openrct2/config/Config.h b/src/openrct2/config/Config.h index b014976130..5dd801bfba 100644 --- a/src/openrct2/config/Config.h +++ b/src/openrct2/config/Config.h @@ -251,10 +251,10 @@ enum class MeasurementFormat : int32_t enum class TitleMusicKind : int32_t { None, + Random, + OpenRCT2, RCT1, RCT2, - OpenRCT2, - Random }; extern GeneralConfiguration gConfigGeneral;