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/Entity.h"
17 #include "../../world/Map.h"
18 #include "../RideData.h"
19 #include "../TrackData.h"
20 #include "../TrackPaint.h"
21 #include "../Vehicle.h"
22 #include "../VehiclePaint.h"
23 
24 #ifndef NO_VEHICLES
25 /**
26  *
27  *  rct2: 0x006D4453
28  */
vehicle_visual_reverser(paint_session * session,int32_t x,int32_t imageDirection,int32_t y,int32_t z,const Vehicle * vehicle,const rct_ride_entry_vehicle * vehicleEntry)29 void vehicle_visual_reverser(
30     paint_session* session, int32_t x, int32_t imageDirection, int32_t y, int32_t z, const Vehicle* vehicle,
31     const rct_ride_entry_vehicle* vehicleEntry)
32 {
33     Vehicle* v1 = GetEntity<Vehicle>(vehicle->prev_vehicle_on_ride);
34     Vehicle* v2 = GetEntity<Vehicle>(vehicle->next_vehicle_on_ride);
35     if (v1 == nullptr || v2 == nullptr)
36     {
37         return;
38     }
39     x = (v1->x + v2->x) / 2;
40     y = (v1->y + v2->y) / 2;
41     z = (v1->z + v2->z) / 2;
42     session->SpritePosition.x = x;
43     session->SpritePosition.y = y;
44     vehicle_visual_default(session, imageDirection, z, vehicle, vehicleEntry);
45 }
46 #endif
47 
48 /** rct2: 0x0086E65C */
reverser_rc_track_flat(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)49 static void reverser_rc_track_flat(
50     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
51     const TrackElement& trackElement)
52 {
53     if (trackElement.HasChain())
54     {
55         switch (direction)
56         {
57             case 0:
58             case 2:
59                 PaintAddImageAsParentRotated(
60                     session, direction, session->TrackColours[SCHEME_TRACK] | 21520, 0, 0, 32, 27, 2, height, 0, 2, height);
61                 wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
62                 break;
63             case 1:
64             case 3:
65                 PaintAddImageAsParentRotated(
66                     session, direction, session->TrackColours[SCHEME_TRACK] | 21521, 0, 0, 32, 27, 2, height, 0, 2, height);
67                 wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
68                 break;
69         }
70     }
71     else
72     {
73         switch (direction)
74         {
75             case 0:
76             case 2:
77                 PaintAddImageAsParentRotated(
78                     session, direction, session->TrackColours[SCHEME_TRACK] | 21504, 0, 0, 32, 27, 2, height, 0, 2, height);
79                 wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
80                 break;
81             case 1:
82             case 3:
83                 PaintAddImageAsParentRotated(
84                     session, direction, session->TrackColours[SCHEME_TRACK] | 21505, 0, 0, 32, 27, 2, height, 0, 2, height);
85                 wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
86                 break;
87         }
88     }
89     paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_SQUARE_FLAT);
90     paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
91     paint_util_set_general_support_height(session, height + 32, 0x20);
92 }
93 
reverser_rc_track_station(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)94 static void reverser_rc_track_station(
95     paint_session* session, const Ride* ride, [[maybe_unused]] uint8_t trackSequence, uint8_t direction, int32_t height,
96     const TrackElement& trackElement)
97 {
98     static constexpr const uint32_t imageIds[4][3] = {
99         { 21506, SPR_STATION_BASE_A_SW_NE },
100         { 21507, SPR_STATION_BASE_A_NW_SE },
101         { 21506, SPR_STATION_BASE_A_SW_NE },
102         { 21507, SPR_STATION_BASE_A_NW_SE },
103     };
104 
105     PaintAddImageAsParentRotated(
106         session, direction, imageIds[direction][1] | session->TrackColours[SCHEME_MISC], 0, 0, 32, 27, 2, height, 0, 2, height);
107     PaintAddImageAsChildRotated(
108         session, direction, imageIds[direction][0] | session->TrackColours[SCHEME_TRACK], 0, 0, 32, 27, 2, height, 0, 2,
109         height);
110     wooden_a_supports_paint_setup(session, direction & 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
111     track_paint_util_draw_station_2(session, ride, direction, height, trackElement, 9, 11);
112     paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_SQUARE_FLAT);
113     paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
114     paint_util_set_general_support_height(session, height + 32, 0x20);
115 }
116 
117 /** rct2: 0x0086E66C */
reverser_rc_track_25_deg_up(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)118 static void reverser_rc_track_25_deg_up(
119     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
120     const TrackElement& trackElement)
121 {
122     if (trackElement.HasChain())
123     {
124         switch (direction)
125         {
126             case 0:
127                 PaintAddImageAsParentRotated(
128                     session, direction, session->TrackColours[SCHEME_TRACK] | 21530, 0, 0, 32, 27, 2, height, 0, 2, height);
129                 wooden_a_supports_paint_setup(session, 0, 9, height, session->TrackColours[SCHEME_SUPPORTS]);
130                 break;
131             case 1:
132                 PaintAddImageAsParentRotated(
133                     session, direction, session->TrackColours[SCHEME_TRACK] | 21531, 0, 0, 32, 27, 2, height, 0, 2, height);
134                 wooden_a_supports_paint_setup(session, 1, 10, height, session->TrackColours[SCHEME_SUPPORTS]);
135                 break;
136             case 2:
137                 PaintAddImageAsParentRotated(
138                     session, direction, session->TrackColours[SCHEME_TRACK] | 21532, 0, 0, 32, 27, 2, height, 0, 2, height);
139                 wooden_a_supports_paint_setup(session, 0, 11, height, session->TrackColours[SCHEME_SUPPORTS]);
140                 break;
141             case 3:
142                 PaintAddImageAsParentRotated(
143                     session, direction, session->TrackColours[SCHEME_TRACK] | 21533, 0, 0, 32, 27, 2, height, 0, 2, height);
144                 wooden_a_supports_paint_setup(session, 1, 12, height, session->TrackColours[SCHEME_SUPPORTS]);
145                 break;
146         }
147     }
148     else
149     {
150         switch (direction)
151         {
152             case 0:
153                 PaintAddImageAsParentRotated(
154                     session, direction, session->TrackColours[SCHEME_TRACK] | 21516, 0, 0, 32, 27, 2, height, 0, 2, height);
155                 wooden_a_supports_paint_setup(session, 0, 9, height, session->TrackColours[SCHEME_SUPPORTS]);
156                 break;
157             case 1:
158                 PaintAddImageAsParentRotated(
159                     session, direction, session->TrackColours[SCHEME_TRACK] | 21517, 0, 0, 32, 27, 2, height, 0, 2, height);
160                 wooden_a_supports_paint_setup(session, 1, 10, height, session->TrackColours[SCHEME_SUPPORTS]);
161                 break;
162             case 2:
163                 PaintAddImageAsParentRotated(
164                     session, direction, session->TrackColours[SCHEME_TRACK] | 21518, 0, 0, 32, 27, 2, height, 0, 2, height);
165                 wooden_a_supports_paint_setup(session, 0, 11, height, session->TrackColours[SCHEME_SUPPORTS]);
166                 break;
167             case 3:
168                 PaintAddImageAsParentRotated(
169                     session, direction, session->TrackColours[SCHEME_TRACK] | 21519, 0, 0, 32, 27, 2, height, 0, 2, height);
170                 wooden_a_supports_paint_setup(session, 1, 12, height, session->TrackColours[SCHEME_SUPPORTS]);
171                 break;
172         }
173     }
174     if (direction == 0 || direction == 3)
175     {
176         paint_util_push_tunnel_rotated(session, direction, height - 8, TUNNEL_SQUARE_7);
177     }
178     else
179     {
180         paint_util_push_tunnel_rotated(session, direction, height + 8, TUNNEL_SQUARE_8);
181     }
182     paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
183     paint_util_set_general_support_height(session, height + 56, 0x20);
184 }
185 
186 /** rct2: 0x0086E67C */
reverser_rc_track_flat_to_25_deg_up(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)187 static void reverser_rc_track_flat_to_25_deg_up(
188     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
189     const TrackElement& trackElement)
190 {
191     if (trackElement.HasChain())
192     {
193         switch (direction)
194         {
195             case 0:
196                 PaintAddImageAsParentRotated(
197                     session, direction, session->TrackColours[SCHEME_TRACK] | 21522, 0, 0, 32, 27, 2, height, 0, 2, height);
198                 wooden_a_supports_paint_setup(session, 0, 1, height, session->TrackColours[SCHEME_SUPPORTS]);
199                 break;
200             case 1:
201                 PaintAddImageAsParentRotated(
202                     session, direction, session->TrackColours[SCHEME_TRACK] | 21523, 0, 0, 32, 27, 2, height, 0, 2, height);
203                 wooden_a_supports_paint_setup(session, 1, 2, height, session->TrackColours[SCHEME_SUPPORTS]);
204                 break;
205             case 2:
206                 PaintAddImageAsParentRotated(
207                     session, direction, session->TrackColours[SCHEME_TRACK] | 21524, 0, 0, 32, 27, 2, height, 0, 2, height);
208                 wooden_a_supports_paint_setup(session, 0, 3, height, session->TrackColours[SCHEME_SUPPORTS]);
209                 break;
210             case 3:
211                 PaintAddImageAsParentRotated(
212                     session, direction, session->TrackColours[SCHEME_TRACK] | 21525, 0, 0, 32, 27, 2, height, 0, 2, height);
213                 wooden_a_supports_paint_setup(session, 1, 4, height, session->TrackColours[SCHEME_SUPPORTS]);
214                 break;
215         }
216     }
217     else
218     {
219         switch (direction)
220         {
221             case 0:
222                 PaintAddImageAsParentRotated(
223                     session, direction, session->TrackColours[SCHEME_TRACK] | 21508, 0, 0, 32, 27, 2, height, 0, 2, height);
224                 wooden_a_supports_paint_setup(session, 0, 1, height, session->TrackColours[SCHEME_SUPPORTS]);
225                 break;
226             case 1:
227                 PaintAddImageAsParentRotated(
228                     session, direction, session->TrackColours[SCHEME_TRACK] | 21509, 0, 0, 32, 27, 2, height, 0, 2, height);
229                 wooden_a_supports_paint_setup(session, 1, 2, height, session->TrackColours[SCHEME_SUPPORTS]);
230                 break;
231             case 2:
232                 PaintAddImageAsParentRotated(
233                     session, direction, session->TrackColours[SCHEME_TRACK] | 21510, 0, 0, 32, 27, 2, height, 0, 2, height);
234                 wooden_a_supports_paint_setup(session, 0, 3, height, session->TrackColours[SCHEME_SUPPORTS]);
235                 break;
236             case 3:
237                 PaintAddImageAsParentRotated(
238                     session, direction, session->TrackColours[SCHEME_TRACK] | 21511, 0, 0, 32, 27, 2, height, 0, 2, height);
239                 wooden_a_supports_paint_setup(session, 1, 4, height, session->TrackColours[SCHEME_SUPPORTS]);
240                 break;
241         }
242     }
243     if (direction == 0 || direction == 3)
244     {
245         paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_SQUARE_FLAT);
246     }
247     else
248     {
249         paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_SQUARE_8);
250     }
251     paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
252     paint_util_set_general_support_height(session, height + 48, 0x20);
253 }
254 
255 /** rct2: 0x0086E68C */
reverser_rc_track_25_deg_up_to_flat(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)256 static void reverser_rc_track_25_deg_up_to_flat(
257     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
258     const TrackElement& trackElement)
259 {
260     if (trackElement.HasChain())
261     {
262         switch (direction)
263         {
264             case 0:
265                 PaintAddImageAsParentRotated(
266                     session, direction, session->TrackColours[SCHEME_TRACK] | 21526, 0, 0, 32, 27, 2, height, 0, 2, height);
267                 wooden_a_supports_paint_setup(session, 0, 5, height, session->TrackColours[SCHEME_SUPPORTS]);
268                 break;
269             case 1:
270                 PaintAddImageAsParentRotated(
271                     session, direction, session->TrackColours[SCHEME_TRACK] | 21527, 0, 0, 32, 27, 2, height, 0, 2, height);
272                 wooden_a_supports_paint_setup(session, 1, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
273                 break;
274             case 2:
275                 PaintAddImageAsParentRotated(
276                     session, direction, session->TrackColours[SCHEME_TRACK] | 21528, 0, 0, 32, 27, 2, height, 0, 2, height);
277                 wooden_a_supports_paint_setup(session, 0, 7, height, session->TrackColours[SCHEME_SUPPORTS]);
278                 break;
279             case 3:
280                 PaintAddImageAsParentRotated(
281                     session, direction, session->TrackColours[SCHEME_TRACK] | 21529, 0, 0, 32, 27, 2, height, 0, 2, height);
282                 wooden_a_supports_paint_setup(session, 1, 8, height, session->TrackColours[SCHEME_SUPPORTS]);
283                 break;
284         }
285     }
286     else
287     {
288         switch (direction)
289         {
290             case 0:
291                 PaintAddImageAsParentRotated(
292                     session, direction, session->TrackColours[SCHEME_TRACK] | 21512, 0, 0, 32, 27, 2, height, 0, 2, height);
293                 wooden_a_supports_paint_setup(session, 0, 5, height, session->TrackColours[SCHEME_SUPPORTS]);
294                 break;
295             case 1:
296                 PaintAddImageAsParentRotated(
297                     session, direction, session->TrackColours[SCHEME_TRACK] | 21513, 0, 0, 32, 27, 2, height, 0, 2, height);
298                 wooden_a_supports_paint_setup(session, 1, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
299                 break;
300             case 2:
301                 PaintAddImageAsParentRotated(
302                     session, direction, session->TrackColours[SCHEME_TRACK] | 21514, 0, 0, 32, 27, 2, height, 0, 2, height);
303                 wooden_a_supports_paint_setup(session, 0, 7, height, session->TrackColours[SCHEME_SUPPORTS]);
304                 break;
305             case 3:
306                 PaintAddImageAsParentRotated(
307                     session, direction, session->TrackColours[SCHEME_TRACK] | 21515, 0, 0, 32, 27, 2, height, 0, 2, height);
308                 wooden_a_supports_paint_setup(session, 1, 8, height, session->TrackColours[SCHEME_SUPPORTS]);
309                 break;
310         }
311     }
312     if (direction == 0 || direction == 3)
313     {
314         paint_util_push_tunnel_rotated(session, direction, height - 8, TUNNEL_SQUARE_FLAT);
315     }
316     else
317     {
318         paint_util_push_tunnel_rotated(session, direction, height + 8, TUNNEL_14);
319     }
320     paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
321     paint_util_set_general_support_height(session, height + 40, 0x20);
322 }
323 
324 /** rct2: 0x0086E69C */
reverser_rc_track_25_deg_down(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)325 static void reverser_rc_track_25_deg_down(
326     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
327     const TrackElement& trackElement)
328 {
329     reverser_rc_track_25_deg_up(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
330 }
331 
332 /** rct2: 0x0086E6AC */
reverser_rc_track_flat_to_25_deg_down(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)333 static void reverser_rc_track_flat_to_25_deg_down(
334     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
335     const TrackElement& trackElement)
336 {
337     reverser_rc_track_25_deg_up_to_flat(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
338 }
339 
340 /** rct2: 0x0086E6BC */
reverser_rc_track_25_deg_down_to_flat(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)341 static void reverser_rc_track_25_deg_down_to_flat(
342     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
343     const TrackElement& trackElement)
344 {
345     reverser_rc_track_flat_to_25_deg_up(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
346 }
347 
348 /** rct2: 0x0086E6CC */
reverser_rc_track_left_quarter_turn_5(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)349 static void reverser_rc_track_left_quarter_turn_5(
350     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
351     const TrackElement& trackElement)
352 {
353     switch (trackSequence)
354     {
355         case 0:
356             switch (direction)
357             {
358                 case 0:
359                     PaintAddImageAsParentRotated(
360                         session, direction, session->TrackColours[SCHEME_TRACK] | 21543, 0, 2, 32, 27, 2, height);
361                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
362                     break;
363                 case 1:
364                     PaintAddImageAsParentRotated(
365                         session, direction, session->TrackColours[SCHEME_TRACK] | 21548, 0, 2, 32, 27, 2, height);
366                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
367                     break;
368                 case 2:
369                     PaintAddImageAsParentRotated(
370                         session, direction, session->TrackColours[SCHEME_TRACK] | 21553, 0, 2, 32, 32, 2, height);
371                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
372                     break;
373                 case 3:
374                     PaintAddImageAsParentRotated(
375                         session, direction, session->TrackColours[SCHEME_TRACK] | 21538, 0, 2, 32, 32, 2, height);
376                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
377                     break;
378             }
379             if (direction == 0 || direction == 3)
380             {
381                 paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_SQUARE_FLAT);
382             }
383             paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
384             paint_util_set_general_support_height(session, height + 32, 0x20);
385             break;
386         case 1:
387             paint_util_set_segment_support_height(
388                 session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF, 0);
389             paint_util_set_general_support_height(session, height + 32, 0x20);
390             break;
391         case 2:
392             switch (direction)
393             {
394                 case 0:
395                     PaintAddImageAsParentRotated(
396                         session, direction, session->TrackColours[SCHEME_TRACK] | 21542, 0, 0, 32, 16, 2, height);
397                     wooden_a_supports_paint_setup(session, 5, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
398                     break;
399                 case 1:
400                     PaintAddImageAsParentRotated(
401                         session, direction, session->TrackColours[SCHEME_TRACK] | 21547, 0, 0, 32, 16, 2, height);
402                     wooden_a_supports_paint_setup(session, 2, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
403                     break;
404                 case 2:
405                     PaintAddImageAsParentRotated(
406                         session, direction, session->TrackColours[SCHEME_TRACK] | 21552, 0, 16, 32, 16, 2, height);
407                     wooden_a_supports_paint_setup(session, 3, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
408                     break;
409                 case 3:
410                     PaintAddImageAsParentRotated(
411                         session, direction, session->TrackColours[SCHEME_TRACK] | 21537, 0, 16, 32, 16, 2, height);
412                     wooden_a_supports_paint_setup(session, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
413                     break;
414             }
415             paint_util_set_segment_support_height(
416                 session,
417                 paint_util_rotate_segments(
418                     SEGMENT_B4 | SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0, direction),
419                 0xFFFF, 0);
420             paint_util_set_general_support_height(session, height + 32, 0x20);
421             break;
422         case 3:
423             switch (direction)
424             {
425                 case 0:
426                     PaintAddImageAsParentRotated(
427                         session, direction, session->TrackColours[SCHEME_TRACK] | 21541, 0, 16, 16, 16, 2, height);
428                     wooden_a_supports_paint_setup(session, 3, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
429                     break;
430                 case 1:
431                     PaintAddImageAsParentRotated(
432                         session, direction, session->TrackColours[SCHEME_TRACK] | 21546, 16, 16, 16, 16, 2, height);
433                     wooden_a_supports_paint_setup(session, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
434                     break;
435                 case 2:
436                     PaintAddImageAsParentRotated(
437                         session, direction, session->TrackColours[SCHEME_TRACK] | 21551, 16, 0, 16, 16, 2, height);
438                     wooden_a_supports_paint_setup(session, 5, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
439                     break;
440                 case 3:
441                     PaintAddImageAsParentRotated(
442                         session, direction, session->TrackColours[SCHEME_TRACK] | 21536, 0, 0, 16, 16, 2, height);
443                     wooden_a_supports_paint_setup(session, 2, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
444                     break;
445             }
446             paint_util_set_segment_support_height(
447                 session,
448                 paint_util_rotate_segments(
449                     SEGMENT_B4 | SEGMENT_BC | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4,
450                     direction),
451                 0xFFFF, 0);
452             paint_util_set_general_support_height(session, height + 32, 0x20);
453             break;
454         case 4:
455             paint_util_set_segment_support_height(
456                 session, paint_util_rotate_segments(SEGMENT_BC | SEGMENT_CC | SEGMENT_D4, direction), 0xFFFF, 0);
457             paint_util_set_general_support_height(session, height + 32, 0x20);
458             break;
459         case 5:
460             switch (direction)
461             {
462                 case 0:
463                     PaintAddImageAsParentRotated(
464                         session, direction, session->TrackColours[SCHEME_TRACK] | 21540, 16, 0, 16, 34, 2, height);
465                     wooden_a_supports_paint_setup(session, 5, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
466                     break;
467                 case 1:
468                     PaintAddImageAsParentRotated(
469                         session, direction, session->TrackColours[SCHEME_TRACK] | 21545, 0, 0, 16, 32, 2, height);
470                     wooden_a_supports_paint_setup(session, 2, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
471                     break;
472                 case 2:
473                     PaintAddImageAsParentRotated(
474                         session, direction, session->TrackColours[SCHEME_TRACK] | 21550, 0, 0, 16, 32, 2, height);
475                     wooden_a_supports_paint_setup(session, 3, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
476                     break;
477                 case 3:
478                     PaintAddImageAsParentRotated(
479                         session, direction, session->TrackColours[SCHEME_TRACK] | 21535, 16, 0, 16, 32, 2, height);
480                     wooden_a_supports_paint_setup(session, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
481                     break;
482             }
483             paint_util_set_segment_support_height(
484                 session,
485                 paint_util_rotate_segments(
486                     SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0 | SEGMENT_D4, direction),
487                 0xFFFF, 0);
488             paint_util_set_general_support_height(session, height + 32, 0x20);
489             break;
490         case 6:
491             switch (direction)
492             {
493                 case 0:
494                     PaintAddImageAsParentRotated(
495                         session, direction, session->TrackColours[SCHEME_TRACK] | 21539, 2, 0, 32, 32, 2, height);
496                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
497                     break;
498                 case 1:
499                     PaintAddImageAsParentRotated(
500                         session, direction, session->TrackColours[SCHEME_TRACK] | 21544, 2, 0, 27, 32, 2, height);
501                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
502                     break;
503                 case 2:
504                     PaintAddImageAsParentRotated(
505                         session, direction, session->TrackColours[SCHEME_TRACK] | 21549, 2, 0, 27, 32, 2, height);
506                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
507                     break;
508                 case 3:
509                     PaintAddImageAsParentRotated(
510                         session, direction, session->TrackColours[SCHEME_TRACK] | 21534, 2, 0, 32, 32, 2, height);
511                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
512                     break;
513             }
514             switch (direction)
515             {
516                 case 2:
517                     paint_util_push_tunnel_right(session, height, TUNNEL_SQUARE_FLAT);
518                     break;
519                 case 3:
520                     paint_util_push_tunnel_left(session, height, TUNNEL_SQUARE_FLAT);
521                     break;
522             }
523             paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
524             paint_util_set_general_support_height(session, height + 32, 0x20);
525             break;
526     }
527 }
528 
529 /** rct2: 0x0086E6DC */
reverser_rc_track_right_quarter_turn_5(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)530 static void reverser_rc_track_right_quarter_turn_5(
531     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
532     const TrackElement& trackElement)
533 {
534     trackSequence = mapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[trackSequence];
535     reverser_rc_track_left_quarter_turn_5(session, ride, trackSequence, (direction - 1) & 3, height, trackElement);
536 }
537 
538 /** rct2: 0x0086E6EC */
reverser_rc_track_s_bend_left(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)539 static void reverser_rc_track_s_bend_left(
540     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
541     const TrackElement& trackElement)
542 {
543     switch (trackSequence)
544     {
545         case 0:
546             switch (direction)
547             {
548                 case 0:
549                     PaintAddImageAsParentRotated(
550                         session, direction, session->TrackColours[SCHEME_TRACK] | 21566, 0, 0, 32, 27, 2, height, 0, 2, height);
551                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
552                     break;
553                 case 1:
554                     PaintAddImageAsParentRotated(
555                         session, direction, session->TrackColours[SCHEME_TRACK] | 21570, 0, 0, 32, 27, 2, height, 0, 2, height);
556                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
557                     break;
558                 case 2:
559                     PaintAddImageAsParentRotated(
560                         session, direction, session->TrackColours[SCHEME_TRACK] | 21569, 0, 0, 32, 27, 2, height, 0, 2, height);
561                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
562                     break;
563                 case 3:
564                     PaintAddImageAsParentRotated(
565                         session, direction, session->TrackColours[SCHEME_TRACK] | 21573, 0, 0, 32, 27, 2, height, 0, 2, height);
566                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
567                     break;
568             }
569             if (direction == 0 || direction == 3)
570             {
571                 paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_SQUARE_FLAT);
572             }
573             paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
574             paint_util_set_general_support_height(session, height + 32, 0x20);
575             break;
576         case 1:
577             switch (direction)
578             {
579                 case 0:
580                     PaintAddImageAsParentRotated(
581                         session, direction, session->TrackColours[SCHEME_TRACK] | 21567, 0, 0, 32, 26, 2, height, 0, 0, height);
582                     wooden_a_supports_paint_setup(session, 5, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
583                     break;
584                 case 1:
585                     PaintAddImageAsParentRotated(
586                         session, direction, session->TrackColours[SCHEME_TRACK] | 21571, 0, 0, 32, 26, 2, height, 0, 0, height);
587                     wooden_a_supports_paint_setup(session, 2, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
588                     break;
589                 case 2:
590                     PaintAddImageAsParentRotated(
591                         session, direction, session->TrackColours[SCHEME_TRACK] | 21568, 0, 0, 32, 26, 2, height, 0, 6, height);
592                     wooden_a_supports_paint_setup(session, 3, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
593                     break;
594                 case 3:
595                     PaintAddImageAsParentRotated(
596                         session, direction, session->TrackColours[SCHEME_TRACK] | 21572, 0, 0, 32, 26, 2, height, 0, 6, height);
597                     wooden_a_supports_paint_setup(session, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
598                     break;
599             }
600             paint_util_set_segment_support_height(
601                 session,
602                 paint_util_rotate_segments(
603                     SEGMENT_B4 | SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0, direction),
604                 0xFFFF, 0);
605             paint_util_set_general_support_height(session, height + 32, 0x20);
606             break;
607         case 2:
608             switch (direction)
609             {
610                 case 0:
611                     PaintAddImageAsParentRotated(
612                         session, direction, session->TrackColours[SCHEME_TRACK] | 21568, 0, 0, 32, 26, 2, height, 0, 6, height);
613                     wooden_a_supports_paint_setup(session, 3, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
614                     break;
615                 case 1:
616                     PaintAddImageAsParentRotated(
617                         session, direction, session->TrackColours[SCHEME_TRACK] | 21572, 0, 0, 32, 26, 2, height, 0, 6, height);
618                     wooden_a_supports_paint_setup(session, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
619                     break;
620                 case 2:
621                     PaintAddImageAsParentRotated(
622                         session, direction, session->TrackColours[SCHEME_TRACK] | 21567, 0, 0, 32, 26, 2, height, 0, 0, height);
623                     wooden_a_supports_paint_setup(session, 5, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
624                     break;
625                 case 3:
626                     PaintAddImageAsParentRotated(
627                         session, direction, session->TrackColours[SCHEME_TRACK] | 21571, 0, 0, 32, 26, 2, height, 0, 0, height);
628                     wooden_a_supports_paint_setup(session, 2, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
629                     break;
630             }
631             paint_util_set_segment_support_height(
632                 session,
633                 paint_util_rotate_segments(
634                     SEGMENT_BC | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4, direction),
635                 0xFFFF, 0);
636             paint_util_set_general_support_height(session, height + 32, 0x20);
637             break;
638         case 3:
639             switch (direction)
640             {
641                 case 0:
642                     PaintAddImageAsParentRotated(
643                         session, direction, session->TrackColours[SCHEME_TRACK] | 21569, 0, 0, 32, 27, 2, height, 0, 2, height);
644                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
645                     break;
646                 case 1:
647                     PaintAddImageAsParentRotated(
648                         session, direction, session->TrackColours[SCHEME_TRACK] | 21573, 0, 0, 32, 27, 2, height, 0, 2, height);
649                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
650                     break;
651                 case 2:
652                     PaintAddImageAsParentRotated(
653                         session, direction, session->TrackColours[SCHEME_TRACK] | 21566, 0, 0, 32, 27, 2, height, 0, 2, height);
654                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
655                     break;
656                 case 3:
657                     PaintAddImageAsParentRotated(
658                         session, direction, session->TrackColours[SCHEME_TRACK] | 21570, 0, 0, 32, 27, 2, height, 0, 2, height);
659                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
660                     break;
661             }
662             switch (direction)
663             {
664                 case 1:
665                     paint_util_push_tunnel_right(session, height, TUNNEL_SQUARE_FLAT);
666                     break;
667                 case 2:
668                     paint_util_push_tunnel_left(session, height, TUNNEL_SQUARE_FLAT);
669                     break;
670             }
671             paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
672             paint_util_set_general_support_height(session, height + 32, 0x20);
673             break;
674     }
675 }
676 
677 /** rct2: 0x0086E6FC */
reverser_rc_track_s_bend_right(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)678 static void reverser_rc_track_s_bend_right(
679     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
680     const TrackElement& trackElement)
681 {
682     switch (trackSequence)
683     {
684         case 0:
685             switch (direction)
686             {
687                 case 0:
688                     PaintAddImageAsParentRotated(
689                         session, direction, session->TrackColours[SCHEME_TRACK] | 21574, 0, 0, 32, 27, 2, height, 0, 2, height);
690                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
691                     break;
692                 case 1:
693                     PaintAddImageAsParentRotated(
694                         session, direction, session->TrackColours[SCHEME_TRACK] | 21578, 0, 0, 32, 27, 2, height, 0, 2, height);
695                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
696                     break;
697                 case 2:
698                     PaintAddImageAsParentRotated(
699                         session, direction, session->TrackColours[SCHEME_TRACK] | 21577, 0, 0, 32, 27, 2, height, 0, 2, height);
700                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
701                     break;
702                 case 3:
703                     PaintAddImageAsParentRotated(
704                         session, direction, session->TrackColours[SCHEME_TRACK] | 21581, 0, 0, 32, 27, 2, height, 0, 2, height);
705                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
706                     break;
707             }
708             if (direction == 0 || direction == 3)
709             {
710                 paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_SQUARE_FLAT);
711             }
712             paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
713             paint_util_set_general_support_height(session, height + 32, 0x20);
714             break;
715         case 1:
716             switch (direction)
717             {
718                 case 0:
719                     PaintAddImageAsParentRotated(
720                         session, direction, session->TrackColours[SCHEME_TRACK] | 21575, 0, 0, 32, 26, 2, height, 0, 6, height);
721                     wooden_a_supports_paint_setup(session, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
722                     break;
723                 case 1:
724                     PaintAddImageAsParentRotated(
725                         session, direction, session->TrackColours[SCHEME_TRACK] | 21579, 0, 0, 32, 26, 2, height, 0, 6, height);
726                     wooden_a_supports_paint_setup(session, 5, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
727                     break;
728                 case 2:
729                     PaintAddImageAsParentRotated(
730                         session, direction, session->TrackColours[SCHEME_TRACK] | 21576, 0, 0, 32, 26, 2, height, 0, 0, height);
731                     wooden_a_supports_paint_setup(session, 2, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
732                     break;
733                 case 3:
734                     PaintAddImageAsParentRotated(
735                         session, direction, session->TrackColours[SCHEME_TRACK] | 21580, 0, 0, 32, 26, 2, height, 0, 0, height);
736                     wooden_a_supports_paint_setup(session, 3, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
737                     break;
738             }
739             paint_util_set_segment_support_height(
740                 session,
741                 paint_util_rotate_segments(
742                     SEGMENT_BC | SEGMENT_C0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_D0 | SEGMENT_D4, direction),
743                 0xFFFF, 0);
744             paint_util_set_general_support_height(session, height + 32, 0x20);
745             break;
746         case 2:
747             switch (direction)
748             {
749                 case 0:
750                     PaintAddImageAsParentRotated(
751                         session, direction, session->TrackColours[SCHEME_TRACK] | 21576, 0, 0, 32, 26, 2, height, 0, 0, height);
752                     wooden_a_supports_paint_setup(session, 2, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
753                     break;
754                 case 1:
755                     PaintAddImageAsParentRotated(
756                         session, direction, session->TrackColours[SCHEME_TRACK] | 21580, 0, 0, 32, 26, 2, height, 0, 0, height);
757                     wooden_a_supports_paint_setup(session, 3, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
758                     break;
759                 case 2:
760                     PaintAddImageAsParentRotated(
761                         session, direction, session->TrackColours[SCHEME_TRACK] | 21575, 0, 0, 32, 26, 2, height, 0, 6, height);
762                     wooden_a_supports_paint_setup(session, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
763                     break;
764                 case 3:
765                     PaintAddImageAsParentRotated(
766                         session, direction, session->TrackColours[SCHEME_TRACK] | 21579, 0, 0, 32, 26, 2, height, 0, 6, height);
767                     wooden_a_supports_paint_setup(session, 5, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
768                     break;
769             }
770             paint_util_set_segment_support_height(
771                 session,
772                 paint_util_rotate_segments(
773                     SEGMENT_B4 | SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_D0, direction),
774                 0xFFFF, 0);
775             paint_util_set_general_support_height(session, height + 32, 0x20);
776             break;
777         case 3:
778             switch (direction)
779             {
780                 case 0:
781                     PaintAddImageAsParentRotated(
782                         session, direction, session->TrackColours[SCHEME_TRACK] | 21577, 0, 0, 32, 27, 2, height, 0, 2, height);
783                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
784                     break;
785                 case 1:
786                     PaintAddImageAsParentRotated(
787                         session, direction, session->TrackColours[SCHEME_TRACK] | 21581, 0, 0, 32, 27, 2, height, 0, 2, height);
788                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
789                     break;
790                 case 2:
791                     PaintAddImageAsParentRotated(
792                         session, direction, session->TrackColours[SCHEME_TRACK] | 21574, 0, 0, 32, 27, 2, height, 0, 2, height);
793                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
794                     break;
795                 case 3:
796                     PaintAddImageAsParentRotated(
797                         session, direction, session->TrackColours[SCHEME_TRACK] | 21578, 0, 0, 32, 27, 2, height, 0, 2, height);
798                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
799                     break;
800             }
801             switch (direction)
802             {
803                 case 1:
804                     paint_util_push_tunnel_right(session, height, TUNNEL_SQUARE_FLAT);
805                     break;
806                 case 2:
807                     paint_util_push_tunnel_left(session, height, TUNNEL_SQUARE_FLAT);
808                     break;
809             }
810             paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
811             paint_util_set_general_support_height(session, height + 32, 0x20);
812             break;
813     }
814 }
815 
816 /** rct2: 0x0086E73C */
reverser_rc_track_left_quarter_turn_3(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)817 static void reverser_rc_track_left_quarter_turn_3(
818     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
819     const TrackElement& trackElement)
820 {
821     switch (trackSequence)
822     {
823         case 0:
824             switch (direction)
825             {
826                 case 0:
827                     PaintAddImageAsParentRotated(
828                         session, direction, session->TrackColours[SCHEME_TRACK] | 21559, 0, 0, 32, 20, 2, height, 0, 6, height);
829                     wooden_a_supports_paint_setup(session, 5, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
830                     break;
831                 case 1:
832                     PaintAddImageAsParentRotated(
833                         session, direction, session->TrackColours[SCHEME_TRACK] | 21562, 0, 0, 32, 20, 2, height, 0, 6, height);
834                     wooden_a_supports_paint_setup(session, 2, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
835                     break;
836                 case 2:
837                     PaintAddImageAsParentRotated(
838                         session, direction, session->TrackColours[SCHEME_TRACK] | 21565, 0, 0, 32, 20, 2, height, 0, 6, height);
839                     wooden_a_supports_paint_setup(session, 3, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
840                     break;
841                 case 3:
842                     PaintAddImageAsParentRotated(
843                         session, direction, session->TrackColours[SCHEME_TRACK] | 21556, 0, 0, 32, 20, 2, height, 0, 6, height);
844                     wooden_a_supports_paint_setup(session, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
845                     break;
846             }
847             if (direction == 0 || direction == 3)
848             {
849                 paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_SQUARE_FLAT);
850             }
851             paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
852             paint_util_set_general_support_height(session, height + 32, 0x20);
853             break;
854         case 1:
855             paint_util_set_general_support_height(session, height + 32, 0x20);
856             break;
857         case 2:
858             switch (direction)
859             {
860                 case 0:
861                     PaintAddImageAsParentRotated(
862                         session, direction, session->TrackColours[SCHEME_TRACK] | 21558, 0, 0, 16, 16, 2, height, 16, 0,
863                         height);
864                     break;
865                 case 1:
866                     PaintAddImageAsParentRotated(
867                         session, direction, session->TrackColours[SCHEME_TRACK] | 21561, 0, 0, 16, 16, 2, height, 0, 0, height);
868                     break;
869                 case 2:
870                     PaintAddImageAsParentRotated(
871                         session, direction, session->TrackColours[SCHEME_TRACK] | 21564, 0, 0, 16, 16, 2, height, 0, 16,
872                         height);
873                     break;
874                 case 3:
875                     PaintAddImageAsParentRotated(
876                         session, direction, session->TrackColours[SCHEME_TRACK] | 21555, 0, 0, 16, 16, 2, height, 16, 16,
877                         height);
878                     break;
879             }
880             paint_util_set_segment_support_height(
881                 session, paint_util_rotate_segments(SEGMENT_B8 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_D0, direction), 0xFFFF, 0);
882             paint_util_set_general_support_height(session, height + 32, 0x20);
883             break;
884         case 3:
885             switch (direction)
886             {
887                 case 0:
888                     PaintAddImageAsParentRotated(
889                         session, direction, session->TrackColours[SCHEME_TRACK] | 21557, 0, 0, 20, 32, 2, height, 6, 0, height);
890                     wooden_a_supports_paint_setup(session, 5, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
891                     break;
892                 case 1:
893                     PaintAddImageAsParentRotated(
894                         session, direction, session->TrackColours[SCHEME_TRACK] | 21560, 0, 0, 20, 32, 2, height, 6, 0, height);
895                     wooden_a_supports_paint_setup(session, 2, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
896                     break;
897                 case 2:
898                     PaintAddImageAsParentRotated(
899                         session, direction, session->TrackColours[SCHEME_TRACK] | 21563, 0, 0, 20, 32, 2, height, 6, 0, height);
900                     wooden_a_supports_paint_setup(session, 3, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
901                     break;
902                 case 3:
903                     PaintAddImageAsParentRotated(
904                         session, direction, session->TrackColours[SCHEME_TRACK] | 21554, 0, 0, 20, 32, 2, height, 6, 0, height);
905                     wooden_a_supports_paint_setup(session, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
906                     break;
907             }
908             switch (direction)
909             {
910                 case 2:
911                     paint_util_push_tunnel_right(session, height, TUNNEL_SQUARE_FLAT);
912                     break;
913                 case 3:
914                     paint_util_push_tunnel_left(session, height, TUNNEL_SQUARE_FLAT);
915                     break;
916             }
917             paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
918             paint_util_set_general_support_height(session, height + 32, 0x20);
919             break;
920     }
921 }
922 
923 /** rct2: 0x0086E74C */
reverser_rc_track_right_quarter_turn_3(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)924 static void reverser_rc_track_right_quarter_turn_3(
925     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
926     const TrackElement& trackElement)
927 {
928     trackSequence = mapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence];
929     reverser_rc_track_left_quarter_turn_3(session, ride, trackSequence, (direction - 1) & 3, height, trackElement);
930 }
931 
932 /** rct2: 0x0086E75C */
reverser_rc_track_brakes(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)933 static void reverser_rc_track_brakes(
934     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
935     const TrackElement& trackElement)
936 {
937     switch (direction)
938     {
939         case 0:
940         case 2:
941             PaintAddImageAsParentRotated(
942                 session, direction, session->TrackColours[SCHEME_TRACK] | 21506, 0, 0, 32, 27, 2, height, 0, 2, height);
943             wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
944             break;
945         case 1:
946         case 3:
947             PaintAddImageAsParentRotated(
948                 session, direction, session->TrackColours[SCHEME_TRACK] | 21507, 0, 0, 32, 27, 2, height, 0, 2, height);
949             wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
950             break;
951     }
952     paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_SQUARE_FLAT);
953     paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
954     paint_util_set_general_support_height(session, height + 32, 0x20);
955 }
956 
957 /** rct2: 0x0086E76C */
reverser_rc_track_left_reverser(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)958 static void reverser_rc_track_left_reverser(
959     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
960     const TrackElement& trackElement)
961 {
962     switch (trackSequence)
963     {
964         case 0:
965             switch (direction)
966             {
967                 case 0:
968                     PaintAddImageAsParentRotated(
969                         session, direction, session->TrackColours[SCHEME_TRACK] | 21582, 0, 0, 32, 27, 2, height, 0, 2, height);
970                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
971                     break;
972                 case 1:
973                     PaintAddImageAsParentRotated(
974                         session, direction, session->TrackColours[SCHEME_TRACK] | 21588, 0, 0, 32, 27, 2, height, 0, 2, height);
975                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
976                     break;
977                 case 2:
978                     PaintAddImageAsParentRotated(
979                         session, direction, session->TrackColours[SCHEME_TRACK] | 21594, 0, 0, 32, 27, 2, height, 0, 2, height);
980                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
981                     break;
982                 case 3:
983                     PaintAddImageAsParentRotated(
984                         session, direction, session->TrackColours[SCHEME_TRACK] | 21600, 0, 0, 32, 27, 2, height, 0, 2, height);
985                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
986                     break;
987             }
988             if (direction == 0 || direction == 3)
989             {
990                 paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_SQUARE_FLAT);
991             }
992             paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
993             paint_util_set_general_support_height(session, height + 32, 0x20);
994             break;
995         case 1:
996             switch (direction)
997             {
998                 case 0:
999                     PaintAddImageAsParentRotated(
1000                         session, direction, session->TrackColours[SCHEME_TRACK] | 21585, 0, 0, 32, 27, 2, height, 0, 2, height);
1001                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1002                     break;
1003                 case 1:
1004                     PaintAddImageAsParentRotated(
1005                         session, direction, session->TrackColours[SCHEME_TRACK] | 21591, 0, 0, 32, 27, 2, height, 0, 2, height);
1006                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1007                     break;
1008                 case 2:
1009                     PaintAddImageAsParentRotated(
1010                         session, direction, session->TrackColours[SCHEME_TRACK] | 21597, 0, 0, 32, 27, 2, height, 0, 2, height);
1011                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1012                     break;
1013                 case 3:
1014                     PaintAddImageAsParentRotated(
1015                         session, direction, session->TrackColours[SCHEME_TRACK] | 21603, 0, 0, 32, 27, 2, height, 0, 2, height);
1016                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1017                     break;
1018             }
1019             paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
1020             paint_util_set_general_support_height(session, height + 32, 0x20);
1021             break;
1022         case 2:
1023             switch (direction)
1024             {
1025                 case 0:
1026                     PaintAddImageAsParentRotated(
1027                         session, direction, session->TrackColours[SCHEME_TRACK] | 21586, 0, 0, 32, 27, 2, height, 0, 2, height);
1028                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1029                     break;
1030                 case 1:
1031                     PaintAddImageAsParentRotated(
1032                         session, direction, session->TrackColours[SCHEME_TRACK] | 21592, 0, 0, 32, 27, 2, height, 0, 2, height);
1033                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1034                     break;
1035                 case 2:
1036                     PaintAddImageAsParentRotated(
1037                         session, direction, session->TrackColours[SCHEME_TRACK] | 21598, 0, 0, 32, 27, 2, height, 0, 2, height);
1038                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1039                     break;
1040                 case 3:
1041                     PaintAddImageAsParentRotated(
1042                         session, direction, session->TrackColours[SCHEME_TRACK] | 21604, 0, 0, 32, 27, 2, height, 0, 2, height);
1043                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1044                     break;
1045             }
1046             paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
1047             paint_util_set_general_support_height(session, height + 32, 0x20);
1048             break;
1049         case 3:
1050             switch (direction)
1051             {
1052                 case 0:
1053                     PaintAddImageAsParentRotated(
1054                         session, direction, session->TrackColours[SCHEME_TRACK] | 21587, 0, 0, 32, 27, 2, height, 0, 2, height);
1055                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1056                     break;
1057                 case 1:
1058                     PaintAddImageAsParentRotated(
1059                         session, direction, session->TrackColours[SCHEME_TRACK] | 21593, 0, 0, 32, 27, 2, height, 0, 2, height);
1060                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1061                     break;
1062                 case 2:
1063                     PaintAddImageAsParentRotated(
1064                         session, direction, session->TrackColours[SCHEME_TRACK] | 21599, 0, 0, 32, 27, 2, height, 0, 2, height);
1065                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1066                     break;
1067                 case 3:
1068                     PaintAddImageAsParentRotated(
1069                         session, direction, session->TrackColours[SCHEME_TRACK] | 21605, 0, 0, 32, 27, 2, height, 0, 2, height);
1070                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1071                     break;
1072             }
1073             paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
1074             paint_util_set_general_support_height(session, height + 32, 0x20);
1075             break;
1076         case 4:
1077             switch (direction)
1078             {
1079                 case 0:
1080                     PaintAddImageAsParentRotated(
1081                         session, direction, session->TrackColours[SCHEME_TRACK] | 21583, 0, 0, 32, 27, 2, height, 0, 2, height);
1082                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1083                     break;
1084                 case 1:
1085                     PaintAddImageAsParentRotated(
1086                         session, direction, session->TrackColours[SCHEME_TRACK] | 21589, 0, 0, 32, 27, 2, height, 0, 2, height);
1087                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1088                     break;
1089                 case 2:
1090                     PaintAddImageAsParentRotated(
1091                         session, direction, session->TrackColours[SCHEME_TRACK] | 21595, 0, 0, 32, 27, 2, height, 0, 2, height);
1092                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1093                     break;
1094                 case 3:
1095                     PaintAddImageAsParentRotated(
1096                         session, direction, session->TrackColours[SCHEME_TRACK] | 21601, 0, 0, 32, 27, 2, height, 0, 2, height);
1097                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1098                     break;
1099             }
1100             paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
1101             paint_util_set_general_support_height(session, height + 32, 0x20);
1102             break;
1103         case 5:
1104             switch (direction)
1105             {
1106                 case 0:
1107                     PaintAddImageAsParentRotated(
1108                         session, direction, session->TrackColours[SCHEME_TRACK] | 21584, 0, 0, 32, 27, 2, height, 0, 2, height);
1109                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1110                     break;
1111                 case 1:
1112                     PaintAddImageAsParentRotated(
1113                         session, direction, session->TrackColours[SCHEME_TRACK] | 21590, 0, 0, 32, 27, 2, height, 0, 2, height);
1114                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1115                     break;
1116                 case 2:
1117                     PaintAddImageAsParentRotated(
1118                         session, direction, session->TrackColours[SCHEME_TRACK] | 21596, 0, 0, 32, 27, 2, height, 0, 2, height);
1119                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1120                     break;
1121                 case 3:
1122                     PaintAddImageAsParentRotated(
1123                         session, direction, session->TrackColours[SCHEME_TRACK] | 21602, 0, 0, 32, 27, 2, height, 0, 2, height);
1124                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1125                     break;
1126             }
1127             switch (direction)
1128             {
1129                 case 1:
1130                     paint_util_push_tunnel_right(session, height, TUNNEL_SQUARE_FLAT);
1131                     break;
1132                 case 2:
1133                     paint_util_push_tunnel_left(session, height, TUNNEL_SQUARE_FLAT);
1134                     break;
1135             }
1136             paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
1137             paint_util_set_general_support_height(session, height + 32, 0x20);
1138             break;
1139     }
1140 }
1141 
1142 /** rct2: 0x0086E77C */
reverser_rc_track_right_reverser(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)1143 static void reverser_rc_track_right_reverser(
1144     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
1145     const TrackElement& trackElement)
1146 {
1147     switch (trackSequence)
1148     {
1149         case 0:
1150             switch (direction)
1151             {
1152                 case 0:
1153                     PaintAddImageAsParentRotated(
1154                         session, direction, session->TrackColours[SCHEME_TRACK] | 21596, 0, 0, 32, 27, 2, height, 0, 2, height);
1155                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1156                     break;
1157                 case 1:
1158                     PaintAddImageAsParentRotated(
1159                         session, direction, session->TrackColours[SCHEME_TRACK] | 21602, 0, 0, 32, 27, 2, height, 0, 2, height);
1160                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1161                     break;
1162                 case 2:
1163                     PaintAddImageAsParentRotated(
1164                         session, direction, session->TrackColours[SCHEME_TRACK] | 21584, 0, 0, 32, 27, 2, height, 0, 2, height);
1165                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1166                     break;
1167                 case 3:
1168                     PaintAddImageAsParentRotated(
1169                         session, direction, session->TrackColours[SCHEME_TRACK] | 21590, 0, 0, 32, 27, 2, height, 0, 2, height);
1170                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1171                     break;
1172             }
1173             if (direction == 0 || direction == 3)
1174             {
1175                 paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_SQUARE_FLAT);
1176             }
1177             paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
1178             paint_util_set_general_support_height(session, height + 32, 0x20);
1179             break;
1180         case 1:
1181             switch (direction)
1182             {
1183                 case 0:
1184                     PaintAddImageAsParentRotated(
1185                         session, direction, session->TrackColours[SCHEME_TRACK] | 21599, 0, 0, 32, 27, 2, height, 0, 2, height);
1186                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1187                     break;
1188                 case 1:
1189                     PaintAddImageAsParentRotated(
1190                         session, direction, session->TrackColours[SCHEME_TRACK] | 21605, 0, 0, 32, 27, 2, height, 0, 2, height);
1191                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1192                     break;
1193                 case 2:
1194                     PaintAddImageAsParentRotated(
1195                         session, direction, session->TrackColours[SCHEME_TRACK] | 21587, 0, 0, 32, 27, 2, height, 0, 2, height);
1196                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1197                     break;
1198                 case 3:
1199                     PaintAddImageAsParentRotated(
1200                         session, direction, session->TrackColours[SCHEME_TRACK] | 21593, 0, 0, 32, 27, 2, height, 0, 2, height);
1201                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1202                     break;
1203             }
1204             paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
1205             paint_util_set_general_support_height(session, height + 32, 0x20);
1206             break;
1207         case 2:
1208             switch (direction)
1209             {
1210                 case 0:
1211                     PaintAddImageAsParentRotated(
1212                         session, direction, session->TrackColours[SCHEME_TRACK] | 21598, 0, 0, 32, 27, 2, height, 0, 2, height);
1213                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1214                     break;
1215                 case 1:
1216                     PaintAddImageAsParentRotated(
1217                         session, direction, session->TrackColours[SCHEME_TRACK] | 21604, 0, 0, 32, 27, 2, height, 0, 2, height);
1218                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1219                     break;
1220                 case 2:
1221                     PaintAddImageAsParentRotated(
1222                         session, direction, session->TrackColours[SCHEME_TRACK] | 21586, 0, 0, 32, 27, 2, height, 0, 2, height);
1223                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1224                     break;
1225                 case 3:
1226                     PaintAddImageAsParentRotated(
1227                         session, direction, session->TrackColours[SCHEME_TRACK] | 21592, 0, 0, 32, 27, 2, height, 0, 2, height);
1228                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1229                     break;
1230             }
1231             paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
1232             paint_util_set_general_support_height(session, height + 32, 0x20);
1233             break;
1234         case 3:
1235             switch (direction)
1236             {
1237                 case 0:
1238                     PaintAddImageAsParentRotated(
1239                         session, direction, session->TrackColours[SCHEME_TRACK] | 21597, 0, 0, 32, 27, 2, height, 0, 2, height);
1240                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1241                     break;
1242                 case 1:
1243                     PaintAddImageAsParentRotated(
1244                         session, direction, session->TrackColours[SCHEME_TRACK] | 21603, 0, 0, 32, 27, 2, height, 0, 2, height);
1245                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1246                     break;
1247                 case 2:
1248                     PaintAddImageAsParentRotated(
1249                         session, direction, session->TrackColours[SCHEME_TRACK] | 21585, 0, 0, 32, 27, 2, height, 0, 2, height);
1250                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1251                     break;
1252                 case 3:
1253                     PaintAddImageAsParentRotated(
1254                         session, direction, session->TrackColours[SCHEME_TRACK] | 21591, 0, 0, 32, 27, 2, height, 0, 2, height);
1255                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1256                     break;
1257             }
1258             paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
1259             paint_util_set_general_support_height(session, height + 32, 0x20);
1260             break;
1261         case 4:
1262             switch (direction)
1263             {
1264                 case 0:
1265                     PaintAddImageAsParentRotated(
1266                         session, direction, session->TrackColours[SCHEME_TRACK] | 21595, 0, 0, 32, 27, 2, height, 0, 2, height);
1267                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1268                     break;
1269                 case 1:
1270                     PaintAddImageAsParentRotated(
1271                         session, direction, session->TrackColours[SCHEME_TRACK] | 21601, 0, 0, 32, 27, 2, height, 0, 2, height);
1272                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1273                     break;
1274                 case 2:
1275                     PaintAddImageAsParentRotated(
1276                         session, direction, session->TrackColours[SCHEME_TRACK] | 21583, 0, 0, 32, 27, 2, height, 0, 2, height);
1277                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1278                     break;
1279                 case 3:
1280                     PaintAddImageAsParentRotated(
1281                         session, direction, session->TrackColours[SCHEME_TRACK] | 21589, 0, 0, 32, 27, 2, height, 0, 2, height);
1282                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1283                     break;
1284             }
1285             paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
1286             paint_util_set_general_support_height(session, height + 32, 0x20);
1287             break;
1288         case 5:
1289             switch (direction)
1290             {
1291                 case 0:
1292                     PaintAddImageAsParentRotated(
1293                         session, direction, session->TrackColours[SCHEME_TRACK] | 21594, 0, 0, 32, 27, 2, height, 0, 2, height);
1294                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1295                     break;
1296                 case 1:
1297                     PaintAddImageAsParentRotated(
1298                         session, direction, session->TrackColours[SCHEME_TRACK] | 21600, 0, 0, 32, 27, 2, height, 0, 2, height);
1299                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1300                     break;
1301                 case 2:
1302                     PaintAddImageAsParentRotated(
1303                         session, direction, session->TrackColours[SCHEME_TRACK] | 21582, 0, 0, 32, 27, 2, height, 0, 2, height);
1304                     wooden_a_supports_paint_setup(session, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1305                     break;
1306                 case 3:
1307                     PaintAddImageAsParentRotated(
1308                         session, direction, session->TrackColours[SCHEME_TRACK] | 21588, 0, 0, 32, 27, 2, height, 0, 2, height);
1309                     wooden_a_supports_paint_setup(session, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1310                     break;
1311             }
1312             switch (direction)
1313             {
1314                 case 1:
1315                     paint_util_push_tunnel_right(session, height, TUNNEL_SQUARE_FLAT);
1316                     break;
1317                 case 2:
1318                     paint_util_push_tunnel_left(session, height, TUNNEL_SQUARE_FLAT);
1319                     break;
1320             }
1321             paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
1322             paint_util_set_general_support_height(session, height + 32, 0x20);
1323             break;
1324     }
1325 }
1326 
get_track_paint_function_reverser_rc(int32_t trackType)1327 TRACK_PAINT_FUNCTION get_track_paint_function_reverser_rc(int32_t trackType)
1328 {
1329     switch (trackType)
1330     {
1331         case TrackElemType::Flat:
1332             return reverser_rc_track_flat;
1333         case TrackElemType::EndStation:
1334         case TrackElemType::BeginStation:
1335         case TrackElemType::MiddleStation:
1336             return reverser_rc_track_station;
1337         case TrackElemType::Up25:
1338             return reverser_rc_track_25_deg_up;
1339         case TrackElemType::FlatToUp25:
1340             return reverser_rc_track_flat_to_25_deg_up;
1341         case TrackElemType::Up25ToFlat:
1342             return reverser_rc_track_25_deg_up_to_flat;
1343         case TrackElemType::Down25:
1344             return reverser_rc_track_25_deg_down;
1345         case TrackElemType::FlatToDown25:
1346             return reverser_rc_track_flat_to_25_deg_down;
1347         case TrackElemType::Down25ToFlat:
1348             return reverser_rc_track_25_deg_down_to_flat;
1349         case TrackElemType::LeftQuarterTurn5Tiles:
1350             return reverser_rc_track_left_quarter_turn_5;
1351         case TrackElemType::RightQuarterTurn5Tiles:
1352             return reverser_rc_track_right_quarter_turn_5;
1353         case TrackElemType::SBendLeft:
1354             return reverser_rc_track_s_bend_left;
1355         case TrackElemType::SBendRight:
1356             return reverser_rc_track_s_bend_right;
1357         case TrackElemType::LeftQuarterTurn3Tiles:
1358             return reverser_rc_track_left_quarter_turn_3;
1359         case TrackElemType::RightQuarterTurn3Tiles:
1360             return reverser_rc_track_right_quarter_turn_3;
1361         case TrackElemType::Brakes:
1362             return reverser_rc_track_brakes;
1363         case TrackElemType::LeftReverser:
1364             return reverser_rc_track_left_reverser;
1365         case TrackElemType::RightReverser:
1366             return reverser_rc_track_right_reverser;
1367     }
1368     return nullptr;
1369 }
1370