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 */; };
4C8B42721EEB1AE400F015CA /* HardwareDisplayDrawingEngine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4C8B42711EEB1AE400F015CA /* HardwareDisplayDrawingEngine.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 */; };
4CB832AB1EFFB8D100B88761 /* ttf_sdlport.c in Sources */ = {isa = PBXBuildFile; fileRef = 4CB832A81EFFB8D100B88761 /* ttf_sdlport.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 */; };
F76C863F1EC4E88300FA49E2 /* marketing.c in Sources */ = {isa = PBXBuildFile; fileRef = F76C83EF1EC4E7CC00FA49E2 /* marketing.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 */; };
F76C86471EC4E88300FA49E2 /* Network.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F76C83F81EC4E7CC00FA49E2 /* Network.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>"; };
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>"; };
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>"; };
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>"; };
@ -1079,8 +1081,6 @@
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>"; };
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>"; };
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>"; };
@ -2079,8 +2079,8 @@
F76C83F01EC4E7CC00FA49E2 /* marketing.h */,
F76C83F11EC4E7CC00FA49E2 /* news_item.c */,
F76C83F21EC4E7CC00FA49E2 /* news_item.h */,
F76C83F31EC4E7CC00FA49E2 /* research.c */,
F76C83F41EC4E7CC00FA49E2 /* research.h */,
4C93F1121F86728F00A9330D /* Research.cpp */,
4C93F1131F86728F00A9330D /* Research.h */,
);
path = management;
sourceTree = "<group>";
@ -3134,6 +3134,7 @@
F76C887D1EC5324E00FA49E2 /* CursorData.cpp in Sources */,
4CB832A71EFBDCCE00B88761 /* land_tool.c in Sources */,
C666EE7B1F37ACB10061AA04 /* TitleExit.cpp in Sources */,
4C93F1141F86728F00A9330D /* Research.cpp in Sources */,
F7D7747F1EC61E5100BE6EBC /* UiContext.macOS.mm in Sources */,
F76C887E1EC5324E00FA49E2 /* CursorRepository.cpp in Sources */,
C654DF331F69C0430040F43D /* LoadSave.cpp in Sources */,
@ -3279,7 +3280,6 @@
C666EE1A1F33E3800061AA04 /* EditorObjectSelection.cpp in Sources */,
F76C863F1EC4E88300FA49E2 /* marketing.c in Sources */,
F76C86411EC4E88300FA49E2 /* news_item.c in Sources */,
F76C86431EC4E88300FA49E2 /* research.c in Sources */,
F76C86451EC4E88300FA49E2 /* Http.cpp in Sources */,
F76C86471EC4E88300FA49E2 /* Network.cpp in Sources */,
F76C86491EC4E88300FA49E2 /* NetworkAction.cpp in Sources */,

View File

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

View File

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

View File

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

View File

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

View File

@ -16,6 +16,7 @@
#include "../config/Config.h"
#include "../core/Guard.hpp"
#include "../core/Util.hpp"
#include "../game.h"
#include "../interface/window.h"
#include "../localisation/date.h"
@ -31,18 +32,19 @@
#include "../ride/track_data.h"
#include "../world/scenery.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 gResearchPriorities;
uint8 gResearchFundingLevel;
uint8 gResearchPriorities;
uint16 gResearchProgress;
uint8 gResearchProgressStage;
uint8 gResearchProgressStage;
uint32 gResearchLastItemSubject;
uint8 gResearchExpectedMonth;
uint8 gResearchExpectedDay;
uint8 gResearchNextCategory;
uint8 gResearchExpectedMonth;
uint8 gResearchExpectedDay;
uint8 gResearchNextCategory;
uint32 gResearchNextItem;
// 0x01358844[500]
@ -53,13 +55,12 @@ uint8 gResearchUncompletedCategories;
uint32 gResearchedRideTypes[MAX_RESEARCHED_RIDE_TYPES];
uint32 gResearchedRideEntries[MAX_RESEARCHED_RIDE_ENTRIES];
uint32 gResearchedTrackTypesA[MAX_RESEARCHED_TRACK_TYPES];
uint32 gResearchedTrackTypesB[MAX_RESEARCHED_TRACK_TYPES];
uint32 gResearchedSceneryItems[MAX_RESEARCHED_SCENERY_ITEMS];
bool gSilentResearch = false;
static void ride_type_set_invented(sint32 rideType);
static void ride_entry_set_invented(sint32 rideEntryIndex);
/**
@ -80,11 +81,13 @@ void research_reset_items()
void research_update_uncompleted_types()
{
sint32 uncompletedResearchTypes = 0;
rct_research_item *researchItem = gResearchItems;
rct_research_item * researchItem = gResearchItems;
while (researchItem++->entryIndex != RESEARCHED_ITEMS_SEPARATOR);
for (; researchItem->entryIndex != RESEARCHED_ITEMS_END; researchItem++)
{
uncompletedResearchTypes |= (1 << researchItem->category);
}
gResearchUncompletedCategories = uncompletedResearchTypes;
}
@ -95,21 +98,24 @@ void research_update_uncompleted_types()
*/
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;
} else {
}
else
{
sint32 progressRemaining = gResearchProgressStage == RESEARCH_STAGE_COMPLETING_DESIGN ? 0x10000 : 0x20000;
progressRemaining -= gResearchProgress;
sint32 daysRemaining = (progressRemaining / _researchRate[gResearchFundingLevel]) * 128;
sint32 expectedDay = gDateMonthTicks + (daysRemaining & 0xFFFF);
sint32 dayQuotient = expectedDay / 0x10000;
sint32 expectedDay = gDateMonthTicks + (daysRemaining & 0xFFFF);
sint32 dayQuotient = expectedDay / 0x10000;
sint32 dayRemainder = expectedDay % 0x10000;
sint32 expectedMonth = date_get_month(gDateMonthsElapsed + dayQuotient + (daysRemaining >> 16));
expectedDay = (dayRemainder * days_in_month[expectedMonth]) >> 16;
gResearchExpectedDay = expectedDay;
gResearchExpectedDay = expectedDay;
gResearchExpectedMonth = expectedMonth;
}
}
@ -126,48 +132,59 @@ static void research_invalidate_related_windows()
*/
static void research_next_design()
{
rct_research_item *firstUnresearchedItem, *researchItem, tmp;
rct_research_item * firstUnresearchedItem, * researchItem, tmp;
sint32 ignoreActiveResearchTypes;
// Skip already researched items
firstUnresearchedItem = gResearchItems;
while (firstUnresearchedItem->entryIndex != RESEARCHED_ITEMS_SEPARATOR)
{
firstUnresearchedItem++;
}
ignoreActiveResearchTypes = 0;
researchItem = firstUnresearchedItem;
for (;;) {
researchItem = firstUnresearchedItem;
for (;;)
{
researchItem++;
if (researchItem->entryIndex == RESEARCHED_ITEMS_END) {
if (!ignoreActiveResearchTypes) {
if (researchItem->entryIndex == RESEARCHED_ITEMS_END)
{
if (!ignoreActiveResearchTypes)
{
ignoreActiveResearchTypes = 1;
researchItem = firstUnresearchedItem;
researchItem = firstUnresearchedItem;
continue;
} else {
gResearchProgress = 0;
}
else
{
gResearchProgress = 0;
gResearchProgressStage = RESEARCH_STAGE_FINISHED_ALL;
research_invalidate_related_windows();
// Reset funding to 0 if no more rides.
research_set_funding(0);
return;
}
} else if (ignoreActiveResearchTypes || (gResearchPriorities & (1 << researchItem->category))) {
}
else if (ignoreActiveResearchTypes || (gResearchPriorities & (1 << researchItem->category)))
{
break;
}
}
gResearchNextItem = researchItem->entryIndex;
gResearchNextCategory = researchItem->category;
gResearchProgress = 0;
gResearchNextItem = researchItem->entryIndex;
gResearchNextCategory = researchItem->category;
gResearchProgress = 0;
gResearchProgressStage = RESEARCH_STAGE_DESIGNING;
// Bubble research item up until it is above the researched items separator
do {
do
{
tmp = *researchItem;
*researchItem = *(researchItem - 1);
*researchItem = *(researchItem - 1);
*(researchItem - 1) = tmp;
researchItem--;
} while ((researchItem + 1)->entryIndex != RESEARCHED_ITEMS_SEPARATOR);
}
while ((researchItem + 1)->entryIndex != RESEARCHED_ITEMS_SEPARATOR);
research_invalidate_related_windows();
}
@ -176,50 +193,59 @@ static void research_next_design()
*
* rct2: 0x006848D4
*/
void research_finish_item(sint32 entryIndex)
void research_finish_item(uint32 entryIndex)
{
gResearchLastItemSubject = (uint32)entryIndex;
gResearchLastItemSubject = entryIndex;
research_invalidate_related_windows();
if (entryIndex >= RESEARCH_ENTRY_RIDE_MASK)
{
// 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;
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_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;
// 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_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);
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);
if (rideEntry2 == (rct_ride_entry*)-1)
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);
if (rideEntry2 == (rct_ride_entry *) -1)
{
continue;
}
if ((rideEntry2->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE))
{
continue;
}
for (uint8 j = 0; j < MAX_RIDE_TYPES_PER_RIDE_ENTRY; j++) {
if (rideEntry2->ride_type[j] == base_ride_type) {
for (uint8 j = 0; j < MAX_RIDE_TYPES_PER_RIDE_ENTRY; j++)
{
if (rideEntry2->ride_type[j] == base_ride_type)
{
ride_entry_set_invented(i);
break;
}
@ -250,15 +276,16 @@ void research_finish_item(sint32 entryIndex)
availabilityString = STR_NEWS_ITEM_RESEARCH_NEW_RIDE_AVAILABLE;
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.
else if (!ride_type_was_invented_before || (ride_type_has_ride_groups(base_ride_type) && !ride_group_was_invented_before))
// 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))
{
rct_ride_name naming = get_ride_naming(base_ride_type, rideEntry);
availabilityString = STR_NEWS_ITEM_RESEARCH_NEW_RIDE_AVAILABLE;
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,
// report it as a new vehicle for the existing 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.
else
{
availabilityString = STR_NEWS_ITEM_RESEARCH_NEW_VEHICLE_AVAILABLE;
@ -279,20 +306,25 @@ void research_finish_item(sint32 entryIndex)
research_invalidate_related_windows();
}
} else {
}
else
{
// Scenery
rct_scenery_set_entry *scenerySetEntry = get_scenery_group_entry(entryIndex & 0xFFFF);
if (scenerySetEntry != NULL && scenerySetEntry != (rct_scenery_set_entry *)-1)
rct_scenery_set_entry * scenerySetEntry = get_scenery_group_entry(entryIndex & 0xFFFF);
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];
gResearchedSceneryItems[subSceneryEntryIndex >> 5] |= 1UL << (subSceneryEntryIndex & 0x1F);
}
set_format_arg(0, rct_string_id, scenerySetEntry->name);
if (!gSilentResearch) {
if (gConfigNotifications.ride_researched) {
if (!gSilentResearch)
{
if (gConfigNotifications.ride_researched)
{
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;
if (gScreenFlags & editorScreenFlags)
{
return;
}
if (gScenarioTicks % 32 != 0)
{
return;
}
researchLevel = gResearchFundingLevel;
currentResearchProgress = gResearchProgress;
currentResearchProgress += _researchRate[researchLevel];
if (currentResearchProgress <= 0xFFFF) {
if (currentResearchProgress <= 0xFFFF)
{
gResearchProgress = currentResearchProgress;
} else {
switch (gResearchProgressStage) {
}
else
{
switch (gResearchProgressStage)
{
case RESEARCH_STAGE_INITIAL_RESEARCH:
research_next_design();
research_calculate_expected_date();
break;
case RESEARCH_STAGE_DESIGNING:
gResearchProgress = 0;
gResearchProgress = 0;
gResearchProgressStage = RESEARCH_STAGE_COMPLETING_DESIGN;
research_calculate_expected_date();
research_invalidate_related_windows();
break;
case RESEARCH_STAGE_COMPLETING_DESIGN:
research_finish_item((sint32)gResearchNextItem);
gResearchProgress = 0;
research_finish_item(gResearchNextItem);
gResearchProgress = 0;
gResearchProgressStage = 0;
research_calculate_expected_date();
research_update_uncompleted_types();
@ -352,25 +392,34 @@ void research_update()
*
* rct2: 0x00684AC3
*/
void research_reset_current_item(){
rct_research_item* research = gResearchItems;
for (; research->entryIndex != RESEARCHED_ITEMS_END; research++);
void research_reset_current_item()
{
rct_research_item * research = gResearchItems;
for (; research->entryIndex != RESEARCHED_ITEMS_END; research++) { }
research++;
for (; research->entryIndex != RESEARCHED_ITEMS_END_2; research += 2){
if (scenario_rand() & 1) continue;
for (; research->entryIndex != RESEARCHED_ITEMS_END_2; research += 2)
{
if (scenario_rand() & 1)
{
continue;
}
rct_research_item* edx = NULL;
rct_research_item* ebp = NULL;
rct_research_item* inner_research = gResearchItems;
do {
if (research->entryIndex == inner_research->entryIndex){
rct_research_item * edx = NULL;
rct_research_item * ebp = NULL;
rct_research_item * inner_research = gResearchItems;
do
{
if (research->entryIndex == inner_research->entryIndex)
{
edx = inner_research;
}
if ((research + 1)->entryIndex == inner_research->entryIndex){
if ((research + 1)->entryIndex == inner_research->entryIndex)
{
ebp = inner_research;
}
} while ((inner_research++)->entryIndex != RESEARCHED_ITEMS_END);
}
while ((inner_research++)->entryIndex != RESEARCHED_ITEMS_END);
assert(edx != NULL);
edx->entryIndex = research->entryIndex;
assert(ebp != NULL);
@ -381,33 +430,45 @@ void research_reset_current_item(){
ebp->category = cat;
}
for (sint32 i = 0; i < 8; ++i){
for (sint32 i = 0; i < MAX_RESEARCHED_RIDE_TYPES; ++i)
{
gResearchedRideTypes[i] = 0;
}
for (sint32 i = 0; i < MAX_RESEARCHED_RIDE_ENTRIES; ++i)
{
gResearchedRideEntries[i] = 0;
}
for (sint32 i = 0; i < 56; i++) {
for (sint32 i = 0; i < MAX_RESEARCHED_SCENERY_ITEMS; i++)
{
gResearchedSceneryItems[i] = 0xFFFFFFFF;
}
for (sint32 i = 0; i < 19; ++i){
rct_scenery_set_entry* scenery_set = get_scenery_group_entry(i);
if ((intptr_t)scenery_set == -1)continue;
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;
}
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;
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);
}
gResearchLastItemSubject = (uint32)-1;
gResearchProgressStage = 0;
gResearchProgress = 0;
gResearchLastItemSubject = (uint32) -1;
gResearchProgressStage = 0;
gResearchProgress = 0;
}
/**
@ -416,47 +477,60 @@ void research_reset_current_item(){
*/
void research_remove_non_separate_vehicle_types()
{
rct_research_item *researchItem, *researchItem2;
rct_research_item * researchItem, * researchItem2;
researchItem = gResearchItems;
while ((researchItem + 1)->entryIndex != RESEARCHED_ITEMS_END) {
while ((researchItem + 1)->entryIndex != RESEARCHED_ITEMS_END)
{
researchItem++;
}
do {
loopBeginning:
do
{
loopBeginning:
if (
researchItem != gResearchItems &&
researchItem->entryIndex != RESEARCHED_ITEMS_SEPARATOR &&
researchItem->entryIndex != RESEARCHED_ITEMS_END &&
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
researchItem2 = researchItem - 1;
do {
do
{
if (
researchItem2->entryIndex != RESEARCHED_ITEMS_SEPARATOR &&
researchItem2->entryIndex >= RESEARCH_ENTRY_RIDE_MASK
) {
)
{
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
researchItem2 = researchItem;
do {
do
{
*researchItem2 = *(researchItem2 + 1);
} while ((researchItem2++)->entryIndex != RESEARCHED_ITEMS_END_2);
}
while ((researchItem2++)->entryIndex != RESEARCHED_ITEMS_END_2);
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)
{
rct_research_item *researchItem, *researchItem2;
rct_research_item * researchItem, * researchItem2;
researchItem = gResearchItems;
do {
if (researchItem->entryIndex == RESEARCHED_ITEMS_END) {
do
{
if (researchItem->entryIndex == RESEARCHED_ITEMS_END)
{
// Insert slot
researchItem2 = researchItem;
while (researchItem2->entryIndex != RESEARCHED_ITEMS_END_2) {
while (researchItem2->entryIndex != RESEARCHED_ITEMS_END_2)
{
researchItem2++;
}
memmove(researchItem + 1, researchItem, (researchItem2 - researchItem + 1) * sizeof(rct_research_item));
// Place new item
researchItem->entryIndex = entryIndex;
researchItem->category = category;
researchItem->category = category;
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)
{
rct_research_item *researchItem, *researchItem2;
rct_research_item * researchItem, * researchItem2;
researchItem = gResearchItems;
// 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)
{
return;
}
}
researchItem = gResearchItems;
do {
if (researchItem->entryIndex == RESEARCHED_ITEMS_SEPARATOR) {
do
{
if (researchItem->entryIndex == RESEARCHED_ITEMS_SEPARATOR)
{
// Insert slot
researchItem2 = researchItem;
while (researchItem2->entryIndex != RESEARCHED_ITEMS_END_2) {
while (researchItem2->entryIndex != RESEARCHED_ITEMS_END_2)
{
researchItem2++;
}
memmove(researchItem + 1, researchItem, (researchItem2 - researchItem + 1) * sizeof(rct_research_item));
// Place new item
researchItem->entryIndex = entryIndex;
researchItem->category = category;
researchItem->category = category;
break;
}
} while (entryIndex != (researchItem++)->entryIndex);
}
while (entryIndex != (researchItem++)->entryIndex);
}
/**
*
* rct2: 0x006857CF
*/
void research_remove(sint32 entryIndex){
for (rct_research_item *researchItem = gResearchItems; researchItem->entryIndex != RESEARCHED_ITEMS_END; researchItem++){
if (researchItem->entryIndex == entryIndex){
do{
void research_remove(sint32 entryIndex)
{
for (rct_research_item * researchItem = gResearchItems;
researchItem->entryIndex != RESEARCHED_ITEMS_END; researchItem++)
{
if (researchItem->entryIndex == entryIndex)
{
do
{
*researchItem = *(researchItem + 1);
} while (researchItem++->entryIndex != RESEARCHED_ITEMS_END_2);
}
while (researchItem++->entryIndex != RESEARCHED_ITEMS_END_2);
return;
}
}
@ -535,9 +626,13 @@ void research_remove(sint32 entryIndex){
void research_insert(sint32 researched, sint32 entryIndex, sint32 category)
{
if (researched)
{
research_insert_researched(entryIndex, category);
}
else
{
research_insert_unresearched(entryIndex, category);
}
}
/**
@ -547,24 +642,33 @@ void research_insert(sint32 researched, sint32 entryIndex, sint32 category)
void research_populate_list_random()
{
// Rides
for (sint32 i = 0; i < 128; i++) {
rct_ride_entry *rideEntry = get_ride_entry(i);
if (rideEntry == (rct_ride_entry*)-1)
for (sint32 i = 0; i < MAX_RIDE_OBJECTS; i++)
{
rct_ride_entry * rideEntry = get_ride_entry(i);
if (rideEntry == (rct_ride_entry *) -1)
{
continue;
}
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];
if (rideType != RIDE_TYPE_NULL)
{
research_insert(researched, RESEARCH_ENTRY_RIDE_MASK | (rideType << 8) | i, rideEntry->category[0]);
}
}
}
// Scenery
for (sint32 i = 0; i < 19; i++) {
rct_scenery_set_entry *scenerySetEntry = get_scenery_group_entry(i);
if (scenerySetEntry == (rct_scenery_set_entry*)-1)
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)
{
continue;
}
sint32 researched = (scenario_rand() & 0xFF) > 85;
research_insert(researched, i, RESEARCH_CATEGORY_SCENERYSET);
@ -574,23 +678,32 @@ void research_populate_list_random()
void research_populate_list_researched()
{
// Rides
for (sint32 i = 0; i < 128; i++) {
rct_ride_entry *rideEntry = get_ride_entry(i);
if (rideEntry == (rct_ride_entry*)-1)
for (sint32 i = 0; i < MAX_RIDE_OBJECTS; i++)
{
rct_ride_entry * rideEntry = get_ride_entry(i);
if (rideEntry == (rct_ride_entry *) -1)
{
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];
if (rideType != RIDE_TYPE_NULL)
{
research_insert(true, RESEARCH_ENTRY_RIDE_MASK | (rideType << 8) | i, rideEntry->category[0]);
}
}
}
// Scenery
for (sint32 i = 0; i < 19; i++) {
rct_scenery_set_entry *scenerySetEntry = get_scenery_group_entry(i);
if (scenerySetEntry == (rct_scenery_set_entry*)-1)
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)
{
continue;
}
research_insert(true, i, RESEARCH_CATEGORY_SCENERYSET);
}
@ -611,16 +724,19 @@ void research_set_priority(sint32 activeCategories)
*
* 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 fundingAmount = *edx;
sint32 setPriorities = (*ebx & (1 << 8)) != 0;
uint32 fundingAmount = *edx;
sint32 activeCategories = *edx;
gCommandExpenditureType = RCT_EXPENDITURE_TYPE_RESEARCH;
if (*ebx & GAME_COMMAND_FLAG_APPLY) {
if (!setPriorities) {
if (fundingAmount < 0 || fundingAmount >= countof(_researchRate)) {
if (*ebx & GAME_COMMAND_FLAG_APPLY)
{
if (!setPriorities)
{
if (fundingAmount >= Util::CountOf(_researchRate))
{
*ebx = MONEY32_UNDEFINED;
log_warning("Invalid research rate %d", fundingAmount);
return;
@ -628,7 +744,9 @@ void game_command_set_research_funding(sint32* eax, sint32* ebx, sint32* ecx, si
gResearchFundingLevel = fundingAmount;
}
else
{
gResearchPriorities = activeCategories;
}
window_invalidate_by_class(WC_FINANCES);
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)
{
rct_ride_entry *rideEntry = get_ride_entry(entryIndex);
rct_ride_entry * rideEntry = get_ride_entry(entryIndex);
uint8 category = rideEntry->category[0];
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)
{
sint32 quadIndex = rideType >> 5;
sint32 bitIndex = rideType & 0x1F;
bool invented = (gResearchedRideTypes[quadIndex] & ((uint32)1 << bitIndex));
sint32 bitIndex = rideType & 0x1F;
bool invented = (gResearchedRideTypes[quadIndex] & ((uint32) 1 << bitIndex));
return invented;
}
bool ride_entry_is_invented(sint32 rideEntryIndex)
{
sint32 quadIndex = rideEntryIndex >> 5;
sint32 bitIndex = rideEntryIndex & 0x1F;
bool invented = (gResearchedRideEntries[quadIndex] & ((uint32)1 << bitIndex));
sint32 bitIndex = rideEntryIndex & 0x1F;
bool invented = (gResearchedRideEntries[quadIndex] & ((uint32) 1 << bitIndex));
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)
{
sint32 quadIndex = rideType >> 5;
sint32 bitIndex = rideType & 0x1F;
gResearchedRideTypes[quadIndex] |= (uint32)1 << bitIndex;
sint32 bitIndex = rideType & 0x1F;
gResearchedRideTypes[quadIndex] |= (uint32) 1 << bitIndex;
}
static void ride_entry_set_invented(sint32 rideEntryIndex)
{
sint32 quadIndex = rideEntryIndex >> 5;
sint32 bitIndex = rideEntryIndex & 0x1F;
gResearchedRideEntries[quadIndex] |= (uint32)1 << bitIndex;
sint32 bitIndex = rideEntryIndex & 0x1F;
gResearchedRideEntries[quadIndex] |= (uint32) 1 << bitIndex;
}
bool scenery_is_invented(uint16 sceneryItem)
{
sint32 quadIndex = sceneryItem >> 5;
sint32 bitIndex = sceneryItem & 0x1F;
bool invented = (gResearchedSceneryItems[quadIndex] & ((uint32)1 << bitIndex));
sint32 bitIndex = sceneryItem & 0x1F;
bool invented = (gResearchedSceneryItems[quadIndex] & ((uint32) 1 << bitIndex));
return invented;
}
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;
}
}
@ -709,11 +828,13 @@ void reset_researched_scenery_items()
void reset_researched_ride_types_and_entries()
{
// 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;
}
for (sint32 i = 0; i < MAX_RESEARCHED_RIDE_ENTRIES; i++) {
for (sint32 i = 0; i < MAX_RESEARCHED_RIDE_ENTRIES; i++)
{
gResearchedRideEntries[i] = 0xFFFFFFFF;
}
}
@ -726,8 +847,8 @@ rct_string_id research_item_get_name(uint32 researchItem)
{
if (researchItem >= RESEARCH_ENTRY_RIDE_MASK)
{
rct_ride_entry *rideEntry = get_ride_entry(researchItem & 0xFF);
if (rideEntry == NULL || rideEntry == (rct_ride_entry*)-1)
rct_ride_entry * rideEntry = get_ride_entry(researchItem & 0xFF);
if (rideEntry == NULL || rideEntry == (rct_ride_entry *) -1)
{
return 0;
}
@ -744,8 +865,8 @@ rct_string_id research_item_get_name(uint32 researchItem)
}
else
{
rct_scenery_set_entry *sceneryEntry = get_scenery_group_entry(researchItem & 0xFF);
if (sceneryEntry == NULL || sceneryEntry == (rct_scenery_set_entry*)-1)
rct_scenery_set_entry * sceneryEntry = get_scenery_group_entry(researchItem & 0xFF);
if (sceneryEntry == NULL || sceneryEntry == (rct_scenery_set_entry *) -1)
{
return 0;
}
@ -779,9 +900,9 @@ rct_string_id research_get_friendly_base_ride_type_name(uint8 trackType, rct_rid
}
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;
}
else

View File

@ -41,11 +41,11 @@ enum{
// Extra end of list entry. Unsure why?
#define RESEARCHED_ITEMS_END_2 -3
#define MAX_RESEARCH_ITEMS 500
#define MAX_RESEARCHED_SCENERY_ITEMS 56
#define MAX_RESEARCHED_RIDE_TYPES 8
#define MAX_RESEARCHED_RIDE_ENTRIES 8
#define MAX_RESEARCHED_TRACK_TYPES 128
#define MAX_RESEARCH_ITEMS 500
#define MAX_RESEARCHED_SCENERY_ITEMS 56
#define MAX_RESEARCHED_RIDE_TYPES 8 // Really 256, since there are 32 bits per uint32.
#define MAX_RESEARCHED_RIDE_ENTRIES 8 // Really 256, since there are 32 bits per uint32.
#define MAX_RESEARCHED_TRACK_TYPES 128
#define RESEARCH_ENTRY_RIDE_MASK 0x10000
@ -92,8 +92,6 @@ extern rct_research_item gResearchItems[MAX_RESEARCH_ITEMS];
extern uint8 gResearchUncompletedCategories;
extern uint32 gResearchedRideTypes[MAX_RESEARCHED_RIDE_TYPES];
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 bool gSilentResearch;
@ -108,7 +106,7 @@ void research_populate_list_researched();
void research_set_funding(sint32 amount);
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 research_finish_item(sint32 entryIndex);
void research_finish_item(uint32 entryIndex);
void research_insert(sint32 researched, sint32 entryIndex, sint32 category);
void research_remove(sint32 entryIndex);

View File

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

View File

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

View File

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

View File

@ -21,7 +21,7 @@
#include "../core/String.hpp"
#include "../localisation/string_ids.h"
#include "../management/research.h"
#include "../management/Research.h"
#include "ride.h"
#include "ride_data.h"
#include "track.h"
@ -328,9 +328,4 @@ extern "C"
{
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
const RideGroup * get_ride_group(uint8 rideType, rct_ride_entry * rideEntry);
bool ride_type_has_ride_groups(uint8 rideType);
bool ride_group_is_invented(const RideGroup * rideGroup);
#ifdef __cplusplus
}
#endif

View File

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

View File

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

View File

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