Make S4 RideType a strong enum

This commit is contained in:
ζeh Matt 2021-09-03 23:29:22 +03:00
parent 26a26e9e34
commit af99bc28c7
No known key found for this signature in database
GPG Key ID: 18CE582C71A225B0
5 changed files with 168 additions and 161 deletions

View File

@ -34,6 +34,98 @@ namespace RCT1
constexpr const uint32_t RCT1_NUM_TERRAIN_SURFACES = 16; constexpr const uint32_t RCT1_NUM_TERRAIN_SURFACES = 16;
constexpr const uint32_t RCT1_NUM_TERRAIN_EDGES = 15; constexpr const uint32_t RCT1_NUM_TERRAIN_EDGES = 15;
enum class RideType : uint8_t
{
RCT1_RIDE_TYPE_NULL = 255,
RCT1_RIDE_TYPE_WOODEN_ROLLER_COASTER = 0,
RCT1_RIDE_TYPE_STAND_UP_STEEL_ROLLER_COASTER,
RCT1_RIDE_TYPE_SUSPENDED_ROLLER_COASTER,
RCT1_RIDE_TYPE_INVERTED_ROLLER_COASTER,
RCT1_RIDE_TYPE_STEEL_MINI_ROLLER_COASTER,
RCT1_RIDE_TYPE_MINIATURE_RAILWAY,
RCT1_RIDE_TYPE_MONORAIL,
RCT1_RIDE_TYPE_SUSPENDED_SINGLE_RAIL_ROLLER_COASTER,
RCT1_RIDE_TYPE_BOAT_HIRE,
RCT1_RIDE_TYPE_WOODEN_CRAZY_RODENT_ROLLER_COASTER,
RCT1_RIDE_TYPE_SINGLE_RAIL_ROLLER_COASTER,
RCT1_RIDE_TYPE_CAR_RIDE,
RCT1_RIDE_TYPE_LAUNCHED_FREEFALL,
RCT1_RIDE_TYPE_BOBSLED_ROLLER_COASTER,
RCT1_RIDE_TYPE_OBSERVATION_TOWER,
RCT1_RIDE_TYPE_STEEL_ROLLER_COASTER,
RCT1_RIDE_TYPE_WATER_SLIDE,
RCT1_RIDE_TYPE_MINE_TRAIN_ROLLER_COASTER,
RCT1_RIDE_TYPE_CHAIRLIFT,
RCT1_RIDE_TYPE_STEEL_CORKSCREW_ROLLER_COASTER,
RCT1_RIDE_TYPE_HEDGE_MAZE,
RCT1_RIDE_TYPE_SPIRAL_SLIDE,
RCT1_RIDE_TYPE_GO_KARTS,
RCT1_RIDE_TYPE_LOG_FLUME,
RCT1_RIDE_TYPE_RIVER_RAPIDS,
RCT1_RIDE_TYPE_DODGEMS,
RCT1_RIDE_TYPE_SWINGING_SHIP,
RCT1_RIDE_TYPE_SWINGING_INVERTER_SHIP,
RCT1_RIDE_TYPE_ICE_CREAM_STALL,
RCT1_RIDE_TYPE_CHIPS_STALL,
RCT1_RIDE_TYPE_DRINK_STALL,
RCT1_RIDE_TYPE_CANDYFLOSS_STALL,
RCT1_RIDE_TYPE_BURGER_BAR,
RCT1_RIDE_TYPE_MERRY_GO_ROUND,
RCT1_RIDE_TYPE_BALLOON_STALL,
RCT1_RIDE_TYPE_INFORMATION_KIOSK,
RCT1_RIDE_TYPE_TOILETS,
RCT1_RIDE_TYPE_FERRIS_WHEEL,
RCT1_RIDE_TYPE_MOTION_SIMULATOR,
RCT1_RIDE_TYPE_3D_CINEMA,
RCT1_RIDE_TYPE_TOP_SPIN,
RCT1_RIDE_TYPE_SPACE_RINGS,
RCT1_RIDE_TYPE_REVERSE_FREEFALL_ROLLER_COASTER,
RCT1_RIDE_TYPE_SOUVENIR_STALL,
RCT1_RIDE_TYPE_VERTICAL_ROLLER_COASTER,
RCT1_RIDE_TYPE_PIZZA_STALL,
RCT1_RIDE_TYPE_TWIST,
RCT1_RIDE_TYPE_HAUNTED_HOUSE,
RCT1_RIDE_TYPE_POPCORN_STALL,
RCT1_RIDE_TYPE_CIRCUS,
RCT1_RIDE_TYPE_GHOST_TRAIN,
RCT1_RIDE_TYPE_STEEL_TWISTER_ROLLER_COASTER,
RCT1_RIDE_TYPE_WOODEN_TWISTER_ROLLER_COASTER,
RCT1_RIDE_TYPE_WOODEN_SIDE_FRICTION_ROLLER_COASTER,
RCT1_RIDE_TYPE_STEEL_WILD_MOUSE_ROLLER_COASTER,
RCT1_RIDE_TYPE_HOT_DOG_STALL,
RCT1_RIDE_TYPE_EXOTIC_SEA_FOOD_STALL,
RCT1_RIDE_TYPE_HAT_STALL,
RCT1_RIDE_TYPE_TOFFEE_APPLE_STALL,
RCT1_RIDE_TYPE_VIRGINIA_REEL,
RCT1_RIDE_TYPE_RIVER_RIDE,
RCT1_RIDE_TYPE_CYCLE_MONORAIL,
RCT1_RIDE_TYPE_FLYING_ROLLER_COASTER,
RCT1_RIDE_TYPE_SUSPENDED_MONORAIL,
RCT1_RIDE_TYPE_40,
RCT1_RIDE_TYPE_WOODEN_REVERSER_ROLLER_COASTER,
RCT1_RIDE_TYPE_HEARTLINE_TWISTER_ROLLER_COASTER,
RCT1_RIDE_TYPE_MINIATURE_GOLF,
RCT1_RIDE_TYPE_44,
RCT1_RIDE_TYPE_ROTO_DROP,
RCT1_RIDE_TYPE_FLYING_SAUCERS,
RCT1_RIDE_TYPE_CROOKED_HOUSE,
RCT1_RIDE_TYPE_CYCLE_RAILWAY,
RCT1_RIDE_TYPE_SUSPENDED_LOOPING_ROLLER_COASTER,
RCT1_RIDE_TYPE_WATER_COASTER,
RCT1_RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER,
RCT1_RIDE_TYPE_INVERTED_WILD_MOUSE_COASTER,
RCT1_RIDE_TYPE_JET_SKIS,
RCT1_RIDE_TYPE_T_SHIRT_STALL,
RCT1_RIDE_TYPE_RAFT_RIDE,
RCT1_RIDE_TYPE_DOUGHNUT_SHOP,
RCT1_RIDE_TYPE_ENTERPRISE,
RCT1_RIDE_TYPE_COFFEE_SHOP,
RCT1_RIDE_TYPE_FRIED_CHICKEN_STALL,
RCT1_RIDE_TYPE_LEMONADE_STALL,
RCT1_RIDE_TYPE_COUNT
};
#pragma pack(push, 1) #pragma pack(push, 1)
struct Entrance struct Entrance
{ {
@ -50,7 +142,7 @@ namespace RCT1
*/ */
struct Ride struct Ride
{ {
uint8_t type; // 0x000 RideType type; // 0x000
uint8_t vehicle_type; // 0x001 uint8_t vehicle_type; // 0x001
uint16_t lifecycle_flags; // 0x002 uint16_t lifecycle_flags; // 0x002
uint8_t operating_mode; // 0x004 uint8_t operating_mode; // 0x004
@ -720,7 +812,7 @@ namespace RCT1
*/ */
struct TD4 struct TD4
{ {
uint8_t type; // 0x00 RideType type; // 0x00
uint8_t vehicle_type; uint8_t vehicle_type;
uint32_t flags; // 0x02 uint32_t flags; // 0x02
uint8_t mode; // 0x06 uint8_t mode; // 0x06
@ -779,98 +871,6 @@ namespace RCT1
assert_struct_size(TD4AA, 0xC4); assert_struct_size(TD4AA, 0xC4);
#pragma pack(pop) #pragma pack(pop)
enum
{
RCT1_RIDE_TYPE_NULL = 255,
RCT1_RIDE_TYPE_WOODEN_ROLLER_COASTER = 0,
RCT1_RIDE_TYPE_STAND_UP_STEEL_ROLLER_COASTER,
RCT1_RIDE_TYPE_SUSPENDED_ROLLER_COASTER,
RCT1_RIDE_TYPE_INVERTED_ROLLER_COASTER,
RCT1_RIDE_TYPE_STEEL_MINI_ROLLER_COASTER,
RCT1_RIDE_TYPE_MINIATURE_RAILWAY,
RCT1_RIDE_TYPE_MONORAIL,
RCT1_RIDE_TYPE_SUSPENDED_SINGLE_RAIL_ROLLER_COASTER,
RCT1_RIDE_TYPE_BOAT_HIRE,
RCT1_RIDE_TYPE_WOODEN_CRAZY_RODENT_ROLLER_COASTER,
RCT1_RIDE_TYPE_SINGLE_RAIL_ROLLER_COASTER,
RCT1_RIDE_TYPE_CAR_RIDE,
RCT1_RIDE_TYPE_LAUNCHED_FREEFALL,
RCT1_RIDE_TYPE_BOBSLED_ROLLER_COASTER,
RCT1_RIDE_TYPE_OBSERVATION_TOWER,
RCT1_RIDE_TYPE_STEEL_ROLLER_COASTER,
RCT1_RIDE_TYPE_WATER_SLIDE,
RCT1_RIDE_TYPE_MINE_TRAIN_ROLLER_COASTER,
RCT1_RIDE_TYPE_CHAIRLIFT,
RCT1_RIDE_TYPE_STEEL_CORKSCREW_ROLLER_COASTER,
RCT1_RIDE_TYPE_HEDGE_MAZE,
RCT1_RIDE_TYPE_SPIRAL_SLIDE,
RCT1_RIDE_TYPE_GO_KARTS,
RCT1_RIDE_TYPE_LOG_FLUME,
RCT1_RIDE_TYPE_RIVER_RAPIDS,
RCT1_RIDE_TYPE_DODGEMS,
RCT1_RIDE_TYPE_SWINGING_SHIP,
RCT1_RIDE_TYPE_SWINGING_INVERTER_SHIP,
RCT1_RIDE_TYPE_ICE_CREAM_STALL,
RCT1_RIDE_TYPE_CHIPS_STALL,
RCT1_RIDE_TYPE_DRINK_STALL,
RCT1_RIDE_TYPE_CANDYFLOSS_STALL,
RCT1_RIDE_TYPE_BURGER_BAR,
RCT1_RIDE_TYPE_MERRY_GO_ROUND,
RCT1_RIDE_TYPE_BALLOON_STALL,
RCT1_RIDE_TYPE_INFORMATION_KIOSK,
RCT1_RIDE_TYPE_TOILETS,
RCT1_RIDE_TYPE_FERRIS_WHEEL,
RCT1_RIDE_TYPE_MOTION_SIMULATOR,
RCT1_RIDE_TYPE_3D_CINEMA,
RCT1_RIDE_TYPE_TOP_SPIN,
RCT1_RIDE_TYPE_SPACE_RINGS,
RCT1_RIDE_TYPE_REVERSE_FREEFALL_ROLLER_COASTER,
RCT1_RIDE_TYPE_SOUVENIR_STALL,
RCT1_RIDE_TYPE_VERTICAL_ROLLER_COASTER,
RCT1_RIDE_TYPE_PIZZA_STALL,
RCT1_RIDE_TYPE_TWIST,
RCT1_RIDE_TYPE_HAUNTED_HOUSE,
RCT1_RIDE_TYPE_POPCORN_STALL,
RCT1_RIDE_TYPE_CIRCUS,
RCT1_RIDE_TYPE_GHOST_TRAIN,
RCT1_RIDE_TYPE_STEEL_TWISTER_ROLLER_COASTER,
RCT1_RIDE_TYPE_WOODEN_TWISTER_ROLLER_COASTER,
RCT1_RIDE_TYPE_WOODEN_SIDE_FRICTION_ROLLER_COASTER,
RCT1_RIDE_TYPE_STEEL_WILD_MOUSE_ROLLER_COASTER,
RCT1_RIDE_TYPE_HOT_DOG_STALL,
RCT1_RIDE_TYPE_EXOTIC_SEA_FOOD_STALL,
RCT1_RIDE_TYPE_HAT_STALL,
RCT1_RIDE_TYPE_TOFFEE_APPLE_STALL,
RCT1_RIDE_TYPE_VIRGINIA_REEL,
RCT1_RIDE_TYPE_RIVER_RIDE,
RCT1_RIDE_TYPE_CYCLE_MONORAIL,
RCT1_RIDE_TYPE_FLYING_ROLLER_COASTER,
RCT1_RIDE_TYPE_SUSPENDED_MONORAIL,
RCT1_RIDE_TYPE_40,
RCT1_RIDE_TYPE_WOODEN_REVERSER_ROLLER_COASTER,
RCT1_RIDE_TYPE_HEARTLINE_TWISTER_ROLLER_COASTER,
RCT1_RIDE_TYPE_MINIATURE_GOLF,
RCT1_RIDE_TYPE_44,
RCT1_RIDE_TYPE_ROTO_DROP,
RCT1_RIDE_TYPE_FLYING_SAUCERS,
RCT1_RIDE_TYPE_CROOKED_HOUSE,
RCT1_RIDE_TYPE_CYCLE_RAILWAY,
RCT1_RIDE_TYPE_SUSPENDED_LOOPING_ROLLER_COASTER,
RCT1_RIDE_TYPE_WATER_COASTER,
RCT1_RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER,
RCT1_RIDE_TYPE_INVERTED_WILD_MOUSE_COASTER,
RCT1_RIDE_TYPE_JET_SKIS,
RCT1_RIDE_TYPE_T_SHIRT_STALL,
RCT1_RIDE_TYPE_RAFT_RIDE,
RCT1_RIDE_TYPE_DOUGHNUT_SHOP,
RCT1_RIDE_TYPE_ENTERPRISE,
RCT1_RIDE_TYPE_COFFEE_SHOP,
RCT1_RIDE_TYPE_FRIED_CHICKEN_STALL,
RCT1_RIDE_TYPE_LEMONADE_STALL,
RCT1_RIDE_TYPE_COUNT
};
enum enum
{ {
RCT1_VEHICLE_TYPE_STEEL_ROLLER_COASTER_TRAIN = 0, RCT1_VEHICLE_TYPE_STEEL_ROLLER_COASTER_TRAIN = 0,

View File

@ -133,7 +133,7 @@ namespace RCT1
EntryList _waterEntry; EntryList _waterEntry;
// Lookup tables for converting from RCT1 hard coded types to the new dynamic object entries // Lookup tables for converting from RCT1 hard coded types to the new dynamic object entries
ObjectEntryIndex _rideTypeToRideEntryMap[RCT1_RIDE_TYPE_COUNT]{}; ObjectEntryIndex _rideTypeToRideEntryMap[EnumValue(RideType::RCT1_RIDE_TYPE_COUNT)]{};
ObjectEntryIndex _vehicleTypeToRideEntryMap[RCT1_VEHICLE_TYPE_COUNT]{}; ObjectEntryIndex _vehicleTypeToRideEntryMap[RCT1_VEHICLE_TYPE_COUNT]{};
ObjectEntryIndex _smallSceneryTypeToEntryMap[256]{}; ObjectEntryIndex _smallSceneryTypeToEntryMap[256]{};
ObjectEntryIndex _largeSceneryTypeToEntryMap[256]{}; ObjectEntryIndex _largeSceneryTypeToEntryMap[256]{};
@ -144,7 +144,7 @@ namespace RCT1
// Research // Research
std::bitset<MAX_RIDE_OBJECTS> _researchRideEntryUsed{}; std::bitset<MAX_RIDE_OBJECTS> _researchRideEntryUsed{};
std::bitset<RCT1_RIDE_TYPE_COUNT> _researchRideTypeUsed{}; std::bitset<EnumValue(RideType::RCT1_RIDE_TYPE_COUNT)> _researchRideTypeUsed{};
// Scenario repository - used for determining scenario name // Scenario repository - used for determining scenario name
IScenarioRepository* _scenarioRepository = GetScenarioRepository(); IScenarioRepository* _scenarioRepository = GetScenarioRepository();
@ -425,7 +425,7 @@ namespace RCT1
{ {
size_t researchListCount; size_t researchListCount;
const ResearchItem* researchList = GetResearchList(&researchListCount); const ResearchItem* researchList = GetResearchList(&researchListCount);
std::bitset<RCT1_RIDE_TYPE_COUNT> rideTypeInResearch = GetRideTypesPresentInResearchList( std::bitset<EnumValue(RideType::RCT1_RIDE_TYPE_COUNT)> rideTypeInResearch = GetRideTypesPresentInResearchList(
researchList, researchListCount); researchList, researchListCount);
for (size_t i = 0; i < researchListCount; i++) for (size_t i = 0; i < researchListCount; i++)
{ {
@ -450,14 +450,14 @@ namespace RCT1
AddEntriesForSceneryTheme(researchItem->item); AddEntriesForSceneryTheme(researchItem->item);
break; break;
case RCT1_RESEARCH_TYPE_RIDE: case RCT1_RESEARCH_TYPE_RIDE:
AddEntryForRideType(researchItem->item); AddEntryForRideType(static_cast<RideType>(researchItem->item));
break; break;
case RCT1_RESEARCH_TYPE_VEHICLE: case RCT1_RESEARCH_TYPE_VEHICLE:
// For some bizarre reason, RCT1 research lists contain vehicles that aren't actually researched. // For some bizarre reason, RCT1 research lists contain vehicles that aren't actually researched.
// Extra bizarrely, this does not seem to apply to Loopy Landscapes saves/scenarios. // Extra bizarrely, this does not seem to apply to Loopy Landscapes saves/scenarios.
if (rideTypeInResearch[researchItem->related_ride] || _gameVersion == FILE_VERSION_RCT1_LL) if (rideTypeInResearch[researchItem->related_ride] || _gameVersion == FILE_VERSION_RCT1_LL)
{ {
AddEntryForVehicleType(researchItem->related_ride, researchItem->item); AddEntryForVehicleType(static_cast<RideType>(researchItem->related_ride), researchItem->item);
} }
break; break;
} }
@ -516,7 +516,7 @@ namespace RCT1
for (size_t i = 0; i < std::size(_s4.rides); i++) for (size_t i = 0; i < std::size(_s4.rides); i++)
{ {
auto ride = &_s4.rides[i]; auto ride = &_s4.rides[i];
if (ride->type != RCT1_RIDE_TYPE_NULL) if (ride->type != RideType::RCT1_RIDE_TYPE_NULL)
{ {
if (RCT1::RideTypeUsesVehicles(ride->type)) if (RCT1::RideTypeUsesVehicles(ride->type))
AddEntryForVehicleType(ride->type, ride->vehicle_type); AddEntryForVehicleType(ride->type, ride->vehicle_type);
@ -584,23 +584,25 @@ namespace RCT1
_waterEntry.GetOrAddEntry(entryName); _waterEntry.GetOrAddEntry(entryName);
} }
void AddEntryForRideType(uint8_t rideType) void AddEntryForRideType(RideType rideType)
{ {
assert(rideType < std::size(_rideTypeToRideEntryMap)); Guard::Assert(EnumValue(rideType) < std::size(_rideTypeToRideEntryMap));
if (_rideTypeToRideEntryMap[rideType] == OBJECT_ENTRY_INDEX_NULL)
if (_rideTypeToRideEntryMap[EnumValue(rideType)] == OBJECT_ENTRY_INDEX_NULL)
{ {
const char* entryName = RCT1::GetRideTypeObject(rideType); const char* entryName = RCT1::GetRideTypeObject(rideType);
if (!String::Equals(entryName, " ")) if (!String::Equals(entryName, " "))
{ {
auto entryIndex = _rideEntries.GetOrAddEntry(entryName); auto entryIndex = _rideEntries.GetOrAddEntry(entryName);
_rideTypeToRideEntryMap[rideType] = entryIndex; _rideTypeToRideEntryMap[EnumValue(rideType)] = entryIndex;
} }
} }
} }
void AddEntryForVehicleType(uint8_t rideType, uint8_t vehicleType) void AddEntryForVehicleType(RideType rideType, uint8_t vehicleType)
{ {
assert(vehicleType < std::size(_vehicleTypeToRideEntryMap)); Guard::Assert(EnumValue(rideType) < std::size(_rideTypeToRideEntryMap));
if (_vehicleTypeToRideEntryMap[vehicleType] == OBJECT_ENTRY_INDEX_NULL) if (_vehicleTypeToRideEntryMap[vehicleType] == OBJECT_ENTRY_INDEX_NULL)
{ {
const char* entryName = RCT1::GetVehicleObject(vehicleType); const char* entryName = RCT1::GetVehicleObject(vehicleType);
@ -609,7 +611,7 @@ namespace RCT1
auto entryIndex = _rideEntries.GetOrAddEntry(entryName); auto entryIndex = _rideEntries.GetOrAddEntry(entryName);
_vehicleTypeToRideEntryMap[vehicleType] = entryIndex; _vehicleTypeToRideEntryMap[vehicleType] = entryIndex;
if (rideType != RIDE_TYPE_NULL) if (rideType != RideType::RCT1_RIDE_TYPE_NULL)
AddEntryForRideType(rideType); AddEntryForRideType(rideType);
} }
} }
@ -712,7 +714,7 @@ namespace RCT1
{ {
for (int32_t i = 0; i < RCT12_MAX_RIDES_IN_PARK; i++) for (int32_t i = 0; i < RCT12_MAX_RIDES_IN_PARK; i++)
{ {
if (_s4.rides[i].type != RIDE_TYPE_NULL) if (_s4.rides[i].type != RideType::RCT1_RIDE_TYPE_NULL)
{ {
ImportRide(GetOrAllocateRide(i), &_s4.rides[i], i); ImportRide(GetOrAllocateRide(i), &_s4.rides[i], i);
} }
@ -725,7 +727,7 @@ namespace RCT1
dst->id = rideIndex; dst->id = rideIndex;
// This is a peculiarity of this exact version number, which only Heide-Park seems to use. // This is a peculiarity of this exact version number, which only Heide-Park seems to use.
if (_s4.game_version == 110018 && src->type == RCT1_RIDE_TYPE_INVERTED_ROLLER_COASTER) if (_s4.game_version == 110018 && src->type == RideType::RCT1_RIDE_TYPE_INVERTED_ROLLER_COASTER)
{ {
dst->type = RIDE_TYPE_COMPACT_INVERTED_COASTER; dst->type = RIDE_TYPE_COMPACT_INVERTED_COASTER;
} }
@ -740,7 +742,7 @@ namespace RCT1
} }
else else
{ {
dst->subtype = _rideTypeToRideEntryMap[src->type]; dst->subtype = _rideTypeToRideEntryMap[EnumValue(src->type)];
} }
rct_ride_entry* rideEntry = get_ride_entry(dst->subtype); rct_ride_entry* rideEntry = get_ride_entry(dst->subtype);
@ -873,7 +875,7 @@ namespace RCT1
// Only merry-go-round and dodgems had music and used // Only merry-go-round and dodgems had music and used
// the same flag as synchronise stations for the option to enable it // the same flag as synchronise stations for the option to enable it
if (src->type == RCT1_RIDE_TYPE_MERRY_GO_ROUND || src->type == RCT1_RIDE_TYPE_DODGEMS) if (src->type == RideType::RCT1_RIDE_TYPE_MERRY_GO_ROUND || src->type == RideType::RCT1_RIDE_TYPE_DODGEMS)
{ {
if (src->depart_flags & RCT1_RIDE_DEPART_PLAY_MUSIC) if (src->depart_flags & RCT1_RIDE_DEPART_PLAY_MUSIC)
{ {
@ -1005,11 +1007,11 @@ namespace RCT1
dst->track_colour[0].supports = RCT1::GetColour(src->track_support_colour); dst->track_colour[0].supports = RCT1::GetColour(src->track_support_colour);
// Balloons were always blue in the original RCT. // Balloons were always blue in the original RCT.
if (src->type == RCT1_RIDE_TYPE_BALLOON_STALL) if (src->type == RideType::RCT1_RIDE_TYPE_BALLOON_STALL)
{ {
dst->track_colour[0].main = COLOUR_LIGHT_BLUE; dst->track_colour[0].main = COLOUR_LIGHT_BLUE;
} }
else if (src->type == RCT1_RIDE_TYPE_RIVER_RAPIDS) else if (src->type == RideType::RCT1_RIDE_TYPE_RIVER_RAPIDS)
{ {
dst->track_colour[0].main = COLOUR_WHITE; dst->track_colour[0].main = COLOUR_WHITE;
} }
@ -1871,8 +1873,7 @@ namespace RCT1
} }
bool researched = true; bool researched = true;
std::bitset<RCT1_RIDE_TYPE_COUNT> rideTypeInResearch = GetRideTypesPresentInResearchList( auto rideTypeInResearch = GetRideTypesPresentInResearchList(researchList, researchListCount);
researchList, researchListCount);
std::vector<RCT1::ResearchItem> vehiclesWithMissingRideTypes; std::vector<RCT1::ResearchItem> vehiclesWithMissingRideTypes;
for (size_t i = 0; i < researchListCount; i++) for (size_t i = 0; i < researchListCount; i++)
{ {
@ -1906,10 +1907,10 @@ namespace RCT1
} }
case RCT1_RESEARCH_TYPE_RIDE: case RCT1_RESEARCH_TYPE_RIDE:
{ {
uint8_t rct1RideType = researchItem.item; const auto rct1RideType = static_cast<RideType>(researchItem.item);
_researchRideTypeUsed[rct1RideType] = true; _researchRideTypeUsed[EnumValue(rct1RideType)] = true;
auto ownRideEntryIndex = _rideTypeToRideEntryMap[rct1RideType]; auto ownRideEntryIndex = _rideTypeToRideEntryMap[EnumValue(rct1RideType)];
Guard::Assert( Guard::Assert(
ownRideEntryIndex != OBJECT_ENTRY_INDEX_NULL, "ownRideEntryIndex was OBJECT_ENTRY_INDEX_NULL"); ownRideEntryIndex != OBJECT_ENTRY_INDEX_NULL, "ownRideEntryIndex was OBJECT_ENTRY_INDEX_NULL");
@ -1933,7 +1934,7 @@ namespace RCT1
} }
if (researchItem2.type == RCT1_RESEARCH_TYPE_VEHICLE if (researchItem2.type == RCT1_RESEARCH_TYPE_VEHICLE
&& researchItem2.related_ride == rct1RideType) && static_cast<RideType>(researchItem2.related_ride) == rct1RideType)
{ {
auto rideEntryIndex2 = _vehicleTypeToRideEntryMap[researchItem2.item]; auto rideEntryIndex2 = _vehicleTypeToRideEntryMap[researchItem2.item];
bool isOwnType = (ownRideEntryIndex == rideEntryIndex2); bool isOwnType = (ownRideEntryIndex == rideEntryIndex2);
@ -2051,10 +2052,10 @@ namespace RCT1
} }
} }
static std::bitset<RCT1_RIDE_TYPE_COUNT> GetRideTypesPresentInResearchList( static std::bitset<EnumValue(RideType::RCT1_RIDE_TYPE_COUNT)> GetRideTypesPresentInResearchList(
const RCT1::ResearchItem* researchList, size_t researchListCount) const RCT1::ResearchItem* researchList, size_t researchListCount)
{ {
std::bitset<RCT1_RIDE_TYPE_COUNT> ret = {}; std::bitset<EnumValue(RideType::RCT1_RIDE_TYPE_COUNT)> ret = {};
for (size_t i = 0; i < researchListCount; i++) for (size_t i = 0; i < researchListCount; i++)
{ {
@ -2605,7 +2606,7 @@ namespace RCT1
if (researchList[i].type == RCT1_RESEARCH_TYPE_RIDE) if (researchList[i].type == RCT1_RESEARCH_TYPE_RIDE)
{ {
return RCT1::GetRideType(researchList[i].item, 0); return RCT1::GetRideType(static_cast<RideType>(researchList[i].item), 0);
} }
} }

View File

@ -124,10 +124,10 @@ namespace RCT1
// Mazes were only hedges // Mazes were only hedges
switch (td4.type) switch (td4.type)
{ {
case RCT1_RIDE_TYPE_HEDGE_MAZE: case RideType::RCT1_RIDE_TYPE_HEDGE_MAZE:
td->track_support_colour[i] = MAZE_WALL_TYPE_HEDGE; td->track_support_colour[i] = MAZE_WALL_TYPE_HEDGE;
break; break;
case RCT1_RIDE_TYPE_RIVER_RAPIDS: case RideType::RCT1_RIDE_TYPE_RIVER_RAPIDS:
td->track_spine_colour[i] = COLOUR_WHITE; td->track_spine_colour[i] = COLOUR_WHITE;
td->track_rail_colour[i] = COLOUR_WHITE; td->track_rail_colour[i] = COLOUR_WHITE;
break; break;
@ -150,7 +150,7 @@ namespace RCT1
// Convert RCT1 vehicle type to RCT2 vehicle type. Initialise with a string consisting of 8 spaces. // Convert RCT1 vehicle type to RCT2 vehicle type. Initialise with a string consisting of 8 spaces.
rct_object_entry vehicleObject = { 0x80, " " }; rct_object_entry vehicleObject = { 0x80, " " };
if (td4Base.type == RIDE_TYPE_MAZE) if (td4Base.type == RideType::RCT1_RIDE_TYPE_HEDGE_MAZE)
{ {
const char* vehObjName = RCT1::GetRideTypeObject(td4Base.type); const char* vehObjName = RCT1::GetRideTypeObject(td4Base.type);
assert(vehObjName != nullptr); assert(vehObjName != nullptr);

View File

@ -175,11 +175,11 @@ namespace RCT1
return object_manager_get_loaded_object_entry_index(ObjectEntryDescriptor(selectedEdge)); return object_manager_get_loaded_object_entry_index(ObjectEntryDescriptor(selectedEdge));
} }
uint8_t GetRideType(uint8_t rideType, uint8_t vehicleType) uint8_t GetRideType(RideType rideType, uint8_t vehicleType)
{ {
if (rideType == RCT1_RIDE_TYPE_STEEL_TWISTER_ROLLER_COASTER && vehicleType == RCT1_VEHICLE_TYPE_NON_LOOPING_STEEL_TWISTER_ROLLER_COASTER_TRAIN) if (rideType == RideType::RCT1_RIDE_TYPE_STEEL_TWISTER_ROLLER_COASTER && vehicleType == RCT1_VEHICLE_TYPE_NON_LOOPING_STEEL_TWISTER_ROLLER_COASTER_TRAIN)
return RIDE_TYPE_HYPER_TWISTER; return RIDE_TYPE_HYPER_TWISTER;
if (rideType == RCT1_RIDE_TYPE_STEEL_CORKSCREW_ROLLER_COASTER && vehicleType == RCT1_VEHICLE_TYPE_HYPERCOASTER_TRAIN) if (rideType == RideType::RCT1_RIDE_TYPE_STEEL_CORKSCREW_ROLLER_COASTER && vehicleType == RCT1_VEHICLE_TYPE_HYPERCOASTER_TRAIN)
return RIDE_TYPE_HYPERCOASTER; return RIDE_TYPE_HYPERCOASTER;
static uint8_t map[] = static uint8_t map[] =
@ -271,8 +271,10 @@ namespace RCT1
RIDE_TYPE_DRINK_STALL, // RCT1_RIDE_TYPE_LEMONADE_STALL RIDE_TYPE_DRINK_STALL, // RCT1_RIDE_TYPE_LEMONADE_STALL
}; };
Guard::ArgumentInRange<size_t>(rideType, 0, std::size(map), "Unsupported RCT1 ride type."); const auto index = EnumValue(rideType);
return map[rideType]; Guard::ArgumentInRange<size_t>(index, 0, std::size(map), "Unsupported RCT1 ride type.");
return map[index];
} }
VehicleColourSchemeCopyDescriptor GetColourSchemeCopyDescriptor(uint8_t vehicleType) VehicleColourSchemeCopyDescriptor GetColourSchemeCopyDescriptor(uint8_t vehicleType)
@ -374,33 +376,33 @@ namespace RCT1
return map[vehicleType]; return map[vehicleType];
} }
bool RideTypeUsesVehicles(uint8_t rideType) bool RideTypeUsesVehicles(RideType rideType)
{ {
switch (rideType) { switch (rideType) {
case RCT1_RIDE_TYPE_HEDGE_MAZE: case RideType::RCT1_RIDE_TYPE_HEDGE_MAZE:
case RCT1_RIDE_TYPE_SPIRAL_SLIDE: case RideType::RCT1_RIDE_TYPE_SPIRAL_SLIDE:
case RCT1_RIDE_TYPE_ICE_CREAM_STALL: case RideType::RCT1_RIDE_TYPE_ICE_CREAM_STALL:
case RCT1_RIDE_TYPE_CHIPS_STALL: case RideType::RCT1_RIDE_TYPE_CHIPS_STALL:
case RCT1_RIDE_TYPE_DRINK_STALL: case RideType::RCT1_RIDE_TYPE_DRINK_STALL:
case RCT1_RIDE_TYPE_CANDYFLOSS_STALL: case RideType::RCT1_RIDE_TYPE_CANDYFLOSS_STALL:
case RCT1_RIDE_TYPE_BURGER_BAR: case RideType::RCT1_RIDE_TYPE_BURGER_BAR:
case RCT1_RIDE_TYPE_BALLOON_STALL: case RideType::RCT1_RIDE_TYPE_BALLOON_STALL:
case RCT1_RIDE_TYPE_INFORMATION_KIOSK: case RideType::RCT1_RIDE_TYPE_INFORMATION_KIOSK:
case RCT1_RIDE_TYPE_TOILETS: case RideType::RCT1_RIDE_TYPE_TOILETS:
case RCT1_RIDE_TYPE_SOUVENIR_STALL: case RideType::RCT1_RIDE_TYPE_SOUVENIR_STALL:
case RCT1_RIDE_TYPE_PIZZA_STALL: case RideType::RCT1_RIDE_TYPE_PIZZA_STALL:
case RCT1_RIDE_TYPE_POPCORN_STALL: case RideType::RCT1_RIDE_TYPE_POPCORN_STALL:
case RCT1_RIDE_TYPE_HOT_DOG_STALL: case RideType::RCT1_RIDE_TYPE_HOT_DOG_STALL:
case RCT1_RIDE_TYPE_EXOTIC_SEA_FOOD_STALL: case RideType::RCT1_RIDE_TYPE_EXOTIC_SEA_FOOD_STALL:
case RCT1_RIDE_TYPE_HAT_STALL: case RideType::RCT1_RIDE_TYPE_HAT_STALL:
case RCT1_RIDE_TYPE_TOFFEE_APPLE_STALL: case RideType::RCT1_RIDE_TYPE_TOFFEE_APPLE_STALL:
case RCT1_RIDE_TYPE_40: case RideType::RCT1_RIDE_TYPE_40:
case RCT1_RIDE_TYPE_44: case RideType::RCT1_RIDE_TYPE_44:
case RCT1_RIDE_TYPE_T_SHIRT_STALL: case RideType::RCT1_RIDE_TYPE_T_SHIRT_STALL:
case RCT1_RIDE_TYPE_DOUGHNUT_SHOP: case RideType::RCT1_RIDE_TYPE_DOUGHNUT_SHOP:
case RCT1_RIDE_TYPE_COFFEE_SHOP: case RideType::RCT1_RIDE_TYPE_COFFEE_SHOP:
case RCT1_RIDE_TYPE_FRIED_CHICKEN_STALL: case RideType::RCT1_RIDE_TYPE_FRIED_CHICKEN_STALL:
case RCT1_RIDE_TYPE_LEMONADE_STALL: case RideType::RCT1_RIDE_TYPE_LEMONADE_STALL:
return false; return false;
default: default:
return true; return true;
@ -696,7 +698,7 @@ namespace RCT1
return map[vehicleSubEntry]; return map[vehicleSubEntry];
} }
const char * GetRideTypeObject(uint8_t rideType) const char * GetRideTypeObject(RideType rideType)
{ {
static constexpr const char * map[] = static constexpr const char * map[] =
{ {
@ -787,8 +789,10 @@ namespace RCT1
"LEMST ", // RCT1_RIDE_TYPE_LEMONADE_STALL "LEMST ", // RCT1_RIDE_TYPE_LEMONADE_STALL
}; };
Guard::ArgumentInRange<size_t>(rideType, 0, std::size(map), "Unsupported RCT1 ride type."); const auto index = EnumValue(rideType);
return map[rideType]; Guard::ArgumentInRange<size_t>(index, 0, std::size(map), "Unsupported RCT1 ride type.");
return map[index];
} }
const char * GetVehicleObject(uint8_t vehicleType) const char * GetVehicleObject(uint8_t vehicleType)

View File

@ -21,19 +21,21 @@ namespace RCT1
int8_t colour1, colour2, colour3; int8_t colour1, colour2, colour3;
}; };
enum class RideType : uint8_t;
colour_t GetColour(colour_t colour); colour_t GetColour(colour_t colour);
PeepSpriteType GetPeepSpriteType(uint8_t rct1SpriteType); PeepSpriteType GetPeepSpriteType(uint8_t rct1SpriteType);
ObjectEntryIndex GetTerrain(uint8_t terrain); ObjectEntryIndex GetTerrain(uint8_t terrain);
ObjectEntryIndex GetTerrainEdge(uint8_t terrainEdge); ObjectEntryIndex GetTerrainEdge(uint8_t terrainEdge);
uint8_t GetRideType(uint8_t rideType, uint8_t vehicleType); uint8_t GetRideType(RideType rideType, uint8_t vehicleType);
VehicleColourSchemeCopyDescriptor GetColourSchemeCopyDescriptor(uint8_t vehicleType); VehicleColourSchemeCopyDescriptor GetColourSchemeCopyDescriptor(uint8_t vehicleType);
bool RideTypeUsesVehicles(uint8_t rideType); bool RideTypeUsesVehicles(RideType rideType);
bool PathIsQueue(uint8_t pathType); bool PathIsQueue(uint8_t pathType);
uint8_t NormalisePathAddition(uint8_t pathAdditionType); uint8_t NormalisePathAddition(uint8_t pathAdditionType);
uint8_t GetVehicleSubEntryIndex(uint8_t vehicleSubEntry); uint8_t GetVehicleSubEntryIndex(uint8_t vehicleSubEntry);
const char* GetRideTypeObject(uint8_t rideType); const char* GetRideTypeObject(RideType rideType);
const char* GetVehicleObject(uint8_t vehicleType); const char* GetVehicleObject(uint8_t vehicleType);
const char* GetSmallSceneryObject(uint8_t smallSceneryType); const char* GetSmallSceneryObject(uint8_t smallSceneryType);
const char* GetLargeSceneryObject(uint8_t largeSceneryType); const char* GetLargeSceneryObject(uint8_t largeSceneryType);