1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 11:03:00 +01:00

add manage track design window (UNTESTED)

This commit is contained in:
IntelOrca
2014-12-16 15:33:32 +00:00
parent a319bb15e2
commit 99b85b2339
7 changed files with 349 additions and 28 deletions

View File

@@ -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,

View File

@@ -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,

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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);
}
/**

View File

@@ -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
);
}