diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters
index 83a1f06cf3..1e47f241f4 100644
--- a/projects/openrct2.vcxproj.filters
+++ b/projects/openrct2.vcxproj.filters
@@ -357,7 +357,6 @@
Source\Management
-
Source\Windows
@@ -369,9 +368,6 @@
-
- Libraries\lodepng
-
Libraries\libspeex
@@ -393,6 +389,17 @@
Libraries\libspeex
+
+
+
+ Libraries\lodepng
+
+
+
+
+ Libraries\libspeex
+
+
diff --git a/src/interface/window.h b/src/interface/window.h
index 83adaa1489..1242215e0d 100644
--- a/src/interface/window.h
+++ b/src/interface/window.h
@@ -507,6 +507,7 @@ void window_bubble_list_item(rct_window* w, int item_position);
void window_align_tabs( rct_window *w, uint8 start_tab_id, uint8 end_tab_id );
void window_new_ride_init_vars();
+void window_new_ride_focus(ride_list_item rideItem);
void window_staff_list_init_vars();
diff --git a/src/management/news_item.c b/src/management/news_item.c
index fb20be1fd1..885b3c4ed0 100644
--- a/src/management/news_item.c
+++ b/src/management/news_item.c
@@ -282,9 +282,8 @@ void news_item_add_to_queue(uint8 type, rct_string_id string_id, uint32 assoc)
* rct2: 0x0066EBE6
*
**/
-void news_item_open_subject(int type, int subject) {
-
- int eax;
+void news_item_open_subject(int type, int subject)
+{
rct_peep* peep;
rct_window* window;
@@ -301,14 +300,15 @@ void news_item_open_subject(int type, int subject) {
window_finances_open();
break;
case NEWS_ITEM_RESEARCH:
-
if (subject >= 0x10000) {
// Open ride list window
- RCT2_CALLPROC_EBPSAFE(0x006B3CFF);
- eax = (subject & 0xFF00) >> 8;
- eax += (subject & 0xFF) << 8;
+ window_new_ride_open();
+
// Switch to right tab and scroll to ride location
- RCT2_CALLPROC_X(0x006B3EBA, eax, 0, subject, 0, 0, 0, 0);
+ ride_list_item rideItem;
+ rideItem.type = subject >> 8;
+ rideItem.entry_index = subject & 0xFF;
+ window_new_ride_focus(rideItem);
break;
}
@@ -322,13 +322,12 @@ void news_item_open_subject(int type, int subject) {
RCT2_CALLPROC_X(0x006E1172, (subject & 0xFFFF), 0, subject, 0, 0, 0, 0);
}
RCT2_GLOBAL(0x009DE518, uint32) |= (1 << 6);
- // Open scenery window
- RCT2_CALLPROC_EBPSAFE(0x006E0FEF);
+ window_scenery_open();
}
}
+
// Switch to new scenery tab
RCT2_CALLPROC_X(0x006E1172, (subject & 0xFFFF), 0, subject, 0, 0, 0, 0);
-
break;
case NEWS_ITEM_PEEPS:
// Open guest list to right tab
diff --git a/src/management/research.c b/src/management/research.c
index c94edf3565..9d71a0b95d 100644
--- a/src/management/research.c
+++ b/src/management/research.c
@@ -33,6 +33,17 @@ extern rct_research_item *gResearchItems = (rct_research_item*)RCT2_RESEARCH_ITE
// 0x00EE787C
uint8 gResearchUncompletedCategories;
+/**
+ *
+ * rct2: 0x006671AD, part of 0x00667132
+ */
+void research_reset_items()
+{
+ gResearchItems[0].entryIndex = RESEARCHED_ITEMS_SEPERATOR;
+ gResearchItems[1].entryIndex = RESEARCHED_ITEMS_END;
+ gResearchItems[2].entryIndex = -3;
+}
+
/**
*
* rct2: 0x00684BAE
@@ -107,7 +118,7 @@ static void research_next_design()
researchItem = firstUnresearchedItem;
for (;;) {
researchItem++;
- if (researchItem->entryIndex == -2) {
+ if (researchItem->entryIndex == RESEARCHED_ITEMS_END) {
if (!ignoreActiveResearchTypes) {
ignoreActiveResearchTypes = 1;
researchItem = firstUnresearchedItem;
diff --git a/src/management/research.h b/src/management/research.h
index 0407fd3ece..1194798dd8 100644
--- a/src/management/research.h
+++ b/src/management/research.h
@@ -30,6 +30,7 @@ typedef struct {
} rct_research_item;
#define RESEARCHED_ITEMS_SEPERATOR -1
+#define RESEARCHED_ITEMS_END -2
enum {
RESEARCH_FUNDING_NONE,
@@ -48,6 +49,7 @@ enum {
extern rct_research_item *gResearchItems;
extern uint8 gResearchUncompletedCategories;
+void research_reset_items();
void research_update_uncompleted_types();
void research_update();
diff --git a/src/windows/game_top_toolbar.c b/src/windows/game_top_toolbar.c
index 093a1fa531..17d294f7a9 100644
--- a/src/windows/game_top_toolbar.c
+++ b/src/windows/game_top_toolbar.c
@@ -260,7 +260,6 @@ static void window_game_top_toolbar_mouseup()
if (!tool_set(w, WIDX_SCENERY, 0)) {
RCT2_GLOBAL(0x009DE518, uint32) |= (1 << 6);
window_scenery_open();
- //RCT2_CALLPROC_EBPSAFE(0x006E0FEF);
}
break;
case WIDX_PATH:
diff --git a/src/windows/new_ride.c b/src/windows/new_ride.c
index 96261a7cea..8c6589ec60 100644
--- a/src/windows/new_ride.c
+++ b/src/windows/new_ride.c
@@ -242,6 +242,7 @@ static void* window_new_ride_events[] = {
const int window_new_ride_tab_animation_loops[] = { 20, 32, 10, 72, 24, 28, 16 };
const int window_new_ride_tab_animation_divisor[] = { 4, 8, 2, 4, 4, 4, 2 };
+static void window_new_ride_set_page(rct_window *w, int page);
static void window_new_ride_refresh_widget_sizing(rct_window *w);
static ride_list_item window_new_ride_scroll_get_ride_list_item_at(rct_window *w, int x, int y);
static void window_new_ride_paint_ride_information(rct_window *w, rct_drawpixelinfo *dpi, ride_list_item item, int x, int y, int width);
@@ -428,6 +429,52 @@ void window_new_ride_open()
window_new_ride_scroll_to_focused_ride(w);
}
+/**
+ *
+ * rct2: 0x006B3EBA
+ */
+void window_new_ride_focus(ride_list_item rideItem)
+{
+ rct_window *w;
+ rct_ride_type *rideType;
+
+ w = window_find_by_id(WC_CONSTRUCT_RIDE, 0);
+ if (w == NULL)
+ return;
+
+ rideType = GET_RIDE_ENTRY(rideItem.entry_index);
+ window_new_ride_set_page(w, rideType->category[0]);
+
+ ride_list_item *listItem = (ride_list_item*)0x00F43523;
+ while (listItem->type != RIDE_TYPE_NULL) {
+ if (listItem->type == rideItem.type && listItem->entry_index == rideItem.type) {
+ RCT2_GLOBAL(0x00F43825, uint8) = rideItem.type;
+ RCT2_GLOBAL(0x00F43826, uint8) = rideItem.entry_index;
+ w->new_ride.highlighted_ride_id = (rideItem.entry_index << 8) | rideItem.type;
+ window_new_ride_scroll_to_focused_ride(w);
+ }
+ listItem++;
+ }
+}
+
+static void window_new_ride_set_page(rct_window *w, int page)
+{
+ _window_new_ride_current_tab = page;
+ w->frame_no = 0;
+ w->new_ride.highlighted_ride_id = -1;
+ w->new_ride.selected_ride_countdown = -1;
+ window_new_ride_populate_list();
+ if (page < WINDOW_NEW_RIDE_PAGE_RESEARCH) {
+ w->new_ride.highlighted_ride_id = RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_RIDE_LIST_HIGHLIGHTED_ITEM, sint16)[page];
+ if (w->new_ride.highlighted_ride_id == -1)
+ w->new_ride.highlighted_ride_id = RCT2_GLOBAL(0x00F43523, sint16);
+ }
+
+ window_new_ride_refresh_widget_sizing(w);
+ window_invalidate(w);
+ window_new_ride_scroll_to_focused_ride(w);
+}
+
/**
*
* rct2: 0x006B3DF1
@@ -550,26 +597,8 @@ static void window_new_ride_mouseup()
*/
static void window_new_ride_mousedown(int widgetIndex, rct_window *w, rct_widget *widget)
{
- int page;
- if (widgetIndex < WIDX_TAB_1 || widgetIndex > WIDX_TAB_7)
- return;
-
- page = widgetIndex - WIDX_TAB_1;
-
- _window_new_ride_current_tab = page;
- w->frame_no = 0;
- w->new_ride.highlighted_ride_id = -1;
- w->new_ride.selected_ride_countdown = -1;
- window_new_ride_populate_list();
- if (page < WINDOW_NEW_RIDE_PAGE_RESEARCH) {
- w->new_ride.highlighted_ride_id = RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_RIDE_LIST_HIGHLIGHTED_ITEM, sint16)[page];
- if (w->new_ride.highlighted_ride_id == -1)
- w->new_ride.highlighted_ride_id = RCT2_GLOBAL(0x00F43523, sint16);
- }
-
- window_new_ride_refresh_widget_sizing(w);
- window_invalidate(w);
- window_new_ride_scroll_to_focused_ride(w);
+ if (widgetIndex >= WIDX_TAB_1 && widgetIndex <= WIDX_TAB_7)
+ window_new_ride_set_page(w, widgetIndex - WIDX_TAB_1);
}
/**
@@ -773,16 +802,20 @@ static void window_new_ride_paint()
y = w->y + window_new_ride_widgets[WIDX_LAST_DEVELOPMENT_GROUP].top + 12;
uint32 typeId = RCT2_GLOBAL(RCT2_ADDRESS_LAST_RESEARCHED_ITEM_SUBJECT, uint32);
+ int lastDevelopmentFormat;
if (typeId != 0xFFFFFFFF) {
if (typeId >= 0x10000) {
rct_ride_type *rideEntry = RCT2_GLOBAL(0x009ACFA4 + (typeId & 0xFF) * 4, rct_ride_type*);
stringId = rideEntry->var_008 & 0x1000 ?
rideEntry->name :
- (typeId & 0xFF00) + 2;
+ ((typeId >> 8) & 0xFF) + 2;
+
+ lastDevelopmentFormat = STR_RESEARCH_RIDE_LABEL;
} else {
stringId = g_scenerySetEntries[typeId]->name;
+ lastDevelopmentFormat = STR_RESEARCH_SCENERY_LABEL;
}
- gfx_draw_string_left_wrapped(dpi, &stringId, x, y, 266, STR_RESEARCH_RIDE_LABEL, 0);
+ gfx_draw_string_left_wrapped(dpi, &stringId, x, y, 266, lastDevelopmentFormat, 0);
}
}
diff --git a/src/windows/research.c b/src/windows/research.c
index 7a4e3b2af5..bb303e8f5e 100644
--- a/src/windows/research.c
+++ b/src/windows/research.c
@@ -197,7 +197,8 @@ static void* window_research_page_events[] = {
static uint32 window_research_page_enabled_widgets[] = {
(1 << WIDX_CLOSE) |
(1 << WIDX_TAB_1) |
- (1 << WIDX_TAB_2),
+ (1 << WIDX_TAB_2) |
+ (1 << WIDX_LAST_DEVELOPMENT_BUTTON),
(1 << WIDX_CLOSE) |
(1 << WIDX_TAB_1) |
diff --git a/src/world/park.c b/src/world/park.c
index 43317c2cd3..bca9737ab1 100644
--- a/src/world/park.c
+++ b/src/world/park.c
@@ -26,6 +26,7 @@
#include "../management/finance.h"
#include "../management/marketing.h"
#include "../management/news_item.h"
+#include "../management/research.h"
#include "../peep/peep.h"
#include "../ride/ride.h"
#include "../scenario.h"
@@ -76,9 +77,7 @@ void park_init()
for (i = 0; i < 20; i++)
RCT2_ADDRESS(0x01358102, uint8)[i] = 0;
- RCT2_GLOBAL(0x01358844, uint32) = 0xFFFFFFFF;
- RCT2_GLOBAL(0x01358849, uint32) = 0xFFFFFFFE;
- RCT2_GLOBAL(0x0135884E, uint32) = 0xFFFFFFFD;
+ research_reset_items();
finance_init();
for (i = 0; i < 2; i++)