diff --git a/resources/g2/sprites.json b/resources/g2/sprites.json index 40d397ca9c..6ad0d77b57 100644 --- a/resources/g2/sprites.json +++ b/resources/g2/sprites.json @@ -24488,5 +24488,305 @@ "x_offset": -5, "y_offset": -20, "palette": "keep" + }, + { + "path": "track/junior/brake_horizontal.png", + "x_offset": -32, + "y_offset": 7, + "palette": "keep" + }, + { + "path": "track/junior/brake_vertical.png", + "x_offset": -9, + "y_offset": -4, + "palette": "keep" + }, + { + "path": "track/junior/blockbrake_horizontal_closed.png", + "x_offset": -32, + "y_offset": 7, + "palette": "keep" + }, + { + "path": "track/junior/blockbrake_horizontal_open.png", + "x_offset": -32, + "y_offset": 7, + "palette": "keep" + }, + { + "path": "track/junior/blockbrake_vertical_closed.png", + "x_offset": -9, + "y_offset": -4, + "palette": "keep" + }, + { + "path": "track/junior/blockbrake_vertical_open.png", + "x_offset": -9, + "y_offset": -4, + "palette": "keep" + }, + { + "path": "track/corkscrew/brake_horizontal.png", + "x_offset": -32, + "y_offset": 2, + "palette": "keep" + }, + { + "path": "track/corkscrew/brake_vertical.png", + "x_offset": -13, + "y_offset": -8, + "palette": "keep" + }, + { + "path": "track/corkscrew/blockbrake_horizontal_closed.png", + "x_offset": -32, + "y_offset": 2, + "palette": "keep" + }, + { + "path": "track/corkscrew/blockbrake_horizontal_open.png", + "x_offset": -32, + "y_offset": 2, + "palette": "keep" + }, + { + "path": "track/corkscrew/blockbrake_vertical_closed.png", + "x_offset": -13, + "y_offset": -8, + "palette": "keep" + }, + { + "path": "track/corkscrew/blockbrake_vertical_open.png", + "x_offset": -13, + "y_offset": -8, + "palette": "keep" + }, + { + "path": "track/slc/brake_horizontal.png", + "x_offset": -32, + "y_offset": 4, + "palette": "keep" + }, + { + "path": "track/slc/brake_vertical.png", + "x_offset": -13, + "y_offset": -9, + "palette": "keep" + }, + { + "path": "track/slc/blockbrake_vertical_open.png", + "x_offset": -13, + "y_offset": -9, + "palette": "keep" + }, + { + "path": "track/multidim/upright_brake_horizontal.png", + "x_offset": -32, + "y_offset": 3, + "palette": "keep" + }, + { + "path": "track/multidim/upright_brake_vertical.png", + "x_offset": -11, + "y_offset": -8, + "palette": "keep" + }, + { + "path": "track/multidim/upright_blockbrake_horizontal_closed.png", + "x_offset": -32, + "y_offset": 3, + "palette": "keep" + }, + { + "path": "track/multidim/upright_blockbrake_horizontal_open.png", + "x_offset": -32, + "y_offset": 3, + "palette": "keep" + }, + { + "path": "track/multidim/upright_blockbrake_vertical_closed.png", + "x_offset": -11, + "y_offset": -8, + "palette": "keep" + }, + { + "path": "track/multidim/upright_blockbrake_vertical_open.png", + "x_offset": -11, + "y_offset": -8, + "palette": "keep" + }, + { + "path": "track/multidim/inverted_brake_horizontal.png", + "x_offset": -32, + "y_offset": 2, + "palette": "keep" + }, + { + "path": "track/multidim/inverted_brake_vertical.png", + "x_offset": -11, + "y_offset": -12, + "palette": "keep" + }, + { + "path": "track/multidim/inverted_blockbrake_horizontal.png", + "x_offset": -32, + "y_offset": 2, + "palette": "keep" + }, + { + "path": "track/multidim/inverted_blockbrake_vertical_open.png", + "x_offset": -11, + "y_offset": -12, + "palette": "keep" + }, + { + "path": "track/multidim/inverted_blockbrake_vertical_closed.png", + "x_offset": -11, + "y_offset": -12, + "palette": "keep" + }, + { + "path": "track/steeplechase/brake_horizontal.png", + "x_offset": -32, + "y_offset": 9, + "palette": "keep" + }, + { + "path": "track/steeplechase/brake_vertical.png", + "x_offset": -4, + "y_offset": -6, + "palette": "keep" + }, + { + "path": "track/standup/brake_horizontal.png", + "x_offset": -32, + "y_offset": 1, + "palette": "keep" + }, + { + "path": "track/standup/brake_vertical.png", + "x_offset": -13, + "y_offset": -9, + "palette": "keep" + }, + { + "path": "track/standup/blockbrake_horizontal_closed.png", + "x_offset": -32, + "y_offset": 1, + "palette": "keep" + }, + { + "path": "track/standup/blockbrake_horizontal_open.png", + "x_offset": -32, + "y_offset": 1, + "palette": "keep" + }, + { + "path": "track/standup/blockbrake_vertical_closed.png", + "x_offset": -13, + "y_offset": -9, + "palette": "keep" + }, + { + "path": "track/standup/blockbrake_vertical_open.png", + "x_offset": -13, + "y_offset": -9, + "palette": "keep" + }, + { + "path": "track/minetrain/brake_horizontal.png", + "x_offset": -32, + "y_offset": 6, + "palette": "keep" + }, + { + "path": "track/minetrain/brake_vertical.png", + "x_offset": -17, + "y_offset": -3, + "palette": "keep" + }, + { + "path": "track/minetrain/blockbrake_horizontal_closed.png", + "x_offset": -32, + "y_offset": 6, + "palette": "keep" + }, + { + "path": "track/minetrain/blockbrake_horizontal_open.png", + "x_offset": -32, + "y_offset": 6, + "palette": "keep" + }, + { + "path": "track/minetrain/blockbrake_vertical_closed.png", + "x_offset": -17, + "y_offset": -3, + "palette": "keep" + }, + { + "path": "track/minetrain/blockbrake_vertical_open.png", + "x_offset": -17, + "y_offset": -3, + "palette": "keep" + }, + { + "path": "track/looping/brake_horizontal.png", + "x_offset": -32, + "y_offset": 0, + "palette": "keep" + }, + { + "path": "track/looping/brake_vertical.png", + "x_offset": -15, + "y_offset": -8, + "palette": "keep" + }, + { + "path": "track/lim/brake_horizontal.png", + "x_offset": -32, + "y_offset": 7, + "palette": "keep" + }, + { + "path": "track/lim/brake_vertical.png", + "x_offset": -10, + "y_offset": -5, + "palette": "keep" + }, + { + "path": "track/lim/blockbrake_horizontal_closed.png", + "x_offset": -32, + "y_offset": 7, + "palette": "keep" + }, + { + "path": "track/lim/blockbrake_horizontal_open.png", + "x_offset": -32, + "y_offset": 7, + "palette": "keep" + }, + { + "path": "track/lim/blockbrake_vertical_closed.png", + "x_offset": -10, + "y_offset": -5, + "palette": "keep" + }, + { + "path": "track/lim/blockbrake_vertical_open.png", + "x_offset": -10, + "y_offset": -5, + "palette": "keep" + }, + { + "path": "track/bm_invert/brake_horizontal.png", + "x_offset": -32, + "y_offset": 2, + "palette": "keep" + }, + { + "path": "track/bm_invert/brake_vertical.png", + "x_offset": -13, + "y_offset": -13, + "palette": "keep" } ] diff --git a/resources/g2/track/bm_invert/brake_horizontal.png b/resources/g2/track/bm_invert/brake_horizontal.png new file mode 100644 index 0000000000..bbabcd6d7e Binary files /dev/null and b/resources/g2/track/bm_invert/brake_horizontal.png differ diff --git a/resources/g2/track/bm_invert/brake_vertical.png b/resources/g2/track/bm_invert/brake_vertical.png new file mode 100644 index 0000000000..4f0c0ed613 Binary files /dev/null and b/resources/g2/track/bm_invert/brake_vertical.png differ diff --git a/resources/g2/track/corkscrew/blockbrake_horizontal_closed.png b/resources/g2/track/corkscrew/blockbrake_horizontal_closed.png new file mode 100644 index 0000000000..5c2819fce3 Binary files /dev/null and b/resources/g2/track/corkscrew/blockbrake_horizontal_closed.png differ diff --git a/resources/g2/track/corkscrew/blockbrake_horizontal_open.png b/resources/g2/track/corkscrew/blockbrake_horizontal_open.png new file mode 100644 index 0000000000..b984b13158 Binary files /dev/null and b/resources/g2/track/corkscrew/blockbrake_horizontal_open.png differ diff --git a/resources/g2/track/corkscrew/blockbrake_vertical_closed.png b/resources/g2/track/corkscrew/blockbrake_vertical_closed.png new file mode 100644 index 0000000000..b38fefdf6f Binary files /dev/null and b/resources/g2/track/corkscrew/blockbrake_vertical_closed.png differ diff --git a/resources/g2/track/corkscrew/blockbrake_vertical_open.png b/resources/g2/track/corkscrew/blockbrake_vertical_open.png new file mode 100644 index 0000000000..56ace7ff31 Binary files /dev/null and b/resources/g2/track/corkscrew/blockbrake_vertical_open.png differ diff --git a/resources/g2/track/corkscrew/brake_horizontal.png b/resources/g2/track/corkscrew/brake_horizontal.png new file mode 100644 index 0000000000..d66a9170c7 Binary files /dev/null and b/resources/g2/track/corkscrew/brake_horizontal.png differ diff --git a/resources/g2/track/corkscrew/brake_vertical.png b/resources/g2/track/corkscrew/brake_vertical.png new file mode 100644 index 0000000000..f039044a5e Binary files /dev/null and b/resources/g2/track/corkscrew/brake_vertical.png differ diff --git a/resources/g2/track/junior/blockbrake_horizontal_closed.png b/resources/g2/track/junior/blockbrake_horizontal_closed.png new file mode 100644 index 0000000000..aef7a92688 Binary files /dev/null and b/resources/g2/track/junior/blockbrake_horizontal_closed.png differ diff --git a/resources/g2/track/junior/blockbrake_horizontal_open.png b/resources/g2/track/junior/blockbrake_horizontal_open.png new file mode 100644 index 0000000000..3c1ddb977c Binary files /dev/null and b/resources/g2/track/junior/blockbrake_horizontal_open.png differ diff --git a/resources/g2/track/junior/blockbrake_vertical_closed.png b/resources/g2/track/junior/blockbrake_vertical_closed.png new file mode 100644 index 0000000000..646a860c0d Binary files /dev/null and b/resources/g2/track/junior/blockbrake_vertical_closed.png differ diff --git a/resources/g2/track/junior/blockbrake_vertical_open.png b/resources/g2/track/junior/blockbrake_vertical_open.png new file mode 100644 index 0000000000..cd9d4cc83a Binary files /dev/null and b/resources/g2/track/junior/blockbrake_vertical_open.png differ diff --git a/resources/g2/track/junior/brake_horizontal.png b/resources/g2/track/junior/brake_horizontal.png new file mode 100644 index 0000000000..1ef1fc54a2 Binary files /dev/null and b/resources/g2/track/junior/brake_horizontal.png differ diff --git a/resources/g2/track/junior/brake_vertical.png b/resources/g2/track/junior/brake_vertical.png new file mode 100644 index 0000000000..03f6f679e8 Binary files /dev/null and b/resources/g2/track/junior/brake_vertical.png differ diff --git a/resources/g2/track/lim/blockbrake_horizontal_closed.png b/resources/g2/track/lim/blockbrake_horizontal_closed.png new file mode 100644 index 0000000000..3385f96653 Binary files /dev/null and b/resources/g2/track/lim/blockbrake_horizontal_closed.png differ diff --git a/resources/g2/track/lim/blockbrake_horizontal_open.png b/resources/g2/track/lim/blockbrake_horizontal_open.png new file mode 100644 index 0000000000..089ae7956f Binary files /dev/null and b/resources/g2/track/lim/blockbrake_horizontal_open.png differ diff --git a/resources/g2/track/lim/blockbrake_vertical_closed.png b/resources/g2/track/lim/blockbrake_vertical_closed.png new file mode 100644 index 0000000000..10674d07f2 Binary files /dev/null and b/resources/g2/track/lim/blockbrake_vertical_closed.png differ diff --git a/resources/g2/track/lim/blockbrake_vertical_open.png b/resources/g2/track/lim/blockbrake_vertical_open.png new file mode 100644 index 0000000000..a40ae0595f Binary files /dev/null and b/resources/g2/track/lim/blockbrake_vertical_open.png differ diff --git a/resources/g2/track/lim/brake_horizontal.png b/resources/g2/track/lim/brake_horizontal.png new file mode 100644 index 0000000000..33669eb796 Binary files /dev/null and b/resources/g2/track/lim/brake_horizontal.png differ diff --git a/resources/g2/track/lim/brake_vertical.png b/resources/g2/track/lim/brake_vertical.png new file mode 100644 index 0000000000..8bae23132a Binary files /dev/null and b/resources/g2/track/lim/brake_vertical.png differ diff --git a/resources/g2/track/looping/brake_horizontal.png b/resources/g2/track/looping/brake_horizontal.png new file mode 100644 index 0000000000..5772a565c4 Binary files /dev/null and b/resources/g2/track/looping/brake_horizontal.png differ diff --git a/resources/g2/track/looping/brake_vertical.png b/resources/g2/track/looping/brake_vertical.png new file mode 100644 index 0000000000..e480d30971 Binary files /dev/null and b/resources/g2/track/looping/brake_vertical.png differ diff --git a/resources/g2/track/minetrain/blockbrake_horizontal_closed.png b/resources/g2/track/minetrain/blockbrake_horizontal_closed.png new file mode 100644 index 0000000000..fa33373f0f Binary files /dev/null and b/resources/g2/track/minetrain/blockbrake_horizontal_closed.png differ diff --git a/resources/g2/track/minetrain/blockbrake_horizontal_open.png b/resources/g2/track/minetrain/blockbrake_horizontal_open.png new file mode 100644 index 0000000000..2ca2eb8033 Binary files /dev/null and b/resources/g2/track/minetrain/blockbrake_horizontal_open.png differ diff --git a/resources/g2/track/minetrain/blockbrake_vertical_closed.png b/resources/g2/track/minetrain/blockbrake_vertical_closed.png new file mode 100644 index 0000000000..1ec7302e9a Binary files /dev/null and b/resources/g2/track/minetrain/blockbrake_vertical_closed.png differ diff --git a/resources/g2/track/minetrain/blockbrake_vertical_open.png b/resources/g2/track/minetrain/blockbrake_vertical_open.png new file mode 100644 index 0000000000..837cde827c Binary files /dev/null and b/resources/g2/track/minetrain/blockbrake_vertical_open.png differ diff --git a/resources/g2/track/minetrain/brake_horizontal.png b/resources/g2/track/minetrain/brake_horizontal.png new file mode 100644 index 0000000000..2d54c8ee24 Binary files /dev/null and b/resources/g2/track/minetrain/brake_horizontal.png differ diff --git a/resources/g2/track/minetrain/brake_vertical.png b/resources/g2/track/minetrain/brake_vertical.png new file mode 100644 index 0000000000..f72cd14f43 Binary files /dev/null and b/resources/g2/track/minetrain/brake_vertical.png differ diff --git a/resources/g2/track/multidim/inverted_blockbrake_horizontal.png b/resources/g2/track/multidim/inverted_blockbrake_horizontal.png new file mode 100644 index 0000000000..e6373e573f Binary files /dev/null and b/resources/g2/track/multidim/inverted_blockbrake_horizontal.png differ diff --git a/resources/g2/track/multidim/inverted_blockbrake_vertical_closed.png b/resources/g2/track/multidim/inverted_blockbrake_vertical_closed.png new file mode 100644 index 0000000000..3d977c6674 Binary files /dev/null and b/resources/g2/track/multidim/inverted_blockbrake_vertical_closed.png differ diff --git a/resources/g2/track/multidim/inverted_blockbrake_vertical_open.png b/resources/g2/track/multidim/inverted_blockbrake_vertical_open.png new file mode 100644 index 0000000000..b083639b10 Binary files /dev/null and b/resources/g2/track/multidim/inverted_blockbrake_vertical_open.png differ diff --git a/resources/g2/track/multidim/inverted_brake_horizontal.png b/resources/g2/track/multidim/inverted_brake_horizontal.png new file mode 100644 index 0000000000..c6dd4f1120 Binary files /dev/null and b/resources/g2/track/multidim/inverted_brake_horizontal.png differ diff --git a/resources/g2/track/multidim/inverted_brake_vertical.png b/resources/g2/track/multidim/inverted_brake_vertical.png new file mode 100644 index 0000000000..9370587216 Binary files /dev/null and b/resources/g2/track/multidim/inverted_brake_vertical.png differ diff --git a/resources/g2/track/multidim/upright_blockbrake_horizontal_closed.png b/resources/g2/track/multidim/upright_blockbrake_horizontal_closed.png new file mode 100644 index 0000000000..0886084f8c Binary files /dev/null and b/resources/g2/track/multidim/upright_blockbrake_horizontal_closed.png differ diff --git a/resources/g2/track/multidim/upright_blockbrake_horizontal_open.png b/resources/g2/track/multidim/upright_blockbrake_horizontal_open.png new file mode 100644 index 0000000000..87664f15a7 Binary files /dev/null and b/resources/g2/track/multidim/upright_blockbrake_horizontal_open.png differ diff --git a/resources/g2/track/multidim/upright_blockbrake_vertical_closed.png b/resources/g2/track/multidim/upright_blockbrake_vertical_closed.png new file mode 100644 index 0000000000..706be4a8cb Binary files /dev/null and b/resources/g2/track/multidim/upright_blockbrake_vertical_closed.png differ diff --git a/resources/g2/track/multidim/upright_blockbrake_vertical_open.png b/resources/g2/track/multidim/upright_blockbrake_vertical_open.png new file mode 100644 index 0000000000..bd80eb7a2b Binary files /dev/null and b/resources/g2/track/multidim/upright_blockbrake_vertical_open.png differ diff --git a/resources/g2/track/multidim/upright_brake_horizontal.png b/resources/g2/track/multidim/upright_brake_horizontal.png new file mode 100644 index 0000000000..a3e555d0ba Binary files /dev/null and b/resources/g2/track/multidim/upright_brake_horizontal.png differ diff --git a/resources/g2/track/multidim/upright_brake_vertical.png b/resources/g2/track/multidim/upright_brake_vertical.png new file mode 100644 index 0000000000..a987c10768 Binary files /dev/null and b/resources/g2/track/multidim/upright_brake_vertical.png differ diff --git a/resources/g2/track/slc/blockbrake_vertical_open.png b/resources/g2/track/slc/blockbrake_vertical_open.png new file mode 100644 index 0000000000..db2d671703 Binary files /dev/null and b/resources/g2/track/slc/blockbrake_vertical_open.png differ diff --git a/resources/g2/track/slc/brake_horizontal.png b/resources/g2/track/slc/brake_horizontal.png new file mode 100644 index 0000000000..4b62391285 Binary files /dev/null and b/resources/g2/track/slc/brake_horizontal.png differ diff --git a/resources/g2/track/slc/brake_vertical.png b/resources/g2/track/slc/brake_vertical.png new file mode 100644 index 0000000000..1afe3e3950 Binary files /dev/null and b/resources/g2/track/slc/brake_vertical.png differ diff --git a/resources/g2/track/standup/blockbrake_horizontal_closed.png b/resources/g2/track/standup/blockbrake_horizontal_closed.png new file mode 100644 index 0000000000..4f7f3c53ae Binary files /dev/null and b/resources/g2/track/standup/blockbrake_horizontal_closed.png differ diff --git a/resources/g2/track/standup/blockbrake_horizontal_open.png b/resources/g2/track/standup/blockbrake_horizontal_open.png new file mode 100644 index 0000000000..82111fcde9 Binary files /dev/null and b/resources/g2/track/standup/blockbrake_horizontal_open.png differ diff --git a/resources/g2/track/standup/blockbrake_vertical_closed.png b/resources/g2/track/standup/blockbrake_vertical_closed.png new file mode 100644 index 0000000000..d6051a426c Binary files /dev/null and b/resources/g2/track/standup/blockbrake_vertical_closed.png differ diff --git a/resources/g2/track/standup/blockbrake_vertical_open.png b/resources/g2/track/standup/blockbrake_vertical_open.png new file mode 100644 index 0000000000..abd4a3f4cd Binary files /dev/null and b/resources/g2/track/standup/blockbrake_vertical_open.png differ diff --git a/resources/g2/track/standup/brake_horizontal.png b/resources/g2/track/standup/brake_horizontal.png new file mode 100644 index 0000000000..e3fb553fd4 Binary files /dev/null and b/resources/g2/track/standup/brake_horizontal.png differ diff --git a/resources/g2/track/standup/brake_vertical.png b/resources/g2/track/standup/brake_vertical.png new file mode 100644 index 0000000000..b99285eada Binary files /dev/null and b/resources/g2/track/standup/brake_vertical.png differ diff --git a/resources/g2/track/steeplechase/brake_horizontal.png b/resources/g2/track/steeplechase/brake_horizontal.png new file mode 100644 index 0000000000..e9782f894e Binary files /dev/null and b/resources/g2/track/steeplechase/brake_horizontal.png differ diff --git a/resources/g2/track/steeplechase/brake_vertical.png b/resources/g2/track/steeplechase/brake_vertical.png new file mode 100644 index 0000000000..d4fb09a324 Binary files /dev/null and b/resources/g2/track/steeplechase/brake_vertical.png differ diff --git a/src/openrct2-ui/ride/Construction.h b/src/openrct2-ui/ride/Construction.h index 1c18a5b1cc..bb902b33ef 100644 --- a/src/openrct2-ui/ride/Construction.h +++ b/src/openrct2-ui/ride/Construction.h @@ -19,6 +19,25 @@ enum class RideConstructionState : uint8_t; */ constexpr std::array DropdownOrder = { TrackElemType::EndStation, +<<<<<<< HEAD +======= + TrackElemType::Brakes, + TrackElemType::DiagBrakes, + TrackElemType::BlockBrakes, + TrackElemType::DiagBlockBrakes, + TrackElemType::Booster, + TrackElemType::RotationControlToggle, + TrackElemType::LogFlumeReverser, + TrackElemType::BrakeForDrop, + TrackElemType::HeartLineTransferUp, + TrackElemType::HeartLineTransferDown, + TrackElemType::LeftCurvedLiftHill, + TrackElemType::RightCurvedLiftHill, + TrackElemType::PoweredLift, + TrackElemType::CableLiftHill, + + // Simple track elements +>>>>>>> b8810fc4a (Diagonal Brakes and Block Brakes) TrackElemType::SBendLeft, TrackElemType::SBendRight, TrackElemType::LeftVerticalLoop, @@ -136,8 +155,13 @@ constexpr std::array DropdownOrder = { }; constexpr size_t DropdownLength = DropdownOrder.size(); +<<<<<<< HEAD // Update the magic number with the current number of track elements to silence static_assert(TrackElemType::Count == 337, "Reminder to add new track element to special dropdown list"); +======= +// Reminder to add your track element to the list, if applicable +static_assert(TrackElemType::Count == 339); +>>>>>>> b8810fc4a (Diagonal Brakes and Block Brakes) constexpr bool TrackPieceDirectionIsDiagonal(const uint8_t direction) { diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index b94e878897..2e382ce1d7 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -2327,7 +2327,8 @@ private: auto trackType = vehicle->GetTrackType(); if (trackType == TrackElemType::BlockBrakes || trackType == TrackElemType::CableLiftHill || trackType == TrackElemType::Up25ToFlat || trackType == TrackElemType::Up60ToFlat - || trackType == TrackElemType::DiagUp25ToFlat || trackType == TrackElemType::DiagUp60ToFlat) + || trackType == TrackElemType::DiagUp25ToFlat || trackType == TrackElemType::DiagUp60ToFlat + || trackType == TrackElemType::DiagBlockBrakes) { if (ride->GetRideTypeDescriptor().SupportsTrackPiece(TRACK_BLOCK_BRAKES) && vehicle->velocity == 0) { diff --git a/src/openrct2-ui/windows/RideConstruction.cpp b/src/openrct2-ui/windows/RideConstruction.cpp index 62bcd88e3b..19bdc4e0cc 100644 --- a/src/openrct2-ui/windows/RideConstruction.cpp +++ b/src/openrct2-ui/windows/RideConstruction.cpp @@ -1420,6 +1420,7 @@ public: _currentTrackLiftHill &= ~CONSTRUCTION_LIFT_HILL_SELECTED; break; case TrackElemType::BlockBrakes: + case TrackElemType::DiagBlockBrakes: _currentBrakeSpeed2 = kRCT2DefaultBlockBrakeSpeed; } _currentTrackCurve = trackPiece | RideConstructionSpecialPieceSelected; diff --git a/src/openrct2/actions/TrackPlaceAction.cpp b/src/openrct2/actions/TrackPlaceAction.cpp index 9b67536538..a0b7b0888d 100644 --- a/src/openrct2/actions/TrackPlaceAction.cpp +++ b/src/openrct2/actions/TrackPlaceAction.cpp @@ -574,6 +574,7 @@ GameActions::Result TrackPlaceAction::Execute() const MapAnimationCreate(MAP_ANIMATION_TYPE_TRACK_SPINNINGTUNNEL, CoordsXYZ{ mapLoc, trackElement->GetBaseZ() }); break; case TrackElemType::Brakes: + case TrackElemType::DiagBrakes: trackElement->SetBrakeClosed(true); break; } @@ -666,6 +667,7 @@ GameActions::Result TrackPlaceAction::Execute() const ride->lifecycle_flags |= RIDE_LIFECYCLE_CABLE_LIFT_HILL_COMPONENT_USED; ride->CableLiftLoc = originLocation; break; + case TrackElemType::DiagBlockBrakes: case TrackElemType::BlockBrakes: { ride->num_block_brakes++; diff --git a/src/openrct2/actions/TrackRemoveAction.cpp b/src/openrct2/actions/TrackRemoveAction.cpp index 546f96dba4..e39f352bca 100644 --- a/src/openrct2/actions/TrackRemoveAction.cpp +++ b/src/openrct2/actions/TrackRemoveAction.cpp @@ -463,6 +463,7 @@ GameActions::Result TrackRemoveAction::Execute() const ride->lifecycle_flags &= ~RIDE_LIFECYCLE_CABLE_LIFT_HILL_COMPONENT_USED; break; case TrackElemType::BlockBrakes: + case TrackElemType::DiagBlockBrakes: ride->num_block_brakes--; if (ride->num_block_brakes == 0) { diff --git a/src/openrct2/actions/TrackSetBrakeSpeedAction.cpp b/src/openrct2/actions/TrackSetBrakeSpeedAction.cpp index 0c564f7fc7..840a470c4f 100644 --- a/src/openrct2/actions/TrackSetBrakeSpeedAction.cpp +++ b/src/openrct2/actions/TrackSetBrakeSpeedAction.cpp @@ -69,7 +69,9 @@ GameActions::Result TrackSetBrakeSpeedAction::QueryExecute(bool isExecuting) con if (isExecuting) { - tileElement->AsTrack()->SetBrakeBoosterSpeed(_brakeSpeed); + GetTrackElementOriginAndApplyChanges( + { _loc, tileElement->GetDirection() }, tileElement->AsTrack()->GetTrackType(), _brakeSpeed, nullptr, + TRACK_ELEMENT_SET_BRAKE_BOOSTER_SPEED); } return res; } diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 03d2e600e1..028dd66630 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -2021,7 +2021,8 @@ static void RideMeasurementUpdate(Ride& ride, RideMeasurement& measurement) auto trackType = vehicle->GetTrackType(); if (trackType == TrackElemType::BlockBrakes || trackType == TrackElemType::CableLiftHill || trackType == TrackElemType::Up25ToFlat || trackType == TrackElemType::Up60ToFlat - || trackType == TrackElemType::DiagUp25ToFlat || trackType == TrackElemType::DiagUp60ToFlat) + || trackType == TrackElemType::DiagUp25ToFlat || trackType == TrackElemType::DiagUp60ToFlat + || trackType == TrackElemType::DiagBlockBrakes) if (vehicle->velocity == 0) return; @@ -2716,7 +2717,7 @@ static ResultWithMessage RideCheckBlockBrakes(const CoordsXYE& input, CoordsXYE* TrackCircuitIteratorBegin(&it, input); while (TrackCircuitIteratorNext(&it)) { - if (it.current.element->AsTrack()->GetTrackType() == TrackElemType::BlockBrakes) + if (TrackTypeIsBlockBrakes(it.current.element->AsTrack()->GetTrackType())) { auto type = it.last.element->AsTrack()->GetTrackType(); if (type == TrackElemType::EndStation) @@ -2724,7 +2725,7 @@ static ResultWithMessage RideCheckBlockBrakes(const CoordsXYE& input, CoordsXYE* *output = it.current; return { false, STR_BLOCK_BRAKES_CANNOT_BE_USED_DIRECTLY_AFTER_STATION }; } - if (type == TrackElemType::BlockBrakes) + if (TrackTypeIsBlockBrakes(type)) { *output = it.current; return { false, STR_BLOCK_BRAKES_CANNOT_BE_USED_DIRECTLY_AFTER_EACH_OTHER }; @@ -3060,17 +3061,18 @@ static void RideOpenBlockBrakes(const CoordsXYE& startElement) switch (trackType) { case TrackElemType::BlockBrakes: + case TrackElemType::DiagBlockBrakes: BlockBrakeSetLinkedBrakesClosed( CoordsXYZ(currentElement.x, currentElement.y, currentElement.element->GetBaseZ()), *currentElement.element->AsTrack(), false); [[fallthrough]]; - case TrackElemType::EndStation: - case TrackElemType::CableLiftHill: - case TrackElemType::Up25ToFlat: - case TrackElemType::Up60ToFlat: case TrackElemType::DiagUp25ToFlat: case TrackElemType::DiagUp60ToFlat: - currentElement.element->AsTrack()->SetBrakeClosed(false); + case TrackElemType::CableLiftHill: + case TrackElemType::EndStation: + case TrackElemType::Up25ToFlat: + case TrackElemType::Up60ToFlat: + currentElement.element->AsTrack()->SetBrakeClosed2({ currentElement.x, currentElement.y }, false); break; } } while (TrackBlockGetNext(¤tElement, ¤tElement, nullptr, nullptr) @@ -3107,10 +3109,11 @@ void BlockBrakeSetLinkedBrakesClosed(const CoordsXYZ& vehicleTrackLocation, Trac location.z = trackBeginEnd.begin_z; tileElement = trackBeginEnd.begin_element; - if (trackBeginEnd.begin_element->AsTrack()->GetTrackType() == TrackElemType::Brakes) + if (TrackTypeIsBrakes(tileElement->AsTrack()->GetTrackType())) { - trackBeginEnd.begin_element->AsTrack()->SetBrakeClosed( - (trackBeginEnd.begin_element->AsTrack()->GetBrakeBoosterSpeed() >= brakeSpeed) || isClosed); + tileElement->AsTrack()->SetBrakeClosed2( + { trackBeginEnd.begin_x, trackBeginEnd.begin_y }, + (tileElement->AsTrack()->GetBrakeBoosterSpeed() >= brakeSpeed) || isClosed); } // prevent infinite loop @@ -3128,7 +3131,7 @@ void BlockBrakeSetLinkedBrakesClosed(const CoordsXYZ& vehicleTrackLocation, Trac return; } } - } while (trackBeginEnd.begin_element->AsTrack()->GetTrackType() == TrackElemType::Brakes); + } while (TrackTypeIsBrakes(trackBeginEnd.begin_element->AsTrack()->GetTrackType())); } /** @@ -3511,30 +3514,29 @@ static void RideCreateVehiclesFindFirstBlock(const Ride& ride, CoordsXYE* outXYE auto trackType = trackElement->GetTrackType(); switch (trackType) { - case TrackElemType::Up25ToFlat: - case TrackElemType::Up60ToFlat: - if (trackElement->HasChain()) + case TrackElemType::DiagUp25ToFlat: + case TrackElemType::DiagUp60ToFlat: + if (!trackElement->HasChain()) { - *outXYElement = { trackPos, reinterpret_cast(trackElement) }; + break; + } + [[fallthrough]]; + case TrackElemType::DiagBlockBrakes: + { + TileElement* tileElement = MapGetTrackElementAtOfTypeSeq( + { trackBeginEnd.begin_x, trackBeginEnd.begin_y, trackBeginEnd.begin_z }, trackType, 0); + + if (tileElement != nullptr) + { + outXYElement->x = trackBeginEnd.begin_x; + outXYElement->y = trackBeginEnd.begin_y; + outXYElement->element = tileElement; return; } break; - case TrackElemType::DiagUp25ToFlat: - case TrackElemType::DiagUp60ToFlat: - if (trackElement->HasChain()) - { - TileElement* tileElement = MapGetTrackElementAtOfTypeSeq( - { trackBeginEnd.begin_x, trackBeginEnd.begin_y, trackBeginEnd.begin_z }, trackType, 0); - - if (tileElement != nullptr) - { - outXYElement->x = trackBeginEnd.begin_x; - outXYElement->y = trackBeginEnd.begin_y; - outXYElement->element = tileElement; - return; - } - } - break; + } + case TrackElemType::Up25ToFlat: + case TrackElemType::Up60ToFlat: case TrackElemType::EndStation: case TrackElemType::CableLiftHill: case TrackElemType::BlockBrakes: @@ -3687,8 +3689,8 @@ void Ride::MoveTrainsToBlockBrakes(const CoordsXYZ& firstBlockPosition, TrackEle // All vehicles are in position, set the block brake directly before the station one last time and make sure the brakes // are set appropriately - firstBlock.SetBrakeClosed(true); - if (firstBlock.GetTrackType() == TrackElemType::BlockBrakes) + firstBlock.SetBrakeClosed2(firstBlockPosition, true); + if (TrackTypeIsBlockBrakes(firstBlock.GetTrackType())) { BlockBrakeSetLinkedBrakesClosed(firstBlockPosition, firstBlock, true); } diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h index 63d673fe1b..e1ba812e22 100644 --- a/src/openrct2/ride/Ride.h +++ b/src/openrct2/ride/Ride.h @@ -895,7 +895,9 @@ enum TRACK_ELEMENT_SET_COLOUR_SCHEME = (1 << 2), TRACK_ELEMENT_SET_HAS_CABLE_LIFT_TRUE = (1 << 3), TRACK_ELEMENT_SET_HAS_CABLE_LIFT_FALSE = (1 << 4), - TRACK_ELEMENT_SET_SEAT_ROTATION = (1 << 5) + TRACK_ELEMENT_SET_SEAT_ROTATION = (1 << 5), + TRACK_ELEMENT_SET_BRAKE_CLOSED_STATE = (1 << 6), + TRACK_ELEMENT_SET_BRAKE_BOOSTER_SPEED = (1 << 7) }; #define MAX_RIDE_MEASUREMENTS 8 diff --git a/src/openrct2/ride/RideConstruction.cpp b/src/openrct2/ride/RideConstruction.cpp index 9ab451c44b..7d075c9f4d 100644 --- a/src/openrct2/ride/RideConstruction.cpp +++ b/src/openrct2/ride/RideConstruction.cpp @@ -452,6 +452,14 @@ std::optional GetTrackElementOriginAndApplyChanges( { trackElement->SetHasCableLift(false); } + if (flags & TRACK_ELEMENT_SET_BRAKE_CLOSED_STATE) + { + trackElement->SetBrakeClosed(extra_params != 0); + } + if (flags & TRACK_ELEMENT_SET_BRAKE_BOOSTER_SPEED) + { + trackElement->SetBrakeBoosterSpeed(static_cast(extra_params & 0xFF)); + } } return retCoordsXYZ; } diff --git a/src/openrct2/ride/RideConstruction.h b/src/openrct2/ride/RideConstruction.h index 52e88b95f6..8c0b463b33 100644 --- a/src/openrct2/ride/RideConstruction.h +++ b/src/openrct2/ride/RideConstruction.h @@ -69,9 +69,6 @@ extern StationIndex gRideEntranceExitPlaceStationIndex; extern RideConstructionState gRideEntranceExitPlacePreviousRideConstructionState; extern uint8_t gRideEntranceExitPlaceDirection; -std::optional GetTrackElementOriginAndApplyChanges( - const CoordsXYZD& location, track_type_t type, uint16_t extra_params, TileElement** output_element, uint16_t flags); - void RideEntranceExitPlaceProvisionalGhost(); void RideEntranceExitRemoveGhost(); void RideRestoreProvisionalTrackPiece(); diff --git a/src/openrct2/ride/Track.cpp b/src/openrct2/ride/Track.cpp index 9b90e52cfa..591243bd67 100644 --- a/src/openrct2/ride/Track.cpp +++ b/src/openrct2/ride/Track.cpp @@ -549,6 +549,7 @@ bool TrackElement::IsBlockStart() const case TrackElemType::EndStation: case TrackElemType::CableLiftHill: case TrackElemType::BlockBrakes: + case TrackElemType::DiagBlockBrakes: return true; case TrackElemType::Up25ToFlat: case TrackElemType::Up60ToFlat: @@ -563,6 +564,24 @@ bool TrackElement::IsBlockStart() const return false; } +void TrackElement::SetBrakeClosed2(const CoordsXY& trackLocation, bool isClosed) +{ + switch (GetTrackType()) + { + case TrackElemType::DiagUp25ToFlat: + case TrackElemType::DiagUp60ToFlat: + case TrackElemType::CableLiftHill: + case TrackElemType::DiagBrakes: + case TrackElemType::DiagBlockBrakes: + GetTrackElementOriginAndApplyChanges( + { trackLocation, GetBaseZ(), GetDirection() }, GetTrackType(), isClosed, nullptr, + TRACK_ELEMENT_SET_BRAKE_CLOSED_STATE); + break; + default: + SetBrakeClosed(isClosed); + } +} + roll_type_t TrackGetActualBank(TileElement* tileElement, roll_type_t bank) { auto ride = GetRide(tileElement->AsTrack()->GetRideIndex()); @@ -624,6 +643,16 @@ bool TrackTypeIsStation(track_type_t trackType) } } +bool TrackTypeIsBrakes(track_type_t trackType) +{ + return (trackType == TrackElemType::Brakes) || (trackType == TrackElemType::DiagBrakes); +} + +bool TrackTypeIsBlockBrakes(track_type_t trackType) +{ + return (trackType == TrackElemType::BlockBrakes) || (trackType == TrackElemType::DiagBlockBrakes); +} + bool TrackElementIsCovered(track_type_t trackElementType) { switch (trackElementType) @@ -655,7 +684,7 @@ bool TrackElementIsCovered(track_type_t trackElementType) bool TrackTypeHasSpeedSetting(track_type_t trackType) { - return trackType == TrackElemType::Brakes || trackType == TrackElemType::Booster || trackType == TrackElemType::BlockBrakes; + return trackType == TrackElemType::Booster || TrackTypeIsBrakes(trackType) || TrackTypeIsBlockBrakes(trackType); } bool TrackTypeIsHelix(track_type_t trackType) diff --git a/src/openrct2/ride/Track.h b/src/openrct2/ride/Track.h index 4a2f945986..8e33603349 100644 --- a/src/openrct2/ride/Track.h +++ b/src/openrct2/ride/Track.h @@ -206,6 +206,9 @@ enum TRACK_SLOPE_CURVE_LARGE, TRACK_SLOPE_CURVE_LARGE_BANKED, + TRACK_DIAG_BRAKES, + TRACK_DIAG_BLOCK_BRAKES, + TRACK_GROUP_COUNT, }; @@ -631,7 +634,10 @@ namespace TrackElemType constexpr track_type_t LeftEighthBankToOrthogonalDown25 = 335; constexpr track_type_t RightEighthBankToOrthogonalDown25 = 336; - constexpr track_type_t Count = 337; + constexpr track_type_t DiagBrakes = 337; + constexpr track_type_t DiagBlockBrakes = 338; + + constexpr track_type_t Count = 339; constexpr track_type_t None = 65535; }; // namespace TrackElemType @@ -680,6 +686,11 @@ void TrackGetFront(const CoordsXYE& input, CoordsXYE* output); bool TrackElementIsCovered(track_type_t trackElementType); bool TrackTypeIsStation(track_type_t trackType); +bool TrackTypeIsBrakes(track_type_t trackType); +bool TrackTypeIsBlockBrakes(track_type_t trackType); + +std::optional GetTrackElementOriginAndApplyChanges( + const CoordsXYZD& location, track_type_t type, uint16_t extra_params, TileElement** output_element, uint16_t flags); roll_type_t TrackGetActualBank(TileElement* tileElement, roll_type_t bank); roll_type_t TrackGetActualBank2(int32_t rideType, bool isInverted, roll_type_t bank); diff --git a/src/openrct2/ride/TrackData.cpp b/src/openrct2/ride/TrackData.cpp index 381261a677..ffabe84275 100644 --- a/src/openrct2/ride/TrackData.cpp +++ b/src/openrct2/ride/TrackData.cpp @@ -355,6 +355,8 @@ static constexpr TrackCoordinates _trackCoordinates[] = { { 4, 1, 0, 48, -32, 64 }, // TrackElemType::RightEighthBankToOrthogonalUp25 { 4, 0, 0,-48, -64, 32 }, // TrackElemType::LeftEighthBankToOrthogonalDown25 { 4, 1, 0,-48, -32, 64 }, // TrackElemType::RightEighthBankToOrthogonalDown25 + { 4, 4, 0, 0, -32, 32 }, // TrackElemType::DiagBrakes + { 4, 4, 0, 0, -32, 32 }, // TrackElemType::DiagBlockBrakes }; static_assert(std::size(_trackCoordinates) == TrackElemType::Count); @@ -698,6 +700,8 @@ static constexpr uint8_t TrackSequenceProperties[][MaxSequencesPerPiece] = { { 0 }, // TrackElemType::RightEighthBankToOrthogonalUp25 { 0 }, // TrackElemType::LeftEighthBankToOrthogonalDown25 { 0 }, // TrackElemType::RightEighthBankToOrthogonalDown25 + /* DiagonalBrakes */ { 0 }, + /* DiagonalBlockBrakes */ { 0 }, }; static_assert(std::size(TrackSequenceProperties) == TrackElemType::Count); @@ -3344,6 +3348,8 @@ static constexpr std::array TrackBloc TrackBlocksRightEighthToOrthogonalUp25, // TrackElemType::RightEighthBankToOrthogonalUp25 TrackBlocksLeftEighthToOrthogonalDown25, // TrackElemType::LeftEighthBankToOrthogonalDown25 TrackBlocksRightEighthToOrthogonalDown25, // TrackElemType::RightEighthBankToOrthogonalDown25 + TrackBlocks141, // TrackElemType::DiagBrakes + TrackBlocks141, // TrackElemType::DiagBlockBrakes }; static constexpr uint8_t TrackPieceLengths[] = { @@ -3683,7 +3689,9 @@ static constexpr uint8_t TrackPieceLengths[] = { 92, // TrackElemType::LeftEighthBankToOrthogonalUp25 92, // TrackElemType::RightEighthBankToOrthogonalUp25 92, // TrackElemType::LeftEighthBankToOrthogonalDown25 - 92, // TrackElemType::RightEighthBankToOrthogonalDown25 + 92, // TrackElemType::RightEighthBankToOrthogonalDown25 + 45, // TrackElemType::DiagBrakes + 45, // TrackElemType::DiagBlockBrakes }; static_assert(std::size(TrackPieceLengths) == TrackElemType::Count); @@ -4026,6 +4034,8 @@ static constexpr TrackCurveChain gTrackCurveChain[] = { { TRACK_CURVE_RIGHT_LARGE, TRACK_CURVE_RIGHT_LARGE }, // TrackElemType::RightEighthBankToOrthogonalUp25 { TRACK_CURVE_LEFT_LARGE, TRACK_CURVE_LEFT_LARGE }, // TrackElemType::LeftEighthBankToOrthogonalDown25 { TRACK_CURVE_RIGHT_LARGE, TRACK_CURVE_RIGHT_LARGE }, // TrackElemType::RightEighthBankToOrthogonalDown25 + { RideConstructionSpecialPieceSelected | TrackElemType::DiagBrakes, RideConstructionSpecialPieceSelected | TrackElemType::DiagBrakes }, // TrackElemType::DiagBrakes + { TRACK_CURVE_NONE, TRACK_CURVE_NONE }, // TrackElemType::DiagBlockBrakes }; static_assert(std::size(gTrackCurveChain) == TrackElemType::Count); @@ -4557,6 +4567,8 @@ static constexpr track_type_t AlternativeTrackTypes[] = { TrackElemType::None, // TrackElemType::RightEighthBankToOrthogonalUp25 TrackElemType::None, // TrackElemType::LeftEighthBankToOrthogonalDown25 TrackElemType::None, // TrackElemType::RightEighthBankToOrthogonalDown25 + TrackElemType::None, // TrackElemType::DiagBrakes + TrackElemType::None, // TrackElemType::DiagBlockBrakes }; static_assert(std::size(AlternativeTrackTypes) == TrackElemType::Count); @@ -4899,6 +4911,8 @@ static constexpr money64 TrackPricing[] = { 233281, // TrackElemType::RightEighthBankToOrthogonalUp25 233281, // TrackElemType::LeftEighthBankToOrthogonalDown25 233281, // TrackElemType::RightEighthBankToOrthogonalDown25 + 123456, // TrackElemType::DiagBrakes + 123456, // TrackElemType::DiagBlockBrakes }; @@ -5244,6 +5258,8 @@ static constexpr track_type_t TrackElementMirrorMap[] = { TrackElemType::LeftEighthBankToOrthogonalUp25, // TrackElemType::LeftEighthBankToOrthogonalUp25 TrackElemType::RightEighthBankToOrthogonalDown25, // TrackElemType::RightEighthBankToOrthogonalDown25 TrackElemType::LeftEighthBankToOrthogonalDown25, // TrackElemType::LeftEighthBankToOrthogonalDown25 + TrackElemType::DiagBrakes, + TrackElemType::DiagBlockBrakes, }; static_assert(std::size(TrackElementMirrorMap) == TrackElemType::Count); @@ -5585,7 +5601,9 @@ static constexpr uint32_t TrackHeightMarkerPositions[] = { (1 << 0) | (1 << 4), // TrackElemType::RightEighthBankToOrthogonalUp25 (1 << 0) | (1 << 4), // TrackElemType::LeftEighthBankToOrthogonalUp25 (1 << 0) | (1 << 4), // TrackElemType::RightEighthBankToOrthogonalDown25 - (1 << 0) | (1 << 4), // TrackElemType::LeftEighthBankToOrthogonalDown25 + (1 << 0) | (1 << 4), // TrackElemType::LeftEighthBankToOrthogonalDown25 + (1 << 0), // TrackElemType::DiagBrakes + (1 << 0), // TrackElemType::DiagBlockBrakes }; static_assert(std::size(TrackHeightMarkerPositions) == TrackElemType::Count); @@ -5928,7 +5946,9 @@ static constexpr uint8_t TrackSequenceElementAllowedWallEdges[][MaxSequencesPerP { 0, 0b1000, 0b0110, 0b0010, 0b0010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // TrackElemType::LeftEighthBankToOrthogonalUp25 { 0, 0b0100, 0b1001, 0b0001, 0b0001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // TrackElemType::RightEighthBankToOrthogonalUp25 { 0, 0b1000, 0b0110, 0b0010, 0b0010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // TrackElemType::LeftEighthBankToOrthogonalDown25 - { 0, 0b0100, 0b1001, 0b0001, 0b0001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // TrackElemType::RightEighthBankToOrthogonalDown25 + { 0, 0b0100, 0b1001, 0b0001, 0b0001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // TrackElemType::RightEighthBankToOrthogonalDown25 + { 0, 0b0110, 0b1001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // TrackElemType::DiagBrakes + { 0, 0b0110, 0b1001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // TrackElemType::DiagBlockBrakes }; @@ -6274,6 +6294,8 @@ static constexpr uint16_t TrackFlags[] = { /* TrackElemType::RightEighthBankToOrthogonalUp25 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, /* TrackElemType::LeftEighthBankToOrthogonalDown25 */ TRACK_ELEM_FLAG_TURN_LEFT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, /* TrackElemType::RightEighthBankToOrthogonalDown25 */ TRACK_ELEM_FLAG_TURN_RIGHT | TRACK_ELEM_FLAG_TURN_SLOPED | TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_ALLOW_LIFT_HILL | TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT, + /* TrackElemType::DiagBrakes */ 0, + /* TrackElemType::DiagBlockBrakes */ 0, }; static_assert(std::size(TrackFlags) == TrackElemType::Count); // clang-format on @@ -6619,7 +6641,9 @@ static constexpr TrackDefinition TrackDefinitions[] = { TRACK_SLOPE_CURVE_LARGE_BANKED, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, 16 }, // TrackElemType::LeftEighthBankToOrthogonalUp25 { TRACK_SLOPE_CURVE_LARGE_BANKED, TRACK_SLOPE_UP_25, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, 16 }, // TrackElemType::RightEighthBankToOrthogonalUp25 { TRACK_SLOPE_CURVE_LARGE_BANKED, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_BANK_LEFT, -16 }, // TrackElemType::LeftEighthBankToOrthogonalDown25 - { TRACK_SLOPE_CURVE_LARGE_BANKED, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, -16 }, // TrackElemType::RightEighthBankToOrthogonalDown25 + { TRACK_SLOPE_CURVE_LARGE_BANKED, TRACK_SLOPE_DOWN_25, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, -16 }, // TrackElemType::RightEighthBankToOrthogonalDown25 + { TRACK_DIAG_BRAKES, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // TrackElemType::DiagBrakes + { TRACK_DIAG_BLOCK_BRAKES, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_BANK_NONE, 0 }, // TrackElemType::DiagBlockBrakes }; static_assert(std::size(TrackDefinitions) == TrackElemType::Count); @@ -6651,7 +6675,8 @@ constexpr static uint8_t TrackTypeToSpinFunction[] = { NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, L9_SPIN, R9_SPIN, L9_SPIN, R9_SPIN, L9_SPIN, R9_SPIN, L9_SPIN, R9_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, - NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, L9_SPIN, R9_SPIN, L9_SPIN, R9_SPIN, L9_SPIN, R9_SPIN, L9_SPIN, R9_SPIN, + NO_SPIN, NO_SPIN, NO_SPIN, NO_SPIN, L9_SPIN, R9_SPIN, L9_SPIN, R9_SPIN, L9_SPIN, R9_SPIN, L9_SPIN, R9_SPIN, NO_SPIN, + NO_SPIN, }; static_assert(std::size(TrackTypeToSpinFunction) == TrackElemType::Count); @@ -7942,6 +7967,8 @@ static constexpr StringId RideConfigurationStringIds[] = { STR_EMPTY, // TrackElemType::RightEighthBankToOrthogonalUp25 STR_EMPTY, // TrackElemType::LeftEighthBankToOrthogonalDown25 STR_EMPTY, // TrackElemType::RightEighthBankToOrthogonalDown25 + STR_BRAKES, // TrackElemType::DiagBrakes + STR_BLOCK_BRAKES // TrackElemType::DiagBlockBrakes }; static_assert(std::size(RideConfigurationStringIds) == TrackElemType::Count); diff --git a/src/openrct2/ride/TrackPaint.cpp b/src/openrct2/ride/TrackPaint.cpp index 2b5fe0633c..83902874d1 100644 --- a/src/openrct2/ride/TrackPaint.cpp +++ b/src/openrct2/ride/TrackPaint.cpp @@ -110,6 +110,20 @@ const uint8_t edges_4x4[] = { }; // clang-format on +const int32_t DiagBlockedSegments[] = { + SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4 | SEGMENT_BC, + SEGMENT_C4 | SEGMENT_CC | SEGMENT_C8 | SEGMENT_B4, + SEGMENT_D0 | SEGMENT_C4 | SEGMENT_C0 | SEGMENT_D4, + SEGMENT_D0 | SEGMENT_C4 | SEGMENT_B8 | SEGMENT_C8, +}; + +const uint8_t DiagSupportSegments[] = { + 1, + 0, + 2, + 3, +}; + const uint8_t track_map_1x4[][4] = { { 0, 1, 2, 3 }, { 2, 3, 0, 1 }, diff --git a/src/openrct2/ride/TrackPaint.h b/src/openrct2/ride/TrackPaint.h index c95f8cbf85..65a7e85a66 100644 --- a/src/openrct2/ride/TrackPaint.h +++ b/src/openrct2/ride/TrackPaint.h @@ -28,6 +28,9 @@ extern const uint8_t edges_4x4[]; extern const uint8_t track_map_1x4[][4]; +extern const int32_t DiagBlockedSegments[]; +extern const uint8_t DiagSupportSegments[]; + enum { SPR_FLOOR_PLANKS = 3395, diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index 214d157e05..98033d02e7 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -6081,6 +6081,7 @@ void Vehicle::CheckAndApplyBlockSectionStopSite() switch (trackType) { case TrackElemType::BlockBrakes: + case TrackElemType::DiagBlockBrakes: if (curRide->IsBlockSectioned() && trackElement->AsTrack()->IsBrakeClosed()) ApplyStopBlockBrake(); else @@ -6185,12 +6186,13 @@ static void block_brakes_open_previous_section( // Get the start of the track block instead of the end location = { trackBeginEnd.begin_x, trackBeginEnd.begin_y, trackBeginEnd.begin_z }; - auto trackElement = MapGetTrackElementAt(location); - if (trackElement == nullptr) + auto trackOrigin = MapGetTrackElementAtOfTypeSeq(location, trackBeginEnd.begin_element->AsTrack()->GetTrackType(), 0); + if (trackOrigin == nullptr) { return; } - trackElement->SetBrakeClosed(false); + auto trackElement = trackOrigin->AsTrack(); + trackElement->SetBrakeClosed2(location, false); MapInvalidateElement(location, reinterpret_cast(trackElement)); auto trackType = trackElement->GetTrackType(); @@ -6198,7 +6200,7 @@ static void block_brakes_open_previous_section( { OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::BlockBrakeClose, location); } - else if (trackType == TrackElemType::BlockBrakes) + else if (TrackTypeIsBlockBrakes(trackType)) { OpenRCT2::Audio::Play3D(OpenRCT2::Audio::SoundId::BlockBrakeClose, location); BlockBrakeSetLinkedBrakesClosed(location, *trackElement, false); @@ -6414,7 +6416,7 @@ void Vehicle::UpdateSwingingCar() break; } - if (TrackTypeIsStation(trackType) || trackType == TrackElemType::Brakes || trackType == TrackElemType::BlockBrakes) + if (TrackTypeIsStation(trackType) || TrackTypeIsBrakes(trackType) || TrackTypeIsBlockBrakes(trackType)) { dx = 0; cx = 0; @@ -7398,7 +7400,7 @@ void Vehicle::Sub6DBF3E() */ uint8_t Vehicle::ChooseBrakeSpeed() const { - if (GetTrackType() != TrackElemType::Brakes) + if (!TrackTypeIsBrakes(GetTrackType())) return brake_speed; auto trackElement = MapGetTrackElementAtOfTypeSeq(TrackLocation, GetTrackType(), 0); if (trackElement != nullptr) @@ -7418,7 +7420,7 @@ void Vehicle::PopulateBrakeSpeed(const CoordsXYZ& vehicleTrackLocation, TrackEle { auto trackSpeed = brake.GetBrakeBoosterSpeed(); brake_speed = trackSpeed; - if (brake.GetTrackType() != TrackElemType::Brakes) + if (!TrackTypeIsBrakes(brake.GetTrackType())) { BlockBrakeSpeed = trackSpeed; return; @@ -7430,12 +7432,12 @@ void Vehicle::PopulateBrakeSpeed(const CoordsXYZ& vehicleTrackLocation, TrackEle uint16_t timeoutCount = 256; do { - if (output.element->AsTrack()->GetTrackType() == TrackElemType::BlockBrakes) + if (TrackTypeIsBlockBrakes(output.element->AsTrack()->GetTrackType())) { BlockBrakeSpeed = output.element->AsTrack()->GetBrakeBoosterSpeed(); return; } - if (output.element->AsTrack()->GetTrackType() != TrackElemType::Brakes) + if (TrackTypeIsBrakes(output.element->AsTrack()->GetTrackType())) { break; } @@ -7471,9 +7473,8 @@ bool Vehicle::UpdateTrackMotionForwardsGetNewTrack(uint16_t trackType, const Rid { if (next_vehicle_on_train.IsNull()) { - tileElement->AsTrack()->SetBrakeClosed(true); - - if (trackType == TrackElemType::BlockBrakes || trackType == TrackElemType::EndStation) + tileElement->AsTrack()->SetBrakeClosed2(TrackLocation, true); + if (TrackTypeIsBlockBrakes(trackType) || trackType == TrackElemType::EndStation) { if (!(rideEntry.Cars[0].flags & CAR_ENTRY_FLAG_POWERED)) { @@ -7482,7 +7483,7 @@ bool Vehicle::UpdateTrackMotionForwardsGetNewTrack(uint16_t trackType, const Rid } MapInvalidateElement(TrackLocation, tileElement); block_brakes_open_previous_section(curRide, TrackLocation, tileElement); - if (trackType == TrackElemType::BlockBrakes) + if (TrackTypeIsBlockBrakes(trackType)) { BlockBrakeSetLinkedBrakesClosed(TrackLocation, *tileElement->AsTrack(), true); } @@ -7656,7 +7657,7 @@ Loc6DAEB9: acceleration = 0x50000; } } - else if (trackType == TrackElemType::Brakes) + else if (TrackTypeIsBrakes(trackType)) { bool hasBrakesFailure = curRide.lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN && curRide.breakdown_reason_pending == BREAKDOWN_BRAKES_FAILURE; @@ -8050,7 +8051,7 @@ bool Vehicle::UpdateTrackMotionBackwards(const CarEntry* carEntry, const Ride& c } } - if (trackType == TrackElemType::Brakes) + if (TrackTypeIsBrakes(trackType)) { auto brakeSpeed = ChooseBrakeSpeed(); diff --git a/src/openrct2/ride/VehicleSubpositionData.cpp b/src/openrct2/ride/VehicleSubpositionData.cpp index 4377f320aa..cfdd3638b5 100644 --- a/src/openrct2/ride/VehicleSubpositionData.cpp +++ b/src/openrct2/ride/VehicleSubpositionData.cpp @@ -30076,6 +30076,8 @@ static constexpr const VehicleInfoList *TrackVehicleInfoListDefault[] = { &TrackVehicleInfoRightEighthBankToOrthogonalUp250, &TrackVehicleInfoRightEighthBankToOrthogonalUp251, &TrackVehicleInfoRightEighthBankToOrthogonalUp252, &TrackVehicleInfoRightEighthBankToOrthogonalUp253, // TrackElemType::RightEighthBankBankToOrthogonalUp25 &TrackVehicleInfoLeftEighthBankToOrthogonalDown250, &TrackVehicleInfoLeftEighthBankToOrthogonalDown251, &TrackVehicleInfoLeftEighthBankToOrthogonalDown252, &TrackVehicleInfoLeftEighthBankToOrthogonalDown253, // TrackElemType::LeftEighthBankBankToOrthogonalDown25 &TrackVehicleInfoRightEighthBankToOrthogonalDown250, &TrackVehicleInfoRightEighthBankToOrthogonalDown251, &TrackVehicleInfoRightEighthBankToOrthogonalDown252, &TrackVehicleInfoRightEighthBankToOrthogonalDown253, // TrackElemType::RightEighthBankBankToOrthogonalDown25 + &TrackVehicleInfo_9162E6, &TrackVehicleInfo_916408, &TrackVehicleInfo_91652A, &TrackVehicleInfo_91664C, // DiagBrakes + &TrackVehicleInfo_9162E6, &TrackVehicleInfo_916408, &TrackVehicleInfo_91652A, &TrackVehicleInfo_91664C, // DiagBlockBrakes }; static_assert(std::size(TrackVehicleInfoListDefault) == VehicleTrackSubpositionSizeDefault); diff --git a/src/openrct2/ride/coaster/CompactInvertedCoaster.cpp b/src/openrct2/ride/coaster/CompactInvertedCoaster.cpp index c7b7eff7ff..25c054904f 100644 --- a/src/openrct2/ride/coaster/CompactInvertedCoaster.cpp +++ b/src/openrct2/ride/coaster/CompactInvertedCoaster.cpp @@ -18,6 +18,28 @@ #include "../TrackData.h" #include "../TrackPaint.h" +static constexpr const uint32_t CompactInvertedDiagBrakeImages[NumOrthogonalDirections] = { + SPR_G2_SLC_DIAG_BRAKES, + SPR_G2_SLC_DIAG_BRAKES + 1, + SPR_G2_SLC_DIAG_BRAKES, + SPR_G2_SLC_DIAG_BRAKES + 1, +}; + +static constexpr const uint32_t CompactInvertedDiagBlockBrakeImages[2][NumOrthogonalDirections] = { + { + SPR_G2_SLC_DIAG_BRAKES, + SPR_G2_SLC_DIAG_BRAKES + 1, + SPR_G2_SLC_DIAG_BRAKES, + SPR_G2_SLC_DIAG_BRAKES + 1, + }, + { + SPR_G2_SLC_DIAG_BRAKES, + SPR_G2_SLC_DIAG_BRAKES + 2, + SPR_G2_SLC_DIAG_BRAKES, + SPR_G2_SLC_DIAG_BRAKES + 2, + }, +}; + /** rct2: 0x008AE6E0 */ static void CompactInvertedRCTrackFlat( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, @@ -6344,6 +6366,47 @@ static void CompactInvertedRCTrackDiagFlat( } } +static void CompactInvertedRCTrackDiagBrakes( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement) +{ + TrackPaintUtilDiagTilesPaint( + session, 3, height + 29, direction, trackSequence, session.TrackColours[SCHEME_TRACK], CompactInvertedDiagBrakeImages, + defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr); + + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; + PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); + + if (trackSequence == 3) + { + MetalASupportsPaintSetup( + session, MetalSupportType::TubesInverted, DiagSupportSegments[direction], 0, height + 38, + session.TrackColours[SCHEME_SUPPORTS]); + } + PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20); +} + +static void CompactInvertedRCTrackDiagBlockBrakes( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement) +{ + TrackPaintUtilDiagTilesPaint( + session, 3, height + 29, direction, trackSequence, session.TrackColours[SCHEME_TRACK], + CompactInvertedDiagBlockBrakeImages[trackElement.IsBrakeClosed()], defaultDiagTileOffsets, defaultDiagBoundLengths, + nullptr); + + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; + PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); + + if (trackSequence == 3) + { + MetalASupportsPaintSetup( + session, MetalSupportType::TubesInverted, DiagSupportSegments[direction], 0, height + 38, + session.TrackColours[SCHEME_SUPPORTS]); + } + PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20); +} + /** rct2: 0x008AEBB0 */ static void CompactInvertedRCTrackDiag25DegUp( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, @@ -9094,6 +9157,10 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionCompactInvertedRC(int32_t trackType) return CompactInvertedRCTrackDiagRightBank; case TrackElemType::BlockBrakes: return CompactInvertedRCTrackBlockBrakes; + case TrackElemType::DiagBrakes: + return CompactInvertedRCTrackDiagBrakes; + case TrackElemType::DiagBlockBrakes: + return CompactInvertedRCTrackDiagBlockBrakes; } return nullptr; } diff --git a/src/openrct2/ride/coaster/CorkscrewRollerCoaster.cpp b/src/openrct2/ride/coaster/CorkscrewRollerCoaster.cpp index 01cdb6f6b9..01bc122f11 100644 --- a/src/openrct2/ride/coaster/CorkscrewRollerCoaster.cpp +++ b/src/openrct2/ride/coaster/CorkscrewRollerCoaster.cpp @@ -30,6 +30,28 @@ static constexpr uint32_t _CorkscrewRCBlockBrakeImages[NumOrthogonalDirections][ { CORKSCREW_RC_BLOCK_BRAKE_NW_SE_OPEN, CORKSCREW_RC_BLOCK_BRAKE_NW_SE_CLOSED }, }; +static constexpr const uint32_t CorkscrewRCDiagBrakeImages[NumOrthogonalDirections] = { + SPR_G2_CORKSCREW_DIAG_BRAKES, + SPR_G2_CORKSCREW_DIAG_BRAKES + 1, + SPR_G2_CORKSCREW_DIAG_BRAKES, + SPR_G2_CORKSCREW_DIAG_BRAKES + 1, +}; + +static constexpr const uint32_t CorkscrewRCDiagBlockBrakeImages[2][NumOrthogonalDirections] = { + { + SPR_G2_CORKSCREW_DIAG_BRAKES + 3, + SPR_G2_CORKSCREW_DIAG_BRAKES + 5, + SPR_G2_CORKSCREW_DIAG_BRAKES + 3, + SPR_G2_CORKSCREW_DIAG_BRAKES + 5, + }, + { + SPR_G2_CORKSCREW_DIAG_BRAKES + 2, + SPR_G2_CORKSCREW_DIAG_BRAKES + 4, + SPR_G2_CORKSCREW_DIAG_BRAKES + 2, + SPR_G2_CORKSCREW_DIAG_BRAKES + 4, + }, +}; + /** rct2: 0x008A7AF8 */ static void CorkscrewRCTrackFlat( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, @@ -6055,6 +6077,45 @@ static void CorkscrewRCTrackDiagFlat( } } +static void CorkscrewRCTrackDiagBrakes( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement) +{ + TrackPaintUtilDiagTilesPaint( + session, 3, height, direction, trackSequence, session.TrackColours[SCHEME_TRACK], CorkscrewRCDiagBrakeImages, + defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr); + + if (trackSequence == 3) + { + MetalASupportsPaintSetup( + session, MetalSupportType::Tubes, DiagSupportSegments[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); + } + + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; + PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); +} + +static void CorkscrewRCTrackDiagBlockBrakes( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement) +{ + TrackPaintUtilDiagTilesPaint( + session, 3, height, direction, trackSequence, session.TrackColours[SCHEME_TRACK], + CorkscrewRCDiagBlockBrakeImages[trackElement.IsBrakeClosed()], defaultDiagTileOffsets, defaultDiagBoundLengths, + nullptr); + + if (trackSequence == 3) + { + MetalASupportsPaintSetup( + session, MetalSupportType::Tubes, DiagSupportSegments[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); + } + + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; + PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); +} + /** rct2: 0x008A8008 */ static void CorkscrewRCTrackDiag25DegUp( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, @@ -10280,6 +10341,10 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionCorkscrewRC(int32_t trackType) return CorkscrewRCTrackDiagRightBank; case TrackElemType::BlockBrakes: return CorkscrewRCTrackBlockBrakes; + case TrackElemType::DiagBrakes: + return CorkscrewRCTrackDiagBrakes; + case TrackElemType::DiagBlockBrakes: + return CorkscrewRCTrackDiagBlockBrakes; case TrackElemType::Booster: return CorkscrewRCTrackBooster; diff --git a/src/openrct2/ride/coaster/InvertedRollerCoaster.cpp b/src/openrct2/ride/coaster/InvertedRollerCoaster.cpp index 077312e15c..b061aad999 100644 --- a/src/openrct2/ride/coaster/InvertedRollerCoaster.cpp +++ b/src/openrct2/ride/coaster/InvertedRollerCoaster.cpp @@ -18,6 +18,13 @@ #include "../TrackData.h" #include "../TrackPaint.h" +static constexpr const uint32_t InvertedRCDiagBrakeImages[NumOrthogonalDirections] = { + SPR_G2_BM_INVERTED_DIAG_BRAKES, + SPR_G2_BM_INVERTED_DIAG_BRAKES + 1, + SPR_G2_BM_INVERTED_DIAG_BRAKES, + SPR_G2_BM_INVERTED_DIAG_BRAKES + 1, +}; + /** rct2: 0x008A92E8 */ static void InvertedRCTrackFlat( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, @@ -6068,6 +6075,26 @@ static void InvertedRCTrackDiagFlat( } } +static void inverted_rc_track_diag_brakes( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement) +{ + TrackPaintUtilDiagTilesPaint( + session, 1, height + 29, direction, trackSequence, session.TrackColours[SCHEME_TRACK], InvertedRCDiagBrakeImages, + defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr); + + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; + PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); + + if (trackSequence == 3) + { + MetalASupportsPaintSetup( + session, MetalSupportType::Boxed, DiagSupportSegments[direction], 0, height + 44, + session.TrackColours[SCHEME_SUPPORTS]); + } + PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20); +} + /** rct2: 0x008A97B8 */ static void InvertedRCTrackDiag25DegUp( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, @@ -10852,6 +10879,10 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionInvertedRC(int32_t trackType) case TrackElemType::RightBankedDown25ToFlat: return InvertedRCTrackRightBanked25DegDownToFlat; + case TrackElemType::DiagBrakes: + case TrackElemType::DiagBlockBrakes: + return inverted_rc_track_diag_brakes; + case TrackElemType::Booster: return InvertedRCTrackBooster; } diff --git a/src/openrct2/ride/coaster/JuniorRollerCoaster.cpp b/src/openrct2/ride/coaster/JuniorRollerCoaster.cpp index 38993eb026..8d3ff7ee2a 100644 --- a/src/openrct2/ride/coaster/JuniorRollerCoaster.cpp +++ b/src/openrct2/ride/coaster/JuniorRollerCoaster.cpp @@ -606,6 +606,12 @@ enum SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_E_W = 28380, SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_S_N = 28381, SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_E_W_PART_0_2 = 28382, + SPR_JUNIOR_RC_DIAG_BRAKES_E_W = SPR_G2_JUNIOR_DIAG_BRAKES, + SPR_JUNIOR_RC_DIAG_BRAKES_N_S = SPR_G2_JUNIOR_DIAG_BRAKES + 1, + SPR_JUNIOR_RC_DIAG_BLOCKBRAKES_E_W_CLOSED = SPR_G2_JUNIOR_DIAG_BRAKES + 2, + SPR_JUNIOR_RC_DIAG_BLOCKBRAKES_E_W_OPEN = SPR_G2_JUNIOR_DIAG_BRAKES + 3, + SPR_JUNIOR_RC_DIAG_BLOCKBRAKES_N_S_CLOSED = SPR_G2_JUNIOR_DIAG_BRAKES + 4, + SPR_JUNIOR_RC_DIAG_BLOCKBRAKES_N_S_OPEN = SPR_G2_JUNIOR_DIAG_BRAKES + 5, }; static constexpr uint32_t junior_rc_track_pieces_flat[3][4] = { @@ -1813,6 +1819,29 @@ static constexpr uint32_t junior_rc_track_pieces_diag_60_deg_down_to_25_deg_down }, }; +static constexpr const uint32_t junior_rc_track_pieces_diag_brakes[4] = { + SPR_JUNIOR_RC_DIAG_BRAKES_E_W, + SPR_JUNIOR_RC_DIAG_BRAKES_N_S, + SPR_JUNIOR_RC_DIAG_BRAKES_E_W, + SPR_JUNIOR_RC_DIAG_BRAKES_N_S, +}; + +static constexpr const uint32_t junior_rc_track_pieces_diag_blockbrakes[2][4] = { + { + SPR_JUNIOR_RC_DIAG_BLOCKBRAKES_E_W_OPEN, + SPR_JUNIOR_RC_DIAG_BLOCKBRAKES_N_S_OPEN, + SPR_JUNIOR_RC_DIAG_BLOCKBRAKES_E_W_OPEN, + SPR_JUNIOR_RC_DIAG_BLOCKBRAKES_N_S_OPEN, + }, + { + SPR_JUNIOR_RC_DIAG_BLOCKBRAKES_E_W_CLOSED, + SPR_JUNIOR_RC_DIAG_BLOCKBRAKES_N_S_CLOSED, + SPR_JUNIOR_RC_DIAG_BLOCKBRAKES_E_W_CLOSED, + SPR_JUNIOR_RC_DIAG_BLOCKBRAKES_N_S_CLOSED, + }, +}; + + void JuniorRCPaintTrackFlat( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, uint16_t height, const TrackElement& trackElement, JuniorRCChainType chainType) @@ -4368,20 +4397,6 @@ static void JuniorRCRightEighthToOrthogonalBankPaintSetup( JuniorRCLeftEighthToDiagBankPaintSetup(session, ride, trackSequence, (direction + 3) % 4, height, trackElement); } -static constexpr int32_t junior_rc_diag_blocked_segments[] = { - SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4 | SEGMENT_BC, - SEGMENT_C4 | SEGMENT_CC | SEGMENT_C8 | SEGMENT_B4, - SEGMENT_D0 | SEGMENT_C4 | SEGMENT_C0 | SEGMENT_D4, - SEGMENT_D0 | SEGMENT_C4 | SEGMENT_B8 | SEGMENT_C8, -}; - -static constexpr uint8_t junior_rc_diag_support_segment[] = { - 1, - 0, - 2, - 3, -}; - void JuniorRCPaintTrackDiagFlat( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, uint16_t height, const TrackElement& trackElement, JuniorRCChainType chainType) @@ -4394,14 +4409,55 @@ void JuniorRCPaintTrackDiagFlat( { MetalASupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); } +static void JuniorRCTrackDiagBrakes( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement) +{ + TrackPaintUtilDiagTilesPaint( + session, 1, height, direction, trackSequence, session.TrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_brakes, + defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr); + + if (trackSequence == 3) + { + MetalASupportsPaintSetup( + session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, DiagSupportSegments[direction], 0, height, + session.TrackColours[SCHEME_SUPPORTS]); + } + + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; + PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20); +} + +static void JuniorRCTrackDiagBlockBrakes( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement) +{ + TrackPaintUtilDiagTilesPaint( + session, 1, height, direction, trackSequence, session.TrackColours[SCHEME_TRACK], + junior_rc_track_pieces_diag_blockbrakes[trackElement.IsBrakeClosed()], defaultDiagTileOffsets, defaultDiagBoundLengths, + nullptr); + + if (trackSequence == 3) + { + MetalASupportsPaintSetup( + session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, DiagSupportSegments[direction], 0, height, + session.TrackColours[SCHEME_SUPPORTS]); + } + + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; + PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20); +} + void JuniorRCPaintTrackDiag25DegUp( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, uint16_t height, const TrackElement& trackElement, JuniorRCChainType chainType) @@ -4414,10 +4470,10 @@ void JuniorRCPaintTrackDiag25DegUp( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 8, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 8, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20); } @@ -4435,10 +4491,10 @@ void JuniorRCPaintTrackDiagFlatTo25DegUp( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20); } @@ -4459,10 +4515,10 @@ void JuniorRCPaintTrackDiagFlatTo60DegUp( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 0, height + 6, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 0, height + 6, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 64, 0x20); } @@ -4480,10 +4536,10 @@ void JuniorRCPaintTrackDiag25DegUpToFlat( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 4, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 4, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20); } @@ -4504,10 +4560,10 @@ void JuniorRCPaintTrackDiag60DegUpToFlat( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 4, height + 13, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 4, height + 13, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 64, 0x20); } @@ -4525,10 +4581,10 @@ void JuniorRCPaintTrackDiag25DegDown( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 8, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 8, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20); } @@ -4546,10 +4602,10 @@ void JuniorRCPaintTrackDiagFlatTo25DegDown( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 4, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 4, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20); } @@ -4570,10 +4626,10 @@ void JuniorRCPaintTrackDiagFlatTo60DegDown( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 4, height + 7, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 4, height + 7, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20); } @@ -4591,10 +4647,10 @@ void JuniorRCPaintTrackDiag25DegDownToFlat( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20); } @@ -4615,10 +4671,10 @@ void JuniorRCPaintTrackDiag60DegDownToFlat( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20); } @@ -4759,10 +4815,10 @@ static void JuniorRCDiagFlatToLeftBankPaintSetup( { MetalASupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); } @@ -4786,10 +4842,10 @@ static void JuniorRCDiagFlatToRightBankPaintSetup( { MetalASupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); } @@ -4813,10 +4869,10 @@ static void JuniorRCDiagLeftBankToFlatPaintSetup( { MetalASupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); } @@ -4840,10 +4896,10 @@ static void JuniorRCDiagRightBankToFlatPaintSetup( { MetalASupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); } @@ -4867,10 +4923,10 @@ static void JuniorRCDiagLeftBankTo25DegUpPaintSetup( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20); } @@ -4894,10 +4950,10 @@ static void JuniorRCDiagRightBankTo25DegUpPaintSetup( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20); } @@ -4921,10 +4977,10 @@ static void JuniorRCDiag25DegUpToLeftBankPaintSetup( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 4, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 4, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20); } @@ -4948,10 +5004,10 @@ static void JuniorRCDiag25DegUpToRightBankPaintSetup( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 4, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 4, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20); } @@ -4975,10 +5031,10 @@ static void JuniorRCDiagLeftBankTo25DegDownPaintSetup( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 4, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 4, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20); } @@ -5002,10 +5058,10 @@ static void JuniorRCDiagRightBankTo25DegDownPaintSetup( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 4, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 4, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 56, 0x20); } @@ -5029,10 +5085,10 @@ static void JuniorRCDiag25DegDownToLeftBankPaintSetup( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20); } @@ -5056,10 +5112,10 @@ static void JuniorRCDiag25DegDownToRightBankPaintSetup( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 48, 0x20); } @@ -5093,10 +5149,10 @@ static void JuniorRCDiagLeftBankPaintSetup( { MetalASupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); } @@ -5116,10 +5172,10 @@ static void JuniorRCDiagRightBankPaintSetup( { MetalASupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); } @@ -5384,10 +5440,10 @@ void JuniorRCPaintTrackDiag60DegUp( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 36, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 36, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 104, 0x20); } @@ -5405,10 +5461,10 @@ void JuniorRCPaintTrackDiag60DegDown( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 28, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 28, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 104, 0x20); } @@ -5426,10 +5482,10 @@ void JuniorRCPaintTrackDiag25DegUpTo60DegUp( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 16, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 16, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20); } @@ -5458,10 +5514,10 @@ void JuniorRCPaintTrackDiag60DegUpTo25DegUp( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 21, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 21, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20); } @@ -5490,10 +5546,10 @@ void JuniorRCPaintTrackDiag25DegDownTo60DegDown( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 17, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 17, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20); } @@ -5511,10 +5567,10 @@ void JuniorRCPaintTrackDiag60DegDownTo25DegDown( { MetalBSupportsPaintSetup( session, (direction & 1) ? MetalSupportType::ForkAlt : MetalSupportType::Fork, - junior_rc_diag_support_segment[direction], 8, height, session.TrackColours[SCHEME_SUPPORTS]); + DiagSupportSegments[direction], 8, height, session.TrackColours[SCHEME_SUPPORTS]); } - int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + 72, 0x20); } @@ -6111,6 +6167,10 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionJuniorRC(int32_t trackType) case TrackElemType::BlockBrakes: return JuniorRCBlockBrakePaintSetup; + case TrackElemType::DiagBrakes: + return JuniorRCTrackDiagBrakes; + case TrackElemType::DiagBlockBrakes: + return JuniorRCTrackDiagBlockBrakes; case TrackElemType::Booster: return JuniorRCBoosterPaintSetup; diff --git a/src/openrct2/ride/coaster/LayDownRollerCoaster.cpp b/src/openrct2/ride/coaster/LayDownRollerCoaster.cpp index 115839110a..059d895981 100644 --- a/src/openrct2/ride/coaster/LayDownRollerCoaster.cpp +++ b/src/openrct2/ride/coaster/LayDownRollerCoaster.cpp @@ -17,6 +17,51 @@ #include "../RideData.h" #include "../TrackData.h" #include "../TrackPaint.h" +static constexpr const uint32_t LaydownDiagBrakeImages[2][NumOrthogonalDirections] = { + { + SPR_G2_CORKSCREW_DIAG_BRAKES, + SPR_G2_CORKSCREW_DIAG_BRAKES + 1, + SPR_G2_CORKSCREW_DIAG_BRAKES, + SPR_G2_CORKSCREW_DIAG_BRAKES + 1, + }, + { + SPR_G2_SLC_DIAG_BRAKES, + SPR_G2_SLC_DIAG_BRAKES + 2, + SPR_G2_SLC_DIAG_BRAKES, + SPR_G2_SLC_DIAG_BRAKES + 2, + }, +}; + +static constexpr const uint32_t LaydownDiagBlockBrakeImages[2][2][NumOrthogonalDirections] = { + { + { + SPR_G2_CORKSCREW_DIAG_BRAKES + 3, + SPR_G2_CORKSCREW_DIAG_BRAKES + 5, + SPR_G2_CORKSCREW_DIAG_BRAKES + 3, + SPR_G2_CORKSCREW_DIAG_BRAKES + 5, + }, + { + SPR_G2_CORKSCREW_DIAG_BRAKES + 2, + SPR_G2_CORKSCREW_DIAG_BRAKES + 4, + SPR_G2_CORKSCREW_DIAG_BRAKES + 2, + SPR_G2_CORKSCREW_DIAG_BRAKES + 4, + }, + }, + { + { + SPR_G2_SLC_DIAG_BRAKES, + SPR_G2_SLC_DIAG_BRAKES + 2, + SPR_G2_SLC_DIAG_BRAKES, + SPR_G2_SLC_DIAG_BRAKES + 2, + }, + { + SPR_G2_SLC_DIAG_BRAKES, + SPR_G2_SLC_DIAG_BRAKES + 1, + SPR_G2_SLC_DIAG_BRAKES, + SPR_G2_SLC_DIAG_BRAKES + 1, + }, + }, +}; /** rct2: 0x0082491C */ static void LayDownRCTrackFlat( @@ -4433,6 +4478,86 @@ static void LayDownRCTrackDiagFlat( } } +static void LayDownRCTrackDiagBrakes( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement) +{ + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; + if (trackElement.IsInverted()) + { + TrackPaintUtilDiagTilesPaint( + session, -3, height + 24, direction, trackSequence, session.TrackColours[SCHEME_TRACK], LaydownDiagBrakeImages[1], + defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr); + + PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); + + if (trackSequence == 3) + { + MetalASupportsPaintSetup( + session, MetalSupportType::TubesInverted, DiagSupportSegments[direction], 0, height + 33, + session.TrackColours[SCHEME_SUPPORTS]); + } + PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); + } + else + { + TrackPaintUtilDiagTilesPaint( + session, 3, height, direction, trackSequence, session.TrackColours[SCHEME_TRACK], LaydownDiagBrakeImages[0], + defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr); + + if (trackSequence == 3) + { + MetalASupportsPaintSetup( + session, MetalSupportType::TubesInverted, DiagSupportSegments[direction], 0, height, + session.TrackColours[SCHEME_SUPPORTS]); + } + + PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); + } +} + +static void LayDownRCTrackDiagBlockBrakes( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement) +{ + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; + if (trackElement.IsInverted()) + { + TrackPaintUtilDiagTilesPaint( + session, -3, height + 24, direction, trackSequence, session.TrackColours[SCHEME_TRACK], + LaydownDiagBlockBrakeImages[1][trackElement.IsBrakeClosed()], defaultDiagTileOffsets, defaultDiagBoundLengths, + nullptr); + + PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); + + if (trackSequence == 3) + { + MetalASupportsPaintSetup( + session, MetalSupportType::TubesInverted, DiagSupportSegments[direction], 0, height + 33, + session.TrackColours[SCHEME_SUPPORTS]); + } + PaintUtilSetGeneralSupportHeight(session, height + 33, 0x20); + } + else + { + TrackPaintUtilDiagTilesPaint( + session, 3, height, direction, trackSequence, session.TrackColours[SCHEME_TRACK], + LaydownDiagBlockBrakeImages[0][trackElement.IsBrakeClosed()], defaultDiagTileOffsets, defaultDiagBoundLengths, + nullptr); + + if (trackSequence == 3) + { + MetalASupportsPaintSetup( + session, MetalSupportType::TubesInverted, DiagSupportSegments[direction], 0, height, + session.TrackColours[SCHEME_SUPPORTS]); + } + + PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); + } +} + /** rct2: 0x00824E2C */ static void LayDownRCTrackDiag25DegUp( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, @@ -8616,6 +8741,10 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionLayDownRC(int32_t trackType) return LayDownRCTrackDiagRightBank; case TrackElemType::BlockBrakes: return LayDownRCTrackBlockBrakes; + case TrackElemType::DiagBrakes: + return LayDownRCTrackDiagBrakes; + case TrackElemType::DiagBlockBrakes: + return LayDownRCTrackDiagBlockBrakes; // Inverted only case TrackElemType::LeftFlyerTwistDown: diff --git a/src/openrct2/ride/coaster/LimLaunchedRollerCoaster.cpp b/src/openrct2/ride/coaster/LimLaunchedRollerCoaster.cpp index e1f4b9b842..18f7427dc7 100644 --- a/src/openrct2/ride/coaster/LimLaunchedRollerCoaster.cpp +++ b/src/openrct2/ride/coaster/LimLaunchedRollerCoaster.cpp @@ -30,6 +30,28 @@ static constexpr uint32_t _LimLauncherBlockBrakeImages[NumOrthogonalDirections][ { LIM_LAUNCHED_RC_BLOCK_BRAKE_NW_SE_OPEN, LIM_LAUNCHED_RC_BLOCK_BRAKE_NW_SE_CLOSED }, }; +static constexpr const uint32_t LimLaunchedRCDiagBrakeImages[NumOrthogonalDirections] = { + SPR_G2_LIM_LAUNCHED_DIAG_BRAKES, + SPR_G2_LIM_LAUNCHED_DIAG_BRAKES + 1, + SPR_G2_LIM_LAUNCHED_DIAG_BRAKES, + SPR_G2_LIM_LAUNCHED_DIAG_BRAKES + 1, +}; + +static constexpr const uint32_t LimLaunchedRCDiagBlockBrakeImages[2][NumOrthogonalDirections] = { + { + SPR_G2_LIM_LAUNCHED_DIAG_BRAKES + 3, + SPR_G2_LIM_LAUNCHED_DIAG_BRAKES + 5, + SPR_G2_LIM_LAUNCHED_DIAG_BRAKES + 3, + SPR_G2_LIM_LAUNCHED_DIAG_BRAKES + 5, + }, + { + SPR_G2_LIM_LAUNCHED_DIAG_BRAKES + 2, + SPR_G2_LIM_LAUNCHED_DIAG_BRAKES + 4, + SPR_G2_LIM_LAUNCHED_DIAG_BRAKES + 2, + SPR_G2_LIM_LAUNCHED_DIAG_BRAKES + 4, + }, +}; + /** rct2: 0x008A6D50, 0x008A6D60, 0x008A6D70 */ static void LimLaunchedRCTrackStation( PaintSession& session, const Ride& ride, [[maybe_unused]] uint8_t trackSequence, uint8_t direction, int32_t height, @@ -5695,6 +5717,45 @@ static void LimLaunchedRCTrackBooster( PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); } +static void LimLaunchedRCTrackDiagBrakes( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement) +{ + TrackPaintUtilDiagTilesPaint( + session, 3, height, direction, trackSequence, session.TrackColours[SCHEME_TRACK], LimLaunchedRCDiagBrakeImages, + defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr); + + if (trackSequence == 3) + { + MetalASupportsPaintSetup( + session, MetalSupportType::Tubes, DiagSupportSegments[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); + } + + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; + PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); +} + +static void LimLaunchedRCTrackDiagBlockBrakes( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement) +{ + TrackPaintUtilDiagTilesPaint( + session, 3, height, direction, trackSequence, session.TrackColours[SCHEME_TRACK], + LimLaunchedRCDiagBlockBrakeImages[trackElement.IsBrakeClosed()], defaultDiagTileOffsets, defaultDiagBoundLengths, + nullptr); + + if (trackSequence == 3) + { + MetalASupportsPaintSetup( + session, MetalSupportType::Tubes, DiagSupportSegments[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); + } + + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; + PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); +} + TRACK_PAINT_FUNCTION GetTrackPaintFunctionLimLaunchedRC(int32_t trackType) { switch (trackType) @@ -5968,6 +6029,10 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionLimLaunchedRC(int32_t trackType) return LimLaunchedRCTrackRightLargeZeroGRollDown; case TrackElemType::Booster: return LimLaunchedRCTrackBooster; + case TrackElemType::DiagBrakes: + return LimLaunchedRCTrackDiagBrakes; + case TrackElemType::DiagBlockBrakes: + return LimLaunchedRCTrackDiagBlockBrakes; } return nullptr; } diff --git a/src/openrct2/ride/coaster/LoopingRollerCoaster.cpp b/src/openrct2/ride/coaster/LoopingRollerCoaster.cpp index 1964af1394..929cb013dd 100644 --- a/src/openrct2/ride/coaster/LoopingRollerCoaster.cpp +++ b/src/openrct2/ride/coaster/LoopingRollerCoaster.cpp @@ -24,6 +24,13 @@ static constexpr auto SPR_LOOPING_RC_BOOSTER_NW_SE = 15011; static constexpr auto SPR_LOOPING_RC_FLAT_CHAINED_SW_NE = 15016; static constexpr auto SPR_LOOPING_RC_FLAT_CHAINED_NW_SE = 15017; +static constexpr const uint32_t LoopingRCDiagBrakeImages[NumOrthogonalDirections] = { + SPR_G2_LOOPING_DIAG_BRAKES, + SPR_G2_LOOPING_DIAG_BRAKES + 1, + SPR_G2_LOOPING_DIAG_BRAKES, + SPR_G2_LOOPING_DIAG_BRAKES + 1, +}; + /** rct2: 0x008A6370 */ static void LoopingRCTrackFlat( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, @@ -5480,6 +5487,26 @@ static void LoopingRCTrackDiagFlat( } } +static void LoopingRCTrackDiagBrakes( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement) +{ + TrackPaintUtilDiagTilesPaint( + session, 3, height, direction, trackSequence, session.TrackColours[SCHEME_TRACK], LoopingRCDiagBrakeImages, + defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr); + + // TODO: draw brake sprite layers + + if (trackSequence == 3) + { + MetalASupportsPaintSetup( + session, MetalSupportType::Tubes, DiagSupportSegments[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); + } + + PaintUtilSetSegmentSupportHeight(session, SEGMENTS_ALL, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); +} + /** rct2: 0x008A67C0 */ static void LoopingRCTrackDiag25DegUp( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, @@ -9895,6 +9922,10 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionLoopingRC(int32_t trackType) case TrackElemType::Booster: return LoopingRCTrackBooster; + + case TrackElemType::DiagBrakes: + case TrackElemType::DiagBlockBrakes: + return LoopingRCTrackDiagBrakes; } return GetTrackPaintFunctionLimLaunchedRC(trackType); } diff --git a/src/openrct2/ride/coaster/MineTrainCoaster.cpp b/src/openrct2/ride/coaster/MineTrainCoaster.cpp index e40be7ec65..27bd728580 100644 --- a/src/openrct2/ride/coaster/MineTrainCoaster.cpp +++ b/src/openrct2/ride/coaster/MineTrainCoaster.cpp @@ -30,6 +30,27 @@ static constexpr uint32_t _MineTrainBlockBrakeImages[NumOrthogonalDirections][2] { MINE_TRAIN_BLOCK_BRAKE_NW_SE_OPEN, MINE_TRAIN_BLOCK_BRAKE_NW_SE_CLOSED }, }; +static constexpr const uint32_t MinetrainRCDiagBrakeImages[NumOrthogonalDirections] = { + SPR_G2_MINETRAIN_DIAG_BRAKES, + SPR_G2_MINETRAIN_DIAG_BRAKES + 1, + SPR_G2_MINETRAIN_DIAG_BRAKES, + SPR_G2_MINETRAIN_DIAG_BRAKES + 1, +}; + +static constexpr const uint32_t MinetrainRCDiagBlockBrakeImages[2][NumOrthogonalDirections] = { + { + SPR_G2_MINETRAIN_DIAG_BRAKES + 3, + SPR_G2_MINETRAIN_DIAG_BRAKES + 5, + SPR_G2_MINETRAIN_DIAG_BRAKES + 3, + SPR_G2_MINETRAIN_DIAG_BRAKES + 5, + }, + { + SPR_G2_MINETRAIN_DIAG_BRAKES + 2, + SPR_G2_MINETRAIN_DIAG_BRAKES + 4, + SPR_G2_MINETRAIN_DIAG_BRAKES + 2, + SPR_G2_MINETRAIN_DIAG_BRAKES + 4, + }, +}; /** rct2: 0x0071BFA4 */ static void MineTrainRCTrackFlat( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, @@ -5393,6 +5414,53 @@ static void MineTrainRCTrackDiagFlat( } } +static void MineTrainRCTrackDiagBrakes( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement) +{ + TrackPaintUtilDiagTilesPaint( + session, 1, height, direction, trackSequence, session.TrackColours[SCHEME_TRACK], MinetrainRCDiagBrakeImages, + defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr); + + if (trackSequence == 1) + { + int32_t woodenSupportSegments[] = { 8, 9, 10, 11 }; + WoodenASupportsPaintSetup(session, woodenSupportSegments[direction], 8, height, session.TrackColours[SCHEME_SUPPORTS]); + } + if (trackSequence == 2) + { + int32_t woodenSupportSegments[] = { 10, 11, 8, 9 }; + WoodenASupportsPaintSetup(session, woodenSupportSegments[direction], 8, height, session.TrackColours[SCHEME_SUPPORTS]); + } + + PaintUtilSetSegmentSupportHeight(session, SEGMENTS_ALL, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); +} + +static void MineTrainRCTrackDiagBlockBrakes( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement) +{ + TrackPaintUtilDiagTilesPaint( + session, 13, height, direction, trackSequence, session.TrackColours[SCHEME_TRACK], + MinetrainRCDiagBlockBrakeImages[trackElement.IsBrakeClosed()], defaultDiagTileOffsets, defaultDiagBoundLengths, + nullptr); + + if (trackSequence == 1) + { + int32_t woodenSupportSegments[] = { 8, 9, 10, 11 }; + WoodenASupportsPaintSetup(session, woodenSupportSegments[direction], 8, height, session.TrackColours[SCHEME_SUPPORTS]); + } + if (trackSequence == 2) + { + int32_t woodenSupportSegments[] = { 10, 11, 8, 9 }; + WoodenASupportsPaintSetup(session, woodenSupportSegments[direction], 8, height, session.TrackColours[SCHEME_SUPPORTS]); + } + + PaintUtilSetSegmentSupportHeight(session, SEGMENTS_ALL, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); +} + /** rct2: 0x0071C414 */ static void MineTrainRCTrackDiag25DegUp( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, @@ -7269,6 +7337,10 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionMineTrainRC(int32_t trackType) return MineTrainRCTrackDiagRightBank; case TrackElemType::BlockBrakes: return MineTrainRCTrackBlockBrakes; + case TrackElemType::DiagBrakes: + return MineTrainRCTrackDiagBrakes; + case TrackElemType::DiagBlockBrakes: + return MineTrainRCTrackDiagBlockBrakes; } return nullptr; } diff --git a/src/openrct2/ride/coaster/MultiDimensionRollerCoaster.cpp b/src/openrct2/ride/coaster/MultiDimensionRollerCoaster.cpp index aa239a9986..392a68ffff 100644 --- a/src/openrct2/ride/coaster/MultiDimensionRollerCoaster.cpp +++ b/src/openrct2/ride/coaster/MultiDimensionRollerCoaster.cpp @@ -33,6 +33,52 @@ static constexpr uint32_t MULTI_DIM_INVERTED_BLOCK_BRAKE_NW_SE_OPEN = 26552; static constexpr uint32_t MULTI_DIM_INVERTED_BLOCK_BRAKE_SW_NE_CLOSED = 26553; static constexpr uint32_t MULTI_DIM_INVERTED_BLOCK_BRAKE_NW_SE_CLOSED = 26554; +static constexpr const uint32_t MultidimDiagBrakeImages[2][NumOrthogonalDirections] = { + { + SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES, + SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES + 1, + SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES, + SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES + 1, + }, + { + SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES, + SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES + 1, + SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES, + SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES + 1, + }, +}; + +static constexpr const uint32_t MultidimDiagBlockBrakeImages[2][2][NumOrthogonalDirections] = { + { + { + SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES + 3, + SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES + 5, + SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES + 3, + SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES + 5, + }, + { + SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES + 2, + SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES + 4, + SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES + 2, + SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES + 4, + }, + }, + { + { + SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES + 2, + SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES + 4, + SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES + 2, + SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES + 4, + }, + { + SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES + 2, + SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES + 3, + SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES + 2, + SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES + 3, + }, + }, +}; + /** rct2: 0x00792D88 */ static void MultiDimensionRCTrackFlat( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, @@ -7038,6 +7084,86 @@ static void MultiDimensionRCTrackDiagFlat( } } +static void MultiDimensionRCTrackDiagBrakes( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement) +{ + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; + if (trackElement.IsInverted()) + { + TrackPaintUtilDiagTilesPaint( + session, -3, height + 24, direction, trackSequence, session.TrackColours[SCHEME_TRACK], MultidimDiagBrakeImages[1], + defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr); + + PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); + + if (trackSequence == 3) + { + MetalASupportsPaintSetup( + session, MetalSupportType::TubesInverted, DiagSupportSegments[direction], 0, height + 36, + session.TrackColours[SCHEME_SUPPORTS]); + } + } + else + { + TrackPaintUtilDiagTilesPaint( + session, 3, height, direction, trackSequence, session.TrackColours[SCHEME_TRACK], MultidimDiagBrakeImages[0], + defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr); + + if (trackSequence == 3) + { + MetalASupportsPaintSetup( + session, MetalSupportType::TubesInverted, DiagSupportSegments[direction], 0, height, + session.TrackColours[SCHEME_SUPPORTS]); + } + + PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); + } +} + +static void MultiDimensionRCTrackDiagBlockBrakes( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement) +{ + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; + if (trackElement.IsInverted()) + { + TrackPaintUtilDiagTilesPaint( + session, -3, height + 24, direction, trackSequence, session.TrackColours[SCHEME_TRACK], + MultidimDiagBlockBrakeImages[1][trackElement.IsBrakeClosed()], defaultDiagTileOffsets, defaultDiagBoundLengths, + nullptr); + + PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); + + if (trackSequence == 3) + { + MetalASupportsPaintSetup( + session, MetalSupportType::TubesInverted, DiagSupportSegments[direction], 0, height + 36, + session.TrackColours[SCHEME_SUPPORTS]); + } + } + else + { + TrackPaintUtilDiagTilesPaint( + session, 3, height, direction, trackSequence, session.TrackColours[SCHEME_TRACK], + MultidimDiagBlockBrakeImages[0][trackElement.IsBrakeClosed()], defaultDiagTileOffsets, defaultDiagBoundLengths, + nullptr); + + if (trackSequence == 3) + { + MetalASupportsPaintSetup( + session, MetalSupportType::TubesInverted, DiagSupportSegments[direction], 0, height, + session.TrackColours[SCHEME_SUPPORTS]); + } + + PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); + } +} + /** rct2: 0x00793158 */ static void MultiDimensionRCTrackDiag25DegUp( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, @@ -13294,6 +13420,11 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionMultiDimensionRC(int32_t trackType) return MultiDimensionRCTrackMultidimFlatTo90DegDownQuarterLoop; case TrackElemType::MultiDimInvertedUp90ToFlatQuarterLoop: return MultiDimensionRCTrackMultidimInverted90DegUpToFlatQuarterLoop; + + case TrackElemType::DiagBrakes: + return MultiDimensionRCTrackDiagBrakes; + case TrackElemType::DiagBlockBrakes: + return MultiDimensionRCTrackDiagBlockBrakes; } return nullptr; } diff --git a/src/openrct2/ride/coaster/StandUpRollerCoaster.cpp b/src/openrct2/ride/coaster/StandUpRollerCoaster.cpp index dc73abd592..02b8ab4440 100644 --- a/src/openrct2/ride/coaster/StandUpRollerCoaster.cpp +++ b/src/openrct2/ride/coaster/StandUpRollerCoaster.cpp @@ -30,6 +30,28 @@ static constexpr uint32_t _StandUpBlockBrakeImages[NumOrthogonalDirections][2] = { STAND_UP_BLOCK_BRAKE_NW_SE_OPEN, STAND_UP_BLOCK_BRAKE_NW_SE_CLOSED }, }; +static constexpr const uint32_t StandupRCDiagBrakeImages[NumOrthogonalDirections] = { + SPR_G2_STANDUP_DIAG_BRAKES, + SPR_G2_STANDUP_DIAG_BRAKES + 1, + SPR_G2_STANDUP_DIAG_BRAKES, + SPR_G2_STANDUP_DIAG_BRAKES + 1, +}; + +static constexpr const uint32_t StandupRCDiagBlockBrakeImages[2][NumOrthogonalDirections] = { + { + SPR_G2_STANDUP_DIAG_BRAKES + 3, + SPR_G2_STANDUP_DIAG_BRAKES + 5, + SPR_G2_STANDUP_DIAG_BRAKES + 3, + SPR_G2_STANDUP_DIAG_BRAKES + 5, + }, + { + SPR_G2_STANDUP_DIAG_BRAKES + 2, + SPR_G2_STANDUP_DIAG_BRAKES + 4, + SPR_G2_STANDUP_DIAG_BRAKES + 2, + SPR_G2_STANDUP_DIAG_BRAKES + 4, + }, +}; + /** rct2: 0x008A7114 */ static void StandUpRCTrackFlat( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, @@ -5906,6 +5928,44 @@ static void StandUpRCTrackDiagFlat( } } +static void StandUpRCTrackDiagBrakes( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement) +{ + TrackPaintUtilDiagTilesPaint( + session, 3, height, direction, trackSequence, session.TrackColours[SCHEME_TRACK], StandupRCDiagBrakeImages, + defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr); + + if (trackSequence == 3) + { + MetalASupportsPaintSetup( + session, MetalSupportType::Tubes, DiagSupportSegments[direction], 8, height, session.TrackColours[SCHEME_SUPPORTS]); + } + + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; + PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); +} + +static void StandUpRCTrackDiagBlockBrakes( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement) +{ + TrackPaintUtilDiagTilesPaint( + session, 3, height, direction, trackSequence, session.TrackColours[SCHEME_TRACK], + StandupRCDiagBlockBrakeImages[trackElement.IsBrakeClosed()], defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr); + + if (trackSequence == 3) + { + MetalASupportsPaintSetup( + session, MetalSupportType::Tubes, DiagSupportSegments[direction], 8, height, session.TrackColours[SCHEME_SUPPORTS]); + } + + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; + PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); +} + /** rct2: 0x008A7524 */ static void StandUpRCTrackDiag25DegUp( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, @@ -8978,6 +9038,10 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionStandUpRC(int32_t trackType) return StandUpRCTrackDiagRightBank; case TrackElemType::BlockBrakes: return StandUpRCTrackBlockBrakes; + case TrackElemType::DiagBrakes: + return StandUpRCTrackDiagBrakes; + case TrackElemType::DiagBlockBrakes: + return StandUpRCTrackDiagBlockBrakes; } return nullptr; } diff --git a/src/openrct2/ride/coaster/Steeplechase.cpp b/src/openrct2/ride/coaster/Steeplechase.cpp index fa7493a8b4..c843105db4 100644 --- a/src/openrct2/ride/coaster/Steeplechase.cpp +++ b/src/openrct2/ride/coaster/Steeplechase.cpp @@ -18,6 +18,13 @@ #include "../TrackData.h" #include "../TrackPaint.h" +static constexpr const uint32_t SteeplechaseRCDiagBrakeImages[NumOrthogonalDirections] = { + SPR_G2_STEEPLECHASE_DIAG_BRAKES, + SPR_G2_STEEPLECHASE_DIAG_BRAKES + 1, + SPR_G2_STEEPLECHASE_DIAG_BRAKES, + SPR_G2_STEEPLECHASE_DIAG_BRAKES + 1, +}; + /** rct2: 0x008A59A8 */ static void SteeplechaseTrackFlat( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, @@ -1491,6 +1498,25 @@ static void SteeplechaseTrackDiagFlat( } } +static void SteeplechaseTrackDiagBrakes( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement) +{ + TrackPaintUtilDiagTilesPaint( + session, 3, height, direction, trackSequence, session.TrackColours[SCHEME_TRACK], SteeplechaseRCDiagBrakeImages, + defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr); + + if (trackSequence == 3) + { + MetalASupportsPaintSetup( + session, MetalSupportType::Stick, DiagSupportSegments[direction], 0, height, session.TrackColours[SCHEME_SUPPORTS]); + } + + int32_t blockedSegments = DiagBlockedSegments[trackSequence]; + PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 32, 0x20); +} + /** rct2: 0x008A5B38 */ static void SteeplechaseTrackDiag25DegUp( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, @@ -2451,6 +2477,9 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionSteeplechase(int32_t trackType) return SteeplechaseTrackDiag25DegDownToFlat; case TrackElemType::BlockBrakes: return SteeplechaseTrackBlockBrakes; + case TrackElemType::DiagBrakes: + case TrackElemType::DiagBlockBrakes: + return SteeplechaseTrackDiagBrakes; } return nullptr; } diff --git a/src/openrct2/ride/coaster/meta/CompactInvertedCoaster.h b/src/openrct2/ride/coaster/meta/CompactInvertedCoaster.h index c473c94516..2892bbe119 100644 --- a/src/openrct2/ride/coaster/meta/CompactInvertedCoaster.h +++ b/src/openrct2/ride/coaster/meta/CompactInvertedCoaster.h @@ -19,7 +19,7 @@ constexpr RideTypeDescriptor CompactInvertedCoasterRTD = { SET_FIELD(AlternateType, RIDE_TYPE_NULL), SET_FIELD(Category, RIDE_CATEGORY_ROLLERCOASTER), - SET_FIELD(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_SLOPE_CURVE_STEEP, TRACK_S_BEND, TRACK_CURVE_SMALL, TRACK_CURVE, TRACK_CURVE_LARGE, TRACK_TWIST, TRACK_HALF_LOOP, TRACK_CORKSCREW, TRACK_HELIX_DOWN_BANKED_QUARTER, TRACK_HELIX_UP_BANKED_QUARTER, TRACK_BRAKES, TRACK_ON_RIDE_PHOTO, TRACK_SLOPE_VERTICAL, TRACK_BLOCK_BRAKES}), + SET_FIELD(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_SLOPE_CURVE_STEEP, TRACK_S_BEND, TRACK_CURVE_SMALL, TRACK_CURVE, TRACK_CURVE_LARGE, TRACK_TWIST, TRACK_HALF_LOOP, TRACK_CORKSCREW, TRACK_HELIX_DOWN_BANKED_QUARTER, TRACK_HELIX_UP_BANKED_QUARTER, TRACK_BRAKES, TRACK_ON_RIDE_PHOTO, TRACK_SLOPE_VERTICAL, TRACK_BLOCK_BRAKES, TRACK_DIAG_BRAKES, TRACK_DIAG_BLOCK_BRAKES}), SET_FIELD(ExtraTrackPieces, {}), SET_FIELD(CoveredTrackPieces, {}), SET_FIELD(StartTrackPiece, TrackElemType::EndStation), diff --git a/src/openrct2/ride/coaster/meta/CorkscrewRollerCoaster.h b/src/openrct2/ride/coaster/meta/CorkscrewRollerCoaster.h index 82b5afaddc..e7cbc3f423 100644 --- a/src/openrct2/ride/coaster/meta/CorkscrewRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/CorkscrewRollerCoaster.h @@ -19,7 +19,7 @@ constexpr RideTypeDescriptor CorkscrewRollerCoasterRTD = { SET_FIELD(AlternateType, RIDE_TYPE_NULL), SET_FIELD(Category, RIDE_CATEGORY_ROLLERCOASTER), - SET_FIELD(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_SLOPE_CURVE_STEEP, TRACK_S_BEND, TRACK_CURVE_SMALL, TRACK_CURVE, TRACK_CURVE_LARGE, TRACK_HALF_LOOP, TRACK_CORKSCREW, TRACK_HELIX_DOWN_BANKED_HALF, TRACK_HELIX_UP_BANKED_HALF, TRACK_BRAKES, TRACK_ON_RIDE_PHOTO, TRACK_BLOCK_BRAKES,TRACK_BOOSTER, TRACK_SLOPE_STEEP_LONG}), + SET_FIELD(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_SLOPE_CURVE_STEEP, TRACK_S_BEND, TRACK_CURVE_SMALL, TRACK_CURVE, TRACK_CURVE_LARGE, TRACK_HALF_LOOP, TRACK_CORKSCREW, TRACK_HELIX_DOWN_BANKED_HALF, TRACK_HELIX_UP_BANKED_HALF, TRACK_BRAKES, TRACK_ON_RIDE_PHOTO, TRACK_BLOCK_BRAKES,TRACK_BOOSTER, TRACK_SLOPE_STEEP_LONG, TRACK_DIAG_BRAKES, TRACK_DIAG_BLOCK_BRAKES}), SET_FIELD(ExtraTrackPieces, {TRACK_TWIST}), SET_FIELD(CoveredTrackPieces, {}), SET_FIELD(StartTrackPiece, TrackElemType::EndStation), diff --git a/src/openrct2/ride/coaster/meta/InvertedRollerCoaster.h b/src/openrct2/ride/coaster/meta/InvertedRollerCoaster.h index 77afe84790..87be14f563 100644 --- a/src/openrct2/ride/coaster/meta/InvertedRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/InvertedRollerCoaster.h @@ -19,7 +19,7 @@ constexpr RideTypeDescriptor InvertedRollerCoasterRTD = { SET_FIELD(AlternateType, RIDE_TYPE_NULL), SET_FIELD(Category, RIDE_CATEGORY_ROLLERCOASTER), - SET_FIELD(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_SLOPE_CURVE_STEEP, TRACK_S_BEND, TRACK_CURVE_SMALL, TRACK_CURVE, TRACK_CURVE_LARGE, TRACK_TWIST, TRACK_HALF_LOOP, TRACK_CORKSCREW, TRACK_HELIX_DOWN_BANKED_QUARTER, TRACK_HELIX_UP_BANKED_QUARTER, TRACK_BRAKES, TRACK_ON_RIDE_PHOTO, TRACK_HALF_LOOP_LARGE, TRACK_BLOCK_BRAKES, TRACK_SLOPE_ROLL_BANKING}), + SET_FIELD(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_SLOPE_CURVE_STEEP, TRACK_S_BEND, TRACK_CURVE_SMALL, TRACK_CURVE, TRACK_CURVE_LARGE, TRACK_TWIST, TRACK_HALF_LOOP, TRACK_CORKSCREW, TRACK_HELIX_DOWN_BANKED_QUARTER, TRACK_HELIX_UP_BANKED_QUARTER, TRACK_BRAKES, TRACK_ON_RIDE_PHOTO, TRACK_HALF_LOOP_LARGE, TRACK_BLOCK_BRAKES, TRACK_SLOPE_ROLL_BANKING, TRACK_DIAG_BRAKES, TRACK_DIAG_BLOCK_BRAKES}), SET_FIELD(ExtraTrackPieces, {TRACK_BOOSTER}), SET_FIELD(CoveredTrackPieces, {}), SET_FIELD(StartTrackPiece, TrackElemType::EndStation), diff --git a/src/openrct2/ride/coaster/meta/LIMLaunchedRollerCoaster.h b/src/openrct2/ride/coaster/meta/LIMLaunchedRollerCoaster.h index f15cee5bcd..1aa5e7bfa9 100644 --- a/src/openrct2/ride/coaster/meta/LIMLaunchedRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/LIMLaunchedRollerCoaster.h @@ -19,7 +19,7 @@ constexpr RideTypeDescriptor LIMLaunchedRollerCoasterRTD = { SET_FIELD(AlternateType, RIDE_TYPE_NULL), SET_FIELD(Category, RIDE_CATEGORY_ROLLERCOASTER), - SET_FIELD(EnabledTrackPieces, {TRACK_STRAIGHT, TRACK_STATION_END, TRACK_FLAT_ROLL_BANKING, TRACK_VERTICAL_LOOP, TRACK_SLOPE, TRACK_SLOPE_STEEP_UP, TRACK_SLOPE_STEEP_DOWN, TRACK_SLOPE_CURVE, TRACK_SLOPE_CURVE_STEEP, TRACK_S_BEND, TRACK_CURVE_SMALL, TRACK_CURVE, TRACK_CURVE_LARGE, TRACK_TWIST, TRACK_CORKSCREW, TRACK_HELIX_DOWN_BANKED_HALF, TRACK_HELIX_UP_BANKED_HALF, TRACK_BRAKES, TRACK_ON_RIDE_PHOTO, TRACK_SLOPE_VERTICAL, TRACK_BLOCK_BRAKES, TRACK_SLOPE_ROLL_BANKING, TRACK_CURVE_VERTICAL, TRACK_QUARTER_LOOP, TRACK_BARREL_ROLL, TRACK_SLOPE_CURVE_BANKED, TRACK_SLOPE_STEEP_LONG, TRACK_HALF_LOOP, TRACK_HALF_LOOP_MEDIUM, TRACK_HALF_LOOP_LARGE, TRACK_CORKSCREW_LARGE}), + SET_FIELD(EnabledTrackPieces, {TRACK_STRAIGHT, TRACK_STATION_END, TRACK_FLAT_ROLL_BANKING, TRACK_VERTICAL_LOOP, TRACK_SLOPE, TRACK_SLOPE_STEEP_UP, TRACK_SLOPE_STEEP_DOWN, TRACK_SLOPE_CURVE, TRACK_SLOPE_CURVE_STEEP, TRACK_S_BEND, TRACK_CURVE_SMALL, TRACK_CURVE, TRACK_CURVE_LARGE, TRACK_TWIST, TRACK_CORKSCREW, TRACK_HELIX_DOWN_BANKED_HALF, TRACK_HELIX_UP_BANKED_HALF, TRACK_BRAKES, TRACK_ON_RIDE_PHOTO, TRACK_SLOPE_VERTICAL, TRACK_BLOCK_BRAKES, TRACK_SLOPE_ROLL_BANKING, TRACK_CURVE_VERTICAL, TRACK_QUARTER_LOOP, TRACK_BARREL_ROLL, TRACK_SLOPE_CURVE_BANKED, TRACK_SLOPE_STEEP_LONG, TRACK_HALF_LOOP, TRACK_HALF_LOOP_MEDIUM, TRACK_HALF_LOOP_LARGE, TRACK_CORKSCREW_LARGE, TRACK_DIAG_BRAKES, TRACK_DIAG_BLOCK_BRAKES}), SET_FIELD(ExtraTrackPieces, {TRACK_SLOPE_LONG, TRACK_ZERO_G_ROLL, TRACK_ZERO_G_ROLL_LARGE}), SET_FIELD(CoveredTrackPieces, {}), SET_FIELD(StartTrackPiece, TrackElemType::EndStation), diff --git a/src/openrct2/ride/coaster/meta/LayDownRollerCoaster.h b/src/openrct2/ride/coaster/meta/LayDownRollerCoaster.h index 3d20dba063..0886ee76e0 100644 --- a/src/openrct2/ride/coaster/meta/LayDownRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/LayDownRollerCoaster.h @@ -19,7 +19,7 @@ constexpr RideTypeDescriptor LayDownRollerCoasterRTD = { SET_FIELD(AlternateType, RIDE_TYPE_LAY_DOWN_ROLLER_COASTER_ALT), SET_FIELD(Category, RIDE_CATEGORY_ROLLERCOASTER), - SET_FIELD(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_SLOPE_CURVE_STEEP, TRACK_S_BEND, TRACK_CURVE_SMALL, TRACK_CURVE, TRACK_CURVE_LARGE, TRACK_HELIX_DOWN_BANKED_HALF, TRACK_HELIX_UP_BANKED_HALF, TRACK_BRAKES, TRACK_ON_RIDE_PHOTO, TRACK_BLOCK_BRAKES, TRACK_INLINE_TWIST_UNINVERTED, TRACK_FLYING_HALF_LOOP_UNINVERTED_UP, TRACK_CORKSCREW_UNINVERTED, TRACK_SLOPE_STEEP_LONG}), + SET_FIELD(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_SLOPE_CURVE_STEEP, TRACK_S_BEND, TRACK_CURVE_SMALL, TRACK_CURVE, TRACK_CURVE_LARGE, TRACK_HELIX_DOWN_BANKED_HALF, TRACK_HELIX_UP_BANKED_HALF, TRACK_BRAKES, TRACK_ON_RIDE_PHOTO, TRACK_BLOCK_BRAKES, TRACK_INLINE_TWIST_UNINVERTED, TRACK_FLYING_HALF_LOOP_UNINVERTED_UP, TRACK_CORKSCREW_UNINVERTED, TRACK_SLOPE_STEEP_LONG, TRACK_DIAG_BRAKES, TRACK_DIAG_BLOCK_BRAKES}), SET_FIELD(ExtraTrackPieces, {TRACK_FLYING_HALF_LOOP_UNINVERTED_DOWN, TRACK_BOOSTER}), SET_FIELD(CoveredTrackPieces, {}), SET_FIELD(StartTrackPiece, TrackElemType::EndStation), diff --git a/src/openrct2/ride/coaster/meta/LoopingRollerCoaster.h b/src/openrct2/ride/coaster/meta/LoopingRollerCoaster.h index 0109d89716..2f6b1da328 100644 --- a/src/openrct2/ride/coaster/meta/LoopingRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/LoopingRollerCoaster.h @@ -19,7 +19,7 @@ constexpr RideTypeDescriptor LoopingRollerCoasterRTD = { SET_FIELD(AlternateType, RIDE_TYPE_NULL), SET_FIELD(Category, RIDE_CATEGORY_ROLLERCOASTER), - SET_FIELD(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_SLOPE_CURVE_STEEP, TRACK_S_BEND, TRACK_CURVE_SMALL, TRACK_CURVE, TRACK_CURVE_LARGE, TRACK_HELIX_DOWN_BANKED_HALF, TRACK_HELIX_UP_BANKED_HALF, TRACK_BRAKES, TRACK_ON_RIDE_PHOTO, TRACK_BLOCK_BRAKES, TRACK_SLOPE_ROLL_BANKING, TRACK_BOOSTER, TRACK_SLOPE_CURVE_BANKED, TRACK_SLOPE_STEEP_LONG}), + SET_FIELD(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_SLOPE_CURVE_STEEP, TRACK_S_BEND, TRACK_CURVE_SMALL, TRACK_CURVE, TRACK_CURVE_LARGE, TRACK_HELIX_DOWN_BANKED_HALF, TRACK_HELIX_UP_BANKED_HALF, TRACK_BRAKES, TRACK_ON_RIDE_PHOTO, TRACK_BLOCK_BRAKES, TRACK_SLOPE_ROLL_BANKING, TRACK_BOOSTER, TRACK_SLOPE_CURVE_BANKED, TRACK_SLOPE_STEEP_LONG, TRACK_DIAG_BRAKES, TRACK_DIAG_BLOCK_BRAKES}), SET_FIELD(ExtraTrackPieces, {TRACK_SLOPE_VERTICAL, TRACK_TWIST, TRACK_CORKSCREW, TRACK_CURVE_VERTICAL, TRACK_QUARTER_LOOP, TRACK_SLOPE_LONG, TRACK_BARREL_ROLL, TRACK_HALF_LOOP, TRACK_HALF_LOOP_MEDIUM, TRACK_HALF_LOOP_LARGE,TRACK_CORKSCREW_LARGE, TRACK_ZERO_G_ROLL, TRACK_ZERO_G_ROLL_LARGE}), SET_FIELD(CoveredTrackPieces, {}), SET_FIELD(StartTrackPiece, TrackElemType::EndStation), diff --git a/src/openrct2/ride/coaster/meta/MultiDimensionRollerCoaster.h b/src/openrct2/ride/coaster/meta/MultiDimensionRollerCoaster.h index d10375fd20..c91e623373 100644 --- a/src/openrct2/ride/coaster/meta/MultiDimensionRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/MultiDimensionRollerCoaster.h @@ -19,7 +19,7 @@ constexpr RideTypeDescriptor MultiDimensionRollerCoasterRTD = { SET_FIELD(AlternateType, RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER_ALT), SET_FIELD(Category, RIDE_CATEGORY_ROLLERCOASTER), - SET_FIELD(EnabledTrackPieces, { TRACK_STRAIGHT, TRACK_STATION_END, TRACK_LIFT_HILL, TRACK_FLAT_ROLL_BANKING, TRACK_SLOPE, TRACK_SLOPE_STEEP_UP, TRACK_SLOPE_STEEP_DOWN, TRACK_S_BEND, TRACK_CURVE_SMALL, TRACK_CURVE, TRACK_CURVE_LARGE, TRACK_HELIX_DOWN_BANKED_HALF, TRACK_HELIX_UP_BANKED_HALF, TRACK_BRAKES, TRACK_ON_RIDE_PHOTO, TRACK_SLOPE_VERTICAL, TRACK_BLOCK_BRAKES, TRACK_INLINE_TWIST_UNINVERTED,TRACK_QUARTER_LOOP_UNINVERTED_UP, TRACK_QUARTER_LOOP_UNINVERTED_DOWN}), + SET_FIELD(EnabledTrackPieces, { TRACK_STRAIGHT, TRACK_STATION_END, TRACK_LIFT_HILL, TRACK_FLAT_ROLL_BANKING, TRACK_SLOPE, TRACK_SLOPE_STEEP_UP, TRACK_SLOPE_STEEP_DOWN, TRACK_S_BEND, TRACK_CURVE_SMALL, TRACK_CURVE, TRACK_CURVE_LARGE, TRACK_HELIX_DOWN_BANKED_HALF, TRACK_HELIX_UP_BANKED_HALF, TRACK_BRAKES, TRACK_ON_RIDE_PHOTO, TRACK_SLOPE_VERTICAL, TRACK_BLOCK_BRAKES, TRACK_INLINE_TWIST_UNINVERTED,TRACK_QUARTER_LOOP_UNINVERTED_UP, TRACK_QUARTER_LOOP_UNINVERTED_DOWN, TRACK_DIAG_BRAKES, TRACK_DIAG_BLOCK_BRAKES}), SET_FIELD(ExtraTrackPieces, {}), SET_FIELD(CoveredTrackPieces, {}), SET_FIELD(StartTrackPiece, TrackElemType::EndStation), diff --git a/src/openrct2/ride/coaster/meta/StandUpRollerCoaster.h b/src/openrct2/ride/coaster/meta/StandUpRollerCoaster.h index 8a784bcf40..e37c117273 100644 --- a/src/openrct2/ride/coaster/meta/StandUpRollerCoaster.h +++ b/src/openrct2/ride/coaster/meta/StandUpRollerCoaster.h @@ -19,7 +19,7 @@ constexpr RideTypeDescriptor StandUpRollerCoasterRTD = { SET_FIELD(AlternateType, RIDE_TYPE_NULL), SET_FIELD(Category, RIDE_CATEGORY_ROLLERCOASTER), - SET_FIELD(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_HELIX_DOWN_BANKED_HALF, TRACK_HELIX_UP_BANKED_HALF, TRACK_BRAKES, TRACK_ON_RIDE_PHOTO, TRACK_BLOCK_BRAKES}), + SET_FIELD(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_HELIX_DOWN_BANKED_HALF, TRACK_HELIX_UP_BANKED_HALF, TRACK_BRAKES, TRACK_ON_RIDE_PHOTO, TRACK_BLOCK_BRAKES, TRACK_DIAG_BRAKES, TRACK_DIAG_BLOCK_BRAKES}), SET_FIELD(ExtraTrackPieces, {}), SET_FIELD(CoveredTrackPieces, {}), SET_FIELD(StartTrackPiece, TrackElemType::EndStation), diff --git a/src/openrct2/sprites.h b/src/openrct2/sprites.h index 3ffdff017b..f2d99083ad 100644 --- a/src/openrct2/sprites.h +++ b/src/openrct2/sprites.h @@ -1445,7 +1445,22 @@ enum SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL = SPR_G2_ALPINE_LIFT_TRACK_FLAT_DIAGONAL + 4, SPR_G2_ALPINE_END = SPR_G2_ALPINE_LIFT_TRACK_GENTLE_DIAGONAL + 12, - SPR_G2_END = SPR_G2_ALPINE_END, + SPR_G2_DIAG_BRAKES_START = SPR_G2_ALPINE_END, + + SPR_G2_JUNIOR_DIAG_BRAKES = SPR_G2_DIAG_BRAKES_START, + SPR_G2_CORKSCREW_DIAG_BRAKES = SPR_G2_JUNIOR_DIAG_BRAKES + 6, + SPR_G2_SLC_DIAG_BRAKES = SPR_G2_CORKSCREW_DIAG_BRAKES + 6, + SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES = SPR_G2_SLC_DIAG_BRAKES + 3, + SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES = SPR_G2_MULTIDIM_UPRIGHT_DIAG_BRAKES + 6, + SPR_G2_STEEPLECHASE_DIAG_BRAKES = SPR_G2_MULTIDIM_INVERTED_DIAG_BRAKES + 5, + SPR_G2_STANDUP_DIAG_BRAKES = SPR_G2_STEEPLECHASE_DIAG_BRAKES + 2, + SPR_G2_MINETRAIN_DIAG_BRAKES = SPR_G2_STANDUP_DIAG_BRAKES + 6, + SPR_G2_LOOPING_DIAG_BRAKES = SPR_G2_MINETRAIN_DIAG_BRAKES + 6, + SPR_G2_LIM_LAUNCHED_DIAG_BRAKES = SPR_G2_LOOPING_DIAG_BRAKES + 2, + SPR_G2_BM_INVERTED_DIAG_BRAKES = SPR_G2_LIM_LAUNCHED_DIAG_BRAKES + 6, + SPR_G2_DIAG_BRAKES_END = SPR_G2_BM_INVERTED_DIAG_BRAKES + 2, + + SPR_G2_END = SPR_G2_DIAG_BRAKES_END, SPR_CSG_BEGIN = SPR_G2_END, SPR_CSG_END = SPR_CSG_BEGIN + RCT1::Limits::Num_LL_CSG_Entries, diff --git a/src/openrct2/world/TileElement.h b/src/openrct2/world/TileElement.h index 40df792e67..10fcfe4025 100644 --- a/src/openrct2/world/TileElement.h +++ b/src/openrct2/world/TileElement.h @@ -425,6 +425,8 @@ public: bool IsStation() const; bool IsBlockStart() const; + + void SetBrakeClosed2(const CoordsXY& trackLocation, bool isClosed); }; assert_struct_size(TrackElement, 16);