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