mirror of https://github.com/OpenRCT2/OpenRCT2.git
Compile research.cpp as C++, small refactor
This commit is contained in:
parent
10def2a31b
commit
25b72260d7
|
@ -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 */,
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
|
@ -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);
|
||||
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue