diff --git a/src/paint/supports.c b/src/paint/supports.c index 9abccdacbb..f1145ab2ea 100644 --- a/src/paint/supports.c +++ b/src/paint/supports.c @@ -492,7 +492,6 @@ bool metal_a_supports_paint_setup(int supportType, int segment, int special, int image_id += z - 1; image_id |= imageColourFlags; - sub_98197C(image_id, xOffset, yOffset, 0, 0, 0, height, boundBoxOffsetX, boundBoxOffsetY, boundBoxOffsetZ, rotation); height += z; diff --git a/src/ride/coaster/junior_roller_coaster.c b/src/ride/coaster/junior_roller_coaster.c index 846fd9695d..34a644559d 100644 --- a/src/ride/coaster/junior_roller_coaster.c +++ b/src/ride/coaster/junior_roller_coaster.c @@ -13,3 +13,4270 @@ * A full copy of the GNU General Public License can be found in licence.txt *****************************************************************************/ #pragma endregion + +#include "../../addresses.h" +#include "../../config.h" +#include "../../drawing/drawing.h" +#include "../../paint/supports.h" +#include "../../interface/viewport.h" +#include "../../paint/paint.h" +#include "../../interface/window.h" +#include "../../localisation/localisation.h" +#include "../../sprites.h" +#include "../../world/map.h" +#include "../../world/sprite.h" +#include "../ride_data.h" +#include "../track_data.h" +#include "../track_paint.h" +#include "../../paint/map_element/map_element.h" + +enum { + SPR_JUNIOR_RC_FLAT_SW_NE = 27807, + SPR_JUNIOR_RC_FLAT_NW_SE = 27808, + SPR_JUNIOR_RC_25_DEG_SW_NE = 27809, + SPR_JUNIOR_RC_60_DEG_SW_NE = 27810, + SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_SW_NE = 27811, + SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_SW_NE = 27812, + SPR_JUNIOR_RC_25_DEG_NE_SW = 27813, + SPR_JUNIOR_RC_60_DEG_NE_SW = 27814, + SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_NE_SW = 27815, + SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_NE_SW_PART_0_2 = 27816, + SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_NE_SW = 27817, + SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_NE_SW_PART_0_2 = 27818, + SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_SW_NE = 27819, + SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_SW_NE = 27820, + SPR_JUNIOR_RC_25_DEG_NW_SE = 27821, + SPR_JUNIOR_RC_60_DEG_NW_SE = 27822, + SPR_JUNIOR_RC_25_DEG_SE_NW = 27823, + SPR_JUNIOR_RC_60_DEG_SE_NW = 27824, + SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_NW_SE = 27825, + SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_NW_SE_PART_0_2 = 27826, + SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_SE_NW = 27827, + SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_SE_NW = 27828, + SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_SE_NW = 27829, + SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_SE_NW = 27830, + SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_NW_SE = 27831, + SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_NW_SE_PART_0_2 = 27832, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SW_SE_PART_0 = 27833, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SW_SE_PART_1 = 27834, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SW_SE_PART_2 = 27835, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SW_SE_PART_3 = 27836, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SW_SE_PART_4 = 27837, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NW_SW_PART_0 = 27838, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NW_SW_PART_1 = 27839, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NW_SW_PART_2 = 27840, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NW_SW_PART_3 = 27841, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NW_SW_PART_4 = 27842, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NE_NW_PART_0 = 27843, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NE_NW_PART_1 = 27844, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NE_NW_PART_2 = 27845, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NE_NW_PART_3 = 27846, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NE_NW_PART_4 = 27847, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SE_NE_PART_0 = 27848, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SE_NE_PART_1 = 27849, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SE_NE_PART_2 = 27850, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SE_NE_PART_3 = 27851, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SE_NE_PART_4 = 27852, + SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_NE_SW = 27853, + SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_NE_SW = 27854, + SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_NW_SE = 27855, + SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_NW_SE = 27856, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_0 = 27857, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_1 = 27858, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_2 = 27859, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_3 = 27860, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_4 = 27861, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_0 = 27862, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_1 = 27863, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_2 = 27864, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_3 = 27865, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_4 = 27866, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_0 = 27867, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_1 = 27868, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_2 = 27869, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_3 = 27870, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_4 = 27871, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_0 = 27872, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_1 = 27873, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_2 = 27874, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_3 = 27875, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_4 = 27876, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_0 = 27877, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_1 = 27878, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_2 = 27879, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_3 = 27880, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_4 = 27881, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_0 = 27882, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_1 = 27883, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_2 = 27884, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_3 = 27885, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_4 = 27886, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_0 = 27887, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_1 = 27888, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_2 = 27889, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_3 = 27890, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_4 = 27891, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_0 = 27892, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_1 = 27893, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_2 = 27894, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_3 = 27895, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_4 = 27896, + SPR_JUNIOR_RC_S_BEND_RIGHT_SW_NE_PART_0 = 27897, + SPR_JUNIOR_RC_S_BEND_RIGHT_SW_NE_PART_1 = 27898, + SPR_JUNIOR_RC_S_BEND_RIGHT_SW_NE_PART_2 = 27899, + SPR_JUNIOR_RC_S_BEND_RIGHT_SW_NE_PART_3 = 27900, + SPR_JUNIOR_RC_S_BEND_LEFT_SW_NE_PART_0 = 27901, + SPR_JUNIOR_RC_S_BEND_LEFT_SW_NE_PART_1 = 27902, + SPR_JUNIOR_RC_S_BEND_LEFT_SW_NE_PART_2 = 27903, + SPR_JUNIOR_RC_S_BEND_LEFT_SW_NE_PART_3 = 27904, + SPR_JUNIOR_RC_S_BEND_LEFT_SE_NW_PART_0 = 27905, + SPR_JUNIOR_RC_S_BEND_LEFT_SE_NW_PART_1 = 27906, + SPR_JUNIOR_RC_S_BEND_LEFT_SE_NW_PART_2 = 27907, + SPR_JUNIOR_RC_S_BEND_LEFT_SE_NW_PART_3 = 27908, + SPR_JUNIOR_RC_S_BEND_RIGHT_SE_NW_PART_0 = 27909, + SPR_JUNIOR_RC_S_BEND_RIGHT_SE_NW_PART_1 = 27910, + SPR_JUNIOR_RC_S_BEND_RIGHT_SE_NW_PART_2 = 27911, + SPR_JUNIOR_RC_S_BEND_RIGHT_SE_NW_PART_3 = 27912, + SPR_JUNIOR_RC_FLAT_CHAIN_SW_NE = 27913, + SPR_JUNIOR_RC_FLAT_CHAIN_NW_SE = 27914, + SPR_JUNIOR_RC_25_DEG_CHAIN_SW_NE = 27915, + SPR_JUNIOR_RC_60_DEG_CHAIN_SW_NE = 27916, + SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_CHAIN_SW_NE = 27917, + SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_CHAIN_SW_NE = 27918, + SPR_JUNIOR_RC_25_DEG_CHAIN_NE_SW = 27919, + SPR_JUNIOR_RC_60_DEG_CHAIN_NE_SW = 27920, + SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_CHAIN_NE_SW = 27921, + SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_CHAIN_NE_SW = 27923, + SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_CHAIN_SW_NE = 27925, + SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_CHAIN_SW_NE = 27926, + SPR_JUNIOR_RC_25_DEG_CHAIN_NW_SE = 27927, + SPR_JUNIOR_RC_60_DEG_CHAIN_NW_SE = 27928, + SPR_JUNIOR_RC_25_DEG_CHAIN_SE_NW = 27929, + SPR_JUNIOR_RC_60_DEG_CHAIN_SE_NW = 27930, + SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_CHAIN_NW_SE = 27931, + SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_CHAIN_SE_NW = 27933, + SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_CHAIN_SE_NW = 27934, + SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_CHAIN_SE_NW = 27935, + SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_CHAIN_SE_NW = 27936, + SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_CHAIN_NW_SE = 27937, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_0 = 27943, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_1 = 27944, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_2 = 27945, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_3 = 27946, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_4 = 27947, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_0 = 27948, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_1 = 27949, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_2 = 27950, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_3 = 27951, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_4 = 27952, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_0 = 27953, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_1 = 27954, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_2 = 27955, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_3 = 27956, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_4 = 27957, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_0 = 27958, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_1 = 27959, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_2 = 27960, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_3 = 27961, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_4 = 27962, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_0 = 27963, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_1 = 27964, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_2 = 27965, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_3 = 27966, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_4 = 27967, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_0 = 27968, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_1 = 27969, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_2 = 27970, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_3 = 27971, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_4 = 27972, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_0 = 27973, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_1 = 27974, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_2 = 27975, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_3 = 27976, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_4 = 27977, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_0 = 27978, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_1 = 27979, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_2 = 27980, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_3 = 27981, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_4 = 27982, + SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_SW_NE = 27997, + SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_NW_SE = 27998, + SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_NE_SW = 27999, + SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_SE_NW = 28000, + SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_SW_NE = 28001, + SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_NW_SE = 28002, + SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_NE_SW = 28003, + SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_SE_NW = 28004, + SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_SW_NE_FRONT = 28005, + SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_NW_SE_FRONT = 28006, + SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_NE_SW_FRONT = 28007, + SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_SE_NW_FRONT = 28008, + SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_SW_NE = 28009, + SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_NW_SE = 28010, + SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_NE_SW = 28011, + SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_SE_NW = 28012, + SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_SW_NE_FRONT = 28013, + SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_NW_SE_FRONT = 28014, + SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_SW_NE = 28015, + SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_NW_SE = 28016, + SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_NE_SW = 28017, + SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_SE_NW = 28018, + SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_NE_SW_FRONT = 28019, + SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_SE_NW_FRONT = 28020, + SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_SW_NE = 28021, + SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_NW_SE = 28022, + SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_NE_SW = 28023, + SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_SE_NW = 28024, + SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_SW_NE_FRONT = 28025, + SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_NW_SE_FRONT = 28026, + SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_SW_NE = 28027, + SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_NW_SE = 28028, + SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_NE_SW = 28029, + SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_SE_NW = 28030, + SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_NE_SW_FRONT = 28031, + SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_SE_NW_FRONT = 28032, + SPR_JUNIOR_RC_LEFT_BANK_SW_NE = 28033, + SPR_JUNIOR_RC_LEFT_BANK_NW_SE = 28034, + SPR_JUNIOR_RC_LEFT_BANK_NE_SW = 28035, + SPR_JUNIOR_RC_LEFT_BANK_SE_NW = 28036, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SW_SE_PART_0 = 28037, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SW_SE_PART_1 = 28038, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SW_SE_PART_2 = 28039, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SW_SE_PART_3 = 28040, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SW_SE_PART_4 = 28041, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_0 = 28042, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_1 = 28043, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_2 = 28044, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_3 = 28045, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_4 = 28046, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NE_NW_PART_0 = 28047, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NE_NW_PART_1 = 28048, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NE_NW_PART_2 = 28049, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NE_NW_PART_3 = 28050, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NE_NW_PART_4 = 28051, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_0 = 28052, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_1 = 28053, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_2 = 28054, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_3 = 28055, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_4 = 28056, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_4_2 = 28057, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_0_2 = 28058, + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SW_SE_PART_0 = 28059, + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SW_SE_PART_1 = 28060, + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SW_SE_PART_2 = 28061, + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NW_SW_PART_0 = 28062, + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NW_SW_PART_1 = 28063, + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NW_SW_PART_2 = 28064, + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NE_NW_PART_0 = 28065, + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NE_NW_PART_1 = 28066, + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NE_NW_PART_2 = 28067, + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SE_NE_PART_0 = 28068, + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SE_NE_PART_1 = 28069, + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SE_NE_PART_2 = 28070, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SW_SE_PART_0 = 28071, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SW_SE_PART_1 = 28072, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SW_SE_PART_2 = 28073, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NW_SW_PART_0 = 28074, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NW_SW_PART_1 = 28075, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NW_SW_PART_2 = 28076, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NE_NW_PART_0 = 28077, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NE_NW_PART_1 = 28078, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NE_NW_PART_2 = 28079, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SE_NE_PART_0 = 28080, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SE_NE_PART_1 = 28081, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SE_NE_PART_2 = 28082, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NW_SW_PART_2_2 = 28083, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SE_NE_PART_0_2 = 28084, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_SW_SE_PART_0 = 28085, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_SW_SE_PART_1 = 28086, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_NW_SW_PART_0 = 28087, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_NW_SW_PART_1 = 28088, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_NE_NW_PART_0 = 28089, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_NE_NW_PART_1 = 28090, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_SE_NE_PART_0 = 28091, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_SE_NE_PART_1 = 28092, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_SW_SE_PART_0 = 28093, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_SW_SE_PART_1 = 28094, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_NW_SW_PART_0 = 28095, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_NW_SW_PART_1 = 28096, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_NE_NW_PART_0 = 28097, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_NE_NW_PART_1 = 28098, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_SE_NE_PART_0 = 28099, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_SE_NE_PART_1 = 28100, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_SW_SE_PART_0 = 28101, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_SW_SE_PART_1 = 28102, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_NW_SW_PART_0 = 28103, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_NW_SW_PART_1 = 28104, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_NE_NW_PART_0 = 28105, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_NE_NW_PART_1 = 28106, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_SE_NE_PART_0 = 28107, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_SE_NE_PART_1 = 28108, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_SW_SE_PART_0 = 28109, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_SW_SE_PART_1 = 28110, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_NW_SW_PART_0 = 28111, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_NW_SW_PART_1 = 28112, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_NE_NW_PART_0 = 28113, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_NE_NW_PART_1 = 28114, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_SE_NE_PART_0 = 28115, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_SE_NE_PART_1 = 28116, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SW_SE_PART_0 = 28117, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SW_SE_PART_1 = 28118, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SW_SE_PART_2 = 28119, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NW_SW_PART_0 = 28120, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NW_SW_PART_1 = 28121, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NW_SW_PART_2 = 28122, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NE_NW_PART_0 = 28123, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NE_NW_PART_1 = 28124, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NE_NW_PART_2 = 28125, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SE_NE_PART_0 = 28126, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SE_NE_PART_1 = 28127, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SE_NE_PART_2 = 28128, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NW_SW_PART_2_2 = 28129, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SE_NE_PART_0_2 = 28130, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SW_SE_PART_0 = 28131, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SW_SE_PART_1 = 28132, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SW_SE_PART_2 = 28133, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NW_SW_PART_0 = 28134, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NW_SW_PART_1 = 28135, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NW_SW_PART_2 = 28136, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NE_NW_PART_0 = 28137, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NE_NW_PART_1 = 28138, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NE_NW_PART_2 = 28139, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SE_NE_PART_0 = 28140, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SE_NE_PART_1 = 28141, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SE_NE_PART_2 = 28142, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NW_SW_PART_2_2 = 28143, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SE_NE_PART_0_2 = 28144, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SW_SE_PART_0 = 28145, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SW_SE_PART_1 = 28146, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SW_SE_PART_2 = 28147, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SW_SE_PART_3 = 28148, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SW_SE_PART_4 = 28149, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_0 = 28150, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_1 = 28151, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_2 = 28152, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_3 = 28153, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_4 = 28154, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NE_NW_PART_0 = 28155, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NE_NW_PART_1 = 28156, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NE_NW_PART_2 = 28157, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NE_NW_PART_3 = 28158, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NE_NW_PART_4 = 28159, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_0 = 28160, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_1 = 28161, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_2 = 28162, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_3 = 28163, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_4 = 28164, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_4_2 = 28165, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_0_2 = 28166, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SW_SE_PART_0 = 28167, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SW_SE_PART_1 = 28168, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SW_SE_PART_2 = 28169, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SW_SE_PART_3 = 28170, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SW_SE_PART_4 = 28171, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_0 = 28172, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_1 = 28173, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_2 = 28174, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_3 = 28175, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_4 = 28176, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NE_NW_PART_0 = 28177, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NE_NW_PART_1 = 28178, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NE_NW_PART_2 = 28179, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NE_NW_PART_3 = 28180, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NE_NW_PART_4 = 28181, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_0 = 28182, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_1 = 28183, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_2 = 28184, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_3 = 28185, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_4 = 28186, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_4_2 = 28187, + SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_0_2 = 28188, + SPR_JUNIOR_RC_STATION_SW_NE = 28189, + SPR_JUNIOR_RC_STATION_NW_SE = 28190, + SPR_JUNIOR_RC_FLAT_SW_NE_BRAKED = 28191, + SPR_JUNIOR_RC_FLAT_NW_SE_BRAKED = 28192, + SPR_JUNIOR_RC_FLAT_BLOCK_SW_NE = 28193, + SPR_JUNIOR_RC_FLAT_BLOCK_NW_SE = 28194, + SPR_JUNIOR_RC_FLAT_BLOCK_SW_NE_BRAKED = 28195, + SPR_JUNIOR_RC_FLAT_BLOCK_NW_SE_BRAKED = 28196, + SPR_JUNIOR_RC_DIAG_FLAT_W_E = 28197, + SPR_JUNIOR_RC_DIAG_FLAT_N_S = 28198, + SPR_JUNIOR_RC_DIAG_FLAT_E_W = 28199, + SPR_JUNIOR_RC_DIAG_FLAT_S_N = 28200, + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_W_E = 28201, + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_N_S = 28202, + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_E_W = 28203, + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_S_N = 28204, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_W_E = 28205, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_N_S = 28206, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_E_W = 28207, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_S_N = 28208, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_W_E = 28209, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_N_S = 28210, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_E_W = 28211, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_S_N = 28212, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_W_E = 28213, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_N_S = 28214, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_E_W = 28215, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_S_N = 28216, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_W_E = 28217, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_N_S = 28218, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_E_W = 28219, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_S_N = 28220, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_W_E = 28221, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_N_S = 28222, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_E_W = 28223, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_S_N = 28224, + SPR_JUNIOR_RC_DIAG_FLAT_CHAIN_W_E = 28233, + SPR_JUNIOR_RC_DIAG_FLAT_CHAIN_N_S = 28234, + SPR_JUNIOR_RC_DIAG_FLAT_CHAIN_E_W = 28235, + SPR_JUNIOR_RC_DIAG_FLAT_CHAIN_S_N = 28236, + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_W_E = 28237, + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_N_S = 28238, + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_E_W = 28239, + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_S_N = 28240, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_W_E = 28241, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_N_S = 28242, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_E_W = 28243, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_S_N = 28244, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_W_E = 28245, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_N_S = 28246, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_E_W = 28247, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_S_N = 28248, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_W_E = 28249, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_N_S = 28250, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_E_W = 28251, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_S_N = 28252, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_W_E = 28253, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_N_S = 28254, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_E_W = 28255, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_S_N = 28256, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_W_E = 28257, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_N_S = 28258, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_E_W = 28259, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_S_N = 28260, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_E_PART_0 = 28285, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_E_PART_1 = 28286, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_E_PART_2 = 28287, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_E_PART_3 = 28288, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_S_PART_0 = 28289, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_S_PART_1 = 28290, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_S_PART_2 = 28291, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_S_PART_3 = 28292, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_W_PART_0 = 28293, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_W_PART_1 = 28294, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_W_PART_2 = 28295, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_W_PART_3 = 28296, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_N_PART_0 = 28297, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_N_PART_1 = 28298, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_N_PART_2 = 28299, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_N_PART_3 = 28300, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_N_PART_0 = 28301, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_N_PART_1 = 28302, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_N_PART_2 = 28303, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_N_PART_3 = 28304, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_E_PART_0 = 28305, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_E_PART_1 = 28306, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_E_PART_2 = 28307, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_E_PART_3 = 28308, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_S_PART_0 = 28309, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_S_PART_1 = 28310, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_S_PART_2 = 28311, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_S_PART_3 = 28312, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_W_PART_0 = 28313, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_W_PART_1 = 28314, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_W_PART_2 = 28315, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_W_PART_3 = 28316, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_E_PART_0 = 28317, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_E_PART_1 = 28318, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_E_PART_2 = 28319, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_E_PART_3 = 28320, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_S_PART_0 = 28321, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_S_PART_1 = 28322, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_S_PART_2 = 28323, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_S_PART_3 = 28324, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_W_PART_0 = 28325, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_W_PART_1 = 28326, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_W_PART_2 = 28327, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_W_PART_3 = 28328, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_N_PART_0 = 28329, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_N_PART_1 = 28330, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_N_PART_2 = 28331, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_N_PART_3 = 28332, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_N_PART_0 = 28333, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_N_PART_1 = 28334, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_N_PART_2 = 28335, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_N_PART_3 = 28336, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_E_PART_0 = 28337, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_E_PART_1 = 28338, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_E_PART_2 = 28339, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_E_PART_3 = 28340, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_S_PART_0 = 28341, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_S_PART_1 = 28342, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_S_PART_2 = 28343, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_S_PART_3 = 28344, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_W_PART_0 = 28345, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_W_PART_1 = 28346, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_W_PART_2 = 28347, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_W_PART_3 = 28348, + SPR_JUNIOR_RC_DIAG_LEFT_BANK_W_E = 28349, + SPR_JUNIOR_RC_DIAG_LEFT_BANK_N_S = 28350, + SPR_JUNIOR_RC_DIAG_LEFT_BANK_E_W = 28351, + SPR_JUNIOR_RC_DIAG_LEFT_BANK_S_N = 28352, + SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_W_E = 28353, + SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_N_S = 28354, + SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_E_W = 28355, + SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_S_N = 28356, + SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_W_E_PART_0_2 = 28357, + SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_W_E = 28358, + SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_N_S = 28359, + SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_E_W = 28360, + SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_S_N = 28361, + SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_E_W_PART_0_2 = 28362, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_W_E = 28363, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_N_S = 28364, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_E_W = 28365, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_S_N = 28366, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_W_E_PART_0_2 = 28367, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_W_E = 28368, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_N_S = 28369, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_E_W = 28370, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_S_N = 28371, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_E_W_PART_0_2 = 28372, + SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_W_E = 28373, + SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_N_S = 28374, + SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_E_W = 28375, + SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_S_N = 28376, + SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_W_E_PART_0_2 = 28377, + SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_W_E = 28378, + SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_N_S = 28379, + SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_E_W = 28380, + SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_S_N = 28381, + SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_E_W_PART_0_2 = 28382, + + SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_SW_NE = SPR_G2_BEGIN + 34, + SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_NW_SE = SPR_G2_BEGIN + 35, + SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_NE_SW = SPR_G2_BEGIN + 36, + SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_SE_NW = SPR_G2_BEGIN + 37, + SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_NW_SE_PART_0_2 = SPR_G2_BEGIN + 35, + SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_NE_SW_PART_0_2 = SPR_G2_BEGIN + 37, + SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_CHAIN_SW_NE = SPR_G2_BEGIN + 46, + SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_CHAIN_NW_SE = SPR_G2_BEGIN + 47, + SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_CHAIN_NE_SW = SPR_G2_BEGIN + 48, + SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_CHAIN_SE_NW = SPR_G2_BEGIN + 49, + SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_CHAIN_NW_SE_PART_0_2 = SPR_G2_BEGIN + 50, + SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_CHAIN_NE_SW_PART_0_2 = SPR_G2_BEGIN + 51, +}; + +static const uint32 junior_rc_track_pieces_flat[2][4] = { + { + SPR_JUNIOR_RC_FLAT_SW_NE, + SPR_JUNIOR_RC_FLAT_NW_SE, + SPR_JUNIOR_RC_FLAT_SW_NE, + SPR_JUNIOR_RC_FLAT_NW_SE + }, + { + SPR_JUNIOR_RC_FLAT_CHAIN_SW_NE, + SPR_JUNIOR_RC_FLAT_CHAIN_NW_SE, + SPR_JUNIOR_RC_FLAT_CHAIN_SW_NE, + SPR_JUNIOR_RC_FLAT_CHAIN_NW_SE + }, +}; + +static const uint32 junior_rc_track_pieces_block_brake[2][4] = { + { + SPR_JUNIOR_RC_FLAT_BLOCK_SW_NE, + SPR_JUNIOR_RC_FLAT_BLOCK_NW_SE, + SPR_JUNIOR_RC_FLAT_BLOCK_SW_NE, + SPR_JUNIOR_RC_FLAT_BLOCK_NW_SE + }, + { + SPR_JUNIOR_RC_FLAT_BLOCK_SW_NE_BRAKED, + SPR_JUNIOR_RC_FLAT_BLOCK_NW_SE_BRAKED, + SPR_JUNIOR_RC_FLAT_BLOCK_SW_NE_BRAKED, + SPR_JUNIOR_RC_FLAT_BLOCK_NW_SE_BRAKED + }, +}; + +static const uint32 junior_rc_track_pieces_station[2][4] = { + { + SPR_JUNIOR_RC_STATION_SW_NE, + SPR_JUNIOR_RC_STATION_NW_SE, + SPR_JUNIOR_RC_STATION_SW_NE, + SPR_JUNIOR_RC_STATION_NW_SE + }, + { + SPR_JUNIOR_RC_FLAT_SW_NE_BRAKED, + SPR_JUNIOR_RC_FLAT_NW_SE_BRAKED, + SPR_JUNIOR_RC_FLAT_SW_NE_BRAKED, + SPR_JUNIOR_RC_FLAT_NW_SE_BRAKED + }, +}; + +static const uint32 junior_rc_track_pieces_25_deg_up[2][4] = { + { + SPR_JUNIOR_RC_25_DEG_SW_NE, + SPR_JUNIOR_RC_25_DEG_NW_SE, + SPR_JUNIOR_RC_25_DEG_NE_SW, + SPR_JUNIOR_RC_25_DEG_SE_NW + }, + { + SPR_JUNIOR_RC_25_DEG_CHAIN_SW_NE, + SPR_JUNIOR_RC_25_DEG_CHAIN_NW_SE, + SPR_JUNIOR_RC_25_DEG_CHAIN_NE_SW, + SPR_JUNIOR_RC_25_DEG_CHAIN_SE_NW + }, +}; + +static const uint32 junior_rc_track_pieces_flat_to_25_deg_up[2][4] = { + { + SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_SW_NE, + SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_NW_SE, + SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_NE_SW, + SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_SE_NW + }, + { + SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_CHAIN_SW_NE, + SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_CHAIN_NW_SE, + SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_CHAIN_NE_SW, + SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_CHAIN_SE_NW + }, +}; + +static const uint32 junior_rc_track_pieces_25_deg_up_to_flat[2][4] = { + { + SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_SW_NE, + SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_NW_SE, + SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_NE_SW, + SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_SE_NW + }, + { + SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_CHAIN_SW_NE, + SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_CHAIN_NW_SE, + SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_CHAIN_NE_SW, + SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_CHAIN_SE_NW + }, +}; + +static const uint32 junior_rc_track_pieces_flat_to_left_bank[4][2] = { + {SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_SW_NE, SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_SW_NE_FRONT}, + {SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_NW_SE, SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_NW_SE_FRONT}, + {SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_NE_SW, 0}, + {SPR_JUNIOR_RC_FLAT_TO_LEFT_BANK_SE_NW, 0} +}; + +static const uint32 junior_rc_track_pieces_flat_to_right_bank[4][2] = { + {SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_SW_NE, 0}, + {SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_NW_SE, 0}, + {SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_NE_SW, SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_NE_SW_FRONT}, + {SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_SE_NW, SPR_JUNIOR_RC_FLAT_TO_RIGHT_BANK_SE_NW_FRONT} +}; + +static const uint32 junior_rc_track_pieces_flat_quarter_turn_5_tiles[4][5] = { + { + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SW_SE_PART_0, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SW_SE_PART_1, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SW_SE_PART_2, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SW_SE_PART_3, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SW_SE_PART_4, + }, + { + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NW_SW_PART_0, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NW_SW_PART_1, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NW_SW_PART_2, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NW_SW_PART_3, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NW_SW_PART_4, + }, + { + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NE_NW_PART_0, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NE_NW_PART_1, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NE_NW_PART_2, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NE_NW_PART_3, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_NE_NW_PART_4, + }, + { + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SE_NE_PART_0, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SE_NE_PART_1, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SE_NE_PART_2, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SE_NE_PART_3, + SPR_JUNIOR_RC_FLAT_QUARTER_TURN_5_TILES_SE_NE_PART_4, + } +}; + +static const uint32 junior_rc_track_pieces_banked_quarter_turn_5_tiles[4][5] = { + { + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SW_SE_PART_0, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SW_SE_PART_1, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SW_SE_PART_2, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SW_SE_PART_3, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SW_SE_PART_4, + }, + { + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_0, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_1, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_2, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_3, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_4, + }, + { + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NE_NW_PART_0, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NE_NW_PART_1, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NE_NW_PART_2, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NE_NW_PART_3, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NE_NW_PART_4, + }, + { + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_0, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_1, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_2, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_3, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_4, + } +}; + +static const uint32 junior_rc_track_pieces_left_banked_to_25_deg_up[4][2] = { + {SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_SW_NE, SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_SW_NE_FRONT}, + {SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_NW_SE, SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_NW_SE_FRONT}, + {SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_NE_SW, 0}, + {SPR_JUNIOR_RC_LEFT_BANK_TO_25_DEG_UP_SE_NW, 0} +}; + +static const uint32 junior_rc_track_pieces_right_banked_to_25_deg_up[4][2] = { + {SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_SW_NE, 0}, + {SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_NW_SE, 0}, + {SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_NE_SW, SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_NE_SW_FRONT}, + {SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_SE_NW, SPR_JUNIOR_RC_RIGHT_BANK_TO_25_DEG_UP_SE_NW_FRONT} +}; + +static const uint32 junior_rc_track_pieces_25_deg_up_to_left_bank[4][2] = { + {SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_SW_NE, SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_SW_NE_FRONT}, + {SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_NW_SE, SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_NW_SE_FRONT}, + {SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_NE_SW, 0}, + {SPR_JUNIOR_RC_25_DEG_UP_TO_LEFT_BANK_SE_NW, 0} +}; + +static const uint32 junior_rc_track_pieces_25_deg_up_to_right_bank[4][2] = { + {SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_SW_NE, 0}, + {SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_NW_SE, 0}, + {SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_NE_SW, SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_NE_SW_FRONT}, + {SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_SE_NW, SPR_JUNIOR_RC_25_DEG_UP_TO_RIGHT_BANK_SE_NW_FRONT} +}; + +static const uint32 junior_rc_track_pieces_left_bank[4] = { + SPR_JUNIOR_RC_LEFT_BANK_SW_NE, + SPR_JUNIOR_RC_LEFT_BANK_NW_SE, + SPR_JUNIOR_RC_LEFT_BANK_NE_SW, + SPR_JUNIOR_RC_LEFT_BANK_SE_NW +}; + +static const uint32 junior_rc_track_pieces_left_quarter_turn_5_tiles_25_deg_up[2][4][5] = { + { + { + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_0, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_1, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_2, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_3, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_4, + }, + { + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_0, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_1, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_2, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_3, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_4, + }, + { + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_0, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_1, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_2, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_3, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_4, + }, + { + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_0, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_1, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_2, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_3, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_4, + } + }, + { + { + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_0, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_1, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_2, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_3, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_4, + }, + { + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_0, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_1, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_2, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_3, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_4, + }, + { + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_0, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_1, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_2, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_3, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_4, + }, + { + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_0, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_1, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_2, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_3, + SPR_JUNIOR_RC_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_4, + } + } +}; + +const rct_xy16 junior_rc_left_quarter_turn_5_tiles_25_deg_up_offsets[4][5] = { + { + {0, 6}, + {0, 0}, + {0, 16}, + {16, 0}, + {6, 0}, + }, + { + {6, 0}, + {0, 0}, + {16, 16}, + {0, 0}, + {0, 6}, + }, + { + {0, 6}, + {0, 16}, + {16, 0}, + {0, 0}, + {6, 0}, + }, + { + {6, 0}, + {16, 0}, + {0, 0}, + {0, 16}, + {0, 6}, + } +}; + +static const uint32 junior_rc_track_pieces_right_quarter_turn_5_tiles_25_deg_up[2][4][5] = { + { + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_1, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_2, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_3, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SW_SE_PART_4, + }, + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_1, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_2, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_3, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NW_SW_PART_4, + }, + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_1, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_2, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_3, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_NE_NW_PART_4, + }, + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_1, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_2, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_3, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_SE_NE_PART_4, + } + }, + { + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_1, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_2, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_3, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SW_SE_PART_4, + }, + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_1, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_2, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_3, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NW_SW_PART_4, + }, + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_1, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_2, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_3, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_NE_NW_PART_4, + }, + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_1, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_2, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_3, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP_CHAIN_SE_NE_PART_4, + } + } +}; + +static const uint32 junior_rc_track_pieces_s_bend_left[2][4] = { + { + SPR_JUNIOR_RC_S_BEND_LEFT_SW_NE_PART_0, + SPR_JUNIOR_RC_S_BEND_LEFT_SW_NE_PART_1, + SPR_JUNIOR_RC_S_BEND_LEFT_SW_NE_PART_2, + SPR_JUNIOR_RC_S_BEND_LEFT_SW_NE_PART_3, + }, + { + SPR_JUNIOR_RC_S_BEND_LEFT_SE_NW_PART_3, + SPR_JUNIOR_RC_S_BEND_LEFT_SE_NW_PART_2, + SPR_JUNIOR_RC_S_BEND_LEFT_SE_NW_PART_1, + SPR_JUNIOR_RC_S_BEND_LEFT_SE_NW_PART_0, + } +}; + +static const uint32 junior_rc_track_pieces_s_bend_right[2][4] = { + { + SPR_JUNIOR_RC_S_BEND_RIGHT_SW_NE_PART_0, + SPR_JUNIOR_RC_S_BEND_RIGHT_SW_NE_PART_1, + SPR_JUNIOR_RC_S_BEND_RIGHT_SW_NE_PART_2, + SPR_JUNIOR_RC_S_BEND_RIGHT_SW_NE_PART_3, + }, + { + SPR_JUNIOR_RC_S_BEND_RIGHT_SE_NW_PART_3, + SPR_JUNIOR_RC_S_BEND_RIGHT_SE_NW_PART_2, + SPR_JUNIOR_RC_S_BEND_RIGHT_SE_NW_PART_1, + SPR_JUNIOR_RC_S_BEND_RIGHT_SE_NW_PART_0, + } +}; + +static const uint32 junior_rc_track_pieces_flat_quarter_turn_3_tiles[4][3] = { + { + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SW_SE_PART_0, + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SW_SE_PART_1, + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SW_SE_PART_2 + }, + { + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NW_SW_PART_0, + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NW_SW_PART_1, + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NW_SW_PART_2 + }, + { + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NE_NW_PART_0, + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NE_NW_PART_1, + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_NE_NW_PART_2 + }, + { + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SE_NE_PART_0, + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SE_NE_PART_1, + SPR_JUNIOR_RC_QUARTER_TURN_3_TILES_SE_NE_PART_2 + } +}; + +static const uint32 junior_rc_track_pieces_banked_quarter_turn_3_tiles[4][3] = { + { + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SW_SE_PART_0, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SW_SE_PART_1, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SW_SE_PART_2 + }, + { + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NW_SW_PART_0, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NW_SW_PART_1, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NW_SW_PART_2 + }, + { + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NE_NW_PART_0, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NE_NW_PART_1, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NE_NW_PART_2 + }, + { + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SE_NE_PART_0, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SE_NE_PART_1, + SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SE_NE_PART_2 + } +}; + +static const uint32 junior_rc_track_pieces_right_quarter_turn_3_tiles_25_deg_up [2][4][2] = { + { + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_SW_SE_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_SW_SE_PART_1 + }, + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_NW_SW_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_NW_SW_PART_1 + }, + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_NE_NW_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_NE_NW_PART_1 + }, + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_SE_NE_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_SE_NE_PART_1 + } + }, + { + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_SW_SE_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_SW_SE_PART_1 + }, + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_NW_SW_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_NW_SW_PART_1 + }, + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_NE_NW_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_NE_NW_PART_1 + }, + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_SE_NE_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP_CHAIN_SE_NE_PART_1 + } + } +}; + +static const uint32 junior_rc_track_pieces_right_quarter_turn_3_tiles_25_deg_down[2][4][2] = { + { + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_SW_SE_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_SW_SE_PART_1 + }, + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_NW_SW_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_NW_SW_PART_1 + }, + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_NE_NW_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_NE_NW_PART_1 + }, + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_SE_NE_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_SE_NE_PART_1 + } + }, + { + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_SW_SE_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_SW_SE_PART_1 + }, + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_NW_SW_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_NW_SW_PART_1 + }, + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_NE_NW_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_NE_NW_PART_1 + }, + { + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_SE_NE_PART_0, + SPR_JUNIOR_RC_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_CHAIN_SE_NE_PART_1 + } + } +}; + +static const uint32 junior_rc_track_pieces_right_half_banked_helix_up_small_quarter_tiles[4][3][2] = { + { + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SW_SE_PART_0}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SW_SE_PART_1}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SW_SE_PART_2}, + }, + { + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NW_SW_PART_0}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NW_SW_PART_1}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NW_SW_PART_2, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NW_SW_PART_2_2} + }, + { + { 0, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NE_NW_PART_0 }, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NE_NW_PART_1}, + { 0, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_NE_NW_PART_2 } + }, + { + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SE_NE_PART_0, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SE_NE_PART_0_2}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SE_NE_PART_1}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_SE_NE_PART_2} + } +}; + +static const uint32 junior_rc_track_pieces_right_half_banked_helix_down_small_quarter_tiles[4][3][2] = { + { + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SW_SE_PART_0}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SW_SE_PART_1}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SW_SE_PART_2}, + }, + { + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NW_SW_PART_0}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NW_SW_PART_1}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NW_SW_PART_2, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NW_SW_PART_2_2} + }, + { + { 0, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NE_NW_PART_0 }, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NE_NW_PART_1}, + { 0, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_NE_NW_PART_2 } + }, + { + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SE_NE_PART_0, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SE_NE_PART_0_2}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SE_NE_PART_1}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL_SE_NE_PART_2} + } +}; + +static const uint32 junior_rc_track_pieces_right_half_banked_helix_up_large_quarter_tiles[4][5][2] = { + { + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SW_SE_PART_0}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SW_SE_PART_1}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SW_SE_PART_2}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SW_SE_PART_3}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SW_SE_PART_4}, + }, + { + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_0}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_1}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_2}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_3}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_4, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NW_SW_PART_4_2} + }, + { + { 0, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NE_NW_PART_0 }, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NE_NW_PART_1}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NE_NW_PART_2}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NE_NW_PART_3}, + { 0, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_NE_NW_PART_4 } + }, + { + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_0, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_0_2}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_1}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_2}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_3}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_UP_LARGE_SE_NE_PART_4} + } +}; + +static const uint32 junior_rc_track_pieces_right_half_banked_helix_down_large_quarter_tiles[4][5][2] = { + { + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SW_SE_PART_0}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SW_SE_PART_1}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SW_SE_PART_2}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SW_SE_PART_3}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SW_SE_PART_4}, + }, + { + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_0}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_1}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_2}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_3}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_4, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NW_SW_PART_4_2} + }, + { + { 0, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NE_NW_PART_0 }, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NE_NW_PART_1}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NE_NW_PART_2}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NE_NW_PART_3}, + { 0, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_NE_NW_PART_4 } + }, + { + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_0, SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_0_2}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_1}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_2}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_3}, + {SPR_JUNIOR_RC_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE_SE_NE_PART_4} + } +}; + +static const uint32 junior_rc_track_pieces_brake[4] = { + SPR_JUNIOR_RC_FLAT_SW_NE_BRAKED, + SPR_JUNIOR_RC_FLAT_NW_SE_BRAKED, + SPR_JUNIOR_RC_FLAT_SW_NE_BRAKED, + SPR_JUNIOR_RC_FLAT_NW_SE_BRAKED +}; + +static const uint32 junior_rc_track_pieces_left_eight_to_diag[4][4] = { + { + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_N_PART_0, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_N_PART_1, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_N_PART_2, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_N_PART_3, + }, + { + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_E_PART_0, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_E_PART_1, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_E_PART_2, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_E_PART_3, + }, + { + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_S_PART_0, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_S_PART_1, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_S_PART_2, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_S_PART_3, + }, + { + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_W_PART_0, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_W_PART_1, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_W_PART_2, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_W_PART_3, + }, +}; + +static const uint32 junior_rc_track_pieces_right_eight_to_diag[4][4] = { + { + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_E_PART_0, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_E_PART_1, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_E_PART_2, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SW_E_PART_3, + }, + { + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_S_PART_0, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_S_PART_1, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_S_PART_2, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NW_S_PART_3, + }, + { + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_W_PART_0, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_W_PART_1, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_W_PART_2, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_NE_W_PART_3, + }, + { + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_N_PART_0, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_N_PART_1, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_N_PART_2, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_SE_N_PART_3, + }, +}; + +static const uint32 junior_rc_track_pieces_left_eight_to_diag_bank[4][4] = { + { + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_N_PART_0, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_N_PART_1, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_N_PART_2, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_N_PART_3, + }, + { + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_E_PART_0, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_E_PART_1, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_E_PART_2, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_E_PART_3, + }, + { + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_S_PART_0, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_S_PART_1, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_S_PART_2, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_S_PART_3, + }, + { + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_W_PART_0, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_W_PART_1, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_W_PART_2, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_W_PART_3, + }, +}; + +static const uint32 junior_rc_track_pieces_right_eight_to_diag_bank[4][4] = { + { + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_E_PART_0, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_E_PART_1, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_E_PART_2, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SW_E_PART_3, + }, + { + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_S_PART_0, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_S_PART_1, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_S_PART_2, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NW_S_PART_3, + }, + { + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_W_PART_0, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_W_PART_1, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_W_PART_2, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_NE_W_PART_3, + }, + { + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_N_PART_0, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_N_PART_1, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_N_PART_2, + SPR_JUNIOR_RC_EIGHT_TO_DIAG_BANK_SE_N_PART_3, + }, +}; + +static const uint32 junior_rc_track_pieces_diag_flat[2][4] = { + { + SPR_JUNIOR_RC_DIAG_FLAT_W_E, + SPR_JUNIOR_RC_DIAG_FLAT_N_S, + SPR_JUNIOR_RC_DIAG_FLAT_E_W, + SPR_JUNIOR_RC_DIAG_FLAT_S_N + }, + { + SPR_JUNIOR_RC_DIAG_FLAT_CHAIN_W_E, + SPR_JUNIOR_RC_DIAG_FLAT_CHAIN_N_S, + SPR_JUNIOR_RC_DIAG_FLAT_CHAIN_E_W, + SPR_JUNIOR_RC_DIAG_FLAT_CHAIN_S_N + }, +}; + +static const uint32 junior_rc_track_pieces_diag_25_deg_up[2][4] = { + { + SPR_JUNIOR_RC_DIAG_25_DEG_UP_W_E, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_N_S, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_E_W, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_S_N + }, + { + SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_W_E, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_N_S, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_E_W, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_S_N + }, +}; + +static const uint32 junior_rc_track_pieces_diag_flat_to_25_deg_up[2][4] = { + { + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_W_E, + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_N_S, + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_E_W, + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_S_N + }, + { + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_W_E, + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_N_S, + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_E_W, + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_S_N + }, +}; + +static const uint32 junior_rc_track_pieces_diag_25_deg_up_to_flat[2][4] = { + { + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_W_E, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_N_S, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_E_W, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_S_N + }, + { + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_W_E, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_N_S, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_E_W, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_S_N + }, +}; + +static const uint32 junior_rc_track_pieces_diag_25_deg_down[2][4] = { + { + SPR_JUNIOR_RC_DIAG_25_DEG_UP_E_W, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_S_N, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_W_E, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_N_S, + }, + { + SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_E_W, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_S_N, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_W_E, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_N_S, + }, +}; + +static const uint32 junior_rc_track_pieces_diag_flat_to_25_deg_down[2][4] = { + { + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_E_W, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_S_N, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_W_E, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_N_S, + }, + { + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_E_W, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_S_N, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_W_E, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_N_S, + }, +}; + +static const uint32 junior_rc_track_pieces_diag_25_deg_down_to_flat[2][4] = { + { + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_E_W, + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_S_N, + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_W_E, + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_N_S, + }, + { + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_E_W, + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_S_N, + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_W_E, + SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_N_S, + }, +}; + +static const uint32 junior_rc_track_pieces_diag_flat_to_left_bank[4] = { + SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_W_E, + SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_N_S, + SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_E_W, + SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_S_N, +}; + +static const uint32 junior_rc_track_pieces_diag_flat_to_right_bank[4] = { + SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_W_E, + SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_N_S, + SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_E_W, + SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_S_N, +}; + +static const uint32 junior_rc_track_pieces_diag_right_bank_to_flat[4] = { + SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_E_W, + SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_S_N, + SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_W_E, + SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_N_S, +}; + +static const uint32 junior_rc_track_pieces_diag_left_bank_to_flat[4] = { + SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_E_W, + SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_S_N, + SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_W_E, + SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_N_S, +}; + +static const uint32 junior_rc_track_pieces_diag_left_bank_to_25_deg_up[4] = { + SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_W_E, + SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_N_S, + SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_E_W, + SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_S_N, +}; + +static const uint32 junior_rc_track_pieces_diag_right_bank_to_25_deg_up[4] = { + SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_W_E, + SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_N_S, + SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_E_W, + SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_S_N, +}; + +static const uint32 junior_rc_track_pieces_diag_25_deg_up_to_left_bank[4] = { + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_W_E, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_N_S, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_E_W, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_S_N, +}; + +static const uint32 junior_rc_track_pieces_diag_25_deg_up_to_right_bank[4] = { + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_W_E, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_N_S, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_E_W, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_S_N, +}; + +static const uint32 junior_rc_track_pieces_diag_right_bank_to_25_deg_down[4] = { + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_E_W, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_S_N, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_W_E, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_N_S, +}; + +static const uint32 junior_rc_track_pieces_diag_left_bank_to_25_deg_down[4] = { + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_E_W, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_S_N, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_W_E, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_N_S, +}; + +static const uint32 junior_rc_track_pieces_diag_25_deg_down_to_right_bank[4] = { + SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_E_W, + SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_S_N, + SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_W_E, + SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_N_S, +}; + +static const uint32 junior_rc_track_pieces_diag_25_deg_down_to_left_bank[4] = { + SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_E_W, + SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_S_N, + SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_W_E, + SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_N_S, +}; + +static const uint32 junior_rc_track_pieces_diag_left_bank[4] = { + SPR_JUNIOR_RC_DIAG_LEFT_BANK_W_E, + SPR_JUNIOR_RC_DIAG_LEFT_BANK_N_S, + SPR_JUNIOR_RC_DIAG_LEFT_BANK_E_W, + SPR_JUNIOR_RC_DIAG_LEFT_BANK_S_N, +}; + +static const uint32 junior_rc_track_pieces_diag_right_bank[4] = { + SPR_JUNIOR_RC_DIAG_LEFT_BANK_E_W, + SPR_JUNIOR_RC_DIAG_LEFT_BANK_S_N, + SPR_JUNIOR_RC_DIAG_LEFT_BANK_W_E, + SPR_JUNIOR_RC_DIAG_LEFT_BANK_N_S, +}; + +static const uint32 junior_rc_track_pieces_flat_to_60_deg_up[2][4][2] = { + { + {SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_SW_NE, 0}, + {SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_NW_SE, SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_NW_SE_PART_0_2}, + {SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_NE_SW, SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_NE_SW_PART_0_2}, + {SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_SE_NW, 0}, + }, + { + {SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_CHAIN_SW_NE, 0}, + {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}, + {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}, + {SPR_JUNIOR_RC_FLAT_TO_60_DEG_UP_CHAIN_SE_NW, 0}, + }, +}; + +static const uint32 junior_rc_track_pieces_60_deg_up[2][4] = { + { + SPR_JUNIOR_RC_60_DEG_SW_NE, + SPR_JUNIOR_RC_60_DEG_NW_SE, + SPR_JUNIOR_RC_60_DEG_NE_SW, + SPR_JUNIOR_RC_60_DEG_SE_NW + }, + { + SPR_JUNIOR_RC_60_DEG_CHAIN_SW_NE, + SPR_JUNIOR_RC_60_DEG_CHAIN_NW_SE, + SPR_JUNIOR_RC_60_DEG_CHAIN_NE_SW, + SPR_JUNIOR_RC_60_DEG_CHAIN_SE_NW + }, +}; + +static const uint32 junior_rc_track_pieces_25_deg_up_to_60_deg_up[4][2] = { + {SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_SW_NE, 0}, + {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}, + {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}, + {SPR_JUNIOR_RC_25_DEG_TO_60_DEG_UP_SE_NW, 0}, +}; + +static const uint32 junior_rc_track_pieces_60_deg_up_to_25_deg_up[4][2] = { + {SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_SW_NE, 0}, + {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}, + {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}, + {SPR_JUNIOR_RC_60_DEG_TO_25_DEG_UP_SE_NW, 0}, +}; + +static const uint32 junior_rc_track_pieces_diag_60_deg_up[2][4] = { + { + SPR_JUNIOR_RC_DIAG_60_DEG_UP_W_E, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_N_S, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_E_W, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_S_N + }, + { + SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_W_E, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_N_S, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_E_W, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_S_N + }, +}; + +static const uint32 junior_rc_track_pieces_diag_60_deg_down[2][4] = { + { + SPR_JUNIOR_RC_DIAG_60_DEG_UP_E_W, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_S_N, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_W_E, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_N_S, + }, + { + SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_E_W, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_S_N, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_W_E, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_CHAIN_N_S, + }, +}; + +static const uint32 junior_rc_track_pieces_diag_25_deg_up_to_60_deg_up[2][4] = { + { + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_W_E, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_N_S, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_E_W, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_S_N + }, + { + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_W_E, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_N_S, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_E_W, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_S_N + }, +}; + +static const uint32 junior_rc_track_pieces_diag_60_deg_up_to_25_deg_up[2][4] = { + { + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_W_E, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_N_S, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_E_W, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_S_N + }, + { + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_W_E, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_N_S, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_E_W, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_S_N + }, +}; + +static const uint32 junior_rc_track_pieces_diag_25_deg_down_to_60_deg_down[2][4] = { + { + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_E_W, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_S_N, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_W_E, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_N_S, + }, + { + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_E_W, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_S_N, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_W_E, + SPR_JUNIOR_RC_DIAG_60_DEG_UP_TO_25_DEG_UP_CHAIN_N_S, + }, +}; + +static const uint32 junior_rc_track_pieces_diag_60_deg_down_to_25_deg_down[2][4] = { + { + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_E_W, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_S_N, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_W_E, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_N_S, + }, + { + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_E_W, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_S_N, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_W_E, + SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_60_DEG_UP_CHAIN_N_S, + }, +}; + +/* rct2: 0x00518394 */ +static void junior_rc_flat_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement){ + rct_xy16 position = {RCT2_GLOBAL(0x009DE56A, sint16), RCT2_GLOBAL(0x009DE56E, sint16)}; + uint32 imageId = 0; + bool isChained = mapElement->type & (1 << 7); + + if (direction & 1) { + imageId = junior_rc_track_pieces_flat[isChained][direction] | RCT2_GLOBAL(0x00F44198, uint32); + sub_98196C(imageId, 6, 0, 20, 32, 1, height, get_current_rotation()); + paint_util_push_tunnel_right(height, TUNNEL_0); + } else { + imageId += junior_rc_track_pieces_flat[isChained][direction] | RCT2_GLOBAL(0x00F44198, uint32); + sub_98196C(imageId, 0, 6, 32, 20, 1, height, get_current_rotation()); + paint_util_push_tunnel_left(height, TUNNEL_0); + } + + if (track_paint_util_should_paint_supports(position)) { + metal_a_supports_paint_setup((direction & 1) ? 2 : 1, 4, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +/* rct2: 0x00515629, 0x00514D22, 0x005151B9 */ +static void paint_junior_rc_station_track(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + rct_xy16 position = {RCT2_GLOBAL(0x009DE56A, sint16), RCT2_GLOBAL(0x009DE56E, sint16)}; + rct_ride * ride = get_ride(rideIndex); + const rct_ride_entrance_definition * entranceStyle = &RideEntranceDefinitions[ride->entrance_style]; + uint32 imageId = entranceStyle->base_image_id; + if (!(RCT2_GLOBAL(0x00F441A0, uint32) & (1 << 29))) { + imageId &= 0x7FFFF; + } + + RCT2_GLOBAL(0x00F441E8, uint32) = imageId; + RCT2_GLOBAL(0x00F441E4, uint32) = imageId; + + bool isBraked = (bool)(mapElement->flags & MAP_ELEMENT_FLAG_BLOCK_BRAKE_CLOSED); + + if (direction == 0 || direction == 2) { + // height -= 2 (height - 2) + imageId = SPR_STATION_BASE_B_SW_NE | RCT2_GLOBAL(0x00F441A0, uint32); + sub_98197C(imageId, 0, 0, 32, 28, 1, height - 2, 0, 2, height, get_current_rotation()); + + // height += 2 (height) + if (mapElement->properties.track.type == TRACK_ELEM_END_STATION) { + imageId = junior_rc_track_pieces_block_brake[isBraked][direction] | RCT2_GLOBAL(0x00F44198, uint32); + }else{ + imageId = junior_rc_track_pieces_station[false][direction] | RCT2_GLOBAL(0x00F44198, uint32); + } + sub_98199C(imageId, 0, 6, 32, 20, 1, height, 0, 0, height, get_current_rotation()); + + metal_a_supports_paint_setup(3, 5, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + metal_a_supports_paint_setup(3, 8, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + + paint_util_push_tunnel_left(height, TUNNEL_6); + } else if (direction == 1 || direction == 3) { + // height -= 2 (height - 2) + imageId = SPR_STATION_BASE_B_NW_SE | RCT2_GLOBAL(0x00F441A0, uint32); + sub_98197C(imageId, 0, 0, 28, 32, 1, height - 2, 2, 0, height, get_current_rotation()); + + // height += 2 (height) + if (mapElement->properties.track.type == TRACK_ELEM_END_STATION) { + imageId = junior_rc_track_pieces_block_brake[isBraked][direction] | RCT2_GLOBAL(0x00F44198, uint32); + }else{ + imageId = junior_rc_track_pieces_station[false][direction] | RCT2_GLOBAL(0x00F44198, uint32); + } + sub_98199C(imageId, 6, 0, 20, 32, 1, height, 0, 0, height, get_current_rotation()); + + metal_a_supports_paint_setup(3, 6, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + metal_a_supports_paint_setup(3, 7, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + paint_util_push_tunnel_right(height, TUNNEL_6); + } + + track_paint_util_draw_station(rideIndex, trackSequence, direction, height, mapElement); + + paint_util_set_segment_support_height(SEGMENTS_ALL, 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +/* rct2: 0x0051881E */ +static void junior_rc_25_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + + uint32 image_id = RCT2_GLOBAL(0x00F44198, uint32); + + bool isChained = mapElement->type & (1 << 7); + + image_id |= junior_rc_track_pieces_25_deg_up[isChained][direction]; + + if (direction & 1) { + sub_98196C(image_id, 6, 0, 20, 32, 1, height, get_current_rotation()); + paint_util_push_tunnel_right(height, TUNNEL_2); + } + else { + sub_98196C(image_id, 0, 6, 32, 20, 1, height, get_current_rotation()); + paint_util_push_tunnel_left(height, TUNNEL_1); + } + + const rct_xy16 pos = {RCT2_GLOBAL(0x009DE56A, sint16), RCT2_GLOBAL(0x009DE56E, sint16)}; + + if (track_paint_util_should_paint_supports(pos)) { + int edi = direction & 1 ? 2 : 1; + metal_a_supports_paint_setup(edi, 4, 8, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 56, 0x20); +} + +/* rct2: 0x00518B42 */ +static void junior_rc_flat_to_25_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + uint32 image_id = RCT2_GLOBAL(0x00F44198, uint32); + + bool isChained = mapElement->type & (1 << 7); + + image_id |= junior_rc_track_pieces_flat_to_25_deg_up[isChained][direction]; + + if (direction & 1) { + sub_98196C(image_id, 6, 0, 20, 32, 1, height, get_current_rotation()); + paint_util_push_tunnel_right(height, TUNNEL_0); + } + else { + sub_98196C(image_id, 0, 6, 32, 20, 1, height, get_current_rotation()); + paint_util_push_tunnel_left(height, TUNNEL_0); + } + + const rct_xy16 pos = {RCT2_GLOBAL(0x009DE56A, sint16), RCT2_GLOBAL(0x009DE56E, sint16)}; + + if (track_paint_util_should_paint_supports(pos)) { + int edi = direction & 1 ? 2 : 1; + uint16 ax = (direction == 0) ? 5 : 3; + metal_a_supports_paint_setup(edi, 4, ax, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 48, 0x20); +} + +/* rct2: 0x00518E56 */ +static void junior_rc_25_deg_up_to_flat_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + uint32 image_id = RCT2_GLOBAL(0x00F44198, uint32); + + bool isChained = mapElement->type & (1 << 7); + + image_id |= junior_rc_track_pieces_25_deg_up_to_flat[isChained][direction]; + + uint8 tunnelType; + sint16 tunnelHeight; + if (direction == 1 || direction == 2) { + tunnelType = TUNNEL_12; + tunnelHeight = height + 8; + } + else { + tunnelType = TUNNEL_0; + tunnelHeight = height - 8; + } + + if (direction & 1) { + sub_98196C(image_id, 6, 0, 20, 32, 1, height, get_current_rotation()); + paint_util_push_tunnel_right(tunnelHeight, tunnelType); + } + else { + sub_98196C(image_id, 0, 6, 32, 20, 1, height, get_current_rotation()); + paint_util_push_tunnel_left(tunnelHeight, tunnelType); + } + + const rct_xy16 pos = {RCT2_GLOBAL(0x009DE56A, sint16), RCT2_GLOBAL(0x009DE56E, sint16)}; + + if (track_paint_util_should_paint_supports(pos)) { + int edi = direction & 1 ? 2 : 1; + metal_a_supports_paint_setup(edi, 4, 6, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 40, 0x20); +} + +/* rct2: 0x005189B0 */ +static void junior_rc_25_deg_down_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + + junior_rc_25_deg_up_paint_setup(rideIndex, trackSequence, (direction + 2) & 3, height, mapElement); +} + +/* rct2: 0x00518FE8 */ +static void junior_rc_flat_to_25_deg_down_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + + junior_rc_25_deg_up_to_flat_paint_setup(rideIndex, trackSequence, (direction + 2) & 3, height, mapElement); +} + +/* rct2: 0x00518CCC */ +static void junior_rc_25_deg_down_to_flat_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + + junior_rc_flat_to_25_deg_up_paint_setup(rideIndex, trackSequence, (direction + 2) & 3, height, mapElement); +} + +static const sint8 junior_rc_track_right_quarter_turn_5_tiles_support_height_offset[][7] = { + {0, 0, 0, 0, 0, 0, -1}, + {-1, 0, 0, 0, 0, 0, 0}, + {0}, + {0, 0, 0, 0, 0, 0, 0}, +}; + +static void junior_rc_right_quarter_turn_5_tiles_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + track_paint_util_right_quarter_turn_5_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_flat_quarter_turn_5_tiles, defaultRightQuarterTurn5TilesOffsets, defaultRightQuarterTurn5TilesBoundLengths, defaultRightQuarterTurn5TilesOffsets, get_current_rotation()); + + + int supportHeight = height + junior_rc_track_right_quarter_turn_5_tiles_support_height_offset[direction][trackSequence]; + switch (trackSequence) { + case 0: + metal_a_supports_paint_setup((direction & 1) ? 2 : 1, 4, 0, supportHeight, RCT2_GLOBAL(0x00F4419C, uint32)); + break; + case 6: + metal_a_supports_paint_setup((direction & 1) ? 1 : 2, 4, 0, supportHeight, RCT2_GLOBAL(0x00F4419C, uint32)); + break; + } + + if (direction == 0 && trackSequence == 0) { + paint_util_push_tunnel_left(height, TUNNEL_0); + } + + if (direction == 0 && trackSequence == 6) { + paint_util_push_tunnel_right(height, TUNNEL_0); + } + + if (direction == 1 && trackSequence == 6) { + paint_util_push_tunnel_left(height, TUNNEL_0); + } + + if (direction == 3 && trackSequence == 0) { + paint_util_push_tunnel_right(height, TUNNEL_0); + } + + switch (trackSequence) { + case 0: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC, direction), 0xFFFF, 0); break; + case 2: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_C4 | SEGMENT_D4 | SEGMENT_BC | SEGMENT_C0 | SEGMENT_CC, direction), 0xFFFF, 0); break; + case 3: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_C4, direction), 0xFFFF, 0); break; + case 5: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D4 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C8, direction), 0xFFFF, 0); break; + case 6: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8, direction), 0xFFFF, 0); break; + } + + paint_util_set_general_support_height(height + 32, 0x20); +} + +static const uint8 left_quarter_turn_5_tiles_to_right_turn_map[] = {6, 4, 5, 3, 1, 2, 0}; + +/* rct2: 0x0051917A */ +static void junior_rc_left_quarter_turn_5_tiles_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + trackSequence = left_quarter_turn_5_tiles_to_right_turn_map[trackSequence]; + junior_rc_right_quarter_turn_5_tiles_paint_setup(rideIndex, trackSequence, (direction + 1) % 4, height, mapElement); +} + +/** + * rct2: 0x008AAFC0, 0x00521593, 0x005216A1, 0x005217AF, 0x00521884 + */ +static void junior_rc_flat_to_left_bank_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + uint32 image_id; + + image_id = junior_rc_track_pieces_flat_to_left_bank[direction][0] | RCT2_GLOBAL(0x00F44198, uint32); + if (direction & 1) { + sub_98197C(image_id, 0, 0, 20, 32, 1, height, 6, 0, height, get_current_rotation()); + + paint_util_push_tunnel_right(height, 0); + } + else { + sub_98197C(image_id, 0, 0, 32, 20, 1, height, 0, 6, height, get_current_rotation()); + + paint_util_push_tunnel_left(height, 0); + } + + if (junior_rc_track_pieces_flat_to_left_bank[direction][1] != 0) { + image_id = junior_rc_track_pieces_flat_to_left_bank[direction][1] | RCT2_GLOBAL(0x00F44198, uint32); + + if (direction & 1) { + sub_98197C(image_id, 0, 0, 1, 32, 26, height, 27, 0, height, get_current_rotation()); + } + else { + sub_98197C(image_id, 0, 0, 32, 1, 26, height, 0, 27, height, get_current_rotation()); + } + } + + const rct_xy16 pos = {RCT2_GLOBAL(0x009DE56A, sint16), RCT2_GLOBAL(0x009DE56E, sint16)}; + if (track_paint_util_should_paint_supports(pos)) { + int edi = direction & 1 ? 2 : 1; + metal_a_supports_paint_setup(edi, 4, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** + * rct2: 0x008AAFD0, 0x00521959, 0x00521A2E, 0x00521B03, 0x00521C11 + */ +static void junior_rc_flat_to_right_bank_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + uint32 image_id; + + image_id = junior_rc_track_pieces_flat_to_right_bank[direction][0] | RCT2_GLOBAL(0x00F44198, uint32); + if (direction & 1) { + sub_98197C(image_id, 0, 0, 20, 32, 1, height, 6, 0, height, get_current_rotation()); + + paint_util_push_tunnel_right(height, 0); + } + else { + sub_98197C(image_id, 0, 0, 32, 20, 1, height, 0, 6, height, get_current_rotation()); + + paint_util_push_tunnel_left(height, 0); + } + + if (junior_rc_track_pieces_flat_to_right_bank[direction][1] != 0) { + image_id = junior_rc_track_pieces_flat_to_right_bank[direction][1] | RCT2_GLOBAL(0x00F44198, uint32); + + if (direction & 1) { + sub_98197C(image_id, 0, 0, 1, 32, 26, height, 27, 0, height, get_current_rotation()); + } + else { + sub_98197C(image_id, 0, 0, 32, 1, 26, height, 0, 27, height, get_current_rotation()); + } + } + + const rct_xy16 pos = {RCT2_GLOBAL(0x009DE56A, sint16), RCT2_GLOBAL(0x009DE56E, sint16)}; + if (track_paint_util_should_paint_supports(pos)) { + int edi = direction & 1 ? 2 : 1; + metal_a_supports_paint_setup(edi, 4, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +static void junior_rc_left_bank_to_flat_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + junior_rc_flat_to_right_bank_paint_setup(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); +} + +static void junior_rc_right_bank_to_flat_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + junior_rc_flat_to_left_bank_paint_setup(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); +} + +/* rct2: 0x008AB010, 0x0052304C */ +static void junior_rc_banked_right_quarter_turn_5_tiles_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + track_paint_util_right_quarter_turn_5_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_banked_quarter_turn_5_tiles, NULL, defaultRightQuarterTurn5TilesBoundLengths, defaultRightQuarterTurn5TilesOffsets, get_current_rotation()); + + if (direction == 1 && trackSequence == 6) { + uint32 imageId = SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_NW_SW_PART_4_2 | RCT2_GLOBAL(0x00F44198, uint32); + sub_98197C(imageId, 0, 0, 32, 1, 26, height, 0, 27, height, get_current_rotation()); + } + else if (direction == 3 && trackSequence == 0) { + uint32 imageId = SPR_JUNIOR_RC_BANKED_QUARTER_TURN_5_TILES_SE_NE_PART_0_2 | RCT2_GLOBAL(0x00F44198, uint32); + sub_98197C(imageId, 0, 0, 1, 32, 26, height, 27, 0, height, get_current_rotation()); + } + + int supportHeight = height + junior_rc_track_right_quarter_turn_5_tiles_support_height_offset[direction][trackSequence]; + switch (trackSequence) { + case 0: + metal_a_supports_paint_setup((direction & 1) ? 2 : 1, 4, 0, supportHeight, RCT2_GLOBAL(0x00F4419C, uint32)); + break; + case 6: + metal_a_supports_paint_setup((direction & 1) ? 1 : 2, 4, 0, supportHeight, RCT2_GLOBAL(0x00F4419C, uint32)); + break; + } + + if (direction == 0 && trackSequence == 0) { + paint_util_push_tunnel_left(height, TUNNEL_0); + } + + if (direction == 0 && trackSequence == 6) { + paint_util_push_tunnel_right(height, TUNNEL_0); + } + + if (direction == 1 && trackSequence == 6) { + paint_util_push_tunnel_left(height, TUNNEL_0); + } + + if (direction == 3 && trackSequence == 0) { + paint_util_push_tunnel_right(height, TUNNEL_0); + } + + switch (trackSequence) { + case 0: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC, direction), 0xFFFF, 0); break; + case 2: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_C4 | SEGMENT_D4 | SEGMENT_BC | SEGMENT_C0 | SEGMENT_CC, direction), 0xFFFF, 0); break; + case 3: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_C4, direction), 0xFFFF, 0); break; + case 5: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D4 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C8, direction), 0xFFFF, 0); break; + case 6: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8, direction), 0xFFFF, 0); break; + } + + paint_util_set_general_support_height(height + 32, 0x20); +} + +/* rct2: 0x008AB000 */ +static void junior_rc_banked_left_quarter_turn_5_tiles_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + trackSequence = left_quarter_turn_5_tiles_to_right_turn_map[trackSequence]; + junior_rc_banked_right_quarter_turn_5_tiles_paint_setup(rideIndex, trackSequence, (direction + 1) % 4, height, mapElement); +} + +/** + * rct2: 0x008AB020, 0x00522073, 0x00522182, 0x00522291, 0x00522367 + */ +static void junior_rc_left_bank_to_25_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + uint32 image_id; + + image_id = junior_rc_track_pieces_left_banked_to_25_deg_up[direction][0] | RCT2_GLOBAL(0x00F44198, uint32); + if (direction & 1) { + sub_98197C(image_id, 0, 0, 20, 32, 1, height, 6, 0, height, get_current_rotation()); + + paint_util_push_tunnel_right(height, 0); + } + else { + sub_98197C(image_id, 0, 0, 32, 20, 1, height, 0, 6, height, get_current_rotation()); + + paint_util_push_tunnel_left(height, 0); + } + + if (junior_rc_track_pieces_left_banked_to_25_deg_up[direction][1] != 0) { + image_id = junior_rc_track_pieces_left_banked_to_25_deg_up[direction][1] | RCT2_GLOBAL(0x00F44198, uint32); + + if (direction & 1) { + sub_98197C(image_id, 0, 0, 1, 32, 34, height, 27, 0, height, get_current_rotation()); + } + else { + sub_98197C(image_id, 0, 0, 32, 1, 34, height, 0, 27, height, get_current_rotation()); + } + } + + const rct_xy16 pos = {RCT2_GLOBAL(0x009DE56A, sint16), RCT2_GLOBAL(0x009DE56E, sint16)}; + if (track_paint_util_should_paint_supports(pos)) { + int edi = direction & 1 ? 2 : 1; + metal_a_supports_paint_setup(edi, 4, 3, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 48, 0x20); +} + +/** + * rct2: 0x008AB030, 0x0052243D, 0x00522513, 0x005225E9, 0x005226F8 + */ +static void junior_rc_right_bank_to_25_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + uint32 image_id; + + image_id = junior_rc_track_pieces_right_banked_to_25_deg_up[direction][0] | RCT2_GLOBAL(0x00F44198, uint32); + if (direction & 1) { + sub_98197C(image_id, 0, 0, 20, 32, 1, height, 6, 0, height, get_current_rotation()); + + paint_util_push_tunnel_right(height, 0); + } + else { + sub_98197C(image_id, 0, 0, 32, 20, 1, height, 0, 6, height, get_current_rotation()); + + paint_util_push_tunnel_left(height, 0); + } + + if (junior_rc_track_pieces_right_banked_to_25_deg_up[direction][1] != 0) { + image_id = junior_rc_track_pieces_right_banked_to_25_deg_up[direction][1] | RCT2_GLOBAL(0x00F44198, uint32); + + if (direction & 1) { + sub_98197C(image_id, 0, 0, 1, 32, 34, height, 27, 0, height, get_current_rotation()); + } + else { + sub_98197C(image_id, 0, 0, 32, 1, 34, height, 0, 27, height, get_current_rotation()); + } + } + + const rct_xy16 pos = {RCT2_GLOBAL(0x009DE56A, sint16), RCT2_GLOBAL(0x009DE56E, sint16)}; + if (track_paint_util_should_paint_supports(pos)) { + int edi = direction & 1 ? 2 : 1; + metal_a_supports_paint_setup(edi, 4, 3, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 48, 0x20); +} + +/** + * rct2: 0x008AB040, 0x00522807, 0x0052291A, 0x00522A2D, 0x00522B07 + */ +static void junior_rc_25_deg_up_to_left_bank_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + uint32 image_id; + + uint8 tunnelType; + sint16 tunnelHeight; + if (direction == 1 || direction == 2) { + tunnelType = TUNNEL_12; + tunnelHeight = height + 8; + } + else { + tunnelType = TUNNEL_0; + tunnelHeight = height - 8; + } + + image_id = junior_rc_track_pieces_25_deg_up_to_left_bank[direction][0] | RCT2_GLOBAL(0x00F44198, uint32); + if (direction & 1) { + sub_98197C(image_id, 0, 0, 20, 32, 1, height, 6, 0, height, get_current_rotation()); + + paint_util_push_tunnel_right(tunnelHeight, tunnelType); + } + else { + sub_98197C(image_id, 0, 0, 32, 20, 1, height, 0, 6, height, get_current_rotation()); + + paint_util_push_tunnel_left(tunnelHeight, tunnelType); + } + + if (junior_rc_track_pieces_25_deg_up_to_left_bank[direction][1] != 0) { + image_id = junior_rc_track_pieces_25_deg_up_to_left_bank[direction][1] | RCT2_GLOBAL(0x00F44198, uint32); + + if (direction & 1) { + sub_98197C(image_id, 0, 0, 1, 32, 34, height, 27, 0, height, get_current_rotation()); + } + else { + sub_98197C(image_id, 0, 0, 32, 1, 34, height, 0, 27, height, get_current_rotation()); + } + } + + const rct_xy16 pos = {RCT2_GLOBAL(0x009DE56A, sint16), RCT2_GLOBAL(0x009DE56E, sint16)}; + if (track_paint_util_should_paint_supports(pos)) { + int edi = direction & 1 ? 2 : 1; + metal_a_supports_paint_setup(edi, 4, 6, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 40, 0x20); +} + +/** + * rct2: 0x008AB050, 0x00522BE1, 0x00522CBB, 0x00522D95, 0x00522EA8 + */ +static void junior_rc_25_deg_up_to_right_bank_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + uint32 image_id; + + uint8 tunnelType; + sint16 tunnelHeight; + if (direction == 1 || direction == 2) { + tunnelType = TUNNEL_12; + tunnelHeight = height + 8; + } + else { + tunnelType = TUNNEL_0; + tunnelHeight = height - 8; + } + + image_id = junior_rc_track_pieces_25_deg_up_to_right_bank[direction][0] | RCT2_GLOBAL(0x00F44198, uint32); + if (direction & 1) { + sub_98197C(image_id, 0, 0, 20, 32, 1, height, 6, 0, height, get_current_rotation()); + + paint_util_push_tunnel_right(tunnelHeight, tunnelType); + } + else { + sub_98197C(image_id, 0, 0, 32, 20, 1, height, 0, 6, height, get_current_rotation()); + + paint_util_push_tunnel_left(tunnelHeight, tunnelType); + } + + if (junior_rc_track_pieces_25_deg_up_to_right_bank[direction][1] != 0) { + image_id = junior_rc_track_pieces_25_deg_up_to_right_bank[direction][1] | RCT2_GLOBAL(0x00F44198, uint32); + + if (direction & 1) { + sub_98197C(image_id, 0, 0, 1, 32, 34, height, 27, 0, height, get_current_rotation()); + } + else { + sub_98197C(image_id, 0, 0, 32, 1, 34, height, 0, 27, height, get_current_rotation()); + } + } + + const rct_xy16 pos = {RCT2_GLOBAL(0x009DE56A, sint16), RCT2_GLOBAL(0x009DE56E, sint16)}; + if (track_paint_util_should_paint_supports(pos)) { + int edi = direction & 1 ? 2 : 1; + metal_a_supports_paint_setup(edi, 4, 6, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 40, 0x20); +} + +/** + * rct2: 0x008AB060 + */ +static void junior_rc_left_bank_to_25_deg_down_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + junior_rc_25_deg_up_to_right_bank_paint_setup(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); +} + +/** + * rct2: 0x008AB070 + */ +static void junior_rc_right_bank_to_25_deg_down_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + junior_rc_25_deg_up_to_left_bank_paint_setup(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); +} + +/** + * rct2: 0x008AB080 + */ +static void junior_rc_25_deg_down_to_left_bank_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + junior_rc_right_bank_to_25_deg_up_paint_setup(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); +} + +/** + * rct2: 0x008AB090 + */ +static void junior_rc_25_deg_down_to_right_bank_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + junior_rc_left_bank_to_25_deg_up_paint_setup(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); +} + +/** + * rct2: 0x008AB0A0, 0x00521D1F, 0x00521DF4, 0x00521EC9, 0x00521F9E + */ +static void junior_rc_left_bank_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + uint32 image_id; + + image_id = junior_rc_track_pieces_left_bank[direction] | RCT2_GLOBAL(0x00F44198, uint32); + if (direction & 1) { + sub_98197C(image_id, 0, 0, 1, 32, 26, height, 27, 0, height, get_current_rotation()); + + paint_util_push_tunnel_right(height, 0); + } + else { + sub_98197C(image_id, 0, 0, 32, 1, 26, height, 0, 27, height, get_current_rotation()); + + paint_util_push_tunnel_left(height, 0); + } + + const rct_xy16 pos = {RCT2_GLOBAL(0x009DE56A, sint16), RCT2_GLOBAL(0x009DE56E, sint16)}; + if (track_paint_util_should_paint_supports(pos)) { + int edi = direction & 1 ? 2 : 1; + metal_a_supports_paint_setup(edi, 4, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** + * rct2: 0x008AB0B0 + */ +static void junior_rc_right_bank_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + junior_rc_left_bank_paint_setup(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); +} + +/* rct2: 0x008AAE10, 0x00519D88, 0x00519DAC, 0x00519DD0, 0x00519DF4 */ +static void junior_rc_banked_left_quarter_turn_5_tiles_25_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + bool isChained = mapElement->type & (1 << 7); + track_paint_util_right_quarter_turn_5_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_left_quarter_turn_5_tiles_25_deg_up[isChained], junior_rc_left_quarter_turn_5_tiles_25_deg_up_offsets, defaultRightQuarterTurn5TilesBoundLengths, NULL, get_current_rotation()); + + switch (trackSequence) { + case 0: + metal_a_supports_paint_setup((direction & 1) ? 2 : 1, 4, (direction == 0 || direction == 3) ? 10 : 8, height, RCT2_GLOBAL(0x00F4419C, uint32)); + break; + case 6: + metal_a_supports_paint_setup((direction & 1) ? 1 : 2, 4, 8, height, RCT2_GLOBAL(0x00F4419C, uint32)); + break; + } + + if (direction == 0 && trackSequence == 0) { + paint_util_push_tunnel_left(height - 8, TUNNEL_1); + } + if (direction == 2 && trackSequence == 6) { + paint_util_push_tunnel_right(height + 8, TUNNEL_2); + } + if (direction == 3 && trackSequence == 0) { + paint_util_push_tunnel_right(height - 8, TUNNEL_1); + } + if (direction == 3 && trackSequence == 6) { + paint_util_push_tunnel_left(height + 8, TUNNEL_2); + } + + switch (trackSequence) { + case 0: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B4, direction), 0xFFFF, 0); break; + case 2: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_C4 | SEGMENT_B4 | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF, 0); break; + case 3: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D4 | SEGMENT_BC | SEGMENT_CC | SEGMENT_C4, direction), 0xFFFF, 0); break; + case 5: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D4 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C8, direction), 0xFFFF, 0); break; + case 6: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_C0, direction), 0xFFFF, 0); break; + } + if (trackSequence == 3) { + paint_util_set_general_support_height(height + 64, 0x20); + } + else { + paint_util_set_general_support_height(height + 72, 0x20); + } +} + +/* rct2: 0x008AAE20, 0x00519E18, 0x0051A148, 0x0051A452, 0x0051A738 */ +static void junior_rc_banked_right_quarter_turn_5_tiles_25_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + bool isChained = mapElement->type & (1 << 7); + track_paint_util_right_quarter_turn_5_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_right_quarter_turn_5_tiles_25_deg_up[isChained], defaultRightQuarterTurn5TilesOffsets, defaultRightQuarterTurn5TilesBoundLengths, NULL, get_current_rotation()); + + uint8 supportSpecial[4] = { 11, 8, 8, 7 }; + switch (trackSequence) { + case 0: + metal_a_supports_paint_setup((direction & 1) ? 2 : 1, 4, supportSpecial[direction], height, RCT2_GLOBAL(0x00F4419C, uint32)); + break; + case 6: + metal_a_supports_paint_setup((direction & 1) ? 1 : 2, 4, 8, height, RCT2_GLOBAL(0x00F4419C, uint32)); + break; + } + + if (direction == 0 && trackSequence == 0) { + paint_util_push_tunnel_left(height - 8, TUNNEL_1); + } + if (direction == 0 && trackSequence == 6) { + paint_util_push_tunnel_right(height + 8, TUNNEL_2); + } + if (direction == 3 && trackSequence == 0) { + paint_util_push_tunnel_right(height - 8, TUNNEL_1); + } + if (direction == 1 && trackSequence == 6) { + paint_util_push_tunnel_left(height + 8, TUNNEL_2); + } + + switch (trackSequence) { + case 0: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC, direction), 0xFFFF, 0); break; + case 2: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_C4 | SEGMENT_D4 | SEGMENT_BC | SEGMENT_C0 | SEGMENT_CC, direction), 0xFFFF, 0); break; + case 3: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_C4, direction), 0xFFFF, 0); break; + case 5: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D4 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C8, direction), 0xFFFF, 0); break; + case 6: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8, direction), 0xFFFF, 0); break; + } + if (trackSequence == 3) { + paint_util_set_general_support_height(height + 64, 0x20); + } + else { + paint_util_set_general_support_height(height + 72, 0x20); + } +} + +/* rct2: 0x008AAE30, 0x0051AA42, 0x0051AA68, 0x0051AA8C, 0x0051AAB0 */ +static void junior_rc_banked_left_quarter_turn_5_tiles_25_deg_down_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + junior_rc_banked_right_quarter_turn_5_tiles_25_deg_up_paint_setup(rideIndex, left_quarter_turn_5_tiles_to_right_turn_map[trackSequence], (direction + 1) & 3, height, mapElement); +} + +/* rct2: 0x008AAE40, 0x0051AAD4, 0x0051AE04, 0x0051B10E, 0x0051B3F4 */ +static void junior_rc_banked_right_quarter_turn_5_tiles_25_deg_down_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + junior_rc_banked_left_quarter_turn_5_tiles_25_deg_up_paint_setup(rideIndex, left_quarter_turn_5_tiles_to_right_turn_map[trackSequence], (direction - 1) & 3, height, mapElement); +} + +/* rct2: 0x008AAE50, 0x0051B6FE, 0x0051B946, 0x0051BB8E, 0x0051BBA8 */ +static void junior_rc_s_bend_left_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + if (direction == 2 || direction == 3) { + trackSequence = 3 - trackSequence; + } + + const rct_xy16 offsetList[] = { + {0, 6}, + {0, 0}, + {0, 6}, + {0, 6}, + }; + + const rct_xy16 boundsList[] = { + {32, 20}, + {32, 26}, + {32, 26}, + {32, 20}, + }; + + uint32 imageId = junior_rc_track_pieces_s_bend_left[direction & 1][trackSequence] | RCT2_GLOBAL(0x00F44198, uint32); + rct_xy16 offset = offsetList[trackSequence]; + rct_xy16 bounds = boundsList[trackSequence]; + if (direction == 0 || direction == 2) { + sub_98196C(imageId, (sint8) offset.x, (sint8) offset.y, bounds.x, bounds.y, 3, height, get_current_rotation()); + } else { + sub_98196C(imageId, (sint8) offset.y, (sint8) offset.x, bounds.y, bounds.x, 3, height, get_current_rotation()); + } + + if (direction == 0 || direction == 2) { + if (trackSequence == 0) { + paint_util_push_tunnel_left(height, TUNNEL_0); + } + + switch (trackSequence) { + case 0: metal_a_supports_paint_setup(1, 4, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); break; + case 1: metal_a_supports_paint_setup(1, 5, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); break; + case 3: metal_a_supports_paint_setup(1, 4, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); break; + } + } else { + if (trackSequence == 3) { + paint_util_push_tunnel_right(height, TUNNEL_0); + } + + switch (trackSequence) { + case 0: metal_a_supports_paint_setup(2, 4, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); break; + case 1: metal_a_supports_paint_setup(2, 6, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); break; + case 3: metal_a_supports_paint_setup(2, 4, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); break; + } + } + + int blockedSegments = 0; + switch (trackSequence) { + case 0: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B4; break; + case 1: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_B4; break; + case 2: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_C0 | SEGMENT_D4 | SEGMENT_BC; break; + case 3: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_C0; break; + } + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction & 1), 0xFFFF, 0); + + paint_util_set_general_support_height(height + 32, 0x20); +} + +/* rct2: 0x008AAE60, 0x0051BBC0, 0x0051BE06, 0x0051C04E, 0x0051C068 */ +static void junior_rc_s_bend_right_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + if (direction == 2 || direction == 3) { + trackSequence = 3 - trackSequence; + } + + const rct_xy16 offsetList[] = { + {0, 6}, + {0, 6}, + {0, 0}, + {0, 6}, + }; + + const rct_xy16 boundsList[] = { + {32, 20}, + {32, 26}, + {32, 26}, + {32, 20}, + }; + + uint32 imageId = junior_rc_track_pieces_s_bend_right[direction&1][trackSequence] | RCT2_GLOBAL(0x00F44198, uint32); + rct_xy16 offset = offsetList[trackSequence]; + rct_xy16 bounds = boundsList[trackSequence]; + if (direction == 0 || direction == 2) { + sub_98196C(imageId, (sint8) offset.x, (sint8) offset.y, bounds.x, bounds.y, 3, height, get_current_rotation()); + } else { + sub_98196C(imageId, (sint8) offset.y, (sint8) offset.x, bounds.y, bounds.x, 3, height, get_current_rotation()); + } + + if (direction == 0 || direction == 2) { + if (trackSequence == 0) { + paint_util_push_tunnel_left(height, TUNNEL_0); + } + + switch (trackSequence) { + case 0: metal_a_supports_paint_setup(1, 4, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); break; + case 1: metal_a_supports_paint_setup(1, 8, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); break; + case 3: metal_a_supports_paint_setup(1, 4, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); break; + } + } else { + if (trackSequence == 3) { + paint_util_push_tunnel_right(height, TUNNEL_0); + } + + switch (trackSequence) { + case 0: metal_a_supports_paint_setup(2, 4, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); break; + case 1: metal_a_supports_paint_setup(2, 7, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); break; + case 3: metal_a_supports_paint_setup(2, 4, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); break; + } + } + + int blockedSegments = 0; + switch (trackSequence) { + case 0: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC; break; + case 1: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_C0 | SEGMENT_D4 | SEGMENT_BC; break; + case 2: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_B4; break; + case 3: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8; break; + } + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction & 1), 0xFFFF, 0); + + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AAEB0, 0x0051C0E0, 0x0051C2C1, 0x0051C47F, 0x0051C61D */ +static void junior_rc_right_quarter_turn_3_tiles_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + track_paint_util_right_quarter_turn_3_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_flat_quarter_turn_3_tiles, defaultRightQuarterTurn3TilesOffsets, defaultRightQuarterTurn3TilesBoundLengths, NULL, get_current_rotation()); + track_paint_util_right_quarter_turn_3_tiles_tunnel(height, direction, trackSequence, TUNNEL_0); + + uint8 supportType[2][4] = { + { 1, 0, 0, 2}, + { 2, 0, 0, 1} + }; + switch (trackSequence) { + case 0: + case 3: + metal_a_supports_paint_setup(supportType[direction & 1][trackSequence], 4, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + break; + } + + int blockedSegments = 0; + switch (trackSequence) { + case 0: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC; break; + case 2: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_D4 | SEGMENT_C0; break; + case 3: blockedSegments = SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8; break; + } + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AAEA0 */ +static void junior_rc_left_quarter_turn_3_tiles_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + trackSequence = mapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence]; + junior_rc_right_quarter_turn_3_tiles_paint_setup(rideIndex, trackSequence, (direction + 1) % 4, height, mapElement); +} + +/** rct2: 0x008AA0D0, 0x00523EA0, 0x005240CC, 0x0052430F, 0x00524500*/ +static void junior_rc_right_quarter_turn_3_tiles_bank_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + track_paint_util_right_quarter_turn_3_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_banked_quarter_turn_3_tiles, NULL, defaultRightQuarterTurn3TilesBoundLengths, defaultRightQuarterTurn3TilesOffsets, get_current_rotation()); + track_paint_util_right_quarter_turn_3_tiles_tunnel(height, direction, trackSequence, TUNNEL_0); + + if (direction == 1 && trackSequence == 3) { + uint32 imageId = SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_NW_SW_PART_2_2 | RCT2_GLOBAL(0x00F44198, uint32); + sub_98197C(imageId, 0, 0, 32, 1, 26, height, 0, 27, height, get_current_rotation()); + } + else if (direction == 3 && trackSequence == 0) { + uint32 imageId = SPR_JUNIOR_RC_BANKED_QUARTER_TURN_3_TILES_SE_NE_PART_0_2 | RCT2_GLOBAL(0x00F44198, uint32); + sub_98197C(imageId, 0, 0, 1, 32, 26, height, 27, 0, height, get_current_rotation()); + } + + uint8 supportType[2][4] = { + { 1, 0, 0, 2}, + { 2, 0, 0, 1} + }; + switch (trackSequence) { + case 0: + case 3: + metal_a_supports_paint_setup(supportType[direction & 1][trackSequence], 4, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + break; + } + + int blockedSegments = 0; + switch (trackSequence) { + case 0: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC; break; + case 2: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_D4 | SEGMENT_C0; break; + case 3: blockedSegments = SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8; break; + } + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AA0C0 */ +static void junior_rc_left_quarter_turn_3_tiles_bank_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + trackSequence = mapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence]; + junior_rc_right_quarter_turn_3_tiles_bank_paint_setup(rideIndex, trackSequence, (direction + 1) % 4, height, mapElement); +} + +/** rct2: 0x008AAED0, 0x0051C83C, 0x0051C9EC, 0x0051CB76, 0x0051CCDC*/ +static void junior_rc_right_quarter_turn_3_tiles_25_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + bool isChained = mapElement->type & (1 << 7); + uint32 imageId = 0; + rct_xy16 offset; + rct_xy16 boundsLength; + rct_xy16 boundsOffset; + + switch (trackSequence) { + case 0: + imageId = junior_rc_track_pieces_right_quarter_turn_3_tiles_25_deg_up[isChained][direction][0] | RCT2_GLOBAL(0x00F44198, uint32); + offset = defaultRightQuarterTurn3TilesOffsets[direction][0]; + boundsLength = defaultRightQuarterTurn3TilesBoundLengths[direction][0]; + boundsOffset = offset; + break; + case 3: + imageId = junior_rc_track_pieces_right_quarter_turn_3_tiles_25_deg_up[isChained][direction][1] | RCT2_GLOBAL(0x00F44198, uint32); + offset = defaultRightQuarterTurn3TilesOffsets[direction][2]; + boundsLength = defaultRightQuarterTurn3TilesBoundLengths[direction][2]; + boundsOffset = offset; + break; + } + if (imageId != 0) + sub_98197C(imageId, (sint8)offset.x, (sint8)offset.y, boundsLength.x, boundsLength.y, 1, height, boundsOffset.x, boundsOffset.y, height, get_current_rotation()); + + + if (direction == 0 && trackSequence == 0) { + paint_util_push_tunnel_left(height - 8, TUNNEL_1); + } + + if (direction == 0 && trackSequence == 3) { + paint_util_push_tunnel_right(height + 8, TUNNEL_2); + } + + if (direction == 1 && trackSequence == 3) { + paint_util_push_tunnel_left(height + 8, TUNNEL_2); + } + + if (direction == 3 && trackSequence == 0) { + paint_util_push_tunnel_right(height - 8, TUNNEL_1); + } + + uint8 supportType[2][4] = { + { 1, 0, 0, 2}, + { 2, 0, 0, 1} + }; + switch (trackSequence) { + case 0: + case 3: + metal_a_supports_paint_setup(supportType[direction & 1][trackSequence], 4, 8, height, RCT2_GLOBAL(0x00F4419C, uint32)); + break; + } + + int blockedSegments = 0; + switch (trackSequence) { + case 0: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC; break; + case 3: blockedSegments = SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8; break; + } + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + + if (trackSequence == 0 || trackSequence == 3) + paint_util_set_general_support_height(height + 72, 0x20); + else + paint_util_set_general_support_height(height + 56, 0x20); +} + +/** rct2: 0x008AAEF0, 0x0051CEC8, 0x0051D078, 0x0051D202, 0x0051D368*/ +static void junior_rc_right_quarter_turn_3_tiles_25_deg_down_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + bool isChained = mapElement->type & (1 << 7); + uint32 imageId = 0; + rct_xy16 offset; + rct_xy16 boundsLength; + rct_xy16 boundsOffset; + + switch (trackSequence) { + case 0: + imageId = junior_rc_track_pieces_right_quarter_turn_3_tiles_25_deg_down[isChained][direction][0] | RCT2_GLOBAL(0x00F44198, uint32); + offset = defaultRightQuarterTurn3TilesOffsets[direction][0]; + boundsLength = defaultRightQuarterTurn3TilesBoundLengths[direction][0]; + boundsOffset = offset; + break; + case 3: + imageId = junior_rc_track_pieces_right_quarter_turn_3_tiles_25_deg_down[isChained][direction][1] | RCT2_GLOBAL(0x00F44198, uint32); + offset = defaultRightQuarterTurn3TilesOffsets[direction][2]; + boundsLength = defaultRightQuarterTurn3TilesBoundLengths[direction][2]; + boundsOffset = offset; + break; + } + if (imageId != 0) + sub_98197C(imageId, (sint8)offset.x, (sint8)offset.y, boundsLength.x, boundsLength.y, 1, height, boundsOffset.x, boundsOffset.y, height, get_current_rotation()); + + if (direction == 0 && trackSequence == 0) { + paint_util_push_tunnel_left(height + 8, TUNNEL_2); + } + + if (direction == 0 && trackSequence == 3) { + paint_util_push_tunnel_right(height - 8, TUNNEL_1); + } + + if (direction == 1 && trackSequence == 3) { + paint_util_push_tunnel_left(height - 8, TUNNEL_1); + } + + if (direction == 3 && trackSequence == 0) { + paint_util_push_tunnel_right(height + 8, TUNNEL_1); + } + + uint8 supportType[2][4] = { + { 1, 0, 0, 2}, + { 2, 0, 0, 1} + }; + switch (trackSequence) { + case 0: + case 3: + metal_a_supports_paint_setup(supportType[direction & 1][trackSequence], 4, 8, height, RCT2_GLOBAL(0x00F4419C, uint32)); + break; + } + + int blockedSegments = 0; + switch (trackSequence) { + case 0: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC; break; + case 3: blockedSegments = SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8; break; + } + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + + if (trackSequence == 0 || trackSequence == 3) + paint_util_set_general_support_height(height + 72, 0x20); + else + paint_util_set_general_support_height(height + 56, 0x20); +} + +static const uint8 left_quarter_turn_3_tiles_to_right_turn_map[] = {3, 1, 2, 0}; + +/** rct2: 0x008AAEC0 */ +static void junior_rc_left_quarter_turn_3_tiles_25_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + trackSequence = left_quarter_turn_3_tiles_to_right_turn_map[trackSequence]; + junior_rc_right_quarter_turn_3_tiles_25_deg_down_paint_setup(rideIndex, trackSequence, (direction + 1) % 4, height, mapElement); +} + +/** rct2: 0x008AAEE0 */ +static void junior_rc_left_quarter_turn_3_tiles_25_deg_down_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + trackSequence = left_quarter_turn_3_tiles_to_right_turn_map[trackSequence]; + junior_rc_right_quarter_turn_3_tiles_25_deg_up_paint_setup(rideIndex, trackSequence, (direction + 1) % 4, height, mapElement); +} + +/** rct2: 0x008AB0F0, 0x0052B3A4, 0x0052B5F8, 0x0052B863, 0x0052BA78 */ +static void junior_rc_right_half_banked_helix_up_small_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + const sint8 thickness[2] = { 1, 26 }; + + if (trackSequence > 3) { + trackSequence -= 4; + direction++; + direction &= 3; + } + track_paint_util_right_helix_up_small_quarter_tiles_paint(thickness, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_right_half_banked_helix_up_small_quarter_tiles, NULL, defaultRightHelixUpSmallQuarterBoundLengths, defaultRightHelixUpSmallQuarterBoundOffsets, get_current_rotation()); + + if (trackSequence == 0) { + metal_a_supports_paint_setup(direction & 1 ? 2 : 1, 4, 2, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + else if ( trackSequence == 3) { + metal_a_supports_paint_setup(direction & 1 ? 1 : 2, 4, 6, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + if (direction == 0 && trackSequence == 0) { + paint_util_push_tunnel_left(height, TUNNEL_0); + } + + if (direction == 0 && trackSequence == 3) { + paint_util_push_tunnel_right(height + 8, TUNNEL_0); + } + + if (direction == 1 && trackSequence == 3) { + paint_util_push_tunnel_left(height + 8, TUNNEL_0); + } + + if (direction == 3 && trackSequence == 0) { + paint_util_push_tunnel_right(height, TUNNEL_0); + } + + int blockedSegments = 0; + switch (trackSequence) { + case 0: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC | SEGMENT_D4; break; + case 2: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_C0 | SEGMENT_D4; break; + case 3: blockedSegments = SEGMENT_D0 | SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8 ; break; + } + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AB110, 0x0052BD80, 0x0052BFD4, 0x0052C23B, 0x0052C450 */ +static void junior_rc_right_half_banked_helix_down_small_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + const sint8 thickness[2] = { 1, 26 }; + + if (trackSequence > 3) { + trackSequence -= 4; + direction++; + direction &= 3; + } + track_paint_util_right_helix_up_small_quarter_tiles_paint(thickness, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_right_half_banked_helix_down_small_quarter_tiles, NULL, defaultRightHelixUpSmallQuarterBoundLengths, defaultRightHelixUpSmallQuarterBoundOffsets, get_current_rotation()); + + if (trackSequence == 0) { + metal_a_supports_paint_setup(direction & 1 ? 2 : 1, 4, 6, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + else if ( trackSequence == 3) { + metal_a_supports_paint_setup(direction & 1 ? 1 : 2, 4, 2, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + if (direction == 0 && trackSequence == 0) { + paint_util_push_tunnel_left(height, TUNNEL_0); + } + + if (direction == 0 && trackSequence == 3) { + paint_util_push_tunnel_right(height + 8, TUNNEL_0); + } + + if (direction == 1 && trackSequence == 3) { + paint_util_push_tunnel_left(height + 8, TUNNEL_0); + } + + if (direction == 3 && trackSequence == 0) { + paint_util_push_tunnel_right(height, TUNNEL_0); + } + + int blockedSegments = 0; + switch (trackSequence) { + case 0: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC | SEGMENT_D4; break; + case 2: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_C0 | SEGMENT_D4; break; + case 3: blockedSegments = SEGMENT_D0 | SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8 ; break; + } + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AB0E0 */ +static void junior_rc_left_half_banked_helix_up_small_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + if (trackSequence > 3) { + trackSequence -= 4; + direction--; + direction &= 3; + } + trackSequence = left_quarter_turn_3_tiles_to_right_turn_map[trackSequence]; + junior_rc_right_half_banked_helix_down_small_paint_setup(rideIndex, trackSequence, (direction + 1) % 4, height, mapElement); +} + +/** rct2: 0x008AB100 */ +static void junior_rc_left_half_banked_helix_down_small_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + if (trackSequence > 3) { + trackSequence -= 4; + direction--; + direction &= 3; + } + trackSequence = left_quarter_turn_3_tiles_to_right_turn_map[trackSequence]; + junior_rc_right_half_banked_helix_up_small_paint_setup(rideIndex, trackSequence, (direction + 1) % 4, height, mapElement); +} + +/** rct2: 0x008AB130, 0x0052C7BC, 0x0052CB6B, 0x0052CF32, 0x0052D2B3 */ +static void junior_rc_right_half_banked_helix_up_large_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + const sint8 thickness[2] = { 1, 26 }; + + if (trackSequence > 6) { + trackSequence -= 7; + direction++; + direction &= 3; + } + track_paint_util_right_helix_up_large_quarter_tiles_paint(thickness, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_right_half_banked_helix_up_large_quarter_tiles, NULL, defaultRightHelixUpLargeQuarterBoundLengths, defaultRightHelixUpLargeQuarterBoundOffsets, get_current_rotation()); + + if (trackSequence == 0) { + metal_a_supports_paint_setup(direction & 1 ? 2 : 1, 4, 1, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + else if ( trackSequence == 6) { + metal_a_supports_paint_setup(direction & 1 ? 1 : 2, 4, 7, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + if (direction == 0 && trackSequence == 0) { + paint_util_push_tunnel_left(height, TUNNEL_0); + } + + if (direction == 0 && trackSequence == 6) { + paint_util_push_tunnel_right(height + 8, TUNNEL_0); + } + + if (direction == 1 && trackSequence == 6) { + paint_util_push_tunnel_left(height + 8, TUNNEL_0); + } + + if (direction == 3 && trackSequence == 0) { + paint_util_push_tunnel_right(height, TUNNEL_0); + } + + switch (trackSequence) { + case 0: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_D4 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC, direction), 0xFFFF, 0); break; + case 2: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_C4 | SEGMENT_D4 | SEGMENT_BC | SEGMENT_C0 | SEGMENT_CC, direction), 0xFFFF, 0); break; + case 3: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_C4, direction), 0xFFFF, 0); break; + case 5: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D4 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C8, direction), 0xFFFF, 0); break; + case 6: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8, direction), 0xFFFF, 0); break; + } + + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AB150, 0x0052D778, 0x0052DB27, 0x0052DEEA, 0x0052E26B */ +static void junior_rc_right_half_banked_helix_down_large_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + const sint8 thickness[2] = { 1, 26 }; + + if (trackSequence > 6) { + trackSequence -= 7; + direction++; + direction &= 3; + } + track_paint_util_right_helix_up_large_quarter_tiles_paint(thickness, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_right_half_banked_helix_down_large_quarter_tiles, NULL, defaultRightHelixUpLargeQuarterBoundLengths, defaultRightHelixUpLargeQuarterBoundOffsets, get_current_rotation()); + + if (trackSequence == 0) { + metal_a_supports_paint_setup(direction & 1 ? 2 : 1, 4, 7, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + else if ( trackSequence == 6) { + metal_a_supports_paint_setup(direction & 1 ? 1 : 2, 4, 1, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + if (direction == 0 && trackSequence == 0) { + paint_util_push_tunnel_left(height, TUNNEL_0); + } + + if (direction == 0 && trackSequence == 6) { + paint_util_push_tunnel_right(height + 8, TUNNEL_0); + } + + if (direction == 1 && trackSequence == 6) { + paint_util_push_tunnel_left(height + 8, TUNNEL_0); + } + + if (direction == 3 && trackSequence == 0) { + paint_util_push_tunnel_right(height, TUNNEL_0); + } + + switch (trackSequence) { + case 0: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_D4 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC, direction), 0xFFFF, 0); break; + case 2: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_C4 | SEGMENT_D4 | SEGMENT_BC | SEGMENT_C0 | SEGMENT_CC, direction), 0xFFFF, 0); break; + case 3: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_C4, direction), 0xFFFF, 0); break; + case 5: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D4 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C8, direction), 0xFFFF, 0); break; + case 6: paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_D0 | SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8, direction), 0xFFFF, 0); break; + } + + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AB120 */ +static void junior_rc_left_half_banked_helix_up_large_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + if (trackSequence > 6) { + trackSequence -= 7; + direction--; + direction &= 3; + } + trackSequence = left_quarter_turn_5_tiles_to_right_turn_map[trackSequence]; + junior_rc_right_half_banked_helix_down_large_paint_setup(rideIndex, trackSequence, (direction + 1) % 4, height, mapElement); +} + +/** rct2: 0x008AB140 */ +static void junior_rc_left_half_banked_helix_down_large_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + if (trackSequence > 6) { + trackSequence -= 7; + direction--; + direction &= 3; + } + trackSequence = left_quarter_turn_5_tiles_to_right_turn_map[trackSequence]; + junior_rc_right_half_banked_helix_up_large_paint_setup(rideIndex, trackSequence, (direction + 1) % 4, height, mapElement); +} + +/** + * rct2: 0x008AAF00, 0x0051851C, 0x005185D8 + */ +static void junior_rc_brake_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + uint32 image_id; + + image_id = junior_rc_track_pieces_brake[direction] | RCT2_GLOBAL(0x00F44198, uint32); + if (direction & 1) { + sub_98196C(image_id, 6, 0, 20, 32, 1, height, get_current_rotation()); + + paint_util_push_tunnel_right(height, TUNNEL_0); + } + else { + sub_98196C(image_id, 0, 6, 32, 20, 1, height, get_current_rotation()); + + paint_util_push_tunnel_left(height, TUNNEL_0); + } + + const rct_xy16 pos = {RCT2_GLOBAL(0x009DE56A, sint16), RCT2_GLOBAL(0x009DE56E, sint16)}; + if (track_paint_util_should_paint_supports(pos)) { + int edi = direction & 1 ? 2 : 1; + metal_a_supports_paint_setup(edi, 4, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** + * rct2: 0x008AB280, 0x00518694, 0x00518759 + */ +static void junior_rc_block_brake_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + uint32 image_id; + + bool isBraked = (bool)(mapElement->flags & MAP_ELEMENT_FLAG_BLOCK_BRAKE_CLOSED); + + image_id = junior_rc_track_pieces_block_brake[isBraked][direction] | RCT2_GLOBAL(0x00F44198, uint32); + if (direction & 1) { + sub_98196C(image_id, 6, 0, 20, 32, 1, height, get_current_rotation()); + + paint_util_push_tunnel_right(height, TUNNEL_0); + } + else { + sub_98196C(image_id, 0, 6, 32, 20, 1, height, get_current_rotation()); + + paint_util_push_tunnel_left(height, TUNNEL_0); + } + + const rct_xy16 pos = {RCT2_GLOBAL(0x009DE56A, sint16), RCT2_GLOBAL(0x009DE56E, sint16)}; + if (track_paint_util_should_paint_supports(pos)) { + int edi = direction & 1 ? 2 : 1; + metal_a_supports_paint_setup(edi, 4, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AAF80 */ +static void junior_rc_left_eighth_to_diag_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + track_paint_util_eighth_to_diag_tiles_paint(defaultEighthToDiagThickness, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_left_eight_to_diag, 0, defaultLeftEighthToDiagBoundLengths, defaultLeftEighthToDiagBoundOffsets, get_current_rotation()); + + switch (trackSequence) { + case 0: + metal_a_supports_paint_setup(direction & 1 ? 2 : 1, 4, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + break; + case 4: + if (direction == 0) metal_a_supports_paint_setup(2, 3, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + if (direction == 1) metal_a_supports_paint_setup(1, 1, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + if (direction == 2) metal_a_supports_paint_setup(2, 0, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + if (direction == 3) metal_a_supports_paint_setup(1, 2, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + break; + } + + if (direction == 0 && trackSequence == 0) { + paint_util_push_tunnel_left(height, TUNNEL_0); + } + if (direction == 3 && trackSequence == 0) { + paint_util_push_tunnel_right(height, TUNNEL_0); + } + + int blockedSegments; + switch (trackSequence) { + case 0: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC; break; + case 1: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_B4; break; + case 2: blockedSegments = SEGMENT_C4 | SEGMENT_CC | SEGMENT_C0 | SEGMENT_D4 | SEGMENT_BC; break; + case 3: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_B8 | SEGMENT_C8; break; + case 4: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_C8 | SEGMENT_C0 | SEGMENT_D4; break; + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AAF90 */ +static void junior_rc_right_eighth_to_diag_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + track_paint_util_eighth_to_diag_tiles_paint(defaultEighthToDiagThickness, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_right_eight_to_diag, 0, defaultRightEighthToDiagBoundLengths, defaultRightEighthToDiagBoundOffsets, get_current_rotation()); + + switch (trackSequence) { + case 0: + metal_a_supports_paint_setup(direction & 1 ? 2 : 1, 4, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + break; + case 4: + if (direction == 0) metal_a_supports_paint_setup(2, 1, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + if (direction == 1) metal_a_supports_paint_setup(1, 0, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + if (direction == 2) metal_a_supports_paint_setup(2, 2, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + if (direction == 3) metal_a_supports_paint_setup(1, 3, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + break; + } + + if (direction == 0 && trackSequence == 0) { + paint_util_push_tunnel_left(height, TUNNEL_0); + } + if (direction == 3 && trackSequence == 0) { + paint_util_push_tunnel_right(height, TUNNEL_0); + } + + int blockedSegments; + switch (trackSequence) { + case 0: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC; break; + case 1: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_C0 | SEGMENT_D4 | SEGMENT_BC; break; + case 2: blockedSegments = SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_B4; break; + case 3: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_C0 | SEGMENT_D4; break; + case 4: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_D4; break; + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AAFA0 */ +static void junior_rc_left_eighth_to_orthogonal_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + const uint8 map[] = {4, 2, 3, 1, 0}; + trackSequence = map[trackSequence]; + junior_rc_right_eighth_to_diag_paint_setup(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); +} + +/** rct2: 0x008AAFB0 */ +static void junior_rc_right_eighth_to_orthogonal_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + const uint8 map[] = {4, 2, 3, 1, 0}; + trackSequence = map[trackSequence]; + junior_rc_left_eighth_to_diag_paint_setup(rideIndex, trackSequence, (direction + 3) % 4, height, mapElement); +} + +static const rct_xy16 junior_rc_left_eighth_to_diag_bank_bound_lengths[4][4] = { + { + {32, 1}, + {32, 16}, + {16, 16}, + {16, 16}, + }, + { + {1, 32}, + {16, 34}, + {16, 16}, + {18, 16}, + }, + { + {32, 20}, + {32, 16}, + {16, 16}, + {16, 16}, + }, + { + {20, 32}, + {16, 32}, + {16, 16}, + {16, 16}, + }, +}; + +static const rct_xyz16 junior_rc_left_eighth_to_diag_bank_bound_offsets[4][4] = { + { + {0, 27}, + {0, 0}, + {0, 16}, + {16, 16}, + }, + { + {27, 0}, + {0, 0, 27}, + {16, 16, 27}, + {16, 0, 27}, + }, + { + {0, 6}, + {0, 16}, + {16, 0}, + {0, 0}, + }, + { + {6, 0}, + {16, 0}, + {0, 0}, + {0, 16}, + }, +}; + +static const sint8 junior_rc_left_eighth_to_diag_bank_thickness[4][4] = { + { + 26, + 1, + 1, + 1, + }, + { + 26, + 0, + 0, + 0, + }, + { + 1, + 1, + 1, + 1, + }, + { + 1, + 1, + 1, + 1, + }, +}; + +/** rct2: 0x008AB160 */ +static void junior_rc_left_eighth_to_diag_bank_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + track_paint_util_eighth_to_diag_tiles_paint(junior_rc_left_eighth_to_diag_bank_thickness, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_left_eight_to_diag_bank, 0, junior_rc_left_eighth_to_diag_bank_bound_lengths, junior_rc_left_eighth_to_diag_bank_bound_offsets, get_current_rotation()); + + switch (trackSequence) { + case 0: + metal_a_supports_paint_setup(direction & 1 ? 2 : 1, 4, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + break; + case 4: + if (direction == 0) metal_a_supports_paint_setup(1, 3, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + if (direction == 1) metal_a_supports_paint_setup(2, 1, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + if (direction == 2) metal_a_supports_paint_setup(1, 0, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + if (direction == 3) metal_a_supports_paint_setup(2, 2, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + break; + } + + if (direction == 0 && trackSequence == 0) { + paint_util_push_tunnel_left(height, TUNNEL_0); + } + if (direction == 3 && trackSequence == 0) { + paint_util_push_tunnel_right(height, TUNNEL_0); + } + + int blockedSegments; + switch (trackSequence) { + case 0: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC; break; + case 1: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_B4; break; + case 2: blockedSegments = SEGMENT_C4 | SEGMENT_CC | SEGMENT_C0 | SEGMENT_D4 | SEGMENT_BC; break; + case 3: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_B8 | SEGMENT_C8; break; + case 4: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_C8 | SEGMENT_C0 | SEGMENT_D4; break; + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +static const rct_xy16 junior_rc_right_eighth_to_diag_bank_bound_lengths[4][4] = { + { + {32, 20}, + {16, 16}, + {16, 16}, + {16, 16}, + }, + { + {20, 32}, + {16, 32}, + {16, 16}, + {16, 16}, + }, + { + {32, 1}, + {34, 16}, + {28, 28}, + {16, 18}, + }, + { + {1, 32}, + {16, 32}, + {16, 16}, + {16, 16}, + }, +}; + +static const rct_xyz16 junior_rc_right_eighth_to_diag_bank_bound_offsets[4][4] = { + { + {0, 6}, + {0, 0}, + {0, 0}, + {16, 0}, + }, + { + {6, 0}, + {16, 0}, + {0, 16}, + {0, 0}, + }, + { + {0, 27}, + {0, 0}, + {4, 4, 27}, + {0, 16, 27}, + }, + { + {27, 0}, + {0, 0}, + {16, 0}, + {16, 16}, + }, +}; + +static const sint8 junior_rc_right_eighth_to_diag_bank_thickness[4][4] = { + { + 1, + 1, + 1, + 1, + }, + { + 1, + 1, + 1, + 1, + }, + { + 26, + 0, + 0, + 0, + }, + { + 26, + 1, + 1, + 1, + }, +}; + +/** rct2: 0x008AB170 */ +static void junior_rc_right_eighth_to_diag_bank_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + track_paint_util_eighth_to_diag_tiles_paint(junior_rc_right_eighth_to_diag_bank_thickness, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_right_eight_to_diag_bank, 0, junior_rc_right_eighth_to_diag_bank_bound_lengths, junior_rc_right_eighth_to_diag_bank_bound_offsets, get_current_rotation()); + + switch (trackSequence) { + case 0: + metal_a_supports_paint_setup(direction & 1 ? 2 : 1, 4, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + break; + case 4: + if (direction == 0) metal_a_supports_paint_setup(1, 1, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + if (direction == 1) metal_a_supports_paint_setup(2, 0, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + if (direction == 2) metal_a_supports_paint_setup(1, 2, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + if (direction == 3) metal_a_supports_paint_setup(2, 3, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + break; + } + + if (direction == 0 && trackSequence == 0) { + paint_util_push_tunnel_left(height, TUNNEL_0); + } + if (direction == 3 && trackSequence == 0) { + paint_util_push_tunnel_right(height, TUNNEL_0); + } + + int blockedSegments; + switch (trackSequence) { + case 0: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC; break; + case 1: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_C0 | SEGMENT_D4 | SEGMENT_BC; break; + case 2: blockedSegments = SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_B4; break; + case 3: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_C0 | SEGMENT_D4; break; + case 4: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_D4; break; + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AB180 */ +static void junior_rc_left_eighth_to_orthogonal_bank_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + const uint8 map[] = {4, 2, 3, 1, 0}; + trackSequence = map[trackSequence]; + junior_rc_right_eighth_to_diag_bank_paint_setup(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); +} + +/** rct2: 0x008AB190 */ +static void junior_rc_right_eighth_to_orthogonal_bank_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + const uint8 map[] = {4, 2, 3, 1, 0}; + trackSequence = map[trackSequence]; + junior_rc_left_eighth_to_diag_bank_paint_setup(rideIndex, trackSequence, (direction + 3) % 4, height, mapElement); +} + +static const int junior_rc_diag_blocked_segments[] = { + SEGMENT_C4 | SEGMENT_CC | SEGMENT_D4 | SEGMENT_BC, + SEGMENT_C4 | SEGMENT_CC | SEGMENT_C8 | SEGMENT_B4, + SEGMENT_D0 | SEGMENT_C4 | SEGMENT_C0 | SEGMENT_D4, + SEGMENT_D0 | SEGMENT_C4 | SEGMENT_B8 | SEGMENT_C8 +}; + +static const uint8 junior_rc_diag_support_segment[] = {1, 0, 2, 3}; + +/** rct2: 0x008AAF10 */ +static void junior_rc_diag_flat_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + bool isChained = mapElement->type & (1 << 7); + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_flat[isChained], defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (trackSequence == 3) { + metal_a_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AAF40 */ +static void junior_rc_diag_25_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + bool isChained = mapElement->type & (1 << 7); + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_25_deg_up[isChained], defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (trackSequence == 3) { + metal_b_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 8, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 56, 0x20); +} + +/** rct2: 0x008AAF20 */ +static void junior_rc_diag_flat_to_25_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + bool isChained = mapElement->type & (1 << 7); + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_flat_to_25_deg_up[isChained], defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (trackSequence == 3) { + metal_b_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 48, 0x20); +} + +/** rct2: 0x008AAF30 */ +static void junior_rc_diag_25_deg_up_to_flat_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + bool isChained = mapElement->type & (1 << 7); + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_25_deg_up_to_flat[isChained], defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (trackSequence == 3) { + metal_b_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 4, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 56, 0x20); +} + +/** rct2: 0x008AAF70 */ +static void junior_rc_diag_25_deg_down_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + bool isChained = mapElement->type & (1 << 7); + + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_25_deg_down[isChained], defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (trackSequence == 3) { + metal_b_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 8, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 56, 0x20); +} + +/** rct2: 0x008AAF50 */ +static void junior_rc_diag_flat_to_25_deg_down_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + bool isChained = mapElement->type & (1 << 7); + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_flat_to_25_deg_down[isChained], defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (trackSequence == 3) { + metal_b_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 4, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 56, 0x20); +} + +/** rct2: 0x008AAF60 */ +static void junior_rc_diag_25_deg_down_to_flat_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + bool isChained = mapElement->type & (1 << 7); + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_25_deg_down_to_flat[isChained], defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (trackSequence == 3) { + metal_b_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 48, 0x20); +} + +/** rct2: 0x008AB1C0 */ +static void junior_rc_diag_flat_to_left_bank_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_flat_to_left_bank, defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (direction == 0 && trackSequence == 1) { + uint32 imageId = SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_W_E_PART_0_2 | RCT2_GLOBAL(0x00F44198, uint32); + + sub_98197C(imageId, -16, -16, 32, 32, 0, height, -16, -16, height + 27, get_current_rotation()); + } + if (trackSequence == 3) { + metal_a_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AB1D0 */ +static void junior_rc_diag_flat_to_right_bank_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_flat_to_right_bank, defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (direction == 2 && trackSequence == 2) { + uint32 imageId = SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_E_W_PART_0_2 | RCT2_GLOBAL(0x00F44198, uint32); + + sub_98197C(imageId, -16, -16, 32, 32, 0, height, -16, -16, height + 27, get_current_rotation()); + } + if (trackSequence == 3) { + metal_a_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AB1E0 */ +static void junior_rc_diag_left_bank_to_flat_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_left_bank_to_flat, defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (direction == 0 && trackSequence == 1) { + uint32 imageId = SPR_JUNIOR_RC_DIAG_FLAT_TO_RIGHT_BANK_E_W_PART_0_2 | RCT2_GLOBAL(0x00F44198, uint32); + + sub_98197C(imageId, -16, -16, 32, 32, 0, height, -16, -16, height + 27, get_current_rotation()); + } + if (trackSequence == 3) { + metal_a_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AB1F0 */ +static void junior_rc_diag_right_bank_to_flat_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_right_bank_to_flat, defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (direction == 2 && trackSequence == 2) { + uint32 imageId = SPR_JUNIOR_RC_DIAG_FLAT_TO_LEFT_BANK_W_E_PART_0_2 | RCT2_GLOBAL(0x00F44198, uint32); + + sub_98197C(imageId, -16, -16, 32, 32, 0, height, -16, -16, height + 27, get_current_rotation()); + } + if (trackSequence == 3) { + metal_a_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AB220 */ +static void junior_rc_diag_left_bank_to_25_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_left_bank_to_25_deg_up, defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (direction == 0 && trackSequence == 1) { + uint32 imageId = SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_W_E_PART_0_2 | RCT2_GLOBAL(0x00F44198, uint32); + + sub_98197C(imageId, -16, -16, 32, 32, 0, height, -16, -16, height + 35, get_current_rotation()); + } + if (trackSequence == 3) { + metal_b_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 48, 0x20); +} + +/** rct2: 0x008AB230 */ +static void junior_rc_diag_right_bank_to_25_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_right_bank_to_25_deg_up, defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (direction == 2 && trackSequence == 2) { + uint32 imageId = SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_E_W_PART_0_2 | RCT2_GLOBAL(0x00F44198, uint32); + + sub_98197C(imageId, -16, -16, 32, 32, 0, height, -16, -16, height + 35, get_current_rotation()); + } + if (trackSequence == 3) { + metal_b_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 48, 0x20); +} + +/** rct2: 0x008AB200 */ +static void junior_rc_diag_25_deg_up_to_left_bank_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_25_deg_up_to_left_bank, defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (direction == 0 && trackSequence == 1) { + uint32 imageId = SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_W_E_PART_0_2 | RCT2_GLOBAL(0x00F44198, uint32); + + sub_98197C(imageId, -16, -16, 32, 32, 0, height, -16, -16, height + 35, get_current_rotation()); + } + if (trackSequence == 3) { + metal_b_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 4, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 56, 0x20); +} + +/** rct2: 0x008AB210 */ +static void junior_rc_diag_25_deg_up_to_right_bank_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_25_deg_up_to_right_bank, defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (direction == 2 && trackSequence == 2) { + uint32 imageId = SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_E_W_PART_0_2 | RCT2_GLOBAL(0x00F44198, uint32); + + sub_98197C(imageId, -16, -16, 32, 32, 0, height, -16, -16, height + 35, get_current_rotation()); + } + if (trackSequence == 3) { + metal_b_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 4, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 56, 0x20); +} + +/** rct2: 0x008AB200 */ +static void junior_rc_diag_left_bank_to_25_deg_down_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_left_bank_to_25_deg_down, defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (direction == 0 && trackSequence == 1) { + uint32 imageId = SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_RIGHT_BANK_E_W_PART_0_2 | RCT2_GLOBAL(0x00F44198, uint32); + + sub_98197C(imageId, -16, -16, 32, 32, 0, height, -16, -16, height + 35, get_current_rotation()); + } + if (trackSequence == 3) { + metal_b_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 4, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + if (direction == 0 && trackSequence == 0) + paint_util_set_general_support_height(height + 48, 0x20); + else + paint_util_set_general_support_height(height + 56, 0x20); +} + +/** rct2: 0x008AB210 */ +static void junior_rc_diag_right_bank_to_25_deg_down_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_right_bank_to_25_deg_down, defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (direction == 2 && trackSequence == 2) { + uint32 imageId = SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_LEFT_BANK_W_E_PART_0_2 | RCT2_GLOBAL(0x00F44198, uint32); + + sub_98197C(imageId, -16, -16, 32, 32, 0, height, -16, -16, height + 35, get_current_rotation()); + } + if (trackSequence == 3) { + metal_b_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 4, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + if (direction == 0 && trackSequence == 0) + paint_util_set_general_support_height(height + 48, 0x20); + else + paint_util_set_general_support_height(height + 56, 0x20); +} + +/** rct2: 0x008AB220 */ +static void junior_rc_diag_25_deg_down_to_left_bank_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_25_deg_down_to_left_bank, defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (direction == 0 && trackSequence == 1) { + uint32 imageId = SPR_JUNIOR_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_E_W_PART_0_2 | RCT2_GLOBAL(0x00F44198, uint32); + + sub_98197C(imageId, -16, -16, 32, 32, 0, height, -16, -16, height + 35, get_current_rotation()); + } + if (trackSequence == 3) { + metal_b_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 48, 0x20); +} + +/** rct2: 0x008AB230 */ +static void junior_rc_diag_25_deg_down_to_right_bank_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_25_deg_down_to_right_bank, defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (direction == 2 && trackSequence == 2) { + uint32 imageId = SPR_JUNIOR_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_W_E_PART_0_2 | RCT2_GLOBAL(0x00F44198, uint32); + + sub_98197C(imageId, -16, -16, 32, 32, 0, height, -16, -16, height + 35, get_current_rotation()); + } + if (trackSequence == 3) { + metal_b_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 48, 0x20); +} + +const rct_xyz16 junior_rc_diag_left_bank_bound_offsets[4] = { + {-16, -16, 27}, + {-16, -16}, + {-16, -16}, + {-16, -16}, +}; + +const rct_xyz16 junior_rc_diag_right_bank_bound_offsets[4] = { + {-16, -16}, + {-16, -16}, + {-16, -16, 27}, + {-16, -16}, +}; + +/** rct2: 0x008AAF10 */ +static void junior_rc_diag_left_bank_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_left_bank, defaultDiagTileOffsets, defaultDiagBoundLengths, junior_rc_diag_left_bank_bound_offsets, get_current_rotation()); + + if (trackSequence == 3) { + metal_a_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AAF10 */ +static void junior_rc_diag_right_bank_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_right_bank, defaultDiagTileOffsets, defaultDiagBoundLengths, junior_rc_diag_right_bank_bound_offsets, get_current_rotation()); + + if (trackSequence == 3) { + metal_a_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +static const rct_xy16 junior_rc_60_deg_up_bound_offsets[4] = { + {0, 6}, + {10, 29}, + {29, 10}, + {6, 0}, +}; + +static const rct_xy16 junior_rc_60_deg_up_tile_offsets[4] = { + {0, 6}, + {6, 0}, + {0, 6}, + {6, 0}, +}; + +static const sint8 junior_rc_60_deg_up_bound_thickness[4] = { + 1, + 75, + 75, + 1 +}; + +static const rct_xy16 junior_rc_60_deg_up_bound_lengths[4] = { + {32, 20}, + {10, 1}, + {1, 10}, + {20, 32}, +}; + +static void junior_rc_60_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + + uint32 image_id = RCT2_GLOBAL(0x00F44198, uint32); + + bool isChained = mapElement->type & (1 << 7); + + image_id |= junior_rc_track_pieces_60_deg_up[isChained][direction]; + + sub_98197C(image_id, + (sint8)junior_rc_60_deg_up_tile_offsets[direction].x, + (sint8)junior_rc_60_deg_up_tile_offsets[direction].y, + junior_rc_60_deg_up_bound_lengths[direction].x, + junior_rc_60_deg_up_bound_lengths[direction].y, + junior_rc_60_deg_up_bound_thickness[direction], + height, + junior_rc_60_deg_up_bound_offsets[direction].x, + junior_rc_60_deg_up_bound_offsets[direction].y, + height, + get_current_rotation()); + + switch (direction) { + case 0: + paint_util_push_tunnel_left(height - 8, TUNNEL_1); + break; + case 1: + paint_util_push_tunnel_right(height + 56, TUNNEL_2); + break; + case 2: + paint_util_push_tunnel_left(height + 56, TUNNEL_2); + break; + case 3: + paint_util_push_tunnel_right(height - 8, TUNNEL_1); + break; + } + + const rct_xy16 pos = {RCT2_GLOBAL(0x009DE56A, sint16), RCT2_GLOBAL(0x009DE56E, sint16)}; + + sint8 support[4] = { 35, 29, 25, 32}; + if (track_paint_util_should_paint_supports(pos)) { + metal_a_supports_paint_setup(direction & 1 ? 2 : 1, 4, support[direction], height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 104, 0x20); +} + +static void junior_rc_60_deg_down_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + junior_rc_60_deg_up_paint_setup(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); +} + +static const rct_xy16 junior_rc_25_deg_up_to_60_deg_up_bound_lengths[4][2] = { + {{32, 20}, {0}}, + {{10, 32}, {2, 32}}, + {{32, 10}, {32, 2}}, + {{20, 32}, {0}}, +}; + +static const sint8 junior_rc_25_deg_up_to_60_deg_up_bound_thickness[4] = { + 1, + 43, + 43, + 1 +}; + +static const rct_xy16 junior_rc_25_deg_up_to_60_deg_up_bound_offsets[4][2] = { + {{0, 6}, {0}}, + {{10, 0}, {4, 0}}, + {{0, 10}, {0, 4}}, + {{6, 0}, {0}}, +}; + +static void junior_rc_25_deg_up_to_60_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + + uint32 image_id = RCT2_GLOBAL(0x00F44198, uint32); + + image_id |= junior_rc_track_pieces_25_deg_up_to_60_deg_up[direction][0]; + + sub_98197C(image_id, + (sint8)junior_rc_60_deg_up_tile_offsets[direction].x, + (sint8)junior_rc_60_deg_up_tile_offsets[direction].y, + junior_rc_25_deg_up_to_60_deg_up_bound_lengths[direction][0].x, + junior_rc_25_deg_up_to_60_deg_up_bound_lengths[direction][0].y, + junior_rc_25_deg_up_to_60_deg_up_bound_thickness[direction], + height, + junior_rc_25_deg_up_to_60_deg_up_bound_offsets[direction][0].x, + junior_rc_25_deg_up_to_60_deg_up_bound_offsets[direction][0].y, + height, + get_current_rotation()); + + if (junior_rc_track_pieces_25_deg_up_to_60_deg_up[direction][1] != 0) { + image_id = RCT2_GLOBAL(0x00F44198, uint32); + + image_id |= junior_rc_track_pieces_25_deg_up_to_60_deg_up[direction][1]; + + sub_98197C(image_id, + (sint8)junior_rc_60_deg_up_tile_offsets[direction].x, + (sint8)junior_rc_60_deg_up_tile_offsets[direction].y, + junior_rc_25_deg_up_to_60_deg_up_bound_lengths[direction][1].x, + junior_rc_25_deg_up_to_60_deg_up_bound_lengths[direction][1].y, + junior_rc_25_deg_up_to_60_deg_up_bound_thickness[direction], + height, + junior_rc_25_deg_up_to_60_deg_up_bound_offsets[direction][1].x, + junior_rc_25_deg_up_to_60_deg_up_bound_offsets[direction][1].y, + height, + get_current_rotation()); + } + + switch (direction) { + case 0: + paint_util_push_tunnel_left(height - 8, TUNNEL_1); + break; + case 1: + paint_util_push_tunnel_right(height + 24, TUNNEL_2); + break; + case 2: + paint_util_push_tunnel_left(height + 24, TUNNEL_2); + break; + case 3: + paint_util_push_tunnel_right(height - 8, TUNNEL_1); + break; + } + + const rct_xy16 pos = {RCT2_GLOBAL(0x009DE56A, sint16), RCT2_GLOBAL(0x009DE56E, sint16)}; + + sint8 support[4] = { 12, 12, 12, 14}; + if (track_paint_util_should_paint_supports(pos)) { + metal_a_supports_paint_setup(direction & 1 ? 2 : 1, 4, support[direction], height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 72, 0x20); +} + +static void junior_rc_60_deg_down_to_25_deg_down_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + junior_rc_25_deg_up_to_60_deg_up_paint_setup(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); +} + +static void junior_rc_60_deg_up_to_25_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + + uint32 image_id = RCT2_GLOBAL(0x00F44198, uint32); + + image_id |= junior_rc_track_pieces_60_deg_up_to_25_deg_up[direction][0]; + + sub_98197C(image_id, + (sint8)junior_rc_60_deg_up_tile_offsets[direction].x, + (sint8)junior_rc_60_deg_up_tile_offsets[direction].y, + junior_rc_25_deg_up_to_60_deg_up_bound_lengths[direction][0].x, + junior_rc_25_deg_up_to_60_deg_up_bound_lengths[direction][0].y, + junior_rc_25_deg_up_to_60_deg_up_bound_thickness[direction], + height, + junior_rc_25_deg_up_to_60_deg_up_bound_offsets[direction][0].x, + junior_rc_25_deg_up_to_60_deg_up_bound_offsets[direction][0].y, + height, + get_current_rotation()); + + if (junior_rc_track_pieces_60_deg_up_to_25_deg_up[direction][1] != 0) { + image_id = RCT2_GLOBAL(0x00F44198, uint32); + + image_id |= junior_rc_track_pieces_60_deg_up_to_25_deg_up[direction][1]; + + sub_98197C(image_id, + (sint8)junior_rc_60_deg_up_tile_offsets[direction].x, + (sint8)junior_rc_60_deg_up_tile_offsets[direction].y, + junior_rc_25_deg_up_to_60_deg_up_bound_lengths[direction][1].x, + junior_rc_25_deg_up_to_60_deg_up_bound_lengths[direction][1].y, + junior_rc_25_deg_up_to_60_deg_up_bound_thickness[direction], + height, + junior_rc_25_deg_up_to_60_deg_up_bound_offsets[direction][1].x, + junior_rc_25_deg_up_to_60_deg_up_bound_offsets[direction][1].y, + height, + get_current_rotation()); + } + + switch (direction) { + case 0: + paint_util_push_tunnel_left(height - 8, TUNNEL_1); + break; + case 1: + paint_util_push_tunnel_right(height + 24, TUNNEL_2); + break; + case 2: + paint_util_push_tunnel_left(height + 24, TUNNEL_2); + break; + case 3: + paint_util_push_tunnel_right(height - 8, TUNNEL_1); + break; + } + + const rct_xy16 pos = {RCT2_GLOBAL(0x009DE56A, sint16), RCT2_GLOBAL(0x009DE56E, sint16)}; + + if (track_paint_util_should_paint_supports(pos)) { + metal_a_supports_paint_setup(direction & 1 ? 2 : 1, 4, 20, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_C4 | SEGMENT_D0 | SEGMENT_CC, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 72, 0x20); +} + +static void junior_rc_25_deg_down_to_60_deg_down_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + junior_rc_60_deg_up_to_25_deg_up_paint_setup(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); +} + +static void junior_rc_diag_60_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + bool isChained = mapElement->type & (1 << 7); + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_60_deg_up[isChained], defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (trackSequence == 3) { + metal_b_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 36, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 104, 0x20); +} + +static void junior_rc_diag_60_deg_down_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + bool isChained = mapElement->type & (1 << 7); + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_60_deg_down[isChained], defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (trackSequence == 3) { + metal_b_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 28, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 104, 0x20); +} + +static void junior_rc_diag_25_deg_up_to_60_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + bool isChained = mapElement->type & (1 << 7); + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_25_deg_up_to_60_deg_up[isChained], defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (trackSequence == 3) { + metal_b_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 16, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 72, 0x20); +} + +static void junior_rc_diag_60_deg_up_to_25_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + bool isChained = mapElement->type & (1 << 7); + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_60_deg_up_to_25_deg_up[isChained], defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (trackSequence == 3) { + metal_b_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 21, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 72, 0x20); +} + +static void junior_rc_diag_25_deg_down_to_60_deg_down_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + bool isChained = mapElement->type & (1 << 7); + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_25_deg_down_to_60_deg_down[isChained], defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (trackSequence == 3) { + metal_b_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 17, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 72, 0x20); +} + +static void junior_rc_diag_60_deg_down_to_25_deg_down_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + bool isChained = mapElement->type & (1 << 7); + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), junior_rc_track_pieces_diag_60_deg_down_to_25_deg_down[isChained], defaultDiagTileOffsets, defaultDiagBoundLengths, 0, get_current_rotation()); + + if (trackSequence == 3) { + metal_b_supports_paint_setup(direction & 1 ? 2 : 1, junior_rc_diag_support_segment[direction], 8, height, RCT2_GLOBAL(0x00F4419C, uint32)); + } + + int blockedSegments = junior_rc_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 72, 0x20); +} + +/* 0x008AAA0C */ +TRACK_PAINT_FUNCTION get_track_paint_function_junior_rc(int trackType, int direction) { + switch (trackType) { + case TRACK_ELEM_FLAT: + return junior_rc_flat_paint_setup; + case TRACK_ELEM_END_STATION: + return paint_junior_rc_station_track; + case TRACK_ELEM_BEGIN_STATION: + return paint_junior_rc_station_track; + case TRACK_ELEM_MIDDLE_STATION: + return paint_junior_rc_station_track; + case TRACK_ELEM_25_DEG_UP: + return junior_rc_25_deg_up_paint_setup; + case TRACK_ELEM_60_DEG_UP: + return junior_rc_60_deg_up_paint_setup; + case TRACK_ELEM_FLAT_TO_25_DEG_UP: + return junior_rc_flat_to_25_deg_up_paint_setup; + case TRACK_ELEM_25_DEG_UP_TO_60_DEG_UP: + return junior_rc_25_deg_up_to_60_deg_up_paint_setup; + case TRACK_ELEM_60_DEG_UP_TO_25_DEG_UP: + return junior_rc_60_deg_up_to_25_deg_up_paint_setup; + case TRACK_ELEM_25_DEG_UP_TO_FLAT: + return junior_rc_25_deg_up_to_flat_paint_setup; + case TRACK_ELEM_25_DEG_DOWN: + return junior_rc_25_deg_down_paint_setup; + case TRACK_ELEM_60_DEG_DOWN: + return junior_rc_60_deg_down_paint_setup; + case TRACK_ELEM_FLAT_TO_25_DEG_DOWN: + return junior_rc_flat_to_25_deg_down_paint_setup; + case TRACK_ELEM_25_DEG_DOWN_TO_60_DEG_DOWN: + return junior_rc_25_deg_down_to_60_deg_down_paint_setup; + case TRACK_ELEM_60_DEG_DOWN_TO_25_DEG_DOWN: + return junior_rc_60_deg_down_to_25_deg_down_paint_setup; + case TRACK_ELEM_25_DEG_DOWN_TO_FLAT: + return junior_rc_25_deg_down_to_flat_paint_setup; + case TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES: + return junior_rc_left_quarter_turn_5_tiles_paint_setup; + case TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES: + return junior_rc_right_quarter_turn_5_tiles_paint_setup; + case TRACK_ELEM_FLAT_TO_LEFT_BANK: + return junior_rc_flat_to_left_bank_paint_setup; + case TRACK_ELEM_FLAT_TO_RIGHT_BANK: + return junior_rc_flat_to_right_bank_paint_setup; + case TRACK_ELEM_LEFT_BANK_TO_FLAT: + return junior_rc_left_bank_to_flat_paint_setup; + case TRACK_ELEM_RIGHT_BANK_TO_FLAT: + return junior_rc_right_bank_to_flat_paint_setup; + case TRACK_ELEM_BANKED_LEFT_QUARTER_TURN_5_TILES: + return junior_rc_banked_left_quarter_turn_5_tiles_paint_setup; + case TRACK_ELEM_BANKED_RIGHT_QUARTER_TURN_5_TILES: + return junior_rc_banked_right_quarter_turn_5_tiles_paint_setup; + case TRACK_ELEM_LEFT_BANK_TO_25_DEG_UP: + return junior_rc_left_bank_to_25_deg_up_paint_setup; + case TRACK_ELEM_RIGHT_BANK_TO_25_DEG_UP: + return junior_rc_right_bank_to_25_deg_up_paint_setup; + case TRACK_ELEM_25_DEG_UP_TO_LEFT_BANK: + return junior_rc_25_deg_up_to_left_bank_paint_setup; + case TRACK_ELEM_25_DEG_UP_TO_RIGHT_BANK: + return junior_rc_25_deg_up_to_right_bank_paint_setup; + case TRACK_ELEM_LEFT_BANK_TO_25_DEG_DOWN: + return junior_rc_left_bank_to_25_deg_down_paint_setup; + case TRACK_ELEM_RIGHT_BANK_TO_25_DEG_DOWN: + return junior_rc_right_bank_to_25_deg_down_paint_setup; + case TRACK_ELEM_25_DEG_DOWN_TO_LEFT_BANK: + return junior_rc_25_deg_down_to_left_bank_paint_setup; + case TRACK_ELEM_25_DEG_DOWN_TO_RIGHT_BANK: + return junior_rc_25_deg_down_to_right_bank_paint_setup; + case TRACK_ELEM_LEFT_BANK: + return junior_rc_left_bank_paint_setup; + case TRACK_ELEM_RIGHT_BANK: + return junior_rc_right_bank_paint_setup; + case TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP: + return junior_rc_banked_left_quarter_turn_5_tiles_25_deg_up_paint_setup; + case TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP: + return junior_rc_banked_right_quarter_turn_5_tiles_25_deg_up_paint_setup; + case TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_DOWN: + return junior_rc_banked_left_quarter_turn_5_tiles_25_deg_down_paint_setup; + case TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_DOWN: + return junior_rc_banked_right_quarter_turn_5_tiles_25_deg_down_paint_setup; + case TRACK_ELEM_S_BEND_LEFT: + return junior_rc_s_bend_left_paint_setup; + case TRACK_ELEM_S_BEND_RIGHT: + return junior_rc_s_bend_right_paint_setup; + + case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES: + return junior_rc_left_quarter_turn_3_tiles_paint_setup; + case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES: + return junior_rc_right_quarter_turn_3_tiles_paint_setup; + case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_BANK: + return junior_rc_left_quarter_turn_3_tiles_bank_paint_setup; + case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_BANK: + return junior_rc_right_quarter_turn_3_tiles_bank_paint_setup; + case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP: + return junior_rc_left_quarter_turn_3_tiles_25_deg_up_paint_setup; + case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP: + return junior_rc_right_quarter_turn_3_tiles_25_deg_up_paint_setup; + case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN: + return junior_rc_left_quarter_turn_3_tiles_25_deg_down_paint_setup; + case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN: + return junior_rc_right_quarter_turn_3_tiles_25_deg_down_paint_setup; + + case TRACK_ELEM_FLAT_TO_60_DEG_UP: + case TRACK_ELEM_60_DEG_UP_TO_FLAT: + case TRACK_ELEM_FLAT_TO_60_DEG_DOWN: + case TRACK_ELEM_60_DEG_DOWN_TO_FLAT: + return NULL; + + case TRACK_ELEM_LEFT_HALF_BANKED_HELIX_UP_SMALL: + return junior_rc_left_half_banked_helix_up_small_paint_setup; + case TRACK_ELEM_RIGHT_HALF_BANKED_HELIX_UP_SMALL: + return junior_rc_right_half_banked_helix_up_small_paint_setup; + case TRACK_ELEM_LEFT_HALF_BANKED_HELIX_DOWN_SMALL: + return junior_rc_left_half_banked_helix_down_small_paint_setup; + case TRACK_ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL: + return junior_rc_right_half_banked_helix_down_small_paint_setup; + case TRACK_ELEM_LEFT_HALF_BANKED_HELIX_UP_LARGE: + return junior_rc_left_half_banked_helix_up_large_paint_setup; + case TRACK_ELEM_RIGHT_HALF_BANKED_HELIX_UP_LARGE: + return junior_rc_right_half_banked_helix_up_large_paint_setup; + case TRACK_ELEM_LEFT_HALF_BANKED_HELIX_DOWN_LARGE: + return junior_rc_left_half_banked_helix_down_large_paint_setup; + case TRACK_ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE: + return junior_rc_right_half_banked_helix_down_large_paint_setup; + + case TRACK_ELEM_BRAKES: + return junior_rc_brake_paint_setup; + + case TRACK_ELEM_LEFT_EIGHTH_TO_DIAG: + return junior_rc_left_eighth_to_diag_paint_setup; + case TRACK_ELEM_RIGHT_EIGHTH_TO_DIAG: + return junior_rc_right_eighth_to_diag_paint_setup; + case TRACK_ELEM_LEFT_EIGHTH_TO_ORTHOGONAL: + return junior_rc_left_eighth_to_orthogonal_paint_setup; + case TRACK_ELEM_RIGHT_EIGHTH_TO_ORTHOGONAL: + return junior_rc_right_eighth_to_orthogonal_paint_setup; + case TRACK_ELEM_LEFT_EIGHTH_BANK_TO_DIAG: + return junior_rc_left_eighth_to_diag_bank_paint_setup; + case TRACK_ELEM_RIGHT_EIGHTH_BANK_TO_DIAG: + return junior_rc_right_eighth_to_diag_bank_paint_setup; + case TRACK_ELEM_LEFT_EIGHTH_BANK_TO_ORTHOGONAL: + return junior_rc_left_eighth_to_orthogonal_bank_paint_setup; + case TRACK_ELEM_RIGHT_EIGHTH_BANK_TO_ORTHOGONAL: + return junior_rc_right_eighth_to_orthogonal_bank_paint_setup; + case TRACK_ELEM_DIAG_FLAT: + return junior_rc_diag_flat_paint_setup; + case TRACK_ELEM_DIAG_25_DEG_UP: + return junior_rc_diag_25_deg_up_paint_setup; + case TRACK_ELEM_DIAG_60_DEG_UP: + return junior_rc_diag_60_deg_up_paint_setup; + case TRACK_ELEM_DIAG_FLAT_TO_25_DEG_UP: + return junior_rc_diag_flat_to_25_deg_up_paint_setup; + case TRACK_ELEM_DIAG_25_DEG_UP_TO_60_DEG_UP: + return junior_rc_diag_25_deg_up_to_60_deg_up_paint_setup; + case TRACK_ELEM_DIAG_60_DEG_UP_TO_25_DEG_UP: + return junior_rc_diag_60_deg_up_to_25_deg_up_paint_setup; + case TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT: + return junior_rc_diag_25_deg_up_to_flat_paint_setup; + case TRACK_ELEM_DIAG_25_DEG_DOWN: + return junior_rc_diag_25_deg_down_paint_setup; + case TRACK_ELEM_DIAG_60_DEG_DOWN: + return junior_rc_diag_60_deg_down_paint_setup; + case TRACK_ELEM_DIAG_FLAT_TO_25_DEG_DOWN: + return junior_rc_diag_flat_to_25_deg_down_paint_setup; + case TRACK_ELEM_DIAG_25_DEG_DOWN_TO_60_DEG_DOWN: + return junior_rc_diag_25_deg_down_to_60_deg_down_paint_setup; + case TRACK_ELEM_DIAG_60_DEG_DOWN_TO_25_DEG_DOWN: + return junior_rc_diag_60_deg_down_to_25_deg_down_paint_setup; + case TRACK_ELEM_DIAG_25_DEG_DOWN_TO_FLAT: + return junior_rc_diag_25_deg_down_to_flat_paint_setup; + + case TRACK_ELEM_DIAG_FLAT_TO_LEFT_BANK: + return junior_rc_diag_flat_to_left_bank_paint_setup; + case TRACK_ELEM_DIAG_FLAT_TO_RIGHT_BANK: + return junior_rc_diag_flat_to_right_bank_paint_setup; + case TRACK_ELEM_DIAG_LEFT_BANK_TO_FLAT: + return junior_rc_diag_left_bank_to_flat_paint_setup; + case TRACK_ELEM_DIAG_RIGHT_BANK_TO_FLAT: + return junior_rc_diag_right_bank_to_flat_paint_setup; + case TRACK_ELEM_DIAG_LEFT_BANK_TO_25_DEG_UP: + return junior_rc_diag_left_bank_to_25_deg_up_paint_setup; + case TRACK_ELEM_DIAG_RIGHT_BANK_TO_25_DEG_UP: + return junior_rc_diag_right_bank_to_25_deg_up_paint_setup; + case TRACK_ELEM_DIAG_25_DEG_UP_TO_LEFT_BANK: + return junior_rc_diag_25_deg_up_to_left_bank_paint_setup; + case TRACK_ELEM_DIAG_25_DEG_UP_TO_RIGHT_BANK: + return junior_rc_diag_25_deg_up_to_right_bank_paint_setup; + case TRACK_ELEM_DIAG_LEFT_BANK_TO_25_DEG_DOWN: + return junior_rc_diag_left_bank_to_25_deg_down_paint_setup; + case TRACK_ELEM_DIAG_RIGHT_BANK_TO_25_DEG_DOWN: + return junior_rc_diag_right_bank_to_25_deg_down_paint_setup; + case TRACK_ELEM_DIAG_25_DEG_DOWN_TO_LEFT_BANK: + return junior_rc_diag_25_deg_down_to_left_bank_paint_setup; + case TRACK_ELEM_DIAG_25_DEG_DOWN_TO_RIGHT_BANK: + return junior_rc_diag_25_deg_down_to_right_bank_paint_setup; + case TRACK_ELEM_DIAG_LEFT_BANK: + return junior_rc_diag_left_bank_paint_setup; + case TRACK_ELEM_DIAG_RIGHT_BANK: + return junior_rc_diag_right_bank_paint_setup; + + case TRACK_ELEM_BLOCK_BRAKES: + return junior_rc_block_brake_paint_setup; + } + return NULL; +} \ No newline at end of file diff --git a/src/ride/track.h b/src/ride/track.h index bbfdebeb8c..117ffcf1b0 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -380,7 +380,7 @@ enum { TRACK_ELEM_LEFT_FLYER_TWIST_UP, TRACK_ELEM_RIGHT_FLYER_TWIST_UP, TRACK_ELEM_LEFT_FLYER_TWIST_DOWN, - TRACK_ELEM_RIGHT_FLYER_TWIST_DOWN, + TRACK_ELEM_RIGHT_FLYER_TWIST_DOWN = 190, TRACK_ELEM_FLYER_HALF_LOOP_UP, TRACK_ELEM_FLYER_HALF_LOOP_DOWN, TRACK_ELEM_LEFT_FLYER_CORKSCREW_UP, @@ -390,7 +390,7 @@ enum { TRACK_ELEM_HEARTLINE_TRANSFER_UP, TRACK_ELEM_HEARTLINE_TRANSFER_DOWN, TRACK_ELEM_LEFT_HEARTLINE_ROLL, - TRACK_ELEM_RIGHT_HEARTLINE_ROLL, + TRACK_ELEM_RIGHT_HEARTLINE_ROLL = 200, TRACK_ELEM_MINI_GOLF_HOLE_A, TRACK_ELEM_MINI_GOLF_HOLE_B, TRACK_ELEM_MINI_GOLF_HOLE_C, @@ -400,7 +400,7 @@ enum { TRACK_ELEM_90_DEG_TO_INVERTED_FLAT_QUARTER_LOOP_UP, TRACK_ELEM_INVERTED_FLAT_TO_90_DEG_QUARTER_LOOP_DOWN, TRACK_ELEM_LEFT_CURVED_LIFT_HILL, - TRACK_ELEM_RIGHT_CURVED_LIFT_HILL, + TRACK_ELEM_RIGHT_CURVED_LIFT_HILL = 210, TRACK_ELEM_LEFT_REVERSER, TRACK_ELEM_RIGHT_REVERSER, TRACK_ELEM_AIR_THRUST_TOP_CAP, diff --git a/src/ride/track_data.c b/src/ride/track_data.c index 6874066cae..a6a37328c8 100644 --- a/src/ride/track_data.c +++ b/src/ride/track_data.c @@ -5566,7 +5566,7 @@ const TRACK_PAINT_FUNCTION_GETTER RideTypeTrackPaintFunctions[91] = { 0, // RIDE_TYPE_STAND_UP_ROLLER_COASTER 0, // RIDE_TYPE_SUSPENDED_SWINGING_COASTER 0, // RIDE_TYPE_INVERTED_ROLLER_COASTER - 0, // RIDE_TYPE_JUNIOR_ROLLER_COASTER + get_track_paint_function_junior_rc, // RIDE_TYPE_JUNIOR_ROLLER_COASTER 0, // RIDE_TYPE_MINIATURE_RAILWAY get_track_paint_function_monorail, // RIDE_TYPE_MONORAIL 0, // RIDE_TYPE_MINI_SUSPENDED_COASTER diff --git a/src/ride/track_paint.c b/src/ride/track_paint.c index 67cf16a8a7..638e03c4f6 100644 --- a/src/ride/track_paint.c +++ b/src/ride/track_paint.c @@ -551,6 +551,354 @@ void track_paint_util_draw_pier(rct_ride * ride, const rct_ride_entrance_definit } } +const rct_xy16 defaultRightHelixUpSmallQuarterBoundLengths[4][3][2] = { + { + {32, 20}, + {16, 16}, + {20, 32} + }, + { + {20, 32}, + {16, 16}, + { {32, 20}, {32, 1} } + }, + { + { {0}, {32, 1} }, + {16, 16}, + { {0}, {32, 20} } + }, + { + { {20, 32}, {1, 32} }, + {16, 16}, + {32, 20}, + } +}; + +const rct_xyz16 defaultRightHelixUpSmallQuarterBoundOffsets[4][3][2] = { + { + {0, 6}, + {16, 16}, + {6, 0}, + }, + { + {6, 0}, + {16, 0}, + { {0, 6}, {0, 21} }, + }, + { + { {0}, {0, 21} }, + {0, 0, 21}, + { {0}, {21, 0} }, + }, + { + { {6, 0}, {21, 0} }, + {0, 16}, + {0, 6}, + } +}; + +static const sint8 right_helix_up_small_quarter_tiles_sprite_map[] = {0, -1, 1, 2}; + +void track_paint_util_right_helix_up_small_quarter_tiles_paint(const sint8 thickness[2], sint16 height, int direction, uint8 trackSequence, uint32 colourFlags, const uint32 sprites[4][3][2], const rct_xy16 offsets[4][3][2], const rct_xy16 boundsLengths[4][3][2], const rct_xyz16 boundsOffsets[4][3][2], uint8 rotation) +{ + int index = right_helix_up_small_quarter_tiles_sprite_map[trackSequence]; + if (index < 0) { + return; + } + + if (sprites[direction][index][0] != 0) { + uint32 imageId = sprites[direction][index][0] | colourFlags; + rct_xy16 offset = (offsets == NULL ? (rct_xy16) { 0, 0 } : offsets[direction][index][0]); + rct_xy16 boundsLength = boundsLengths[direction][index][0]; + rct_xyz16 boundsOffset = (boundsOffsets == NULL ? (rct_xyz16) { .x = offset.x, .y = offset.y, .z = 0 } : boundsOffsets[direction][index][0]); + + sub_98197C(imageId, (sint8)offset.x, (sint8)offset.y, boundsLength.x, boundsLength.y, thickness[0], height, boundsOffset.x, boundsOffset.y, height + boundsOffset.z, rotation); + } + if (sprites[direction][index][1] != 0) { + uint32 imageId = sprites[direction][index][1] | colourFlags; + rct_xy16 offset = (offsets == NULL ? (rct_xy16){0, 0} : offsets[direction][index][1]); + rct_xy16 boundsLength = boundsLengths[direction][index][1]; + rct_xyz16 boundsOffset = (boundsOffsets == NULL ? (rct_xyz16){.x = offset.x, .y = offset.y, .z = 0} : boundsOffsets[direction][index][1]); + + sub_98197C(imageId, (sint8) offset.x, (sint8) offset.y, boundsLength.x, boundsLength.y, thickness[1], height, boundsOffset.x, boundsOffset.y, height + boundsOffset.z, rotation); + } +} + +const rct_xyz16 defaultRightHelixUpLargeQuarterBoundOffsets[4][5][2] = { + { + {0, 6}, + {0, 16}, + {0, 0}, + {16, 0}, + {6, 0}, + }, + { + {6, 0}, + {16, 0}, + {0, 16}, + {0, 0}, + { {0, 6}, {0, 27} }, + }, + { + { {0}, {0, 27} }, + {0, 0, 27}, + {16, 16, 27}, + {0, 0, 27}, + { {0}, {27, 0} }, + }, + { + {{6, 0}, {27, 0} }, + {0, 0}, + {16, 0}, + {0, 16}, + {0, 6}, + } +}; + +const rct_xy16 defaultRightHelixUpLargeQuarterBoundLengths[4][5][2] = { + { + {32, 20}, + {32, 16}, + {16, 16}, + {16, 32}, + {20, 32}, + }, + { + {20, 32}, + {16, 32}, + {16, 16}, + {32, 16}, + { {32, 20}, {32, 1} }, + }, + { + { {0}, {32, 1} }, + {32, 16}, + {16, 16}, + {16, 32}, + { {0}, {1, 32} }, + }, + { + {{20, 32}, {1, 32} }, + {16, 32}, + {16, 16}, + {32, 16}, + {32, 20}, + } +}; + +static const sint8 right_helix_up_large_quarter_sprite_map[] = {0, -1, 1, 2, -1, 3, 4}; +void track_paint_util_right_helix_up_large_quarter_tiles_paint(const sint8 thickness[2], sint16 height, int direction, uint8 trackSequence, uint32 colourFlags, const uint32 sprites[4][5][2], const rct_xy16 offsets[4][5][2], const rct_xy16 boundsLengths[4][5][2], const rct_xyz16 boundsOffsets[4][5][2], uint8 rotation) +{ + int index = right_helix_up_large_quarter_sprite_map[trackSequence]; + if (index < 0) { + return; + } + + if (sprites[direction][index][0] != 0) { + uint32 imageId = sprites[direction][index][0] | colourFlags; + rct_xy16 offset = (offsets == NULL ? (rct_xy16) { 0, 0 } : offsets[direction][index][0]); + rct_xy16 boundsLength = boundsLengths[direction][index][0]; + rct_xyz16 boundsOffset = (boundsOffsets == NULL ? (rct_xyz16) { .x = offset.x, .y = offset.y, .z = 0 } : boundsOffsets[direction][index][0]); + + sub_98197C(imageId, (sint8)offset.x, (sint8)offset.y, boundsLength.x, boundsLength.y, thickness[0], height, boundsOffset.x, boundsOffset.y, height + boundsOffset.z, rotation); + } + if (sprites[direction][index][1] != 0) { + uint32 imageId = sprites[direction][index][1] | colourFlags; + rct_xy16 offset = (offsets == NULL ? (rct_xy16){0, 0} : offsets[direction][index][1]); + rct_xy16 boundsLength = boundsLengths[direction][index][1]; + rct_xyz16 boundsOffset = (boundsOffsets == NULL ? (rct_xyz16){.x = offset.x, .y = offset.y, .z = 0} : boundsOffsets[direction][index][1]); + + sub_98197C(imageId, (sint8) offset.x, (sint8) offset.y, boundsLength.x, boundsLength.y, thickness[1], height, boundsOffset.x, boundsOffset.y, height + boundsOffset.z, rotation); + } +} + +const rct_xy16 defaultLeftEighthToDiagBoundLengths[4][4] = { + { + {32, 20}, + {32, 16}, + {16, 16}, + {16, 16}, + }, + { + {20, 32}, + {16, 34}, + {16, 16}, + {18, 16}, + }, + { + {32, 20}, + {32, 16}, + {16, 16}, + {16, 16}, + }, + { + {20, 32}, + {16, 32}, + {16, 16}, + {16, 16}, + }, +}; + +const rct_xyz16 defaultLeftEighthToDiagBoundOffsets[4][4] = { + { + {0, 6}, + {0, 0}, + {0, 16}, + {16, 16}, + }, + { + {6, 0}, + {0, 0}, + {16, 16}, + {16, 0}, + }, + { + {0, 6}, + {0, 16}, + {16, 0}, + {0, 0}, + }, + { + {6, 0}, + {16, 0}, + {0, 0}, + {0, 16}, + }, +}; + +const rct_xy16 defaultRightEighthToDiagBoundLengths[4][4] = { + { + {32, 20}, + {32, 16}, + {16, 16}, + {16, 16}, + }, + { + {20, 32}, + {16, 32}, + {16, 16}, + {16, 16}, + }, + { + {32, 20}, + {34, 16}, + {28, 28}, + {16, 18}, + }, + { + {20, 32}, + {16, 32}, + {16, 16}, + {16, 16}, + }, +}; + +const rct_xyz16 defaultRightEighthToDiagBoundOffsets[4][4] = { + { + {0, 6}, + {0, 16}, + {0, 0}, + {16, 0}, + }, + { + {6, 0}, + {16, 0}, + {0, 16}, + {0, 0}, + }, + { + {0, 6}, + {0, 0}, + {4, 4}, + {0, 16}, + }, + { + {6, 0}, + {0, 0}, + {16, 0}, + {16, 16}, + }, +}; + +const sint8 defaultEighthToDiagThickness[4][4] = { + { + 1, + 1, + 1, + 1, + }, + { + 1, + 1, + 1, + 1, + }, + { + 1, + 1, + 1, + 1, + }, + { + 1, + 1, + 1, + 1, + }, +}; + +static const sint8 eighth_to_diag_sprite_map[] = {0, 1, 2, -1, 3}; +void track_paint_util_eighth_to_diag_tiles_paint(const sint8 thickness[4][4], sint16 height, int direction, uint8 trackSequence, uint32 colourFlags, const uint32 sprites[4][4], const rct_xy16 offsets[4][4], const rct_xy16 boundsLengths[4][4], const rct_xyz16 boundsOffsets[4][4], uint8 rotation) +{ + int index = eighth_to_diag_sprite_map[trackSequence]; + if (index < 0) { + return; + } + + uint32 imageId = sprites[direction][index] | colourFlags; + rct_xy16 offset = (offsets == NULL ? (rct_xy16) { 0, 0 } : offsets[direction][index]); + rct_xy16 boundsLength = boundsLengths[direction][index]; + rct_xyz16 boundsOffset = (boundsOffsets == NULL ? (rct_xyz16) { .x = offset.x, .y = offset.y, .z = 0 } : boundsOffsets[direction][index]); + + sub_98197C(imageId, (sint8)offset.x, (sint8)offset.y, boundsLength.x, boundsLength.y, thickness[direction][index], height, boundsOffset.x, boundsOffset.y, height + boundsOffset.z, rotation); +} + +const rct_xy16 defaultDiagTileOffsets[4] = { + {-16, -16}, + {-16, -16}, + {-16, -16}, + {-16, -16}, +}; + +const rct_xy16 defaultDiagBoundLengths[4] = { + {32, 32}, + {32, 32}, + {32, 32}, + {32, 32}, +}; + +static const sint8 diag_sprite_map[4][4] = { + {-1, 0, -1, -1}, + {-1, -1, -1, 0}, + {-1, -1, 0, -1}, + {0, -1, -1, -1}, +}; + +void track_paint_util_diag_tiles_paint(sint8 thickness, sint16 height, int direction, uint8 trackSequence, uint32 colourFlags, const uint32 sprites[4], const rct_xy16 offsets[4], const rct_xy16 boundsLengths[4], const rct_xyz16 boundsOffsets[4], uint8 rotation) +{ + int index = diag_sprite_map[direction][trackSequence]; + if (index < 0) { + return; + } + + uint32 imageId = sprites[direction] | colourFlags; + rct_xy16 offset = (offsets == NULL ? (rct_xy16) { 0, 0 } : offsets[direction]); + rct_xy16 boundsLength = boundsLengths[direction]; + rct_xyz16 boundsOffset = (boundsOffsets == NULL ? (rct_xyz16) { .x = offset.x, .y = offset.y, .z = 0 } : boundsOffsets[direction]); + + sub_98197C(imageId, (sint8)offset.x, (sint8)offset.y, boundsLength.x, boundsLength.y, thickness, height, boundsOffset.x, boundsOffset.y, height + boundsOffset.z, rotation); +} + const uint8 mapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[] = {6, 4, 5, 3, 1, 2, 0}; const rct_xy16 defaultRightQuarterTurn5TilesOffsets[4][5] = { @@ -916,7 +1264,7 @@ void track_paint(uint8 direction, int height, rct_map_element *mapElement) } int rideType = ride->type; - if (rideType == RIDE_TYPE_JUNIOR_ROLLER_COASTER) { + if (rideType == RIDE_TYPE_JUNIOR_ROLLER_COASTER && gUseOriginalRidePaint) { switch (trackType) { case TRACK_ELEM_60_DEG_UP: case TRACK_ELEM_25_DEG_UP_TO_60_DEG_UP: diff --git a/src/ride/track_paint.h b/src/ride/track_paint.h index be522c3a93..2732ad086d 100644 --- a/src/ride/track_paint.h +++ b/src/ride/track_paint.h @@ -187,6 +187,21 @@ extern const uint8 mapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[]; extern const rct_xy16 defaultRightQuarterTurn3TilesOffsets[4][3]; extern const rct_xy16 defaultRightQuarterTurn3TilesBoundLengths[4][3]; +extern const rct_xy16 defaultRightHelixUpSmallQuarterBoundLengths[4][3][2]; +extern const rct_xyz16 defaultRightHelixUpSmallQuarterBoundOffsets[4][3][2]; + +extern const rct_xy16 defaultRightHelixUpLargeQuarterBoundLengths[4][5][2]; +extern const rct_xyz16 defaultRightHelixUpLargeQuarterBoundOffsets[4][5][2]; + +extern const rct_xyz16 defaultLeftEighthToDiagBoundOffsets[4][4]; +extern const rct_xy16 defaultLeftEighthToDiagBoundLengths[4][4]; +extern const rct_xyz16 defaultRightEighthToDiagBoundOffsets[4][4]; +extern const rct_xy16 defaultRightEighthToDiagBoundLengths[4][4]; +extern const sint8 defaultEighthToDiagThickness[4][4]; + +extern const rct_xy16 defaultDiagBoundLengths[4]; +extern const rct_xy16 defaultDiagTileOffsets[4]; + extern bool gUseOriginalRidePaint; bool track_paint_util_has_fence(enum edge edge, rct_xy16 position, rct_map_element * mapElement, rct_ride * ride, uint8 rotation); @@ -207,6 +222,10 @@ void track_paint_util_left_quarter_turn_3_tiles_tunnel(sint16 height, uint8 dire void track_paint_util_left_quarter_turn_1_tile_paint(sint8 thickness, sint16 height, sint16 boundBoxZOffset, int direction, uint32 colourFlags, const uint32 * sprites, uint8 rotation); void track_paint_util_left_quarter_turn_1_tile_tunnel(sint16 height, uint8 direction, uint8 trackSequence); void track_paint_util_spinning_tunnel_paint(sint8 thickness, sint16 height, uint8 direction, uint8 rotation); +void track_paint_util_right_helix_up_small_quarter_tiles_paint(const sint8 thickness[2], sint16 height, int direction, uint8 trackSequence, uint32 colourFlags, const uint32 sprites[4][3][2], const rct_xy16 offsets[4][3][2], const rct_xy16 boundsLengths[4][3][2], const rct_xyz16 boundsOffsets[4][3][2], uint8 rotation); +void track_paint_util_right_helix_up_large_quarter_tiles_paint(const sint8 thickness[2], sint16 height, int direction, uint8 trackSequence, uint32 colourFlags, const uint32 sprites[4][5][2], const rct_xy16 offsets[4][5][2], const rct_xy16 boundsLengths[4][5][2], const rct_xyz16 boundsOffsets[4][5][2], uint8 rotation); +void track_paint_util_eighth_to_diag_tiles_paint(const sint8 thickness[4][4], sint16 height, int direction, uint8 trackSequence, uint32 colourFlags, const uint32 sprites[4][4], const rct_xy16 offsets[4][4], const rct_xy16 boundsLengths[4][4], const rct_xyz16 boundsOffsets[4][4], uint8 rotation); +void track_paint_util_diag_tiles_paint(sint8 thickness, sint16 height, int direction, uint8 trackSequence, uint32 colourFlags, const uint32 sprites[4], const rct_xy16 offsets[4], const rct_xy16 boundsLengths[4], const rct_xyz16 boundsOffsets[4], uint8 rotation); typedef void (*TRACK_PAINT_FUNCTION)(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement); typedef TRACK_PAINT_FUNCTION (*TRACK_PAINT_FUNCTION_GETTER)(int trackType, int direction); @@ -248,5 +267,6 @@ TRACK_PAINT_FUNCTION get_track_paint_function_magic_carpet(int trackType, int di TRACK_PAINT_FUNCTION get_track_paint_function_submarine_ride(int trackType, int direction); TRACK_PAINT_FUNCTION get_track_paint_function_river_rafts(int trackType, int direction); TRACK_PAINT_FUNCTION get_track_paint_function_enterprise(int trackType, int direction); +TRACK_PAINT_FUNCTION get_track_paint_function_junior_rc(int trackType, int direction); #endif diff --git a/src/ride/vehicle.c b/src/ride/vehicle.c index d13d7efe73..cb30487c7b 100644 --- a/src/ride/vehicle.c +++ b/src/ride/vehicle.c @@ -5644,13 +5644,13 @@ static void check_and_apply_block_section_stop_site(rct_vehicle *vehicle) switch (trackType) { case TRACK_ELEM_BLOCK_BRAKES: if (ride_is_block_sectioned(ride)) - apply_block_brakes(vehicle, trackElement->flags & MAP_ELEMENT_FLAG_BLOCK_BREAK_CLOSED); + apply_block_brakes(vehicle, trackElement->flags & MAP_ELEMENT_FLAG_BLOCK_BRAKE_CLOSED); else apply_non_stop_block_brake(vehicle, true); break; case TRACK_ELEM_END_STATION: - if (trackElement->flags & MAP_ELEMENT_FLAG_BLOCK_BREAK_CLOSED) + if (trackElement->flags & MAP_ELEMENT_FLAG_BLOCK_BRAKE_CLOSED) RCT2_GLOBAL(0x00F64E18, uint32) |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_10; break; @@ -5661,12 +5661,11 @@ static void check_and_apply_block_section_stop_site(rct_vehicle *vehicle) case TRACK_ELEM_DIAG_60_DEG_UP_TO_FLAT: if(ride_is_block_sectioned(ride)){ if(trackType == TRACK_ELEM_CABLE_LIFT_HILL || track_element_is_lift_hill(trackElement)) { - if (trackElement->flags & MAP_ELEMENT_FLAG_BLOCK_BREAK_CLOSED) { + if (trackElement->flags & MAP_ELEMENT_FLAG_BLOCK_BRAKE_CLOSED) { apply_block_brakes(vehicle, true); } } } - break; } } @@ -5727,7 +5726,7 @@ static void vehicle_update_block_breaks_open_previous_section(rct_vehicle *vehic if (mapElement == NULL) { return; } - mapElement->flags &= ~MAP_ELEMENT_FLAG_BLOCK_BREAK_CLOSED; + mapElement->flags &= ~MAP_ELEMENT_FLAG_BLOCK_BRAKE_CLOSED; map_invalidate_element(x, y, mapElement); int trackType = mapElement->properties.track.type; @@ -6992,7 +6991,7 @@ static bool vehicle_update_track_motion_forwards_get_new_track(rct_vehicle *vehi if (track_element_is_block_start(mapElement)) { if (vehicle->next_vehicle_on_train == SPRITE_INDEX_NULL) { - mapElement->flags |= MAP_ELEMENT_FLAG_BLOCK_BREAK_CLOSED; + mapElement->flags |= MAP_ELEMENT_FLAG_BLOCK_BRAKE_CLOSED; if (trackType == TRACK_ELEM_BLOCK_BRAKES || trackType == TRACK_ELEM_END_STATION) { if (!(rideEntry->vehicles[0].flags_b & VEHICLE_ENTRY_FLAG_B_3)) { audio_play_sound_at_location(SOUND_49, vehicle->track_x, vehicle->track_y, vehicle->track_z); diff --git a/src/world/map.h b/src/world/map.h index eb4d3b2a4f..78038b5e62 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -149,7 +149,7 @@ enum { enum { MAP_ELEMENT_FLAG_GHOST = (1 << 4), MAP_ELEMENT_FLAG_BROKEN = (1 << 5), - MAP_ELEMENT_FLAG_BLOCK_BREAK_CLOSED = (1 << 5), + MAP_ELEMENT_FLAG_BLOCK_BRAKE_CLOSED = (1 << 5), MAP_ELEMENT_FLAG_LAST_TILE = (1 << 7) };