mirror of https://github.com/OpenRCT2/OpenRCT2.git
Fix RCT1 research import, fixes #5014
This commit is contained in:
parent
f0f26ee297
commit
528843184c
|
@ -27,11 +27,12 @@
|
||||||
#include "world/map.h"
|
#include "world/map.h"
|
||||||
#include "world/sprite.h"
|
#include "world/sprite.h"
|
||||||
|
|
||||||
#define RCT1_MAX_MAP_ELEMENTS 0xC000
|
#define RCT1_MAX_MAP_ELEMENTS 0xC000
|
||||||
#define RCT1_MAX_SPRITES 5000
|
#define RCT1_MAX_SPRITES 5000
|
||||||
#define RCT1_MAX_TRAINS_PER_RIDE 12
|
#define RCT1_MAX_TRAINS_PER_RIDE 12
|
||||||
#define RCT1_MAX_MAP_SIZE 128
|
#define RCT1_MAX_MAP_SIZE 128
|
||||||
#define RCT1_MAX_RIDES_IN_PARK 128
|
#define RCT1_MAX_RIDES_IN_PARK 128
|
||||||
|
#define RCT1_RESEARCH_FLAGS_SEPARATOR 0xFF
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
typedef struct rct1_entrance {
|
typedef struct rct1_entrance {
|
||||||
|
|
|
@ -324,14 +324,17 @@ private:
|
||||||
for (size_t i = 0; i < researchListCount; i++)
|
for (size_t i = 0; i < researchListCount; i++)
|
||||||
{
|
{
|
||||||
const rct1_research_item * researchItem = &researchList[i];
|
const rct1_research_item * researchItem = &researchList[i];
|
||||||
if (researchItem->item == RCT1_RESEARCH_END_RESEARCHABLE ||
|
|
||||||
researchItem->item == RCT1_RESEARCH_END)
|
if (researchItem->flags == RCT1_RESEARCH_FLAGS_SEPARATOR)
|
||||||
{
|
{
|
||||||
break;
|
if (researchItem->item == RCT1_RESEARCH_END)
|
||||||
}
|
{
|
||||||
if (researchItem->item == RCT1_RESEARCH_END_AVAILABLE)
|
break;
|
||||||
{
|
}
|
||||||
continue;
|
if (researchItem->item == RCT1_RESEARCH_END_AVAILABLE || researchItem->item == RCT1_RESEARCH_END_RESEARCHABLE)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (researchItem->category) {
|
switch (researchItem->category) {
|
||||||
|
@ -347,10 +350,17 @@ private:
|
||||||
for (size_t j = 0; j < researchListCount; j++)
|
for (size_t j = 0; j < researchListCount; j++)
|
||||||
{
|
{
|
||||||
const rct1_research_item *researchItem2 = &researchList[j];
|
const rct1_research_item *researchItem2 = &researchList[j];
|
||||||
if (researchItem2->item == RCT1_RESEARCH_END_RESEARCHABLE ||
|
if (researchItem2->flags == RCT1_RESEARCH_FLAGS_SEPARATOR)
|
||||||
researchItem2->item == RCT1_RESEARCH_END_AVAILABLE)
|
|
||||||
{
|
{
|
||||||
break;
|
if (researchItem2->item == RCT1_RESEARCH_END_RESEARCHABLE ||
|
||||||
|
researchItem2->item == RCT1_RESEARCH_END_AVAILABLE)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (researchItem2->item == RCT1_RESEARCH_END)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (researchItem2->category == RCT1_RESEARCH_CATEGORY_VEHICLE &&
|
if (researchItem2->category == RCT1_RESEARCH_CATEGORY_VEHICLE &&
|
||||||
|
@ -1709,14 +1719,21 @@ private:
|
||||||
for (size_t i = 0; i < researchListCount; i++)
|
for (size_t i = 0; i < researchListCount; i++)
|
||||||
{
|
{
|
||||||
const rct1_research_item * researchItem = &researchList[i];
|
const rct1_research_item * researchItem = &researchList[i];
|
||||||
if (researchItem->item == RCT1_RESEARCH_END_AVAILABLE)
|
if (researchItem->flags == RCT1_RESEARCH_FLAGS_SEPARATOR)
|
||||||
{
|
{
|
||||||
researched = false;
|
if (researchItem->item == RCT1_RESEARCH_END_AVAILABLE)
|
||||||
}
|
{
|
||||||
else if (researchItem->item == RCT1_RESEARCH_END_RESEARCHABLE ||
|
researched = false;
|
||||||
researchItem->item == RCT1_RESEARCH_END)
|
continue;
|
||||||
{
|
}
|
||||||
break;
|
else if (researchItem->item == RCT1_RESEARCH_END_RESEARCHABLE)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (researchItem->item == RCT1_RESEARCH_END)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (researchItem->category) {
|
switch (researchItem->category) {
|
||||||
|
@ -1734,16 +1751,18 @@ private:
|
||||||
case RCT1_RESEARCH_CATEGORY_RIDE:
|
case RCT1_RESEARCH_CATEGORY_RIDE:
|
||||||
{
|
{
|
||||||
uint8 rct1RideType = researchItem->item;
|
uint8 rct1RideType = researchItem->item;
|
||||||
|
_researchRideTypeUsed[rct1RideType] = true;
|
||||||
|
|
||||||
// Add all vehicles for this ride type that are researched or before this research item
|
// Add all vehicles for this ride type that are researched or before this research item
|
||||||
uint32 numVehicles = 0;
|
uint32 numVehicles = 0;
|
||||||
for (size_t j = 0; j < researchListCount; j++)
|
for (size_t j = 0; j < researchListCount; j++)
|
||||||
{
|
{
|
||||||
const rct1_research_item *researchItem2 = &researchList[j];
|
const rct1_research_item *researchItem2 = &researchList[j];
|
||||||
if (researchItem2->item == RCT1_RESEARCH_END_RESEARCHABLE ||
|
if (researchItem2->flags == RCT1_RESEARCH_FLAGS_SEPARATOR &&
|
||||||
researchItem2->item == RCT1_RESEARCH_END_AVAILABLE)
|
(researchItem2->item == RCT1_RESEARCH_END_RESEARCHABLE ||
|
||||||
|
researchItem2->item == RCT1_RESEARCH_END_AVAILABLE))
|
||||||
{
|
{
|
||||||
break;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (researchItem2->category == RCT1_RESEARCH_CATEGORY_VEHICLE &&
|
if (researchItem2->category == RCT1_RESEARCH_CATEGORY_VEHICLE &&
|
||||||
|
@ -1764,13 +1783,14 @@ private:
|
||||||
// No vehicles found so just add the default for this ride
|
// No vehicles found so just add the default for this ride
|
||||||
uint8 rideEntryIndex = _rideTypeToRideEntryMap[rct1RideType];
|
uint8 rideEntryIndex = _rideTypeToRideEntryMap[rct1RideType];
|
||||||
Guard::Assert(rideEntryIndex != 255, "rideEntryIndex was 255");
|
Guard::Assert(rideEntryIndex != 255, "rideEntryIndex was 255");
|
||||||
|
|
||||||
if (!_researchRideEntryUsed[rideEntryIndex])
|
if (!_researchRideEntryUsed[rideEntryIndex])
|
||||||
{
|
{
|
||||||
_researchRideEntryUsed[rideEntryIndex] = true;
|
_researchRideEntryUsed[rideEntryIndex] = true;
|
||||||
research_insert_ride_entry(rideEntryIndex, researched);
|
research_insert_ride_entry(rideEntryIndex, researched);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case RCT1_RESEARCH_CATEGORY_VEHICLE:
|
case RCT1_RESEARCH_CATEGORY_VEHICLE:
|
||||||
|
@ -1780,6 +1800,7 @@ private:
|
||||||
{
|
{
|
||||||
InsertResearchVehicle(researchItem, researched);
|
InsertResearchVehicle(researchItem, researched);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case RCT1_RESEARCH_CATEGORY_SPECIAL:
|
case RCT1_RESEARCH_CATEGORY_SPECIAL:
|
||||||
// Not supported
|
// Not supported
|
||||||
|
@ -1788,8 +1809,6 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
research_remove_non_separate_vehicle_types();
|
research_remove_non_separate_vehicle_types();
|
||||||
// Fixes availability of rides
|
|
||||||
sub_684AC3();
|
|
||||||
|
|
||||||
// Research funding / priority
|
// Research funding / priority
|
||||||
uint8 activeResearchTypes = 0;
|
uint8 activeResearchTypes = 0;
|
||||||
|
@ -1831,6 +1850,7 @@ private:
|
||||||
{
|
{
|
||||||
uint8 vehicle = researchItem->item;
|
uint8 vehicle = researchItem->item;
|
||||||
uint8 rideEntryIndex = _vehicleTypeToRideEntryMap[vehicle];
|
uint8 rideEntryIndex = _vehicleTypeToRideEntryMap[vehicle];
|
||||||
|
|
||||||
if (!_researchRideEntryUsed[rideEntryIndex])
|
if (!_researchRideEntryUsed[rideEntryIndex])
|
||||||
{
|
{
|
||||||
_researchRideEntryUsed[rideEntryIndex] = true;
|
_researchRideEntryUsed[rideEntryIndex] = true;
|
||||||
|
|
|
@ -561,6 +561,9 @@ sint32 sawyercoding_detect_rct1_version(sint32 gameVersion)
|
||||||
return (FILE_VERSION_RCT1_AA | fileType);
|
return (FILE_VERSION_RCT1_AA | fileType);
|
||||||
else if (gameVersion >= 120000 && gameVersion < 130000)
|
else if (gameVersion >= 120000 && gameVersion < 130000)
|
||||||
return (FILE_VERSION_RCT1_LL | fileType);
|
return (FILE_VERSION_RCT1_LL | fileType);
|
||||||
|
// RCTOA Acres sets this, and possibly some other user-created scenarios as well
|
||||||
|
else if (gameVersion == 0)
|
||||||
|
return (FILE_VERSION_RCT1_LL | fileType);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue