diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 3f3736c1dd..891f1f8670 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -4350,6 +4350,18 @@ STR_6038 :{SMALLFONT}{BLACK}If you have RCT1 installed, set this option to it STR_6039 :{SMALLFONT}{BLACK}Quick demolish ride STR_6040 :Edit Scenario Options STR_6041 :{BLACK}No mechanics are hired! +STR_6042 :Load height map +STR_6043 :Select height map +STR_6044 :Smooth height map +STR_6045 :Strength +STR_6046 :Normalize height map +STR_6047 :Smooth tiles +STR_6048 :Height map error +STR_6049 :Error reading PNG +STR_6050 :Error reading bitmap +STR_6051 :The width and height need to match +STR_6052 :The heightmap is too big, and will be cut off +STR_6053 :The heightmap cannot be normalized ############# # Scenarios # diff --git a/src/openrct2/localisation/string_ids.h b/src/openrct2/localisation/string_ids.h index b796c768a1..146b9d88b2 100644 --- a/src/openrct2/localisation/string_ids.h +++ b/src/openrct2/localisation/string_ids.h @@ -3700,6 +3700,19 @@ enum { STR_NO_MECHANICS_ARE_HIRED_MESSAGE = 6041, + STR_FILE_DIALOG_TITLE_LOAD_HEIGHTMAP = 6042, + STR_MAPGEN_SELECT_HEIGHTMAP = 6043, + STR_MAPGEN_SMOOTH_HEIGHTMAP = 6044, + STR_MAPGEN_SMOOTH_STRENGTH = 6045, + STR_MAPGEN_NORMALIZE = 6046, + STR_MAPGEN_SMOOTH_TILE = 6047, + STR_HEIGHT_MAP_ERROR = 6048, + STR_ERROR_READING_PNG = 6049, + STR_ERROR_READING_BITMAP = 6050, + STR_ERROR_WIDTH_AND_HEIGHT_DO_NOT_MATCH = 6051, + STR_ERROR_HEIHGT_MAP_TOO_BIG = 6052, + STR_ERROR_CANNOT_NORMALIZE = 6053, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/openrct2/windows/mapgen.c b/src/openrct2/windows/mapgen.c index 1f73f91926..632110c111 100644 --- a/src/openrct2/windows/mapgen.c +++ b/src/openrct2/windows/mapgen.c @@ -31,6 +31,7 @@ enum { WINDOW_MAPGEN_PAGE_BASE, WINDOW_MAPGEN_PAGE_RANDOM, WINDOW_MAPGEN_PAGE_SIMPLEX, + WINDOW_MAPGEN_PAGE_HEIGHTMAP, WINDOW_MAPGEN_PAGE_COUNT }; @@ -42,10 +43,13 @@ enum { WIDX_TAB_1, WIDX_TAB_2, WIDX_TAB_3, + WIDX_TAB_4, WIDX_GENERATE, - WIDX_MAP_SIZE = 8, + TAB_BEGIN, + + WIDX_MAP_SIZE = TAB_BEGIN, WIDX_MAP_SIZE_UP, WIDX_MAP_SIZE_DOWN, WIDX_BASE_HEIGHT, @@ -57,10 +61,10 @@ enum { WIDX_FLOOR_TEXTURE, WIDX_WALL_TEXTURE, - WIDX_RANDOM_TERRAIN = 8, + WIDX_RANDOM_TERRAIN = TAB_BEGIN, WIDX_PLACE_TREES, - WIDX_SIMPLEX_LABEL = 8, + WIDX_SIMPLEX_LABEL = TAB_BEGIN, WIDX_SIMPLEX_LOW, WIDX_SIMPLEX_LOW_UP, WIDX_SIMPLEX_LOW_DOWN, @@ -85,7 +89,7 @@ enum { #pragma region Widgets -static rct_widget window_mapgen_base_widgets[] = { +static rct_widget BaseWidgets[] = { { WWT_FRAME, 0, 0, 299, 0, 195, 0xFFFFFFFF, STR_NONE }, { WWT_CAPTION, 0, 1, 298, 1, 14, STR_MAPGEN_WINDOW_TITLE, STR_WINDOW_TITLE_TIP }, { WWT_CLOSEBOX, 0, 287, 297, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, @@ -93,6 +97,7 @@ static rct_widget window_mapgen_base_widgets[] = { { WWT_TAB, 1, 3, 33, 17, 43, 0x20000000 | SPR_TAB, STR_NONE }, { WWT_TAB, 1, 34, 64, 17, 43, 0x20000000 | SPR_TAB, STR_NONE }, { WWT_TAB, 1, 65, 95, 17, 43, 0x20000000 | SPR_TAB, STR_NONE }, + { WWT_TAB, 1, 96, 126, 17, 43, 0x20000000 | SPR_TAB, STR_NONE }, { WWT_DROPDOWN_BUTTON, 1, 104, 198, 52, 63, STR_MAPGEN_ACTION_GENERATE, STR_NONE }, @@ -110,7 +115,7 @@ static rct_widget window_mapgen_base_widgets[] = { { WIDGETS_END }, }; -static rct_widget window_mapgen_random_widgets[] = { +static rct_widget RandomWidgets[] = { { WWT_FRAME, 0, 0, 299, 0, 195, 0xFFFFFFFF, STR_NONE }, { WWT_CAPTION, 0, 1, 298, 1, 14, STR_MAPGEN_WINDOW_TITLE, STR_WINDOW_TITLE_TIP }, { WWT_CLOSEBOX, 0, 287, 297, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, @@ -118,6 +123,7 @@ static rct_widget window_mapgen_random_widgets[] = { { WWT_TAB, 1, 3, 33, 17, 43, 0x20000000 | SPR_TAB, STR_NONE }, { WWT_TAB, 1, 34, 64, 17, 43, 0x20000000 | SPR_TAB, STR_NONE }, { WWT_TAB, 1, 65, 95, 17, 43, 0x20000000 | SPR_TAB, STR_NONE }, + { WWT_TAB, 1, 96, 126, 17, 43, 0x20000000 | SPR_TAB, STR_NONE }, { WWT_DROPDOWN_BUTTON, 1, 104, 198, 52, 63, STR_MAPGEN_ACTION_GENERATE, STR_NONE }, @@ -126,7 +132,7 @@ static rct_widget window_mapgen_random_widgets[] = { { WIDGETS_END }, }; -static rct_widget window_mapgen_simplex_widgets[] = { +static rct_widget SimplexWidgets[] = { { WWT_FRAME, 0, 0, 299, 0, 195, 0xFFFFFFFF, STR_NONE }, { WWT_CAPTION, 0, 1, 298, 1, 14, STR_MAPGEN_WINDOW_TITLE, STR_WINDOW_TITLE_TIP }, { WWT_CLOSEBOX, 0, 287, 297, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, @@ -134,6 +140,7 @@ static rct_widget window_mapgen_simplex_widgets[] = { { WWT_TAB, 1, 3, 33, 17, 43, 0x20000000 | SPR_TAB, STR_NONE }, { WWT_TAB, 1, 34, 64, 17, 43, 0x20000000 | SPR_TAB, STR_NONE }, { WWT_TAB, 1, 65, 95, 17, 43, 0x20000000 | SPR_TAB, STR_NONE }, + { WWT_TAB, 1, 96, 126, 17, 43, 0x20000000 | SPR_TAB, STR_NONE }, { WWT_DROPDOWN_BUTTON, 1, 104, 198, 52, 63, STR_MAPGEN_ACTION_GENERATE, STR_NONE }, @@ -169,14 +176,29 @@ static rct_widget window_mapgen_simplex_widgets[] = { { WIDGETS_END }, }; -const sint32 window_mapgen_tab_animation_divisor[] = { 1, 1, 1 }; -const sint32 window_mapgen_tab_animation_frames[] = { 1, 1, 1 }; +static rct_widget HeightmapWidgets[] = { + { WWT_FRAME, 0, 0, 299, 0, 195, 0xFFFFFFFF, STR_NONE }, + { WWT_CAPTION, 0, 1, 298, 1, 14, STR_MAPGEN_WINDOW_TITLE, 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, 0x20000000 | SPR_TAB, STR_NONE }, + { WWT_TAB, 1, 34, 64, 17, 43, 0x20000000 | SPR_TAB, STR_NONE }, + { WWT_TAB, 1, 65, 95, 17, 43, 0x20000000 | SPR_TAB, STR_NONE }, + { WWT_TAB, 1, 96, 126, 17, 43, 0x20000000 | SPR_TAB, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 104, 198, 52, 63, STR_MAPGEN_ACTION_GENERATE, STR_NONE }, -static rct_widget *window_mapgen_page_widgets[] = { - window_mapgen_base_widgets, - window_mapgen_random_widgets, - window_mapgen_simplex_widgets + { WIDGETS_END }, +}; + +static const sint32 TabAnimationDivisor[] = { 1, 1, 1, 1 }; +static const sint32 TabAnimationFrames[] = { 1, 1, 1, 1 }; + +static rct_widget *PageWidgets[] = { + BaseWidgets, + RandomWidgets, + SimplexWidgets, + HeightmapWidgets }; #pragma endregion @@ -204,7 +226,11 @@ static void window_mapgen_simplex_update(rct_window *w); static void window_mapgen_simplex_invalidate(rct_window *w); static void window_mapgen_simplex_paint(rct_window *w, rct_drawpixelinfo *dpi); -static rct_window_event_list window_mapgen_base_events = { +static void window_mapgen_heightmap_mouseup(rct_window *w, sint32 widgetIndex); +static void window_mapgen_heightmap_invalidate(rct_window *w); +static void window_mapgen_heightmap_paint(rct_window *w, rct_drawpixelinfo *dpi); + +static rct_window_event_list BaseEvents = { NULL, window_mapgen_base_mouseup, NULL, @@ -235,7 +261,7 @@ static rct_window_event_list window_mapgen_base_events = { NULL }; -static rct_window_event_list window_mapgen_random_events = { +static rct_window_event_list RandomEvents = { NULL, window_mapgen_random_mouseup, NULL, @@ -266,7 +292,7 @@ static rct_window_event_list window_mapgen_random_events = { NULL }; -static rct_window_event_list window_mapgen_simplex_events = { +static rct_window_event_list SimplexEvents = { NULL, window_mapgen_simplex_mouseup, NULL, @@ -297,68 +323,110 @@ static rct_window_event_list window_mapgen_simplex_events = { NULL }; -static rct_window_event_list *window_mapgen_page_events[] = { - &window_mapgen_base_events, - &window_mapgen_random_events, - &window_mapgen_simplex_events +static rct_window_event_list HeightmapEvents = { + NULL, + window_mapgen_heightmap_mouseup, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + window_mapgen_heightmap_invalidate, + window_mapgen_heightmap_paint, + NULL +}; + +static rct_window_event_list *PageEvents[] = { + &BaseEvents, + &RandomEvents, + &SimplexEvents, + &HeightmapEvents }; #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_TAB_3) | - (1 << WIDX_GENERATE) | - (1 << WIDX_MAP_SIZE) | - (1 << WIDX_MAP_SIZE_UP) | - (1 << WIDX_MAP_SIZE_DOWN) | - (1 << WIDX_BASE_HEIGHT) | - (1 << WIDX_BASE_HEIGHT_UP) | - (1 << WIDX_BASE_HEIGHT_DOWN) | - (1 << WIDX_WATER_LEVEL) | - (1 << WIDX_WATER_LEVEL_UP) | - (1 << WIDX_WATER_LEVEL_DOWN) | - (1 << WIDX_FLOOR_TEXTURE) | - (1 << WIDX_WALL_TEXTURE), +static uint32 PageEnabledWidgets[] = { + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_TAB_3) | + (1ULL << WIDX_TAB_4) | + (1ULL << WIDX_GENERATE) | + (1ULL << WIDX_MAP_SIZE) | + (1ULL << WIDX_MAP_SIZE_UP) | + (1ULL << WIDX_MAP_SIZE_DOWN) | + (1ULL << WIDX_BASE_HEIGHT) | + (1ULL << WIDX_BASE_HEIGHT_UP) | + (1ULL << WIDX_BASE_HEIGHT_DOWN) | + (1ULL << WIDX_WATER_LEVEL) | + (1ULL << WIDX_WATER_LEVEL_UP) | + (1ULL << WIDX_WATER_LEVEL_DOWN) | + (1ULL << WIDX_FLOOR_TEXTURE) | + (1ULL << WIDX_WALL_TEXTURE), - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_TAB_3) | - (1 << WIDX_GENERATE) | - (1 << WIDX_RANDOM_TERRAIN) | - (1 << WIDX_PLACE_TREES), + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_TAB_3) | + (1ULL << WIDX_TAB_4) | + (1ULL << WIDX_GENERATE) | + (1ULL << WIDX_RANDOM_TERRAIN) | + (1ULL << WIDX_PLACE_TREES), - (1 << WIDX_CLOSE) | - (1 << WIDX_TAB_1) | - (1 << WIDX_TAB_2) | - (1 << WIDX_TAB_3) | - (1 << WIDX_GENERATE) | - (1 << WIDX_SIMPLEX_LABEL) | - (1 << WIDX_SIMPLEX_LOW) | - (1 << WIDX_SIMPLEX_LOW_UP) | - (1 << WIDX_SIMPLEX_LOW_DOWN) | - (1 << WIDX_SIMPLEX_HIGH) | - (1 << WIDX_SIMPLEX_HIGH_UP) | - (1 << WIDX_SIMPLEX_HIGH_DOWN) | - (1 << WIDX_SIMPLEX_BASE_FREQ) | - (1 << WIDX_SIMPLEX_BASE_FREQ_UP) | - (1 << WIDX_SIMPLEX_BASE_FREQ_DOWN) | - (1 << WIDX_SIMPLEX_OCTAVES) | - (1 << WIDX_SIMPLEX_OCTAVES_UP) | - (1 << WIDX_SIMPLEX_OCTAVES_DOWN) | - (1 << WIDX_SIMPLEX_MAP_SIZE) | - (1 << WIDX_SIMPLEX_MAP_SIZE_UP) | - (1 << WIDX_SIMPLEX_MAP_SIZE_DOWN) | - (1 << WIDX_SIMPLEX_WATER_LEVEL) | - (1 << WIDX_SIMPLEX_WATER_LEVEL_UP) | - (1 << WIDX_SIMPLEX_WATER_LEVEL_DOWN) | - (1 << WIDX_SIMPLEX_FLOOR_TEXTURE) | - (1 << WIDX_SIMPLEX_WALL_TEXTURE) + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_TAB_3) | + (1ULL << WIDX_TAB_4) | + (1ULL << WIDX_GENERATE) | + (1ULL << WIDX_SIMPLEX_LABEL) | + (1ULL << WIDX_SIMPLEX_LOW) | + (1ULL << WIDX_SIMPLEX_LOW_UP) | + (1ULL << WIDX_SIMPLEX_LOW_DOWN) | + (1ULL << WIDX_SIMPLEX_HIGH) | + (1ULL << WIDX_SIMPLEX_HIGH_UP) | + (1ULL << WIDX_SIMPLEX_HIGH_DOWN) | + (1ULL << WIDX_SIMPLEX_BASE_FREQ) | + (1ULL << WIDX_SIMPLEX_BASE_FREQ_UP) | + (1ULL << WIDX_SIMPLEX_BASE_FREQ_DOWN) | + (1ULL << WIDX_SIMPLEX_OCTAVES) | + (1ULL << WIDX_SIMPLEX_OCTAVES_UP) | + (1ULL << WIDX_SIMPLEX_OCTAVES_DOWN) | + (1ULL << WIDX_SIMPLEX_MAP_SIZE) | + (1ULL << WIDX_SIMPLEX_MAP_SIZE_UP) | + (1ULL << WIDX_SIMPLEX_MAP_SIZE_DOWN) | + (1ULL << WIDX_SIMPLEX_WATER_LEVEL) | + (1ULL << WIDX_SIMPLEX_WATER_LEVEL_UP) | + (1ULL << WIDX_SIMPLEX_WATER_LEVEL_DOWN) | + (1ULL << WIDX_SIMPLEX_FLOOR_TEXTURE) | + (1ULL << WIDX_SIMPLEX_WALL_TEXTURE), + + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_TAB_3) | + (1ULL << WIDX_TAB_4) | + (1ULL << WIDX_GENERATE) }; static uint32 window_mapgen_page_hold_down_widgets[] = { @@ -437,7 +505,7 @@ rct_window *window_mapgen_open() w = window_create_centred( 300, 200, - window_mapgen_page_events[0], + PageEvents[0], WC_MAPGEN, WF_10 ); @@ -447,10 +515,10 @@ rct_window *window_mapgen_open() w->page = WINDOW_MAPGEN_PAGE_BASE; window_invalidate(w); - w->widgets = window_mapgen_page_widgets[WINDOW_MAPGEN_PAGE_BASE]; - w->enabled_widgets = window_mapgen_page_enabled_widgets[WINDOW_MAPGEN_PAGE_BASE]; + w->widgets = PageWidgets[WINDOW_MAPGEN_PAGE_BASE]; + w->enabled_widgets = PageEnabledWidgets[WINDOW_MAPGEN_PAGE_BASE]; w->hold_down_widgets = window_mapgen_page_hold_down_widgets[WINDOW_MAPGEN_PAGE_BASE]; - w->event_handlers = window_mapgen_page_events[WINDOW_MAPGEN_PAGE_BASE]; + w->event_handlers = PageEvents[WINDOW_MAPGEN_PAGE_BASE]; w->pressed_widgets = 0; w->disabled_widgets = 0; window_init_scroll_widgets(w); @@ -471,6 +539,7 @@ static void window_mapgen_base_mouseup(rct_window *w, sint32 widgetIndex) case WIDX_TAB_1: case WIDX_TAB_2: case WIDX_TAB_3: + case WIDX_TAB_4: window_mapgen_set_page(w, widgetIndex - WIDX_TAB_1); break; case WIDX_GENERATE: @@ -655,8 +724,8 @@ static void window_mapgen_base_invalidate(rct_window *w) { colour_scheme_update(w); - if (w->widgets != window_mapgen_page_widgets[WINDOW_MAPGEN_PAGE_BASE]) { - w->widgets = window_mapgen_page_widgets[WINDOW_MAPGEN_PAGE_BASE]; + if (w->widgets != PageWidgets[WINDOW_MAPGEN_PAGE_BASE]) { + w->widgets = PageWidgets[WINDOW_MAPGEN_PAGE_BASE]; window_init_scroll_widgets(w); } @@ -705,6 +774,7 @@ static void window_mapgen_random_mouseup(rct_window *w, sint32 widgetIndex) case WIDX_TAB_1: case WIDX_TAB_2: case WIDX_TAB_3: + case WIDX_TAB_4: window_mapgen_set_page(w, widgetIndex - WIDX_TAB_1); break; case WIDX_GENERATE: @@ -749,8 +819,8 @@ static void window_mapgen_random_invalidate(rct_window *w) { colour_scheme_update(w); - if (w->widgets != window_mapgen_page_widgets[WINDOW_MAPGEN_PAGE_RANDOM]) { - w->widgets = window_mapgen_page_widgets[WINDOW_MAPGEN_PAGE_RANDOM]; + if (w->widgets != PageWidgets[WINDOW_MAPGEN_PAGE_RANDOM]) { + w->widgets = PageWidgets[WINDOW_MAPGEN_PAGE_RANDOM]; window_init_scroll_widgets(w); } @@ -785,6 +855,7 @@ static void window_mapgen_simplex_mouseup(rct_window *w, sint32 widgetIndex) case WIDX_TAB_1: case WIDX_TAB_2: case WIDX_TAB_3: + case WIDX_TAB_4: window_mapgen_set_page(w, widgetIndex - WIDX_TAB_1); break; case WIDX_SIMPLEX_MAP_SIZE: @@ -959,8 +1030,8 @@ static void window_mapgen_simplex_invalidate(rct_window *w) { colour_scheme_update(w); - if (w->widgets != window_mapgen_page_widgets[WINDOW_MAPGEN_PAGE_SIMPLEX]) { - w->widgets = window_mapgen_page_widgets[WINDOW_MAPGEN_PAGE_SIMPLEX]; + if (w->widgets != PageWidgets[WINDOW_MAPGEN_PAGE_SIMPLEX]) { + w->widgets = PageWidgets[WINDOW_MAPGEN_PAGE_SIMPLEX]; window_init_scroll_widgets(w); } @@ -1000,6 +1071,50 @@ static void window_mapgen_simplex_paint(rct_window *w, rct_drawpixelinfo *dpi) #pragma endregion +#pragma region Heightmap page + +static void window_mapgen_heightmap_mouseup(rct_window *w, sint32 widgetIndex) +{ + switch (widgetIndex) + { + case WIDX_CLOSE: + window_close(w); + break; + case WIDX_TAB_1: + case WIDX_TAB_2: + case WIDX_TAB_3: + case WIDX_TAB_4: + window_mapgen_set_page(w, widgetIndex - WIDX_TAB_1); + break; + case WIDX_GENERATE: + mapgen_generate_from_heightmap(); + gfx_invalidate_screen(); + break; + } +} + +static void window_mapgen_heightmap_invalidate(rct_window *w) +{ + colour_scheme_update(w); + + if (w->widgets != PageWidgets[WINDOW_MAPGEN_PAGE_HEIGHTMAP]) + { + w->widgets = PageWidgets[WINDOW_MAPGEN_PAGE_HEIGHTMAP]; + window_init_scroll_widgets(w); + } + + window_mapgen_set_pressed_tab(w); + window_mapgen_anchor_border_widgets(w); +} + +static void window_mapgen_heightmap_paint(rct_window *w, rct_drawpixelinfo *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, sint32 page) @@ -1011,10 +1126,10 @@ static void window_mapgen_set_page(rct_window *w, sint32 page) w->viewport = NULL; } - w->enabled_widgets = window_mapgen_page_enabled_widgets[page]; + w->enabled_widgets = PageEnabledWidgets[page]; w->hold_down_widgets = window_mapgen_page_hold_down_widgets[page]; - w->event_handlers = window_mapgen_page_events[page]; - w->widgets = window_mapgen_page_widgets[page]; + w->event_handlers = PageEvents[page]; + w->widgets = PageWidgets[page]; w->disabled_widgets = 0; w->pressed_widgets = 0; @@ -1055,8 +1170,8 @@ static void window_mapgen_draw_tab_image(rct_drawpixelinfo *dpi, rct_window *w, if (!(w->disabled_widgets & (1LL << widgetIndex))) { if (w->page == page) { - sint32 frame = w->frame_no / window_mapgen_tab_animation_divisor[w->page]; - spriteIndex += (frame % window_mapgen_tab_animation_frames[w->page]); + sint32 frame = w->frame_no / TabAnimationDivisor[w->page]; + spriteIndex += (frame % TabAnimationFrames[w->page]); } gfx_draw_sprite(dpi, spriteIndex, w->x + w->widgets[widgetIndex].left, w->y + w->widgets[widgetIndex].top, 0); @@ -1068,6 +1183,7 @@ static void window_mapgen_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w) window_mapgen_draw_tab_image(dpi, w, WINDOW_MAPGEN_PAGE_BASE, SPR_G2_TAB_LAND); window_mapgen_draw_tab_image(dpi, w, WINDOW_MAPGEN_PAGE_RANDOM, SPR_G2_TAB_TREE); window_mapgen_draw_tab_image(dpi, w, WINDOW_MAPGEN_PAGE_SIMPLEX, SPR_G2_TAB_PENCIL); + window_mapgen_draw_tab_image(dpi, w, WINDOW_MAPGEN_PAGE_SIMPLEX, SPR_G2_TAB_NEWS); } #pragma endregion diff --git a/src/openrct2/world/mapgen.c b/src/openrct2/world/mapgen.c index e9175cc25c..c960546951 100644 --- a/src/openrct2/world/mapgen.c +++ b/src/openrct2/world/mapgen.c @@ -764,3 +764,49 @@ static void mapgen_simplex(mapgen_settings *settings) } #pragma endregion + +#pragma region Heightmap + +#pragma optimize("", off) +void mapgen_generate_from_heightmap() +{ + SDL_Surface *bitmap = SDL_LoadBMP("test.bmp"); + if (bitmap == NULL) + { + printf("Failed to load bitmap: %s\n", SDL_GetError()); + return; + } + + uint32 width = bitmap->w; + uint32 height = bitmap->h; + uint8 numChannels = bitmap->format->BytesPerPixel; + + map_init(width + 2); // + 2 for the black tiles around the map + + SDL_LockSurface(bitmap); + uint8 *src = (uint8*)bitmap->pixels; + for (uint32 y = 0; y < height; y++) + { + for (uint32 x = 0; x < width; x++) + { + // The x and y axis are flipped in the world, so this uses y for x and x for y. + rct_map_element *const surfaceElement = map_get_surface_element_at(y + 1, x + 1); + surfaceElement->base_height = src[x * numChannels + y * bitmap->pitch] / 3 + 2; + surfaceElement->base_height /= 2; + surfaceElement->base_height *= 2; + surfaceElement->clearance_height = surfaceElement->base_height; + + const sint32 water_level = 24; // TODO: Get as setting + if (surfaceElement->base_height < water_level) + { + surfaceElement->properties.surface.terrain |= water_level / 2; + } + } + } + + SDL_UnlockSurface(bitmap); + SDL_FreeSurface(bitmap); +} +#pragma optimize("", on) + +#pragma endregion \ No newline at end of file diff --git a/src/openrct2/world/mapgen.h b/src/openrct2/world/mapgen.h index c4fd2d101e..d11a69c0b2 100644 --- a/src/openrct2/world/mapgen.h +++ b/src/openrct2/world/mapgen.h @@ -38,5 +38,6 @@ typedef struct mapgen_settings { void mapgen_generate_blank(mapgen_settings *settings); void mapgen_generate(mapgen_settings *settings); void mapgen_generate_custom_simplex(mapgen_settings *settings); +void mapgen_generate_from_heightmap(); #endif