diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 3f031494f6..7181e2da8d 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -2692,11 +2692,11 @@ STR_2686 :??? STR_2687 :??? STR_2688 :??? STR_2689 :??? -STR_2690 :??? -STR_2691 :??? -STR_2692 :??? -STR_2693 :??? -STR_2694 :??? +STR_2690 :Map Generation +STR_2691 :{WINDOW_COLOUR_2}Base height: +STR_2692 :{WINDOW_COLOUR_2}Water level: +STR_2693 :{WINDOW_COLOUR_2}Terrain: +STR_2694 :Generate STR_2695 :??? STR_2696 :??? STR_2697 :??? diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index e4e3953b83..5766b4e669 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -88,16 +88,15 @@ - - + @@ -125,6 +124,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index 29f5966f1f..041f81e8bf 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -120,9 +120,6 @@ Source\Windows - - Source\Windows - Source\Windows @@ -331,7 +328,6 @@ Source\Drawing - Source @@ -350,7 +346,7 @@ Source\Windows - + Source\Windows @@ -404,9 +400,6 @@ Source\Windows - - Source\Windows - Source\Localisation @@ -428,6 +421,12 @@ Source\World + + Source\Windows + + + Source\Windows + diff --git a/src/editor.c b/src/editor.c index 2847611858..493a655b18 100644 --- a/src/editor.c +++ b/src/editor.c @@ -62,7 +62,7 @@ void editor_load() pause_sounds(); unpause_sounds(); object_unload_all(); - map_init(); + map_init(150); RCT2_CALLPROC_EBPSAFE(0x006B9CB0); reset_park_entrances(); user_string_clear_all(); @@ -209,7 +209,7 @@ void trackdesigner_load() rct_window *mainWindow; object_unload_all(); - map_init(); + map_init(150); set_all_land_owned(); RCT2_CALLPROC_EBPSAFE(0x006B9CB0); reset_park_entrances(); @@ -246,7 +246,7 @@ void trackmanager_load() rct_window *mainWindow; object_unload_all(); - map_init(); + map_init(150); set_all_land_owned(); RCT2_CALLPROC_EBPSAFE(0x006B9CB0); reset_park_entrances(); diff --git a/src/game.c b/src/game.c index 309ff41940..c25f8c264c 100644 --- a/src/game.c +++ b/src/game.c @@ -71,7 +71,7 @@ void game_reduce_game_speed() void game_create_windows() { window_main_open(); - window_game_top_toolbar_open(); + window_top_toolbar_open(); window_game_bottom_toolbar_open(); RCT2_CALLPROC_EBPSAFE(0x0066B905); } diff --git a/src/interface/window.h b/src/interface/window.h index f396c59145..1f89d08004 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -397,7 +397,8 @@ enum { WC_CHEATS = 110, WC_RESEARCH = 111, WC_VIEWPORT = 112, - WC_TEXTINPUT = 113 + WC_TEXTINPUT = 113, + WC_MAPGEN = 114 } WINDOW_CLASS; enum PROMPT_MODE { @@ -484,7 +485,7 @@ void window_main_open(); void window_relocate_windows(int width, int height); void window_resize_gui(int width, int height); void window_resize_gui_scenario_editor(int width, int height); -void window_game_top_toolbar_open(); +void window_top_toolbar_open(); void window_game_bottom_toolbar_open(); void window_about_open(); void window_footpath_open(); @@ -536,9 +537,9 @@ void window_publisher_credits_open(); void window_track_manage_open(); void window_viewport_open(); void window_text_input_open(rct_window* call_w, int call_widget, rct_string_id title, rct_string_id description, rct_string_id existing_text, uint32 existing_args, int maxLength); +rct_window *window_mapgen_open(); void window_editor_main_open(); -void window_editor_top_toolbar_open(); void window_editor_bottom_toolbar_open(); void window_editor_object_selection_open(); void window_editor_inventions_list_open(); diff --git a/src/openrct2.c b/src/openrct2.c index abd4fbfd39..6c5d4f7bbc 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -80,7 +80,6 @@ void openrct2_launch() case STARTUP_ACTION_EDIT: if (strlen(gOpenRCT2StartupActionPath) == 0) { editor_load(); - mapgen_generate(); } else { editor_load_landscape(gOpenRCT2StartupActionPath); } diff --git a/src/rct2.c b/src/rct2.c index 19be17a9a6..5b6b415fa8 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -104,7 +104,7 @@ int rct2_init() ride_init_all(); window_guest_list_init_vars_a(); sub_6BD3A4();// RCT2_CALLPROC_EBPSAFE(0x006BD3A4); //Peep? - map_init(); + map_init(150); park_init(); RCT2_CALLPROC_EBPSAFE(0x0066B5C0); // 0x0066B5C0 (part of 0x0066B3E8) screen_game_create_windows() date_reset(); diff --git a/src/title.c b/src/title.c index 9988f41381..87380c673b 100644 --- a/src/title.c +++ b/src/title.c @@ -103,7 +103,7 @@ void title_load() ride_init_all(); window_guest_list_init_vars_a(); sub_6BD3A4(); // RCT2_CALLPROC_EBPSAFE(0x006BD3A4); - map_init(); + map_init(150); park_init(); date_reset(); climate_reset(CLIMATE_COOL_AND_WET); diff --git a/src/windows/editor_bottom_toolbar.c b/src/windows/editor_bottom_toolbar.c index 58911a4a1b..54a43155fa 100644 --- a/src/windows/editor_bottom_toolbar.c +++ b/src/windows/editor_bottom_toolbar.c @@ -33,7 +33,7 @@ #include "../util/util.h" #include "error.h" -enum WINDOW_EDITOR_TOP_TOOLBAR_WIDGET_IDX { +enum { WIDX_PREVIOUS_IMAGE, // 1 WIDX_PREVIOUS_STEP_BUTTON, // 2 WIDX_NEXT_IMAGE, // 4 diff --git a/src/windows/editor_main.c b/src/windows/editor_main.c index d1231efaea..a9635b4e47 100644 --- a/src/windows/editor_main.c +++ b/src/windows/editor_main.c @@ -87,7 +87,7 @@ void window_editor_main_open() RCT2_GLOBAL(0x009E32B3, uint8) = 0; RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_PATH_TYPE, uint8) = 0; - window_editor_top_toolbar_open(); + window_top_toolbar_open(); window_editor_bottom_toolbar_open(); } diff --git a/src/windows/editor_top_toolbar.c b/src/windows/editor_top_toolbar.c deleted file mode 100644 index 4c99d2e027..0000000000 --- a/src/windows/editor_top_toolbar.c +++ /dev/null @@ -1,437 +0,0 @@ -/***************************************************************************** -* Copyright (c) 2014 Dániel Tar, Ted John -* OpenRCT2, an open source clone of Roller Coaster Tycoon 2. -* -* This file is part of OpenRCT2. -* -* OpenRCT2 is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. - -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. - -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*****************************************************************************/ - -#include "../addresses.h" -#include "../localisation/string_ids.h" -#include "../sprites.h" -#include "../game.h" -#include "../editor.h" -#include "../toolbar.h" -#include "../interface/viewport.h" -#include "../interface/widget.h" -#include "../interface/window.h" -#include "dropdown.h" - -enum WINDOW_EDITOR_TOP_TOOLBAR_WIDGET_IDX { - WIDX_PAUSE, // 0, 1 - WIDX_FILE_MENU, // 1, 2 - WIDX_ZOOM_OUT, // 2, 4 - WIDX_ZOOM_IN, // 3, 8 - WIDX_ROTATE, // 4, 10 - WIDX_VIEW_MENU, // 5, 20 - WIDX_MAP, // 6, 40 - WIDX_LAND, // 7, 80 - WIDX_WATER, // 8, 100 - WIDX_SCENERY, // 9, 200 - WIDX_PATH, // 10, 400 - WIDX_CONSTRUCT_RIDE, // 11, 800 - WIDX_UNUSED1, // 12, 1000 - WIDX_UNUSED2, // 13, 2000 - WIDX_UNUSED3, // 14, 4000 - WIDX_UNUSED4, // 15, 8000 - WIDX_CLEAR_SCENERY, // 16, 10000 - - WIDX_SEPARATOR, -}; - -typedef enum { - DDIDX_SE_LOAD_LANDSCAPE = 0, - DDIDX_SE_SAVE_LANDSCAPE = 1, - DDIDX_SE_ABOUT = 3, - DDIDX_SE_OPTIONS = 4, - DDIDX_SE_SCREENSHOT = 5, - DDIDX_SE_QUIT_GAME = 7, -} SCENARIO_EDITOR_FILE_MENU_DDIDX; - -typedef enum { - DDIDX_TD_ABOUT = 0, - DDIDX_TD_OPTIONS = 1, - DDIDX_TD_SCREENSHOT = 2, - DDIDX_TD_QUIT_GAME = 4, -} TRACK_DESINGER_FILE_MENU_DDIDX; - -#pragma region Toolbar_widget_ordering - -// from left to right -static const int left_aligned_widgets_order[] = { - WIDX_PAUSE, WIDX_FILE_MENU, - - WIDX_SEPARATOR, - - WIDX_ZOOM_OUT, - WIDX_ZOOM_IN, - WIDX_ROTATE, - WIDX_VIEW_MENU, - WIDX_MAP, -}; - -// from right to left -static const int right_aligned_widgets_order[] = { - WIDX_CONSTRUCT_RIDE, WIDX_PATH, - WIDX_SCENERY, - WIDX_WATER, - WIDX_LAND, - WIDX_CLEAR_SCENERY, -}; - -#pragma endregion - -static rct_widget window_editor_top_toolbar_widgets[] = { - { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, 0xFFFF }, // 1 0x009A9844 - { WWT_TRNBTN, 0, 0, 29, 0, 27, 0x20000000 | SPR_TOOLBAR_FILE, STR_DISC_AND_GAME_OPTIONS_TIP }, // 2 0x009A9854 - { WWT_TRNBTN, 1, 40, 69, 0, 27, 0x20000000 | SPR_TOOLBAR_ZOOM_OUT, STR_ZOOM_OUT_TIP }, // 4 0x009A9864 - { WWT_TRNBTN, 1, 70, 99, 0, 27, 0x20000000 | SPR_TOOLBAR_ZOOM_IN, STR_ZOOM_IN_TIP }, // 8 0x009A9874 - { WWT_TRNBTN, 1, 100, 129, 0, 27, 0x20000000 | SPR_TOOLBAR_ROTATE, STR_ROTATE_TIP }, // 10 0x009A9884 - { WWT_TRNBTN, 1, 130, 159, 0, 27, 0x20000000 | SPR_TOOLBAR_VIEW, STR_VIEW_OPTIONS_TIP }, // 20 0x009A9894 - { WWT_TRNBTN, 1, 160, 189, 0, 27, 0x20000000 | SPR_TOOLBAR_MAP, STR_SHOW_MAP_TIP }, // 40 0x009A98A4 - { WWT_TRNBTN, 2, 267, 296, 0, 27, 0x20000000 | SPR_TOOLBAR_LAND, STR_ADJUST_LAND_TIP }, // 80 0x009A98B4 - { WWT_TRNBTN, 2, 297, 326, 0, 27, 0x20000000 | SPR_TOOLBAR_WATER, STR_ADJUST_WATER_TIP }, // 100 0x009A98C4 - { WWT_TRNBTN, 2, 327, 356, 0, 27, 0x20000000 | SPR_TOOLBAR_SCENERY, STR_PLACE_SCENERY_TIP }, // 200 0x009A98D4 - { WWT_TRNBTN, 2, 357, 386, 0, 27, 0x20000000 | SPR_TOOLBAR_FOOTPATH, STR_BUILD_FOOTPATH_TIP }, // 400 0x009A98E4 - { WWT_TRNBTN, 2, 387, 416, 0, 27, 0x20000000 | SPR_TOOLBAR_CONSTRUCT_RIDE, STR_BUILD_RIDE_TIP }, // 800 0x009A98F4 - { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, 0xFFFF }, // 1000 0x009A9904 - { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, 0xFFFF }, // 2000 0x009A9914 - { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, 0xFFFF }, // 4000 0x009A9924 - { WWT_EMPTY, 0, 0, 0, 0, 0, 0xFFFFFFFF, 0xFFFF }, // 8000 0x009A9934 - { WWT_TRNBTN, 2, 560, 589, 0, 27, 0x20000000 | SPR_TOOLBAR_CLEAR_SCENERY, STR_CLEAR_SCENERY_TIP }, // 10000 0x009A9944 - - { WWT_EMPTY, 0, 0, 10-1, 0, 0, 0xFFFFFFFF, 0xFFFF }, // Artificial widget separator - { WIDGETS_END }, -}; - -static void window_editor_top_toolbar_emptysub() { } - -static void window_editor_top_toolbar_mouseup(); -static void window_editor_top_toolbar_resize(); -static void window_editor_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); -static void window_editor_top_toolbar_dropdown(); -static void window_editor_top_toolbar_invalidate(); -static void window_editor_top_toolbar_paint(); - -static void* window_editor_top_toolbar_events[] = { - window_editor_top_toolbar_emptysub, - window_editor_top_toolbar_mouseup, //(void*)0x0066f9d7, // mouseup - window_editor_top_toolbar_resize, //(void*)0x0066fada, // resize - window_editor_top_toolbar_mousedown, //(void*)0x0066fa57, // mousedown - window_editor_top_toolbar_dropdown, //(void*)0x0066fa38, // dropdown - window_editor_top_toolbar_emptysub, - window_editor_top_toolbar_emptysub, - window_editor_top_toolbar_emptysub, - window_editor_top_toolbar_emptysub, - (void*)0x0066fb0e, - (void*)0x0066fb5c, - (void*)0x0066fb37, - (void*)0x0066fc44, - (void*)0x0066fa74, - window_editor_top_toolbar_emptysub, - window_editor_top_toolbar_emptysub, - window_editor_top_toolbar_emptysub, - window_editor_top_toolbar_emptysub, - window_editor_top_toolbar_emptysub, - window_editor_top_toolbar_emptysub, - window_editor_top_toolbar_emptysub, - window_editor_top_toolbar_emptysub, - window_editor_top_toolbar_emptysub, - window_editor_top_toolbar_emptysub, - window_editor_top_toolbar_emptysub, - window_editor_top_toolbar_invalidate, // (void*)0x0066f87d, // oninvalidate - window_editor_top_toolbar_paint, //(void*)0x0066f9d1, // onpaint - window_editor_top_toolbar_emptysub -}; - -/** -* Creates the main editor top toolbar window. -* rct2: 0x0066EFC8 (part of 0x0066EF38) -*/ -void window_editor_top_toolbar_open() -{ - rct_window* window; - - window = window_create(0, 0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16), 28, - (uint32*)window_editor_top_toolbar_events, - WC_TOP_TOOLBAR, WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_5); - window->widgets = window_editor_top_toolbar_widgets; - - window->enabled_widgets |= - (1 << WIDX_ZOOM_IN) | - (1 << WIDX_ZOOM_OUT) | - (1 << WIDX_ROTATE) | - (1 << WIDX_FILE_MENU) | - (1 << WIDX_LAND) | - (1 << WIDX_VIEW_MENU) | - (1 << WIDX_SCENERY) | - (1 << WIDX_WATER) | - (1 << WIDX_PATH) | - (1 << WIDX_MAP) | - (1 << WIDX_CONSTRUCT_RIDE) | - (1 << WIDX_CLEAR_SCENERY); - - window_init_scroll_widgets(window); - window->colours[0] = 7; - window->colours[1] = 12; - window->colours[2] = 24; - window->colours[3] = 1; -} - -/** -* -* rct2: 0x0066C957 -*/ -static void window_editor_top_toolbar_mouseup() -{ - short widgetIndex; - rct_window *w, *mainWindow; - - window_widget_get_registers(w, widgetIndex); - - switch (widgetIndex) { - case WIDX_ZOOM_IN: - if ((mainWindow = window_get_main()) != NULL) - window_zoom_in(mainWindow); - break; - case WIDX_ZOOM_OUT: - if ((mainWindow = window_get_main()) != NULL) - window_zoom_out(mainWindow); - break; - case WIDX_ROTATE: - if ((mainWindow = window_get_main()) != NULL) - window_rotate_camera(mainWindow); - break; - case WIDX_SCENERY: - if (!tool_set(w, WIDX_SCENERY, 0)) { - RCT2_GLOBAL(0x009DE518, uint32) |= (1 << 6); - window_scenery_open(); - } - break; - case WIDX_PATH: - toggle_footpath_window(); - break; - case WIDX_LAND: - toggle_land_window(w, WIDX_LAND); - break; - case WIDX_CLEAR_SCENERY: - toggle_clear_scenery_window(w, WIDX_CLEAR_SCENERY); - break; - case WIDX_WATER: - toggle_water_window(w, WIDX_WATER); - break; - case WIDX_MAP: - window_map_open(); - break; - case WIDX_CONSTRUCT_RIDE: - window_new_ride_open(); - break; - } -} - -/** -* -* rct2: 0x0066FADA -*/ -static void window_editor_top_toolbar_resize() { - rct_window *mainWindow = window_get_main(); - rct_window *w; - - window_get_register(w); - - int eax = 0; - - if ((w->disabled_widgets & 0xFF) == 0) - eax |= (1 << 3); - - if ((w->disabled_widgets & 0xFF) == 3) - eax |= (1 << 2); - - RCT2_CALLPROC_X(0x006ECE14, 0, 0, 0, 0, (int)w, 0, 0); -} - -/** -* -* rct2: 0x0066FA57 -*/ -static void window_editor_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widget* widget) -{ - if (widgetIndex == WIDX_FILE_MENU) { - short dropdownItemCount = 8; - gDropdownItemsFormat[0] = STR_LOAD_LANDSCAPE; - gDropdownItemsFormat[1] = STR_SAVE_LANDSCAPE; - gDropdownItemsFormat[2] = 0; - gDropdownItemsFormat[3] = STR_ABOUT; - gDropdownItemsFormat[4] = STR_OPTIONS; - gDropdownItemsFormat[5] = STR_SCREENSHOT; - gDropdownItemsFormat[6] = 0; - gDropdownItemsFormat[7] = STR_QUIT_SCENARIO_EDITOR; - - if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER)) { - dropdownItemCount = 5; - gDropdownItemsFormat[0] = STR_ABOUT; - gDropdownItemsFormat[1] = STR_OPTIONS; - gDropdownItemsFormat[2] = STR_SCREENSHOT; - gDropdownItemsFormat[3] = 0; - gDropdownItemsFormat[4] = STR_QUIT_TRACK_DESIGNS_MANAGER; - - if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) { - gDropdownItemsFormat[4] = STR_QUIT_ROLLERCOASTER_DESIGNER; - } - } - - window_dropdown_show_text(w->x + widget->left, w->y + widget->top, - widget->bottom - widget->top + 1, w->colours[0] | 0x80, 0x80, dropdownItemCount); - } else if (widgetIndex == WIDX_VIEW_MENU) { - top_toolbar_init_view_menu(w, widget); - } -} - -/** -* -* rct2: 0x0066FA38 -*/ -void window_editor_top_toolbar_dropdown() { - short widgetIndex, dropdownIndex; - rct_window* w; - - window_dropdown_get_registers(w, widgetIndex, dropdownIndex); - - if (widgetIndex == WIDX_FILE_MENU) { - if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER)) { - if (dropdownIndex == DDIDX_TD_ABOUT) { - window_about_open(); - } else if (dropdownIndex == DDIDX_TD_OPTIONS) { - window_options_open(); - } 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_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 { - if (dropdownIndex == DDIDX_SE_LOAD_LANDSCAPE) { - game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 0, 0); - } else if (dropdownIndex == DDIDX_SE_SAVE_LANDSCAPE) { - RCT2_CALLPROC_EBPSAFE(0x0066FE2A); - } else if (dropdownIndex == DDIDX_SE_ABOUT) { - window_about_open(); - } else if (dropdownIndex == DDIDX_SE_OPTIONS) { - window_options_open(); - } 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_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 if (widgetIndex == WIDX_VIEW_MENU) { - top_toolbar_view_menu_dropdown(dropdownIndex); - } -} - -/** -* -* rct2: 0x0066F87D -*/ -void window_editor_top_toolbar_invalidate() -{ - rct_window *w; - - window_get_register(w); - - window_editor_top_toolbar_widgets[WIDX_ZOOM_OUT].type = WWT_EMPTY; - window_editor_top_toolbar_widgets[WIDX_ZOOM_IN].type = WWT_EMPTY; - window_editor_top_toolbar_widgets[WIDX_ROTATE].type = WWT_EMPTY; - window_editor_top_toolbar_widgets[WIDX_VIEW_MENU].type = WWT_EMPTY; - window_editor_top_toolbar_widgets[WIDX_MAP].type = WWT_EMPTY; - window_editor_top_toolbar_widgets[WIDX_CLEAR_SCENERY].type = WWT_EMPTY; - window_editor_top_toolbar_widgets[WIDX_LAND].type = WWT_EMPTY; - window_editor_top_toolbar_widgets[WIDX_WATER].type = WWT_EMPTY; - window_editor_top_toolbar_widgets[WIDX_SCENERY].type = WWT_EMPTY; - window_editor_top_toolbar_widgets[WIDX_PATH].type = WWT_EMPTY; - window_editor_top_toolbar_widgets[WIDX_CONSTRUCT_RIDE].type = WWT_EMPTY; - - - if (g_editor_step == EDITOR_STEP_LANDSCAPE_EDITOR) { - window_editor_top_toolbar_widgets[WIDX_ZOOM_OUT].type = WWT_TRNBTN; - window_editor_top_toolbar_widgets[WIDX_ZOOM_IN].type = WWT_TRNBTN; - window_editor_top_toolbar_widgets[WIDX_ROTATE].type = WWT_TRNBTN; - window_editor_top_toolbar_widgets[WIDX_VIEW_MENU].type = WWT_TRNBTN; - window_editor_top_toolbar_widgets[WIDX_MAP].type = WWT_TRNBTN; - window_editor_top_toolbar_widgets[WIDX_CLEAR_SCENERY].type = WWT_TRNBTN; - window_editor_top_toolbar_widgets[WIDX_LAND].type = WWT_TRNBTN; - window_editor_top_toolbar_widgets[WIDX_WATER].type = WWT_TRNBTN; - window_editor_top_toolbar_widgets[WIDX_SCENERY].type = WWT_TRNBTN; - window_editor_top_toolbar_widgets[WIDX_PATH].type = WWT_TRNBTN; - } else if (g_editor_step == EDITOR_STEP_ROLLERCOASTER_DESIGNER) { - window_editor_top_toolbar_widgets[WIDX_ZOOM_OUT].type = WWT_TRNBTN; - window_editor_top_toolbar_widgets[WIDX_ZOOM_IN].type = WWT_TRNBTN; - window_editor_top_toolbar_widgets[WIDX_ROTATE].type = WWT_TRNBTN; - window_editor_top_toolbar_widgets[WIDX_VIEW_MENU].type = WWT_TRNBTN; - window_editor_top_toolbar_widgets[WIDX_CONSTRUCT_RIDE].type = WWT_TRNBTN; - } - - if (window_find_by_class(0x94) == NULL) - w->pressed_widgets &= ~(1 << WIDX_PATH); - else - w->pressed_widgets |= (1 << WIDX_PATH); - - sint16 x = max(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16), 640); - - for (int i = 0; i < countof(right_aligned_widgets_order); ++i) { - rct_widget *current_widget = &window_editor_top_toolbar_widgets[right_aligned_widgets_order[i]]; - int widget_width = current_widget->right - current_widget->left; - - if (current_widget->type == WWT_EMPTY && right_aligned_widgets_order[i] != WIDX_SEPARATOR) - continue; - - x -= 1; - current_widget->right = x; - x -= widget_width; - current_widget->left = x; - } - - x = 0; - - for (int i = 0; i < countof(left_aligned_widgets_order); ++i) { - rct_widget *current_widget = &window_editor_top_toolbar_widgets[left_aligned_widgets_order[i]]; - int widget_width = current_widget->right - current_widget->left; - - if (current_widget->type == WWT_EMPTY && left_aligned_widgets_order[i] != WIDX_SEPARATOR) - continue; - - current_widget->left = x; - x += widget_width; - current_widget->right = x; - x += 1; - } -} - -/** -* -* rct2: 0x0066F9D1 -*/ -static void window_editor_top_toolbar_paint() -{ - rct_window *w; - rct_drawpixelinfo *dpi; - - window_paint_get_registers(w, dpi); - - window_draw_widgets(w, dpi); -} \ No newline at end of file diff --git a/src/windows/mapgen.c b/src/windows/mapgen.c new file mode 100644 index 0000000000..28eb711cd4 --- /dev/null +++ b/src/windows/mapgen.c @@ -0,0 +1,613 @@ +/***************************************************************************** + * Copyright (c) 2014 Ted John + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * This file is part of OpenRCT2. + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *****************************************************************************/ + +#include "../addresses.h" +#include "../localisation/localisation.h" +#include "../input.h" +#include "../interface/widget.h" +#include "../interface/viewport.h" +#include "../interface/window.h" +#include "../sprites.h" +#include "../windows/scenery.h" +#include "../world/mapgen.h" +#include "dropdown.h" + +enum { + WINDOW_MAPGEN_PAGE_BASE, + WINDOW_MAPGEN_PAGE_RANDOM, + WINDOW_MAPGEN_PAGE_COUNT +}; + +enum { + WIDX_BACKGROUND, + WIDX_TITLE, + WIDX_CLOSE, + WIDX_PAGE_BACKGROUND, + WIDX_TAB_1, + WIDX_TAB_2, + + WIDX_GENERATE, + + WIDX_MAP_SIZE, + WIDX_MAP_SIZE_UP, + WIDX_MAP_SIZE_DOWN, + WIDX_BASE_HEIGHT, + WIDX_BASE_HEIGHT_UP, + WIDX_BASE_HEIGHT_DOWN, + WIDX_WATER_LEVEL, + WIDX_WATER_LEVEL_UP, + WIDX_WATER_LEVEL_DOWN, + WIDX_FLOOR_TEXTURE, + WIDX_WALL_TEXTURE +}; + +#pragma region Widgets + +static rct_widget window_mapgen_base_widgets[] = { + { WWT_FRAME, 0, 0, 299, 0, 195, 0xFFFFFFFF, STR_NONE }, + { WWT_CAPTION, 0, 1, 298, 1, 14, 2690, STR_WINDOW_TITLE_TIP }, + { WWT_CLOSEBOX, 0, 287, 297, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, + { WWT_RESIZE, 1, 0, 299, 43, 195, 0xFFFFFFFF, STR_NONE }, + { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_NONE }, + { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_NONE }, + + { WWT_DROPDOWN_BUTTON, 1, 104, 198, 52, 63, 2694, STR_NONE }, + + { WWT_SPINNER, 1, 104, 198, 52, 63, STR_NONE, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 187, 197, 53, 57, STR_NUMERIC_UP, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 187, 197, 58, 62, STR_NUMERIC_DOWN, STR_NONE }, + { WWT_SPINNER, 1, 104, 198, 70, 81, STR_NONE, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 187, 197, 71, 75, STR_NUMERIC_UP, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 187, 197, 76, 80, STR_NUMERIC_DOWN, STR_NONE }, + { WWT_SPINNER, 1, 104, 198, 88, 99, STR_NONE, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 187, 197, 89, 93, STR_NUMERIC_UP, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 187, 197, 94, 98, STR_NUMERIC_DOWN, STR_NONE }, + { WWT_FLATBTN, 1, 104, 150, 106, 141, 0xFFFFFFFF, STR_CHANGE_BASE_LAND_TIP }, + { WWT_FLATBTN, 1, 151, 197, 106, 141, 0xFFFFFFFF, STR_CHANGE_VERTICAL_LAND_TIP }, + { WIDGETS_END }, +}; + +static rct_widget window_mapgen_random_widgets[] = { + { WWT_FRAME, 0, 0, 299, 0, 195, 0xFFFFFFFF, STR_NONE }, + { WWT_CAPTION, 0, 1, 298, 1, 14, 2690, STR_WINDOW_TITLE_TIP }, + { WWT_CLOSEBOX, 0, 287, 297, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, + { WWT_RESIZE, 1, 0, 299, 43, 195, 0xFFFFFFFF, STR_NONE }, + { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_NONE }, + { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_NONE }, + + { WWT_DROPDOWN_BUTTON, 1, 104, 198, 52, 63, 2694, STR_NONE }, + { WIDGETS_END }, +}; + +static rct_widget *window_mapgen_page_widgets[] = { + window_mapgen_base_widgets, + window_mapgen_random_widgets +}; + +#pragma endregion + +#pragma region Events + +static void window_mapgen_emptysub() { } + +static void window_mapgen_base_mouseup(); +static void window_mapgen_base_mousedown(int widgetIndex, rct_window *w, rct_widget* widget); +static void window_mapgen_base_dropdown(); +static void window_mapgen_base_update(rct_window *w); +static void window_mapgen_base_invalidate(); +static void window_mapgen_base_paint(); +static void window_mapgen_random_mouseup(); +static void window_mapgen_random_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); +static void window_mapgen_random_update(rct_window *w); +static void window_mapgen_random_invalidate(); +static void window_mapgen_random_paint(); + +static void* window_mapgen_base_events[] = { + window_mapgen_emptysub, + window_mapgen_base_mouseup, + window_mapgen_emptysub, + window_mapgen_base_mousedown, + window_mapgen_base_dropdown, + window_mapgen_emptysub, + window_mapgen_base_update, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_base_invalidate, + window_mapgen_base_paint, + window_mapgen_emptysub +}; + +static void* window_mapgen_random_events[] = { + window_mapgen_emptysub, + window_mapgen_random_mouseup, + window_mapgen_emptysub, + window_mapgen_random_mousedown, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_random_update, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_emptysub, + window_mapgen_random_invalidate, + window_mapgen_random_paint, + window_mapgen_emptysub +}; + +static void* window_mapgen_page_events[] = { + window_mapgen_base_events, + window_mapgen_random_events +}; + +#pragma endregion + +#pragma region Enabled widgets + +static uint32 window_mapgen_page_enabled_widgets[] = { + (1 << WIDX_CLOSE) | + (1 << WIDX_TAB_1) | + (1 << WIDX_TAB_2) | + (1 << WIDX_GENERATE) | + (1 << WIDX_MAP_SIZE_UP) | + (1 << WIDX_MAP_SIZE_DOWN) | + (1 << WIDX_BASE_HEIGHT_UP) | + (1 << WIDX_BASE_HEIGHT_DOWN) | + (1 << WIDX_WATER_LEVEL_UP) | + (1 << WIDX_WATER_LEVEL_DOWN) | + (1 << WIDX_FLOOR_TEXTURE) | + (1 << WIDX_WALL_TEXTURE), + + (1 << WIDX_CLOSE) | + (1 << WIDX_TAB_1) | + (1 << WIDX_TAB_2) | + (1 << WIDX_GENERATE) +}; + +#pragma endregion + +const int window_mapgen_tab_animation_loops[] = { 16, 16 }; + +static void window_mapgen_set_page(rct_window *w, int page); +static void window_mapgen_set_pressed_tab(rct_window *w); +static void window_mapgen_anchor_border_widgets(rct_window *w); +static void window_mapgen_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w); + +static char window_land_floor_texture_order[] = { + TERRAIN_SAND_DARK, TERRAIN_SAND_LIGHT, TERRAIN_DIRT, TERRAIN_GRASS_CLUMPS, TERRAIN_GRASS, + TERRAIN_ROCK, TERRAIN_SAND, TERRAIN_MARTIAN, TERRAIN_CHECKERBOARD, TERRAIN_ICE, + TERRAIN_GRID_RED, TERRAIN_GRID_YELLOW, TERRAIN_GRID_BLUE, TERRAIN_GRID_GREEN +}; + +static char window_land_wall_texture_order[] = { + TERRAIN_EDGE_ROCK, TERRAIN_EDGE_WOOD_RED, + TERRAIN_EDGE_WOOD_BLACK, TERRAIN_EDGE_ICE, + 0, 0 +}; + +static int _mapSize = 150; +static int _baseHeight = 12; +static int _waterLevel = 6; +static int _floorTexture = TERRAIN_GRASS; +static int _wallTexture = TERRAIN_EDGE_ROCK; + +rct_window *window_mapgen_open() +{ + rct_window *w; + + w = window_bring_to_front_by_class(WC_MAPGEN); + if (w == NULL) { + w = window_create( + (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, uint16) - 300) / 2, + (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 200) / 2, + 300, + 200, + window_mapgen_page_events[0], + WC_MAPGEN, + WF_10 + ); + w->widgets = window_mapgen_page_widgets[0]; + w->enabled_widgets = window_mapgen_page_enabled_widgets[0]; + w->number = 0; + w->page = 0; + w->frame_no = 0; + w->disabled_widgets = 0; + w->colours[0] = 12; + w->colours[1] = 24; + w->colours[2] = 24; + } + + w->page = WINDOW_MAPGEN_PAGE_BASE; + window_invalidate(w); + w->widgets = window_mapgen_page_widgets[0]; + w->enabled_widgets = window_mapgen_page_enabled_widgets[0]; + w->var_020 = RCT2_GLOBAL(0x00988E3C, uint32); + w->event_handlers = window_mapgen_page_events[0]; + w->pressed_widgets = 0; + w->disabled_widgets = 0; + window_init_scroll_widgets(w); + + return w; +} + +#pragma region Base page + +static void window_mapgen_base_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: + window_mapgen_set_page(w, widgetIndex - WIDX_TAB_1); + break; + case WIDX_GENERATE: + mapgen_generate_blank(_mapSize, _baseHeight + 2, _waterLevel + 2, _floorTexture, _wallTexture); + gfx_invalidate_screen(); + break; + } +} + +static void window_mapgen_base_mousedown(int widgetIndex, rct_window *w, rct_widget* widget) +{ + int i; + + switch (widgetIndex) { + case WIDX_MAP_SIZE_UP: + _mapSize = min(_mapSize + 1, 256); + window_invalidate(w); + break; + case WIDX_MAP_SIZE_DOWN: + _mapSize = max(_mapSize - 1, 16); + window_invalidate(w); + break; + case WIDX_BASE_HEIGHT_UP: + _baseHeight = min(_baseHeight + 2, 60); + window_invalidate(w); + break; + case WIDX_BASE_HEIGHT_DOWN: + _baseHeight = max(_baseHeight - 2, 0); + window_invalidate(w); + break; + case WIDX_WATER_LEVEL_UP: + _waterLevel = min(_waterLevel + 2, 60); + window_invalidate(w); + break; + case WIDX_WATER_LEVEL_DOWN: + _waterLevel = max(_waterLevel - 2, 0); + window_invalidate(w); + break; + case WIDX_FLOOR_TEXTURE: + for (i = 0; i < 14; i++) { + gDropdownItemsFormat[i] = -1; + gDropdownItemsArgs[i] = SPR_FLOOR_TEXTURE_GRASS + window_land_floor_texture_order[i]; + if (window_land_floor_texture_order[i] == _floorTexture) + RCT2_GLOBAL(0x009DEBA2, sint16) = i; + } + window_dropdown_show_image( + w->x + widget->left, w->y + widget->top, + widget->bottom - widget->top, + w->colours[2], + 0, + 14, + 47, 36, + gAppropriateImageDropdownItemsPerRow[14] + ); + break; + case WIDX_WALL_TEXTURE: + for (i = 0; i < 4; i++) { + gDropdownItemsFormat[i] = -1; + gDropdownItemsArgs[i] = SPR_WALL_TEXTURE_ROCK + window_land_wall_texture_order[i]; + if (window_land_wall_texture_order[i] == _wallTexture) + RCT2_GLOBAL(0x009DEBA2, sint16) = i; + } + window_dropdown_show_image( + w->x + widget->left, w->y + widget->top, + widget->bottom - widget->top, + w->colours[2], + 0, + 4, + 47, 36, + gAppropriateImageDropdownItemsPerRow[4] + ); + break; + } +} + +static void window_mapgen_base_dropdown() +{ + int type; + short dropdownIndex, widgetIndex; + rct_window *w; + + window_dropdown_get_registers(w, widgetIndex, dropdownIndex); + + switch (widgetIndex) { + case WIDX_FLOOR_TEXTURE: + if (dropdownIndex == -1) + dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16); + + type = (dropdownIndex == -1) ? + _floorTexture : + *((uint32*)&gDropdownItemsArgs[dropdownIndex]) - SPR_FLOOR_TEXTURE_GRASS; + + if (RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_SURFACE, uint8) == type) { + RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_SURFACE, uint8) = 255; + } else { + RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_SURFACE, uint8) = type; + _floorTexture = type; + } + window_invalidate(w); + break; + case WIDX_WALL_TEXTURE: + if (dropdownIndex == -1) + dropdownIndex = RCT2_GLOBAL(0x009DEBA2, sint16); + + type = (dropdownIndex == -1) ? + _wallTexture : + *((uint32*)&gDropdownItemsArgs[dropdownIndex]) - SPR_WALL_TEXTURE_ROCK; + + if (RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_EDGE, uint8) == type) { + RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_EDGE, uint8) = 255; + } else { + RCT2_GLOBAL(RCT2_ADDRESS_SELECTED_TERRAIN_EDGE, uint8) = type; + _wallTexture = type; + } + window_invalidate(w); + break; + } +} + +static void window_mapgen_base_update(rct_window *w) +{ + // Tab animation + if (++w->frame_no >= window_mapgen_tab_animation_loops[w->page]) + w->frame_no = 0; + widget_invalidate(w, WIDX_TAB_1); +} + +static void window_mapgen_base_invalidate() +{ + rct_window *w; + + window_get_register(w); + + if (w->widgets != window_mapgen_page_widgets[WINDOW_MAPGEN_PAGE_BASE]) { + w->widgets = window_mapgen_page_widgets[WINDOW_MAPGEN_PAGE_BASE]; + window_init_scroll_widgets(w); + } + + w->widgets[WIDX_FLOOR_TEXTURE].image = SPR_FLOOR_TEXTURE_GRASS + _floorTexture; + w->widgets[WIDX_WALL_TEXTURE].image = SPR_WALL_TEXTURE_ROCK + _wallTexture; + + window_mapgen_set_pressed_tab(w); + window_mapgen_anchor_border_widgets(w); +} + +static void window_mapgen_base_paint() +{ + uint16 arg; + rct_window *w; + rct_drawpixelinfo *dpi; + + window_paint_get_registers(w, dpi); + + window_draw_widgets(w, dpi); + window_mapgen_draw_tab_images(dpi, w); + + gfx_draw_string_left(dpi, STR_MAP_SIZE, 0, 0, w->x + 4, w->y + w->widgets[WIDX_MAP_SIZE].top + 1); + gfx_draw_string_left(dpi, 2691, 0, 0, w->x + 4, w->y + w->widgets[WIDX_BASE_HEIGHT].top + 1); + gfx_draw_string_left(dpi, 2692, 0, 0, w->x + 4, w->y + w->widgets[WIDX_WATER_LEVEL].top + 1); + gfx_draw_string_left(dpi, 2693, 0, 0, w->x + 4, w->y + w->widgets[WIDX_FLOOR_TEXTURE].top + 1); + + uint16 mapSizeArgs[2] = { _mapSize, _mapSize }; + gfx_draw_string_left(dpi, 839, mapSizeArgs, w->colours[1], w->x + w->widgets[WIDX_MAP_SIZE].left + 1, w->y + w->widgets[WIDX_MAP_SIZE].top + 1); + + arg = _baseHeight; + gfx_draw_string_left(dpi, 3310, &arg, w->colours[1], w->x + w->widgets[WIDX_BASE_HEIGHT].left + 1, w->y + w->widgets[WIDX_BASE_HEIGHT].top + 1); + + arg = _waterLevel; + gfx_draw_string_left(dpi, 3310, &arg, w->colours[1], w->x + w->widgets[WIDX_WATER_LEVEL].left + 1, w->y + w->widgets[WIDX_WATER_LEVEL].top + 1); +} + +#pragma endregion + +#pragma region Random page + +static void window_mapgen_random_mouseup() +{ + rct_window * w; + short widgetIndex; + + window_widget_get_registers(w, widgetIndex); + + switch (widgetIndex) { + case WIDX_CLOSE: + window_close(w); + break; + case WIDX_TAB_1: + case WIDX_TAB_2: + window_mapgen_set_page(w, widgetIndex - WIDX_TAB_1); + break; + case WIDX_GENERATE: + mapgen_generate(_mapSize); + gfx_invalidate_screen(); + break; + } +} + +static void window_mapgen_random_mousedown(int widgetIndex, rct_window *w, rct_widget* widget) +{ + +} + +static void window_mapgen_random_update(rct_window *w) +{ + // Tab animation + if (++w->frame_no >= window_mapgen_tab_animation_loops[w->page]) + w->frame_no = 0; + widget_invalidate(w, WIDX_TAB_2); +} + +static void window_mapgen_random_invalidate() +{ + rct_window *w; + + window_get_register(w); + + if (w->widgets != window_mapgen_page_widgets[WINDOW_MAPGEN_PAGE_RANDOM]) { + w->widgets = window_mapgen_page_widgets[WINDOW_MAPGEN_PAGE_RANDOM]; + window_init_scroll_widgets(w); + } + + window_mapgen_set_pressed_tab(w); + window_mapgen_anchor_border_widgets(w); +} + +static void window_mapgen_random_paint() +{ + rct_window *w; + rct_drawpixelinfo *dpi; + + window_paint_get_registers(w, dpi); + + window_draw_widgets(w, dpi); + window_mapgen_draw_tab_images(dpi, w); +} + +#pragma endregion + +#pragma region Common + +static void window_mapgen_set_page(rct_window *w, int page) +{ + w->page = page; + w->frame_no = 0; + if (w->viewport != NULL) { + w->viewport->width = 0; + w->viewport = NULL; + } + + w->enabled_widgets = window_mapgen_page_enabled_widgets[page]; + w->var_020 = RCT2_ADDRESS(0x00988E3C, uint32)[page]; + w->event_handlers = window_mapgen_page_events[page]; + w->widgets = window_mapgen_page_widgets[page]; + w->disabled_widgets = 0; + w->pressed_widgets = 0; + + window_invalidate(w); + if (w->page == WINDOW_MAPGEN_PAGE_BASE) { + w->width = 300; + w->height = 196; + } else { + w->width = 320; + w->height = 207; + } + RCT2_CALLPROC_X(w->event_handlers[WE_RESIZE], 0, 0, 0, 0, (int)w, 0, 0); + RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)w, 0, 0); + + window_init_scroll_widgets(w); + window_invalidate(w); +} + +static void window_mapgen_set_pressed_tab(rct_window *w) +{ + int i; + for (i = 0; i < WINDOW_MAPGEN_PAGE_COUNT; i++) + w->pressed_widgets &= ~(1 << (WIDX_TAB_1 + i)); + w->pressed_widgets |= 1LL << (WIDX_TAB_1 + w->page); +} + +static void window_mapgen_anchor_border_widgets(rct_window *w) +{ + int width = w->widgets[WIDX_GENERATE].right - w->widgets[WIDX_GENERATE].left; + int height = w->widgets[WIDX_GENERATE].bottom - w->widgets[WIDX_GENERATE].top; + + w->widgets[WIDX_GENERATE].left = w->width - 3 - width; + w->widgets[WIDX_GENERATE].right = w->width - 3; + w->widgets[WIDX_GENERATE].bottom = w->height - 3; + w->widgets[WIDX_GENERATE].top = w->height - 3 - height; + + w->widgets[WIDX_BACKGROUND].right = w->width - 1; + w->widgets[WIDX_BACKGROUND].bottom = w->height - 1; + w->widgets[WIDX_PAGE_BACKGROUND].right = w->width - 1; + w->widgets[WIDX_PAGE_BACKGROUND].bottom = w->height - 3 - height - 3; + w->widgets[WIDX_TITLE].right = w->width - 2; + w->widgets[WIDX_CLOSE].left = w->width - 13; + w->widgets[WIDX_CLOSE].right = w->width - 3; +} + +static void window_mapgen_draw_tab_image(rct_drawpixelinfo *dpi, rct_window *w, int page, int spriteIndex) +{ + int widgetIndex = WIDX_TAB_1 + page; + + if (!(w->disabled_widgets & (1LL << widgetIndex))) { + if (w->page == page) { + int frame = w->frame_no / 2; + if (page == WINDOW_MAPGEN_PAGE_BASE) + frame %= 8; + spriteIndex += frame; + } + + gfx_draw_sprite(dpi, spriteIndex, w->x + w->widgets[widgetIndex].left, w->y + w->widgets[widgetIndex].top, 0); + } +} + +static void window_mapgen_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w) +{ + +} + +#pragma endregion \ No newline at end of file diff --git a/src/windows/game_top_toolbar.c b/src/windows/top_toolbar.c similarity index 60% rename from src/windows/game_top_toolbar.c rename to src/windows/top_toolbar.c index bfcf28cd48..fdeb3ff087 100644 --- a/src/windows/game_top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -19,6 +19,7 @@ *****************************************************************************/ #include "../addresses.h" +#include "../editor.h" #include "../game.h" #include "../input.h" #include "../sprites.h" @@ -105,7 +106,7 @@ static const int right_aligned_widgets_order[] = { #pragma endregion -static rct_widget window_game_top_toolbar_widgets[] = { +static rct_widget window_top_toolbar_widgets[] = { { WWT_TRNBTN, 0, 0x0000, 0x001D, 0, 27, 0x20000000 | SPR_TOOLBAR_PAUSE, STR_PAUSE_GAME_TIP }, // Pause { WWT_TRNBTN, 0, 0x001E + 30, 0x003B + 30, 0, 27, 0x20000000 | SPR_TOOLBAR_FILE, STR_DISC_AND_GAME_OPTIONS_TIP }, // File menu { WWT_TRNBTN, 1, 0x0046 + 30, 0x0063 + 30, 0, 27, 0x20000000 | SPR_TOOLBAR_ZOOM_OUT, STR_ZOOM_OUT_TIP }, // Zoom out @@ -133,85 +134,63 @@ static rct_widget window_game_top_toolbar_widgets[] = { { WIDGETS_END }, }; -static void window_game_top_toolbar_emptysub() { } -static void window_game_top_toolbar_mouseup(); -static void window_game_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); -static void window_game_top_toolbar_dropdown(); -static void window_game_top_toolbar_tool_update(); -static void window_game_top_toolbar_tool_down(); -static void window_game_top_toolbar_tool_drag(); -static void window_game_top_toolbar_invalidate(); -static void window_game_top_toolbar_paint(); +static void window_top_toolbar_emptysub() { } +static void window_top_toolbar_mouseup(); +static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); +static void window_top_toolbar_dropdown(); +static void window_top_toolbar_tool_update(); +static void window_top_toolbar_tool_down(); +static void window_top_toolbar_tool_drag(); +static void window_top_toolbar_invalidate(); +static void window_top_toolbar_paint(); -static void* window_game_top_toolbar_events[] = { - window_game_top_toolbar_emptysub, - window_game_top_toolbar_mouseup, - window_game_top_toolbar_emptysub, - window_game_top_toolbar_mousedown, - window_game_top_toolbar_dropdown, - window_game_top_toolbar_emptysub, - window_game_top_toolbar_emptysub, - window_game_top_toolbar_emptysub, - window_game_top_toolbar_emptysub, - window_game_top_toolbar_tool_update, - window_game_top_toolbar_tool_down, - window_game_top_toolbar_tool_drag, - (void*)0x0066CC5B, - (void*)0x0066CA58, - window_game_top_toolbar_emptysub, - window_game_top_toolbar_emptysub, - window_game_top_toolbar_emptysub, - window_game_top_toolbar_emptysub, - window_game_top_toolbar_emptysub, - window_game_top_toolbar_emptysub, - window_game_top_toolbar_emptysub, - window_game_top_toolbar_emptysub, - window_game_top_toolbar_emptysub, - window_game_top_toolbar_emptysub, - window_game_top_toolbar_emptysub, - window_game_top_toolbar_invalidate, - window_game_top_toolbar_paint, - window_game_top_toolbar_emptysub +static void* window_top_toolbar_events[] = { + window_top_toolbar_emptysub, + window_top_toolbar_mouseup, + window_top_toolbar_emptysub, + window_top_toolbar_mousedown, + window_top_toolbar_dropdown, + window_top_toolbar_emptysub, + window_top_toolbar_emptysub, + window_top_toolbar_emptysub, + window_top_toolbar_emptysub, // check if editor versions are significantly different... + window_top_toolbar_tool_update, // editor: 0x0066fB0E + window_top_toolbar_tool_down, // editor: 0x0066fB5C + window_top_toolbar_tool_drag, // editor: 0x0066fB37 + (void*)0x0066CC5B, // editor: 0x0066fC44 + (void*)0x0066CA58, // editor: 0x0066fA74 + window_top_toolbar_emptysub, + window_top_toolbar_emptysub, + window_top_toolbar_emptysub, + window_top_toolbar_emptysub, + window_top_toolbar_emptysub, + window_top_toolbar_emptysub, + window_top_toolbar_emptysub, + window_top_toolbar_emptysub, + window_top_toolbar_emptysub, + window_top_toolbar_emptysub, + window_top_toolbar_emptysub, + window_top_toolbar_invalidate, + window_top_toolbar_paint, + window_top_toolbar_emptysub }; /** * Creates the main game top toolbar window. * rct2: 0x0066B485 (part of 0x0066B3E8) */ -void window_game_top_toolbar_open() +void window_top_toolbar_open() { rct_window* window; window = window_create( 0, 0, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16), 28, - (uint32*)window_game_top_toolbar_events, + (uint32*)window_top_toolbar_events, WC_TOP_TOOLBAR, WF_STICK_TO_FRONT | WF_TRANSPARENT | WF_5 ); - window->widgets = window_game_top_toolbar_widgets; - - window->enabled_widgets |= - (1 << WIDX_PAUSE) | - (1 << WIDX_FILE_MENU) | - (1 << WIDX_ZOOM_OUT) | - (1 << WIDX_ZOOM_IN) | - (1 << WIDX_ROTATE) | - (1 << WIDX_VIEW_MENU) | - (1 << WIDX_MAP) | - (1 << WIDX_LAND) | - (1 << WIDX_WATER) | - (1 << WIDX_SCENERY) | - (1 << WIDX_PATH) | - (1 << WIDX_CONSTRUCT_RIDE) | - (1 << WIDX_RIDES) | - (1 << WIDX_PARK) | - (1 << WIDX_STAFF) | - (1 << WIDX_GUESTS) | - (1 << WIDX_CLEAR_SCENERY) | - //(1ULL << WIDX_FASTFORWARD) | - (1ULL << WIDX_FINANCES) | - (1ULL << WIDX_RESEARCH); + window->widgets = window_top_toolbar_widgets; window_init_scroll_widgets(window); window->colours[0] = 7; @@ -224,7 +203,7 @@ void window_game_top_toolbar_open() * * rct2: 0x0066C957 */ -static void window_game_top_toolbar_mouseup() +static void window_top_toolbar_mouseup() { short widgetIndex; rct_window *w, *mainWindow; @@ -239,7 +218,7 @@ static void window_game_top_toolbar_mouseup() // // This is an excellent place to add in debugging statements and // // print routines, that will be triggered when you press the // // button in the game. Use "git update-index --skip-worktree - // // src/window_game_top_toolbar" to avoid committing these changes to + // // src/window_top_toolbar" to avoid committing these changes to // // version control. // window_cheats_open(); // break; @@ -302,25 +281,51 @@ static void window_game_top_toolbar_mouseup() * * rct2: 0x0066CA3B */ -static void window_game_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widget* widget) +static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widget* widget) { + int numItems; + switch (widgetIndex) { case WIDX_FILE_MENU: - gDropdownItemsFormat[0] = STR_LOAD_GAME; - gDropdownItemsFormat[1] = STR_SAVE_GAME; - gDropdownItemsFormat[2] = 0; - gDropdownItemsFormat[3] = STR_ABOUT; - gDropdownItemsFormat[4] = STR_OPTIONS; - gDropdownItemsFormat[5] = STR_SCREENSHOT; - gDropdownItemsFormat[6] = 0; - gDropdownItemsFormat[7] = STR_QUIT_GAME; + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER)) { + gDropdownItemsFormat[0] = STR_ABOUT; + gDropdownItemsFormat[1] = STR_OPTIONS; + gDropdownItemsFormat[2] = STR_SCREENSHOT; + gDropdownItemsFormat[3] = 0; + gDropdownItemsFormat[4] = STR_QUIT_TRACK_DESIGNS_MANAGER; + + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_DESIGNER) + gDropdownItemsFormat[4] = STR_QUIT_ROLLERCOASTER_DESIGNER; + + numItems = 5; + } else if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) { + gDropdownItemsFormat[0] = STR_LOAD_LANDSCAPE; + gDropdownItemsFormat[1] = STR_SAVE_LANDSCAPE; + gDropdownItemsFormat[2] = 0; + gDropdownItemsFormat[3] = STR_ABOUT; + gDropdownItemsFormat[4] = STR_OPTIONS; + gDropdownItemsFormat[5] = STR_SCREENSHOT; + gDropdownItemsFormat[6] = 0; + gDropdownItemsFormat[7] = STR_QUIT_SCENARIO_EDITOR; + numItems = 8; + } else { + gDropdownItemsFormat[0] = STR_LOAD_GAME; + gDropdownItemsFormat[1] = STR_SAVE_GAME; + gDropdownItemsFormat[2] = 0; + gDropdownItemsFormat[3] = STR_ABOUT; + gDropdownItemsFormat[4] = STR_OPTIONS; + gDropdownItemsFormat[5] = STR_SCREENSHOT; + gDropdownItemsFormat[6] = 0; + gDropdownItemsFormat[7] = STR_QUIT_GAME; + numItems = 8; + } window_dropdown_show_text( w->x + widget->left, w->y + widget->top, widget->bottom - widget->top + 1, w->colours[0] | 0x80, 0x80, - 8 + numItems ); break; case WIDX_VIEW_MENU: @@ -329,15 +334,22 @@ static void window_game_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct case WIDX_MAP: gDropdownItemsFormat[0] = 2523; gDropdownItemsFormat[1] = 2780; + numItems = 2; + + if ((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) && g_editor_step == EDITOR_STEP_LANDSCAPE_EDITOR) { + gDropdownItemsFormat[2] = 2690; + numItems++; + } + window_dropdown_show_text( w->x + widget->left, w->y + widget->top, widget->bottom - widget->top + 1, w->colours[1] | 0x80, 0, - 2 + numItems ); - RCT2_GLOBAL(0x9DEBA2, uint16) = 0; + RCT2_GLOBAL(0x009DEBA2, uint16) = 0; break; } } @@ -346,7 +358,7 @@ static void window_game_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct * * rct2: 0x0066C9EA */ -static void window_game_top_toolbar_dropdown() +static void window_top_toolbar_dropdown() { short widgetIndex, dropdownIndex; rct_window* w; @@ -355,24 +367,33 @@ static void window_game_top_toolbar_dropdown() switch (widgetIndex) { case WIDX_FILE_MENU: + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER)) + dropdownIndex += DDIDX_ABOUT; + switch (dropdownIndex) { - case DDIDX_LOAD_GAME: // load game + case DDIDX_LOAD_GAME: game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 0, 0); break; - case DDIDX_SAVE_GAME: // save game - tool_cancel(); - save_game(); + case DDIDX_SAVE_GAME: + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) { + RCT2_CALLPROC_EBPSAFE(0x0066FE2A); + } else { + tool_cancel(); + save_game(); + } break; - case DDIDX_ABOUT: // about + case DDIDX_ABOUT: window_about_open(); break; - case DDIDX_OPTIONS: // options + case DDIDX_OPTIONS: window_options_open(); break; - case DDIDX_SCREENSHOT: // screenshot + case DDIDX_SCREENSHOT: RCT2_GLOBAL(RCT2_ADDRESS_SCREENSHOT_COUNTDOWN, sint8) = 10; break; - case DDIDX_QUIT_GAME: // quit game + case DDIDX_QUIT_GAME: + window_close_by_class(WC_MANAGE_TRACK_DESIGN); + window_close_by_class(WC_TRACK_DELETE_PROMPT); game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 1, 0); break; } @@ -382,7 +403,8 @@ static void window_game_top_toolbar_dropdown() break; case WIDX_MAP: if (dropdownIndex == -1) - dropdownIndex = RCT2_GLOBAL(0x9DEBA2, uint16); + dropdownIndex = RCT2_GLOBAL(0x009DEBA2, uint16); + switch (dropdownIndex) { case 0: window_map_open(); @@ -390,6 +412,9 @@ static void window_game_top_toolbar_dropdown() case 1: window_viewport_open(); break; + case 2: + window_mapgen_open(); + break; } break; } @@ -399,40 +424,104 @@ static void window_game_top_toolbar_dropdown() * * rct2: 0x0066C810 */ -static void window_game_top_toolbar_invalidate() +static void window_top_toolbar_invalidate() { - int x; + int i, x, enabledWidgets, widgetIndex, widgetWidth; rct_window *w; + rct_widget *widget; window_get_register(w); - // Anchor the right half of the buttons to the right - x = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16); - if (x < 640) - x = 640; + // Enable / disable buttons + window_top_toolbar_widgets[WIDX_PAUSE].type = WWT_TRNBTN; + window_top_toolbar_widgets[WIDX_FILE_MENU].type = WWT_TRNBTN; + window_top_toolbar_widgets[WIDX_ZOOM_OUT].type = WWT_TRNBTN; + window_top_toolbar_widgets[WIDX_ZOOM_IN].type = WWT_TRNBTN; + window_top_toolbar_widgets[WIDX_ROTATE].type = WWT_TRNBTN; + window_top_toolbar_widgets[WIDX_VIEW_MENU].type = WWT_TRNBTN; + window_top_toolbar_widgets[WIDX_MAP].type = WWT_TRNBTN; + window_top_toolbar_widgets[WIDX_LAND].type = WWT_TRNBTN; + window_top_toolbar_widgets[WIDX_WATER].type = WWT_TRNBTN; + window_top_toolbar_widgets[WIDX_SCENERY].type = WWT_TRNBTN; + window_top_toolbar_widgets[WIDX_PATH].type = WWT_TRNBTN; + window_top_toolbar_widgets[WIDX_CONSTRUCT_RIDE].type = WWT_TRNBTN; + window_top_toolbar_widgets[WIDX_RIDES].type = WWT_TRNBTN; + window_top_toolbar_widgets[WIDX_PARK].type = WWT_TRNBTN; + window_top_toolbar_widgets[WIDX_STAFF].type = WWT_TRNBTN; + window_top_toolbar_widgets[WIDX_GUESTS].type = WWT_TRNBTN; + window_top_toolbar_widgets[WIDX_CLEAR_SCENERY].type = WWT_TRNBTN; + window_top_toolbar_widgets[WIDX_FINANCES].type = WWT_TRNBTN; + window_top_toolbar_widgets[WIDX_RESEARCH].type = WWT_TRNBTN; - for (int i = 0; i < countof(right_aligned_widgets_order); ++i) { - rct_widget *current_widget = &window_game_top_toolbar_widgets[right_aligned_widgets_order[i]]; - int widget_width = current_widget->right - current_widget->left; + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & (SCREEN_FLAGS_SCENARIO_EDITOR | SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER)) { + window_top_toolbar_widgets[WIDX_PAUSE].type = WWT_EMPTY; + window_top_toolbar_widgets[WIDX_RIDES].type = WWT_EMPTY; + window_top_toolbar_widgets[WIDX_PARK].type = WWT_EMPTY; + window_top_toolbar_widgets[WIDX_STAFF].type = WWT_EMPTY; + window_top_toolbar_widgets[WIDX_GUESTS].type = WWT_EMPTY; + window_top_toolbar_widgets[WIDX_FINANCES].type = WWT_EMPTY; + window_top_toolbar_widgets[WIDX_RESEARCH].type = WWT_EMPTY; - x -= 1; - current_widget->right = x; - x -= widget_width; - current_widget->left = x; + if (g_editor_step != EDITOR_STEP_LANDSCAPE_EDITOR) { + window_top_toolbar_widgets[WIDX_MAP].type = WWT_EMPTY; + window_top_toolbar_widgets[WIDX_LAND].type = WWT_EMPTY; + window_top_toolbar_widgets[WIDX_WATER].type = WWT_EMPTY; + window_top_toolbar_widgets[WIDX_SCENERY].type = WWT_EMPTY; + window_top_toolbar_widgets[WIDX_PATH].type = WWT_EMPTY; + window_top_toolbar_widgets[WIDX_CLEAR_SCENERY].type = WWT_EMPTY; + } + + if (g_editor_step != EDITOR_STEP_ROLLERCOASTER_DESIGNER) { + window_top_toolbar_widgets[WIDX_CONSTRUCT_RIDE].type = WWT_EMPTY; + } + + if (g_editor_step != EDITOR_STEP_LANDSCAPE_EDITOR && g_editor_step != EDITOR_STEP_ROLLERCOASTER_DESIGNER) { + window_top_toolbar_widgets[WIDX_ZOOM_OUT].type = WWT_EMPTY; + window_top_toolbar_widgets[WIDX_ZOOM_IN].type = WWT_EMPTY; + window_top_toolbar_widgets[WIDX_ROTATE].type = WWT_EMPTY; + window_top_toolbar_widgets[WIDX_VIEW_MENU].type = WWT_EMPTY; + } + } else { + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) + window_top_toolbar_widgets[WIDX_FINANCES].type = WWT_EMPTY; } + enabledWidgets = 0; + for (i = WIDX_PAUSE; i <= WIDX_RESEARCH; i++) + if (window_top_toolbar_widgets[i].type != WWT_EMPTY) + enabledWidgets |= (1 << i); + w->enabled_widgets = enabledWidgets; + + // Align left hand side toolbar buttons x = 0; - for (int i = 0; i < countof(left_aligned_widgets_order); ++i) { - rct_widget *current_widget = &window_game_top_toolbar_widgets[left_aligned_widgets_order[i]]; - int widget_width = current_widget->right - current_widget->left; + widgetIndex = left_aligned_widgets_order[i]; + widget = &window_top_toolbar_widgets[widgetIndex]; + if (widget->type == WWT_EMPTY && widgetIndex != WIDX_SEPARATOR) + continue; - current_widget->left = x; - x += widget_width; - current_widget->right = x; + widgetWidth = widget->right - widget->left; + widget->left = x; + x += widgetWidth; + widget->right = x; x += 1; } + // Align right hand side toolbar buttons + x = max(640, RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16)); + for (int i = 0; i < countof(right_aligned_widgets_order); ++i) { + widgetIndex = right_aligned_widgets_order[i]; + widget = &window_top_toolbar_widgets[widgetIndex]; + if (widget->type == WWT_EMPTY && widgetIndex != WIDX_SEPARATOR) + continue; + + widgetWidth = widget->right - widget->left; + x -= 1; + widget->right = x; + x -= widgetWidth; + widget->left = x; + } + // Footpath button pressed down if (window_find_by_class(WC_FOOTPATH) == NULL) w->pressed_widgets &= ~(1 << WIDX_PATH); @@ -453,28 +542,18 @@ static void window_game_top_toolbar_invalidate() // Zoomed out/in disable. Not sure where this code is in the original. if (window_get_main()->viewport->zoom == 0){ w->disabled_widgets |= (1 << WIDX_ZOOM_IN); - } - else if (window_get_main()->viewport->zoom == 3){ + } else if (window_get_main()->viewport->zoom == 3){ w->disabled_widgets |= (1 << WIDX_ZOOM_OUT); - } - else - { + } else { w->disabled_widgets &= ~((1 << WIDX_ZOOM_IN) | (1 << WIDX_ZOOM_OUT)); } - - if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY) { - window_game_top_toolbar_widgets[WIDX_FINANCES].type = WWT_EMPTY; - } - else{ - window_game_top_toolbar_widgets[WIDX_FINANCES].type = WWT_TRNBTN; - } } /** * * rct2: 0x0066C8EC */ -static void window_game_top_toolbar_paint() +static void window_top_toolbar_paint() { int x, y, imgId; rct_window *w; @@ -485,24 +564,28 @@ static void window_game_top_toolbar_paint() window_draw_widgets(w, dpi); // Draw staff button image (setting masks to the staff colours) - x = w->x + window_game_top_toolbar_widgets[WIDX_STAFF].left; - y = w->y + window_game_top_toolbar_widgets[WIDX_STAFF].top; - imgId = 5627; - if (widget_is_pressed(w, WIDX_STAFF)) - imgId++; - imgId |= (RCT2_GLOBAL(RCT2_ADDRESS_HANDYMAN_COLOUR, uint8) << 19) | 0xA0000000 | (RCT2_GLOBAL(RCT2_ADDRESS_MECHANIC_COLOUR, uint8) << 24); - gfx_draw_sprite(dpi, imgId, x, y, 0); + if (window_top_toolbar_widgets[WIDX_STAFF].type != WWT_EMPTY) { + x = w->x + window_top_toolbar_widgets[WIDX_STAFF].left; + y = w->y + window_top_toolbar_widgets[WIDX_STAFF].top; + imgId = 5627; + if (widget_is_pressed(w, WIDX_STAFF)) + imgId++; + imgId |= (RCT2_GLOBAL(RCT2_ADDRESS_HANDYMAN_COLOUR, uint8) << 19) | 0xA0000000 | (RCT2_GLOBAL(RCT2_ADDRESS_MECHANIC_COLOUR, uint8) << 24); + gfx_draw_sprite(dpi, imgId, x, y, 0); + } // Draw research button - x = w->x + window_game_top_toolbar_widgets[WIDX_RESEARCH].left - 1; - y = w->y + window_game_top_toolbar_widgets[WIDX_RESEARCH].top; - imgId = SPR_TAB_FINANCES_RESEARCH_0; - gfx_draw_sprite(dpi, imgId, x, y, 0); + if (window_top_toolbar_widgets[WIDX_RESEARCH].type != WWT_EMPTY) { + x = w->x + window_top_toolbar_widgets[WIDX_RESEARCH].left - 1; + y = w->y + window_top_toolbar_widgets[WIDX_RESEARCH].top; + imgId = SPR_TAB_FINANCES_RESEARCH_0; + gfx_draw_sprite(dpi, imgId, x, y, 0); + } // Draw finances button - if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)){ - x = w->x + window_game_top_toolbar_widgets[WIDX_FINANCES].left + 3; - y = w->y + window_game_top_toolbar_widgets[WIDX_FINANCES].top + 1; + if (window_top_toolbar_widgets[WIDX_FINANCES].type != WWT_EMPTY) { + x = w->x + window_top_toolbar_widgets[WIDX_FINANCES].left + 3; + y = w->y + window_top_toolbar_widgets[WIDX_FINANCES].top + 1; imgId = SPR_FINANCE; gfx_draw_sprite(dpi, imgId, x, y, 0); } @@ -511,7 +594,7 @@ static void window_game_top_toolbar_paint() /** * rct2: 0x6e2cc6 */ -static void window_game_top_toolbar_scenery_tool_down(short x, short y, rct_window* w, short widgetIndex){ +static void window_top_toolbar_scenery_tool_down(short x, short y, rct_window* w, short widgetIndex){ RCT2_CALLPROC_EBPSAFE(0x006E2712); if (window_scenery_is_repaint_scenery_tool_on & 1){ //6e3158 @@ -579,7 +662,7 @@ static void window_game_top_toolbar_scenery_tool_down(short x, short y, rct_wind * * rct2: 0x0066CB25 */ -static void window_game_top_toolbar_tool_update() +static void window_top_toolbar_tool_update() { short widgetIndex; rct_window *w; @@ -606,7 +689,7 @@ static void window_game_top_toolbar_tool_update() /** * rct2: 0x0066CB73 */ -static void window_game_top_toolbar_tool_down(){ +static void window_top_toolbar_tool_down(){ short widgetIndex; rct_window* w; short x, y; @@ -652,7 +735,7 @@ static void window_game_top_toolbar_tool_down(){ } break; case WIDX_SCENERY: - window_game_top_toolbar_scenery_tool_down(x, y, w, widgetIndex); + window_top_toolbar_scenery_tool_down(x, y, w, widgetIndex); break; } } @@ -661,7 +744,7 @@ static void window_game_top_toolbar_tool_down(){ * * rct2: 0x0066CB4E */ -static void window_game_top_toolbar_tool_drag() +static void window_top_toolbar_tool_drag() { short widgetIndex; rct_window *w; diff --git a/src/world/map.c b/src/world/map.c index cc221baa0f..29f883d71f 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -168,7 +168,7 @@ rct_map_element *map_get_surface_element_at(int x, int y) * * rct2: 0x0068AB4C */ -void map_init() +void map_init(int size) { int i; rct_map_element *map_element; @@ -194,10 +194,10 @@ void map_init() RCT2_GLOBAL(0x013B0E70, sint16) = 0; _sub_6A876D_save_x = 0; _sub_6A876D_save_y = 0; - RCT2_GLOBAL(0x01358830, sint16) = 4768; - RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAXIMUM_X_Y, sint16) = 5054; - RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, sint16) = 150; - RCT2_GLOBAL(0x01358836, sint16) = 4767; + RCT2_GLOBAL(0x01358830, sint16) = size * 32 - 32; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_MAXIMUM_X_Y, sint16) = size * 32 - 2; + RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE, sint16) = size; + RCT2_GLOBAL(0x01358836, sint16) = size * 32 - 33; RCT2_GLOBAL(0x01359208, sint16) = 7; map_update_tile_pointers(); RCT2_CALLPROC_EBPSAFE(0x0068ADBC); diff --git a/src/world/map.h b/src/world/map.h index a7b85fe510..eb83a32c6a 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -223,7 +223,7 @@ typedef struct { extern const rct_xy16 TileDirectionDelta[]; extern rct_xy16 *gMapSelectionTiles; -void map_init(); +void map_init(int size); void map_update_tile_pointers(); rct_map_element *map_get_first_element_at(int x, int y); int map_element_is_last_for_tile(rct_map_element *element); diff --git a/src/world/mapgen.c b/src/world/mapgen.c index 8b1c9e9256..2a583fea16 100644 --- a/src/world/mapgen.c +++ b/src/world/mapgen.c @@ -40,25 +40,31 @@ static uint8 *_height; const uint8 BaseTerrain[] = { TERRAIN_GRASS, TERRAIN_SAND, TERRAIN_SAND_LIGHT, TERRAIN_ICE }; -void mapgen_generate() +void mapgen_generate_blank(int mapSize, int height, int waterLevel, int floor, int wall) { - int i, x, y, mapSize, baseTerrain; + int x, y; rct_map_element *mapElement; - /* - mapElement = RCT2_ADDRESS(RCT2_ADDRESS_MAP_ELEMENTS, rct_map_element); - for (i = 0; i < MAX_MAP_ELEMENTS; i++) { - if ((mapElement->type & MAP_ELEMENT_TYPE_MASK) != MAP_ELEMENT_TYPE_SURFACE) { - i = i; + map_init(mapSize); + for (y = 1; y < mapSize - 1; y++) { + for (x = 1; x < mapSize - 1; x++) { + mapElement = map_get_surface_element_at(x, y); + map_element_set_terrain(mapElement, floor); + map_element_set_terrain_edge(mapElement, wall); + mapElement->base_height = height; + mapElement->clearance_height = height; } - mapElement++; } - */ - map_init(); + mapgen_set_water_level(waterLevel); +} - // Not sure how to change map size at the moment, default is 150 - mapSize = 150; +void mapgen_generate(int mapSize) +{ + int i, x, y, baseTerrain; + rct_map_element *mapElement; + + map_init(mapSize); srand((unsigned int)time(NULL)); baseTerrain = BaseTerrain[rand() % countof(BaseTerrain)]; diff --git a/src/world/mapgen.h b/src/world/mapgen.h index 11c0032f89..9f98af55c1 100644 --- a/src/world/mapgen.h +++ b/src/world/mapgen.h @@ -21,6 +21,7 @@ #ifndef _MAPGEN_H_ #define _MAPGEN_H_ -void mapgen_generate(); +void mapgen_generate_blank(int mapSize, int height, int waterLevel, int floor, int wall); +void mapgen_generate(int mapSize); #endif \ No newline at end of file