From cd5c56d8110fd65e50c12d07f1b1aaf06f42237a Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 10 Mar 2024 22:38:04 +0100 Subject: [PATCH] Add Classic Stand-Up Roller Coaster --- data/language/en-GB.txt | 2 + src/openrct2-ui/windows/NewRide.cpp | 1 + src/openrct2/libopenrct2.vcxproj | 2 + src/openrct2/localisation/StringIds.h | 2 + src/openrct2/rct1/Tables.cpp | 6 +- src/openrct2/ride/Ride.h | 1 + src/openrct2/ride/RideData.cpp | 2 + src/openrct2/ride/TrackPaint.h | 1 + .../coaster/ClassicStandUpRollerCoaster.cpp | 61 +++++++++++++ .../meta/ClassicStandUpRollerCoaster.h | 87 +++++++++++++++++++ .../ride/coaster/meta/StandUpRollerCoaster.h | 2 +- 11 files changed, 163 insertions(+), 4 deletions(-) create mode 100644 src/openrct2/ride/coaster/ClassicStandUpRollerCoaster.cpp create mode 100644 src/openrct2/ride/coaster/meta/ClassicStandUpRollerCoaster.h diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index b483ae466b..8fef46f9e5 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -98,6 +98,7 @@ STR_0093 :Hybrid Coaster STR_0094 :Single Rail Roller Coaster STR_0095 :Alpine Coaster STR_0096 :Classic Wooden Roller Coaster +STR_0097 :Classic Stand-up Roller Coaster STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops. STR_0513 :A looping roller coaster where the riders ride in a standing position STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners @@ -181,6 +182,7 @@ STR_0603 :A wooden style roller coaster with a steel track, allowing for stee STR_0604 :Riders ride single file on a narrow monorail track, as they race through tight inversions and direction changes STR_0605 :Riders toboggan down a meandering steel track, braking to control their speed STR_0606 :An older-style wooden roller coaster with a fast and rough ride, with plenty of air-time, some lateral G’s, and designed to feel ‘out-of-control’ +STR_0607 :A looping roller coaster where the riders ride in a standing position STR_0767 :Guest {INT32} STR_0768 :Handyman {INT32} STR_0769 :Mechanic {INT32} diff --git a/src/openrct2-ui/windows/NewRide.cpp b/src/openrct2-ui/windows/NewRide.cpp index a3422995f2..2f43010cff 100644 --- a/src/openrct2-ui/windows/NewRide.cpp +++ b/src/openrct2-ui/windows/NewRide.cpp @@ -80,6 +80,7 @@ namespace OpenRCT2::Ui::Windows RIDE_TYPE_MINE_TRAIN_COASTER, RIDE_TYPE_LOOPING_ROLLER_COASTER, RIDE_TYPE_STAND_UP_ROLLER_COASTER, + RIDE_TYPE_CLASSIC_STAND_UP_ROLLER_COASTER, RIDE_TYPE_CORKSCREW_ROLLER_COASTER, RIDE_TYPE_HYPERCOASTER, RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER, diff --git a/src/openrct2/libopenrct2.vcxproj b/src/openrct2/libopenrct2.vcxproj index 305315edf9..5bf4284f55 100644 --- a/src/openrct2/libopenrct2.vcxproj +++ b/src/openrct2/libopenrct2.vcxproj @@ -396,6 +396,7 @@ + @@ -901,6 +902,7 @@ + diff --git a/src/openrct2/localisation/StringIds.h b/src/openrct2/localisation/StringIds.h index 07ed17fae4..c97e25eb74 100644 --- a/src/openrct2/localisation/StringIds.h +++ b/src/openrct2/localisation/StringIds.h @@ -113,6 +113,7 @@ enum : uint16_t STR_RIDE_NAME_SINGLE_RAIL_ROLLER_COASTER = 94, STR_RIDE_NAME_ALPINE_COASTER = 95, STR_RIDE_NAME_CLASSIC_WOODEN_ROLLER_COASTER = 96, + STR_RIDE_NAME_CLASSIC_STAND_UP_ROLLER_COASTER = 97, STR_RIDE_DESCRIPTION_SPIRAL_ROLLER_COASTER = 512, STR_RIDE_DESCRIPTION_STAND_UP_ROLLER_COASTER = 513, @@ -206,6 +207,7 @@ enum : uint16_t STR_RIDE_DESCRIPTION_SINGLE_RAIL_ROLLER_COASTER = 604, STR_RIDE_DESCRIPTION_ALPINE_COASTER = 605, STR_RIDE_DESCRIPTION_CLASSIC_WOODEN_ROLLER_COASTER = 606, + STR_RIDE_DESCRIPTION_CLASSIC_STAND_UP_ROLLER_COASTER = 607, STR_GUEST_X = 767, STR_HANDYMAN_X = 768, diff --git a/src/openrct2/rct1/Tables.cpp b/src/openrct2/rct1/Tables.cpp index 4a7bc17109..55344ef54d 100644 --- a/src/openrct2/rct1/Tables.cpp +++ b/src/openrct2/rct1/Tables.cpp @@ -173,7 +173,7 @@ namespace RCT1 static uint8_t map[] = { RIDE_TYPE_CLASSIC_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_CLASSIC_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 @@ -705,7 +705,7 @@ namespace RCT1 static constexpr const char * map[] = { "rct1.ride.wooden_rc_trains", // RCT1_RIDE_TYPE_WOODEN_ROLLER_COASTER - "rct2.ride.togst", // RCT1_RIDE_TYPE_STAND_UP_STEEL_ROLLER_COASTER + "rct1.ride.stand_up_trains", // RCT1_RIDE_TYPE_STAND_UP_STEEL_ROLLER_COASTER "rct1.ride.suspended_swinging_cars", // RCT1_RIDE_TYPE_SUSPENDED_ROLLER_COASTER "rct1ll.ride.4_across_inverted_trains", // RCT1_RIDE_TYPE_INVERTED_ROLLER_COASTER "rct1.ride.ladybird_trains", // RCT1_RIDE_TYPE_STEEL_MINI_ROLLER_COASTER @@ -807,7 +807,7 @@ namespace RCT1 "rct1.ride.inverted_trains", // VehicleType::InvertedCoasterTrain//NotinRCT2 "rct1.ride.suspended_swinging_cars", // VehicleType::SuspendedSwingingCars "rct1.ride.ladybird_trains", // VehicleType::LadybirdCars - "rct2.ride.togst", // VehicleType::StandupRollerCoasterCars + "rct1.ride.stand_up_trains", // VehicleType::StandupRollerCoasterCars "rct2.ride.wmspin", // VehicleType::SpinningCars "rct1.ride.single_person_swinging_cars", // VehicleType::SinglePersonSwingingChairs "rct2.ride.swans", // VehicleType::SwansPedalBoats diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h index 417754f84c..c60e26c1dc 100644 --- a/src/openrct2/ride/Ride.h +++ b/src/openrct2/ride/Ride.h @@ -611,6 +611,7 @@ enum RIDE_TYPE_SINGLE_RAIL_ROLLER_COASTER, RIDE_TYPE_ALPINE_COASTER, RIDE_TYPE_CLASSIC_WOODEN_ROLLER_COASTER, + RIDE_TYPE_CLASSIC_STAND_UP_ROLLER_COASTER, RIDE_TYPE_COUNT }; diff --git a/src/openrct2/ride/RideData.cpp b/src/openrct2/ride/RideData.cpp index 623b742d6a..9741aa7dc7 100644 --- a/src/openrct2/ride/RideData.cpp +++ b/src/openrct2/ride/RideData.cpp @@ -34,6 +34,7 @@ #include "coaster/meta/AlpineCoaster.h" #include "coaster/meta/BobsleighCoaster.h" #include "coaster/meta/ClassicMiniRollerCoaster.h" +#include "coaster/meta/ClassicStandUpRollerCoaster.h" #include "coaster/meta/ClassicWoodenRollerCoaster.h" #include "coaster/meta/CompactInvertedCoaster.h" #include "coaster/meta/CorkscrewRollerCoaster.h" @@ -350,6 +351,7 @@ constexpr RideTypeDescriptor RideTypeDescriptors[RIDE_TYPE_COUNT] = { /* RIDE_TYPE_SINGLE_RAIL_ROLLER_COASTER */ SingleRailRollerCoasterRTD, /* RIDE_TYPE_ALPINE_COASTER */ AlpineCoasterRTD, /* RIDE_TYPE_CLASSIC_WOODEN_ROLLER_COASTER */ ClassicWoodenRollerCoasterRTD, + /* RIDE_TYPE_CLASSIC_STAND_UP_ROLLER_COASTER */ ClassicStandUpRollerCoasterRTD, }; bool RideTypeDescriptor::HasFlag(uint64_t flag) const diff --git a/src/openrct2/ride/TrackPaint.h b/src/openrct2/ride/TrackPaint.h index 695f2ce357..a46fb967f6 100644 --- a/src/openrct2/ride/TrackPaint.h +++ b/src/openrct2/ride/TrackPaint.h @@ -494,3 +494,4 @@ namespace AlpineRC TRACK_PAINT_FUNCTION GetTrackPaintFunction(int32_t trackType); } TRACK_PAINT_FUNCTION GetTrackPaintFunctionClassicWoodenRC(int32_t trackType); +TRACK_PAINT_FUNCTION GetTrackPaintFunctionClassicStandUpRC(int32_t trackType); diff --git a/src/openrct2/ride/coaster/ClassicStandUpRollerCoaster.cpp b/src/openrct2/ride/coaster/ClassicStandUpRollerCoaster.cpp new file mode 100644 index 0000000000..999d6b0030 --- /dev/null +++ b/src/openrct2/ride/coaster/ClassicStandUpRollerCoaster.cpp @@ -0,0 +1,61 @@ +/***************************************************************************** + * Copyright (c) 2014-2024 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 "../Track.h" +#include "../TrackPaint.h" + +#include + +TRACK_PAINT_FUNCTION GetTrackPaintFunctionClassicStandUpRC(int32_t trackType) +{ + switch (trackType) + { + case TrackElemType::FlatToLeftBank: + case TrackElemType::FlatToRightBank: + case TrackElemType::LeftBankToFlat: + case TrackElemType::RightBankToFlat: + case TrackElemType::BankedLeftQuarterTurn5Tiles: + case TrackElemType::BankedRightQuarterTurn5Tiles: + case TrackElemType::LeftBankToUp25: + case TrackElemType::RightBankToUp25: + case TrackElemType::Up25ToLeftBank: + case TrackElemType::Up25ToRightBank: + case TrackElemType::LeftBankToDown25: + case TrackElemType::RightBankToDown25: + case TrackElemType::Down25ToLeftBank: + case TrackElemType::Down25ToRightBank: + case TrackElemType::LeftBank: + case TrackElemType::RightBank: + + case TrackElemType::LeftEighthBankToDiag: + case TrackElemType::RightEighthBankToDiag: + case TrackElemType::LeftEighthBankToOrthogonal: + case TrackElemType::RightEighthBankToOrthogonal: + + case TrackElemType::LeftBankedQuarterTurn3Tiles: + case TrackElemType::RightBankedQuarterTurn3Tiles: + case TrackElemType::DiagFlatToLeftBank: + case TrackElemType::DiagFlatToRightBank: + case TrackElemType::DiagLeftBankToFlat: + case TrackElemType::DiagRightBankToFlat: + case TrackElemType::DiagLeftBankToUp25: + case TrackElemType::DiagRightBankToUp25: + case TrackElemType::DiagUp25ToLeftBank: + case TrackElemType::DiagUp25ToRightBank: + case TrackElemType::DiagLeftBankToDown25: + case TrackElemType::DiagRightBankToDown25: + case TrackElemType::DiagDown25ToLeftBank: + case TrackElemType::DiagDown25ToRightBank: + case TrackElemType::DiagLeftBank: + case TrackElemType::DiagRightBank: + return nullptr; + } + + return GetTrackPaintFunctionStandUpRC(trackType); +} diff --git a/src/openrct2/ride/coaster/meta/ClassicStandUpRollerCoaster.h b/src/openrct2/ride/coaster/meta/ClassicStandUpRollerCoaster.h new file mode 100644 index 0000000000..59c387a869 --- /dev/null +++ b/src/openrct2/ride/coaster/meta/ClassicStandUpRollerCoaster.h @@ -0,0 +1,87 @@ +/***************************************************************************** + * Copyright (c) 2014-2024 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 "../../../sprites.h" +#include "../../RideData.h" +#include "../../ShopItem.h" +#include "../../Track.h" + +// clang-format off +constexpr RideTypeDescriptor ClassicStandUpRollerCoasterRTD = +{ + .AlternateType = RIDE_TYPE_NULL, + .Category = RIDE_CATEGORY_ROLLERCOASTER, + .EnabledTrackPieces = {TRACK_STRAIGHT, TRACK_STATION_END, TRACK_LIFT_HILL, TRACK_FLAT_ROLL_BANKING, TRACK_VERTICAL_LOOP, TRACK_SLOPE, TRACK_SLOPE_STEEP_UP, TRACK_SLOPE_STEEP_DOWN, TRACK_SLOPE_CURVE, TRACK_S_BEND, TRACK_CURVE_SMALL, TRACK_CURVE, TRACK_CURVE_LARGE, TRACK_HALF_LOOP, TRACK_CORKSCREW, TRACK_BRAKES, TRACK_ON_RIDE_PHOTO, TRACK_BLOCK_BRAKES, TRACK_DIAG_BRAKES, TRACK_DIAG_BLOCK_BRAKES}, + .ExtraTrackPieces = {}, + .CoveredTrackPieces = {}, + .StartTrackPiece = TrackElemType::EndStation, + .TrackPaintFunctions = TrackDrawerDescriptor(GetTrackPaintFunctionClassicStandUpRC), + .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 | RIDE_TYPE_FLAG_ALLOW_MULTIPLE_CIRCUITS | + RIDE_TYPE_FLAG_ALLOW_REVERSED_TRAINS, + .RideModes = EnumsToFlags(RideMode::ContinuousCircuit, RideMode::ContinuousCircuitBlockSectioned, RideMode::ReverseInclineLaunchedShuttle, RideMode::PoweredLaunchPasstrough, RideMode::PoweredLaunch), + .DefaultMode = RideMode::ContinuousCircuit, + .OperatingSettings = { 7, 27, 0, 0, 0, 0 }, + .Naming = { STR_RIDE_NAME_CLASSIC_STAND_UP_ROLLER_COASTER, STR_RIDE_DESCRIPTION_CLASSIC_STAND_UP_ROLLER_COASTER }, + .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, + .EnumName = nameof(RIDE_TYPE_CLASSIC_STAND_UP_ROLLER_COASTER), + .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), + .Heights = { 25, 24, 9, 11, }, + .MaxMass = 18, + .LiftData = { OpenRCT2::Audio::SoundId::LiftClassic, 4, 6 }, + .RatingsMultipliers = { 50, 30, 10 }, + .UpkeepCosts = { 40, 20, 80, 10, 3, 10 }, + .BuildCosts = { 50.00_GBP, 2.50_GBP, 50, }, + .DefaultPrices = { 20, 20 }, + .DefaultMusic = MUSIC_OBJECT_TECHNO, + .PhotoItem = ShopItem::Photo, + .BonusValue = 90, + .ColourPresets = TRACK_COLOUR_PRESETS( + { COLOUR_BRIGHT_RED, COLOUR_BRIGHT_RED, COLOUR_BLACK }, + { COLOUR_BLACK, COLOUR_LIGHT_BLUE, COLOUR_BLACK }, + { COLOUR_LIGHT_ORANGE, COLOUR_WHITE, COLOUR_LIGHT_ORANGE }, + { COLOUR_BORDEAUX_RED, COLOUR_YELLOW, COLOUR_BORDEAUX_RED }, + { COLOUR_MOSS_GREEN, COLOUR_MOSS_GREEN, COLOUR_WHITE }, + { COLOUR_SATURATED_BROWN, COLOUR_LIGHT_ORANGE, COLOUR_SATURATED_BROWN }, + ), + .ColourPreview = { SPR_RIDE_DESIGN_PREVIEW_STAND_UP_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_STAND_UP_ROLLER_COASTER_SUPPORTS }, + .ColourKey = RideColourKey::Ride, + .Name = "classic_stand_up_rc", + .RatingsData = + { + RatingsCalculationType::Normal, + { RIDE_RATING(2, 50), RIDE_RATING(3, 00), RIDE_RATING(3, 00) }, + 17, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 764, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 10), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 123987, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 24576, 35746, 59578 }, + { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 }, + { RatingsModifierType::BonusDrops, 0, 34952, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 12850, 28398, 30427 }, + { RatingsModifierType::BonusReversedTrains, 0, 2, 20, 30 }, + { RatingsModifierType::BonusProximity, 0, 17893, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 5577, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 12, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 50), 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 24576, 35746, 59578 }, + }, + }, +}; +// clang-format on diff --git a/src/openrct2/ride/coaster/meta/StandUpRollerCoaster.h b/src/openrct2/ride/coaster/meta/StandUpRollerCoaster.h index 7436991e68..31042f6a15 100644 --- a/src/openrct2/ride/coaster/meta/StandUpRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/StandUpRollerCoaster.h @@ -28,7 +28,7 @@ constexpr RideTypeDescriptor StandUpRollerCoasterRTD = RIDE_TYPE_FLAGS_COMMON_COASTER | RIDE_TYPE_FLAGS_COMMON_COASTER_NON_ALT | RIDE_TYPE_FLAG_PEEP_CHECK_GFORCES | RIDE_TYPE_FLAG_ALLOW_MULTIPLE_CIRCUITS | RIDE_TYPE_FLAG_ALLOW_REVERSED_TRAINS, - .RideModes = EnumsToFlags(RideMode::ContinuousCircuit, RideMode::ContinuousCircuitBlockSectioned, RideMode::ReverseInclineLaunchedShuttle, RideMode::PoweredLaunchPasstrough, RideMode::PoweredLaunch), + .RideModes = EnumsToFlags(RideMode::ContinuousCircuit, RideMode::ContinuousCircuitBlockSectioned), .DefaultMode = RideMode::ContinuousCircuit, .OperatingSettings = { 7, 27, 0, 0, 0, 0 }, .Naming = { STR_RIDE_NAME_STAND_UP_ROLLER_COASTER, STR_RIDE_DESCRIPTION_STAND_UP_ROLLER_COASTER },