1 /*****************************************************************************
2  * Copyright (c) 2014-2020 OpenRCT2 developers
3  *
4  * For a complete list of all authors, please refer to contributors.md
5  * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
6  *
7  * OpenRCT2 is licensed under the GNU General Public License version 3.
8  *****************************************************************************/
9 
10 #include "../../drawing/Drawing.h"
11 #include "../../interface/Viewport.h"
12 #include "../../paint/Paint.h"
13 #include "../../paint/Supports.h"
14 #include "../../paint/tile_element/Paint.TileElement.h"
15 #include "../../sprites.h"
16 #include "../../world/Map.h"
17 #include "../RideData.h"
18 #include "../TrackData.h"
19 #include "../TrackPaint.h"
20 
21 /** rct2: 0x008A59A8 */
steeplechase_track_flat(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)22 static void steeplechase_track_flat(
23     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
24     const TrackElement& trackElement)
25 {
26     if (trackElement.HasChain())
27     {
28         switch (direction)
29         {
30             case 0:
31             case 2:
32                 PaintAddImageAsParentRotated(
33                     session, direction, session->TrackColours[SCHEME_TRACK] | 28635, 0, 6, 32, 20, 3, height);
34                 metal_a_supports_paint_setup(
35                     session, METAL_SUPPORTS_STICK, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
36                 break;
37             case 1:
38             case 3:
39                 PaintAddImageAsParentRotated(
40                     session, direction, session->TrackColours[SCHEME_TRACK] | 28636, 0, 6, 32, 20, 3, height);
41                 metal_a_supports_paint_setup(
42                     session, METAL_SUPPORTS_STICK_ALT, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
43                 break;
44         }
45     }
46     else
47     {
48         switch (direction)
49         {
50             case 0:
51             case 2:
52                 PaintAddImageAsParentRotated(
53                     session, direction, session->TrackColours[SCHEME_TRACK] | 28633, 0, 6, 32, 20, 3, height);
54                 metal_a_supports_paint_setup(
55                     session, METAL_SUPPORTS_STICK, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
56                 break;
57             case 1:
58             case 3:
59                 PaintAddImageAsParentRotated(
60                     session, direction, session->TrackColours[SCHEME_TRACK] | 28634, 0, 6, 32, 20, 3, height);
61                 metal_a_supports_paint_setup(
62                     session, METAL_SUPPORTS_STICK_ALT, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
63                 break;
64         }
65     }
66     paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
67     paint_util_set_segment_support_height(
68         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
69     paint_util_set_general_support_height(session, height + 32, 0x20);
70 }
71 
steeplechase_track_station(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)72 static void steeplechase_track_station(
73     paint_session* session, const Ride* ride, [[maybe_unused]] uint8_t trackSequence, uint8_t direction, int32_t height,
74     const TrackElement& trackElement)
75 {
76     static constexpr const uint32_t imageIds[4][3] = {
77         { 28635, SPR_STATION_BASE_B_SW_NE },
78         { 28636, SPR_STATION_BASE_B_NW_SE },
79         { 28635, SPR_STATION_BASE_B_SW_NE },
80         { 28636, SPR_STATION_BASE_B_NW_SE },
81     };
82 
83     PaintAddImageAsParentRotated(
84         session, direction, imageIds[direction][1] | session->TrackColours[SCHEME_MISC], 0, 0, 32, 28, 3, height - 2, 0, 2,
85         height);
86     PaintAddImageAsChildRotated(
87         session, direction, imageIds[direction][0] | session->TrackColours[SCHEME_TRACK], 0, 6, 32, 20, 3, height, 0, 0,
88         height);
89     track_paint_util_draw_station_metal_supports_2(session, direction, height, session->TrackColours[SCHEME_SUPPORTS], 3);
90     track_paint_util_draw_station(session, ride, direction, height, trackElement);
91     paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_SQUARE_FLAT);
92     paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
93     paint_util_set_general_support_height(session, height + 32, 0x20);
94 }
95 
96 /** rct2: 0x008A59B8 */
steeplechase_track_25_deg_up(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)97 static void steeplechase_track_25_deg_up(
98     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
99     const TrackElement& trackElement)
100 {
101     if (trackElement.HasChain())
102     {
103         switch (direction)
104         {
105             case 0:
106                 PaintAddImageAsParentRotated(
107                     session, direction, session->TrackColours[SCHEME_TRACK] | 28649, 0, 6, 32, 20, 3, height);
108                 metal_a_supports_paint_setup(
109                     session, METAL_SUPPORTS_STICK, 4, 8, height, session->TrackColours[SCHEME_SUPPORTS]);
110                 break;
111             case 1:
112                 PaintAddImageAsParentRotated(
113                     session, direction, session->TrackColours[SCHEME_TRACK] | 28655, 0, 6, 32, 20, 3, height);
114                 metal_a_supports_paint_setup(
115                     session, METAL_SUPPORTS_STICK_ALT, 4, 8, height, session->TrackColours[SCHEME_SUPPORTS]);
116                 break;
117             case 2:
118                 PaintAddImageAsParentRotated(
119                     session, direction, session->TrackColours[SCHEME_TRACK] | 28651, 0, 6, 32, 20, 3, height);
120                 metal_a_supports_paint_setup(
121                     session, METAL_SUPPORTS_STICK, 4, 8, height, session->TrackColours[SCHEME_SUPPORTS]);
122                 break;
123             case 3:
124                 PaintAddImageAsParentRotated(
125                     session, direction, session->TrackColours[SCHEME_TRACK] | 28656, 0, 6, 32, 20, 3, height);
126                 metal_a_supports_paint_setup(
127                     session, METAL_SUPPORTS_STICK_ALT, 4, 8, height, session->TrackColours[SCHEME_SUPPORTS]);
128                 break;
129         }
130     }
131     else
132     {
133         switch (direction)
134         {
135             case 0:
136                 PaintAddImageAsParentRotated(
137                     session, direction, session->TrackColours[SCHEME_TRACK] | 28637, 0, 6, 32, 20, 3, height);
138                 metal_a_supports_paint_setup(
139                     session, METAL_SUPPORTS_STICK, 4, 8, height, session->TrackColours[SCHEME_SUPPORTS]);
140                 break;
141             case 1:
142                 PaintAddImageAsParentRotated(
143                     session, direction, session->TrackColours[SCHEME_TRACK] | 28643, 0, 6, 32, 20, 3, height);
144                 metal_a_supports_paint_setup(
145                     session, METAL_SUPPORTS_STICK_ALT, 4, 8, height, session->TrackColours[SCHEME_SUPPORTS]);
146                 break;
147             case 2:
148                 PaintAddImageAsParentRotated(
149                     session, direction, session->TrackColours[SCHEME_TRACK] | 28639, 0, 6, 32, 20, 3, height);
150                 metal_a_supports_paint_setup(
151                     session, METAL_SUPPORTS_STICK, 4, 8, height, session->TrackColours[SCHEME_SUPPORTS]);
152                 break;
153             case 3:
154                 PaintAddImageAsParentRotated(
155                     session, direction, session->TrackColours[SCHEME_TRACK] | 28644, 0, 6, 32, 20, 3, height);
156                 metal_a_supports_paint_setup(
157                     session, METAL_SUPPORTS_STICK_ALT, 4, 8, height, session->TrackColours[SCHEME_SUPPORTS]);
158                 break;
159         }
160     }
161     if (direction == 0 || direction == 3)
162     {
163         paint_util_push_tunnel_rotated(session, direction, height - 8, TUNNEL_1);
164     }
165     else
166     {
167         paint_util_push_tunnel_rotated(session, direction, height + 8, TUNNEL_2);
168     }
169     paint_util_set_segment_support_height(
170         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
171     paint_util_set_general_support_height(session, height + 56, 0x20);
172 }
173 
174 /** rct2: 0x008A59C8 */
steeplechase_track_flat_to_25_deg_up(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)175 static void steeplechase_track_flat_to_25_deg_up(
176     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
177     const TrackElement& trackElement)
178 {
179     if (trackElement.HasChain())
180     {
181         switch (direction)
182         {
183             case 0:
184                 PaintAddImageAsParentRotated(
185                     session, direction, session->TrackColours[SCHEME_TRACK] | 28650, 0, 6, 32, 20, 3, height);
186                 metal_a_supports_paint_setup(
187                     session, METAL_SUPPORTS_STICK, 4, 3, height, session->TrackColours[SCHEME_SUPPORTS]);
188                 break;
189             case 1:
190                 PaintAddImageAsParentRotated(
191                     session, direction, session->TrackColours[SCHEME_TRACK] | 28657, 0, 6, 32, 20, 3, height);
192                 metal_a_supports_paint_setup(
193                     session, METAL_SUPPORTS_STICK_ALT, 4, 2, height, session->TrackColours[SCHEME_SUPPORTS]);
194                 break;
195             case 2:
196                 PaintAddImageAsParentRotated(
197                     session, direction, session->TrackColours[SCHEME_TRACK] | 28652, 0, 6, 32, 20, 3, height);
198                 metal_a_supports_paint_setup(
199                     session, METAL_SUPPORTS_STICK, 4, 2, height, session->TrackColours[SCHEME_SUPPORTS]);
200                 break;
201             case 3:
202                 PaintAddImageAsParentRotated(
203                     session, direction, session->TrackColours[SCHEME_TRACK] | 28658, 0, 6, 32, 20, 3, height);
204                 metal_a_supports_paint_setup(
205                     session, METAL_SUPPORTS_STICK_ALT, 4, 2, height, session->TrackColours[SCHEME_SUPPORTS]);
206                 break;
207         }
208     }
209     else
210     {
211         switch (direction)
212         {
213             case 0:
214                 PaintAddImageAsParentRotated(
215                     session, direction, session->TrackColours[SCHEME_TRACK] | 28638, 0, 6, 32, 20, 3, height);
216                 metal_a_supports_paint_setup(
217                     session, METAL_SUPPORTS_STICK, 4, 3, height, session->TrackColours[SCHEME_SUPPORTS]);
218                 break;
219             case 1:
220                 PaintAddImageAsParentRotated(
221                     session, direction, session->TrackColours[SCHEME_TRACK] | 28645, 0, 6, 32, 20, 3, height);
222                 metal_a_supports_paint_setup(
223                     session, METAL_SUPPORTS_STICK_ALT, 4, 2, height, session->TrackColours[SCHEME_SUPPORTS]);
224                 break;
225             case 2:
226                 PaintAddImageAsParentRotated(
227                     session, direction, session->TrackColours[SCHEME_TRACK] | 28640, 0, 6, 32, 20, 3, height);
228                 metal_a_supports_paint_setup(
229                     session, METAL_SUPPORTS_STICK, 4, 2, height, session->TrackColours[SCHEME_SUPPORTS]);
230                 break;
231             case 3:
232                 PaintAddImageAsParentRotated(
233                     session, direction, session->TrackColours[SCHEME_TRACK] | 28646, 0, 6, 32, 20, 3, height);
234                 metal_a_supports_paint_setup(
235                     session, METAL_SUPPORTS_STICK_ALT, 4, 2, height, session->TrackColours[SCHEME_SUPPORTS]);
236                 break;
237         }
238     }
239     if (direction == 0 || direction == 3)
240     {
241         paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
242     }
243     else
244     {
245         paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_2);
246     }
247     paint_util_set_segment_support_height(
248         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
249     paint_util_set_general_support_height(session, height + 48, 0x20);
250 }
251 
252 /** rct2: 0x008A59D8 */
steeplechase_track_25_deg_up_to_flat(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)253 static void steeplechase_track_25_deg_up_to_flat(
254     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
255     const TrackElement& trackElement)
256 {
257     if (trackElement.HasChain())
258     {
259         switch (direction)
260         {
261             case 0:
262                 PaintAddImageAsParentRotated(
263                     session, direction, session->TrackColours[SCHEME_TRACK] | 28654, 0, 6, 32, 20, 3, height);
264                 metal_a_supports_paint_setup(
265                     session, METAL_SUPPORTS_STICK, 4, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
266                 break;
267             case 1:
268                 PaintAddImageAsParentRotated(
269                     session, direction, session->TrackColours[SCHEME_TRACK] | 28660, 0, 6, 32, 20, 3, height);
270                 metal_a_supports_paint_setup(
271                     session, METAL_SUPPORTS_STICK_ALT, 4, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
272                 break;
273             case 2:
274                 PaintAddImageAsParentRotated(
275                     session, direction, session->TrackColours[SCHEME_TRACK] | 28653, 0, 6, 32, 20, 3, height);
276                 metal_a_supports_paint_setup(
277                     session, METAL_SUPPORTS_STICK, 4, 5, height, session->TrackColours[SCHEME_SUPPORTS]);
278                 break;
279             case 3:
280                 PaintAddImageAsParentRotated(
281                     session, direction, session->TrackColours[SCHEME_TRACK] | 28659, 0, 6, 32, 20, 3, height);
282                 metal_a_supports_paint_setup(
283                     session, METAL_SUPPORTS_STICK_ALT, 4, 5, height, session->TrackColours[SCHEME_SUPPORTS]);
284                 break;
285         }
286     }
287     else
288     {
289         switch (direction)
290         {
291             case 0:
292                 PaintAddImageAsParentRotated(
293                     session, direction, session->TrackColours[SCHEME_TRACK] | 28642, 0, 6, 32, 20, 3, height);
294                 metal_a_supports_paint_setup(
295                     session, METAL_SUPPORTS_STICK, 4, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
296                 break;
297             case 1:
298                 PaintAddImageAsParentRotated(
299                     session, direction, session->TrackColours[SCHEME_TRACK] | 28648, 0, 6, 32, 20, 3, height);
300                 metal_a_supports_paint_setup(
301                     session, METAL_SUPPORTS_STICK_ALT, 4, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
302                 break;
303             case 2:
304                 PaintAddImageAsParentRotated(
305                     session, direction, session->TrackColours[SCHEME_TRACK] | 28641, 0, 6, 32, 20, 3, height);
306                 metal_a_supports_paint_setup(
307                     session, METAL_SUPPORTS_STICK, 4, 5, height, session->TrackColours[SCHEME_SUPPORTS]);
308                 break;
309             case 3:
310                 PaintAddImageAsParentRotated(
311                     session, direction, session->TrackColours[SCHEME_TRACK] | 28647, 0, 6, 32, 20, 3, height);
312                 metal_a_supports_paint_setup(
313                     session, METAL_SUPPORTS_STICK_ALT, 4, 5, height, session->TrackColours[SCHEME_SUPPORTS]);
314                 break;
315         }
316     }
317     if (direction == 0 || direction == 3)
318     {
319         paint_util_push_tunnel_rotated(session, direction, height - 8, TUNNEL_0);
320     }
321     else
322     {
323         paint_util_push_tunnel_rotated(session, direction, height + 8, TUNNEL_12);
324     }
325     paint_util_set_segment_support_height(
326         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
327     paint_util_set_general_support_height(session, height + 40, 0x20);
328 }
329 
330 /** rct2: 0x008A59E8 */
steeplechase_track_25_deg_down(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)331 static void steeplechase_track_25_deg_down(
332     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
333     const TrackElement& trackElement)
334 {
335     steeplechase_track_25_deg_up(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
336 }
337 
338 /** rct2: 0x008A59F8 */
steeplechase_track_flat_to_25_deg_down(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)339 static void steeplechase_track_flat_to_25_deg_down(
340     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
341     const TrackElement& trackElement)
342 {
343     steeplechase_track_25_deg_up_to_flat(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
344 }
345 
346 /** rct2: 0x008A5A08 */
steeplechase_track_25_deg_down_to_flat(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)347 static void steeplechase_track_25_deg_down_to_flat(
348     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
349     const TrackElement& trackElement)
350 {
351     steeplechase_track_flat_to_25_deg_up(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
352 }
353 
354 /** rct2: 0x008A5A18 */
steeplechase_track_left_quarter_turn_5(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)355 static void steeplechase_track_left_quarter_turn_5(
356     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
357     const TrackElement& trackElement)
358 {
359     switch (trackSequence)
360     {
361         case 0:
362             switch (direction)
363             {
364                 case 0:
365                     PaintAddImageAsParentRotated(
366                         session, direction, session->TrackColours[SCHEME_TRACK] | 28698, 0, 6, 32, 20, 3, height);
367                     metal_a_supports_paint_setup(
368                         session, METAL_SUPPORTS_STICK, 4, 1, height, session->TrackColours[SCHEME_SUPPORTS]);
369                     break;
370                 case 1:
371                     PaintAddImageAsParentRotated(
372                         session, direction, session->TrackColours[SCHEME_TRACK] | 28703, 0, 6, 32, 20, 3, height);
373                     metal_a_supports_paint_setup(
374                         session, METAL_SUPPORTS_STICK_ALT, 4, 1, height, session->TrackColours[SCHEME_SUPPORTS]);
375                     break;
376                 case 2:
377                     PaintAddImageAsParentRotated(
378                         session, direction, session->TrackColours[SCHEME_TRACK] | 28708, 0, 6, 32, 20, 3, height);
379                     metal_a_supports_paint_setup(
380                         session, METAL_SUPPORTS_STICK, 4, 0, height - 3, session->TrackColours[SCHEME_SUPPORTS]);
381                     break;
382                 case 3:
383                     PaintAddImageAsParentRotated(
384                         session, direction, session->TrackColours[SCHEME_TRACK] | 28693, 0, 6, 32, 20, 3, height);
385                     metal_a_supports_paint_setup(
386                         session, METAL_SUPPORTS_STICK_ALT, 4, 0, height - 1, session->TrackColours[SCHEME_SUPPORTS]);
387                     break;
388             }
389             if (direction == 0 || direction == 3)
390             {
391                 paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
392             }
393             paint_util_set_segment_support_height(
394                 session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
395             paint_util_set_general_support_height(session, height + 32, 0x20);
396             break;
397         case 1:
398             paint_util_set_general_support_height(session, height + 32, 0x20);
399             break;
400         case 2:
401             switch (direction)
402             {
403                 case 0:
404                     PaintAddImageAsParentRotated(
405                         session, direction, session->TrackColours[SCHEME_TRACK] | 28697, 0, 0, 32, 16, 3, height);
406                     break;
407                 case 1:
408                     PaintAddImageAsParentRotated(
409                         session, direction, session->TrackColours[SCHEME_TRACK] | 28702, 0, 0, 32, 16, 3, height);
410                     break;
411                 case 2:
412                     PaintAddImageAsParentRotated(
413                         session, direction, session->TrackColours[SCHEME_TRACK] | 28707, 0, 16, 32, 16, 3, height);
414                     break;
415                 case 3:
416                     PaintAddImageAsParentRotated(
417                         session, direction, session->TrackColours[SCHEME_TRACK] | 28692, 0, 16, 32, 16, 3, height);
418                     break;
419             }
420             paint_util_set_segment_support_height(
421                 session,
422                 paint_util_rotate_segments(
423                     SEGMENT_B4 | SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0, direction),
424                 0xFFFF, 0);
425             paint_util_set_general_support_height(session, height + 32, 0x20);
426             break;
427         case 3:
428             switch (direction)
429             {
430                 case 0:
431                     PaintAddImageAsParentRotated(
432                         session, direction, session->TrackColours[SCHEME_TRACK] | 28696, 0, 16, 16, 16, 3, height);
433                     break;
434                 case 1:
435                     PaintAddImageAsParentRotated(
436                         session, direction, session->TrackColours[SCHEME_TRACK] | 28701, 16, 16, 16, 16, 3, height);
437                     break;
438                 case 2:
439                     PaintAddImageAsParentRotated(
440                         session, direction, session->TrackColours[SCHEME_TRACK] | 28706, 16, 0, 16, 16, 3, height);
441                     break;
442                 case 3:
443                     PaintAddImageAsParentRotated(
444                         session, direction, session->TrackColours[SCHEME_TRACK] | 28691, 0, 0, 16, 16, 3, height);
445                     break;
446             }
447             paint_util_set_segment_support_height(
448                 session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF, 0);
449             paint_util_set_general_support_height(session, height + 32, 0x20);
450             break;
451         case 4:
452             paint_util_set_general_support_height(session, height + 32, 0x20);
453             break;
454         case 5:
455             switch (direction)
456             {
457                 case 0:
458                     PaintAddImageAsParentRotated(
459                         session, direction, session->TrackColours[SCHEME_TRACK] | 28695, 16, 0, 16, 32, 3, height);
460                     break;
461                 case 1:
462                     PaintAddImageAsParentRotated(
463                         session, direction, session->TrackColours[SCHEME_TRACK] | 28700, 0, 0, 16, 32, 3, height);
464                     break;
465                 case 2:
466                     PaintAddImageAsParentRotated(
467                         session, direction, session->TrackColours[SCHEME_TRACK] | 28705, 0, 0, 16, 32, 3, height);
468                     break;
469                 case 3:
470                     PaintAddImageAsParentRotated(
471                         session, direction, session->TrackColours[SCHEME_TRACK] | 28690, 16, 0, 16, 32, 3, height);
472                     break;
473             }
474             paint_util_set_segment_support_height(
475                 session,
476                 paint_util_rotate_segments(
477                     SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0 | SEGMENT_D4, direction),
478                 0xFFFF, 0);
479             paint_util_set_general_support_height(session, height + 32, 0x20);
480             break;
481         case 6:
482             switch (direction)
483             {
484                 case 0:
485                     PaintAddImageAsParentRotated(
486                         session, direction, session->TrackColours[SCHEME_TRACK] | 28694, 6, 0, 20, 32, 3, height);
487                     metal_a_supports_paint_setup(
488                         session, METAL_SUPPORTS_STICK_ALT, 4, 0, height - 3, session->TrackColours[SCHEME_SUPPORTS]);
489                     break;
490                 case 1:
491                     PaintAddImageAsParentRotated(
492                         session, direction, session->TrackColours[SCHEME_TRACK] | 28699, 6, 0, 20, 32, 3, height);
493                     metal_a_supports_paint_setup(
494                         session, METAL_SUPPORTS_STICK, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
495                     break;
496                 case 2:
497                     PaintAddImageAsParentRotated(
498                         session, direction, session->TrackColours[SCHEME_TRACK] | 28704, 6, 0, 20, 32, 3, height);
499                     metal_a_supports_paint_setup(
500                         session, METAL_SUPPORTS_STICK_ALT, 4, 1, height, session->TrackColours[SCHEME_SUPPORTS]);
501                     break;
502                 case 3:
503                     PaintAddImageAsParentRotated(
504                         session, direction, session->TrackColours[SCHEME_TRACK] | 28689, 6, 0, 20, 32, 3, height);
505                     metal_a_supports_paint_setup(
506                         session, METAL_SUPPORTS_STICK, 4, 0, height - 2, session->TrackColours[SCHEME_SUPPORTS]);
507                     break;
508             }
509             switch (direction)
510             {
511                 case 2:
512                     paint_util_push_tunnel_right(session, height, TUNNEL_0);
513                     break;
514                 case 3:
515                     paint_util_push_tunnel_left(session, height, TUNNEL_0);
516                     break;
517             }
518             paint_util_set_segment_support_height(
519                 session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D4, direction), 0xFFFF, 0);
520             paint_util_set_general_support_height(session, height + 32, 0x20);
521             break;
522     }
523 }
524 
525 /** rct2: 0x008A5A28 */
steeplechase_track_right_quarter_turn_5(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)526 static void steeplechase_track_right_quarter_turn_5(
527     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
528     const TrackElement& trackElement)
529 {
530     trackSequence = mapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[trackSequence];
531     steeplechase_track_left_quarter_turn_5(session, ride, trackSequence, (direction - 1) & 3, height, trackElement);
532 }
533 
534 /** rct2: 0x008A5A38 */
steeplechase_track_s_bend_left(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)535 static void steeplechase_track_s_bend_left(
536     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
537     const TrackElement& trackElement)
538 {
539     switch (trackSequence)
540     {
541         case 0:
542             switch (direction)
543             {
544                 case 0:
545                     PaintAddImageAsParentRotated(
546                         session, direction, session->TrackColours[SCHEME_TRACK] | 28665, 0, 6, 32, 20, 3, height);
547                     metal_a_supports_paint_setup(
548                         session, METAL_SUPPORTS_STICK, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
549                     break;
550                 case 1:
551                     PaintAddImageAsParentRotated(
552                         session, direction, session->TrackColours[SCHEME_TRACK] | 28672, 0, 6, 32, 20, 3, height);
553                     metal_a_supports_paint_setup(
554                         session, METAL_SUPPORTS_STICK_ALT, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
555                     break;
556                 case 2:
557                     PaintAddImageAsParentRotated(
558                         session, direction, session->TrackColours[SCHEME_TRACK] | 28668, 0, 6, 32, 20, 3, height);
559                     metal_a_supports_paint_setup(
560                         session, METAL_SUPPORTS_STICK, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
561                     break;
562                 case 3:
563                     PaintAddImageAsParentRotated(
564                         session, direction, session->TrackColours[SCHEME_TRACK] | 28669, 0, 6, 32, 20, 3, height);
565                     metal_a_supports_paint_setup(
566                         session, METAL_SUPPORTS_STICK_ALT, 4, 0, height - 2, session->TrackColours[SCHEME_SUPPORTS]);
567                     break;
568             }
569             if (direction == 0 || direction == 3)
570             {
571                 paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
572             }
573             paint_util_set_segment_support_height(
574                 session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
575             paint_util_set_general_support_height(session, height + 32, 0x20);
576             break;
577         case 1:
578             switch (direction)
579             {
580                 case 0:
581                     PaintAddImageAsParentRotated(
582                         session, direction, session->TrackColours[SCHEME_TRACK] | 28666, 0, 0, 32, 26, 3, height);
583                     metal_a_supports_paint_setup(
584                         session, METAL_SUPPORTS_STICK, 5, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
585                     break;
586                 case 1:
587                     PaintAddImageAsParentRotated(
588                         session, direction, session->TrackColours[SCHEME_TRACK] | 28671, 0, 0, 32, 26, 3, height);
589                     metal_a_supports_paint_setup(
590                         session, METAL_SUPPORTS_STICK_ALT, 6, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
591                     break;
592                 case 2:
593                     PaintAddImageAsParentRotated(
594                         session, direction, session->TrackColours[SCHEME_TRACK] | 28667, 0, 6, 32, 26, 3, height);
595                     break;
596                 case 3:
597                     PaintAddImageAsParentRotated(
598                         session, direction, session->TrackColours[SCHEME_TRACK] | 28670, 0, 6, 32, 26, 3, height);
599                     break;
600             }
601             paint_util_set_segment_support_height(
602                 session,
603                 paint_util_rotate_segments(
604                     SEGMENT_B4 | SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0, direction),
605                 0xFFFF, 0);
606             paint_util_set_general_support_height(session, height + 32, 0x20);
607             break;
608         case 2:
609             switch (direction)
610             {
611                 case 0:
612                     PaintAddImageAsParentRotated(
613                         session, direction, session->TrackColours[SCHEME_TRACK] | 28667, 0, 6, 32, 26, 3, height);
614                     break;
615                 case 1:
616                     PaintAddImageAsParentRotated(
617                         session, direction, session->TrackColours[SCHEME_TRACK] | 28670, 0, 6, 32, 26, 3, height);
618                     break;
619                 case 2:
620                     PaintAddImageAsParentRotated(
621                         session, direction, session->TrackColours[SCHEME_TRACK] | 28666, 0, 0, 32, 26, 3, height);
622                     metal_a_supports_paint_setup(
623                         session, METAL_SUPPORTS_STICK, 5, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
624                     break;
625                 case 3:
626                     PaintAddImageAsParentRotated(
627                         session, direction, session->TrackColours[SCHEME_TRACK] | 28671, 0, 0, 32, 26, 3, height);
628                     metal_a_supports_paint_setup(
629                         session, METAL_SUPPORTS_STICK_ALT, 6, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
630                     break;
631             }
632             paint_util_set_segment_support_height(
633                 session,
634                 paint_util_rotate_segments(
635                     SEGMENT_BC | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4, direction),
636                 0xFFFF, 0);
637             paint_util_set_general_support_height(session, height + 32, 0x20);
638             break;
639         case 3:
640             switch (direction)
641             {
642                 case 0:
643                     PaintAddImageAsParentRotated(
644                         session, direction, session->TrackColours[SCHEME_TRACK] | 28668, 0, 6, 32, 20, 3, height);
645                     metal_a_supports_paint_setup(
646                         session, METAL_SUPPORTS_STICK, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
647                     break;
648                 case 1:
649                     PaintAddImageAsParentRotated(
650                         session, direction, session->TrackColours[SCHEME_TRACK] | 28669, 0, 6, 32, 20, 3, height);
651                     metal_a_supports_paint_setup(
652                         session, METAL_SUPPORTS_STICK_ALT, 4, 0, height - 2, session->TrackColours[SCHEME_SUPPORTS]);
653                     break;
654                 case 2:
655                     PaintAddImageAsParentRotated(
656                         session, direction, session->TrackColours[SCHEME_TRACK] | 28665, 0, 6, 32, 20, 3, height);
657                     metal_a_supports_paint_setup(
658                         session, METAL_SUPPORTS_STICK, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
659                     break;
660                 case 3:
661                     PaintAddImageAsParentRotated(
662                         session, direction, session->TrackColours[SCHEME_TRACK] | 28672, 0, 6, 32, 20, 3, height);
663                     metal_a_supports_paint_setup(
664                         session, METAL_SUPPORTS_STICK_ALT, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
665                     break;
666             }
667             switch (direction)
668             {
669                 case 1:
670                     paint_util_push_tunnel_right(session, height, TUNNEL_0);
671                     break;
672                 case 2:
673                     paint_util_push_tunnel_left(session, height, TUNNEL_0);
674                     break;
675             }
676             paint_util_set_segment_support_height(
677                 session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
678             paint_util_set_general_support_height(session, height + 32, 0x20);
679             break;
680     }
681 }
682 
683 /** rct2: 0x008A5A48 */
steeplechase_track_s_bend_right(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)684 static void steeplechase_track_s_bend_right(
685     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
686     const TrackElement& trackElement)
687 {
688     switch (trackSequence)
689     {
690         case 0:
691             switch (direction)
692             {
693                 case 0:
694                     PaintAddImageAsParentRotated(
695                         session, direction, session->TrackColours[SCHEME_TRACK] | 28661, 0, 6, 32, 20, 3, height);
696                     metal_a_supports_paint_setup(
697                         session, METAL_SUPPORTS_STICK, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
698                     break;
699                 case 1:
700                     PaintAddImageAsParentRotated(
701                         session, direction, session->TrackColours[SCHEME_TRACK] | 28676, 0, 6, 32, 20, 3, height);
702                     metal_a_supports_paint_setup(
703                         session, METAL_SUPPORTS_STICK_ALT, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
704                     break;
705                 case 2:
706                     PaintAddImageAsParentRotated(
707                         session, direction, session->TrackColours[SCHEME_TRACK] | 28664, 0, 6, 32, 20, 3, height);
708                     metal_a_supports_paint_setup(
709                         session, METAL_SUPPORTS_STICK, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
710                     break;
711                 case 3:
712                     PaintAddImageAsParentRotated(
713                         session, direction, session->TrackColours[SCHEME_TRACK] | 28673, 0, 6, 32, 20, 3, height);
714                     metal_a_supports_paint_setup(
715                         session, METAL_SUPPORTS_STICK_ALT, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
716                     break;
717             }
718             if (direction == 0 || direction == 3)
719             {
720                 paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
721             }
722             paint_util_set_segment_support_height(
723                 session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
724             paint_util_set_general_support_height(session, height + 32, 0x20);
725             break;
726         case 1:
727             switch (direction)
728             {
729                 case 0:
730                     PaintAddImageAsParentRotated(
731                         session, direction, session->TrackColours[SCHEME_TRACK] | 28662, 0, 6, 32, 26, 3, height);
732                     metal_a_supports_paint_setup(
733                         session, METAL_SUPPORTS_STICK, 8, 0, height - 2, session->TrackColours[SCHEME_SUPPORTS]);
734                     break;
735                 case 1:
736                     PaintAddImageAsParentRotated(
737                         session, direction, session->TrackColours[SCHEME_TRACK] | 28675, 0, 6, 32, 26, 3, height);
738                     metal_a_supports_paint_setup(
739                         session, METAL_SUPPORTS_STICK_ALT, 7, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
740                     break;
741                 case 2:
742                     PaintAddImageAsParentRotated(
743                         session, direction, session->TrackColours[SCHEME_TRACK] | 28663, 0, 0, 32, 26, 3, height);
744                     break;
745                 case 3:
746                     PaintAddImageAsParentRotated(
747                         session, direction, session->TrackColours[SCHEME_TRACK] | 28674, 0, 0, 32, 26, 3, height);
748                     break;
749             }
750             paint_util_set_segment_support_height(
751                 session,
752                 paint_util_rotate_segments(
753                     SEGMENT_BC | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4, direction),
754                 0xFFFF, 0);
755             paint_util_set_general_support_height(session, height + 32, 0x20);
756             break;
757         case 2:
758             switch (direction)
759             {
760                 case 0:
761                     PaintAddImageAsParentRotated(
762                         session, direction, session->TrackColours[SCHEME_TRACK] | 28663, 0, 0, 32, 26, 3, height);
763                     break;
764                 case 1:
765                     PaintAddImageAsParentRotated(
766                         session, direction, session->TrackColours[SCHEME_TRACK] | 28674, 0, 0, 32, 26, 3, height);
767                     break;
768                 case 2:
769                     PaintAddImageAsParentRotated(
770                         session, direction, session->TrackColours[SCHEME_TRACK] | 28662, 0, 6, 32, 26, 3, height);
771                     metal_a_supports_paint_setup(
772                         session, METAL_SUPPORTS_STICK, 8, 0, height - 2, session->TrackColours[SCHEME_SUPPORTS]);
773                     break;
774                 case 3:
775                     PaintAddImageAsParentRotated(
776                         session, direction, session->TrackColours[SCHEME_TRACK] | 28675, 0, 6, 32, 26, 3, height);
777                     metal_a_supports_paint_setup(
778                         session, METAL_SUPPORTS_STICK_ALT, 7, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
779                     break;
780             }
781             paint_util_set_segment_support_height(
782                 session,
783                 paint_util_rotate_segments(
784                     SEGMENT_B4 | SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0, direction),
785                 0xFFFF, 0);
786             paint_util_set_general_support_height(session, height + 32, 0x20);
787             break;
788         case 3:
789             switch (direction)
790             {
791                 case 0:
792                     PaintAddImageAsParentRotated(
793                         session, direction, session->TrackColours[SCHEME_TRACK] | 28664, 0, 6, 32, 20, 3, height);
794                     metal_a_supports_paint_setup(
795                         session, METAL_SUPPORTS_STICK, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
796                     break;
797                 case 1:
798                     PaintAddImageAsParentRotated(
799                         session, direction, session->TrackColours[SCHEME_TRACK] | 28673, 0, 6, 32, 20, 3, height);
800                     metal_a_supports_paint_setup(
801                         session, METAL_SUPPORTS_STICK_ALT, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
802                     break;
803                 case 2:
804                     PaintAddImageAsParentRotated(
805                         session, direction, session->TrackColours[SCHEME_TRACK] | 28661, 0, 6, 32, 20, 3, height);
806                     metal_a_supports_paint_setup(
807                         session, METAL_SUPPORTS_STICK, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
808                     break;
809                 case 3:
810                     PaintAddImageAsParentRotated(
811                         session, direction, session->TrackColours[SCHEME_TRACK] | 28676, 0, 6, 32, 20, 3, height);
812                     metal_a_supports_paint_setup(
813                         session, METAL_SUPPORTS_STICK_ALT, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
814                     break;
815             }
816             switch (direction)
817             {
818                 case 1:
819                     paint_util_push_tunnel_right(session, height, TUNNEL_0);
820                     break;
821                 case 2:
822                     paint_util_push_tunnel_left(session, height, TUNNEL_0);
823                     break;
824             }
825             paint_util_set_segment_support_height(
826                 session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
827             paint_util_set_general_support_height(session, height + 32, 0x20);
828             break;
829     }
830 }
831 
832 /** rct2: 0x008A5A88 */
steeplechase_track_left_quarter_turn_3(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)833 static void steeplechase_track_left_quarter_turn_3(
834     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
835     const TrackElement& trackElement)
836 {
837     switch (trackSequence)
838     {
839         case 0:
840             switch (direction)
841             {
842                 case 0:
843                     PaintAddImageAsParentRotated(
844                         session, direction, session->TrackColours[SCHEME_TRACK] | 28682, 0, 6, 32, 20, 3, height);
845                     metal_a_supports_paint_setup(
846                         session, METAL_SUPPORTS_STICK, 4, 3, height, session->TrackColours[SCHEME_SUPPORTS]);
847                     break;
848                 case 1:
849                     PaintAddImageAsParentRotated(
850                         session, direction, session->TrackColours[SCHEME_TRACK] | 28685, 0, 6, 32, 20, 3, height);
851                     metal_a_supports_paint_setup(
852                         session, METAL_SUPPORTS_STICK_ALT, 4, 1, height, session->TrackColours[SCHEME_SUPPORTS]);
853                     break;
854                 case 2:
855                     PaintAddImageAsParentRotated(
856                         session, direction, session->TrackColours[SCHEME_TRACK] | 28688, 0, 6, 32, 20, 3, height);
857                     metal_a_supports_paint_setup(
858                         session, METAL_SUPPORTS_STICK, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
859                     break;
860                 case 3:
861                     PaintAddImageAsParentRotated(
862                         session, direction, session->TrackColours[SCHEME_TRACK] | 28679, 0, 6, 32, 20, 3, height);
863                     metal_a_supports_paint_setup(
864                         session, METAL_SUPPORTS_STICK_ALT, 4, 0, height - 3, session->TrackColours[SCHEME_SUPPORTS]);
865                     break;
866             }
867             if (direction == 0 || direction == 3)
868             {
869                 paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
870             }
871             paint_util_set_segment_support_height(
872                 session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
873             paint_util_set_general_support_height(session, height + 32, 0x20);
874             break;
875         case 1:
876             paint_util_set_general_support_height(session, height + 32, 0x20);
877             break;
878         case 2:
879             switch (direction)
880             {
881                 case 0:
882                     PaintAddImageAsParentRotated(
883                         session, direction, session->TrackColours[SCHEME_TRACK] | 28681, 16, 0, 16, 16, 3, height);
884                     break;
885                 case 1:
886                     PaintAddImageAsParentRotated(
887                         session, direction, session->TrackColours[SCHEME_TRACK] | 28684, 0, 0, 16, 16, 3, height);
888                     break;
889                 case 2:
890                     PaintAddImageAsParentRotated(
891                         session, direction, session->TrackColours[SCHEME_TRACK] | 28687, 0, 16, 16, 16, 3, height);
892                     break;
893                 case 3:
894                     PaintAddImageAsParentRotated(
895                         session, direction, session->TrackColours[SCHEME_TRACK] | 28678, 16, 16, 16, 16, 3, height);
896                     break;
897             }
898             paint_util_set_segment_support_height(
899                 session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF, 0);
900             paint_util_set_general_support_height(session, height + 32, 0x20);
901             break;
902         case 3:
903             switch (direction)
904             {
905                 case 0:
906                     PaintAddImageAsParentRotated(
907                         session, direction, session->TrackColours[SCHEME_TRACK] | 28680, 6, 0, 20, 32, 3, height);
908                     metal_a_supports_paint_setup(
909                         session, METAL_SUPPORTS_STICK_ALT, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
910                     break;
911                 case 1:
912                     PaintAddImageAsParentRotated(
913                         session, direction, session->TrackColours[SCHEME_TRACK] | 28683, 6, 0, 20, 32, 3, height);
914                     metal_a_supports_paint_setup(
915                         session, METAL_SUPPORTS_STICK, 4, 1, height, session->TrackColours[SCHEME_SUPPORTS]);
916                     break;
917                 case 2:
918                     PaintAddImageAsParentRotated(
919                         session, direction, session->TrackColours[SCHEME_TRACK] | 28686, 6, 0, 20, 32, 3, height);
920                     metal_a_supports_paint_setup(
921                         session, METAL_SUPPORTS_STICK_ALT, 4, 3, height, session->TrackColours[SCHEME_SUPPORTS]);
922                     break;
923                 case 3:
924                     PaintAddImageAsParentRotated(
925                         session, direction, session->TrackColours[SCHEME_TRACK] | 28677, 6, 0, 20, 32, 3, height);
926                     metal_a_supports_paint_setup(
927                         session, METAL_SUPPORTS_STICK, 4, 0, height - 3, session->TrackColours[SCHEME_SUPPORTS]);
928                     break;
929             }
930             switch (direction)
931             {
932                 case 2:
933                     paint_util_push_tunnel_right(session, height, TUNNEL_0);
934                     break;
935                 case 3:
936                     paint_util_push_tunnel_left(session, height, TUNNEL_0);
937                     break;
938             }
939             paint_util_set_segment_support_height(
940                 session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D4, direction), 0xFFFF, 0);
941             paint_util_set_general_support_height(session, height + 32, 0x20);
942             break;
943     }
944 }
945 
946 /** rct2: 0x008A5A98 */
steeplechase_track_right_quarter_turn_3(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)947 static void steeplechase_track_right_quarter_turn_3(
948     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
949     const TrackElement& trackElement)
950 {
951     trackSequence = mapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence];
952     steeplechase_track_left_quarter_turn_3(session, ride, trackSequence, (direction - 1) & 3, height, trackElement);
953 }
954 
955 /** rct2: 0x008A5AA8 */
steeplechase_track_brakes(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)956 static void steeplechase_track_brakes(
957     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
958     const TrackElement& trackElement)
959 {
960     switch (direction)
961     {
962         case 0:
963         case 2:
964             PaintAddImageAsParentRotated(
965                 session, direction, session->TrackColours[SCHEME_TRACK] | 28635, 0, 6, 32, 20, 3, height);
966             metal_a_supports_paint_setup(session, METAL_SUPPORTS_STICK, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
967             break;
968         case 1:
969         case 3:
970             PaintAddImageAsParentRotated(
971                 session, direction, session->TrackColours[SCHEME_TRACK] | 28636, 0, 6, 32, 20, 3, height);
972             metal_a_supports_paint_setup(
973                 session, METAL_SUPPORTS_STICK_ALT, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
974             break;
975     }
976     paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
977     paint_util_set_segment_support_height(
978         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
979     paint_util_set_general_support_height(session, height + 32, 0x20);
980 }
981 
982 /** rct2: 0x008A5AD8 */
steeplechase_track_left_eighth_to_diag(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)983 static void steeplechase_track_left_eighth_to_diag(
984     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
985     const TrackElement& trackElement)
986 {
987     switch (trackSequence)
988     {
989         case 0:
990             switch (direction)
991             {
992                 case 0:
993                     PaintAddImageAsParentRotated(
994                         session, direction, session->TrackColours[SCHEME_TRACK] | 28725, 0, 0, 32, 20, 3, height, 0, 6, height);
995                     metal_a_supports_paint_setup(
996                         session, METAL_SUPPORTS_STICK, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
997                     break;
998                 case 1:
999                     PaintAddImageAsParentRotated(
1000                         session, direction, session->TrackColours[SCHEME_TRACK] | 28729, 0, 0, 32, 20, 3, height, 0, 6, height);
1001                     metal_a_supports_paint_setup(
1002                         session, METAL_SUPPORTS_STICK_ALT, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1003                     break;
1004                 case 2:
1005                     PaintAddImageAsParentRotated(
1006                         session, direction, session->TrackColours[SCHEME_TRACK] | 28733, 0, 0, 32, 20, 3, height, 0, 6, height);
1007                     metal_a_supports_paint_setup(
1008                         session, METAL_SUPPORTS_STICK, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1009                     break;
1010                 case 3:
1011                     PaintAddImageAsParentRotated(
1012                         session, direction, session->TrackColours[SCHEME_TRACK] | 28737, 0, 0, 32, 20, 3, height, 0, 6, height);
1013                     metal_a_supports_paint_setup(
1014                         session, METAL_SUPPORTS_STICK_ALT, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1015                     break;
1016             }
1017             if (direction == 0 || direction == 3)
1018             {
1019                 paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
1020             }
1021             paint_util_set_segment_support_height(
1022                 session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
1023             paint_util_set_general_support_height(session, height + 32, 0x20);
1024             break;
1025         case 1:
1026             switch (direction)
1027             {
1028                 case 0:
1029                     PaintAddImageAsParentRotated(
1030                         session, direction, session->TrackColours[SCHEME_TRACK] | 28726, 0, 0, 32, 16, 3, height, 0, 0, height);
1031                     break;
1032                 case 1:
1033                     PaintAddImageAsParentRotated(
1034                         session, direction, session->TrackColours[SCHEME_TRACK] | 28730, 0, 0, 34, 16, 3, height, 0, 0, height);
1035                     break;
1036                 case 2:
1037                     PaintAddImageAsParentRotated(
1038                         session, direction, session->TrackColours[SCHEME_TRACK] | 28734, 0, 0, 32, 16, 3, height, 0, 16,
1039                         height);
1040                     break;
1041                 case 3:
1042                     PaintAddImageAsParentRotated(
1043                         session, direction, session->TrackColours[SCHEME_TRACK] | 28738, 0, 0, 32, 16, 3, height, 0, 16,
1044                         height);
1045                     break;
1046             }
1047             paint_util_set_segment_support_height(
1048                 session,
1049                 paint_util_rotate_segments(
1050                     SEGMENT_B4 | SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0, direction),
1051                 0xFFFF, 0);
1052             paint_util_set_general_support_height(session, height + 32, 0x20);
1053             break;
1054         case 2:
1055             switch (direction)
1056             {
1057                 case 0:
1058                     PaintAddImageAsParentRotated(
1059                         session, direction, session->TrackColours[SCHEME_TRACK] | 28727, 0, 0, 16, 16, 3, height, 0, 16,
1060                         height);
1061                     break;
1062                 case 1:
1063                     PaintAddImageAsParentRotated(
1064                         session, direction, session->TrackColours[SCHEME_TRACK] | 28731, 0, 0, 16, 16, 3, height, 16, 16,
1065                         height);
1066                     break;
1067                 case 2:
1068                     PaintAddImageAsParentRotated(
1069                         session, direction, session->TrackColours[SCHEME_TRACK] | 28735, 0, 0, 16, 16, 3, height, 16, 0,
1070                         height);
1071                     break;
1072                 case 3:
1073                     PaintAddImageAsParentRotated(
1074                         session, direction, session->TrackColours[SCHEME_TRACK] | 28739, 0, 0, 16, 16, 3, height, 0, 0, height);
1075                     break;
1076             }
1077             paint_util_set_segment_support_height(
1078                 session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction),
1079                 0xFFFF, 0);
1080             paint_util_set_general_support_height(session, height + 32, 0x20);
1081             break;
1082         case 3:
1083             paint_util_set_segment_support_height(
1084                 session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF, 0);
1085             paint_util_set_general_support_height(session, height + 32, 0x20);
1086             break;
1087         case 4:
1088             switch (direction)
1089             {
1090                 case 0:
1091                     PaintAddImageAsParentRotated(
1092                         session, direction, session->TrackColours[SCHEME_TRACK] | 28728, 0, 0, 16, 16, 3, height, 16, 16,
1093                         height);
1094                     metal_a_supports_paint_setup(
1095                         session, METAL_SUPPORTS_STICK, 3, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1096                     break;
1097                 case 1:
1098                     PaintAddImageAsParentRotated(
1099                         session, direction, session->TrackColours[SCHEME_TRACK] | 28732, 0, 0, 16, 18, 3, height, 0, 16,
1100                         height);
1101                     metal_a_supports_paint_setup(
1102                         session, METAL_SUPPORTS_STICK_ALT, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1103                     break;
1104                 case 2:
1105                     PaintAddImageAsParentRotated(
1106                         session, direction, session->TrackColours[SCHEME_TRACK] | 28736, 0, 0, 16, 16, 3, height, 0, 0, height);
1107                     metal_a_supports_paint_setup(
1108                         session, METAL_SUPPORTS_STICK, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1109                     break;
1110                 case 3:
1111                     PaintAddImageAsParentRotated(
1112                         session, direction, session->TrackColours[SCHEME_TRACK] | 28740, 0, 0, 16, 16, 3, height, 16, 0,
1113                         height);
1114                     metal_a_supports_paint_setup(
1115                         session, METAL_SUPPORTS_STICK_ALT, 2, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1116                     break;
1117             }
1118             paint_util_set_segment_support_height(
1119                 session,
1120                 paint_util_rotate_segments(
1121                     SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4, direction),
1122                 0xFFFF, 0);
1123             paint_util_set_general_support_height(session, height + 32, 0x20);
1124             break;
1125     }
1126 }
1127 
1128 /** rct2: 0x008A5AE8 */
steeplechase_track_right_eighth_to_diag(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)1129 static void steeplechase_track_right_eighth_to_diag(
1130     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
1131     const TrackElement& trackElement)
1132 {
1133     switch (trackSequence)
1134     {
1135         case 0:
1136             switch (direction)
1137             {
1138                 case 0:
1139                     PaintAddImageAsParentRotated(
1140                         session, direction, session->TrackColours[SCHEME_TRACK] | 28709, 0, 0, 32, 20, 3, height, 0, 6, height);
1141                     metal_a_supports_paint_setup(
1142                         session, METAL_SUPPORTS_STICK, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1143                     break;
1144                 case 1:
1145                     PaintAddImageAsParentRotated(
1146                         session, direction, session->TrackColours[SCHEME_TRACK] | 28713, 0, 0, 32, 20, 3, height, 0, 6, height);
1147                     metal_a_supports_paint_setup(
1148                         session, METAL_SUPPORTS_STICK_ALT, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1149                     break;
1150                 case 2:
1151                     PaintAddImageAsParentRotated(
1152                         session, direction, session->TrackColours[SCHEME_TRACK] | 28717, 0, 0, 32, 20, 3, height, 0, 6, height);
1153                     metal_a_supports_paint_setup(
1154                         session, METAL_SUPPORTS_STICK, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1155                     break;
1156                 case 3:
1157                     PaintAddImageAsParentRotated(
1158                         session, direction, session->TrackColours[SCHEME_TRACK] | 28721, 0, 0, 32, 20, 3, height, 0, 6, height);
1159                     metal_a_supports_paint_setup(
1160                         session, METAL_SUPPORTS_STICK_ALT, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1161                     break;
1162             }
1163             if (direction == 0 || direction == 3)
1164             {
1165                 paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
1166             }
1167             paint_util_set_segment_support_height(
1168                 session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
1169             paint_util_set_general_support_height(session, height + 32, 0x20);
1170             break;
1171         case 1:
1172             switch (direction)
1173             {
1174                 case 0:
1175                     PaintAddImageAsParentRotated(
1176                         session, direction, session->TrackColours[SCHEME_TRACK] | 28710, 0, 0, 32, 16, 3, height, 0, 16,
1177                         height);
1178                     break;
1179                 case 1:
1180                     PaintAddImageAsParentRotated(
1181                         session, direction, session->TrackColours[SCHEME_TRACK] | 28714, 0, 0, 32, 16, 3, height, 0, 16,
1182                         height);
1183                     break;
1184                 case 2:
1185                     PaintAddImageAsParentRotated(
1186                         session, direction, session->TrackColours[SCHEME_TRACK] | 28718, 0, 0, 34, 16, 3, height, 0, 0, height);
1187                     break;
1188                 case 3:
1189                     PaintAddImageAsParentRotated(
1190                         session, direction, session->TrackColours[SCHEME_TRACK] | 28722, 0, 0, 32, 16, 3, height, 0, 0, height);
1191                     break;
1192             }
1193             paint_util_set_segment_support_height(
1194                 session,
1195                 paint_util_rotate_segments(
1196                     SEGMENT_BC | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4, direction),
1197                 0xFFFF, 0);
1198             paint_util_set_general_support_height(session, height + 32, 0x20);
1199             break;
1200         case 2:
1201             switch (direction)
1202             {
1203                 case 0:
1204                     PaintAddImageAsParentRotated(
1205                         session, direction, session->TrackColours[SCHEME_TRACK] | 28711, 0, 0, 16, 16, 3, height, 0, 0, height);
1206                     break;
1207                 case 1:
1208                     PaintAddImageAsParentRotated(
1209                         session, direction, session->TrackColours[SCHEME_TRACK] | 28715, 0, 0, 16, 16, 3, height, 16, 0,
1210                         height);
1211                     break;
1212                 case 2:
1213                     PaintAddImageAsParentRotated(
1214                         session, direction, session->TrackColours[SCHEME_TRACK] | 28719, 0, 0, 28, 28, 3, height, 4, 4, height);
1215                     break;
1216                 case 3:
1217                     PaintAddImageAsParentRotated(
1218                         session, direction, session->TrackColours[SCHEME_TRACK] | 28723, 0, 0, 16, 16, 3, height, 0, 16,
1219                         height);
1220                     break;
1221             }
1222             paint_util_set_segment_support_height(
1223                 session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction),
1224                 0xFFFF, 0);
1225             paint_util_set_general_support_height(session, height + 32, 0x20);
1226             break;
1227         case 3:
1228             paint_util_set_segment_support_height(
1229                 session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF, 0);
1230             paint_util_set_general_support_height(session, height + 32, 0x20);
1231             break;
1232         case 4:
1233             switch (direction)
1234             {
1235                 case 0:
1236                     PaintAddImageAsParentRotated(
1237                         session, direction, session->TrackColours[SCHEME_TRACK] | 28712, 0, 0, 16, 16, 3, height, 16, 0,
1238                         height);
1239                     metal_a_supports_paint_setup(
1240                         session, METAL_SUPPORTS_STICK, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1241                     break;
1242                 case 1:
1243                     PaintAddImageAsParentRotated(
1244                         session, direction, session->TrackColours[SCHEME_TRACK] | 28716, 0, 0, 16, 16, 3, height, 0, 0, height);
1245                     metal_a_supports_paint_setup(
1246                         session, METAL_SUPPORTS_STICK_ALT, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1247                     break;
1248                 case 2:
1249                     PaintAddImageAsParentRotated(
1250                         session, direction, session->TrackColours[SCHEME_TRACK] | 28720, 0, 0, 16, 18, 3, height, 0, 16,
1251                         height);
1252                     metal_a_supports_paint_setup(
1253                         session, METAL_SUPPORTS_STICK, 2, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1254                     break;
1255                 case 3:
1256                     PaintAddImageAsParentRotated(
1257                         session, direction, session->TrackColours[SCHEME_TRACK] | 28724, 0, 0, 16, 16, 3, height, 16, 16,
1258                         height);
1259                     metal_a_supports_paint_setup(
1260                         session, METAL_SUPPORTS_STICK_ALT, 3, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1261                     break;
1262             }
1263             paint_util_set_segment_support_height(
1264                 session,
1265                 paint_util_rotate_segments(
1266                     SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4, direction),
1267                 0xFFFF, 0);
1268             paint_util_set_general_support_height(session, height + 32, 0x20);
1269             break;
1270     }
1271 }
1272 
1273 /** rct2: 0x008A5AF8 */
steeplechase_track_left_eighth_to_orthogonal(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)1274 static void steeplechase_track_left_eighth_to_orthogonal(
1275     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
1276     const TrackElement& trackElement)
1277 {
1278     trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence];
1279     steeplechase_track_right_eighth_to_diag(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
1280 }
1281 
1282 /** rct2: 0x008A5B08 */
steeplechase_track_right_eighth_to_orthogonal(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)1283 static void steeplechase_track_right_eighth_to_orthogonal(
1284     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
1285     const TrackElement& trackElement)
1286 {
1287     trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence];
1288     steeplechase_track_left_eighth_to_diag(session, ride, trackSequence, (direction + 3) & 3, height, trackElement);
1289 }
1290 
1291 /** rct2: 0x008A5AC8 */
steeplechase_track_diag_flat(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)1292 static void steeplechase_track_diag_flat(
1293     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
1294     const TrackElement& trackElement)
1295 {
1296     switch (trackSequence)
1297     {
1298         case 0:
1299             if (trackElement.HasChain())
1300             {
1301                 switch (direction)
1302                 {
1303                     case 3:
1304                         PaintAddImageAsParentRotated(
1305                             session, direction, session->TrackColours[SCHEME_TRACK] | 28760, -16, -16, 32, 32, 3, height, -16,
1306                             -16, height);
1307                         break;
1308                 }
1309             }
1310             else
1311             {
1312                 switch (direction)
1313                 {
1314                     case 3:
1315                         PaintAddImageAsParentRotated(
1316                             session, direction, session->TrackColours[SCHEME_TRACK] | 28744, -16, -16, 32, 32, 3, height, -16,
1317                             -16, height);
1318                         break;
1319                 }
1320             }
1321             paint_util_set_segment_support_height(
1322                 session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF, 0);
1323             paint_util_set_general_support_height(session, height + 32, 0x20);
1324             break;
1325         case 1:
1326             if (trackElement.HasChain())
1327             {
1328                 switch (direction)
1329                 {
1330                     case 0:
1331                         PaintAddImageAsParentRotated(
1332                             session, direction, session->TrackColours[SCHEME_TRACK] | 28757, -16, -16, 32, 32, 3, height, -16,
1333                             -16, height);
1334                         break;
1335                 }
1336             }
1337             else
1338             {
1339                 switch (direction)
1340                 {
1341                     case 0:
1342                         PaintAddImageAsParentRotated(
1343                             session, direction, session->TrackColours[SCHEME_TRACK] | 28741, -16, -16, 32, 32, 3, height, -16,
1344                             -16, height);
1345                         break;
1346                 }
1347             }
1348             paint_util_set_segment_support_height(
1349                 session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF, 0);
1350             paint_util_set_general_support_height(session, height + 32, 0x20);
1351             break;
1352         case 2:
1353             if (trackElement.HasChain())
1354             {
1355                 switch (direction)
1356                 {
1357                     case 2:
1358                         PaintAddImageAsParentRotated(
1359                             session, direction, session->TrackColours[SCHEME_TRACK] | 28759, -16, -16, 32, 32, 3, height, -16,
1360                             -16, height);
1361                         break;
1362                 }
1363             }
1364             else
1365             {
1366                 switch (direction)
1367                 {
1368                     case 2:
1369                         PaintAddImageAsParentRotated(
1370                             session, direction, session->TrackColours[SCHEME_TRACK] | 28743, -16, -16, 32, 32, 3, height, -16,
1371                             -16, height);
1372                         break;
1373                 }
1374             }
1375             paint_util_set_segment_support_height(
1376                 session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF, 0);
1377             paint_util_set_general_support_height(session, height + 32, 0x20);
1378             break;
1379         case 3:
1380             if (trackElement.HasChain())
1381             {
1382                 switch (direction)
1383                 {
1384                     case 0:
1385                         metal_a_supports_paint_setup(
1386                             session, METAL_SUPPORTS_STICK, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1387                         break;
1388                     case 1:
1389                         PaintAddImageAsParentRotated(
1390                             session, direction, session->TrackColours[SCHEME_TRACK] | 28758, -16, -16, 32, 32, 3, height, -16,
1391                             -16, height);
1392                         metal_a_supports_paint_setup(
1393                             session, METAL_SUPPORTS_STICK_ALT, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1394                         break;
1395                     case 2:
1396                         metal_a_supports_paint_setup(
1397                             session, METAL_SUPPORTS_STICK, 2, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1398                         break;
1399                     case 3:
1400                         metal_a_supports_paint_setup(
1401                             session, METAL_SUPPORTS_STICK_ALT, 3, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1402                         break;
1403                 }
1404             }
1405             else
1406             {
1407                 switch (direction)
1408                 {
1409                     case 0:
1410                         metal_a_supports_paint_setup(
1411                             session, METAL_SUPPORTS_STICK, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1412                         break;
1413                     case 1:
1414                         PaintAddImageAsParentRotated(
1415                             session, direction, session->TrackColours[SCHEME_TRACK] | 28742, -16, -16, 32, 32, 3, height, -16,
1416                             -16, height);
1417                         metal_a_supports_paint_setup(
1418                             session, METAL_SUPPORTS_STICK_ALT, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1419                         break;
1420                     case 2:
1421                         metal_a_supports_paint_setup(
1422                             session, METAL_SUPPORTS_STICK, 2, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1423                         break;
1424                     case 3:
1425                         metal_a_supports_paint_setup(
1426                             session, METAL_SUPPORTS_STICK_ALT, 3, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1427                         break;
1428                 }
1429             }
1430             paint_util_set_segment_support_height(
1431                 session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF, 0);
1432             paint_util_set_general_support_height(session, height + 32, 0x20);
1433             break;
1434     }
1435 }
1436 
1437 /** rct2: 0x008A5B38 */
steeplechase_track_diag_25_deg_up(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)1438 static void steeplechase_track_diag_25_deg_up(
1439     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
1440     const TrackElement& trackElement)
1441 {
1442     switch (trackSequence)
1443     {
1444         case 0:
1445             if (trackElement.HasChain())
1446             {
1447                 switch (direction)
1448                 {
1449                     case 3:
1450                         PaintAddImageAsParentRotated(
1451                             session, direction, session->TrackColours[SCHEME_TRACK] | 28772, -16, -16, 32, 32, 3, height, -16,
1452                             -16, height);
1453                         break;
1454                 }
1455             }
1456             else
1457             {
1458                 switch (direction)
1459                 {
1460                     case 3:
1461                         PaintAddImageAsParentRotated(
1462                             session, direction, session->TrackColours[SCHEME_TRACK] | 28756, -16, -16, 32, 32, 3, height, -16,
1463                             -16, height);
1464                         break;
1465                 }
1466             }
1467             paint_util_set_segment_support_height(
1468                 session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF, 0);
1469             paint_util_set_general_support_height(session, height + 56, 0x20);
1470             break;
1471         case 1:
1472             if (trackElement.HasChain())
1473             {
1474                 switch (direction)
1475                 {
1476                     case 0:
1477                         PaintAddImageAsParentRotated(
1478                             session, direction, session->TrackColours[SCHEME_TRACK] | 28769, -16, -16, 32, 32, 3, height, -16,
1479                             -16, height);
1480                         break;
1481                 }
1482             }
1483             else
1484             {
1485                 switch (direction)
1486                 {
1487                     case 0:
1488                         PaintAddImageAsParentRotated(
1489                             session, direction, session->TrackColours[SCHEME_TRACK] | 28753, -16, -16, 32, 32, 3, height, -16,
1490                             -16, height);
1491                         break;
1492                 }
1493             }
1494             paint_util_set_segment_support_height(
1495                 session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF, 0);
1496             paint_util_set_general_support_height(session, height + 56, 0x20);
1497             break;
1498         case 2:
1499             if (trackElement.HasChain())
1500             {
1501                 switch (direction)
1502                 {
1503                     case 2:
1504                         PaintAddImageAsParentRotated(
1505                             session, direction, session->TrackColours[SCHEME_TRACK] | 28771, -16, -16, 32, 32, 3, height, -16,
1506                             -16, height);
1507                         break;
1508                 }
1509             }
1510             else
1511             {
1512                 switch (direction)
1513                 {
1514                     case 2:
1515                         PaintAddImageAsParentRotated(
1516                             session, direction, session->TrackColours[SCHEME_TRACK] | 28755, -16, -16, 32, 32, 3, height, -16,
1517                             -16, height);
1518                         break;
1519                 }
1520             }
1521             paint_util_set_segment_support_height(
1522                 session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF, 0);
1523             paint_util_set_general_support_height(session, height + 56, 0x20);
1524             break;
1525         case 3:
1526             if (trackElement.HasChain())
1527             {
1528                 switch (direction)
1529                 {
1530                     case 0:
1531                         metal_b_supports_paint_setup(
1532                             session, METAL_SUPPORTS_STICK, 1, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
1533                         break;
1534                     case 1:
1535                         PaintAddImageAsParentRotated(
1536                             session, direction, session->TrackColours[SCHEME_TRACK] | 28770, -16, -16, 32, 32, 3, height, -16,
1537                             -16, height);
1538                         metal_b_supports_paint_setup(
1539                             session, METAL_SUPPORTS_STICK_ALT, 0, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
1540                         break;
1541                     case 2:
1542                         metal_b_supports_paint_setup(
1543                             session, METAL_SUPPORTS_STICK, 2, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
1544                         break;
1545                     case 3:
1546                         metal_b_supports_paint_setup(
1547                             session, METAL_SUPPORTS_STICK_ALT, 3, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
1548                         break;
1549                 }
1550             }
1551             else
1552             {
1553                 switch (direction)
1554                 {
1555                     case 0:
1556                         metal_b_supports_paint_setup(
1557                             session, METAL_SUPPORTS_STICK, 1, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
1558                         break;
1559                     case 1:
1560                         PaintAddImageAsParentRotated(
1561                             session, direction, session->TrackColours[SCHEME_TRACK] | 28754, -16, -16, 32, 32, 3, height, -16,
1562                             -16, height);
1563                         metal_b_supports_paint_setup(
1564                             session, METAL_SUPPORTS_STICK_ALT, 0, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
1565                         break;
1566                     case 2:
1567                         metal_b_supports_paint_setup(
1568                             session, METAL_SUPPORTS_STICK, 2, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
1569                         break;
1570                     case 3:
1571                         metal_b_supports_paint_setup(
1572                             session, METAL_SUPPORTS_STICK_ALT, 3, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
1573                         break;
1574                 }
1575             }
1576             paint_util_set_segment_support_height(
1577                 session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF, 0);
1578             paint_util_set_general_support_height(session, height + 56, 0x20);
1579             break;
1580     }
1581 }
1582 
1583 /** rct2: 0x008A5B18 */
steeplechase_track_diag_flat_to_25_deg_up(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)1584 static void steeplechase_track_diag_flat_to_25_deg_up(
1585     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
1586     const TrackElement& trackElement)
1587 {
1588     switch (trackSequence)
1589     {
1590         case 0:
1591             if (trackElement.HasChain())
1592             {
1593                 switch (direction)
1594                 {
1595                     case 3:
1596                         PaintAddImageAsParentRotated(
1597                             session, direction, session->TrackColours[SCHEME_TRACK] | 28764, -16, -16, 32, 32, 3, height, -16,
1598                             -16, height);
1599                         break;
1600                 }
1601             }
1602             else
1603             {
1604                 switch (direction)
1605                 {
1606                     case 3:
1607                         PaintAddImageAsParentRotated(
1608                             session, direction, session->TrackColours[SCHEME_TRACK] | 28748, -16, -16, 32, 32, 3, height, -16,
1609                             -16, height);
1610                         break;
1611                 }
1612             }
1613             paint_util_set_segment_support_height(
1614                 session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF, 0);
1615             paint_util_set_general_support_height(session, height + 48, 0x20);
1616             break;
1617         case 1:
1618             if (trackElement.HasChain())
1619             {
1620                 switch (direction)
1621                 {
1622                     case 0:
1623                         PaintAddImageAsParentRotated(
1624                             session, direction, session->TrackColours[SCHEME_TRACK] | 28761, -16, -16, 32, 32, 3, height, -16,
1625                             -16, height);
1626                         break;
1627                 }
1628             }
1629             else
1630             {
1631                 switch (direction)
1632                 {
1633                     case 0:
1634                         PaintAddImageAsParentRotated(
1635                             session, direction, session->TrackColours[SCHEME_TRACK] | 28745, -16, -16, 32, 32, 3, height, -16,
1636                             -16, height);
1637                         break;
1638                 }
1639             }
1640             paint_util_set_segment_support_height(
1641                 session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF, 0);
1642             paint_util_set_general_support_height(session, height + 48, 0x20);
1643             break;
1644         case 2:
1645             if (trackElement.HasChain())
1646             {
1647                 switch (direction)
1648                 {
1649                     case 2:
1650                         PaintAddImageAsParentRotated(
1651                             session, direction, session->TrackColours[SCHEME_TRACK] | 28763, -16, -16, 32, 32, 3, height, -16,
1652                             -16, height);
1653                         break;
1654                 }
1655             }
1656             else
1657             {
1658                 switch (direction)
1659                 {
1660                     case 2:
1661                         PaintAddImageAsParentRotated(
1662                             session, direction, session->TrackColours[SCHEME_TRACK] | 28747, -16, -16, 32, 32, 3, height, -16,
1663                             -16, height);
1664                         break;
1665                 }
1666             }
1667             paint_util_set_segment_support_height(
1668                 session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF, 0);
1669             paint_util_set_general_support_height(session, height + 48, 0x20);
1670             break;
1671         case 3:
1672             if (trackElement.HasChain())
1673             {
1674                 switch (direction)
1675                 {
1676                     case 0:
1677                         metal_b_supports_paint_setup(
1678                             session, METAL_SUPPORTS_STICK, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1679                         break;
1680                     case 1:
1681                         PaintAddImageAsParentRotated(
1682                             session, direction, session->TrackColours[SCHEME_TRACK] | 28762, -16, -16, 32, 32, 3, height, -16,
1683                             -16, height);
1684                         metal_b_supports_paint_setup(
1685                             session, METAL_SUPPORTS_STICK_ALT, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1686                         break;
1687                     case 2:
1688                         metal_b_supports_paint_setup(
1689                             session, METAL_SUPPORTS_STICK, 2, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1690                         break;
1691                     case 3:
1692                         metal_b_supports_paint_setup(
1693                             session, METAL_SUPPORTS_STICK_ALT, 3, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1694                         break;
1695                 }
1696             }
1697             else
1698             {
1699                 switch (direction)
1700                 {
1701                     case 0:
1702                         metal_b_supports_paint_setup(
1703                             session, METAL_SUPPORTS_STICK, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1704                         break;
1705                     case 1:
1706                         PaintAddImageAsParentRotated(
1707                             session, direction, session->TrackColours[SCHEME_TRACK] | 28746, -16, -16, 32, 32, 3, height, -16,
1708                             -16, height);
1709                         metal_b_supports_paint_setup(
1710                             session, METAL_SUPPORTS_STICK_ALT, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1711                         break;
1712                     case 2:
1713                         metal_b_supports_paint_setup(
1714                             session, METAL_SUPPORTS_STICK, 2, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1715                         break;
1716                     case 3:
1717                         metal_b_supports_paint_setup(
1718                             session, METAL_SUPPORTS_STICK_ALT, 3, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1719                         break;
1720                 }
1721             }
1722             paint_util_set_segment_support_height(
1723                 session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF, 0);
1724             paint_util_set_general_support_height(session, height + 48, 0x20);
1725             break;
1726     }
1727 }
1728 
1729 /** rct2: 0x008A5B28 */
steeplechase_track_diag_25_deg_up_to_flat(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)1730 static void steeplechase_track_diag_25_deg_up_to_flat(
1731     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
1732     const TrackElement& trackElement)
1733 {
1734     switch (trackSequence)
1735     {
1736         case 0:
1737             if (trackElement.HasChain())
1738             {
1739                 switch (direction)
1740                 {
1741                     case 3:
1742                         PaintAddImageAsParentRotated(
1743                             session, direction, session->TrackColours[SCHEME_TRACK] | 28768, -16, -16, 32, 32, 3, height, -16,
1744                             -16, height);
1745                         break;
1746                 }
1747             }
1748             else
1749             {
1750                 switch (direction)
1751                 {
1752                     case 3:
1753                         PaintAddImageAsParentRotated(
1754                             session, direction, session->TrackColours[SCHEME_TRACK] | 28752, -16, -16, 32, 32, 3, height, -16,
1755                             -16, height);
1756                         break;
1757                 }
1758             }
1759             paint_util_set_segment_support_height(
1760                 session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF, 0);
1761             paint_util_set_general_support_height(session, height + 56, 0x20);
1762             break;
1763         case 1:
1764             if (trackElement.HasChain())
1765             {
1766                 switch (direction)
1767                 {
1768                     case 0:
1769                         PaintAddImageAsParentRotated(
1770                             session, direction, session->TrackColours[SCHEME_TRACK] | 28765, -16, -16, 32, 32, 3, height, -16,
1771                             -16, height);
1772                         break;
1773                 }
1774             }
1775             else
1776             {
1777                 switch (direction)
1778                 {
1779                     case 0:
1780                         PaintAddImageAsParentRotated(
1781                             session, direction, session->TrackColours[SCHEME_TRACK] | 28749, -16, -16, 32, 32, 3, height, -16,
1782                             -16, height);
1783                         break;
1784                 }
1785             }
1786             paint_util_set_segment_support_height(
1787                 session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF, 0);
1788             paint_util_set_general_support_height(session, height + 56, 0x20);
1789             break;
1790         case 2:
1791             if (trackElement.HasChain())
1792             {
1793                 switch (direction)
1794                 {
1795                     case 2:
1796                         PaintAddImageAsParentRotated(
1797                             session, direction, session->TrackColours[SCHEME_TRACK] | 28767, -16, -16, 32, 32, 3, height, -16,
1798                             -16, height);
1799                         break;
1800                 }
1801             }
1802             else
1803             {
1804                 switch (direction)
1805                 {
1806                     case 2:
1807                         PaintAddImageAsParentRotated(
1808                             session, direction, session->TrackColours[SCHEME_TRACK] | 28751, -16, -16, 32, 32, 3, height, -16,
1809                             -16, height);
1810                         break;
1811                 }
1812             }
1813             paint_util_set_segment_support_height(
1814                 session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF, 0);
1815             paint_util_set_general_support_height(session, height + 56, 0x20);
1816             break;
1817         case 3:
1818             if (trackElement.HasChain())
1819             {
1820                 switch (direction)
1821                 {
1822                     case 0:
1823                         metal_b_supports_paint_setup(
1824                             session, METAL_SUPPORTS_STICK, 1, 4, height, session->TrackColours[SCHEME_SUPPORTS]);
1825                         break;
1826                     case 1:
1827                         PaintAddImageAsParentRotated(
1828                             session, direction, session->TrackColours[SCHEME_TRACK] | 28766, -16, -16, 32, 32, 3, height, -16,
1829                             -16, height);
1830                         metal_b_supports_paint_setup(
1831                             session, METAL_SUPPORTS_STICK_ALT, 0, 4, height, session->TrackColours[SCHEME_SUPPORTS]);
1832                         break;
1833                     case 2:
1834                         metal_b_supports_paint_setup(
1835                             session, METAL_SUPPORTS_STICK, 2, 4, height, session->TrackColours[SCHEME_SUPPORTS]);
1836                         break;
1837                     case 3:
1838                         metal_b_supports_paint_setup(
1839                             session, METAL_SUPPORTS_STICK_ALT, 3, 4, height, session->TrackColours[SCHEME_SUPPORTS]);
1840                         break;
1841                 }
1842             }
1843             else
1844             {
1845                 switch (direction)
1846                 {
1847                     case 0:
1848                         metal_b_supports_paint_setup(
1849                             session, METAL_SUPPORTS_STICK, 1, 4, height, session->TrackColours[SCHEME_SUPPORTS]);
1850                         break;
1851                     case 1:
1852                         PaintAddImageAsParentRotated(
1853                             session, direction, session->TrackColours[SCHEME_TRACK] | 28750, -16, -16, 32, 32, 3, height, -16,
1854                             -16, height);
1855                         metal_b_supports_paint_setup(
1856                             session, METAL_SUPPORTS_STICK_ALT, 0, 4, height, session->TrackColours[SCHEME_SUPPORTS]);
1857                         break;
1858                     case 2:
1859                         metal_b_supports_paint_setup(
1860                             session, METAL_SUPPORTS_STICK, 2, 4, height, session->TrackColours[SCHEME_SUPPORTS]);
1861                         break;
1862                     case 3:
1863                         metal_b_supports_paint_setup(
1864                             session, METAL_SUPPORTS_STICK_ALT, 3, 4, height, session->TrackColours[SCHEME_SUPPORTS]);
1865                         break;
1866                 }
1867             }
1868             paint_util_set_segment_support_height(
1869                 session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF, 0);
1870             paint_util_set_general_support_height(session, height + 56, 0x20);
1871             break;
1872     }
1873 }
1874 
1875 /** rct2: 0x008A5B68 */
steeplechase_track_diag_25_deg_down(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)1876 static void steeplechase_track_diag_25_deg_down(
1877     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
1878     const TrackElement& trackElement)
1879 {
1880     switch (trackSequence)
1881     {
1882         case 0:
1883             if (trackElement.HasChain())
1884             {
1885                 switch (direction)
1886                 {
1887                     case 3:
1888                         PaintAddImageAsParentRotated(
1889                             session, direction, session->TrackColours[SCHEME_TRACK] | 28770, -16, -16, 32, 32, 3, height, -16,
1890                             -16, height);
1891                         break;
1892                 }
1893             }
1894             else
1895             {
1896                 switch (direction)
1897                 {
1898                     case 3:
1899                         PaintAddImageAsParentRotated(
1900                             session, direction, session->TrackColours[SCHEME_TRACK] | 28754, -16, -16, 32, 32, 3, height, -16,
1901                             -16, height);
1902                         break;
1903                 }
1904             }
1905             paint_util_set_segment_support_height(
1906                 session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF, 0);
1907             paint_util_set_general_support_height(session, height + 56, 0x20);
1908             break;
1909         case 1:
1910             if (trackElement.HasChain())
1911             {
1912                 switch (direction)
1913                 {
1914                     case 0:
1915                         PaintAddImageAsParentRotated(
1916                             session, direction, session->TrackColours[SCHEME_TRACK] | 28771, -16, -16, 32, 32, 3, height, -16,
1917                             -16, height);
1918                         break;
1919                 }
1920             }
1921             else
1922             {
1923                 switch (direction)
1924                 {
1925                     case 0:
1926                         PaintAddImageAsParentRotated(
1927                             session, direction, session->TrackColours[SCHEME_TRACK] | 28755, -16, -16, 32, 32, 3, height, -16,
1928                             -16, height);
1929                         break;
1930                 }
1931             }
1932             paint_util_set_segment_support_height(
1933                 session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF, 0);
1934             paint_util_set_general_support_height(session, height + 56, 0x20);
1935             break;
1936         case 2:
1937             if (trackElement.HasChain())
1938             {
1939                 switch (direction)
1940                 {
1941                     case 2:
1942                         PaintAddImageAsParentRotated(
1943                             session, direction, session->TrackColours[SCHEME_TRACK] | 28769, -16, -16, 32, 32, 3, height, -16,
1944                             -16, height);
1945                         break;
1946                 }
1947             }
1948             else
1949             {
1950                 switch (direction)
1951                 {
1952                     case 2:
1953                         PaintAddImageAsParentRotated(
1954                             session, direction, session->TrackColours[SCHEME_TRACK] | 28753, -16, -16, 32, 32, 3, height, -16,
1955                             -16, height);
1956                         break;
1957                 }
1958             }
1959             paint_util_set_segment_support_height(
1960                 session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF, 0);
1961             paint_util_set_general_support_height(session, height + 56, 0x20);
1962             break;
1963         case 3:
1964             if (trackElement.HasChain())
1965             {
1966                 switch (direction)
1967                 {
1968                     case 0:
1969                         metal_b_supports_paint_setup(
1970                             session, METAL_SUPPORTS_STICK, 1, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
1971                         break;
1972                     case 1:
1973                         PaintAddImageAsParentRotated(
1974                             session, direction, session->TrackColours[SCHEME_TRACK] | 28772, -16, -16, 32, 32, 3, height, -16,
1975                             -16, height);
1976                         metal_b_supports_paint_setup(
1977                             session, METAL_SUPPORTS_STICK_ALT, 0, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
1978                         break;
1979                     case 2:
1980                         metal_b_supports_paint_setup(
1981                             session, METAL_SUPPORTS_STICK, 2, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
1982                         break;
1983                     case 3:
1984                         metal_b_supports_paint_setup(
1985                             session, METAL_SUPPORTS_STICK_ALT, 3, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
1986                         break;
1987                 }
1988             }
1989             else
1990             {
1991                 switch (direction)
1992                 {
1993                     case 0:
1994                         metal_b_supports_paint_setup(
1995                             session, METAL_SUPPORTS_STICK, 1, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
1996                         break;
1997                     case 1:
1998                         PaintAddImageAsParentRotated(
1999                             session, direction, session->TrackColours[SCHEME_TRACK] | 28756, -16, -16, 32, 32, 3, height, -16,
2000                             -16, height);
2001                         metal_b_supports_paint_setup(
2002                             session, METAL_SUPPORTS_STICK_ALT, 0, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
2003                         break;
2004                     case 2:
2005                         metal_b_supports_paint_setup(
2006                             session, METAL_SUPPORTS_STICK, 2, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
2007                         break;
2008                     case 3:
2009                         metal_b_supports_paint_setup(
2010                             session, METAL_SUPPORTS_STICK_ALT, 3, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
2011                         break;
2012                 }
2013             }
2014             paint_util_set_segment_support_height(
2015                 session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF, 0);
2016             paint_util_set_general_support_height(session, height + 56, 0x20);
2017             break;
2018     }
2019 }
2020 
2021 /** rct2: 0x008A5B48 */
steeplechase_track_diag_flat_to_25_deg_down(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2022 static void steeplechase_track_diag_flat_to_25_deg_down(
2023     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2024     const TrackElement& trackElement)
2025 {
2026     switch (trackSequence)
2027     {
2028         case 0:
2029             if (trackElement.HasChain())
2030             {
2031                 switch (direction)
2032                 {
2033                     case 3:
2034                         PaintAddImageAsParentRotated(
2035                             session, direction, session->TrackColours[SCHEME_TRACK] | 28766, -16, -16, 32, 32, 3, height, -16,
2036                             -16, height);
2037                         break;
2038                 }
2039             }
2040             else
2041             {
2042                 switch (direction)
2043                 {
2044                     case 3:
2045                         PaintAddImageAsParentRotated(
2046                             session, direction, session->TrackColours[SCHEME_TRACK] | 28750, -16, -16, 32, 32, 3, height, -16,
2047                             -16, height);
2048                         break;
2049                 }
2050             }
2051             paint_util_set_segment_support_height(
2052                 session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF, 0);
2053             break;
2054         case 1:
2055             if (trackElement.HasChain())
2056             {
2057                 switch (direction)
2058                 {
2059                     case 0:
2060                         PaintAddImageAsParentRotated(
2061                             session, direction, session->TrackColours[SCHEME_TRACK] | 28767, -16, -16, 32, 32, 3, height, -16,
2062                             -16, height);
2063                         break;
2064                 }
2065             }
2066             else
2067             {
2068                 switch (direction)
2069                 {
2070                     case 0:
2071                         PaintAddImageAsParentRotated(
2072                             session, direction, session->TrackColours[SCHEME_TRACK] | 28751, -16, -16, 32, 32, 3, height, -16,
2073                             -16, height);
2074                         break;
2075                 }
2076             }
2077             paint_util_set_segment_support_height(
2078                 session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF, 0);
2079             break;
2080         case 2:
2081             if (trackElement.HasChain())
2082             {
2083                 switch (direction)
2084                 {
2085                     case 2:
2086                         PaintAddImageAsParentRotated(
2087                             session, direction, session->TrackColours[SCHEME_TRACK] | 28765, -16, -16, 32, 32, 3, height, -16,
2088                             -16, height);
2089                         break;
2090                 }
2091             }
2092             else
2093             {
2094                 switch (direction)
2095                 {
2096                     case 2:
2097                         PaintAddImageAsParentRotated(
2098                             session, direction, session->TrackColours[SCHEME_TRACK] | 28749, -16, -16, 32, 32, 3, height, -16,
2099                             -16, height);
2100                         break;
2101                 }
2102             }
2103             paint_util_set_segment_support_height(
2104                 session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF, 0);
2105             break;
2106         case 3:
2107             if (trackElement.HasChain())
2108             {
2109                 switch (direction)
2110                 {
2111                     case 0:
2112                         metal_b_supports_paint_setup(
2113                             session, METAL_SUPPORTS_STICK, 1, 4, height, session->TrackColours[SCHEME_SUPPORTS]);
2114                         break;
2115                     case 1:
2116                         PaintAddImageAsParentRotated(
2117                             session, direction, session->TrackColours[SCHEME_TRACK] | 28768, -16, -16, 32, 32, 3, height, -16,
2118                             -16, height);
2119                         metal_b_supports_paint_setup(
2120                             session, METAL_SUPPORTS_STICK_ALT, 0, 4, height, session->TrackColours[SCHEME_SUPPORTS]);
2121                         break;
2122                     case 2:
2123                         metal_b_supports_paint_setup(
2124                             session, METAL_SUPPORTS_STICK, 2, 4, height, session->TrackColours[SCHEME_SUPPORTS]);
2125                         break;
2126                     case 3:
2127                         metal_b_supports_paint_setup(
2128                             session, METAL_SUPPORTS_STICK_ALT, 3, 4, height, session->TrackColours[SCHEME_SUPPORTS]);
2129                         break;
2130                 }
2131             }
2132             else
2133             {
2134                 switch (direction)
2135                 {
2136                     case 0:
2137                         metal_b_supports_paint_setup(
2138                             session, METAL_SUPPORTS_STICK, 1, 4, height, session->TrackColours[SCHEME_SUPPORTS]);
2139                         break;
2140                     case 1:
2141                         PaintAddImageAsParentRotated(
2142                             session, direction, session->TrackColours[SCHEME_TRACK] | 28752, -16, -16, 32, 32, 3, height, -16,
2143                             -16, height);
2144                         metal_b_supports_paint_setup(
2145                             session, METAL_SUPPORTS_STICK_ALT, 0, 4, height, session->TrackColours[SCHEME_SUPPORTS]);
2146                         break;
2147                     case 2:
2148                         metal_b_supports_paint_setup(
2149                             session, METAL_SUPPORTS_STICK, 2, 4, height, session->TrackColours[SCHEME_SUPPORTS]);
2150                         break;
2151                     case 3:
2152                         metal_b_supports_paint_setup(
2153                             session, METAL_SUPPORTS_STICK_ALT, 3, 4, height, session->TrackColours[SCHEME_SUPPORTS]);
2154                         break;
2155                 }
2156             }
2157             paint_util_set_segment_support_height(
2158                 session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF, 0);
2159             break;
2160     }
2161 
2162     paint_util_set_general_support_height(session, height + 56, 0x20);
2163 }
2164 
2165 /** rct2: 0x008A5B58 */
steeplechase_track_diag_25_deg_down_to_flat(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2166 static void steeplechase_track_diag_25_deg_down_to_flat(
2167     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2168     const TrackElement& trackElement)
2169 {
2170     switch (trackSequence)
2171     {
2172         case 0:
2173             if (trackElement.HasChain())
2174             {
2175                 switch (direction)
2176                 {
2177                     case 3:
2178                         PaintAddImageAsParentRotated(
2179                             session, direction, session->TrackColours[SCHEME_TRACK] | 28762, -16, -16, 32, 32, 3, height, -16,
2180                             -16, height);
2181                         break;
2182                 }
2183             }
2184             else
2185             {
2186                 switch (direction)
2187                 {
2188                     case 3:
2189                         PaintAddImageAsParentRotated(
2190                             session, direction, session->TrackColours[SCHEME_TRACK] | 28746, -16, -16, 32, 32, 3, height, -16,
2191                             -16, height);
2192                         break;
2193                 }
2194             }
2195             paint_util_set_segment_support_height(
2196                 session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF, 0);
2197             paint_util_set_general_support_height(session, height + 48, 0x20);
2198             break;
2199         case 1:
2200             if (trackElement.HasChain())
2201             {
2202                 switch (direction)
2203                 {
2204                     case 0:
2205                         PaintAddImageAsParentRotated(
2206                             session, direction, session->TrackColours[SCHEME_TRACK] | 28763, -16, -16, 32, 32, 3, height, -16,
2207                             -16, height);
2208                         break;
2209                 }
2210             }
2211             else
2212             {
2213                 switch (direction)
2214                 {
2215                     case 0:
2216                         PaintAddImageAsParentRotated(
2217                             session, direction, session->TrackColours[SCHEME_TRACK] | 28747, -16, -16, 32, 32, 3, height, -16,
2218                             -16, height);
2219                         break;
2220                 }
2221             }
2222             paint_util_set_segment_support_height(
2223                 session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF, 0);
2224             paint_util_set_general_support_height(session, height + 48, 0x20);
2225             break;
2226         case 2:
2227             if (trackElement.HasChain())
2228             {
2229                 switch (direction)
2230                 {
2231                     case 2:
2232                         PaintAddImageAsParentRotated(
2233                             session, direction, session->TrackColours[SCHEME_TRACK] | 28761, -16, -16, 32, 32, 3, height, -16,
2234                             -16, height);
2235                         break;
2236                 }
2237             }
2238             else
2239             {
2240                 switch (direction)
2241                 {
2242                     case 2:
2243                         PaintAddImageAsParentRotated(
2244                             session, direction, session->TrackColours[SCHEME_TRACK] | 28745, -16, -16, 32, 32, 3, height, -16,
2245                             -16, height);
2246                         break;
2247                 }
2248             }
2249             paint_util_set_segment_support_height(
2250                 session, paint_util_rotate_segments(SEGMENT_C0 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_D4, direction), 0xFFFF, 0);
2251             paint_util_set_general_support_height(session, height + 48, 0x20);
2252             break;
2253         case 3:
2254             if (trackElement.HasChain())
2255             {
2256                 switch (direction)
2257                 {
2258                     case 0:
2259                         metal_b_supports_paint_setup(
2260                             session, METAL_SUPPORTS_STICK, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
2261                         break;
2262                     case 1:
2263                         PaintAddImageAsParentRotated(
2264                             session, direction, session->TrackColours[SCHEME_TRACK] | 28764, -16, -16, 32, 32, 3, height, -16,
2265                             -16, height);
2266                         metal_b_supports_paint_setup(
2267                             session, METAL_SUPPORTS_STICK_ALT, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
2268                         break;
2269                     case 2:
2270                         metal_b_supports_paint_setup(
2271                             session, METAL_SUPPORTS_STICK, 2, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
2272                         break;
2273                     case 3:
2274                         metal_b_supports_paint_setup(
2275                             session, METAL_SUPPORTS_STICK_ALT, 3, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
2276                         break;
2277                 }
2278             }
2279             else
2280             {
2281                 switch (direction)
2282                 {
2283                     case 0:
2284                         metal_b_supports_paint_setup(
2285                             session, METAL_SUPPORTS_STICK, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
2286                         break;
2287                     case 1:
2288                         PaintAddImageAsParentRotated(
2289                             session, direction, session->TrackColours[SCHEME_TRACK] | 28748, -16, -16, 32, 32, 3, height, -16,
2290                             -16, height);
2291                         metal_b_supports_paint_setup(
2292                             session, METAL_SUPPORTS_STICK_ALT, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
2293                         break;
2294                     case 2:
2295                         metal_b_supports_paint_setup(
2296                             session, METAL_SUPPORTS_STICK, 2, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
2297                         break;
2298                     case 3:
2299                         metal_b_supports_paint_setup(
2300                             session, METAL_SUPPORTS_STICK_ALT, 3, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
2301                         break;
2302                 }
2303             }
2304             paint_util_set_segment_support_height(
2305                 session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF, 0);
2306             paint_util_set_general_support_height(session, height + 48, 0x20);
2307             break;
2308     }
2309 }
2310 
2311 /** rct2: 0x008A5AB8 */
steeplechase_track_block_brakes(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2312 static void steeplechase_track_block_brakes(
2313     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2314     const TrackElement& trackElement)
2315 {
2316     switch (direction)
2317     {
2318         case 0:
2319         case 2:
2320             PaintAddImageAsParentRotated(
2321                 session, direction, session->TrackColours[SCHEME_TRACK] | 28635, 0, 6, 32, 20, 3, height);
2322             metal_a_supports_paint_setup(session, METAL_SUPPORTS_STICK, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
2323             break;
2324         case 1:
2325         case 3:
2326             PaintAddImageAsParentRotated(
2327                 session, direction, session->TrackColours[SCHEME_TRACK] | 28636, 0, 6, 32, 20, 3, height);
2328             metal_a_supports_paint_setup(
2329                 session, METAL_SUPPORTS_STICK_ALT, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
2330             break;
2331     }
2332     paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
2333     paint_util_set_segment_support_height(
2334         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0, direction), 0xFFFF, 0);
2335     paint_util_set_general_support_height(session, height + 32, 0x20);
2336 }
2337 
get_track_paint_function_steeplechase(int32_t trackType)2338 TRACK_PAINT_FUNCTION get_track_paint_function_steeplechase(int32_t trackType)
2339 {
2340     switch (trackType)
2341     {
2342         case TrackElemType::Flat:
2343             return steeplechase_track_flat;
2344         case TrackElemType::EndStation:
2345         case TrackElemType::BeginStation:
2346         case TrackElemType::MiddleStation:
2347             return steeplechase_track_station;
2348         case TrackElemType::Up25:
2349             return steeplechase_track_25_deg_up;
2350         case TrackElemType::FlatToUp25:
2351             return steeplechase_track_flat_to_25_deg_up;
2352         case TrackElemType::Up25ToFlat:
2353             return steeplechase_track_25_deg_up_to_flat;
2354         case TrackElemType::Down25:
2355             return steeplechase_track_25_deg_down;
2356         case TrackElemType::FlatToDown25:
2357             return steeplechase_track_flat_to_25_deg_down;
2358         case TrackElemType::Down25ToFlat:
2359             return steeplechase_track_25_deg_down_to_flat;
2360         case TrackElemType::LeftQuarterTurn5Tiles:
2361             return steeplechase_track_left_quarter_turn_5;
2362         case TrackElemType::RightQuarterTurn5Tiles:
2363             return steeplechase_track_right_quarter_turn_5;
2364         case TrackElemType::SBendLeft:
2365             return steeplechase_track_s_bend_left;
2366         case TrackElemType::SBendRight:
2367             return steeplechase_track_s_bend_right;
2368         case TrackElemType::LeftQuarterTurn3Tiles:
2369             return steeplechase_track_left_quarter_turn_3;
2370         case TrackElemType::RightQuarterTurn3Tiles:
2371             return steeplechase_track_right_quarter_turn_3;
2372         case TrackElemType::Brakes:
2373             return steeplechase_track_brakes;
2374         case TrackElemType::LeftEighthToDiag:
2375             return steeplechase_track_left_eighth_to_diag;
2376         case TrackElemType::RightEighthToDiag:
2377             return steeplechase_track_right_eighth_to_diag;
2378         case TrackElemType::LeftEighthToOrthogonal:
2379             return steeplechase_track_left_eighth_to_orthogonal;
2380         case TrackElemType::RightEighthToOrthogonal:
2381             return steeplechase_track_right_eighth_to_orthogonal;
2382         case TrackElemType::DiagFlat:
2383             return steeplechase_track_diag_flat;
2384         case TrackElemType::DiagUp25:
2385             return steeplechase_track_diag_25_deg_up;
2386         case TrackElemType::DiagFlatToUp25:
2387             return steeplechase_track_diag_flat_to_25_deg_up;
2388         case TrackElemType::DiagUp25ToFlat:
2389             return steeplechase_track_diag_25_deg_up_to_flat;
2390         case TrackElemType::DiagDown25:
2391             return steeplechase_track_diag_25_deg_down;
2392         case TrackElemType::DiagFlatToDown25:
2393             return steeplechase_track_diag_flat_to_25_deg_down;
2394         case TrackElemType::DiagDown25ToFlat:
2395             return steeplechase_track_diag_25_deg_down_to_flat;
2396         case TrackElemType::BlockBrakes:
2397             return steeplechase_track_block_brakes;
2398     }
2399     return nullptr;
2400 }
2401