Fix RCT1 research import, fixes #5014

This commit is contained in:
Michael Steenbeek 2017-02-05 20:54:01 +01:00 committed by GitHub
parent f0f26ee297
commit 528843184c
3 changed files with 52 additions and 28 deletions

View File

@ -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 {

View File

@ -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;

View File

@ -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;
} }