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 "JuniorRollerCoaster.h"
11 
12 #include "../../drawing/Drawing.h"
13 #include "../../interface/Viewport.h"
14 #include "../../interface/Window.h"
15 #include "../../localisation/Localisation.h"
16 #include "../../paint/Paint.h"
17 #include "../../paint/Supports.h"
18 #include "../../sprites.h"
19 #include "../../world/Map.h"
20 #include "../RideData.h"
21 #include "../TrackData.h"
22 #include "../TrackPaint.h"
23 
24 #include <algorithm>
25 
26 enum
27 {
28     SPR_JUNIOR_RC_FLAT_SW_NE = 27807,
29     SPR_JUNIOR_RC_FLAT_NW_SE = 27808,
30     SPR_JUNIOR_RC_25_DEG_SW_NE = 27809,
31     SPR_JUNIOR_RC_60_DEG_SW_NE = 27810,
32     SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_SW_NE = 27811,
33     SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_SW_NE = 27812,
34     SPR_JUNIOR_RC_25_DEG_NE_SW = 27813,
35     SPR_JUNIOR_RC_60_DEG_NE_SW = 27814,
36     SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_NE_SW = 27815,
37     SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_NE_SW_PART_0_2 = 27816,
38     SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_NE_SW = 27817,
39     SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_NE_SW_PART_0_2 = 27818,
40     SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_SW_NE = 27819,
41     SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_SW_NE = 27820,
42     SPR_JUNIOR_RC_25_DEG_NW_SE = 27821,
43     SPR_JUNIOR_RC_60_DEG_NW_SE = 27822,
44     SPR_JUNIOR_RC_25_DEG_SE_NW = 27823,
45     SPR_JUNIOR_RC_60_DEG_SE_NW = 27824,
46     SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_NW_SE = 27825,
47     SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_NW_SE_PART_0_2 = 27826,
48     SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_SE_NW = 27827,
49     SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_SE_NW = 27828,
50     SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_SE_NW = 27829,
51     SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_SE_NW = 27830,
52     SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_NW_SE = 27831,
53     SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_NW_SE_PART_0_2 = 27832,
54     SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SW_SE_PART_0 = 27833,
55     SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SW_SE_PART_1 = 27834,
56     SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SW_SE_PART_2 = 27835,
57     SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SW_SE_PART_3 = 27836,
58     SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SW_SE_PART_4 = 27837,
59     SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NW_SW_PART_0 = 27838,
60     SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NW_SW_PART_1 = 27839,
61     SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NW_SW_PART_2 = 27840,
62     SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NW_SW_PART_3 = 27841,
63     SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NW_SW_PART_4 = 27842,
64     SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NE_NW_PART_0 = 27843,
65     SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NE_NW_PART_1 = 27844,
66     SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NE_NW_PART_2 = 27845,
67     SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NE_NW_PART_3 = 27846,
68     SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NE_NW_PART_4 = 27847,
69     SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SE_NE_PART_0 = 27848,
70     SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SE_NE_PART_1 = 27849,
71     SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SE_NE_PART_2 = 27850,
72     SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SE_NE_PART_3 = 27851,
73     SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SE_NE_PART_4 = 27852,
74     SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_NE_SW = 27853,
75     SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_NE_SW = 27854,
76     SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_NW_SE = 27855,
77     SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_NW_SE = 27856,
78     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_0 = 27857,
79     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_1 = 27858,
80     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_2 = 27859,
81     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_3 = 27860,
82     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_4 = 27861,
83     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_0 = 27862,
84     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_1 = 27863,
85     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_2 = 27864,
86     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_3 = 27865,
87     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_4 = 27866,
88     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_0 = 27867,
89     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_1 = 27868,
90     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_2 = 27869,
91     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_3 = 27870,
92     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_4 = 27871,
93     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_0 = 27872,
94     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_1 = 27873,
95     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_2 = 27874,
96     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_3 = 27875,
97     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_4 = 27876,
98     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_0 = 27877,
99     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_1 = 27878,
100     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_2 = 27879,
101     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_3 = 27880,
102     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_4 = 27881,
103     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_0 = 27882,
104     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_1 = 27883,
105     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_2 = 27884,
106     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_3 = 27885,
107     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_4 = 27886,
108     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_0 = 27887,
109     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_1 = 27888,
110     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_2 = 27889,
111     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_3 = 27890,
112     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_4 = 27891,
113     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_0 = 27892,
114     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_1 = 27893,
115     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_2 = 27894,
116     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_3 = 27895,
117     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_4 = 27896,
118     SPR_JUNIOR_RC_S_BEND_RIGHT_SW_NE_PART_0 = 27897,
119     SPR_JUNIOR_RC_S_BEND_RIGHT_SW_NE_PART_1 = 27898,
120     SPR_JUNIOR_RC_S_BEND_RIGHT_SW_NE_PART_2 = 27899,
121     SPR_JUNIOR_RC_S_BEND_RIGHT_SW_NE_PART_3 = 27900,
122     SPR_JUNIOR_RC_S_BEND_LEFT_SW_NE_PART_0 = 27901,
123     SPR_JUNIOR_RC_S_BEND_LEFT_SW_NE_PART_1 = 27902,
124     SPR_JUNIOR_RC_S_BEND_LEFT_SW_NE_PART_2 = 27903,
125     SPR_JUNIOR_RC_S_BEND_LEFT_SW_NE_PART_3 = 27904,
126     SPR_JUNIOR_RC_S_BEND_LEFT_SE_NW_PART_0 = 27905,
127     SPR_JUNIOR_RC_S_BEND_LEFT_SE_NW_PART_1 = 27906,
128     SPR_JUNIOR_RC_S_BEND_LEFT_SE_NW_PART_2 = 27907,
129     SPR_JUNIOR_RC_S_BEND_LEFT_SE_NW_PART_3 = 27908,
130     SPR_JUNIOR_RC_S_BEND_RIGHT_SE_NW_PART_0 = 27909,
131     SPR_JUNIOR_RC_S_BEND_RIGHT_SE_NW_PART_1 = 27910,
132     SPR_JUNIOR_RC_S_BEND_RIGHT_SE_NW_PART_2 = 27911,
133     SPR_JUNIOR_RC_S_BEND_RIGHT_SE_NW_PART_3 = 27912,
134     SPR_JUNIOR_RC_FLAT_CHAIN_SW_NE = 27913,
135     SPR_JUNIOR_RC_FLAT_CHAIN_NW_SE = 27914,
136     SPR_JUNIOR_RC_25_DEG_CHAIN_SW_NE = 27915,
137     SPR_JUNIOR_RC_60_DEG_CHAIN_SW_NE = 27916,
138     SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_CHAIN_SW_NE = 27917,
139     SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_CHAIN_SW_NE = 27918,
140     SPR_JUNIOR_RC_25_DEG_CHAIN_NE_SW = 27919,
141     SPR_JUNIOR_RC_60_DEG_CHAIN_NE_SW = 27920,
142     SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_CHAIN_NE_SW = 27921,
143     SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_CHAIN_NE_SW_PART_0_2 = 27922,
144     SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_CHAIN_NE_SW = 27923,
145     SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_CHAIN_NE_SW_PART_0_2 = 27924,
146     SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_CHAIN_SW_NE = 27925,
147     SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_CHAIN_SW_NE = 27926,
148     SPR_JUNIOR_RC_25_DEG_CHAIN_NW_SE = 27927,
149     SPR_JUNIOR_RC_60_DEG_CHAIN_NW_SE = 27928,
150     SPR_JUNIOR_RC_25_DEG_CHAIN_SE_NW = 27929,
151     SPR_JUNIOR_RC_60_DEG_CHAIN_SE_NW = 27930,
152     SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_CHAIN_NW_SE = 27931,
153     SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_CHAIN_NW_SE_PART_0_2 = 27932,
154     SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_CHAIN_SE_NW = 27933,
155     SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_CHAIN_SE_NW = 27934,
156     SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_CHAIN_SE_NW = 27935,
157     SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_CHAIN_SE_NW = 27936,
158     SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_CHAIN_NW_SE = 27937,
159     SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_CHAIN_NW_SE_PART_0_2 = 27938,
160     SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_CHAIN_NE_SW = 27939,
161     SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_CHAIN_NE_SW = 27940,
162     SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_CHAIN_NW_SE = 27941,
163     SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_CHAIN_NW_SE = 27942,
164     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_0 = 27943,
165     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_1 = 27944,
166     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_2 = 27945,
167     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_3 = 27946,
168     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_4 = 27947,
169     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_0 = 27948,
170     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_1 = 27949,
171     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_2 = 27950,
172     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_3 = 27951,
173     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_4 = 27952,
174     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_0 = 27953,
175     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_1 = 27954,
176     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_2 = 27955,
177     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_3 = 27956,
178     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_4 = 27957,
179     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_0 = 27958,
180     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_1 = 27959,
181     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_2 = 27960,
182     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_3 = 27961,
183     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_4 = 27962,
184     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_0 = 27963,
185     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_1 = 27964,
186     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_2 = 27965,
187     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_3 = 27966,
188     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_4 = 27967,
189     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_0 = 27968,
190     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_1 = 27969,
191     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_2 = 27970,
192     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_3 = 27971,
193     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_4 = 27972,
194     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_0 = 27973,
195     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_1 = 27974,
196     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_2 = 27975,
197     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_3 = 27976,
198     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_4 = 27977,
199     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_0 = 27978,
200     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_1 = 27979,
201     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_2 = 27980,
202     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_3 = 27981,
203     SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_4 = 27982,
204     SPR_WATER_RC_FLAT_CHAIN_SW_NE = 27983,
205     SPR_WATER_RC_FLAT_CHAIN_NW_SE = 27984,
206     SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_SW_NE = 27985,
207     SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_NW_SE = 27986,
208     SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_NE_SW = 27987,
209     SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_SE_NW = 27988,
210     SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_SW_NE = 27989,
211     SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_NW_SE = 27990,
212     SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_NE_SW = 27991,
213     SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_SE_NW = 27992,
214     SPR_WATER_RC_25_DEG_CHAIN_SW_NE = 27993,
215     SPR_WATER_RC_25_DEG_CHAIN_NW_SE = 27994,
216     SPR_WATER_RC_25_DEG_CHAIN_NE_SW = 27995,
217     SPR_WATER_RC_25_DEG_CHAIN_SE_NW = 27996,
218     SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_SW_NE = 27997,
219     SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_NW_SE = 27998,
220     SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_NE_SW = 27999,
221     SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_SE_NW = 28000,
222     SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_SW_NE = 28001,
223     SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_NW_SE = 28002,
224     SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_NE_SW = 28003,
225     SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_SE_NW = 28004,
226     SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_SW_NE_FRONT = 28005,
227     SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_NW_SE_FRONT = 28006,
228     SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_NE_SW_FRONT = 28007,
229     SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_SE_NW_FRONT = 28008,
230     SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_SW_NE = 28009,
231     SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_NW_SE = 28010,
232     SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_NE_SW = 28011,
233     SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_SE_NW = 28012,
234     SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_SW_NE_FRONT = 28013,
235     SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_NW_SE_FRONT = 28014,
236     SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_SW_NE = 28015,
237     SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_NW_SE = 28016,
238     SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_NE_SW = 28017,
239     SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_SE_NW = 28018,
240     SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_NE_SW_FRONT = 28019,
241     SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_SE_NW_FRONT = 28020,
242     SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_SW_NE = 28021,
243     SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_NW_SE = 28022,
244     SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_NE_SW = 28023,
245     SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_SE_NW = 28024,
246     SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_SW_NE_FRONT = 28025,
247     SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_NW_SE_FRONT = 28026,
248     SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_SW_NE = 28027,
249     SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_NW_SE = 28028,
250     SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_NE_SW = 28029,
251     SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_SE_NW = 28030,
252     SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_NE_SW_FRONT = 28031,
253     SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_SE_NW_FRONT = 28032,
254     SPR_JUNIOR_RC_LEFT_BANK_SW_NE = 28033,
255     SPR_JUNIOR_RC_LEFT_BANK_NW_SE = 28034,
256     SPR_JUNIOR_RC_LEFT_BANK_NE_SW = 28035,
257     SPR_JUNIOR_RC_LEFT_BANK_SE_NW = 28036,
258     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SW_SE_PART_0 = 28037,
259     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SW_SE_PART_1 = 28038,
260     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SW_SE_PART_2 = 28039,
261     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SW_SE_PART_3 = 28040,
262     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SW_SE_PART_4 = 28041,
263     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_0 = 28042,
264     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_1 = 28043,
265     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_2 = 28044,
266     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_3 = 28045,
267     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_4 = 28046,
268     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NE_NW_PART_0 = 28047,
269     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NE_NW_PART_1 = 28048,
270     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NE_NW_PART_2 = 28049,
271     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NE_NW_PART_3 = 28050,
272     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NE_NW_PART_4 = 28051,
273     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_0 = 28052,
274     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_1 = 28053,
275     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_2 = 28054,
276     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_3 = 28055,
277     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_4 = 28056,
278     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_4_2 = 28057,
279     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_0_2 = 28058,
280     SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SW_SE_PART_0 = 28059,
281     SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SW_SE_PART_1 = 28060,
282     SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SW_SE_PART_2 = 28061,
283     SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NW_SW_PART_0 = 28062,
284     SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NW_SW_PART_1 = 28063,
285     SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NW_SW_PART_2 = 28064,
286     SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NE_NW_PART_0 = 28065,
287     SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NE_NW_PART_1 = 28066,
288     SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NE_NW_PART_2 = 28067,
289     SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SE_NE_PART_0 = 28068,
290     SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SE_NE_PART_1 = 28069,
291     SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SE_NE_PART_2 = 28070,
292     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SW_SE_PART_0 = 28071,
293     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SW_SE_PART_1 = 28072,
294     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SW_SE_PART_2 = 28073,
295     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NW_SW_PART_0 = 28074,
296     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NW_SW_PART_1 = 28075,
297     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NW_SW_PART_2 = 28076,
298     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NE_NW_PART_0 = 28077,
299     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NE_NW_PART_1 = 28078,
300     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NE_NW_PART_2 = 28079,
301     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SE_NE_PART_0 = 28080,
302     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SE_NE_PART_1 = 28081,
303     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SE_NE_PART_2 = 28082,
304     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NW_SW_PART_2_2 = 28083,
305     SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SE_NE_PART_0_2 = 28084,
306     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_SW_SE_PART_0 = 28085,
307     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_SW_SE_PART_1 = 28086,
308     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_NW_SW_PART_0 = 28087,
309     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_NW_SW_PART_1 = 28088,
310     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_NE_NW_PART_0 = 28089,
311     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_NE_NW_PART_1 = 28090,
312     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_SE_NE_PART_0 = 28091,
313     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_SE_NE_PART_1 = 28092,
314     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_SW_SE_PART_0 = 28093,
315     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_SW_SE_PART_1 = 28094,
316     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_NW_SW_PART_0 = 28095,
317     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_NW_SW_PART_1 = 28096,
318     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_NE_NW_PART_0 = 28097,
319     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_NE_NW_PART_1 = 28098,
320     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_SE_NE_PART_0 = 28099,
321     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_SE_NE_PART_1 = 28100,
322     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_SW_SE_PART_0 = 28101,
323     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_SW_SE_PART_1 = 28102,
324     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_NW_SW_PART_0 = 28103,
325     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_NW_SW_PART_1 = 28104,
326     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_NE_NW_PART_0 = 28105,
327     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_NE_NW_PART_1 = 28106,
328     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_SE_NE_PART_0 = 28107,
329     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_SE_NE_PART_1 = 28108,
330     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_SW_SE_PART_0 = 28109,
331     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_SW_SE_PART_1 = 28110,
332     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_NW_SW_PART_0 = 28111,
333     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_NW_SW_PART_1 = 28112,
334     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_NE_NW_PART_0 = 28113,
335     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_NE_NW_PART_1 = 28114,
336     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_SE_NE_PART_0 = 28115,
337     SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_SE_NE_PART_1 = 28116,
338     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SW_SE_PART_0 = 28117,
339     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SW_SE_PART_1 = 28118,
340     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SW_SE_PART_2 = 28119,
341     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NW_SW_PART_0 = 28120,
342     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NW_SW_PART_1 = 28121,
343     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NW_SW_PART_2 = 28122,
344     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NE_NW_PART_0 = 28123,
345     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NE_NW_PART_1 = 28124,
346     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NE_NW_PART_2 = 28125,
347     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SE_NE_PART_0 = 28126,
348     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SE_NE_PART_1 = 28127,
349     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SE_NE_PART_2 = 28128,
350     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NW_SW_PART_2_2 = 28129,
351     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SE_NE_PART_0_2 = 28130,
352     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SW_SE_PART_0 = 28131,
353     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SW_SE_PART_1 = 28132,
354     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SW_SE_PART_2 = 28133,
355     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NW_SW_PART_0 = 28134,
356     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NW_SW_PART_1 = 28135,
357     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NW_SW_PART_2 = 28136,
358     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NE_NW_PART_0 = 28137,
359     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NE_NW_PART_1 = 28138,
360     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NE_NW_PART_2 = 28139,
361     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SE_NE_PART_0 = 28140,
362     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SE_NE_PART_1 = 28141,
363     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SE_NE_PART_2 = 28142,
364     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NW_SW_PART_2_2 = 28143,
365     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SE_NE_PART_0_2 = 28144,
366     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SW_SE_PART_0 = 28145,
367     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SW_SE_PART_1 = 28146,
368     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SW_SE_PART_2 = 28147,
369     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SW_SE_PART_3 = 28148,
370     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SW_SE_PART_4 = 28149,
371     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_0 = 28150,
372     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_1 = 28151,
373     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_2 = 28152,
374     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_3 = 28153,
375     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_4 = 28154,
376     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NE_NW_PART_0 = 28155,
377     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NE_NW_PART_1 = 28156,
378     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NE_NW_PART_2 = 28157,
379     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NE_NW_PART_3 = 28158,
380     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NE_NW_PART_4 = 28159,
381     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_0 = 28160,
382     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_1 = 28161,
383     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_2 = 28162,
384     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_3 = 28163,
385     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_4 = 28164,
386     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_4_2 = 28165,
387     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_0_2 = 28166,
388     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SW_SE_PART_0 = 28167,
389     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SW_SE_PART_1 = 28168,
390     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SW_SE_PART_2 = 28169,
391     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SW_SE_PART_3 = 28170,
392     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SW_SE_PART_4 = 28171,
393     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_0 = 28172,
394     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_1 = 28173,
395     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_2 = 28174,
396     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_3 = 28175,
397     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_4 = 28176,
398     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NE_NW_PART_0 = 28177,
399     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NE_NW_PART_1 = 28178,
400     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NE_NW_PART_2 = 28179,
401     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NE_NW_PART_3 = 28180,
402     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NE_NW_PART_4 = 28181,
403     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_0 = 28182,
404     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_1 = 28183,
405     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_2 = 28184,
406     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_3 = 28185,
407     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_4 = 28186,
408     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_4_2 = 28187,
409     SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_0_2 = 28188,
410     SPR_JUNIOR_RC_STATION_SW_NE = 28189,
411     SPR_JUNIOR_RC_STATION_NW_SE = 28190,
412     SPR_JUNIOR_RC_FLAT_SW_NE_BRAKED = 28191,
413     SPR_JUNIOR_RC_FLAT_NW_SE_BRAKED = 28192,
414     SPR_JUNIOR_RC_FLAT_BLOCK_SW_NE = 28193,
415     SPR_JUNIOR_RC_FLAT_BLOCK_NW_SE = 28194,
416     SPR_JUNIOR_RC_FLAT_BLOCK_SW_NE_BRAKED = 28195,
417     SPR_JUNIOR_RC_FLAT_BLOCK_NW_SE_BRAKED = 28196,
418     SPR_JUNIOR_RC_DIAG_FLAT_W_E = 28197,
419     SPR_JUNIOR_RC_DIAG_FLAT_N_S = 28198,
420     SPR_JUNIOR_RC_DIAG_FLAT_E_W = 28199,
421     SPR_JUNIOR_RC_DIAG_FLAT_S_N = 28200,
422     SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_W_E = 28201,
423     SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_N_S = 28202,
424     SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_E_W = 28203,
425     SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_S_N = 28204,
426     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_W_E = 28205,
427     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_N_S = 28206,
428     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_E_W = 28207,
429     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_S_N = 28208,
430     SPR_JUNIOR_RC_DIAG_25_DEG_UP_W_E = 28209,
431     SPR_JUNIOR_RC_DIAG_25_DEG_UP_N_S = 28210,
432     SPR_JUNIOR_RC_DIAG_25_DEG_UP_E_W = 28211,
433     SPR_JUNIOR_RC_DIAG_25_DEG_UP_S_N = 28212,
434     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_W_E = 28213,
435     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_N_S = 28214,
436     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_E_W = 28215,
437     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_S_N = 28216,
438     SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_W_E = 28217,
439     SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_N_S = 28218,
440     SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_E_W = 28219,
441     SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_S_N = 28220,
442     SPR_JUNIOR_RC_DIAG_60_DEG_UP_W_E = 28221,
443     SPR_JUNIOR_RC_DIAG_60_DEG_UP_N_S = 28222,
444     SPR_JUNIOR_RC_DIAG_60_DEG_UP_E_W = 28223,
445     SPR_JUNIOR_RC_DIAG_60_DEG_UP_S_N = 28224,
446 
447     SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_W_E = 28225,
448     SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_N_S = 28226,
449     SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_E_W = 28227,
450     SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_S_N = 28228,
451     SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_W_E = 28229,
452     SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_N_S = 28230,
453     SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_E_W = 28231,
454     SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_S_N = 28232,
455 
456     SPR_JUNIOR_RC_DIAG_FLAT_CHAIN_W_E = 28233,
457     SPR_JUNIOR_RC_DIAG_FLAT_CHAIN_N_S = 28234,
458     SPR_JUNIOR_RC_DIAG_FLAT_CHAIN_E_W = 28235,
459     SPR_JUNIOR_RC_DIAG_FLAT_CHAIN_S_N = 28236,
460     SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_W_E = 28237,
461     SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_N_S = 28238,
462     SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_E_W = 28239,
463     SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_S_N = 28240,
464     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_W_E = 28241,
465     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_N_S = 28242,
466     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_E_W = 28243,
467     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_S_N = 28244,
468     SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_W_E = 28245,
469     SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_N_S = 28246,
470     SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_E_W = 28247,
471     SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_S_N = 28248,
472     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_W_E = 28249,
473     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_N_S = 28250,
474     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_E_W = 28251,
475     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_S_N = 28252,
476     SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_W_E = 28253,
477     SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_N_S = 28254,
478     SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_E_W = 28255,
479     SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_S_N = 28256,
480     SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_W_E = 28257,
481     SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_N_S = 28258,
482     SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_E_W = 28259,
483     SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_S_N = 28260,
484 
485     SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_CHAIN_W_E = 28261,
486     SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_CHAIN_N_S = 28262,
487     SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_CHAIN_E_W = 28263,
488     SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_CHAIN_S_N = 28264,
489     SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_CHAIN_W_E = 28265,
490     SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_CHAIN_N_S = 28266,
491     SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_CHAIN_E_W = 28267,
492     SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_CHAIN_S_N = 28268,
493 
494     SPR_WATER_RC_DIAG_FLAT_CHAIN_W_E = 28269,
495     SPR_WATER_RC_DIAG_FLAT_CHAIN_N_S = 28270,
496     SPR_WATER_RC_DIAG_FLAT_CHAIN_E_W = 28271,
497     SPR_WATER_RC_DIAG_FLAT_CHAIN_S_N = 28272,
498     SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_W_E = 28273,
499     SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_N_S = 28274,
500     SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_E_W = 28275,
501     SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_S_N = 28276,
502     SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_W_E = 28277,
503     SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_N_S = 28278,
504     SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_E_W = 28279,
505     SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_S_N = 28280,
506     SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_W_E = 28281,
507     SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_N_S = 28282,
508     SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_E_W = 28283,
509     SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_S_N = 28284,
510     SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_E_PART_0 = 28285,
511     SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_E_PART_1 = 28286,
512     SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_E_PART_2 = 28287,
513     SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_E_PART_3 = 28288,
514     SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_S_PART_0 = 28289,
515     SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_S_PART_1 = 28290,
516     SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_S_PART_2 = 28291,
517     SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_S_PART_3 = 28292,
518     SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_W_PART_0 = 28293,
519     SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_W_PART_1 = 28294,
520     SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_W_PART_2 = 28295,
521     SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_W_PART_3 = 28296,
522     SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_N_PART_0 = 28297,
523     SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_N_PART_1 = 28298,
524     SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_N_PART_2 = 28299,
525     SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_N_PART_3 = 28300,
526     SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_N_PART_0 = 28301,
527     SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_N_PART_1 = 28302,
528     SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_N_PART_2 = 28303,
529     SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_N_PART_3 = 28304,
530     SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_E_PART_0 = 28305,
531     SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_E_PART_1 = 28306,
532     SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_E_PART_2 = 28307,
533     SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_E_PART_3 = 28308,
534     SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_S_PART_0 = 28309,
535     SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_S_PART_1 = 28310,
536     SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_S_PART_2 = 28311,
537     SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_S_PART_3 = 28312,
538     SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_W_PART_0 = 28313,
539     SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_W_PART_1 = 28314,
540     SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_W_PART_2 = 28315,
541     SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_W_PART_3 = 28316,
542     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_E_PART_0 = 28317,
543     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_E_PART_1 = 28318,
544     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_E_PART_2 = 28319,
545     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_E_PART_3 = 28320,
546     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_S_PART_0 = 28321,
547     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_S_PART_1 = 28322,
548     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_S_PART_2 = 28323,
549     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_S_PART_3 = 28324,
550     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_W_PART_0 = 28325,
551     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_W_PART_1 = 28326,
552     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_W_PART_2 = 28327,
553     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_W_PART_3 = 28328,
554     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_N_PART_0 = 28329,
555     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_N_PART_1 = 28330,
556     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_N_PART_2 = 28331,
557     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_N_PART_3 = 28332,
558     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_N_PART_0 = 28333,
559     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_N_PART_1 = 28334,
560     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_N_PART_2 = 28335,
561     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_N_PART_3 = 28336,
562     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_E_PART_0 = 28337,
563     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_E_PART_1 = 28338,
564     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_E_PART_2 = 28339,
565     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_E_PART_3 = 28340,
566     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_S_PART_0 = 28341,
567     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_S_PART_1 = 28342,
568     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_S_PART_2 = 28343,
569     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_S_PART_3 = 28344,
570     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_W_PART_0 = 28345,
571     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_W_PART_1 = 28346,
572     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_W_PART_2 = 28347,
573     SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_W_PART_3 = 28348,
574     SPR_JUNIOR_RC_DIAG_LEFT_BANK_W_E = 28349,
575     SPR_JUNIOR_RC_DIAG_LEFT_BANK_N_S = 28350,
576     SPR_JUNIOR_RC_DIAG_LEFT_BANK_E_W = 28351,
577     SPR_JUNIOR_RC_DIAG_LEFT_BANK_S_N = 28352,
578     SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_W_E = 28353,
579     SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_N_S = 28354,
580     SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_E_W = 28355,
581     SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_S_N = 28356,
582     SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_W_E_PART_0_2 = 28357,
583     SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_W_E = 28358,
584     SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_N_S = 28359,
585     SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_E_W = 28360,
586     SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_S_N = 28361,
587     SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_E_W_PART_0_2 = 28362,
588     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_W_E = 28363,
589     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_N_S = 28364,
590     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_E_W = 28365,
591     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_S_N = 28366,
592     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_W_E_PART_0_2 = 28367,
593     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_W_E = 28368,
594     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_N_S = 28369,
595     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_E_W = 28370,
596     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_S_N = 28371,
597     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_E_W_PART_0_2 = 28372,
598     SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_W_E = 28373,
599     SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_N_S = 28374,
600     SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_E_W = 28375,
601     SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_S_N = 28376,
602     SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_W_E_PART_0_2 = 28377,
603     SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_W_E = 28378,
604     SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_N_S = 28379,
605     SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_E_W = 28380,
606     SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_S_N = 28381,
607     SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_E_W_PART_0_2 = 28382,
608 
609     SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_SW_NE = SPR_G2_BEGIN + 33,
610     SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_NW_SE = SPR_G2_BEGIN + 34,
611     SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_NE_SW = SPR_G2_BEGIN + 35,
612     SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_SE_NW = SPR_G2_BEGIN + 36,
613     SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_NW_SE_PART_0_2 = SPR_G2_BEGIN + 37,
614     SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_NE_SW_PART_0_2 = SPR_G2_BEGIN + 38,
615 
616     SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_CHAIN_SW_NE = SPR_G2_BEGIN + 45,
617     SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_CHAIN_NW_SE = SPR_G2_BEGIN + 46,
618     SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_CHAIN_NE_SW = SPR_G2_BEGIN + 47,
619     SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_CHAIN_SE_NW = SPR_G2_BEGIN + 48,
620     SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_CHAIN_NW_SE_PART_0_2 = SPR_G2_BEGIN + 49,
621     SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_CHAIN_NE_SW_PART_0_2 = SPR_G2_BEGIN + 50,
622 
623     SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_SW_NE = SPR_G2_BEGIN + 39,
624     SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_NW_SE = SPR_G2_BEGIN + 40,
625     SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_NE_SW = SPR_G2_BEGIN + 41,
626     SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_SE_NW = SPR_G2_BEGIN + 42,
627     SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_NW_SE_PART_0_2 = SPR_G2_BEGIN + 43,
628     SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_NE_SW_PART_0_2 = SPR_G2_BEGIN + 44,
629 
630     SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_CHAIN_SW_NE = SPR_G2_BEGIN + 51,
631     SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_CHAIN_NW_SE = SPR_G2_BEGIN + 52,
632     SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_CHAIN_NE_SW = SPR_G2_BEGIN + 53,
633     SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_CHAIN_SE_NW = SPR_G2_BEGIN + 54,
634     SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_CHAIN_NW_SE_PART_0_2 = SPR_G2_BEGIN + 55,
635     SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_CHAIN_NE_SW_PART_0_2 = SPR_G2_BEGIN + 56,
636 
637     SPR_JUNIOR_RC_BOOSTER_NW_SE = SPR_G2_BEGIN + 83,
638     SPR_JUNIOR_RC_BOOSTER_NE_SW = SPR_G2_BEGIN + 84,
639 };
640 
641 static constexpr const uint32_t junior_rc_track_pieces_flat[3][4] = {
642     {
643         SPR_JUNIOR_RC_FLAT_SW_NE,
644         SPR_JUNIOR_RC_FLAT_NW_SE,
645         SPR_JUNIOR_RC_FLAT_SW_NE,
646         SPR_JUNIOR_RC_FLAT_NW_SE,
647     },
648     {
649         SPR_JUNIOR_RC_FLAT_CHAIN_SW_NE,
650         SPR_JUNIOR_RC_FLAT_CHAIN_NW_SE,
651         SPR_JUNIOR_RC_FLAT_CHAIN_SW_NE,
652         SPR_JUNIOR_RC_FLAT_CHAIN_NW_SE,
653     },
654     {
655         SPR_WATER_RC_FLAT_CHAIN_SW_NE,
656         SPR_WATER_RC_FLAT_CHAIN_NW_SE,
657         SPR_WATER_RC_FLAT_CHAIN_SW_NE,
658         SPR_WATER_RC_FLAT_CHAIN_NW_SE,
659     },
660 };
661 
662 static constexpr const uint32_t junior_rc_track_pieces_block_brake[2][4] = {
663     {
664         SPR_JUNIOR_RC_FLAT_BLOCK_SW_NE,
665         SPR_JUNIOR_RC_FLAT_BLOCK_NW_SE,
666         SPR_JUNIOR_RC_FLAT_BLOCK_SW_NE,
667         SPR_JUNIOR_RC_FLAT_BLOCK_NW_SE,
668     },
669     {
670         SPR_JUNIOR_RC_FLAT_BLOCK_SW_NE_BRAKED,
671         SPR_JUNIOR_RC_FLAT_BLOCK_NW_SE_BRAKED,
672         SPR_JUNIOR_RC_FLAT_BLOCK_SW_NE_BRAKED,
673         SPR_JUNIOR_RC_FLAT_BLOCK_NW_SE_BRAKED,
674     },
675 };
676 
677 static constexpr const uint32_t junior_rc_track_pieces_station[2][4] = {
678     {
679         SPR_JUNIOR_RC_STATION_SW_NE,
680         SPR_JUNIOR_RC_STATION_NW_SE,
681         SPR_JUNIOR_RC_STATION_SW_NE,
682         SPR_JUNIOR_RC_STATION_NW_SE,
683     },
684     {
685         SPR_JUNIOR_RC_FLAT_SW_NE_BRAKED,
686         SPR_JUNIOR_RC_FLAT_NW_SE_BRAKED,
687         SPR_JUNIOR_RC_FLAT_SW_NE_BRAKED,
688         SPR_JUNIOR_RC_FLAT_NW_SE_BRAKED,
689     },
690 };
691 
692 static constexpr const uint32_t junior_rc_track_pieces_25_deg_up[3][4] = {
693     {
694         SPR_JUNIOR_RC_25_DEG_SW_NE,
695         SPR_JUNIOR_RC_25_DEG_NW_SE,
696         SPR_JUNIOR_RC_25_DEG_NE_SW,
697         SPR_JUNIOR_RC_25_DEG_SE_NW,
698     },
699     {
700         SPR_JUNIOR_RC_25_DEG_CHAIN_SW_NE,
701         SPR_JUNIOR_RC_25_DEG_CHAIN_NW_SE,
702         SPR_JUNIOR_RC_25_DEG_CHAIN_NE_SW,
703         SPR_JUNIOR_RC_25_DEG_CHAIN_SE_NW,
704     },
705     {
706         SPR_WATER_RC_25_DEG_CHAIN_SW_NE,
707         SPR_WATER_RC_25_DEG_CHAIN_NW_SE,
708         SPR_WATER_RC_25_DEG_CHAIN_NE_SW,
709         SPR_WATER_RC_25_DEG_CHAIN_SE_NW,
710     },
711 };
712 
713 static constexpr const uint32_t junior_rc_track_pieces_flat_to_25_deg_up[3][4] = {
714     {
715         SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_SW_NE,
716         SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_NW_SE,
717         SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_NE_SW,
718         SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_SE_NW,
719     },
720     {
721         SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_CHAIN_SW_NE,
722         SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_CHAIN_NW_SE,
723         SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_CHAIN_NE_SW,
724         SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_CHAIN_SE_NW,
725     },
726     {
727         SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_SW_NE,
728         SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_NW_SE,
729         SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_NE_SW,
730         SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_SE_NW,
731     },
732 };
733 
734 static constexpr const uint32_t junior_rc_track_pieces_25_deg_up_to_flat[3][4] = {
735     {
736         SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_SW_NE,
737         SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_NW_SE,
738         SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_NE_SW,
739         SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_SE_NW,
740     },
741     {
742         SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_CHAIN_SW_NE,
743         SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_CHAIN_NW_SE,
744         SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_CHAIN_NE_SW,
745         SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_CHAIN_SE_NW,
746     },
747     {
748         SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_SW_NE,
749         SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_NW_SE,
750         SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_NE_SW,
751         SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_SE_NW,
752     },
753 };
754 
755 static constexpr const uint32_t junior_rc_track_pieces_flat_to_left_bank[4][2] = {
756     { SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_SW_NE, SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_SW_NE_FRONT },
757     { SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_NW_SE, SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_NW_SE_FRONT },
758     { SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_NE_SW, 0 },
759     { SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_SE_NW, 0 }
760 };
761 
762 static constexpr const uint32_t junior_rc_track_pieces_flat_to_right_bank[4][2] = {
763     { SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_SW_NE, 0 },
764     { SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_NW_SE, 0 },
765     { SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_NE_SW, SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_NE_SW_FRONT },
766     { SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_SE_NW, SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_SE_NW_FRONT },
767 };
768 
769 static constexpr const uint32_t junior_rc_track_pieces_flat_quarter_turn_5_tiles[4][5] = {
770     {
771         SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SW_SE_PART_0,
772         SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SW_SE_PART_1,
773         SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SW_SE_PART_2,
774         SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SW_SE_PART_3,
775         SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SW_SE_PART_4,
776     },
777     {
778         SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NW_SW_PART_0,
779         SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NW_SW_PART_1,
780         SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NW_SW_PART_2,
781         SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NW_SW_PART_3,
782         SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NW_SW_PART_4,
783     },
784     {
785         SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NE_NW_PART_0,
786         SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NE_NW_PART_1,
787         SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NE_NW_PART_2,
788         SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NE_NW_PART_3,
789         SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NE_NW_PART_4,
790     },
791     {
792         SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SE_NE_PART_0,
793         SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SE_NE_PART_1,
794         SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SE_NE_PART_2,
795         SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SE_NE_PART_3,
796         SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SE_NE_PART_4,
797     },
798 };
799 
800 static constexpr const uint32_t junior_rc_track_pieces_banked_quarter_turn_5_tiles[4][5] = {
801     {
802         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SW_SE_PART_0,
803         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SW_SE_PART_1,
804         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SW_SE_PART_2,
805         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SW_SE_PART_3,
806         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SW_SE_PART_4,
807     },
808     {
809         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_0,
810         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_1,
811         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_2,
812         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_3,
813         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_4,
814     },
815     {
816         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NE_NW_PART_0,
817         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NE_NW_PART_1,
818         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NE_NW_PART_2,
819         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NE_NW_PART_3,
820         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NE_NW_PART_4,
821     },
822     {
823         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_0,
824         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_1,
825         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_2,
826         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_3,
827         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_4,
828     },
829 };
830 
831 static constexpr const uint32_t junior_rc_track_pieces_left_banked_to_25_deg_up[4][2] = {
832     { SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_SW_NE, SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_SW_NE_FRONT },
833     { SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_NW_SE, SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_NW_SE_FRONT },
834     { SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_NE_SW, 0 },
835     { SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_SE_NW, 0 },
836 };
837 
838 static constexpr const uint32_t junior_rc_track_pieces_right_banked_to_25_deg_up[4][2] = {
839     { SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_SW_NE, 0 },
840     { SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_NW_SE, 0 },
841     { SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_NE_SW, SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_NE_SW_FRONT },
842     { SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_SE_NW, SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_SE_NW_FRONT },
843 };
844 
845 static constexpr const uint32_t junior_rc_track_pieces_25_deg_up_to_left_bank[4][2] = {
846     { SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_SW_NE, SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_SW_NE_FRONT },
847     { SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_NW_SE, SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_NW_SE_FRONT },
848     { SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_NE_SW, 0 },
849     { SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_SE_NW, 0 },
850 };
851 
852 static constexpr const uint32_t junior_rc_track_pieces_25_deg_up_to_right_bank[4][2] = {
853     { SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_SW_NE, 0 },
854     { SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_NW_SE, 0 },
855     { SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_NE_SW, SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_NE_SW_FRONT },
856     { SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_SE_NW, SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_SE_NW_FRONT },
857 };
858 
859 static constexpr const uint32_t junior_rc_track_pieces_left_bank[4] = {
860     SPR_JUNIOR_RC_LEFT_BANK_SW_NE,
861     SPR_JUNIOR_RC_LEFT_BANK_NW_SE,
862     SPR_JUNIOR_RC_LEFT_BANK_NE_SW,
863     SPR_JUNIOR_RC_LEFT_BANK_SE_NW,
864 };
865 
866 static constexpr const uint32_t junior_rc_track_pieces_left_quarter_turn_5_tiles_25_deg_up[2][4][5] = {
867     {
868         {
869             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_0,
870             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_1,
871             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_2,
872             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_3,
873             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_4,
874         },
875         {
876             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_0,
877             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_1,
878             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_2,
879             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_3,
880             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_4,
881         },
882         {
883             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_0,
884             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_1,
885             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_2,
886             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_3,
887             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_4,
888         },
889         {
890             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_0,
891             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_1,
892             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_2,
893             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_3,
894             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_4,
895         },
896     },
897     {
898         {
899             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_0,
900             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_1,
901             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_2,
902             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_3,
903             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_4,
904         },
905         {
906             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_0,
907             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_1,
908             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_2,
909             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_3,
910             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_4,
911         },
912         {
913             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_0,
914             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_1,
915             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_2,
916             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_3,
917             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_4,
918         },
919         {
920             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_0,
921             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_1,
922             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_2,
923             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_3,
924             SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_4,
925         },
926     },
927 };
928 
929 static constexpr const CoordsXY junior_rc_left_quarter_turn_5_tiles_25_deg_up_offsets[4][5] = {
930     {
931         { 0, 6 },
932         { 0, 0 },
933         { 0, 16 },
934         { 16, 0 },
935         { 6, 0 },
936     },
937     {
938         { 6, 0 },
939         { 0, 0 },
940         { 16, 16 },
941         { 0, 0 },
942         { 0, 6 },
943     },
944     {
945         { 0, 6 },
946         { 0, 16 },
947         { 16, 0 },
948         { 0, 0 },
949         { 6, 0 },
950     },
951     {
952         { 6, 0 },
953         { 16, 0 },
954         { 0, 0 },
955         { 0, 16 },
956         { 0, 6 },
957     },
958 };
959 
960 static constexpr const uint32_t junior_rc_track_pieces_right_quarter_turn_5_tiles_25_deg_up[2][4][5] = {
961     {
962         {
963             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_0,
964             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_1,
965             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_2,
966             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_3,
967             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_4,
968         },
969         {
970             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_0,
971             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_1,
972             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_2,
973             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_3,
974             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_4,
975         },
976         {
977             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_0,
978             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_1,
979             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_2,
980             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_3,
981             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_4,
982         },
983         {
984             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_0,
985             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_1,
986             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_2,
987             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_3,
988             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_4,
989         },
990     },
991     {
992         {
993             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_0,
994             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_1,
995             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_2,
996             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_3,
997             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_4,
998         },
999         {
1000             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_0,
1001             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_1,
1002             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_2,
1003             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_3,
1004             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_4,
1005         },
1006         {
1007             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_0,
1008             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_1,
1009             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_2,
1010             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_3,
1011             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_4,
1012         },
1013         {
1014             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_0,
1015             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_1,
1016             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_2,
1017             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_3,
1018             SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_4,
1019         },
1020     },
1021 };
1022 
1023 static constexpr const uint32_t junior_rc_track_pieces_s_bend_left[2][4] = {
1024     {
1025         SPR_JUNIOR_RC_S_BEND_LEFT_SW_NE_PART_0,
1026         SPR_JUNIOR_RC_S_BEND_LEFT_SW_NE_PART_1,
1027         SPR_JUNIOR_RC_S_BEND_LEFT_SW_NE_PART_2,
1028         SPR_JUNIOR_RC_S_BEND_LEFT_SW_NE_PART_3,
1029     },
1030     {
1031         SPR_JUNIOR_RC_S_BEND_LEFT_SE_NW_PART_3,
1032         SPR_JUNIOR_RC_S_BEND_LEFT_SE_NW_PART_2,
1033         SPR_JUNIOR_RC_S_BEND_LEFT_SE_NW_PART_1,
1034         SPR_JUNIOR_RC_S_BEND_LEFT_SE_NW_PART_0,
1035     },
1036 };
1037 
1038 static constexpr const uint32_t junior_rc_track_pieces_s_bend_right[2][4] = {
1039     {
1040         SPR_JUNIOR_RC_S_BEND_RIGHT_SW_NE_PART_0,
1041         SPR_JUNIOR_RC_S_BEND_RIGHT_SW_NE_PART_1,
1042         SPR_JUNIOR_RC_S_BEND_RIGHT_SW_NE_PART_2,
1043         SPR_JUNIOR_RC_S_BEND_RIGHT_SW_NE_PART_3,
1044     },
1045     {
1046         SPR_JUNIOR_RC_S_BEND_RIGHT_SE_NW_PART_3,
1047         SPR_JUNIOR_RC_S_BEND_RIGHT_SE_NW_PART_2,
1048         SPR_JUNIOR_RC_S_BEND_RIGHT_SE_NW_PART_1,
1049         SPR_JUNIOR_RC_S_BEND_RIGHT_SE_NW_PART_0,
1050     },
1051 };
1052 
1053 static constexpr const uint32_t junior_rc_track_pieces_flat_quarter_turn_3_tiles[4][3] = {
1054     {
1055         SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SW_SE_PART_0,
1056         SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SW_SE_PART_1,
1057         SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SW_SE_PART_2,
1058     },
1059     {
1060         SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NW_SW_PART_0,
1061         SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NW_SW_PART_1,
1062         SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NW_SW_PART_2,
1063     },
1064     {
1065         SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NE_NW_PART_0,
1066         SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NE_NW_PART_1,
1067         SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NE_NW_PART_2,
1068     },
1069     {
1070         SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SE_NE_PART_0,
1071         SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SE_NE_PART_1,
1072         SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SE_NE_PART_2,
1073     },
1074 };
1075 
1076 static constexpr const uint32_t junior_rc_track_pieces_banked_quarter_turn_3_tiles[4][3] = {
1077     {
1078         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SW_SE_PART_0,
1079         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SW_SE_PART_1,
1080         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SW_SE_PART_2,
1081     },
1082     {
1083         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NW_SW_PART_0,
1084         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NW_SW_PART_1,
1085         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NW_SW_PART_2,
1086     },
1087     {
1088         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NE_NW_PART_0,
1089         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NE_NW_PART_1,
1090         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NE_NW_PART_2,
1091     },
1092     {
1093         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SE_NE_PART_0,
1094         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SE_NE_PART_1,
1095         SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SE_NE_PART_2,
1096     },
1097 };
1098 
1099 static constexpr const uint32_t junior_rc_track_pieces_right_quarter_turn_3_tiles_25_deg_up[2][4][2] = {
1100     {
1101         { SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_SW_SE_PART_0,
1102           SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_SW_SE_PART_1 },
1103         { SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_NW_SW_PART_0,
1104           SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_NW_SW_PART_1 },
1105         { SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_NE_NW_PART_0,
1106           SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_NE_NW_PART_1 },
1107         { SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_SE_NE_PART_0,
1108           SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_SE_NE_PART_1 },
1109     },
1110     {
1111         { SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_SW_SE_PART_0,
1112           SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_SW_SE_PART_1 },
1113         { SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_NW_SW_PART_0,
1114           SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_NW_SW_PART_1 },
1115         { SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_NE_NW_PART_0,
1116           SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_NE_NW_PART_1 },
1117         { SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_SE_NE_PART_0,
1118           SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_SE_NE_PART_1 },
1119     },
1120 };
1121 
1122 static constexpr const uint32_t junior_rc_track_pieces_right_quarter_turn_3_tiles_25_deg_down[2][4][2] = {
1123     {
1124         { SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_SW_SE_PART_0,
1125           SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_SW_SE_PART_1 },
1126         { SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_NW_SW_PART_0,
1127           SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_NW_SW_PART_1 },
1128         { SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_NE_NW_PART_0,
1129           SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_NE_NW_PART_1 },
1130         { SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_SE_NE_PART_0,
1131           SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_SE_NE_PART_1 },
1132     },
1133     {
1134         { SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_SW_SE_PART_0,
1135           SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_SW_SE_PART_1 },
1136         { SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_NW_SW_PART_0,
1137           SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_NW_SW_PART_1 },
1138         { SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_NE_NW_PART_0,
1139           SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_NE_NW_PART_1 },
1140         { SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_SE_NE_PART_0,
1141           SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_SE_NE_PART_1 },
1142     },
1143 };
1144 
1145 static constexpr const uint32_t junior_rc_track_pieces_right_half_banked_helix_up_small_quarter_tiles[4][3][2] = {
1146     {
1147         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SW_SE_PART_0 },
1148         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SW_SE_PART_1 },
1149         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SW_SE_PART_2 },
1150     },
1151     {
1152         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NW_SW_PART_0 },
1153         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NW_SW_PART_1 },
1154         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NW_SW_PART_2,
1155           SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NW_SW_PART_2_2 },
1156     },
1157     {
1158         { 0, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NE_NW_PART_0 },
1159         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NE_NW_PART_1 },
1160         { 0, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NE_NW_PART_2 },
1161     },
1162     {
1163         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SE_NE_PART_0,
1164           SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SE_NE_PART_0_2 },
1165         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SE_NE_PART_1 },
1166         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SE_NE_PART_2 },
1167     },
1168 };
1169 
1170 static constexpr const uint32_t junior_rc_track_pieces_right_half_banked_helix_down_small_quarter_tiles[4][3][2] = {
1171     {
1172         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SW_SE_PART_0 },
1173         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SW_SE_PART_1 },
1174         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SW_SE_PART_2 },
1175     },
1176     {
1177         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NW_SW_PART_0 },
1178         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NW_SW_PART_1 },
1179         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NW_SW_PART_2,
1180           SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NW_SW_PART_2_2 },
1181     },
1182     {
1183         { 0, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NE_NW_PART_0 },
1184         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NE_NW_PART_1 },
1185         { 0, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NE_NW_PART_2 },
1186     },
1187     {
1188         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SE_NE_PART_0,
1189           SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SE_NE_PART_0_2 },
1190         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SE_NE_PART_1 },
1191         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SE_NE_PART_2 },
1192     },
1193 };
1194 
1195 static constexpr const uint32_t junior_rc_track_pieces_right_half_banked_helix_up_large_quarter_tiles[4][5][2] = {
1196     {
1197         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SW_SE_PART_0 },
1198         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SW_SE_PART_1 },
1199         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SW_SE_PART_2 },
1200         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SW_SE_PART_3 },
1201         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SW_SE_PART_4 },
1202     },
1203     {
1204         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_0 },
1205         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_1 },
1206         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_2 },
1207         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_3 },
1208         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_4,
1209           SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_4_2 },
1210     },
1211     {
1212         { 0, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NE_NW_PART_0 },
1213         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NE_NW_PART_1 },
1214         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NE_NW_PART_2 },
1215         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NE_NW_PART_3 },
1216         { 0, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NE_NW_PART_4 },
1217     },
1218     {
1219         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_0,
1220           SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_0_2 },
1221         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_1 },
1222         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_2 },
1223         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_3 },
1224         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_4 },
1225     },
1226 };
1227 
1228 static constexpr const uint32_t junior_rc_track_pieces_right_half_banked_helix_down_large_quarter_tiles[4][5][2] = {
1229     {
1230         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SW_SE_PART_0 },
1231         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SW_SE_PART_1 },
1232         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SW_SE_PART_2 },
1233         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SW_SE_PART_3 },
1234         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SW_SE_PART_4 },
1235     },
1236     {
1237         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_0 },
1238         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_1 },
1239         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_2 },
1240         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_3 },
1241         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_4,
1242           SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_4_2 },
1243     },
1244     {
1245         { 0, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NE_NW_PART_0 },
1246         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NE_NW_PART_1 },
1247         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NE_NW_PART_2 },
1248         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NE_NW_PART_3 },
1249         { 0, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NE_NW_PART_4 },
1250     },
1251     {
1252         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_0,
1253           SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_0_2 },
1254         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_1 },
1255         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_2 },
1256         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_3 },
1257         { SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_4 },
1258     },
1259 };
1260 
1261 static constexpr const uint32_t junior_rc_track_pieces_brake[4] = {
1262     SPR_JUNIOR_RC_FLAT_SW_NE_BRAKED,
1263     SPR_JUNIOR_RC_FLAT_NW_SE_BRAKED,
1264     SPR_JUNIOR_RC_FLAT_SW_NE_BRAKED,
1265     SPR_JUNIOR_RC_FLAT_NW_SE_BRAKED,
1266 };
1267 
1268 static constexpr const uint32_t junior_rc_track_pieces_left_eight_to_diag[4][4] = {
1269     {
1270         SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_N_PART_0,
1271         SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_N_PART_1,
1272         SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_N_PART_2,
1273         SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_N_PART_3,
1274     },
1275     {
1276         SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_E_PART_0,
1277         SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_E_PART_1,
1278         SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_E_PART_2,
1279         SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_E_PART_3,
1280     },
1281     {
1282         SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_S_PART_0,
1283         SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_S_PART_1,
1284         SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_S_PART_2,
1285         SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_S_PART_3,
1286     },
1287     {
1288         SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_W_PART_0,
1289         SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_W_PART_1,
1290         SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_W_PART_2,
1291         SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_W_PART_3,
1292     },
1293 };
1294 
1295 static constexpr const uint32_t junior_rc_track_pieces_right_eight_to_diag[4][4] = {
1296     {
1297         SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_E_PART_0,
1298         SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_E_PART_1,
1299         SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_E_PART_2,
1300         SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_E_PART_3,
1301     },
1302     {
1303         SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_S_PART_0,
1304         SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_S_PART_1,
1305         SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_S_PART_2,
1306         SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_S_PART_3,
1307     },
1308     {
1309         SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_W_PART_0,
1310         SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_W_PART_1,
1311         SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_W_PART_2,
1312         SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_W_PART_3,
1313     },
1314     {
1315         SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_N_PART_0,
1316         SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_N_PART_1,
1317         SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_N_PART_2,
1318         SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_N_PART_3,
1319     },
1320 };
1321 
1322 static constexpr const uint32_t junior_rc_track_pieces_left_eight_to_diag_bank[4][4] = {
1323     {
1324         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_N_PART_0,
1325         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_N_PART_1,
1326         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_N_PART_2,
1327         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_N_PART_3,
1328     },
1329     {
1330         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_E_PART_0,
1331         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_E_PART_1,
1332         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_E_PART_2,
1333         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_E_PART_3,
1334     },
1335     {
1336         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_S_PART_0,
1337         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_S_PART_1,
1338         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_S_PART_2,
1339         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_S_PART_3,
1340     },
1341     {
1342         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_W_PART_0,
1343         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_W_PART_1,
1344         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_W_PART_2,
1345         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_W_PART_3,
1346     },
1347 };
1348 
1349 static constexpr const uint32_t junior_rc_track_pieces_right_eight_to_diag_bank[4][4] = {
1350     {
1351         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_E_PART_0,
1352         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_E_PART_1,
1353         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_E_PART_2,
1354         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_E_PART_3,
1355     },
1356     {
1357         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_S_PART_0,
1358         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_S_PART_1,
1359         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_S_PART_2,
1360         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_S_PART_3,
1361     },
1362     {
1363         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_W_PART_0,
1364         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_W_PART_1,
1365         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_W_PART_2,
1366         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_W_PART_3,
1367     },
1368     {
1369         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_N_PART_0,
1370         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_N_PART_1,
1371         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_N_PART_2,
1372         SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_N_PART_3,
1373     },
1374 };
1375 
1376 static constexpr const uint32_t junior_rc_track_pieces_diag_flat[3][4] = {
1377     {
1378         SPR_JUNIOR_RC_DIAG_FLAT_W_E,
1379         SPR_JUNIOR_RC_DIAG_FLAT_N_S,
1380         SPR_JUNIOR_RC_DIAG_FLAT_E_W,
1381         SPR_JUNIOR_RC_DIAG_FLAT_S_N,
1382     },
1383     {
1384         SPR_JUNIOR_RC_DIAG_FLAT_CHAIN_W_E,
1385         SPR_JUNIOR_RC_DIAG_FLAT_CHAIN_N_S,
1386         SPR_JUNIOR_RC_DIAG_FLAT_CHAIN_E_W,
1387         SPR_JUNIOR_RC_DIAG_FLAT_CHAIN_S_N,
1388     },
1389     {
1390         SPR_WATER_RC_DIAG_FLAT_CHAIN_W_E,
1391         SPR_WATER_RC_DIAG_FLAT_CHAIN_N_S,
1392         SPR_WATER_RC_DIAG_FLAT_CHAIN_E_W,
1393         SPR_WATER_RC_DIAG_FLAT_CHAIN_S_N,
1394     },
1395 };
1396 
1397 static constexpr const uint32_t junior_rc_track_pieces_diag_25_deg_up[3][4] = {
1398     {
1399         SPR_JUNIOR_RC_DIAG_25_DEG_UP_W_E,
1400         SPR_JUNIOR_RC_DIAG_25_DEG_UP_N_S,
1401         SPR_JUNIOR_RC_DIAG_25_DEG_UP_E_W,
1402         SPR_JUNIOR_RC_DIAG_25_DEG_UP_S_N,
1403     },
1404     {
1405         SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_W_E,
1406         SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_N_S,
1407         SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_E_W,
1408         SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_S_N,
1409     },
1410     {
1411         SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_W_E,
1412         SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_N_S,
1413         SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_E_W,
1414         SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_S_N,
1415     },
1416 };
1417 
1418 static constexpr const uint32_t junior_rc_track_pieces_diag_flat_to_25_deg_up[3][4] = {
1419     {
1420         SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_W_E,
1421         SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_N_S,
1422         SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_E_W,
1423         SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_S_N,
1424     },
1425     {
1426         SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_W_E,
1427         SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_N_S,
1428         SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_E_W,
1429         SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_S_N,
1430     },
1431     {
1432         SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_W_E,
1433         SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_N_S,
1434         SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_E_W,
1435         SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_S_N,
1436     },
1437 };
1438 
1439 static constexpr const uint32_t junior_rc_track_pieces_diag_flat_to_60_deg_up[2][4] = {
1440     {
1441         SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_W_E,
1442         SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_N_S,
1443         SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_E_W,
1444         SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_S_N,
1445     },
1446     {
1447         SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_CHAIN_W_E,
1448         SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_CHAIN_N_S,
1449         SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_CHAIN_E_W,
1450         SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_CHAIN_S_N,
1451     },
1452 };
1453 
1454 static constexpr const uint32_t junior_rc_track_pieces_diag_25_deg_up_to_flat[3][4] = {
1455     {
1456         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_W_E,
1457         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_N_S,
1458         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_E_W,
1459         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_S_N,
1460     },
1461     {
1462         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_W_E,
1463         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_N_S,
1464         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_E_W,
1465         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_S_N,
1466     },
1467     {
1468         SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_W_E,
1469         SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_N_S,
1470         SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_E_W,
1471         SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_S_N,
1472     },
1473 };
1474 
1475 static constexpr const uint32_t junior_rc_track_pieces_diag_60_deg_up_to_flat[2][4] = {
1476     {
1477         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_W_E,
1478         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_N_S,
1479         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_E_W,
1480         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_S_N,
1481     },
1482     {
1483         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_CHAIN_W_E,
1484         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_CHAIN_N_S,
1485         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_CHAIN_E_W,
1486         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_CHAIN_S_N,
1487     },
1488 };
1489 
1490 static constexpr const uint32_t junior_rc_track_pieces_diag_25_deg_down[3][4] = {
1491     {
1492         SPR_JUNIOR_RC_DIAG_25_DEG_UP_E_W,
1493         SPR_JUNIOR_RC_DIAG_25_DEG_UP_S_N,
1494         SPR_JUNIOR_RC_DIAG_25_DEG_UP_W_E,
1495         SPR_JUNIOR_RC_DIAG_25_DEG_UP_N_S,
1496     },
1497     {
1498         SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_E_W,
1499         SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_S_N,
1500         SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_W_E,
1501         SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_N_S,
1502     },
1503     {
1504         SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_E_W,
1505         SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_S_N,
1506         SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_W_E,
1507         SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_N_S,
1508     },
1509 };
1510 
1511 static constexpr const uint32_t junior_rc_track_pieces_diag_flat_to_25_deg_down[3][4] = {
1512     {
1513         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_E_W,
1514         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_S_N,
1515         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_W_E,
1516         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_N_S,
1517     },
1518     {
1519         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_E_W,
1520         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_S_N,
1521         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_W_E,
1522         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_N_S,
1523     },
1524     {
1525         SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_E_W,
1526         SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_S_N,
1527         SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_W_E,
1528         SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_N_S,
1529     },
1530 };
1531 
1532 static constexpr const uint32_t junior_rc_track_pieces_diag_flat_to_60_deg_down[2][4] = {
1533     {
1534         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_E_W,
1535         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_S_N,
1536         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_W_E,
1537         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_N_S,
1538     },
1539     {
1540         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_CHAIN_E_W,
1541         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_CHAIN_S_N,
1542         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_CHAIN_W_E,
1543         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_FLAT_CHAIN_N_S,
1544     },
1545 };
1546 
1547 static constexpr const uint32_t junior_rc_track_pieces_diag_25_deg_down_to_flat[3][4] = {
1548     {
1549         SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_E_W,
1550         SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_S_N,
1551         SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_W_E,
1552         SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_N_S,
1553     },
1554     {
1555         SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_E_W,
1556         SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_S_N,
1557         SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_W_E,
1558         SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_N_S,
1559     },
1560     {
1561         SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_E_W,
1562         SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_S_N,
1563         SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_W_E,
1564         SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_N_S,
1565     },
1566 };
1567 
1568 static constexpr const uint32_t junior_rc_track_pieces_diag_60_deg_down_to_flat[2][4] = {
1569     {
1570         SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_E_W,
1571         SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_S_N,
1572         SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_W_E,
1573         SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_N_S,
1574     },
1575     {
1576         SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_CHAIN_E_W,
1577         SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_CHAIN_S_N,
1578         SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_CHAIN_W_E,
1579         SPR_JUNIOR_RC_DIAG_FLAT_TO_60_DEG_UP_CHAIN_N_S,
1580     },
1581 };
1582 
1583 static constexpr const uint32_t junior_rc_track_pieces_diag_flat_to_left_bank[4] = {
1584     SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_W_E,
1585     SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_N_S,
1586     SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_E_W,
1587     SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_S_N,
1588 };
1589 
1590 static constexpr const uint32_t junior_rc_track_pieces_diag_flat_to_right_bank[4] = {
1591     SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_W_E,
1592     SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_N_S,
1593     SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_E_W,
1594     SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_S_N,
1595 };
1596 
1597 static constexpr const uint32_t junior_rc_track_pieces_diag_right_bank_to_flat[4] = {
1598     SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_E_W,
1599     SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_S_N,
1600     SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_W_E,
1601     SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_N_S,
1602 };
1603 
1604 static constexpr const uint32_t junior_rc_track_pieces_diag_left_bank_to_flat[4] = {
1605     SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_E_W,
1606     SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_S_N,
1607     SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_W_E,
1608     SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_N_S,
1609 };
1610 
1611 static constexpr const uint32_t junior_rc_track_pieces_diag_left_bank_to_25_deg_up[4] = {
1612     SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_W_E,
1613     SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_N_S,
1614     SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_E_W,
1615     SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_S_N,
1616 };
1617 
1618 static constexpr const uint32_t junior_rc_track_pieces_diag_right_bank_to_25_deg_up[4] = {
1619     SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_W_E,
1620     SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_N_S,
1621     SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_E_W,
1622     SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_S_N,
1623 };
1624 
1625 static constexpr const uint32_t junior_rc_track_pieces_diag_25_deg_up_to_left_bank[4] = {
1626     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_W_E,
1627     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_N_S,
1628     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_E_W,
1629     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_S_N,
1630 };
1631 
1632 static constexpr const uint32_t junior_rc_track_pieces_diag_25_deg_up_to_right_bank[4] = {
1633     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_W_E,
1634     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_N_S,
1635     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_E_W,
1636     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_S_N,
1637 };
1638 
1639 static constexpr const uint32_t junior_rc_track_pieces_diag_right_bank_to_25_deg_down[4] = {
1640     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_E_W,
1641     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_S_N,
1642     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_W_E,
1643     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_N_S,
1644 };
1645 
1646 static constexpr const uint32_t junior_rc_track_pieces_diag_left_bank_to_25_deg_down[4] = {
1647     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_E_W,
1648     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_S_N,
1649     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_W_E,
1650     SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_N_S,
1651 };
1652 
1653 static constexpr const uint32_t junior_rc_track_pieces_diag_25_deg_down_to_right_bank[4] = {
1654     SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_E_W,
1655     SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_S_N,
1656     SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_W_E,
1657     SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_N_S,
1658 };
1659 
1660 static constexpr const uint32_t junior_rc_track_pieces_diag_25_deg_down_to_left_bank[4] = {
1661     SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_E_W,
1662     SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_S_N,
1663     SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_W_E,
1664     SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_N_S,
1665 };
1666 
1667 static constexpr const uint32_t junior_rc_track_pieces_diag_left_bank[4] = {
1668     SPR_JUNIOR_RC_DIAG_LEFT_BANK_W_E,
1669     SPR_JUNIOR_RC_DIAG_LEFT_BANK_N_S,
1670     SPR_JUNIOR_RC_DIAG_LEFT_BANK_E_W,
1671     SPR_JUNIOR_RC_DIAG_LEFT_BANK_S_N,
1672 };
1673 
1674 static constexpr const uint32_t junior_rc_track_pieces_diag_right_bank[4] = {
1675     SPR_JUNIOR_RC_DIAG_LEFT_BANK_E_W,
1676     SPR_JUNIOR_RC_DIAG_LEFT_BANK_S_N,
1677     SPR_JUNIOR_RC_DIAG_LEFT_BANK_W_E,
1678     SPR_JUNIOR_RC_DIAG_LEFT_BANK_N_S,
1679 };
1680 
1681 static constexpr const uint32_t junior_rc_track_pieces_flat_to_60_deg_up[2][4][2] = {
1682     {
1683         { SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_SW_NE, 0 },
1684         { SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_NW_SE, SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_NW_SE_PART_0_2 },
1685         { SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_NE_SW, SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_NE_SW_PART_0_2 },
1686         { SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_SE_NW, 0 },
1687     },
1688     {
1689         { SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_CHAIN_SW_NE, 0 },
1690         { SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_CHAIN_NW_SE, SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_CHAIN_NW_SE_PART_0_2 },
1691         { SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_CHAIN_NE_SW, SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_CHAIN_NE_SW_PART_0_2 },
1692         { SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_CHAIN_SE_NW, 0 },
1693     },
1694 };
1695 
1696 static constexpr const uint32_t junior_rc_track_pieces_60_deg_up_to_flat[2][4][2] = {
1697     {
1698         { SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_SW_NE, 0 },
1699         { SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_NW_SE, SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_NW_SE_PART_0_2 },
1700         { SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_NE_SW, SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_NE_SW_PART_0_2 },
1701         { SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_SE_NW, 0 },
1702     },
1703     {
1704         { SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_CHAIN_SW_NE, 0 },
1705         { SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_CHAIN_NW_SE, SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_CHAIN_NW_SE_PART_0_2 },
1706         { SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_CHAIN_NE_SW, SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_CHAIN_NE_SW_PART_0_2 },
1707         { SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_CHAIN_SE_NW, 0 },
1708     },
1709 };
1710 
1711 static constexpr const uint32_t junior_rc_track_pieces_60_deg_up[2][4] = {
1712     {
1713         SPR_JUNIOR_RC_60_DEG_SW_NE,
1714         SPR_JUNIOR_RC_60_DEG_NW_SE,
1715         SPR_JUNIOR_RC_60_DEG_NE_SW,
1716         SPR_JUNIOR_RC_60_DEG_SE_NW,
1717     },
1718     {
1719         SPR_JUNIOR_RC_60_DEG_CHAIN_SW_NE,
1720         SPR_JUNIOR_RC_60_DEG_CHAIN_NW_SE,
1721         SPR_JUNIOR_RC_60_DEG_CHAIN_NE_SW,
1722         SPR_JUNIOR_RC_60_DEG_CHAIN_SE_NW,
1723     },
1724 };
1725 
1726 static constexpr const uint32_t junior_rc_track_pieces_25_deg_up_to_60_deg_up[2][4][2] = {
1727     {
1728         { SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_SW_NE, 0 },
1729         { SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_NW_SE, SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_NW_SE_PART_0_2 },
1730         { SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_NE_SW, SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_NE_SW_PART_0_2 },
1731         { SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_SE_NW, 0 },
1732     },
1733     {
1734         { SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_CHAIN_SW_NE, 0 },
1735         { SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_CHAIN_NW_SE, SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_CHAIN_NW_SE_PART_0_2 },
1736         { SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_CHAIN_NE_SW, SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_CHAIN_NE_SW_PART_0_2 },
1737         { SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_CHAIN_SE_NW, 0 },
1738     },
1739 };
1740 
1741 static constexpr const uint32_t junior_rc_track_pieces_60_deg_up_to_25_deg_up[2][4][2] = {
1742     {
1743         { SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_SW_NE, 0 },
1744         { SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_NW_SE, SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_NW_SE_PART_0_2 },
1745         { SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_NE_SW, SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_NE_SW_PART_0_2 },
1746         { SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_SE_NW, 0 },
1747     },
1748     {
1749         { SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_CHAIN_SW_NE, 0 },
1750         { SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_CHAIN_NW_SE, SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_CHAIN_NW_SE_PART_0_2 },
1751         { SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_CHAIN_NE_SW, SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_CHAIN_NE_SW_PART_0_2 },
1752         { SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_CHAIN_SE_NW, 0 },
1753     }
1754 };
1755 
1756 static constexpr const uint32_t junior_rc_track_pieces_diag_60_deg_up[2][4] = {
1757     {
1758         SPR_JUNIOR_RC_DIAG_60_DEG_UP_W_E,
1759         SPR_JUNIOR_RC_DIAG_60_DEG_UP_N_S,
1760         SPR_JUNIOR_RC_DIAG_60_DEG_UP_E_W,
1761         SPR_JUNIOR_RC_DIAG_60_DEG_UP_S_N,
1762     },
1763     {
1764         SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_W_E,
1765         SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_N_S,
1766         SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_E_W,
1767         SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_S_N,
1768     },
1769 };
1770 
1771 static constexpr const uint32_t junior_rc_track_pieces_diag_60_deg_down[2][4] = {
1772     {
1773         SPR_JUNIOR_RC_DIAG_60_DEG_UP_E_W,
1774         SPR_JUNIOR_RC_DIAG_60_DEG_UP_S_N,
1775         SPR_JUNIOR_RC_DIAG_60_DEG_UP_W_E,
1776         SPR_JUNIOR_RC_DIAG_60_DEG_UP_N_S,
1777     },
1778     {
1779         SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_E_W,
1780         SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_S_N,
1781         SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_W_E,
1782         SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_N_S,
1783     },
1784 };
1785 
1786 static constexpr const uint32_t junior_rc_track_pieces_diag_25_deg_up_to_60_deg_up[2][4] = {
1787     {
1788         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_W_E,
1789         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_N_S,
1790         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_E_W,
1791         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_S_N,
1792     },
1793     {
1794         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_W_E,
1795         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_N_S,
1796         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_E_W,
1797         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_S_N,
1798     },
1799 };
1800 
1801 static constexpr const uint32_t junior_rc_track_pieces_diag_60_deg_up_to_25_deg_up[2][4] = {
1802     {
1803         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_W_E,
1804         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_N_S,
1805         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_E_W,
1806         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_S_N,
1807     },
1808     {
1809         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_W_E,
1810         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_N_S,
1811         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_E_W,
1812         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_S_N,
1813     },
1814 };
1815 
1816 static constexpr const uint32_t junior_rc_track_pieces_diag_25_deg_down_to_60_deg_down[2][4] = {
1817     {
1818         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_E_W,
1819         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_S_N,
1820         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_W_E,
1821         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_N_S,
1822     },
1823     {
1824         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_E_W,
1825         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_S_N,
1826         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_W_E,
1827         SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_N_S,
1828     },
1829 };
1830 
1831 static constexpr const uint32_t junior_rc_track_pieces_diag_60_deg_down_to_25_deg_down[2][4] = {
1832     {
1833         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_E_W,
1834         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_S_N,
1835         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_W_E,
1836         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_N_S,
1837     },
1838     {
1839         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_E_W,
1840         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_S_N,
1841         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_W_E,
1842         SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_N_S,
1843     },
1844 };
1845 
junior_rc_paint_track_flat(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)1846 void junior_rc_paint_track_flat(
1847     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
1848     const TrackElement& trackElement, JuniorRcChainType chainType)
1849 {
1850     uint32_t imageId = junior_rc_track_pieces_flat[EnumValue(chainType)][direction] | session->TrackColours[SCHEME_TRACK];
1851     PaintAddImageAsParentRotated(session, direction, imageId, 0, 6, 32, 20, 1, height);
1852     paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
1853 
1854     if (track_paint_util_should_paint_supports(session->MapPosition))
1855     {
1856         metal_a_supports_paint_setup(
1857             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, height,
1858             session->TrackColours[SCHEME_SUPPORTS]);
1859     }
1860 
1861     paint_util_set_segment_support_height(
1862         session, paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC, direction), 0xFFFF, 0);
1863     paint_util_set_general_support_height(session, height + 32, 0x20);
1864 }
1865 
junior_rc_paint_station(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,uint8_t rideType)1866 void junior_rc_paint_station(
1867     paint_session* session, const Ride* ride, [[maybe_unused]] uint8_t trackSequence, uint8_t direction, uint16_t height,
1868     const TrackElement& trackElement, uint8_t rideType)
1869 {
1870     uint32_t imageId;
1871 
1872     bool isBraked = trackElement.BlockBrakeClosed();
1873 
1874     if (direction == 0 || direction == 2)
1875     {
1876         // height -= 2 (height - 2)
1877         imageId = SPR_STATION_BASE_B_SW_NE | session->TrackColours[SCHEME_MISC];
1878         PaintAddImageAsParent(session, imageId, { 0, 0, height - 2 }, { 32, 28, 1 }, { 0, 2, height });
1879 
1880         // height += 2 (height)
1881         if (trackElement.GetTrackType() == TrackElemType::EndStation && rideType == RIDE_TYPE_JUNIOR_ROLLER_COASTER)
1882         {
1883             imageId = junior_rc_track_pieces_block_brake[isBraked][direction] | session->TrackColours[SCHEME_TRACK];
1884         }
1885         else
1886         {
1887             imageId = junior_rc_track_pieces_station[false][direction] | session->TrackColours[SCHEME_TRACK];
1888         }
1889         PaintAddImageAsChild(session, imageId, 0, 6, 32, 20, 1, height, 0, 0, height);
1890 
1891         metal_a_supports_paint_setup(session, METAL_SUPPORTS_BOXED, 5, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1892         metal_a_supports_paint_setup(session, METAL_SUPPORTS_BOXED, 8, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1893 
1894         paint_util_push_tunnel_left(session, height, TUNNEL_SQUARE_FLAT);
1895     }
1896     else if (direction == 1 || direction == 3)
1897     {
1898         // height -= 2 (height - 2)
1899         imageId = SPR_STATION_BASE_B_NW_SE | session->TrackColours[SCHEME_MISC];
1900         PaintAddImageAsParent(session, imageId, { 0, 0, height - 2 }, { 28, 32, 1 }, { 2, 0, height });
1901 
1902         // height += 2 (height)
1903         if (trackElement.GetTrackType() == TrackElemType::EndStation && rideType == RIDE_TYPE_JUNIOR_ROLLER_COASTER)
1904         {
1905             imageId = junior_rc_track_pieces_block_brake[isBraked][direction] | session->TrackColours[SCHEME_TRACK];
1906         }
1907         else
1908         {
1909             imageId = junior_rc_track_pieces_station[false][direction] | session->TrackColours[SCHEME_TRACK];
1910         }
1911         PaintAddImageAsChild(session, imageId, 6, 0, 20, 32, 1, height, 0, 0, height);
1912 
1913         metal_a_supports_paint_setup(session, METAL_SUPPORTS_BOXED, 6, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1914         metal_a_supports_paint_setup(session, METAL_SUPPORTS_BOXED, 7, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
1915         paint_util_push_tunnel_right(session, height, TUNNEL_SQUARE_FLAT);
1916     }
1917 
1918     track_paint_util_draw_station(session, ride, direction, height, trackElement);
1919 
1920     paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
1921     paint_util_set_general_support_height(session, height + 32, 0x20);
1922 }
1923 
junior_rc_paint_track_25_deg_up(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)1924 void junior_rc_paint_track_25_deg_up(
1925     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
1926     const TrackElement& trackElement, JuniorRcChainType chainType)
1927 {
1928     uint32_t imageId = junior_rc_track_pieces_25_deg_up[EnumValue(chainType)][direction] | session->TrackColours[SCHEME_TRACK];
1929     PaintAddImageAsParentRotated(session, direction, imageId, 0, 6, 32, 20, 1, height);
1930 
1931     int8_t tunnelHeights[4] = { -8, 8, 8, -8 };
1932     uint8_t tunnelType[4] = { TUNNEL_1, TUNNEL_2, TUNNEL_2, TUNNEL_1 };
1933     paint_util_push_tunnel_rotated(session, direction, height + tunnelHeights[direction], tunnelType[direction]);
1934 
1935     if (track_paint_util_should_paint_supports(session->MapPosition))
1936     {
1937         int32_t supportType = (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK;
1938         metal_a_supports_paint_setup(session, supportType, 4, 8, height, session->TrackColours[SCHEME_SUPPORTS]);
1939     }
1940 
1941     paint_util_set_segment_support_height(
1942         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0);
1943     paint_util_set_general_support_height(session, height + 56, 0x20);
1944 }
1945 
junior_rc_paint_track_flat_to_25_deg_up(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)1946 void junior_rc_paint_track_flat_to_25_deg_up(
1947     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
1948     const TrackElement& trackElement, JuniorRcChainType chainType)
1949 {
1950     uint32_t imageId = junior_rc_track_pieces_flat_to_25_deg_up[EnumValue(chainType)][direction]
1951         | session->TrackColours[SCHEME_TRACK];
1952 
1953     PaintAddImageAsParentRotated(session, direction, imageId, 0, 6, 32, 20, 1, height);
1954     if (direction == 0 || direction == 3)
1955     {
1956         paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_0);
1957     }
1958     else
1959     {
1960         paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_2);
1961     }
1962 
1963     if (track_paint_util_should_paint_supports(session->MapPosition))
1964     {
1965         int32_t supportType = (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK;
1966         uint16_t ax = (direction == 0) ? 5 : 3;
1967         metal_a_supports_paint_setup(session, supportType, 4, ax, height, session->TrackColours[SCHEME_SUPPORTS]);
1968     }
1969 
1970     paint_util_set_segment_support_height(
1971         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0);
1972     paint_util_set_general_support_height(session, height + 48, 0x20);
1973 }
1974 
junior_rc_paint_track_25_deg_up_to_flat(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)1975 void junior_rc_paint_track_25_deg_up_to_flat(
1976     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
1977     const TrackElement& trackElement, JuniorRcChainType chainType)
1978 {
1979     uint32_t imageId = junior_rc_track_pieces_25_deg_up_to_flat[EnumValue(chainType)][direction]
1980         | session->TrackColours[SCHEME_TRACK];
1981     PaintAddImageAsParentRotated(session, direction, imageId, 0, 6, 32, 20, 1, height);
1982 
1983     uint8_t tunnelType;
1984     int16_t tunnelHeight;
1985     if (direction == 1 || direction == 2)
1986     {
1987         tunnelType = TUNNEL_12;
1988         tunnelHeight = height + 8;
1989     }
1990     else
1991     {
1992         tunnelType = TUNNEL_0;
1993         tunnelHeight = height - 8;
1994     }
1995 
1996     if (direction & 1)
1997     {
1998         paint_util_push_tunnel_right(session, tunnelHeight, tunnelType);
1999     }
2000     else
2001     {
2002         paint_util_push_tunnel_left(session, tunnelHeight, tunnelType);
2003     }
2004 
2005     if (track_paint_util_should_paint_supports(session->MapPosition))
2006     {
2007         int32_t supportType = (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK;
2008         metal_a_supports_paint_setup(session, supportType, 4, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
2009     }
2010 
2011     paint_util_set_segment_support_height(
2012         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0);
2013     paint_util_set_general_support_height(session, height + 40, 0x20);
2014 }
2015 
2016 static constexpr const int8_t junior_rc_track_right_quarter_turn_5_tiles_support_height_offset[][7] = {
2017     { 0, 0, 0, 0, 0, 0, -1 },
2018     { -1, 0, 0, 0, 0, 0, 0 },
2019     { 0 },
2020     { 0, 0, 0, 0, 0, 0, 0 },
2021 };
2022 
junior_rc_right_quarter_turn_5_tiles_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2023 static void junior_rc_right_quarter_turn_5_tiles_paint_setup(
2024     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2025     const TrackElement& trackElement)
2026 {
2027     track_paint_util_right_quarter_turn_5_tiles_paint(
2028         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
2029         junior_rc_track_pieces_flat_quarter_turn_5_tiles, defaultRightQuarterTurn5TilesOffsets,
2030         defaultRightQuarterTurn5TilesBoundLengths, defaultRightQuarterTurn5TilesBoundOffsets);
2031 
2032     int32_t supportHeight = height + junior_rc_track_right_quarter_turn_5_tiles_support_height_offset[direction][trackSequence];
2033     switch (trackSequence)
2034     {
2035         case 0:
2036             metal_a_supports_paint_setup(
2037                 session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, supportHeight,
2038                 session->TrackColours[SCHEME_SUPPORTS]);
2039             break;
2040         case 6:
2041             metal_a_supports_paint_setup(
2042                 session, (direction & 1) ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 0, supportHeight,
2043                 session->TrackColours[SCHEME_SUPPORTS]);
2044             break;
2045     }
2046 
2047     if (direction == 0 && trackSequence == 0)
2048     {
2049         paint_util_push_tunnel_left(session, height, TUNNEL_0);
2050     }
2051 
2052     if (direction == 0 && trackSequence == 6)
2053     {
2054         paint_util_push_tunnel_right(session, height, TUNNEL_0);
2055     }
2056 
2057     if (direction == 1 && trackSequence == 6)
2058     {
2059         paint_util_push_tunnel_left(session, height, TUNNEL_0);
2060     }
2061 
2062     if (direction == 3 && trackSequence == 0)
2063     {
2064         paint_util_push_tunnel_right(session, height, TUNNEL_0);
2065     }
2066 
2067     switch (trackSequence)
2068     {
2069         case 0:
2070             paint_util_set_segment_support_height(
2071                 session, paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC, direction), 0xFFFF, 0);
2072             break;
2073         case 2:
2074             paint_util_set_segment_support_height(
2075                 session,
2076                 paint_util_rotate_segments(
2077                     SEGMENT_D0 | SEGMENT_C4 | SEGMENT_D4 | SEGMENT_BC | SEGMENT_C0 | SEGMENT_CC, direction),
2078                 0xFFFF, 0);
2079             break;
2080         case 3:
2081             paint_util_set_segment_support_height(
2082                 session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_C4, direction), 0xFFFF, 0);
2083             break;
2084         case 5:
2085             paint_util_set_segment_support_height(
2086                 session,
2087                 paint_util_rotate_segments(
2088                     SEGMENT_D4 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C8, direction),
2089                 0xFFFF, 0);
2090             break;
2091         case 6:
2092             paint_util_set_segment_support_height(
2093                 session, paint_util_rotate_segments(SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8, direction), 0xFFFF, 0);
2094             break;
2095     }
2096 
2097     paint_util_set_general_support_height(session, height + 32, 0x20);
2098 }
2099 
2100 static constexpr const uint8_t junior_rc_left_quarter_turn_5_tiles_to_right_turn_map[] = {
2101     6, 4, 5, 3, 1, 2, 0,
2102 };
2103 
2104 /* rct2: 0x0051917A */
junior_rc_left_quarter_turn_5_tiles_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2105 static void junior_rc_left_quarter_turn_5_tiles_paint_setup(
2106     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2107     const TrackElement& trackElement)
2108 {
2109     trackSequence = junior_rc_left_quarter_turn_5_tiles_to_right_turn_map[trackSequence];
2110     junior_rc_right_quarter_turn_5_tiles_paint_setup(session, ride, trackSequence, (direction + 1) % 4, height, trackElement);
2111 }
2112 
2113 /**
2114  * rct2: 0x008AAFC0, 0x00521593, 0x005216A1, 0x005217AF, 0x00521884
2115  */
junior_rc_flat_to_left_bank_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2116 static void junior_rc_flat_to_left_bank_paint_setup(
2117     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2118     const TrackElement& trackElement)
2119 {
2120     uint32_t image_id;
2121 
2122     image_id = junior_rc_track_pieces_flat_to_left_bank[direction][0] | session->TrackColours[SCHEME_TRACK];
2123     if (direction & 1)
2124     {
2125         PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 20, 32, 1 }, { 6, 0, height });
2126 
2127         paint_util_push_tunnel_right(session, height, 0);
2128     }
2129     else
2130     {
2131         PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 32, 20, 1 }, { 0, 6, height });
2132 
2133         paint_util_push_tunnel_left(session, height, 0);
2134     }
2135 
2136     if (junior_rc_track_pieces_flat_to_left_bank[direction][1] != 0)
2137     {
2138         image_id = junior_rc_track_pieces_flat_to_left_bank[direction][1] | session->TrackColours[SCHEME_TRACK];
2139 
2140         if (direction & 1)
2141         {
2142             PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
2143         }
2144         else
2145         {
2146             PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
2147         }
2148     }
2149 
2150     if (track_paint_util_should_paint_supports(session->MapPosition))
2151     {
2152         int32_t edi = (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK;
2153         metal_a_supports_paint_setup(session, edi, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
2154     }
2155 
2156     paint_util_set_segment_support_height(
2157         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0);
2158     paint_util_set_general_support_height(session, height + 32, 0x20);
2159 }
2160 
2161 /**
2162  * rct2: 0x008AAFD0, 0x00521959, 0x00521A2E, 0x00521B03, 0x00521C11
2163  */
junior_rc_flat_to_right_bank_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2164 static void junior_rc_flat_to_right_bank_paint_setup(
2165     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2166     const TrackElement& trackElement)
2167 {
2168     uint32_t image_id;
2169 
2170     image_id = junior_rc_track_pieces_flat_to_right_bank[direction][0] | session->TrackColours[SCHEME_TRACK];
2171     if (direction & 1)
2172     {
2173         PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 20, 32, 1 }, { 6, 0, height });
2174 
2175         paint_util_push_tunnel_right(session, height, 0);
2176     }
2177     else
2178     {
2179         PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 32, 20, 1 }, { 0, 6, height });
2180 
2181         paint_util_push_tunnel_left(session, height, 0);
2182     }
2183 
2184     if (junior_rc_track_pieces_flat_to_right_bank[direction][1] != 0)
2185     {
2186         image_id = junior_rc_track_pieces_flat_to_right_bank[direction][1] | session->TrackColours[SCHEME_TRACK];
2187 
2188         if (direction & 1)
2189         {
2190             PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
2191         }
2192         else
2193         {
2194             PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
2195         }
2196     }
2197 
2198     if (track_paint_util_should_paint_supports(session->MapPosition))
2199     {
2200         int32_t edi = (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK;
2201         metal_a_supports_paint_setup(session, edi, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
2202     }
2203 
2204     paint_util_set_segment_support_height(
2205         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0);
2206     paint_util_set_general_support_height(session, height + 32, 0x20);
2207 }
2208 
junior_rc_left_bank_to_flat_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2209 static void junior_rc_left_bank_to_flat_paint_setup(
2210     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2211     const TrackElement& trackElement)
2212 {
2213     junior_rc_flat_to_right_bank_paint_setup(session, ride, trackSequence, (direction + 2) % 4, height, trackElement);
2214 }
2215 
junior_rc_right_bank_to_flat_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2216 static void junior_rc_right_bank_to_flat_paint_setup(
2217     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2218     const TrackElement& trackElement)
2219 {
2220     junior_rc_flat_to_left_bank_paint_setup(session, ride, trackSequence, (direction + 2) % 4, height, trackElement);
2221 }
2222 
2223 static constexpr const CoordsXY junior_rc_banked_right_quarter_turn_5_tiles_bound_lengths[4][5] = {
2224     {
2225         { 32, 20 },
2226         { 32, 16 },
2227         { 16, 16 },
2228         { 16, 32 },
2229         { 20, 32 },
2230     },
2231     {
2232         { 20, 32 },
2233         { 16, 32 },
2234         { 16, 16 },
2235         { 32, 16 },
2236         { 32, 20 },
2237     },
2238     {
2239         { 32, 1 },
2240         { 32, 16 },
2241         { 16, 16 },
2242         { 16, 32 },
2243         { 1, 32 },
2244     },
2245     {
2246         { 20, 32 },
2247         { 16, 32 },
2248         { 16, 16 },
2249         { 32, 16 },
2250         { 32, 20 },
2251     },
2252 };
2253 
2254 static constexpr const CoordsXYZ junior_rc_banked_right_quarter_turn_5_tiles_bound_offsets[4][5] = {
2255     {
2256         { 0, 6, 0 },
2257         { 0, 16, 0 },
2258         { 0, 0, 0 },
2259         { 16, 0, 0 },
2260         { 6, 0, 0 },
2261     },
2262     {
2263         { 6, 0, 0 },
2264         { 16, 0, 0 },
2265         { 0, 16, 0 },
2266         { 0, 0, 0 },
2267         { 0, 6, 0 },
2268     },
2269     {
2270         { 0, 27, 0 },
2271         { 0, 0, 27 },
2272         { 16, 16, 27 },
2273         { 0, 0, 27 },
2274         { 27, 0, 0 },
2275     },
2276     {
2277         { 6, 0, 0 },
2278         { 0, 0, 0 },
2279         { 16, 0, 0 },
2280         { 0, 16, 0 },
2281         { 0, 6, 0 },
2282     },
2283 };
2284 
2285 /* rct2: 0x008AB010, 0x0052304C */
junior_rc_banked_right_quarter_turn_5_tiles_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2286 static void junior_rc_banked_right_quarter_turn_5_tiles_paint_setup(
2287     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2288     const TrackElement& trackElement)
2289 {
2290     uint8_t thickness = 1;
2291     if (direction == 2 && (trackSequence == 0 || trackSequence == 6))
2292     {
2293         thickness = 26;
2294     }
2295     track_paint_util_right_quarter_turn_5_tiles_paint(
2296         session, thickness, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
2297         junior_rc_track_pieces_banked_quarter_turn_5_tiles, nullptr, junior_rc_banked_right_quarter_turn_5_tiles_bound_lengths,
2298         junior_rc_banked_right_quarter_turn_5_tiles_bound_offsets);
2299 
2300     if (direction == 1 && trackSequence == 6)
2301     {
2302         uint32_t imageId = SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_4_2 | session->TrackColours[SCHEME_TRACK];
2303         PaintAddImageAsParent(session, imageId, { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
2304     }
2305     else if (direction == 3 && trackSequence == 0)
2306     {
2307         uint32_t imageId = SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_0_2 | session->TrackColours[SCHEME_TRACK];
2308         PaintAddImageAsParent(session, imageId, { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
2309     }
2310 
2311     int32_t supportHeight = height;
2312     switch (trackSequence)
2313     {
2314         case 0:
2315             metal_a_supports_paint_setup(
2316                 session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, supportHeight,
2317                 session->TrackColours[SCHEME_SUPPORTS]);
2318             break;
2319         case 6:
2320             metal_a_supports_paint_setup(
2321                 session, (direction & 1) ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 0, supportHeight,
2322                 session->TrackColours[SCHEME_SUPPORTS]);
2323             break;
2324     }
2325 
2326     if (direction == 0 && trackSequence == 0)
2327     {
2328         paint_util_push_tunnel_left(session, height, TUNNEL_0);
2329     }
2330 
2331     if (direction == 0 && trackSequence == 6)
2332     {
2333         paint_util_push_tunnel_right(session, height, TUNNEL_0);
2334     }
2335 
2336     if (direction == 1 && trackSequence == 6)
2337     {
2338         paint_util_push_tunnel_left(session, height, TUNNEL_0);
2339     }
2340 
2341     if (direction == 3 && trackSequence == 0)
2342     {
2343         paint_util_push_tunnel_right(session, height, TUNNEL_0);
2344     }
2345 
2346     switch (trackSequence)
2347     {
2348         case 0:
2349             paint_util_set_segment_support_height(
2350                 session, paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC, direction), 0xFFFF, 0);
2351             break;
2352         case 2:
2353             paint_util_set_segment_support_height(
2354                 session,
2355                 paint_util_rotate_segments(
2356                     SEGMENT_D0 | SEGMENT_C4 | SEGMENT_D4 | SEGMENT_BC | SEGMENT_C0 | SEGMENT_CC, direction),
2357                 0xFFFF, 0);
2358             break;
2359         case 3:
2360             paint_util_set_segment_support_height(
2361                 session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_C4, direction), 0xFFFF, 0);
2362             break;
2363         case 5:
2364             paint_util_set_segment_support_height(
2365                 session,
2366                 paint_util_rotate_segments(
2367                     SEGMENT_D4 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C8, direction),
2368                 0xFFFF, 0);
2369             break;
2370         case 6:
2371             paint_util_set_segment_support_height(
2372                 session, paint_util_rotate_segments(SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8, direction), 0xFFFF, 0);
2373             break;
2374     }
2375 
2376     paint_util_set_general_support_height(session, height + 32, 0x20);
2377 }
2378 
2379 /* rct2: 0x008AB000 */
junior_rc_banked_left_quarter_turn_5_tiles_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2380 static void junior_rc_banked_left_quarter_turn_5_tiles_paint_setup(
2381     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2382     const TrackElement& trackElement)
2383 {
2384     trackSequence = junior_rc_left_quarter_turn_5_tiles_to_right_turn_map[trackSequence];
2385     junior_rc_banked_right_quarter_turn_5_tiles_paint_setup(
2386         session, ride, trackSequence, (direction + 1) % 4, height, trackElement);
2387 }
2388 
2389 /**
2390  * rct2: 0x008AB020, 0x00522073, 0x00522182, 0x00522291, 0x00522367
2391  */
junior_rc_left_bank_to_25_deg_up_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2392 static void junior_rc_left_bank_to_25_deg_up_paint_setup(
2393     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2394     const TrackElement& trackElement)
2395 {
2396     uint32_t image_id;
2397 
2398     image_id = junior_rc_track_pieces_left_banked_to_25_deg_up[direction][0] | session->TrackColours[SCHEME_TRACK];
2399     if (direction & 1)
2400     {
2401         PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 20, 32, 1 }, { 6, 0, height });
2402     }
2403     else
2404     {
2405         PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 32, 20, 1 }, { 0, 6, height });
2406     }
2407 
2408     if (junior_rc_track_pieces_left_banked_to_25_deg_up[direction][1] != 0)
2409     {
2410         image_id = junior_rc_track_pieces_left_banked_to_25_deg_up[direction][1] | session->TrackColours[SCHEME_TRACK];
2411 
2412         if (direction & 1)
2413         {
2414             PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 1, 32, 34 }, { 27, 0, height });
2415         }
2416         else
2417         {
2418             PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 32, 1, 34 }, { 0, 27, height });
2419         }
2420     }
2421 
2422     if (track_paint_util_should_paint_supports(session->MapPosition))
2423     {
2424         int32_t edi = (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK;
2425         metal_a_supports_paint_setup(session, edi, 4, 3, height, session->TrackColours[SCHEME_SUPPORTS]);
2426     }
2427 
2428     switch (direction)
2429     {
2430         case 0:
2431             paint_util_push_tunnel_left(session, height, TUNNEL_0);
2432             break;
2433         case 1:
2434             paint_util_push_tunnel_right(session, height, TUNNEL_2);
2435             break;
2436         case 2:
2437             paint_util_push_tunnel_left(session, height, TUNNEL_2);
2438             break;
2439         case 3:
2440             paint_util_push_tunnel_right(session, height, TUNNEL_0);
2441             break;
2442     }
2443 
2444     paint_util_set_segment_support_height(
2445         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0);
2446     paint_util_set_general_support_height(session, height + 48, 0x20);
2447 }
2448 
2449 /**
2450  * rct2: 0x008AB030, 0x0052243D, 0x00522513, 0x005225E9, 0x005226F8
2451  */
junior_rc_right_bank_to_25_deg_up_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2452 static void junior_rc_right_bank_to_25_deg_up_paint_setup(
2453     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2454     const TrackElement& trackElement)
2455 {
2456     uint32_t image_id;
2457 
2458     image_id = junior_rc_track_pieces_right_banked_to_25_deg_up[direction][0] | session->TrackColours[SCHEME_TRACK];
2459     if (direction & 1)
2460     {
2461         PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 20, 32, 1 }, { 6, 0, height });
2462     }
2463     else
2464     {
2465         PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 32, 20, 1 }, { 0, 6, height });
2466     }
2467 
2468     if (junior_rc_track_pieces_right_banked_to_25_deg_up[direction][1] != 0)
2469     {
2470         image_id = junior_rc_track_pieces_right_banked_to_25_deg_up[direction][1] | session->TrackColours[SCHEME_TRACK];
2471 
2472         if (direction & 1)
2473         {
2474             PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 1, 32, 34 }, { 27, 0, height });
2475         }
2476         else
2477         {
2478             PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 32, 1, 34 }, { 0, 27, height });
2479         }
2480     }
2481 
2482     if (track_paint_util_should_paint_supports(session->MapPosition))
2483     {
2484         int32_t edi = (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK;
2485         metal_a_supports_paint_setup(session, edi, 4, 3, height, session->TrackColours[SCHEME_SUPPORTS]);
2486     }
2487 
2488     switch (direction)
2489     {
2490         case 0:
2491             paint_util_push_tunnel_left(session, height, TUNNEL_0);
2492             break;
2493         case 1:
2494             paint_util_push_tunnel_right(session, height, TUNNEL_2);
2495             break;
2496         case 2:
2497             paint_util_push_tunnel_left(session, height, TUNNEL_2);
2498             break;
2499         case 3:
2500             paint_util_push_tunnel_right(session, height, TUNNEL_0);
2501             break;
2502     }
2503 
2504     paint_util_set_segment_support_height(
2505         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0);
2506     paint_util_set_general_support_height(session, height + 48, 0x20);
2507 }
2508 
2509 /**
2510  * rct2: 0x008AB040, 0x00522807, 0x0052291A, 0x00522A2D, 0x00522B07
2511  */
junior_rc_25_deg_up_to_left_bank_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2512 static void junior_rc_25_deg_up_to_left_bank_paint_setup(
2513     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2514     const TrackElement& trackElement)
2515 {
2516     uint32_t image_id;
2517 
2518     uint8_t tunnelType;
2519     int16_t tunnelHeight;
2520     if (direction == 1 || direction == 2)
2521     {
2522         tunnelType = TUNNEL_12;
2523         tunnelHeight = height + 8;
2524     }
2525     else
2526     {
2527         tunnelType = TUNNEL_0;
2528         tunnelHeight = height - 8;
2529     }
2530 
2531     image_id = junior_rc_track_pieces_25_deg_up_to_left_bank[direction][0] | session->TrackColours[SCHEME_TRACK];
2532     if (direction & 1)
2533     {
2534         PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 20, 32, 1 }, { 6, 0, height });
2535 
2536         paint_util_push_tunnel_right(session, tunnelHeight, tunnelType);
2537     }
2538     else
2539     {
2540         PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 32, 20, 1 }, { 0, 6, height });
2541 
2542         paint_util_push_tunnel_left(session, tunnelHeight, tunnelType);
2543     }
2544 
2545     if (junior_rc_track_pieces_25_deg_up_to_left_bank[direction][1] != 0)
2546     {
2547         image_id = junior_rc_track_pieces_25_deg_up_to_left_bank[direction][1] | session->TrackColours[SCHEME_TRACK];
2548 
2549         if (direction & 1)
2550         {
2551             PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 1, 32, 34 }, { 27, 0, height });
2552         }
2553         else
2554         {
2555             PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 32, 1, 34 }, { 0, 27, height });
2556         }
2557     }
2558 
2559     if (track_paint_util_should_paint_supports(session->MapPosition))
2560     {
2561         int32_t edi = (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK;
2562         metal_a_supports_paint_setup(session, edi, 4, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
2563     }
2564 
2565     paint_util_set_segment_support_height(
2566         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0);
2567     paint_util_set_general_support_height(session, height + 40, 0x20);
2568 }
2569 
2570 /**
2571  * rct2: 0x008AB050, 0x00522BE1, 0x00522CBB, 0x00522D95, 0x00522EA8
2572  */
junior_rc_25_deg_up_to_right_bank_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2573 static void junior_rc_25_deg_up_to_right_bank_paint_setup(
2574     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2575     const TrackElement& trackElement)
2576 {
2577     uint32_t image_id;
2578 
2579     uint8_t tunnelType;
2580     int16_t tunnelHeight;
2581     if (direction == 1 || direction == 2)
2582     {
2583         tunnelType = TUNNEL_12;
2584         tunnelHeight = height + 8;
2585     }
2586     else
2587     {
2588         tunnelType = TUNNEL_0;
2589         tunnelHeight = height - 8;
2590     }
2591 
2592     image_id = junior_rc_track_pieces_25_deg_up_to_right_bank[direction][0] | session->TrackColours[SCHEME_TRACK];
2593     if (direction & 1)
2594     {
2595         PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 20, 32, 1 }, { 6, 0, height });
2596 
2597         paint_util_push_tunnel_right(session, tunnelHeight, tunnelType);
2598     }
2599     else
2600     {
2601         PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 32, 20, 1 }, { 0, 6, height });
2602 
2603         paint_util_push_tunnel_left(session, tunnelHeight, tunnelType);
2604     }
2605 
2606     if (junior_rc_track_pieces_25_deg_up_to_right_bank[direction][1] != 0)
2607     {
2608         image_id = junior_rc_track_pieces_25_deg_up_to_right_bank[direction][1] | session->TrackColours[SCHEME_TRACK];
2609 
2610         if (direction & 1)
2611         {
2612             PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 1, 32, 34 }, { 27, 0, height });
2613         }
2614         else
2615         {
2616             PaintAddImageAsParent(session, image_id, { 0, 0, height }, { 32, 1, 34 }, { 0, 27, height });
2617         }
2618     }
2619 
2620     if (track_paint_util_should_paint_supports(session->MapPosition))
2621     {
2622         int32_t edi = (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK;
2623         metal_a_supports_paint_setup(session, edi, 4, 6, height, session->TrackColours[SCHEME_SUPPORTS]);
2624     }
2625 
2626     paint_util_set_segment_support_height(
2627         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0);
2628     paint_util_set_general_support_height(session, height + 40, 0x20);
2629 }
2630 
2631 /**
2632  * rct2: 0x008AB060
2633  */
junior_rc_left_bank_to_25_deg_down_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2634 static void junior_rc_left_bank_to_25_deg_down_paint_setup(
2635     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2636     const TrackElement& trackElement)
2637 {
2638     junior_rc_25_deg_up_to_right_bank_paint_setup(session, ride, trackSequence, (direction + 2) % 4, height, trackElement);
2639 }
2640 
2641 /**
2642  * rct2: 0x008AB070
2643  */
junior_rc_right_bank_to_25_deg_down_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2644 static void junior_rc_right_bank_to_25_deg_down_paint_setup(
2645     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2646     const TrackElement& trackElement)
2647 {
2648     junior_rc_25_deg_up_to_left_bank_paint_setup(session, ride, trackSequence, (direction + 2) % 4, height, trackElement);
2649 }
2650 
2651 /**
2652  * rct2: 0x008AB080
2653  */
junior_rc_25_deg_down_to_left_bank_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2654 static void junior_rc_25_deg_down_to_left_bank_paint_setup(
2655     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2656     const TrackElement& trackElement)
2657 {
2658     junior_rc_right_bank_to_25_deg_up_paint_setup(session, ride, trackSequence, (direction + 2) % 4, height, trackElement);
2659 }
2660 
2661 /**
2662  * rct2: 0x008AB090
2663  */
junior_rc_25_deg_down_to_right_bank_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2664 static void junior_rc_25_deg_down_to_right_bank_paint_setup(
2665     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2666     const TrackElement& trackElement)
2667 {
2668     junior_rc_left_bank_to_25_deg_up_paint_setup(session, ride, trackSequence, (direction + 2) % 4, height, trackElement);
2669 }
2670 
2671 static constexpr const CoordsXYZ junior_rc_left_bank_bound_lengths[4] = {
2672     { 32, 1, 26 },
2673     { 1, 32, 26 },
2674     { 32, 20, 1 },
2675     { 20, 32, 1 },
2676 };
2677 
2678 static constexpr const CoordsXY junior_rc_left_bank_bound_offsets[4] = {
2679     { 0, 27 },
2680     { 27, 0 },
2681     { 0, 6 },
2682     { 6, 0 },
2683 };
2684 
2685 /**
2686  * rct2: 0x008AB0A0, 0x00521D1F, 0x00521DF4, 0x00521EC9, 0x00521F9E
2687  */
junior_rc_left_bank_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2688 static void junior_rc_left_bank_paint_setup(
2689     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2690     const TrackElement& trackElement)
2691 {
2692     uint32_t image_id;
2693 
2694     image_id = junior_rc_track_pieces_left_bank[direction] | session->TrackColours[SCHEME_TRACK];
2695     PaintAddImageAsParent(
2696         session, image_id, { 0, 0, height }, junior_rc_left_bank_bound_lengths[direction],
2697         { junior_rc_left_bank_bound_offsets[direction], height });
2698 
2699     if (direction & 1)
2700     {
2701         paint_util_push_tunnel_right(session, height, 0);
2702     }
2703     else
2704     {
2705         paint_util_push_tunnel_left(session, height, 0);
2706     }
2707 
2708     if (track_paint_util_should_paint_supports(session->MapPosition))
2709     {
2710         int32_t edi = (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK;
2711         metal_a_supports_paint_setup(session, edi, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
2712     }
2713 
2714     paint_util_set_segment_support_height(
2715         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0);
2716     paint_util_set_general_support_height(session, height + 32, 0x20);
2717 }
2718 
2719 /**
2720  * rct2: 0x008AB0B0
2721  */
junior_rc_right_bank_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2722 static void junior_rc_right_bank_paint_setup(
2723     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2724     const TrackElement& trackElement)
2725 {
2726     junior_rc_left_bank_paint_setup(session, ride, trackSequence, (direction + 2) % 4, height, trackElement);
2727 }
2728 
junior_rc_paint_track_left_quarter_turn_5_tiles_25_deg_up(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)2729 void junior_rc_paint_track_left_quarter_turn_5_tiles_25_deg_up(
2730     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
2731     const TrackElement& trackElement, JuniorRcChainType chainType)
2732 {
2733     track_paint_util_right_quarter_turn_5_tiles_paint(
2734         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
2735         junior_rc_track_pieces_left_quarter_turn_5_tiles_25_deg_up[EnumValue(chainType)],
2736         junior_rc_left_quarter_turn_5_tiles_25_deg_up_offsets, defaultRightQuarterTurn5TilesBoundLengths, nullptr);
2737 
2738     static constexpr uint8_t supportSpecial[4] = { 8, 8, 8, 3 };
2739     switch (trackSequence)
2740     {
2741         case 0:
2742             metal_a_supports_paint_setup(
2743                 session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4,
2744                 (direction == 0 || direction == 3) ? 10 : 8, height, session->TrackColours[SCHEME_SUPPORTS]);
2745             break;
2746         case 6:
2747             metal_a_supports_paint_setup(
2748                 session, (direction & 1) ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, supportSpecial[direction], height,
2749                 session->TrackColours[SCHEME_SUPPORTS]);
2750             break;
2751     }
2752 
2753     if (direction == 0 && trackSequence == 0)
2754     {
2755         paint_util_push_tunnel_left(session, height - 8, TUNNEL_1);
2756     }
2757     if (direction == 2 && trackSequence == 6)
2758     {
2759         paint_util_push_tunnel_right(session, height + 8, TUNNEL_2);
2760     }
2761     if (direction == 3 && trackSequence == 0)
2762     {
2763         paint_util_push_tunnel_right(session, height - 8, TUNNEL_1);
2764     }
2765     if (direction == 3 && trackSequence == 6)
2766     {
2767         paint_util_push_tunnel_left(session, height + 8, TUNNEL_2);
2768     }
2769 
2770     switch (trackSequence)
2771     {
2772         case 0:
2773             paint_util_set_segment_support_height(
2774                 session, paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B4, direction), 0xFFFF, 0);
2775             break;
2776         case 2:
2777             paint_util_set_segment_support_height(
2778                 session,
2779                 paint_util_rotate_segments(
2780                     SEGMENT_D0 | SEGMENT_C4 | SEGMENT_B4 | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_CC, direction),
2781                 0xFFFF, 0);
2782             break;
2783         case 3:
2784             paint_util_set_segment_support_height(
2785                 session, paint_util_rotate_segments(SEGMENT_D4 | SEGMENT_BC | SEGMENT_CC | SEGMENT_C4, direction), 0xFFFF, 0);
2786             break;
2787         case 5:
2788             paint_util_set_segment_support_height(
2789                 session,
2790                 paint_util_rotate_segments(
2791                     SEGMENT_D4 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C8, direction),
2792                 0xFFFF, 0);
2793             break;
2794         case 6:
2795             paint_util_set_segment_support_height(
2796                 session, paint_util_rotate_segments(SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_C0, direction), 0xFFFF, 0);
2797             break;
2798     }
2799     if (trackSequence == 3)
2800     {
2801         paint_util_set_general_support_height(session, height + 64, 0x20);
2802     }
2803     else
2804     {
2805         paint_util_set_general_support_height(session, height + 72, 0x20);
2806     }
2807 }
2808 
junior_rc_paint_track_right_quarter_turn_5_tiles_25_deg_up(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)2809 void junior_rc_paint_track_right_quarter_turn_5_tiles_25_deg_up(
2810     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
2811     const TrackElement& trackElement, JuniorRcChainType chainType)
2812 {
2813     track_paint_util_right_quarter_turn_5_tiles_paint(
2814         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
2815         junior_rc_track_pieces_right_quarter_turn_5_tiles_25_deg_up[EnumValue(chainType)], defaultRightQuarterTurn5TilesOffsets,
2816         defaultRightQuarterTurn5TilesBoundLengths, nullptr);
2817 
2818     static constexpr uint8_t supportSpecial[4] = { 11, 8, 8, 7 };
2819     switch (trackSequence)
2820     {
2821         case 0:
2822             metal_a_supports_paint_setup(
2823                 session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, supportSpecial[direction], height,
2824                 session->TrackColours[SCHEME_SUPPORTS]);
2825             break;
2826         case 6:
2827             metal_a_supports_paint_setup(
2828                 session, (direction & 1) ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 8, height,
2829                 session->TrackColours[SCHEME_SUPPORTS]);
2830             break;
2831     }
2832 
2833     if (direction == 0 && trackSequence == 0)
2834     {
2835         paint_util_push_tunnel_left(session, height - 8, TUNNEL_1);
2836     }
2837     if (direction == 0 && trackSequence == 6)
2838     {
2839         paint_util_push_tunnel_right(session, height + 8, TUNNEL_2);
2840     }
2841     if (direction == 3 && trackSequence == 0)
2842     {
2843         paint_util_push_tunnel_right(session, height - 8, TUNNEL_1);
2844     }
2845     if (direction == 1 && trackSequence == 6)
2846     {
2847         paint_util_push_tunnel_left(session, height + 8, TUNNEL_2);
2848     }
2849 
2850     switch (trackSequence)
2851     {
2852         case 0:
2853             paint_util_set_segment_support_height(
2854                 session, paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC, direction), 0xFFFF, 0);
2855             break;
2856         case 2:
2857             paint_util_set_segment_support_height(
2858                 session,
2859                 paint_util_rotate_segments(
2860                     SEGMENT_D0 | SEGMENT_C4 | SEGMENT_D4 | SEGMENT_BC | SEGMENT_C0 | SEGMENT_CC, direction),
2861                 0xFFFF, 0);
2862             break;
2863         case 3:
2864             paint_util_set_segment_support_height(
2865                 session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_C4, direction), 0xFFFF, 0);
2866             break;
2867         case 5:
2868             paint_util_set_segment_support_height(
2869                 session,
2870                 paint_util_rotate_segments(
2871                     SEGMENT_D4 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C8, direction),
2872                 0xFFFF, 0);
2873             break;
2874         case 6:
2875             paint_util_set_segment_support_height(
2876                 session, paint_util_rotate_segments(SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8, direction), 0xFFFF, 0);
2877             break;
2878     }
2879     if (trackSequence == 3)
2880     {
2881         paint_util_set_general_support_height(session, height + 64, 0x20);
2882     }
2883     else
2884     {
2885         paint_util_set_general_support_height(session, height + 72, 0x20);
2886     }
2887 }
2888 
2889 /* rct2: 0x008AAE10, 0x00519D88, 0x00519DAC, 0x00519DD0, 0x00519DF4 */
junior_rc_left_quarter_turn_5_tiles_25_deg_up_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2890 static void junior_rc_left_quarter_turn_5_tiles_25_deg_up_paint_setup(
2891     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2892     const TrackElement& trackElement)
2893 {
2894     bool isChained = trackElement.HasChain();
2895     junior_rc_paint_track_left_quarter_turn_5_tiles_25_deg_up(
2896         session, ride, trackSequence, direction, height, trackElement,
2897         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
2898 }
2899 
2900 /* rct2: 0x008AAE20, 0x00519E18, 0x0051A148, 0x0051A452, 0x0051A738 */
junior_rc_right_quarter_turn_5_tiles_25_deg_up_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2901 static void junior_rc_right_quarter_turn_5_tiles_25_deg_up_paint_setup(
2902     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2903     const TrackElement& trackElement)
2904 {
2905     bool isChained = trackElement.HasChain();
2906     junior_rc_paint_track_right_quarter_turn_5_tiles_25_deg_up(
2907         session, ride, trackSequence, direction, height, trackElement,
2908         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
2909 }
2910 
2911 /* rct2: 0x008AAE30, 0x0051AA42, 0x0051AA68, 0x0051AA8C, 0x0051AAB0 */
junior_rc_left_quarter_turn_5_tiles_25_deg_down_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2912 static void junior_rc_left_quarter_turn_5_tiles_25_deg_down_paint_setup(
2913     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2914     const TrackElement& trackElement)
2915 {
2916     junior_rc_right_quarter_turn_5_tiles_25_deg_up_paint_setup(
2917         session, ride, junior_rc_left_quarter_turn_5_tiles_to_right_turn_map[trackSequence], (direction + 1) & 3, height,
2918         trackElement);
2919 }
2920 
2921 /* rct2: 0x008AAE40, 0x0051AAD4, 0x0051AE04, 0x0051B10E, 0x0051B3F4 */
junior_rc_right_quarter_turn_5_tiles_25_deg_down_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2922 static void junior_rc_right_quarter_turn_5_tiles_25_deg_down_paint_setup(
2923     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2924     const TrackElement& trackElement)
2925 {
2926     junior_rc_left_quarter_turn_5_tiles_25_deg_up_paint_setup(
2927         session, ride, junior_rc_left_quarter_turn_5_tiles_to_right_turn_map[trackSequence], (direction - 1) & 3, height,
2928         trackElement);
2929 }
2930 
2931 /* rct2: 0x008AAE50, 0x0051B6FE, 0x0051B946, 0x0051BB8E, 0x0051BBA8 */
junior_rc_s_bend_left_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)2932 static void junior_rc_s_bend_left_paint_setup(
2933     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
2934     const TrackElement& trackElement)
2935 {
2936     if (direction == 2 || direction == 3)
2937     {
2938         trackSequence = 3 - trackSequence;
2939     }
2940 
2941     static constexpr CoordsXY offsetList[] = {
2942         { 0, 6 },
2943         { 0, 0 },
2944         { 0, 6 },
2945         { 0, 6 },
2946     };
2947 
2948     static constexpr CoordsXY boundsList[] = {
2949         { 32, 20 },
2950         { 32, 26 },
2951         { 32, 26 },
2952         { 32, 20 },
2953     };
2954 
2955     uint32_t imageId = junior_rc_track_pieces_s_bend_left[(direction & 1)][trackSequence] | session->TrackColours[SCHEME_TRACK];
2956     CoordsXY offset = offsetList[trackSequence];
2957     CoordsXY bounds = boundsList[trackSequence];
2958     if (direction == 0 || direction == 2)
2959     {
2960         PaintAddImageAsParent(session, imageId, { offset.x, offset.y, height }, { bounds.x, bounds.y, 1 });
2961     }
2962     else
2963     {
2964         PaintAddImageAsParent(session, imageId, { offset.y, offset.x, height }, { bounds.y, bounds.x, 1 });
2965     }
2966 
2967     if (direction == 0 || direction == 2)
2968     {
2969         if (trackSequence == 0)
2970         {
2971             paint_util_push_tunnel_left(session, height, TUNNEL_0);
2972         }
2973 
2974         switch (trackSequence)
2975         {
2976             case 0:
2977                 metal_a_supports_paint_setup(
2978                     session, METAL_SUPPORTS_FORK, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
2979                 break;
2980             case 1:
2981                 metal_a_supports_paint_setup(
2982                     session, METAL_SUPPORTS_FORK, 5, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
2983                 break;
2984             case 3:
2985                 metal_a_supports_paint_setup(
2986                     session, METAL_SUPPORTS_FORK, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
2987                 break;
2988         }
2989     }
2990     else
2991     {
2992         if (trackSequence == 3)
2993         {
2994             paint_util_push_tunnel_right(session, height, TUNNEL_0);
2995         }
2996 
2997         switch (trackSequence)
2998         {
2999             case 0:
3000                 metal_a_supports_paint_setup(
3001                     session, METAL_SUPPORTS_FORK_ALT, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
3002                 break;
3003             case 1:
3004                 metal_a_supports_paint_setup(
3005                     session, METAL_SUPPORTS_FORK_ALT, 6, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
3006                 break;
3007             case 3:
3008                 metal_a_supports_paint_setup(
3009                     session, METAL_SUPPORTS_FORK_ALT, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
3010                 break;
3011         }
3012     }
3013 
3014     int32_t blockedSegments = 0;
3015     switch (trackSequence)
3016     {
3017         case 0:
3018             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B4;
3019             break;
3020         case 1:
3021             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_B4;
3022             break;
3023         case 2:
3024             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_C0 | SEGMENT_D4 | SEGMENT_BC;
3025             break;
3026         case 3:
3027             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_C0;
3028             break;
3029     }
3030     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, (direction & 1)), 0xFFFF, 0);
3031 
3032     paint_util_set_general_support_height(session, height + 32, 0x20);
3033 }
3034 
3035 /* rct2: 0x008AAE60, 0x0051BBC0, 0x0051BE06, 0x0051C04E, 0x0051C068 */
junior_rc_s_bend_right_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)3036 static void junior_rc_s_bend_right_paint_setup(
3037     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
3038     const TrackElement& trackElement)
3039 {
3040     if (direction == 2 || direction == 3)
3041     {
3042         trackSequence = 3 - trackSequence;
3043     }
3044 
3045     static constexpr CoordsXY offsetList[] = {
3046         { 0, 6 },
3047         { 0, 6 },
3048         { 0, 0 },
3049         { 0, 6 },
3050     };
3051 
3052     static constexpr CoordsXY boundsList[] = {
3053         { 32, 20 },
3054         { 32, 26 },
3055         { 32, 26 },
3056         { 32, 20 },
3057     };
3058 
3059     uint32_t imageId = junior_rc_track_pieces_s_bend_right[direction & 1][trackSequence] | session->TrackColours[SCHEME_TRACK];
3060     CoordsXY offset = offsetList[trackSequence];
3061     CoordsXY bounds = boundsList[trackSequence];
3062     if (direction == 0 || direction == 2)
3063     {
3064         PaintAddImageAsParent(session, imageId, { offset.x, offset.y, height }, { bounds.x, bounds.y, 1 });
3065     }
3066     else
3067     {
3068         PaintAddImageAsParent(session, imageId, { offset.y, offset.x, height }, { bounds.y, bounds.x, 1 });
3069     }
3070 
3071     if (direction == 0 || direction == 2)
3072     {
3073         if (trackSequence == 0)
3074         {
3075             paint_util_push_tunnel_left(session, height, TUNNEL_0);
3076         }
3077 
3078         switch (trackSequence)
3079         {
3080             case 0:
3081                 metal_a_supports_paint_setup(
3082                     session, METAL_SUPPORTS_FORK, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
3083                 break;
3084             case 1:
3085                 metal_a_supports_paint_setup(
3086                     session, METAL_SUPPORTS_FORK, 8, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
3087                 break;
3088             case 3:
3089                 metal_a_supports_paint_setup(
3090                     session, METAL_SUPPORTS_FORK, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
3091                 break;
3092         }
3093     }
3094     else
3095     {
3096         if (trackSequence == 3)
3097         {
3098             paint_util_push_tunnel_right(session, height, TUNNEL_0);
3099         }
3100 
3101         switch (trackSequence)
3102         {
3103             case 0:
3104                 metal_a_supports_paint_setup(
3105                     session, METAL_SUPPORTS_FORK_ALT, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
3106                 break;
3107             case 1:
3108                 metal_a_supports_paint_setup(
3109                     session, METAL_SUPPORTS_FORK_ALT, 7, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
3110                 break;
3111             case 3:
3112                 metal_a_supports_paint_setup(
3113                     session, METAL_SUPPORTS_FORK_ALT, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
3114                 break;
3115         }
3116     }
3117 
3118     int32_t blockedSegments = 0;
3119     switch (trackSequence)
3120     {
3121         case 0:
3122             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC;
3123             break;
3124         case 1:
3125             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_C0 | SEGMENT_D4 | SEGMENT_BC;
3126             break;
3127         case 2:
3128             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_B4;
3129             break;
3130         case 3:
3131             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8;
3132             break;
3133     }
3134     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, (direction & 1)), 0xFFFF, 0);
3135 
3136     paint_util_set_general_support_height(session, height + 32, 0x20);
3137 }
3138 
3139 /** rct2: 0x008AAEB0, 0x0051C0E0, 0x0051C2C1, 0x0051C47F, 0x0051C61D */
junior_rc_right_quarter_turn_3_tiles_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)3140 static void junior_rc_right_quarter_turn_3_tiles_paint_setup(
3141     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
3142     const TrackElement& trackElement)
3143 {
3144     track_paint_util_right_quarter_turn_3_tiles_paint(
3145         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
3146         junior_rc_track_pieces_flat_quarter_turn_3_tiles, defaultRightQuarterTurn3TilesOffsets,
3147         defaultRightQuarterTurn3TilesBoundLengths, nullptr);
3148     track_paint_util_right_quarter_turn_3_tiles_tunnel(session, height, direction, trackSequence, TUNNEL_0);
3149 
3150     static constexpr uint8_t supportType[2][4] = {
3151         { 1, 0, 0, 2 },
3152         { 2, 0, 0, 1 },
3153     };
3154     switch (trackSequence)
3155     {
3156         case 0:
3157         case 3:
3158             metal_a_supports_paint_setup(
3159                 session, supportType[(direction & 1)][trackSequence], 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
3160             break;
3161     }
3162 
3163     int32_t blockedSegments = 0;
3164     switch (trackSequence)
3165     {
3166         case 0:
3167             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC;
3168             break;
3169         case 2:
3170             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_D4 | SEGMENT_C0;
3171             break;
3172         case 3:
3173             blockedSegments = SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8;
3174             break;
3175     }
3176     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
3177 
3178     paint_util_set_general_support_height(session, height + 32, 0x20);
3179 }
3180 
3181 /** rct2: 0x008AAEA0 */
junior_rc_left_quarter_turn_3_tiles_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)3182 static void junior_rc_left_quarter_turn_3_tiles_paint_setup(
3183     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
3184     const TrackElement& trackElement)
3185 {
3186     trackSequence = mapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence];
3187     junior_rc_right_quarter_turn_3_tiles_paint_setup(session, ride, trackSequence, (direction + 1) % 4, height, trackElement);
3188 }
3189 
3190 static constexpr const CoordsXY junior_rc_right_quarter_turn_3_tiles_bank_bound_lengths[4][3] = {
3191     {
3192         { 32, 20 },
3193         { 16, 16 },
3194         { 20, 32 },
3195     },
3196     {
3197         { 20, 32 },
3198         { 16, 16 },
3199         { 32, 20 },
3200     },
3201     {
3202         { 32, 1 },
3203         { 16, 16 },
3204         { 1, 32 },
3205     },
3206     {
3207         { 20, 32 },
3208         { 16, 16 },
3209         { 32, 20 },
3210     },
3211 };
3212 
3213 static constexpr const CoordsXYZ junior_rc_right_quarter_turn_3_tiles_bank_offsets[4][3] = {
3214     {
3215         { 0, 6, 0 },
3216         { 16, 16, 0 },
3217         { 6, 0, 0 },
3218     },
3219     {
3220         { 6, 0, 0 },
3221         { 16, 0, 0 },
3222         { 0, 6, 0 },
3223     },
3224     {
3225         { 0, 27, 0 },
3226         { 0, 0, 27 },
3227         { 27, 0, 0 },
3228     },
3229     {
3230         { 6, 0, 0 },
3231         { 0, 16, 0 },
3232         { 0, 6, 0 },
3233     },
3234 };
3235 
3236 /** rct2: 0x008AA0D0, 0x00523EA0, 0x005240CC, 0x0052430F, 0x00524500*/
junior_rc_right_quarter_turn_3_tiles_bank_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)3237 static void junior_rc_right_quarter_turn_3_tiles_bank_paint_setup(
3238     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
3239     const TrackElement& trackElement)
3240 {
3241     static constexpr uint8_t thickness[4][4] = {
3242         { 1, 1, 1, 1 },
3243         { 1, 1, 1, 1 },
3244         { 26, 1, 1, 26 },
3245         { 1, 1, 1, 1 },
3246     };
3247 
3248     track_paint_util_right_quarter_turn_3_tiles_paint(
3249         session, thickness[direction][trackSequence], height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
3250         junior_rc_track_pieces_banked_quarter_turn_3_tiles, nullptr, junior_rc_right_quarter_turn_3_tiles_bank_bound_lengths,
3251         junior_rc_right_quarter_turn_3_tiles_bank_offsets);
3252     track_paint_util_right_quarter_turn_3_tiles_tunnel(session, height, direction, trackSequence, TUNNEL_0);
3253 
3254     if (direction == 1 && trackSequence == 3)
3255     {
3256         uint32_t imageId = SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NW_SW_PART_2_2 | session->TrackColours[SCHEME_TRACK];
3257         PaintAddImageAsParent(session, imageId, { 0, 0, height }, { 32, 1, 26 }, { 0, 27, height });
3258     }
3259     else if (direction == 3 && trackSequence == 0)
3260     {
3261         uint32_t imageId = SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SE_NE_PART_0_2 | session->TrackColours[SCHEME_TRACK];
3262         PaintAddImageAsParent(session, imageId, { 0, 0, height }, { 1, 32, 26 }, { 27, 0, height });
3263     }
3264 
3265     uint8_t supportType[2][4] = {
3266         { 1, 0, 0, 2 },
3267         { 2, 0, 0, 1 },
3268     };
3269     switch (trackSequence)
3270     {
3271         case 0:
3272         case 3:
3273             metal_a_supports_paint_setup(
3274                 session, supportType[(direction & 1)][trackSequence], 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
3275             break;
3276     }
3277 
3278     int32_t blockedSegments = 0;
3279     switch (trackSequence)
3280     {
3281         case 0:
3282             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC;
3283             break;
3284         case 2:
3285             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_D4 | SEGMENT_C0;
3286             break;
3287         case 3:
3288             blockedSegments = SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8;
3289             break;
3290     }
3291     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
3292 
3293     paint_util_set_general_support_height(session, height + 32, 0x20);
3294 }
3295 
junior_rc_paint_track_right_quarter_turn_3_tiles_25_deg_up(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)3296 void junior_rc_paint_track_right_quarter_turn_3_tiles_25_deg_up(
3297     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
3298     const TrackElement& trackElement, JuniorRcChainType chainType)
3299 {
3300     uint32_t imageId = 0;
3301     CoordsXY offset;
3302     CoordsXY boundsLength;
3303     CoordsXY boundsOffset;
3304 
3305     switch (trackSequence)
3306     {
3307         case 0:
3308             imageId = junior_rc_track_pieces_right_quarter_turn_3_tiles_25_deg_up[EnumValue(chainType)][direction][0]
3309                 | session->TrackColours[SCHEME_TRACK];
3310             offset = defaultRightQuarterTurn3TilesOffsets[direction][0];
3311             boundsLength = defaultRightQuarterTurn3TilesBoundLengths[direction][0];
3312             boundsOffset = offset;
3313             break;
3314         case 3:
3315             imageId = junior_rc_track_pieces_right_quarter_turn_3_tiles_25_deg_up[EnumValue(chainType)][direction][1]
3316                 | session->TrackColours[SCHEME_TRACK];
3317             offset = defaultRightQuarterTurn3TilesOffsets[direction][2];
3318             boundsLength = defaultRightQuarterTurn3TilesBoundLengths[direction][2];
3319             boundsOffset = offset;
3320             break;
3321     }
3322     if (imageId != 0)
3323     {
3324         PaintAddImageAsParent(session, imageId, { offset, height }, { boundsLength, 1 }, { boundsOffset, height });
3325     }
3326 
3327     if (direction == 0 && trackSequence == 0)
3328     {
3329         paint_util_push_tunnel_left(session, height - 8, TUNNEL_1);
3330     }
3331 
3332     if (direction == 0 && trackSequence == 3)
3333     {
3334         paint_util_push_tunnel_right(session, height + 8, TUNNEL_2);
3335     }
3336 
3337     if (direction == 1 && trackSequence == 3)
3338     {
3339         paint_util_push_tunnel_left(session, height + 8, TUNNEL_2);
3340     }
3341 
3342     if (direction == 3 && trackSequence == 0)
3343     {
3344         paint_util_push_tunnel_right(session, height - 8, TUNNEL_1);
3345     }
3346 
3347     uint8_t supportType[2][4] = {
3348         { 1, 0, 0, 2 },
3349         { 2, 0, 0, 1 },
3350     };
3351     switch (trackSequence)
3352     {
3353         case 0:
3354         case 3:
3355             metal_a_supports_paint_setup(
3356                 session, supportType[(direction & 1)][trackSequence], 4, 8, height, session->TrackColours[SCHEME_SUPPORTS]);
3357             break;
3358     }
3359 
3360     int32_t blockedSegments = 0;
3361     switch (trackSequence)
3362     {
3363         case 0:
3364             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC;
3365             break;
3366         case 3:
3367             blockedSegments = SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8;
3368             break;
3369     }
3370     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
3371 
3372     if (trackSequence == 0 || trackSequence == 3)
3373         paint_util_set_general_support_height(session, height + 72, 0x20);
3374     else
3375         paint_util_set_general_support_height(session, height + 56, 0x20);
3376 }
3377 
junior_rc_paint_track_right_quarter_turn_3_tiles_25_deg_down(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)3378 void junior_rc_paint_track_right_quarter_turn_3_tiles_25_deg_down(
3379     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
3380     const TrackElement& trackElement, JuniorRcChainType chainType)
3381 {
3382     uint32_t imageId = 0;
3383     CoordsXY offset;
3384     CoordsXY boundsLength;
3385     CoordsXY boundsOffset;
3386 
3387     switch (trackSequence)
3388     {
3389         case 0:
3390             imageId = junior_rc_track_pieces_right_quarter_turn_3_tiles_25_deg_down[EnumValue(chainType)][direction][0]
3391                 | session->TrackColours[SCHEME_TRACK];
3392             offset = defaultRightQuarterTurn3TilesOffsets[direction][0];
3393             boundsLength = defaultRightQuarterTurn3TilesBoundLengths[direction][0];
3394             boundsOffset = offset;
3395             break;
3396         case 3:
3397             imageId = junior_rc_track_pieces_right_quarter_turn_3_tiles_25_deg_down[EnumValue(chainType)][direction][1]
3398                 | session->TrackColours[SCHEME_TRACK];
3399             offset = defaultRightQuarterTurn3TilesOffsets[direction][2];
3400             boundsLength = defaultRightQuarterTurn3TilesBoundLengths[direction][2];
3401             boundsOffset = offset;
3402             break;
3403     }
3404     if (imageId != 0)
3405     {
3406         PaintAddImageAsParent(
3407             session, imageId, { offset, height }, { boundsLength.x, boundsLength.y, 1 }, { boundsOffset, height });
3408     }
3409 
3410     if (direction == 0 && trackSequence == 0)
3411     {
3412         paint_util_push_tunnel_left(session, height + 8, TUNNEL_2);
3413     }
3414 
3415     if (direction == 0 && trackSequence == 3)
3416     {
3417         paint_util_push_tunnel_right(session, height - 8, TUNNEL_1);
3418     }
3419 
3420     if (direction == 1 && trackSequence == 3)
3421     {
3422         paint_util_push_tunnel_left(session, height - 8, TUNNEL_1);
3423     }
3424 
3425     if (direction == 3 && trackSequence == 0)
3426     {
3427         paint_util_push_tunnel_right(session, height + 8, TUNNEL_2);
3428     }
3429 
3430     static constexpr uint8_t supportType[2][4] = {
3431         { 1, 0, 0, 2 },
3432         { 2, 0, 0, 1 },
3433     };
3434     switch (trackSequence)
3435     {
3436         case 0:
3437         case 3:
3438             metal_a_supports_paint_setup(
3439                 session, supportType[(direction & 1)][trackSequence], 4, 8, height, session->TrackColours[SCHEME_SUPPORTS]);
3440             break;
3441     }
3442 
3443     int32_t blockedSegments = 0;
3444     switch (trackSequence)
3445     {
3446         case 0:
3447             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC;
3448             break;
3449         case 3:
3450             blockedSegments = SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8;
3451             break;
3452     }
3453     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
3454 
3455     if (trackSequence == 0 || trackSequence == 3)
3456         paint_util_set_general_support_height(session, height + 72, 0x20);
3457     else
3458         paint_util_set_general_support_height(session, height + 56, 0x20);
3459 }
3460 
3461 /** rct2: 0x008AA0C0 */
junior_rc_left_quarter_turn_3_tiles_bank_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)3462 static void junior_rc_left_quarter_turn_3_tiles_bank_paint_setup(
3463     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
3464     const TrackElement& trackElement)
3465 {
3466     trackSequence = mapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence];
3467     junior_rc_right_quarter_turn_3_tiles_bank_paint_setup(
3468         session, ride, trackSequence, (direction + 1) % 4, height, trackElement);
3469 }
3470 
3471 /** rct2: 0x008AAED0, 0x0051C83C, 0x0051C9EC, 0x0051CB76, 0x0051CCDC*/
junior_rc_right_quarter_turn_3_tiles_25_deg_up_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)3472 static void junior_rc_right_quarter_turn_3_tiles_25_deg_up_paint_setup(
3473     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
3474     const TrackElement& trackElement)
3475 {
3476     bool isChained = trackElement.HasChain();
3477     junior_rc_paint_track_right_quarter_turn_3_tiles_25_deg_up(
3478         session, ride, trackSequence, direction, height, trackElement,
3479         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
3480 }
3481 
3482 /** rct2: 0x008AAEF0, 0x0051CEC8, 0x0051D078, 0x0051D202, 0x0051D368*/
junior_rc_right_quarter_turn_3_tiles_25_deg_down_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)3483 static void junior_rc_right_quarter_turn_3_tiles_25_deg_down_paint_setup(
3484     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
3485     const TrackElement& trackElement)
3486 {
3487     bool isChained = trackElement.HasChain();
3488     junior_rc_paint_track_right_quarter_turn_3_tiles_25_deg_down(
3489         session, ride, trackSequence, direction, height, trackElement,
3490         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
3491 }
3492 
3493 static constexpr const uint8_t junior_rc_left_quarter_turn_3_tiles_to_right_turn_map[] = {
3494     3,
3495     1,
3496     2,
3497     0,
3498 };
3499 
3500 /** rct2: 0x008AAEC0 */
junior_rc_left_quarter_turn_3_tiles_25_deg_up_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)3501 static void junior_rc_left_quarter_turn_3_tiles_25_deg_up_paint_setup(
3502     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
3503     const TrackElement& trackElement)
3504 {
3505     trackSequence = junior_rc_left_quarter_turn_3_tiles_to_right_turn_map[trackSequence];
3506     junior_rc_right_quarter_turn_3_tiles_25_deg_down_paint_setup(
3507         session, ride, trackSequence, (direction + 1) % 4, height, trackElement);
3508 }
3509 
3510 /** rct2: 0x008AAEE0 */
junior_rc_left_quarter_turn_3_tiles_25_deg_down_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)3511 static void junior_rc_left_quarter_turn_3_tiles_25_deg_down_paint_setup(
3512     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
3513     const TrackElement& trackElement)
3514 {
3515     trackSequence = junior_rc_left_quarter_turn_3_tiles_to_right_turn_map[trackSequence];
3516     junior_rc_right_quarter_turn_3_tiles_25_deg_up_paint_setup(
3517         session, ride, trackSequence, (direction + 1) % 4, height, trackElement);
3518 }
3519 
3520 /** rct2: 0x008AB0F0, 0x0052B3A4, 0x0052B5F8, 0x0052B863, 0x0052BA78 */
junior_rc_right_half_banked_helix_up_small_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)3521 static void junior_rc_right_half_banked_helix_up_small_paint_setup(
3522     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
3523     const TrackElement& trackElement)
3524 {
3525     static constexpr int8_t thickness[2] = { 1, 26 };
3526 
3527     if (trackSequence > 3)
3528     {
3529         trackSequence -= 4;
3530         direction++;
3531         direction &= 3;
3532     }
3533     track_paint_util_right_helix_up_small_quarter_tiles_paint(
3534         session, thickness, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
3535         junior_rc_track_pieces_right_half_banked_helix_up_small_quarter_tiles, nullptr,
3536         defaultRightHelixUpSmallQuarterBoundLengths, defaultRightHelixUpSmallQuarterBoundOffsets);
3537 
3538     if (trackSequence == 0)
3539     {
3540         metal_a_supports_paint_setup(
3541             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 2, height,
3542             session->TrackColours[SCHEME_SUPPORTS]);
3543     }
3544     else if (trackSequence == 3)
3545     {
3546         metal_a_supports_paint_setup(
3547             session, (direction & 1) ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 6, height,
3548             session->TrackColours[SCHEME_SUPPORTS]);
3549     }
3550 
3551     if (direction == 0 && trackSequence == 0)
3552     {
3553         paint_util_push_tunnel_left(session, height, TUNNEL_0);
3554     }
3555 
3556     if (direction == 0 && trackSequence == 3)
3557     {
3558         paint_util_push_tunnel_right(session, height + 8, TUNNEL_0);
3559     }
3560 
3561     if (direction == 1 && trackSequence == 3)
3562     {
3563         paint_util_push_tunnel_left(session, height + 8, TUNNEL_0);
3564     }
3565 
3566     if (direction == 3 && trackSequence == 0)
3567     {
3568         paint_util_push_tunnel_right(session, height, TUNNEL_0);
3569     }
3570 
3571     int32_t blockedSegments = 0;
3572     switch (trackSequence)
3573     {
3574         case 0:
3575             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC | SEGMENT_D4;
3576             break;
3577         case 2:
3578             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_C0 | SEGMENT_D4;
3579             break;
3580         case 3:
3581             blockedSegments = SEGMENT_D0 | SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8;
3582             break;
3583     }
3584     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
3585     paint_util_set_general_support_height(session, height + 32, 0x20);
3586 }
3587 
3588 /** rct2: 0x008AB110, 0x0052BD80, 0x0052BFD4, 0x0052C23B, 0x0052C450 */
junior_rc_right_half_banked_helix_down_small_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)3589 static void junior_rc_right_half_banked_helix_down_small_paint_setup(
3590     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
3591     const TrackElement& trackElement)
3592 {
3593     static constexpr int8_t thickness[2] = { 1, 26 };
3594 
3595     if (trackSequence > 3)
3596     {
3597         trackSequence -= 4;
3598         direction++;
3599         direction &= 3;
3600     }
3601     track_paint_util_right_helix_up_small_quarter_tiles_paint(
3602         session, thickness, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
3603         junior_rc_track_pieces_right_half_banked_helix_down_small_quarter_tiles, nullptr,
3604         defaultRightHelixUpSmallQuarterBoundLengths, defaultRightHelixUpSmallQuarterBoundOffsets);
3605 
3606     if (trackSequence == 0)
3607     {
3608         metal_a_supports_paint_setup(
3609             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 6, height,
3610             session->TrackColours[SCHEME_SUPPORTS]);
3611     }
3612     else if (trackSequence == 3)
3613     {
3614         metal_a_supports_paint_setup(
3615             session, (direction & 1) ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 2, height,
3616             session->TrackColours[SCHEME_SUPPORTS]);
3617     }
3618 
3619     if (direction == 0 && trackSequence == 0)
3620     {
3621         paint_util_push_tunnel_left(session, height + 8, TUNNEL_0);
3622     }
3623 
3624     if (direction == 0 && trackSequence == 3)
3625     {
3626         paint_util_push_tunnel_right(session, height, TUNNEL_0);
3627     }
3628 
3629     if (direction == 1 && trackSequence == 3)
3630     {
3631         paint_util_push_tunnel_left(session, height, TUNNEL_0);
3632     }
3633 
3634     if (direction == 3 && trackSequence == 0)
3635     {
3636         paint_util_push_tunnel_right(session, height + 8, TUNNEL_0);
3637     }
3638 
3639     int32_t blockedSegments = 0;
3640     switch (trackSequence)
3641     {
3642         case 0:
3643             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC | SEGMENT_D4;
3644             break;
3645         case 2:
3646             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_C0 | SEGMENT_D4;
3647             break;
3648         case 3:
3649             blockedSegments = SEGMENT_D0 | SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8;
3650             break;
3651     }
3652     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
3653     paint_util_set_general_support_height(session, height + 32, 0x20);
3654 }
3655 
3656 /** rct2: 0x008AB0E0 */
junior_rc_left_half_banked_helix_up_small_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)3657 static void junior_rc_left_half_banked_helix_up_small_paint_setup(
3658     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
3659     const TrackElement& trackElement)
3660 {
3661     if (trackSequence > 3)
3662     {
3663         trackSequence -= 4;
3664         direction--;
3665         direction &= 3;
3666     }
3667     trackSequence = junior_rc_left_quarter_turn_3_tiles_to_right_turn_map[trackSequence];
3668     junior_rc_right_half_banked_helix_down_small_paint_setup(
3669         session, ride, trackSequence, (direction + 1) % 4, height, trackElement);
3670 }
3671 
3672 /** rct2: 0x008AB100 */
junior_rc_left_half_banked_helix_down_small_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)3673 static void junior_rc_left_half_banked_helix_down_small_paint_setup(
3674     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
3675     const TrackElement& trackElement)
3676 {
3677     if (trackSequence > 3)
3678     {
3679         trackSequence -= 4;
3680         direction--;
3681         direction &= 3;
3682     }
3683     trackSequence = junior_rc_left_quarter_turn_3_tiles_to_right_turn_map[trackSequence];
3684     junior_rc_right_half_banked_helix_up_small_paint_setup(
3685         session, ride, trackSequence, (direction + 1) % 4, height, trackElement);
3686 }
3687 
3688 /** rct2: 0x008AB130, 0x0052C7BC, 0x0052CB6B, 0x0052CF32, 0x0052D2B3 */
junior_rc_right_half_banked_helix_up_large_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)3689 static void junior_rc_right_half_banked_helix_up_large_paint_setup(
3690     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
3691     const TrackElement& trackElement)
3692 {
3693     static constexpr int8_t thickness[2] = { 1, 26 };
3694 
3695     if (trackSequence > 6)
3696     {
3697         trackSequence -= 7;
3698         direction++;
3699         direction &= 3;
3700     }
3701     track_paint_util_right_helix_up_large_quarter_tiles_paint(
3702         session, thickness, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
3703         junior_rc_track_pieces_right_half_banked_helix_up_large_quarter_tiles, nullptr,
3704         defaultRightHelixUpLargeQuarterBoundLengths, defaultRightHelixUpLargeQuarterBoundOffsets);
3705 
3706     if (trackSequence == 0)
3707     {
3708         metal_a_supports_paint_setup(
3709             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 1, height,
3710             session->TrackColours[SCHEME_SUPPORTS]);
3711     }
3712     else if (trackSequence == 6)
3713     {
3714         metal_a_supports_paint_setup(
3715             session, (direction & 1) ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 7, height,
3716             session->TrackColours[SCHEME_SUPPORTS]);
3717     }
3718 
3719     if (direction == 0 && trackSequence == 0)
3720     {
3721         paint_util_push_tunnel_left(session, height, TUNNEL_0);
3722     }
3723 
3724     if (direction == 0 && trackSequence == 6)
3725     {
3726         paint_util_push_tunnel_right(session, height + 8, TUNNEL_0);
3727     }
3728 
3729     if (direction == 1 && trackSequence == 6)
3730     {
3731         paint_util_push_tunnel_left(session, height + 8, TUNNEL_0);
3732     }
3733 
3734     if (direction == 3 && trackSequence == 0)
3735     {
3736         paint_util_push_tunnel_right(session, height, TUNNEL_0);
3737     }
3738 
3739     switch (trackSequence)
3740     {
3741         case 0:
3742             paint_util_set_segment_support_height(
3743                 session, paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_D4 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC, direction),
3744                 0xFFFF, 0);
3745             break;
3746         case 2:
3747             paint_util_set_segment_support_height(
3748                 session,
3749                 paint_util_rotate_segments(
3750                     SEGMENT_D0 | SEGMENT_C4 | SEGMENT_D4 | SEGMENT_BC | SEGMENT_C0 | SEGMENT_CC, direction),
3751                 0xFFFF, 0);
3752             break;
3753         case 3:
3754             paint_util_set_segment_support_height(
3755                 session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_C4, direction), 0xFFFF, 0);
3756             break;
3757         case 5:
3758             paint_util_set_segment_support_height(
3759                 session,
3760                 paint_util_rotate_segments(
3761                     SEGMENT_D4 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C8, direction),
3762                 0xFFFF, 0);
3763             break;
3764         case 6:
3765             paint_util_set_segment_support_height(
3766                 session, paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8, direction),
3767                 0xFFFF, 0);
3768             break;
3769     }
3770 
3771     paint_util_set_general_support_height(session, height + 32, 0x20);
3772 }
3773 
3774 /** rct2: 0x008AB150, 0x0052D778, 0x0052DB27, 0x0052DEEA, 0x0052E26B */
junior_rc_right_half_banked_helix_down_large_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)3775 static void junior_rc_right_half_banked_helix_down_large_paint_setup(
3776     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
3777     const TrackElement& trackElement)
3778 {
3779     static constexpr int8_t thickness[2] = { 1, 26 };
3780 
3781     if (trackSequence > 6)
3782     {
3783         trackSequence -= 7;
3784         direction++;
3785         direction &= 3;
3786     }
3787     track_paint_util_right_helix_up_large_quarter_tiles_paint(
3788         session, thickness, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
3789         junior_rc_track_pieces_right_half_banked_helix_down_large_quarter_tiles, nullptr,
3790         defaultRightHelixUpLargeQuarterBoundLengths, defaultRightHelixUpLargeQuarterBoundOffsets);
3791 
3792     if (trackSequence == 0)
3793     {
3794         metal_a_supports_paint_setup(
3795             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 7, height,
3796             session->TrackColours[SCHEME_SUPPORTS]);
3797     }
3798     else if (trackSequence == 6)
3799     {
3800         metal_a_supports_paint_setup(
3801             session, (direction & 1) ? METAL_SUPPORTS_FORK : METAL_SUPPORTS_FORK_ALT, 4, 1, height,
3802             session->TrackColours[SCHEME_SUPPORTS]);
3803     }
3804 
3805     if (direction == 0 && trackSequence == 0)
3806     {
3807         paint_util_push_tunnel_left(session, height + 8, TUNNEL_0);
3808     }
3809 
3810     if (direction == 0 && trackSequence == 6)
3811     {
3812         paint_util_push_tunnel_right(session, height, TUNNEL_0);
3813     }
3814 
3815     if (direction == 1 && trackSequence == 6)
3816     {
3817         paint_util_push_tunnel_left(session, height, TUNNEL_0);
3818     }
3819 
3820     if (direction == 3 && trackSequence == 0)
3821     {
3822         paint_util_push_tunnel_right(session, height + 8, TUNNEL_0);
3823     }
3824 
3825     switch (trackSequence)
3826     {
3827         case 0:
3828             paint_util_set_segment_support_height(
3829                 session, paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_D4 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC, direction),
3830                 0xFFFF, 0);
3831             break;
3832         case 2:
3833             paint_util_set_segment_support_height(
3834                 session,
3835                 paint_util_rotate_segments(
3836                     SEGMENT_D0 | SEGMENT_C4 | SEGMENT_D4 | SEGMENT_BC | SEGMENT_C0 | SEGMENT_CC, direction),
3837                 0xFFFF, 0);
3838             break;
3839         case 3:
3840             paint_util_set_segment_support_height(
3841                 session, paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_C4, direction), 0xFFFF, 0);
3842             break;
3843         case 5:
3844             paint_util_set_segment_support_height(
3845                 session,
3846                 paint_util_rotate_segments(
3847                     SEGMENT_D4 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C8, direction),
3848                 0xFFFF, 0);
3849             break;
3850         case 6:
3851             paint_util_set_segment_support_height(
3852                 session, paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8, direction),
3853                 0xFFFF, 0);
3854             break;
3855     }
3856 
3857     paint_util_set_general_support_height(session, height + 32, 0x20);
3858 }
3859 
3860 /** rct2: 0x008AB120 */
junior_rc_left_half_banked_helix_up_large_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)3861 static void junior_rc_left_half_banked_helix_up_large_paint_setup(
3862     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
3863     const TrackElement& trackElement)
3864 {
3865     if (trackSequence > 6)
3866     {
3867         trackSequence -= 7;
3868         direction--;
3869         direction &= 3;
3870     }
3871     trackSequence = junior_rc_left_quarter_turn_5_tiles_to_right_turn_map[trackSequence];
3872     junior_rc_right_half_banked_helix_down_large_paint_setup(
3873         session, ride, trackSequence, (direction + 1) % 4, height, trackElement);
3874 }
3875 
3876 /** rct2: 0x008AB140 */
junior_rc_left_half_banked_helix_down_large_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)3877 static void junior_rc_left_half_banked_helix_down_large_paint_setup(
3878     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
3879     const TrackElement& trackElement)
3880 {
3881     if (trackSequence > 6)
3882     {
3883         trackSequence -= 7;
3884         direction--;
3885         direction &= 3;
3886     }
3887     trackSequence = junior_rc_left_quarter_turn_5_tiles_to_right_turn_map[trackSequence];
3888     junior_rc_right_half_banked_helix_up_large_paint_setup(
3889         session, ride, trackSequence, (direction + 1) % 4, height, trackElement);
3890 }
3891 
3892 /**
3893  * rct2: 0x008AAF00, 0x0051851C, 0x005185D8
3894  */
junior_rc_brake_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)3895 static void junior_rc_brake_paint_setup(
3896     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
3897     const TrackElement& trackElement)
3898 {
3899     uint32_t image_id;
3900 
3901     image_id = junior_rc_track_pieces_brake[direction] | session->TrackColours[SCHEME_TRACK];
3902     if (direction & 1)
3903     {
3904         PaintAddImageAsParent(session, image_id, { 6, 0, height }, { 20, 32, 1 });
3905 
3906         paint_util_push_tunnel_right(session, height, TUNNEL_0);
3907     }
3908     else
3909     {
3910         PaintAddImageAsParent(session, image_id, { 0, 6, height }, { 32, 20, 1 });
3911 
3912         paint_util_push_tunnel_left(session, height, TUNNEL_0);
3913     }
3914 
3915     if (track_paint_util_should_paint_supports(session->MapPosition))
3916     {
3917         int32_t edi = (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK;
3918         metal_a_supports_paint_setup(session, edi, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
3919     }
3920 
3921     paint_util_set_segment_support_height(
3922         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0);
3923     paint_util_set_general_support_height(session, height + 32, 0x20);
3924 }
3925 
3926 /**
3927  * rct2: 0x008AB280, 0x00518694, 0x00518759
3928  */
junior_rc_block_brake_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)3929 static void junior_rc_block_brake_paint_setup(
3930     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
3931     const TrackElement& trackElement)
3932 {
3933     uint32_t image_id;
3934 
3935     bool isBraked = trackElement.BlockBrakeClosed();
3936 
3937     image_id = junior_rc_track_pieces_block_brake[isBraked][direction] | session->TrackColours[SCHEME_TRACK];
3938     if (direction & 1)
3939     {
3940         PaintAddImageAsParent(session, image_id, { 6, 0, height }, { 20, 32, 1 });
3941 
3942         paint_util_push_tunnel_right(session, height, TUNNEL_0);
3943     }
3944     else
3945     {
3946         PaintAddImageAsParent(session, image_id, { 0, 6, height }, { 32, 20, 1 });
3947 
3948         paint_util_push_tunnel_left(session, height, TUNNEL_0);
3949     }
3950 
3951     if (track_paint_util_should_paint_supports(session->MapPosition))
3952     {
3953         int32_t edi = (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK;
3954         metal_a_supports_paint_setup(session, edi, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
3955     }
3956 
3957     paint_util_set_segment_support_height(
3958         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0);
3959     paint_util_set_general_support_height(session, height + 32, 0x20);
3960 }
3961 
3962 /** rct2: 0x008AAF80 */
junior_rc_left_eighth_to_diag_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)3963 static void junior_rc_left_eighth_to_diag_paint_setup(
3964     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
3965     const TrackElement& trackElement)
3966 {
3967     track_paint_util_eighth_to_diag_tiles_paint(
3968         session, defaultEighthToDiagThickness, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
3969         junior_rc_track_pieces_left_eight_to_diag, nullptr, defaultLeftEighthToDiagBoundLengths,
3970         defaultLeftEighthToDiagBoundOffsets);
3971 
3972     switch (trackSequence)
3973     {
3974         case 0:
3975             metal_a_supports_paint_setup(
3976                 session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, height,
3977                 session->TrackColours[SCHEME_SUPPORTS]);
3978             break;
3979         case 4:
3980             if (direction == 0)
3981                 metal_a_supports_paint_setup(
3982                     session, METAL_SUPPORTS_FORK_ALT, 3, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
3983             if (direction == 1)
3984                 metal_a_supports_paint_setup(
3985                     session, METAL_SUPPORTS_FORK, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
3986             if (direction == 2)
3987                 metal_a_supports_paint_setup(
3988                     session, METAL_SUPPORTS_FORK_ALT, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
3989             if (direction == 3)
3990                 metal_a_supports_paint_setup(
3991                     session, METAL_SUPPORTS_FORK, 2, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
3992             break;
3993     }
3994 
3995     if (direction == 0 && trackSequence == 0)
3996     {
3997         paint_util_push_tunnel_left(session, height, TUNNEL_0);
3998     }
3999     if (direction == 3 && trackSequence == 0)
4000     {
4001         paint_util_push_tunnel_right(session, height, TUNNEL_0);
4002     }
4003 
4004     int32_t blockedSegments = 0;
4005     switch (trackSequence)
4006     {
4007         case 0:
4008             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC;
4009             break;
4010         case 1:
4011             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_B4;
4012             break;
4013         case 2:
4014             blockedSegments = SEGMENT_C4 | SEGMENT_CC | SEGMENT_C0 | SEGMENT_D4 | SEGMENT_BC;
4015             break;
4016         case 3:
4017             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_B8 | SEGMENT_C8;
4018             break;
4019         case 4:
4020             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_C8 | SEGMENT_C0 | SEGMENT_D4;
4021             break;
4022     }
4023 
4024     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
4025     paint_util_set_general_support_height(session, height + 32, 0x20);
4026 }
4027 
4028 /** rct2: 0x008AAF90 */
junior_rc_right_eighth_to_diag_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4029 static void junior_rc_right_eighth_to_diag_paint_setup(
4030     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4031     const TrackElement& trackElement)
4032 {
4033     track_paint_util_eighth_to_diag_tiles_paint(
4034         session, defaultEighthToDiagThickness, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
4035         junior_rc_track_pieces_right_eight_to_diag, nullptr, defaultRightEighthToDiagBoundLengths,
4036         defaultRightEighthToDiagBoundOffsets);
4037 
4038     switch (trackSequence)
4039     {
4040         case 0:
4041             metal_a_supports_paint_setup(
4042                 session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, height,
4043                 session->TrackColours[SCHEME_SUPPORTS]);
4044             break;
4045         case 4:
4046             if (direction == 0)
4047                 metal_a_supports_paint_setup(
4048                     session, METAL_SUPPORTS_FORK_ALT, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
4049             if (direction == 1)
4050                 metal_a_supports_paint_setup(
4051                     session, METAL_SUPPORTS_FORK, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
4052             if (direction == 2)
4053                 metal_a_supports_paint_setup(
4054                     session, METAL_SUPPORTS_FORK_ALT, 2, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
4055             if (direction == 3)
4056                 metal_a_supports_paint_setup(
4057                     session, METAL_SUPPORTS_FORK, 3, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
4058             break;
4059     }
4060 
4061     if (direction == 0 && trackSequence == 0)
4062     {
4063         paint_util_push_tunnel_left(session, height, TUNNEL_0);
4064     }
4065     if (direction == 3 && trackSequence == 0)
4066     {
4067         paint_util_push_tunnel_right(session, height, TUNNEL_0);
4068     }
4069 
4070     int32_t blockedSegments = 0;
4071     switch (trackSequence)
4072     {
4073         case 0:
4074             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC;
4075             break;
4076         case 1:
4077             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_C0 | SEGMENT_D4 | SEGMENT_BC;
4078             break;
4079         case 2:
4080             blockedSegments = SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_B4;
4081             break;
4082         case 3:
4083             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_C0 | SEGMENT_D4;
4084             break;
4085         case 4:
4086             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_D4;
4087             break;
4088     }
4089 
4090     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
4091     paint_util_set_general_support_height(session, height + 32, 0x20);
4092 }
4093 
4094 /** rct2: 0x008AAFA0 */
junior_rc_left_eighth_to_orthogonal_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4095 static void junior_rc_left_eighth_to_orthogonal_paint_setup(
4096     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4097     const TrackElement& trackElement)
4098 {
4099     const uint8_t map[] = { 4, 2, 3, 1, 0 };
4100     trackSequence = map[trackSequence];
4101     junior_rc_right_eighth_to_diag_paint_setup(session, ride, trackSequence, (direction + 2) % 4, height, trackElement);
4102 }
4103 
4104 /** rct2: 0x008AAFB0 */
junior_rc_right_eighth_to_orthogonal_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4105 static void junior_rc_right_eighth_to_orthogonal_paint_setup(
4106     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4107     const TrackElement& trackElement)
4108 {
4109     const uint8_t map[] = { 4, 2, 3, 1, 0 };
4110     trackSequence = map[trackSequence];
4111     junior_rc_left_eighth_to_diag_paint_setup(session, ride, trackSequence, (direction + 3) % 4, height, trackElement);
4112 }
4113 
4114 static constexpr const CoordsXY junior_rc_left_eighth_to_diag_bank_bound_lengths[4][4] = {
4115     {
4116         { 32, 1 },
4117         { 32, 16 },
4118         { 16, 16 },
4119         { 16, 16 },
4120     },
4121     {
4122         { 1, 32 },
4123         { 16, 34 },
4124         { 16, 16 },
4125         { 18, 16 },
4126     },
4127     {
4128         { 32, 20 },
4129         { 32, 16 },
4130         { 16, 16 },
4131         { 16, 16 },
4132     },
4133     {
4134         { 20, 32 },
4135         { 16, 32 },
4136         { 16, 16 },
4137         { 16, 16 },
4138     },
4139 };
4140 
4141 static constexpr const CoordsXYZ junior_rc_left_eighth_to_diag_bank_bound_offsets[4][4] = {
4142     {
4143         { 0, 27, 0 },
4144         { 0, 0, 0 },
4145         { 0, 16, 0 },
4146         { 16, 16, 0 },
4147     },
4148     {
4149         { 27, 0, 0 },
4150         { 0, 0, 27 },
4151         { 16, 16, 27 },
4152         { 16, 0, 27 },
4153     },
4154     {
4155         { 0, 6, 0 },
4156         { 0, 16, 0 },
4157         { 16, 0, 0 },
4158         { 0, 0, 0 },
4159     },
4160     {
4161         { 6, 0, 0 },
4162         { 16, 0, 0 },
4163         { 0, 0, 0 },
4164         { 0, 16, 0 },
4165     },
4166 };
4167 
4168 static constexpr const int8_t junior_rc_left_eighth_to_diag_bank_thickness[4][4] = {
4169     {
4170         26,
4171         1,
4172         1,
4173         1,
4174     },
4175     {
4176         26,
4177         0,
4178         0,
4179         0,
4180     },
4181     {
4182         1,
4183         1,
4184         1,
4185         1,
4186     },
4187     {
4188         1,
4189         1,
4190         1,
4191         1,
4192     },
4193 };
4194 
4195 /** rct2: 0x008AB160 */
junior_rc_left_eighth_to_diag_bank_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4196 static void junior_rc_left_eighth_to_diag_bank_paint_setup(
4197     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4198     const TrackElement& trackElement)
4199 {
4200     track_paint_util_eighth_to_diag_tiles_paint(
4201         session, junior_rc_left_eighth_to_diag_bank_thickness, height, direction, trackSequence,
4202         session->TrackColours[SCHEME_TRACK], junior_rc_track_pieces_left_eight_to_diag_bank, nullptr,
4203         junior_rc_left_eighth_to_diag_bank_bound_lengths, junior_rc_left_eighth_to_diag_bank_bound_offsets);
4204 
4205     switch (trackSequence)
4206     {
4207         case 0:
4208             metal_a_supports_paint_setup(
4209                 session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, height,
4210                 session->TrackColours[SCHEME_SUPPORTS]);
4211             break;
4212         case 4:
4213             if (direction == 0)
4214                 metal_a_supports_paint_setup(
4215                     session, METAL_SUPPORTS_FORK, 3, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
4216             if (direction == 1)
4217                 metal_a_supports_paint_setup(
4218                     session, METAL_SUPPORTS_FORK_ALT, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
4219             if (direction == 2)
4220                 metal_a_supports_paint_setup(
4221                     session, METAL_SUPPORTS_FORK, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
4222             if (direction == 3)
4223                 metal_a_supports_paint_setup(
4224                     session, METAL_SUPPORTS_FORK_ALT, 2, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
4225             break;
4226     }
4227 
4228     if (direction == 0 && trackSequence == 0)
4229     {
4230         paint_util_push_tunnel_left(session, height, TUNNEL_0);
4231     }
4232     if (direction == 3 && trackSequence == 0)
4233     {
4234         paint_util_push_tunnel_right(session, height, TUNNEL_0);
4235     }
4236 
4237     int32_t blockedSegments = 0;
4238     switch (trackSequence)
4239     {
4240         case 0:
4241             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC;
4242             break;
4243         case 1:
4244             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_B4;
4245             break;
4246         case 2:
4247             blockedSegments = SEGMENT_C4 | SEGMENT_CC | SEGMENT_C0 | SEGMENT_D4 | SEGMENT_BC;
4248             break;
4249         case 3:
4250             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_B8 | SEGMENT_C8;
4251             break;
4252         case 4:
4253             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_C8 | SEGMENT_C0 | SEGMENT_D4;
4254             break;
4255     }
4256 
4257     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
4258     paint_util_set_general_support_height(session, height + 32, 0x20);
4259 }
4260 
4261 static constexpr const CoordsXY junior_rc_right_eighth_to_diag_bank_bound_lengths[4][4] = {
4262     {
4263         { 32, 20 },
4264         { 16, 16 },
4265         { 16, 16 },
4266         { 16, 16 },
4267     },
4268     {
4269         { 20, 32 },
4270         { 16, 32 },
4271         { 16, 16 },
4272         { 16, 16 },
4273     },
4274     {
4275         { 32, 1 },
4276         { 34, 16 },
4277         { 28, 28 },
4278         { 16, 18 },
4279     },
4280     {
4281         { 1, 32 },
4282         { 16, 32 },
4283         { 16, 16 },
4284         { 16, 16 },
4285     },
4286 };
4287 
4288 static constexpr const CoordsXYZ junior_rc_right_eighth_to_diag_bank_bound_offsets[4][4] = {
4289     {
4290         { 0, 6, 0 },
4291         { 0, 0, 0 },
4292         { 0, 0, 0 },
4293         { 16, 0, 0 },
4294     },
4295     {
4296         { 6, 0, 0 },
4297         { 16, 0, 0 },
4298         { 0, 16, 0 },
4299         { 0, 0, 0 },
4300     },
4301     {
4302         { 0, 27, 0 },
4303         { 0, 0, 27 },
4304         { 4, 4, 27 },
4305         { 0, 16, 27 },
4306     },
4307     {
4308         { 27, 0, 0 },
4309         { 0, 0, 0 },
4310         { 16, 0, 0 },
4311         { 16, 16, 0 },
4312     },
4313 };
4314 
4315 static constexpr const int8_t junior_rc_right_eighth_to_diag_bank_thickness[4][4] = {
4316     {
4317         1,
4318         1,
4319         1,
4320         1,
4321     },
4322     {
4323         1,
4324         1,
4325         1,
4326         1,
4327     },
4328     {
4329         26,
4330         0,
4331         0,
4332         0,
4333     },
4334     {
4335         26,
4336         1,
4337         1,
4338         1,
4339     },
4340 };
4341 
4342 /** rct2: 0x008AB170 */
junior_rc_right_eighth_to_diag_bank_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4343 static void junior_rc_right_eighth_to_diag_bank_paint_setup(
4344     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4345     const TrackElement& trackElement)
4346 {
4347     track_paint_util_eighth_to_diag_tiles_paint(
4348         session, junior_rc_right_eighth_to_diag_bank_thickness, height, direction, trackSequence,
4349         session->TrackColours[SCHEME_TRACK], junior_rc_track_pieces_right_eight_to_diag_bank, nullptr,
4350         junior_rc_right_eighth_to_diag_bank_bound_lengths, junior_rc_right_eighth_to_diag_bank_bound_offsets);
4351 
4352     switch (trackSequence)
4353     {
4354         case 0:
4355             metal_a_supports_paint_setup(
4356                 session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 0, height,
4357                 session->TrackColours[SCHEME_SUPPORTS]);
4358             break;
4359         case 4:
4360             if (direction == 0)
4361                 metal_a_supports_paint_setup(
4362                     session, METAL_SUPPORTS_FORK, 1, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
4363             if (direction == 1)
4364                 metal_a_supports_paint_setup(
4365                     session, METAL_SUPPORTS_FORK_ALT, 0, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
4366             if (direction == 2)
4367                 metal_a_supports_paint_setup(
4368                     session, METAL_SUPPORTS_FORK, 2, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
4369             if (direction == 3)
4370                 metal_a_supports_paint_setup(
4371                     session, METAL_SUPPORTS_FORK_ALT, 3, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
4372             break;
4373     }
4374 
4375     if (direction == 0 && trackSequence == 0)
4376     {
4377         paint_util_push_tunnel_left(session, height, TUNNEL_0);
4378     }
4379     if (direction == 3 && trackSequence == 0)
4380     {
4381         paint_util_push_tunnel_right(session, height, TUNNEL_0);
4382     }
4383 
4384     int32_t blockedSegments = 0;
4385     switch (trackSequence)
4386     {
4387         case 0:
4388             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC;
4389             break;
4390         case 1:
4391             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_C0 | SEGMENT_D4 | SEGMENT_BC;
4392             break;
4393         case 2:
4394             blockedSegments = SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_B4;
4395             break;
4396         case 3:
4397             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_C0 | SEGMENT_D4;
4398             break;
4399         case 4:
4400             blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_D4;
4401             break;
4402     }
4403 
4404     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
4405     paint_util_set_general_support_height(session, height + 32, 0x20);
4406 }
4407 
4408 /** rct2: 0x008AB180 */
junior_rc_left_eighth_to_orthogonal_bank_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4409 static void junior_rc_left_eighth_to_orthogonal_bank_paint_setup(
4410     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4411     const TrackElement& trackElement)
4412 {
4413     static constexpr uint8_t map[] = { 4, 2, 3, 1, 0 };
4414     trackSequence = map[trackSequence];
4415     junior_rc_right_eighth_to_diag_bank_paint_setup(session, ride, trackSequence, (direction + 2) % 4, height, trackElement);
4416 }
4417 
4418 /** rct2: 0x008AB190 */
junior_rc_right_eighth_to_orthogonal_bank_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4419 static void junior_rc_right_eighth_to_orthogonal_bank_paint_setup(
4420     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4421     const TrackElement& trackElement)
4422 {
4423     static constexpr uint8_t map[] = { 4, 2, 3, 1, 0 };
4424     trackSequence = map[trackSequence];
4425     junior_rc_left_eighth_to_diag_bank_paint_setup(session, ride, trackSequence, (direction + 3) % 4, height, trackElement);
4426 }
4427 
4428 static constexpr const int32_t junior_rc_diag_blocked_segments[] = {
4429     SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4 | SEGMENT_BC,
4430     SEGMENT_C4 | SEGMENT_CC | SEGMENT_C8 | SEGMENT_B4,
4431     SEGMENT_D0 | SEGMENT_C4 | SEGMENT_C0 | SEGMENT_D4,
4432     SEGMENT_D0 | SEGMENT_C4 | SEGMENT_B8 | SEGMENT_C8,
4433 };
4434 
4435 static constexpr const uint8_t junior_rc_diag_support_segment[] = {
4436     1,
4437     0,
4438     2,
4439     3,
4440 };
4441 
junior_rc_paint_track_diag_flat(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)4442 void junior_rc_paint_track_diag_flat(
4443     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
4444     const TrackElement& trackElement, JuniorRcChainType chainType)
4445 {
4446     track_paint_util_diag_tiles_paint(
4447         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
4448         junior_rc_track_pieces_diag_flat[EnumValue(chainType)], defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr);
4449 
4450     if (trackSequence == 3)
4451     {
4452         metal_a_supports_paint_setup(
4453             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
4454             0, height, session->TrackColours[SCHEME_SUPPORTS]);
4455     }
4456 
4457     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
4458     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
4459     paint_util_set_general_support_height(session, height + 32, 0x20);
4460 }
4461 
junior_rc_paint_track_diag_25_deg_up(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)4462 void junior_rc_paint_track_diag_25_deg_up(
4463     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
4464     const TrackElement& trackElement, JuniorRcChainType chainType)
4465 {
4466     track_paint_util_diag_tiles_paint(
4467         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
4468         junior_rc_track_pieces_diag_25_deg_up[EnumValue(chainType)], defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr);
4469 
4470     if (trackSequence == 3)
4471     {
4472         metal_b_supports_paint_setup(
4473             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
4474             8, height, session->TrackColours[SCHEME_SUPPORTS]);
4475     }
4476 
4477     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
4478     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
4479     paint_util_set_general_support_height(session, height + 56, 0x20);
4480 }
4481 
junior_rc_paint_track_diag_flat_to_25_deg_up(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)4482 void junior_rc_paint_track_diag_flat_to_25_deg_up(
4483     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
4484     const TrackElement& trackElement, JuniorRcChainType chainType)
4485 {
4486     track_paint_util_diag_tiles_paint(
4487         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
4488         junior_rc_track_pieces_diag_flat_to_25_deg_up[EnumValue(chainType)], defaultDiagTileOffsets, defaultDiagBoundLengths,
4489         nullptr);
4490 
4491     if (trackSequence == 3)
4492     {
4493         metal_b_supports_paint_setup(
4494             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
4495             0, height, session->TrackColours[SCHEME_SUPPORTS]);
4496     }
4497 
4498     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
4499     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
4500     paint_util_set_general_support_height(session, height + 48, 0x20);
4501 }
4502 
junior_rc_paint_track_diag_flat_to_60_deg_up(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)4503 void junior_rc_paint_track_diag_flat_to_60_deg_up(
4504     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
4505     const TrackElement& trackElement, JuniorRcChainType chainType)
4506 {
4507     // There is no specific chain for the Water Coaster, use the Junior RC chain instead
4508     chainType = std::min(JuniorRcChainType::FrictionWheels, chainType);
4509 
4510     track_paint_util_diag_tiles_paint(
4511         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
4512         junior_rc_track_pieces_diag_flat_to_60_deg_up[EnumValue(chainType)], defaultDiagTileOffsets, defaultDiagBoundLengths,
4513         nullptr);
4514 
4515     if (trackSequence == 3)
4516     {
4517         metal_b_supports_paint_setup(
4518             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
4519             0, height + 6, session->TrackColours[SCHEME_SUPPORTS]);
4520     }
4521 
4522     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
4523     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
4524     paint_util_set_general_support_height(session, height + 64, 0x20);
4525 }
4526 
junior_rc_paint_track_diag_25_deg_up_to_flat(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)4527 void junior_rc_paint_track_diag_25_deg_up_to_flat(
4528     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
4529     const TrackElement& trackElement, JuniorRcChainType chainType)
4530 {
4531     track_paint_util_diag_tiles_paint(
4532         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
4533         junior_rc_track_pieces_diag_25_deg_up_to_flat[EnumValue(chainType)], defaultDiagTileOffsets, defaultDiagBoundLengths,
4534         nullptr);
4535 
4536     if (trackSequence == 3)
4537     {
4538         metal_b_supports_paint_setup(
4539             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
4540             4, height, session->TrackColours[SCHEME_SUPPORTS]);
4541     }
4542 
4543     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
4544     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
4545     paint_util_set_general_support_height(session, height + 56, 0x20);
4546 }
4547 
junior_rc_paint_track_diag_60_deg_up_to_flat(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)4548 void junior_rc_paint_track_diag_60_deg_up_to_flat(
4549     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
4550     const TrackElement& trackElement, JuniorRcChainType chainType)
4551 {
4552     // There is no specific chain for the Water Coaster, use the Junior RC chain instead
4553     chainType = std::min(JuniorRcChainType::FrictionWheels, chainType);
4554 
4555     track_paint_util_diag_tiles_paint(
4556         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
4557         junior_rc_track_pieces_diag_60_deg_up_to_flat[EnumValue(chainType)], defaultDiagTileOffsets, defaultDiagBoundLengths,
4558         nullptr);
4559 
4560     if (trackSequence == 3)
4561     {
4562         metal_b_supports_paint_setup(
4563             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
4564             4, height + 13, session->TrackColours[SCHEME_SUPPORTS]);
4565     }
4566 
4567     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
4568     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
4569     paint_util_set_general_support_height(session, height + 64, 0x20);
4570 }
4571 
junior_rc_paint_track_diag_25_deg_down(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)4572 void junior_rc_paint_track_diag_25_deg_down(
4573     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
4574     const TrackElement& trackElement, JuniorRcChainType chainType)
4575 {
4576     track_paint_util_diag_tiles_paint(
4577         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
4578         junior_rc_track_pieces_diag_25_deg_down[EnumValue(chainType)], defaultDiagTileOffsets, defaultDiagBoundLengths,
4579         nullptr);
4580 
4581     if (trackSequence == 3)
4582     {
4583         metal_b_supports_paint_setup(
4584             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
4585             8, height, session->TrackColours[SCHEME_SUPPORTS]);
4586     }
4587 
4588     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
4589     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
4590     paint_util_set_general_support_height(session, height + 56, 0x20);
4591 }
4592 
junior_rc_paint_track_diag_flat_to_25_deg_down(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)4593 void junior_rc_paint_track_diag_flat_to_25_deg_down(
4594     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
4595     const TrackElement& trackElement, JuniorRcChainType chainType)
4596 {
4597     track_paint_util_diag_tiles_paint(
4598         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
4599         junior_rc_track_pieces_diag_flat_to_25_deg_down[EnumValue(chainType)], defaultDiagTileOffsets, defaultDiagBoundLengths,
4600         nullptr);
4601 
4602     if (trackSequence == 3)
4603     {
4604         metal_b_supports_paint_setup(
4605             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
4606             4, height, session->TrackColours[SCHEME_SUPPORTS]);
4607     }
4608 
4609     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
4610     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
4611     paint_util_set_general_support_height(session, height + 56, 0x20);
4612 }
4613 
junior_rc_paint_track_diag_flat_to_60_deg_down(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)4614 void junior_rc_paint_track_diag_flat_to_60_deg_down(
4615     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
4616     const TrackElement& trackElement, JuniorRcChainType chainType)
4617 {
4618     // There is no specific chain for the Water Coaster, use the Junior RC chain instead
4619     chainType = std::min(JuniorRcChainType::FrictionWheels, chainType);
4620 
4621     track_paint_util_diag_tiles_paint(
4622         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
4623         junior_rc_track_pieces_diag_flat_to_60_deg_down[EnumValue(chainType)], defaultDiagTileOffsets, defaultDiagBoundLengths,
4624         nullptr);
4625 
4626     if (trackSequence == 3)
4627     {
4628         metal_b_supports_paint_setup(
4629             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
4630             4, height + 7, session->TrackColours[SCHEME_SUPPORTS]);
4631     }
4632 
4633     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
4634     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
4635     paint_util_set_general_support_height(session, height + 48, 0x20);
4636 }
4637 
junior_rc_paint_track_diag_25_deg_down_to_flat(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)4638 void junior_rc_paint_track_diag_25_deg_down_to_flat(
4639     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
4640     const TrackElement& trackElement, JuniorRcChainType chainType)
4641 {
4642     track_paint_util_diag_tiles_paint(
4643         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
4644         junior_rc_track_pieces_diag_25_deg_down_to_flat[EnumValue(chainType)], defaultDiagTileOffsets, defaultDiagBoundLengths,
4645         nullptr);
4646 
4647     if (trackSequence == 3)
4648     {
4649         metal_b_supports_paint_setup(
4650             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
4651             0, height, session->TrackColours[SCHEME_SUPPORTS]);
4652     }
4653 
4654     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
4655     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
4656     paint_util_set_general_support_height(session, height + 48, 0x20);
4657 }
4658 
junior_rc_paint_track_diag_60_deg_down_to_flat(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)4659 void junior_rc_paint_track_diag_60_deg_down_to_flat(
4660     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
4661     const TrackElement& trackElement, JuniorRcChainType chainType)
4662 {
4663     // There is no specific chain for the Water Coaster, use the Junior RC chain instead
4664     chainType = std::min(JuniorRcChainType::FrictionWheels, chainType);
4665 
4666     track_paint_util_diag_tiles_paint(
4667         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
4668         junior_rc_track_pieces_diag_60_deg_down_to_flat[EnumValue(chainType)], defaultDiagTileOffsets, defaultDiagBoundLengths,
4669         nullptr);
4670 
4671     if (trackSequence == 3)
4672     {
4673         metal_b_supports_paint_setup(
4674             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
4675             0, height, session->TrackColours[SCHEME_SUPPORTS]);
4676     }
4677 
4678     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
4679     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
4680     paint_util_set_general_support_height(session, height + 56, 0x20);
4681 }
4682 
4683 /** rct2: 0x008AAF10 */
junior_rc_diag_flat_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4684 static void junior_rc_diag_flat_paint_setup(
4685     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4686     const TrackElement& trackElement)
4687 {
4688     bool isChained = trackElement.HasChain();
4689     junior_rc_paint_track_diag_flat(
4690         session, ride, trackSequence, direction, height, trackElement,
4691         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
4692 }
4693 
4694 /** rct2: 0x008AAF40 */
junior_rc_diag_25_deg_up_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4695 static void junior_rc_diag_25_deg_up_paint_setup(
4696     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4697     const TrackElement& trackElement)
4698 {
4699     bool isChained = trackElement.HasChain();
4700     junior_rc_paint_track_diag_25_deg_up(
4701         session, ride, trackSequence, direction, height, trackElement,
4702         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
4703 }
4704 
4705 /** rct2: 0x008AAF20 */
junior_rc_diag_flat_to_25_deg_up_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4706 static void junior_rc_diag_flat_to_25_deg_up_paint_setup(
4707     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4708     const TrackElement& trackElement)
4709 {
4710     bool isChained = trackElement.HasChain();
4711     junior_rc_paint_track_diag_flat_to_25_deg_up(
4712         session, ride, trackSequence, direction, height, trackElement,
4713         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
4714 }
4715 
junior_rc_diag_flat_to_60_deg_up_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4716 static void junior_rc_diag_flat_to_60_deg_up_paint_setup(
4717     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4718     const TrackElement& trackElement)
4719 {
4720     bool isChained = trackElement.HasChain();
4721     junior_rc_paint_track_diag_flat_to_60_deg_up(
4722         session, ride, trackSequence, direction, height, trackElement,
4723         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
4724 }
4725 
4726 /** rct2: 0x008AAF30 */
junior_rc_diag_25_deg_up_to_flat_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4727 static void junior_rc_diag_25_deg_up_to_flat_paint_setup(
4728     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4729     const TrackElement& trackElement)
4730 {
4731     bool isChained = trackElement.HasChain();
4732     junior_rc_paint_track_diag_25_deg_up_to_flat(
4733         session, ride, trackSequence, direction, height, trackElement,
4734         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
4735 }
4736 
junior_rc_diag_60_deg_up_to_flat_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4737 static void junior_rc_diag_60_deg_up_to_flat_paint_setup(
4738     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4739     const TrackElement& trackElement)
4740 {
4741     bool isChained = trackElement.HasChain();
4742     junior_rc_paint_track_diag_60_deg_up_to_flat(
4743         session, ride, trackSequence, direction, height, trackElement,
4744         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
4745 }
4746 
4747 /** rct2: 0x008AAF70 */
junior_rc_diag_25_deg_down_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4748 static void junior_rc_diag_25_deg_down_paint_setup(
4749     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4750     const TrackElement& trackElement)
4751 {
4752     bool isChained = trackElement.HasChain();
4753     junior_rc_paint_track_diag_25_deg_down(
4754         session, ride, trackSequence, direction, height, trackElement,
4755         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
4756 }
4757 
4758 /** rct2: 0x008AAF50 */
junior_rc_diag_flat_to_25_deg_down_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4759 static void junior_rc_diag_flat_to_25_deg_down_paint_setup(
4760     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4761     const TrackElement& trackElement)
4762 {
4763     bool isChained = trackElement.HasChain();
4764     junior_rc_paint_track_diag_flat_to_25_deg_down(
4765         session, ride, trackSequence, direction, height, trackElement,
4766         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
4767 }
4768 
junior_rc_diag_flat_to_60_deg_down_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4769 static void junior_rc_diag_flat_to_60_deg_down_paint_setup(
4770     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4771     const TrackElement& trackElement)
4772 {
4773     bool isChained = trackElement.HasChain();
4774     junior_rc_paint_track_diag_flat_to_60_deg_down(
4775         session, ride, trackSequence, direction, height, trackElement,
4776         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
4777 }
4778 
4779 /** rct2: 0x008AAF60 */
junior_rc_diag_25_deg_down_to_flat_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4780 static void junior_rc_diag_25_deg_down_to_flat_paint_setup(
4781     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4782     const TrackElement& trackElement)
4783 {
4784     bool isChained = trackElement.HasChain();
4785     junior_rc_paint_track_diag_25_deg_down_to_flat(
4786         session, ride, trackSequence, direction, height, trackElement,
4787         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
4788 }
4789 
junior_rc_diag_60_deg_down_to_flat_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4790 static void junior_rc_diag_60_deg_down_to_flat_paint_setup(
4791     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4792     const TrackElement& trackElement)
4793 {
4794     bool isChained = trackElement.HasChain();
4795     junior_rc_paint_track_diag_60_deg_down_to_flat(
4796         session, ride, trackSequence, direction, height, trackElement,
4797         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
4798 }
4799 
4800 /** rct2: 0x008AB1C0 */
junior_rc_diag_flat_to_left_bank_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4801 static void junior_rc_diag_flat_to_left_bank_paint_setup(
4802     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4803     const TrackElement& trackElement)
4804 {
4805     track_paint_util_diag_tiles_paint(
4806         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
4807         junior_rc_track_pieces_diag_flat_to_left_bank, defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr);
4808 
4809     if (direction == 0 && trackSequence == 1)
4810     {
4811         uint32_t imageId = SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_W_E_PART_0_2 | session->TrackColours[SCHEME_TRACK];
4812 
4813         PaintAddImageAsParent(session, imageId, { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 27 });
4814     }
4815     if (trackSequence == 3)
4816     {
4817         metal_a_supports_paint_setup(
4818             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
4819             0, height, session->TrackColours[SCHEME_SUPPORTS]);
4820     }
4821 
4822     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
4823     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
4824     paint_util_set_general_support_height(session, height + 32, 0x20);
4825 }
4826 
4827 /** rct2: 0x008AB1D0 */
junior_rc_diag_flat_to_right_bank_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4828 static void junior_rc_diag_flat_to_right_bank_paint_setup(
4829     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4830     const TrackElement& trackElement)
4831 {
4832     track_paint_util_diag_tiles_paint(
4833         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
4834         junior_rc_track_pieces_diag_flat_to_right_bank, defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr);
4835 
4836     if (direction == 2 && trackSequence == 2)
4837     {
4838         uint32_t imageId = SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_E_W_PART_0_2 | session->TrackColours[SCHEME_TRACK];
4839 
4840         PaintAddImageAsParent(session, imageId, { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 27 });
4841     }
4842     if (trackSequence == 3)
4843     {
4844         metal_a_supports_paint_setup(
4845             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
4846             0, height, session->TrackColours[SCHEME_SUPPORTS]);
4847     }
4848 
4849     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
4850     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
4851     paint_util_set_general_support_height(session, height + 32, 0x20);
4852 }
4853 
4854 /** rct2: 0x008AB1E0 */
junior_rc_diag_left_bank_to_flat_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4855 static void junior_rc_diag_left_bank_to_flat_paint_setup(
4856     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4857     const TrackElement& trackElement)
4858 {
4859     track_paint_util_diag_tiles_paint(
4860         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
4861         junior_rc_track_pieces_diag_left_bank_to_flat, defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr);
4862 
4863     if (direction == 0 && trackSequence == 1)
4864     {
4865         uint32_t imageId = SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_E_W_PART_0_2 | session->TrackColours[SCHEME_TRACK];
4866 
4867         PaintAddImageAsParent(session, imageId, { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 27 });
4868     }
4869     if (trackSequence == 3)
4870     {
4871         metal_a_supports_paint_setup(
4872             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
4873             0, height, session->TrackColours[SCHEME_SUPPORTS]);
4874     }
4875 
4876     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
4877     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
4878     paint_util_set_general_support_height(session, height + 32, 0x20);
4879 }
4880 
4881 /** rct2: 0x008AB1F0 */
junior_rc_diag_right_bank_to_flat_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4882 static void junior_rc_diag_right_bank_to_flat_paint_setup(
4883     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4884     const TrackElement& trackElement)
4885 {
4886     track_paint_util_diag_tiles_paint(
4887         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
4888         junior_rc_track_pieces_diag_right_bank_to_flat, defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr);
4889 
4890     if (direction == 2 && trackSequence == 2)
4891     {
4892         uint32_t imageId = SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_W_E_PART_0_2 | session->TrackColours[SCHEME_TRACK];
4893 
4894         PaintAddImageAsParent(session, imageId, { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 27 });
4895     }
4896     if (trackSequence == 3)
4897     {
4898         metal_a_supports_paint_setup(
4899             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
4900             0, height, session->TrackColours[SCHEME_SUPPORTS]);
4901     }
4902 
4903     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
4904     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
4905     paint_util_set_general_support_height(session, height + 32, 0x20);
4906 }
4907 
4908 /** rct2: 0x008AB220 */
junior_rc_diag_left_bank_to_25_deg_up_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4909 static void junior_rc_diag_left_bank_to_25_deg_up_paint_setup(
4910     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4911     const TrackElement& trackElement)
4912 {
4913     track_paint_util_diag_tiles_paint(
4914         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
4915         junior_rc_track_pieces_diag_left_bank_to_25_deg_up, defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr);
4916 
4917     if (direction == 0 && trackSequence == 1)
4918     {
4919         uint32_t imageId = SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_W_E_PART_0_2 | session->TrackColours[SCHEME_TRACK];
4920 
4921         PaintAddImageAsParent(session, imageId, { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 35 });
4922     }
4923     if (trackSequence == 3)
4924     {
4925         metal_b_supports_paint_setup(
4926             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
4927             0, height, session->TrackColours[SCHEME_SUPPORTS]);
4928     }
4929 
4930     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
4931     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
4932     paint_util_set_general_support_height(session, height + 48, 0x20);
4933 }
4934 
4935 /** rct2: 0x008AB230 */
junior_rc_diag_right_bank_to_25_deg_up_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4936 static void junior_rc_diag_right_bank_to_25_deg_up_paint_setup(
4937     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4938     const TrackElement& trackElement)
4939 {
4940     track_paint_util_diag_tiles_paint(
4941         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
4942         junior_rc_track_pieces_diag_right_bank_to_25_deg_up, defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr);
4943 
4944     if (direction == 2 && trackSequence == 2)
4945     {
4946         uint32_t imageId = SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_E_W_PART_0_2 | session->TrackColours[SCHEME_TRACK];
4947 
4948         PaintAddImageAsParent(session, imageId, { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 35 });
4949     }
4950     if (trackSequence == 3)
4951     {
4952         metal_b_supports_paint_setup(
4953             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
4954             0, height, session->TrackColours[SCHEME_SUPPORTS]);
4955     }
4956 
4957     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
4958     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
4959     paint_util_set_general_support_height(session, height + 48, 0x20);
4960 }
4961 
4962 /** rct2: 0x008AB200 */
junior_rc_diag_25_deg_up_to_left_bank_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4963 static void junior_rc_diag_25_deg_up_to_left_bank_paint_setup(
4964     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4965     const TrackElement& trackElement)
4966 {
4967     track_paint_util_diag_tiles_paint(
4968         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
4969         junior_rc_track_pieces_diag_25_deg_up_to_left_bank, defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr);
4970 
4971     if (direction == 0 && trackSequence == 1)
4972     {
4973         uint32_t imageId = SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_W_E_PART_0_2 | session->TrackColours[SCHEME_TRACK];
4974 
4975         PaintAddImageAsParent(session, imageId, { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 35 });
4976     }
4977     if (trackSequence == 3)
4978     {
4979         metal_b_supports_paint_setup(
4980             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
4981             4, height, session->TrackColours[SCHEME_SUPPORTS]);
4982     }
4983 
4984     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
4985     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
4986     paint_util_set_general_support_height(session, height + 56, 0x20);
4987 }
4988 
4989 /** rct2: 0x008AB210 */
junior_rc_diag_25_deg_up_to_right_bank_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)4990 static void junior_rc_diag_25_deg_up_to_right_bank_paint_setup(
4991     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
4992     const TrackElement& trackElement)
4993 {
4994     track_paint_util_diag_tiles_paint(
4995         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
4996         junior_rc_track_pieces_diag_25_deg_up_to_right_bank, defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr);
4997 
4998     if (direction == 2 && trackSequence == 2)
4999     {
5000         uint32_t imageId = SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_E_W_PART_0_2 | session->TrackColours[SCHEME_TRACK];
5001 
5002         PaintAddImageAsParent(session, imageId, { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 35 });
5003     }
5004     if (trackSequence == 3)
5005     {
5006         metal_b_supports_paint_setup(
5007             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
5008             4, height, session->TrackColours[SCHEME_SUPPORTS]);
5009     }
5010 
5011     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
5012     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
5013     paint_util_set_general_support_height(session, height + 56, 0x20);
5014 }
5015 
5016 /** rct2: 0x008AB200 */
junior_rc_diag_left_bank_to_25_deg_down_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5017 static void junior_rc_diag_left_bank_to_25_deg_down_paint_setup(
5018     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5019     const TrackElement& trackElement)
5020 {
5021     track_paint_util_diag_tiles_paint(
5022         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
5023         junior_rc_track_pieces_diag_left_bank_to_25_deg_down, defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr);
5024 
5025     if (direction == 0 && trackSequence == 1)
5026     {
5027         uint32_t imageId = SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_E_W_PART_0_2 | session->TrackColours[SCHEME_TRACK];
5028 
5029         PaintAddImageAsParent(session, imageId, { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 35 });
5030     }
5031     if (trackSequence == 3)
5032     {
5033         metal_b_supports_paint_setup(
5034             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
5035             4, height, session->TrackColours[SCHEME_SUPPORTS]);
5036     }
5037 
5038     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
5039     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
5040     paint_util_set_general_support_height(session, height + 56, 0x20);
5041 }
5042 
5043 /** rct2: 0x008AB210 */
junior_rc_diag_right_bank_to_25_deg_down_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5044 static void junior_rc_diag_right_bank_to_25_deg_down_paint_setup(
5045     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5046     const TrackElement& trackElement)
5047 {
5048     track_paint_util_diag_tiles_paint(
5049         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
5050         junior_rc_track_pieces_diag_right_bank_to_25_deg_down, defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr);
5051 
5052     if (direction == 2 && trackSequence == 2)
5053     {
5054         uint32_t imageId = SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_W_E_PART_0_2 | session->TrackColours[SCHEME_TRACK];
5055 
5056         PaintAddImageAsParent(session, imageId, { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 35 });
5057     }
5058     if (trackSequence == 3)
5059     {
5060         metal_b_supports_paint_setup(
5061             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
5062             4, height, session->TrackColours[SCHEME_SUPPORTS]);
5063     }
5064 
5065     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
5066     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
5067     paint_util_set_general_support_height(session, height + 56, 0x20);
5068 }
5069 
5070 /** rct2: 0x008AB220 */
junior_rc_diag_25_deg_down_to_left_bank_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5071 static void junior_rc_diag_25_deg_down_to_left_bank_paint_setup(
5072     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5073     const TrackElement& trackElement)
5074 {
5075     track_paint_util_diag_tiles_paint(
5076         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
5077         junior_rc_track_pieces_diag_25_deg_down_to_left_bank, defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr);
5078 
5079     if (direction == 0 && trackSequence == 1)
5080     {
5081         uint32_t imageId = SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_E_W_PART_0_2 | session->TrackColours[SCHEME_TRACK];
5082 
5083         PaintAddImageAsParent(session, imageId, { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 35 });
5084     }
5085     if (trackSequence == 3)
5086     {
5087         metal_b_supports_paint_setup(
5088             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
5089             0, height, session->TrackColours[SCHEME_SUPPORTS]);
5090     }
5091 
5092     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
5093     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
5094     paint_util_set_general_support_height(session, height + 48, 0x20);
5095 }
5096 
5097 /** rct2: 0x008AB230 */
junior_rc_diag_25_deg_down_to_right_bank_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5098 static void junior_rc_diag_25_deg_down_to_right_bank_paint_setup(
5099     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5100     const TrackElement& trackElement)
5101 {
5102     track_paint_util_diag_tiles_paint(
5103         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
5104         junior_rc_track_pieces_diag_25_deg_down_to_right_bank, defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr);
5105 
5106     if (direction == 2 && trackSequence == 2)
5107     {
5108         uint32_t imageId = SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_W_E_PART_0_2 | session->TrackColours[SCHEME_TRACK];
5109 
5110         PaintAddImageAsParent(session, imageId, { -16, -16, height }, { 32, 32, 0 }, { -16, -16, height + 35 });
5111     }
5112     if (trackSequence == 3)
5113     {
5114         metal_b_supports_paint_setup(
5115             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
5116             0, height, session->TrackColours[SCHEME_SUPPORTS]);
5117     }
5118 
5119     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
5120     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
5121     paint_util_set_general_support_height(session, height + 48, 0x20);
5122 }
5123 
5124 static constexpr const CoordsXYZ junior_rc_diag_left_bank_bound_offsets[4] = {
5125     { -16, -16, 27 },
5126     { -16, -16, 0 },
5127     { -16, -16, 0 },
5128     { -16, -16, 0 },
5129 };
5130 
5131 static constexpr const CoordsXYZ junior_rc_diag_right_bank_bound_offsets[4] = {
5132     { -16, -16, 0 },
5133     { -16, -16, 0 },
5134     { -16, -16, 27 },
5135     { -16, -16, 0 },
5136 };
5137 
5138 /** rct2: 0x008AB1A0 */
junior_rc_diag_left_bank_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5139 static void junior_rc_diag_left_bank_paint_setup(
5140     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5141     const TrackElement& trackElement)
5142 {
5143     uint8_t thickness = direction == 0 ? 0 : 1;
5144     track_paint_util_diag_tiles_paint(
5145         session, thickness, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
5146         junior_rc_track_pieces_diag_left_bank, defaultDiagTileOffsets, defaultDiagBoundLengths,
5147         junior_rc_diag_left_bank_bound_offsets);
5148 
5149     if (trackSequence == 3)
5150     {
5151         metal_a_supports_paint_setup(
5152             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
5153             0, height, session->TrackColours[SCHEME_SUPPORTS]);
5154     }
5155 
5156     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
5157     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
5158     paint_util_set_general_support_height(session, height + 32, 0x20);
5159 }
5160 
5161 /** rct2: 0x008AB1B0 */
junior_rc_diag_right_bank_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5162 static void junior_rc_diag_right_bank_paint_setup(
5163     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5164     const TrackElement& trackElement)
5165 {
5166     uint8_t thickness = direction == 2 ? 0 : 1;
5167     track_paint_util_diag_tiles_paint(
5168         session, thickness, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
5169         junior_rc_track_pieces_diag_right_bank, defaultDiagTileOffsets, defaultDiagBoundLengths,
5170         junior_rc_diag_right_bank_bound_offsets);
5171 
5172     if (trackSequence == 3)
5173     {
5174         metal_a_supports_paint_setup(
5175             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
5176             0, height, session->TrackColours[SCHEME_SUPPORTS]);
5177     }
5178 
5179     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
5180     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
5181     paint_util_set_general_support_height(session, height + 32, 0x20);
5182 }
5183 
5184 static constexpr const CoordsXY junior_rc_60_deg_up_bound_offsets[4] = {
5185     { 0, 6 },
5186     { 10, 29 },
5187     { 29, 10 },
5188     { 6, 0 },
5189 };
5190 
5191 static constexpr const CoordsXY junior_rc_60_deg_up_tile_offsets[4] = {
5192     { 0, 6 },
5193     { 6, 0 },
5194     { 0, 6 },
5195     { 6, 0 },
5196 };
5197 
5198 static constexpr const int8_t junior_rc_60_deg_up_bound_thickness[4] = {
5199     1,
5200     75,
5201     75,
5202     1,
5203 };
5204 
5205 static constexpr const CoordsXY junior_rc_60_deg_up_bound_lengths[4] = {
5206     { 32, 20 },
5207     { 10, 1 },
5208     { 1, 10 },
5209     { 20, 32 },
5210 };
5211 
junior_rc_paint_track_60_deg_up(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)5212 void junior_rc_paint_track_60_deg_up(
5213     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
5214     const TrackElement& trackElement, JuniorRcChainType chainType)
5215 {
5216     uint32_t image_id = session->TrackColours[SCHEME_TRACK];
5217 
5218     image_id |= junior_rc_track_pieces_60_deg_up[EnumValue(chainType)][direction];
5219 
5220     PaintAddImageAsParent(
5221         session, image_id, { junior_rc_60_deg_up_tile_offsets[direction], height },
5222         { junior_rc_60_deg_up_bound_lengths[direction], junior_rc_60_deg_up_bound_thickness[direction] },
5223         { junior_rc_60_deg_up_bound_offsets[direction], height });
5224 
5225     switch (direction)
5226     {
5227         case 0:
5228             paint_util_push_tunnel_left(session, height - 8, TUNNEL_1);
5229             break;
5230         case 1:
5231             paint_util_push_tunnel_right(session, height + 56, TUNNEL_2);
5232             break;
5233         case 2:
5234             paint_util_push_tunnel_left(session, height + 56, TUNNEL_2);
5235             break;
5236         case 3:
5237             paint_util_push_tunnel_right(session, height - 8, TUNNEL_1);
5238             break;
5239     }
5240 
5241     static constexpr int8_t support[4] = { 35, 29, 25, 32 };
5242     if (track_paint_util_should_paint_supports(session->MapPosition))
5243     {
5244         metal_a_supports_paint_setup(
5245             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, support[direction], height,
5246             session->TrackColours[SCHEME_SUPPORTS]);
5247     }
5248 
5249     paint_util_set_segment_support_height(
5250         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0);
5251     paint_util_set_general_support_height(session, height + 104, 0x20);
5252 }
5253 
junior_rc_60_deg_up_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5254 static void junior_rc_60_deg_up_paint_setup(
5255     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5256     const TrackElement& trackElement)
5257 {
5258     bool isChained = trackElement.HasChain();
5259     junior_rc_paint_track_60_deg_up(
5260         session, ride, trackSequence, direction, height, trackElement,
5261         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
5262 }
5263 
junior_rc_60_deg_down_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5264 static void junior_rc_60_deg_down_paint_setup(
5265     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5266     const TrackElement& trackElement)
5267 {
5268     junior_rc_60_deg_up_paint_setup(session, ride, trackSequence, (direction + 2) % 4, height, trackElement);
5269 }
5270 
5271 static constexpr const CoordsXY junior_rc_25_deg_up_to_60_deg_up_bound_lengths[4][2] = {
5272     { { 32, 20 }, { 0, 0 } },
5273     { { 10, 32 }, { 2, 32 } },
5274     { { 32, 10 }, { 32, 2 } },
5275     { { 20, 32 }, { 0, 0 } },
5276 };
5277 
5278 static constexpr const int8_t junior_rc_25_deg_up_to_60_deg_up_bound_thickness[4] = {
5279     1,
5280     43,
5281     43,
5282     1,
5283 };
5284 
5285 static constexpr const CoordsXY junior_rc_25_deg_up_to_60_deg_up_bound_offsets[4][2] = {
5286     { { 0, 6 }, { 0, 0 } },
5287     { { 10, 0 }, { 4, 0 } },
5288     { { 0, 10 }, { 0, 4 } },
5289     { { 6, 0 }, { 0, 0 } },
5290 };
5291 
junior_rc_paint_track_25_deg_up_to_60_deg_up(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)5292 void junior_rc_paint_track_25_deg_up_to_60_deg_up(
5293     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
5294     const TrackElement& trackElement, JuniorRcChainType chainType)
5295 {
5296     uint32_t image_id = session->TrackColours[SCHEME_TRACK];
5297 
5298     image_id |= junior_rc_track_pieces_25_deg_up_to_60_deg_up[EnumValue(chainType)][direction][0];
5299 
5300     PaintAddImageAsParent(
5301         session, image_id, { junior_rc_60_deg_up_tile_offsets[direction], height },
5302         { junior_rc_25_deg_up_to_60_deg_up_bound_lengths[direction][0],
5303           junior_rc_25_deg_up_to_60_deg_up_bound_thickness[direction] },
5304         { junior_rc_25_deg_up_to_60_deg_up_bound_offsets[direction][0], height });
5305 
5306     if (junior_rc_track_pieces_25_deg_up_to_60_deg_up[EnumValue(chainType)][direction][1] != 0)
5307     {
5308         image_id = session->TrackColours[SCHEME_TRACK];
5309 
5310         image_id |= junior_rc_track_pieces_25_deg_up_to_60_deg_up[EnumValue(chainType)][direction][1];
5311 
5312         PaintAddImageAsParent(
5313             session, image_id, { junior_rc_60_deg_up_tile_offsets[direction], height },
5314             { junior_rc_25_deg_up_to_60_deg_up_bound_lengths[direction][1],
5315               junior_rc_25_deg_up_to_60_deg_up_bound_thickness[direction] },
5316             { junior_rc_25_deg_up_to_60_deg_up_bound_offsets[direction][1], height });
5317     }
5318 
5319     switch (direction)
5320     {
5321         case 0:
5322             paint_util_push_tunnel_left(session, height - 8, TUNNEL_1);
5323             break;
5324         case 1:
5325             paint_util_push_tunnel_right(session, height + 24, TUNNEL_2);
5326             break;
5327         case 2:
5328             paint_util_push_tunnel_left(session, height + 24, TUNNEL_2);
5329             break;
5330         case 3:
5331             paint_util_push_tunnel_right(session, height - 8, TUNNEL_1);
5332             break;
5333     }
5334 
5335     static constexpr int8_t support[4] = { 12, 12, 12, 14 };
5336     if (track_paint_util_should_paint_supports(session->MapPosition))
5337     {
5338         metal_a_supports_paint_setup(
5339             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, support[direction], height,
5340             session->TrackColours[SCHEME_SUPPORTS]);
5341     }
5342 
5343     paint_util_set_segment_support_height(
5344         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0);
5345     paint_util_set_general_support_height(session, height + 72, 0x20);
5346 }
5347 
junior_rc_25_deg_up_to_60_deg_up_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5348 static void junior_rc_25_deg_up_to_60_deg_up_paint_setup(
5349     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5350     const TrackElement& trackElement)
5351 {
5352     bool isChained = trackElement.HasChain();
5353     junior_rc_paint_track_25_deg_up_to_60_deg_up(
5354         session, ride, trackSequence, direction, height, trackElement,
5355         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
5356 }
5357 
junior_rc_60_deg_down_to_25_deg_down_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5358 static void junior_rc_60_deg_down_to_25_deg_down_paint_setup(
5359     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5360     const TrackElement& trackElement)
5361 {
5362     junior_rc_25_deg_up_to_60_deg_up_paint_setup(session, ride, trackSequence, (direction + 2) % 4, height, trackElement);
5363 }
5364 
junior_rc_paint_track_60_deg_up_to_25_deg_up(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)5365 void junior_rc_paint_track_60_deg_up_to_25_deg_up(
5366     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
5367     const TrackElement& trackElement, JuniorRcChainType chainType)
5368 {
5369     uint32_t image_id = session->TrackColours[SCHEME_TRACK];
5370 
5371     image_id |= junior_rc_track_pieces_60_deg_up_to_25_deg_up[EnumValue(chainType)][direction][0];
5372 
5373     PaintAddImageAsParent(
5374         session, image_id, { junior_rc_60_deg_up_tile_offsets[direction], height },
5375         { junior_rc_25_deg_up_to_60_deg_up_bound_lengths[direction][0],
5376           junior_rc_25_deg_up_to_60_deg_up_bound_thickness[direction] },
5377         { junior_rc_25_deg_up_to_60_deg_up_bound_offsets[direction][0], height });
5378 
5379     if (junior_rc_track_pieces_60_deg_up_to_25_deg_up[EnumValue(chainType)][direction][1] != 0)
5380     {
5381         image_id = session->TrackColours[SCHEME_TRACK];
5382 
5383         image_id |= junior_rc_track_pieces_60_deg_up_to_25_deg_up[EnumValue(chainType)][direction][1];
5384 
5385         PaintAddImageAsParent(
5386             session, image_id, { junior_rc_60_deg_up_tile_offsets[direction], height },
5387             { junior_rc_25_deg_up_to_60_deg_up_bound_lengths[direction][1],
5388               junior_rc_25_deg_up_to_60_deg_up_bound_thickness[direction] },
5389             { junior_rc_25_deg_up_to_60_deg_up_bound_offsets[direction][1], height });
5390     }
5391 
5392     switch (direction)
5393     {
5394         case 0:
5395             paint_util_push_tunnel_left(session, height - 8, TUNNEL_1);
5396             break;
5397         case 1:
5398             paint_util_push_tunnel_right(session, height + 24, TUNNEL_2);
5399             break;
5400         case 2:
5401             paint_util_push_tunnel_left(session, height + 24, TUNNEL_2);
5402             break;
5403         case 3:
5404             paint_util_push_tunnel_right(session, height - 8, TUNNEL_1);
5405             break;
5406     }
5407 
5408     if (track_paint_util_should_paint_supports(session->MapPosition))
5409     {
5410         metal_a_supports_paint_setup(
5411             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 20, height,
5412             session->TrackColours[SCHEME_SUPPORTS]);
5413     }
5414 
5415     paint_util_set_segment_support_height(
5416         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0);
5417     paint_util_set_general_support_height(session, height + 72, 0x20);
5418 }
5419 
junior_rc_60_deg_up_to_25_deg_up_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5420 static void junior_rc_60_deg_up_to_25_deg_up_paint_setup(
5421     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5422     const TrackElement& trackElement)
5423 {
5424     bool isChained = trackElement.HasChain();
5425     junior_rc_paint_track_60_deg_up_to_25_deg_up(
5426         session, ride, trackSequence, direction, height, trackElement,
5427         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
5428 }
5429 
junior_rc_25_deg_down_to_60_deg_down_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5430 static void junior_rc_25_deg_down_to_60_deg_down_paint_setup(
5431     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5432     const TrackElement& trackElement)
5433 {
5434     junior_rc_60_deg_up_to_25_deg_up_paint_setup(session, ride, trackSequence, (direction + 2) % 4, height, trackElement);
5435 }
5436 
junior_rc_paint_track_diag_60_deg_up(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)5437 void junior_rc_paint_track_diag_60_deg_up(
5438     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
5439     const TrackElement& trackElement, JuniorRcChainType chainType)
5440 {
5441     track_paint_util_diag_tiles_paint(
5442         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
5443         junior_rc_track_pieces_diag_60_deg_up[EnumValue(chainType)], defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr);
5444 
5445     if (trackSequence == 3)
5446     {
5447         metal_b_supports_paint_setup(
5448             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
5449             36, height, session->TrackColours[SCHEME_SUPPORTS]);
5450     }
5451 
5452     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
5453     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
5454     paint_util_set_general_support_height(session, height + 104, 0x20);
5455 }
5456 
junior_rc_paint_track_diag_60_deg_down(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)5457 void junior_rc_paint_track_diag_60_deg_down(
5458     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
5459     const TrackElement& trackElement, JuniorRcChainType chainType)
5460 {
5461     track_paint_util_diag_tiles_paint(
5462         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
5463         junior_rc_track_pieces_diag_60_deg_down[EnumValue(chainType)], defaultDiagTileOffsets, defaultDiagBoundLengths,
5464         nullptr);
5465 
5466     if (trackSequence == 3)
5467     {
5468         metal_b_supports_paint_setup(
5469             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
5470             28, height, session->TrackColours[SCHEME_SUPPORTS]);
5471     }
5472 
5473     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
5474     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
5475     paint_util_set_general_support_height(session, height + 104, 0x20);
5476 }
5477 
junior_rc_paint_track_diag_25_deg_up_to_60_deg_up(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)5478 void junior_rc_paint_track_diag_25_deg_up_to_60_deg_up(
5479     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
5480     const TrackElement& trackElement, JuniorRcChainType chainType)
5481 {
5482     track_paint_util_diag_tiles_paint(
5483         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
5484         junior_rc_track_pieces_diag_25_deg_up_to_60_deg_up[EnumValue(chainType)], defaultDiagTileOffsets,
5485         defaultDiagBoundLengths, nullptr);
5486 
5487     if (trackSequence == 3)
5488     {
5489         metal_b_supports_paint_setup(
5490             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
5491             16, height, session->TrackColours[SCHEME_SUPPORTS]);
5492     }
5493 
5494     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
5495     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
5496     paint_util_set_general_support_height(session, height + 72, 0x20);
5497 }
5498 
junior_rc_paint_track_diag_60_deg_up_to_25_deg_up(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)5499 void junior_rc_paint_track_diag_60_deg_up_to_25_deg_up(
5500     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
5501     const TrackElement& trackElement, JuniorRcChainType chainType)
5502 {
5503     if (direction == 1 && trackSequence == 3)
5504     {
5505         PaintAddImageAsParent(
5506             session,
5507             junior_rc_track_pieces_diag_60_deg_up_to_25_deg_up[EnumValue(chainType)][direction]
5508                 | session->TrackColours[SCHEME_TRACK],
5509             { -16, -16, height }, { 16, 16, 1 }, { 0, 0, height });
5510     }
5511     else
5512     {
5513         track_paint_util_diag_tiles_paint(
5514             session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
5515             junior_rc_track_pieces_diag_60_deg_up_to_25_deg_up[EnumValue(chainType)], defaultDiagTileOffsets,
5516             defaultDiagBoundLengths, nullptr);
5517     }
5518 
5519     if (trackSequence == 3)
5520     {
5521         metal_b_supports_paint_setup(
5522             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
5523             21, height, session->TrackColours[SCHEME_SUPPORTS]);
5524     }
5525 
5526     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
5527     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
5528     paint_util_set_general_support_height(session, height + 72, 0x20);
5529 }
5530 
junior_rc_paint_track_diag_25_deg_down_to_60_deg_down(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)5531 void junior_rc_paint_track_diag_25_deg_down_to_60_deg_down(
5532     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
5533     const TrackElement& trackElement, JuniorRcChainType chainType)
5534 {
5535     if (direction == 3 && trackSequence == 0)
5536     {
5537         PaintAddImageAsParent(
5538             session,
5539             junior_rc_track_pieces_diag_25_deg_down_to_60_deg_down[EnumValue(chainType)][direction]
5540                 | session->TrackColours[SCHEME_TRACK],
5541             { -16, -16, height }, { 16, 16, 1 }, { 0, 0, height });
5542     }
5543     else
5544     {
5545         track_paint_util_diag_tiles_paint(
5546             session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
5547             junior_rc_track_pieces_diag_25_deg_down_to_60_deg_down[EnumValue(chainType)], defaultDiagTileOffsets,
5548             defaultDiagBoundLengths, nullptr);
5549     }
5550 
5551     if (trackSequence == 3)
5552     {
5553         metal_b_supports_paint_setup(
5554             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
5555             17, height, session->TrackColours[SCHEME_SUPPORTS]);
5556     }
5557 
5558     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
5559     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
5560     paint_util_set_general_support_height(session, height + 72, 0x20);
5561 }
5562 
junior_rc_paint_track_diag_60_deg_down_to_25_deg_down(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,uint16_t height,const TrackElement & trackElement,JuniorRcChainType chainType)5563 void junior_rc_paint_track_diag_60_deg_down_to_25_deg_down(
5564     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, uint16_t height,
5565     const TrackElement& trackElement, JuniorRcChainType chainType)
5566 {
5567     track_paint_util_diag_tiles_paint(
5568         session, 1, height, direction, trackSequence, session->TrackColours[SCHEME_TRACK],
5569         junior_rc_track_pieces_diag_60_deg_down_to_25_deg_down[EnumValue(chainType)], defaultDiagTileOffsets,
5570         defaultDiagBoundLengths, nullptr);
5571 
5572     if (trackSequence == 3)
5573     {
5574         metal_b_supports_paint_setup(
5575             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, junior_rc_diag_support_segment[direction],
5576             8, height, session->TrackColours[SCHEME_SUPPORTS]);
5577     }
5578 
5579     int32_t blockedSegments = junior_rc_diag_blocked_segments[trackSequence];
5580     paint_util_set_segment_support_height(session, paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0);
5581     paint_util_set_general_support_height(session, height + 72, 0x20);
5582 }
5583 
junior_rc_diag_60_deg_up_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5584 static void junior_rc_diag_60_deg_up_paint_setup(
5585     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5586     const TrackElement& trackElement)
5587 {
5588     bool isChained = trackElement.HasChain();
5589     junior_rc_paint_track_diag_60_deg_up(
5590         session, ride, trackSequence, direction, height, trackElement,
5591         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
5592 }
5593 
junior_rc_diag_60_deg_down_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5594 static void junior_rc_diag_60_deg_down_paint_setup(
5595     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5596     const TrackElement& trackElement)
5597 {
5598     bool isChained = trackElement.HasChain();
5599     junior_rc_paint_track_diag_60_deg_down(
5600         session, ride, trackSequence, direction, height, trackElement,
5601         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
5602 }
5603 
junior_rc_diag_25_deg_up_to_60_deg_up_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5604 static void junior_rc_diag_25_deg_up_to_60_deg_up_paint_setup(
5605     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5606     const TrackElement& trackElement)
5607 {
5608     bool isChained = trackElement.HasChain();
5609     junior_rc_paint_track_diag_25_deg_up_to_60_deg_up(
5610         session, ride, trackSequence, direction, height, trackElement,
5611         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
5612 }
5613 
junior_rc_diag_60_deg_up_to_25_deg_up_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5614 static void junior_rc_diag_60_deg_up_to_25_deg_up_paint_setup(
5615     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5616     const TrackElement& trackElement)
5617 {
5618     bool isChained = trackElement.HasChain();
5619     junior_rc_paint_track_diag_60_deg_up_to_25_deg_up(
5620         session, ride, trackSequence, direction, height, trackElement,
5621         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
5622 }
5623 
junior_rc_diag_25_deg_down_to_60_deg_down_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5624 static void junior_rc_diag_25_deg_down_to_60_deg_down_paint_setup(
5625     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5626     const TrackElement& trackElement)
5627 {
5628     bool isChained = trackElement.HasChain();
5629     junior_rc_paint_track_diag_25_deg_down_to_60_deg_down(
5630         session, ride, trackSequence, direction, height, trackElement,
5631         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
5632 }
5633 
junior_rc_diag_60_deg_down_to_25_deg_down_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5634 static void junior_rc_diag_60_deg_down_to_25_deg_down_paint_setup(
5635     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5636     const TrackElement& trackElement)
5637 {
5638     bool isChained = trackElement.HasChain();
5639     junior_rc_paint_track_diag_60_deg_down_to_25_deg_down(
5640         session, ride, trackSequence, direction, height, trackElement,
5641         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
5642 }
5643 
5644 static constexpr const CoordsXY junior_rc_flat_to_60_deg_up_bound_lengths[4][2] = {
5645     { { 32, 24 }, { 0, 0 } },
5646     { { 10, 1 }, { 2, 32 } },
5647     { { 1, 10 }, { 32, 2 } },
5648     { { 24, 32 }, { 0, 0 } },
5649 };
5650 
5651 static constexpr const int8_t junior_rc_flat_to_60_deg_up_bound_thickness[4] = {
5652     1,
5653     43,
5654     43,
5655     1,
5656 };
5657 
5658 static constexpr const CoordsXY junior_rc_flat_to_60_deg_up_bound_offsets[4][2] = {
5659     { { 0, 4 }, { 0, 0 } },
5660     { { 10, 0 }, { 4, 0 } },
5661     { { 0, 10 }, { 0, 4 } },
5662     { { 4, 0 }, { 0, 0 } },
5663 };
5664 
5665 static constexpr const CoordsXY junior_rc_flat_to_60_deg_up_tile_offsets[4][2] = {
5666     { { 12, -10 }, { 0, 0 } },
5667     { { 22, 9 }, { 12, -11 } },
5668     { { 30, 7 }, { 5, 0 } },
5669     { { 12, -12 }, { 0, 0 } },
5670 };
5671 
5672 static constexpr const CoordsXY junior_rc_60_deg_up_to_flat_tile_offsets[4][2] = {
5673     { { 13, -9 }, { 0, 0 } },
5674     { { 32, 9 }, { -7, -11 } },
5675     { { 22, 18 }, { 2, -19 } },
5676     { { 13, -9 }, { 0, 0 } },
5677 };
5678 
junior_rc_flat_to_60_deg_up_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5679 static void junior_rc_flat_to_60_deg_up_paint_setup(
5680     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5681     const TrackElement& trackElement)
5682 {
5683     uint32_t image_id = session->TrackColours[SCHEME_TRACK];
5684 
5685     bool isChained = trackElement.HasChain();
5686 
5687     image_id |= junior_rc_track_pieces_flat_to_60_deg_up[isChained][direction][0];
5688 
5689     PaintAddImageAsParent(
5690         session, image_id, { junior_rc_flat_to_60_deg_up_tile_offsets[direction][0], height + 24 },
5691         { junior_rc_flat_to_60_deg_up_bound_lengths[direction][0], junior_rc_flat_to_60_deg_up_bound_thickness[direction] },
5692         { junior_rc_flat_to_60_deg_up_bound_offsets[direction][0], height });
5693 
5694     if (junior_rc_track_pieces_flat_to_60_deg_up[isChained][direction][1] != 0)
5695     {
5696         image_id = session->TrackColours[SCHEME_TRACK];
5697 
5698         image_id |= junior_rc_track_pieces_flat_to_60_deg_up[isChained][direction][1];
5699 
5700         PaintAddImageAsParent(
5701             session, image_id, { junior_rc_flat_to_60_deg_up_tile_offsets[direction][1], height },
5702             { junior_rc_flat_to_60_deg_up_bound_lengths[direction][1], junior_rc_flat_to_60_deg_up_bound_thickness[direction] },
5703             { junior_rc_flat_to_60_deg_up_bound_offsets[direction][1], height });
5704     }
5705 
5706     switch (direction)
5707     {
5708         case 0:
5709             paint_util_push_tunnel_left(session, height, TUNNEL_1);
5710             break;
5711         case 1:
5712             paint_util_push_tunnel_right(session, height + 24, TUNNEL_2);
5713             break;
5714         case 2:
5715             paint_util_push_tunnel_left(session, height + 24, TUNNEL_2);
5716             break;
5717         case 3:
5718             paint_util_push_tunnel_right(session, height, TUNNEL_1);
5719             break;
5720     }
5721 
5722     static constexpr int8_t support[4] = { 12, 12, 12, 14 };
5723     if (track_paint_util_should_paint_supports(session->MapPosition))
5724     {
5725         metal_a_supports_paint_setup(
5726             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, support[direction], height - 7,
5727             session->TrackColours[SCHEME_SUPPORTS]);
5728     }
5729 
5730     paint_util_set_segment_support_height(
5731         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0);
5732     paint_util_set_general_support_height(session, height + 72, 0x20);
5733 }
5734 
junior_rc_60_deg_down_to_flat_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5735 static void junior_rc_60_deg_down_to_flat_paint_setup(
5736     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5737     const TrackElement& trackElement)
5738 {
5739     junior_rc_flat_to_60_deg_up_paint_setup(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
5740 }
5741 
junior_rc_60_deg_up_to_flat_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5742 static void junior_rc_60_deg_up_to_flat_paint_setup(
5743     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5744     const TrackElement& trackElement)
5745 {
5746     uint32_t image_id = session->TrackColours[SCHEME_TRACK];
5747 
5748     bool isChained = trackElement.HasChain();
5749 
5750     image_id |= junior_rc_track_pieces_60_deg_up_to_flat[isChained][direction][0];
5751 
5752     PaintAddImageAsParent(
5753         session, image_id, { junior_rc_60_deg_up_to_flat_tile_offsets[direction][0], height + 24 },
5754         { junior_rc_flat_to_60_deg_up_bound_lengths[direction][0], junior_rc_flat_to_60_deg_up_bound_thickness[direction] },
5755         { junior_rc_flat_to_60_deg_up_bound_offsets[direction][0], height });
5756 
5757     if (junior_rc_track_pieces_60_deg_up_to_flat[isChained][direction][1] != 0)
5758     {
5759         image_id = session->TrackColours[SCHEME_TRACK];
5760 
5761         image_id |= junior_rc_track_pieces_60_deg_up_to_flat[isChained][direction][1];
5762 
5763         PaintAddImageAsParent(
5764             session, image_id, { junior_rc_60_deg_up_to_flat_tile_offsets[direction][1], height },
5765             { junior_rc_flat_to_60_deg_up_bound_lengths[direction][1], junior_rc_flat_to_60_deg_up_bound_thickness[direction] },
5766             { junior_rc_flat_to_60_deg_up_bound_offsets[direction][1], height });
5767     }
5768 
5769     switch (direction)
5770     {
5771         case 0:
5772             paint_util_push_tunnel_left(session, height, TUNNEL_1);
5773             break;
5774         case 1:
5775             paint_util_push_tunnel_right(session, height + 24, TUNNEL_2);
5776             break;
5777         case 2:
5778             paint_util_push_tunnel_left(session, height + 24, TUNNEL_2);
5779             break;
5780         case 3:
5781             paint_util_push_tunnel_right(session, height, TUNNEL_1);
5782             break;
5783     }
5784 
5785     if (track_paint_util_should_paint_supports(session->MapPosition))
5786     {
5787         metal_a_supports_paint_setup(
5788             session, (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK, 4, 20, height - 5,
5789             session->TrackColours[SCHEME_SUPPORTS]);
5790     }
5791 
5792     paint_util_set_segment_support_height(
5793         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0);
5794     paint_util_set_general_support_height(session, height + 72, 0x20);
5795 }
5796 
junior_rc_flat_to_60_deg_down_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5797 static void junior_rc_flat_to_60_deg_down_paint_setup(
5798     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5799     const TrackElement& trackElement)
5800 {
5801     junior_rc_60_deg_up_to_flat_paint_setup(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
5802 }
5803 
5804 /* rct2: 0x00518394 */
junior_rc_flat_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5805 static void junior_rc_flat_paint_setup(
5806     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5807     const TrackElement& trackElement)
5808 {
5809     bool isChained = trackElement.HasChain();
5810     junior_rc_paint_track_flat(
5811         session, ride, trackSequence, direction, height, trackElement,
5812         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
5813 }
5814 
5815 /* rct2: 0x00515629, 0x00514D22, 0x005151B9 */
paint_junior_rc_station_track(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5816 static void paint_junior_rc_station_track(
5817     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5818     const TrackElement& trackElement)
5819 {
5820     junior_rc_paint_station(session, ride, trackSequence, direction, height, trackElement, RIDE_TYPE_JUNIOR_ROLLER_COASTER);
5821 }
5822 
5823 /* rct2: 0x0051881E */
junior_rc_25_deg_up_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5824 static void junior_rc_25_deg_up_paint_setup(
5825     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5826     const TrackElement& trackElement)
5827 {
5828     bool isChained = trackElement.HasChain();
5829     junior_rc_paint_track_25_deg_up(
5830         session, ride, trackSequence, direction, height, trackElement,
5831         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
5832 }
5833 
5834 /* rct2: 0x00518B42 */
junior_rc_flat_to_25_deg_up_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5835 static void junior_rc_flat_to_25_deg_up_paint_setup(
5836     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5837     const TrackElement& trackElement)
5838 {
5839     bool isChained = trackElement.HasChain();
5840     junior_rc_paint_track_flat_to_25_deg_up(
5841         session, ride, trackSequence, direction, height, trackElement,
5842         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
5843 }
5844 
5845 /* rct2: 0x00518E56 */
junior_rc_25_deg_up_to_flat_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5846 static void junior_rc_25_deg_up_to_flat_paint_setup(
5847     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5848     const TrackElement& trackElement)
5849 {
5850     bool isChained = trackElement.HasChain();
5851     junior_rc_paint_track_25_deg_up_to_flat(
5852         session, ride, trackSequence, direction, height, trackElement,
5853         isChained ? JuniorRcChainType::FrictionWheels : JuniorRcChainType::None);
5854 }
5855 
5856 /* rct2: 0x005189B0 */
junior_rc_25_deg_down_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5857 static void junior_rc_25_deg_down_paint_setup(
5858     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5859     const TrackElement& trackElement)
5860 {
5861     junior_rc_25_deg_up_paint_setup(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
5862 }
5863 
5864 /* rct2: 0x00518FE8 */
junior_rc_flat_to_25_deg_down_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5865 static void junior_rc_flat_to_25_deg_down_paint_setup(
5866     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5867     const TrackElement& trackElement)
5868 {
5869     junior_rc_25_deg_up_to_flat_paint_setup(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
5870 }
5871 
5872 /* rct2: 0x00518CCC */
junior_rc_25_deg_down_to_flat_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5873 static void junior_rc_25_deg_down_to_flat_paint_setup(
5874     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5875     const TrackElement& trackElement)
5876 {
5877     junior_rc_flat_to_25_deg_up_paint_setup(session, ride, trackSequence, (direction + 2) & 3, height, trackElement);
5878 }
5879 
junior_rc_booster_paint_setup(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5880 static void junior_rc_booster_paint_setup(
5881     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5882     const TrackElement& trackElement)
5883 {
5884     if (direction & 1)
5885     {
5886         PaintAddImageAsParent(
5887             session, SPR_JUNIOR_RC_BOOSTER_NE_SW | session->TrackColours[SCHEME_TRACK], { 0, 0, height }, { 20, 32, 1 });
5888 
5889         paint_util_push_tunnel_right(session, height, TUNNEL_0);
5890     }
5891     else
5892     {
5893         PaintAddImageAsParent(
5894             session, SPR_JUNIOR_RC_BOOSTER_NW_SE | session->TrackColours[SCHEME_TRACK], { 0, 0, height }, { 32, 20, 1 });
5895 
5896         paint_util_push_tunnel_left(session, height, TUNNEL_0);
5897     }
5898 
5899     if (track_paint_util_should_paint_supports(session->MapPosition))
5900     {
5901         uint8_t supportType = (direction & 1) ? METAL_SUPPORTS_FORK_ALT : METAL_SUPPORTS_FORK;
5902         metal_a_supports_paint_setup(session, supportType, 4, 0, height, session->TrackColours[SCHEME_SUPPORTS]);
5903     }
5904 
5905     paint_util_set_segment_support_height(
5906         session, paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0);
5907     paint_util_set_general_support_height(session, height + 32, 0x20);
5908 }
5909 
junior_rc_track_on_ride_photo(paint_session * session,const Ride * ride,uint8_t trackSequence,uint8_t direction,int32_t height,const TrackElement & trackElement)5910 static void junior_rc_track_on_ride_photo(
5911     paint_session* session, const Ride* ride, uint8_t trackSequence, uint8_t direction, int32_t height,
5912     const TrackElement& trackElement)
5913 {
5914     uint32_t imageId = junior_rc_track_pieces_flat[0][direction] | session->TrackColours[SCHEME_TRACK];
5915     constexpr const int8_t photoCameraOffset = -1;
5916 
5917     switch (direction)
5918     {
5919         case 0:
5920             PaintAddImageAsParentRotated(
5921                 session, direction, IMAGE_TYPE_REMAP | SPR_STATION_BASE_D, 0, 0, 32, 32, 1, height + photoCameraOffset);
5922             metal_a_supports_paint_setup(
5923                 session, METAL_SUPPORTS_FORK, 5, 6, height + photoCameraOffset, session->TrackColours[SCHEME_SUPPORTS]);
5924             metal_a_supports_paint_setup(
5925                 session, METAL_SUPPORTS_FORK, 8, 6, height + photoCameraOffset, session->TrackColours[SCHEME_SUPPORTS]);
5926             PaintAddImageAsParentRotated(session, direction, imageId, 0, 6, 32, 20, 1, height, 0, 6, height + 3);
5927             break;
5928         case 1:
5929             PaintAddImageAsParentRotated(
5930                 session, direction, IMAGE_TYPE_REMAP | SPR_STATION_BASE_D, 0, 0, 32, 32, 1, height + photoCameraOffset);
5931             metal_a_supports_paint_setup(
5932                 session, METAL_SUPPORTS_FORK_ALT, 6, 6, height + photoCameraOffset, session->TrackColours[SCHEME_SUPPORTS]);
5933             metal_a_supports_paint_setup(
5934                 session, METAL_SUPPORTS_FORK_ALT, 7, 6, height + photoCameraOffset, session->TrackColours[SCHEME_SUPPORTS]);
5935             PaintAddImageAsParentRotated(session, direction, imageId, 0, 6, 32, 20, 1, height, 0, 6, height + 3);
5936             break;
5937         case 2:
5938             PaintAddImageAsParentRotated(
5939                 session, direction, IMAGE_TYPE_REMAP | SPR_STATION_BASE_D, 0, 0, 32, 32, 1, height + photoCameraOffset);
5940             metal_a_supports_paint_setup(
5941                 session, METAL_SUPPORTS_FORK, 5, 6, height + photoCameraOffset, session->TrackColours[SCHEME_SUPPORTS]);
5942             metal_a_supports_paint_setup(
5943                 session, METAL_SUPPORTS_FORK, 8, 6, height + photoCameraOffset, session->TrackColours[SCHEME_SUPPORTS]);
5944             PaintAddImageAsParentRotated(session, direction, imageId, 0, 6, 32, 20, 1, height, 0, 6, height + 3);
5945             break;
5946         case 3:
5947             PaintAddImageAsParentRotated(
5948                 session, direction, IMAGE_TYPE_REMAP | SPR_STATION_BASE_D, 0, 0, 32, 32, 1, height + photoCameraOffset);
5949             metal_a_supports_paint_setup(
5950                 session, METAL_SUPPORTS_FORK_ALT, 6, 6, height + photoCameraOffset, session->TrackColours[SCHEME_SUPPORTS]);
5951             metal_a_supports_paint_setup(
5952                 session, METAL_SUPPORTS_FORK_ALT, 7, 6, height + photoCameraOffset, session->TrackColours[SCHEME_SUPPORTS]);
5953             PaintAddImageAsParentRotated(session, direction, imageId, 0, 6, 32, 20, 1, height, 0, 6, height + 3);
5954             break;
5955     }
5956     track_paint_util_onride_photo_paint(session, direction, height + 3 + photoCameraOffset, trackElement);
5957     paint_util_push_tunnel_rotated(session, direction, height, TUNNEL_SQUARE_FLAT);
5958     paint_util_set_segment_support_height(session, SEGMENTS_ALL, 0xFFFF, 0);
5959     paint_util_set_general_support_height(session, height + 48 + photoCameraOffset, 0x20);
5960 }
5961 
5962 /* 0x008AAA0C */
get_track_paint_function_junior_rc(int32_t trackType)5963 TRACK_PAINT_FUNCTION get_track_paint_function_junior_rc(int32_t trackType)
5964 {
5965     switch (trackType)
5966     {
5967         case TrackElemType::Flat:
5968             return junior_rc_flat_paint_setup;
5969         case TrackElemType::EndStation:
5970             return paint_junior_rc_station_track;
5971         case TrackElemType::BeginStation:
5972             return paint_junior_rc_station_track;
5973         case TrackElemType::MiddleStation:
5974             return paint_junior_rc_station_track;
5975         case TrackElemType::Up25:
5976             return junior_rc_25_deg_up_paint_setup;
5977         case TrackElemType::Up60:
5978             return junior_rc_60_deg_up_paint_setup;
5979         case TrackElemType::FlatToUp25:
5980             return junior_rc_flat_to_25_deg_up_paint_setup;
5981         case TrackElemType::Up25ToUp60:
5982             return junior_rc_25_deg_up_to_60_deg_up_paint_setup;
5983         case TrackElemType::Up60ToUp25:
5984             return junior_rc_60_deg_up_to_25_deg_up_paint_setup;
5985         case TrackElemType::Up25ToFlat:
5986             return junior_rc_25_deg_up_to_flat_paint_setup;
5987         case TrackElemType::Down25:
5988             return junior_rc_25_deg_down_paint_setup;
5989         case TrackElemType::Down60:
5990             return junior_rc_60_deg_down_paint_setup;
5991         case TrackElemType::FlatToDown25:
5992             return junior_rc_flat_to_25_deg_down_paint_setup;
5993         case TrackElemType::Down25ToDown60:
5994             return junior_rc_25_deg_down_to_60_deg_down_paint_setup;
5995         case TrackElemType::Down60ToDown25:
5996             return junior_rc_60_deg_down_to_25_deg_down_paint_setup;
5997         case TrackElemType::Down25ToFlat:
5998             return junior_rc_25_deg_down_to_flat_paint_setup;
5999         case TrackElemType::LeftQuarterTurn5Tiles:
6000             return junior_rc_left_quarter_turn_5_tiles_paint_setup;
6001         case TrackElemType::RightQuarterTurn5Tiles:
6002             return junior_rc_right_quarter_turn_5_tiles_paint_setup;
6003         case TrackElemType::FlatToLeftBank:
6004             return junior_rc_flat_to_left_bank_paint_setup;
6005         case TrackElemType::FlatToRightBank:
6006             return junior_rc_flat_to_right_bank_paint_setup;
6007         case TrackElemType::LeftBankToFlat:
6008             return junior_rc_left_bank_to_flat_paint_setup;
6009         case TrackElemType::RightBankToFlat:
6010             return junior_rc_right_bank_to_flat_paint_setup;
6011         case TrackElemType::BankedLeftQuarterTurn5Tiles:
6012             return junior_rc_banked_left_quarter_turn_5_tiles_paint_setup;
6013         case TrackElemType::BankedRightQuarterTurn5Tiles:
6014             return junior_rc_banked_right_quarter_turn_5_tiles_paint_setup;
6015         case TrackElemType::LeftBankToUp25:
6016             return junior_rc_left_bank_to_25_deg_up_paint_setup;
6017         case TrackElemType::RightBankToUp25:
6018             return junior_rc_right_bank_to_25_deg_up_paint_setup;
6019         case TrackElemType::Up25ToLeftBank:
6020             return junior_rc_25_deg_up_to_left_bank_paint_setup;
6021         case TrackElemType::Up25ToRightBank:
6022             return junior_rc_25_deg_up_to_right_bank_paint_setup;
6023         case TrackElemType::LeftBankToDown25:
6024             return junior_rc_left_bank_to_25_deg_down_paint_setup;
6025         case TrackElemType::RightBankToDown25:
6026             return junior_rc_right_bank_to_25_deg_down_paint_setup;
6027         case TrackElemType::Down25ToLeftBank:
6028             return junior_rc_25_deg_down_to_left_bank_paint_setup;
6029         case TrackElemType::Down25ToRightBank:
6030             return junior_rc_25_deg_down_to_right_bank_paint_setup;
6031         case TrackElemType::LeftBank:
6032             return junior_rc_left_bank_paint_setup;
6033         case TrackElemType::RightBank:
6034             return junior_rc_right_bank_paint_setup;
6035         case TrackElemType::LeftQuarterTurn5TilesUp25:
6036             return junior_rc_left_quarter_turn_5_tiles_25_deg_up_paint_setup;
6037         case TrackElemType::RightQuarterTurn5TilesUp25:
6038             return junior_rc_right_quarter_turn_5_tiles_25_deg_up_paint_setup;
6039         case TrackElemType::LeftQuarterTurn5TilesDown25:
6040             return junior_rc_left_quarter_turn_5_tiles_25_deg_down_paint_setup;
6041         case TrackElemType::RightQuarterTurn5TilesDown25:
6042             return junior_rc_right_quarter_turn_5_tiles_25_deg_down_paint_setup;
6043         case TrackElemType::SBendLeft:
6044             return junior_rc_s_bend_left_paint_setup;
6045         case TrackElemType::SBendRight:
6046             return junior_rc_s_bend_right_paint_setup;
6047 
6048         case TrackElemType::LeftQuarterTurn3Tiles:
6049             return junior_rc_left_quarter_turn_3_tiles_paint_setup;
6050         case TrackElemType::RightQuarterTurn3Tiles:
6051             return junior_rc_right_quarter_turn_3_tiles_paint_setup;
6052         case TrackElemType::LeftBankedQuarterTurn3Tiles:
6053             return junior_rc_left_quarter_turn_3_tiles_bank_paint_setup;
6054         case TrackElemType::RightBankedQuarterTurn3Tiles:
6055             return junior_rc_right_quarter_turn_3_tiles_bank_paint_setup;
6056         case TrackElemType::LeftQuarterTurn3TilesUp25:
6057             return junior_rc_left_quarter_turn_3_tiles_25_deg_up_paint_setup;
6058         case TrackElemType::RightQuarterTurn3TilesUp25:
6059             return junior_rc_right_quarter_turn_3_tiles_25_deg_up_paint_setup;
6060         case TrackElemType::LeftQuarterTurn3TilesDown25:
6061             return junior_rc_left_quarter_turn_3_tiles_25_deg_down_paint_setup;
6062         case TrackElemType::RightQuarterTurn3TilesDown25:
6063             return junior_rc_right_quarter_turn_3_tiles_25_deg_down_paint_setup;
6064 
6065         case TrackElemType::FlatToUp60:
6066             return junior_rc_flat_to_60_deg_up_paint_setup;
6067         case TrackElemType::Up60ToFlat:
6068             return junior_rc_60_deg_up_to_flat_paint_setup;
6069         case TrackElemType::FlatToDown60:
6070             return junior_rc_flat_to_60_deg_down_paint_setup;
6071         case TrackElemType::Down60ToFlat:
6072             return junior_rc_60_deg_down_to_flat_paint_setup;
6073 
6074         case TrackElemType::LeftHalfBankedHelixUpSmall:
6075             return junior_rc_left_half_banked_helix_up_small_paint_setup;
6076         case TrackElemType::RightHalfBankedHelixUpSmall:
6077             return junior_rc_right_half_banked_helix_up_small_paint_setup;
6078         case TrackElemType::LeftHalfBankedHelixDownSmall:
6079             return junior_rc_left_half_banked_helix_down_small_paint_setup;
6080         case TrackElemType::RightHalfBankedHelixDownSmall:
6081             return junior_rc_right_half_banked_helix_down_small_paint_setup;
6082         case TrackElemType::LeftHalfBankedHelixUpLarge:
6083             return junior_rc_left_half_banked_helix_up_large_paint_setup;
6084         case TrackElemType::RightHalfBankedHelixUpLarge:
6085             return junior_rc_right_half_banked_helix_up_large_paint_setup;
6086         case TrackElemType::LeftHalfBankedHelixDownLarge:
6087             return junior_rc_left_half_banked_helix_down_large_paint_setup;
6088         case TrackElemType::RightHalfBankedHelixDownLarge:
6089             return junior_rc_right_half_banked_helix_down_large_paint_setup;
6090 
6091         case TrackElemType::Brakes:
6092             return junior_rc_brake_paint_setup;
6093 
6094         case TrackElemType::LeftEighthToDiag:
6095             return junior_rc_left_eighth_to_diag_paint_setup;
6096         case TrackElemType::RightEighthToDiag:
6097             return junior_rc_right_eighth_to_diag_paint_setup;
6098         case TrackElemType::LeftEighthToOrthogonal:
6099             return junior_rc_left_eighth_to_orthogonal_paint_setup;
6100         case TrackElemType::RightEighthToOrthogonal:
6101             return junior_rc_right_eighth_to_orthogonal_paint_setup;
6102         case TrackElemType::LeftEighthBankToDiag:
6103             return junior_rc_left_eighth_to_diag_bank_paint_setup;
6104         case TrackElemType::RightEighthBankToDiag:
6105             return junior_rc_right_eighth_to_diag_bank_paint_setup;
6106         case TrackElemType::LeftEighthBankToOrthogonal:
6107             return junior_rc_left_eighth_to_orthogonal_bank_paint_setup;
6108         case TrackElemType::RightEighthBankToOrthogonal:
6109             return junior_rc_right_eighth_to_orthogonal_bank_paint_setup;
6110         case TrackElemType::DiagFlat:
6111             return junior_rc_diag_flat_paint_setup;
6112         case TrackElemType::DiagUp25:
6113             return junior_rc_diag_25_deg_up_paint_setup;
6114         case TrackElemType::DiagUp60:
6115             return junior_rc_diag_60_deg_up_paint_setup;
6116         case TrackElemType::DiagFlatToUp25:
6117             return junior_rc_diag_flat_to_25_deg_up_paint_setup;
6118         case TrackElemType::DiagUp25ToUp60:
6119             return junior_rc_diag_25_deg_up_to_60_deg_up_paint_setup;
6120         case TrackElemType::DiagUp60ToUp25:
6121             return junior_rc_diag_60_deg_up_to_25_deg_up_paint_setup;
6122         case TrackElemType::DiagUp25ToFlat:
6123             return junior_rc_diag_25_deg_up_to_flat_paint_setup;
6124         case TrackElemType::DiagDown25:
6125             return junior_rc_diag_25_deg_down_paint_setup;
6126         case TrackElemType::DiagDown60:
6127             return junior_rc_diag_60_deg_down_paint_setup;
6128         case TrackElemType::DiagFlatToDown25:
6129             return junior_rc_diag_flat_to_25_deg_down_paint_setup;
6130         case TrackElemType::DiagDown25ToDown60:
6131             return junior_rc_diag_25_deg_down_to_60_deg_down_paint_setup;
6132         case TrackElemType::DiagDown60ToDown25:
6133             return junior_rc_diag_60_deg_down_to_25_deg_down_paint_setup;
6134         case TrackElemType::DiagDown25ToFlat:
6135             return junior_rc_diag_25_deg_down_to_flat_paint_setup;
6136 
6137         case TrackElemType::DiagFlatToLeftBank:
6138             return junior_rc_diag_flat_to_left_bank_paint_setup;
6139         case TrackElemType::DiagFlatToRightBank:
6140             return junior_rc_diag_flat_to_right_bank_paint_setup;
6141         case TrackElemType::DiagLeftBankToFlat:
6142             return junior_rc_diag_left_bank_to_flat_paint_setup;
6143         case TrackElemType::DiagRightBankToFlat:
6144             return junior_rc_diag_right_bank_to_flat_paint_setup;
6145         case TrackElemType::DiagLeftBankToUp25:
6146             return junior_rc_diag_left_bank_to_25_deg_up_paint_setup;
6147         case TrackElemType::DiagRightBankToUp25:
6148             return junior_rc_diag_right_bank_to_25_deg_up_paint_setup;
6149         case TrackElemType::DiagUp25ToLeftBank:
6150             return junior_rc_diag_25_deg_up_to_left_bank_paint_setup;
6151         case TrackElemType::DiagUp25ToRightBank:
6152             return junior_rc_diag_25_deg_up_to_right_bank_paint_setup;
6153         case TrackElemType::DiagLeftBankToDown25:
6154             return junior_rc_diag_left_bank_to_25_deg_down_paint_setup;
6155         case TrackElemType::DiagRightBankToDown25:
6156             return junior_rc_diag_right_bank_to_25_deg_down_paint_setup;
6157         case TrackElemType::DiagDown25ToLeftBank:
6158             return junior_rc_diag_25_deg_down_to_left_bank_paint_setup;
6159         case TrackElemType::DiagDown25ToRightBank:
6160             return junior_rc_diag_25_deg_down_to_right_bank_paint_setup;
6161         case TrackElemType::DiagLeftBank:
6162             return junior_rc_diag_left_bank_paint_setup;
6163         case TrackElemType::DiagRightBank:
6164             return junior_rc_diag_right_bank_paint_setup;
6165 
6166         case TrackElemType::BlockBrakes:
6167             return junior_rc_block_brake_paint_setup;
6168 
6169         case TrackElemType::Booster:
6170             return junior_rc_booster_paint_setup;
6171 
6172         case TrackElemType::DiagDown60ToFlat:
6173             return junior_rc_diag_60_deg_down_to_flat_paint_setup;
6174         case TrackElemType::DiagUp60ToFlat:
6175             return junior_rc_diag_60_deg_up_to_flat_paint_setup;
6176         case TrackElemType::DiagFlatToUp60:
6177             return junior_rc_diag_flat_to_60_deg_up_paint_setup;
6178         case TrackElemType::DiagFlatToDown60:
6179             return junior_rc_diag_flat_to_60_deg_down_paint_setup;
6180 
6181         case TrackElemType::OnRidePhoto:
6182             return junior_rc_track_on_ride_photo;
6183     }
6184     return nullptr;
6185 }
6186