From 99b85b2339aef5bcf0691ce8faec875bc3ed0d6e Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 16 Dec 2014 15:33:32 +0000 Subject: [PATCH] add manage track design window (UNTESTED) --- src/interface/window.h | 5 +- src/localisation/string_ids.h | 7 + src/ride/track.c | 18 ++ src/ride/track.h | 2 + src/windows/editor_top_toolbar.c | 8 +- src/windows/track_list.c | 31 ++-- src/windows/track_manage.c | 306 ++++++++++++++++++++++++++++++- 7 files changed, 349 insertions(+), 28 deletions(-) diff --git a/src/interface/window.h b/src/interface/window.h index 4b33bb2746..7bb0013d67 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -391,10 +391,9 @@ enum { WC_EDITOR_INVENTION_LIST_DRAG = 44, WC_EDITOR_SCENARIO_OPTIONS = 45, WC_EDTIOR_OBJECTIVE_OPTIONS = 46, - WC_47, - WC_48, + WC_MANAGE_TRACK_DESIGN = 47, + WC_TRACK_DELETE_PROMPT = 48, WC_CLEAR_SCENERY = 50, - WC_MANAGE_TRACK_DESIGN = 89, WC_CHEATS = 110, WC_RESEARCH = 111, WC_VIEWPORT = 112, diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index b5cf2a7238..2595338c96 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1295,6 +1295,13 @@ enum { STR_ROLLER_COASTER_DESIGNER = 3344, STR_TRACK_DESIGNS_MANAGER = 3345, + STR_TRACK_MANAGE_RENAME = 3348, + STR_TRACK_MANAGE_DELETE = 3349, + + STR_CANT_RENAME_TRACK_DESIGN = 3352, + + STR_ARE_YOU_SURE_YOU_WANT_TO_PERMANENTLY_DELETE_TRACK = 3357, + STR_CANT_DELETE_TRACK_DESIGN = 3358, STR_NO_TRACK_DESIGNS_OF_THIS_TYPE = 3359, STR_WARNING = 3360, STR_TOO_MANY_TRACK_DESIGNS_OF_THIS_TYPE = 3361, diff --git a/src/ride/track.c b/src/ride/track.c index 9ef270d977..7124bb6f9a 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -423,4 +423,22 @@ rct_track_design *track_get_info(int index, uint8** preview) *preview = trackDesign->preview[RCT2_GLOBAL(0x00F440AE, uint8)]; return trackDesign; +} + +/** + * + * rct2: 0x006D3664 + */ +int track_rename(const char *text) +{ + return (RCT2_CALLPROC_X(0x006D3664, 0, 0, 0, (int)text, 0, 0, 0) & 0x100) != 0; +} + +/** + * + * rct2: 0x006D3761 + */ +int track_delete() +{ + return (RCT2_CALLPROC_X(0x006D3761, 0, 0, 0, 0, 0, 0, 0) & 0x100) != 0; } \ No newline at end of file diff --git a/src/ride/track.h b/src/ride/track.h index e55e598c4f..b4c89ef6e8 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -133,5 +133,7 @@ enum { void track_load_list(ride_list_item item); int sub_67726A(const char *path); rct_track_design *track_get_info(int index, uint8** preview); +int track_rename(const char *text); +int track_delete(); #endif \ No newline at end of file diff --git a/src/windows/editor_top_toolbar.c b/src/windows/editor_top_toolbar.c index ecde9f548c..936e532458 100644 --- a/src/windows/editor_top_toolbar.c +++ b/src/windows/editor_top_toolbar.c @@ -288,8 +288,8 @@ void window_editor_top_toolbar_dropdown() { } else if (dropdownIndex == DDIDX_TD_SCREENSHOT) { RCT2_GLOBAL(RCT2_ADDRESS_SCREENSHOT_COUNTDOWN, sint8) = 10; } else if (dropdownIndex == DDIDX_TD_QUIT_GAME) { - window_close_by_number(WC_47, w->number); - window_close_by_number(WC_48, w->number); + window_close_by_number(WC_MANAGE_TRACK_DESIGN, w->number); + window_close_by_number(WC_TRACK_DELETE_PROMPT, w->number); game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 1, 0); } } else { @@ -304,8 +304,8 @@ void window_editor_top_toolbar_dropdown() { } else if (dropdownIndex == DDIDX_SE_SCREENSHOT) { RCT2_GLOBAL(RCT2_ADDRESS_SCREENSHOT_COUNTDOWN, sint8) = 10; } else if (dropdownIndex == DDIDX_SE_QUIT_GAME) { - window_close_by_number(WC_47, w->number); - window_close_by_number(WC_48, w->number); + window_close_by_number(WC_MANAGE_TRACK_DESIGN, w->number); + window_close_by_number(WC_TRACK_DELETE_PROMPT, w->number); game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 1, 0); } } diff --git a/src/windows/track_list.c b/src/windows/track_list.c index 0efca9ed41..b015f3340a 100644 --- a/src/windows/track_list.c +++ b/src/windows/track_list.c @@ -163,7 +163,7 @@ static void window_track_list_select(rct_window *w, int index) w->track_list.var_480 = index; sound_play_panned(SOUND_CLICK_1, w->x + (w->width / 2), 0, 0, 0); - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER & 8) && index == 0) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) && index == 0) { window_close(w); ride_construct_new(_window_track_list_item); return; @@ -172,7 +172,7 @@ static void window_track_list_select(rct_window *w, int index) if (RCT2_GLOBAL(0x00F44153, uint8) != 0) RCT2_GLOBAL(0x00F44152, uint8) = 1; - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER & 8)) + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER)) index--; trackDesignItem = trackDesignList + (index * 128);; @@ -181,14 +181,14 @@ static void window_track_list_select(rct_window *w, int index) window_track_list_format_name( (char*)0x009BC313, trackDesignItem, - RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER & 8 ? + RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER ? 0 : FORMAT_WHITE ); subsitute_path((char*)0x0141EF68, (char*)RCT2_ADDRESS_TRACKS_PATH, trackDesignItem); - if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER & 8) { + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) { window_track_manage_open(); return; } @@ -213,7 +213,7 @@ static int window_track_list_get_list_item_index_from_position(int x, int y) uint8 *trackDesignItem, *trackDesignList = (uint8*)0x00F441EC; index = 0; - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER & 8)) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER)) { y -= 10; if (y < 0) return index; @@ -254,8 +254,8 @@ static void window_track_list_mouseup() case WIDX_CLOSE: window_close(w); if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER) { - window_close_by_number(WC_47, w->number); - window_close_by_number(WC_48, w->number); + window_close_by_number(WC_MANAGE_TRACK_DESIGN, w->number); + window_close_by_number(WC_TRACK_DELETE_PROMPT, w->number); trackmanager_load(); } break; @@ -279,26 +279,17 @@ static void window_track_list_mouseup() static void window_track_list_scrollgetsize() { rct_window *w; - int height; + int width, height; uint8 *trackDesignItem, *trackDesignList = (uint8*)0x00F441EC; window_get_register(w); - height = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER & 8 ? 0 : 10; + width = 0; + height = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER ? 0 : 10; for (trackDesignItem = trackDesignList; *trackDesignItem != 0; trackDesignItem += 128) height += 10; - #ifdef _MSC_VER - __asm mov ecx, 0 - #else - __asm__ ( "mov ecx, 0 " ); - #endif - - #ifdef _MSC_VER - __asm mov edx, height - #else - __asm__ ( "mov edx, %[height] " : [height] "+m" (height) ); - #endif + window_scrollsize_set_registers(width, height); } /** diff --git a/src/windows/track_manage.c b/src/windows/track_manage.c index ebfe54d6c6..f636a57c42 100644 --- a/src/windows/track_manage.c +++ b/src/windows/track_manage.c @@ -19,7 +19,126 @@ *****************************************************************************/ #include "../addresses.h" +#include "../interface/widget.h" #include "../interface/window.h" +#include "../localisation/localisation.h" +#include "../ride/track.h" +#include "error.h" + +#pragma region Widgets + +enum { + WIDX_BACKGROUND, + WIDX_TITLE, + WIDX_CLOSE, + WIDX_RENAME, + WIDX_DELETE, + + WIDX_PROMPT_DELETE = 3, + WIDX_PROMPT_CANCEL = 4, +}; + +static rct_widget window_track_manage_widgets[] = { + { WWT_FRAME, 0, 0, 249, 0, 43, STR_NONE, STR_NONE }, + { WWT_CAPTION, 0, 1, 248, 1, 14, 3155, STR_WINDOW_TITLE_TIP }, + { WWT_CLOSEBOX, 0, 237, 247, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, + { WWT_DROPDOWN_BUTTON, 0, 10, 119, 24, 35, STR_TRACK_MANAGE_RENAME, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 0, 130, 239, 24, 35, STR_TRACK_MANAGE_DELETE, STR_NONE }, + { WIDGETS_END } +}; + +static rct_widget window_track_delete_prompt_widgets[] = { + { WWT_FRAME, 0, 0, 249, 0, 73, STR_NONE, STR_NONE }, + { WWT_CAPTION, 0, 1, 248, 1, 14, 3356, STR_WINDOW_TITLE_TIP }, + { WWT_CLOSEBOX, 0, 237, 247, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, + { WWT_DROPDOWN_BUTTON, 0, 10, 119, 54, 65, 3349, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 0, 130, 239, 54, 65, 972, STR_NONE }, + { WIDGETS_END } +}; + +#pragma endregion + +#pragma region Events + +static void window_track_manage_emptysub() { } + +static void window_track_manage_close(); +static void window_track_manage_mouseup(); +static void window_track_manage_textinput(); +static void window_track_manage_paint(); + +static void window_track_delete_prompt_emptysub() { } + +static void window_track_delete_prompt_mouseup(); +static void window_track_delete_prompt_paint(); + +// 0x009940EC +static void* window_track_manage_events[] = { + window_track_manage_close, + window_track_manage_mouseup, + window_track_manage_emptysub, + window_track_manage_emptysub, + window_track_manage_emptysub, + window_track_manage_emptysub, + window_track_manage_emptysub, + window_track_manage_emptysub, + window_track_manage_emptysub, + window_track_manage_emptysub, + window_track_manage_emptysub, + window_track_manage_emptysub, + window_track_manage_emptysub, + window_track_manage_emptysub, + window_track_manage_emptysub, + window_track_manage_emptysub, + window_track_manage_emptysub, + window_track_manage_emptysub, + window_track_manage_emptysub, + window_track_manage_textinput, + window_track_manage_emptysub, + window_track_manage_emptysub, + window_track_manage_emptysub, + window_track_manage_emptysub, + window_track_manage_emptysub, + window_track_manage_emptysub, + window_track_manage_paint, + window_track_manage_emptysub +}; + +// 0x0099415C +static void* window_track_delete_prompt_events[] = { + window_track_delete_prompt_emptysub, + window_track_delete_prompt_mouseup, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_emptysub, + window_track_delete_prompt_paint, + window_track_delete_prompt_emptysub +}; + +#pragma endregion + +static void window_track_delete_prompt_open(); /** * @@ -27,5 +146,190 @@ */ void window_track_manage_open() { - RCT2_CALLPROC_EBPSAFE(0x006D348F); + // RCT2_CALLPROC_EBPSAFE(0x006D348F); + + rct_window *w, *trackDesignListWindow; + + window_close_by_class(WC_MANAGE_TRACK_DESIGN); + + w = window_create( + max(28, (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 250) / 2), + (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 44) / 2, + 250, + 44, + (uint32*)window_track_manage_events, + WC_MANAGE_TRACK_DESIGN, + WF_STICK_TO_FRONT + ); + w->widgets = window_track_manage_widgets; + w->enabled_widgets = + (1 << WIDX_CLOSE) | + (1 << WIDX_RENAME) | + (1 << WIDX_DELETE); + window_init_scroll_widgets(w); + w->flags |= WF_TRANSPARENT; + w->colours[0] = 1; + w->colours[1] = 1; + w->colours[2] = 1; + + trackDesignListWindow = window_find_by_class(WC_TRACK_DESIGN_LIST); + if (trackDesignListWindow != NULL) + trackDesignListWindow->track_list.var_484 |= 1; +} + +/** + * + * rct2: 0x006D364C + */ +static void window_track_manage_close() +{ + rct_window *w; + + w = window_find_by_class(WC_TRACK_DESIGN_LIST); + if (w != NULL) + w->track_list.var_484 &= ~1; +} + +/** + * + * rct2: 0x006D3523 + */ +static void window_track_manage_mouseup() +{ + uint8 *trackDesignList = (uint8*)0x00F441EC; + rct_window *w, *trackDesignListWindow; + short widgetIndex; + + window_widget_get_registers(w, widgetIndex); + + switch (widgetIndex) { + case WIDX_CLOSE: + window_close(w); + break; + case WIDX_RENAME: + trackDesignListWindow = window_find_by_class(WC_TRACK_DESIGN_LIST); + if (trackDesignListWindow != NULL) { + strcpy((char*)0x009BC677, (char*)trackDesignList[trackDesignListWindow->track_list.var_482 * 128]); + window_show_textinput(w, widgetIndex, 3350, 3351, 3165); + } + break; + case WIDX_DELETE: + window_track_delete_prompt_open(); + break; + } +} + +/** + * + * rct2: 0x006D3523 + */ +static void window_track_manage_textinput() +{ + rct_window *w; + short widgetIndex; + uint8 result; + char *text; + + window_textinput_get_registers(w, widgetIndex, result, text); + + if (widgetIndex != WIDX_RENAME || !result) + return; + + if (track_rename(text)) { + window_close_by_class(WC_TRACK_DELETE_PROMPT); + window_close(w); + } else { + window_error_open(STR_CANT_RENAME_TRACK_DESIGN, RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16)); + } +} + +/** + * + * rct2: 0x006D3523 + */ +static void window_track_manage_paint() +{ + rct_window *w; + rct_drawpixelinfo *dpi; + + window_paint_get_registers(w, dpi); + + window_draw_widgets(w, dpi); +} + +/** + * + * rct2: 0x006D35CD + */ +static void window_track_delete_prompt_open() +{ + rct_window *w; + + window_close_by_class(WC_TRACK_DELETE_PROMPT); + + w = window_create( + max(28, (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 250) / 2), + (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 44) / 2, + 250, + 74, + (uint32*)window_track_delete_prompt_events, + WC_TRACK_DELETE_PROMPT, + WF_STICK_TO_FRONT + ); + w->widgets = window_track_delete_prompt_widgets; + w->enabled_widgets = + (1 << WIDX_CLOSE) | + (1 << WIDX_RENAME) | + (1 << WIDX_DELETE); + window_init_scroll_widgets(w); + w->flags |= WF_TRANSPARENT; + w->colours[0] = 26; + w->colours[1] = 26; + w->colours[2] = 26; +} + +/** + * + * rct2: 0x006D3823 + */ +static void window_track_delete_prompt_mouseup() +{ + rct_window *w; + short widgetIndex; + + window_widget_get_registers(w, widgetIndex); + + switch (widgetIndex) { + case WIDX_CLOSE: + case WIDX_PROMPT_CANCEL: + window_close(w); + break; + case WIDX_PROMPT_DELETE: + window_close(w); + if (track_delete()) + window_close_by_class(WC_MANAGE_TRACK_DESIGN); + else + window_error_open(STR_CANT_DELETE_TRACK_DESIGN, RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, uint16)); + break; + } +} + +/** + * + * rct2: 0x006D37EE + */ +static void window_track_delete_prompt_paint() +{ + rct_window *w; + rct_drawpixelinfo *dpi; + rct_string_id stringId; + + window_paint_get_registers(w, dpi); + + window_draw_widgets(w, dpi); + + stringId = 3155; + gfx_draw_string_centred_wrapped( + dpi, &stringId, w->x + 125, w->y + 28, 246, STR_ARE_YOU_SURE_YOU_WANT_TO_PERMANENTLY_DELETE_TRACK, 0 + ); } \ No newline at end of file