diff --git a/OpenRCT2.xcodeproj/project.pbxproj b/OpenRCT2.xcodeproj/project.pbxproj index 21d2880ca4..7679787195 100644 --- a/OpenRCT2.xcodeproj/project.pbxproj +++ b/OpenRCT2.xcodeproj/project.pbxproj @@ -55,6 +55,7 @@ 4C93F1AF1F8CD9F600A9330D /* KeyboardShortcut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4C93F1AE1F8CD9F600A9330D /* KeyboardShortcut.cpp */; }; 4CB1375621C2E9F80029FCDA /* SimulateCommands.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CB1375521C2E9F80029FCDA /* SimulateCommands.cpp */; }; 4CB2716A24195B45000CF9EE /* VehicleSubpositionData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CB2716824195B45000CF9EE /* VehicleSubpositionData.cpp */; }; + 4CB30179249E382B0034A7F6 /* RCT2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CB30178249E382B0034A7F6 /* RCT2.cpp */; }; 4CC5258223A19C2900D4366D /* TrackDesignAction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CC5258123A19C2800D4366D /* TrackDesignAction.cpp */; }; 4CF67197206B7E720034ADDD /* object in Resources */ = {isa = PBXBuildFile; fileRef = 4CF67196206B7E720034ADDD /* object */; }; 6341F4E12400AA0F0052902B /* Drawing.Sprite.RLE.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6341F4DF2400AA0E0052902B /* Drawing.Sprite.RLE.cpp */; }; @@ -280,7 +281,6 @@ C688787320289A780084B384 /* RideRatings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F73E320B2011589E00C4D975 /* RideRatings.cpp */; }; C688787420289A780084B384 /* TrackDesignSave.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F73E320E2011589F00C4D975 /* TrackDesignSave.cpp */; }; C688787520289A780084B384 /* RideData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4C7B541420060D8E00A52E21 /* RideData.cpp */; }; - C688787620289A780084B384 /* RideGroupManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4C8667801EEFDCDF0024AAB8 /* RideGroupManager.cpp */; }; C688787720289A780084B384 /* Station.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4C6AC20D1F9E1693004324AA /* Station.cpp */; }; C688787820289A780084B384 /* Track.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CFE4E8E1F9625B0005243C2 /* Track.cpp */; }; C688787920289A780084B384 /* TrackData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CFE4E861F950164005243C2 /* TrackData.cpp */; }; @@ -842,8 +842,6 @@ 4C81F7DF24672C4D000E61BF /* CustomListView.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CustomListView.cpp; path = scripting/CustomListView.cpp; sourceTree = ""; }; 4C81F7E024672C4D000E61BF /* CustomListView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CustomListView.h; path = scripting/CustomListView.h; sourceTree = ""; }; 4C81F7E224672C58000E61BF /* ScTileSelection.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = ScTileSelection.hpp; path = scripting/ScTileSelection.hpp; sourceTree = ""; }; - 4C8667801EEFDCDF0024AAB8 /* RideGroupManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RideGroupManager.cpp; sourceTree = ""; }; - 4C8667811EEFDCDF0024AAB8 /* RideGroupManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RideGroupManager.h; sourceTree = ""; }; 4C8A6FF123EB5325001A8255 /* Http.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Http.h; sourceTree = ""; }; 4C8A6FF223EB5326001A8255 /* Http.cURL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Http.cURL.cpp; sourceTree = ""; }; 4C8B426E1EEB1ABD00F015CA /* X8DrawingEngine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = X8DrawingEngine.cpp; sourceTree = ""; }; @@ -940,6 +938,7 @@ 4CB1375521C2E9F80029FCDA /* SimulateCommands.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SimulateCommands.cpp; sourceTree = ""; }; 4CB2716824195B45000CF9EE /* VehicleSubpositionData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VehicleSubpositionData.cpp; sourceTree = ""; }; 4CB2716924195B45000CF9EE /* VehicleSubpositionData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VehicleSubpositionData.h; sourceTree = ""; }; + 4CB30178249E382B0034A7F6 /* RCT2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RCT2.cpp; sourceTree = ""; }; 4CB832AA1EFFB8D100B88761 /* ttf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ttf.h; sourceTree = ""; }; 4CC4B8E21FE00C4100660D62 /* CmdlineSprite.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CmdlineSprite.cpp; sourceTree = ""; }; 4CC4B8E31FE00C4200660D62 /* CmdlineSprite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CmdlineSprite.h; sourceTree = ""; }; @@ -3156,6 +3155,7 @@ F76C84761EC4E7CC00FA49E2 /* rct2 */ = { isa = PBXGroup; children = ( + 4CB30178249E382B0034A7F6 /* RCT2.cpp */, 4C7B54042004C58200A52E21 /* RCT2.h */, F76C847D1EC4E7CC00FA49E2 /* S6Exporter.cpp */, F76C847E1EC4E7CC00FA49E2 /* S6Exporter.h */, @@ -3185,8 +3185,6 @@ 4C6A66C01FF9322A00694CB6 /* Ride.h */, 4C7B541420060D8E00A52E21 /* RideData.cpp */, 4C7B541520060D8E00A52E21 /* RideData.h */, - 4C8667801EEFDCDF0024AAB8 /* RideGroupManager.cpp */, - 4C8667811EEFDCDF0024AAB8 /* RideGroupManager.h */, F73E320B2011589E00C4D975 /* RideRatings.cpp */, F73E320C2011589F00C4D975 /* RideRatings.h */, 2ADE2F352244195F002598AF /* RideTypes.h */, @@ -4120,6 +4118,7 @@ C666EE6E1F37ACB10061AA04 /* CustomCurrency.cpp in Sources */, C654DF2D1F69C0430040F43D /* Banner.cpp in Sources */, C666EE711F37ACB10061AA04 /* MapGen.cpp in Sources */, + 4CB30179249E382B0034A7F6 /* RCT2.cpp in Sources */, C6D2BEEA1F9BB83C008B557C /* NetworkStatus.cpp in Sources */, C64645011F3FA4120026AC2D /* Water.cpp in Sources */, C61FB2721FA3E25D0095FB9D /* ObjectLoadError.cpp in Sources */, @@ -4174,7 +4173,6 @@ F76C85B71EC4E88300FA49E2 /* NullAudioSource.cpp in Sources */, C68878E720289B9B0084B384 /* Platform.Posix.cpp in Sources */, C68878CE20289B9B0084B384 /* ObjectList.cpp in Sources */, - C688787620289A780084B384 /* RideGroupManager.cpp in Sources */, C688788120289ADE0084B384 /* Line.cpp in Sources */, 93CBA4CA20A7504500867D56 /* ImageImporter.cpp in Sources */, C688792520289B9B0084B384 /* RotoDrop.cpp in Sources */, diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 587cc1c113..f74793e030 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3401,21 +3401,13 @@ STR_6100 :You disconnected from the server. STR_6101 :Rides don't decrease in value over time STR_6102 :{SMALLFONT}{BLACK}The value of a ride won't decrease over time, so guests will not suddenly think that a ride is too expensive. STR_6103 :{SMALLFONT}{BLACK}This option is disabled during network play. -STR_6104 :Corkscrew Roller Coaster STR_6105 :Hypercoaster -STR_6106 :Car Ride STR_6107 :Monster Trucks -STR_6108 :Steel Twister STR_6109 :Hyper-Twister -STR_6110 :Junior Roller Coaster STR_6111 :Classic Mini Roller Coaster -STR_6112 :A compact steel-tracked roller coaster where the train travels through corkscrews and loops STR_6113 :A tall non-inverting roller coaster with large drops, high speed, and comfortable trains with only lap bar restraints -STR_6114 :Riders travel slowly in powered vehicles along a track-based route STR_6115 :Powered giant 4 x 4 trucks which can climb steep slopes STR_6116 :Wide roller coaster trains glide along smooth steel track, travelling through a variety of inversions -STR_6117 :Sitting in comfortable trains with only simple lap restraints riders enjoy giant smooth drops and twisting track as well as plenty of 'air time' over the hills -STR_6118 :A gentle roller coaster for people who haven't yet got the courage to face the larger rides STR_6119 :A cheap and easy to build roller coaster, but with a limited height STR_6120 :{BABYBLUE}New vehicle now available for {STRINGID}:{NEWLINE}{STRINGID} STR_6121 :{SMALLFONT}{BLACK}Extends the park's land rights all the way to the edges of the map diff --git a/src/openrct2-ui/windows/EditorInventionsList.cpp b/src/openrct2-ui/windows/EditorInventionsList.cpp index 4d78029bd4..7521bc9262 100644 --- a/src/openrct2-ui/windows/EditorInventionsList.cpp +++ b/src/openrct2-ui/windows/EditorInventionsList.cpp @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include #include #include @@ -692,10 +692,10 @@ static void window_editor_inventions_list_scrollpaint(rct_window* w, rct_drawpix && !RideTypeDescriptors[researchItem.baseRideType].HasFlag(RIDE_TYPE_FLAG_LIST_VEHICLES_SEPARATELY)) { const auto rideEntry = get_ride_entry(researchItem.entryIndex); - const rct_string_id rideGroupName = get_ride_naming(researchItem.baseRideType, rideEntry).Name; + const rct_string_id rideTypeName = get_ride_naming(researchItem.baseRideType, rideEntry).Name; format_string( groupNamePtr, std::size(groupNameBuffer), STR_INVENTIONS_LIST_RIDE_AND_VEHICLE_NAME, - static_cast(&rideGroupName)); + static_cast(&rideTypeName)); format_string(vehicleNamePtr, std::size(vehicleNameBuffer), itemNameId, nullptr); } else @@ -738,9 +738,9 @@ static void window_editor_inventions_list_drag_open(ResearchItem* researchItem) && !RideTypeDescriptors[researchItem->baseRideType].HasFlag(RIDE_TYPE_FLAG_LIST_VEHICLES_SEPARATELY)) { const auto rideEntry = get_ride_entry(researchItem->entryIndex); - const rct_string_id rideGroupName = get_ride_naming(researchItem->baseRideType, rideEntry).Name; + const rct_string_id rideTypeName = get_ride_naming(researchItem->baseRideType, rideEntry).Name; rct_string_id args[] = { - rideGroupName, + rideTypeName, stringId, }; format_string(ptr, 256, STR_INVENTIONS_LIST_RIDE_AND_VEHICLE_NAME, &args); @@ -833,9 +833,8 @@ static rct_string_id window_editor_inventions_list_prepare_name(const ResearchIt && !RideTypeDescriptors[researchItem->baseRideType].HasFlag(RIDE_TYPE_FLAG_LIST_VEHICLES_SEPARATELY)) { drawString = withGap ? STR_INVENTIONS_LIST_RIDE_AND_VEHICLE_NAME_DRAG : STR_WINDOW_COLOUR_2_STRINGID_STRINGID; - rct_string_id rideGroupName = get_ride_naming(researchItem->baseRideType, get_ride_entry(researchItem->entryIndex)) - .Name; - ft.Add(rideGroupName); + rct_string_id rideTypeName = get_ride_naming(researchItem->baseRideType, get_ride_entry(researchItem->entryIndex)).Name; + ft.Add(rideTypeName); ft.Add(stringId); } else diff --git a/src/openrct2-ui/windows/EditorObjectSelection.cpp b/src/openrct2-ui/windows/EditorObjectSelection.cpp index 2533a7537b..cf95186dbc 100644 --- a/src/openrct2-ui/windows/EditorObjectSelection.cpp +++ b/src/openrct2-ui/windows/EditorObjectSelection.cpp @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include #include #include @@ -1500,16 +1500,7 @@ static rct_string_id get_ride_type_string_id(const ObjectRepositoryItem* item) uint8_t rideType = item->RideInfo.RideType[i]; if (rideType != RIDE_TYPE_NULL) { - if (RideTypeDescriptors[rideType].HasFlag(RIDE_TYPE_FLAG_HAS_RIDE_GROUPS)) - { - const RideGroup* rideGroup = RideGroupManager::RideGroupFind(rideType, item->RideInfo.RideGroupIndex); - result = rideGroup->Naming.Name; - } - else - { - result = RideTypeDescriptors[rideType].Naming.Name; - } - + result = RideTypeDescriptors[rideType].Naming.Name; break; } } diff --git a/src/openrct2-ui/windows/InstallTrack.cpp b/src/openrct2-ui/windows/InstallTrack.cpp index 999f231daf..9290df2cee 100644 --- a/src/openrct2-ui/windows/InstallTrack.cpp +++ b/src/openrct2-ui/windows/InstallTrack.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include diff --git a/src/openrct2-ui/windows/NewRide.cpp b/src/openrct2-ui/windows/NewRide.cpp index 238fda8474..44edf7f3b8 100644 --- a/src/openrct2-ui/windows/NewRide.cpp +++ b/src/openrct2-ui/windows/NewRide.cpp @@ -26,7 +26,6 @@ #include #include #include -#include #include #include #include @@ -65,16 +64,20 @@ static constexpr const char RideTypeViewOrder[] = { RIDE_TYPE_WOODEN_ROLLER_COASTER, RIDE_TYPE_WOODEN_WILD_MOUSE, RIDE_TYPE_STEEL_WILD_MOUSE, + RIDE_TYPE_SPINNING_WILD_MOUSE, RIDE_TYPE_INVERTED_HAIRPIN_COASTER, RIDE_TYPE_JUNIOR_ROLLER_COASTER, + RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER, RIDE_TYPE_MINI_ROLLER_COASTER, RIDE_TYPE_SPIRAL_ROLLER_COASTER, RIDE_TYPE_MINE_TRAIN_COASTER, RIDE_TYPE_LOOPING_ROLLER_COASTER, RIDE_TYPE_STAND_UP_ROLLER_COASTER, RIDE_TYPE_CORKSCREW_ROLLER_COASTER, + RIDE_TYPE_HYPERCOASTER, RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER, RIDE_TYPE_TWISTER_ROLLER_COASTER, + RIDE_TYPE_HYPER_TWISTER, RIDE_TYPE_GIGA_COASTER, RIDE_TYPE_SUSPENDED_SWINGING_COASTER, RIDE_TYPE_COMPACT_INVERTED_COASTER, @@ -102,6 +105,7 @@ static constexpr const char RideTypeViewOrder[] = { RIDE_TYPE_MINI_GOLF, RIDE_TYPE_OBSERVATION_TOWER, RIDE_TYPE_CAR_RIDE, + RIDE_TYPE_MONSTER_TRUCKS, RIDE_TYPE_MINI_HELICOPTERS, RIDE_TYPE_SPIRAL_SLIDE, RIDE_TYPE_DODGEMS, @@ -268,8 +272,7 @@ static RideSelection window_new_ride_scroll_get_ride_list_item_at(rct_window* w, static void window_new_ride_paint_ride_information( rct_window* w, rct_drawpixelinfo* dpi, RideSelection item, const ScreenCoordsXY& screenPos, int32_t width); static void window_new_ride_select(rct_window* w); -static RideSelection* window_new_ride_iterate_over_ride_group( - uint8_t rideType, uint8_t rideGroupIndex, RideSelection* nextListItem); +static RideSelection* window_new_ride_iterate_over_ride_type(uint8_t rideType, RideSelection* nextListItem); static RideSelection _lastTrackDesignCountRideType; static int32_t _lastTrackDesignCount; @@ -321,28 +324,14 @@ static void window_new_ride_populate_list() if (RideTypeDescriptors[rideType].Category != currentCategory) continue; - if (ride_type_is_invented(rideType) || gCheatsIgnoreResearchStatus) - { - if (!RideTypeDescriptors[rideType].HasFlag(RIDE_TYPE_FLAG_HAS_RIDE_GROUPS)) - { - nextListItem = window_new_ride_iterate_over_ride_group(rideType, 0, nextListItem); - } - else - { - for (uint8_t j = 0; j < MAX_RIDE_GROUPS_PER_RIDE_TYPE; j++) - { - nextListItem = window_new_ride_iterate_over_ride_group(rideType, j, nextListItem); - } - } - } + nextListItem = window_new_ride_iterate_over_ride_type(rideType, nextListItem); } nextListItem->Type = RIDE_TYPE_NULL; nextListItem->EntryIndex = RIDE_ENTRY_INDEX_NULL; } -static RideSelection* window_new_ride_iterate_over_ride_group( - uint8_t rideType, uint8_t rideGroupIndex, RideSelection* nextListItem) +static RideSelection* window_new_ride_iterate_over_ride_type(uint8_t rideType, RideSelection* nextListItem) { bool buttonForRideTypeCreated = false; bool allowDrawingOverLastButton = false; @@ -361,15 +350,6 @@ static RideSelection* window_new_ride_iterate_over_ride_group( // Ride entries rct_ride_entry* rideEntry = get_ride_entry(rideEntryIndex); - if (RideTypeDescriptors[rideType].HasFlag(RIDE_TYPE_FLAG_HAS_RIDE_GROUPS)) - { - const RideGroup* rideEntryRideGroup = RideGroupManager::GetRideGroup(rideType, rideEntry); - const RideGroup* rideGroup = RideGroupManager::RideGroupFind(rideType, rideGroupIndex); - - if (!rideEntryRideGroup->Equals(rideGroup)) - continue; - } - // Skip if the vehicle isn't the preferred vehicle for this generic track type if (!RideTypeDescriptors[rideType].HasFlag(RIDE_TYPE_FLAG_LIST_VEHICLES_SEPARATELY) && highestVehiclePriority > rideEntry->BuildMenuPriority) @@ -535,21 +515,14 @@ void window_new_ride_focus(RideSelection rideItem) // In this case, select the first entry that belongs to the same ride group. if (!entryFound) { - const RideGroup* rideGroup = RideGroupManager::GetRideGroup(rideTypeIndex, rideEntry); - for (RideSelection* listItem = _windowNewRideListItems; listItem->Type != RIDE_TYPE_NULL; listItem++) { if (listItem->Type == rideItem.Type) { - const RideGroup* irg = RideGroupManager::GetRideGroup(rideTypeIndex, rideEntry); - - if (!RideTypeDescriptors[rideTypeIndex].HasFlag(RIDE_TYPE_FLAG_HAS_RIDE_GROUPS) || rideGroup->Equals(irg)) - { - _windowNewRideHighlightedItem[0] = rideItem; - w->new_ride.HighlightedRide = rideItem; - window_new_ride_scroll_to_focused_ride(w); - break; - } + _windowNewRideHighlightedItem[0] = rideItem; + w->new_ride.HighlightedRide = rideItem; + window_new_ride_scroll_to_focused_ride(w); + break; } } } @@ -916,11 +889,9 @@ static RideSelection window_new_ride_scroll_get_ride_list_item_at(rct_window* w, static int32_t get_num_track_designs(RideSelection item) { std::string entryName; - rct_ride_entry* rideEntry = nullptr; if (item.Type < 0x80) { - rideEntry = get_ride_entry(item.EntryIndex); if (RideTypeDescriptors[item.Type].HasFlag(RIDE_TYPE_FLAG_LIST_VEHICLES_SEPARATELY)) { entryName = get_ride_entry_name(item.EntryIndex); @@ -928,14 +899,6 @@ static int32_t get_num_track_designs(RideSelection item) } auto repo = OpenRCT2::GetContext()->GetTrackDesignRepository(); - if (rideEntry != nullptr && RideTypeDescriptors[item.Type].HasFlag(RIDE_TYPE_FLAG_HAS_RIDE_GROUPS)) - { - auto rideGroup = RideGroupManager::GetRideGroup(item.Type, rideEntry); - if (rideGroup != nullptr) - { - return static_cast(repo->GetCountForRideGroup(item.Type, rideGroup)); - } - } return static_cast(repo->GetCountForObjectEntry(item.Type, entryName)); } @@ -1057,16 +1020,6 @@ static void window_new_ride_list_vehicles_for(uint8_t rideType, const rct_ride_e if (!ride_entry_is_invented(rideEntryIndex) && !gCheatsIgnoreResearchStatus) continue; - // Skip if vehicle does not belong to the same ride group - if (RideTypeDescriptors[rideType].HasFlag(RIDE_TYPE_FLAG_HAS_RIDE_GROUPS)) - { - auto rideGroup = RideGroupManager::GetRideGroup(rideType, rideEntry); - auto currentRideGroup = RideGroupManager::GetRideGroup(rideType, currentRideEntry); - - if (!rideGroup->Equals(currentRideGroup)) - continue; - } - // Append comma if not the first iteration if (!isFirst) { diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index bfcb866117..4fc0eba8f5 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -43,7 +43,6 @@ #include #include #include -#include #include #include #include @@ -2288,16 +2287,6 @@ static void populate_vehicle_type_dropdown(Ride* ride) if (!ride_entry_is_invented(rideEntryIndex) && !gCheatsIgnoreResearchStatus) continue; - // Skip if vehicle does not belong to the same ride group - if (RideTypeDescriptors[ride->type].HasFlag(RIDE_TYPE_FLAG_HAS_RIDE_GROUPS) && !selectionShouldBeExpanded) - { - const RideGroup* rideGroup = RideGroupManager::GetRideGroup(ride->type, rideEntry); - const RideGroup* currentRideGroup = RideGroupManager::GetRideGroup(ride->type, currentRideEntry); - - if (!rideGroup->Equals(currentRideGroup)) - continue; - } - VehicleTypeLabel label = { rideEntryIndex, currentRideEntry->naming.Name, ls.GetString(currentRideEntry->naming.Name) }; VehicleDropdownData.push_back(label); diff --git a/src/openrct2-ui/windows/RideConstruction.cpp b/src/openrct2-ui/windows/RideConstruction.cpp index f18956cf1c..1a94c4a32d 100644 --- a/src/openrct2-ui/windows/RideConstruction.cpp +++ b/src/openrct2-ui/windows/RideConstruction.cpp @@ -27,7 +27,6 @@ #include #include #include -#include #include #include #include @@ -2263,9 +2262,11 @@ static void window_ride_construction_invalidate(rct_window* w) if (_currentTrackCurve & RideConstructionSpecialPieceSelected) { stringId = RideConfigurationStringIds[_currentTrackCurve & ~RideConstructionSpecialPieceSelected]; - if (stringId == STR_RAPIDS && ride->type == RIDE_TYPE_CAR_RIDE) + if (stringId == STR_RAPIDS && ride->type == RIDE_TYPE_MONSTER_TRUCKS) + { stringId = STR_LOG_BUMPS; - if (stringId == STR_SPINNING_CONTROL_TOGGLE_TRACK && ride->type != RIDE_TYPE_STEEL_WILD_MOUSE) + } + else if (stringId == STR_SPINNING_CONTROL_TOGGLE_TRACK && ride->type != RIDE_TYPE_SPINNING_WILD_MOUSE) { stringId = STR_BOOSTER; } @@ -2540,16 +2541,7 @@ void window_ride_construction_update_enabled_track_pieces() return; int32_t rideType = ride_get_alternative_type(ride); - - if (!gCheatsEnableAllDrawableTrackPieces && RideTypeDescriptors[rideType].HasFlag(RIDE_TYPE_FLAG_HAS_RIDE_GROUPS)) - { - const RideGroup* rideGroup = RideGroupManager::GetRideGroup(rideType, rideEntry); - _enabledRidePieces = rideGroup->AvailableTrackPieces; - } - else - { - _enabledRidePieces = RideTypeDescriptors[rideType].GetAvailableTrackPieces(); - } + _enabledRidePieces = RideTypeDescriptors[rideType].GetAvailableTrackPieces(); } /** @@ -3077,7 +3069,7 @@ static void window_ride_construction_update_widgets(rct_window* w) bool brakesSelected = _selectedTrackType == TRACK_ELEM_BRAKES || _currentTrackCurve == (RideConstructionSpecialPieceSelected | TRACK_ELEM_BRAKES); _boosterTrackSelected = track_element_is_booster(ride->type, _selectedTrackType) - || (ride->type != RIDE_TYPE_STEEL_WILD_MOUSE + || (ride->type != RIDE_TYPE_SPINNING_WILD_MOUSE && _currentTrackCurve == (RideConstructionSpecialPieceSelected | TRACK_ELEM_BOOSTER)); if (!brakesSelected && !_boosterTrackSelected) @@ -3362,13 +3354,13 @@ static void window_ride_construction_show_special_track_dropdown(rct_window* w, if (trackPieceStringId == STR_RAPIDS) { auto ride = get_ride(_currentRideIndex); - if (ride != nullptr && ride->type == RIDE_TYPE_CAR_RIDE) + if (ride != nullptr && ride->type == RIDE_TYPE_MONSTER_TRUCKS) trackPieceStringId = STR_LOG_BUMPS; } if (trackPieceStringId == STR_SPINNING_CONTROL_TOGGLE_TRACK) { auto ride = get_ride(_currentRideIndex); - if (ride != nullptr && ride->type != RIDE_TYPE_STEEL_WILD_MOUSE) + if (ride != nullptr && ride->type != RIDE_TYPE_SPINNING_WILD_MOUSE) trackPieceStringId = STR_BOOSTER; } gDropdownItemsFormat[i] = trackPieceStringId; diff --git a/src/openrct2-ui/windows/TrackDesignPlace.cpp b/src/openrct2-ui/windows/TrackDesignPlace.cpp index b7af7938ef..a270714c24 100644 --- a/src/openrct2-ui/windows/TrackDesignPlace.cpp +++ b/src/openrct2-ui/windows/TrackDesignPlace.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include diff --git a/src/openrct2-ui/windows/TrackList.cpp b/src/openrct2-ui/windows/TrackList.cpp index 613cb4075c..5b309cde0c 100644 --- a/src/openrct2-ui/windows/TrackList.cpp +++ b/src/openrct2-ui/windows/TrackList.cpp @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include #include #include @@ -771,30 +771,15 @@ static void window_track_list_scrollpaint(rct_window* w, rct_drawpixelinfo* dpi, static void track_list_load_designs(RideSelection item) { auto repo = OpenRCT2::GetContext()->GetTrackDesignRepository(); - if (RideTypeDescriptors[item.Type].HasFlag(RIDE_TYPE_FLAG_HAS_RIDE_GROUPS)) + std::string entryName; + if (item.Type < 0x80) { - auto rideEntry = get_ride_entry(item.EntryIndex); - if (rideEntry != nullptr) + if (RideTypeDescriptors[item.Type].HasFlag(RIDE_TYPE_FLAG_LIST_VEHICLES_SEPARATELY)) { - auto rideGroup = RideGroupManager::GetRideGroup(item.Type, rideEntry); - if (rideGroup != nullptr) - { - _trackDesigns = repo->GetItemsForRideGroup(item.Type, rideGroup); - } + entryName = get_ride_entry_name(item.EntryIndex); } } - else - { - std::string entryName; - if (item.Type < 0x80) - { - if (RideTypeDescriptors[item.Type].HasFlag(RIDE_TYPE_FLAG_LIST_VEHICLES_SEPARATELY)) - { - entryName = get_ride_entry_name(item.EntryIndex); - } - } - _trackDesigns = repo->GetItemsForObjectEntry(item.Type, entryName); - } + _trackDesigns = repo->GetItemsForObjectEntry(item.Type, entryName); window_track_list_filter_list(); } diff --git a/src/openrct2/actions/TrackDesignAction.cpp b/src/openrct2/actions/TrackDesignAction.cpp index ba4f138bde..3e3919302f 100644 --- a/src/openrct2/actions/TrackDesignAction.cpp +++ b/src/openrct2/actions/TrackDesignAction.cpp @@ -14,7 +14,6 @@ #include "../management/Research.h" #include "../object/ObjectManager.h" #include "../object/ObjectRepository.h" -#include "../ride/RideGroupManager.h" #include "../ride/TrackDesign.h" #include "RideCreateAction.hpp" #include "RideDemolishAction.hpp" @@ -56,35 +55,6 @@ GameActionResult::Ptr TrackDesignAction::Query() const entryIndex = OBJECT_ENTRY_INDEX_NULL; } - // The rest of the cases are handled by the code in ride_create() - if (RideTypeDescriptors[_td.type].HasFlag(RIDE_TYPE_FLAG_HAS_RIDE_GROUPS) && entryIndex == OBJECT_ENTRY_INDEX_NULL) - { - const ObjectRepositoryItem* ori = object_repository_find_object_by_name(rideEntryObject->name); - if (ori != nullptr) - { - uint8_t rideGroupIndex = ori->RideInfo.RideGroupIndex; - const RideGroup* td6RideGroup = RideGroupManager::RideGroupFind(_td.type, rideGroupIndex); - - auto& objManager = OpenRCT2::GetContext()->GetObjectManager(); - auto& rideEntries = objManager.GetAllRideEntries(_td.type); - for (auto rideEntryIndex : rideEntries) - { - if (!ride_entry_is_invented(rideEntryIndex) && !gCheatsIgnoreResearchStatus) - { - continue; - } - - auto rideEntry = get_ride_entry(rideEntryIndex); - auto rideGroup = RideGroupManager::GetRideGroup(_td.type, rideEntry); - if (td6RideGroup->Equals(rideGroup)) - { - entryIndex = rideEntryIndex; - break; - } - } - } - } - // Colours do not matter as will be overwritten auto rideCreateAction = RideCreateAction(_td.type, entryIndex, 0, 0); rideCreateAction.SetFlags(GetFlags()); @@ -148,35 +118,6 @@ GameActionResult::Ptr TrackDesignAction::Execute() const entryIndex = OBJECT_ENTRY_INDEX_NULL; } - // The rest of the cases are handled by the code in ride_create() - if (RideTypeDescriptors[_td.type].HasFlag(RIDE_TYPE_FLAG_HAS_RIDE_GROUPS) && entryIndex == OBJECT_ENTRY_INDEX_NULL) - { - const ObjectRepositoryItem* ori = object_repository_find_object_by_name(rideEntryObject->name); - if (ori != nullptr) - { - uint8_t rideGroupIndex = ori->RideInfo.RideGroupIndex; - const RideGroup* td6RideGroup = RideGroupManager::RideGroupFind(_td.type, rideGroupIndex); - - auto& objManager = OpenRCT2::GetContext()->GetObjectManager(); - auto& rideEntries = objManager.GetAllRideEntries(_td.type); - for (auto rideEntryIndex : rideEntries) - { - if (!ride_entry_is_invented(rideEntryIndex) && !gCheatsIgnoreResearchStatus) - { - continue; - } - - auto rideEntry = get_ride_entry(rideEntryIndex); - auto rideGroup = RideGroupManager::GetRideGroup(_td.type, rideEntry); - if (td6RideGroup->Equals(rideGroup)) - { - entryIndex = rideEntryIndex; - break; - } - } - } - } - // Colours do not matter as will be overwritten auto rideCreateAction = RideCreateAction(_td.type, entryIndex, 0, 0); rideCreateAction.SetFlags(GetFlags()); diff --git a/src/openrct2/actions/TrackPlaceAction.hpp b/src/openrct2/actions/TrackPlaceAction.hpp index 1ecae14ae7..a788e40778 100644 --- a/src/openrct2/actions/TrackPlaceAction.hpp +++ b/src/openrct2/actions/TrackPlaceAction.hpp @@ -10,7 +10,7 @@ #pragma once #include "../management/Finance.h" -#include "../ride/RideGroupManager.h" +#include "../ride/RideData.h" #include "../ride/Track.h" #include "../ride/TrackData.h" #include "../ride/TrackDesign.h" @@ -390,11 +390,6 @@ public: { maxHeight = rideEntry->max_height; } - else if (RideTypeDescriptors[ride->type].HasFlag(RIDE_TYPE_FLAG_HAS_RIDE_GROUPS)) - { - const RideGroup* rideGroup = RideGroupManager::GetRideGroup(ride->type, rideEntry); - maxHeight = rideGroup->MaximumHeight; - } else { maxHeight = RideTypeDescriptors[ride->type].Heights.MaxHeight; diff --git a/src/openrct2/actions/TrackRemoveAction.hpp b/src/openrct2/actions/TrackRemoveAction.hpp index 11bb62b852..7554d54603 100644 --- a/src/openrct2/actions/TrackRemoveAction.hpp +++ b/src/openrct2/actions/TrackRemoveAction.hpp @@ -10,7 +10,7 @@ #pragma once #include "../management/Finance.h" -#include "../ride/RideGroupManager.h" +#include "../ride/RideData.h" #include "../ride/Track.h" #include "../ride/TrackData.h" #include "../ride/TrackDesign.h" diff --git a/src/openrct2/actions/WallPlaceAction.hpp b/src/openrct2/actions/WallPlaceAction.hpp index fb7a68e897..00aa9f8ffe 100644 --- a/src/openrct2/actions/WallPlaceAction.hpp +++ b/src/openrct2/actions/WallPlaceAction.hpp @@ -11,7 +11,7 @@ #include "../OpenRCT2.h" #include "../management/Finance.h" -#include "../ride/RideGroupManager.h" +#include "../ride/RideData.h" #include "../ride/Track.h" #include "../ride/TrackData.h" #include "../ride/TrackDesign.h" @@ -468,24 +468,7 @@ private: return false; } - if (RideTypeDescriptors[ride->type].HasFlag(RIDE_TYPE_FLAG_HAS_RIDE_GROUPS)) - { - auto rideEntry = get_ride_entry(ride->subtype); - if (rideEntry == nullptr) - { - return false; - } - auto rideGroup = RideGroupManager::GetRideGroup(ride->type, rideEntry); - if (rideGroup == nullptr) - { - return false; - } - if (!(rideGroup->Flags & RIDE_GROUP_FLAG_ALLOW_DOORS_ON_TRACK)) - { - return false; - } - } - else if (!(RideTypeDescriptors[ride->type].Flags & RIDE_TYPE_FLAG_ALLOW_DOORS_ON_TRACK)) + if (!(RideTypeDescriptors[ride->type].Flags & RIDE_TYPE_FLAG_ALLOW_DOORS_ON_TRACK)) { return false; } diff --git a/src/openrct2/actions/WallSetColourAction.hpp b/src/openrct2/actions/WallSetColourAction.hpp index 9ac7ac3d25..5bd563f579 100644 --- a/src/openrct2/actions/WallSetColourAction.hpp +++ b/src/openrct2/actions/WallSetColourAction.hpp @@ -11,7 +11,6 @@ #include "../OpenRCT2.h" #include "../management/Finance.h" -#include "../ride/RideGroupManager.h" #include "../ride/Track.h" #include "../ride/TrackData.h" #include "../world/Banner.h" diff --git a/src/openrct2/drawing/LightFX.cpp b/src/openrct2/drawing/LightFX.cpp index 1646a3b601..4528527850 100644 --- a/src/openrct2/drawing/LightFX.cpp +++ b/src/openrct2/drawing/LightFX.cpp @@ -727,6 +727,7 @@ void lightfx_add_lights_magic_vehicle(const Vehicle* vehicle) break; case RIDE_TYPE_BOAT_HIRE: case RIDE_TYPE_CAR_RIDE: + case RIDE_TYPE_MONSTER_TRUCKS: case RIDE_TYPE_GO_KARTS: case RIDE_TYPE_DODGEMS: case RIDE_TYPE_MINI_HELICOPTERS: diff --git a/src/openrct2/libopenrct2.vcxproj b/src/openrct2/libopenrct2.vcxproj index b65f8a4704..15ce7c8d7d 100644 --- a/src/openrct2/libopenrct2.vcxproj +++ b/src/openrct2/libopenrct2.vcxproj @@ -345,7 +345,6 @@ - @@ -627,6 +626,7 @@ + @@ -685,7 +685,6 @@ - diff --git a/src/openrct2/localisation/StringIds.h b/src/openrct2/localisation/StringIds.h index ed96a21580..43903e8c7c 100644 --- a/src/openrct2/localisation/StringIds.h +++ b/src/openrct2/localisation/StringIds.h @@ -162,7 +162,7 @@ enum STR_RIDE_DESCRIPTION_FIRST_AID = 560, STR_RIDE_DESCRIPTION_CIRCUS_SHOW = 561, STR_RIDE_DESCRIPTION_GHOST_TRAIN = 562, - STR_RIDE_DESCRIPTION_TWISTER_ROLLER_COASTER = 563, + STR_RIDE_DESCRIPTION_HYPER_TWISTER = 563, STR_RIDE_DESCRIPTION_WOODEN_ROLLER_COASTER = 564, STR_RIDE_DESCRIPTION_SIDE_FRICTION_ROLLER_COASTER = 565, STR_RIDE_DESCRIPTION_WILD_MOUSE = 566, @@ -3544,22 +3544,14 @@ enum STR_CHEAT_DISABLE_RIDE_VALUE_AGING_TIP = 6102, STR_OPTION_DISABLED_DURING_NETWORK_PLAY = 6103, - STR_CORKSCREW_RC_GROUP = 6104, - STR_HYPERCOASTER_GROUP = 6105, - STR_CAR_RIDE_GROUP = 6106, - STR_MONSTER_TRUCKS_GROUP = 6107, - STR_STEEL_TWISTER_GROUP = 6108, - STR_HYPER_TWISTER_GROUP = 6109, - STR_JUNIOR_RC_GROUP = 6110, - STR_CLASSIC_MINI_COASTER_GROUP = 6111, - STR_CORKSCREW_RC_GROUP_DESC = 6112, - STR_HYPERCOASTER_GROUP_DESC = 6113, - STR_CAR_RIDE_GROUP_DESC = 6114, - STR_MONSTER_TRUCKS_GROUP_DESC = 6115, - STR_STEEL_TWISTER_GROUP_DESC = 6116, - STR_HYPER_TWISTER_GROUP_DESC = 6117, - STR_JUNIOR_RC_GROUP_DESC = 6118, - STR_CLASSIC_MINI_COASTER_GROUP_DESC = 6119, + STR_RIDE_NAME_HYPERCOASTER = 6105, + STR_RIDE_NAME_MONSTER_TRUCKS = 6107, + STR_RIDE_NAME_HYPER_TWISTER = 6109, + STR_RIDE_NAME_CLASSIC_MINI_ROLLER_COASTER = 6111, + STR_RIDE_DESCRIPTION_HYPERCOASTER = 6113, + STR_RIDE_DESCRIPTION_MONSTER_TRUCKS_GROUP = 6115, + STR_RIDE_DESCRIPTION_TWISTER_ROLLER_COASTER = 6116, + STR_RIDE_DESCRIPTION_CLASSIC_MINI_COASTER = 6119, STR_NEWS_ITEM_RESEARCH_NEW_VEHICLE_AVAILABLE = 6120, diff --git a/src/openrct2/management/Research.cpp b/src/openrct2/management/Research.cpp index db8caaa443..87fd1ff4fb 100644 --- a/src/openrct2/management/Research.cpp +++ b/src/openrct2/management/Research.cpp @@ -23,7 +23,6 @@ #include "../rct1/RCT1.h" #include "../ride/Ride.h" #include "../ride/RideData.h" -#include "../ride/RideGroupManager.h" #include "../ride/TrackData.h" #include "../scenario/Scenario.h" #include "../util/Util.h" @@ -243,7 +242,7 @@ void research_finish_item(ResearchItem* researchItem) auto ft = Formatter::Common(); - // If a vehicle is the first to be invented for its ride type or group, show the ride type/group name. + // If a vehicle is the first to be invented for its ride type, show the ride type/group name. // Independently listed vehicles (like all flat rides and shops) should always be announced as such. if (RideTypeDescriptors[base_ride_type].HasFlag(RIDE_TYPE_FLAG_LIST_VEHICLES_SEPARATELY) || researchItem->flags & RESEARCH_ENTRY_FLAG_FIRST_OF_TYPE) @@ -892,7 +891,6 @@ bool ResearchItem::Exists() const } static std::bitset _seenRideType = {}; -static std::bitset _seenRideGroup = {}; static void research_update_first_of_type(ResearchItem* researchItem) { @@ -916,27 +914,10 @@ static void research_update_first_of_type(ResearchItem* researchItem) return; } - if (!rtd.HasFlag(RIDE_TYPE_FLAG_HAS_RIDE_GROUPS)) - { - if (!_seenRideType[rideType]) - researchItem->flags |= RESEARCH_ENTRY_FLAG_FIRST_OF_TYPE; + if (!_seenRideType[rideType]) + researchItem->flags |= RESEARCH_ENTRY_FLAG_FIRST_OF_TYPE; - _seenRideType[rideType] = true; - } - else - { - const auto& entry = get_ride_entry(researchItem->entryIndex); - if (entry != nullptr) - { - auto rideGroupIndex = RideGroupManager::GetRideGroupIndex(rideType, entry); - assert(rideGroupIndex < MAX_RIDE_GROUPS_PER_RIDE_TYPE); - - if (!_seenRideGroup[rideType * rideGroupIndex]) - researchItem->flags |= RESEARCH_ENTRY_FLAG_FIRST_OF_TYPE; - - _seenRideGroup[rideType * rideGroupIndex] = true; - } - } + _seenRideType[rideType] = true; } static void research_mark_ride_type_as_seen(const ResearchItem& researchItem) @@ -945,27 +926,12 @@ static void research_mark_ride_type_as_seen(const ResearchItem& researchItem) if (rideType >= RIDE_TYPE_COUNT) return; - const auto& rtd = RideTypeDescriptors[rideType]; - if (!rtd.HasFlag(RIDE_TYPE_FLAG_HAS_RIDE_GROUPS)) - { - _seenRideType[rideType] = true; - } - else - { - const auto& entry = get_ride_entry(researchItem.entryIndex); - if (entry != nullptr) - { - auto rideGroupIndex = RideGroupManager::GetRideGroupIndex(rideType, entry); - assert(rideGroupIndex < MAX_RIDE_GROUPS_PER_RIDE_TYPE); - _seenRideGroup[rideType * rideGroupIndex] = true; - } - } + _seenRideType[rideType] = true; } void research_determine_first_of_type() { _seenRideType.reset(); - _seenRideGroup.reset(); for (const auto& researchItem : gResearchItemsInvented) { diff --git a/src/openrct2/management/Research.h b/src/openrct2/management/Research.h index 384d6f6155..93d3be228f 100644 --- a/src/openrct2/management/Research.h +++ b/src/openrct2/management/Research.h @@ -79,7 +79,7 @@ struct ResearchItem { retItem.entryIndex = OpenRCT2EntryIndexToRCTEntryIndex(entryIndex); retItem.baseRideType = baseRideType; - retItem.type = type; + retItem.type = OpenRCT2RideTypeToRCT2RideType(type); retItem.flags = (flags & ~RESEARCH_ENTRY_FLAG_FIRST_OF_TYPE); retItem.category = category; } @@ -101,7 +101,7 @@ struct ResearchItem { entryIndex = RCTEntryIndexToOpenRCT2EntryIndex(oldResearchItem.entryIndex); baseRideType = oldResearchItem.baseRideType; - type = oldResearchItem.type; + type = RCT2RideTypeToOpenRCT2RideType(oldResearchItem.type, get_ride_entry(entryIndex)); flags = oldResearchItem.flags; category = oldResearchItem.category; } diff --git a/src/openrct2/object/ObjectRepository.cpp b/src/openrct2/object/ObjectRepository.cpp index e7dd39e33d..aea733f6ef 100644 --- a/src/openrct2/object/ObjectRepository.cpp +++ b/src/openrct2/object/ObjectRepository.cpp @@ -74,7 +74,7 @@ class ObjectFileIndex final : public FileIndex { private: static constexpr uint32_t MAGIC_NUMBER = 0x5844494F; // OIDX - static constexpr uint16_t VERSION = 19; + static constexpr uint16_t VERSION = 20; static constexpr auto PATTERN = "*.dat;*.pob;*.json;*.parkobj"; IObjectRepository& _objectRepository; @@ -147,7 +147,6 @@ protected: { stream->WriteValue(item.RideInfo.RideType[i]); } - stream->WriteValue(item.RideInfo.RideGroupIndex); break; case OBJECT_TYPE_SCENERY_GROUP: stream->WriteValue(static_cast(item.SceneryGroupInfo.Entries.size())); @@ -185,7 +184,6 @@ protected: { item.RideInfo.RideType[i] = stream->ReadValue(); } - item.RideInfo.RideGroupIndex = stream->ReadValue(); break; case OBJECT_TYPE_SCENERY_GROUP: { diff --git a/src/openrct2/object/ObjectRepository.h b/src/openrct2/object/ObjectRepository.h index 2966d06deb..2dc1665a0c 100644 --- a/src/openrct2/object/ObjectRepository.h +++ b/src/openrct2/object/ObjectRepository.h @@ -43,7 +43,6 @@ struct ObjectRepositoryItem uint8_t RideFlags; uint8_t RideCategory[MAX_CATEGORIES_PER_RIDE]; uint8_t RideType[MAX_RIDE_TYPES_PER_RIDE_ENTRY]; - uint8_t RideGroupIndex; } RideInfo; struct { diff --git a/src/openrct2/object/RideObject.cpp b/src/openrct2/object/RideObject.cpp index 0e24cce3ea..ed8ca30d60 100644 --- a/src/openrct2/object/RideObject.cpp +++ b/src/openrct2/object/RideObject.cpp @@ -20,7 +20,7 @@ #include "../localisation/Language.h" #include "../rct2/RCT2.h" #include "../ride/Ride.h" -#include "../ride/RideGroupManager.h" +#include "../ride/RideData.h" #include "../ride/ShopItem.h" #include "../ride/Track.h" #include "ObjectJsonHelpers.h" @@ -32,6 +32,18 @@ using namespace OpenRCT2; +static void RideObjectUpdateRideType(rct_ride_entry* rideEntry) +{ + for (auto i = 0; i < MAX_RIDE_TYPES_PER_RIDE_ENTRY; i++) + { + auto oldRideType = rideEntry->ride_type[i]; + if (oldRideType != RIDE_TYPE_NULL) + { + rideEntry->ride_type[i] = RCT2RideTypeToOpenRCT2RideType(oldRideType, rideEntry); + } + } +} + void RideObject::ReadLegacy(IReadObjectContext* context, IStream* stream) { stream->Seek(8, STREAM_SEEK_CURRENT); @@ -163,6 +175,7 @@ void RideObject::ReadLegacy(IReadObjectContext* context, IStream* stream) { context->LogError(OBJECT_ERROR_INVALID_PROPERTY, "Nausea multiplier too high."); } + RideObjectUpdateRideType(&_legacyType); } void RideObject::Load() @@ -399,7 +412,6 @@ void RideObject::SetRepositoryItem(ObjectRepositoryItem* item) const } item->RideInfo.RideFlags = 0; - item->RideInfo.RideGroupIndex = RideGroupManager::GetRideGroupIndex(firstRideType, &_legacyType); } void RideObject::ReadLegacyVehicle( @@ -619,6 +631,7 @@ void RideObject::ReadJson(IReadObjectContext* context, const json_t* root) { "disablePainting", RIDE_ENTRY_FLAG_DISABLE_COLOUR_TAB }, }); + RideObjectUpdateRideType(&_legacyType); ObjectJsonHelpers::LoadStrings(root, GetStringTable()); ObjectJsonHelpers::LoadImages(context, root, GetImageTable()); } diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index a3882ea2b6..1c21a0a8c9 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -710,7 +710,7 @@ private: } else { - dst->type = RCT1::GetRideType(src->type); + dst->type = RCT1::GetRideType(src->type, src->vehicle_type); } if (RCT1::RideTypeUsesVehicles(src->type)) diff --git a/src/openrct2/rct1/T4Importer.cpp b/src/openrct2/rct1/T4Importer.cpp index dbdb4b752e..5d066bb32f 100644 --- a/src/openrct2/rct1/T4Importer.cpp +++ b/src/openrct2/rct1/T4Importer.cpp @@ -18,6 +18,7 @@ #include "../rct12/SawyerChunkReader.h" #include "../rct12/SawyerEncoding.h" #include "../ride/Ride.h" +#include "../ride/RideData.h" #include "../ride/TrackDesign.h" #include "../ride/TrackDesignRepository.h" @@ -136,7 +137,7 @@ private: std::unique_ptr ImportTD4Base(std::unique_ptr td, rct_track_td4& td4Base) { - td->type = RCT1::GetRideType(td4Base.type); + td->type = RCT1::GetRideType(td4Base.type, td4Base.vehicle_type); // All TD4s that use powered launch use the type that doesn't pass the station. td->ride_mode = td4Base.mode; diff --git a/src/openrct2/rct1/Tables.cpp b/src/openrct2/rct1/Tables.cpp index 137b7eb8a7..8e95771bf2 100644 --- a/src/openrct2/rct1/Tables.cpp +++ b/src/openrct2/rct1/Tables.cpp @@ -164,95 +164,100 @@ namespace RCT1 return map[terrainEdge]; } - uint8_t GetRideType(uint8_t rideType) + uint8_t GetRideType(uint8_t rideType, uint8_t vehicleType) { + if (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) + return RIDE_TYPE_HYPERCOASTER; + static uint8_t map[] = { - RIDE_TYPE_WOODEN_ROLLER_COASTER, - RIDE_TYPE_STAND_UP_ROLLER_COASTER, - RIDE_TYPE_SUSPENDED_SWINGING_COASTER, - RIDE_TYPE_INVERTED_ROLLER_COASTER, - RIDE_TYPE_JUNIOR_ROLLER_COASTER, - RIDE_TYPE_MINIATURE_RAILWAY, - RIDE_TYPE_MONORAIL, - RIDE_TYPE_MINI_SUSPENDED_COASTER, - RIDE_TYPE_BOAT_HIRE, - RIDE_TYPE_WOODEN_WILD_MOUSE, - RIDE_TYPE_STEEPLECHASE, - RIDE_TYPE_CAR_RIDE, - RIDE_TYPE_LAUNCHED_FREEFALL, - RIDE_TYPE_BOBSLEIGH_COASTER, - RIDE_TYPE_OBSERVATION_TOWER, - RIDE_TYPE_LOOPING_ROLLER_COASTER, - RIDE_TYPE_DINGHY_SLIDE, - RIDE_TYPE_MINE_TRAIN_COASTER, - RIDE_TYPE_CHAIRLIFT, - RIDE_TYPE_CORKSCREW_ROLLER_COASTER, - RIDE_TYPE_MAZE, - RIDE_TYPE_SPIRAL_SLIDE, - RIDE_TYPE_GO_KARTS, - RIDE_TYPE_LOG_FLUME, - RIDE_TYPE_RIVER_RAPIDS, - RIDE_TYPE_DODGEMS, - RIDE_TYPE_SWINGING_SHIP, - RIDE_TYPE_SWINGING_INVERTER_SHIP, - RIDE_TYPE_FOOD_STALL, - RIDE_TYPE_FOOD_STALL, - RIDE_TYPE_DRINK_STALL, - RIDE_TYPE_FOOD_STALL, - RIDE_TYPE_SHOP, - RIDE_TYPE_MERRY_GO_ROUND, - RIDE_TYPE_SHOP, - RIDE_TYPE_INFORMATION_KIOSK, - RIDE_TYPE_TOILETS, - RIDE_TYPE_FERRIS_WHEEL, - RIDE_TYPE_MOTION_SIMULATOR, - RIDE_TYPE_3D_CINEMA, - RIDE_TYPE_TOP_SPIN, - RIDE_TYPE_SPACE_RINGS, - RIDE_TYPE_REVERSE_FREEFALL_COASTER, - RIDE_TYPE_SHOP, - RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER, - RIDE_TYPE_FOOD_STALL, - RIDE_TYPE_TWIST, - RIDE_TYPE_HAUNTED_HOUSE, - RIDE_TYPE_FOOD_STALL, - RIDE_TYPE_CIRCUS, - RIDE_TYPE_GHOST_TRAIN, - RIDE_TYPE_TWISTER_ROLLER_COASTER, - RIDE_TYPE_WOODEN_ROLLER_COASTER, - RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER, - RIDE_TYPE_STEEL_WILD_MOUSE, - RIDE_TYPE_FOOD_STALL, - RIDE_TYPE_FOOD_STALL, - RIDE_TYPE_SHOP, - RIDE_TYPE_FOOD_STALL, - RIDE_TYPE_VIRGINIA_REEL, - RIDE_TYPE_SPLASH_BOATS, - RIDE_TYPE_MINI_HELICOPTERS, - RIDE_TYPE_LAY_DOWN_ROLLER_COASTER, - RIDE_TYPE_SUSPENDED_MONORAIL, - RIDE_TYPE_NULL, - RIDE_TYPE_REVERSER_ROLLER_COASTER, - RIDE_TYPE_HEARTLINE_TWISTER_COASTER, - RIDE_TYPE_MINI_GOLF, - RIDE_TYPE_NULL, - RIDE_TYPE_ROTO_DROP, - RIDE_TYPE_FLYING_SAUCERS, - RIDE_TYPE_CROOKED_HOUSE, - RIDE_TYPE_MONORAIL_CYCLES, - RIDE_TYPE_COMPACT_INVERTED_COASTER, - RIDE_TYPE_WATER_COASTER, - RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER, - RIDE_TYPE_INVERTED_HAIRPIN_COASTER, - RIDE_TYPE_BOAT_HIRE, - RIDE_TYPE_SHOP, - RIDE_TYPE_RIVER_RAFTS, - RIDE_TYPE_FOOD_STALL, - RIDE_TYPE_ENTERPRISE, - RIDE_TYPE_DRINK_STALL, - RIDE_TYPE_FOOD_STALL, - RIDE_TYPE_DRINK_STALL + RIDE_TYPE_WOODEN_ROLLER_COASTER, // RCT1_RIDE_TYPE_WOODEN_ROLLER_COASTER + RIDE_TYPE_STAND_UP_ROLLER_COASTER, // RCT1_RIDE_TYPE_STAND_UP_STEEL_ROLLER_COASTER + RIDE_TYPE_SUSPENDED_SWINGING_COASTER, // RCT1_RIDE_TYPE_SUSPENDED_ROLLER_COASTER + RIDE_TYPE_INVERTED_ROLLER_COASTER, // RCT1_RIDE_TYPE_INVERTED_ROLLER_COASTER + RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER, // RCT1_RIDE_TYPE_STEEL_MINI_ROLLER_COASTER + RIDE_TYPE_MINIATURE_RAILWAY, // RCT1_RIDE_TYPE_MINIATURE_RAILWAY + RIDE_TYPE_MONORAIL, // RCT1_RIDE_TYPE_MONORAIL + RIDE_TYPE_MINI_SUSPENDED_COASTER, // RCT1_RIDE_TYPE_SUSPENDED_SINGLE_RAIL_ROLLER_COASTER + RIDE_TYPE_BOAT_HIRE, // RCT1_RIDE_TYPE_BOAT_HIRE + RIDE_TYPE_WOODEN_WILD_MOUSE, // RCT1_RIDE_TYPE_WOODEN_CRAZY_RODENT_ROLLER_COASTER + RIDE_TYPE_STEEPLECHASE, // RCT1_RIDE_TYPE_SINGLE_RAIL_ROLLER_COASTER + RIDE_TYPE_CAR_RIDE, // RCT1_RIDE_TYPE_CAR_RIDE + RIDE_TYPE_LAUNCHED_FREEFALL, // RCT1_RIDE_TYPE_LAUNCHED_FREEFALL + RIDE_TYPE_BOBSLEIGH_COASTER, // RCT1_RIDE_TYPE_BOBSLED_ROLLER_COASTER + RIDE_TYPE_OBSERVATION_TOWER, // RCT1_RIDE_TYPE_OBSERVATION_TOWER + RIDE_TYPE_LOOPING_ROLLER_COASTER, // RCT1_RIDE_TYPE_STEEL_ROLLER_COASTER + RIDE_TYPE_DINGHY_SLIDE, // RCT1_RIDE_TYPE_WATER_SLIDE + RIDE_TYPE_MINE_TRAIN_COASTER, // RCT1_RIDE_TYPE_MINE_TRAIN_ROLLER_COASTER + RIDE_TYPE_CHAIRLIFT, // RCT1_RIDE_TYPE_CHAIRLIFT + RIDE_TYPE_CORKSCREW_ROLLER_COASTER, // RCT1_RIDE_TYPE_STEEL_CORKSCREW_ROLLER_COASTER + RIDE_TYPE_MAZE, // RCT1_RIDE_TYPE_HEDGE_MAZE + RIDE_TYPE_SPIRAL_SLIDE, // RCT1_RIDE_TYPE_SPIRAL_SLIDE + RIDE_TYPE_GO_KARTS, // RCT1_RIDE_TYPE_GO_KARTS + RIDE_TYPE_LOG_FLUME, // RCT1_RIDE_TYPE_LOG_FLUME + RIDE_TYPE_RIVER_RAPIDS, // RCT1_RIDE_TYPE_RIVER_RAPIDS + RIDE_TYPE_DODGEMS, // RCT1_RIDE_TYPE_DODGEMS + RIDE_TYPE_SWINGING_SHIP, // RCT1_RIDE_TYPE_SWINGING_SHIP + RIDE_TYPE_SWINGING_INVERTER_SHIP, // RCT1_RIDE_TYPE_SWINGING_INVERTER_SHIP + RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_ICE_CREAM_STALL + RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_CHIPS_STALL + RIDE_TYPE_DRINK_STALL, // RCT1_RIDE_TYPE_DRINK_STALL + RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_CANDYFLOSS_STALL + RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_BURGER_BAR + RIDE_TYPE_MERRY_GO_ROUND, // RCT1_RIDE_TYPE_MERRY_GO_ROUND + RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_BALLOON_STALL + RIDE_TYPE_INFORMATION_KIOSK, // RCT1_RIDE_TYPE_INFORMATION_KIOSK + RIDE_TYPE_TOILETS, // RCT1_RIDE_TYPE_TOILETS + RIDE_TYPE_FERRIS_WHEEL, // RCT1_RIDE_TYPE_FERRIS_WHEEL + RIDE_TYPE_MOTION_SIMULATOR, // RCT1_RIDE_TYPE_MOTION_SIMULATOR + RIDE_TYPE_3D_CINEMA, // RCT1_RIDE_TYPE_3D_CINEMA + RIDE_TYPE_TOP_SPIN, // RCT1_RIDE_TYPE_TOP_SPIN + RIDE_TYPE_SPACE_RINGS, // RCT1_RIDE_TYPE_SPACE_RINGS + RIDE_TYPE_REVERSE_FREEFALL_COASTER, // RCT1_RIDE_TYPE_REVERSE_FREEFALL_ROLLER_COASTER + RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_SOUVENIR_STALL + RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER, // RCT1_RIDE_TYPE_VERTICAL_ROLLER_COASTER + RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_PIZZA_STALL + RIDE_TYPE_TWIST, // RCT1_RIDE_TYPE_TWIST + RIDE_TYPE_HAUNTED_HOUSE, // RCT1_RIDE_TYPE_HAUNTED_HOUSE + RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_POPCORN_STALL + RIDE_TYPE_CIRCUS, // RCT1_RIDE_TYPE_CIRCUS + RIDE_TYPE_GHOST_TRAIN, // RCT1_RIDE_TYPE_GHOST_TRAIN + RIDE_TYPE_TWISTER_ROLLER_COASTER, // RCT1_RIDE_TYPE_STEEL_TWISTER_ROLLER_COASTER + RIDE_TYPE_WOODEN_ROLLER_COASTER, // RCT1_RIDE_TYPE_WOODEN_TWISTER_ROLLER_COASTER + RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER, // RCT1_RIDE_TYPE_WOODEN_SIDE_FRICTION_ROLLER_COASTER + RIDE_TYPE_STEEL_WILD_MOUSE, // RCT1_RIDE_TYPE_STEEL_WILD_MOUSE_ROLLER_COASTER + RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_HOT_DOG_STALL + RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_EXOTIC_SEA_FOOD_STALL + RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_HAT_STALL + RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_TOFFEE_APPLE_STALL + RIDE_TYPE_VIRGINIA_REEL, // RCT1_RIDE_TYPE_VIRGINIA_REEL + RIDE_TYPE_SPLASH_BOATS, // RCT1_RIDE_TYPE_RIVER_RIDE + RIDE_TYPE_MINI_HELICOPTERS, // RCT1_RIDE_TYPE_CYCLE_MONORAIL + RIDE_TYPE_LAY_DOWN_ROLLER_COASTER, // RCT1_RIDE_TYPE_FLYING_ROLLER_COASTER + RIDE_TYPE_SUSPENDED_MONORAIL, // RCT1_RIDE_TYPE_SUSPENDED_MONORAIL + RIDE_TYPE_NULL, // RCT1_RIDE_TYPE_40 + RIDE_TYPE_REVERSER_ROLLER_COASTER, // RCT1_RIDE_TYPE_WOODEN_REVERSER_ROLLER_COASTER + RIDE_TYPE_HEARTLINE_TWISTER_COASTER, // RCT1_RIDE_TYPE_HEARTLINE_TWISTER_ROLLER_COASTER + RIDE_TYPE_MINI_GOLF, // RCT1_RIDE_TYPE_MINIATURE_GOLF + RIDE_TYPE_NULL, // RCT1_RIDE_TYPE_44 + RIDE_TYPE_ROTO_DROP, // RCT1_RIDE_TYPE_ROTO_DROP + RIDE_TYPE_FLYING_SAUCERS, // RCT1_RIDE_TYPE_FLYING_SAUCERS + RIDE_TYPE_CROOKED_HOUSE, // RCT1_RIDE_TYPE_CROOKED_HOUSE + RIDE_TYPE_MONORAIL_CYCLES, // RCT1_RIDE_TYPE_CYCLE_RAILWAY + RIDE_TYPE_COMPACT_INVERTED_COASTER, // RCT1_RIDE_TYPE_SUSPENDED_LOOPING_ROLLER_COASTER + RIDE_TYPE_WATER_COASTER, // RCT1_RIDE_TYPE_WATER_COASTER + RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER, // RCT1_RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER + RIDE_TYPE_INVERTED_HAIRPIN_COASTER, // RCT1_RIDE_TYPE_INVERTED_WILD_MOUSE_COASTER + RIDE_TYPE_BOAT_HIRE, // RCT1_RIDE_TYPE_JET_SKIS + RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_T_SHIRT_STALL + RIDE_TYPE_RIVER_RAFTS, // RCT1_RIDE_TYPE_RAFT_RIDE + RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_DOUGHNUT_SHOP + RIDE_TYPE_ENTERPRISE, // RCT1_RIDE_TYPE_ENTERPRISE + RIDE_TYPE_DRINK_STALL, // RCT1_RIDE_TYPE_COFFEE_SHOP + RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_FRIED_CHICKEN_STALL + RIDE_TYPE_DRINK_STALL, // RCT1_RIDE_TYPE_LEMONADE_STALL }; Guard::ArgumentInRange(rideType, 0, std::size(map), "Unsupported RCT1 ride type."); diff --git a/src/openrct2/rct1/Tables.h b/src/openrct2/rct1/Tables.h index 3fccd2bc11..77b5c1b642 100644 --- a/src/openrct2/rct1/Tables.h +++ b/src/openrct2/rct1/Tables.h @@ -26,7 +26,7 @@ namespace RCT1 uint8_t GetTerrain(uint8_t terrain); uint8_t GetTerrainEdge(uint8_t terrainEdge); - uint8_t GetRideType(uint8_t rideType); + uint8_t GetRideType(uint8_t rideType, uint8_t vehicleType); RCT1VehicleColourSchemeCopyDescriptor GetColourSchemeCopyDescriptor(uint8_t vehicleType); bool RideTypeUsesVehicles(uint8_t rideType); bool PathIsQueue(uint8_t pathType); diff --git a/src/openrct2/rct2/RCT2.cpp b/src/openrct2/rct2/RCT2.cpp new file mode 100644 index 0000000000..a05e70c6bf --- /dev/null +++ b/src/openrct2/rct2/RCT2.cpp @@ -0,0 +1,69 @@ +/***************************************************************************** + * Copyright (c) 2014-2020 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. + *****************************************************************************/ + +#include "../object/Object.h" +#include "../ride/Ride.h" +#include "../ride/Track.h" + +#include + +ObjectEntryIndex RCT2RideTypeToOpenRCT2RideType(uint8_t rct2RideType, const rct_ride_entry* rideEntry) +{ + switch (rct2RideType) + { + case RIDE_TYPE_CORKSCREW_ROLLER_COASTER: + if (rideEntry != nullptr && !(ride_entry_get_supported_track_pieces(rideEntry) & (1ULL << TRACK_VERTICAL_LOOP))) + return RIDE_TYPE_HYPERCOASTER; + else + return RIDE_TYPE_CORKSCREW_ROLLER_COASTER; + case RIDE_TYPE_JUNIOR_ROLLER_COASTER: + if (rideEntry != nullptr && ride_entry_get_supported_track_pieces(rideEntry) & (1ULL << TRACK_SLOPE_STEEP)) + return RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER; + else + return RIDE_TYPE_JUNIOR_ROLLER_COASTER; + case RIDE_TYPE_CAR_RIDE: + if (rideEntry != nullptr && ride_entry_get_supported_track_pieces(rideEntry) & (1ULL << TRACK_SLOPE_STEEP)) + return RIDE_TYPE_MONSTER_TRUCKS; + else + return RIDE_TYPE_CAR_RIDE; + case RIDE_TYPE_TWISTER_ROLLER_COASTER: + if (rideEntry != nullptr && rideEntry->flags & RIDE_ENTRY_FLAG_NO_INVERSIONS) + return RIDE_TYPE_HYPER_TWISTER; + else + return RIDE_TYPE_TWISTER_ROLLER_COASTER; + case RIDE_TYPE_STEEL_WILD_MOUSE: + if (rideEntry != nullptr && !(ride_entry_get_supported_track_pieces(rideEntry) & (1ULL << TRACK_SLOPE_STEEP))) + return RIDE_TYPE_SPINNING_WILD_MOUSE; + else + return RIDE_TYPE_STEEL_WILD_MOUSE; + + default: + return rct2RideType; + } +} + +uint8_t OpenRCT2RideTypeToRCT2RideType(ObjectEntryIndex openrct2Type) +{ + switch (openrct2Type) + { + case RIDE_TYPE_HYPERCOASTER: + return RIDE_TYPE_CORKSCREW_ROLLER_COASTER; + case RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER: + return RIDE_TYPE_JUNIOR_ROLLER_COASTER; + case RIDE_TYPE_MONSTER_TRUCKS: + return RIDE_TYPE_CAR_RIDE; + case RIDE_TYPE_HYPER_TWISTER: + return RIDE_TYPE_TWISTER_ROLLER_COASTER; + case RIDE_TYPE_SPINNING_WILD_MOUSE: + return RIDE_TYPE_STEEL_WILD_MOUSE; + + default: + return openrct2Type; + } +} diff --git a/src/openrct2/rct2/RCT2.h b/src/openrct2/rct2/RCT2.h index 09598ea66f..cb3a4d90de 100644 --- a/src/openrct2/rct2/RCT2.h +++ b/src/openrct2/rct2/RCT2.h @@ -349,7 +349,7 @@ assert_struct_size(rct_td6_scenery_element, 0x16); struct rct_track_td6 { uint8_t type; // 0x00 - uint8_t vehicle_type; + RCT12ObjectEntryIndex vehicle_type; union { // After loading the track this is converted to @@ -765,3 +765,5 @@ assert_struct_size(RCT2RideRatingCalculationData, 76); #pragma pack(pop) std::vector DecryptSea(const fs::path& path); +ObjectEntryIndex RCT2RideTypeToOpenRCT2RideType(uint8_t rct2RideType, const rct_ride_entry* rideEntry); +uint8_t OpenRCT2RideTypeToRCT2RideType(ObjectEntryIndex openrct2Type); diff --git a/src/openrct2/rct2/S6Exporter.cpp b/src/openrct2/rct2/S6Exporter.cpp index 408886bcbe..21397f71cd 100644 --- a/src/openrct2/rct2/S6Exporter.cpp +++ b/src/openrct2/rct2/S6Exporter.cpp @@ -500,7 +500,7 @@ void S6Exporter::ExportRide(rct2_ride* dst, const Ride* src) { std::memset(dst, 0, sizeof(rct2_ride)); - dst->type = src->type; + dst->type = OpenRCT2RideTypeToRCT2RideType(src->type); dst->subtype = src->subtype; // pad_002; dst->mode = src->mode; diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index e0692e0355..b41e41e475 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -507,8 +507,10 @@ public: { *dst = {}; dst->id = rideIndex; - dst->type = src->type; + dst->subtype = src->subtype; + auto* rideEntry = get_ride_entry(src->subtype); + dst->type = RCT2RideTypeToOpenRCT2RideType(src->type, rideEntry); // pad_002; dst->mode = src->mode; dst->colour_scheme_type = src->colour_scheme_type; diff --git a/src/openrct2/rct2/T6Importer.cpp b/src/openrct2/rct2/T6Importer.cpp index 9c95a3fbef..0e91a25da0 100644 --- a/src/openrct2/rct2/T6Importer.cpp +++ b/src/openrct2/rct2/T6Importer.cpp @@ -16,6 +16,7 @@ #include "../rct12/SawyerChunkReader.h" #include "../rct12/SawyerEncoding.h" #include "../ride/Ride.h" +#include "../ride/RideData.h" #include "../ride/TrackDesign.h" #include "../ride/TrackDesignRepository.h" diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 941f8c1c11..b4bd34ee61 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -56,7 +56,6 @@ #include "CableLift.h" #include "MusicList.h" #include "RideData.h" -#include "RideGroupManager.h" #include "ShopItem.h" #include "Station.h" #include "Track.h" @@ -5623,12 +5622,7 @@ void Ride::SetNameToDefault() */ RideNaming get_ride_naming(const uint8_t rideType, rct_ride_entry* rideEntry) { - if (RideTypeDescriptors[rideType].HasFlag(RIDE_TYPE_FLAG_HAS_RIDE_GROUPS)) - { - const RideGroup* rideGroup = RideGroupManager::GetRideGroup(rideType, rideEntry); - return rideGroup->Naming; - } - else if (!RideTypeDescriptors[rideType].HasFlag(RIDE_TYPE_FLAG_LIST_VEHICLES_SEPARATELY)) + if (!RideTypeDescriptors[rideType].HasFlag(RIDE_TYPE_FLAG_LIST_VEHICLES_SEPARATELY)) { return RideTypeDescriptors[rideType].Naming; } @@ -7633,18 +7627,6 @@ void Ride::FormatNameTo(Formatter& ft) const rideTypeName = rideEntry->naming.Name; } } - else if (RideTypeDescriptors[type].HasFlag(RIDE_TYPE_FLAG_HAS_RIDE_GROUPS)) - { - auto rideEntry = GetRideEntry(); - if (rideEntry != nullptr) - { - auto rideGroup = RideGroupManager::GetRideGroup(type, rideEntry); - if (rideGroup != nullptr) - { - rideTypeName = rideGroup->Naming.Name; - } - } - } ft.Add(1).Add(rideTypeName).Add(default_name_number); } } diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h index cce23d736d..2df2e406cf 100644 --- a/src/openrct2/ride/Ride.h +++ b/src/openrct2/ride/Ride.h @@ -621,6 +621,12 @@ enum RIDE_TYPE_59, RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER = 90, + RIDE_TYPE_HYPERCOASTER, + RIDE_TYPE_HYPER_TWISTER, + RIDE_TYPE_MONSTER_TRUCKS, + RIDE_TYPE_SPINNING_WILD_MOUSE, + RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER, + RIDE_TYPE_COUNT }; diff --git a/src/openrct2/ride/RideData.cpp b/src/openrct2/ride/RideData.cpp index cfd2396eff..a729334faa 100644 --- a/src/openrct2/ride/RideData.cpp +++ b/src/openrct2/ride/RideData.cpp @@ -29,11 +29,14 @@ #include "Track.h" #include "coaster/meta/AirPoweredVerticalCoaster.h" #include "coaster/meta/BobsleighCoaster.h" +#include "coaster/meta/ClassicMiniRollerCoaster.h" #include "coaster/meta/CompactInvertedCoaster.h" #include "coaster/meta/CorkscrewRollerCoaster.h" #include "coaster/meta/FlyingRollerCoaster.h" #include "coaster/meta/GigaCoaster.h" #include "coaster/meta/HeartlineTwisterCoaster.h" +#include "coaster/meta/HyperTwister.h" +#include "coaster/meta/Hypercoaster.h" #include "coaster/meta/InvertedHairpinCoaster.h" #include "coaster/meta/InvertedImpulseCoaster.h" #include "coaster/meta/InvertedRollerCoaster.h" @@ -49,6 +52,7 @@ #include "coaster/meta/ReverseFreefallCoaster.h" #include "coaster/meta/ReverserRollerCoaster.h" #include "coaster/meta/SideFrictionRollerCoaster.h" +#include "coaster/meta/SpinningWildMouse.h" #include "coaster/meta/SpiralRollerCoaster.h" #include "coaster/meta/StandUpRollerCoaster.h" #include "coaster/meta/SteelWildMouse.h" @@ -73,6 +77,7 @@ #include "gentle/meta/MiniGolf.h" #include "gentle/meta/MiniHelicopters.h" #include "gentle/meta/MonorailCycles.h" +#include "gentle/meta/MonsterTrucks.h" #include "gentle/meta/ObservationTower.h" #include "gentle/meta/SpaceRings.h" #include "gentle/meta/SpiralSlide.h" @@ -297,6 +302,11 @@ constexpr const RideTypeDescriptor RideTypeDescriptors[RIDE_TYPE_COUNT] = { /* RIDE_TYPE_MINE_RIDE */ MineRideRTD, /* RIDE_TYPE_59 */ DummyRTD, /* RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER */ LIMLaunchedRollerCoasterRTD, + /* RIDE_TYPE_HYPERCOASTER, */ HypercoasterRTD, + /* RIDE_TYPE_HYPER_TWISTER, */ HyperTwisterRTD, + /* RIDE_TYPE_MONSTER_TRUCKS, */ MonsterTrucksRTD, + /* RIDE_TYPE_SPINNING_WILD_MOUSE, */ SpinningWildMouseRTD, + /* RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER, */ ClassicMiniRollerCoasterRTD, }; bool RideTypeDescriptor::HasFlag(uint64_t flag) const diff --git a/src/openrct2/ride/RideData.h b/src/openrct2/ride/RideData.h index f8049e9ffa..6cfbaf8f7d 100644 --- a/src/openrct2/ride/RideData.h +++ b/src/openrct2/ride/RideData.h @@ -254,7 +254,6 @@ enum ride_type_flags : uint64_t RIDE_TYPE_FLAG_LIST_VEHICLES_SEPARATELY = (1ULL << 48), RIDE_TYPE_FLAG_SUPPORTS_LEVEL_CROSSINGS = (1ULL << 49), RIDE_TYPE_FLAG_IS_SUSPENDED = (1ULL << 50), - RIDE_TYPE_FLAG_HAS_RIDE_GROUPS = (1ULL << 51), }; // Set on ride types that have a main colour, additional colour and support colour. diff --git a/src/openrct2/ride/RideGroupManager.cpp b/src/openrct2/ride/RideGroupManager.cpp deleted file mode 100644 index f3c3d3595c..0000000000 --- a/src/openrct2/ride/RideGroupManager.cpp +++ /dev/null @@ -1,274 +0,0 @@ -/***************************************************************************** - * Copyright (c) 2014-2019 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. - *****************************************************************************/ - -#include "RideGroupManager.h" - -#include "../Context.h" -#include "../config/Config.h" -#include "../core/String.hpp" -#include "../localisation/StringIds.h" -#include "../management/Research.h" -#include "../object/ObjectManager.h" -#include "Ride.h" -#include "RideData.h" -#include "Track.h" -#include "TrackData.h" - -#include -#include - -static constexpr const RideGroup ride_group_corkscrew_rc = { - /*.RideType =*/RIDE_TYPE_CORKSCREW_ROLLER_COASTER, - /*.MaximumHeight =*/28, - /*.AvailableTrackPieces =*/(1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) - | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_VERTICAL_LOOP) | (1ULL << TRACK_SLOPE) - | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_SLOPE_CURVE_STEEP) | (1ULL << TRACK_S_BEND) - | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HALF_LOOP) | (1ULL << TRACK_CORKSCREW) - | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) | (1ULL << TRACK_BLOCK_BRAKES) - | (1ULL << TRACK_BOOSTER), - /*.Naming =*/{ STR_CORKSCREW_RC_GROUP, STR_CORKSCREW_RC_GROUP_DESC }, - /*.Flags =*/0, -}; - -static constexpr const RideGroup ride_group_hypercoaster = { - /*.RideType =*/RIDE_TYPE_CORKSCREW_ROLLER_COASTER, - /*.MaximumHeight =*/55, - /*.AvailableTrackPieces =*/(1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) - | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_CURVE) - | (1ULL << TRACK_SLOPE_CURVE_STEEP) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) - | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) | (1ULL << TRACK_BLOCK_BRAKES) - | (1ULL << TRACK_SLOPE_STEEP_LONG), - /*.Naming =*/{ STR_HYPERCOASTER_GROUP, STR_HYPERCOASTER_GROUP_DESC }, - /*.Flags =*/0, -}; - -static constexpr const RideGroup ride_group_car_ride = { - /*.RideType =*/RIDE_TYPE_CAR_RIDE, - /*.MaximumHeight =*/6, - /*.AvailableTrackPieces =*/(1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_SLOPE) - | (1ULL << TRACK_CURVE_VERY_SMALL) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_SPINNING_TUNNEL), - /*.Naming =*/{ STR_CAR_RIDE_GROUP, STR_CAR_RIDE_GROUP_DESC }, - /*.Flags =*/RIDE_GROUP_FLAG_ALLOW_DOORS_ON_TRACK, -}; - -static constexpr const RideGroup ride_group_monster_trucks = { - /*.RideType =*/RIDE_TYPE_CAR_RIDE, - /*.MaximumHeight =*/18, - /*.AvailableTrackPieces =*/(1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_SLOPE) - | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_CURVE_VERY_SMALL) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_RAPIDS), - /*.Naming =*/{ STR_MONSTER_TRUCKS_GROUP, STR_MONSTER_TRUCKS_GROUP_DESC }, - /*.Flags =*/RIDE_GROUP_FLAG_ALLOW_DOORS_ON_TRACK, -}; - -static constexpr const RideGroup ride_group_steel_twister_rc = { - /*.RideType =*/RIDE_TYPE_TWISTER_ROLLER_COASTER, - /*.MaximumHeight =*/40, - /*.AvailableTrackPieces =*/(1ULL << TRACK_FLAT) | (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) - | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_VERTICAL_LOOP) | (1ULL << TRACK_SLOPE) - | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_SLOPE_CURVE_STEEP) | (1ULL << TRACK_S_BEND) - | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HALF_LOOP) | (1ULL << TRACK_CORKSCREW) - | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) | (1ULL << TRACK_SLOPE_VERTICAL) - | (1ULL << TRACK_BARREL_ROLL) | (1ULL << TRACK_POWERED_LIFT) | (1ULL << TRACK_HALF_LOOP_LARGE) - | (1ULL << TRACK_SLOPE_CURVE_BANKED) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_SLOPE_ROLL_BANKING) - | (1ULL << TRACK_SLOPE_STEEP_LONG) | (1ULL << TRACK_CURVE_VERTICAL) | (1ULL << TRACK_QUARTER_LOOP) - | (1ULL << TRACK_BOOSTER), - /*.Naming =*/{ STR_STEEL_TWISTER_GROUP, STR_STEEL_TWISTER_GROUP_DESC }, - /*.Flags =*/0, -}; - -static constexpr const RideGroup ride_group_hyper_twister = { - /*.RideType =*/RIDE_TYPE_TWISTER_ROLLER_COASTER, - /*.MaximumHeight =*/54, - /*.AvailableTrackPieces =*/(1ULL << TRACK_FLAT) | (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) - | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) - | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_SLOPE_CURVE_STEEP) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) - | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) - | (1ULL << TRACK_SLOPE_CURVE_BANKED) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_SLOPE_ROLL_BANKING) - | (1ULL << TRACK_SLOPE_STEEP_LONG) | (1ULL << TRACK_SLOPE_VERTICAL) | (1ULL << TRACK_CURVE_VERTICAL), - /*.Naming =*/{ STR_HYPER_TWISTER_GROUP, STR_HYPER_TWISTER_GROUP_DESC }, - /*.Flags =*/0, -}; - -static constexpr const RideGroup ride_group_junior_rc = { - /*.RideType =*/RIDE_TYPE_JUNIOR_ROLLER_COASTER, - /*.MaximumHeight =*/12, - /*.AvailableTrackPieces =*/(1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) - | (1ULL << TRACK_LIFT_HILL_CURVE) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_SLOPE) - | (1ULL << TRACK_SLOPE_LONG) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) - | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_BLOCK_BRAKES) - | (1ULL << TRACK_BOOSTER), - /*.Naming =*/{ STR_JUNIOR_RC_GROUP, STR_JUNIOR_RC_GROUP_DESC }, - /*.Flags =*/RIDE_GROUP_FLAG_ALLOW_DOORS_ON_TRACK, -}; - -static constexpr const RideGroup ride_group_classic_mini_coaster = { - /*.RideType =*/RIDE_TYPE_JUNIOR_ROLLER_COASTER, - /*.MaximumHeight =*/15, - /*.AvailableTrackPieces =*/(1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) - | (1ULL << TRACK_LIFT_HILL_CURVE) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_SLOPE) - | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_LONG) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_S_BEND) - | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) - | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_BOOSTER), - /*.Naming =*/{ STR_CLASSIC_MINI_COASTER_GROUP, STR_CLASSIC_MINI_COASTER_GROUP_DESC }, - /*.Flags =*/RIDE_GROUP_FLAG_ALLOW_DOORS_ON_TRACK, -}; - -static constexpr const RideGroup ride_group_steel_wild_mouse = { - /*.RideType =*/RIDE_TYPE_STEEL_WILD_MOUSE, - /*.MaximumHeight =*/16, - /*.AvailableTrackPieces =*/(1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) - | (1ULL << TRACK_LIFT_HILL_STEEP) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_LONG) - | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_CURVE_VERY_SMALL) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_BRAKES) - | (1ULL << TRACK_BLOCK_BRAKES), - /*.Naming =*/{ STR_RIDE_NAME_WILD_MOUSE, STR_RIDE_DESCRIPTION_WILD_MOUSE }, - /*.Flags =*/RIDE_GROUP_FLAG_ALLOW_DOORS_ON_TRACK, -}; - -static constexpr const RideGroup ride_group_spinning_wild_mouse = { - /*.RideType =*/RIDE_TYPE_STEEL_WILD_MOUSE, - /*.MaximumHeight =*/16, - /*.AvailableTrackPieces =*/(1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) - | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_LONG) | (1ULL << TRACK_CURVE_VERY_SMALL) | (1ULL << TRACK_CURVE_SMALL) - | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_ROTATION_CONTROL_TOGGLE), - /*.Naming =*/{ STR_SPINNING_WILD_MOUSE_GROUP, STR_SPINNING_WILD_MOUSE_GROUP_DESC }, - /*.Flags =*/0, -}; - -static constexpr const RideGroup corkscrew_rc_groups[MAX_RIDE_GROUPS_PER_RIDE_TYPE] = { - ride_group_corkscrew_rc, - ride_group_hypercoaster, -}; -static constexpr const RideGroup junior_rc_groups[MAX_RIDE_GROUPS_PER_RIDE_TYPE] = { - ride_group_junior_rc, - ride_group_classic_mini_coaster, -}; -static constexpr const RideGroup car_ride_groups[MAX_RIDE_GROUPS_PER_RIDE_TYPE] = { - ride_group_car_ride, - ride_group_monster_trucks, -}; -static constexpr const RideGroup twister_rc_groups[MAX_RIDE_GROUPS_PER_RIDE_TYPE] = { - ride_group_steel_twister_rc, - ride_group_hyper_twister, -}; -static constexpr const RideGroup steel_wild_mouse_groups[MAX_RIDE_GROUPS_PER_RIDE_TYPE] = { - ride_group_steel_wild_mouse, - ride_group_spinning_wild_mouse, -}; - -bool RideGroup::Equals(const RideGroup* otherRideGroup) const -{ - return this->Naming.Name == otherRideGroup->Naming.Name && this->Naming.Description == otherRideGroup->Naming.Description; -} - -bool RideGroup::IsInvented() const -{ - if (!ride_type_is_invented(this->RideType)) - return false; - - auto& objManager = OpenRCT2::GetContext()->GetObjectManager(); - auto& rideEntries = objManager.GetAllRideEntries(this->RideType); - for (auto rideEntryIndex : rideEntries) - { - if (ride_entry_is_invented(rideEntryIndex)) - { - auto rideEntry = get_ride_entry(rideEntryIndex); - auto rideEntryRideGroup = RideGroupManager::GetRideGroup(this->RideType, rideEntry); - if (this->Equals(rideEntryRideGroup)) - { - // The ride entry is invented and belongs to the same ride group. This means the ride group is invented. - return true; - } - } - } - - return false; -} - -const RideGroup* RideGroupManager::GetRideGroup(const uint8_t rideType, const rct_ride_entry* rideEntry) -{ - switch (rideType) - { - case RIDE_TYPE_CORKSCREW_ROLLER_COASTER: - if (ride_entry_get_supported_track_pieces(rideEntry) & (1ULL << TRACK_VERTICAL_LOOP)) - return &ride_group_corkscrew_rc; - else - return &ride_group_hypercoaster; - case RIDE_TYPE_JUNIOR_ROLLER_COASTER: - if (ride_entry_get_supported_track_pieces(rideEntry) & (1ULL << TRACK_SLOPE_STEEP)) - return &ride_group_classic_mini_coaster; - else - return &ride_group_junior_rc; - case RIDE_TYPE_CAR_RIDE: - if (ride_entry_get_supported_track_pieces(rideEntry) & (1ULL << TRACK_SLOPE_STEEP)) - return &ride_group_monster_trucks; - else - return &ride_group_car_ride; - case RIDE_TYPE_TWISTER_ROLLER_COASTER: - if (!(rideEntry->flags & RIDE_ENTRY_FLAG_NO_INVERSIONS)) - return &ride_group_steel_twister_rc; - else - return &ride_group_hyper_twister; - case RIDE_TYPE_STEEL_WILD_MOUSE: - if (ride_entry_get_supported_track_pieces(rideEntry) & (1ULL << TRACK_SLOPE_STEEP)) - return &ride_group_steel_wild_mouse; - else - return &ride_group_spinning_wild_mouse; - default: - return nullptr; - } -} - -const RideGroup* RideGroupManager::RideGroupFind(const uint8_t rideType, const uint8_t index) -{ - if (index >= MAX_RIDE_GROUPS_PER_RIDE_TYPE) - return nullptr; - - switch (rideType) - { - case RIDE_TYPE_CORKSCREW_ROLLER_COASTER: - return &corkscrew_rc_groups[index]; - case RIDE_TYPE_JUNIOR_ROLLER_COASTER: - return &junior_rc_groups[index]; - case RIDE_TYPE_CAR_RIDE: - return &car_ride_groups[index]; - case RIDE_TYPE_TWISTER_ROLLER_COASTER: - return &twister_rc_groups[index]; - case RIDE_TYPE_STEEL_WILD_MOUSE: - return &steel_wild_mouse_groups[index]; - default: - return nullptr; - } -} - -uint8_t RideGroupManager::GetRideGroupIndex(const uint8_t rideType, const rct_ride_entry* rideEntry) -{ - uint8_t rideGroupIndex = 0; - - const RideGroup* rideGroup = RideGroupManager::GetRideGroup(rideType, rideEntry); - - // If the ride group is nullptr, the track type does not have ride groups. - if (rideGroup != nullptr) - { - for (uint8_t i = rideGroupIndex + 1; i < MAX_RIDE_GROUPS_PER_RIDE_TYPE; i++) - { - const RideGroup* irg = RideGroupManager::RideGroupFind(rideType, i); - - if (irg != nullptr) - { - if (irg->Equals(rideGroup)) - { - rideGroupIndex = i; - break; - } - } - } - } - - return rideGroupIndex; -} diff --git a/src/openrct2/ride/RideGroupManager.h b/src/openrct2/ride/RideGroupManager.h deleted file mode 100644 index 64b50872e0..0000000000 --- a/src/openrct2/ride/RideGroupManager.h +++ /dev/null @@ -1,43 +0,0 @@ -/***************************************************************************** - * Copyright (c) 2014-2019 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 "../common.h" -#include "RideData.h" - -#include - -#define MAX_RIDE_GROUPS_PER_RIDE_TYPE 2 - -struct RideGroup -{ - uint8_t RideType; - uint16_t MaximumHeight; - uint64_t AvailableTrackPieces; - RideNaming Naming; - uint8_t Flags; - - bool Equals(const RideGroup* otherRideGroup) const; - bool IsInvented() const; -}; - -class RideGroupManager -{ -public: - static const RideGroup* GetRideGroup(const uint8_t trackType, const rct_ride_entry* rideEntry); - /** Will fall back to 0 if there is none found. */ - static uint8_t GetRideGroupIndex(const uint8_t trackType, const rct_ride_entry* rideEntry); - static const RideGroup* RideGroupFind(const uint8_t rideType, const uint8_t index); -}; - -enum RideGroupFlags : uint8_t -{ - RIDE_GROUP_FLAG_ALLOW_DOORS_ON_TRACK = 0b00000001, -}; diff --git a/src/openrct2/ride/Track.cpp b/src/openrct2/ride/Track.cpp index 121c75e451..777277f1ed 100644 --- a/src/openrct2/ride/Track.cpp +++ b/src/openrct2/ride/Track.cpp @@ -29,7 +29,6 @@ #include "../world/Surface.h" #include "Ride.h" #include "RideData.h" -#include "RideGroupManager.h" #include "RideRatings.h" #include "Station.h" #include "TrackData.h" @@ -1222,7 +1221,7 @@ bool track_element_is_covered(int32_t trackElementType) bool track_element_is_booster(uint8_t rideType, uint8_t trackType) { // Boosters share their ID with the Spinning Control track. - return rideType != RIDE_TYPE_STEEL_WILD_MOUSE && trackType == TRACK_ELEM_BOOSTER; + return rideType != RIDE_TYPE_SPINNING_WILD_MOUSE && trackType == TRACK_ELEM_BOOSTER; } bool track_element_has_speed_setting(uint8_t trackType) diff --git a/src/openrct2/ride/TrackDesignRepository.cpp b/src/openrct2/ride/TrackDesignRepository.cpp index 099831d5e5..ce7cd1cd26 100644 --- a/src/openrct2/ride/TrackDesignRepository.cpp +++ b/src/openrct2/ride/TrackDesignRepository.cpp @@ -22,7 +22,7 @@ #include "../localisation/LocalisationService.h" #include "../object/ObjectRepository.h" #include "../object/RideObject.h" -#include "RideGroupManager.h" +#include "../ride/RideData.h" #include "TrackDesign.h" #include @@ -57,7 +57,7 @@ class TrackDesignFileIndex final : public FileIndex { private: static constexpr uint32_t MAGIC_NUMBER = 0x58444954; // TIDX - static constexpr uint16_t VERSION = 2; + static constexpr uint16_t VERSION = 3; static constexpr auto PATTERN = "*.td4;*.td6"; public: @@ -78,10 +78,15 @@ public: auto td6 = track_design_open(path.c_str()); if (td6 != nullptr) { + auto* rawObject = object_repository_load_object(&td6->vehicle_object); + const auto* rideEntry = static_cast(static_cast(rawObject)->GetLegacyData()); + auto rideType = RCT2RideTypeToOpenRCT2RideType(td6->type, rideEntry); + object_delete(rawObject); + TrackRepositoryItem item; item.Name = GetNameFromTrackPath(path); item.Path = path; - item.RideType = td6->type; + item.RideType = rideType; item.ObjectEntry = std::string(td6->vehicle_object.name, 8); item.Flags = 0; if (IsTrackReadOnly(path)) @@ -178,31 +183,6 @@ public: return count; } - size_t GetCountForRideGroup(uint8_t rideType, const RideGroup* rideGroup) const override - { - size_t count = 0; - const auto& repo = GetContext()->GetObjectRepository(); - - for (const auto& item : _items) - { - if (item.RideType != rideType) - { - continue; - } - - const ObjectRepositoryItem* ori = repo.FindObject(item.ObjectEntry.c_str()); - uint8_t rideGroupIndex = (ori != nullptr) ? ori->RideInfo.RideGroupIndex : 0; - const RideGroup* itemRideGroup = RideGroupManager::RideGroupFind(rideType, rideGroupIndex); - - if (itemRideGroup != nullptr && itemRideGroup->Equals(rideGroup)) - { - count++; - } - } - - return count; - } - /** * * @param entry The entry name to build a track list for. Leave empty to build track list for the non-separated types (e.g. @@ -241,34 +221,6 @@ public: return refs; } - std::vector GetItemsForRideGroup(uint8_t rideType, const RideGroup* rideGroup) const override - { - std::vector refs; - const auto& repo = GetContext()->GetObjectRepository(); - - for (const auto& item : _items) - { - if (item.RideType != rideType) - { - continue; - } - - const ObjectRepositoryItem* ori = repo.FindObject(item.ObjectEntry.c_str()); - uint8_t rideGroupIndex = (ori != nullptr) ? ori->RideInfo.RideGroupIndex : 0; - const RideGroup* itemRideGroup = RideGroupManager::RideGroupFind(rideType, rideGroupIndex); - - if (itemRideGroup != nullptr && itemRideGroup->Equals(rideGroup)) - { - track_design_file_ref ref; - ref.name = String::Duplicate(GetNameFromTrackPath(item.Path)); - ref.path = String::Duplicate(item.Path); - refs.push_back(ref); - } - } - - return refs; - } - void Scan(int32_t language) override { _items.clear(); diff --git a/src/openrct2/ride/TrackDesignRepository.h b/src/openrct2/ride/TrackDesignRepository.h index 51d4a841d8..ecf635693b 100644 --- a/src/openrct2/ride/TrackDesignRepository.h +++ b/src/openrct2/ride/TrackDesignRepository.h @@ -10,7 +10,6 @@ #pragma once #include "../common.h" -#include "RideGroupManager.h" #include @@ -21,6 +20,7 @@ struct track_design_file_ref }; #include +#include namespace OpenRCT2 { @@ -33,11 +33,8 @@ interface ITrackDesignRepository virtual size_t GetCount() const abstract; virtual size_t GetCountForObjectEntry(uint8_t rideType, const std::string& entry) const abstract; - virtual size_t GetCountForRideGroup(uint8_t rideType, const RideGroup* rideGroup) const abstract; virtual std::vector GetItemsForObjectEntry(uint8_t rideType, const std::string& entry) const abstract; - virtual std::vector GetItemsForRideGroup(uint8_t rideType, const RideGroup* rideGroup) - const abstract; virtual void Scan(int32_t language) abstract; virtual bool Delete(const std::string& path) abstract; diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index 53c3a9caeb..e4ab414708 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -8030,7 +8030,7 @@ bool Vehicle::UpdateTrackMotionForwardsGetNewTrack(uint16_t trackType, Ride* cur if (curRide != nullptr) { uint16_t rideType = curRide->type; - if (trackType == TRACK_ELEM_ROTATION_CONTROL_TOGGLE && rideType == RIDE_TYPE_STEEL_WILD_MOUSE) + if (trackType == TRACK_ELEM_ROTATION_CONTROL_TOGGLE && rideType == RIDE_TYPE_SPINNING_WILD_MOUSE) { update_flags ^= VEHICLE_UPDATE_FLAG_ROTATION_OFF_WILD_MOUSE; } diff --git a/src/openrct2/ride/coaster/meta/ClassicMiniRollerCoaster.h b/src/openrct2/ride/coaster/meta/ClassicMiniRollerCoaster.h new file mode 100644 index 0000000000..3d1563a3ad --- /dev/null +++ b/src/openrct2/ride/coaster/meta/ClassicMiniRollerCoaster.h @@ -0,0 +1,61 @@ +/***************************************************************************** + * Copyright (c) 2014-2020 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 "../../RideData.h" +#include "../../ShopItem.h" +#include "../../Track.h" + +// clang-format off +constexpr const RideTypeDescriptor ClassicMiniRollerCoasterRTD = +{ + SET_FIELD(AlternateType, RIDE_TYPE_NULL), + SET_FIELD(Category, RIDE_CATEGORY_ROLLERCOASTER), + SET_FIELD(EnabledTrackPieces, (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) + | (1ULL << TRACK_LIFT_HILL_CURVE) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_SLOPE) + | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_LONG) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_S_BEND) + | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) + | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_BOOSTER)), + SET_FIELD(ExtraTrackPieces, 0), + SET_FIELD(CoveredTrackPieces, 0), + SET_FIELD(StartTrackPiece, TRACK_ELEM_END_STATION), + SET_FIELD(TrackPaintFunction, get_track_paint_function_junior_rc), + SET_FIELD(Flags, RIDE_TYPE_FLAGS_TRACK_HAS_3_COLOURS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAGS_COMMON_COASTER | RIDE_TYPE_FLAGS_COMMON_COASTER_NON_ALT | RIDE_TYPE_FLAG_HAS_LARGE_CURVES | + RIDE_TYPE_FLAG_ALLOW_DOORS_ON_TRACK | RIDE_TYPE_FLAG_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG_ALLOW_MULTIPLE_CIRCUITS), + SET_FIELD(RideModes, (1ULL << RIDE_MODE_CONTINUOUS_CIRCUIT) | (1ULL << RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED) | (1ULL << RIDE_MODE_REVERSE_INCLINE_LAUNCHED_SHUTTLE)), + SET_FIELD(DefaultMode, RIDE_MODE_CONTINUOUS_CIRCUIT), + SET_FIELD(OperatingSettings, { 0, 0, 0, 17, 16, -1 }), + SET_FIELD(Naming, { STR_RIDE_NAME_CLASSIC_MINI_ROLLER_COASTER, STR_RIDE_DESCRIPTION_CLASSIC_MINI_COASTER }), + SET_FIELD(NameConvention, { RIDE_COMPONENT_TYPE_TRAIN, RIDE_COMPONENT_TYPE_TRACK, RIDE_COMPONENT_TYPE_STATION }), + SET_FIELD(EnumName, nameof(RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER)), + SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), + SET_FIELD(Heights, { 15, 24, 4, 7, }), + SET_FIELD(MaxMass, 18), + SET_FIELD(LiftData, { SoundId::LiftFrictionWheels, 4, 6 }), + SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_junior_roller_coaster), + SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), + SET_FIELD(UpkeepCosts, { 40, 20, 80, 8, 3, 5 }), + SET_FIELD(BuildCosts, { 45, 4, 40, }), + SET_FIELD(DefaultPrices, { 20, 20 }), + SET_FIELD(DefaultMusic, MUSIC_STYLE_SUMMER), + SET_FIELD(PhotoItem, SHOP_ITEM_PHOTO), + SET_FIELD(BonusValue, 60), + SET_FIELD(ColourPresets, TRACK_COLOUR_PRESETS( + { COLOUR_YELLOW, COLOUR_YELLOW, COLOUR_SATURATED_BROWN }, + { COLOUR_BORDEAUX_RED, COLOUR_BORDEAUX_RED, COLOUR_DARK_OLIVE_GREEN }, + { COLOUR_TEAL, COLOUR_YELLOW, COLOUR_TEAL }, + { COLOUR_SATURATED_BROWN, COLOUR_SATURATED_BROWN, COLOUR_OLIVE_GREEN }, + { COLOUR_BLACK, COLOUR_LIGHT_BLUE, COLOUR_BLACK }, + )), + SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_JUNIOR_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_JUNIOR_ROLLER_COASTER_SUPPORTS }), + SET_FIELD(ColourKey, RideColourKey::Ride), +}; +// clang-format on diff --git a/src/openrct2/ride/coaster/meta/CorkscrewRollerCoaster.h b/src/openrct2/ride/coaster/meta/CorkscrewRollerCoaster.h index 4f7c1d9032..c48c2b8e1e 100644 --- a/src/openrct2/ride/coaster/meta/CorkscrewRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/CorkscrewRollerCoaster.h @@ -19,14 +19,19 @@ constexpr const RideTypeDescriptor CorkscrewRollerCoasterRTD = { SET_FIELD(AlternateType, RIDE_TYPE_NULL), SET_FIELD(Category, RIDE_CATEGORY_ROLLERCOASTER), - SET_FIELD(EnabledTrackPieces, (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_VERTICAL_LOOP) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_SLOPE_CURVE_STEEP) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HALF_LOOP) | (1ULL << TRACK_CORKSCREW) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_SLOPE_STEEP_LONG) | (1ULL << TRACK_BOOSTER)), + SET_FIELD(EnabledTrackPieces, (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) + | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_VERTICAL_LOOP) | (1ULL << TRACK_SLOPE) + | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_SLOPE_CURVE_STEEP) | (1ULL << TRACK_S_BEND) + | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HALF_LOOP) | (1ULL << TRACK_CORKSCREW) + | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) | (1ULL << TRACK_BLOCK_BRAKES) + | (1ULL << TRACK_BOOSTER)), SET_FIELD(ExtraTrackPieces, 0), SET_FIELD(CoveredTrackPieces, 0), SET_FIELD(StartTrackPiece, TRACK_ELEM_END_STATION), SET_FIELD(TrackPaintFunction, get_track_paint_function_corkscrew_rc), SET_FIELD(Flags, RIDE_TYPE_FLAGS_TRACK_HAS_3_COLOURS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | RIDE_TYPE_FLAGS_COMMON_COASTER | RIDE_TYPE_FLAGS_COMMON_COASTER_NON_ALT | RIDE_TYPE_FLAG_HAS_LARGE_CURVES | - RIDE_TYPE_FLAG_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG_HAS_RIDE_GROUPS), + RIDE_TYPE_FLAG_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG_ALLOW_MULTIPLE_CIRCUITS), SET_FIELD(RideModes, (1ULL << RIDE_MODE_CONTINUOUS_CIRCUIT) | (1ULL << RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED) | (1ULL << RIDE_MODE_POWERED_LAUNCH_PASSTROUGH) | (1ULL << RIDE_MODE_POWERED_LAUNCH) | (1ULL << RIDE_MODE_REVERSE_INCLINE_LAUNCHED_SHUTTLE)), SET_FIELD(DefaultMode, RIDE_MODE_CONTINUOUS_CIRCUIT), SET_FIELD(OperatingSettings, { 10, 27, 30, 25, 25, 0 }), diff --git a/src/openrct2/ride/coaster/meta/HyperTwister.h b/src/openrct2/ride/coaster/meta/HyperTwister.h new file mode 100644 index 0000000000..1099632e5d --- /dev/null +++ b/src/openrct2/ride/coaster/meta/HyperTwister.h @@ -0,0 +1,62 @@ +/***************************************************************************** + * Copyright (c) 2014-2020 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 "../../RideData.h" +#include "../../ShopItem.h" +#include "../../Track.h" + +// clang-format off +constexpr const RideTypeDescriptor HyperTwisterRTD = +{ + SET_FIELD(AlternateType, RIDE_TYPE_NULL), + SET_FIELD(Category, RIDE_CATEGORY_ROLLERCOASTER), + SET_FIELD(EnabledTrackPieces, (1ULL << TRACK_FLAT) | (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) + | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) + | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_SLOPE_CURVE_STEEP) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) + | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) + | (1ULL << TRACK_SLOPE_CURVE_BANKED) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_SLOPE_ROLL_BANKING) + | (1ULL << TRACK_SLOPE_STEEP_LONG) | (1ULL << TRACK_SLOPE_VERTICAL) | (1ULL << TRACK_CURVE_VERTICAL)), + SET_FIELD(ExtraTrackPieces, (1ULL << TRACK_LIFT_HILL_STEEP) | (1ULL << TRACK_BRAKE_FOR_DROP)), + SET_FIELD(CoveredTrackPieces, 0), + SET_FIELD(StartTrackPiece, TRACK_ELEM_END_STATION), + SET_FIELD(TrackPaintFunction, get_track_paint_function_twister_rc), + SET_FIELD(Flags, RIDE_TYPE_FLAGS_TRACK_HAS_3_COLOURS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAGS_COMMON_COASTER | RIDE_TYPE_FLAGS_COMMON_COASTER_NON_ALT | RIDE_TYPE_FLAG_HAS_LARGE_CURVES | + RIDE_TYPE_FLAG_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG_ALLOW_MULTIPLE_CIRCUITS), + SET_FIELD(RideModes, (1ULL << RIDE_MODE_CONTINUOUS_CIRCUIT) | (1ULL << RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED)), + SET_FIELD(DefaultMode, RIDE_MODE_CONTINUOUS_CIRCUIT), + SET_FIELD(OperatingSettings, { 10, 27, 30, 17, 68, 0 }), + SET_FIELD(Naming, { STR_RIDE_NAME_HYPER_TWISTER, STR_RIDE_DESCRIPTION_HYPER_TWISTER }), + SET_FIELD(NameConvention, { RIDE_COMPONENT_TYPE_TRAIN, RIDE_COMPONENT_TYPE_TRACK, RIDE_COMPONENT_TYPE_STATION }), + SET_FIELD(EnumName, nameof(RIDE_TYPE_HYPER_TWISTER)), + SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), + SET_FIELD(Heights, { 54, 24, 8, 9, }), + SET_FIELD(MaxMass, 31), + SET_FIELD(LiftData, { SoundId::LiftBM, 5, 8 }), + SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_twister_roller_coaster), + SET_FIELD(RatingsMultipliers, { 52, 36, 10 }), + SET_FIELD(UpkeepCosts, { 43, 20, 80, 11, 3, 10 }), + SET_FIELD(BuildCosts, { 120, 5, 55, }), + SET_FIELD(DefaultPrices, { 20, 20 }), + SET_FIELD(DefaultMusic, MUSIC_STYLE_ROCK), + SET_FIELD(PhotoItem, SHOP_ITEM_PHOTO), + SET_FIELD(BonusValue, 120), + SET_FIELD(ColourPresets, TRACK_COLOUR_PRESETS( + { COLOUR_YELLOW, COLOUR_YELLOW, COLOUR_BORDEAUX_RED }, + { COLOUR_AQUAMARINE, COLOUR_AQUAMARINE, COLOUR_DARK_PURPLE }, + { COLOUR_WHITE, COLOUR_WHITE, COLOUR_LIGHT_BLUE }, + { COLOUR_DARK_GREEN, COLOUR_MOSS_GREEN, COLOUR_DARK_BROWN }, + { COLOUR_BORDEAUX_RED, COLOUR_LIGHT_ORANGE, COLOUR_WHITE }, + )), + SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_TWISTER_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_TWISTER_ROLLER_COASTER_SUPPORTS }), + SET_FIELD(ColourKey, RideColourKey::Ride), +}; +// clang-format on diff --git a/src/openrct2/ride/coaster/meta/Hypercoaster.h b/src/openrct2/ride/coaster/meta/Hypercoaster.h new file mode 100644 index 0000000000..301bd83ed0 --- /dev/null +++ b/src/openrct2/ride/coaster/meta/Hypercoaster.h @@ -0,0 +1,60 @@ +/***************************************************************************** + * Copyright (c) 2014-2020 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 "../../RideData.h" +#include "../../ShopItem.h" +#include "../../Track.h" + +// clang-format off +constexpr const RideTypeDescriptor HypercoasterRTD = +{ + SET_FIELD(AlternateType, RIDE_TYPE_NULL), + SET_FIELD(Category, RIDE_CATEGORY_ROLLERCOASTER), + SET_FIELD(EnabledTrackPieces, (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) + | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_CURVE) + | (1ULL << TRACK_SLOPE_CURVE_STEEP) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) + | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) | (1ULL << TRACK_BLOCK_BRAKES) + | (1ULL << TRACK_SLOPE_STEEP_LONG)), + SET_FIELD(ExtraTrackPieces, 0), + SET_FIELD(CoveredTrackPieces, 0), + SET_FIELD(StartTrackPiece, TRACK_ELEM_END_STATION), + SET_FIELD(TrackPaintFunction, get_track_paint_function_corkscrew_rc), + SET_FIELD(Flags, RIDE_TYPE_FLAGS_TRACK_HAS_3_COLOURS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAGS_COMMON_COASTER | RIDE_TYPE_FLAGS_COMMON_COASTER_NON_ALT | RIDE_TYPE_FLAG_HAS_LARGE_CURVES | + RIDE_TYPE_FLAG_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG_ALLOW_MULTIPLE_CIRCUITS), + SET_FIELD(RideModes, (1ULL << RIDE_MODE_CONTINUOUS_CIRCUIT) | (1ULL << RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED) | (1ULL << RIDE_MODE_POWERED_LAUNCH_PASSTROUGH) | (1ULL << RIDE_MODE_POWERED_LAUNCH) | (1ULL << RIDE_MODE_REVERSE_INCLINE_LAUNCHED_SHUTTLE)), + SET_FIELD(DefaultMode, RIDE_MODE_CONTINUOUS_CIRCUIT), + SET_FIELD(OperatingSettings, { 10, 27, 30, 25, 25, 0 }), + SET_FIELD(Naming, { STR_RIDE_NAME_HYPERCOASTER, STR_RIDE_DESCRIPTION_HYPERCOASTER }), + SET_FIELD(NameConvention, { RIDE_COMPONENT_TYPE_TRAIN, RIDE_COMPONENT_TYPE_TRACK, RIDE_COMPONENT_TYPE_STATION }), + SET_FIELD(EnumName, nameof(RIDE_TYPE_HYPERCOASTER)), + SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), + SET_FIELD(Heights, { 55, 24, 8, 11, }), + SET_FIELD(MaxMass, 18), + SET_FIELD(LiftData, { SoundId::LiftArrow, 4, 6 }), + SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_corkscrew_roller_coaster), + SET_FIELD(RatingsMultipliers, { 50, 30, 10 }), + SET_FIELD(UpkeepCosts, { 40, 20, 80, 11, 3, 10 }), + SET_FIELD(BuildCosts, { 105, 5, 50, }), + SET_FIELD(DefaultPrices, { 20, 20 }), + SET_FIELD(DefaultMusic, MUSIC_STYLE_ROCK), + SET_FIELD(PhotoItem, SHOP_ITEM_PHOTO), + SET_FIELD(BonusValue, 100), + SET_FIELD(ColourPresets, TRACK_COLOUR_PRESETS( + { COLOUR_BORDEAUX_RED, COLOUR_BORDEAUX_RED, COLOUR_BLACK }, + { COLOUR_LIGHT_BLUE, COLOUR_LIGHT_BLUE, COLOUR_WHITE }, + { COLOUR_BLACK, COLOUR_BORDEAUX_RED, COLOUR_BLACK }, + { COLOUR_WHITE, COLOUR_WHITE, COLOUR_DARK_GREEN }, + )), + SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_CORKSCREW_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_CORKSCREW_ROLLER_COASTER_SUPPORTS }), + SET_FIELD(ColourKey, RideColourKey::Ride), +}; +// clang-format on diff --git a/src/openrct2/ride/coaster/meta/JuniorRollerCoaster.h b/src/openrct2/ride/coaster/meta/JuniorRollerCoaster.h index 7412e1bd47..daa6dfa99e 100644 --- a/src/openrct2/ride/coaster/meta/JuniorRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/JuniorRollerCoaster.h @@ -19,15 +19,18 @@ constexpr const RideTypeDescriptor JuniorRollerCoasterRTD = { SET_FIELD(AlternateType, RIDE_TYPE_NULL), SET_FIELD(Category, RIDE_CATEGORY_ROLLERCOASTER), - SET_FIELD(EnabledTrackPieces, (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_LIFT_HILL_CURVE) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_LONG) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_BOOSTER)), + SET_FIELD(EnabledTrackPieces, (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) + | (1ULL << TRACK_LIFT_HILL_CURVE) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_SLOPE) + | (1ULL << TRACK_SLOPE_LONG) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) + | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_BLOCK_BRAKES) + | (1ULL << TRACK_BOOSTER)), SET_FIELD(ExtraTrackPieces, 0), SET_FIELD(CoveredTrackPieces, 0), SET_FIELD(StartTrackPiece, TRACK_ELEM_END_STATION), SET_FIELD(TrackPaintFunction, get_track_paint_function_junior_rc), SET_FIELD(Flags, RIDE_TYPE_FLAGS_TRACK_HAS_3_COLOURS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | RIDE_TYPE_FLAGS_COMMON_COASTER | RIDE_TYPE_FLAGS_COMMON_COASTER_NON_ALT | RIDE_TYPE_FLAG_HAS_LARGE_CURVES | - RIDE_TYPE_FLAG_ALLOW_DOORS_ON_TRACK | RIDE_TYPE_FLAG_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG_ALLOW_MULTIPLE_CIRCUITS | - RIDE_TYPE_FLAG_HAS_RIDE_GROUPS), + RIDE_TYPE_FLAG_ALLOW_DOORS_ON_TRACK | RIDE_TYPE_FLAG_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG_ALLOW_MULTIPLE_CIRCUITS), SET_FIELD(RideModes, (1ULL << RIDE_MODE_CONTINUOUS_CIRCUIT) | (1ULL << RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED) | (1ULL << RIDE_MODE_REVERSE_INCLINE_LAUNCHED_SHUTTLE)), SET_FIELD(DefaultMode, RIDE_MODE_CONTINUOUS_CIRCUIT), SET_FIELD(OperatingSettings, { 0, 0, 0, 17, 16, -1 }), @@ -35,7 +38,7 @@ constexpr const RideTypeDescriptor JuniorRollerCoasterRTD = SET_FIELD(NameConvention, { RIDE_COMPONENT_TYPE_TRAIN, RIDE_COMPONENT_TYPE_TRACK, RIDE_COMPONENT_TYPE_STATION }), SET_FIELD(EnumName, nameof(RIDE_TYPE_JUNIOR_ROLLER_COASTER)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), - SET_FIELD(Heights, { 15, 24, 4, 7, }), + SET_FIELD(Heights, { 12, 24, 4, 7, }), SET_FIELD(MaxMass, 18), SET_FIELD(LiftData, { SoundId::LiftFrictionWheels, 4, 6 }), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_junior_roller_coaster), diff --git a/src/openrct2/ride/coaster/meta/SpinningWildMouse.h b/src/openrct2/ride/coaster/meta/SpinningWildMouse.h new file mode 100644 index 0000000000..a6ed188b68 --- /dev/null +++ b/src/openrct2/ride/coaster/meta/SpinningWildMouse.h @@ -0,0 +1,57 @@ +/***************************************************************************** + * Copyright (c) 2014-2020 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 "../../RideData.h" +#include "../../ShopItem.h" +#include "../../Track.h" + +// clang-format off +constexpr const RideTypeDescriptor SpinningWildMouseRTD = +{ + SET_FIELD(AlternateType, RIDE_TYPE_NULL), + SET_FIELD(Category, RIDE_CATEGORY_ROLLERCOASTER), + SET_FIELD(EnabledTrackPieces, (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) + | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_LONG) | (1ULL << TRACK_CURVE_VERY_SMALL) | (1ULL << TRACK_CURVE_SMALL) + | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_ROTATION_CONTROL_TOGGLE)), + SET_FIELD(ExtraTrackPieces, 0), + SET_FIELD(CoveredTrackPieces, 0), + SET_FIELD(StartTrackPiece, TRACK_ELEM_END_STATION), + SET_FIELD(TrackPaintFunction, get_track_paint_function_wild_mouse), + SET_FIELD(Flags, RIDE_TYPE_FLAGS_TRACK_HAS_3_COLOURS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | + RIDE_TYPE_FLAGS_COMMON_COASTER | RIDE_TYPE_FLAGS_COMMON_COASTER_NON_ALT | RIDE_TYPE_FLAG_PEEP_CHECK_GFORCES), + SET_FIELD(RideModes, (1ULL << RIDE_MODE_CONTINUOUS_CIRCUIT) | (1ULL << RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED)), + SET_FIELD(DefaultMode, RIDE_MODE_CONTINUOUS_CIRCUIT), + SET_FIELD(OperatingSettings, { 0, 0, 0, 0, 0, 0 }), + SET_FIELD(Naming, { STR_SPINNING_WILD_MOUSE_GROUP, STR_SPINNING_WILD_MOUSE_GROUP_DESC }), + SET_FIELD(NameConvention, { RIDE_COMPONENT_TYPE_CAR, RIDE_COMPONENT_TYPE_TRACK, RIDE_COMPONENT_TYPE_STATION }), + SET_FIELD(EnumName, nameof(RIDE_TYPE_SPINNING_WILD_MOUSE)), + SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), + SET_FIELD(Heights, { 16, 24, 4, 7, }), + SET_FIELD(MaxMass, 4), + SET_FIELD(LiftData, { SoundId::LiftWildMouse, 4, 6 }), + SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_wild_mouse), + SET_FIELD(RatingsMultipliers, { 50, 30, 30 }), + SET_FIELD(UpkeepCosts, { 40, 20, 80, 9, 3, 10 }), + SET_FIELD(BuildCosts, { 55, 4, 40, }), + SET_FIELD(DefaultPrices, { 20, 20 }), + SET_FIELD(DefaultMusic, MUSIC_STYLE_ROCK), + SET_FIELD(PhotoItem, SHOP_ITEM_PHOTO), + SET_FIELD(BonusValue, 55), + SET_FIELD(ColourPresets, TRACK_COLOUR_PRESETS( + { COLOUR_LIGHT_BLUE, COLOUR_LIGHT_BLUE, COLOUR_YELLOW }, + { COLOUR_BRIGHT_RED, COLOUR_BRIGHT_RED, COLOUR_WHITE }, + { COLOUR_DARK_PURPLE, COLOUR_BRIGHT_PINK, COLOUR_DARK_PURPLE }, + { COLOUR_LIGHT_BROWN, COLOUR_LIGHT_BROWN, COLOUR_BORDEAUX_RED }, + )), + SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_WILD_MOUSE_TRACK, SPR_RIDE_DESIGN_PREVIEW_WILD_MOUSE_SUPPORTS }), + SET_FIELD(ColourKey, RideColourKey::Ride), +}; +// clang-format on diff --git a/src/openrct2/ride/coaster/meta/SteelWildMouse.h b/src/openrct2/ride/coaster/meta/SteelWildMouse.h index d7fa5b6bf0..47c856bb08 100644 --- a/src/openrct2/ride/coaster/meta/SteelWildMouse.h +++ b/src/openrct2/ride/coaster/meta/SteelWildMouse.h @@ -19,14 +19,17 @@ constexpr const RideTypeDescriptor SteelWildMouseRTD = { SET_FIELD(AlternateType, RIDE_TYPE_NULL), SET_FIELD(Category, RIDE_CATEGORY_ROLLERCOASTER), - SET_FIELD(EnabledTrackPieces, (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_LIFT_HILL_STEEP) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_LONG) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_CURVE_VERY_SMALL) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_ROTATION_CONTROL_TOGGLE)), + SET_FIELD(EnabledTrackPieces, (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) + | (1ULL << TRACK_LIFT_HILL_STEEP) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_LONG) + | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_CURVE_VERY_SMALL) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_BRAKES) + | (1ULL << TRACK_BLOCK_BRAKES)), SET_FIELD(ExtraTrackPieces, 0), SET_FIELD(CoveredTrackPieces, 0), SET_FIELD(StartTrackPiece, TRACK_ELEM_END_STATION), SET_FIELD(TrackPaintFunction, get_track_paint_function_wild_mouse), SET_FIELD(Flags, RIDE_TYPE_FLAGS_TRACK_HAS_3_COLOURS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | RIDE_TYPE_FLAGS_COMMON_COASTER | RIDE_TYPE_FLAGS_COMMON_COASTER_NON_ALT | RIDE_TYPE_FLAG_ALLOW_DOORS_ON_TRACK | - RIDE_TYPE_FLAG_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG_HAS_RIDE_GROUPS), + RIDE_TYPE_FLAG_PEEP_CHECK_GFORCES), SET_FIELD(RideModes, (1ULL << RIDE_MODE_CONTINUOUS_CIRCUIT) | (1ULL << RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED)), SET_FIELD(DefaultMode, RIDE_MODE_CONTINUOUS_CIRCUIT), SET_FIELD(OperatingSettings, { 0, 0, 0, 0, 0, 0 }), diff --git a/src/openrct2/ride/coaster/meta/TwisterRollerCoaster.h b/src/openrct2/ride/coaster/meta/TwisterRollerCoaster.h index af6aa4222a..571a7df118 100644 --- a/src/openrct2/ride/coaster/meta/TwisterRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/TwisterRollerCoaster.h @@ -19,14 +19,22 @@ constexpr const RideTypeDescriptor TwisterRollerCoasterRTD = { SET_FIELD(AlternateType, RIDE_TYPE_NULL), SET_FIELD(Category, RIDE_CATEGORY_ROLLERCOASTER), - SET_FIELD(EnabledTrackPieces, (1ULL << TRACK_FLAT) | (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_VERTICAL_LOOP) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_SLOPE_CURVE_STEEP) | (1ULL << TRACK_S_BEND) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HALF_LOOP) | (1ULL << TRACK_CORKSCREW) | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) | (1ULL << TRACK_SLOPE_VERTICAL) | (1ULL << TRACK_BARREL_ROLL) | (1ULL << TRACK_POWERED_LIFT) | (1ULL << TRACK_HALF_LOOP_LARGE) | (1ULL << TRACK_SLOPE_CURVE_BANKED) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_SLOPE_ROLL_BANKING) | (1ULL << TRACK_SLOPE_STEEP_LONG) | (1ULL << TRACK_CURVE_VERTICAL) | (1ULL << TRACK_QUARTER_LOOP) | (1ULL << TRACK_BOOSTER)), + SET_FIELD(EnabledTrackPieces, (1ULL << TRACK_FLAT) | (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) + | (1ULL << TRACK_LIFT_HILL) | (1ULL << TRACK_FLAT_ROLL_BANKING) | (1ULL << TRACK_VERTICAL_LOOP) | (1ULL << TRACK_SLOPE) + | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_SLOPE_CURVE) | (1ULL << TRACK_SLOPE_CURVE_STEEP) | (1ULL << TRACK_S_BEND) + | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_CURVE) | (1ULL << TRACK_HALF_LOOP) | (1ULL << TRACK_CORKSCREW) + | (1ULL << TRACK_HELIX_SMALL) | (1ULL << TRACK_BRAKES) | (1ULL << TRACK_ON_RIDE_PHOTO) | (1ULL << TRACK_SLOPE_VERTICAL) + | (1ULL << TRACK_BARREL_ROLL) | (1ULL << TRACK_POWERED_LIFT) | (1ULL << TRACK_HALF_LOOP_LARGE) + | (1ULL << TRACK_SLOPE_CURVE_BANKED) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_SLOPE_ROLL_BANKING) + | (1ULL << TRACK_SLOPE_STEEP_LONG) | (1ULL << TRACK_CURVE_VERTICAL) | (1ULL << TRACK_QUARTER_LOOP) + | (1ULL << TRACK_BOOSTER)), SET_FIELD(ExtraTrackPieces, (1ULL << TRACK_LIFT_HILL_STEEP) | (1ULL << TRACK_BRAKE_FOR_DROP)), SET_FIELD(CoveredTrackPieces, 0), SET_FIELD(StartTrackPiece, TRACK_ELEM_END_STATION), SET_FIELD(TrackPaintFunction, get_track_paint_function_twister_rc), SET_FIELD(Flags, RIDE_TYPE_FLAGS_TRACK_HAS_3_COLOURS | RIDE_TYPE_FLAG_HAS_LEAVE_WHEN_ANOTHER_VEHICLE_ARRIVES_AT_STATION | RIDE_TYPE_FLAGS_COMMON_COASTER | RIDE_TYPE_FLAGS_COMMON_COASTER_NON_ALT | RIDE_TYPE_FLAG_HAS_LARGE_CURVES | - RIDE_TYPE_FLAG_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG_HAS_RIDE_GROUPS), + RIDE_TYPE_FLAG_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG_ALLOW_MULTIPLE_CIRCUITS), SET_FIELD(RideModes, (1ULL << RIDE_MODE_CONTINUOUS_CIRCUIT) | (1ULL << RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED)), SET_FIELD(DefaultMode, RIDE_MODE_CONTINUOUS_CIRCUIT), SET_FIELD(OperatingSettings, { 10, 27, 30, 17, 68, 0 }), @@ -34,7 +42,7 @@ constexpr const RideTypeDescriptor TwisterRollerCoasterRTD = SET_FIELD(NameConvention, { RIDE_COMPONENT_TYPE_TRAIN, RIDE_COMPONENT_TYPE_TRACK, RIDE_COMPONENT_TYPE_STATION }), SET_FIELD(EnumName, nameof(RIDE_TYPE_TWISTER_ROLLER_COASTER)), SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE)), - SET_FIELD(Heights, { 54, 24, 8, 9, }), + SET_FIELD(Heights, { 40, 24, 8, 9, }), SET_FIELD(MaxMass, 31), SET_FIELD(LiftData, { SoundId::LiftBM, 5, 8 }), SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_twister_roller_coaster), diff --git a/src/openrct2/ride/gentle/meta/CarRide.h b/src/openrct2/ride/gentle/meta/CarRide.h index 8bc3bca552..8abc6d36b2 100644 --- a/src/openrct2/ride/gentle/meta/CarRide.h +++ b/src/openrct2/ride/gentle/meta/CarRide.h @@ -19,7 +19,8 @@ constexpr const RideTypeDescriptor CarRideRTD = { SET_FIELD(AlternateType, RIDE_TYPE_NULL), SET_FIELD(Category, RIDE_CATEGORY_GENTLE), - SET_FIELD(EnabledTrackPieces, (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_SLOPE) | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_CURVE_VERY_SMALL) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_SPINNING_TUNNEL) | (1ULL << TRACK_RAPIDS)), + SET_FIELD(EnabledTrackPieces, (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_SLOPE) + | (1ULL << TRACK_CURVE_VERY_SMALL) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_SPINNING_TUNNEL)), SET_FIELD(ExtraTrackPieces, 0), SET_FIELD(CoveredTrackPieces, 0), SET_FIELD(StartTrackPiece, TRACK_ELEM_END_STATION), @@ -29,7 +30,7 @@ constexpr const RideTypeDescriptor CarRideRTD = RIDE_TYPE_FLAG_HAS_VEHICLE_COLOURS | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR | RIDE_TYPE_FLAG_ALLOW_DOORS_ON_TRACK | RIDE_TYPE_FLAG_ALLOW_MUSIC | RIDE_TYPE_FLAG_HAS_ENTRANCE_EXIT | RIDE_TYPE_FLAG_ALLOW_MORE_VEHICLES_THAN_STATION_FITS | RIDE_TYPE_FLAG_SHOW_IN_TRACK_DESIGNER | - RIDE_TYPE_FLAG_SLIGHTLY_INTERESTING_TO_LOOK_AT | RIDE_TYPE_FLAG_HAS_RIDE_GROUPS), + RIDE_TYPE_FLAG_SLIGHTLY_INTERESTING_TO_LOOK_AT), SET_FIELD(RideModes, (1ULL << RIDE_MODE_CONTINUOUS_CIRCUIT)), SET_FIELD(DefaultMode, RIDE_MODE_CONTINUOUS_CIRCUIT), SET_FIELD(OperatingSettings, { 0, 0, 0, 0, 0, 0 }), diff --git a/src/openrct2/ride/gentle/meta/MonsterTrucks.h b/src/openrct2/ride/gentle/meta/MonsterTrucks.h new file mode 100644 index 0000000000..da6c6dbd04 --- /dev/null +++ b/src/openrct2/ride/gentle/meta/MonsterTrucks.h @@ -0,0 +1,60 @@ +/***************************************************************************** + * Copyright (c) 2014-2020 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 "../../RideData.h" +#include "../../ShopItem.h" +#include "../../Track.h" + +// clang-format off +constexpr const RideTypeDescriptor MonsterTrucksRTD = +{ + SET_FIELD(AlternateType, RIDE_TYPE_NULL), + SET_FIELD(Category, RIDE_CATEGORY_GENTLE), + SET_FIELD(EnabledTrackPieces, (1ULL << TRACK_STRAIGHT) | (1ULL << TRACK_STATION_END) | (1ULL << TRACK_SLOPE) + | (1ULL << TRACK_SLOPE_STEEP) | (1ULL << TRACK_CURVE_VERY_SMALL) | (1ULL << TRACK_CURVE_SMALL) | (1ULL << TRACK_RAPIDS)), + SET_FIELD(ExtraTrackPieces, 0), + SET_FIELD(CoveredTrackPieces, 0), + SET_FIELD(StartTrackPiece, TRACK_ELEM_END_STATION), + SET_FIELD(TrackPaintFunction, get_track_paint_function_car_ride), + SET_FIELD(Flags, RIDE_TYPE_FLAGS_TRACK_HAS_3_COLOURS | RIDE_TYPE_FLAG_CAN_SYNCHRONISE_ADJACENT_STATIONS | + RIDE_TYPE_FLAG_HAS_DATA_LOGGING | RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS | RIDE_TYPE_FLAG_PEEP_WILL_RIDE_AGAIN | + RIDE_TYPE_FLAG_HAS_VEHICLE_COLOURS | RIDE_TYPE_FLAG_HAS_TRACK | RIDE_TYPE_FLAG_SUPPORTS_MULTIPLE_TRACK_COLOUR | + RIDE_TYPE_FLAG_ALLOW_MUSIC | RIDE_TYPE_FLAG_HAS_ENTRANCE_EXIT | + RIDE_TYPE_FLAG_ALLOW_MORE_VEHICLES_THAN_STATION_FITS | RIDE_TYPE_FLAG_SHOW_IN_TRACK_DESIGNER | + RIDE_TYPE_FLAG_SLIGHTLY_INTERESTING_TO_LOOK_AT), + SET_FIELD(RideModes, (1ULL << RIDE_MODE_CONTINUOUS_CIRCUIT)), + SET_FIELD(DefaultMode, RIDE_MODE_CONTINUOUS_CIRCUIT), + SET_FIELD(OperatingSettings, { 0, 0, 0, 0, 0, 0 }), + SET_FIELD(Naming, { STR_RIDE_NAME_MONSTER_TRUCKS, STR_RIDE_DESCRIPTION_MONSTER_TRUCKS_GROUP }), + SET_FIELD(NameConvention, { RIDE_COMPONENT_TYPE_CAR, RIDE_COMPONENT_TYPE_TRACK, RIDE_COMPONENT_TYPE_STATION }), + SET_FIELD(EnumName, nameof(RIDE_TYPE_MONSTER_TRUCKS)), + SET_FIELD(AvailableBreakdowns, (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION)), + SET_FIELD(Heights, { 18, 24, 4, 7, }), + SET_FIELD(MaxMass, 2), + SET_FIELD(LiftData, { SoundId::Null, 5, 5 }), + SET_FIELD(RatingsCalculationFunction, ride_ratings_calculate_car_ride), + SET_FIELD(RatingsMultipliers, { 70, 10, 10 }), + SET_FIELD(UpkeepCosts, { 70, 20, 0, 8, 3, 5 }), + SET_FIELD(BuildCosts, { 25, 5, 30, }), + SET_FIELD(DefaultPrices, { 15, 0 }), + SET_FIELD(DefaultMusic, MUSIC_STYLE_SUMMER), + SET_FIELD(PhotoItem, SHOP_ITEM_PHOTO), + SET_FIELD(BonusValue, 50), + SET_FIELD(ColourPresets, TRACK_COLOUR_PRESETS( + { COLOUR_SATURATED_BROWN, COLOUR_SATURATED_BROWN, COLOUR_GREY }, + { COLOUR_LIGHT_PURPLE, COLOUR_LIGHT_PURPLE, COLOUR_WHITE }, + { COLOUR_BORDEAUX_RED, COLOUR_BORDEAUX_RED, COLOUR_OLIVE_GREEN }, + { COLOUR_GREY, COLOUR_GREY, COLOUR_BLACK }, + )), + SET_FIELD(ColourPreview, { SPR_RIDE_DESIGN_PREVIEW_CAR_RIDE_TRACK, SPR_RIDE_DESIGN_PREVIEW_CAR_RIDE_SUPPORTS }), + SET_FIELD(ColourKey, RideColourKey::Ride), +}; +// clang-format on diff --git a/src/openrct2/windows/_legacy.cpp b/src/openrct2/windows/_legacy.cpp index 872a0586b4..80ea9ee5c0 100644 --- a/src/openrct2/windows/_legacy.cpp +++ b/src/openrct2/windows/_legacy.cpp @@ -17,6 +17,7 @@ #include "../network/network.h" #include "../paint/VirtualFloor.h" #include "../peep/Staff.h" +#include "../ride/RideData.h" #include "../ride/Track.h" #include "../ride/TrackData.h" #include "../world/Banner.h" diff --git a/src/openrct2/world/Wall.cpp b/src/openrct2/world/Wall.cpp index 93da07face..abf7cfd76b 100644 --- a/src/openrct2/world/Wall.cpp +++ b/src/openrct2/world/Wall.cpp @@ -16,7 +16,6 @@ #include "../localisation/StringIds.h" #include "../management/Finance.h" #include "../network/network.h" -#include "../ride/RideGroupManager.h" #include "../ride/Track.h" #include "../ride/TrackData.h" #include "Banner.h" diff --git a/test/tests/testdata/ratings/bpb.sv6.txt b/test/tests/testdata/ratings/bpb.sv6.txt index 201eabd187..834338daac 100644 --- a/test/tests/testdata/ratings/bpb.sv6.txt +++ b/test/tests/testdata/ratings/bpb.sv6.txt @@ -1,4 +1,4 @@ -RIDE_TYPE_CORKSCREW_ROLLER_COASTER: (843, 766, 346) +RIDE_TYPE_HYPERCOASTER: (843, 766, 346) RIDE_TYPE_WOODEN_ROLLER_COASTER: (639, 1011, 626) RIDE_TYPE_WOODEN_ROLLER_COASTER: (702, 734, 428) RIDE_TYPE_MINIATURE_RAILWAY: (465, 37, 27) @@ -16,7 +16,7 @@ RIDE_TYPE_WOODEN_ROLLER_COASTER: (636, 648, 377) RIDE_TYPE_WOODEN_ROLLER_COASTER: (71, 68, 41) RIDE_TYPE_STEEPLECHASE: (607, 509, 351) RIDE_TYPE_STEEPLECHASE: (590, 492, 338) -RIDE_TYPE_JUNIOR_ROLLER_COASTER: (488, 460, 331) +RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER: (488, 460, 331) RIDE_TYPE_SHOP: (-1, 0, 0) RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0) RIDE_TYPE_FOOD_STALL: (-1, 0, 0)