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