Compile research.cpp as C++, small refactor

This commit is contained in:
Michael Steenbeek 2017-10-05 16:22:37 +02:00 committed by Michał Janiszewski
parent 10def2a31b
commit 25b72260d7
15 changed files with 302 additions and 189 deletions

View File

@ -26,6 +26,7 @@
4C8B42701EEB1ABD00F015CA /* X8DrawingEngine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4C8B426E1EEB1ABD00F015CA /* X8DrawingEngine.cpp */; }; 4C8B42701EEB1ABD00F015CA /* X8DrawingEngine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4C8B426E1EEB1ABD00F015CA /* X8DrawingEngine.cpp */; };
4C8B42721EEB1AE400F015CA /* HardwareDisplayDrawingEngine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4C8B42711EEB1AE400F015CA /* HardwareDisplayDrawingEngine.cpp */; }; 4C8B42721EEB1AE400F015CA /* HardwareDisplayDrawingEngine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4C8B42711EEB1AE400F015CA /* HardwareDisplayDrawingEngine.cpp */; };
4C8B42741EEB1B6F00F015CA /* Screenshot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4C8B42731EEB1B6F00F015CA /* Screenshot.cpp */; }; 4C8B42741EEB1B6F00F015CA /* Screenshot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4C8B42731EEB1B6F00F015CA /* Screenshot.cpp */; };
4C93F1141F86728F00A9330D /* Research.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4C93F1121F86728F00A9330D /* Research.cpp */; };
4CB832A71EFBDCCE00B88761 /* land_tool.c in Sources */ = {isa = PBXBuildFile; fileRef = 4CB832A51EFBDCCE00B88761 /* land_tool.c */; }; 4CB832A71EFBDCCE00B88761 /* land_tool.c in Sources */ = {isa = PBXBuildFile; fileRef = 4CB832A51EFBDCCE00B88761 /* land_tool.c */; };
4CB832AB1EFFB8D100B88761 /* ttf_sdlport.c in Sources */ = {isa = PBXBuildFile; fileRef = 4CB832A81EFFB8D100B88761 /* ttf_sdlport.c */; }; 4CB832AB1EFFB8D100B88761 /* ttf_sdlport.c in Sources */ = {isa = PBXBuildFile; fileRef = 4CB832A81EFFB8D100B88761 /* ttf_sdlport.c */; };
4CB832AC1EFFB8D100B88761 /* ttf.c in Sources */ = {isa = PBXBuildFile; fileRef = 4CB832A91EFFB8D100B88761 /* ttf.c */; }; 4CB832AC1EFFB8D100B88761 /* ttf.c in Sources */ = {isa = PBXBuildFile; fileRef = 4CB832A91EFFB8D100B88761 /* ttf.c */; };
@ -250,7 +251,6 @@
F76C863D1EC4E88300FA49E2 /* finance.c in Sources */ = {isa = PBXBuildFile; fileRef = F76C83ED1EC4E7CC00FA49E2 /* finance.c */; }; F76C863D1EC4E88300FA49E2 /* finance.c in Sources */ = {isa = PBXBuildFile; fileRef = F76C83ED1EC4E7CC00FA49E2 /* finance.c */; };
F76C863F1EC4E88300FA49E2 /* marketing.c in Sources */ = {isa = PBXBuildFile; fileRef = F76C83EF1EC4E7CC00FA49E2 /* marketing.c */; }; F76C863F1EC4E88300FA49E2 /* marketing.c in Sources */ = {isa = PBXBuildFile; fileRef = F76C83EF1EC4E7CC00FA49E2 /* marketing.c */; };
F76C86411EC4E88300FA49E2 /* news_item.c in Sources */ = {isa = PBXBuildFile; fileRef = F76C83F11EC4E7CC00FA49E2 /* news_item.c */; }; F76C86411EC4E88300FA49E2 /* news_item.c in Sources */ = {isa = PBXBuildFile; fileRef = F76C83F11EC4E7CC00FA49E2 /* news_item.c */; };
F76C86431EC4E88300FA49E2 /* research.c in Sources */ = {isa = PBXBuildFile; fileRef = F76C83F31EC4E7CC00FA49E2 /* research.c */; };
F76C86451EC4E88300FA49E2 /* Http.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F76C83F61EC4E7CC00FA49E2 /* Http.cpp */; }; F76C86451EC4E88300FA49E2 /* Http.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F76C83F61EC4E7CC00FA49E2 /* Http.cpp */; };
F76C86471EC4E88300FA49E2 /* Network.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F76C83F81EC4E7CC00FA49E2 /* Network.cpp */; }; F76C86471EC4E88300FA49E2 /* Network.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F76C83F81EC4E7CC00FA49E2 /* Network.cpp */; };
F76C86491EC4E88300FA49E2 /* NetworkAction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F76C83FA1EC4E7CC00FA49E2 /* NetworkAction.cpp */; }; F76C86491EC4E88300FA49E2 /* NetworkAction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F76C83FA1EC4E7CC00FA49E2 /* NetworkAction.cpp */; };
@ -618,6 +618,8 @@
4C8B426F1EEB1ABD00F015CA /* X8DrawingEngine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = X8DrawingEngine.h; sourceTree = "<group>"; }; 4C8B426F1EEB1ABD00F015CA /* X8DrawingEngine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = X8DrawingEngine.h; sourceTree = "<group>"; };
4C8B42711EEB1AE400F015CA /* HardwareDisplayDrawingEngine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HardwareDisplayDrawingEngine.cpp; sourceTree = "<group>"; }; 4C8B42711EEB1AE400F015CA /* HardwareDisplayDrawingEngine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HardwareDisplayDrawingEngine.cpp; sourceTree = "<group>"; };
4C8B42731EEB1B6F00F015CA /* Screenshot.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Screenshot.cpp; sourceTree = "<group>"; }; 4C8B42731EEB1B6F00F015CA /* Screenshot.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Screenshot.cpp; sourceTree = "<group>"; };
4C93F1121F86728F00A9330D /* Research.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Research.cpp; sourceTree = "<group>"; };
4C93F1131F86728F00A9330D /* Research.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Research.h; sourceTree = "<group>"; };
4CB832A51EFBDCCE00B88761 /* land_tool.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = land_tool.c; sourceTree = "<group>"; }; 4CB832A51EFBDCCE00B88761 /* land_tool.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = land_tool.c; sourceTree = "<group>"; };
4CB832A61EFBDCCE00B88761 /* land_tool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = land_tool.h; sourceTree = "<group>"; }; 4CB832A61EFBDCCE00B88761 /* land_tool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = land_tool.h; sourceTree = "<group>"; };
4CB832A81EFFB8D100B88761 /* ttf_sdlport.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ttf_sdlport.c; sourceTree = "<group>"; }; 4CB832A81EFFB8D100B88761 /* ttf_sdlport.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ttf_sdlport.c; sourceTree = "<group>"; };
@ -1079,8 +1081,6 @@
F76C83F01EC4E7CC00FA49E2 /* marketing.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = marketing.h; sourceTree = "<group>"; }; F76C83F01EC4E7CC00FA49E2 /* marketing.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = marketing.h; sourceTree = "<group>"; };
F76C83F11EC4E7CC00FA49E2 /* news_item.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = news_item.c; sourceTree = "<group>"; }; F76C83F11EC4E7CC00FA49E2 /* news_item.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = news_item.c; sourceTree = "<group>"; };
F76C83F21EC4E7CC00FA49E2 /* news_item.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = news_item.h; sourceTree = "<group>"; }; F76C83F21EC4E7CC00FA49E2 /* news_item.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = news_item.h; sourceTree = "<group>"; };
F76C83F31EC4E7CC00FA49E2 /* research.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = research.c; sourceTree = "<group>"; };
F76C83F41EC4E7CC00FA49E2 /* research.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = research.h; sourceTree = "<group>"; };
F76C83F61EC4E7CC00FA49E2 /* Http.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Http.cpp; sourceTree = "<group>"; }; F76C83F61EC4E7CC00FA49E2 /* Http.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Http.cpp; sourceTree = "<group>"; };
F76C83F71EC4E7CC00FA49E2 /* http.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = http.h; sourceTree = "<group>"; }; F76C83F71EC4E7CC00FA49E2 /* http.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = http.h; sourceTree = "<group>"; };
F76C83F81EC4E7CC00FA49E2 /* Network.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Network.cpp; sourceTree = "<group>"; }; F76C83F81EC4E7CC00FA49E2 /* Network.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Network.cpp; sourceTree = "<group>"; };
@ -2079,8 +2079,8 @@
F76C83F01EC4E7CC00FA49E2 /* marketing.h */, F76C83F01EC4E7CC00FA49E2 /* marketing.h */,
F76C83F11EC4E7CC00FA49E2 /* news_item.c */, F76C83F11EC4E7CC00FA49E2 /* news_item.c */,
F76C83F21EC4E7CC00FA49E2 /* news_item.h */, F76C83F21EC4E7CC00FA49E2 /* news_item.h */,
F76C83F31EC4E7CC00FA49E2 /* research.c */, 4C93F1121F86728F00A9330D /* Research.cpp */,
F76C83F41EC4E7CC00FA49E2 /* research.h */, 4C93F1131F86728F00A9330D /* Research.h */,
); );
path = management; path = management;
sourceTree = "<group>"; sourceTree = "<group>";
@ -3134,6 +3134,7 @@
F76C887D1EC5324E00FA49E2 /* CursorData.cpp in Sources */, F76C887D1EC5324E00FA49E2 /* CursorData.cpp in Sources */,
4CB832A71EFBDCCE00B88761 /* land_tool.c in Sources */, 4CB832A71EFBDCCE00B88761 /* land_tool.c in Sources */,
C666EE7B1F37ACB10061AA04 /* TitleExit.cpp in Sources */, C666EE7B1F37ACB10061AA04 /* TitleExit.cpp in Sources */,
4C93F1141F86728F00A9330D /* Research.cpp in Sources */,
F7D7747F1EC61E5100BE6EBC /* UiContext.macOS.mm in Sources */, F7D7747F1EC61E5100BE6EBC /* UiContext.macOS.mm in Sources */,
F76C887E1EC5324E00FA49E2 /* CursorRepository.cpp in Sources */, F76C887E1EC5324E00FA49E2 /* CursorRepository.cpp in Sources */,
C654DF331F69C0430040F43D /* LoadSave.cpp in Sources */, C654DF331F69C0430040F43D /* LoadSave.cpp in Sources */,
@ -3279,7 +3280,6 @@
C666EE1A1F33E3800061AA04 /* EditorObjectSelection.cpp in Sources */, C666EE1A1F33E3800061AA04 /* EditorObjectSelection.cpp in Sources */,
F76C863F1EC4E88300FA49E2 /* marketing.c in Sources */, F76C863F1EC4E88300FA49E2 /* marketing.c in Sources */,
F76C86411EC4E88300FA49E2 /* news_item.c in Sources */, F76C86411EC4E88300FA49E2 /* news_item.c in Sources */,
F76C86431EC4E88300FA49E2 /* research.c in Sources */,
F76C86451EC4E88300FA49E2 /* Http.cpp in Sources */, F76C86451EC4E88300FA49E2 /* Http.cpp in Sources */,
F76C86471EC4E88300FA49E2 /* Network.cpp in Sources */, F76C86471EC4E88300FA49E2 /* Network.cpp in Sources */,
F76C86491EC4E88300FA49E2 /* NetworkAction.cpp in Sources */, F76C86491EC4E88300FA49E2 /* NetworkAction.cpp in Sources */,

View File

@ -25,7 +25,7 @@
#include <openrct2/input.h> #include <openrct2/input.h>
#include <openrct2/interface/widget.h> #include <openrct2/interface/widget.h>
#include <openrct2/localisation/localisation.h> #include <openrct2/localisation/localisation.h>
#include <openrct2/management/research.h> #include <openrct2/management/Research.h>
#include <openrct2/sprites.h> #include <openrct2/sprites.h>
#include <openrct2/util/util.h> #include <openrct2/util/util.h>
#include <openrct2/world/scenery.h> #include <openrct2/world/scenery.h>

View File

@ -30,7 +30,7 @@
#include "management/finance.h" #include "management/finance.h"
#include "management/marketing.h" #include "management/marketing.h"
#include "management/news_item.h" #include "management/news_item.h"
#include "management/research.h" #include "management/Research.h"
#include "network/network.h" #include "network/network.h"
#include "object.h" #include "object.h"
#include "OpenRCT2.h" #include "OpenRCT2.h"

View File

@ -25,7 +25,7 @@
#include "../localisation/localisation.h" #include "../localisation/localisation.h"
#include "../localisation/user.h" #include "../localisation/user.h"
#include "../management/finance.h" #include "../management/finance.h"
#include "../management/research.h" #include "../management/Research.h"
#include "../network/network.h" #include "../network/network.h"
#include "../network/twitch.h" #include "../network/twitch.h"
#include "../object.h" #include "../object.h"

View File

@ -19,7 +19,7 @@
#include "../common.h" #include "../common.h"
#include "../drawing/drawing.h" #include "../drawing/drawing.h"
#include "../management/research.h" #include "../management/Research.h"
#include "../peep/peep.h" #include "../peep/peep.h"
#include "../ride/ride.h" #include "../ride/ride.h"
#include "../ride/TrackDesign.h" #include "../ride/TrackDesign.h"

View File

@ -16,6 +16,7 @@
#include "../config/Config.h" #include "../config/Config.h"
#include "../core/Guard.hpp" #include "../core/Guard.hpp"
#include "../core/Util.hpp"
#include "../game.h" #include "../game.h"
#include "../interface/window.h" #include "../interface/window.h"
#include "../localisation/date.h" #include "../localisation/date.h"
@ -31,18 +32,19 @@
#include "../ride/track_data.h" #include "../ride/track_data.h"
#include "../world/scenery.h" #include "../world/scenery.h"
#include "news_item.h" #include "news_item.h"
#include "research.h" #include "Research.h"
#include "../object_list.h"
const sint32 _researchRate[] = { 0, 160, 250, 400 }; const sint32 _researchRate[] = {0, 160, 250, 400};
uint8 gResearchFundingLevel; uint8 gResearchFundingLevel;
uint8 gResearchPriorities; uint8 gResearchPriorities;
uint16 gResearchProgress; uint16 gResearchProgress;
uint8 gResearchProgressStage; uint8 gResearchProgressStage;
uint32 gResearchLastItemSubject; uint32 gResearchLastItemSubject;
uint8 gResearchExpectedMonth; uint8 gResearchExpectedMonth;
uint8 gResearchExpectedDay; uint8 gResearchExpectedDay;
uint8 gResearchNextCategory; uint8 gResearchNextCategory;
uint32 gResearchNextItem; uint32 gResearchNextItem;
// 0x01358844[500] // 0x01358844[500]
@ -53,13 +55,12 @@ uint8 gResearchUncompletedCategories;
uint32 gResearchedRideTypes[MAX_RESEARCHED_RIDE_TYPES]; uint32 gResearchedRideTypes[MAX_RESEARCHED_RIDE_TYPES];
uint32 gResearchedRideEntries[MAX_RESEARCHED_RIDE_ENTRIES]; uint32 gResearchedRideEntries[MAX_RESEARCHED_RIDE_ENTRIES];
uint32 gResearchedTrackTypesA[MAX_RESEARCHED_TRACK_TYPES];
uint32 gResearchedTrackTypesB[MAX_RESEARCHED_TRACK_TYPES];
uint32 gResearchedSceneryItems[MAX_RESEARCHED_SCENERY_ITEMS]; uint32 gResearchedSceneryItems[MAX_RESEARCHED_SCENERY_ITEMS];
bool gSilentResearch = false; bool gSilentResearch = false;
static void ride_type_set_invented(sint32 rideType); static void ride_type_set_invented(sint32 rideType);
static void ride_entry_set_invented(sint32 rideEntryIndex); static void ride_entry_set_invented(sint32 rideEntryIndex);
/** /**
@ -80,11 +81,13 @@ void research_reset_items()
void research_update_uncompleted_types() void research_update_uncompleted_types()
{ {
sint32 uncompletedResearchTypes = 0; sint32 uncompletedResearchTypes = 0;
rct_research_item *researchItem = gResearchItems; rct_research_item * researchItem = gResearchItems;
while (researchItem++->entryIndex != RESEARCHED_ITEMS_SEPARATOR); while (researchItem++->entryIndex != RESEARCHED_ITEMS_SEPARATOR);
for (; researchItem->entryIndex != RESEARCHED_ITEMS_END; researchItem++) for (; researchItem->entryIndex != RESEARCHED_ITEMS_END; researchItem++)
{
uncompletedResearchTypes |= (1 << researchItem->category); uncompletedResearchTypes |= (1 << researchItem->category);
}
gResearchUncompletedCategories = uncompletedResearchTypes; gResearchUncompletedCategories = uncompletedResearchTypes;
} }
@ -95,21 +98,24 @@ void research_update_uncompleted_types()
*/ */
static void research_calculate_expected_date() static void research_calculate_expected_date()
{ {
if (gResearchProgressStage == RESEARCH_STAGE_INITIAL_RESEARCH || gResearchFundingLevel == RESEARCH_FUNDING_NONE) { if (gResearchProgressStage == RESEARCH_STAGE_INITIAL_RESEARCH || gResearchFundingLevel == RESEARCH_FUNDING_NONE)
{
gResearchExpectedDay = 255; gResearchExpectedDay = 255;
} else { }
else
{
sint32 progressRemaining = gResearchProgressStage == RESEARCH_STAGE_COMPLETING_DESIGN ? 0x10000 : 0x20000; sint32 progressRemaining = gResearchProgressStage == RESEARCH_STAGE_COMPLETING_DESIGN ? 0x10000 : 0x20000;
progressRemaining -= gResearchProgress; progressRemaining -= gResearchProgress;
sint32 daysRemaining = (progressRemaining / _researchRate[gResearchFundingLevel]) * 128; sint32 daysRemaining = (progressRemaining / _researchRate[gResearchFundingLevel]) * 128;
sint32 expectedDay = gDateMonthTicks + (daysRemaining & 0xFFFF); sint32 expectedDay = gDateMonthTicks + (daysRemaining & 0xFFFF);
sint32 dayQuotient = expectedDay / 0x10000; sint32 dayQuotient = expectedDay / 0x10000;
sint32 dayRemainder = expectedDay % 0x10000; sint32 dayRemainder = expectedDay % 0x10000;
sint32 expectedMonth = date_get_month(gDateMonthsElapsed + dayQuotient + (daysRemaining >> 16)); sint32 expectedMonth = date_get_month(gDateMonthsElapsed + dayQuotient + (daysRemaining >> 16));
expectedDay = (dayRemainder * days_in_month[expectedMonth]) >> 16; expectedDay = (dayRemainder * days_in_month[expectedMonth]) >> 16;
gResearchExpectedDay = expectedDay; gResearchExpectedDay = expectedDay;
gResearchExpectedMonth = expectedMonth; gResearchExpectedMonth = expectedMonth;
} }
} }
@ -126,48 +132,59 @@ static void research_invalidate_related_windows()
*/ */
static void research_next_design() static void research_next_design()
{ {
rct_research_item *firstUnresearchedItem, *researchItem, tmp; rct_research_item * firstUnresearchedItem, * researchItem, tmp;
sint32 ignoreActiveResearchTypes; sint32 ignoreActiveResearchTypes;
// Skip already researched items // Skip already researched items
firstUnresearchedItem = gResearchItems; firstUnresearchedItem = gResearchItems;
while (firstUnresearchedItem->entryIndex != RESEARCHED_ITEMS_SEPARATOR) while (firstUnresearchedItem->entryIndex != RESEARCHED_ITEMS_SEPARATOR)
{
firstUnresearchedItem++; firstUnresearchedItem++;
}
ignoreActiveResearchTypes = 0; ignoreActiveResearchTypes = 0;
researchItem = firstUnresearchedItem; researchItem = firstUnresearchedItem;
for (;;) { for (;;)
{
researchItem++; researchItem++;
if (researchItem->entryIndex == RESEARCHED_ITEMS_END) { if (researchItem->entryIndex == RESEARCHED_ITEMS_END)
if (!ignoreActiveResearchTypes) { {
if (!ignoreActiveResearchTypes)
{
ignoreActiveResearchTypes = 1; ignoreActiveResearchTypes = 1;
researchItem = firstUnresearchedItem; researchItem = firstUnresearchedItem;
continue; continue;
} else { }
gResearchProgress = 0; else
{
gResearchProgress = 0;
gResearchProgressStage = RESEARCH_STAGE_FINISHED_ALL; gResearchProgressStage = RESEARCH_STAGE_FINISHED_ALL;
research_invalidate_related_windows(); research_invalidate_related_windows();
// Reset funding to 0 if no more rides. // Reset funding to 0 if no more rides.
research_set_funding(0); research_set_funding(0);
return; return;
} }
} else if (ignoreActiveResearchTypes || (gResearchPriorities & (1 << researchItem->category))) { }
else if (ignoreActiveResearchTypes || (gResearchPriorities & (1 << researchItem->category)))
{
break; break;
} }
} }
gResearchNextItem = researchItem->entryIndex; gResearchNextItem = researchItem->entryIndex;
gResearchNextCategory = researchItem->category; gResearchNextCategory = researchItem->category;
gResearchProgress = 0; gResearchProgress = 0;
gResearchProgressStage = RESEARCH_STAGE_DESIGNING; gResearchProgressStage = RESEARCH_STAGE_DESIGNING;
// Bubble research item up until it is above the researched items separator // Bubble research item up until it is above the researched items separator
do { do
{
tmp = *researchItem; tmp = *researchItem;
*researchItem = *(researchItem - 1); *researchItem = *(researchItem - 1);
*(researchItem - 1) = tmp; *(researchItem - 1) = tmp;
researchItem--; researchItem--;
} while ((researchItem + 1)->entryIndex != RESEARCHED_ITEMS_SEPARATOR); }
while ((researchItem + 1)->entryIndex != RESEARCHED_ITEMS_SEPARATOR);
research_invalidate_related_windows(); research_invalidate_related_windows();
} }
@ -176,50 +193,59 @@ static void research_next_design()
* *
* rct2: 0x006848D4 * rct2: 0x006848D4
*/ */
void research_finish_item(sint32 entryIndex) void research_finish_item(uint32 entryIndex)
{ {
gResearchLastItemSubject = (uint32)entryIndex; gResearchLastItemSubject = entryIndex;
research_invalidate_related_windows(); research_invalidate_related_windows();
if (entryIndex >= RESEARCH_ENTRY_RIDE_MASK) if (entryIndex >= RESEARCH_ENTRY_RIDE_MASK)
{ {
// Ride // Ride
sint32 base_ride_type = research_get_ride_base_type(entryIndex); uint32 base_ride_type = research_get_ride_base_type(entryIndex);
sint32 rideEntryIndex = entryIndex & 0xFF; sint32 rideEntryIndex = entryIndex & 0xFF;
rct_ride_entry *rideEntry = get_ride_entry(rideEntryIndex); rct_ride_entry * rideEntry = get_ride_entry(rideEntryIndex);
if (rideEntry != NULL && rideEntry != (rct_ride_entry *)-1 && base_ride_type != RIDE_TYPE_NULL) if (rideEntry != NULL && rideEntry != (rct_ride_entry *) -1 && base_ride_type != RIDE_TYPE_NULL)
{ {
bool ride_group_was_invented_before = false; bool ride_group_was_invented_before = false;
bool ride_type_was_invented_before = ride_type_is_invented(base_ride_type); bool ride_type_was_invented_before = ride_type_is_invented(base_ride_type);
rct_string_id availabilityString; rct_string_id availabilityString;
// Determine if the ride group this entry belongs to was invented before. // Determine if the ride group this entry belongs to was invented before.
if (gConfigInterface.select_by_track_type && ride_type_has_ride_groups(base_ride_type)) if (gConfigInterface.select_by_track_type && RideGroupManager::RideTypeHasRideGroups(base_ride_type))
{ {
const RideGroup * rideGroup = get_ride_group(base_ride_type, rideEntry); const RideGroup * rideGroup = RideGroupManager::GetRideGroup(base_ride_type, rideEntry);
if (ride_group_is_invented(rideGroup)) if (RideGroupManager::RideGroupIsInvented(rideGroup))
{ {
ride_group_was_invented_before = true; ride_group_was_invented_before = true;
} }
} }
ride_type_set_invented(base_ride_type); ride_type_set_invented(base_ride_type);
openrct2_assert(base_ride_type < countof(RideTypePossibleTrackConfigurations), "Invalid base_ride_type = %d", base_ride_type); openrct2_assert(base_ride_type < Util::CountOf(RideTypePossibleTrackConfigurations),
"Invalid base_ride_type = %d", base_ride_type);
ride_entry_set_invented(rideEntryIndex); ride_entry_set_invented(rideEntryIndex);
if (!(rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE)) { if (!(rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE))
for (sint32 i = 0; i < MAX_RESEARCHED_TRACK_TYPES; i++) { {
rct_ride_entry *rideEntry2 = get_ride_entry(i); for (sint32 i = 0; i < MAX_RESEARCHED_TRACK_TYPES; i++)
if (rideEntry2 == (rct_ride_entry*)-1) {
rct_ride_entry * rideEntry2 = get_ride_entry(i);
if (rideEntry2 == (rct_ride_entry *) -1)
{
continue; continue;
}
if ((rideEntry2->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE)) if ((rideEntry2->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE))
{
continue; continue;
}
for (uint8 j = 0; j < MAX_RIDE_TYPES_PER_RIDE_ENTRY; j++) { for (uint8 j = 0; j < MAX_RIDE_TYPES_PER_RIDE_ENTRY; j++)
if (rideEntry2->ride_type[j] == base_ride_type) { {
if (rideEntry2->ride_type[j] == base_ride_type)
{
ride_entry_set_invented(i); ride_entry_set_invented(i);
break; break;
} }
@ -250,15 +276,16 @@ void research_finish_item(sint32 entryIndex)
availabilityString = STR_NEWS_ITEM_RESEARCH_NEW_RIDE_AVAILABLE; availabilityString = STR_NEWS_ITEM_RESEARCH_NEW_RIDE_AVAILABLE;
set_format_arg(0, rct_string_id, rideEntry->naming.name); set_format_arg(0, rct_string_id, rideEntry->naming.name);
} }
// If a vehicle is the first to be invented for its ride group, show the ride group name. // If a vehicle is the first to be invented for its ride group, show the ride group name.
else if (!ride_type_was_invented_before || (ride_type_has_ride_groups(base_ride_type) && !ride_group_was_invented_before)) else if (!ride_type_was_invented_before ||
(ride_type_has_ride_groups(base_ride_type) && !ride_group_was_invented_before))
{ {
rct_ride_name naming = get_ride_naming(base_ride_type, rideEntry); rct_ride_name naming = get_ride_naming(base_ride_type, rideEntry);
availabilityString = STR_NEWS_ITEM_RESEARCH_NEW_RIDE_AVAILABLE; availabilityString = STR_NEWS_ITEM_RESEARCH_NEW_RIDE_AVAILABLE;
set_format_arg(0, rct_string_id, naming.name); set_format_arg(0, rct_string_id, naming.name);
} }
// If the vehicle should not be listed separately and it isn't the first to be invented for its ride group, // If the vehicle should not be listed separately and it isn't the first to be invented for its ride group,
// report it as a new vehicle for the existing ride group. // report it as a new vehicle for the existing ride group.
else else
{ {
availabilityString = STR_NEWS_ITEM_RESEARCH_NEW_VEHICLE_AVAILABLE; availabilityString = STR_NEWS_ITEM_RESEARCH_NEW_VEHICLE_AVAILABLE;
@ -279,20 +306,25 @@ void research_finish_item(sint32 entryIndex)
research_invalidate_related_windows(); research_invalidate_related_windows();
} }
} else { }
else
{
// Scenery // Scenery
rct_scenery_set_entry *scenerySetEntry = get_scenery_group_entry(entryIndex & 0xFFFF); rct_scenery_set_entry * scenerySetEntry = get_scenery_group_entry(entryIndex & 0xFFFF);
if (scenerySetEntry != NULL && scenerySetEntry != (rct_scenery_set_entry *)-1) if (scenerySetEntry != NULL && scenerySetEntry != (rct_scenery_set_entry *) -1)
{ {
for (sint32 i = 0; i < scenerySetEntry->entry_count; i++) { for (sint32 i = 0; i < scenerySetEntry->entry_count; i++)
{
sint32 subSceneryEntryIndex = scenerySetEntry->scenery_entries[i]; sint32 subSceneryEntryIndex = scenerySetEntry->scenery_entries[i];
gResearchedSceneryItems[subSceneryEntryIndex >> 5] |= 1UL << (subSceneryEntryIndex & 0x1F); gResearchedSceneryItems[subSceneryEntryIndex >> 5] |= 1UL << (subSceneryEntryIndex & 0x1F);
} }
set_format_arg(0, rct_string_id, scenerySetEntry->name); set_format_arg(0, rct_string_id, scenerySetEntry->name);
if (!gSilentResearch) { if (!gSilentResearch)
if (gConfigNotifications.ride_researched) { {
if (gConfigNotifications.ride_researched)
{
news_item_add_to_queue(NEWS_ITEM_RESEARCH, STR_NEWS_ITEM_RESEARCH_NEW_SCENERY_SET_AVAILABLE, entryIndex); news_item_add_to_queue(NEWS_ITEM_RESEARCH, STR_NEWS_ITEM_RESEARCH_NEW_SCENERY_SET_AVAILABLE, entryIndex);
} }
} }
@ -313,32 +345,40 @@ void research_update()
editorScreenFlags = SCREEN_FLAGS_SCENARIO_EDITOR | SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER; editorScreenFlags = SCREEN_FLAGS_SCENARIO_EDITOR | SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER;
if (gScreenFlags & editorScreenFlags) if (gScreenFlags & editorScreenFlags)
{
return; return;
}
if (gScenarioTicks % 32 != 0) if (gScenarioTicks % 32 != 0)
{
return; return;
}
researchLevel = gResearchFundingLevel; researchLevel = gResearchFundingLevel;
currentResearchProgress = gResearchProgress; currentResearchProgress = gResearchProgress;
currentResearchProgress += _researchRate[researchLevel]; currentResearchProgress += _researchRate[researchLevel];
if (currentResearchProgress <= 0xFFFF) { if (currentResearchProgress <= 0xFFFF)
{
gResearchProgress = currentResearchProgress; gResearchProgress = currentResearchProgress;
} else { }
switch (gResearchProgressStage) { else
{
switch (gResearchProgressStage)
{
case RESEARCH_STAGE_INITIAL_RESEARCH: case RESEARCH_STAGE_INITIAL_RESEARCH:
research_next_design(); research_next_design();
research_calculate_expected_date(); research_calculate_expected_date();
break; break;
case RESEARCH_STAGE_DESIGNING: case RESEARCH_STAGE_DESIGNING:
gResearchProgress = 0; gResearchProgress = 0;
gResearchProgressStage = RESEARCH_STAGE_COMPLETING_DESIGN; gResearchProgressStage = RESEARCH_STAGE_COMPLETING_DESIGN;
research_calculate_expected_date(); research_calculate_expected_date();
research_invalidate_related_windows(); research_invalidate_related_windows();
break; break;
case RESEARCH_STAGE_COMPLETING_DESIGN: case RESEARCH_STAGE_COMPLETING_DESIGN:
research_finish_item((sint32)gResearchNextItem); research_finish_item(gResearchNextItem);
gResearchProgress = 0; gResearchProgress = 0;
gResearchProgressStage = 0; gResearchProgressStage = 0;
research_calculate_expected_date(); research_calculate_expected_date();
research_update_uncompleted_types(); research_update_uncompleted_types();
@ -352,25 +392,34 @@ void research_update()
* *
* rct2: 0x00684AC3 * rct2: 0x00684AC3
*/ */
void research_reset_current_item(){ void research_reset_current_item()
rct_research_item* research = gResearchItems; {
for (; research->entryIndex != RESEARCHED_ITEMS_END; research++); rct_research_item * research = gResearchItems;
for (; research->entryIndex != RESEARCHED_ITEMS_END; research++) { }
research++; research++;
for (; research->entryIndex != RESEARCHED_ITEMS_END_2; research += 2){ for (; research->entryIndex != RESEARCHED_ITEMS_END_2; research += 2)
if (scenario_rand() & 1) continue; {
if (scenario_rand() & 1)
{
continue;
}
rct_research_item* edx = NULL; rct_research_item * edx = NULL;
rct_research_item* ebp = NULL; rct_research_item * ebp = NULL;
rct_research_item* inner_research = gResearchItems; rct_research_item * inner_research = gResearchItems;
do { do
if (research->entryIndex == inner_research->entryIndex){ {
if (research->entryIndex == inner_research->entryIndex)
{
edx = inner_research; edx = inner_research;
} }
if ((research + 1)->entryIndex == inner_research->entryIndex){ if ((research + 1)->entryIndex == inner_research->entryIndex)
{
ebp = inner_research; ebp = inner_research;
} }
} while ((inner_research++)->entryIndex != RESEARCHED_ITEMS_END); }
while ((inner_research++)->entryIndex != RESEARCHED_ITEMS_END);
assert(edx != NULL); assert(edx != NULL);
edx->entryIndex = research->entryIndex; edx->entryIndex = research->entryIndex;
assert(ebp != NULL); assert(ebp != NULL);
@ -381,33 +430,45 @@ void research_reset_current_item(){
ebp->category = cat; ebp->category = cat;
} }
for (sint32 i = 0; i < 8; ++i){ for (sint32 i = 0; i < MAX_RESEARCHED_RIDE_TYPES; ++i)
{
gResearchedRideTypes[i] = 0; gResearchedRideTypes[i] = 0;
}
for (sint32 i = 0; i < MAX_RESEARCHED_RIDE_ENTRIES; ++i)
{
gResearchedRideEntries[i] = 0; gResearchedRideEntries[i] = 0;
} }
for (sint32 i = 0; i < 56; i++) { for (sint32 i = 0; i < MAX_RESEARCHED_SCENERY_ITEMS; i++)
{
gResearchedSceneryItems[i] = 0xFFFFFFFF; gResearchedSceneryItems[i] = 0xFFFFFFFF;
} }
for (sint32 i = 0; i < 19; ++i){ for (sint32 i = 0; i < MAX_SCENERY_GROUP_OBJECTS; ++i)
rct_scenery_set_entry* scenery_set = get_scenery_group_entry(i); {
if ((intptr_t)scenery_set == -1)continue; rct_scenery_set_entry * scenery_set = get_scenery_group_entry(i);
if ((intptr_t) scenery_set == -1)
{
continue;
}
for (sint32 j = 0; j < scenery_set->entry_count; ++j){ for (sint32 j = 0; j < scenery_set->entry_count; ++j)
{
uint8 value = scenery_set->scenery_entries[j] & 0x1F; uint8 value = scenery_set->scenery_entries[j] & 0x1F;
gResearchedSceneryItems[scenery_set->scenery_entries[j] >> 5] &= ~(1UL << value); gResearchedSceneryItems[scenery_set->scenery_entries[j] >> 5] &= ~(1UL << value);
} }
} }
for (research = gResearchItems; research->entryIndex != RESEARCHED_ITEMS_SEPARATOR; research++){ for (research = gResearchItems; research->entryIndex != RESEARCHED_ITEMS_SEPARATOR; research++)
{
research_finish_item(research->entryIndex); research_finish_item(research->entryIndex);
} }
gResearchLastItemSubject = (uint32)-1; gResearchLastItemSubject = (uint32) -1;
gResearchProgressStage = 0; gResearchProgressStage = 0;
gResearchProgress = 0; gResearchProgress = 0;
} }
/** /**
@ -416,47 +477,60 @@ void research_reset_current_item(){
*/ */
void research_remove_non_separate_vehicle_types() void research_remove_non_separate_vehicle_types()
{ {
rct_research_item *researchItem, *researchItem2; rct_research_item * researchItem, * researchItem2;
researchItem = gResearchItems; researchItem = gResearchItems;
while ((researchItem + 1)->entryIndex != RESEARCHED_ITEMS_END) { while ((researchItem + 1)->entryIndex != RESEARCHED_ITEMS_END)
{
researchItem++; researchItem++;
} }
do { do
loopBeginning: {
loopBeginning:
if ( if (
researchItem != gResearchItems && researchItem != gResearchItems &&
researchItem->entryIndex != RESEARCHED_ITEMS_SEPARATOR && researchItem->entryIndex != RESEARCHED_ITEMS_SEPARATOR &&
researchItem->entryIndex != RESEARCHED_ITEMS_END && researchItem->entryIndex != RESEARCHED_ITEMS_END &&
researchItem->entryIndex >= RESEARCH_ENTRY_RIDE_MASK researchItem->entryIndex >= RESEARCH_ENTRY_RIDE_MASK
) { )
rct_ride_entry *rideEntry = get_ride_entry(researchItem->entryIndex & 0xFF); {
if (!(rideEntry->flags & (RIDE_ENTRY_FLAG_SEPARATE_RIDE))) { rct_ride_entry * rideEntry = get_ride_entry(researchItem->entryIndex & 0xFF);
if (!(rideEntry->flags & (RIDE_ENTRY_FLAG_SEPARATE_RIDE)))
{
// Check if ride type already exists further up for a vehicle type that isn't displayed as a ride // Check if ride type already exists further up for a vehicle type that isn't displayed as a ride
researchItem2 = researchItem - 1; researchItem2 = researchItem - 1;
do { do
{
if ( if (
researchItem2->entryIndex != RESEARCHED_ITEMS_SEPARATOR && researchItem2->entryIndex != RESEARCHED_ITEMS_SEPARATOR &&
researchItem2->entryIndex >= RESEARCH_ENTRY_RIDE_MASK researchItem2->entryIndex >= RESEARCH_ENTRY_RIDE_MASK
) { )
{
rideEntry = get_ride_entry(researchItem2->entryIndex & 0xFF); rideEntry = get_ride_entry(researchItem2->entryIndex & 0xFF);
if (!(rideEntry->flags & (RIDE_ENTRY_FLAG_SEPARATE_RIDE))) { if (!(rideEntry->flags & (RIDE_ENTRY_FLAG_SEPARATE_RIDE)))
{
if (research_get_ride_base_type(researchItem->entryIndex) == research_get_ride_base_type(researchItem2->entryIndex)) { if (research_get_ride_base_type(researchItem->entryIndex) ==
research_get_ride_base_type(researchItem2->entryIndex))
{
// Remove item // Remove item
researchItem2 = researchItem; researchItem2 = researchItem;
do { do
{
*researchItem2 = *(researchItem2 + 1); *researchItem2 = *(researchItem2 + 1);
} while ((researchItem2++)->entryIndex != RESEARCHED_ITEMS_END_2); }
while ((researchItem2++)->entryIndex != RESEARCHED_ITEMS_END_2);
goto loopBeginning; goto loopBeginning;
} }
} }
} }
} while ((researchItem2--) != gResearchItems); }
while ((researchItem2--) != gResearchItems);
} }
} }
} while ((researchItem--) != gResearchItems); }
while ((researchItem--) != gResearchItems);
} }
/** /**
@ -465,24 +539,28 @@ void research_remove_non_separate_vehicle_types()
*/ */
static void research_insert_unresearched(sint32 entryIndex, sint32 category) static void research_insert_unresearched(sint32 entryIndex, sint32 category)
{ {
rct_research_item *researchItem, *researchItem2; rct_research_item * researchItem, * researchItem2;
researchItem = gResearchItems; researchItem = gResearchItems;
do { do
if (researchItem->entryIndex == RESEARCHED_ITEMS_END) { {
if (researchItem->entryIndex == RESEARCHED_ITEMS_END)
{
// Insert slot // Insert slot
researchItem2 = researchItem; researchItem2 = researchItem;
while (researchItem2->entryIndex != RESEARCHED_ITEMS_END_2) { while (researchItem2->entryIndex != RESEARCHED_ITEMS_END_2)
{
researchItem2++; researchItem2++;
} }
memmove(researchItem + 1, researchItem, (researchItem2 - researchItem + 1) * sizeof(rct_research_item)); memmove(researchItem + 1, researchItem, (researchItem2 - researchItem + 1) * sizeof(rct_research_item));
// Place new item // Place new item
researchItem->entryIndex = entryIndex; researchItem->entryIndex = entryIndex;
researchItem->category = category; researchItem->category = category;
break; break;
} }
} while (entryIndex != (researchItem++)->entryIndex); }
while (entryIndex != (researchItem++)->entryIndex);
} }
/** /**
@ -491,42 +569,55 @@ static void research_insert_unresearched(sint32 entryIndex, sint32 category)
*/ */
static void research_insert_researched(sint32 entryIndex, sint32 category) static void research_insert_researched(sint32 entryIndex, sint32 category)
{ {
rct_research_item *researchItem, *researchItem2; rct_research_item * researchItem, * researchItem2;
researchItem = gResearchItems; researchItem = gResearchItems;
// First check to make sure that entry is not already accounted for // First check to make sure that entry is not already accounted for
for (; researchItem->entryIndex != RESEARCHED_ITEMS_END; researchItem++) { for (; researchItem->entryIndex != RESEARCHED_ITEMS_END; researchItem++)
{
if (researchItem->entryIndex == entryIndex) if (researchItem->entryIndex == entryIndex)
{
return; return;
}
} }
researchItem = gResearchItems; researchItem = gResearchItems;
do { do
if (researchItem->entryIndex == RESEARCHED_ITEMS_SEPARATOR) { {
if (researchItem->entryIndex == RESEARCHED_ITEMS_SEPARATOR)
{
// Insert slot // Insert slot
researchItem2 = researchItem; researchItem2 = researchItem;
while (researchItem2->entryIndex != RESEARCHED_ITEMS_END_2) { while (researchItem2->entryIndex != RESEARCHED_ITEMS_END_2)
{
researchItem2++; researchItem2++;
} }
memmove(researchItem + 1, researchItem, (researchItem2 - researchItem + 1) * sizeof(rct_research_item)); memmove(researchItem + 1, researchItem, (researchItem2 - researchItem + 1) * sizeof(rct_research_item));
// Place new item // Place new item
researchItem->entryIndex = entryIndex; researchItem->entryIndex = entryIndex;
researchItem->category = category; researchItem->category = category;
break; break;
} }
} while (entryIndex != (researchItem++)->entryIndex); }
while (entryIndex != (researchItem++)->entryIndex);
} }
/** /**
* *
* rct2: 0x006857CF * rct2: 0x006857CF
*/ */
void research_remove(sint32 entryIndex){ void research_remove(sint32 entryIndex)
for (rct_research_item *researchItem = gResearchItems; researchItem->entryIndex != RESEARCHED_ITEMS_END; researchItem++){ {
if (researchItem->entryIndex == entryIndex){ for (rct_research_item * researchItem = gResearchItems;
do{ researchItem->entryIndex != RESEARCHED_ITEMS_END; researchItem++)
{
if (researchItem->entryIndex == entryIndex)
{
do
{
*researchItem = *(researchItem + 1); *researchItem = *(researchItem + 1);
} while (researchItem++->entryIndex != RESEARCHED_ITEMS_END_2); }
while (researchItem++->entryIndex != RESEARCHED_ITEMS_END_2);
return; return;
} }
} }
@ -535,9 +626,13 @@ void research_remove(sint32 entryIndex){
void research_insert(sint32 researched, sint32 entryIndex, sint32 category) void research_insert(sint32 researched, sint32 entryIndex, sint32 category)
{ {
if (researched) if (researched)
{
research_insert_researched(entryIndex, category); research_insert_researched(entryIndex, category);
}
else else
{
research_insert_unresearched(entryIndex, category); research_insert_unresearched(entryIndex, category);
}
} }
/** /**
@ -547,24 +642,33 @@ void research_insert(sint32 researched, sint32 entryIndex, sint32 category)
void research_populate_list_random() void research_populate_list_random()
{ {
// Rides // Rides
for (sint32 i = 0; i < 128; i++) { for (sint32 i = 0; i < MAX_RIDE_OBJECTS; i++)
rct_ride_entry *rideEntry = get_ride_entry(i); {
if (rideEntry == (rct_ride_entry*)-1) rct_ride_entry * rideEntry = get_ride_entry(i);
if (rideEntry == (rct_ride_entry *) -1)
{
continue; continue;
}
sint32 researched = (scenario_rand() & 0xFF) > 128; sint32 researched = (scenario_rand() & 0xFF) > 128;
for (sint32 j = 0; j < MAX_RIDE_TYPES_PER_RIDE_ENTRY; j++) { for (sint32 j = 0; j < MAX_RIDE_TYPES_PER_RIDE_ENTRY; j++)
{
sint32 rideType = rideEntry->ride_type[j]; sint32 rideType = rideEntry->ride_type[j];
if (rideType != RIDE_TYPE_NULL) if (rideType != RIDE_TYPE_NULL)
{
research_insert(researched, RESEARCH_ENTRY_RIDE_MASK | (rideType << 8) | i, rideEntry->category[0]); research_insert(researched, RESEARCH_ENTRY_RIDE_MASK | (rideType << 8) | i, rideEntry->category[0]);
}
} }
} }
// Scenery // Scenery
for (sint32 i = 0; i < 19; i++) { for (sint32 i = 0; i < MAX_SCENERY_GROUP_OBJECTS; i++)
rct_scenery_set_entry *scenerySetEntry = get_scenery_group_entry(i); {
if (scenerySetEntry == (rct_scenery_set_entry*)-1) rct_scenery_set_entry * scenerySetEntry = get_scenery_group_entry(i);
if (scenerySetEntry == (rct_scenery_set_entry *) -1)
{
continue; continue;
}
sint32 researched = (scenario_rand() & 0xFF) > 85; sint32 researched = (scenario_rand() & 0xFF) > 85;
research_insert(researched, i, RESEARCH_CATEGORY_SCENERYSET); research_insert(researched, i, RESEARCH_CATEGORY_SCENERYSET);
@ -574,23 +678,32 @@ void research_populate_list_random()
void research_populate_list_researched() void research_populate_list_researched()
{ {
// Rides // Rides
for (sint32 i = 0; i < 128; i++) { for (sint32 i = 0; i < MAX_RIDE_OBJECTS; i++)
rct_ride_entry *rideEntry = get_ride_entry(i); {
if (rideEntry == (rct_ride_entry*)-1) rct_ride_entry * rideEntry = get_ride_entry(i);
if (rideEntry == (rct_ride_entry *) -1)
{
continue; continue;
}
for (sint32 j = 0; j < MAX_RIDE_TYPES_PER_RIDE_ENTRY; j++) { for (sint32 j = 0; j < MAX_RIDE_TYPES_PER_RIDE_ENTRY; j++)
{
sint32 rideType = rideEntry->ride_type[j]; sint32 rideType = rideEntry->ride_type[j];
if (rideType != RIDE_TYPE_NULL) if (rideType != RIDE_TYPE_NULL)
{
research_insert(true, RESEARCH_ENTRY_RIDE_MASK | (rideType << 8) | i, rideEntry->category[0]); research_insert(true, RESEARCH_ENTRY_RIDE_MASK | (rideType << 8) | i, rideEntry->category[0]);
}
} }
} }
// Scenery // Scenery
for (sint32 i = 0; i < 19; i++) { for (sint32 i = 0; i < MAX_SCENERY_GROUP_OBJECTS; i++)
rct_scenery_set_entry *scenerySetEntry = get_scenery_group_entry(i); {
if (scenerySetEntry == (rct_scenery_set_entry*)-1) rct_scenery_set_entry * scenerySetEntry = get_scenery_group_entry(i);
if (scenerySetEntry == (rct_scenery_set_entry *) -1)
{
continue; continue;
}
research_insert(true, i, RESEARCH_CATEGORY_SCENERYSET); research_insert(true, i, RESEARCH_CATEGORY_SCENERYSET);
} }
@ -611,16 +724,19 @@ void research_set_priority(sint32 activeCategories)
* *
* rct2: 0x00684A7F * rct2: 0x00684A7F
*/ */
void game_command_set_research_funding(sint32* eax, sint32* ebx, sint32* ecx, sint32* edx, sint32* esi, sint32* edi, sint32* ebp) void game_command_set_research_funding(sint32 * eax, sint32 * ebx, sint32 * ecx, sint32 * edx, sint32 * esi, sint32 * edi, sint32 * ebp)
{ {
sint32 setPriorities = (*ebx & (1 << 8)) != 0; sint32 setPriorities = (*ebx & (1 << 8)) != 0;
sint32 fundingAmount = *edx; uint32 fundingAmount = *edx;
sint32 activeCategories = *edx; sint32 activeCategories = *edx;
gCommandExpenditureType = RCT_EXPENDITURE_TYPE_RESEARCH; gCommandExpenditureType = RCT_EXPENDITURE_TYPE_RESEARCH;
if (*ebx & GAME_COMMAND_FLAG_APPLY) { if (*ebx & GAME_COMMAND_FLAG_APPLY)
if (!setPriorities) { {
if (fundingAmount < 0 || fundingAmount >= countof(_researchRate)) { if (!setPriorities)
{
if (fundingAmount >= Util::CountOf(_researchRate))
{
*ebx = MONEY32_UNDEFINED; *ebx = MONEY32_UNDEFINED;
log_warning("Invalid research rate %d", fundingAmount); log_warning("Invalid research rate %d", fundingAmount);
return; return;
@ -628,7 +744,9 @@ void game_command_set_research_funding(sint32* eax, sint32* ebx, sint32* ecx, si
gResearchFundingLevel = fundingAmount; gResearchFundingLevel = fundingAmount;
} }
else else
{
gResearchPriorities = activeCategories; gResearchPriorities = activeCategories;
}
window_invalidate_by_class(WC_FINANCES); window_invalidate_by_class(WC_FINANCES);
window_invalidate_by_class(WC_RESEARCH); window_invalidate_by_class(WC_RESEARCH);
@ -639,7 +757,7 @@ void game_command_set_research_funding(sint32* eax, sint32* ebx, sint32* ecx, si
void research_insert_ride_entry(uint8 entryIndex, bool researched) void research_insert_ride_entry(uint8 entryIndex, bool researched)
{ {
rct_ride_entry *rideEntry = get_ride_entry(entryIndex); rct_ride_entry * rideEntry = get_ride_entry(entryIndex);
uint8 category = rideEntry->category[0]; uint8 category = rideEntry->category[0];
for (sint32 i = 0; i < MAX_RIDE_TYPES_PER_RIDE_ENTRY; i++) for (sint32 i = 0; i < MAX_RIDE_TYPES_PER_RIDE_ENTRY; i++)
{ {
@ -659,16 +777,16 @@ void research_insert_scenery_group_entry(uint8 entryIndex, bool researched)
bool ride_type_is_invented(sint32 rideType) bool ride_type_is_invented(sint32 rideType)
{ {
sint32 quadIndex = rideType >> 5; sint32 quadIndex = rideType >> 5;
sint32 bitIndex = rideType & 0x1F; sint32 bitIndex = rideType & 0x1F;
bool invented = (gResearchedRideTypes[quadIndex] & ((uint32)1 << bitIndex)); bool invented = (gResearchedRideTypes[quadIndex] & ((uint32) 1 << bitIndex));
return invented; return invented;
} }
bool ride_entry_is_invented(sint32 rideEntryIndex) bool ride_entry_is_invented(sint32 rideEntryIndex)
{ {
sint32 quadIndex = rideEntryIndex >> 5; sint32 quadIndex = rideEntryIndex >> 5;
sint32 bitIndex = rideEntryIndex & 0x1F; sint32 bitIndex = rideEntryIndex & 0x1F;
bool invented = (gResearchedRideEntries[quadIndex] & ((uint32)1 << bitIndex)); bool invented = (gResearchedRideEntries[quadIndex] & ((uint32) 1 << bitIndex));
return invented; return invented;
} }
@ -680,28 +798,29 @@ bool track_piece_is_available_for_ride_type(uint8 rideType, sint32 trackType)
static void ride_type_set_invented(sint32 rideType) static void ride_type_set_invented(sint32 rideType)
{ {
sint32 quadIndex = rideType >> 5; sint32 quadIndex = rideType >> 5;
sint32 bitIndex = rideType & 0x1F; sint32 bitIndex = rideType & 0x1F;
gResearchedRideTypes[quadIndex] |= (uint32)1 << bitIndex; gResearchedRideTypes[quadIndex] |= (uint32) 1 << bitIndex;
} }
static void ride_entry_set_invented(sint32 rideEntryIndex) static void ride_entry_set_invented(sint32 rideEntryIndex)
{ {
sint32 quadIndex = rideEntryIndex >> 5; sint32 quadIndex = rideEntryIndex >> 5;
sint32 bitIndex = rideEntryIndex & 0x1F; sint32 bitIndex = rideEntryIndex & 0x1F;
gResearchedRideEntries[quadIndex] |= (uint32)1 << bitIndex; gResearchedRideEntries[quadIndex] |= (uint32) 1 << bitIndex;
} }
bool scenery_is_invented(uint16 sceneryItem) bool scenery_is_invented(uint16 sceneryItem)
{ {
sint32 quadIndex = sceneryItem >> 5; sint32 quadIndex = sceneryItem >> 5;
sint32 bitIndex = sceneryItem & 0x1F; sint32 bitIndex = sceneryItem & 0x1F;
bool invented = (gResearchedSceneryItems[quadIndex] & ((uint32)1 << bitIndex)); bool invented = (gResearchedSceneryItems[quadIndex] & ((uint32) 1 << bitIndex));
return invented; return invented;
} }
void reset_researched_scenery_items() void reset_researched_scenery_items()
{ {
for (sint32 i = 0; i < MAX_RESEARCHED_SCENERY_ITEMS; i++) { for (sint32 i = 0; i < MAX_RESEARCHED_SCENERY_ITEMS; i++)
{
gResearchedSceneryItems[i] = 0xFFFFFFFF; gResearchedSceneryItems[i] = 0xFFFFFFFF;
} }
} }
@ -709,11 +828,13 @@ void reset_researched_scenery_items()
void reset_researched_ride_types_and_entries() void reset_researched_ride_types_and_entries()
{ {
// Iteration endpoint used to be 4 for unknown reasons, likely a mistake // Iteration endpoint used to be 4 for unknown reasons, likely a mistake
for (sint32 i = 0; i < MAX_RESEARCHED_RIDE_TYPES; i++) { for (sint32 i = 0; i < MAX_RESEARCHED_RIDE_TYPES; i++)
{
gResearchedRideTypes[i] = 0xFFFFFFFF; gResearchedRideTypes[i] = 0xFFFFFFFF;
} }
for (sint32 i = 0; i < MAX_RESEARCHED_RIDE_ENTRIES; i++) { for (sint32 i = 0; i < MAX_RESEARCHED_RIDE_ENTRIES; i++)
{
gResearchedRideEntries[i] = 0xFFFFFFFF; gResearchedRideEntries[i] = 0xFFFFFFFF;
} }
} }
@ -726,8 +847,8 @@ rct_string_id research_item_get_name(uint32 researchItem)
{ {
if (researchItem >= RESEARCH_ENTRY_RIDE_MASK) if (researchItem >= RESEARCH_ENTRY_RIDE_MASK)
{ {
rct_ride_entry *rideEntry = get_ride_entry(researchItem & 0xFF); rct_ride_entry * rideEntry = get_ride_entry(researchItem & 0xFF);
if (rideEntry == NULL || rideEntry == (rct_ride_entry*)-1) if (rideEntry == NULL || rideEntry == (rct_ride_entry *) -1)
{ {
return 0; return 0;
} }
@ -744,8 +865,8 @@ rct_string_id research_item_get_name(uint32 researchItem)
} }
else else
{ {
rct_scenery_set_entry *sceneryEntry = get_scenery_group_entry(researchItem & 0xFF); rct_scenery_set_entry * sceneryEntry = get_scenery_group_entry(researchItem & 0xFF);
if (sceneryEntry == NULL || sceneryEntry == (rct_scenery_set_entry*)-1) if (sceneryEntry == NULL || sceneryEntry == (rct_scenery_set_entry *) -1)
{ {
return 0; return 0;
} }
@ -779,9 +900,9 @@ rct_string_id research_get_friendly_base_ride_type_name(uint8 trackType, rct_rid
} }
else else
{ {
if (ride_type_has_ride_groups(trackType)) if (RideGroupManager::RideTypeHasRideGroups(trackType))
{ {
const RideGroup * rideGroup = get_ride_group(trackType, rideEntry); const RideGroup * rideGroup = RideGroupManager::GetRideGroup(trackType, rideEntry);
return rideGroup->Naming.name; return rideGroup->Naming.name;
} }
else else

View File

@ -41,11 +41,11 @@ enum{
// Extra end of list entry. Unsure why? // Extra end of list entry. Unsure why?
#define RESEARCHED_ITEMS_END_2 -3 #define RESEARCHED_ITEMS_END_2 -3
#define MAX_RESEARCH_ITEMS 500 #define MAX_RESEARCH_ITEMS 500
#define MAX_RESEARCHED_SCENERY_ITEMS 56 #define MAX_RESEARCHED_SCENERY_ITEMS 56
#define MAX_RESEARCHED_RIDE_TYPES 8 #define MAX_RESEARCHED_RIDE_TYPES 8 // Really 256, since there are 32 bits per uint32.
#define MAX_RESEARCHED_RIDE_ENTRIES 8 #define MAX_RESEARCHED_RIDE_ENTRIES 8 // Really 256, since there are 32 bits per uint32.
#define MAX_RESEARCHED_TRACK_TYPES 128 #define MAX_RESEARCHED_TRACK_TYPES 128
#define RESEARCH_ENTRY_RIDE_MASK 0x10000 #define RESEARCH_ENTRY_RIDE_MASK 0x10000
@ -92,8 +92,6 @@ extern rct_research_item gResearchItems[MAX_RESEARCH_ITEMS];
extern uint8 gResearchUncompletedCategories; extern uint8 gResearchUncompletedCategories;
extern uint32 gResearchedRideTypes[MAX_RESEARCHED_RIDE_TYPES]; extern uint32 gResearchedRideTypes[MAX_RESEARCHED_RIDE_TYPES];
extern uint32 gResearchedRideEntries[MAX_RESEARCHED_RIDE_ENTRIES]; extern uint32 gResearchedRideEntries[MAX_RESEARCHED_RIDE_ENTRIES];
extern uint32 gResearchedTrackTypesA[MAX_RESEARCHED_TRACK_TYPES];
extern uint32 gResearchedTrackTypesB[MAX_RESEARCHED_TRACK_TYPES];
extern uint32 gResearchedSceneryItems[MAX_RESEARCHED_SCENERY_ITEMS]; extern uint32 gResearchedSceneryItems[MAX_RESEARCHED_SCENERY_ITEMS];
extern bool gSilentResearch; extern bool gSilentResearch;
@ -108,7 +106,7 @@ void research_populate_list_researched();
void research_set_funding(sint32 amount); void research_set_funding(sint32 amount);
void research_set_priority(sint32 activeCategories); void research_set_priority(sint32 activeCategories);
void game_command_set_research_funding(sint32* eax, sint32* ebx, sint32* ecx, sint32* edx, sint32* esi, sint32* edi, sint32* ebp); void game_command_set_research_funding(sint32* eax, sint32* ebx, sint32* ecx, sint32* edx, sint32* esi, sint32* edi, sint32* ebp);
void research_finish_item(sint32 entryIndex); void research_finish_item(uint32 entryIndex);
void research_insert(sint32 researched, sint32 entryIndex, sint32 category); void research_insert(sint32 researched, sint32 entryIndex, sint32 category);
void research_remove(sint32 entryIndex); void research_remove(sint32 entryIndex);

View File

@ -19,7 +19,7 @@
#include "management/award.h" #include "management/award.h"
#include "management/news_item.h" #include "management/news_item.h"
#include "management/research.h" #include "management/Research.h"
#include "rct12.h" #include "rct12.h"
#include "ride/ride.h" #include "ride/ride.h"
#include "world/banner.h" #include "world/banner.h"

View File

@ -36,7 +36,7 @@
#include "../management/finance.h" #include "../management/finance.h"
#include "../management/marketing.h" #include "../management/marketing.h"
#include "../management/news_item.h" #include "../management/news_item.h"
#include "../management/research.h" #include "../management/Research.h"
#include "../object.h" #include "../object.h"
#include "../OpenRCT2.h" #include "../OpenRCT2.h"
#include "../peep/staff.h" #include "../peep/staff.h"

View File

@ -38,7 +38,7 @@
#include "../management/finance.h" #include "../management/finance.h"
#include "../management/marketing.h" #include "../management/marketing.h"
#include "../management/news_item.h" #include "../management/news_item.h"
#include "../management/research.h" #include "../management/Research.h"
#include "../OpenRCT2.h" #include "../OpenRCT2.h"
#include "../peep/staff.h" #include "../peep/staff.h"
#include "../ride/ride.h" #include "../ride/ride.h"

View File

@ -21,7 +21,7 @@
#include "../core/String.hpp" #include "../core/String.hpp"
#include "../localisation/string_ids.h" #include "../localisation/string_ids.h"
#include "../management/research.h" #include "../management/Research.h"
#include "ride.h" #include "ride.h"
#include "ride_data.h" #include "ride_data.h"
#include "track.h" #include "track.h"
@ -328,9 +328,4 @@ extern "C"
{ {
return RideGroupManager::RideTypeHasRideGroups(rideType); return RideGroupManager::RideTypeHasRideGroups(rideType);
} }
bool ride_group_is_invented(const RideGroup * rideGroup)
{
return RideGroupManager::RideGroupIsInvented(rideGroup);
}
} }

View File

@ -58,7 +58,6 @@ extern "C"
#endif #endif
const RideGroup * get_ride_group(uint8 rideType, rct_ride_entry * rideEntry); const RideGroup * get_ride_group(uint8 rideType, rct_ride_entry * rideEntry);
bool ride_type_has_ride_groups(uint8 rideType); bool ride_type_has_ride_groups(uint8 rideType);
bool ride_group_is_invented(const RideGroup * rideGroup);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -26,7 +26,7 @@
#include "../management/finance.h" #include "../management/finance.h"
#include "../management/marketing.h" #include "../management/marketing.h"
#include "../management/news_item.h" #include "../management/news_item.h"
#include "../management/research.h" #include "../management/Research.h"
#include "../network/network.h" #include "../network/network.h"
#include "../object.h" #include "../object.h"
#include "../object_list.h" #include "../object_list.h"

View File

@ -19,7 +19,7 @@
#include "../common.h" #include "../common.h"
#include "../management/finance.h" #include "../management/finance.h"
#include "../management/research.h" #include "../management/Research.h"
#include "../object.h" #include "../object.h"
#include "../rct12.h" #include "../rct12.h"
#include "../rct2.h" #include "../rct2.h"

View File

@ -24,7 +24,7 @@
#include "../management/finance.h" #include "../management/finance.h"
#include "../management/marketing.h" #include "../management/marketing.h"
#include "../management/news_item.h" #include "../management/news_item.h"
#include "../management/research.h" #include "../management/Research.h"
#include "../network/network.h" #include "../network/network.h"
#include "../OpenRCT2.h" #include "../OpenRCT2.h"
#include "../peep/peep.h" #include "../peep/peep.h"