/***************************************************************************** * Copyright (c) 2014-2023 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. *****************************************************************************/ /** * Whether a particular ride has a running track or not. Will probably end up * being used in various places in the game. * * Data source is 0x0097E3AC * * Generating function is here * https://gist.github.com/kevinburke/eaeb1d8149a6eef0dcc1 */ #include "RideData.h" #include "../Cheats.h" #include "../audio/audio.h" #include "../interface/Colour.h" #include "../localisation/Localisation.h" #include "../management/Research.h" #include "../sprites.h" #include "Ride.h" #include "ShopItem.h" #include "Track.h" #include "Vehicle.h" #include "coaster/meta/AirPoweredVerticalCoaster.h" #include "coaster/meta/AlpineCoaster.h" #include "coaster/meta/BobsleighCoaster.h" #include "coaster/meta/ClassicMiniRollerCoaster.h" #include "coaster/meta/ClassicWoodenRollerCoaster.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/HybridCoaster.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" #include "coaster/meta/JuniorRollerCoaster.h" #include "coaster/meta/LIMLaunchedRollerCoaster.h" #include "coaster/meta/LayDownRollerCoaster.h" #include "coaster/meta/LoopingRollerCoaster.h" #include "coaster/meta/MineRide.h" #include "coaster/meta/MineTrainCoaster.h" #include "coaster/meta/MiniRollerCoaster.h" #include "coaster/meta/MiniSuspendedCoaster.h" #include "coaster/meta/MultiDimensionRollerCoaster.h" #include "coaster/meta/ReverseFreefallCoaster.h" #include "coaster/meta/ReverserRollerCoaster.h" #include "coaster/meta/SideFrictionRollerCoaster.h" #include "coaster/meta/SingleRailRollerCoaster.h" #include "coaster/meta/SpinningWildMouse.h" #include "coaster/meta/SpiralRollerCoaster.h" #include "coaster/meta/StandUpRollerCoaster.h" #include "coaster/meta/SteelWildMouse.h" #include "coaster/meta/Steeplechase.h" #include "coaster/meta/SuspendedSwingingCoaster.h" #include "coaster/meta/TwisterRollerCoaster.h" #include "coaster/meta/VerticalDropCoaster.h" #include "coaster/meta/VirginiaReel.h" #include "coaster/meta/WaterCoaster.h" #include "coaster/meta/WoodenRollerCoaster.h" #include "coaster/meta/WoodenWildMouse.h" #include "gentle/meta/CarRide.h" #include "gentle/meta/Circus.h" #include "gentle/meta/CrookedHouse.h" #include "gentle/meta/Dodgems.h" #include "gentle/meta/FerrisWheel.h" #include "gentle/meta/FlyingSaucers.h" #include "gentle/meta/GhostTrain.h" #include "gentle/meta/HauntedHouse.h" #include "gentle/meta/Maze.h" #include "gentle/meta/MerryGoRound.h" #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" #include "shops/meta/CashMachine.h" #include "shops/meta/DrinkStall.h" #include "shops/meta/FirstAid.h" #include "shops/meta/FoodStall.h" #include "shops/meta/InformationKiosk.h" #include "shops/meta/Shop.h" #include "shops/meta/Toilets.h" #include "thrill/meta/3DCinema.h" #include "thrill/meta/Enterprise.h" #include "thrill/meta/GoKarts.h" #include "thrill/meta/LaunchedFreefall.h" #include "thrill/meta/MagicCarpet.h" #include "thrill/meta/MotionSimulator.h" #include "thrill/meta/RotoDrop.h" #include "thrill/meta/SwingingInverterShip.h" #include "thrill/meta/SwingingShip.h" #include "thrill/meta/TopSpin.h" #include "thrill/meta/Twist.h" #include "transport/meta/Chairlift.h" #include "transport/meta/Lift.h" #include "transport/meta/MiniatureRailway.h" #include "transport/meta/Monorail.h" #include "transport/meta/SuspendedMonorail.h" #include "water/meta/BoatHire.h" #include "water/meta/DinghySlide.h" #include "water/meta/LogFlume.h" #include "water/meta/RiverRafts.h" #include "water/meta/RiverRapids.h" #include "water/meta/SplashBoats.h" #include "water/meta/SubmarineRide.h" #include using namespace OpenRCT2::Entity::Yaw; // clang-format off const CarEntry CableLiftVehicle = { /* .TabRotationMask = */ 31, /* .spacing = */ 0, /* .car_mass = */ 0, /* .tab_height = */ 0, /* .num_seats = */ 0, /* .sprite_width = */ 0, /* .sprite_height_negative = */ 0, /* .sprite_height_positive = */ 0, /* .animation = */ 0, /* .flags = */ 0, /* .base_num_frames = */ 1, /* .base_image_id = */ 29110, /* .SpriteGroups[SlopeFlat] = */ 29110, SpritePrecision::Sprites32, /* .SpriteGroups[Slopes12] = */ 29142, SpritePrecision::Sprites4, /* .SpriteGroups[Slopes25] = */ 29150, SpritePrecision::Sprites32, /* .SpriteGroups[Slopes42] = */ 29214, SpritePrecision::Sprites8, /* .SpriteGroups[Slopes60] = */ 29230, SpritePrecision::Sprites32, /* .SpriteGroups[Slopes75] = */ 0, SpritePrecision::None, /* .SpriteGroups[Slopes90] = */ 0, SpritePrecision::None, /* .SpriteGroups[SlopesLoop] = */ 0, SpritePrecision::None, /* .SpriteGroups[SlopeInverted] = */ 0, SpritePrecision::None, /* .SpriteGroups[Slopes8] = */ 0, SpritePrecision::None, /* .SpriteGroups[Slopes16] = */ 0, SpritePrecision::None, /* .SpriteGroups[Slopes50] = */ 0, SpritePrecision::None, /* .SpriteGroups[FlatBanked22] = */ 0, SpritePrecision::None, /* .SpriteGroups[FlatBanked45] = */ 0, SpritePrecision::None, /* .SpriteGroups[FlatBanked67] = */ 0, SpritePrecision::None, /* .SpriteGroups[FlatBanked90] = */ 0, SpritePrecision::None, /* .SpriteGroups[InlineTwists] = */ 0, SpritePrecision::None, /* .SpriteGroups[Slopes12Banked22] = */ 0, SpritePrecision::None, /* .SpriteGroups[Slopes8Banked22] = */ 0, SpritePrecision::None, /* .SpriteGroups[Slopes25Banked22] = */ 0, SpritePrecision::None, /* .SpriteGroups[Slopes25Banked45] = */ 0, SpritePrecision::None, /* .SpriteGroups[Slopes12Banked45] = */ 0, SpritePrecision::None, /* .SpriteGroups[Slopes25Banked67] = */ 0, SpritePrecision::None, /* .SpriteGroups[Slopes25Banked90] = */ 0, SpritePrecision::None, /* .SpriteGroups[Slopes25InlineTwists] = */ 0, SpritePrecision::None, /* .SpriteGroups[Slopes42Banked22] = */ 0, SpritePrecision::None, /* .SpriteGroups[Slopes42Banked45] = */ 0, SpritePrecision::None, /* .SpriteGroups[Slopes42Banked67] = */ 0, SpritePrecision::None, /* .SpriteGroups[Slopes42Banked90] = */ 0, SpritePrecision::None, /* .SpriteGroups[Slopes60Banked22] = */ 0, SpritePrecision::None, /* .SpriteGroups[Corkscrews] = */ 0, SpritePrecision::None, /* .SpriteGroups[RestraintAnimation] = */ 0, SpritePrecision::None, /* .SpriteGroups[CurvedLiftHill] = */ 0, SpritePrecision::None, /* .no_vehicle_images = */ 0, /* .no_seating_rows = */ 0, /* .spinning_inertia = */ 0, /* .spinning_friction = */ 255, /* .friction_sound_id = */ OpenRCT2::Audio::SoundId::LiftClassic, /* .log_flume_reverser_vehicle_type = */ 0, /* .sound_range = */ 0, /* .double_sound_frequency = */ 0, /* .powered_acceleration = */ 0, /* .powered_max_speed = */ 0, /* .PaintStyle = */ 0, /* .effect_visual = */ 1, /* .draw_order = */ 14, /* .num_vertical_frames_override = */ 0, /* .peep_loading_positions = */ 0 }; /* rct2: 0x009A0AA0 */ const uint16_t RideFilmLength[3] = { 5000, // MOUSE_TAILS 6000, // STORM_CHASERS 7000, // SPACE_RAIDERS }; const StringId RideModeNames[] = { STR_RIDE_MODE_NORMAL, STR_RIDE_MODE_CONTINUOUS_CIRCUIT, STR_RIDE_MODE_REVERSE_INCLINE_LAUNCHED_SHUTTLE, STR_RIDE_MODE_POWERED_LAUNCH_PASSTROUGH, STR_RIDE_MODE_SHUTTLE, STR_RIDE_MODE_BOAT_HIRE, STR_RIDE_MODE_UPWARD_LAUNCH, STR_RIDE_MODE_ROTATING_LIFT, STR_RIDE_MODE_STATION_TO_STATION, STR_RIDE_MODE_SINGLE_RIDE_PER_ADMISSION, STR_RIDE_MODE_UNLIMITED_RIDES_PER_ADMISSION, STR_RIDE_MODE_MAZE, STR_RIDE_MODE_RACE, STR_RIDE_MODE_DODGEMS, STR_RIDE_MODE_SWING, STR_RIDE_MODE_SHOP_STALL, STR_RIDE_MODE_ROTATION, STR_RIDE_MODE_FORWARD_ROTATION, STR_RIDE_MODE_BACKWARD_ROTATION, STR_RIDE_MODE_FILM_AVENGING_AVIATORS, STR_RIDE_MODE_3D_FILM_MOUSE_TAILS, STR_RIDE_MODE_SPACE_RINGS, STR_RIDE_MODE_BEGINNERS, STR_RIDE_MODE_LIM_POWERED_LAUNCH, STR_RIDE_MODE_FILM_THRILL_RIDERS, STR_RIDE_MODE_3D_FILM_STORM_CHASERS, STR_RIDE_MODE_3D_FILM_SPACE_RAIDERS, STR_RIDE_MODE_INTENSE, STR_RIDE_MODE_BERSERK, STR_RIDE_MODE_HAUNTED_HOUSE, STR_RIDE_MODE_CIRCUS_SHOW, STR_RIDE_MODE_DOWNWARD_LAUNCH, STR_RIDE_MODE_CROOKED_HOUSE, STR_RIDE_MODE_FREEFALL_DROP, STR_RIDE_MODE_CONTINUOUS_CIRCUIT_BLOCK_SECTIONED, STR_RIDE_MODE_POWERED_LAUNCH, STR_RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED_MODE, }; // clang-format on constexpr const RideTypeDescriptor RideTypeDescriptors[RIDE_TYPE_COUNT] = { /* RIDE_TYPE_SPIRAL_ROLLER_COASTER */ SpiralRollerCoasterRTD, /* RIDE_TYPE_STAND_UP_ROLLER_COASTER */ StandUpRollerCoasterRTD, /* RIDE_TYPE_SUSPENDED_SWINGING_COASTER */ SuspendedSwingingCoasterRTD, /* RIDE_TYPE_INVERTED_ROLLER_COASTER */ InvertedRollerCoasterRTD, /* RIDE_TYPE_JUNIOR_ROLLER_COASTER */ JuniorRollerCoasterRTD, /* RIDE_TYPE_MINIATURE_RAILWAY */ MiniatureRailwayRTD, /* RIDE_TYPE_MONORAIL */ MonorailRTD, /* RIDE_TYPE_MINI_SUSPENDED_COASTER */ MiniSuspendedCoasterRTD, /* RIDE_TYPE_BOAT_HIRE */ BoatHireRTD, /* RIDE_TYPE_WOODEN_WILD_MOUSE */ WoodenWildMouseRTD, /* RIDE_TYPE_STEEPLECHASE */ SteeplechaseRTD, /* RIDE_TYPE_CAR_RIDE */ CarRideRTD, /* RIDE_TYPE_LAUNCHED_FREEFALL */ LaunchedFreefallRTD, /* RIDE_TYPE_BOBSLEIGH_COASTER */ BobsleighCoasterRTD, /* RIDE_TYPE_OBSERVATION_TOWER */ ObservationTowerRTD, /* RIDE_TYPE_LOOPING_ROLLER_COASTER */ LoopingRollerCoasterRTD, /* RIDE_TYPE_DINGHY_SLIDE */ DinghySlideRTD, /* RIDE_TYPE_MINE_TRAIN_COASTER */ MineTrainCoasterRTD, /* RIDE_TYPE_CHAIRLIFT */ ChairliftRTD, /* RIDE_TYPE_CORKSCREW_ROLLER_COASTER */ CorkscrewRollerCoasterRTD, /* RIDE_TYPE_MAZE */ MazeRTD, /* RIDE_TYPE_SPIRAL_SLIDE */ SpiralSlideRTD, /* RIDE_TYPE_GO_KARTS */ GoKartsRTD, /* RIDE_TYPE_LOG_FLUME */ LogFlumeRTD, /* RIDE_TYPE_RIVER_RAPIDS */ RiverRapidsRTD, /* RIDE_TYPE_DODGEMS */ DodgemsRTD, /* RIDE_TYPE_SWINGING_SHIP */ SwingingShipRTD, /* RIDE_TYPE_SWINGING_INVERTER_SHIP */ SwingingInverterShipRTD, /* RIDE_TYPE_FOOD_STALL */ FoodStallRTD, /* RIDE_TYPE_1D */ DummyRTD, /* RIDE_TYPE_DRINK_STALL */ DrinkStallRTD, /* RIDE_TYPE_1F */ DummyRTD, /* RIDE_TYPE_SHOP */ ShopRTD, /* RIDE_TYPE_MERRY_GO_ROUND */ MerryGoRoundRTD, /* RIDE_TYPE_22 */ DummyRTD, /* RIDE_TYPE_INFORMATION_KIOSK */ InformationKioskRTD, /* RIDE_TYPE_TOILETS */ ToiletsRTD, /* RIDE_TYPE_FERRIS_WHEEL */ FerrisWheelRTD, /* RIDE_TYPE_MOTION_SIMULATOR */ MotionSimulatorRTD, /* RIDE_TYPE_3D_CINEMA */ CinemaRTD, /* RIDE_TYPE_TOP_SPIN */ TopSpinRTD, /* RIDE_TYPE_SPACE_RINGS */ SpaceRingsRTD, /* RIDE_TYPE_REVERSE_FREEFALL_COASTER */ ReverseFreefallCoasterRTD, /* RIDE_TYPE_LIFT */ LiftRTD, /* RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER */ VerticalDropCoasterRTD, /* RIDE_TYPE_CASH_MACHINE */ CashMachineRTD, /* RIDE_TYPE_TWIST */ TwistRTD, /* RIDE_TYPE_HAUNTED_HOUSE */ HauntedHouseRTD, /* RIDE_TYPE_FIRST_AID */ FirstAidRTD, /* RIDE_TYPE_CIRCUS */ CircusRTD, /* RIDE_TYPE_GHOST_TRAIN */ GhostTrainRTD, /* RIDE_TYPE_TWISTER_ROLLER_COASTER */ TwisterRollerCoasterRTD, /* RIDE_TYPE_WOODEN_ROLLER_COASTER */ WoodenRollerCoasterRTD, /* RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER */ SideFrictionRollerCoasterRTD, /* RIDE_TYPE_STEEL_WILD_MOUSE */ SteelWildMouseRTD, /* RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER */ MultiDimensionRollerCoasterRTD, /* RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER_ALT */ MultiDimensionRollerCoasterAltRTD, /* RIDE_TYPE_FLYING_ROLLER_COASTER */ FlyingRollerCoasterRTD, /* RIDE_TYPE_FLYING_ROLLER_COASTER_ALT */ FlyingRollerCoasterAltRTD, /* RIDE_TYPE_VIRGINIA_REEL */ VirginiaReelRTD, /* RIDE_TYPE_SPLASH_BOATS */ SplashBoatsRTD, /* RIDE_TYPE_MINI_HELICOPTERS */ MiniHelicoptersRTD, /* RIDE_TYPE_LAY_DOWN_ROLLER_COASTER */ LayDownRollerCoasterRTD, /* RIDE_TYPE_SUSPENDED_MONORAIL */ SuspendedMonorailRTD, /* RIDE_TYPE_LAY_DOWN_ROLLER_COASTER_ALT */ LayDownRollerCoasterAltRTD, /* RIDE_TYPE_REVERSER_ROLLER_COASTER */ ReverserRollerCoasterRTD, /* RIDE_TYPE_HEARTLINE_TWISTER_COASTER */ HeartlineTwisterCoasterRTD, /* RIDE_TYPE_MINI_GOLF */ MiniGolfRTD, /* RIDE_TYPE_GIGA_COASTER */ GigaCoasterRTD, /* RIDE_TYPE_ROTO_DROP */ RotoDropRTD, /* RIDE_TYPE_FLYING_SAUCERS */ FlyingSaucersRTD, /* RIDE_TYPE_CROOKED_HOUSE */ CrookedHouseRTD, /* RIDE_TYPE_MONORAIL_CYCLES */ MonorailCyclesRTD, /* RIDE_TYPE_COMPACT_INVERTED_COASTER */ CompactInvertedCoasterRTD, /* RIDE_TYPE_WATER_COASTER */ WaterCoasterRTD, /* RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER */ AirPoweredVerticalCoasterRTD, /* RIDE_TYPE_INVERTED_HAIRPIN_COASTER */ InvertedHairpinCoasterRTD, /* RIDE_TYPE_MAGIC_CARPET */ MagicCarpetRTD, /* RIDE_TYPE_SUBMARINE_RIDE */ SubmarineRideRTD, /* RIDE_TYPE_RIVER_RAFTS */ RiverRaftsRTD, /* RIDE_TYPE_50 */ DummyRTD, /* RIDE_TYPE_ENTERPRISE */ EnterpriseRTD, /* RIDE_TYPE_52 */ DummyRTD, /* RIDE_TYPE_53 */ DummyRTD, /* RIDE_TYPE_54 */ DummyRTD, /* RIDE_TYPE_55 */ DummyRTD, /* RIDE_TYPE_INVERTED_IMPULSE_COASTER */ InvertedImpulseCoasterRTD, /* RIDE_TYPE_MINI_ROLLER_COASTER */ MiniRollerCoasterRTD, /* 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, /* RIDE_TYPE_HYBRID_COASTER */ HybridCoasterRTD, /* RIDE_TYPE_SINGLE_RAIL_ROLLER_COASTER */ SingleRailRollerCoasterRTD, /* RIDE_TYPE_ALPINE_COASTER */ AlpineCoasterRTD, /* RIDE_TYPE_CLASSIC_WOODEN_ROLLER_COASTER */ ClassicWoodenRollerCoasterRTD, }; bool RideTypeDescriptor::HasFlag(uint64_t flag) const { return Flags & flag; } void RideTypeDescriptor::GetAvailableTrackPieces(RideTrackGroup& res) const { res = EnabledTrackPieces; if (gCheatsEnableAllDrawableTrackPieces) res |= ExtraTrackPieces; } bool RideTypeDescriptor::SupportsTrackPiece(const uint64_t trackPiece) const { return EnabledTrackPieces.get(trackPiece) || (gCheatsEnableAllDrawableTrackPieces && ExtraTrackPieces.get(trackPiece)); } ResearchCategory RideTypeDescriptor::GetResearchCategory() const { switch (Category) { case RIDE_CATEGORY_TRANSPORT: return ResearchCategory::Transport; case RIDE_CATEGORY_GENTLE: return ResearchCategory::Gentle; case RIDE_CATEGORY_ROLLERCOASTER: return ResearchCategory::Rollercoaster; case RIDE_CATEGORY_THRILL: return ResearchCategory::Thrill; case RIDE_CATEGORY_WATER: return ResearchCategory::Water; case RIDE_CATEGORY_SHOP: return ResearchCategory::Shop; case RIDE_CATEGORY_NONE: break; } log_error("Cannot get Research Category of invalid RideCategory"); return ResearchCategory::Transport; } bool RideTypeDescriptor::SupportsRideMode(RideMode rideMode) const { return RideModes & EnumToFlag(rideMode); } static RideTrackGroup _enabledRidePieces = {}; static RideTrackGroup _disabledRidePieces = {}; bool IsTrackEnabled(int32_t trackFlagIndex) { return _enabledRidePieces.get(trackFlagIndex); } void UpdateEnabledRidePieces(ride_type_t rideType) { GetRideTypeDescriptor(rideType).GetAvailableTrackPieces(_enabledRidePieces); if (!gCheatsEnableAllDrawableTrackPieces) { _enabledRidePieces &= ~_disabledRidePieces; } } void UpdateDisabledRidePieces(const RideTrackGroup& res) { _disabledRidePieces = res; }