diff --git a/src/openrct2-ui/windows/EditorObjectSelection.cpp b/src/openrct2-ui/windows/EditorObjectSelection.cpp index 2ee27ac44a..58f5807410 100644 --- a/src/openrct2-ui/windows/EditorObjectSelection.cpp +++ b/src/openrct2-ui/windows/EditorObjectSelection.cpp @@ -1371,7 +1371,7 @@ private: if (item->Type == ObjectType::Ride) { uint8_t rideType = 0; - for (int32_t i = 0; i < MAX_RIDE_TYPES_PER_RIDE_ENTRY; i++) + for (int32_t i = 0; i < RCT2::ObjectLimits::MaxRideTypesPerRideEntry; i++) { if (item->RideInfo.RideType[i] != RIDE_TYPE_NULL) { @@ -1503,7 +1503,7 @@ static bool VisibleListSortRideType(const ObjectListItem& a, const ObjectListIte static rct_string_id GetRideTypeStringId(const ObjectRepositoryItem* item) { rct_string_id result = STR_NONE; - for (int32_t i = 0; i < MAX_RIDE_TYPES_PER_RIDE_ENTRY; i++) + for (int32_t i = 0; i < RCT2::ObjectLimits::MaxRideTypesPerRideEntry; i++) { uint8_t rideType = item->RideInfo.RideType[i]; if (rideType != RIDE_TYPE_NULL) diff --git a/src/openrct2-ui/windows/NewRide.cpp b/src/openrct2-ui/windows/NewRide.cpp index b81e3c218f..7d469a4505 100644 --- a/src/openrct2-ui/windows/NewRide.cpp +++ b/src/openrct2-ui/windows/NewRide.cpp @@ -821,7 +821,7 @@ static void WindowNewRideScrollpaint(rct_window* w, rct_drawpixelinfo* dpi, int3 rideEntry = get_ride_entry(listItem->EntryIndex); int32_t imageId = rideEntry->images_offset; - for (size_t i = 0; i < MAX_RIDE_TYPES_PER_RIDE_ENTRY; i++) + for (size_t i = 0; i < RCT2::ObjectLimits::MaxRideTypesPerRideEntry; i++) { if (rideEntry->ride_type[i] == listItem->Type) break; diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index f14bcce3e5..d897dfc3cf 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -3837,7 +3837,7 @@ static void WindowRideMaintenanceMousedown(rct_window* w, rct_widgetindex widget case WIDX_FORCE_BREAKDOWN: num_items = 1; - for (j = 0; j < MAX_RIDE_TYPES_PER_RIDE_ENTRY; j++) + for (j = 0; j < RCT2::ObjectLimits::MaxRideTypesPerRideEntry; j++) { if (rideEntry->ride_type[j] != RIDE_TYPE_NULL) break; @@ -3980,7 +3980,7 @@ static void WindowRideMaintenanceDropdown(rct_window* w, rct_widgetindex widgetI else { int32_t j; - for (j = 0; j < MAX_RIDE_TYPES_PER_RIDE_ENTRY; j++) + for (j = 0; j < RCT2::ObjectLimits::MaxRideTypesPerRideEntry; j++) { if (rideEntry->ride_type[j] != RIDE_TYPE_NULL) break; diff --git a/src/openrct2/actions/RideCreateAction.cpp b/src/openrct2/actions/RideCreateAction.cpp index 671cb7ef44..60be84eb32 100644 --- a/src/openrct2/actions/RideCreateAction.cpp +++ b/src/openrct2/actions/RideCreateAction.cpp @@ -194,7 +194,7 @@ GameActions::Result RideCreateAction::Execute() const if (!(gParkFlags & PARK_FLAGS_NO_MONEY)) { - for (auto i = 0; i < NUM_SHOP_ITEMS_PER_RIDE; i++) + for (auto i = 0; i < RCT2::ObjectLimits::MaxShopItemsPerRideEntry; i++) { ride->price[i] = rtd.DefaultPrices[i]; } @@ -232,7 +232,7 @@ GameActions::Result RideCreateAction::Execute() const } } - for (auto i = 0; i < NUM_SHOP_ITEMS_PER_RIDE; i++) + for (auto i = 0; i < RCT2::ObjectLimits::MaxShopItemsPerRideEntry; i++) { if (rideEntry->shop_item[i] != ShopItem::None) { diff --git a/src/openrct2/interface/InteractiveConsole.cpp b/src/openrct2/interface/InteractiveConsole.cpp index 114dffc10f..ecf0c7849f 100644 --- a/src/openrct2/interface/InteractiveConsole.cpp +++ b/src/openrct2/interface/InteractiveConsole.cpp @@ -1105,7 +1105,7 @@ static int32_t cc_load_object(InteractiveConsole& console, const arguments_t& ar rideEntry = get_ride_entry(groupIndex); - for (int32_t j = 0; j < MAX_RIDE_TYPES_PER_RIDE_ENTRY; j++) + for (int32_t j = 0; j < RCT2::ObjectLimits::MaxRideTypesPerRideEntry; j++) { rideType = rideEntry->ride_type[j]; if (rideType != RIDE_TYPE_NULL) diff --git a/src/openrct2/libopenrct2.vcxproj b/src/openrct2/libopenrct2.vcxproj index 19ce4fedef..bb520d2c20 100644 --- a/src/openrct2/libopenrct2.vcxproj +++ b/src/openrct2/libopenrct2.vcxproj @@ -320,6 +320,7 @@ + diff --git a/src/openrct2/management/Research.cpp b/src/openrct2/management/Research.cpp index 9cecf92073..70bf3e0257 100644 --- a/src/openrct2/management/Research.cpp +++ b/src/openrct2/management/Research.cpp @@ -261,7 +261,7 @@ void research_finish_item(ResearchItem* researchItem) rct_ride_entry* rideEntry2 = get_ride_entry(i); if (rideEntry2 != nullptr) { - for (uint8_t j = 0; j < MAX_RIDE_TYPES_PER_RIDE_ENTRY; j++) + for (uint8_t j = 0; j < RCT2::ObjectLimits::MaxRideTypesPerRideEntry; j++) { if (rideEntry2->ride_type[j] == base_ride_type) { diff --git a/src/openrct2/object/ObjectRepository.h b/src/openrct2/object/ObjectRepository.h index 7ca5d1d132..d08a577809 100644 --- a/src/openrct2/object/ObjectRepository.h +++ b/src/openrct2/object/ObjectRepository.h @@ -49,8 +49,8 @@ struct ObjectRepositoryItem struct { uint8_t RideFlags; - uint8_t RideCategory[MAX_CATEGORIES_PER_RIDE]; - uint8_t RideType[MAX_RIDE_TYPES_PER_RIDE_ENTRY]; + uint8_t RideCategory[RCT2::ObjectLimits::MaxCategoriesPerRide]; + uint8_t RideType[RCT2::ObjectLimits::MaxRideTypesPerRideEntry]; } RideInfo; struct { diff --git a/src/openrct2/object/RideObject.cpp b/src/openrct2/object/RideObject.cpp index c3f3ce64bd..7529327077 100644 --- a/src/openrct2/object/RideObject.cpp +++ b/src/openrct2/object/RideObject.cpp @@ -20,6 +20,7 @@ #include "../core/String.hpp" #include "../drawing/Drawing.h" #include "../localisation/Language.h" +#include "../rct2/DATLimits.h" #include "../rct2/RCT2.h" #include "../ride/Ride.h" #include "../ride/RideData.h" @@ -41,7 +42,7 @@ static void RideObjectUpdateRideType(rct_ride_entry* rideEntry) return; } - for (auto i = 0; i < MAX_RIDE_TYPES_PER_RIDE_ENTRY; i++) + for (auto i = 0; i < RCT2::ObjectLimits::MaxRideTypesPerRideEntry; i++) { auto oldRideType = rideEntry->ride_type[i]; if (oldRideType != RIDE_TYPE_NULL) @@ -124,7 +125,7 @@ void RideObject::ReadLegacy(IReadObjectContext* context, IStream* stream) } // Read peep loading positions - for (int32_t i = 0; i < RCT2::Limits::MaxVehiclesPerRideEntry; i++) + for (int32_t i = 0; i < RCT2::ObjectLimits::MaxVehiclesPerRideEntry; i++) { _peepLoadingWaypoints[i].clear(); _peepLoadingPositions[i].clear(); @@ -197,8 +198,8 @@ void RideObject::Load() _legacyType.images_offset = gfx_object_allocate_images(GetImageTable().GetImages(), GetImageTable().GetCount()); _legacyType.vehicle_preset_list = &_presetColours; - int32_t cur_vehicle_images_offset = _legacyType.images_offset + MAX_RIDE_TYPES_PER_RIDE_ENTRY; - for (int32_t i = 0; i < RCT2::Limits::MaxVehiclesPerRideEntry; i++) + int32_t cur_vehicle_images_offset = _legacyType.images_offset + RCT2::ObjectLimits::MaxRideTypesPerRideEntry; + for (int32_t i = 0; i < RCT2::ObjectLimits::MaxVehiclesPerRideEntry; i++) { rct_ride_entry_vehicle* vehicleEntry = &_legacyType.vehicles[i]; if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_FLAT) @@ -410,11 +411,11 @@ void RideObject::SetRepositoryItem(ObjectRepositoryItem* item) const uint8_t firstRideType = ride_entry_get_first_non_null_ride_type(&_legacyType); uint8_t category = GetRideTypeDescriptor(firstRideType).Category; - for (int32_t i = 0; i < RCT2::Limits::MaxRideTypesPerRideEntry; i++) + for (int32_t i = 0; i < RCT2::ObjectLimits::MaxRideTypesPerRideEntry; i++) { item->RideInfo.RideType[i] = _legacyType.ride_type[i]; } - for (int32_t i = 0; i < RCT2::Limits::MaxCategoriesPerRide; i++) + for (int32_t i = 0; i < RCT2::ObjectLimits::MaxCategoriesPerRide; i++) { item->RideInfo.RideCategory[i] = category; } @@ -541,7 +542,7 @@ void RideObject::ReadJson(IReadObjectContext* context, json_t& root) json_t rideTypes = Json::AsArray(properties["type"]); size_t numRideTypes = rideTypes.size(); - for (size_t i = 0; i < MAX_RIDE_TYPES_PER_RIDE_ENTRY; i++) + for (size_t i = 0; i < RCT2::ObjectLimits::MaxRideTypesPerRideEntry; i++) { ObjectEntryIndex rideType = RIDE_TYPE_NULL; @@ -586,7 +587,7 @@ void RideObject::ReadJson(IReadObjectContext* context, json_t& root) // Shop item auto rideSells = Json::AsArray(properties["sells"]); - auto numShopItems = std::min(static_cast(NUM_SHOP_ITEMS_PER_RIDE), rideSells.size()); + auto numShopItems = std::min(static_cast(RCT2::ObjectLimits::MaxShopItemsPerRideEntry), rideSells.size()); for (size_t i = 0; i < numShopItems; i++) { auto shopItem = ParseShopItem(Json::GetString(rideSells[i])); diff --git a/src/openrct2/object/RideObject.h b/src/openrct2/object/RideObject.h index 12a5343968..55fb71002f 100644 --- a/src/openrct2/object/RideObject.h +++ b/src/openrct2/object/RideObject.h @@ -15,17 +15,13 @@ #include -// TODO: MOVE TO COMMON LIMITS HEADER -#define MAX_RIDE_TYPES_PER_RIDE_ENTRY 3 -#define MAX_CATEGORIES_PER_RIDE 2 - class RideObject final : public Object { private: rct_ride_entry _legacyType = {}; vehicle_colour_preset_list _presetColours = {}; - std::vector _peepLoadingPositions[MAX_VEHICLES_PER_RIDE_ENTRY]; - std::vector> _peepLoadingWaypoints[MAX_VEHICLES_PER_RIDE_ENTRY]; + std::vector _peepLoadingPositions[RCT2::ObjectLimits::MaxVehiclesPerRideEntry]; + std::vector> _peepLoadingWaypoints[RCT2::ObjectLimits::MaxVehiclesPerRideEntry]; public: void* GetLegacyData() override diff --git a/src/openrct2/rct2/DATLimits.h b/src/openrct2/rct2/DATLimits.h new file mode 100644 index 0000000000..74ed2ff8c8 --- /dev/null +++ b/src/openrct2/rct2/DATLimits.h @@ -0,0 +1,21 @@ +/***************************************************************************** + * Copyright (c) 2014-2021 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#pragma once +#include + +namespace RCT2::ObjectLimits +{ + constexpr const uint8_t MaxCategoriesPerRide = 2; + constexpr const uint8_t MaxRideTypesPerRideEntry = 3; + // The max number of different types of vehicle. + // Examples of vehicles here are the locomotive, tender and carriage of the Miniature Railway. + constexpr const uint8_t MaxVehiclesPerRideEntry = 4; + constexpr const uint8_t MaxShopItemsPerRideEntry = 2; +} // namespace RCT2::ObjectLimits diff --git a/src/openrct2/rct2/Limits.h b/src/openrct2/rct2/Limits.h index cfd7c92d3d..f7e9e33c09 100644 --- a/src/openrct2/rct2/Limits.h +++ b/src/openrct2/rct2/Limits.h @@ -16,9 +16,6 @@ namespace RCT2::Limits constexpr const uint8_t MaxStaff = 200; constexpr const uint8_t MaxBanners = 250; constexpr const uint8_t MaxTrainsPerRide = 32; - constexpr const uint8_t MaxCategoriesPerRide = 2; - constexpr const uint8_t MaxRideTypesPerRideEntry = 3; - constexpr const uint8_t MaxVehiclesPerRideEntry = 4; constexpr const uint8_t DowntimeHistorySize = 8; constexpr const uint16_t MaxEntities = 10000; constexpr const uint32_t MaxTileElements = 0x30000; diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index b1386155df..7cdb6a323a 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -5428,7 +5428,7 @@ bool ride_has_ratings(const Ride* ride) */ uint8_t ride_entry_get_first_non_null_ride_type(const rct_ride_entry* rideEntry) { - for (uint8_t i = 0; i < MAX_RIDE_TYPES_PER_RIDE_ENTRY; i++) + for (uint8_t i = 0; i < RCT2::ObjectLimits::MaxRideTypesPerRideEntry; i++) { if (rideEntry->ride_type[i] != RIDE_TYPE_NULL) { diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h index dfe9897f1c..92e4ba2b39 100644 --- a/src/openrct2/ride/Ride.h +++ b/src/openrct2/ride/Ride.h @@ -11,6 +11,7 @@ #include "../common.h" #include "../localisation/Formatter.h" +#include "../rct2/DATLimits.h" #include "../rct2/Limits.h" #include "../world/Map.h" #include "RideColour.h" @@ -51,8 +52,6 @@ constexpr uint16_t const MAX_HELICES = RCT12::Limits::MaxHelices; constexpr uint16_t const MAZE_CLEARANCE_HEIGHT = 4 * COORDS_Z_STEP; -constexpr const uint8_t NUM_SHOP_ITEMS_PER_RIDE = 2; - struct RideStation { CoordsXY Start; @@ -192,7 +191,7 @@ struct Ride uint16_t num_customers_timeout; // Customer count in the last 10 * 960 game ticks (sliding window) uint16_t num_customers[CUSTOMER_HISTORY_SIZE]; - money16 price[NUM_SHOP_ITEMS_PER_RIDE]; + money16 price[RCT2::ObjectLimits::MaxShopItemsPerRideEntry]; TileCoordsXYZ ChairliftBullwheelLocation[2]; union { diff --git a/src/openrct2/ride/RideData.h b/src/openrct2/ride/RideData.h index ad7e88d5e3..39d4ec55db 100644 --- a/src/openrct2/ride/RideData.h +++ b/src/openrct2/ride/RideData.h @@ -177,7 +177,7 @@ struct RideTypeDescriptor UpkeepCostsDescriptor UpkeepCosts; // rct2: 0x0097DD78 RideBuildCost BuildCosts; - money16 DefaultPrices[NUM_SHOP_ITEMS_PER_RIDE]; + money16 DefaultPrices[RCT2::ObjectLimits::MaxShopItemsPerRideEntry]; std::string_view DefaultMusic; /** rct2: 0x0097D7CB */ ShopItemIndex PhotoItem; diff --git a/src/openrct2/ride/RideEntry.h b/src/openrct2/ride/RideEntry.h index 233da0730e..34bed10e21 100644 --- a/src/openrct2/ride/RideEntry.h +++ b/src/openrct2/ride/RideEntry.h @@ -9,7 +9,7 @@ #pragma once -#include "../rct2/Limits.h" +#include "../rct2/DATLimits.h" #include "RideColour.h" #include "ShopItem.h" #include "VehicleColour.h" @@ -17,13 +17,6 @@ #include -// TODO: MOVE TO COMMON LIMITS HEADER DUPLICATED FROM RIDE.H -constexpr const uint8_t NUM_SHOP_ITEMS_PER_RIDE_2 = 2; - -// The max number of different types of vehicle. -// Examples of vehicles here are the locomotive, tender and carriage of the Miniature Railway. -#define MAX_VEHICLES_PER_RIDE_ENTRY 4 - struct RideNaming { rct_string_id Name; @@ -51,7 +44,7 @@ struct rct_ride_entry // The first three images are previews. They correspond to the ride_type[] array. uint32_t images_offset; uint32_t flags; - uint8_t ride_type[RCT2::Limits::MaxRideTypesPerRideEntry]; + uint8_t ride_type[RCT2::ObjectLimits::MaxRideTypesPerRideEntry]; uint8_t min_cars_in_train; uint8_t max_cars_in_train; uint8_t cars_per_flat_ride; @@ -66,13 +59,13 @@ struct rct_ride_entry uint8_t rear_vehicle; uint8_t third_vehicle; uint8_t BuildMenuPriority; - rct_ride_entry_vehicle vehicles[RCT2::Limits::MaxVehiclesPerRideEntry]; + rct_ride_entry_vehicle vehicles[RCT2::ObjectLimits::MaxVehiclesPerRideEntry]; vehicle_colour_preset_list* vehicle_preset_list; int8_t excitement_multiplier; int8_t intensity_multiplier; int8_t nausea_multiplier; uint8_t max_height; - ShopItem shop_item[NUM_SHOP_ITEMS_PER_RIDE_2]; + ShopItem shop_item[RCT2::ObjectLimits::MaxShopItemsPerRideEntry]; rct_string_id capacity; void* obj;