mirror of https://github.com/OpenRCT2/OpenRCT2.git
Fix #6315: Not all researched items in S4 are available
This commit is contained in:
parent
5187946bc9
commit
289e154fe4
|
@ -307,23 +307,7 @@ static void research_always_researched_setup()
|
|||
research_scenery_sets_setup();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00685A79
|
||||
* Do not use the research list outside of the inventions list window with the flags
|
||||
*/
|
||||
static void research_remove_flags()
|
||||
{
|
||||
for (rct_research_item* research = gResearchItems;
|
||||
research->entryIndex != RESEARCHED_ITEMS_END_2;
|
||||
research++){
|
||||
|
||||
// Clear the always researched flags.
|
||||
if (research->entryIndex > RESEARCHED_ITEMS_SEPARATOR){
|
||||
research->entryIndex &= 0x00FFFFFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
|
|
|
@ -1085,7 +1085,7 @@ void game_fix_save_vars()
|
|||
break;
|
||||
}
|
||||
if (researchItem->entryIndex == RESEARCHED_ITEMS_END_2) break;
|
||||
if (researchItem->entryIndex & 0x10000) {
|
||||
if (researchItem->entryIndex & RESEARCH_ENTRY_RIDE_MASK) {
|
||||
uint8 entryIndex = researchItem->entryIndex & 0xFF;
|
||||
rct_ride_entry *rideEntry = get_ride_entry(entryIndex);
|
||||
if (rideEntry == NULL || rideEntry == (rct_ride_entry*)-1) {
|
||||
|
|
|
@ -181,7 +181,8 @@ void research_finish_item(sint32 entryIndex)
|
|||
gResearchLastItemSubject = (uint32)entryIndex;
|
||||
research_invalidate_related_windows();
|
||||
|
||||
if (entryIndex >= 0x10000) {
|
||||
if (entryIndex >= RESEARCH_ENTRY_RIDE_MASK)
|
||||
{
|
||||
// Ride
|
||||
sint32 base_ride_type = research_get_ride_base_type(entryIndex);
|
||||
sint32 rideEntryIndex = entryIndex & 0xFF;
|
||||
|
@ -428,7 +429,7 @@ void research_remove_non_separate_vehicle_types()
|
|||
researchItem != gResearchItems &&
|
||||
researchItem->entryIndex != RESEARCHED_ITEMS_SEPARATOR &&
|
||||
researchItem->entryIndex != RESEARCHED_ITEMS_END &&
|
||||
researchItem->entryIndex >= 0x10000
|
||||
researchItem->entryIndex >= RESEARCH_ENTRY_RIDE_MASK
|
||||
) {
|
||||
rct_ride_entry *rideEntry = get_ride_entry(researchItem->entryIndex & 0xFF);
|
||||
if (!(rideEntry->flags & (RIDE_ENTRY_FLAG_SEPARATE_RIDE | RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME))) {
|
||||
|
@ -437,7 +438,7 @@ void research_remove_non_separate_vehicle_types()
|
|||
do {
|
||||
if (
|
||||
researchItem2->entryIndex != RESEARCHED_ITEMS_SEPARATOR &&
|
||||
researchItem2->entryIndex >= 0x10000
|
||||
researchItem2->entryIndex >= RESEARCH_ENTRY_RIDE_MASK
|
||||
) {
|
||||
rideEntry = get_ride_entry(researchItem2->entryIndex & 0xFF);
|
||||
if (!(rideEntry->flags & (RIDE_ENTRY_FLAG_SEPARATE_RIDE | RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME))) {
|
||||
|
@ -555,7 +556,7 @@ void research_populate_list_random()
|
|||
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, 0x10000 | (rideType << 8) | i, rideEntry->category[0]);
|
||||
research_insert(researched, RESEARCH_ENTRY_RIDE_MASK | (rideType << 8) | i, rideEntry->category[0]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -581,7 +582,7 @@ void research_populate_list_researched()
|
|||
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, 0x10000 | (rideType << 8) | i, rideEntry->category[0]);
|
||||
research_insert(true, RESEARCH_ENTRY_RIDE_MASK | (rideType << 8) | i, rideEntry->category[0]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -640,10 +641,12 @@ void research_insert_ride_entry(uint8 entryIndex, bool researched)
|
|||
{
|
||||
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++) {
|
||||
for (sint32 i = 0; i < MAX_RIDE_TYPES_PER_RIDE_ENTRY; i++)
|
||||
{
|
||||
uint8 rideType = rideEntry->ride_type[i];
|
||||
if (rideType != RIDE_TYPE_NULL) {
|
||||
research_insert(researched, 0x10000 | (rideType << 8) | entryIndex, category);
|
||||
if (rideType != RIDE_TYPE_NULL)
|
||||
{
|
||||
research_insert(researched, RESEARCH_ENTRY_RIDE_MASK | (rideType << 8) | entryIndex, category);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -721,7 +724,7 @@ void reset_researched_ride_types_and_entries()
|
|||
*/
|
||||
rct_string_id research_item_get_name(uint32 researchItem)
|
||||
{
|
||||
if (researchItem >= 0x10000)
|
||||
if (researchItem >= RESEARCH_ENTRY_RIDE_MASK)
|
||||
{
|
||||
rct_ride_entry *rideEntry = get_ride_entry(researchItem & 0xFF);
|
||||
if (rideEntry == NULL || rideEntry == (rct_ride_entry*)-1)
|
||||
|
@ -787,3 +790,20 @@ rct_string_id research_get_friendly_base_ride_type_name(uint8 trackType, rct_rid
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x00685A79
|
||||
* Do not use the research list outside of the inventions list window with the flags
|
||||
*/
|
||||
void research_remove_flags()
|
||||
{
|
||||
for (rct_research_item * research = gResearchItems; research->entryIndex != RESEARCHED_ITEMS_END_2; research++)
|
||||
{
|
||||
// Clear the always researched flags.
|
||||
if (research->entryIndex > RESEARCHED_ITEMS_SEPARATOR)
|
||||
{
|
||||
research->entryIndex &= 0x00FFFFFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -47,6 +47,8 @@ enum{
|
|||
#define MAX_RESEARCHED_RIDE_ENTRIES 8
|
||||
#define MAX_RESEARCHED_TRACK_TYPES 128
|
||||
|
||||
#define RESEARCH_ENTRY_RIDE_MASK 0x10000
|
||||
|
||||
enum {
|
||||
RESEARCH_FUNDING_NONE,
|
||||
RESEARCH_FUNDING_MINIMUM,
|
||||
|
@ -122,6 +124,7 @@ void reset_researched_ride_types_and_entries();
|
|||
rct_string_id research_item_get_name(uint32 researchItem);
|
||||
uint8 research_get_ride_base_type(sint32 researchItem);
|
||||
rct_string_id research_get_friendly_base_ride_type_name(uint8 trackType, rct_ride_entry * rideEntry);
|
||||
void research_remove_flags();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -889,7 +889,9 @@ enum {
|
|||
RCT1_RIDE_TYPE_ENTERPRISE,
|
||||
RCT1_RIDE_TYPE_COFFEE_SHOP,
|
||||
RCT1_RIDE_TYPE_FRIED_CHICKEN_STALL,
|
||||
RCT1_RIDE_TYPE_LEMONADE_STALL
|
||||
RCT1_RIDE_TYPE_LEMONADE_STALL,
|
||||
|
||||
RCT1_RIDE_TYPE_COUNT
|
||||
};
|
||||
|
||||
enum {
|
||||
|
@ -981,7 +983,9 @@ enum {
|
|||
RCT1_VEHICLE_TYPE_AMERICAN_STYLE_STEAM_TRAIN,
|
||||
RCT1_VEHICLE_TYPE_AIR_POWERED_COASTER_TRAIN,
|
||||
RCT1_VEHICLE_TYPE_SUSPENDED_WILD_MOUSE_CARS, // Inverted Hairpin in RCT2
|
||||
RCT1_VEHICLE_TYPE_ENTERPRISE_WHEEL
|
||||
RCT1_VEHICLE_TYPE_ENTERPRISE_WHEEL,
|
||||
|
||||
RCT1_VEHICLE_TYPE_COUNT
|
||||
};
|
||||
|
||||
enum {
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include "../ride/station.h"
|
||||
#include "../scenario/ScenarioSources.h"
|
||||
#include "Tables.h"
|
||||
#include "../object_list.h"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
|
@ -114,8 +115,8 @@ private:
|
|||
EntryList _waterEntry;
|
||||
|
||||
// Lookup tables for converting from RCT1 hard coded types to the new dynamic object entries
|
||||
uint8 _rideTypeToRideEntryMap[96];
|
||||
uint8 _vehicleTypeToRideEntryMap[96];
|
||||
uint8 _rideTypeToRideEntryMap[RCT1_RIDE_TYPE_COUNT];
|
||||
uint8 _vehicleTypeToRideEntryMap[RCT1_VEHICLE_TYPE_COUNT];
|
||||
uint8 _smallSceneryTypeToEntryMap[256];
|
||||
uint8 _largeSceneryTypeToEntryMap[256];
|
||||
uint8 _wallTypeToEntryMap[256];
|
||||
|
@ -124,8 +125,8 @@ private:
|
|||
uint8 _sceneryThemeTypeToEntryMap[24];
|
||||
|
||||
// Research
|
||||
uint8 _researchRideEntryUsed[128];
|
||||
uint8 _researchRideTypeUsed[128];
|
||||
uint8 _researchRideEntryUsed[MAX_RIDE_OBJECTS];
|
||||
uint8 _researchRideTypeUsed[RCT1_RIDE_TYPE_COUNT];
|
||||
|
||||
public:
|
||||
ParkLoadResult Load(const utf8 * path) override
|
||||
|
@ -665,9 +666,9 @@ private:
|
|||
else
|
||||
{
|
||||
const char * entryName = RCT1::GetSceneryGroupObject(sceneryThemeType);
|
||||
if (_sceneryGroupEntries.GetCount() >= 19)
|
||||
if (_sceneryGroupEntries.GetCount() >= MAX_SCENERY_GROUP_OBJECTS)
|
||||
{
|
||||
Console::WriteLine("Warning: More than 19 (max scenery groups) in RCT1 park.");
|
||||
Console::WriteLine("Warning: More than %d (max scenery groups) in RCT1 park.", MAX_SCENERY_GROUP_OBJECTS);
|
||||
Console::WriteLine(" [%s] scenery group not added.", entryName);
|
||||
}
|
||||
else
|
||||
|
@ -2017,6 +2018,9 @@ private:
|
|||
gResearchNextCategory = _s4.next_research_category;
|
||||
// gResearchExpectedDay =
|
||||
// gResearchExpectedMonth =
|
||||
|
||||
// This is needed to fix Research. Not sure why.
|
||||
research_reset_current_item();
|
||||
}
|
||||
|
||||
void InsertResearchVehicle(const rct1_research_item * researchItem, bool researched)
|
||||
|
|
Loading…
Reference in New Issue