diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index afc355f600..b480d80723 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -144,6 +144,8 @@ + + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index d0808e6a7f..5f0581eca7 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -419,6 +419,12 @@ Windows + + Windows + + + Windows + diff --git a/src/ride.c b/src/ride.c index da87ccce29..f6bb8eb460 100644 --- a/src/ride.c +++ b/src/ride.c @@ -430,10 +430,10 @@ rct_map_element *ride_find_track_gap(rct_map_element *startTrackElement, int *ou * * rct2: 0x006B4800 */ -void ride_construct_new(int list_item) +void ride_construct_new(ride_list_item listItem) { int eax, ebx, ecx, edx, esi, edi, ebp; - edx = list_item; + edx = *((uint16*)&listItem); eax = 0; ecx = 0; ebx = 1; diff --git a/src/ride.h b/src/ride.h index 0c18f6cb37..3d323c6a34 100644 --- a/src/ride.h +++ b/src/ride.h @@ -551,7 +551,7 @@ void ride_update_favourited_stat(); void ride_check_all_reachable(); rct_map_element *sub_6CAF80(int rideIndex, int *outX, int *outY); rct_map_element *ride_find_track_gap(rct_map_element *startTrackElement, int *outX, int *outY); -void ride_construct_new(int list_item); +void ride_construct_new(ride_list_item listItem); int ride_try_construct(rct_map_element *trackMapElement); void ride_get_status(int rideIndex, int *formatSecondary, int *argument); rct_peep *ride_get_assigned_mechanic(rct_ride *ride); diff --git a/src/string_ids.h b/src/string_ids.h index f4712174e9..4d22b3eb56 100644 --- a/src/string_ids.h +++ b/src/string_ids.h @@ -1197,7 +1197,7 @@ enum { STR_DESIGN_INCLUDES_SCENERY_WHICH_IS_UNAVAILABLE = 3134, STR_VEHICLE_DESIGN_UNAVAILABLE = 3135, - + STR_THIS_DESIGN_WILL_BE_BUILT_WITH_AN_ALTERNATIVE_VEHICLE_TYPE = 3136, STR_SELECT_NEARBY_SCENERY = 3137, STR_RESET_SELECTION = 3138, diff --git a/src/window.h b/src/window.h index 7254b8270c..8f74ccef9b 100644 --- a/src/window.h +++ b/src/window.h @@ -480,6 +480,7 @@ void window_finances_research_open(); void window_new_campaign_open(sint16 campaignType); void window_ride_main_open(int rideIndex); void window_ride_list_open(); +void window_track_place_open(); void window_new_ride_open(); void window_banner_open(); void window_cheats_open(); @@ -487,6 +488,7 @@ void window_research_open(); void window_scenery_open(); void window_music_credits_open(); void window_publisher_credits_open(); +void window_track_manage_open(); void window_guest_list_init_vars_a(); void window_guest_list_init_vars_b(); diff --git a/src/window_new_ride.c b/src/window_new_ride.c index b5ade2a1fb..c920c6e004 100644 --- a/src/window_new_ride.c +++ b/src/window_new_ride.c @@ -968,7 +968,5 @@ static void window_new_ride_select(rct_window *w) } } - // Show ride construction window - //RCT2_CALLPROC_X(0x006B4800, *((sint16*)&item), 0, 0, 0, 0, 0, 0); - ride_construct_new(*((sint16*)&item)); + ride_construct_new(item); } diff --git a/src/window_track_list.c b/src/window_track_list.c index b64a8706f3..d07a13347a 100644 --- a/src/window_track_list.c +++ b/src/window_track_list.c @@ -18,9 +18,9 @@ * along with this program. If not, see . *****************************************************************************/ -#include #include #include "addresses.h" +#include "audio.h" #include "editor.h" #include "ride.h" #include "sprites.h" @@ -95,6 +95,19 @@ static void* window_track_list_events[] = { static ride_list_item _window_track_list_item; +/** + * + * rct2: 0x006D1DEC + */ +static rct_track_design *track_get_info(int index, void** preview) +{ + int eax, ebx, ecx, edx, esi, edi, ebp; + eax = index; + RCT2_CALLFUNC_X(0x006D1DEC, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); + if (preview != NULL) *preview = (void*)esi; + return (rct_track_design*)edi; +} + /** * * rct2: 0x006CF1A2 @@ -140,9 +153,65 @@ void window_track_list_open(ride_list_item item) RCT2_GLOBAL(0x00F440AE, uint8) = 2; } +/** + * + * rct2: 0x006CFB82 + */ static void window_track_list_select(rct_window *w, int index) { - RCT2_CALLPROC_X(0x006CFB82, 0, index, 0, 0, (int)w, 0, 0); + uint8 *trackDesignItem, *trackDesignList = (uint8*)0x00F441EC; + char *src, *dst; + rct_track_design *trackDesign; + + w->track_list.var_480 = index; + + sound_play_panned(SOUND_CLICK_1, w->x + (w->width / 2), 0, 0, 0); + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER & 8) && index == 0) { + window_close(w); + ride_construct_new(_window_track_list_item); + return; + } + + if (RCT2_GLOBAL(0x00F44153, uint8) != 0) + RCT2_GLOBAL(0x00F44152, uint8) = 1; + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER & 8)) + index--; + + trackDesignItem = trackDesignList + (index * 128);; + RCT2_GLOBAL(0x00F4403C, uint8*) = trackDesignItem; + dst = (char*)0x009BC313; + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER & 8)) + *dst++ = FORMAT_WHITE; + *dst++ = FORMAT_OPENQUOTES; + + while (*src != '.' && *src != 0) { + *dst++ = *src++; + } + + *dst++ = FORMAT_ENDQUOTES; + *dst = 0; + + subsitute_path((char*)0x0141EF68, (char*)RCT2_ADDRESS_TRACKS_PATH, trackDesignItem); + + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER & 8) { + window_track_manage_open(); + return; + } + + if (!RCT2_CALLPROC_X(0x0067726A, 0, 0, 0, 0, 0, 0, 0)) { + w->track_list.var_480 = 0xFFFF; + window_invalidate(w); + return; + } + + trackDesign = track_get_info(index, NULL); + if (trackDesign->var_06 & 4) + window_error_open(STR_THIS_DESIGN_WILL_BE_BUILT_WITH_AN_ALTERNATIVE_VEHICLE_TYPE, -1); + + window_close(w); + window_track_place_open(); } static int window_track_list_get_list_item_index_from_position(int x, int y) @@ -336,19 +405,6 @@ static void window_track_list_invalidate() } } -/** - * - * rct2: 0x006D1DEC - */ -static rct_track_design *track_get_info(int index, void** preview) -{ - int eax, ebx, ecx, edx, esi, edi, ebp; - eax = index; - RCT2_CALLFUNC_X(0x006D1DEC, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - if (preview != NULL) *preview = (void*)esi; - return (rct_track_design*)edi; -} - /** * * rct2: 0x006CF387 diff --git a/src/window_track_manage.c b/src/window_track_manage.c new file mode 100644 index 0000000000..7741bdfe30 --- /dev/null +++ b/src/window_track_manage.c @@ -0,0 +1,31 @@ +/***************************************************************************** + * 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 "window.h" + +/** + * + * rct2: 0x006D348F + */ +void window_track_manage_open() +{ + RCT2_CALLPROC_EBPSAFE(0x006D348F); +} \ No newline at end of file diff --git a/src/window_track_place.c b/src/window_track_place.c new file mode 100644 index 0000000000..678384c295 --- /dev/null +++ b/src/window_track_place.c @@ -0,0 +1,52 @@ +/***************************************************************************** + * 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 "viewport.h" +#include "window.h" + +/** + * + * rct2: 0x006CFCA0 + */ +void window_track_place_open() +{ + rct_window *w; + + window_close_construction_windows(); + RCT2_GLOBAL(0x00F44168, void*) = rct2_malloc(13104); + RCT2_CALLPROC_EBPSAFE(0x006D182E); + + w = window_create(0, 29, 200, 124, (uint32*)0x0099405C, WC_TRACK_DESIGN_PLACE, 0); + w->widgets = (rct_widget*)0x009D7F18; + w->enabled_widgets = 4 | 8 | 0x10 | 0x20; + window_init_scroll_widgets(w); + w->colours[0] = 24; + w->colours[1] = 24; + w->colours[2] = 24; + tool_set(w, 6, 12); + RCT2_GLOBAL(0x009DE518, uint32) |= 6; + window_push_others_right(w); + show_gridlines(); + RCT2_GLOBAL(0x00F440D9, uint32) |= 0x80000000; + RCT2_GLOBAL(0x00F440DD, uint16) = 0xFFFF; + RCT2_GLOBAL(0x00F440AE, uint8) = (-RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8)) & 3; + RCT2_CALLPROC_EBPSAFE(0x006D1845); +} \ No newline at end of file