1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-28 17:24:47 +01:00
Files
OpenRCT2/src/openrct2/ride/RideGroupManager.cpp
Michael Steenbeek e3c52360db Remove most usages of separate flag
This removes most usages of the separate flag, instead relying on ride groups to do its job.
Research is more complicated and will follow in another commit.
2017-12-08 10:28:29 +01:00

549 lines
31 KiB
C++

#pragma region Copyright (c) 2014-2017 OpenRCT2 Developers
/*****************************************************************************
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
*
* OpenRCT2 is the work of many authors, a full list can be found in contributors.md
* For more information, visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* A full copy of the GNU General Public License can be found in licence.txt
*****************************************************************************/
#pragma endregion
#include <memory>
#include <vector>
#include "RideGroupManager.h"
#include "../config/Config.h"
#include "../core/String.hpp"
#include "../localisation/string_ids.h"
#include "../management/Research.h"
#include "ride.h"
#include "ride_data.h"
#include "Track.h"
#include "TrackData.h"
static 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 },
};
static const RideGroup ride_group_hypercoaster = {
/*.RideType =*/ RIDE_TYPE_CORKSCREW_ROLLER_COASTER,
/*.MaximumHeight =*/ 45,
/*.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 },
};
static 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 },
};
static 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 },
};
static const RideGroup ride_group_steel_twister_rc = {
/*.RideType =*/ RIDE_TYPE_TWISTER_ROLLER_COASTER,
/*.MaximumHeight =*/ 34,
/*.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 },
};
static 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_POWERED_LIFT) | (1ULL << TRACK_SLOPE_CURVE_BANKED) | (1ULL << TRACK_BLOCK_BRAKES) | (1ULL << TRACK_SLOPE_ROLL_BANKING) | (1ULL << TRACK_SLOPE_STEEP_LONG),
/*.Naming =*/ { STR_HYPER_TWISTER_GROUP, STR_HYPER_TWISTER_GROUP_DESC },
};
static 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 },
};
static 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 },
};
static 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 },
};
static 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_SLOPE_CURVE) | (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 },
};
static const RideGroup corkscrew_rc_groups[MAX_RIDE_GROUPS_PER_RIDE_TYPE] = { ride_group_corkscrew_rc, ride_group_hypercoaster };
static const RideGroup junior_rc_groups[MAX_RIDE_GROUPS_PER_RIDE_TYPE] = { ride_group_junior_rc, ride_group_classic_mini_coaster };
static const RideGroup car_ride_groups[MAX_RIDE_GROUPS_PER_RIDE_TYPE] = { ride_group_car_ride, ride_group_monster_trucks };
static const RideGroup twister_rc_groups[MAX_RIDE_GROUPS_PER_RIDE_TYPE] = { ride_group_steel_twister_rc, ride_group_hyper_twister };
static const RideGroup steel_wild_mouse_groups[MAX_RIDE_GROUPS_PER_RIDE_TYPE] = { ride_group_steel_wild_mouse, ride_group_spinning_wild_mouse };
const RideGroup * RideGroupManager::GetRideGroup(const uint8 rideType, const rct_ride_entry * rideEntry)
{
switch (rideType)
{
case RIDE_TYPE_CORKSCREW_ROLLER_COASTER:
if (rideEntry->enabledTrackPieces & (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 (rideEntry->enabledTrackPieces & (1ULL << TRACK_SLOPE_STEEP))
return &ride_group_monster_trucks;
else
return &ride_group_car_ride;
case RIDE_TYPE_TWISTER_ROLLER_COASTER:
if (rideEntry->enabledTrackPieces & (1ULL << TRACK_VERTICAL_LOOP))
return &ride_group_steel_twister_rc;
else
return &ride_group_hyper_twister;
case RIDE_TYPE_STEEL_WILD_MOUSE:
if (rideEntry->enabledTrackPieces & (1ULL << TRACK_SLOPE_STEEP))
return &ride_group_steel_wild_mouse;
else
return &ride_group_spinning_wild_mouse;
default:
return nullptr;
}
}
bool RideGroupManager::RideTypeHasRideGroups(const uint8 rideType)
{
switch (rideType)
{
case RIDE_TYPE_CORKSCREW_ROLLER_COASTER:
case RIDE_TYPE_JUNIOR_ROLLER_COASTER:
case RIDE_TYPE_CAR_RIDE:
case RIDE_TYPE_TWISTER_ROLLER_COASTER:
case RIDE_TYPE_STEEL_WILD_MOUSE:
return true;
default:
return false;
}
}
const RideGroup * RideGroupManager::RideGroupFind(const uint8 rideType, const uint8 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;
}
}
bool RideGroupManager::RideGroupsAreEqual(const RideGroup * a, const RideGroup * b)
{
if (a != nullptr && b != nullptr && (a->Naming.name == b->Naming.name && a->Naming.description == b->Naming.description))
{
return true;
}
return false;
}
bool RideGroupManager::RideGroupIsInvented(const RideGroup * rideGroup)
{
if (!ride_type_is_invented(rideGroup->RideType))
return false;
uint8 *rideEntryIndexPtr = get_ride_entry_indices_for_ride_type(rideGroup->RideType);
while (*rideEntryIndexPtr != RIDE_ENTRY_INDEX_NULL)
{
uint8 rideEntryIndex = *rideEntryIndexPtr++;
if (!ride_entry_is_invented(rideEntryIndex))
continue;
rct_ride_entry *rideEntry = get_ride_entry(rideEntryIndex);
const RideGroup * rideEntryRideGroup = GetRideGroup(rideGroup->RideType, rideEntry);
if (!RideGroupsAreEqual(rideGroup, rideEntryRideGroup))
continue;
// The ride entry is invented and belongs to the same ride group. This means the ride group is invented.
return true;
}
return false;
}
const std::vector<const char *> RideGroupManager::GetPreferredRideEntryOrder(const uint8 rideType)
{
static const std::vector<const char *> preferredRideEntryOrder[] =
{
{ "SPDRCR " }, // RIDE_TYPE_SPIRAL_ROLLER_COASTER
{ "TOGST " }, // RIDE_TYPE_STAND_UP_ROLLER_COASTER
{ "ARRSW1 ", "VEKVAMP ", "ARRSW2 " }, // RIDE_TYPE_SUSPENDED_SWINGING_COASTER
{ "NEMT " }, // RIDE_TYPE_INVERTED_ROLLER_COASTER
{ "ZLDB ", "ZLOG ", "ZPANDA " }, // RIDE_TYPE_JUNIOR_ROLLER_COASTER
{ "NRL ", "NRL2 ", "AML1 ", "TRAM1 " }, // RIDE_TYPE_MINIATURE_RAILWAY
{ "MONO1 ", "MONO2 ", "MONO3 " }, // RIDE_TYPE_MONORAIL
{ "BATFL ", "SKYTR "}, // RIDE_TYPE_MINI_SUSPENDED_COASTER
{ "RBOAT ", "BBOAT ", "CBOAT ", "SWANS ", "TRIKE ", "JSKI " }, // RIDE_TYPE_BOAT_HIRE
{ "WMOUSE ", "WMMINE "}, // RIDE_TYPE_WOODEN_WILD_MOUSE
{ "STEEP1 ", "STEEP2 ", "SBOX " }, // RIDE_TYPE_STEEPLECHASE
{ "SPCAR ", "RCR ", "TRUCK1 ", "VCR ", "CTCAR " }, // RIDE_TYPE_CAR_RIDE
{ "SSC1 " }, // RIDE_TYPE_LAUNCHED_FREEFALL
{ "BOB1 ", "INTBOB " }, // RIDE_TYPE_BOBSLEIGH_COASTER
{ "OBS1 ", "OBS2 " }, // RIDE_TYPE_OBSERVATION_TOWER
{ "SCHT1 " }, // RIDE_TYPE_LOOPING_ROLLER_COASTER
{ "DING1 " }, // RIDE_TYPE_DINGHY_SLIDE
{ "AMT1 " }, // RIDE_TYPE_MINE_TRAIN_COASTER
{ "CLIFT1 ", "CLIFT2 " }, // RIDE_TYPE_CHAIRLIFT
{ "ARRT1 ", "ARRT2 " }, // RIDE_TYPE_CORKSCREW_ROLLER_COASTER
{ }, // RIDE_TYPE_MAZE
{ }, // RIDE_TYPE_SPIRAL_SLIDE
{ "KART1 " }, // RIDE_TYPE_GO_KARTS
{ "LFB1 " }, // RIDE_TYPE_LOG_FLUME
{ "RAPBOAT " }, // RIDE_TYPE_RIVER_RAPIDS
{ }, // RIDE_TYPE_DODGEMS
{ }, // RIDE_TYPE_SWINGING_SHIP
{ }, // RIDE_TYPE_SWINGING_INVERTER_SHIP
{ }, // RIDE_TYPE_FOOD_STALL
{ }, // RIDE_TYPE_1D
{ }, // RIDE_TYPE_DRINK_STALL
{ }, // RIDE_TYPE_1F
{ }, // RIDE_TYPE_SHOP
{ }, // RIDE_TYPE_MERRY_GO_ROUND
{ }, // RIDE_TYPE_22
{ }, // 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
{ "REVF1 " }, // RIDE_TYPE_REVERSE_FREEFALL_COASTER
{ "LIFT1 " }, // RIDE_TYPE_LIFT
{ "BMVD " }, // RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER
{ }, // RIDE_TYPE_CASH_MACHINE
{ }, // RIDE_TYPE_TWIST
{ }, // RIDE_TYPE_HAUNTED_HOUSE
{ }, // RIDE_TYPE_FIRST_AID
{ }, // RIDE_TYPE_CIRCUS
{ "GTC ", "HMCAR " }, // RIDE_TYPE_GHOST_TRAIN
{ "BMSD ", "BMSU ", "BMFL ", "BMRB ", "GOLTR " }, // RIDE_TYPE_TWISTER_ROLLER_COASTER
{ "PTCT1 ", "MFT ", "PTCT2 " }, // RIDE_TYPE_WOODEN_ROLLER_COASTER
{ "SFRIC1 " }, // RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER
{ "SMC1 ", "SMC2 ", "WMSPIN " }, // RIDE_TYPE_STEEL_WILD_MOUSE
{ "ARRX " }, // RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER
{ }, // RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER_ALT
{ "BMAIR " }, // RIDE_TYPE_FLYING_ROLLER_COASTER
{ }, // RIDE_TYPE_FLYING_ROLLER_COASTER_ALT
{ "VREEL " }, // RIDE_TYPE_VIRGINIA_REEL
{ "SPBOAT " }, // RIDE_TYPE_SPLASH_BOATS
{ "HELICAR " }, // RIDE_TYPE_MINI_HELICOPTERS
{ "VEKST " }, // RIDE_TYPE_LAY_DOWN_ROLLER_COASTER
{ "SMONO " }, // RIDE_TYPE_SUSPENDED_MONORAIL
{ }, // RIDE_TYPE_LAY_DOWN_ROLLER_COASTER_ALT
{ "REVCAR " }, // RIDE_TYPE_REVERSER_ROLLER_COASTER
{ "UTCAR ", "UTCARR " }, // RIDE_TYPE_HEARTLINE_TWISTER_COASTER
{ }, // RIDE_TYPE_MINI_GOLF
{ "INTST " }, // RIDE_TYPE_GIGA_COASTER
{ "GDROP1 " }, // RIDE_TYPE_ROTO_DROP
{ }, // RIDE_TYPE_FLYING_SAUCERS
{ }, // RIDE_TYPE_CROOKED_HOUSE
{ "MONBK " }, // RIDE_TYPE_MONORAIL_CYCLES
{ "SLCT ", "SLCFO ", "VEKDV " }, // RIDE_TYPE_COMPACT_INVERTED_COASTER
{ "CSTBOAT " }, // RIDE_TYPE_WATER_COASTER
{ "THCAR " }, // RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER
{ "IVMC1 " }, // RIDE_TYPE_INVERTED_HAIRPIN_COASTER
{ }, // RIDE_TYPE_MAGIC_CARPET
{ "SUBMAR " }, // RIDE_TYPE_SUBMARINE_RIDE
{ "RFTBOAT " }, // RIDE_TYPE_RIVER_RAFTS
{ }, // RIDE_TYPE_50
{ }, // RIDE_TYPE_ENTERPRISE
{ }, // RIDE_TYPE_52
{ }, // RIDE_TYPE_53
{ }, // RIDE_TYPE_54
{ }, // RIDE_TYPE_55
{ "INTINV " }, // RIDE_TYPE_INVERTED_IMPULSE_COASTER
{ "WCATC ", "RCKC ", "JSTAR1 " }, // RIDE_TYPE_MINI_ROLLER_COASTER
{ "PMT1 " }, // RIDE_TYPE_MINE_RIDE
{ }, // RIDE_TYPE_59
{ "PREMT1 " }, // RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER
};
return preferredRideEntryOrder[rideType];
}
/**
* This function keeps a list of the preferred vehicle for every generic track
* type, out of the available vehicle types in the current game. It determines
* which picture is shown on the new ride tab and which train type is selected
* by default.
*/
sint32 RideGroupManager::VehiclePreferenceCompare(const uint8 rideType, const char * a, const char * b)
{
std::vector<const char *> rideEntryOrder = RideGroupManager::GetPreferredRideEntryOrder(rideType);
for (const char * object : rideEntryOrder)
{
if (String::Equals(object, a, true))
{
return -1;
}
if (String::Equals(object, b, true))
{
return 1;
}
}
return 0;
}
bool RideGroupManager::RideTypeIsIndependent(const uint8 rideType)
{
switch (rideType)
{
case RIDE_TYPE_SPIRAL_ROLLER_COASTER:
case RIDE_TYPE_STAND_UP_ROLLER_COASTER:
case RIDE_TYPE_SUSPENDED_SWINGING_COASTER:
case RIDE_TYPE_INVERTED_ROLLER_COASTER:
case RIDE_TYPE_JUNIOR_ROLLER_COASTER:
case RIDE_TYPE_MINIATURE_RAILWAY:
case RIDE_TYPE_MONORAIL:
case RIDE_TYPE_MINI_SUSPENDED_COASTER:
case RIDE_TYPE_BOAT_HIRE:
case RIDE_TYPE_WOODEN_WILD_MOUSE:
case RIDE_TYPE_STEEPLECHASE:
case RIDE_TYPE_CAR_RIDE:
case RIDE_TYPE_LAUNCHED_FREEFALL:
case RIDE_TYPE_BOBSLEIGH_COASTER:
case RIDE_TYPE_OBSERVATION_TOWER:
case RIDE_TYPE_LOOPING_ROLLER_COASTER:
case RIDE_TYPE_DINGHY_SLIDE:
case RIDE_TYPE_MINE_TRAIN_COASTER:
case RIDE_TYPE_CHAIRLIFT:
case RIDE_TYPE_CORKSCREW_ROLLER_COASTER:
case RIDE_TYPE_GO_KARTS:
case RIDE_TYPE_LOG_FLUME:
case RIDE_TYPE_RIVER_RAPIDS:
case RIDE_TYPE_REVERSE_FREEFALL_COASTER:
case RIDE_TYPE_LIFT:
case RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER:
case RIDE_TYPE_GHOST_TRAIN:
case RIDE_TYPE_TWISTER_ROLLER_COASTER:
case RIDE_TYPE_WOODEN_ROLLER_COASTER:
case RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER:
case RIDE_TYPE_STEEL_WILD_MOUSE:
case RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER:
case RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER_ALT:
case RIDE_TYPE_FLYING_ROLLER_COASTER:
case RIDE_TYPE_FLYING_ROLLER_COASTER_ALT:
case RIDE_TYPE_VIRGINIA_REEL:
case RIDE_TYPE_SPLASH_BOATS:
case RIDE_TYPE_MINI_HELICOPTERS:
case RIDE_TYPE_LAY_DOWN_ROLLER_COASTER:
case RIDE_TYPE_SUSPENDED_MONORAIL:
case RIDE_TYPE_LAY_DOWN_ROLLER_COASTER_ALT:
case RIDE_TYPE_REVERSER_ROLLER_COASTER:
case RIDE_TYPE_HEARTLINE_TWISTER_COASTER:
case RIDE_TYPE_GIGA_COASTER:
case RIDE_TYPE_ROTO_DROP:
case RIDE_TYPE_MONORAIL_CYCLES:
case RIDE_TYPE_COMPACT_INVERTED_COASTER:
case RIDE_TYPE_WATER_COASTER:
case RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER:
case RIDE_TYPE_INVERTED_HAIRPIN_COASTER:
case RIDE_TYPE_SUBMARINE_RIDE:
case RIDE_TYPE_RIVER_RAFTS:
case RIDE_TYPE_INVERTED_IMPULSE_COASTER:
case RIDE_TYPE_MINI_ROLLER_COASTER:
case RIDE_TYPE_MINE_RIDE:
case RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER:
return false;
case RIDE_TYPE_MAZE:
case RIDE_TYPE_SPIRAL_SLIDE:
case RIDE_TYPE_DODGEMS:
case RIDE_TYPE_SWINGING_SHIP:
case RIDE_TYPE_SWINGING_INVERTER_SHIP:
case RIDE_TYPE_FOOD_STALL:
case RIDE_TYPE_1D:
case RIDE_TYPE_DRINK_STALL:
case RIDE_TYPE_1F:
case RIDE_TYPE_SHOP:
case RIDE_TYPE_MERRY_GO_ROUND:
case RIDE_TYPE_22:
case RIDE_TYPE_INFORMATION_KIOSK:
case RIDE_TYPE_TOILETS:
case RIDE_TYPE_FERRIS_WHEEL:
case RIDE_TYPE_MOTION_SIMULATOR:
case RIDE_TYPE_3D_CINEMA:
case RIDE_TYPE_TOP_SPIN:
case RIDE_TYPE_SPACE_RINGS:
case RIDE_TYPE_CASH_MACHINE:
case RIDE_TYPE_TWIST:
case RIDE_TYPE_HAUNTED_HOUSE:
case RIDE_TYPE_FIRST_AID:
case RIDE_TYPE_CIRCUS:
case RIDE_TYPE_MINI_GOLF:
case RIDE_TYPE_FLYING_SAUCERS:
case RIDE_TYPE_CROOKED_HOUSE:
case RIDE_TYPE_MAGIC_CARPET:
case RIDE_TYPE_50:
case RIDE_TYPE_ENTERPRISE:
case RIDE_TYPE_52:
case RIDE_TYPE_53:
case RIDE_TYPE_54:
case RIDE_TYPE_55:
case RIDE_TYPE_59:
return true;
}
assert(false);
return true;
}
extern "C"
{
const RideGroup * get_ride_group(uint8 rideType, const rct_ride_entry * rideEntry)
{
return RideGroupManager::GetRideGroup(rideType, rideEntry);
}
bool ride_type_has_ride_groups(const uint8 rideType)
{
return RideGroupManager::RideTypeHasRideGroups(rideType);
}
bool rideTypeIsIndependent(const uint8 rideType)
{
return RideGroupManager::RideTypeIsIndependent(rideType);
}
}
const uint8 gRideCategories[] = {
RIDE_CATEGORY_ROLLERCOASTER, // Spiral Roller coaster
RIDE_CATEGORY_ROLLERCOASTER, // Stand Up Coaster
RIDE_CATEGORY_ROLLERCOASTER, // Suspended Swinging
RIDE_CATEGORY_ROLLERCOASTER, // Inverted
RIDE_CATEGORY_ROLLERCOASTER, // Steel Mini Coaster
RIDE_CATEGORY_TRANSPORT, // Mini Railway
RIDE_CATEGORY_TRANSPORT, // Monorail
RIDE_CATEGORY_ROLLERCOASTER, // Mini Suspended Coaster
RIDE_CATEGORY_WATER, // Boat Hire
RIDE_CATEGORY_ROLLERCOASTER, // Wooden Wild Mine/Mouse
RIDE_CATEGORY_ROLLERCOASTER, // Steeplechase/Motorbike/Soap Box Derby
RIDE_CATEGORY_GENTLE, // Car Ride
RIDE_CATEGORY_THRILL, // Launched Freefall
RIDE_CATEGORY_ROLLERCOASTER, // Bobsleigh Coaster
RIDE_CATEGORY_GENTLE, // Observation Tower
RIDE_CATEGORY_ROLLERCOASTER, // Looping Roller Coaster
RIDE_CATEGORY_WATER, // Dinghy Slide
RIDE_CATEGORY_ROLLERCOASTER, // Mine Train Coaster
RIDE_CATEGORY_TRANSPORT, // Chairlift
RIDE_CATEGORY_ROLLERCOASTER, // Corkscrew Roller Coaster
RIDE_CATEGORY_GENTLE, // Maze
RIDE_CATEGORY_GENTLE, // Spiral Slide
RIDE_CATEGORY_THRILL, // Go Karts
RIDE_CATEGORY_WATER, // Log Flume
RIDE_CATEGORY_WATER, // River Rapids
RIDE_CATEGORY_GENTLE, // Dodgems
RIDE_CATEGORY_THRILL, // Pirate Ship
RIDE_CATEGORY_THRILL, // Swinging Inverter Ship
RIDE_CATEGORY_SHOP, // Food Stall
255, // (none)
RIDE_CATEGORY_SHOP, // Drink Stall
255, // (none)
RIDE_CATEGORY_SHOP, // Shop (all types)
RIDE_CATEGORY_GENTLE, // Merry Go Round
255, // Unknown
RIDE_CATEGORY_SHOP, // Information Kiosk
RIDE_CATEGORY_SHOP, // Bathroom
RIDE_CATEGORY_GENTLE, // Ferris Wheel
RIDE_CATEGORY_THRILL, // Motion Simulator
RIDE_CATEGORY_THRILL, // 3D Cinema
RIDE_CATEGORY_THRILL, // Top Spin
RIDE_CATEGORY_GENTLE, // Space Rings
RIDE_CATEGORY_ROLLERCOASTER, // Reverse Freefall Coaster
RIDE_CATEGORY_TRANSPORT, // Lift
RIDE_CATEGORY_ROLLERCOASTER, // Vertical Drop Roller Coaster
RIDE_CATEGORY_SHOP, // ATM
RIDE_CATEGORY_THRILL, // Twist
RIDE_CATEGORY_GENTLE, // Haunted House
RIDE_CATEGORY_SHOP, // First Aid
RIDE_CATEGORY_GENTLE, // Circus Show
RIDE_CATEGORY_GENTLE, // Ghost Train
RIDE_CATEGORY_ROLLERCOASTER, // Twister Roller Coaster
RIDE_CATEGORY_ROLLERCOASTER, // Wooden Roller Coaster
RIDE_CATEGORY_ROLLERCOASTER, // Side-Friction Roller Coaster
RIDE_CATEGORY_ROLLERCOASTER, // Wild Mouse
RIDE_CATEGORY_ROLLERCOASTER, // Multi Dimension Coaster
255, // (none)
RIDE_CATEGORY_ROLLERCOASTER, // Flying Roller Coaster
255, // (none)
RIDE_CATEGORY_ROLLERCOASTER, // Virginia Reel
RIDE_CATEGORY_WATER, // Splash Boats
RIDE_CATEGORY_GENTLE, // Mini Helicopters
RIDE_CATEGORY_ROLLERCOASTER, // Lay-down Roller Coaster
RIDE_CATEGORY_TRANSPORT, // Suspended Monorail
255, // (none)
RIDE_CATEGORY_ROLLERCOASTER, // Reverser Roller Coaster
RIDE_CATEGORY_ROLLERCOASTER, // Heartline Twister Roller Coaster
RIDE_CATEGORY_GENTLE, // Mini Golf
RIDE_CATEGORY_ROLLERCOASTER, // Giga Coaster
RIDE_CATEGORY_THRILL, // Roto-Drop
RIDE_CATEGORY_GENTLE, // Flying Saucers
RIDE_CATEGORY_GENTLE, // Crooked House
RIDE_CATEGORY_GENTLE, // Monorail Cycles
RIDE_CATEGORY_ROLLERCOASTER, // Compact Inverted Coaster
RIDE_CATEGORY_ROLLERCOASTER, // Water Coaster
RIDE_CATEGORY_ROLLERCOASTER, // Air Powered Vertical Coaster
RIDE_CATEGORY_ROLLERCOASTER, // Inverted Hairpin Coaster
RIDE_CATEGORY_THRILL, // Magic Carpet
RIDE_CATEGORY_WATER, // Submarine Ride
RIDE_CATEGORY_WATER, // River Rafts
255, // (none)
RIDE_CATEGORY_THRILL, // Enterprise
255, // (none)
255, // (none)
255, // (none)
255, // (none)
RIDE_CATEGORY_ROLLERCOASTER, // Inverted Impulse Coaster
RIDE_CATEGORY_ROLLERCOASTER, // Mini Roller Coaster
RIDE_CATEGORY_ROLLERCOASTER, // Mine Ride
255, // 59 Unknown Ride
RIDE_CATEGORY_ROLLERCOASTER // LIM Launched Roller Coaster
};