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:
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user