From 273fa9a4795750ab3e91ee723d8dd56360cab45b Mon Sep 17 00:00:00 2001 From: mix Date: Fri, 15 Nov 2024 05:22:09 +0000 Subject: [PATCH] Implement Classic Wooden Twister diagonal bank --- .../ClassicWoodenTwisterRollerCoaster.cpp | 53 +++++++++++++++ .../track/coaster/WoodenRollerCoaster.hpp | 68 +++++++++++++++++++ 2 files changed, 121 insertions(+) diff --git a/src/openrct2/paint/track/coaster/ClassicWoodenTwisterRollerCoaster.cpp b/src/openrct2/paint/track/coaster/ClassicWoodenTwisterRollerCoaster.cpp index 752740fa93..4e79ec7c67 100644 --- a/src/openrct2/paint/track/coaster/ClassicWoodenTwisterRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/ClassicWoodenTwisterRollerCoaster.cpp @@ -260,6 +260,14 @@ enum SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_0_1 = SPR_CSG_BEGIN + 65979, SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_2 = SPR_CSG_BEGIN + 65980, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_0 = SPR_CSG_BEGIN + 66049, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_1 = SPR_CSG_BEGIN + 66050, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_2 = SPR_CSG_BEGIN + 66051, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_3 = SPR_CSG_BEGIN + 66052, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_FRONT_0 = SPR_CSG_BEGIN + 66053, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_FRONT_2 = SPR_CSG_BEGIN + 66054, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_0 = SPR_CSG_BEGIN + 66055, SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_1 = SPR_CSG_BEGIN + 66056, SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_2 = SPR_CSG_BEGIN + 66057, @@ -600,6 +608,14 @@ enum SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_0_1 = SPR_CSG_BEGIN + 66735, SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_2 = SPR_CSG_BEGIN + 66736, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_HANDRAIL_0 = SPR_CSG_BEGIN + 66805, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_HANDRAIL_1 = SPR_CSG_BEGIN + 66806, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_HANDRAIL_2 = SPR_CSG_BEGIN + 66807, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_HANDRAIL_3 = SPR_CSG_BEGIN + 66808, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_FRONT_HANDRAIL_0 = SPR_CSG_BEGIN + 66809, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_FRONT_HANDRAIL_2 = SPR_CSG_BEGIN + 66810, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_HANDRAIL_0 = SPR_CSG_BEGIN + 66811, SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_HANDRAIL_1 = SPR_CSG_BEGIN + 66812, SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_HANDRAIL_2 = SPR_CSG_BEGIN + 66813, @@ -1611,6 +1627,29 @@ static constexpr std::array kDiagU }, } }; +static constexpr std::array kDiagLeftBankImages = { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_HANDRAIL_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_FRONT_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_FRONT_HANDRAIL_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_HANDRAIL_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_HANDRAIL_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_FRONT_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_FRONT_HANDRAIL_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_HANDRAIL_3, + }, +} }; + static constexpr std::array kDiagUp25ToRightBankImages = { { { SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_0, @@ -2017,6 +2056,15 @@ static void ClassicWoodenTwisterRCTrackDiagRightBankToDown25( session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); } +static void ClassicWoodenTwisterRCTrackDiagRightBank( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = kMapReversedDiagonalStraight[trackSequence]; + return WoodenRCTrackDiagLeftBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); +} + static void ClassicWoodenTwisterRCTrackLeftEighthBankToOrthogonal( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) @@ -2140,6 +2188,11 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionClassicWoodenTwisterRC(OpenRCT2::Track case TrackElemType::DiagRightBankToDown25: return ClassicWoodenTwisterRCTrackDiagRightBankToDown25; + case TrackElemType::DiagLeftBank: + return WoodenRCTrackDiagLeftBank; + case TrackElemType::DiagRightBank: + return ClassicWoodenTwisterRCTrackDiagRightBank; + case TrackElemType::LeftEighthBankToDiag: return WoodenRCTrackLeftEighthBankToDiag; case TrackElemType::RightEighthBankToDiag: diff --git a/src/openrct2/paint/track/coaster/WoodenRollerCoaster.hpp b/src/openrct2/paint/track/coaster/WoodenRollerCoaster.hpp index 895d548bbb..f6fa9b2cd7 100644 --- a/src/openrct2/paint/track/coaster/WoodenRollerCoaster.hpp +++ b/src/openrct2/paint/track/coaster/WoodenRollerCoaster.hpp @@ -3156,6 +3156,74 @@ static void WoodenRCTrackDiagUp25ToBank( PaintUtilSetGeneralSupportHeight(session, height + 56); } +/** rct2: 0x008AC9D8 */ +template imageIds> +static void WoodenRCTrackDiagLeftBank( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[direction].track, imageIds[direction].handrail, { -16, -16, height }, + { { -16, -16, height }, { 32, 32, 2 } }); + break; + } + break; + case 1: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[direction].track, imageIds[direction].handrail, { -16, -16, height }, + { { -16, -16, height }, { 32, 32, 2 } }); + if (imageIds[direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[direction].frontTrack, imageIds[direction].frontHandrail, + { -16, -16, height }, { { -16, -16, height + 27 }, { 32, 32, 0 } }); + } + break; + } + break; + case 2: + switch (direction) + { + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[direction].track, imageIds[direction].handrail, { -16, -16, height }, + { { -16, -16, height }, { 32, 32, 2 } }); + if (imageIds[direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[direction].frontTrack, imageIds[direction].frontHandrail, + { -16, -16, height }, { { -16, -16, height + 27 }, { 32, 32, 0 } }); + } + break; + } + break; + case 3: + switch (direction) + { + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[direction].track, imageIds[direction].handrail, { -16, -16, height }, + { { -16, -16, height }, { 32, 32, 2 } }); + break; + } + break; + } + + DrawSupportForSequenceA( + session, supportType.wooden, trackSequence, direction, height, session.SupportColours); + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); +} + /** rct2: 0x008AC998 */ template, 4> imageIds> static void WoodenRCTrackLeftEighthBankToDiag(