diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt
index 15cf329813..0e69146f78 100644
--- a/data/language/en-GB.txt
+++ b/data/language/en-GB.txt
@@ -99,6 +99,7 @@ STR_0094 :Single Rail Roller Coaster
STR_0095 :Alpine Coaster
STR_0096 :Classic Wooden Roller Coaster
STR_0097 :Classic Stand-up Roller Coaster
+STR_0098 :LSM Launched 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
@@ -183,6 +184,7 @@ STR_0604 :Riders ride single file on a narrow monorail track, as they race th
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 :An intense, older-style steel looping roller coaster where the riders ride in a standing position
+STR_0608 :Roller coaster trains are accelerated by linear synchronous motors, speeding through tight twists and turns
STR_0767 :Guest {INT32}
STR_0768 :Handyman {INT32}
STR_0769 :Mechanic {INT32}
@@ -3610,7 +3612,7 @@ STR_6537 :Allow using regular paths as queue
STR_6538 :Shows regular paths in the queues dropdown of the Footpaths window.
STR_6539 :Brake Closed
STR_6540 :{WINDOW_COLOUR_2}Special thanks to the following companies for allowing their likeness:
-STR_6541 :{WINDOW_COLOUR_2}Rocky Mountain Construction Group, Josef Wiegand GmbH & Co. KG
+STR_6541 :{WINDOW_COLOUR_2}Rocky Mountain Construction Group, Josef Wiegand GmbH & Co. KG, Intamin Amusement Rides Int. Corp. Est.
STR_6542 :Contributors
STR_6543 :Contributors…
STR_6544 :Loan cannot be negative!
diff --git a/distribution/changelog.txt b/distribution/changelog.txt
index cc81bb8a0c..b149ee2a7b 100644
--- a/distribution/changelog.txt
+++ b/distribution/changelog.txt
@@ -1,8 +1,10 @@
0.4.16 (in development)
------------------------------------------------------------------------
+- Feature: [#20810] New ride type: LSM Launched Roller Coaster.
- Improved: [#22937] Add banked sloped turns and many other pieces to the Corkscrew, Hypercoaster and Lay-down Roller Coaster.
- Improved: [#22967] Add medium and large half loops to the Wooden and Classic Wooden Roller Coasters.
- Improved: [#23010] Make AppImage compatible with Ubuntu 22.04 and Debian Bookworm again.
+- Change: [#20810] Giga Coaster boosters and launched lift hill track pieces are now locked behind cheats.
- Fix: [#21221] Trains use unbanked sprites on flat to gentle diagonal banked track pieces.
- Fix: [#22615] Crash when drawing Space Rings with an invalid ride entry.
- Fix: [#22633] Crash when drawing loading screen with an outdated g2.dat.
diff --git a/resources/g2/sprites.json b/resources/g2/sprites.json
index 4282107096..7105f9b22a 100644
--- a/resources/g2/sprites.json
+++ b/resources/g2/sprites.json
@@ -2711,6 +2711,106 @@
"x": -22,
"y": -5
},
+ {
+ "path": "track/lattice_triangle/booster_alt_1.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/booster_alt_2.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/booster_alt_3.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/booster_alt_4.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/block_brake_alt_closed_1.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/block_brake_alt_closed_2.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/block_brake_alt_closed_3.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/block_brake_alt_closed_4.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/block_brake_alt_open_1.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/block_brake_alt_open_2.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/block_brake_alt_open_3.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/block_brake_alt_open_4.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/brake_alt_closed_1.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/brake_alt_closed_2.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/brake_alt_closed_3.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/brake_alt_closed_4.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/brake_alt_open_1.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/brake_alt_open_2.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/brake_alt_open_3.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/brake_alt_open_4.png",
+ "x": -22,
+ "y": -4
+ },
{
"path": "track/lattice_triangle/brake_horizontal_background_open.png",
"x": -32,
@@ -2748,25 +2848,69 @@
"palette": "keep"
},
{
- "path": "track/lattice_triangle/liftbooster_0.png",
+ "path": "track/lattice_triangle/drive_tyre_1.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/drive_tyre_2.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/drive_tyre_3.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/drive_tyre_4.png",
+ "x": -22,
+ "y": -4
+ },
+ {
+ "path": "track/lattice_triangle/liftbooster_1.png",
"x": -21,
"y": -20,
"palette": "keep"
},
{
- "path": "track/lattice_triangle/liftbooster_1.png",
+ "path": "track/lattice_triangle/liftbooster_2.png",
"x": -21,
"y": -4,
"palette": "keep"
},
{
- "path": "track/lattice_triangle/liftbooster_2.png",
+ "path": "track/lattice_triangle/liftbooster_3.png",
"x": -22,
"y": -4,
"palette": "keep"
},
{
- "path": "track/lattice_triangle/liftbooster_3.png",
+ "path": "track/lattice_triangle/liftbooster_4.png",
+ "x": -22,
+ "y": -20,
+ "palette": "keep"
+ },
+ {
+ "path": "track/lattice_triangle/liftbooster_alt_1.png",
+ "x": -21,
+ "y": -20,
+ "palette": "keep"
+ },
+ {
+ "path": "track/lattice_triangle/liftbooster_alt_2.png",
+ "x": -21,
+ "y": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/lattice_triangle/liftbooster_alt_3.png",
+ "x": -22,
+ "y": -4,
+ "palette": "keep"
+ },
+ {
+ "path": "track/lattice_triangle/liftbooster_alt_4.png",
"x": -22,
"y": -20,
"palette": "keep"
diff --git a/resources/g2/track/lattice_triangle/block_brake_alt_closed_1.png b/resources/g2/track/lattice_triangle/block_brake_alt_closed_1.png
new file mode 100644
index 0000000000..b0a15201b8
Binary files /dev/null and b/resources/g2/track/lattice_triangle/block_brake_alt_closed_1.png differ
diff --git a/resources/g2/track/lattice_triangle/block_brake_alt_closed_2.png b/resources/g2/track/lattice_triangle/block_brake_alt_closed_2.png
new file mode 100644
index 0000000000..5e58c90853
Binary files /dev/null and b/resources/g2/track/lattice_triangle/block_brake_alt_closed_2.png differ
diff --git a/resources/g2/track/lattice_triangle/block_brake_alt_closed_3.png b/resources/g2/track/lattice_triangle/block_brake_alt_closed_3.png
new file mode 100644
index 0000000000..a688b45d76
Binary files /dev/null and b/resources/g2/track/lattice_triangle/block_brake_alt_closed_3.png differ
diff --git a/resources/g2/track/lattice_triangle/block_brake_alt_closed_4.png b/resources/g2/track/lattice_triangle/block_brake_alt_closed_4.png
new file mode 100644
index 0000000000..6613d0e065
Binary files /dev/null and b/resources/g2/track/lattice_triangle/block_brake_alt_closed_4.png differ
diff --git a/resources/g2/track/lattice_triangle/block_brake_alt_open_1.png b/resources/g2/track/lattice_triangle/block_brake_alt_open_1.png
new file mode 100644
index 0000000000..4ff47adf7b
Binary files /dev/null and b/resources/g2/track/lattice_triangle/block_brake_alt_open_1.png differ
diff --git a/resources/g2/track/lattice_triangle/block_brake_alt_open_2.png b/resources/g2/track/lattice_triangle/block_brake_alt_open_2.png
new file mode 100644
index 0000000000..6022dff8b8
Binary files /dev/null and b/resources/g2/track/lattice_triangle/block_brake_alt_open_2.png differ
diff --git a/resources/g2/track/lattice_triangle/block_brake_alt_open_3.png b/resources/g2/track/lattice_triangle/block_brake_alt_open_3.png
new file mode 100644
index 0000000000..a5d3af10a5
Binary files /dev/null and b/resources/g2/track/lattice_triangle/block_brake_alt_open_3.png differ
diff --git a/resources/g2/track/lattice_triangle/block_brake_alt_open_4.png b/resources/g2/track/lattice_triangle/block_brake_alt_open_4.png
new file mode 100644
index 0000000000..2791fb0474
Binary files /dev/null and b/resources/g2/track/lattice_triangle/block_brake_alt_open_4.png differ
diff --git a/resources/g2/track/lattice_triangle/booster_alt_1.png b/resources/g2/track/lattice_triangle/booster_alt_1.png
new file mode 100644
index 0000000000..ef82684579
Binary files /dev/null and b/resources/g2/track/lattice_triangle/booster_alt_1.png differ
diff --git a/resources/g2/track/lattice_triangle/booster_alt_2.png b/resources/g2/track/lattice_triangle/booster_alt_2.png
new file mode 100644
index 0000000000..0c7f079b9c
Binary files /dev/null and b/resources/g2/track/lattice_triangle/booster_alt_2.png differ
diff --git a/resources/g2/track/lattice_triangle/booster_alt_3.png b/resources/g2/track/lattice_triangle/booster_alt_3.png
new file mode 100644
index 0000000000..68232970b1
Binary files /dev/null and b/resources/g2/track/lattice_triangle/booster_alt_3.png differ
diff --git a/resources/g2/track/lattice_triangle/booster_alt_4.png b/resources/g2/track/lattice_triangle/booster_alt_4.png
new file mode 100644
index 0000000000..6f1e08b7ca
Binary files /dev/null and b/resources/g2/track/lattice_triangle/booster_alt_4.png differ
diff --git a/resources/g2/track/lattice_triangle/brake_alt_closed_1.png b/resources/g2/track/lattice_triangle/brake_alt_closed_1.png
new file mode 100644
index 0000000000..a6dc17f5fe
Binary files /dev/null and b/resources/g2/track/lattice_triangle/brake_alt_closed_1.png differ
diff --git a/resources/g2/track/lattice_triangle/brake_alt_closed_2.png b/resources/g2/track/lattice_triangle/brake_alt_closed_2.png
new file mode 100644
index 0000000000..19370f3fa8
Binary files /dev/null and b/resources/g2/track/lattice_triangle/brake_alt_closed_2.png differ
diff --git a/resources/g2/track/lattice_triangle/brake_alt_closed_3.png b/resources/g2/track/lattice_triangle/brake_alt_closed_3.png
new file mode 100644
index 0000000000..1fa69a9ab6
Binary files /dev/null and b/resources/g2/track/lattice_triangle/brake_alt_closed_3.png differ
diff --git a/resources/g2/track/lattice_triangle/brake_alt_closed_4.png b/resources/g2/track/lattice_triangle/brake_alt_closed_4.png
new file mode 100644
index 0000000000..0794391c0f
Binary files /dev/null and b/resources/g2/track/lattice_triangle/brake_alt_closed_4.png differ
diff --git a/resources/g2/track/lattice_triangle/brake_alt_open_1.png b/resources/g2/track/lattice_triangle/brake_alt_open_1.png
new file mode 100644
index 0000000000..1caf0a6e63
Binary files /dev/null and b/resources/g2/track/lattice_triangle/brake_alt_open_1.png differ
diff --git a/resources/g2/track/lattice_triangle/brake_alt_open_2.png b/resources/g2/track/lattice_triangle/brake_alt_open_2.png
new file mode 100644
index 0000000000..fccd9c9db3
Binary files /dev/null and b/resources/g2/track/lattice_triangle/brake_alt_open_2.png differ
diff --git a/resources/g2/track/lattice_triangle/brake_alt_open_3.png b/resources/g2/track/lattice_triangle/brake_alt_open_3.png
new file mode 100644
index 0000000000..0af65c732c
Binary files /dev/null and b/resources/g2/track/lattice_triangle/brake_alt_open_3.png differ
diff --git a/resources/g2/track/lattice_triangle/brake_alt_open_4.png b/resources/g2/track/lattice_triangle/brake_alt_open_4.png
new file mode 100644
index 0000000000..a33b1018b2
Binary files /dev/null and b/resources/g2/track/lattice_triangle/brake_alt_open_4.png differ
diff --git a/resources/g2/track/lattice_triangle/drive_tyre_1.png b/resources/g2/track/lattice_triangle/drive_tyre_1.png
new file mode 100644
index 0000000000..ae2bb9065a
Binary files /dev/null and b/resources/g2/track/lattice_triangle/drive_tyre_1.png differ
diff --git a/resources/g2/track/lattice_triangle/drive_tyre_2.png b/resources/g2/track/lattice_triangle/drive_tyre_2.png
new file mode 100644
index 0000000000..69daa700db
Binary files /dev/null and b/resources/g2/track/lattice_triangle/drive_tyre_2.png differ
diff --git a/resources/g2/track/lattice_triangle/drive_tyre_3.png b/resources/g2/track/lattice_triangle/drive_tyre_3.png
new file mode 100644
index 0000000000..e2852c43b5
Binary files /dev/null and b/resources/g2/track/lattice_triangle/drive_tyre_3.png differ
diff --git a/resources/g2/track/lattice_triangle/drive_tyre_4.png b/resources/g2/track/lattice_triangle/drive_tyre_4.png
new file mode 100644
index 0000000000..b5fdfbe782
Binary files /dev/null and b/resources/g2/track/lattice_triangle/drive_tyre_4.png differ
diff --git a/resources/g2/track/lattice_triangle/liftbooster_1.png b/resources/g2/track/lattice_triangle/liftbooster_1.png
index 62aadbb397..1ffc4de8c9 100644
Binary files a/resources/g2/track/lattice_triangle/liftbooster_1.png and b/resources/g2/track/lattice_triangle/liftbooster_1.png differ
diff --git a/resources/g2/track/lattice_triangle/liftbooster_2.png b/resources/g2/track/lattice_triangle/liftbooster_2.png
index 01f342f00f..62aadbb397 100644
Binary files a/resources/g2/track/lattice_triangle/liftbooster_2.png and b/resources/g2/track/lattice_triangle/liftbooster_2.png differ
diff --git a/resources/g2/track/lattice_triangle/liftbooster_3.png b/resources/g2/track/lattice_triangle/liftbooster_3.png
index 8a56a1bdc6..01f342f00f 100644
Binary files a/resources/g2/track/lattice_triangle/liftbooster_3.png and b/resources/g2/track/lattice_triangle/liftbooster_3.png differ
diff --git a/resources/g2/track/lattice_triangle/liftbooster_4.png b/resources/g2/track/lattice_triangle/liftbooster_4.png
new file mode 100644
index 0000000000..8a56a1bdc6
Binary files /dev/null and b/resources/g2/track/lattice_triangle/liftbooster_4.png differ
diff --git a/resources/g2/track/lattice_triangle/liftbooster_0.png b/resources/g2/track/lattice_triangle/liftbooster_alt_1.png
similarity index 66%
rename from resources/g2/track/lattice_triangle/liftbooster_0.png
rename to resources/g2/track/lattice_triangle/liftbooster_alt_1.png
index 1ffc4de8c9..53fcd60e5d 100644
Binary files a/resources/g2/track/lattice_triangle/liftbooster_0.png and b/resources/g2/track/lattice_triangle/liftbooster_alt_1.png differ
diff --git a/resources/g2/track/lattice_triangle/liftbooster_alt_2.png b/resources/g2/track/lattice_triangle/liftbooster_alt_2.png
new file mode 100644
index 0000000000..8a3dbf41cf
Binary files /dev/null and b/resources/g2/track/lattice_triangle/liftbooster_alt_2.png differ
diff --git a/resources/g2/track/lattice_triangle/liftbooster_alt_3.png b/resources/g2/track/lattice_triangle/liftbooster_alt_3.png
new file mode 100644
index 0000000000..70f4056169
Binary files /dev/null and b/resources/g2/track/lattice_triangle/liftbooster_alt_3.png differ
diff --git a/resources/g2/track/lattice_triangle/liftbooster_alt_4.png b/resources/g2/track/lattice_triangle/liftbooster_alt_4.png
new file mode 100644
index 0000000000..ddbf0414f8
Binary files /dev/null and b/resources/g2/track/lattice_triangle/liftbooster_alt_4.png differ
diff --git a/src/openrct2-ui/windows/NewRide.cpp b/src/openrct2-ui/windows/NewRide.cpp
index ef4043e3d9..b17e59929c 100644
--- a/src/openrct2-ui/windows/NewRide.cpp
+++ b/src/openrct2-ui/windows/NewRide.cpp
@@ -105,6 +105,7 @@ namespace OpenRCT2::Ui::Windows
RIDE_TYPE_HYBRID_COASTER,
RIDE_TYPE_SINGLE_RAIL_ROLLER_COASTER,
RIDE_TYPE_ALPINE_COASTER,
+ RIDE_TYPE_LSM_LAUNCHED_ROLLER_COASTER,
// Gentle rides
RIDE_TYPE_MONORAIL_CYCLES,
diff --git a/src/openrct2/libopenrct2.vcxproj b/src/openrct2/libopenrct2.vcxproj
index b88e708d96..7323e94289 100644
--- a/src/openrct2/libopenrct2.vcxproj
+++ b/src/openrct2/libopenrct2.vcxproj
@@ -449,6 +449,7 @@
+
@@ -920,6 +921,7 @@
+
diff --git a/src/openrct2/paint/track/coaster/LatticeTriangleTrack.cpp b/src/openrct2/paint/track/coaster/LatticeTriangleTrack.cpp
index 2e8ecaacc3..84f425a21f 100644
--- a/src/openrct2/paint/track/coaster/LatticeTriangleTrack.cpp
+++ b/src/openrct2/paint/track/coaster/LatticeTriangleTrack.cpp
@@ -10341,7 +10341,7 @@ static void LatticeTriangleTrackPoweredLift(
const TrackElement& trackElement, SupportType supportType)
{
PaintAddImageAsParentRotated(
- session, direction, session.TrackColours.WithIndex(SPR_G2_LATTICE_TRIANGLE_TRACK_POWERED_LIFT_0 + direction),
+ session, direction, session.TrackColours.WithIndex(SPR_G2_LATTICE_TRIANGLE_TRACK_POWERED_LIFT_1 + direction),
{ 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } });
if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
diff --git a/src/openrct2/paint/track/coaster/LatticeTriangleTrackAlt.cpp b/src/openrct2/paint/track/coaster/LatticeTriangleTrackAlt.cpp
new file mode 100644
index 0000000000..f2623d6649
--- /dev/null
+++ b/src/openrct2/paint/track/coaster/LatticeTriangleTrackAlt.cpp
@@ -0,0 +1,217 @@
+/*****************************************************************************
+ * 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 "../../../drawing/Drawing.h"
+#include "../../../interface/Viewport.h"
+#include "../../../ride/RideData.h"
+#include "../../../ride/TrackData.h"
+#include "../../../ride/TrackPaint.h"
+#include "../../../sprites.h"
+#include "../../../world/Map.h"
+#include "../../../world/tile_element/TrackElement.h"
+#include "../../Paint.h"
+#include "../../support/MetalSupports.h"
+#include "../../tile_element/Paint.TileElement.h"
+#include "../../tile_element/Segment.h"
+#include "../../track/Segment.h"
+#include "../../track/Support.h"
+
+using namespace OpenRCT2;
+
+static constexpr TunnelGroup kTunnelGroup = TunnelGroup::Square;
+
+static constexpr uint32_t _LatticeTriangleAltBrakeImages[kNumOrthogonalDirections][2] = {
+ { SPR_G2_LATTICE_TRIANGLE_TRACK_BRAKE_ALT_OPEN_NE_SW, SPR_G2_LATTICE_TRIANGLE_TRACK_BRAKE_ALT_CLOSED_NE_SW },
+ { SPR_G2_LATTICE_TRIANGLE_TRACK_BRAKE_ALT_OPEN_NW_SE, SPR_G2_LATTICE_TRIANGLE_TRACK_BRAKE_ALT_CLOSED_NW_SE },
+ { SPR_G2_LATTICE_TRIANGLE_TRACK_BRAKE_ALT_OPEN_SW_NE, SPR_G2_LATTICE_TRIANGLE_TRACK_BRAKE_ALT_CLOSED_SW_NE },
+ { SPR_G2_LATTICE_TRIANGLE_TRACK_BRAKE_ALT_OPEN_SE_NW, SPR_G2_LATTICE_TRIANGLE_TRACK_BRAKE_ALT_CLOSED_SE_NW },
+};
+
+static constexpr uint32_t _LatticeTriangleAltBlockBrakeImages[kNumOrthogonalDirections][2] = {
+ { SPR_G2_LATTICE_TRIANGLE_TRACK_BLOCK_BRAKE_ALT_OPEN_NE_SW, SPR_G2_LATTICE_TRIANGLE_TRACK_BLOCK_BRAKE_ALT_CLOSED_NE_SW },
+ { SPR_G2_LATTICE_TRIANGLE_TRACK_BLOCK_BRAKE_ALT_OPEN_NW_SE, SPR_G2_LATTICE_TRIANGLE_TRACK_BLOCK_BRAKE_ALT_CLOSED_NW_SE },
+ { SPR_G2_LATTICE_TRIANGLE_TRACK_BLOCK_BRAKE_ALT_OPEN_SW_NE, SPR_G2_LATTICE_TRIANGLE_TRACK_BLOCK_BRAKE_ALT_CLOSED_SW_NE },
+ { SPR_G2_LATTICE_TRIANGLE_TRACK_BLOCK_BRAKE_ALT_OPEN_SE_NW, SPR_G2_LATTICE_TRIANGLE_TRACK_BLOCK_BRAKE_ALT_CLOSED_SE_NW },
+};
+
+static void LatticeTriangleTrackAltStation(
+ PaintSession& session, const Ride& ride, [[maybe_unused]] uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement, SupportType supportType)
+{
+ if (ride.mode == RideMode::PoweredLaunch || ride.mode == RideMode::PoweredLaunchBlockSectioned
+ || ride.mode == RideMode::PoweredLaunchPasstrough)
+ {
+ static constexpr uint32_t imageIds[4][2] = {
+ { SPR_G2_LATTICE_TRIANGLE_TRACK_BOOSTER_ALT_NE_SW, SPR_STATION_BASE_A_SW_NE },
+ { SPR_G2_LATTICE_TRIANGLE_TRACK_BOOSTER_ALT_NW_SE, SPR_STATION_BASE_A_NW_SE },
+ { SPR_G2_LATTICE_TRIANGLE_TRACK_BOOSTER_ALT_SW_NE, SPR_STATION_BASE_A_SW_NE },
+ { SPR_G2_LATTICE_TRIANGLE_TRACK_BOOSTER_ALT_SE_NW, SPR_STATION_BASE_A_NW_SE },
+ };
+
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours.WithIndex(imageIds[direction][0]), { 0, 0, height },
+ { { 0, 6, height + 3 }, { 32, 20, 1 } });
+
+ PaintAddImageAsParentRotated(
+ session, direction, GetStationColourScheme(session, trackElement).WithIndex(imageIds[direction][1]),
+ { 0, 0, height }, { 32, 32, 1 });
+ }
+ else
+ {
+ static constexpr uint32_t imageIds[4][2] = {
+ { SPR_G2_LATTICE_TRIANGLE_TRACK_DRIVE_TYRE_NE_SW, SPR_STATION_BASE_A_SW_NE },
+ { SPR_G2_LATTICE_TRIANGLE_TRACK_DRIVE_TYRE_NW_SE, SPR_STATION_BASE_A_NW_SE },
+ { SPR_G2_LATTICE_TRIANGLE_TRACK_DRIVE_TYRE_SW_NE, SPR_STATION_BASE_A_SW_NE },
+ { SPR_G2_LATTICE_TRIANGLE_TRACK_DRIVE_TYRE_SE_NW, SPR_STATION_BASE_A_NW_SE },
+ };
+ if (trackElement.GetTrackType() == TrackElemType::EndStation)
+ {
+ bool isClosed = trackElement.IsBrakeClosed();
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours.WithIndex(_LatticeTriangleAltBlockBrakeImages[direction][isClosed]),
+ { 0, 0, height }, { { 0, 6, height + 3 }, { 32, 20, 1 } });
+ }
+ else
+ {
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours.WithIndex(imageIds[direction][0]), { 0, 0, height },
+ { { 0, 6, height + 3 }, { 32, 20, 1 } });
+ }
+
+ PaintAddImageAsParentRotated(
+ session, direction, GetStationColourScheme(session, trackElement).WithIndex(imageIds[direction][1]),
+ { 0, 0, height }, { 32, 32, 1 });
+ }
+ DrawSupportsSideBySide(session, direction, height, session.SupportColours, supportType.metal);
+ TrackPaintUtilDrawStation2(session, ride, direction, height, trackElement, 9, 11);
+ TrackPaintUtilDrawStationTunnel(session, direction, height);
+ PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0);
+ PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight);
+}
+
+static void LatticeTriangleTrackAltBrakes(
+ PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement, SupportType supportType)
+{
+ bool isClosed = trackElement.IsBrakeClosed();
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours.WithIndex(_LatticeTriangleAltBrakeImages[direction][isClosed]),
+ { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } });
+
+ if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
+ {
+ MetalASupportsPaintSetup(
+ session, MetalSupportType::Tubes, MetalSupportPlace::Centre, 0, height, session.SupportColours);
+ }
+ PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat);
+ PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0);
+ PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight);
+}
+
+static void LatticeTriangleTrackAltBlockBrakes(
+ PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement, SupportType supportType)
+{
+ bool isClosed = trackElement.IsBrakeClosed();
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours.WithIndex(_LatticeTriangleAltBlockBrakeImages[direction][isClosed]),
+ { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } });
+
+ if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
+ {
+ MetalASupportsPaintSetup(
+ session, MetalSupportType::Tubes, MetalSupportPlace::Centre, 0, height, session.SupportColours);
+ }
+ PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat);
+ PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0);
+ PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight);
+}
+
+static void LatticeTriangleTrackAltBooster(
+ PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement, SupportType supportType)
+{
+ switch (direction)
+ {
+ case 0:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours.WithIndex(SPR_G2_LATTICE_TRIANGLE_TRACK_BOOSTER_ALT_NE_SW),
+ { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } });
+ break;
+ case 1:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours.WithIndex(SPR_G2_LATTICE_TRIANGLE_TRACK_BOOSTER_ALT_NW_SE),
+ { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } });
+ break;
+ case 2:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours.WithIndex(SPR_G2_LATTICE_TRIANGLE_TRACK_BOOSTER_ALT_SW_NE),
+ { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } });
+ break;
+ case 3:
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours.WithIndex(SPR_G2_LATTICE_TRIANGLE_TRACK_BOOSTER_ALT_SE_NW),
+ { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } });
+ break;
+ }
+ if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
+ {
+ MetalASupportsPaintSetup(
+ session, MetalSupportType::Tubes, MetalSupportPlace::Centre, 0, height, session.SupportColours);
+ }
+ PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat);
+ PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0);
+ PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight);
+}
+
+static void LatticeTriangleTrackAltPoweredLift(
+ PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height,
+ const TrackElement& trackElement, SupportType supportType)
+{
+ PaintAddImageAsParentRotated(
+ session, direction, session.TrackColours.WithIndex(SPR_G2_LATTICE_TRIANGLE_TRACK_POWERED_LIFT_ALT_1 + direction),
+ { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } });
+
+ if (TrackPaintUtilShouldPaintSupports(session.MapPosition))
+ {
+ MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours);
+ }
+ if (direction == 0 || direction == 3)
+ {
+ PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart);
+ }
+ else
+ {
+ PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::SlopeEnd);
+ }
+ PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0);
+ PaintUtilSetGeneralSupportHeight(session, height + 56);
+}
+
+TRACK_PAINT_FUNCTION GetTrackPaintFunctionLatticeTriangleTrackAlt(TrackElemType trackType)
+{
+ switch (trackType)
+ {
+ case TrackElemType::EndStation:
+ case TrackElemType::BeginStation:
+ case TrackElemType::MiddleStation:
+ return LatticeTriangleTrackAltStation;
+ case TrackElemType::Brakes:
+ return LatticeTriangleTrackAltBrakes;
+ case TrackElemType::BlockBrakes:
+ return LatticeTriangleTrackAltBlockBrakes;
+ case TrackElemType::Booster:
+ return LatticeTriangleTrackAltBooster;
+ case TrackElemType::PoweredLift:
+ return LatticeTriangleTrackAltPoweredLift;
+
+ default:
+ return GetTrackPaintFunctionLatticeTriangleTrack(trackType);
+ }
+}
diff --git a/src/openrct2/park/ParkFile.h b/src/openrct2/park/ParkFile.h
index 0dc6c046d0..61c19360ed 100644
--- a/src/openrct2/park/ParkFile.h
+++ b/src/openrct2/park/ParkFile.h
@@ -14,7 +14,7 @@ namespace OpenRCT2
constexpr uint32_t PARK_FILE_CURRENT_VERSION = 42;
// The minimum version that is forwards compatible with the current version.
- constexpr uint32_t PARK_FILE_MIN_VERSION = 40;
+ constexpr uint32_t PARK_FILE_MIN_VERSION = 42;
// The minimum version that is backwards compatible with the current version.
// If this is increased beyond 0, uncomment the checks in ParkFile.cpp and Context.cpp!
diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h
index 214cba38b6..882807edbb 100644
--- a/src/openrct2/ride/Ride.h
+++ b/src/openrct2/ride/Ride.h
@@ -619,6 +619,7 @@ enum
RIDE_TYPE_ALPINE_COASTER,
RIDE_TYPE_CLASSIC_WOODEN_ROLLER_COASTER,
RIDE_TYPE_CLASSIC_STAND_UP_ROLLER_COASTER,
+ RIDE_TYPE_LSM_LAUNCHED_ROLLER_COASTER,
RIDE_TYPE_COUNT
};
diff --git a/src/openrct2/ride/RideData.cpp b/src/openrct2/ride/RideData.cpp
index bf428be178..e503a233b4 100644
--- a/src/openrct2/ride/RideData.cpp
+++ b/src/openrct2/ride/RideData.cpp
@@ -49,6 +49,7 @@
#include "rtd/coaster/InvertedRollerCoaster.h"
#include "rtd/coaster/JuniorRollerCoaster.h"
#include "rtd/coaster/LIMLaunchedRollerCoaster.h"
+#include "rtd/coaster/LSMLaunchedRollerCoaster.h"
#include "rtd/coaster/LayDownRollerCoaster.h"
#include "rtd/coaster/LoopingRollerCoaster.h"
#include "rtd/coaster/MineRide.h"
@@ -352,6 +353,7 @@ constexpr RideTypeDescriptor RideTypeDescriptors[RIDE_TYPE_COUNT] = {
/* RIDE_TYPE_ALPINE_COASTER */ AlpineCoasterRTD,
/* RIDE_TYPE_CLASSIC_WOODEN_ROLLER_COASTER */ ClassicWoodenRollerCoasterRTD,
/* RIDE_TYPE_CLASSIC_STAND_UP_ROLLER_COASTER */ ClassicStandUpRollerCoasterRTD,
+ /* RIDE_TYPE_LSM_LAUNCHED_ROLLER_COASTER */ LSMLaunchedRollerCoasterRTD,
};
bool RideTypeDescriptor::HasFlag(RtdFlag flag) const
diff --git a/src/openrct2/ride/RideData.h b/src/openrct2/ride/RideData.h
index 083ee615db..f82759026c 100644
--- a/src/openrct2/ride/RideData.h
+++ b/src/openrct2/ride/RideData.h
@@ -561,6 +561,7 @@ constexpr std::string_view MUSIC_OBJECT_SUMMER = "rct2.music.summer";
constexpr std::string_view MUSIC_OBJECT_TECHNO = "rct2.music.techno";
constexpr std::string_view MUSIC_OBJECT_WATER = "rct2.music.water";
constexpr std::string_view MUSIC_OBJECT_WILD_WEST = "rct2.music.wildwest";
+constexpr std::string_view MUSIC_OBJECT_MODERN = "rct2.music.modern";
constexpr const RideComponentName& GetRideComponentName(const RideComponentType type)
{
diff --git a/src/openrct2/ride/RideStringIds.h b/src/openrct2/ride/RideStringIds.h
index 03855eba37..928ab36163 100644
--- a/src/openrct2/ride/RideStringIds.h
+++ b/src/openrct2/ride/RideStringIds.h
@@ -37,6 +37,7 @@ enum : StringId
STR_RIDE_NAME_JUNIOR_ROLLER_COASTER = 6,
STR_RIDE_NAME_LAY_DOWN_ROLLER_COASTER = 64,
STR_RIDE_NAME_LIM_LAUNCHED_ROLLER_COASTER = 92,
+ STR_RIDE_NAME_LSM_LAUNCHED_ROLLER_COASTER = 98,
STR_RIDE_NAME_LOOPING_ROLLER_COASTER = 17,
STR_RIDE_NAME_MINE_RIDE = 90,
STR_RIDE_NAME_MINE_TRAIN_COASTER = 19,
@@ -79,6 +80,7 @@ enum : StringId
STR_RIDE_DESCRIPTION_JUNIOR_ROLLER_COASTER = 516,
STR_RIDE_DESCRIPTION_LAY_DOWN_ROLLER_COASTER = 574,
STR_RIDE_DESCRIPTION_LIM_LAUNCHED_ROLLER_COASTER = 602,
+ STR_RIDE_DESCRIPTION_LSM_LAUNCHED_ROLLER_COASTER = 608,
STR_RIDE_DESCRIPTION_LOOPING_ROLLER_COASTER = 527,
STR_RIDE_DESCRIPTION_MINE_RIDE = 600,
STR_RIDE_DESCRIPTION_MINE_TRAIN_COASTER = 529,
diff --git a/src/openrct2/ride/TrackPaint.h b/src/openrct2/ride/TrackPaint.h
index 9519baab66..9fdfbb9f85 100644
--- a/src/openrct2/ride/TrackPaint.h
+++ b/src/openrct2/ride/TrackPaint.h
@@ -607,6 +607,7 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionReverserRC(OpenRCT2::TrackElemType tra
TRACK_PAINT_FUNCTION GetTrackPaintFunctionHeartlineTwisterRC(OpenRCT2::TrackElemType trackType);
TRACK_PAINT_FUNCTION GetTrackPaintFunctionMiniGolf(OpenRCT2::TrackElemType trackType);
TRACK_PAINT_FUNCTION GetTrackPaintFunctionLatticeTriangleTrack(OpenRCT2::TrackElemType trackType);
+TRACK_PAINT_FUNCTION GetTrackPaintFunctionLatticeTriangleTrackAlt(OpenRCT2::TrackElemType trackType);
TRACK_PAINT_FUNCTION GetTrackPaintFunctionRotoDrop(OpenRCT2::TrackElemType trackType);
TRACK_PAINT_FUNCTION GetTrackPaintFunctionFlyingSaucers(OpenRCT2::TrackElemType trackType);
TRACK_PAINT_FUNCTION GetTrackPaintFunctionCrookedHouse(OpenRCT2::TrackElemType trackType);
diff --git a/src/openrct2/ride/rtd/coaster/GigaCoaster.h b/src/openrct2/ride/rtd/coaster/GigaCoaster.h
index 135fde8d2e..fdb2ae56d1 100644
--- a/src/openrct2/ride/rtd/coaster/GigaCoaster.h
+++ b/src/openrct2/ride/rtd/coaster/GigaCoaster.h
@@ -22,8 +22,8 @@ constexpr RideTypeDescriptor GigaCoasterRTD =
.TrackPaintFunctions = TrackDrawerDescriptor({
.Drawer = GetTrackPaintFunctionLatticeTriangleTrack,
.supportType = MetalSupportType::Tubes,
- .enabledTrackGroups = {TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::liftHill, TrackGroup::flatRollBanking, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::slopeCurve, TrackGroup::slopeCurveSteep, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::blockBrakes, TrackGroup::slopeRollBanking, TrackGroup::slopeSteepLong, TrackGroup::liftHillCable, TrackGroup::booster, TrackGroup::poweredLift, TrackGroup::slopeCurveBanked, TrackGroup::slopeCurveLarge, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes, TrackGroup::slopeVertical, TrackGroup::curveVertical},
- .extraTrackGroups = {TrackGroup::barrelRoll, TrackGroup::quarterLoop, TrackGroup::halfLoop, TrackGroup::halfLoopMedium, TrackGroup::halfLoopLarge, TrackGroup::verticalLoop, TrackGroup::corkscrew, TrackGroup::corkscrewLarge, TrackGroup::zeroGRoll, TrackGroup::zeroGRollLarge},
+ .enabledTrackGroups = {TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::liftHill, TrackGroup::flatRollBanking, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::slopeCurve, TrackGroup::slopeCurveSteep, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::blockBrakes, TrackGroup::slopeRollBanking, TrackGroup::slopeSteepLong, TrackGroup::liftHillCable, TrackGroup::slopeCurveBanked, TrackGroup::slopeCurveLarge, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes, TrackGroup::slopeVertical, TrackGroup::curveVertical},
+ .extraTrackGroups = {TrackGroup::barrelRoll, TrackGroup::quarterLoop, TrackGroup::halfLoop, TrackGroup::halfLoopMedium, TrackGroup::halfLoopLarge, TrackGroup::verticalLoop, TrackGroup::corkscrew, TrackGroup::corkscrewLarge, TrackGroup::zeroGRoll, TrackGroup::zeroGRollLarge, TrackGroup::booster, TrackGroup::poweredLift},
}),
.InvertedTrackPaintFunctions = {},
.Flags = kRtdFlagsHasThreeColours | kRtdFlagsCommonCoaster | kRtdFlagsCommonCoasterNonAlt |
diff --git a/src/openrct2/ride/rtd/coaster/LSMLaunchedRollerCoaster.h b/src/openrct2/ride/rtd/coaster/LSMLaunchedRollerCoaster.h
new file mode 100644
index 0000000000..75c8103dbe
--- /dev/null
+++ b/src/openrct2/ride/rtd/coaster/LSMLaunchedRollerCoaster.h
@@ -0,0 +1,90 @@
+/*****************************************************************************
+ * 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 LSMLaunchedRollerCoasterRTD =
+{
+ .Category = RIDE_CATEGORY_ROLLERCOASTER,
+ .StartTrackPiece = OpenRCT2::TrackElemType::EndStation,
+ .TrackPaintFunctions = TrackDrawerDescriptor({
+ .Drawer = GetTrackPaintFunctionLatticeTriangleTrackAlt,
+ .supportType = MetalSupportType::Tubes,
+ .enabledTrackGroups = {TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::flatRollBanking, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::slopeCurve, TrackGroup::slopeCurveSteep, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::blockBrakes, TrackGroup::slopeRollBanking, TrackGroup::slopeSteepLong, TrackGroup::slopeCurveBanked, TrackGroup::slopeCurveLarge, TrackGroup::slopeCurveLargeBanked, TrackGroup::booster, TrackGroup::poweredLift, TrackGroup::slopeVertical, TrackGroup::curveVertical, TrackGroup::barrelRoll, TrackGroup::quarterLoop, TrackGroup::halfLoop, TrackGroup::halfLoopMedium, TrackGroup::halfLoopLarge, TrackGroup::verticalLoop, TrackGroup::corkscrew, TrackGroup::corkscrewLarge, TrackGroup::zeroGRoll, TrackGroup::zeroGRollLarge },
+ .extraTrackGroups = {TrackGroup::liftHill, TrackGroup::liftHillCable},
+ }),
+ .InvertedTrackPaintFunctions = {},
+ .Flags = kRtdFlagsHasThreeColours | kRtdFlagsCommonCoaster | kRtdFlagsCommonCoasterNonAlt |
+ EnumsToFlags(RtdFlag::hasLeaveWhenAnotherVehicleArrivesAtStation, RtdFlag::checkGForces,
+ RtdFlag::allowMultipleCircuits, RtdFlag::allowCableLiftHill, RtdFlag::allowReversedTrains),
+ .RideModes = EnumsToFlags(RideMode::ContinuousCircuit, RideMode::ContinuousCircuitBlockSectioned, RideMode::PoweredLaunch, RideMode::PoweredLaunchBlockSectioned),
+ .DefaultMode = RideMode::ContinuousCircuit,
+ .OperatingSettings = { 2, 10 },
+ .TrackSpeedSettings = { 60, 60 },
+ .BoosterSettings = { 17, 68 },
+ .LegacyBoosterSettings = { 17, 68, 2 },
+ .Naming = { STR_RIDE_NAME_LSM_LAUNCHED_ROLLER_COASTER, STR_RIDE_DESCRIPTION_LSM_LAUNCHED_ROLLER_COASTER },
+ .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station },
+ .EnumName = "RIDE_TYPE_LSM_LAUNCHED_ROLLER_COASTER",
+ .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION),
+ .Heights = { 33, 24, 9, 11, },
+ .MaxMass = 31,
+ .LiftData = { OpenRCT2::Audio::SoundId::LiftClassic, 5, 5 },
+ .RatingsMultipliers = { 51, 32, 10 },
+ .UpkeepCosts = { 10, 20, 80, 12, 3, 40 },
+ .BuildCosts = { 57.00_GBP, 2.50_GBP, 55, },
+ .DefaultPrices = { 20, 20 },
+ .DefaultMusic = MUSIC_OBJECT_MODERN,
+ .PhotoItem = ShopItem::Photo,
+ .BonusValue = 120,
+ .ColourPresets = TRACK_COLOUR_PRESETS(
+ { COLOUR_LIGHT_BLUE, COLOUR_LIGHT_BLUE, COLOUR_BLACK}, // Taiga
+ { COLOUR_BRIGHT_GREEN, COLOUR_BRIGHT_GREEN, COLOUR_YELLOW}, // Cheetah Hunt
+ { COLOUR_BRIGHT_RED, COLOUR_BRIGHT_RED, COLOUR_DULL_BROWN_LIGHT}, // Maverick
+ { COLOUR_BLACK, COLOUR_BLACK, COLOUR_DULL_BROWN_DARK}, // Taron
+ ),
+ .ColourPreview = { SPR_RIDE_DESIGN_PREVIEW_GIGA_RC, SPR_RIDE_DESIGN_PREVIEW_GIGA_RC_SUPPORTS },
+ .ColourKey = RideColourKey::Ride,
+ .Name = "lsm_rc",
+ .RatingsData =
+ {
+ RatingsCalculationType::Normal,
+ { RIDE_RATING(3, 85), RIDE_RATING(0, 40), RIDE_RATING(0, 35) },
+ 14,
+ -1,
+ false,
+ {
+ { RatingsModifierType::BonusLength, 6000, 764, 0, 0 },
+ { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 },
+ { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 },
+ { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 },
+ { RatingsModifierType::BonusAverageSpeed, 0, 291271, 436906, 0 },
+ { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 },
+ { RatingsModifierType::BonusGForces, 0, 24576, 35746, 49648 },
+ { RatingsModifierType::BonusTurns, 0, 26749, 34767, 45749 },
+ { RatingsModifierType::BonusDrops, 0, 29127, 46811, 49152 },
+ { RatingsModifierType::BonusSheltered, 0, 15420, 32768, 35108 },
+ { RatingsModifierType::BonusReversedTrains, 0, 2, 15, 20 },
+ { RatingsModifierType::BonusProximity, 0, 20130, 0, 0 },
+ { RatingsModifierType::BonusScenery, 0, 6693, 0, 0 },
+ { RatingsModifierType::RequirementDropHeight, 10, 2, 2, 2 },
+ { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 2, 2 },
+ { RatingsModifierType::RequirementNegativeGs, 10, 2, 2, 2 },
+ { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 },
+ { RatingsModifierType::PenaltyLateralGs, 0, 24576, 35746, 49648 },
+ },
+ },
+};
+// clang-format on
diff --git a/src/openrct2/sprites.h b/src/openrct2/sprites.h
index e827e024d1..a51ea9ca72 100644
--- a/src/openrct2/sprites.h
+++ b/src/openrct2/sprites.h
@@ -1226,11 +1226,39 @@ enum : ImageIndex
SPR_G2_LATTICE_TRIANGLE_TRACK_BEGIN = SPR_G2_JUNIOR_RC_END,
SPR_G2_LATTICE_TRIANGLE_TRACK_BOOSTER_NE_SW = SPR_G2_LATTICE_TRIANGLE_TRACK_BEGIN,
SPR_G2_LATTICE_TRIANGLE_TRACK_BOOSTER_NW_SE,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_BOOSTER_ALT_NE_SW,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_BOOSTER_ALT_NW_SE,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_BOOSTER_ALT_SW_NE,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_BOOSTER_ALT_SE_NW,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_BLOCK_BRAKE_ALT_CLOSED_NE_SW,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_BLOCK_BRAKE_ALT_CLOSED_NW_SE,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_BLOCK_BRAKE_ALT_CLOSED_SW_NE,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_BLOCK_BRAKE_ALT_CLOSED_SE_NW,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_BLOCK_BRAKE_ALT_OPEN_NE_SW,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_BLOCK_BRAKE_ALT_OPEN_NW_SE,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_BLOCK_BRAKE_ALT_OPEN_SW_NE,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_BLOCK_BRAKE_ALT_OPEN_SE_NW,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_BRAKE_ALT_CLOSED_NE_SW,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_BRAKE_ALT_CLOSED_NW_SE,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_BRAKE_ALT_CLOSED_SW_NE,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_BRAKE_ALT_CLOSED_SE_NW,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_BRAKE_ALT_OPEN_NE_SW,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_BRAKE_ALT_OPEN_NW_SE,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_BRAKE_ALT_OPEN_SW_NE,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_BRAKE_ALT_OPEN_SE_NW,
SPR_G2_LATTICE_TRIANGLE_TRACK_DIAG_BRAKES,
- SPR_G2_LATTICE_TRIANGLE_TRACK_POWERED_LIFT_0 = SPR_G2_LATTICE_TRIANGLE_TRACK_DIAG_BRAKES + 6,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_DRIVE_TYRE_NE_SW = SPR_G2_LATTICE_TRIANGLE_TRACK_DIAG_BRAKES + 6,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_DRIVE_TYRE_NW_SE,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_DRIVE_TYRE_SW_NE,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_DRIVE_TYRE_SE_NW,
SPR_G2_LATTICE_TRIANGLE_TRACK_POWERED_LIFT_1,
SPR_G2_LATTICE_TRIANGLE_TRACK_POWERED_LIFT_2,
SPR_G2_LATTICE_TRIANGLE_TRACK_POWERED_LIFT_3,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_POWERED_LIFT_4,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_POWERED_LIFT_ALT_1,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_POWERED_LIFT_ALT_2,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_POWERED_LIFT_ALT_3,
+ SPR_G2_LATTICE_TRIANGLE_TRACK_POWERED_LIFT_ALT_4,
SPR_G2_LATTICE_TRIANGLE_TRACK_VERTICAL,
SPR_G2_LATTICE_TRIANGLE_TRACK_VERTICAL_TWIST = SPR_G2_LATTICE_TRIANGLE_TRACK_VERTICAL + 12,
SPR_G2_LATTICE_TRIANGLE_TRACK_BARREL_ROLL = SPR_G2_LATTICE_TRIANGLE_TRACK_VERTICAL_TWIST + 12,