Move the audio code into OpenRCT2 namespace

This commit is contained in:
Matt 2020-10-07 00:34:42 +03:00
parent 86b1c0dbe1
commit 091145037e
No known key found for this signature in database
GPG Key ID: 6D4C24A61C93E208
139 changed files with 1149 additions and 1094 deletions

View File

@ -619,7 +619,7 @@ static void shortcut_show_options()
static void shortcut_mute_sound() static void shortcut_mute_sound()
{ {
audio_toggle_all_sounds(); OpenRCT2::Audio::ToggleAllSounds();
} }
static void shortcut_windowed_mode_toggle() static void shortcut_windowed_mode_toggle()

View File

@ -1052,7 +1052,7 @@ static void input_widget_left(const ScreenCoordsXY& screenCoords, rct_window* w,
default: default:
if (widget_is_enabled(w, widgetIndex) && !widget_is_disabled(w, widgetIndex)) if (widget_is_enabled(w, widgetIndex) && !widget_is_disabled(w, widgetIndex))
{ {
audio_play_sound(SoundId::Click1, 0, w->windowPos.x + widget->midX()); OpenRCT2::Audio::Play(OpenRCT2::Audio::SoundId::Click1, 0, w->windowPos.x + widget->midX());
// Set new cursor down widget // Set new cursor down widget
gPressedWidget.window_classification = windowClass; gPressedWidget.window_classification = windowClass;
@ -1337,7 +1337,7 @@ void input_state_widget_pressed(
{ {
int32_t mid_point_x = widget->midX() + w->windowPos.x; int32_t mid_point_x = widget->midX() + w->windowPos.x;
audio_play_sound(SoundId::Click2, 0, mid_point_x); OpenRCT2::Audio::Play(OpenRCT2::Audio::SoundId::Click2, 0, mid_point_x);
} }
if (cursor_w_class != w->classification || cursor_w_number != w->number || widgetIndex != cursor_widgetIndex) if (cursor_w_class != w->classification || cursor_w_number != w->number || widgetIndex != cursor_widgetIndex)
break; break;

View File

@ -139,7 +139,7 @@ rct_window* window_create(
if (!(flags & (WF_STICK_TO_BACK | WF_STICK_TO_FRONT))) if (!(flags & (WF_STICK_TO_BACK | WF_STICK_TO_FRONT)))
{ {
w->flags |= WF_WHITE_BORDER_MASK; w->flags |= WF_WHITE_BORDER_MASK;
audio_play_sound(SoundId::WindowOpen, 0, screenCoords.x + (width / 2)); OpenRCT2::Audio::Play(OpenRCT2::Audio::SoundId::WindowOpen, 0, screenCoords.x + (width / 2));
} }
w->number = 0; w->number = 0;

View File

@ -679,7 +679,7 @@ static void window_editor_object_selection_scroll_mousedown(
w->Invalidate(); w->Invalidate();
const CursorState* state = context_get_cursor_state(); const CursorState* state = context_get_cursor_state();
audio_play_sound(SoundId::Click1, 0, state->position.x); OpenRCT2::Audio::Play(OpenRCT2::Audio::SoundId::Click1, 0, state->position.x);
if (gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER) if (gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER)
{ {

View File

@ -124,7 +124,7 @@ rct_window* window_error_open(const std::string_view& title, const std::string_v
w->error.var_480 = 0; w->error.var_480 = 0;
if (!gDisableErrorWindowSound) if (!gDisableErrorWindowSound)
{ {
audio_play_sound(SoundId::Error, 0, w->windowPos.x + (w->width / 2)); OpenRCT2::Audio::Play(OpenRCT2::Audio::SoundId::Error, 0, w->windowPos.x + (w->width / 2));
} }
return w; return w;

View File

@ -870,7 +870,7 @@ static void window_footpath_place_path_at_point(const ScreenCoordsXY& screenCoor
// Don't play sound if it is no cost to prevent multiple sounds. TODO: make this work in no money scenarios // Don't play sound if it is no cost to prevent multiple sounds. TODO: make this work in no money scenarios
if (result->Cost != 0) if (result->Cost != 0)
{ {
audio_play_sound_at_location(SoundId::PlaceItem, result->Position); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::PlaceItem, result->Position);
} }
} }
else else
@ -957,7 +957,7 @@ static void window_footpath_construct()
footpathPlaceAction.SetCallback([=](const GameAction* ga, const GameActionResult* result) { footpathPlaceAction.SetCallback([=](const GameAction* ga, const GameActionResult* result) {
if (result->Error == GA_ERROR::OK) if (result->Error == GA_ERROR::OK)
{ {
audio_play_sound_at_location(SoundId::PlaceItem, result->Position); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::PlaceItem, result->Position);
if (gFootpathConstructSlope == 0) if (gFootpathConstructSlope == 0)
{ {

View File

@ -1293,7 +1293,7 @@ static void window_map_place_park_entrance_tool_down(const ScreenCoordsXY& scree
auto result = GameActions::Execute(&gameAction); auto result = GameActions::Execute(&gameAction);
if (result->Error == GA_ERROR::OK) if (result->Error == GA_ERROR::OK)
{ {
audio_play_sound_at_location(SoundId::PlaceItem, result->Position); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::PlaceItem, result->Position);
} }
} }
} }
@ -1318,7 +1318,7 @@ static void window_map_set_peep_spawn_tool_down(const ScreenCoordsXY& screenCoor
auto result = GameActions::Execute(&gameAction); auto result = GameActions::Execute(&gameAction);
if (result->Error == GA_ERROR::OK) if (result->Error == GA_ERROR::OK)
{ {
audio_play_sound_at_location(SoundId::PlaceItem, result->Position); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::PlaceItem, result->Position);
} }
} }

View File

@ -364,7 +364,7 @@ static void window_maze_construction_entrance_tooldown(const ScreenCoordsXY& scr
if (result->Error != GA_ERROR::OK) if (result->Error != GA_ERROR::OK)
return; return;
audio_play_sound_at_location(SoundId::PlaceItem, result->Position); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::PlaceItem, result->Position);
auto ride = get_ride(rideIndex); auto ride = get_ride(rideIndex);
if (ride != nullptr && ride_are_all_possible_entrances_and_exits_built(ride)) if (ride != nullptr && ride_are_all_possible_entrances_and_exits_built(ride))
@ -504,6 +504,6 @@ static void window_maze_construction_construct(int32_t direction)
_currentTrackBegin.y = y; _currentTrackBegin.y = y;
if (_rideConstructionState != RIDE_CONSTRUCTION_STATE_MAZE_MOVE) if (_rideConstructionState != RIDE_CONSTRUCTION_STATE_MAZE_MOVE)
{ {
audio_play_sound_at_location(SoundId::PlaceItem, { x, y, z }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::PlaceItem, { x, y, z });
} }
} }

View File

@ -711,7 +711,7 @@ static void window_new_ride_scrollmousedown(rct_window* w, int32_t scrollIndex,
_windowNewRideHighlightedItem[_windowNewRideCurrentTab] = item; _windowNewRideHighlightedItem[_windowNewRideCurrentTab] = item;
w->new_ride.SelectedRide = item; w->new_ride.SelectedRide = item;
audio_play_sound(SoundId::Click1, 0, w->windowPos.x + (w->width / 2)); OpenRCT2::Audio::Play(OpenRCT2::Audio::SoundId::Click1, 0, w->windowPos.x + (w->width / 2));
w->new_ride.selected_ride_countdown = 8; w->new_ride.selected_ride_countdown = 8;
w->Invalidate(); w->Invalidate();
} }

View File

@ -123,7 +123,7 @@ static void window_news_update(rct_window* w)
} }
w->Invalidate(); w->Invalidate();
audio_play_sound(SoundId::Click2, 0, w->windowPos.x + (w->width / 2)); OpenRCT2::Audio::Play(OpenRCT2::Audio::SoundId::Click2, 0, w->windowPos.x + (w->width / 2));
size_t j = w->news.var_480; size_t j = w->news.var_480;
w->news.var_480 = -1; w->news.var_480 = -1;
@ -198,7 +198,7 @@ static void window_news_scrollmousedown(rct_window* w, int32_t scrollIndex, cons
w->news.var_482 = buttonIndex; w->news.var_482 = buttonIndex;
w->news.var_484 = 4; w->news.var_484 = 4;
w->Invalidate(); w->Invalidate();
audio_play_sound(SoundId::Click1, 0, w->windowPos.x + (w->width / 2)); OpenRCT2::Audio::Play(OpenRCT2::Audio::SoundId::Click1, 0, w->windowPos.x + (w->width / 2));
} }
} }

View File

@ -1338,9 +1338,9 @@ static void window_options_audio_mouseup(rct_window* w, rct_widgetindex widgetIn
case WIDX_MASTER_SOUND_CHECKBOX: case WIDX_MASTER_SOUND_CHECKBOX:
gConfigSound.master_sound_enabled = !gConfigSound.master_sound_enabled; gConfigSound.master_sound_enabled = !gConfigSound.master_sound_enabled;
if (!gConfigSound.master_sound_enabled) if (!gConfigSound.master_sound_enabled)
audio_pause_sounds(); OpenRCT2::Audio::Pause();
else else
audio_unpause_sounds(); OpenRCT2::Audio::Resume();
window_invalidate_by_class(WC_TOP_TOOLBAR); window_invalidate_by_class(WC_TOP_TOOLBAR);
config_save_default(); config_save_default();
w->Invalidate(); w->Invalidate();
@ -1350,7 +1350,7 @@ static void window_options_audio_mouseup(rct_window* w, rct_widgetindex widgetIn
gConfigSound.ride_music_enabled = !gConfigSound.ride_music_enabled; gConfigSound.ride_music_enabled = !gConfigSound.ride_music_enabled;
if (!gConfigSound.ride_music_enabled) if (!gConfigSound.ride_music_enabled)
{ {
audio_stop_ride_music(); OpenRCT2::Audio::StopRideMusic();
} }
config_save_default(); config_save_default();
w->Invalidate(); w->Invalidate();
@ -1371,18 +1371,18 @@ static void window_options_audio_mousedown(rct_window* w, rct_widgetindex widget
switch (widgetIndex) switch (widgetIndex)
{ {
case WIDX_SOUND_DROPDOWN: case WIDX_SOUND_DROPDOWN:
audio_populate_devices(); OpenRCT2::Audio::PopulateDevices();
// populate the list with the sound devices // populate the list with the sound devices
for (size_t i = 0; static_cast<int32_t>(i) < audio_get_device_count(); i++) for (int32_t i = 0; i < OpenRCT2::Audio::GetDeviceCount(); i++)
{ {
gDropdownItemsFormat[i] = STR_OPTIONS_DROPDOWN_ITEM; gDropdownItemsFormat[i] = STR_OPTIONS_DROPDOWN_ITEM;
gDropdownItemsArgs[i] = reinterpret_cast<uintptr_t>(audio_get_device_name(i).c_str()); gDropdownItemsArgs[i] = reinterpret_cast<uintptr_t>(OpenRCT2::Audio::GetDeviceName(i).c_str());
} }
window_options_show_dropdown(w, widget, audio_get_device_count()); window_options_show_dropdown(w, widget, OpenRCT2::Audio::GetDeviceCount());
dropdown_set_checked(audio_get_device_index(), true); dropdown_set_checked(OpenRCT2::Audio::GetCurrentDeviceIndex(), true);
break; break;
case WIDX_TITLE_MUSIC_DROPDOWN: case WIDX_TITLE_MUSIC_DROPDOWN:
uint32_t num_items = 4; uint32_t num_items = 4;
@ -1408,8 +1408,8 @@ static void window_options_audio_dropdown(rct_window* w, rct_widgetindex widgetI
switch (widgetIndex) switch (widgetIndex)
{ {
case WIDX_SOUND_DROPDOWN: case WIDX_SOUND_DROPDOWN:
audio_init_ride_sounds(dropdownIndex); OpenRCT2::Audio::InitRideSounds(dropdownIndex);
if (dropdownIndex < audio_get_device_count()) if (dropdownIndex < OpenRCT2::Audio::GetDeviceCount())
{ {
if (dropdownIndex == 0) if (dropdownIndex == 0)
{ {
@ -1418,13 +1418,13 @@ static void window_options_audio_dropdown(rct_window* w, rct_widgetindex widgetI
} }
else else
{ {
const char* devicename = audio_get_device_name(dropdownIndex).c_str(); const char* devicename = OpenRCT2::Audio::GetDeviceName(dropdownIndex).c_str();
Mixer_Init(devicename); Mixer_Init(devicename);
SafeFree(gConfigSound.device); SafeFree(gConfigSound.device);
gConfigSound.device = strndup(devicename, AUDIO_DEVICE_NAME_SIZE); gConfigSound.device = strndup(devicename, AUDIO_DEVICE_NAME_SIZE);
} }
config_save_default(); config_save_default();
audio_start_title_music(); OpenRCT2::Audio::PlayTitleMusic();
} }
w->Invalidate(); w->Invalidate();
break; break;
@ -1440,9 +1440,9 @@ static void window_options_audio_dropdown(rct_window* w, rct_widgetindex widgetI
w->Invalidate(); w->Invalidate();
} }
audio_stop_title_music(); OpenRCT2::Audio::StopTitleMusic();
if (dropdownIndex != 0) if (dropdownIndex != 0)
audio_start_title_music(); OpenRCT2::Audio::PlayTitleMusic();
break; break;
} }
} }
@ -1513,7 +1513,7 @@ static void window_options_audio_invalidate(rct_window* w)
// Sound device // Sound device
rct_string_id audioDeviceStringId = STR_OPTIONS_SOUND_VALUE_DEFAULT; rct_string_id audioDeviceStringId = STR_OPTIONS_SOUND_VALUE_DEFAULT;
const char* audioDeviceName = nullptr; const char* audioDeviceName = nullptr;
const int32_t currentDeviceIndex = audio_get_device_index(); const int32_t currentDeviceIndex = OpenRCT2::Audio::GetCurrentDeviceIndex();
if (currentDeviceIndex == -1) if (currentDeviceIndex == -1)
{ {
audioDeviceStringId = STR_SOUND_NONE; audioDeviceStringId = STR_SOUND_NONE;
@ -1529,7 +1529,7 @@ static void window_options_audio_invalidate(rct_window* w)
#endif // __linux__ #endif // __linux__
if (audioDeviceStringId == STR_STRING) if (audioDeviceStringId == STR_STRING)
{ {
audioDeviceName = audio_get_device_name(currentDeviceIndex).c_str(); audioDeviceName = OpenRCT2::Audio::GetDeviceName(currentDeviceIndex).c_str();
} }
} }

View File

@ -4976,9 +4976,9 @@ static void window_ride_music_mousedown(rct_window* w, rct_widgetindex widgetInd
for (size_t n = 0; n < std::size(MusicStyleOrder); n++) for (size_t n = 0; n < std::size(MusicStyleOrder); n++)
window_ride_current_music_style_order[numItems++] = MusicStyleOrder[n]; window_ride_current_music_style_order[numItems++] = MusicStyleOrder[n];
if (gRideMusicInfoList[36].length != 0) if (OpenRCT2::Audio::gRideMusicInfoList[36].length != 0)
window_ride_current_music_style_order[numItems++] = MUSIC_STYLE_CUSTOM_MUSIC_1; window_ride_current_music_style_order[numItems++] = MUSIC_STYLE_CUSTOM_MUSIC_1;
if (gRideMusicInfoList[37].length != 0) if (OpenRCT2::Audio::gRideMusicInfoList[37].length != 0)
window_ride_current_music_style_order[numItems++] = MUSIC_STYLE_CUSTOM_MUSIC_2; window_ride_current_music_style_order[numItems++] = MUSIC_STYLE_CUSTOM_MUSIC_2;
} }
@ -5099,7 +5099,7 @@ static void cancel_scenery_selection()
{ {
gGamePaused &= ~GAME_PAUSED_SAVING_TRACK; gGamePaused &= ~GAME_PAUSED_SAVING_TRACK;
gTrackDesignSaveMode = false; gTrackDesignSaveMode = false;
audio_unpause_sounds(); OpenRCT2::Audio::Resume();
rct_window* main_w = window_get_main(); rct_window* main_w = window_get_main();
@ -5132,7 +5132,7 @@ static void setup_scenery_selection(rct_window* w)
gGamePaused |= GAME_PAUSED_SAVING_TRACK; gGamePaused |= GAME_PAUSED_SAVING_TRACK;
gTrackDesignSaveMode = true; gTrackDesignSaveMode = true;
audio_stop_all_music_and_sounds(); OpenRCT2::Audio::StopAll();
rct_window* w_main = window_get_main(); rct_window* w_main = window_get_main();

View File

@ -1819,7 +1819,7 @@ static void window_ride_construction_construct(rct_window* w)
{ {
return; return;
} }
audio_play_sound_at_location(SoundId::PlaceItem, trackPos); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::PlaceItem, trackPos);
if (network_get_mode() != NETWORK_MODE_NONE) if (network_get_mode() != NETWORK_MODE_NONE)
{ {
@ -3777,7 +3777,7 @@ void ride_construction_tooldown_construct(const ScreenCoordsXY& screenCoords)
|| errorText == STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND || errorText == STR_TOO_HIGH_FOR_SUPPORTS || errorText == STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND || errorText == STR_TOO_HIGH_FOR_SUPPORTS
|| zAttempts == (numAttempts - 1) || z < 0) || zAttempts == (numAttempts - 1) || z < 0)
{ {
audio_play_sound(SoundId::Error, 0, state->position.x); OpenRCT2::Audio::Play(OpenRCT2::Audio::SoundId::Error, 0, state->position.x);
w = window_find_by_class(WC_RIDE_CONSTRUCTION); w = window_find_by_class(WC_RIDE_CONSTRUCTION);
if (w != nullptr) if (w != nullptr)
{ {
@ -3795,7 +3795,7 @@ void ride_construction_tooldown_construct(const ScreenCoordsXY& screenCoords)
else else
{ {
window_close_by_class(WC_ERROR); window_close_by_class(WC_ERROR);
audio_play_sound_at_location(SoundId::PlaceItem, _currentTrackBegin); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::PlaceItem, _currentTrackBegin);
break; break;
} }
} }
@ -3849,7 +3849,7 @@ void ride_construction_tooldown_construct(const ScreenCoordsXY& screenCoords)
_currentTrackAlternative = saveCurrentTrackAlternative; _currentTrackAlternative = saveCurrentTrackAlternative;
_currentTrackLiftHill = saveCurrentTrackLiftHill; _currentTrackLiftHill = saveCurrentTrackLiftHill;
audio_play_sound(SoundId::Error, 0, state->position.x); OpenRCT2::Audio::Play(OpenRCT2::Audio::SoundId::Error, 0, state->position.x);
break; break;
} }
@ -3885,7 +3885,7 @@ static void ride_construction_tooldown_entrance_exit(const ScreenCoordsXY& scree
if (result->Error != GA_ERROR::OK) if (result->Error != GA_ERROR::OK)
return; return;
audio_play_sound_at_location(SoundId::PlaceItem, result->Position); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::PlaceItem, result->Position);
auto ride = get_ride(gRideEntranceExitPlaceRideIndex); auto ride = get_ride(gRideEntranceExitPlaceRideIndex);
if (ride != nullptr && ride_are_all_possible_entrances_and_exits_built(ride)) if (ride != nullptr && ride_are_all_possible_entrances_and_exits_built(ride))

View File

@ -157,7 +157,7 @@ rct_window* window_save_prompt_open()
if (network_get_mode() == NETWORK_MODE_NONE) if (network_get_mode() == NETWORK_MODE_NONE)
{ {
gGamePaused |= GAME_PAUSED_MODAL; gGamePaused |= GAME_PAUSED_MODAL;
audio_stop_all_music_and_sounds(); OpenRCT2::Audio::StopAll();
} }
window_invalidate_by_class(WC_TOP_TOOLBAR); window_invalidate_by_class(WC_TOP_TOOLBAR);
@ -183,7 +183,7 @@ static void window_save_prompt_close(rct_window* w)
if (network_get_mode() == NETWORK_MODE_NONE) if (network_get_mode() == NETWORK_MODE_NONE)
{ {
gGamePaused &= ~GAME_PAUSED_MODAL; gGamePaused &= ~GAME_PAUSED_MODAL;
audio_unpause_sounds(); OpenRCT2::Audio::Resume();
} }
window_invalidate_by_class(WC_TOP_TOOLBAR); window_invalidate_by_class(WC_TOP_TOOLBAR);

View File

@ -325,7 +325,7 @@ static void window_scenarioselect_scrollmousedown(rct_window* w, int32_t scrollI
mutableScreenCoords.y -= scenarioItemHeight; mutableScreenCoords.y -= scenarioItemHeight;
if (mutableScreenCoords.y < 0 && !listItem.scenario.is_locked) if (mutableScreenCoords.y < 0 && !listItem.scenario.is_locked)
{ {
audio_play_sound(SoundId::Click1, 0, w->windowPos.x + (w->width / 2)); OpenRCT2::Audio::Play(OpenRCT2::Audio::SoundId::Click1, 0, w->windowPos.x + (w->width / 2));
gFirstTimeSaving = true; gFirstTimeSaving = true;
_callback(listItem.scenario.scenario->path); _callback(listItem.scenario.scenario->path);
if (_titleEditor) if (_titleEditor)

View File

@ -885,7 +885,7 @@ void window_scenery_scrollmousedown(rct_window* w, int32_t scrollIndex, const Sc
gWindowSceneryPaintEnabled &= 0xFE; gWindowSceneryPaintEnabled &= 0xFE;
gWindowSceneryEyedropperEnabled = false; gWindowSceneryEyedropperEnabled = false;
audio_play_sound(SoundId::Click1, 0, w->windowPos.x + (w->width / 2)); OpenRCT2::Audio::Play(OpenRCT2::Audio::SoundId::Click1, 0, w->windowPos.x + (w->width / 2));
w->scenery.hover_counter = -16; w->scenery.hover_counter = -16;
gSceneryPlaceCost = MONEY32_UNDEFINED; gSceneryPlaceCost = MONEY32_UNDEFINED;
w->Invalidate(); w->Invalidate();
@ -1377,7 +1377,7 @@ bool window_scenery_set_selected_item(const ScenerySelection& scenery)
gWindowSceneryActiveTabIndex = tabIndex; gWindowSceneryActiveTabIndex = tabIndex;
gWindowSceneryTabSelections[tabIndex] = scenery; gWindowSceneryTabSelections[tabIndex] = scenery;
audio_play_sound(SoundId::Click1, 0, context_get_width() / 2); OpenRCT2::Audio::Play(OpenRCT2::Audio::SoundId::Click1, 0, context_get_width() / 2);
w->scenery.hover_counter = -16; w->scenery.hover_counter = -16;
gSceneryPlaceCost = MONEY32_UNDEFINED; gSceneryPlaceCost = MONEY32_UNDEFINED;
w->Invalidate(); w->Invalidate();

View File

@ -403,7 +403,7 @@ static void window_top_toolbar_mouseup(rct_window* w, rct_widgetindex widgetInde
context_open_window(WC_RECENT_NEWS); context_open_window(WC_RECENT_NEWS);
break; break;
case WIDX_MUTE: case WIDX_MUTE:
audio_toggle_all_sounds(); OpenRCT2::Audio::ToggleAllSounds();
break; break;
case WIDX_CHAT: case WIDX_CHAT:
if (chat_available()) if (chat_available())
@ -795,7 +795,7 @@ static void window_top_toolbar_invalidate(rct_window* w)
else else
w->pressed_widgets &= ~(1 << WIDX_PAUSE); w->pressed_widgets &= ~(1 << WIDX_PAUSE);
if (!gGameSoundsOff) if (!OpenRCT2::Audio::gGameSoundsOff)
window_top_toolbar_widgets[WIDX_MUTE].image = IMAGE_TYPE_REMAP | SPR_G2_TOOLBAR_MUTE; window_top_toolbar_widgets[WIDX_MUTE].image = IMAGE_TYPE_REMAP | SPR_G2_TOOLBAR_MUTE;
else else
window_top_toolbar_widgets[WIDX_MUTE].image = IMAGE_TYPE_REMAP | SPR_G2_TOOLBAR_UNMUTE; window_top_toolbar_widgets[WIDX_MUTE].image = IMAGE_TYPE_REMAP | SPR_G2_TOOLBAR_UNMUTE;
@ -1840,7 +1840,7 @@ static void window_top_toolbar_scenery_tool_down(const ScreenCoordsXY& windowPos
smallSceneryPlaceAction.SetCallback([=](const GameAction* ga, const GameActionResult* result) { smallSceneryPlaceAction.SetCallback([=](const GameAction* ga, const GameActionResult* result) {
if (result->Error == GA_ERROR::OK) if (result->Error == GA_ERROR::OK)
{ {
audio_play_sound_at_location(SoundId::PlaceItem, result->Position); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::PlaceItem, result->Position);
} }
}); });
auto res = GameActions::Execute(&smallSceneryPlaceAction); auto res = GameActions::Execute(&smallSceneryPlaceAction);
@ -1872,7 +1872,7 @@ static void window_top_toolbar_scenery_tool_down(const ScreenCoordsXY& windowPos
{ {
return; return;
} }
audio_play_sound_at_location(SoundId::PlaceItem, result->Position); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::PlaceItem, result->Position);
}); });
auto res = GameActions::Execute(&footpathSceneryPlaceAction); auto res = GameActions::Execute(&footpathSceneryPlaceAction);
break; break;
@ -1922,7 +1922,7 @@ static void window_top_toolbar_scenery_tool_down(const ScreenCoordsXY& windowPos
wallPlaceAction.SetCallback([](const GameAction* ga, const GameActionResult* result) { wallPlaceAction.SetCallback([](const GameAction* ga, const GameActionResult* result) {
if (result->Error == GA_ERROR::OK) if (result->Error == GA_ERROR::OK)
{ {
audio_play_sound_at_location(SoundId::PlaceItem, result->Position); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::PlaceItem, result->Position);
} }
}); });
auto res = GameActions::Execute(&wallPlaceAction); auto res = GameActions::Execute(&wallPlaceAction);
@ -1975,11 +1975,11 @@ static void window_top_toolbar_scenery_tool_down(const ScreenCoordsXY& windowPos
sceneryPlaceAction.SetCallback([=](const GameAction* ga, const GameActionResult* result) { sceneryPlaceAction.SetCallback([=](const GameAction* ga, const GameActionResult* result) {
if (result->Error == GA_ERROR::OK) if (result->Error == GA_ERROR::OK)
{ {
audio_play_sound_at_location(SoundId::PlaceItem, result->Position); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::PlaceItem, result->Position);
} }
else else
{ {
audio_play_sound_at_location(SoundId::Error, { loc.x, loc.y, gSceneryPlaceZ }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::Error, { loc.x, loc.y, gSceneryPlaceZ });
} }
}); });
auto res = GameActions::Execute(&sceneryPlaceAction); auto res = GameActions::Execute(&sceneryPlaceAction);
@ -2005,7 +2005,7 @@ static void window_top_toolbar_scenery_tool_down(const ScreenCoordsXY& windowPos
bannerPlaceAction.SetCallback([=](const GameAction* ga, const GameActionResult* result) { bannerPlaceAction.SetCallback([=](const GameAction* ga, const GameActionResult* result) {
if (result->Error == GA_ERROR::OK) if (result->Error == GA_ERROR::OK)
{ {
audio_play_sound_at_location(SoundId::PlaceItem, result->Position); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::PlaceItem, result->Position);
context_open_detail_window(WD_BANNER, bannerIndex); context_open_detail_window(WD_BANNER, bannerIndex);
} }
}); });

View File

@ -341,7 +341,7 @@ static void window_track_place_tooldown(rct_window* w, rct_widgetindex widgetInd
if (ride != nullptr) if (ride != nullptr)
{ {
window_close_by_class(WC_ERROR); window_close_by_class(WC_ERROR);
audio_play_sound_at_location(SoundId::PlaceItem, trackLoc); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::PlaceItem, trackLoc);
_currentRideIndex = result->rideIndex; _currentRideIndex = result->rideIndex;
if (track_design_are_entrance_and_exit_placed()) if (track_design_are_entrance_and_exit_placed())
@ -362,7 +362,7 @@ static void window_track_place_tooldown(rct_window* w, rct_widgetindex widgetInd
} }
else else
{ {
audio_play_sound_at_location(SoundId::Error, result->Position); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::Error, result->Position);
} }
}); });
GameActions::Execute(&tdAction); GameActions::Execute(&tdAction);
@ -370,7 +370,7 @@ static void window_track_place_tooldown(rct_window* w, rct_widgetindex widgetInd
} }
// Unable to build track // Unable to build track
audio_play_sound_at_location(SoundId::Error, trackLoc); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::Error, trackLoc);
auto windowManager = GetContext()->GetUiContext()->GetWindowManager(); auto windowManager = GetContext()->GetUiContext()->GetWindowManager();
windowManager->ShowError(res->GetErrorTitle(), res->GetErrorMessage()); windowManager->ShowError(res->GetErrorTitle(), res->GetErrorMessage());

View File

@ -222,7 +222,7 @@ static void window_track_list_close(rct_window* w)
*/ */
static void window_track_list_select(rct_window* w, int32_t listIndex) static void window_track_list_select(rct_window* w, int32_t listIndex)
{ {
audio_play_sound(SoundId::Click1, 0, w->windowPos.x + (w->width / 2)); OpenRCT2::Audio::Play(OpenRCT2::Audio::SoundId::Click1, 0, w->windowPos.x + (w->width / 2));
if (!(gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER)) if (!(gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER))
{ {
if (listIndex == 0) if (listIndex == 0)

View File

@ -445,9 +445,9 @@ namespace OpenRCT2
if (!gOpenRCT2Headless) if (!gOpenRCT2Headless)
{ {
audio_init(); Init();
audio_populate_devices(); PopulateDevices();
audio_init_ride_sounds_and_info(); InitRideSoundsAndInfo();
gGameSoundsOff = !gConfigSound.master_sound_enabled; gGameSoundsOff = !gConfigSound.master_sound_enabled;
} }

View File

@ -77,7 +77,7 @@ namespace Editor
*/ */
void Load() void Load()
{ {
audio_stop_all_music_and_sounds(); OpenRCT2::Audio::StopAll();
object_manager_unload_all_objects(); object_manager_unload_all_objects();
object_list_load(); object_list_load();
OpenRCT2::GetContext()->GetGameState()->InitAll(150); OpenRCT2::GetContext()->GetGameState()->InitAll(150);
@ -152,7 +152,7 @@ namespace Editor
*/ */
void LoadTrackDesigner() void LoadTrackDesigner()
{ {
audio_stop_all_music_and_sounds(); OpenRCT2::Audio::StopAll();
gScreenFlags = SCREEN_FLAGS_TRACK_DESIGNER; gScreenFlags = SCREEN_FLAGS_TRACK_DESIGNER;
gScreenAge = 0; gScreenAge = 0;
@ -173,7 +173,7 @@ namespace Editor
*/ */
void LoadTrackManager() void LoadTrackManager()
{ {
audio_stop_all_music_and_sounds(); OpenRCT2::Audio::StopAll();
gScreenFlags = SCREEN_FLAGS_TRACK_MANAGER; gScreenFlags = SCREEN_FLAGS_TRACK_MANAGER;
gScreenAge = 0; gScreenAge = 0;

View File

@ -301,7 +301,7 @@ void pause_toggle()
window_invalidate_by_class(WC_TOP_TOOLBAR); window_invalidate_by_class(WC_TOP_TOOLBAR);
if (gGamePaused & GAME_PAUSED_NORMAL) if (gGamePaused & GAME_PAUSED_NORMAL)
{ {
audio_stop_all_music_and_sounds(); OpenRCT2::Audio::StopAll();
} }
} }
@ -550,7 +550,7 @@ void game_load_init()
snapshots->Reset(); snapshots->Reset();
gScreenFlags = SCREEN_FLAGS_PLAYING; gScreenFlags = SCREEN_FLAGS_PLAYING;
audio_stop_all_music_and_sounds(); OpenRCT2::Audio::StopAll();
if (!gLoadKeepWindowsOpen) if (!gLoadKeepWindowsOpen)
{ {
viewport_init_all(); viewport_init_all();
@ -587,7 +587,7 @@ void game_load_init()
window_update_all(); window_update_all();
} }
audio_stop_title_music(); OpenRCT2::Audio::StopTitleMusic();
gGameSpeed = 1; gGameSpeed = 1;
} }

View File

@ -55,7 +55,8 @@ void intro_update()
_introStateCounter = -580; _introStateCounter = -580;
// Play the chain lift sound // Play the chain lift sound
_soundChannel = Mixer_Play_Effect(SoundId::LiftBM, MIXER_LOOP_INFINITE, MIXER_VOLUME_MAX, 0.5f, 1, true); _soundChannel = Mixer_Play_Effect(
OpenRCT2::Audio::SoundId::LiftBM, MIXER_LOOP_INFINITE, MIXER_VOLUME_MAX, 0.5f, 1, true);
_chainLiftFinished = false; _chainLiftFinished = false;
gIntroState = IntroState::PublisherScroll; gIntroState = IntroState::PublisherScroll;
break; break;
@ -94,7 +95,7 @@ void intro_update()
// Play the track friction sound // Play the track friction sound
_soundChannel = Mixer_Play_Effect( _soundChannel = Mixer_Play_Effect(
SoundId::TrackFrictionBM, MIXER_LOOP_INFINITE, MIXER_VOLUME_MAX, 0.25f, 0.75, true); OpenRCT2::Audio::SoundId::TrackFrictionBM, MIXER_LOOP_INFINITE, MIXER_VOLUME_MAX, 0.25f, 0.75, true);
} }
// Check if logo is off the screen...ish // Check if logo is off the screen...ish
@ -108,7 +109,8 @@ void intro_update()
} }
// Play long peep scream sound // Play long peep scream sound
_soundChannel = Mixer_Play_Effect(SoundId::Scream1, MIXER_LOOP_NONE, MIXER_VOLUME_MAX, 0.5f, 1, false); _soundChannel = Mixer_Play_Effect(
OpenRCT2::Audio::SoundId::Scream1, MIXER_LOOP_NONE, MIXER_VOLUME_MAX, 0.5f, 1, false);
gIntroState = IntroState::LogoFadeIn; gIntroState = IntroState::LogoFadeIn;
_introStateCounter = 0; _introStateCounter = 0;
@ -157,7 +159,7 @@ void intro_update()
case IntroState::Finish: case IntroState::Finish:
gIntroState = IntroState::None; gIntroState = IntroState::None;
load_palette(); load_palette();
audio_start_title_music(); OpenRCT2::Audio::PlayTitleMusic();
break; break;
default: default:
break; break;

View File

@ -86,7 +86,8 @@ private:
if (isExecuting) if (isExecuting)
{ {
audio_play_sound_at_location(SoundId::PlaceItem, { _coords.x, _coords.y, tile_element_height(_coords) }); OpenRCT2::Audio::Play3D(
OpenRCT2::Audio::SoundId::PlaceItem, { _coords.x, _coords.y, tile_element_height(_coords) });
} }
uint8_t maxHeight = map_get_highest_land_height(validRange); uint8_t maxHeight = map_get_highest_land_height(validRange);

View File

@ -87,7 +87,8 @@ private:
if (isExecuting) if (isExecuting)
{ {
audio_play_sound_at_location(SoundId::PlaceItem, { _coords.x, _coords.y, tile_element_height(_coords) }); OpenRCT2::Audio::Play3D(
OpenRCT2::Audio::SoundId::PlaceItem, { _coords.x, _coords.y, tile_element_height(_coords) });
} }
uint8_t minHeight = map_get_lowest_land_height(validRange); uint8_t minHeight = map_get_lowest_land_height(validRange);

View File

@ -126,7 +126,7 @@ private:
if (isExecuting) if (isExecuting)
{ {
map_count_remaining_land_rights(); map_count_remaining_land_rights();
audio_play_sound_at_location(SoundId::PlaceItem, centre); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::PlaceItem, centre);
} }
return res; return res;
} }

View File

@ -664,7 +664,7 @@ private:
if (isExecuting) if (isExecuting)
{ {
audio_play_sound_at_location(SoundId::PlaceItem, { _coords.x, _coords.y, centreZ }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::PlaceItem, { _coords.x, _coords.y, centreZ });
} }
res->Cost += result->Cost; res->Cost += result->Cost;
return res; return res;

View File

@ -128,7 +128,7 @@ private:
if (isExecuting && hasChanged) if (isExecuting && hasChanged)
{ {
audio_play_sound_at_location(SoundId::LayingOutWater, res->Position); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::LayingOutWater, res->Position);
} }
// Force ride construction to recheck area // Force ride construction to recheck area
_currentTrackSelectionFlags |= TRACK_SELECTION_FLAG_RECHECK; _currentTrackSelectionFlags |= TRACK_SELECTION_FLAG_RECHECK;

View File

@ -136,7 +136,7 @@ private:
if (isExecuting && hasChanged) if (isExecuting && hasChanged)
{ {
audio_play_sound_at_location(SoundId::LayingOutWater, res->Position); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::LayingOutWater, res->Position);
} }
// Force ride construction to recheck area // Force ride construction to recheck area
_currentTrackSelectionFlags |= TRACK_SELECTION_FLAG_RECHECK; _currentTrackSelectionFlags |= TRACK_SELECTION_FLAG_RECHECK;

View File

@ -30,430 +30,432 @@
#include <algorithm> #include <algorithm>
#include <vector> #include <vector>
using namespace OpenRCT2::Audio; namespace OpenRCT2::Audio
struct AudioParams
{ {
bool in_range; struct AudioParams
int32_t volume;
int32_t pan;
};
static std::vector<std::string> _audioDevices;
static int32_t _currentAudioDevice = -1;
bool gGameSoundsOff = false;
int32_t gVolumeAdjustZoom = 0;
void* gTitleMusicChannel = nullptr;
void* gWeatherSoundChannel = nullptr;
rct_ride_music gRideMusicList[AUDIO_MAX_RIDE_MUSIC];
rct_ride_music_params gRideMusicParamsList[AUDIO_MAX_RIDE_MUSIC];
rct_ride_music_params* gRideMusicParamsListEnd;
rct_vehicle_sound gVehicleSoundList[AUDIO_MAX_VEHICLE_SOUNDS];
// clang-format off
static int32_t SoundVolumeAdjust[RCT2SoundCount] =
{
0, // LiftClassic
0, // TrackFrictionClassicWood
0, // FrictionClassic
0, // Scream1
0, // Click1
0, // Click2
0, // PlaceItem
0, // Scream2
0, // Scream3
0, // Scream4
0, // Scream5
0, // Scream6
0, // LiftFrictionWheels
-400, // Purchase
0, // Crash
0, // LayingOutWater
0, // Water1
0, // Water2
0, // TrainWhistle
0, // TrainDeparting
-1000, // WaterSplash
0, // GoKartEngine
-800, // RideLaunch1
-1700, // RideLaunch2
-700, // Cough1
-700, // Cough2
-700, // Cough3
-700, // Cough4
0, // Rain
0, // Thunder1
0, // Thunder2
0, // TrackFrictionTrain
0, // TrackFrictionWater
0, // BalloonPop
-700, // MechanicFix
0, // Scream7
-2500, // ToiletFlush original value: -1000
0, // Click3
0, // Quack
0, // NewsItem
0, // WindowOpen
-900, // Laugh1
-900, // Laugh2
-900, // Laugh3
0, // Applause
-600, // HauntedHouseScare
-700, // HauntedHouseScream1
-700, // HauntedHouseScream2
-2550, // BlockBrakeClose
-2900, // BlockBrakeRelease
0, // Error
-3400, // BrakeRelease
0, // LiftArrow
0, // LiftWood
0, // TrackFrictionWood
0, // LiftWildMouse
0, // LiftBM
0, // TrackFrictionBM
0, // Scream8
0, // Tram
-2000, // DoorOpen
-2700, // DoorClose
-700 // Portcullis
};
// clang-format on
static AudioParams audio_get_params_from_location(SoundId soundId, const CoordsXYZ& location);
bool audio_is_available()
{
if (_currentAudioDevice == -1)
return false;
if (gGameSoundsOff)
return false;
if (!gConfigSound.sound_enabled)
return false;
if (gOpenRCT2Headless)
return false;
return true;
}
void audio_init()
{
if (str_is_null_or_empty(gConfigSound.device))
{ {
Mixer_Init(nullptr); bool in_range;
_currentAudioDevice = 0; int32_t volume;
int32_t pan;
};
static std::vector<std::string> _audioDevices;
static int32_t _currentAudioDevice = -1;
bool gGameSoundsOff = false;
int32_t gVolumeAdjustZoom = 0;
void* gTitleMusicChannel = nullptr;
void* gWeatherSoundChannel = nullptr;
RideMusic gRideMusicList[AUDIO_MAX_RIDE_MUSIC];
RideMusicParams gRideMusicParamsList[AUDIO_MAX_RIDE_MUSIC];
RideMusicParams* gRideMusicParamsListEnd;
VehicleSound gVehicleSoundList[AUDIO_MAX_VEHICLE_SOUNDS];
// clang-format off
static int32_t SoundVolumeAdjust[RCT2SoundCount] =
{
0, // LiftClassic
0, // TrackFrictionClassicWood
0, // FrictionClassic
0, // Scream1
0, // Click1
0, // Click2
0, // PlaceItem
0, // Scream2
0, // Scream3
0, // Scream4
0, // Scream5
0, // Scream6
0, // LiftFrictionWheels
-400, // Purchase
0, // Crash
0, // LayingOutWater
0, // Water1
0, // Water2
0, // TrainWhistle
0, // TrainDeparting
-1000, // WaterSplash
0, // GoKartEngine
-800, // RideLaunch1
-1700, // RideLaunch2
-700, // Cough1
-700, // Cough2
-700, // Cough3
-700, // Cough4
0, // Rain
0, // Thunder1
0, // Thunder2
0, // TrackFrictionTrain
0, // TrackFrictionWater
0, // BalloonPop
-700, // MechanicFix
0, // Scream7
-2500, // ToiletFlush original value: -1000
0, // Click3
0, // Quack
0, // NewsItem
0, // WindowOpen
-900, // Laugh1
-900, // Laugh2
-900, // Laugh3
0, // Applause
-600, // HauntedHouseScare
-700, // HauntedHouseScream1
-700, // HauntedHouseScream2
-2550, // BlockBrakeClose
-2900, // BlockBrakeRelease
0, // Error
-3400, // BrakeRelease
0, // LiftArrow
0, // LiftWood
0, // TrackFrictionWood
0, // LiftWildMouse
0, // LiftBM
0, // TrackFrictionBM
0, // Scream8
0, // Tram
-2000, // DoorOpen
-2700, // DoorClose
-700 // Portcullis
};
// clang-format on
static AudioParams audio_get_params_from_location(SoundId soundId, const CoordsXYZ& location);
bool IsAvailable()
{
if (_currentAudioDevice == -1)
return false;
if (gGameSoundsOff)
return false;
if (!gConfigSound.sound_enabled)
return false;
if (gOpenRCT2Headless)
return false;
return true;
} }
else
{
Mixer_Init(gConfigSound.device);
audio_populate_devices(); void Init()
for (int32_t i = 0; i < audio_get_device_count(); i++) {
if (str_is_null_or_empty(gConfigSound.device))
{ {
if (_audioDevices[i] == gConfigSound.device) Mixer_Init(nullptr);
_currentAudioDevice = 0;
}
else
{
Mixer_Init(gConfigSound.device);
PopulateDevices();
for (int32_t i = 0; i < GetDeviceCount(); i++)
{ {
_currentAudioDevice = i; if (_audioDevices[i] == gConfigSound.device)
{
_currentAudioDevice = i;
}
} }
} }
} }
}
void audio_populate_devices() void PopulateDevices()
{
auto audioContext = OpenRCT2::GetContext()->GetAudioContext();
std::vector<std::string> devices = audioContext->GetOutputDevices();
// Replace blanks with localised unknown string
for (auto& device : devices)
{ {
if (device.empty()) auto audioContext = OpenRCT2::GetContext()->GetAudioContext();
std::vector<std::string> devices = audioContext->GetOutputDevices();
// Replace blanks with localised unknown string
for (auto& device : devices)
{ {
device = language_get_string(STR_OPTIONS_SOUND_VALUE_DEFAULT); if (device.empty())
{
device = language_get_string(STR_OPTIONS_SOUND_VALUE_DEFAULT);
}
} }
}
#ifndef __linux__ #ifndef __linux__
// The first device is always system default on Windows and macOS // The first device is always system default on Windows and macOS
std::string defaultDevice = language_get_string(STR_OPTIONS_SOUND_VALUE_DEFAULT); std::string defaultDevice = language_get_string(STR_OPTIONS_SOUND_VALUE_DEFAULT);
devices.insert(devices.begin(), defaultDevice); devices.insert(devices.begin(), defaultDevice);
#endif #endif
_audioDevices = devices; _audioDevices = devices;
}
void audio_play_sound_at_location(SoundId soundId, const CoordsXYZ& loc)
{
if (!audio_is_available())
return;
AudioParams params = audio_get_params_from_location(soundId, loc);
if (params.in_range)
{
audio_play_sound(soundId, params.volume, params.pan);
}
}
/**
* Returns the audio parameters to use when playing the specified sound at a virtual location.
* @param soundId The sound effect to be played.
* @param location The location at which the sound effect is to be played.
* @return The audio parameters to be used when playing this sound effect.
*/
static AudioParams audio_get_params_from_location(SoundId soundId, const CoordsXYZ& location)
{
int32_t volumeDown = 0;
AudioParams params;
params.in_range = true;
params.volume = 0;
params.pan = 0;
auto element = map_get_surface_element_at(location);
if (element && (element->GetBaseZ()) - 5 > location.z)
{
volumeDown = 10;
} }
uint8_t rotation = get_current_rotation(); void Play3D(SoundId soundId, const CoordsXYZ& loc)
auto pos2 = translate_3d_to_2d_with_z(rotation, location);
rct_viewport* viewport = nullptr;
while ((viewport = window_get_previous_viewport(viewport)) != nullptr)
{ {
if (viewport->flags & VIEWPORT_FLAG_SOUND_ON) if (!IsAvailable())
{
int16_t vx = pos2.x - viewport->viewPos.x;
int16_t vy = pos2.y - viewport->viewPos.y;
params.pan = viewport->pos.x + (vx / viewport->zoom);
params.volume = SoundVolumeAdjust[static_cast<uint8_t>(soundId)]
+ ((-1024 * viewport->zoom - 1) * (1 << volumeDown)) + 1;
if (vy < 0 || vy >= viewport->view_height || vx < 0 || vx >= viewport->view_width || params.volume < -10000)
{
params.in_range = false;
return params;
}
}
}
return params;
}
void audio_play_sound(SoundId soundId, int32_t volume, int32_t pan)
{
if (gGameSoundsOff)
return;
int32_t mixerPan = 0;
if (pan != AUDIO_PLAY_AT_CENTRE)
{
int32_t x2 = pan << 16;
uint16_t screenWidth = std::max<int32_t>(64, OpenRCT2::GetContext()->GetUiContext()->GetWidth());
mixerPan = ((x2 / screenWidth) - 0x8000) >> 4;
}
Mixer_Play_Effect(soundId, MIXER_LOOP_NONE, DStoMixerVolume(volume), DStoMixerPan(mixerPan), 1, 1);
}
void audio_start_title_music()
{
if (gGameSoundsOff || !(gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) || gIntroState != IntroState::None)
{
audio_stop_title_music();
return;
}
if (gTitleMusicChannel != nullptr)
{
return;
}
int32_t pathId;
switch (gConfigSound.title_music)
{
case 1:
pathId = PATH_ID_CSS50;
break;
case 2:
pathId = PATH_ID_CSS17;
break;
case 3:
pathId = (util_rand() & 1) ? PATH_ID_CSS50 : PATH_ID_CSS17;
break;
default:
return; return;
}
gTitleMusicChannel = Mixer_Play_Music(pathId, MIXER_LOOP_INFINITE, true); AudioParams params = audio_get_params_from_location(soundId, loc);
if (gTitleMusicChannel != nullptr) if (params.in_range)
{
Mixer_Channel_SetGroup(gTitleMusicChannel, OpenRCT2::Audio::MixerGroup::TitleMusic);
}
}
void audio_stop_ride_music()
{
for (auto& rideMusic : gRideMusicList)
{
if (rideMusic.ride_id != RIDE_ID_NULL)
{ {
rideMusic.ride_id = RIDE_ID_NULL; Play(soundId, params.volume, params.pan);
if (rideMusic.sound_channel != nullptr) }
}
/**
* Returns the audio parameters to use when playing the specified sound at a virtual location.
* @param soundId The sound effect to be played.
* @param location The location at which the sound effect is to be played.
* @return The audio parameters to be used when playing this sound effect.
*/
static AudioParams audio_get_params_from_location(SoundId soundId, const CoordsXYZ& location)
{
int32_t volumeDown = 0;
AudioParams params;
params.in_range = true;
params.volume = 0;
params.pan = 0;
auto element = map_get_surface_element_at(location);
if (element && (element->GetBaseZ()) - 5 > location.z)
{
volumeDown = 10;
}
uint8_t rotation = get_current_rotation();
auto pos2 = translate_3d_to_2d_with_z(rotation, location);
rct_viewport* viewport = nullptr;
while ((viewport = window_get_previous_viewport(viewport)) != nullptr)
{
if (viewport->flags & VIEWPORT_FLAG_SOUND_ON)
{ {
Mixer_Stop_Channel(rideMusic.sound_channel); int16_t vx = pos2.x - viewport->viewPos.x;
int16_t vy = pos2.y - viewport->viewPos.y;
params.pan = viewport->pos.x + (vx / viewport->zoom);
params.volume = SoundVolumeAdjust[static_cast<uint8_t>(soundId)]
+ ((-1024 * viewport->zoom - 1) * (1 << volumeDown)) + 1;
if (vy < 0 || vy >= viewport->view_height || vx < 0 || vx >= viewport->view_width || params.volume < -10000)
{
params.in_range = false;
return params;
}
}
}
return params;
}
void Play(SoundId soundId, int32_t volume, int32_t pan)
{
if (gGameSoundsOff)
return;
int32_t mixerPan = 0;
if (pan != AUDIO_PLAY_AT_CENTRE)
{
int32_t x2 = pan << 16;
uint16_t screenWidth = std::max<int32_t>(64, OpenRCT2::GetContext()->GetUiContext()->GetWidth());
mixerPan = ((x2 / screenWidth) - 0x8000) >> 4;
}
Mixer_Play_Effect(soundId, MIXER_LOOP_NONE, DStoMixerVolume(volume), DStoMixerPan(mixerPan), 1, 1);
}
void PlayTitleMusic()
{
if (gGameSoundsOff || !(gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) || gIntroState != IntroState::None)
{
StopTitleMusic();
return;
}
if (gTitleMusicChannel != nullptr)
{
return;
}
int32_t pathId;
switch (gConfigSound.title_music)
{
case 1:
pathId = PATH_ID_CSS50;
break;
case 2:
pathId = PATH_ID_CSS17;
break;
case 3:
pathId = (util_rand() & 1) ? PATH_ID_CSS50 : PATH_ID_CSS17;
break;
default:
return;
}
gTitleMusicChannel = Mixer_Play_Music(pathId, MIXER_LOOP_INFINITE, true);
if (gTitleMusicChannel != nullptr)
{
Mixer_Channel_SetGroup(gTitleMusicChannel, OpenRCT2::Audio::MixerGroup::TitleMusic);
}
}
void StopRideMusic()
{
for (auto& rideMusic : gRideMusicList)
{
if (rideMusic.ride_id != RIDE_ID_NULL)
{
rideMusic.ride_id = RIDE_ID_NULL;
if (rideMusic.sound_channel != nullptr)
{
Mixer_Stop_Channel(rideMusic.sound_channel);
}
} }
} }
} }
}
void audio_stop_all_music_and_sounds() void StopAll()
{
audio_stop_title_music();
audio_stop_vehicle_sounds();
audio_stop_ride_music();
peep_stop_crowd_noise();
audio_stop_weather_sound();
}
int32_t audio_get_device_count()
{
return static_cast<int32_t>(_audioDevices.size());
}
const std::string& audio_get_device_name(int32_t index)
{
Guard::Assert(index >= 0 && index < audio_get_device_count());
return _audioDevices[index];
}
int32_t audio_get_device_index()
{
return _currentAudioDevice;
}
void audio_stop_title_music()
{
if (gTitleMusicChannel != nullptr)
{ {
Mixer_Stop_Channel(gTitleMusicChannel); StopTitleMusic();
gTitleMusicChannel = nullptr; StopVehicleSounds();
StopRideMusic();
peep_stop_crowd_noise();
StopWeatherSound();
} }
}
void audio_stop_weather_sound() int32_t GetDeviceCount()
{
if (gWeatherSoundChannel != nullptr)
{ {
Mixer_Stop_Channel(gWeatherSoundChannel); return static_cast<int32_t>(_audioDevices.size());
gWeatherSoundChannel = nullptr;
} }
}
void audio_init_ride_sounds_and_info() const std::string& GetDeviceName(int32_t index)
{
int32_t deviceNum = 0;
audio_init_ride_sounds(deviceNum);
for (auto& rideMusicInfo : gRideMusicInfoList)
{ {
const utf8* path = context_get_path_legacy(rideMusicInfo.path_id); Guard::Assert(index >= 0 && index < GetDeviceCount());
if (File::Exists(path)) return _audioDevices[index];
}
int32_t GetCurrentDeviceIndex()
{
return _currentAudioDevice;
}
void StopTitleMusic()
{
if (gTitleMusicChannel != nullptr)
{ {
try Mixer_Stop_Channel(gTitleMusicChannel);
gTitleMusicChannel = nullptr;
}
}
void StopWeatherSound()
{
if (gWeatherSoundChannel != nullptr)
{
Mixer_Stop_Channel(gWeatherSoundChannel);
gWeatherSoundChannel = nullptr;
}
}
void InitRideSoundsAndInfo()
{
int32_t deviceNum = 0;
InitRideSounds(deviceNum);
for (auto& rideMusicInfo : gRideMusicInfoList)
{
const utf8* path = context_get_path_legacy(rideMusicInfo.path_id);
if (File::Exists(path))
{ {
auto fs = OpenRCT2::FileStream(path, OpenRCT2::FILE_MODE_OPEN); try
uint32_t head = fs.ReadValue<uint32_t>();
if (head == 0x78787878)
{ {
rideMusicInfo.length = 0; auto fs = OpenRCT2::FileStream(path, OpenRCT2::FILE_MODE_OPEN);
uint32_t head = fs.ReadValue<uint32_t>();
if (head == 0x78787878)
{
rideMusicInfo.length = 0;
}
// The length used to be hardcoded, but we stopped doing that to allow replacement.
if (rideMusicInfo.length == 0)
{
rideMusicInfo.length = fs.GetLength();
}
} }
// The length used to be hardcoded, but we stopped doing that to allow replacement. catch (const std::exception&)
if (rideMusicInfo.length == 0)
{ {
rideMusicInfo.length = fs.GetLength();
} }
} }
catch (const std::exception&)
{
}
} }
} }
}
void audio_init_ride_sounds(int32_t device) void InitRideSounds(int32_t device)
{
audio_close();
for (auto& vehicleSound : gVehicleSoundList)
{ {
vehicleSound.id = SOUND_ID_NULL; Close();
} for (auto& vehicleSound : gVehicleSoundList)
_currentAudioDevice = device;
config_save_default();
for (auto& rideMusic : gRideMusicList)
{
rideMusic.ride_id = RIDE_ID_NULL;
}
}
void audio_close()
{
peep_stop_crowd_noise();
audio_stop_title_music();
audio_stop_ride_music();
audio_stop_weather_sound();
_currentAudioDevice = -1;
}
void audio_toggle_all_sounds()
{
gConfigSound.master_sound_enabled = !gConfigSound.master_sound_enabled;
if (gConfigSound.master_sound_enabled)
{
audio_unpause_sounds();
}
else
{
audio_stop_title_music();
audio_pause_sounds();
}
window_invalidate_by_class(WC_OPTIONS);
}
void audio_pause_sounds()
{
gGameSoundsOff = true;
audio_stop_vehicle_sounds();
audio_stop_ride_music();
peep_stop_crowd_noise();
audio_stop_weather_sound();
}
void audio_unpause_sounds()
{
gGameSoundsOff = false;
}
void audio_stop_vehicle_sounds()
{
if (!audio_is_available())
return;
for (auto& vehicleSound : gVehicleSoundList)
{
if (vehicleSound.id != SOUND_ID_NULL)
{ {
vehicleSound.id = SOUND_ID_NULL; vehicleSound.id = SOUND_ID_NULL;
if (vehicleSound.TrackSound.Id != SoundId::Null) }
_currentAudioDevice = device;
config_save_default();
for (auto& rideMusic : gRideMusicList)
{
rideMusic.ride_id = RIDE_ID_NULL;
}
}
void Close()
{
peep_stop_crowd_noise();
StopTitleMusic();
StopRideMusic();
StopWeatherSound();
_currentAudioDevice = -1;
}
void ToggleAllSounds()
{
gConfigSound.master_sound_enabled = !gConfigSound.master_sound_enabled;
if (gConfigSound.master_sound_enabled)
{
Resume();
}
else
{
StopTitleMusic();
Pause();
}
window_invalidate_by_class(WC_OPTIONS);
}
void Pause()
{
gGameSoundsOff = true;
StopVehicleSounds();
StopRideMusic();
peep_stop_crowd_noise();
StopWeatherSound();
}
void Resume()
{
gGameSoundsOff = false;
}
void StopVehicleSounds()
{
if (!IsAvailable())
return;
for (auto& vehicleSound : gVehicleSoundList)
{
if (vehicleSound.id != SOUND_ID_NULL)
{ {
Mixer_Stop_Channel(vehicleSound.TrackSound.Channel); vehicleSound.id = SOUND_ID_NULL;
} if (vehicleSound.TrackSound.Id != SoundId::Null)
if (vehicleSound.OtherSound.Id != SoundId::Null) {
{ Mixer_Stop_Channel(vehicleSound.TrackSound.Channel);
Mixer_Stop_Channel(vehicleSound.OtherSound.Channel); }
if (vehicleSound.OtherSound.Id != SoundId::Null)
{
Mixer_Stop_Channel(vehicleSound.OtherSound.Channel);
}
} }
} }
} }
}
} // namespace OpenRCT2::Audio

View File

@ -15,10 +15,10 @@
#define MIXER_LOOP_NONE 0 #define MIXER_LOOP_NONE 0
#define MIXER_LOOP_INFINITE (-1) #define MIXER_LOOP_INFINITE (-1)
enum class SoundId : uint8_t;
namespace OpenRCT2::Audio namespace OpenRCT2::Audio
{ {
enum class SoundId : uint8_t;
enum class MixerGroup : int32_t enum class MixerGroup : int32_t
{ {
Sound, Sound,
@ -58,7 +58,8 @@ namespace OpenRCT2::Audio
#endif #endif
void Mixer_Init(const char* device); void Mixer_Init(const char* device);
void* Mixer_Play_Effect(SoundId id, int32_t loop, int32_t volume, float pan, double rate, int32_t deleteondone); void* Mixer_Play_Effect(
OpenRCT2::Audio::SoundId id, int32_t loop, int32_t volume, float pan, double rate, int32_t deleteondone);
void Mixer_Stop_Channel(void* channel); void Mixer_Stop_Channel(void* channel);
void Mixer_Channel_Volume(void* channel, int32_t volume); void Mixer_Channel_Volume(void* channel, int32_t volume);
void Mixer_Channel_Pan(void* channel, float pan); void Mixer_Channel_Pan(void* channel, float pan);

View File

@ -12,6 +12,10 @@
#include "../common.h" #include "../common.h"
#include "../ride/RideTypes.h" #include "../ride/RideTypes.h"
struct CoordsXYZ;
namespace OpenRCT2::Audio
{
#define AUDIO_DEVICE_NAME_SIZE 256 #define AUDIO_DEVICE_NAME_SIZE 256
#define AUDIO_MAX_RIDE_MUSIC 32 #define AUDIO_MAX_RIDE_MUSIC 32
#define AUDIO_MAX_VEHICLE_SOUNDS 14 #define AUDIO_MAX_VEHICLE_SOUNDS 14
@ -20,240 +24,259 @@
#define AUDIO_PLAY_AT_LOCATION 0x8001 #define AUDIO_PLAY_AT_LOCATION 0x8001
#define SOUND_ID_NULL 0xFFFF #define SOUND_ID_NULL 0xFFFF
enum class SoundId : uint8_t; enum class SoundId : uint8_t;
struct CoordsXYZ;
struct rct_ride_music struct RideMusic
{ {
ride_id_t ride_id; ride_id_t ride_id;
uint8_t tune_id; uint8_t tune_id;
int16_t volume; int16_t volume;
int16_t pan; int16_t pan;
uint16_t frequency; uint16_t frequency;
void* sound_channel; void* sound_channel;
}; };
struct rct_ride_music_info struct RideMusicInfo
{ {
uint8_t path_id; uint8_t path_id;
uint32_t offset; uint32_t offset;
uint32_t length; uint32_t length;
}; };
struct rct_ride_music_params struct RideMusicParams
{ {
ride_id_t ride_id; ride_id_t ride_id;
uint8_t tune_id; uint8_t tune_id;
int32_t offset; int32_t offset;
int16_t volume; int16_t volume;
int16_t pan; int16_t pan;
uint16_t frequency; uint16_t frequency;
}; };
struct Sound struct Sound
{ {
SoundId Id; SoundId Id;
int16_t Volume; int16_t Volume;
int16_t Pan; int16_t Pan;
uint16_t Frequency; uint16_t Frequency;
void* Channel; void* Channel;
}; };
struct rct_vehicle_sound struct VehicleSound
{ {
uint16_t id; uint16_t id;
int16_t volume; int16_t volume;
Sound TrackSound; Sound TrackSound;
Sound OtherSound; Sound OtherSound;
}; };
struct rct_vehicle_sound_params struct VehicleSoundParams
{ {
uint16_t id; uint16_t id;
int16_t pan_x; int16_t pan_x;
int16_t pan_y; int16_t pan_y;
uint16_t frequency; uint16_t frequency;
int16_t volume; int16_t volume;
uint16_t priority; uint16_t priority;
}; };
enum class SoundId : uint8_t enum class SoundId : uint8_t
{ {
LiftClassic, LiftClassic,
TrackFrictionClassicWood, TrackFrictionClassicWood,
FrictionClassic, FrictionClassic,
Scream1, Scream1,
Click1, Click1,
Click2, Click2,
PlaceItem, PlaceItem,
Scream2, Scream2,
Scream3, Scream3,
Scream4, Scream4,
Scream5, Scream5,
Scream6, Scream6,
LiftFrictionWheels, LiftFrictionWheels,
Purchase, Purchase,
Crash, Crash,
LayingOutWater, LayingOutWater,
Water1, Water1,
Water2, Water2,
TrainWhistle, TrainWhistle,
TrainDeparting, TrainDeparting,
WaterSplash, WaterSplash,
GoKartEngine, GoKartEngine,
RideLaunch1, RideLaunch1,
RideLaunch2, RideLaunch2,
Cough1, Cough1,
Cough2, Cough2,
Cough3, Cough3,
Cough4, Cough4,
Rain, Rain,
Thunder1, Thunder1,
Thunder2, Thunder2,
TrackFrictionTrain, TrackFrictionTrain,
TrackFrictionWater, TrackFrictionWater,
BalloonPop, BalloonPop,
MechanicFix, MechanicFix,
Scream7, Scream7,
ToiletFlush, ToiletFlush,
Click3, Click3,
Quack, Quack,
NewsItem, NewsItem,
WindowOpen, WindowOpen,
Laugh1, Laugh1,
Laugh2, Laugh2,
Laugh3, Laugh3,
Applause, Applause,
HauntedHouseScare, HauntedHouseScare,
HauntedHouseScream1, HauntedHouseScream1,
HauntedHouseScream2, HauntedHouseScream2,
BlockBrakeClose, BlockBrakeClose,
BlockBrakeRelease, BlockBrakeRelease,
Error, Error,
BrakeRelease, BrakeRelease,
LiftArrow, LiftArrow,
LiftWood, LiftWood,
TrackFrictionWood, TrackFrictionWood,
LiftWildMouse, LiftWildMouse,
LiftBM, LiftBM,
TrackFrictionBM, TrackFrictionBM,
Scream8, Scream8,
Tram, Tram,
DoorOpen, DoorOpen,
DoorClose, DoorClose,
Portcullis, Portcullis,
NoScream = 254, NoScream = 254,
Null = 255 Null = 255
}; };
constexpr uint8_t RCT2SoundCount = static_cast<uint32_t>(SoundId::Portcullis) + 1; constexpr uint8_t RCT2SoundCount = static_cast<uint32_t>(SoundId::Portcullis) + 1;
extern bool gGameSoundsOff; extern bool gGameSoundsOff;
extern int32_t gVolumeAdjustZoom; extern int32_t gVolumeAdjustZoom;
extern void* gTitleMusicChannel; extern void* gTitleMusicChannel;
extern void* gWeatherSoundChannel; extern void* gWeatherSoundChannel;
extern rct_ride_music gRideMusicList[AUDIO_MAX_RIDE_MUSIC]; extern RideMusic gRideMusicList[AUDIO_MAX_RIDE_MUSIC];
extern rct_ride_music_info gRideMusicInfoList[NUM_DEFAULT_MUSIC_TRACKS]; extern RideMusicInfo gRideMusicInfoList[NUM_DEFAULT_MUSIC_TRACKS];
extern rct_ride_music_params gRideMusicParamsList[AUDIO_MAX_RIDE_MUSIC]; extern RideMusicParams gRideMusicParamsList[AUDIO_MAX_RIDE_MUSIC];
extern rct_ride_music_params* gRideMusicParamsListEnd; extern RideMusicParams* gRideMusicParamsListEnd;
extern rct_vehicle_sound gVehicleSoundList[AUDIO_MAX_VEHICLE_SOUNDS]; extern VehicleSound gVehicleSoundList[AUDIO_MAX_VEHICLE_SOUNDS];
/** /**
* Returns false when no audio device is available or when audio is turned off, otherwise true. * Returns false when no audio device is available or when audio is turned off, otherwise true.
*/ */
bool audio_is_available(); bool IsAvailable();
/*
* Returns the amount of available audio devices.
*/
int32_t audio_get_device_count();
/**
* Returns the device name by index.
*/
const std::string& audio_get_device_name(int32_t index);
/**
* Returns the currently used device index, -1 if not available.
*/
int32_t audio_get_device_index();
/**
* Deregisters the audio device.
* rct2: 0x006BAB21
*/
void audio_close();
/**
* Initialises the audio subsystem.
*/
void audio_init();
/**
* Loads the ride sounds and info.
* rct2: 0x006BA8E0
*/
void audio_init_ride_sounds_and_info();
/**
* Loads the ride sounds.
* rct2: 0x006BA9B5
*/
void audio_init_ride_sounds(int32_t device);
/**
* Temporarily stops playing sounds until audio_unpause_sounds() is called.
* rct2: 0x006BABB4
*/
void audio_pause_sounds();
/**
* Plays the specified sound.
* @param soundId The sound effect to play.
* @param volume The volume at which the sound effect should be played.
* @param pan The pan at which the sound effect should be played. If set to anything other than AUDIO_PLAY_AT_CENTRE, plays the
* sound at a position relative to the centre of the viewport.
*/
void audio_play_sound(SoundId soundId, int32_t volume, int32_t pan);
/**
* Plays the specified sound at a virtual location.
* @param soundId The sound effect to play.
* @param x The x coordinate of the location.
* @param y The y coordinate of the location.
* @param z The z coordinate of the location.
*/
void audio_play_sound_at_location(SoundId soundId, const CoordsXYZ& loc);
/**
* Populates the gAudioDevices array with the available audio devices.
*/
void audio_populate_devices();
/**
* Starts playing the title music.
* rct2: 0x006BD0F8
*/
void audio_start_title_music();
/**
* Stops the weather sound effect from playing.
*/
void audio_stop_weather_sound();
/**
* Stops ride music from playing.
* rct2: 0x006BCA9F
*/
void audio_stop_ride_music();
/**
* Stops the title music from playing.
* rct2: 0x006BD0BD
*/
void audio_stop_title_music();
/**
* Stops vehicle sounds from playing.
* rct2: 0x006BABDF
*/
void audio_stop_vehicle_sounds();
/**
* Toggles whether all sounds should be played.
* rct2: 0x006BAB8A
*/
void audio_toggle_all_sounds();
/**
* Resumes playing sounds that had been paused by a call to audio_pause_sounds().
* rct2: 0x006BABD8
*/
void audio_unpause_sounds();
void audio_stop_all_music_and_sounds(); /*
* Returns the amount of available audio devices.
*/
int32_t GetDeviceCount();
/**
* Returns the device name by index.
*/
const std::string& GetDeviceName(int32_t index);
/**
* Returns the currently used device index, -1 if not available.
*/
int32_t GetCurrentDeviceIndex();
/**
* Deregisters the audio device.
* rct2: 0x006BAB21
*/
void Close();
/**
* Initialises the audio subsystem.
*/
void Init();
/**
* Loads the ride sounds and info.
* rct2: 0x006BA8E0
*/
void InitRideSoundsAndInfo();
/**
* Loads the ride sounds.
* rct2: 0x006BA9B5
*/
void InitRideSounds(int32_t device);
/**
* Temporarily stops playing sounds until audio_unpause_sounds() is called.
* rct2: 0x006BABB4
*/
void Pause();
/**
* Plays the specified sound.
* @param soundId The sound effect to play.
* @param volume The volume at which the sound effect should be played.
* @param pan The pan at which the sound effect should be played. If set to anything other than AUDIO_PLAY_AT_CENTRE, plays
* the sound at a position relative to the centre of the viewport.
*/
void Play(SoundId soundId, int32_t volume, int32_t pan);
/**
* Plays the specified sound at a virtual location.
* @param soundId The sound effect to play.
* @param x The x coordinate of the location.
* @param y The y coordinate of the location.
* @param z The z coordinate of the location.
*/
void Play3D(SoundId soundId, const CoordsXYZ& loc);
/**
* Populates the gAudioDevices array with the available audio devices.
*/
void PopulateDevices();
/**
* Starts playing the title music.
* rct2: 0x006BD0F8
*/
void PlayTitleMusic();
/**
* Stops the weather sound effect from playing.
*/
void StopWeatherSound();
/**
* Stops ride music from playing.
* rct2: 0x006BCA9F
*/
void StopRideMusic();
/**
* Stops the title music from playing.
* rct2: 0x006BD0BD
*/
void StopTitleMusic();
/**
* Stops vehicle sounds from playing.
* rct2: 0x006BABDF
*/
void StopVehicleSounds();
/**
* Toggles whether all sounds should be played.
* rct2: 0x006BAB8A
*/
void ToggleAllSounds();
/**
* Resumes playing sounds that had been paused by a call to audio_pause_sounds().
* rct2: 0x006BABD8
*/
void Resume();
void StopAll();
} // namespace OpenRCT2::Audio

View File

@ -245,7 +245,7 @@ void chat_history_add(const char* src)
free(buffer); free(buffer);
Mixer_Play_Effect(SoundId::NewsItem, 0, MIXER_VOLUME_MAX, 0.5f, 1.5f, true); Mixer_Play_Effect(OpenRCT2::Audio::SoundId::NewsItem, 0, MIXER_VOLUME_MAX, 0.5f, 1.5f, true);
} }
void chat_input(CHAT_INPUT input) void chat_input(CHAT_INPUT input)

View File

@ -80,7 +80,7 @@ void screenshot_check()
if (!screenshotPath.empty()) if (!screenshotPath.empty())
{ {
audio_play_sound(SoundId::WindowOpen, 100, context_get_width() / 2); OpenRCT2::Audio::Play(OpenRCT2::Audio::SoundId::WindowOpen, 100, context_get_width() / 2);
} }
else else
{ {

View File

@ -1716,7 +1716,7 @@ void window_close_construction_windows()
*/ */
void window_update_viewport_ride_music() void window_update_viewport_ride_music()
{ {
gRideMusicParamsListEnd = &gRideMusicParamsList[0]; OpenRCT2::Audio::gRideMusicParamsListEnd = &OpenRCT2::Audio::gRideMusicParamsList[0];
g_music_tracking_viewport = nullptr; g_music_tracking_viewport = nullptr;
for (auto it = g_window_list.rbegin(); it != g_window_list.rend(); it++) for (auto it = g_window_list.rbegin(); it != g_window_list.rend(); it++)
@ -1730,11 +1730,11 @@ void window_update_viewport_ride_music()
gWindowAudioExclusive = w; gWindowAudioExclusive = w;
if (viewport->zoom <= 0) if (viewport->zoom <= 0)
gVolumeAdjustZoom = 0; OpenRCT2::Audio::gVolumeAdjustZoom = 0;
else if (viewport->zoom == 1) else if (viewport->zoom == 1)
gVolumeAdjustZoom = 30; OpenRCT2::Audio::gVolumeAdjustZoom = 30;
else else
gVolumeAdjustZoom = 60; OpenRCT2::Audio::gVolumeAdjustZoom = 60;
break; break;
} }
} }

View File

@ -128,7 +128,7 @@ static void TickCurrent()
if (ticks == 1 && (gScreenFlags == SCREEN_FLAGS_PLAYING)) if (ticks == 1 && (gScreenFlags == SCREEN_FLAGS_PLAYING))
{ {
// Play sound // Play sound
audio_play_sound(SoundId::NewsItem, 0, context_get_width() / 2); OpenRCT2::Audio::Play(OpenRCT2::Audio::SoundId::NewsItem, 0, context_get_width() / 2);
} }
} }

View File

@ -439,7 +439,7 @@ void RideObject::ReadLegacyVehicle(
vehicle->no_seating_rows = stream->ReadValue<uint8_t>(); vehicle->no_seating_rows = stream->ReadValue<uint8_t>();
vehicle->spinning_inertia = stream->ReadValue<uint8_t>(); vehicle->spinning_inertia = stream->ReadValue<uint8_t>();
vehicle->spinning_friction = stream->ReadValue<uint8_t>(); vehicle->spinning_friction = stream->ReadValue<uint8_t>();
vehicle->friction_sound_id = stream->ReadValue<SoundId>(); vehicle->friction_sound_id = stream->ReadValue<OpenRCT2::Audio::SoundId>();
vehicle->log_flume_reverser_vehicle_type = stream->ReadValue<uint8_t>(); vehicle->log_flume_reverser_vehicle_type = stream->ReadValue<uint8_t>();
vehicle->sound_range = stream->ReadValue<uint8_t>(); vehicle->sound_range = stream->ReadValue<uint8_t>();
vehicle->double_sound_frequency = stream->ReadValue<uint8_t>(); vehicle->double_sound_frequency = stream->ReadValue<uint8_t>();
@ -574,7 +574,7 @@ void RideObject::ReadJson(IReadObjectContext* context, json_t& root)
car.sprite_height_positive = 1; car.sprite_height_positive = 1;
car.flags = VEHICLE_ENTRY_FLAG_SPINNING; car.flags = VEHICLE_ENTRY_FLAG_SPINNING;
car.car_visual = VEHICLE_VISUAL_FLAT_RIDE_OR_CAR_RIDE; car.car_visual = VEHICLE_VISUAL_FLAT_RIDE_OR_CAR_RIDE;
car.friction_sound_id = SoundId::Null; car.friction_sound_id = OpenRCT2::Audio::SoundId::Null;
car.sound_range = 0xFF; car.sound_range = 0xFF;
car.draw_order = 6; car.draw_order = 6;
@ -733,7 +733,7 @@ rct_ride_entry_vehicle RideObject::ReadJsonCar(json_t& jCar)
car.no_seating_rows = Json::GetNumber<uint8_t>(jCar["numSeatRows"]); car.no_seating_rows = Json::GetNumber<uint8_t>(jCar["numSeatRows"]);
car.spinning_inertia = Json::GetNumber<uint8_t>(jCar["spinningInertia"]); car.spinning_inertia = Json::GetNumber<uint8_t>(jCar["spinningInertia"]);
car.spinning_friction = Json::GetNumber<uint8_t>(jCar["spinningFriction"]); car.spinning_friction = Json::GetNumber<uint8_t>(jCar["spinningFriction"]);
car.friction_sound_id = Json::GetEnum<SoundId>(jCar["frictionSoundId"], SoundId::Null); car.friction_sound_id = Json::GetEnum<OpenRCT2::Audio::SoundId>(jCar["frictionSoundId"], OpenRCT2::Audio::SoundId::Null);
car.log_flume_reverser_vehicle_type = Json::GetNumber<uint8_t>(jCar["logFlumeReverserVehicleType"]); car.log_flume_reverser_vehicle_type = Json::GetNumber<uint8_t>(jCar["logFlumeReverserVehicleType"]);
car.sound_range = Json::GetNumber<uint8_t>(jCar["soundRange"], 255); car.sound_range = Json::GetNumber<uint8_t>(jCar["soundRange"], 255);
car.double_sound_frequency = Json::GetNumber<uint8_t>(jCar["doubleSoundFrequency"]); car.double_sound_frequency = Json::GetNumber<uint8_t>(jCar["doubleSoundFrequency"]);

View File

@ -890,7 +890,7 @@ void Guest::Tick128UpdateGuest(int32_t index)
{ {
if (State == PeepState::Walking || State == PeepState::Sitting) if (State == PeepState::Walking || State == PeepState::Sitting)
{ {
audio_play_sound_at_location(SoundId::Crash, { x, y, z }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::Crash, { x, y, z });
sprite_misc_explosion_cloud_create({ x, y, z + 16 }); sprite_misc_explosion_cloud_create({ x, y, z + 16 });
sprite_misc_explosion_flare_create({ x, y, z + 16 }); sprite_misc_explosion_flare_create({ x, y, z + 16 });
@ -1828,11 +1828,13 @@ void Guest::OnExitRide(ride_id_t rideIndex)
{ {
InsertNewThought(PEEP_THOUGHT_TYPE_WAS_GREAT, rideIndex); InsertNewThought(PEEP_THOUGHT_TYPE_WAS_GREAT, rideIndex);
SoundId laughs[3] = { SoundId::Laugh1, SoundId::Laugh2, SoundId::Laugh3 }; static constexpr OpenRCT2::Audio::SoundId laughs[3] = { OpenRCT2::Audio::SoundId::Laugh1,
OpenRCT2::Audio::SoundId::Laugh2,
OpenRCT2::Audio::SoundId::Laugh3 };
int32_t laughType = scenario_rand() & 7; int32_t laughType = scenario_rand() & 7;
if (laughType < 3) if (laughType < 3)
{ {
audio_play_sound_at_location(laughs[laughType], { x, y, z }); OpenRCT2::Audio::Play3D(laughs[laughType], { x, y, z });
} }
} }
@ -2369,7 +2371,7 @@ void Guest::SpendMoney(money16& peep_expend_type, money32 amount, ExpenditureTyp
} }
} }
audio_play_sound_at_location(SoundId::Purchase, { x, y, z }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::Purchase, { x, y, z });
} }
void Guest::SetHasRidden(const Ride* ride) void Guest::SetHasRidden(const Ride* ride)
@ -5102,7 +5104,7 @@ void Guest::UpdateRideShopInteract()
// Do not play toilet flush sound on title screen as it's considered loud and annoying // Do not play toilet flush sound on title screen as it's considered loud and annoying
if (!(gScreenFlags & SCREEN_FLAGS_TITLE_DEMO)) if (!(gScreenFlags & SCREEN_FLAGS_TITLE_DEMO))
{ {
audio_play_sound_at_location(SoundId::ToiletFlush, { x, y, z }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::ToiletFlush, { x, y, z });
} }
RideSubState = PeepRideSubState::LeaveShop; RideSubState = PeepRideSubState::LeaveShop;
@ -6852,7 +6854,7 @@ void Guest::UpdateSpriteType()
if ((scenario_rand() & 0xFFFF) <= 13107) if ((scenario_rand() & 0xFFFF) <= 13107)
{ {
isBalloonPopped = true; isBalloonPopped = true;
audio_play_sound_at_location(SoundId::BalloonPop, { x, y, z }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::BalloonPop, { x, y, z });
} }
create_balloon({ x, y, z + 9 }, BalloonColour, isBalloonPopped); create_balloon({ x, y, z + 9 }, BalloonColour, isBalloonPopped);
} }

View File

@ -641,9 +641,11 @@ std::optional<CoordsXY> Peep::UpdateAction(int16_t& xy_distance)
// Create sick at location // Create sick at location
litter_create({ x, y, z, sprite_direction }, (sprite_index & 1) ? LITTER_TYPE_SICK_ALT : LITTER_TYPE_SICK); litter_create({ x, y, z, sprite_direction }, (sprite_index & 1) ? LITTER_TYPE_SICK_ALT : LITTER_TYPE_SICK);
SoundId coughs[4] = { SoundId::Cough1, SoundId::Cough2, SoundId::Cough3, SoundId::Cough4 }; static constexpr OpenRCT2::Audio::SoundId coughs[4] = { OpenRCT2::Audio::SoundId::Cough1, OpenRCT2::Audio::SoundId::Cough2,
OpenRCT2::Audio::SoundId::Cough3,
OpenRCT2::Audio::SoundId::Cough4 };
auto soundId = coughs[scenario_rand() & 3]; auto soundId = coughs[scenario_rand() & 3];
audio_play_sound_at_location(soundId, { x, y, z }); OpenRCT2::Audio::Play3D(soundId, { x, y, z });
return { { x, y } }; return { { x, y } };
} }
@ -1325,7 +1327,7 @@ void peep_stop_crowd_noise()
*/ */
void peep_update_crowd_noise() void peep_update_crowd_noise()
{ {
if (gGameSoundsOff) if (OpenRCT2::Audio::gGameSoundsOff)
return; return;
if (!gConfigSound.sound_enabled) if (!gConfigSound.sound_enabled)
@ -1423,7 +1425,7 @@ void peep_applause()
} }
// Play applause noise // Play applause noise
audio_play_sound(SoundId::Applause, 0, context_get_width() / 2); OpenRCT2::Audio::Play(OpenRCT2::Audio::SoundId::Applause, 0, context_get_width() / 2);
} }
/** /**

View File

@ -2512,7 +2512,7 @@ bool Staff::UpdateFixingFixStationBrakes(bool firstRun, Ride* ride)
if (ActionFrame == 0x13 || ActionFrame == 0x19 || ActionFrame == 0x1F || ActionFrame == 0x25 || ActionFrame == 0x2B) if (ActionFrame == 0x13 || ActionFrame == 0x19 || ActionFrame == 0x1F || ActionFrame == 0x25 || ActionFrame == 0x2B)
{ {
audio_play_sound_at_location(SoundId::MechanicFix, { x, y, z }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::MechanicFix, { x, y, z });
} }
return false; return false;

View File

@ -1195,8 +1195,8 @@ private:
dst->sound_vector_factor = src->sound_vector_factor; dst->sound_vector_factor = src->sound_vector_factor;
dst->spin_speed = src->spin_speed; dst->spin_speed = src->spin_speed;
dst->sound2_flags = src->sound2_flags; dst->sound2_flags = src->sound2_flags;
dst->sound1_id = SoundId::Null; dst->sound1_id = OpenRCT2::Audio::SoundId::Null;
dst->sound2_id = SoundId::Null; dst->sound2_id = OpenRCT2::Audio::SoundId::Null;
dst->var_C0 = src->var_C0; dst->var_C0 = src->var_C0;
dst->var_C4 = src->var_C4; dst->var_C4 = src->var_C4;
dst->animation_frame = src->animation_frame; dst->animation_frame = src->animation_frame;
@ -1204,7 +1204,7 @@ private:
dst->var_CA = src->var_CA; dst->var_CA = src->var_CA;
dst->var_CE = src->var_CE; dst->var_CE = src->var_CE;
dst->var_D3 = src->var_D3; dst->var_D3 = src->var_D3;
dst->scream_sound_id = SoundId::Null; dst->scream_sound_id = OpenRCT2::Audio::SoundId::Null;
dst->vehicle_sprite_type = src->vehicle_sprite_type; dst->vehicle_sprite_type = src->vehicle_sprite_type;
dst->bank_rotation = src->bank_rotation; dst->bank_rotation = src->bank_rotation;

View File

@ -1394,9 +1394,9 @@ public:
dst->crash_x = src->crash_x; dst->crash_x = src->crash_x;
dst->sound2_flags = src->sound2_flags; dst->sound2_flags = src->sound2_flags;
dst->spin_sprite = src->spin_sprite; dst->spin_sprite = src->spin_sprite;
dst->sound1_id = static_cast<SoundId>(src->sound1_id); dst->sound1_id = static_cast<OpenRCT2::Audio::SoundId>(src->sound1_id);
dst->sound1_volume = src->sound1_volume; dst->sound1_volume = src->sound1_volume;
dst->sound2_id = static_cast<SoundId>(src->sound2_id); dst->sound2_id = static_cast<OpenRCT2::Audio::SoundId>(src->sound2_id);
dst->sound2_volume = src->sound2_volume; dst->sound2_volume = src->sound2_volume;
dst->sound_vector_factor = src->sound_vector_factor; dst->sound_vector_factor = src->sound_vector_factor;
dst->time_waiting = src->time_waiting; dst->time_waiting = src->time_waiting;
@ -1406,7 +1406,7 @@ public:
dst->animation_frame = src->animation_frame; dst->animation_frame = src->animation_frame;
dst->var_C8 = src->var_C8; dst->var_C8 = src->var_C8;
dst->var_CA = src->var_CA; dst->var_CA = src->var_CA;
dst->scream_sound_id = static_cast<SoundId>(src->scream_sound_id); dst->scream_sound_id = static_cast<OpenRCT2::Audio::SoundId>(src->scream_sound_id);
dst->TrackSubposition = VehicleTrackSubposition{ src->TrackSubposition }; dst->TrackSubposition = VehicleTrackSubposition{ src->TrackSubposition };
dst->var_CE = src->var_CE; dst->var_CE = src->var_CE;
dst->var_CF = src->var_CF; dst->var_CF = src->var_CF;

View File

@ -51,13 +51,13 @@ Vehicle* cable_lift_segment_create(
current->spin_sprite = 0; current->spin_sprite = 0;
current->spin_speed = 0; current->spin_speed = 0;
current->sound2_flags = 0; current->sound2_flags = 0;
current->sound1_id = SoundId::Null; current->sound1_id = OpenRCT2::Audio::SoundId::Null;
current->sound2_id = SoundId::Null; current->sound2_id = OpenRCT2::Audio::SoundId::Null;
current->var_C4 = 0; current->var_C4 = 0;
current->animation_frame = 0; current->animation_frame = 0;
current->var_C8 = 0; current->var_C8 = 0;
current->var_CA = 0; current->var_CA = 0;
current->scream_sound_id = SoundId::Null; current->scream_sound_id = OpenRCT2::Audio::SoundId::Null;
current->vehicle_sprite_type = 0; current->vehicle_sprite_type = 0;
current->bank_rotation = 0; current->bank_rotation = 0;
for (auto& peep : current->peep) for (auto& peep : current->peep)

View File

@ -13,99 +13,103 @@
#include "../audio/audio.h" #include "../audio/audio.h"
#include "../common.h" #include "../common.h"
namespace OpenRCT2::Audio
{
#define MAKE_TUNEID_LIST(...) std::vector<uint8_t>({ __VA_ARGS__ }) #define MAKE_TUNEID_LIST(...) std::vector<uint8_t>({ __VA_ARGS__ })
// 0x009AEF28 // 0x009AEF28
std::vector<uint8_t> gRideMusicStyleTuneIds[] = { std::vector<uint8_t> gRideMusicStyleTuneIds[] = {
MAKE_TUNEID_LIST(TUNE_DODGEMS_BEAT), // MUSIC_STYLE_DODGEMS_BEAT MAKE_TUNEID_LIST(TUNE_DODGEMS_BEAT), // MUSIC_STYLE_DODGEMS_BEAT
MAKE_TUNEID_LIST( // MUSIC_STYLE_FAIRGROUND_ORGAN MAKE_TUNEID_LIST( // MUSIC_STYLE_FAIRGROUND_ORGAN
TUNE_CHILDREN_OF_THE_REGIMENT, TUNE_SERENADE_OP_21, TUNE_IN_CONTINENTAL_MOOD, TUNE_WEDDING_JOURNEY, TUNE_CHILDREN_OF_THE_REGIMENT, TUNE_SERENADE_OP_21, TUNE_IN_CONTINENTAL_MOOD, TUNE_WEDDING_JOURNEY,
TUNE_TALES_FROM_THE_VIENNA_WOODS, TUNE_SLAVONIC_DANCE, TUNE_CSS_10, TUNE_DAS_ALPENHORN, TUNE_BELLA_BELLA_BIMBA, TUNE_TALES_FROM_THE_VIENNA_WOODS, TUNE_SLAVONIC_DANCE, TUNE_CSS_10, TUNE_DAS_ALPENHORN, TUNE_BELLA_BELLA_BIMBA,
TUNE_THE_BLOND_SAILOR, TUNE_POET_AND_PEASANT_OVERTURE, TUNE_WALTZ_MEDLEY, TUNE_CSS_16), TUNE_THE_BLOND_SAILOR, TUNE_POET_AND_PEASANT_OVERTURE, TUNE_WALTZ_MEDLEY, TUNE_CSS_16),
MAKE_TUNEID_LIST(TUNE_CAESARS_MARCH), // MUSIC_STYLE_ROMAN_FANFARE MAKE_TUNEID_LIST(TUNE_CAESARS_MARCH), // MUSIC_STYLE_ROMAN_FANFARE
MAKE_TUNEID_LIST(TUNE_NINJAS_NOODLES), // MUSIC_STYLE_ORIENTAL MAKE_TUNEID_LIST(TUNE_NINJAS_NOODLES), // MUSIC_STYLE_ORIENTAL
MAKE_TUNEID_LIST(TUNE_INVADERS), // MUSIC_STYLE_MARTIAN MAKE_TUNEID_LIST(TUNE_INVADERS), // MUSIC_STYLE_MARTIAN
MAKE_TUNEID_LIST(TUNE_JUNGLE_JUICE), // MUSIC_STYLE_JUNGLE_DRUMS MAKE_TUNEID_LIST(TUNE_JUNGLE_JUICE), // MUSIC_STYLE_JUNGLE_DRUMS
MAKE_TUNEID_LIST(TUNE_PHARAOHS_TOMB), // MUSIC_STYLE_EGYPTIAN MAKE_TUNEID_LIST(TUNE_PHARAOHS_TOMB), // MUSIC_STYLE_EGYPTIAN
MAKE_TUNEID_LIST(TUNE_ETERNAL_TOYBOX), // MUSIC_STYLE_TOYLAND MAKE_TUNEID_LIST(TUNE_ETERNAL_TOYBOX), // MUSIC_STYLE_TOYLAND
MAKE_TUNEID_LIST(TUNE_CIRCUS_SHOW), // MUSIC_STYLE_CIRCUS_SHOW MAKE_TUNEID_LIST(TUNE_CIRCUS_SHOW), // MUSIC_STYLE_CIRCUS_SHOW
MAKE_TUNEID_LIST(TUNE_VOYAGE_TO_ANDROMEDA), // MUSIC_STYLE_SPACE MAKE_TUNEID_LIST(TUNE_VOYAGE_TO_ANDROMEDA), // MUSIC_STYLE_SPACE
MAKE_TUNEID_LIST(TUNE_VAMPIRES_LAIR), // MUSIC_STYLE_HORROR MAKE_TUNEID_LIST(TUNE_VAMPIRES_LAIR), // MUSIC_STYLE_HORROR
MAKE_TUNEID_LIST(TUNE_BRIMBLES_BEAT), // MUSIC_STYLE_TECHNO MAKE_TUNEID_LIST(TUNE_BRIMBLES_BEAT), // MUSIC_STYLE_TECHNO
MAKE_TUNEID_LIST(TUNE_DRIFTING_TO_HEAVEN), // MUSIC_STYLE_GENTLE MAKE_TUNEID_LIST(TUNE_DRIFTING_TO_HEAVEN), // MUSIC_STYLE_GENTLE
MAKE_TUNEID_LIST(TUNE_MID_SUMMERS_HEAT), // MUSIC_STYLE_SUMMER MAKE_TUNEID_LIST(TUNE_MID_SUMMERS_HEAT), // MUSIC_STYLE_SUMMER
MAKE_TUNEID_LIST(TUNE_ATLANTIS), // MUSIC_STYLE_WATER MAKE_TUNEID_LIST(TUNE_ATLANTIS), // MUSIC_STYLE_WATER
MAKE_TUNEID_LIST(TUNE_WILD_WEST_KID), // MUSIC_STYLE_WILD_WEST MAKE_TUNEID_LIST(TUNE_WILD_WEST_KID), // MUSIC_STYLE_WILD_WEST
MAKE_TUNEID_LIST(TUNE_BLOCKBUSTER), // MUSIC_STYLE_JURASSIC MAKE_TUNEID_LIST(TUNE_BLOCKBUSTER), // MUSIC_STYLE_JURASSIC
MAKE_TUNEID_LIST(TUNE_AIRTIME_ROCK), // MUSIC_STYLE_ROCK MAKE_TUNEID_LIST(TUNE_AIRTIME_ROCK), // MUSIC_STYLE_ROCK
MAKE_TUNEID_LIST(TUNE_SEARCHLIGHT_RAG), // MUSIC_STYLE_RAGTIME MAKE_TUNEID_LIST(TUNE_SEARCHLIGHT_RAG), // MUSIC_STYLE_RAGTIME
MAKE_TUNEID_LIST(TUNE_FLIGHT_OF_FANTASY), // MUSIC_STYLE_FANTASY MAKE_TUNEID_LIST(TUNE_FLIGHT_OF_FANTASY), // MUSIC_STYLE_FANTASY
MAKE_TUNEID_LIST(TUNE_BIG_ROCK), // MUSIC_STYLE_ROCK_STYLE_2 MAKE_TUNEID_LIST(TUNE_BIG_ROCK), // MUSIC_STYLE_ROCK_STYLE_2
MAKE_TUNEID_LIST(TUNE_HYPOTHERMIA), // MUSIC_STYLE_ICE MAKE_TUNEID_LIST(TUNE_HYPOTHERMIA), // MUSIC_STYLE_ICE
MAKE_TUNEID_LIST(TUNE_LAST_SLEIGH_RIDE), // MUSIC_STYLE_SNOW MAKE_TUNEID_LIST(TUNE_LAST_SLEIGH_RIDE), // MUSIC_STYLE_SNOW
MAKE_TUNEID_LIST(TUNE_CUSTOM_1), // MUSIC_STYLE_CUSTOM_MUSIC_1 MAKE_TUNEID_LIST(TUNE_CUSTOM_1), // MUSIC_STYLE_CUSTOM_MUSIC_1
MAKE_TUNEID_LIST(TUNE_CUSTOM_2), // MUSIC_STYLE_CUSTOM_MUSIC_2 MAKE_TUNEID_LIST(TUNE_CUSTOM_2), // MUSIC_STYLE_CUSTOM_MUSIC_2
MAKE_TUNEID_LIST(TUNE_PIPES_OF_GLENCAIRN), // MUSIC_STYLE_MEDIEVAL MAKE_TUNEID_LIST(TUNE_PIPES_OF_GLENCAIRN), // MUSIC_STYLE_MEDIEVAL
MAKE_TUNEID_LIST(TUNE_TRAFFIC_JAM), // MUSIC_STYLE_URBAN MAKE_TUNEID_LIST(TUNE_TRAFFIC_JAM), // MUSIC_STYLE_URBAN
MAKE_TUNEID_LIST(TUNE_TOCCATA), // MUSIC_STYLE_ORGAN MAKE_TUNEID_LIST(TUNE_TOCCATA), // MUSIC_STYLE_ORGAN
MAKE_TUNEID_LIST(TUNE_MANIC_MECHANIC), // MUSIC_STYLE_MECHANICAL MAKE_TUNEID_LIST(TUNE_MANIC_MECHANIC), // MUSIC_STYLE_MECHANICAL
MAKE_TUNEID_LIST(TUNE_TECHNO_TORTURE), // MUSIC_STYLE_MODERN MAKE_TUNEID_LIST(TUNE_TECHNO_TORTURE), // MUSIC_STYLE_MODERN
MAKE_TUNEID_LIST(TUNE_WHAT_SHALL_WE_DO_WITH_THE_DRUNKEN_SAILOR), // MUSIC_STYLE_PIRATES MAKE_TUNEID_LIST(TUNE_WHAT_SHALL_WE_DO_WITH_THE_DRUNKEN_SAILOR), // MUSIC_STYLE_PIRATES
MAKE_TUNEID_LIST(TUNE_SPACE_ROCK), // MUSIC_STYLE_ROCK_STYLE_3 MAKE_TUNEID_LIST(TUNE_SPACE_ROCK), // MUSIC_STYLE_ROCK_STYLE_3
MAKE_TUNEID_LIST(TUNE_SWEAT_DREAMS), // MUSIC_STYLE_CANDY_STYLE MAKE_TUNEID_LIST(TUNE_SWEAT_DREAMS), // MUSIC_STYLE_CANDY_STYLE
}; };
#define INIT_MUSIC_INFO(path_id, offset) \ #define INIT_MUSIC_INFO(path_id, offset) \
{ \ { \
path_id, offset, 0 \ path_id, offset, 0 \
} }
// 0x009AF1C8 // 0x009AF1C8
rct_ride_music_info gRideMusicInfoList[NUM_DEFAULT_MUSIC_TRACKS] = { RideMusicInfo gRideMusicInfoList[NUM_DEFAULT_MUSIC_TRACKS] = {
INIT_MUSIC_INFO(PATH_ID_CSS4, 1378), INIT_MUSIC_INFO(PATH_ID_CSS4, 1378),
INIT_MUSIC_INFO(PATH_ID_CSS5, 1378), INIT_MUSIC_INFO(PATH_ID_CSS5, 1378),
INIT_MUSIC_INFO(PATH_ID_CSS6, 1378), INIT_MUSIC_INFO(PATH_ID_CSS6, 1378),
INIT_MUSIC_INFO(PATH_ID_CSS7, 1378), INIT_MUSIC_INFO(PATH_ID_CSS7, 1378),
INIT_MUSIC_INFO(PATH_ID_CSS8, 1378), INIT_MUSIC_INFO(PATH_ID_CSS8, 1378),
INIT_MUSIC_INFO(PATH_ID_CSS9, 1378), INIT_MUSIC_INFO(PATH_ID_CSS9, 1378),
INIT_MUSIC_INFO(0, 1378), // Referred to the nearly empty CSS10.DAT file INIT_MUSIC_INFO(0, 1378), // Referred to the nearly empty CSS10.DAT file
INIT_MUSIC_INFO(PATH_ID_CSS11, 1378), INIT_MUSIC_INFO(PATH_ID_CSS11, 1378),
INIT_MUSIC_INFO(PATH_ID_CSS12, 1378), INIT_MUSIC_INFO(PATH_ID_CSS12, 1378),
INIT_MUSIC_INFO(PATH_ID_CSS13, 1378), INIT_MUSIC_INFO(PATH_ID_CSS13, 1378),
INIT_MUSIC_INFO(PATH_ID_CSS14, 1378), INIT_MUSIC_INFO(PATH_ID_CSS14, 1378),
INIT_MUSIC_INFO(PATH_ID_CSS15, 1378), INIT_MUSIC_INFO(PATH_ID_CSS15, 1378),
INIT_MUSIC_INFO(0, 1378), // Referred to the nearly empty CSS16.DAT file INIT_MUSIC_INFO(0, 1378), // Referred to the nearly empty CSS16.DAT file
INIT_MUSIC_INFO(PATH_ID_CSS3, 689), INIT_MUSIC_INFO(PATH_ID_CSS3, 689),
INIT_MUSIC_INFO(PATH_ID_CSS17, 2756), INIT_MUSIC_INFO(PATH_ID_CSS17, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS18, 2756), INIT_MUSIC_INFO(PATH_ID_CSS18, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS19, 2756), INIT_MUSIC_INFO(PATH_ID_CSS19, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS20, 2756), INIT_MUSIC_INFO(PATH_ID_CSS20, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS21, 2756), INIT_MUSIC_INFO(PATH_ID_CSS21, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS22, 2756), INIT_MUSIC_INFO(PATH_ID_CSS22, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS23, 2756), INIT_MUSIC_INFO(PATH_ID_CSS23, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS24, 2756), INIT_MUSIC_INFO(PATH_ID_CSS24, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS25, 2756), INIT_MUSIC_INFO(PATH_ID_CSS25, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS26, 2756), INIT_MUSIC_INFO(PATH_ID_CSS26, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS27, 2756), INIT_MUSIC_INFO(PATH_ID_CSS27, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS28, 2756), INIT_MUSIC_INFO(PATH_ID_CSS28, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS29, 2756), INIT_MUSIC_INFO(PATH_ID_CSS29, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS30, 2756), INIT_MUSIC_INFO(PATH_ID_CSS30, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS31, 2756), INIT_MUSIC_INFO(PATH_ID_CSS31, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS32, 2756), INIT_MUSIC_INFO(PATH_ID_CSS32, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS33, 2756), INIT_MUSIC_INFO(PATH_ID_CSS33, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS34, 2756), INIT_MUSIC_INFO(PATH_ID_CSS34, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS35, 2756), INIT_MUSIC_INFO(PATH_ID_CSS35, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS36, 2756), INIT_MUSIC_INFO(PATH_ID_CSS36, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS37, 2756), INIT_MUSIC_INFO(PATH_ID_CSS37, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS38, 2756), INIT_MUSIC_INFO(PATH_ID_CSS38, 2756),
INIT_MUSIC_INFO(PATH_ID_CUSTOM1, 2756), INIT_MUSIC_INFO(PATH_ID_CUSTOM1, 2756),
INIT_MUSIC_INFO(PATH_ID_CUSTOM2, 2756), INIT_MUSIC_INFO(PATH_ID_CUSTOM2, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS39, 2756), INIT_MUSIC_INFO(PATH_ID_CSS39, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS40, 1378), INIT_MUSIC_INFO(PATH_ID_CSS40, 1378),
INIT_MUSIC_INFO(PATH_ID_CSS41, 2756), INIT_MUSIC_INFO(PATH_ID_CSS41, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS42, 2756), INIT_MUSIC_INFO(PATH_ID_CSS42, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS43, 2756), INIT_MUSIC_INFO(PATH_ID_CSS43, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS44, 2756), INIT_MUSIC_INFO(PATH_ID_CSS44, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS45, 2756), INIT_MUSIC_INFO(PATH_ID_CSS45, 2756),
INIT_MUSIC_INFO(PATH_ID_CSS46, 2756), INIT_MUSIC_INFO(PATH_ID_CSS46, 2756),
}; };
} // namespace OpenRCT2::Audio

View File

@ -14,54 +14,58 @@
#include <vector> #include <vector>
enum namespace OpenRCT2::Audio
{ {
TUNE_CHILDREN_OF_THE_REGIMENT, // 00 enum
TUNE_SERENADE_OP_21, // 01 {
TUNE_IN_CONTINENTAL_MOOD, // 02 TUNE_CHILDREN_OF_THE_REGIMENT, // 00
TUNE_WEDDING_JOURNEY, // 03 TUNE_SERENADE_OP_21, // 01
TUNE_TALES_FROM_THE_VIENNA_WOODS, // 04 TUNE_IN_CONTINENTAL_MOOD, // 02
TUNE_SLAVONIC_DANCE, // 05 TUNE_WEDDING_JOURNEY, // 03
TUNE_CSS_10, // 06, empty TUNE_TALES_FROM_THE_VIENNA_WOODS, // 04
TUNE_DAS_ALPENHORN, // 07 TUNE_SLAVONIC_DANCE, // 05
TUNE_BELLA_BELLA_BIMBA, // 08 TUNE_CSS_10, // 06, empty
TUNE_THE_BLOND_SAILOR, // 09 TUNE_DAS_ALPENHORN, // 07
TUNE_POET_AND_PEASANT_OVERTURE, // 10 TUNE_BELLA_BELLA_BIMBA, // 08
TUNE_WALTZ_MEDLEY, // 11 TUNE_THE_BLOND_SAILOR, // 09
TUNE_CSS_16, // 12, empty TUNE_POET_AND_PEASANT_OVERTURE, // 10
TUNE_DODGEMS_BEAT, // 13 TUNE_WALTZ_MEDLEY, // 11
TUNE_RCT2_THEME_MUSIC, // 14 TUNE_CSS_16, // 12, empty
TUNE_CAESARS_MARCH, // 15 TUNE_DODGEMS_BEAT, // 13
TUNE_NINJAS_NOODLES, // 16 TUNE_RCT2_THEME_MUSIC, // 14
TUNE_INVADERS, // 17 TUNE_CAESARS_MARCH, // 15
TUNE_JUNGLE_JUICE, // 18 TUNE_NINJAS_NOODLES, // 16
TUNE_PHARAOHS_TOMB, // 19 TUNE_INVADERS, // 17
TUNE_ETERNAL_TOYBOX, // 20 TUNE_JUNGLE_JUICE, // 18
TUNE_CIRCUS_SHOW, // 21 TUNE_PHARAOHS_TOMB, // 19
TUNE_VOYAGE_TO_ANDROMEDA, // 22 TUNE_ETERNAL_TOYBOX, // 20
TUNE_VAMPIRES_LAIR, // 23 TUNE_CIRCUS_SHOW, // 21
TUNE_BRIMBLES_BEAT, // 24 TUNE_VOYAGE_TO_ANDROMEDA, // 22
TUNE_DRIFTING_TO_HEAVEN, // 25 TUNE_VAMPIRES_LAIR, // 23
TUNE_MID_SUMMERS_HEAT, // 26 TUNE_BRIMBLES_BEAT, // 24
TUNE_ATLANTIS, // 27 TUNE_DRIFTING_TO_HEAVEN, // 25
TUNE_WILD_WEST_KID, // 28 TUNE_MID_SUMMERS_HEAT, // 26
TUNE_BLOCKBUSTER, // 29 TUNE_ATLANTIS, // 27
TUNE_AIRTIME_ROCK, // 30 TUNE_WILD_WEST_KID, // 28
TUNE_SEARCHLIGHT_RAG, // 31 TUNE_BLOCKBUSTER, // 29
TUNE_FLIGHT_OF_FANTASY, // 32 TUNE_AIRTIME_ROCK, // 30
TUNE_BIG_ROCK, // 33 TUNE_SEARCHLIGHT_RAG, // 31
TUNE_HYPOTHERMIA, // 34 TUNE_FLIGHT_OF_FANTASY, // 32
TUNE_LAST_SLEIGH_RIDE, // 35 TUNE_BIG_ROCK, // 33
TUNE_CUSTOM_1, // 36 TUNE_HYPOTHERMIA, // 34
TUNE_CUSTOM_2, // 37 TUNE_LAST_SLEIGH_RIDE, // 35
TUNE_PIPES_OF_GLENCAIRN, // 38 TUNE_CUSTOM_1, // 36
TUNE_TRAFFIC_JAM, // 39 TUNE_CUSTOM_2, // 37
TUNE_TOCCATA, // 40 TUNE_PIPES_OF_GLENCAIRN, // 38
TUNE_MANIC_MECHANIC, // 41 TUNE_TRAFFIC_JAM, // 39
TUNE_TECHNO_TORTURE, // 42 TUNE_TOCCATA, // 40
TUNE_WHAT_SHALL_WE_DO_WITH_THE_DRUNKEN_SAILOR, // 43 TUNE_MANIC_MECHANIC, // 41
TUNE_SPACE_ROCK, // 44 TUNE_TECHNO_TORTURE, // 42
TUNE_SWEAT_DREAMS, // 45, (sic) TUNE_WHAT_SHALL_WE_DO_WITH_THE_DRUNKEN_SAILOR, // 43
}; TUNE_SPACE_ROCK, // 44
TUNE_SWEAT_DREAMS, // 45, (sic)
};
extern std::vector<uint8_t> gRideMusicStyleTuneIds[]; extern std::vector<uint8_t> gRideMusicStyleTuneIds[];
} // namespace OpenRCT2::Audio

View File

@ -2833,7 +2833,7 @@ static void ride_music_update(Ride* ride)
// Select random tune from available tunes for a music style (of course only merry-go-rounds have more than one tune) // Select random tune from available tunes for a music style (of course only merry-go-rounds have more than one tune)
if (ride->music_tune_id == 255) if (ride->music_tune_id == 255)
{ {
const auto& musicStyleTunes = gRideMusicStyleTuneIds[ride->music]; const auto& musicStyleTunes = OpenRCT2::Audio::gRideMusicStyleTuneIds[ride->music];
auto numTunes = musicStyleTunes.size(); auto numTunes = musicStyleTunes.size();
ride->music_tune_id = musicStyleTunes[util_rand() % numTunes]; ride->music_tune_id = musicStyleTunes[util_rand() % numTunes];
ride->music_position = 0; ride->music_position = 0;
@ -3451,10 +3451,10 @@ void ride_set_map_tooltip(TileElement* tileElement)
static int32_t ride_music_params_update_label_51( static int32_t ride_music_params_update_label_51(
uint32_t a1, uint8_t* tuneId, Ride* ride, int32_t v32, int32_t pan_x, uint16_t sampleRate) uint32_t a1, uint8_t* tuneId, Ride* ride, int32_t v32, int32_t pan_x, uint16_t sampleRate)
{ {
if (a1 < gRideMusicInfoList[*tuneId].length) if (a1 < OpenRCT2::Audio::gRideMusicInfoList[*tuneId].length)
{ {
rct_ride_music_params* ride_music_params = gRideMusicParamsListEnd; OpenRCT2::Audio::RideMusicParams* ride_music_params = OpenRCT2::Audio::gRideMusicParamsListEnd;
if (ride_music_params < &gRideMusicParamsList[std::size(gRideMusicParamsList)]) if (ride_music_params < &OpenRCT2::Audio::gRideMusicParamsList[std::size(OpenRCT2::Audio::gRideMusicParamsList)])
{ {
ride_music_params->ride_id = ride->id; ride_music_params->ride_id = ride->id;
ride_music_params->tune_id = *tuneId; ride_music_params->tune_id = *tuneId;
@ -3462,7 +3462,7 @@ static int32_t ride_music_params_update_label_51(
ride_music_params->volume = v32; ride_music_params->volume = v32;
ride_music_params->pan = pan_x; ride_music_params->pan = pan_x;
ride_music_params->frequency = sampleRate; ride_music_params->frequency = sampleRate;
gRideMusicParamsListEnd++; OpenRCT2::Audio::gRideMusicParamsListEnd++;
} }
return a1; return a1;
@ -3476,7 +3476,7 @@ static int32_t ride_music_params_update_label_51(
static int32_t ride_music_params_update_label_58(uint32_t position, uint8_t* tuneId) static int32_t ride_music_params_update_label_58(uint32_t position, uint8_t* tuneId)
{ {
rct_ride_music_info* ride_music_info = &gRideMusicInfoList[*tuneId]; OpenRCT2::Audio::RideMusicInfo* ride_music_info = &OpenRCT2::Audio::gRideMusicInfoList[*tuneId];
position += ride_music_info->offset; position += ride_music_info->offset;
if (position < ride_music_info->length) if (position < ride_music_info->length)
{ {
@ -3505,7 +3505,8 @@ static int32_t ride_music_params_update_label_58(uint32_t position, uint8_t* tun
int32_t ride_music_params_update( int32_t ride_music_params_update(
const CoordsXYZ& rideCoords, Ride* ride, uint16_t sampleRate, uint32_t position, uint8_t* tuneId) const CoordsXYZ& rideCoords, Ride* ride, uint16_t sampleRate, uint32_t position, uint8_t* tuneId)
{ {
if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !gGameSoundsOff && g_music_tracking_viewport != nullptr) if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !OpenRCT2::Audio::gGameSoundsOff
&& g_music_tracking_viewport != nullptr)
{ {
const ScreenCoordsXY rotatedCoords = translate_3d_to_2d_with_z(get_current_rotation(), rideCoords); const ScreenCoordsXY rotatedCoords = translate_3d_to_2d_with_z(get_current_rotation(), rideCoords);
rct_viewport* viewport = g_music_tracking_viewport; rct_viewport* viewport = g_music_tracking_viewport;
@ -3584,13 +3585,13 @@ int32_t ride_music_params_update(
{ {
vol1 = vol2; vol1 = vol2;
} }
if (vol1 < gVolumeAdjustZoom * 3) if (vol1 < OpenRCT2::Audio::gVolumeAdjustZoom * 3)
{ {
vol1 = 0; vol1 = 0;
} }
else else
{ {
vol1 = vol1 - (gVolumeAdjustZoom * 3); vol1 = vol1 - (OpenRCT2::Audio::gVolumeAdjustZoom * 3);
} }
int32_t v32 = -((static_cast<uint8_t>(-vol1 - 1) * static_cast<uint8_t>(-vol1 - 1)) / 16) - 700; int32_t v32 = -((static_cast<uint8_t>(-vol1 - 1) * static_cast<uint8_t>(-vol1 - 1)) / 16) - 700;
if (vol1 && v32 >= -4000) if (vol1 && v32 >= -4000)
@ -3603,7 +3604,7 @@ int32_t ride_music_params_update(
{ {
pan_x = -10000; pan_x = -10000;
} }
rct_ride_music* ride_music = &gRideMusicList[0]; OpenRCT2::Audio::RideMusic* ride_music = &OpenRCT2::Audio::gRideMusicList[0];
int32_t channel = 0; int32_t channel = 0;
uint32_t a1; uint32_t a1;
while (ride_music->ride_id != ride->id || ride_music->tune_id != *tuneId) while (ride_music->ride_id != ride->id || ride_music->tune_id != *tuneId)
@ -3612,19 +3613,19 @@ int32_t ride_music_params_update(
channel++; channel++;
if (channel >= AUDIO_MAX_RIDE_MUSIC) if (channel >= AUDIO_MAX_RIDE_MUSIC)
{ {
rct_ride_music_info* ride_music_info = &gRideMusicInfoList[*tuneId]; OpenRCT2::Audio::RideMusicInfo* ride_music_info = &OpenRCT2::Audio::gRideMusicInfoList[*tuneId];
a1 = position + ride_music_info->offset; a1 = position + ride_music_info->offset;
return ride_music_params_update_label_51(a1, tuneId, ride, v32, pan_x, sampleRate); return ride_music_params_update_label_51(a1, tuneId, ride, v32, pan_x, sampleRate);
} }
} }
int32_t playing = Mixer_Channel_IsPlaying(gRideMusicList[channel].sound_channel); int32_t playing = Mixer_Channel_IsPlaying(OpenRCT2::Audio::gRideMusicList[channel].sound_channel);
if (!playing) if (!playing)
{ {
*tuneId = 0xFF; *tuneId = 0xFF;
return 0; return 0;
} }
a1 = static_cast<uint32_t>(Mixer_Channel_GetOffset(gRideMusicList[channel].sound_channel)); a1 = static_cast<uint32_t>(Mixer_Channel_GetOffset(OpenRCT2::Audio::gRideMusicList[channel].sound_channel));
return ride_music_params_update_label_51(a1, tuneId, ride, v32, pan_x, sampleRate); return ride_music_params_update_label_51(a1, tuneId, ride, v32, pan_x, sampleRate);
} }
@ -3646,17 +3647,17 @@ void ride_music_update_final()
return; return;
// TODO Allow circus music (CSS24) to play if ride music is disabled (that should be sound) // TODO Allow circus music (CSS24) to play if ride music is disabled (that should be sound)
if (gGameSoundsOff || !gConfigSound.ride_music_enabled) if (OpenRCT2::Audio::gGameSoundsOff || !gConfigSound.ride_music_enabled)
return; return;
// Stop currently playing music that is not in music params list or not playing? // Stop currently playing music that is not in music params list or not playing?
for (auto& rideMusic : gRideMusicList) for (auto& rideMusic : OpenRCT2::Audio::gRideMusicList)
{ {
if (rideMusic.ride_id != RIDE_ID_NULL) if (rideMusic.ride_id != RIDE_ID_NULL)
{ {
rct_ride_music_params* rideMusicParams = &gRideMusicParamsList[0]; OpenRCT2::Audio::RideMusicParams* rideMusicParams = &OpenRCT2::Audio::gRideMusicParamsList[0];
int32_t isPlaying = 0; int32_t isPlaying = 0;
while (rideMusicParams < gRideMusicParamsListEnd && !isPlaying) while (rideMusicParams < OpenRCT2::Audio::gRideMusicParamsListEnd && !isPlaying)
{ {
if (rideMusicParams->ride_id == rideMusic.ride_id && rideMusicParams->tune_id == rideMusic.tune_id) if (rideMusicParams->ride_id == rideMusic.ride_id && rideMusicParams->tune_id == rideMusic.tune_id)
{ {
@ -3674,12 +3675,12 @@ void ride_music_update_final()
} }
int32_t freeChannelIndex = 0; int32_t freeChannelIndex = 0;
for (rct_ride_music_params* rideMusicParams = &gRideMusicParamsList[0]; rideMusicParams < gRideMusicParamsListEnd; for (auto* rideMusicParams = &OpenRCT2::Audio::gRideMusicParamsList[0];
rideMusicParams++) rideMusicParams < OpenRCT2::Audio::gRideMusicParamsListEnd; rideMusicParams++)
{ {
if (rideMusicParams->ride_id != RIDE_ID_NULL) if (rideMusicParams->ride_id != RIDE_ID_NULL)
{ {
rct_ride_music* rideMusic = &gRideMusicList[0]; auto* rideMusic = &OpenRCT2::Audio::gRideMusicList[0];
int32_t channelIndex = 0; int32_t channelIndex = 0;
// Look for existing entry, if not found start playing the sound, otherwise update parameters. // Look for existing entry, if not found start playing the sound, otherwise update parameters.
while (rideMusicParams->ride_id != rideMusic->ride_id || rideMusicParams->tune_id != rideMusic->tune_id) while (rideMusicParams->ride_id != rideMusic->ride_id || rideMusicParams->tune_id != rideMusic->tune_id)
@ -3692,8 +3693,8 @@ void ride_music_update_final()
channelIndex++; channelIndex++;
if (channelIndex >= AUDIO_MAX_RIDE_MUSIC) if (channelIndex >= AUDIO_MAX_RIDE_MUSIC)
{ {
rct_ride_music_info* ride_music_info = &gRideMusicInfoList[rideMusicParams->tune_id]; auto* ride_music_info = &OpenRCT2::Audio::gRideMusicInfoList[rideMusicParams->tune_id];
rct_ride_music* ride_music_3 = &gRideMusicList[freeChannelIndex]; auto* ride_music_3 = &OpenRCT2::Audio::gRideMusicList[freeChannelIndex];
ride_music_3->sound_channel = Mixer_Play_Music(ride_music_info->path_id, MIXER_LOOP_NONE, true); ride_music_3->sound_channel = Mixer_Play_Music(ride_music_info->path_id, MIXER_LOOP_NONE, true);
if (ride_music_3->sound_channel) if (ride_music_3->sound_channel)
{ {
@ -4398,13 +4399,13 @@ static Vehicle* vehicle_create_car(
vehicle->spin_sprite = 0; vehicle->spin_sprite = 0;
vehicle->spin_speed = 0; vehicle->spin_speed = 0;
vehicle->sound2_flags = 0; vehicle->sound2_flags = 0;
vehicle->sound1_id = SoundId::Null; vehicle->sound1_id = OpenRCT2::Audio::SoundId::Null;
vehicle->sound2_id = SoundId::Null; vehicle->sound2_id = OpenRCT2::Audio::SoundId::Null;
vehicle->next_vehicle_on_train = SPRITE_INDEX_NULL; vehicle->next_vehicle_on_train = SPRITE_INDEX_NULL;
vehicle->var_C4 = 0; vehicle->var_C4 = 0;
vehicle->animation_frame = 0; vehicle->animation_frame = 0;
vehicle->var_C8 = 0; vehicle->var_C8 = 0;
vehicle->scream_sound_id = SoundId::Null; vehicle->scream_sound_id = OpenRCT2::Audio::SoundId::Null;
vehicle->vehicle_sprite_type = 0; vehicle->vehicle_sprite_type = 0;
vehicle->bank_rotation = 0; vehicle->bank_rotation = 0;
vehicle->target_seat_rotation = 4; vehicle->target_seat_rotation = 4;

View File

@ -149,7 +149,7 @@ const rct_ride_entry_vehicle CableLiftVehicle = {
/* .no_seating_rows = */ 0, /* .no_seating_rows = */ 0,
/* .spinning_inertia = */ 0, /* .spinning_inertia = */ 0,
/* .spinning_friction = */ 255, /* .spinning_friction = */ 255,
/* .friction_sound_id = */ SoundId::LiftClassic, /* .friction_sound_id = */ OpenRCT2::Audio::SoundId::LiftClassic,
/* .log_flume_reverser_vehicle_type = */ 0, /* .log_flume_reverser_vehicle_type = */ 0,
/* .sound_range = */ 0, /* .sound_range = */ 0,
/* .double_sound_frequency = */ 0, /* .double_sound_frequency = */ 0,

View File

@ -96,7 +96,7 @@ struct RideHeights
struct rct_ride_lift_data struct rct_ride_lift_data
{ {
SoundId sound_id; OpenRCT2::Audio::SoundId sound_id;
uint8_t minimum_speed; uint8_t minimum_speed;
uint8_t maximum_speed; uint8_t maximum_speed;
}; };
@ -327,7 +327,7 @@ constexpr const RideTypeDescriptor DummyRTD =
SET_FIELD(AvailableBreakdowns, 0), SET_FIELD(AvailableBreakdowns, 0),
SET_FIELD(Heights, { 12, 64, 0, 0, }), SET_FIELD(Heights, { 12, 64, 0, 0, }),
SET_FIELD(MaxMass, 255), SET_FIELD(MaxMass, 255),
SET_FIELD(LiftData, { SoundId::Null, 5, 5 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }),
SET_FIELD(RatingsCalculationFunction, nullptr), SET_FIELD(RatingsCalculationFunction, nullptr),
SET_FIELD(RatingsMultipliers, { 0, 0, 0 }), SET_FIELD(RatingsMultipliers, { 0, 0, 0 }),
SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }),

View File

@ -68,13 +68,21 @@ Vehicle* _vehicleFrontVehicle;
CoordsXYZ unk_F64E20; CoordsXYZ unk_F64E20;
// clang-format off // clang-format off
static constexpr const SoundId byte_9A3A14[] = { SoundId::Scream8, SoundId::Scream1 }; static constexpr const OpenRCT2::Audio::SoundId byte_9A3A14[] = { OpenRCT2::Audio::SoundId::Scream8,
static constexpr const SoundId byte_9A3A16[] = { SoundId::Scream1, SoundId::Scream6 }; OpenRCT2::Audio::SoundId::Scream1 };
static constexpr const SoundId byte_9A3A18[] = { static constexpr const OpenRCT2::Audio::SoundId byte_9A3A16[] = { OpenRCT2::Audio::SoundId::Scream1,
SoundId::Scream3, SoundId::Scream1, SoundId::Scream5, SoundId::Scream6, OpenRCT2::Audio::SoundId::Scream6 };
SoundId::Scream7, SoundId::Scream2, SoundId::Scream4 static constexpr const OpenRCT2::Audio::SoundId byte_9A3A18[] = {
OpenRCT2::Audio::SoundId::Scream3,
OpenRCT2::Audio::SoundId::Scream1,
OpenRCT2::Audio::SoundId::Scream5,
OpenRCT2::Audio::SoundId::Scream6,
OpenRCT2::Audio::SoundId::Scream7,
OpenRCT2::Audio::SoundId::Scream2,
OpenRCT2::Audio::SoundId::Scream4
}; };
static constexpr const uint8_t _soundParams[RCT2SoundCount][2] =
static constexpr const uint8_t _soundParams[OpenRCT2::Audio::RCT2SoundCount][2] =
{ {
{ 1, 0 }, // LiftClassic { 1, 0 }, // LiftClassic
{ 1, 0 }, // TrackFrictionClassicWood { 1, 0 }, // TrackFrictionClassicWood
@ -650,16 +658,16 @@ static constexpr const CoordsXY AvoidCollisionMoveOffset[] =
}; };
static constexpr const SoundId DoorOpenSoundIds[] = static constexpr const OpenRCT2::Audio::SoundId DoorOpenSoundIds[] =
{ {
SoundId::DoorOpen, OpenRCT2::Audio::SoundId::DoorOpen,
SoundId::Portcullis OpenRCT2::Audio::SoundId::Portcullis
}; };
static constexpr const SoundId DoorCloseSoundIds[] = static constexpr const OpenRCT2::Audio::SoundId DoorCloseSoundIds[] =
{ {
SoundId::DoorClose, OpenRCT2::Audio::SoundId::DoorClose,
SoundId::Portcullis OpenRCT2::Audio::SoundId::Portcullis
}; };
static const struct static const struct
@ -910,7 +918,7 @@ bool Vehicle::SoundCanPlay() const
if ((gScreenFlags & SCREEN_FLAGS_TRACK_DESIGNER) && gS6Info.editor_step != EDITOR_STEP_ROLLERCOASTER_DESIGNER) if ((gScreenFlags & SCREEN_FLAGS_TRACK_DESIGNER) && gS6Info.editor_step != EDITOR_STEP_ROLLERCOASTER_DESIGNER)
return false; return false;
if (sound1_id == SoundId::Null && sound2_id == SoundId::Null) if (sound1_id == OpenRCT2::Audio::SoundId::Null && sound2_id == OpenRCT2::Audio::SoundId::Null)
return false; return false;
if (sprite_left == LOCATION_NULL) if (sprite_left == LOCATION_NULL)
@ -955,13 +963,13 @@ bool Vehicle::SoundCanPlay() const
uint16_t Vehicle::GetSoundPriority() const uint16_t Vehicle::GetSoundPriority() const
{ {
int32_t result = Train(this).Mass() + (std::abs(velocity) >> 13); int32_t result = Train(this).Mass() + (std::abs(velocity) >> 13);
rct_vehicle_sound* vehicle_sound = &gVehicleSoundList[0]; auto* vehicle_sound = &OpenRCT2::Audio::gVehicleSoundList[0];
while (vehicle_sound->id != sprite_index) while (vehicle_sound->id != sprite_index)
{ {
vehicle_sound++; vehicle_sound++;
if (vehicle_sound >= &gVehicleSoundList[std::size(gVehicleSoundList)]) if (vehicle_sound >= &OpenRCT2::Audio::gVehicleSoundList[std::size(OpenRCT2::Audio::gVehicleSoundList)])
{ {
return result; return result;
} }
@ -971,9 +979,9 @@ uint16_t Vehicle::GetSoundPriority() const
return result + 300; return result + 300;
} }
rct_vehicle_sound_params Vehicle::CreateSoundParam(uint16_t priority) const OpenRCT2::Audio::VehicleSoundParams Vehicle::CreateSoundParam(uint16_t priority) const
{ {
rct_vehicle_sound_params param; OpenRCT2::Audio::VehicleSoundParams param;
param.priority = priority; param.priority = priority;
int32_t panX = (sprite_left / 2) + (sprite_right / 2) - g_music_tracking_viewport->viewPos.x; int32_t panX = (sprite_left / 2) + (sprite_right / 2) - g_music_tracking_viewport->viewPos.x;
panX = panX / g_music_tracking_viewport->zoom; panX = panX / g_music_tracking_viewport->zoom;
@ -1036,7 +1044,7 @@ rct_vehicle_sound_params Vehicle::CreateSoundParam(uint16_t priority) const
* *
* rct2: 0x006BB9FF * rct2: 0x006BB9FF
*/ */
void Vehicle::UpdateSoundParams(std::vector<rct_vehicle_sound_params>& vehicleSoundParamsList) const void Vehicle::UpdateSoundParams(std::vector<OpenRCT2::Audio::VehicleSoundParams>& vehicleSoundParamsList) const
{ {
if (!SoundCanPlay()) if (!SoundCanPlay())
return; return;
@ -1045,7 +1053,7 @@ void Vehicle::UpdateSoundParams(std::vector<rct_vehicle_sound_params>& vehicleSo
// Find a sound param of lower priority to use // Find a sound param of lower priority to use
auto soundParamIter = std::find_if( auto soundParamIter = std::find_if(
vehicleSoundParamsList.begin(), vehicleSoundParamsList.end(), vehicleSoundParamsList.begin(), vehicleSoundParamsList.end(),
[soundPriority](rct_vehicle_sound_params param) { return soundPriority > param.priority; }); [soundPriority](const auto& param) { return soundPriority > param.priority; });
if (soundParamIter == std::end(vehicleSoundParamsList)) if (soundParamIter == std::end(vehicleSoundParamsList))
{ {
@ -1087,14 +1095,14 @@ static void vehicle_sounds_update_window_setup()
g_music_tracking_viewport = viewport; g_music_tracking_viewport = viewport;
gWindowAudioExclusive = window; gWindowAudioExclusive = window;
if (viewport->zoom <= 0) if (viewport->zoom <= 0)
gVolumeAdjustZoom = 0; OpenRCT2::Audio::gVolumeAdjustZoom = 0;
else if (viewport->zoom == 1) else if (viewport->zoom == 1)
gVolumeAdjustZoom = 35; OpenRCT2::Audio::gVolumeAdjustZoom = 35;
else else
gVolumeAdjustZoom = 70; OpenRCT2::Audio::gVolumeAdjustZoom = 70;
} }
static uint8_t vehicle_sounds_update_get_pan_volume(rct_vehicle_sound_params* sound_params) static uint8_t vehicle_sounds_update_get_pan_volume(OpenRCT2::Audio::VehicleSoundParams* sound_params)
{ {
uint8_t vol1 = 0xFF; uint8_t vol1 = 0xFF;
uint8_t vol2 = 0xFF; uint8_t vol2 = 0xFF;
@ -1135,7 +1143,7 @@ static uint8_t vehicle_sounds_update_get_pan_volume(rct_vehicle_sound_params* so
} }
vol1 = std::min(vol1, vol2); vol1 = std::min(vol1, vol2);
return std::max(0, vol1 - gVolumeAdjustZoom); return std::max(0, vol1 - OpenRCT2::Audio::gVolumeAdjustZoom);
} }
/* Returns the vehicle sound for a sound_param. /* Returns the vehicle sound for a sound_param.
@ -1144,28 +1152,28 @@ static uint8_t vehicle_sounds_update_get_pan_volume(rct_vehicle_sound_params* so
* If not playing allocates a sound slot to sound_param->id. * If not playing allocates a sound slot to sound_param->id.
* If no free slots returns nullptr. * If no free slots returns nullptr.
*/ */
static rct_vehicle_sound* vehicle_sounds_update_get_vehicle_sound(rct_vehicle_sound_params* sound_params) static OpenRCT2::Audio::VehicleSound* vehicle_sounds_update_get_vehicle_sound(OpenRCT2::Audio::VehicleSoundParams* sound_params)
{ {
// Search for already playing vehicle sound // Search for already playing vehicle sound
rct_vehicle_sound* vehicleSound = &gVehicleSoundList[0]; auto* vehicleSound = &OpenRCT2::Audio::gVehicleSoundList[0];
for (; vehicleSound < &gVehicleSoundList[std::size(gVehicleSoundList)]; vehicleSound++) for (; vehicleSound < &OpenRCT2::Audio::gVehicleSoundList[std::size(OpenRCT2::Audio::gVehicleSoundList)]; vehicleSound++)
{ {
if (vehicleSound->id == sound_params->id) if (vehicleSound->id == sound_params->id)
return vehicleSound; return vehicleSound;
} }
// No sound already playing // No sound already playing
if (vehicleSound >= &gVehicleSoundList[std::size(gVehicleSoundList)]) if (vehicleSound >= &OpenRCT2::Audio::gVehicleSoundList[std::size(OpenRCT2::Audio::gVehicleSoundList)])
{ {
for (vehicleSound = &gVehicleSoundList[0]; vehicleSound < &gVehicleSoundList[std::size(gVehicleSoundList)]; for (vehicleSound = &OpenRCT2::Audio::gVehicleSoundList[0];
vehicleSound++) vehicleSound < &OpenRCT2::Audio::gVehicleSoundList[std::size(OpenRCT2::Audio::gVehicleSoundList)]; vehicleSound++)
{ {
// Use free slot // Use free slot
if (vehicleSound->id == SOUND_ID_NULL) if (vehicleSound->id == SOUND_ID_NULL)
{ {
vehicleSound->id = sound_params->id; vehicleSound->id = sound_params->id;
vehicleSound->TrackSound.Id = SoundId::Null; vehicleSound->TrackSound.Id = OpenRCT2::Audio::SoundId::Null;
vehicleSound->OtherSound.Id = SoundId::Null; vehicleSound->OtherSound.Id = OpenRCT2::Audio::SoundId::Null;
vehicleSound->volume = 0x30; vehicleSound->volume = 0x30;
return vehicleSound; return vehicleSound;
} }
@ -1180,7 +1188,7 @@ enum class SoundType
OtherNoises, // e.g. Screams OtherNoises, // e.g. Screams
}; };
template<SoundType type> static uint16_t SoundFrequency(const SoundId id, uint16_t baseFrequency) template<SoundType type> static uint16_t SoundFrequency(const OpenRCT2::Audio::SoundId id, uint16_t baseFrequency)
{ {
if constexpr (type == SoundType::TrackNoises) if constexpr (type == SoundType::TrackNoises)
{ {
@ -1200,34 +1208,36 @@ template<SoundType type> static uint16_t SoundFrequency(const SoundId id, uint16
} }
} }
template<SoundType type> static bool ShouldUpdateChannelRate(const SoundId id) template<SoundType type> static bool ShouldUpdateChannelRate(const OpenRCT2::Audio::SoundId id)
{ {
return type == SoundType::TrackNoises || !(_soundParams[static_cast<uint8_t>(id)][1] & 1); return type == SoundType::TrackNoises || !(_soundParams[static_cast<uint8_t>(id)][1] & 1);
} }
template<SoundType type> template<SoundType type>
static void UpdateSound(const SoundId id, int32_t volume, rct_vehicle_sound_params* sound_params, Sound& sound, uint8_t panVol) static void UpdateSound(
const OpenRCT2::Audio::SoundId id, int32_t volume, OpenRCT2::Audio::VehicleSoundParams* sound_params,
OpenRCT2::Audio::Sound& sound, uint8_t panVol)
{ {
volume *= panVol; volume *= panVol;
volume = volume / 8; volume = volume / 8;
volume = std::max(volume - 0x1FFF, -10000); volume = std::max(volume - 0x1FFF, -10000);
if (id == SoundId::Null) if (id == OpenRCT2::Audio::SoundId::Null)
{ {
if (sound.Id != SoundId::Null) if (sound.Id != OpenRCT2::Audio::SoundId::Null)
{ {
sound.Id = SoundId::Null; sound.Id = OpenRCT2::Audio::SoundId::Null;
Mixer_Stop_Channel(sound.Channel); Mixer_Stop_Channel(sound.Channel);
} }
return; return;
} }
if (sound.Id != SoundId::Null && id != sound.Id) if (sound.Id != OpenRCT2::Audio::SoundId::Null && id != sound.Id)
{ {
Mixer_Stop_Channel(sound.Channel); Mixer_Stop_Channel(sound.Channel);
} }
if ((sound.Id == SoundId::Null) || (id != sound.Id)) if ((sound.Id == OpenRCT2::Audio::SoundId::Null) || (id != sound.Id))
{ {
sound.Id = id; sound.Id = id;
sound.Pan = sound_params->pan_x; sound.Pan = sound_params->pan_x;
@ -1268,10 +1278,10 @@ static void UpdateSound(const SoundId id, int32_t volume, rct_vehicle_sound_para
*/ */
void vehicle_sounds_update() void vehicle_sounds_update()
{ {
if (!audio_is_available()) if (!OpenRCT2::Audio::IsAvailable())
return; return;
std::vector<rct_vehicle_sound_params> vehicleSoundParamsList; std::vector<OpenRCT2::Audio::VehicleSoundParams> vehicleSoundParamsList;
vehicleSoundParamsList.reserve(AUDIO_MAX_VEHICLE_SOUNDS); vehicleSoundParamsList.reserve(AUDIO_MAX_VEHICLE_SOUNDS);
vehicle_sounds_update_window_setup(); vehicle_sounds_update_window_setup();
@ -1282,7 +1292,7 @@ void vehicle_sounds_update()
} }
// Stop all playing sounds that no longer have priority to play after vehicle_update_sound_params // Stop all playing sounds that no longer have priority to play after vehicle_update_sound_params
for (auto& vehicle_sound : gVehicleSoundList) for (auto& vehicle_sound : OpenRCT2::Audio::gVehicleSoundList)
{ {
if (vehicle_sound.id != SOUND_ID_NULL) if (vehicle_sound.id != SOUND_ID_NULL)
{ {
@ -1299,11 +1309,11 @@ void vehicle_sounds_update()
if (keepPlaying) if (keepPlaying)
continue; continue;
if (vehicle_sound.TrackSound.Id != SoundId::Null) if (vehicle_sound.TrackSound.Id != OpenRCT2::Audio::SoundId::Null)
{ {
Mixer_Stop_Channel(vehicle_sound.TrackSound.Channel); Mixer_Stop_Channel(vehicle_sound.TrackSound.Channel);
} }
if (vehicle_sound.OtherSound.Id != SoundId::Null) if (vehicle_sound.OtherSound.Id != OpenRCT2::Audio::SoundId::Null)
{ {
Mixer_Stop_Channel(vehicle_sound.OtherSound.Channel); Mixer_Stop_Channel(vehicle_sound.OtherSound.Channel);
} }
@ -1315,7 +1325,7 @@ void vehicle_sounds_update()
{ {
uint8_t panVol = vehicle_sounds_update_get_pan_volume(&vehicleSoundParams); uint8_t panVol = vehicle_sounds_update_get_pan_volume(&vehicleSoundParams);
rct_vehicle_sound* vehicleSound = vehicle_sounds_update_get_vehicle_sound(&vehicleSoundParams); auto* vehicleSound = vehicle_sounds_update_get_vehicle_sound(&vehicleSoundParams);
// No free vehicle sound slots (RCT2 corrupts the pointer here) // No free vehicle sound slots (RCT2 corrupts the pointer here)
if (vehicleSound == nullptr) if (vehicleSound == nullptr)
continue; continue;
@ -1912,13 +1922,15 @@ void Vehicle::UpdateMeasurements()
struct SoundIdVolume struct SoundIdVolume
{ {
SoundId id; OpenRCT2::Audio::SoundId id;
uint8_t volume; uint8_t volume;
}; };
static SoundIdVolume sub_6D7AC0(SoundId currentSoundId, uint8_t currentVolume, SoundId targetSoundId, uint8_t targetVolume) static SoundIdVolume sub_6D7AC0(
OpenRCT2::Audio::SoundId currentSoundId, uint8_t currentVolume, OpenRCT2::Audio::SoundId targetSoundId,
uint8_t targetVolume)
{ {
if (currentSoundId != SoundId::Null) if (currentSoundId != OpenRCT2::Audio::SoundId::Null)
{ {
if (currentSoundId == targetSoundId) if (currentSoundId == targetSoundId)
{ {
@ -3200,14 +3212,15 @@ void Vehicle::UpdateDeparting()
if (rideEntry->flags & RIDE_ENTRY_FLAG_PLAY_DEPART_SOUND) if (rideEntry->flags & RIDE_ENTRY_FLAG_PLAY_DEPART_SOUND)
{ {
auto soundId = (rideEntry->vehicles[0].sound_range == 4) ? SoundId::Tram : SoundId::TrainDeparting; auto soundId = (rideEntry->vehicles[0].sound_range == 4) ? OpenRCT2::Audio::SoundId::Tram
: OpenRCT2::Audio::SoundId::TrainDeparting;
audio_play_sound_at_location(soundId, { x, y, z }); OpenRCT2::Audio::Play3D(soundId, { x, y, z });
} }
if (curRide->mode == RideMode::UpwardLaunch || (curRide->mode == RideMode::DownwardLaunch && var_CE > 1)) if (curRide->mode == RideMode::UpwardLaunch || (curRide->mode == RideMode::DownwardLaunch && var_CE > 1))
{ {
audio_play_sound_at_location(SoundId::RideLaunch2, { x, y, z }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::RideLaunch2, { x, y, z });
} }
if (!(curRide->lifecycle_flags & RIDE_LIFECYCLE_TESTED)) if (!(curRide->lifecycle_flags & RIDE_LIFECYCLE_TESTED))
@ -3420,7 +3433,7 @@ void Vehicle::FinishDeparting()
if (var_CE >= 1 && (14 << 16) > velocity) if (var_CE >= 1 && (14 << 16) > velocity)
return; return;
audio_play_sound_at_location(SoundId::RideLaunch1, { x, y, z }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::RideLaunch1, { x, y, z });
} }
if (curRide->mode == RideMode::UpwardLaunch) if (curRide->mode == RideMode::UpwardLaunch)
@ -3428,7 +3441,7 @@ void Vehicle::FinishDeparting()
if ((curRide->launch_speed << 16) > velocity) if ((curRide->launch_speed << 16) > velocity)
return; return;
audio_play_sound_at_location(SoundId::RideLaunch1, { x, y, z }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::RideLaunch1, { x, y, z });
} }
if (curRide->mode != RideMode::Race && !curRide->IsBlockSectioned()) if (curRide->mode != RideMode::Race && !curRide->IsBlockSectioned())
@ -3558,7 +3571,7 @@ void Vehicle::UpdateCollisionSetup()
train->sub_state = 2; train->sub_state = 2;
audio_play_sound_at_location(SoundId::Crash, { train->x, train->y, train->z }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::Crash, { train->x, train->y, train->z });
sprite_misc_explosion_cloud_create({ train->x, train->y, train->z }); sprite_misc_explosion_cloud_create({ train->x, train->y, train->z });
@ -3620,7 +3633,7 @@ void Vehicle::UpdateCrashSetup()
if (NumPeepsUntilTrainTail() != 0) if (NumPeepsUntilTrainTail() != 0)
{ {
audio_play_sound_at_location(SoundId::HauntedHouseScream2, { x, y, z }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::HauntedHouseScream2, { x, y, z });
} }
int32_t edx = velocity >> 10; int32_t edx = velocity >> 10;
@ -4051,7 +4064,7 @@ loc_6D8E36:
if ((curRide->mode == RideMode::UpwardLaunch || curRide->mode == RideMode::DownwardLaunch) && var_CE < 2) if ((curRide->mode == RideMode::UpwardLaunch || curRide->mode == RideMode::DownwardLaunch) && var_CE < 2)
{ {
audio_play_sound_at_location(SoundId::RideLaunch2, { x, y, z }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::RideLaunch2, { x, y, z });
velocity = 0; velocity = 0;
acceleration = 0; acceleration = 0;
SetState(Vehicle::Status::Departing, 1); SetState(Vehicle::Status::Departing, 1);
@ -5044,24 +5057,24 @@ void Vehicle::UpdateHauntedHouseOperating()
switch (current_time) switch (current_time)
{ {
case 45: case 45:
audio_play_sound_at_location(SoundId::HauntedHouseScare, { x, y, z }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::HauntedHouseScare, { x, y, z });
break; break;
case 75: case 75:
vehicle_sprite_type = 1; vehicle_sprite_type = 1;
Invalidate(); Invalidate();
break; break;
case 400: case 400:
audio_play_sound_at_location(SoundId::HauntedHouseScream1, { x, y, z }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::HauntedHouseScream1, { x, y, z });
break; break;
case 745: case 745:
audio_play_sound_at_location(SoundId::HauntedHouseScare, { x, y, z }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::HauntedHouseScare, { x, y, z });
break; break;
case 775: case 775:
vehicle_sprite_type = 1; vehicle_sprite_type = 1;
Invalidate(); Invalidate();
break; break;
case 1100: case 1100:
audio_play_sound_at_location(SoundId::HauntedHouseScream2, { x, y, z }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::HauntedHouseScream2, { x, y, z });
break; break;
} }
} }
@ -5317,7 +5330,7 @@ void Vehicle::CrashOnLand()
} }
sub_state = 2; sub_state = 2;
audio_play_sound_at_location(SoundId::Crash, { x, y, z }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::Crash, { x, y, z });
sprite_misc_explosion_cloud_create({ x, y, z }); sprite_misc_explosion_cloud_create({ x, y, z });
sprite_misc_explosion_flare_create({ x, y, z }); sprite_misc_explosion_flare_create({ x, y, z });
@ -5380,7 +5393,7 @@ void Vehicle::CrashOnWater()
} }
sub_state = 2; sub_state = 2;
audio_play_sound_at_location(SoundId::Water1, { x, y, z }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::Water1, { x, y, z });
crash_splash_create({ x, y, z }); crash_splash_create({ x, y, z });
crash_splash_create({ x - 8, y - 9, z }); crash_splash_create({ x - 8, y - 9, z });
@ -5499,9 +5512,9 @@ void Vehicle::UpdateSound()
{ {
// frictionVolume (bl) should be set before hand // frictionVolume (bl) should be set before hand
uint8_t frictionVolume = 255; uint8_t frictionVolume = 255;
SoundId frictionId = SoundId::Null; auto frictionId = OpenRCT2::Audio::SoundId::Null;
// bh screamVolume should be set before hand // bh screamVolume should be set before hand
SoundId screamId = SoundId::Null; auto screamId = OpenRCT2::Audio::SoundId::Null;
uint8_t screamVolume = 255; uint8_t screamVolume = 255;
auto curRide = GetRide(); auto curRide = GetRide();
@ -5528,18 +5541,18 @@ void Vehicle::UpdateSound()
screamId = scream_sound_id; screamId = scream_sound_id;
if (!(gCurrentTicks & 0x7F)) if (!(gCurrentTicks & 0x7F))
{ {
if (velocity < 0x40000 || scream_sound_id != SoundId::Null) if (velocity < 0x40000 || scream_sound_id != OpenRCT2::Audio::SoundId::Null)
goto loc_6D7A97; goto loc_6D7A97;
if ((scenario_rand() & 0xFFFF) <= 0x5555) if ((scenario_rand() & 0xFFFF) <= 0x5555)
{ {
scream_sound_id = SoundId::TrainWhistle; scream_sound_id = OpenRCT2::Audio::SoundId::TrainWhistle;
screamVolume = 255; screamVolume = 255;
break; break;
} }
} }
if (screamId == SoundId::NoScream) if (screamId == OpenRCT2::Audio::SoundId::NoScream)
screamId = SoundId::Null; screamId = OpenRCT2::Audio::SoundId::Null;
screamVolume = 255; screamVolume = 255;
break; break;
@ -5547,18 +5560,18 @@ void Vehicle::UpdateSound()
screamId = scream_sound_id; screamId = scream_sound_id;
if (!(gCurrentTicks & 0x7F)) if (!(gCurrentTicks & 0x7F))
{ {
if (velocity < 0x40000 || scream_sound_id != SoundId::Null) if (velocity < 0x40000 || scream_sound_id != OpenRCT2::Audio::SoundId::Null)
goto loc_6D7A97; goto loc_6D7A97;
if ((scenario_rand() & 0xFFFF) <= 0x5555) if ((scenario_rand() & 0xFFFF) <= 0x5555)
{ {
scream_sound_id = SoundId::Tram; scream_sound_id = OpenRCT2::Audio::SoundId::Tram;
screamVolume = 255; screamVolume = 255;
break; break;
} }
} }
if (screamId == SoundId::NoScream) if (screamId == OpenRCT2::Audio::SoundId::NoScream)
screamId = SoundId::Null; screamId = OpenRCT2::Audio::SoundId::Null;
screamVolume = 255; screamVolume = 255;
break; break;
@ -5566,22 +5579,22 @@ void Vehicle::UpdateSound()
if ((vehicleEntry->flags & VEHICLE_ENTRY_FLAG_RIDERS_SCREAM)) if ((vehicleEntry->flags & VEHICLE_ENTRY_FLAG_RIDERS_SCREAM))
{ {
screamId = UpdateScreamSound(); screamId = UpdateScreamSound();
if (screamId == SoundId::NoScream) if (screamId == OpenRCT2::Audio::SoundId::NoScream)
screamId = SoundId::Null; screamId = OpenRCT2::Audio::SoundId::Null;
else if (screamId == SoundId::Null) else if (screamId == OpenRCT2::Audio::SoundId::Null)
goto loc_6D7A97; goto loc_6D7A97;
break; break;
} }
loc_6D7A97: loc_6D7A97:
scream_sound_id = SoundId::Null; scream_sound_id = OpenRCT2::Audio::SoundId::Null;
if (curRide->type < std::size(RideTypeDescriptors)) if (curRide->type < std::size(RideTypeDescriptors))
{ {
// Get lift hill sound // Get lift hill sound
screamId = RideTypeDescriptors[curRide->type].LiftData.sound_id; screamId = RideTypeDescriptors[curRide->type].LiftData.sound_id;
screamVolume = 243; screamVolume = 243;
if (!(sound2_flags & VEHICLE_SOUND2_FLAGS_LIFT_HILL)) if (!(sound2_flags & VEHICLE_SOUND2_FLAGS_LIFT_HILL))
screamId = SoundId::Null; screamId = OpenRCT2::Audio::SoundId::Null;
} }
} }
@ -5607,16 +5620,16 @@ void Vehicle::UpdateSound()
* *
* rct2: 0x006D796B * rct2: 0x006D796B
*/ */
SoundId Vehicle::UpdateScreamSound() OpenRCT2::Audio::SoundId Vehicle::UpdateScreamSound()
{ {
int32_t totalNumPeeps = NumPeepsUntilTrainTail(); int32_t totalNumPeeps = NumPeepsUntilTrainTail();
if (totalNumPeeps == 0) if (totalNumPeeps == 0)
return SoundId::Null; return OpenRCT2::Audio::SoundId::Null;
if (velocity < 0) if (velocity < 0)
{ {
if (velocity > -0x2C000) if (velocity > -0x2C000)
return SoundId::Null; return OpenRCT2::Audio::SoundId::Null;
for (Vehicle* vehicle2 = GetEntity<Vehicle>(sprite_index); vehicle2 != nullptr; for (Vehicle* vehicle2 = GetEntity<Vehicle>(sprite_index); vehicle2 != nullptr;
vehicle2 = GetEntity<Vehicle>(vehicle2->next_vehicle_on_train)) vehicle2 = GetEntity<Vehicle>(vehicle2->next_vehicle_on_train))
@ -5630,11 +5643,11 @@ SoundId Vehicle::UpdateScreamSound()
if (vehicle2->vehicle_sprite_type <= 15) if (vehicle2->vehicle_sprite_type <= 15)
return ProduceScreamSound(totalNumPeeps); return ProduceScreamSound(totalNumPeeps);
} }
return SoundId::Null; return OpenRCT2::Audio::SoundId::Null;
} }
if (velocity < 0x2C000) if (velocity < 0x2C000)
return SoundId::Null; return OpenRCT2::Audio::SoundId::Null;
for (Vehicle* vehicle2 = GetEntity<Vehicle>(sprite_index); vehicle2 != nullptr; for (Vehicle* vehicle2 = GetEntity<Vehicle>(sprite_index); vehicle2 != nullptr;
vehicle2 = GetEntity<Vehicle>(vehicle2->next_vehicle_on_train)) vehicle2 = GetEntity<Vehicle>(vehicle2->next_vehicle_on_train))
@ -5648,16 +5661,16 @@ SoundId Vehicle::UpdateScreamSound()
if (vehicle2->vehicle_sprite_type <= 23) if (vehicle2->vehicle_sprite_type <= 23)
return ProduceScreamSound(totalNumPeeps); return ProduceScreamSound(totalNumPeeps);
} }
return SoundId::Null; return OpenRCT2::Audio::SoundId::Null;
} }
SoundId Vehicle::ProduceScreamSound(const int32_t totalNumPeeps) OpenRCT2::Audio::SoundId Vehicle::ProduceScreamSound(const int32_t totalNumPeeps)
{ {
rct_ride_entry* rideEntry = GetRideEntry(); rct_ride_entry* rideEntry = GetRideEntry();
rct_ride_entry_vehicle* vehicleEntry = &rideEntry->vehicles[vehicle_type]; rct_ride_entry_vehicle* vehicleEntry = &rideEntry->vehicles[vehicle_type];
if (scream_sound_id == SoundId::Null) if (scream_sound_id == OpenRCT2::Audio::SoundId::Null)
{ {
auto r = scenario_rand(); auto r = scenario_rand();
if (totalNumPeeps >= static_cast<int32_t>(r % 16)) if (totalNumPeeps >= static_cast<int32_t>(r % 16))
@ -5674,13 +5687,13 @@ SoundId Vehicle::ProduceScreamSound(const int32_t totalNumPeeps)
scream_sound_id = byte_9A3A16[r % 2]; scream_sound_id = byte_9A3A16[r % 2];
break; break;
default: default:
scream_sound_id = SoundId::NoScream; scream_sound_id = OpenRCT2::Audio::SoundId::NoScream;
break; break;
} }
} }
else else
{ {
scream_sound_id = SoundId::NoScream; scream_sound_id = OpenRCT2::Audio::SoundId::NoScream;
} }
} }
return scream_sound_id; return scream_sound_id;
@ -6786,7 +6799,7 @@ static void block_brakes_open_previous_section(Ride& ride, const CoordsXYZ& vehi
{ {
if (ride.IsBlockSectioned()) if (ride.IsBlockSectioned())
{ {
audio_play_sound_at_location(SoundId::BlockBrakeClose, location); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::BlockBrakeClose, location);
} }
} }
} }
@ -7398,9 +7411,9 @@ static void play_scenery_door_open_sound(const CoordsXYZ& loc, WallElement* tile
if (doorSoundType != 0) if (doorSoundType != 0)
{ {
auto soundId = DoorOpenSoundIds[doorSoundType - 1]; auto soundId = DoorOpenSoundIds[doorSoundType - 1];
if (soundId != SoundId::Null) if (soundId != OpenRCT2::Audio::SoundId::Null)
{ {
audio_play_sound_at_location(soundId, loc); OpenRCT2::Audio::Play3D(soundId, loc);
} }
} }
} }
@ -7416,9 +7429,9 @@ static void play_scenery_door_close_sound(const CoordsXYZ& loc, WallElement* til
if (doorSoundType != 0) if (doorSoundType != 0)
{ {
auto soundId = DoorCloseSoundIds[doorSoundType - 1]; auto soundId = DoorCloseSoundIds[doorSoundType - 1];
if (soundId != SoundId::Null) if (soundId != OpenRCT2::Audio::SoundId::Null)
{ {
audio_play_sound_at_location(soundId, loc); Play3D(soundId, loc);
} }
} }
} }
@ -7531,7 +7544,7 @@ static void vehicle_update_play_water_splash_sound()
return; return;
} }
audio_play_sound_at_location(SoundId::WaterSplash, { unk_F64E20.x, unk_F64E20.y, unk_F64E20.z }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::WaterSplash, { unk_F64E20.x, unk_F64E20.y, unk_F64E20.z });
} }
/** /**
@ -7945,7 +7958,7 @@ bool Vehicle::UpdateTrackMotionForwardsGetNewTrack(uint16_t trackType, Ride* cur
{ {
if (!(rideEntry->vehicles[0].flags & VEHICLE_ENTRY_FLAG_POWERED)) if (!(rideEntry->vehicles[0].flags & VEHICLE_ENTRY_FLAG_POWERED))
{ {
audio_play_sound_at_location(SoundId::BlockBrakeRelease, TrackLocation); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::BlockBrakeRelease, TrackLocation);
} }
} }
map_invalidate_element(TrackLocation, tileElement); map_invalidate_element(TrackLocation, tileElement);
@ -8144,7 +8157,7 @@ loc_6DAEB9:
if (_vehicleF64E2C == 0) if (_vehicleF64E2C == 0)
{ {
_vehicleF64E2C++; _vehicleF64E2C++;
audio_play_sound_at_location(SoundId::BrakeRelease, { x, y, z }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::BrakeRelease, { x, y, z });
} }
} }
} }
@ -9828,10 +9841,10 @@ void Vehicle::Claxon() const
switch (rideEntry->vehicles[vehicle_type].sound_range) switch (rideEntry->vehicles[vehicle_type].sound_range)
{ {
case SOUND_RANGE_WHISTLE: case SOUND_RANGE_WHISTLE:
audio_play_sound_at_location(SoundId::TrainWhistle, { x, y, z }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::TrainWhistle, { x, y, z });
break; break;
case SOUND_RANGE_BELL: case SOUND_RANGE_BELL:
audio_play_sound_at_location(SoundId::Tram, { x, y, z }); OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::Tram, { x, y, z });
break; break;
} }
} }

View File

@ -21,8 +21,6 @@
#include <cstddef> #include <cstddef>
#include <vector> #include <vector>
enum class SoundId : uint8_t;
struct rct_vehicle_colour struct rct_vehicle_colour
{ {
uint8_t body_colour; uint8_t body_colour;
@ -79,13 +77,13 @@ struct rct_ride_entry_vehicle
uint32_t curved_lift_hill_image_id; // 0x4C , 0x66 uint32_t curved_lift_hill_image_id; // 0x4C , 0x66
uint32_t corkscrew_image_id; // 0x4C , 0x66 uint32_t corkscrew_image_id; // 0x4C , 0x66
}; };
uint32_t no_vehicle_images; // 0x50 , 0x6A uint32_t no_vehicle_images; // 0x50 , 0x6A
uint8_t no_seating_rows; // 0x54 , 0x6E uint8_t no_seating_rows; // 0x54 , 0x6E
uint8_t spinning_inertia; // 0x55 , 0x6F uint8_t spinning_inertia; // 0x55 , 0x6F
uint8_t spinning_friction; // 0x56 , 0x70 uint8_t spinning_friction; // 0x56 , 0x70
SoundId friction_sound_id; // 0x57 , 0x71 OpenRCT2::Audio::SoundId friction_sound_id; // 0x57 , 0x71
uint8_t log_flume_reverser_vehicle_type; // 0x58 , 0x72 uint8_t log_flume_reverser_vehicle_type; // 0x58 , 0x72
uint8_t sound_range; // 0x59 , 0x73 uint8_t sound_range; // 0x59 , 0x73
uint8_t uint8_t
double_sound_frequency; // 0x5A , 0x74 (Doubles the velocity when working out the sound frequency {used on go karts}) double_sound_frequency; // 0x5A , 0x74 (Doubles the velocity when working out the sound frequency {used on go karts})
uint8_t powered_acceleration; // 0x5B , 0x75 uint8_t powered_acceleration; // 0x5B , 0x75
@ -109,8 +107,6 @@ static_assert(sizeof(rct_ride_entry_vehicle) % 4 == 0, "Invalid struct size");
static_assert(sizeof(rct_ride_entry_vehicle) % 8 == 0, "Invalid struct size"); static_assert(sizeof(rct_ride_entry_vehicle) % 8 == 0, "Invalid struct size");
#endif #endif
struct rct_vehicle_sound_params;
enum class VehicleTrackSubposition : uint8_t enum class VehicleTrackSubposition : uint8_t
{ {
Default, Default,
@ -266,9 +262,9 @@ struct Vehicle : SpriteBase
}; };
uint16_t sound2_flags; uint16_t sound2_flags;
uint8_t spin_sprite; // lowest 3 bits not used for sprite selection (divide by 8 to use) uint8_t spin_sprite; // lowest 3 bits not used for sprite selection (divide by 8 to use)
SoundId sound1_id; OpenRCT2::Audio::SoundId sound1_id;
uint8_t sound1_volume; uint8_t sound1_volume;
SoundId sound2_id; OpenRCT2::Audio::SoundId sound2_id;
uint8_t sound2_volume; uint8_t sound2_volume;
int8_t sound_vector_factor; int8_t sound_vector_factor;
union union
@ -289,7 +285,7 @@ struct Vehicle : SpriteBase
uint8_t pad_C6[0x2]; uint8_t pad_C6[0x2];
uint16_t var_C8; uint16_t var_C8;
uint16_t var_CA; uint16_t var_CA;
SoundId scream_sound_id; OpenRCT2::Audio::SoundId scream_sound_id;
VehicleTrackSubposition TrackSubposition; VehicleTrackSubposition TrackSubposition;
union union
{ {
@ -323,7 +319,7 @@ struct Vehicle : SpriteBase
void Invalidate(); void Invalidate();
void SetState(Vehicle::Status vehicleStatus, uint8_t subState = 0); void SetState(Vehicle::Status vehicleStatus, uint8_t subState = 0);
bool IsGhost() const; bool IsGhost() const;
void UpdateSoundParams(std::vector<rct_vehicle_sound_params>& vehicleSoundParamsList) const; void UpdateSoundParams(std::vector<OpenRCT2::Audio::VehicleSoundParams>& vehicleSoundParamsList) const;
bool DodgemsCarWouldCollideAt(const CoordsXY& coords, uint16_t* spriteId) const; bool DodgemsCarWouldCollideAt(const CoordsXY& coords, uint16_t* spriteId) const;
int32_t UpdateTrackMotion(int32_t* outStation); int32_t UpdateTrackMotion(int32_t* outStation);
int32_t CableLiftUpdateTrackMotion(); int32_t CableLiftUpdateTrackMotion();
@ -359,7 +355,7 @@ private:
uint16_t GetSoundPriority() const; uint16_t GetSoundPriority() const;
const rct_vehicle_info* GetMoveInfo() const; const rct_vehicle_info* GetMoveInfo() const;
uint16_t GetTrackProgress() const; uint16_t GetTrackProgress() const;
rct_vehicle_sound_params CreateSoundParam(uint16_t priority) const; OpenRCT2::Audio::VehicleSoundParams CreateSoundParam(uint16_t priority) const;
void CableLiftUpdate(); void CableLiftUpdate();
bool CableLiftUpdateTrackMotionForwards(); bool CableLiftUpdateTrackMotionForwards();
bool CableLiftUpdateTrackMotionBackwards(); bool CableLiftUpdateTrackMotionBackwards();
@ -400,8 +396,8 @@ private:
void UpdateDoingCircusShow(); void UpdateDoingCircusShow();
void UpdateCrossings() const; void UpdateCrossings() const;
void UpdateSound(); void UpdateSound();
SoundId UpdateScreamSound(); OpenRCT2::Audio::SoundId UpdateScreamSound();
SoundId ProduceScreamSound(const int32_t totalNumPeeps); OpenRCT2::Audio::SoundId ProduceScreamSound(const int32_t totalNumPeeps);
void UpdateCrashSetup(); void UpdateCrashSetup();
void UpdateCollisionSetup(); void UpdateCollisionSetup();
int32_t UpdateMotionDodgems(); int32_t UpdateMotionDodgems();

View File

@ -34,7 +34,7 @@ constexpr const RideTypeDescriptor AirPoweredVerticalCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION)),
SET_FIELD(Heights, { 255, 32, 4, 7, }), SET_FIELD(Heights, { 255, 32, 4, 7, }),
SET_FIELD(MaxMass, 255), SET_FIELD(MaxMass, 255),
SET_FIELD(LiftData, { SoundId::Null, 5, 5 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_air_powered_vertical_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_air_powered_vertical_coaster),
SET_FIELD(RatingsMultipliers, { 44, 66, 10 }), SET_FIELD(RatingsMultipliers, { 44, 66, 10 }),
SET_FIELD(UpkeepCosts, { 90, 20, 0, 0, 0, 10 }), SET_FIELD(UpkeepCosts, { 90, 20, 0, 0, 0, 10 }),

View File

@ -36,7 +36,7 @@ constexpr const RideTypeDescriptor BobsleighCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 19, 24, 5, 7, }), SET_FIELD(Heights, { 19, 24, 5, 7, }),
SET_FIELD(MaxMass, 25), SET_FIELD(MaxMass, 25),
SET_FIELD(LiftData, { SoundId::LiftFrictionWheels, 4, 5 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftFrictionWheels, 4, 5 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_bobsleigh_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_bobsleigh_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }),

View File

@ -39,7 +39,7 @@ constexpr const RideTypeDescriptor ClassicMiniRollerCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 15, 24, 4, 7, }), SET_FIELD(Heights, { 15, 24, 4, 7, }),
SET_FIELD(MaxMass, 18), SET_FIELD(MaxMass, 18),
SET_FIELD(LiftData, { SoundId::LiftFrictionWheels, 4, 6 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftFrictionWheels, 4, 6 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_junior_roller_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_junior_roller_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 40, 20, 80, 8, 3, 5 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 8, 3, 5 }),

View File

@ -36,7 +36,7 @@ constexpr const RideTypeDescriptor CompactInvertedCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 27, 40, 29, 8, }), SET_FIELD(Heights, { 27, 40, 29, 8, }),
SET_FIELD(MaxMass, 18), SET_FIELD(MaxMass, 18),
SET_FIELD(LiftData, { SoundId::LiftClassic, 4, 6 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 6 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_compact_inverted_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_compact_inverted_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 40, 20, 80, 13, 3, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 13, 3, 10 }),

View File

@ -41,7 +41,7 @@ constexpr const RideTypeDescriptor CorkscrewRollerCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 28, 24, 8, 11, }), SET_FIELD(Heights, { 28, 24, 8, 11, }),
SET_FIELD(MaxMass, 18), SET_FIELD(MaxMass, 18),
SET_FIELD(LiftData, { SoundId::LiftArrow, 4, 6 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftArrow, 4, 6 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_corkscrew_roller_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_corkscrew_roller_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 40, 20, 80, 11, 3, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 11, 3, 10 }),

View File

@ -38,7 +38,7 @@ constexpr const RideTypeDescriptor FlyingRollerCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 30, 24, 8, 11, }), SET_FIELD(Heights, { 30, 24, 8, 11, }),
SET_FIELD(MaxMass, 35), SET_FIELD(MaxMass, 35),
SET_FIELD(LiftData, { SoundId::LiftBM, 4, 6 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftBM, 4, 6 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_flying_roller_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_flying_roller_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 49, 20, 90, 11, 3, 15 }), SET_FIELD(UpkeepCosts, { 49, 20, 90, 11, 3, 15 }),
@ -78,7 +78,7 @@ constexpr const RideTypeDescriptor FlyingRollerCoasterAltRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 30, 24, 8, 11, }), SET_FIELD(Heights, { 30, 24, 8, 11, }),
SET_FIELD(MaxMass, 35), SET_FIELD(MaxMass, 35),
SET_FIELD(LiftData, { SoundId::LiftBM, 4, 6 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftBM, 4, 6 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_flying_roller_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_flying_roller_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 49, 20, 90, 11, 3, 15 }), SET_FIELD(UpkeepCosts, { 49, 20, 90, 11, 3, 15 }),

View File

@ -36,7 +36,7 @@ constexpr const RideTypeDescriptor GigaCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 86, 24, 9, 11, }), SET_FIELD(Heights, { 86, 24, 9, 11, }),
SET_FIELD(MaxMass, 31), SET_FIELD(MaxMass, 31),
SET_FIELD(LiftData, { SoundId::LiftClassic, 5, 8 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 5, 8 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_giga_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_giga_coaster),
SET_FIELD(RatingsMultipliers, { 51, 32, 10 }), SET_FIELD(RatingsMultipliers, { 51, 32, 10 }),
SET_FIELD(UpkeepCosts, { 10, 20, 80, 12, 3, 40 }), SET_FIELD(UpkeepCosts, { 10, 20, 80, 12, 3, 40 }),

View File

@ -35,7 +35,7 @@ constexpr const RideTypeDescriptor HeartlineTwisterCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION)),
SET_FIELD(Heights, { 22, 24, 15, 9, }), SET_FIELD(Heights, { 22, 24, 15, 9, }),
SET_FIELD(MaxMass, 18), SET_FIELD(MaxMass, 18),
SET_FIELD(LiftData, { SoundId::LiftClassic, 4, 6 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 6 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_heartline_twister_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_heartline_twister_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 47, 20, 80, 11, 3, 10 }), SET_FIELD(UpkeepCosts, { 47, 20, 80, 11, 3, 10 }),

View File

@ -40,7 +40,7 @@ constexpr const RideTypeDescriptor HyperTwisterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 54, 24, 8, 9, }), SET_FIELD(Heights, { 54, 24, 8, 9, }),
SET_FIELD(MaxMass, 31), SET_FIELD(MaxMass, 31),
SET_FIELD(LiftData, { SoundId::LiftBM, 5, 8 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftBM, 5, 8 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_twister_roller_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_twister_roller_coaster),
SET_FIELD(RatingsMultipliers, { 52, 36, 10 }), SET_FIELD(RatingsMultipliers, { 52, 36, 10 }),
SET_FIELD(UpkeepCosts, { 43, 20, 80, 11, 3, 10 }), SET_FIELD(UpkeepCosts, { 43, 20, 80, 11, 3, 10 }),

View File

@ -39,7 +39,7 @@ constexpr const RideTypeDescriptor HypercoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 55, 24, 8, 11, }), SET_FIELD(Heights, { 55, 24, 8, 11, }),
SET_FIELD(MaxMass, 18), SET_FIELD(MaxMass, 18),
SET_FIELD(LiftData, { SoundId::LiftArrow, 4, 6 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftArrow, 4, 6 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_corkscrew_roller_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_corkscrew_roller_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 40, 20, 80, 11, 3, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 11, 3, 10 }),

View File

@ -36,7 +36,7 @@ constexpr const RideTypeDescriptor InvertedHairpinCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 16, 24, 24, 7, }), SET_FIELD(Heights, { 16, 24, 24, 7, }),
SET_FIELD(MaxMass, 4), SET_FIELD(MaxMass, 4),
SET_FIELD(LiftData, { SoundId::LiftWildMouse, 4, 6 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftWildMouse, 4, 6 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_inverted_hairpin_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_inverted_hairpin_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 30 }), SET_FIELD(RatingsMultipliers, { 50, 30, 30 }),
SET_FIELD(UpkeepCosts, { 40, 20, 80, 9, 3, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 9, 3, 10 }),

View File

@ -36,7 +36,7 @@ constexpr const RideTypeDescriptor InvertedImpulseCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION)),
SET_FIELD(Heights, { 45, 40, 29, 8, }), SET_FIELD(Heights, { 45, 40, 29, 8, }),
SET_FIELD(MaxMass, 23), SET_FIELD(MaxMass, 23),
SET_FIELD(LiftData, { SoundId::LiftClassic, 4, 7 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 7 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_inverted_impulse_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_inverted_impulse_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 180, 20, 80, 11, 3, 10 }), SET_FIELD(UpkeepCosts, { 180, 20, 80, 11, 3, 10 }),

View File

@ -36,7 +36,7 @@ constexpr const RideTypeDescriptor InvertedRollerCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 38, 40, 29, 8, }), SET_FIELD(Heights, { 38, 40, 29, 8, }),
SET_FIELD(MaxMass, 27), SET_FIELD(MaxMass, 27),
SET_FIELD(LiftData, { SoundId::LiftBM, 5, 7 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftBM, 5, 7 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_inverted_roller_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_inverted_roller_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 40, 20, 80, 13, 3, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 13, 3, 10 }),

View File

@ -40,7 +40,7 @@ constexpr const RideTypeDescriptor JuniorRollerCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 12, 24, 4, 7, }), SET_FIELD(Heights, { 12, 24, 4, 7, }),
SET_FIELD(MaxMass, 18), SET_FIELD(MaxMass, 18),
SET_FIELD(LiftData, { SoundId::LiftFrictionWheels, 4, 6 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftFrictionWheels, 4, 6 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_junior_roller_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_junior_roller_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 40, 20, 80, 8, 3, 5 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 8, 3, 5 }),

View File

@ -36,7 +36,7 @@ constexpr const RideTypeDescriptor LIMLaunchedRollerCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 35, 24, 5, 7, }), SET_FIELD(Heights, { 35, 24, 5, 7, }),
SET_FIELD(MaxMass, 18), SET_FIELD(MaxMass, 18),
SET_FIELD(LiftData, { SoundId::Null, 4, 6 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 4, 6 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_lim_launched_roller_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_lim_launched_roller_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 42, 20, 80, 9, 3, 10 }), SET_FIELD(UpkeepCosts, { 42, 20, 80, 9, 3, 10 }),

View File

@ -36,7 +36,7 @@ constexpr const RideTypeDescriptor LayDownRollerCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 26, 24, 8, 11, }), SET_FIELD(Heights, { 26, 24, 8, 11, }),
SET_FIELD(MaxMass, 25), SET_FIELD(MaxMass, 25),
SET_FIELD(LiftData, { SoundId::LiftClassic, 4, 6 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 6 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_lay_down_roller_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_lay_down_roller_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 49, 20, 90, 11, 3, 15 }), SET_FIELD(UpkeepCosts, { 49, 20, 90, 11, 3, 15 }),
@ -74,7 +74,7 @@ constexpr const RideTypeDescriptor LayDownRollerCoasterAltRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 26, 24, 8, 11, }), SET_FIELD(Heights, { 26, 24, 8, 11, }),
SET_FIELD(MaxMass, 25), SET_FIELD(MaxMass, 25),
SET_FIELD(LiftData, { SoundId::LiftClassic, 4, 6 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 6 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_lay_down_roller_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_lay_down_roller_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 49, 20, 90, 11, 3, 15 }), SET_FIELD(UpkeepCosts, { 49, 20, 90, 11, 3, 15 }),

View File

@ -36,7 +36,7 @@ constexpr const RideTypeDescriptor LoopingRollerCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 35, 24, 5, 7, }), SET_FIELD(Heights, { 35, 24, 5, 7, }),
SET_FIELD(MaxMass, 18), SET_FIELD(MaxMass, 18),
SET_FIELD(LiftData, { SoundId::LiftClassic, 4, 6 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 6 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_looping_roller_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_looping_roller_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }),

View File

@ -36,7 +36,7 @@ constexpr const RideTypeDescriptor MineRideRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION)),
SET_FIELD(Heights, { 13, 24, 9, 11, }), SET_FIELD(Heights, { 13, 24, 9, 11, }),
SET_FIELD(MaxMass, 27), SET_FIELD(MaxMass, 27),
SET_FIELD(LiftData, { SoundId::Null, 5, 5 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_mine_ride), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_mine_ride),
SET_FIELD(RatingsMultipliers, { 60, 20, 10 }), SET_FIELD(RatingsMultipliers, { 60, 20, 10 }),
SET_FIELD(UpkeepCosts, { 50, 20, 80, 10, 3, 10 }), SET_FIELD(UpkeepCosts, { 50, 20, 80, 10, 3, 10 }),

View File

@ -36,7 +36,7 @@ constexpr const RideTypeDescriptor MineTrainCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 21, 24, 4, 7, }), SET_FIELD(Heights, { 21, 24, 4, 7, }),
SET_FIELD(MaxMass, 15), SET_FIELD(MaxMass, 15),
SET_FIELD(LiftData, { SoundId::LiftArrow, 4, 6 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftArrow, 4, 6 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_mine_train_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_mine_train_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }),

View File

@ -36,7 +36,7 @@ constexpr const RideTypeDescriptor MiniRollerCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 16, 24, 9, 11, }), SET_FIELD(Heights, { 16, 24, 9, 11, }),
SET_FIELD(MaxMass, 10), SET_FIELD(MaxMass, 10),
SET_FIELD(LiftData, { SoundId::LiftClassic, 4, 6 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 6 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_mini_roller_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_mini_roller_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 35, 20, 80, 8, 3, 10 }), SET_FIELD(UpkeepCosts, { 35, 20, 80, 8, 3, 10 }),

View File

@ -37,7 +37,7 @@ constexpr const RideTypeDescriptor MiniSuspendedCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 10, 24, 24, 8, }), SET_FIELD(Heights, { 10, 24, 24, 8, }),
SET_FIELD(MaxMass, 3), SET_FIELD(MaxMass, 3),
SET_FIELD(LiftData, { SoundId::LiftFrictionWheels, 4, 5 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftFrictionWheels, 4, 5 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_mini_suspended_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_mini_suspended_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }),

View File

@ -37,7 +37,7 @@ constexpr const RideTypeDescriptor MultiDimensionRollerCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 40, 24, 8, 11, }), SET_FIELD(Heights, { 40, 24, 8, 11, }),
SET_FIELD(MaxMass, 78), SET_FIELD(MaxMass, 78),
SET_FIELD(LiftData, { SoundId::LiftFrictionWheels, 4, 6 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftFrictionWheels, 4, 6 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_multi_dimension_roller_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_multi_dimension_roller_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 75, 20, 90, 11, 3, 15 }), SET_FIELD(UpkeepCosts, { 75, 20, 90, 11, 3, 15 }),
@ -75,7 +75,7 @@ constexpr const RideTypeDescriptor MultiDimensionRollerCoasterAltRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 40, 24, 8, 11, }), SET_FIELD(Heights, { 40, 24, 8, 11, }),
SET_FIELD(MaxMass, 78), SET_FIELD(MaxMass, 78),
SET_FIELD(LiftData, { SoundId::LiftFrictionWheels, 4, 6 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftFrictionWheels, 4, 6 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_multi_dimension_roller_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_multi_dimension_roller_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 75, 20, 90, 11, 3, 15 }), SET_FIELD(UpkeepCosts, { 75, 20, 90, 11, 3, 15 }),

View File

@ -34,7 +34,7 @@ constexpr const RideTypeDescriptor ReverseFreefallCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION)),
SET_FIELD(Heights, { 255, 32, 4, 7, }), SET_FIELD(Heights, { 255, 32, 4, 7, }),
SET_FIELD(MaxMass, 255), SET_FIELD(MaxMass, 255),
SET_FIELD(LiftData, { SoundId::Null, 5, 5 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_reverse_freefall_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_reverse_freefall_coaster),
SET_FIELD(RatingsMultipliers, { 44, 66, 10 }), SET_FIELD(RatingsMultipliers, { 44, 66, 10 }),
SET_FIELD(UpkeepCosts, { 80, 20, 0, 0, 0, 10 }), SET_FIELD(UpkeepCosts, { 80, 20, 0, 0, 0, 10 }),

View File

@ -35,7 +35,7 @@ constexpr const RideTypeDescriptor ReverserRollerCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 18, 24, 8, 11, }), SET_FIELD(Heights, { 18, 24, 8, 11, }),
SET_FIELD(MaxMass, 15), SET_FIELD(MaxMass, 15),
SET_FIELD(LiftData, { SoundId::LiftWood, 3, 4 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftWood, 3, 4 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_reverser_roller_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_reverser_roller_coaster),
SET_FIELD(RatingsMultipliers, { 48, 28, 7 }), SET_FIELD(RatingsMultipliers, { 48, 28, 7 }),
SET_FIELD(UpkeepCosts, { 39, 20, 80, 10, 3, 10 }), SET_FIELD(UpkeepCosts, { 39, 20, 80, 10, 3, 10 }),

View File

@ -36,7 +36,7 @@ constexpr const RideTypeDescriptor SideFrictionRollerCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 15, 24, 4, 11, }), SET_FIELD(Heights, { 15, 24, 4, 11, }),
SET_FIELD(MaxMass, 15), SET_FIELD(MaxMass, 15),
SET_FIELD(LiftData, { SoundId::LiftWood, 3, 4 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftWood, 3, 4 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_side_friction_roller_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_side_friction_roller_coaster),
SET_FIELD(RatingsMultipliers, { 48, 28, 7 }), SET_FIELD(RatingsMultipliers, { 48, 28, 7 }),
SET_FIELD(UpkeepCosts, { 39, 20, 80, 10, 3, 10 }), SET_FIELD(UpkeepCosts, { 39, 20, 80, 10, 3, 10 }),

View File

@ -36,7 +36,7 @@ constexpr const RideTypeDescriptor SpinningWildMouseRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 16, 24, 4, 7, }), SET_FIELD(Heights, { 16, 24, 4, 7, }),
SET_FIELD(MaxMass, 4), SET_FIELD(MaxMass, 4),
SET_FIELD(LiftData, { SoundId::LiftWildMouse, 4, 6 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftWildMouse, 4, 6 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_wild_mouse), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_wild_mouse),
SET_FIELD(RatingsMultipliers, { 50, 30, 30 }), SET_FIELD(RatingsMultipliers, { 50, 30, 30 }),
SET_FIELD(UpkeepCosts, { 40, 20, 80, 9, 3, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 9, 3, 10 }),

View File

@ -36,7 +36,7 @@ constexpr const RideTypeDescriptor SpiralRollerCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 19, 24, 9, 11, }), SET_FIELD(Heights, { 19, 24, 9, 11, }),
SET_FIELD(MaxMass, 31), SET_FIELD(MaxMass, 31),
SET_FIELD(LiftData, { SoundId::LiftFrictionWheels, 7, 7 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftFrictionWheels, 7, 7 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_spiral_roller_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_spiral_roller_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 41, 20, 80, 10, 3, 10 }), SET_FIELD(UpkeepCosts, { 41, 20, 80, 10, 3, 10 }),

View File

@ -36,7 +36,7 @@ constexpr const RideTypeDescriptor StandUpRollerCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 25, 24, 9, 11, }), SET_FIELD(Heights, { 25, 24, 9, 11, }),
SET_FIELD(MaxMass, 18), SET_FIELD(MaxMass, 18),
SET_FIELD(LiftData, { SoundId::LiftClassic, 4, 6 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 6 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_stand_up_roller_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_stand_up_roller_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }),

View File

@ -39,7 +39,7 @@ constexpr const RideTypeDescriptor SteelWildMouseRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 16, 24, 4, 7, }), SET_FIELD(Heights, { 16, 24, 4, 7, }),
SET_FIELD(MaxMass, 4), SET_FIELD(MaxMass, 4),
SET_FIELD(LiftData, { SoundId::LiftWildMouse, 4, 6 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftWildMouse, 4, 6 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_wild_mouse), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_wild_mouse),
SET_FIELD(RatingsMultipliers, { 50, 30, 30 }), SET_FIELD(RatingsMultipliers, { 50, 30, 30 }),
SET_FIELD(UpkeepCosts, { 40, 20, 80, 9, 3, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 9, 3, 10 }),

View File

@ -36,7 +36,7 @@ constexpr const RideTypeDescriptor SteeplechaseRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 14, 24, 7, 7, }), SET_FIELD(Heights, { 14, 24, 7, 7, }),
SET_FIELD(MaxMass, 4), SET_FIELD(MaxMass, 4),
SET_FIELD(LiftData, { SoundId::LiftClassic, 4, 5 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 5 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_steeplechase), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_steeplechase),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }),

View File

@ -36,7 +36,7 @@ constexpr const RideTypeDescriptor SuspendedSwingingCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 24, 40, 29, 8, }), SET_FIELD(Heights, { 24, 40, 29, 8, }),
SET_FIELD(MaxMass, 26), SET_FIELD(MaxMass, 26),
SET_FIELD(LiftData, { SoundId::LiftClassic, 4, 6 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 6 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_suspended_swinging_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_suspended_swinging_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 40, 20, 80, 20, 3, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 20, 3, 10 }),

View File

@ -44,7 +44,7 @@ constexpr const RideTypeDescriptor TwisterRollerCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 40, 24, 8, 9, }), SET_FIELD(Heights, { 40, 24, 8, 9, }),
SET_FIELD(MaxMass, 31), SET_FIELD(MaxMass, 31),
SET_FIELD(LiftData, { SoundId::LiftBM, 5, 8 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftBM, 5, 8 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_twister_roller_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_twister_roller_coaster),
SET_FIELD(RatingsMultipliers, { 52, 36, 10 }), SET_FIELD(RatingsMultipliers, { 52, 36, 10 }),
SET_FIELD(UpkeepCosts, { 43, 20, 80, 11, 3, 10 }), SET_FIELD(UpkeepCosts, { 43, 20, 80, 11, 3, 10 }),

View File

@ -36,7 +36,7 @@ constexpr const RideTypeDescriptor VerticalDropCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 53, 24, 8, 11, }), SET_FIELD(Heights, { 53, 24, 8, 11, }),
SET_FIELD(MaxMass, 25), SET_FIELD(MaxMass, 25),
SET_FIELD(LiftData, { SoundId::LiftBM, 4, 5 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftBM, 4, 5 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_vertical_drop_roller_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_vertical_drop_roller_coaster),
SET_FIELD(RatingsMultipliers, { 52, 38, 10 }), SET_FIELD(RatingsMultipliers, { 52, 38, 10 }),
SET_FIELD(UpkeepCosts, { 44, 20, 80, 11, 3, 10 }), SET_FIELD(UpkeepCosts, { 44, 20, 80, 11, 3, 10 }),

View File

@ -35,7 +35,7 @@ constexpr const RideTypeDescriptor VirginiaReelRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 14, 24, 6, 7, }), SET_FIELD(Heights, { 14, 24, 6, 7, }),
SET_FIELD(MaxMass, 15), SET_FIELD(MaxMass, 15),
SET_FIELD(LiftData, { SoundId::LiftClassic, 3, 4 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 3, 4 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_virginia_reel), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_virginia_reel),
SET_FIELD(RatingsMultipliers, { 30, 15, 25 }), SET_FIELD(RatingsMultipliers, { 30, 15, 25 }),
SET_FIELD(UpkeepCosts, { 39, 20, 80, 10, 3, 10 }), SET_FIELD(UpkeepCosts, { 39, 20, 80, 10, 3, 10 }),

View File

@ -38,7 +38,7 @@ constexpr const RideTypeDescriptor WaterCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 18, 24, 4, 7, }), SET_FIELD(Heights, { 18, 24, 4, 7, }),
SET_FIELD(MaxMass, 13), SET_FIELD(MaxMass, 13),
SET_FIELD(LiftData, { SoundId::LiftClassic, 4, 6 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 6 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_water_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_water_coaster),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 60, 20, 80, 8, 3, 10 }), SET_FIELD(UpkeepCosts, { 60, 20, 80, 8, 3, 10 }),

View File

@ -36,7 +36,7 @@ constexpr const RideTypeDescriptor WoodenRollerCoasterRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 41, 24, 8, 11, }), SET_FIELD(Heights, { 41, 24, 8, 11, }),
SET_FIELD(MaxMass, 19), SET_FIELD(MaxMass, 19),
SET_FIELD(LiftData, { SoundId::LiftWood, 5, 7 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftWood, 5, 7 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_wooden_roller_coaster), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_wooden_roller_coaster),
SET_FIELD(RatingsMultipliers, { 52, 33, 8 }), SET_FIELD(RatingsMultipliers, { 52, 33, 8 }),
SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 10, 3, 10 }),

View File

@ -37,7 +37,7 @@ constexpr const RideTypeDescriptor WoodenWildMouseRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)),
SET_FIELD(Heights, { 14, 24, 4, 7, }), SET_FIELD(Heights, { 14, 24, 4, 7, }),
SET_FIELD(MaxMass, 4), SET_FIELD(MaxMass, 4),
SET_FIELD(LiftData, { SoundId::LiftClassic, 4, 5 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::LiftClassic, 4, 5 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_wooden_wild_mouse), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_wooden_wild_mouse),
SET_FIELD(RatingsMultipliers, { 50, 30, 30 }), SET_FIELD(RatingsMultipliers, { 50, 30, 30 }),
SET_FIELD(UpkeepCosts, { 40, 20, 80, 9, 3, 10 }), SET_FIELD(UpkeepCosts, { 40, 20, 80, 9, 3, 10 }),

View File

@ -40,7 +40,7 @@ constexpr const RideTypeDescriptor CarRideRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION)),
SET_FIELD(Heights, { 6, 24, 4, 7, }), SET_FIELD(Heights, { 6, 24, 4, 7, }),
SET_FIELD(MaxMass, 2), SET_FIELD(MaxMass, 2),
SET_FIELD(LiftData, { SoundId::Null, 5, 5 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_car_ride), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_car_ride),
SET_FIELD(RatingsMultipliers, { 70, 10, 10 }), SET_FIELD(RatingsMultipliers, { 70, 10, 10 }),
SET_FIELD(UpkeepCosts, { 70, 20, 0, 8, 3, 5 }), SET_FIELD(UpkeepCosts, { 70, 20, 0, 8, 3, 5 }),

View File

@ -37,7 +37,7 @@ constexpr const RideTypeDescriptor CircusRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT)),
SET_FIELD(Heights, { 12, 128, 3, 2, }), SET_FIELD(Heights, { 12, 128, 3, 2, }),
SET_FIELD(MaxMass, 255), SET_FIELD(MaxMass, 255),
SET_FIELD(LiftData, { SoundId::Null, 5, 5 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_circus), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_circus),
SET_FIELD(RatingsMultipliers, { 20, 10, 0 }), SET_FIELD(RatingsMultipliers, { 20, 10, 0 }),
SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }),

View File

@ -37,7 +37,7 @@ constexpr const RideTypeDescriptor CrookedHouseRTD =
SET_FIELD(AvailableBreakdowns, 0), SET_FIELD(AvailableBreakdowns, 0),
SET_FIELD(Heights, { 16, 96, 3, 2, }), SET_FIELD(Heights, { 16, 96, 3, 2, }),
SET_FIELD(MaxMass, 255), SET_FIELD(MaxMass, 255),
SET_FIELD(LiftData, { SoundId::Null, 5, 5 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_crooked_house), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_crooked_house),
SET_FIELD(RatingsMultipliers, { 15, 8, 0 }), SET_FIELD(RatingsMultipliers, { 15, 8, 0 }),
SET_FIELD(UpkeepCosts, { 30, 1, 0, 0, 0, 0 }), SET_FIELD(UpkeepCosts, { 30, 1, 0, 0, 0, 0 }),

View File

@ -37,7 +37,7 @@ constexpr const RideTypeDescriptor DodgemsRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT)),
SET_FIELD(Heights, { 9, 48, 2, 2, }), SET_FIELD(Heights, { 9, 48, 2, 2, }),
SET_FIELD(MaxMass, 255), SET_FIELD(MaxMass, 255),
SET_FIELD(LiftData, { SoundId::Null, 5, 5 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_dodgems), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_dodgems),
SET_FIELD(RatingsMultipliers, { 40, 20, 0 }), SET_FIELD(RatingsMultipliers, { 40, 20, 0 }),
SET_FIELD(UpkeepCosts, { 50, 1, 0, 5, 0, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 5, 0, 0 }),

View File

@ -37,7 +37,7 @@ constexpr const RideTypeDescriptor FerrisWheelRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT)),
SET_FIELD(Heights, { 16, 176, 3, 2, }), SET_FIELD(Heights, { 16, 176, 3, 2, }),
SET_FIELD(MaxMass, 255), SET_FIELD(MaxMass, 255),
SET_FIELD(LiftData, { SoundId::Null, 5, 5 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_ferris_wheel), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_ferris_wheel),
SET_FIELD(RatingsMultipliers, { 60, 20, 10 }), SET_FIELD(RatingsMultipliers, { 60, 20, 10 }),
SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }),

View File

@ -38,7 +38,7 @@ constexpr const RideTypeDescriptor FlyingSaucersRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT)),
SET_FIELD(Heights, { 9, 48, 2, 2, }), SET_FIELD(Heights, { 9, 48, 2, 2, }),
SET_FIELD(MaxMass, 255), SET_FIELD(MaxMass, 255),
SET_FIELD(LiftData, { SoundId::Null, 5, 5 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_flying_saucers), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_flying_saucers),
SET_FIELD(RatingsMultipliers, { 50, 25, 0 }), SET_FIELD(RatingsMultipliers, { 50, 25, 0 }),
SET_FIELD(UpkeepCosts, { 90, 1, 0, 5, 0, 0 }), SET_FIELD(UpkeepCosts, { 90, 1, 0, 5, 0, 0 }),

View File

@ -39,7 +39,7 @@ constexpr const RideTypeDescriptor GhostTrainRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION)),
SET_FIELD(Heights, { 8, 24, 6, 7, }), SET_FIELD(Heights, { 8, 24, 6, 7, }),
SET_FIELD(MaxMass, 2), SET_FIELD(MaxMass, 2),
SET_FIELD(LiftData, { SoundId::Null, 5, 5 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_ghost_train), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_ghost_train),
SET_FIELD(RatingsMultipliers, { 70, 10, 10 }), SET_FIELD(RatingsMultipliers, { 70, 10, 10 }),
SET_FIELD(UpkeepCosts, { 80, 20, 0, 8, 3, 5 }), SET_FIELD(UpkeepCosts, { 80, 20, 0, 8, 3, 5 }),

View File

@ -37,7 +37,7 @@ constexpr const RideTypeDescriptor HauntedHouseRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT)),
SET_FIELD(Heights, { 16, 160, 3, 2, }), SET_FIELD(Heights, { 16, 160, 3, 2, }),
SET_FIELD(MaxMass, 255), SET_FIELD(MaxMass, 255),
SET_FIELD(LiftData, { SoundId::Null, 5, 5 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_haunted_house), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_haunted_house),
SET_FIELD(RatingsMultipliers, { 20, 10, 0 }), SET_FIELD(RatingsMultipliers, { 20, 10, 0 }),
SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }),

View File

@ -35,7 +35,7 @@ constexpr const RideTypeDescriptor MazeRTD =
SET_FIELD(AvailableBreakdowns, 0), SET_FIELD(AvailableBreakdowns, 0),
SET_FIELD(Heights, { 6, 24, 0, 1, }), SET_FIELD(Heights, { 6, 24, 0, 1, }),
SET_FIELD(MaxMass, 18), SET_FIELD(MaxMass, 18),
SET_FIELD(LiftData, { SoundId::Null, 5, 5 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_maze), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_maze),
SET_FIELD(RatingsMultipliers, { 50, 0, 0 }), SET_FIELD(RatingsMultipliers, { 50, 0, 0 }),
SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }),

View File

@ -37,7 +37,7 @@ constexpr const RideTypeDescriptor MerryGoRoundRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_CONTROL_FAILURE)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_CONTROL_FAILURE)),
SET_FIELD(Heights, { 12, 64, 3, 2, }), SET_FIELD(Heights, { 12, 64, 3, 2, }),
SET_FIELD(MaxMass, 255), SET_FIELD(MaxMass, 255),
SET_FIELD(LiftData, { SoundId::Null, 5, 5 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_merry_go_round), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_merry_go_round),
SET_FIELD(RatingsMultipliers, { 50, 10, 0 }), SET_FIELD(RatingsMultipliers, { 50, 10, 0 }),
SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }), SET_FIELD(UpkeepCosts, { 50, 1, 0, 0, 0, 0 }),

View File

@ -36,7 +36,7 @@ constexpr const RideTypeDescriptor MiniGolfRTD =
SET_FIELD(AvailableBreakdowns, 0), SET_FIELD(AvailableBreakdowns, 0),
SET_FIELD(Heights, { 7, 32, 2, 2, }), SET_FIELD(Heights, { 7, 32, 2, 2, }),
SET_FIELD(MaxMass, 255), SET_FIELD(MaxMass, 255),
SET_FIELD(LiftData, { SoundId::Null, 5, 5 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_mini_golf), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_mini_golf),
SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), SET_FIELD(RatingsMultipliers, { 50, 30, 10 }),
SET_FIELD(UpkeepCosts, { 30, 20, 80, 11, 3, 10 }), SET_FIELD(UpkeepCosts, { 30, 20, 80, 11, 3, 10 }),

View File

@ -39,7 +39,7 @@ constexpr const RideTypeDescriptor MiniHelicoptersRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION)),
SET_FIELD(Heights, { 7, 24, 4, 7, }), SET_FIELD(Heights, { 7, 24, 4, 7, }),
SET_FIELD(MaxMass, 2), SET_FIELD(MaxMass, 2),
SET_FIELD(LiftData, { SoundId::Null, 5, 5 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_mini_helicopters), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_mini_helicopters),
SET_FIELD(RatingsMultipliers, { 70, 10, 10 }), SET_FIELD(RatingsMultipliers, { 70, 10, 10 }),
SET_FIELD(UpkeepCosts, { 70, 20, 0, 8, 3, 5 }), SET_FIELD(UpkeepCosts, { 70, 20, 0, 8, 3, 5 }),

View File

@ -38,7 +38,7 @@ constexpr const RideTypeDescriptor MonorailCyclesRTD =
SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_VEHICLE_MALFUNCTION)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_VEHICLE_MALFUNCTION)),
SET_FIELD(Heights, { 5, 24, 8, 7, }), SET_FIELD(Heights, { 5, 24, 8, 7, }),
SET_FIELD(MaxMass, 2), SET_FIELD(MaxMass, 2),
SET_FIELD(LiftData, { SoundId::Null, 5, 5 }), SET_FIELD(LiftData, { OpenRCT2::Audio::SoundId::Null, 5, 5 }),
SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_monorail_cycles), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_monorail_cycles),
SET_FIELD(RatingsMultipliers, { 50, 10, 10 }), SET_FIELD(RatingsMultipliers, { 50, 10, 10 }),
SET_FIELD(UpkeepCosts, { 47, 20, 0, 8, 3, 5 }), SET_FIELD(UpkeepCosts, { 47, 20, 0, 8, 3, 5 }),

Some files were not shown because too many files have changed in this diff Show More