From 722976e2372219487cca34ba885069d2a1af5014 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 4 Sep 2014 15:42:36 +0100 Subject: [PATCH] implement music tab for ride window --- src/ride.h | 40 ++++++++++- src/string_ids.h | 37 ++++++++++ src/window_ride.c | 177 +++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 251 insertions(+), 3 deletions(-) diff --git a/src/ride.h b/src/ride.h index 1c14065b49..a5bf826353 100644 --- a/src/ride.h +++ b/src/ride.h @@ -147,7 +147,9 @@ typedef struct { sint32 profit; // 0x1B4 uint8 queue_time[4]; // 0x1B8 uint8 var_1BC; - uint8 pad_1BD[0x10]; + uint8 pad_1BD[0x0B]; + uint8 music; + uint8 pad_1C9[0x04]; uint8 var_1CD; uint16 guests_favourite; // 0x1CE uint32 lifecycle_flags; // 0x1D0 @@ -355,6 +357,42 @@ enum { RIDE_GROUP_SHOP }; +enum { + MUSIC_STYLE_DODGEMS_BEAT, + MUSIC_STYLE_FAIRGROUND_ORGAN, + MUSIC_STYLE_ROMAN_FANFARE, + MUSIC_STYLE_ORIENTAL, + MUSIC_STYLE_MARTIAN, + MUSIC_STYLE_JUNGLE_DRUMS, + MUSIC_STYLE_EGYPTIAN, + MUSIC_STYLE_TOYLAND, + MUSIC_STYLE_8, + MUSIC_STYLE_SPACE, + MUSIC_STYLE_HORROR, + MUSIC_STYLE_TECHNO, + MUSIC_STYLE_GENTLE, + MUSIC_STYLE_SUMMER, + MUSIC_STYLE_WATER, + MUSIC_STYLE_WILD_WEST, + MUSIC_STYLE_JURASSIC, + MUSIC_STYLE_ROCK, + MUSIC_STYLE_RAGTIME, + MUSIC_STYLE_FANTASY, + MUSIC_STYLE_ROCK_STYLE_2, + MUSIC_STYLE_ICE, + MUSIC_STYLE_SNOW, + MUSIC_STYLE_CUSTOM_MUSIC_1, + MUSIC_STYLE_CUSTOM_MUSIC_2, + MUSIC_STYLE_MEDIEVAL, + MUSIC_STYLE_URBAN, + MUSIC_STYLE_ORGAN, + MUSIC_STYLE_MECHANICAL, + MUSIC_STYLE_MODERN, + MUSIC_STYLE_PIRATES, + MUSIC_STYLE_ROCK_STYLE_3, + MUSIC_STYLE_CANDY_STYLE +}; + #define MAX_RIDES 255 #define MAX_RIDE_MEASUREMENTS 8 diff --git a/src/string_ids.h b/src/string_ids.h index 78e580e5e0..390a6779dc 100644 --- a/src/string_ids.h +++ b/src/string_ids.h @@ -272,6 +272,8 @@ enum { STR_CLOSE_PARK = 1013, STR_OPEN_PARK = 1014, + STR_CANT_CHANGE_OPERATING_MODE = 1017, + STR_LOCATE_SUBJECT_TIP = 1027, STR_LOAD_GAME_DIALOG_TITLE = 1036, @@ -879,6 +881,41 @@ enum { STR_UNABLE_TO_LOAD_FILE = 3010, STR_FILE_CONTAINS_INVALID_DATA = 3011, + STR_MUSIC_STYLE_START = 3012, + STR_DODGEMS_BEAT_STYLE = STR_MUSIC_STYLE_START + 0, + STR_FAIRGROUND_ORGAN_STYLE = STR_MUSIC_STYLE_START + 1, + STR_ROMAN_FANFARE_STYLE = STR_MUSIC_STYLE_START + 2, + STR_ORIENTAL_STYLE = STR_MUSIC_STYLE_START + 3, + STR_MARTIAN_STYLE = STR_MUSIC_STYLE_START + 4, + STR_JUNGLE_DRUMS_STYLE = STR_MUSIC_STYLE_START + 5, + STR_EGYPTIAN_STYLE = STR_MUSIC_STYLE_START + 6, + STR_TOYLAND_STYLE = STR_MUSIC_STYLE_START + 7, + // STR_??? = STR_MUSIC_STYLE_START + 8, + STR_SPACE_STYLE = STR_MUSIC_STYLE_START + 9, + STR_HORROR_STYLE = STR_MUSIC_STYLE_START + 10, + STR_TECHNO_STYLE = STR_MUSIC_STYLE_START + 11, + STR_GENTLE_STYLE = STR_MUSIC_STYLE_START + 12, + STR_SUMMER_STYLE = STR_MUSIC_STYLE_START + 13, + STR_WATER_STYLE = STR_MUSIC_STYLE_START + 14, + STR_WILD_WEST_STYLE = STR_MUSIC_STYLE_START + 15, + STR_JURASSIC_STYLE = STR_MUSIC_STYLE_START + 16, + STR_ROCK_STYLE = STR_MUSIC_STYLE_START + 17, + STR_RAGTIME_STYLE = STR_MUSIC_STYLE_START + 18, + STR_FANTASY_STYLE = STR_MUSIC_STYLE_START + 19, + STR_ROCK_STYLE_2 = STR_MUSIC_STYLE_START + 20, + STR_ICE_STYLE = STR_MUSIC_STYLE_START + 21, + STR_SNOW_STYLE = STR_MUSIC_STYLE_START + 22, + STR_CUSTOM_MUSIC_1 = STR_MUSIC_STYLE_START + 23, + STR_CUSTOM_MUSIC_2 = STR_MUSIC_STYLE_START + 24, + STR_MEDIEVAL_STYLE = STR_MUSIC_STYLE_START + 25, + STR_URBAN_STYLE = STR_MUSIC_STYLE_START + 26, + STR_ORGAN_STYLE = STR_MUSIC_STYLE_START + 27, + STR_MECHANICAL_STYLE = STR_MUSIC_STYLE_START + 28, + STR_MODERN_STYLE = STR_MUSIC_STYLE_START + 29, + STR_PIRATES_STYLE = STR_MUSIC_STYLE_START + 30, + STR_ROCK_STYLE_3 = STR_MUSIC_STYLE_START + 31, + STR_CANDY_STYLE = STR_MUSIC_STYLE_START + 32, + STR_SELECT_MUSIC_STYLE_TIP = 3045, STR_WHITE = 3055, diff --git a/src/window_ride.c b/src/window_ride.c index 26ae9fcf78..37e84c157c 100644 --- a/src/window_ride.c +++ b/src/window_ride.c @@ -173,6 +173,7 @@ static void window_ride_main_invalidate(); static void window_ride_main_paint(); static void window_ride_music_mouseup(); +static void window_ride_music_resize(); static void window_ride_music_mousedown(int widgetIndex, rct_window *w, rct_widget *widget); static void window_ride_music_dropdown(); static void window_ride_music_update(rct_window *w); @@ -215,7 +216,7 @@ static void* window_ride_main_events[] = { static void* window_ride_music_events[] = { window_ride_emptysub, window_ride_music_mouseup, - window_ride_emptysub, + window_ride_music_resize, window_ride_music_mousedown, window_ride_music_dropdown, window_ride_emptysub, @@ -1293,13 +1294,99 @@ static void window_ride_main_paint() #pragma region Music +const uint8 MusicStyleOrder[] = { + MUSIC_STYLE_GENTLE, + MUSIC_STYLE_SUMMER, + MUSIC_STYLE_WATER, + MUSIC_STYLE_RAGTIME, + MUSIC_STYLE_TECHNO, + MUSIC_STYLE_MECHANICAL, + MUSIC_STYLE_MODERN, + MUSIC_STYLE_WILD_WEST, + MUSIC_STYLE_PIRATES, + MUSIC_STYLE_ROCK, + MUSIC_STYLE_ROCK_STYLE_2, + MUSIC_STYLE_ROCK_STYLE_3, + MUSIC_STYLE_FANTASY, + MUSIC_STYLE_HORROR, + MUSIC_STYLE_TOYLAND, + MUSIC_STYLE_CANDY_STYLE, + MUSIC_STYLE_ROMAN_FANFARE, + MUSIC_STYLE_ORIENTAL, + MUSIC_STYLE_MARTIAN, + MUSIC_STYLE_SPACE, + MUSIC_STYLE_JUNGLE_DRUMS, + MUSIC_STYLE_JURASSIC, + MUSIC_STYLE_EGYPTIAN, + MUSIC_STYLE_DODGEMS_BEAT, + MUSIC_STYLE_SNOW, + MUSIC_STYLE_ICE, + MUSIC_STYLE_MEDIEVAL, + MUSIC_STYLE_URBAN, + MUSIC_STYLE_ORGAN +}; + +static uint8 window_ride_current_music_style_order[42]; + +/** + * + * rct2: 0x006B215D + */ +static void window_ride_toggle_music(rct_window *w) +{ + rct_ride *ride = GET_RIDE(w->number); + + int activateMusic = (ride->lifecycle_flags & RIDE_LIFECYCLE_MUSIC) ? 0 : 1; + + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_CHANGE_OPERATING_MODE; + game_do_command(0, (activateMusic << 8) | 1, 0, (6 << 8) | w->number, GAME_COMMAND_11, 0, 0); +} + /** * * rct2: 0x006B1ED7 */ static void window_ride_music_mouseup() { + short widgetIndex; + rct_window *w; + window_widget_get_registers(w, widgetIndex); + + switch (widgetIndex) { + case WIDX_CLOSE: + window_close(w); + break; + case WIDX_TAB_1: + case WIDX_TAB_2: + case WIDX_TAB_3: + case WIDX_TAB_4: + case WIDX_TAB_5: + case WIDX_TAB_6: + case WIDX_TAB_7: + case WIDX_TAB_8: + case WIDX_TAB_9: + case WIDX_TAB_10: + window_ride_set_page(w, widgetIndex - WIDX_TAB_1); + break; + case WIDX_PLAY_MUSIC: + window_ride_toggle_music(w); + break; + } +} + +/** + * + * rct2: 0x006AF4A2 + */ +static void window_ride_music_resize() +{ + rct_window *w; + + window_get_register(w); + + w->flags |= WF_RESIZABLE; + window_set_resize(w, 316, 81, 316, 81); } /** @@ -1308,7 +1395,44 @@ static void window_ride_music_mouseup() */ static void window_ride_music_mousedown(int widgetIndex, rct_window *w, rct_widget *widget) { + rct_widget *dropdownWidget; + int i; + if (widgetIndex != WIDX_MUSIC_DROPDOWN) + return; + + dropdownWidget = widget - 1; + rct_ride *ride = GET_RIDE(w->number); + + int numItems = 0; + if (ride->type == RIDE_TYPE_MERRY_GO_ROUND) { + window_ride_current_music_style_order[numItems++] = MUSIC_STYLE_FAIRGROUND_ORGAN; + } else { + for (i = 0; i < countof(MusicStyleOrder); i++) + window_ride_current_music_style_order[numItems++] = MusicStyleOrder[i]; + + if (RCT2_GLOBAL(0x009AF164, uint32) != 0) + window_ride_current_music_style_order[numItems++] = MUSIC_STYLE_CUSTOM_MUSIC_1; + if (RCT2_GLOBAL(0x009AF16E, uint32) != 0) + window_ride_current_music_style_order[numItems++] = MUSIC_STYLE_CUSTOM_MUSIC_2; + } + + window_dropdown_show_text_custom_width( + w->x + dropdownWidget->left, + w->y + dropdownWidget->top, + dropdownWidget->bottom - dropdownWidget->top + 1, + w->colours[1], + 0, + numItems, + widget->right - dropdownWidget->left + ); + + for (i = 0; i < numItems; i++) { + gDropdownItemsFormat[i] = 1142; + if (window_ride_current_music_style_order[i] == ride->music) + gDropdownItemsChecked = (1 << i); + gDropdownItemsArgs[i] = STR_MUSIC_STYLE_START + window_ride_current_music_style_order[i]; + } } /** @@ -1317,7 +1441,19 @@ static void window_ride_music_mousedown(int widgetIndex, rct_window *w, rct_widg */ static void window_ride_music_dropdown() { + rct_window *w; + rct_ride *ride; + uint8 musicStyle; + short widgetIndex, dropdownIndex; + window_dropdown_get_registers(w, widgetIndex, dropdownIndex); + + if (widgetIndex != WIDX_MUSIC_DROPDOWN || dropdownIndex == -1) + return; + + ride = GET_RIDE(w->number); + musicStyle = window_ride_current_music_style_order[dropdownIndex]; + game_do_command(0, (musicStyle << 8) | 1, 0, (7 << 8) | w->number, GAME_COMMAND_11, 0, 0); } /** @@ -1326,7 +1462,9 @@ static void window_ride_music_dropdown() */ static void window_ride_music_update(rct_window *w) { - + w->frame_no++; + RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)w, 0, 0); + widget_invalidate(WC_RIDE, w->number, WIDX_TAB_6); } /** @@ -1335,7 +1473,41 @@ static void window_ride_music_update(rct_window *w) */ static void window_ride_music_invalidate() { + rct_window *w; + rct_widget *widgets; + int isMusicActivated; + window_get_register(w); + + widgets = window_ride_page_widgets[w->page]; + if (w->widgets != widgets) { + w->widgets = widgets; + window_init_scroll_widgets(w); + } + + window_ride_set_pressed_tab(w); + + rct_ride *ride = GET_RIDE(w->number); + RCT2_GLOBAL(0x013CE952 + 0, uint16) = ride->name; + RCT2_GLOBAL(0x013CE952 + 2, uint32) = ride->name_arguments; + + // Set selected music + window_ride_music_widgets[WIDX_MUSIC].image = STR_MUSIC_STYLE_START + ride->music; + + // Set music activated + isMusicActivated = ride->lifecycle_flags & (RIDE_LIFECYCLE_MUSIC); + if (isMusicActivated) { + w->pressed_widgets |= (1 << WIDX_PLAY_MUSIC); + w->disabled_widgets &= ~(1 << WIDX_MUSIC); + w->disabled_widgets &= ~(1 << WIDX_MUSIC_DROPDOWN); + } else { + w->pressed_widgets &= ~(1 << WIDX_PLAY_MUSIC); + w->disabled_widgets |= (1 << WIDX_MUSIC); + w->disabled_widgets |= (1 << WIDX_MUSIC_DROPDOWN); + } + + window_ride_anchor_border_widgets(w); + window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_10); } /** @@ -1350,6 +1522,7 @@ static void window_ride_music_paint() window_paint_get_registers(w, dpi); window_draw_widgets(w, dpi); + window_ride_draw_tab_images(dpi, w); } #pragma endregion