From abaf8d2aefb6c4f336801fb74738e632017d349f Mon Sep 17 00:00:00 2001 From: Andrew <5436387+fidwell@users.noreply.github.com> Date: Wed, 19 Feb 2025 12:53:43 -0500 Subject: [PATCH] =?UTF-8?q?=EF=BB=BFAdd=20diagonal=20downward-inclined=20b?= =?UTF-8?q?rakes=20to=20hybrid=20and=20single=20rail=20coasters?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- distribution/changelog.txt | 1 + resources/g2/sprites.json | 40 +++++++ .../g2/track/raptor/brake_gentle_diag_1.png | Bin 0 -> 365 bytes .../g2/track/raptor/brake_gentle_diag_2.png | Bin 0 -> 233 bytes .../g2/track/raptor/brake_gentle_diag_3.png | Bin 0 -> 392 bytes .../g2/track/raptor/brake_gentle_diag_4.png | Bin 0 -> 210 bytes .../g2/track/rmc/brake_gentle_diag_1.png | Bin 0 -> 776 bytes .../g2/track/rmc/brake_gentle_diag_2.png | Bin 0 -> 654 bytes .../g2/track/rmc/brake_gentle_diag_3.png | Bin 0 -> 856 bytes .../g2/track/rmc/brake_gentle_diag_4.png | Bin 0 -> 831 bytes src/openrct2-ui/ride/Construction.cpp | 3 +- src/openrct2/SpriteIds.h | 4 +- src/openrct2/network/NetworkBase.cpp | 2 +- .../paint/track/coaster/HybridCoaster.cpp | 63 +++++++++++ .../track/coaster/SingleRailRollerCoaster.cpp | 101 ++++++++++++++++++ src/openrct2/park/ParkFile.h | 4 +- src/openrct2/ride/Ride.cpp | 2 +- src/openrct2/ride/Track.cpp | 1 + src/openrct2/ride/Track.h | 4 +- src/openrct2/ride/TrackData.cpp | 13 ++- src/openrct2/ride/VehicleSubpositionData.cpp | 1 + 21 files changed, 231 insertions(+), 8 deletions(-) create mode 100644 resources/g2/track/raptor/brake_gentle_diag_1.png create mode 100644 resources/g2/track/raptor/brake_gentle_diag_2.png create mode 100644 resources/g2/track/raptor/brake_gentle_diag_3.png create mode 100644 resources/g2/track/raptor/brake_gentle_diag_4.png create mode 100644 resources/g2/track/rmc/brake_gentle_diag_1.png create mode 100644 resources/g2/track/rmc/brake_gentle_diag_2.png create mode 100644 resources/g2/track/rmc/brake_gentle_diag_3.png create mode 100644 resources/g2/track/rmc/brake_gentle_diag_4.png diff --git a/distribution/changelog.txt b/distribution/changelog.txt index bb894624ef..7bea5156ea 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -1,5 +1,6 @@ 0.4.20 (in development) ------------------------------------------------------------------------ +- Feature: [#22905] Add diagonal downward-inclined brakes to hybrid coaster and single rail coaster. - Improved: [#23677] Building new ride track now inherits the colour scheme from the previous piece. - Fix: [#1972, #11679] Vehicles passing by toilets can cause them to glitch (original bug). - Fix: [#9999, #10000, #10001, #10002, #10003] Truncated scenario strings when using Catalan, Czech, Japanese, Polish or Russian. diff --git a/resources/g2/sprites.json b/resources/g2/sprites.json index d3c47c0317..b1c19203e7 100644 --- a/resources/g2/sprites.json +++ b/resources/g2/sprites.json @@ -39926,6 +39926,46 @@ "y": 15, "palette": "keep" }, + { + "path": "track/rmc/brake_gentle_diag_1.png", + "x": -54, + "y": -23 + }, + { + "path": "track/rmc/brake_gentle_diag_2.png", + "x": -24, + "y": -14 + }, + { + "path": "track/rmc/brake_gentle_diag_3.png", + "x": -34, + "y": -23 + }, + { + "path": "track/rmc/brake_gentle_diag_4.png", + "x": -24, + "y": -30 + }, + { + "path": "track/raptor/brake_gentle_diag_1.png", + "x": -32, + "y": -7 + }, + { + "path": "track/raptor/brake_gentle_diag_2.png", + "x": -3, + "y": -6 + }, + { + "path": "track/raptor/brake_gentle_diag_3.png", + "x": -32, + "y": -7 + }, + { + "path": "track/raptor/brake_gentle_diag_4.png", + "x": -3, + "y": -22 + }, { "path": "icons/rotate_view_anti-clockwise.png" } diff --git a/resources/g2/track/raptor/brake_gentle_diag_1.png b/resources/g2/track/raptor/brake_gentle_diag_1.png new file mode 100644 index 0000000000000000000000000000000000000000..770b4d57c0974eca43b31aedf6ce1eeb4bad88d2 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^4nQoNn{1`)dPG&T&LR`@AuZf?5}O^?JcgX{5)J)+1Oa$*?G0Ialg2KHMjj@`FNn( zWk$i9fD~^@kYDhBB*0+%La7ZX!CBxDSi|uJU#K|$)WlG8_UW(IC_lU#Js9x;9oXJSMT(v?i$lypB&SE-%MS= zK5LC$zmWx7#I)zLCLAnxm=+l#=QH`B`i6pU9^4McE_NF&n15P5yk_z9yyD7PVBm~;w!65z2&__L5j6NA24{j`njxgN@xNAsJ4re literal 0 HcmV?d00001 diff --git a/resources/g2/track/raptor/brake_gentle_diag_2.png b/resources/g2/track/raptor/brake_gentle_diag_2.png new file mode 100644 index 0000000000000000000000000000000000000000..fc333fdad1dceea10ec32ac7b3db5720ce2bdf98 GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol^!3-pW0`mQV6k~CayA#8@b22Z19F}xPUq=Rp zjs4tz5?O(KtpJ}8*XQBN|KsJwm6grCy_JoP^_`uaqoeJEgQJU!ldG#Q`)e}?GIBHa Yhdp9^yT{nd7icDfr>mdKI;Vst0K;TU{Qv*} literal 0 HcmV?d00001 diff --git a/resources/g2/track/raptor/brake_gentle_diag_3.png b/resources/g2/track/raptor/brake_gentle_diag_3.png new file mode 100644 index 0000000000000000000000000000000000000000..0a6b0d275f278ef7a2ef1ee4508dee0d9ef13571 GIT binary patch literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^4nQoNn{1`4FY^ZT>r<*KMz-4?QHzNUR_*S**iH|+1Oa$+1cFNd%w57eQI#q#k$O`@`g^njE=NswRge^kKmKsijvqDPaJx`%TMw;asH4>$bwf0a5>j3IS`8N<@UZmDx_F_uJJVqZ|}Y2UEtoV>b^`<3r= SYGr{QV(@hJb6Mw<&;$VFMUW@} literal 0 HcmV?d00001 diff --git a/resources/g2/track/raptor/brake_gentle_diag_4.png b/resources/g2/track/raptor/brake_gentle_diag_4.png new file mode 100644 index 0000000000000000000000000000000000000000..5c6a47981bcda28ef61f69e9c7588d5352c88bc9 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Q+n!3-qlE!cSnNHG=%xjQkeJ16rJ$YDu$^mSxl z*x1kgCy^D%mk#g=alP!X{Xbs*dAPE;va-Ijv$C;qzqtQm`S|VX`EIuF^?}Mb3p^r= z85sBufiR<}hF1en(81HiF+?MHZ?7RAg8~P$cGrjh;?XLzEH>O)xIL!G;W5KY=iMxB zyuPj4Q^hmg9xBaq)T*zNo?opr<5}M41D2mzLk=@{HaUNN0W^!j)78&qol`;+0Ad+G AWdHyG literal 0 HcmV?d00001 diff --git a/resources/g2/track/rmc/brake_gentle_diag_1.png b/resources/g2/track/rmc/brake_gentle_diag_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f809e312553410f63b32264cd6a204dcbc862b3a GIT binary patch literal 776 zcmeAS@N?(olHy`uVBq!ia0vp^5kPFk!3-ps%k#p46k~CayA#8@b22Z19F}xPUq=Rp zjs4tz5?O(KzW|>Q*M4#T+t&Tn-1dv*^D^TzOg8D<|>Mj}Jxu>nE$R zf9;7%-e)-H^~%duI`)pcB~!0n(Ecm=y<+EbXaDV%7MTvb3+Fs$J#=zO;m>(|TnoS4 z>L_}`>0dK@ikRGV|L0RISN#4YAKW0Xw)bu3w=bC?^B2uAUdd24tNgP$`&93Tho{_I zz9T3xq@}1#VxNy|iOljJhjRLUaG$OSE4XA|7u~4NlYVjM^2ZfC;tIm|x>RR<`(pB6 z|Kt(_LpRG$TQm=~hTRFMS{&n3ljHZ}jP_C%c9Cyec)WQ&znosB_2RM7e0j|&hdz`q zU9R=J#-a1+dRgBOQySB!FhBJ2pX%{IMD){Z_Cs6eofCc@z}Jv%yLTJYLK%kZRa#vd z%Q>el>M0V4dHK>datiZ#Q$J1raGi3D4t$%bd$ltoz2E09 zS~<1!`^nGa+y2r?=!eA&+5D7^TBPgGcKX2?k~Mo+PMAKo-8nX+k}h+Ms8N@($9 z?usMF*u$?cbGy84hpv@?gs({3p3e`tF5EC{3ELKu)Odvb(Omu$_d9NE)7&bydtc&$ zC2_wM{B>eerT2e&SQUGS8%tjY}a?H;h4x&9^k=<0$`jPC#ZJA9?v zE;S{}iZltH-~QmpUS{bQ{(IAvYFw7RJ5_atTfXn-@&|H{{Uv`K@b4*)Jor1G_1^K1 Z;>E1dNyR^R%K_t&!PC{xWt~$(6968r8A<>E literal 0 HcmV?d00001 diff --git a/resources/g2/track/rmc/brake_gentle_diag_3.png b/resources/g2/track/rmc/brake_gentle_diag_3.png new file mode 100644 index 0000000000000000000000000000000000000000..9aa2e7a7a53641c4e35a242a80887569e73f3436 GIT binary patch literal 856 zcmeAS@N?(olHy`uVBq!ia0vp^5kPFk!3-ps%k#p46k~CayA#8@b22Z19F}xPUq=Rp zjs4tz5?O)#r~sc3*W1?p{o?+M<>RZl?USpkS34UAXJ`MfSN|U`|2$lIzqkHnf9>h^ z#`eL%&F1>%-rmZ_#`@0A(Z$8$%F5f-^WR6Wc8-qDH`ez~PHvt)J-@j*ox#|iK^kbh z;N#sXKuWG8$S?RmKEUusLM9HVlC!`gvY3H^?+^$xifVW@FfcI1db&7DQbl~+L!6d{`+tK{6wfwfXZ&gFNxP?{Z(PQcXg6K?@1HYmtVLY<~)tb=Q^_g z(gyMU1$#9G#MgtkyYK!B`0%vMq2|W>^4q5~Mb61?pY9wpEj3VNnvL(Zr!q;;SM6G- zTRCs-Y0D$M*|*mjJ$<=rj`N+ZzM-Wm`TL%B&-@PNn=ik-()oPcx{`fb&jpe{Zfx4U zw@hxJ<2sXW%o@W}YlQ<0xJ&ld8UCh--1HQGBpLSXXaZA$NRKOSGc z{?(_9)0$mdi~U~TS-+3@(Ze#agp(JiBs(t;ljL46>M%!#Us9)V!)obS8Pca-vj}LX zJK9dPHu~)Se2?3LZqECa8PDSGO)<6CSJ+s4A|T4a;hx3u^IRT(=5jTEjA1RdoA=X^ z@yN{+TTexV)+#(d8S$~XX~mDvHT$02d2#3dUS+Lw?WyP9Kdte1Fn+f)>?FJH^J2^Y zdJ2Zqtty`1{r_;${F6V;89STTmxubq{CEBtZ`lFit;nQ?i8 zs{Cf1NyU0BDr!EKM<&iGR&4ljKK$L?T{S+*md~9S3=>Z$%RXloXA%?Mb;pPGGqd5s z6Uy?fjpg%FH03WvoZBg&k@QIIJeVbsbm-m%%f){W3MuKuYpNak^zmchnT=2VOKKda z+t1+QcHP%IBjVJ{!`{iQGj^QZoO|?$>$&Mo>PJ{k?i8`n-1bv{->3DR%U|lxEW5|F UJu~hfF!eEby85}Sb4q9e0GDBrNdN!< literal 0 HcmV?d00001 diff --git a/resources/g2/track/rmc/brake_gentle_diag_4.png b/resources/g2/track/rmc/brake_gentle_diag_4.png new file mode 100644 index 0000000000000000000000000000000000000000..b2d644b79763765ea9384567da1e4bf2f8eec024 GIT binary patch literal 831 zcmeAS@N?(olHy`uVBq!ia0vp^20-knA3GLl=7%#|ch)&BiFWjbrVmYg@}FG_;%LW(PzI1+hO|6Po+f zdTG;lb+P9j9Otr&lS=zord$8j)VTU{mA}NV#txMu64JIjQHK>0JKikf59GaQv%vGh zEfcrwy9*{YT)!miD`U{W@I|rprRRa?5(iBTJRClJ$+c*GFrodBmLdPqP_1W-@kb^Y z2>9f9-Z*tQttDK@{MI__)7>r$n71FR(x1D#kEJvsf8S}<>y``cWGr4vGV*yd-Ii2s za{0kD>$jlV>M73@icj58oD!bdA7JCK-)qPDhx^@bsEL$hI-9<-5)|9z(!Q1>HTF@b zF>fEsxlcBSvTx7cB~mlH>$}Q>2WH1CFI$Lv9C+RHVX61ta&-}l2@Q|$y?C&t&0vDS zoW;LS`j>RBn(W}zbNFLZ)t=Xr6e_<>(G8Ssuwse5biCVe`r<81`#aKBOww_jVf0Ds z>oJGv0h{$w&z`QkqPjIs^{jF4uBfF+avyG-_>x^&p?Jt?`Znb^FD}iuF7#&l)OB}Z zuUpsr-hhAhe{N0q@L);(lC|gm%gT9Iwv zZ){8ANPFwz@m*Ele9<-bnARh1+1KX12-mdKI;Vst E0KTSn@&Et; literal 0 HcmV?d00001 diff --git a/src/openrct2-ui/ride/Construction.cpp b/src/openrct2-ui/ride/Construction.cpp index 40bda7c494..61167826f0 100644 --- a/src/openrct2-ui/ride/Construction.cpp +++ b/src/openrct2-ui/ride/Construction.cpp @@ -36,6 +36,7 @@ namespace OpenRCT2 TrackElemType::Brakes, TrackElemType::DiagBrakes, TrackElemType::Down25Brakes, + TrackElemType::DiagDown25Brakes, TrackElemType::BlockBrakes, TrackElemType::DiagBlockBrakes, @@ -216,7 +217,7 @@ namespace OpenRCT2 }; // Update the magic number with the current number of track elements to silence - static_assert(EnumValue(TrackElemType::Count) == 349, "Reminder to add new track element to special dropdown list"); + static_assert(EnumValue(TrackElemType::Count) == 350, "Reminder to add new track element to special dropdown list"); /** * diff --git a/src/openrct2/SpriteIds.h b/src/openrct2/SpriteIds.h index 181fc300eb..9f6b770817 100644 --- a/src/openrct2/SpriteIds.h +++ b/src/openrct2/SpriteIds.h @@ -1702,7 +1702,9 @@ enum : ImageIndex SPR_G2_CORKSCREW_BOOSTER_NE_SW_2, SPR_G2_CORKSCREW_BOOSTER_NW_SE_2, SPR_G2_OPAQUE_WATER_OVERLAY, - SPR_G2_ICON_ROTATE_ANTI_CLOCKWISE = SPR_G2_OPAQUE_WATER_OVERLAY + 5, + SPR_G2_HYBRID_GENTLE_DIAG_BRAKE = SPR_G2_OPAQUE_WATER_OVERLAY + 5, + SPR_G2_SINGLE_RAIL_GENTLE_DIAG_BRAKE = SPR_G2_HYBRID_GENTLE_DIAG_BRAKE + 4, + SPR_G2_ICON_ROTATE_ANTI_CLOCKWISE = SPR_G2_SINGLE_RAIL_GENTLE_DIAG_BRAKE + 4, SPR_G2_END, diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index 0b2f685278..29f6035a3a 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -49,7 +49,7 @@ using namespace OpenRCT2; // It is used for making sure only compatible builds get connected, even within // single OpenRCT2 version. -constexpr uint8_t kNetworkStreamVersion = 1; +constexpr uint8_t kNetworkStreamVersion = 2; const std::string kNetworkStreamID = std::string(kOpenRCT2Version) + "-" + std::to_string(kNetworkStreamVersion); diff --git a/src/openrct2/paint/track/coaster/HybridCoaster.cpp b/src/openrct2/paint/track/coaster/HybridCoaster.cpp index 4f763a93fe..79c49c7117 100644 --- a/src/openrct2/paint/track/coaster/HybridCoaster.cpp +++ b/src/openrct2/paint/track/coaster/HybridCoaster.cpp @@ -14365,6 +14365,67 @@ namespace OpenRCT2::HybridRC PaintUtilSetGeneralSupportHeight(session, height + 56); } + static void TrackDiag25DegDownBrakes( + 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: + PaintAddImageAsParentRotated( + session, direction, GetTrackColour(session).WithIndex(SPR_G2_HYBRID_GENTLE_DIAG_BRAKE + 1), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, GetTrackColour(session).WithIndex(SPR_G2_HYBRID_GENTLE_DIAG_BRAKE + 2), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + WoodenBSupportsPaintSetupRotated( + session, supportType.wooden, WoodenSupportSubType::Corner0, direction, height + 16, session.SupportColours); + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, GetTrackColour(session).WithIndex(SPR_G2_HYBRID_GENTLE_DIAG_BRAKE), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + WoodenBSupportsPaintSetupRotated( + session, supportType.wooden, WoodenSupportSubType::Corner2, direction, height + 16, session.SupportColours); + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 3: + switch (direction) + { + case 1: + PaintAddImageAsParentRotated( + session, direction, GetTrackColour(session).WithIndex(SPR_G2_HYBRID_GENTLE_DIAG_BRAKE + 3), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + } + } + TrackPaintFunction GetTrackPaintFunction(OpenRCT2::TrackElemType trackType) { switch (trackType) @@ -14799,6 +14860,8 @@ namespace OpenRCT2::HybridRC return Trackbooster; case TrackElemType::Down25Brakes: return Track25DegDownBrakes; + case TrackElemType::DiagDown25Brakes: + return TrackDiag25DegDownBrakes; default: return TrackPaintFunctionDummy; diff --git a/src/openrct2/paint/track/coaster/SingleRailRollerCoaster.cpp b/src/openrct2/paint/track/coaster/SingleRailRollerCoaster.cpp index 3a86504b8b..3bfb8ad857 100644 --- a/src/openrct2/paint/track/coaster/SingleRailRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/SingleRailRollerCoaster.cpp @@ -19984,6 +19984,105 @@ namespace OpenRCT2::SingleRailRC session, ride, 5 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); } + static void TrackDiag25DegDownBrakes( + 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: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_SINGLE_RAIL_GENTLE_DIAG_BRAKE + 1)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_SINGLE_RAIL_GENTLE_DIAG_BRAKE + 2)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_SINGLE_RAIL_GENTLE_DIAG_BRAKE)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 8, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_SINGLE_RAIL_GENTLE_DIAG_BRAKE + 3)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 8, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 8, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 8, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + } + } + TrackPaintFunction GetTrackPaintFunction(OpenRCT2::TrackElemType trackType) { switch (trackType) @@ -20483,6 +20582,8 @@ namespace OpenRCT2::SingleRailRC return TrackRightEighthBankToOrthogonalDown25; case TrackElemType::Down25Brakes: return Track25DegDownBrakes; + case TrackElemType::DiagDown25Brakes: + return TrackDiag25DegDownBrakes; default: return TrackPaintFunctionDummy; } diff --git a/src/openrct2/park/ParkFile.h b/src/openrct2/park/ParkFile.h index 0d4fafcf72..9f793bc9a7 100644 --- a/src/openrct2/park/ParkFile.h +++ b/src/openrct2/park/ParkFile.h @@ -11,10 +11,10 @@ namespace OpenRCT2 struct GameState_t; // Current version that is saved. - constexpr uint32_t kParkFileCurrentVersion = 50; + constexpr uint32_t kParkFileCurrentVersion = 51; // The minimum version that is forwards compatible with the current version. - constexpr uint32_t kParkFileMinVersion = 50; + constexpr uint32_t kParkFileMinVersion = 51; // The minimum version that is backwards compatible with the current version. // If this is increased beyond 0, uncomment the checks in ParkFile.cpp and Context.cpp! diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index f57f113fae..35d6d95abf 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -4925,7 +4925,7 @@ OpenRCT2::BitSet RideEntryGetSupportedTrackPieces( {}, // TrackGroup::slopeCurveLargeBanked { SpriteGroupType::SlopeFlat, SpritePrecision::Sprites8 }, // TrackGroup::diagBrakes { SpriteGroupType::SlopeFlat, SpritePrecision::Sprites8 }, // TrackGroup::diagBlockBrakes - { SpriteGroupType::Slopes25, SpritePrecision::Sprites4 }, // TrackGroup::inclinedBrakes + { SpriteGroupType::Slopes25, SpritePrecision::Sprites8 }, // TrackGroup::inclinedBrakes { SpriteGroupType::SlopeFlat, SpritePrecision::Sprites8 }, // TrackGroup::diagBooster { SpriteGroupType::Slopes8, SpritePrecision::Sprites4, SpriteGroupType::Slopes16, SpritePrecision::Sprites4, SpriteGroupType::Slopes25, SpritePrecision::Sprites8, SpriteGroupType::Slopes42, SpritePrecision::Sprites8, diff --git a/src/openrct2/ride/Track.cpp b/src/openrct2/ride/Track.cpp index a985ab0b3a..2dfe620097 100644 --- a/src/openrct2/ride/Track.cpp +++ b/src/openrct2/ride/Track.cpp @@ -638,6 +638,7 @@ bool TrackTypeIsBrakes(OpenRCT2::TrackElemType trackType) case TrackElemType::Brakes: case TrackElemType::DiagBrakes: case TrackElemType::Down25Brakes: + case TrackElemType::DiagDown25Brakes: return true; default: return false; diff --git a/src/openrct2/ride/Track.h b/src/openrct2/ride/Track.h index 74c54313df..ea52f6cd7c 100644 --- a/src/openrct2/ride/Track.h +++ b/src/openrct2/ride/Track.h @@ -616,7 +616,9 @@ namespace OpenRCT2 LeftEighthDiveLoopDownToDiag = 347, RightEighthDiveLoopDownToDiag = 348, - Count = 349, + DiagDown25Brakes = 349, + + Count = 350, None = 65535, }; diff --git a/src/openrct2/ride/TrackData.cpp b/src/openrct2/ride/TrackData.cpp index 93f801be70..584bf9d3a6 100644 --- a/src/openrct2/ride/TrackData.cpp +++ b/src/openrct2/ride/TrackData.cpp @@ -378,6 +378,7 @@ namespace OpenRCT2::TrackMetaData { 4, 1, 0,152, -32, 96 }, // TrackElemType::RightEighthDiveLoopUpToOrthogonal { 0, 7,152, 0, -96, -32 }, // TrackElemType::LeftEighthDiveLoopDownToDiag { 0, 4,152, 0, -96, 32 }, // TrackElemType::RightEighthDiveLoopDownToDiag + { 4, 4, 16, 0, -32, 32 } // TrackElemType::DiagDown25Brakes }; static_assert(std::size(kTrackCoordinates) == EnumValue(TrackElemType::Count)); @@ -731,6 +732,7 @@ namespace OpenRCT2::TrackMetaData 165, // TrackElemType::RightEighthDiveLoopUpToOrthogonal 165, // TrackElemType::LeftEighthDiveLoopDownToDiag 165, // TrackElemType::RightEighthDiveLoopDownToDiag + 45, // TrackElemType::DiagDown25Brakes }; static_assert(std::size(kTrackPieceLengths) == EnumValue(TrackElemType::Count)); @@ -1086,6 +1088,7 @@ namespace OpenRCT2::TrackMetaData { TrackElemType::LeftEighthDiveLoopDownToDiag, TrackCurve::None }, // TrackElemType::RightEighthDiveLoopUpToOrthogonal { TrackCurve::None, TrackElemType::RightEighthDiveLoopUpToOrthogonal }, // TrackElemType::LeftEighthDiveLoopDownToDiag { TrackCurve::None, TrackElemType::LeftEighthDiveLoopUpToOrthogonal }, // TrackElemType::RightEighthDiveLoopDownToDiag + { TrackElemType::DiagDown25Brakes, TrackElemType::DiagDown25Brakes }, // TrackElemType::DiagDown25Brakes }; static_assert(std::size(kTrackCurveChain) == EnumValue(TrackElemType::Count)); @@ -1629,6 +1632,7 @@ namespace OpenRCT2::TrackMetaData TrackElemType::None, // TrackElemType::RightEighthDiveLoopUpToOrthogonal TrackElemType::None, // TrackElemType::LeftEighthDiveLoopDownToDiag TrackElemType::None, // TrackElemType::RightEighthDiveLoopDownToDiag + TrackElemType::None, // TrackElemType::DiagDown25Brakes }; static_assert(std::size(kAlternativeTrackTypes) == EnumValue(TrackElemType::Count)); @@ -1983,6 +1987,7 @@ namespace OpenRCT2::TrackMetaData 458752, // TrackElemType::RightEighthDiveLoopUpToOrthogonal 458752, // TrackElemType::LeftEighthDiveLoopDownToDiag 458752, // TrackElemType::RightEighthDiveLoopDownToDiag + 109824, // TrackElemType::DiagDown25Brakes }; static_assert(std::size(kTrackPricing) == EnumValue(TrackElemType::Count)); @@ -2337,6 +2342,7 @@ namespace OpenRCT2::TrackMetaData TrackElemType::LeftEighthDiveLoopUpToOrthogonal, // TrackElemType::RightEighthDiveLoopUpToOrthogonal TrackElemType::RightEighthDiveLoopDownToDiag, // TrackElemType::LeftEighthDiveLoopDownToDiag TrackElemType::LeftEighthDiveLoopDownToDiag, // TrackElemType::RightEighthDiveLoopDownToDiag + TrackElemType::DiagDown25Brakes, }; static_assert(std::size(kTrackElementMirrorMap) == EnumValue(TrackElemType::Count)); @@ -2691,6 +2697,7 @@ namespace OpenRCT2::TrackMetaData (1 << 0) | (1 << 5), // TrackElemType::RightEighthDiveLoopUpToOrthogonal (1 << 0) | (1 << 5), // TrackElemType::LeftEighthDiveLoopDownToDiag (1 << 0) | (1 << 5), // TrackElemType::RightEighthDiveLoopDownToDiag + (1 << 3), // TrackElemType::DiagDown25Brakes }; static_assert(std::size(kTrackHeightMarkerPositions) == EnumValue(TrackElemType::Count)); @@ -3048,6 +3055,7 @@ namespace OpenRCT2::TrackMetaData /* TrackElemType::RightEighthDiveLoopUpToOrthogonal */ TRACK_ELEM_FLAG_UP | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_NORMAL_TO_INVERSION | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, /* TrackElemType::LeftEighthDiveLoopDownToDiag */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, /* TrackElemType::RightEighthDiveLoopDownToDiag */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT | TRACK_ELEM_FLAG_INVERSION_TO_NORMAL, + /* TrackElemType::DiagDown25Brakes */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, }; static_assert(std::size(kTrackFlags) == EnumValue(TrackElemType::Count)); // clang-format on @@ -3406,6 +3414,7 @@ namespace OpenRCT2::TrackMetaData { TrackGroup::diveLoop, TrackPitch::None, TrackPitch::Up60, TrackRoll::UpsideDown, TrackRoll::None, 56 }, // TrackElemType::RightEighthDiveLoopUpToOrthogonal { TrackGroup::diveLoop, TrackPitch::Down60, TrackPitch::None, TrackRoll::None, TrackRoll::UpsideDown, -56 }, // TrackElemType::LeftEighthDiveLoopDownToDiag { TrackGroup::diveLoop, TrackPitch::Down60, TrackPitch::None, TrackRoll::None, TrackRoll::UpsideDown, -56 }, // TrackElemType::RightEighthDiveLoopDownToDiag + { TrackGroup::inclinedBrakes, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagDown25 }; static_assert(std::size(kTrackDefinitions) == EnumValue(TrackElemType::Count)); @@ -3470,7 +3479,7 @@ namespace OpenRCT2::TrackMetaData SpinFunction::R9, SpinFunction::L9, SpinFunction::R9, SpinFunction::L9, SpinFunction::R9, SpinFunction::L9, SpinFunction::R9, SpinFunction::None, SpinFunction::None, SpinFunction::None, SpinFunction::None, SpinFunction::None, SpinFunction::None, SpinFunction::None, SpinFunction::None, SpinFunction::L9, SpinFunction::R9, SpinFunction::L9, - SpinFunction::R9 + SpinFunction::R9, SpinFunction::None }; static_assert(std::size(kTrackTypeToSpinFunction) == EnumValue(TrackElemType::Count)); @@ -4832,6 +4841,7 @@ namespace OpenRCT2::TrackMetaData STR_DIVE_LOOP_RIGHT, // TrackElemType::RightEighthDiveLoopUpToOrthogonal STR_DIVE_LOOP_LEFT, // TrackElemType::LeftEighthDiveLoopDownToDiag STR_DIVE_LOOP_RIGHT, // TrackElemType::RightEighthDiveLoopDownToDiag + STR_BRAKES, // TrackElemType::DiagDown25Brakes }; static_assert(std::size(kRideConfigurationStringIds) == EnumValue(TrackElemType::Count)); @@ -13049,6 +13059,7 @@ namespace OpenRCT2::TrackMetaData { 6, { kRightEighthDiveLoopDownToDiagSeq0, kRightEighthDiveLoopDownToDiagSeq1, kRightEighthDiveLoopDownToDiagSeq2, kRightEighthDiveLoopDownToDiagSeq3, kRightEighthDiveLoopDownToDiagSeq4, kRightEighthDiveLoopDownToDiagSeq5 } }, + /* TrackElemType::DiagDown25Brakes */ { 4, { kDiagDown25Seq0, kDiagDown25Seq1, kDiagDown25Seq2, kDiagDown25Seq3 } } }; #pragma endregion diff --git a/src/openrct2/ride/VehicleSubpositionData.cpp b/src/openrct2/ride/VehicleSubpositionData.cpp index 79313ae97e..321991e7c9 100644 --- a/src/openrct2/ride/VehicleSubpositionData.cpp +++ b/src/openrct2/ride/VehicleSubpositionData.cpp @@ -31061,6 +31061,7 @@ static constexpr const VehicleInfoList *TrackVehicleInfoListDefault[] = { &TrackVehicleInfoRightEighthDiveLoopUpToOrthogonal0 , &TrackVehicleInfoRightEighthDiveLoopUpToOrthogonal1 , &TrackVehicleInfoRightEighthDiveLoopUpToOrthogonal2 , &TrackVehicleInfoRightEighthDiveLoopUpToOrthogonal3 , //TrackElemType::RightEighthDiveLoopUpToOrthogonal &TrackVehicleInfoLeftEighthDiveLoopDownToOrthogonal0 , &TrackVehicleInfoLeftEighthDiveLoopDownToOrthogonal1 , &TrackVehicleInfoLeftEighthDiveLoopDownToOrthogonal2 , &TrackVehicleInfoLeftEighthDiveLoopDownToOrthogonal3 , //TrackElemType::LeftEighthDiveLoopDownToOrthogonal &TrackVehicleInfoRightEighthDiveLoopDownToOrthogonal0, &TrackVehicleInfoRightEighthDiveLoopDownToOrthogonal1, &TrackVehicleInfoRightEighthDiveLoopDownToOrthogonal2, &TrackVehicleInfoRightEighthDiveLoopDownToOrthogonal3, //TrackElemType::RightEighthDiveLoopDownToOrthogonal + &TrackVehicleInfo_916BF6, &TrackVehicleInfo_916D18, &TrackVehicleInfo_916E3A, &TrackVehicleInfo_916F5C, // DiagDown25Brakes }; static_assert(std::size(TrackVehicleInfoListDefault) == VehicleTrackSubpositionSizeDefault);