diff --git a/src/openrct2/rct1/RCT1.h b/src/openrct2/rct1/RCT1.h index 12682df6a0..0eddfbcf0b 100644 --- a/src/openrct2/rct1/RCT1.h +++ b/src/openrct2/rct1/RCT1.h @@ -34,6 +34,98 @@ namespace RCT1 constexpr const uint32_t RCT1_NUM_TERRAIN_SURFACES = 16; 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) struct Entrance { @@ -50,7 +142,7 @@ namespace RCT1 */ struct Ride { - uint8_t type; // 0x000 + RideType type; // 0x000 uint8_t vehicle_type; // 0x001 uint16_t lifecycle_flags; // 0x002 uint8_t operating_mode; // 0x004 @@ -720,7 +812,7 @@ namespace RCT1 */ struct TD4 { - uint8_t type; // 0x00 + RideType type; // 0x00 uint8_t vehicle_type; uint32_t flags; // 0x02 uint8_t mode; // 0x06 @@ -779,98 +871,6 @@ namespace RCT1 assert_struct_size(TD4AA, 0xC4); #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 { RCT1_VEHICLE_TYPE_STEEL_ROLLER_COASTER_TRAIN = 0, diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 62a3d1367e..5c8776ea86 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -133,7 +133,7 @@ namespace RCT1 EntryList _waterEntry; // 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 _smallSceneryTypeToEntryMap[256]{}; ObjectEntryIndex _largeSceneryTypeToEntryMap[256]{}; @@ -144,7 +144,7 @@ namespace RCT1 // Research std::bitset _researchRideEntryUsed{}; - std::bitset _researchRideTypeUsed{}; + std::bitset _researchRideTypeUsed{}; // Scenario repository - used for determining scenario name IScenarioRepository* _scenarioRepository = GetScenarioRepository(); @@ -425,7 +425,7 @@ namespace RCT1 { size_t researchListCount; const ResearchItem* researchList = GetResearchList(&researchListCount); - std::bitset rideTypeInResearch = GetRideTypesPresentInResearchList( + std::bitset rideTypeInResearch = GetRideTypesPresentInResearchList( researchList, researchListCount); for (size_t i = 0; i < researchListCount; i++) { @@ -450,14 +450,14 @@ namespace RCT1 AddEntriesForSceneryTheme(researchItem->item); break; case RCT1_RESEARCH_TYPE_RIDE: - AddEntryForRideType(researchItem->item); + AddEntryForRideType(static_cast(researchItem->item)); break; case RCT1_RESEARCH_TYPE_VEHICLE: // 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. if (rideTypeInResearch[researchItem->related_ride] || _gameVersion == FILE_VERSION_RCT1_LL) { - AddEntryForVehicleType(researchItem->related_ride, researchItem->item); + AddEntryForVehicleType(static_cast(researchItem->related_ride), researchItem->item); } break; } @@ -516,7 +516,7 @@ namespace RCT1 for (size_t i = 0; i < std::size(_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)) AddEntryForVehicleType(ride->type, ride->vehicle_type); @@ -584,23 +584,25 @@ namespace RCT1 _waterEntry.GetOrAddEntry(entryName); } - void AddEntryForRideType(uint8_t rideType) + void AddEntryForRideType(RideType rideType) { - assert(rideType < std::size(_rideTypeToRideEntryMap)); - if (_rideTypeToRideEntryMap[rideType] == OBJECT_ENTRY_INDEX_NULL) + Guard::Assert(EnumValue(rideType) < std::size(_rideTypeToRideEntryMap)); + + if (_rideTypeToRideEntryMap[EnumValue(rideType)] == OBJECT_ENTRY_INDEX_NULL) { const char* entryName = RCT1::GetRideTypeObject(rideType); if (!String::Equals(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) { const char* entryName = RCT1::GetVehicleObject(vehicleType); @@ -609,7 +611,7 @@ namespace RCT1 auto entryIndex = _rideEntries.GetOrAddEntry(entryName); _vehicleTypeToRideEntryMap[vehicleType] = entryIndex; - if (rideType != RIDE_TYPE_NULL) + if (rideType != RideType::RCT1_RIDE_TYPE_NULL) AddEntryForRideType(rideType); } } @@ -712,7 +714,7 @@ namespace RCT1 { 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); } @@ -725,7 +727,7 @@ namespace RCT1 dst->id = rideIndex; // 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; } @@ -740,7 +742,7 @@ namespace RCT1 } else { - dst->subtype = _rideTypeToRideEntryMap[src->type]; + dst->subtype = _rideTypeToRideEntryMap[EnumValue(src->type)]; } 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 // 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) { @@ -1005,11 +1007,11 @@ namespace RCT1 dst->track_colour[0].supports = RCT1::GetColour(src->track_support_colour); // 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; } - 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; } @@ -1871,8 +1873,7 @@ namespace RCT1 } bool researched = true; - std::bitset rideTypeInResearch = GetRideTypesPresentInResearchList( - researchList, researchListCount); + auto rideTypeInResearch = GetRideTypesPresentInResearchList(researchList, researchListCount); std::vector vehiclesWithMissingRideTypes; for (size_t i = 0; i < researchListCount; i++) { @@ -1906,10 +1907,10 @@ namespace RCT1 } case RCT1_RESEARCH_TYPE_RIDE: { - uint8_t rct1RideType = researchItem.item; - _researchRideTypeUsed[rct1RideType] = true; + const auto rct1RideType = static_cast(researchItem.item); + _researchRideTypeUsed[EnumValue(rct1RideType)] = true; - auto ownRideEntryIndex = _rideTypeToRideEntryMap[rct1RideType]; + auto ownRideEntryIndex = _rideTypeToRideEntryMap[EnumValue(rct1RideType)]; Guard::Assert( ownRideEntryIndex != OBJECT_ENTRY_INDEX_NULL, "ownRideEntryIndex was OBJECT_ENTRY_INDEX_NULL"); @@ -1933,7 +1934,7 @@ namespace RCT1 } if (researchItem2.type == RCT1_RESEARCH_TYPE_VEHICLE - && researchItem2.related_ride == rct1RideType) + && static_cast(researchItem2.related_ride) == rct1RideType) { auto rideEntryIndex2 = _vehicleTypeToRideEntryMap[researchItem2.item]; bool isOwnType = (ownRideEntryIndex == rideEntryIndex2); @@ -2051,10 +2052,10 @@ namespace RCT1 } } - static std::bitset GetRideTypesPresentInResearchList( + static std::bitset GetRideTypesPresentInResearchList( const RCT1::ResearchItem* researchList, size_t researchListCount) { - std::bitset ret = {}; + std::bitset ret = {}; for (size_t i = 0; i < researchListCount; i++) { @@ -2605,7 +2606,7 @@ namespace RCT1 if (researchList[i].type == RCT1_RESEARCH_TYPE_RIDE) { - return RCT1::GetRideType(researchList[i].item, 0); + return RCT1::GetRideType(static_cast(researchList[i].item), 0); } } diff --git a/src/openrct2/rct1/T4Importer.cpp b/src/openrct2/rct1/T4Importer.cpp index 3974f41aea..12f839662c 100644 --- a/src/openrct2/rct1/T4Importer.cpp +++ b/src/openrct2/rct1/T4Importer.cpp @@ -124,10 +124,10 @@ namespace RCT1 // Mazes were only hedges 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; break; - case RCT1_RIDE_TYPE_RIVER_RAPIDS: + case RideType::RCT1_RIDE_TYPE_RIVER_RAPIDS: td->track_spine_colour[i] = COLOUR_WHITE; td->track_rail_colour[i] = COLOUR_WHITE; break; @@ -150,7 +150,7 @@ namespace RCT1 // Convert RCT1 vehicle type to RCT2 vehicle type. Initialise with a string consisting of 8 spaces. 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); assert(vehObjName != nullptr); diff --git a/src/openrct2/rct1/Tables.cpp b/src/openrct2/rct1/Tables.cpp index af7c7fe6ef..d3dfe396d3 100644 --- a/src/openrct2/rct1/Tables.cpp +++ b/src/openrct2/rct1/Tables.cpp @@ -175,11 +175,11 @@ namespace RCT1 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; - 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; static uint8_t map[] = @@ -271,8 +271,10 @@ namespace RCT1 RIDE_TYPE_DRINK_STALL, // RCT1_RIDE_TYPE_LEMONADE_STALL }; - Guard::ArgumentInRange(rideType, 0, std::size(map), "Unsupported RCT1 ride type."); - return map[rideType]; + const auto index = EnumValue(rideType); + Guard::ArgumentInRange(index, 0, std::size(map), "Unsupported RCT1 ride type."); + + return map[index]; } VehicleColourSchemeCopyDescriptor GetColourSchemeCopyDescriptor(uint8_t vehicleType) @@ -374,33 +376,33 @@ namespace RCT1 return map[vehicleType]; } - bool RideTypeUsesVehicles(uint8_t rideType) + bool RideTypeUsesVehicles(RideType rideType) { switch (rideType) { - case RCT1_RIDE_TYPE_HEDGE_MAZE: - case RCT1_RIDE_TYPE_SPIRAL_SLIDE: - case RCT1_RIDE_TYPE_ICE_CREAM_STALL: - case RCT1_RIDE_TYPE_CHIPS_STALL: - case RCT1_RIDE_TYPE_DRINK_STALL: - case RCT1_RIDE_TYPE_CANDYFLOSS_STALL: - case RCT1_RIDE_TYPE_BURGER_BAR: - case RCT1_RIDE_TYPE_BALLOON_STALL: - case RCT1_RIDE_TYPE_INFORMATION_KIOSK: - case RCT1_RIDE_TYPE_TOILETS: - case RCT1_RIDE_TYPE_SOUVENIR_STALL: - case RCT1_RIDE_TYPE_PIZZA_STALL: - case RCT1_RIDE_TYPE_POPCORN_STALL: - case RCT1_RIDE_TYPE_HOT_DOG_STALL: - case RCT1_RIDE_TYPE_EXOTIC_SEA_FOOD_STALL: - case RCT1_RIDE_TYPE_HAT_STALL: - case RCT1_RIDE_TYPE_TOFFEE_APPLE_STALL: - case RCT1_RIDE_TYPE_40: - case RCT1_RIDE_TYPE_44: - case RCT1_RIDE_TYPE_T_SHIRT_STALL: - case RCT1_RIDE_TYPE_DOUGHNUT_SHOP: - case RCT1_RIDE_TYPE_COFFEE_SHOP: - case RCT1_RIDE_TYPE_FRIED_CHICKEN_STALL: - case RCT1_RIDE_TYPE_LEMONADE_STALL: + case RideType::RCT1_RIDE_TYPE_HEDGE_MAZE: + case RideType::RCT1_RIDE_TYPE_SPIRAL_SLIDE: + case RideType::RCT1_RIDE_TYPE_ICE_CREAM_STALL: + case RideType::RCT1_RIDE_TYPE_CHIPS_STALL: + case RideType::RCT1_RIDE_TYPE_DRINK_STALL: + case RideType::RCT1_RIDE_TYPE_CANDYFLOSS_STALL: + case RideType::RCT1_RIDE_TYPE_BURGER_BAR: + case RideType::RCT1_RIDE_TYPE_BALLOON_STALL: + case RideType::RCT1_RIDE_TYPE_INFORMATION_KIOSK: + case RideType::RCT1_RIDE_TYPE_TOILETS: + case RideType::RCT1_RIDE_TYPE_SOUVENIR_STALL: + case RideType::RCT1_RIDE_TYPE_PIZZA_STALL: + case RideType::RCT1_RIDE_TYPE_POPCORN_STALL: + case RideType::RCT1_RIDE_TYPE_HOT_DOG_STALL: + case RideType::RCT1_RIDE_TYPE_EXOTIC_SEA_FOOD_STALL: + case RideType::RCT1_RIDE_TYPE_HAT_STALL: + case RideType::RCT1_RIDE_TYPE_TOFFEE_APPLE_STALL: + case RideType::RCT1_RIDE_TYPE_40: + case RideType::RCT1_RIDE_TYPE_44: + case RideType::RCT1_RIDE_TYPE_T_SHIRT_STALL: + case RideType::RCT1_RIDE_TYPE_DOUGHNUT_SHOP: + case RideType::RCT1_RIDE_TYPE_COFFEE_SHOP: + case RideType::RCT1_RIDE_TYPE_FRIED_CHICKEN_STALL: + case RideType::RCT1_RIDE_TYPE_LEMONADE_STALL: return false; default: return true; @@ -696,7 +698,7 @@ namespace RCT1 return map[vehicleSubEntry]; } - const char * GetRideTypeObject(uint8_t rideType) + const char * GetRideTypeObject(RideType rideType) { static constexpr const char * map[] = { @@ -787,8 +789,10 @@ namespace RCT1 "LEMST ", // RCT1_RIDE_TYPE_LEMONADE_STALL }; - Guard::ArgumentInRange(rideType, 0, std::size(map), "Unsupported RCT1 ride type."); - return map[rideType]; + const auto index = EnumValue(rideType); + Guard::ArgumentInRange(index, 0, std::size(map), "Unsupported RCT1 ride type."); + + return map[index]; } const char * GetVehicleObject(uint8_t vehicleType) diff --git a/src/openrct2/rct1/Tables.h b/src/openrct2/rct1/Tables.h index ac263bd822..6667e61eac 100644 --- a/src/openrct2/rct1/Tables.h +++ b/src/openrct2/rct1/Tables.h @@ -21,19 +21,21 @@ namespace RCT1 int8_t colour1, colour2, colour3; }; + enum class RideType : uint8_t; + colour_t GetColour(colour_t colour); PeepSpriteType GetPeepSpriteType(uint8_t rct1SpriteType); ObjectEntryIndex GetTerrain(uint8_t terrain); 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); - bool RideTypeUsesVehicles(uint8_t rideType); + bool RideTypeUsesVehicles(RideType rideType); bool PathIsQueue(uint8_t pathType); uint8_t NormalisePathAddition(uint8_t pathAdditionType); 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* GetSmallSceneryObject(uint8_t smallSceneryType); const char* GetLargeSceneryObject(uint8_t largeSceneryType);