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