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 },