From 7d3cd99c0cb10b127ba0902cadcb0f250f04b5b7 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Sat, 22 Oct 2016 17:04:44 +0200 Subject: [PATCH 1/5] Combine Junior RC and Water RC drawing --- src/ride/coaster/junior_roller_coaster.c | 1583 ++++++++++++---------- src/ride/coaster/junior_roller_coaster.h | 60 + src/ride/water/water_coaster.c | 607 +++------ 3 files changed, 1124 insertions(+), 1126 deletions(-) create mode 100644 src/ride/coaster/junior_roller_coaster.h diff --git a/src/ride/coaster/junior_roller_coaster.c b/src/ride/coaster/junior_roller_coaster.c index a7ab95c820..ddcb094f4d 100644 --- a/src/ride/coaster/junior_roller_coaster.c +++ b/src/ride/coaster/junior_roller_coaster.c @@ -14,7 +14,7 @@ *****************************************************************************/ #pragma endregion -#include "../../config.h" +#include "junior_roller_coaster.h" #include "../../drawing/drawing.h" #include "../../paint/supports.h" #include "../../interface/viewport.h" @@ -27,7 +27,6 @@ #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, @@ -206,6 +205,20 @@ enum { 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_WATER_RC_FLAT_CHAIN_SW_NE = 27983, + SPR_WATER_RC_FLAT_CHAIN_NW_SE = 27984, + SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_SW_NE = 27985, + SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_NW_SE = 27986, + SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_NE_SW = 27987, + SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_SE_NW = 27988, + SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_SW_NE = 27989, + SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_NW_SE = 27990, + SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_NE_SW = 27991, + SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_SE_NW = 27992, + SPR_WATER_RC_25_DEG_CHAIN_SW_NE = 27993, + SPR_WATER_RC_25_DEG_CHAIN_NW_SE = 27994, + SPR_WATER_RC_25_DEG_CHAIN_NE_SW = 27995, + SPR_WATER_RC_25_DEG_CHAIN_SE_NW = 27996, 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, @@ -434,6 +447,7 @@ enum { 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, @@ -450,18 +464,35 @@ enum { 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_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_WATER_RC_DIAG_FLAT_CHAIN_W_E = 28269, + SPR_WATER_RC_DIAG_FLAT_CHAIN_N_S = 28270, + SPR_WATER_RC_DIAG_FLAT_CHAIN_E_W = 28271, + SPR_WATER_RC_DIAG_FLAT_CHAIN_S_N = 28272, + SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_W_E = 28273, + SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_N_S = 28274, + SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_E_W = 28275, + SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_S_N = 28276, + SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_W_E = 28277, + SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_N_S = 28278, + SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_E_W = 28279, + SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_S_N = 28280, + SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_W_E = 28281, + SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_N_S = 28282, + SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_E_W = 28283, + SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_S_N = 28284, 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, @@ -590,7 +621,7 @@ enum { SPR_JUNIOR_RC_60_DEG_UP_TO_FLAT_CHAIN_NE_SW_PART_0_2 = SPR_G2_BEGIN + 57, }; -static const uint32 junior_rc_track_pieces_flat[2][4] = { +static const uint32 junior_rc_track_pieces_flat[3][4] = { { SPR_JUNIOR_RC_FLAT_SW_NE, SPR_JUNIOR_RC_FLAT_NW_SE, @@ -603,6 +634,12 @@ static const uint32 junior_rc_track_pieces_flat[2][4] = { SPR_JUNIOR_RC_FLAT_CHAIN_SW_NE, SPR_JUNIOR_RC_FLAT_CHAIN_NW_SE }, + { + SPR_WATER_RC_FLAT_CHAIN_SW_NE, + SPR_WATER_RC_FLAT_CHAIN_NW_SE, + SPR_WATER_RC_FLAT_CHAIN_SW_NE, + SPR_WATER_RC_FLAT_CHAIN_NW_SE, + }, }; static const uint32 junior_rc_track_pieces_block_brake[2][4] = { @@ -635,7 +672,7 @@ static const uint32 junior_rc_track_pieces_station[2][4] = { }, }; -static const uint32 junior_rc_track_pieces_25_deg_up[2][4] = { +static const uint32 junior_rc_track_pieces_25_deg_up[3][4] = { { SPR_JUNIOR_RC_25_DEG_SW_NE, SPR_JUNIOR_RC_25_DEG_NW_SE, @@ -648,9 +685,15 @@ static const uint32 junior_rc_track_pieces_25_deg_up[2][4] = { SPR_JUNIOR_RC_25_DEG_CHAIN_NE_SW, SPR_JUNIOR_RC_25_DEG_CHAIN_SE_NW }, + { + SPR_WATER_RC_25_DEG_CHAIN_SW_NE, + SPR_WATER_RC_25_DEG_CHAIN_NW_SE, + SPR_WATER_RC_25_DEG_CHAIN_NE_SW, + SPR_WATER_RC_25_DEG_CHAIN_SE_NW, + }, }; -static const uint32 junior_rc_track_pieces_flat_to_25_deg_up[2][4] = { +static const uint32 junior_rc_track_pieces_flat_to_25_deg_up[3][4] = { { SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_SW_NE, SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_NW_SE, @@ -663,9 +706,15 @@ static const uint32 junior_rc_track_pieces_flat_to_25_deg_up[2][4] = { SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_CHAIN_NE_SW, SPR_JUNIOR_RC_FLAT_TO_25_DEG_UP_CHAIN_SE_NW }, + { + SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_SW_NE, + SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_NW_SE, + SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_NE_SW, + SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_SE_NW, + }, }; -static const uint32 junior_rc_track_pieces_25_deg_up_to_flat[2][4] = { +static const uint32 junior_rc_track_pieces_25_deg_up_to_flat[3][4] = { { SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_SW_NE, SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_NW_SE, @@ -678,6 +727,12 @@ static const uint32 junior_rc_track_pieces_25_deg_up_to_flat[2][4] = { SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_CHAIN_NE_SW, SPR_JUNIOR_RC_25_DEG_UP_TO_FLAT_CHAIN_SE_NW }, + { + SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_SW_NE, + SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_NW_SE, + SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_NE_SW, + SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_SE_NW, + }, }; static const uint32 junior_rc_track_pieces_flat_to_left_bank[4][2] = { @@ -1325,7 +1380,7 @@ static const uint32 junior_rc_track_pieces_right_eight_to_diag_bank[4][4] = { }, }; -static const uint32 junior_rc_track_pieces_diag_flat[2][4] = { +static const uint32 junior_rc_track_pieces_diag_flat[3][4] = { { SPR_JUNIOR_RC_DIAG_FLAT_W_E, SPR_JUNIOR_RC_DIAG_FLAT_N_S, @@ -1338,9 +1393,15 @@ static const uint32 junior_rc_track_pieces_diag_flat[2][4] = { SPR_JUNIOR_RC_DIAG_FLAT_CHAIN_E_W, SPR_JUNIOR_RC_DIAG_FLAT_CHAIN_S_N }, + { + SPR_WATER_RC_DIAG_FLAT_CHAIN_W_E, + SPR_WATER_RC_DIAG_FLAT_CHAIN_N_S, + SPR_WATER_RC_DIAG_FLAT_CHAIN_E_W, + SPR_WATER_RC_DIAG_FLAT_CHAIN_S_N + }, }; -static const uint32 junior_rc_track_pieces_diag_25_deg_up[2][4] = { +static const uint32 junior_rc_track_pieces_diag_25_deg_up[3][4] = { { SPR_JUNIOR_RC_DIAG_25_DEG_UP_W_E, SPR_JUNIOR_RC_DIAG_25_DEG_UP_N_S, @@ -1353,9 +1414,15 @@ static const uint32 junior_rc_track_pieces_diag_25_deg_up[2][4] = { SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_E_W, SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_S_N }, + { + SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_W_E, + SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_N_S, + SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_E_W, + SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_S_N + }, }; -static const uint32 junior_rc_track_pieces_diag_flat_to_25_deg_up[2][4] = { +static const uint32 junior_rc_track_pieces_diag_flat_to_25_deg_up[3][4] = { { SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_W_E, SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_N_S, @@ -1368,9 +1435,15 @@ static const uint32 junior_rc_track_pieces_diag_flat_to_25_deg_up[2][4] = { 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_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_W_E, + SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_N_S, + SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_E_W, + SPR_WATER_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] = { +static const uint32 junior_rc_track_pieces_diag_25_deg_up_to_flat[3][4] = { { SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_W_E, SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_N_S, @@ -1383,9 +1456,15 @@ static const uint32 junior_rc_track_pieces_diag_25_deg_up_to_flat[2][4] = { 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_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_W_E, + SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_N_S, + SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_E_W, + SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_S_N + }, }; -static const uint32 junior_rc_track_pieces_diag_25_deg_down[2][4] = { +static const uint32 junior_rc_track_pieces_diag_25_deg_down[3][4] = { { SPR_JUNIOR_RC_DIAG_25_DEG_UP_E_W, SPR_JUNIOR_RC_DIAG_25_DEG_UP_S_N, @@ -1398,9 +1477,15 @@ static const uint32 junior_rc_track_pieces_diag_25_deg_down[2][4] = { SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_W_E, SPR_JUNIOR_RC_DIAG_25_DEG_UP_CHAIN_N_S, }, + { + SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_E_W, + SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_S_N, + SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_W_E, + SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_N_S, + }, }; -static const uint32 junior_rc_track_pieces_diag_flat_to_25_deg_down[2][4] = { +static const uint32 junior_rc_track_pieces_diag_flat_to_25_deg_down[3][4] = { { SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_E_W, SPR_JUNIOR_RC_DIAG_25_DEG_UP_TO_FLAT_S_N, @@ -1413,9 +1498,15 @@ static const uint32 junior_rc_track_pieces_diag_flat_to_25_deg_down[2][4] = { 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_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_E_W, + SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_S_N, + SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_W_E, + SPR_WATER_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] = { +static const uint32 junior_rc_track_pieces_diag_25_deg_down_to_flat[3][4] = { { SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_E_W, SPR_JUNIOR_RC_DIAG_FLAT_TO_25_DEG_UP_S_N, @@ -1428,6 +1519,12 @@ static const uint32 junior_rc_track_pieces_diag_25_deg_down_to_flat[2][4] = { 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_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_E_W, + SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_S_N, + SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_W_E, + SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_N_S, + }, }; static const uint32 junior_rc_track_pieces_diag_flat_to_left_bank[4] = { @@ -1693,23 +1790,13 @@ static const uint32 junior_rc_track_pieces_diag_60_deg_down_to_25_deg_down[2][4] }, }; -/* rct2: 0x00518394 */ -static void junior_rc_flat_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement){ - rct_xy16 position = {gPaintMapPosition.x, gPaintMapPosition.y}; - uint32 imageId = 0; - bool isChained = mapElement->type & (1 << 7); +void junior_rc_paint_track_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + uint32 imageId = junior_rc_track_pieces_flat[chainType][direction] | gTrackColours[SCHEME_TRACK]; + sub_98196C_rotated(direction, imageId, 0, 6, 32, 20, 1, height); + paint_util_push_tunnel_rotated(direction, height, TUNNEL_0); - if (direction & 1) { - imageId = junior_rc_track_pieces_flat[isChained][direction] | gTrackColours[SCHEME_TRACK]; - 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] | gTrackColours[SCHEME_TRACK]; - 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)) { + if (track_paint_util_should_paint_supports(gPaintMapPosition)) { metal_a_supports_paint_setup((direction & 1) ? 2 : 1, 4, 0, height, gTrackColours[SCHEME_SUPPORTS]); } @@ -1717,8 +1804,718 @@ static void junior_rc_flat_paint_setup(uint8 rideIndex, uint8 trackSequence, uin 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) { +void junior_rc_paint_track_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + uint32 imageId = junior_rc_track_pieces_25_deg_up[chainType][direction] | gTrackColours[SCHEME_TRACK]; + sub_98196C_rotated(direction, imageId, 0, 6, 32, 20, 1, height); + + sint8 tunnel_height[4] = { -8, 8, 8, -8 }; + uint8 tunnel_type[4] = { TUNNEL_1, TUNNEL_2, TUNNEL_2, TUNNEL_1 }; + paint_util_push_tunnel_rotated(direction, height + tunnel_height[direction], tunnel_type[direction]); + + if (track_paint_util_should_paint_supports(gPaintMapPosition)) { + int supportType = direction & 1 ? 2 : 1; + metal_a_supports_paint_setup(supportType, 4, 8, height, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +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}, +}; + +void junior_rc_paint_track_60_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + uint32 image_id = gTrackColours[SCHEME_TRACK]; + + image_id |= junior_rc_track_pieces_60_deg_up[chainType][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 = {gPaintMapPosition.x, gPaintMapPosition.y}; + + 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_flat_to_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + uint32 imageId = junior_rc_track_pieces_flat_to_25_deg_up[chainType][direction] | gTrackColours[SCHEME_TRACK]; + + sub_98196C_rotated(direction, imageId, 0, 6, 32, 20, 1, height); + if (direction == 0 || direction == 3) { + paint_util_push_tunnel_rotated(direction, height, TUNNEL_0); + } else { + paint_util_push_tunnel_rotated(direction, height, TUNNEL_2); + } + + if (track_paint_util_should_paint_supports(gPaintMapPosition)) { + int supportType = direction & 1 ? 2 : 1; + uint16 ax = (direction == 0) ? 5 : 3; + metal_a_supports_paint_setup(supportType, 4, ax, height, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +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}}, +}; + +void junior_rc_paint_track_25_deg_up_to_60_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + uint32 image_id = gTrackColours[SCHEME_TRACK]; + + image_id |= junior_rc_track_pieces_25_deg_up_to_60_deg_up[chainType][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[chainType][direction][1] != 0) { + image_id = gTrackColours[SCHEME_TRACK]; + + image_id |= junior_rc_track_pieces_25_deg_up_to_60_deg_up[chainType][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 = {gPaintMapPosition.x, gPaintMapPosition.y}; + + 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_60_deg_up_to_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + uint32 image_id = gTrackColours[SCHEME_TRACK]; + + image_id |= junior_rc_track_pieces_60_deg_up_to_25_deg_up[chainType][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[chainType][direction][1] != 0) { + image_id = gTrackColours[SCHEME_TRACK]; + + image_id |= junior_rc_track_pieces_60_deg_up_to_25_deg_up[chainType][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 = {gPaintMapPosition.x, gPaintMapPosition.y}; + + if (track_paint_util_should_paint_supports(pos)) { + metal_a_supports_paint_setup(direction & 1 ? 2 : 1, 4, 20, height, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + + +void junior_rc_paint_track_25_deg_up_to_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + uint32 imageId = junior_rc_track_pieces_25_deg_up_to_flat[chainType][direction] | gTrackColours[SCHEME_TRACK]; + sub_98196C_rotated(direction, imageId, 0, 6, 32, 20, 1, height); + + 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) { + paint_util_push_tunnel_right(tunnelHeight, tunnelType); + } + else { + paint_util_push_tunnel_left(tunnelHeight, tunnelType); + } + + const rct_xy16 pos = {gPaintMapPosition.x, gPaintMapPosition.y}; + + if (track_paint_util_should_paint_supports(gPaintMapPosition)) { + int supportType = direction & 1 ? 2 : 1; + metal_a_supports_paint_setup(supportType, 4, 6, height, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_left_quarter_turn_5_tiles_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_right_quarter_turn_5_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_left_quarter_turn_5_tiles_25_deg_up[chainType], junior_rc_left_quarter_turn_5_tiles_25_deg_up_offsets, defaultRightQuarterTurn5TilesBoundLengths, NULL, get_current_rotation()); + + uint8 supportSpecial[4] = { 8, 8, 8, 3 }; + switch (trackSequence) { + case 0: + metal_a_supports_paint_setup((direction & 1) ? 2 : 1, 4, (direction == 0 || direction == 3) ? 10 : 8, height, gTrackColours[SCHEME_SUPPORTS]); + break; + case 6: + metal_a_supports_paint_setup((direction & 1) ? 1 : 2, 4, supportSpecial[direction], height, gTrackColours[SCHEME_SUPPORTS]); + 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); + } +} + +void junior_rc_paint_track_right_quarter_turn_5_tiles_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_right_quarter_turn_5_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_right_quarter_turn_5_tiles_25_deg_up[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + break; + case 6: + metal_a_supports_paint_setup((direction & 1) ? 1 : 2, 4, 8, height, gTrackColours[SCHEME_SUPPORTS]); + 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); + } +} + +void junior_rc_paint_track_right_quarter_turn_3_tiles_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + 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[chainType][direction][0] | gTrackColours[SCHEME_TRACK]; + 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[chainType][direction][1] | gTrackColours[SCHEME_TRACK]; + 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, gTrackColours[SCHEME_SUPPORTS]); + 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); +} + +void junior_rc_paint_track_right_quarter_turn_3_tiles_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + 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[chainType][direction][0] | gTrackColours[SCHEME_TRACK]; + 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[chainType][direction][1] | gTrackColours[SCHEME_TRACK]; + 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_2); + } + + 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, gTrackColours[SCHEME_SUPPORTS]); + 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 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}; + +void junior_rc_paint_track_diag_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_flat[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_25_deg_up[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_60_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_60_deg_up[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_flat_to_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_flat_to_25_deg_up[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_25_deg_up_to_60_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_25_deg_up_to_60_deg_up[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_60_deg_up_to_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + if (direction == 1 && trackSequence == 3) { + sub_98197C( + junior_rc_track_pieces_diag_60_deg_up_to_25_deg_up[chainType][direction] | gTrackColours[SCHEME_TRACK], + -16, -16, + 16, 16, 1, + height, + 0, 0, height, + get_current_rotation() + ); + } else { + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_60_deg_up_to_25_deg_up[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_25_deg_up_to_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_25_deg_up_to_flat[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_25_deg_down[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_60_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_60_deg_down[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_flat_to_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_flat_to_25_deg_down[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_25_deg_down_to_60_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + if (direction == 3 && trackSequence == 0) { + sub_98197C( + junior_rc_track_pieces_diag_25_deg_down_to_60_deg_down[chainType][direction] | gTrackColours[SCHEME_TRACK], + -16, -16, + 16, 16, 1, + height, + 0, 0, height, + get_current_rotation() + ); + } else { + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_25_deg_down_to_60_deg_down[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_60_deg_down_to_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_60_deg_down_to_25_deg_down[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_25_deg_down_to_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_25_deg_down_to_flat[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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: 0x00518394 */ +static void junior_rc_flat_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement){ + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_flat(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); +} + +void junior_rc_paint_station(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, uint8 rideType) { rct_ride * ride = get_ride(rideIndex); const rct_ride_entrance_definition * entranceStyle = &RideEntranceDefinitions[ride->entrance_style]; uint32 imageId = entranceStyle->base_image_id; @@ -1734,7 +2531,7 @@ static void paint_junior_rc_station_track(uint8 rideIndex, uint8 trackSequence, 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) { + if (mapElement->properties.track.type == TRACK_ELEM_END_STATION && rideType == RIDE_TYPE_JUNIOR_ROLLER_COASTER) { imageId = junior_rc_track_pieces_block_brake[isBraked][direction] | gTrackColours[SCHEME_TRACK]; }else{ imageId = junior_rc_track_pieces_station[false][direction] | gTrackColours[SCHEME_TRACK]; @@ -1751,7 +2548,7 @@ static void paint_junior_rc_station_track(uint8 rideIndex, uint8 trackSequence, 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) { + if (mapElement->properties.track.type == TRACK_ELEM_END_STATION && rideType == RIDE_TYPE_JUNIOR_ROLLER_COASTER) { imageId = junior_rc_track_pieces_block_brake[isBraked][direction] | gTrackColours[SCHEME_TRACK]; }else{ imageId = junior_rc_track_pieces_station[false][direction] | gTrackColours[SCHEME_TRACK]; @@ -1769,101 +2566,28 @@ static void paint_junior_rc_station_track(uint8 rideIndex, uint8 trackSequence, 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) +{ + junior_rc_paint_station(rideIndex, trackSequence, direction, height, mapElement, RIDE_TYPE_JUNIOR_ROLLER_COASTER); +} + /* 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 = gTrackColours[SCHEME_TRACK]; - - bool isChained = mapElement->type & (1 << 7); - - image_id |= junior_rc_track_pieces_25_deg_up[isChained][direction]; - - sint8 tunnel_height[4] = { -8, 8, 8, -8 }; - uint8 tunnel_type[4] = { TUNNEL_1, TUNNEL_2, TUNNEL_2, TUNNEL_1 }; - if (direction & 1) { - sub_98196C(image_id, 6, 0, 20, 32, 1, height, get_current_rotation()); - paint_util_push_tunnel_right(height + tunnel_height[direction], tunnel_type[direction]); - } - else { - sub_98196C(image_id, 0, 6, 32, 20, 1, height, get_current_rotation()); - paint_util_push_tunnel_left(height + tunnel_height[direction], tunnel_type[direction]); - } - - const rct_xy16 pos = {gPaintMapPosition.x, gPaintMapPosition.y}; - - if (track_paint_util_should_paint_supports(pos)) { - int edi = direction & 1 ? 2 : 1; - metal_a_supports_paint_setup(edi, 4, 8, height, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_25_deg_up(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } /* 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 = gTrackColours[SCHEME_TRACK]; - - bool isChained = mapElement->type & (1 << 7); - - image_id |= junior_rc_track_pieces_flat_to_25_deg_up[isChained][direction]; - - sub_98196C_rotated(direction, image_id, 0, 6, 32, 20, 1, height); - if (direction == 0 || direction == 3) { - paint_util_push_tunnel_rotated(direction, height, TUNNEL_0); - } else { - paint_util_push_tunnel_rotated(direction, height, TUNNEL_2); - } - - const rct_xy16 pos = {gPaintMapPosition.x, gPaintMapPosition.y}; - - 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_flat_to_25_deg_up(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } /* 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 = gTrackColours[SCHEME_TRACK]; - - 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 = {gPaintMapPosition.x, gPaintMapPosition.y}; - - if (track_paint_util_should_paint_supports(pos)) { - int edi = direction & 1 ? 2 : 1; - metal_a_supports_paint_setup(edi, 4, 6, height, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_25_deg_up_to_flat(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } /* rct2: 0x005189B0 */ @@ -2430,88 +3154,14 @@ static void junior_rc_right_bank_paint_setup(uint8 rideIndex, uint8 trackSequenc /* rct2: 0x008AAE10, 0x00519D88, 0x00519DAC, 0x00519DD0, 0x00519DF4 */ static void junior_rc_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, gTrackColours[SCHEME_TRACK], 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()); - - uint8 supportSpecial[4] = { 8, 8, 8, 3 }; - switch (trackSequence) { - case 0: - metal_a_supports_paint_setup((direction & 1) ? 2 : 1, 4, (direction == 0 || direction == 3) ? 10 : 8, height, gTrackColours[SCHEME_SUPPORTS]); - break; - case 6: - metal_a_supports_paint_setup((direction & 1) ? 1 : 2, 4, supportSpecial[direction], height, gTrackColours[SCHEME_SUPPORTS]); - 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); - } + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_left_quarter_turn_5_tiles_25_deg_up(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } /* rct2: 0x008AAE20, 0x00519E18, 0x0051A148, 0x0051A452, 0x0051A738 */ static void junior_rc_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, gTrackColours[SCHEME_TRACK], 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, gTrackColours[SCHEME_SUPPORTS]); - break; - case 6: - metal_a_supports_paint_setup((direction & 1) ? 1 : 2, 4, 8, height, gTrackColours[SCHEME_SUPPORTS]); - 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); - } + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_right_quarter_turn_5_tiles_25_deg_up(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } /* rct2: 0x008AAE30, 0x0051AA42, 0x0051AA68, 0x0051AA8C, 0x0051AAB0 */ @@ -2807,134 +3457,15 @@ static void junior_rc_left_quarter_turn_3_tiles_bank_paint_setup(uint8 rideIndex /** 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] | gTrackColours[SCHEME_TRACK]; - 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] | gTrackColours[SCHEME_TRACK]; - 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, gTrackColours[SCHEME_SUPPORTS]); - 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); + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_right_quarter_turn_3_tiles_25_deg_up(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } /** 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] | gTrackColours[SCHEME_TRACK]; - 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] | gTrackColours[SCHEME_TRACK]; - 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_2); - } - - 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, gTrackColours[SCHEME_SUPPORTS]); - 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); + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_right_quarter_turn_3_tiles_25_deg_down(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } static const uint8 left_quarter_turn_3_tiles_to_right_turn_map[] = {3, 1, 2, 0}; @@ -3585,119 +4116,53 @@ static void junior_rc_right_eighth_to_orthogonal_bank_paint_setup(uint8 rideInde 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, gTrackColours[SCHEME_TRACK], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_diag_flat(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } /** 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, gTrackColours[SCHEME_TRACK], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_diag_25_deg_up(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } /** 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, gTrackColours[SCHEME_TRACK], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_diag_flat_to_25_deg_up(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } /** 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, gTrackColours[SCHEME_TRACK], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_diag_25_deg_up_to_flat(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } /** 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, gTrackColours[SCHEME_TRACK], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_diag_25_deg_down(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } /** 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, gTrackColours[SCHEME_TRACK], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_diag_flat_to_25_deg_down(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } /** 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, gTrackColours[SCHEME_TRACK], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_diag_25_deg_down_to_flat(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } /** rct2: 0x008AB1C0 */ @@ -3972,234 +4437,30 @@ static void junior_rc_diag_right_bank_paint_setup(uint8 rideIndex, uint8 trackSe 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 = gTrackColours[SCHEME_TRACK]; - - 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 = {gPaintMapPosition.x, gPaintMapPosition.y}; - - 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) +{ + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_60_deg_up(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } 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 = gTrackColours[SCHEME_TRACK]; - - bool isChained = mapElement->type & (1 << 7); - - image_id |= junior_rc_track_pieces_25_deg_up_to_60_deg_up[isChained][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[isChained][direction][1] != 0) { - image_id = gTrackColours[SCHEME_TRACK]; - - image_id |= junior_rc_track_pieces_25_deg_up_to_60_deg_up[isChained][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 = {gPaintMapPosition.x, gPaintMapPosition.y}; - - 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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_up_to_60_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) +{ + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_25_deg_up_to_60_deg_up(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } 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 = gTrackColours[SCHEME_TRACK]; - - bool isChained = mapElement->type & (1 << 7); - - image_id |= junior_rc_track_pieces_60_deg_up_to_25_deg_up[isChained][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[isChained][direction][1] != 0) { - image_id = gTrackColours[SCHEME_TRACK]; - - image_id |= junior_rc_track_pieces_60_deg_up_to_25_deg_up[isChained][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 = {gPaintMapPosition.x, gPaintMapPosition.y}; - - if (track_paint_util_should_paint_supports(pos)) { - metal_a_supports_paint_setup(direction & 1 ? 2 : 1, 4, 20, height, gTrackColours[SCHEME_SUPPORTS]); - } - - 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_up_to_25_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) +{ + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_60_deg_up_to_25_deg_up(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } 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) { @@ -4208,86 +4469,38 @@ static void junior_rc_25_deg_down_to_60_deg_down_paint_setup(uint8 rideIndex, ui 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, gTrackColours[SCHEME_TRACK], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_diag_60_deg_up(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } 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, gTrackColours[SCHEME_TRACK], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_diag_60_deg_down(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } 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, gTrackColours[SCHEME_TRACK], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_diag_25_deg_up_to_60_deg_up(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } 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, gTrackColours[SCHEME_TRACK], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_diag_60_deg_up_to_25_deg_up(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } 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, gTrackColours[SCHEME_TRACK], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_diag_25_deg_down_to_60_deg_down(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } 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, gTrackColours[SCHEME_TRACK], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_diag_60_deg_down_to_25_deg_down(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); } static const rct_xy16 junior_rc_flat_to_60_deg_up_bound_lengths[4][2] = { @@ -4319,10 +4532,10 @@ static const rct_xy16 junior_rc_flat_to_60_deg_up_tile_offsets[4][2] = { }; static const rct_xy16 junior_rc_60_deg_up_to_flat_tile_offsets[4][2] = { - {{13, -9}, { 0 }}, + {{13, -9}, { 0 }}, {{32, 9}, {-7, -11}}, {{22, 18}, { 2, -19}}, - {{13, -9}, { 0 }} + {{13, -9}, { 0 }} }; static void junior_rc_flat_to_60_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) diff --git a/src/ride/coaster/junior_roller_coaster.h b/src/ride/coaster/junior_roller_coaster.h new file mode 100644 index 0000000000..2662d1c7be --- /dev/null +++ b/src/ride/coaster/junior_roller_coaster.h @@ -0,0 +1,60 @@ +#pragma region Copyright (c) 2014-2016 OpenRCT2 Developers +/***************************************************************************** + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * OpenRCT2 is the work of many authors, a full list can be found in contributors.md + * For more information, visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * A full copy of the GNU General Public License can be found in licence.txt + *****************************************************************************/ +#pragma endregion + +#ifndef _JUNIOR_ROLLER_COASTER_H +#define _JUNIOR_ROLLER_COASTER_H + +#include "../../common.h" +#include "../../paint/map_element/map_element.h" + +typedef enum JUNIOR_RC_CHAINTYPE +{ + JUNIOR_RC_CHAIN_NONE, + JUNIOR_RC_CHAIN_FRICTION_WHEELS, + JUNIOR_RC_CHAIN_CHAIN_LIFT, +} JUNIOR_RC_CHAINTYPE; + +void junior_rc_paint_station(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, uint8 rideType); + +void junior_rc_paint_track_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); +void junior_rc_paint_track_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); +void junior_rc_paint_track_60_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); +void junior_rc_paint_track_flat_to_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); +void junior_rc_paint_track_25_deg_up_to_60_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); +void junior_rc_paint_track_60_deg_up_to_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); +void junior_rc_paint_track_25_deg_up_to_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); + +void junior_rc_paint_track_left_quarter_turn_5_tiles_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); +void junior_rc_paint_track_right_quarter_turn_5_tiles_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); + +void junior_rc_paint_track_right_quarter_turn_3_tiles_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); +void junior_rc_paint_track_right_quarter_turn_3_tiles_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); + +void junior_rc_paint_track_diag_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); +void junior_rc_paint_track_diag_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); +void junior_rc_paint_track_diag_60_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); +void junior_rc_paint_track_diag_flat_to_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); +void junior_rc_paint_track_diag_25_deg_up_to_60_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); +void junior_rc_paint_track_diag_60_deg_up_to_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); +void junior_rc_paint_track_diag_25_deg_up_to_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); +void junior_rc_paint_track_diag_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); +void junior_rc_paint_track_diag_60_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); +void junior_rc_paint_track_diag_flat_to_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); +void junior_rc_paint_track_diag_25_deg_down_to_60_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); +void junior_rc_paint_track_diag_60_deg_down_to_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); +void junior_rc_paint_track_diag_25_deg_down_to_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType); + +#endif // _JUNIOR_ROLLER_COASTER_H diff --git a/src/ride/water/water_coaster.c b/src/ride/water/water_coaster.c index 8d8338f35a..0000a25bf7 100644 --- a/src/ride/water/water_coaster.c +++ b/src/ride/water/water_coaster.c @@ -14,6 +14,8 @@ *****************************************************************************/ #pragma endregion +#include "../../common.h" +#include "../coaster/junior_roller_coaster.h" #include "../../common.h" #include "../../interface/viewport.h" #include "../../paint/supports.h" @@ -21,234 +23,6 @@ #include "../track.h" #include "../track_paint.h" -enum { - SPR_WATER_RC_FLAT_SW_NE = 27807, - SPR_WATER_RC_FLAT_NW_SE = 27808, - SPR_WATER_RC_25_DEG_SW_NE = 27809, - SPR_WATER_RC_FLAT_TO_25_DEG_UP_SW_NE = 27811, - SPR_WATER_RC_25_DEG_NE_SW = 27813, - SPR_WATER_RC_FLAT_TO_25_DEG_UP_NE_SW = 27815, - SPR_WATER_RC_25_DEG_NW_SE = 27821, - SPR_WATER_RC_25_DEG_SE_NW = 27823, - SPR_WATER_RC_25_DEG_UP_TO_FLAT_NE_SW = 27817, - SPR_WATER_RC_25_DEG_UP_TO_FLAT_SW_NE = 27819, - SPR_WATER_RC_FLAT_TO_25_DEG_UP_NW_SE = 27825, - SPR_WATER_RC_FLAT_TO_25_DEG_UP_SE_NW = 27827, - SPR_WATER_RC_25_DEG_UP_TO_FLAT_SE_NW = 27829, - SPR_WATER_RC_25_DEG_UP_TO_FLAT_NW_SE = 27831, - SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_SW_NE = 27985, - SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_NW_SE = 27986, - SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_NE_SW = 27987, - SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_SE_NW = 27988, - SPR_WATER_RC_25_DEG_CHAIN_SW_NE = 27993, - SPR_WATER_RC_25_DEG_CHAIN_NW_SE = 27994, - SPR_WATER_RC_25_DEG_CHAIN_NE_SW = 27995, - SPR_WATER_RC_25_DEG_CHAIN_SE_NW = 27996, - SPR_WATER_RC_FLAT_CHAIN_SW_NE = 27983, - SPR_WATER_RC_FLAT_CHAIN_NW_SE = 27984, - SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_SW_NE = 27989, - SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_NW_SE = 27990, - SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_NE_SW = 27991, - SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_SE_NW = 27992, - SPR_WATER_RC_DIAG_FLAT_W_E = 28197, - SPR_WATER_RC_DIAG_FLAT_N_S = 28198, - SPR_WATER_RC_DIAG_FLAT_E_W = 28199, - SPR_WATER_RC_DIAG_FLAT_S_N = 28200, - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_W_E = 28201, - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_N_S = 28202, - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_E_W = 28203, - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_S_N = 28204, - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_W_E = 28205, - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_N_S = 28206, - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_E_W = 28207, - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_S_N = 28208, - SPR_WATER_RC_DIAG_25_DEG_UP_W_E = 28209, - SPR_WATER_RC_DIAG_25_DEG_UP_N_S = 28210, - SPR_WATER_RC_DIAG_25_DEG_UP_E_W = 28211, - SPR_WATER_RC_DIAG_25_DEG_UP_S_N = 28212, - SPR_WATER_RC_DIAG_FLAT_CHAIN_W_E = 28269, - SPR_WATER_RC_DIAG_FLAT_CHAIN_N_S = 28270, - SPR_WATER_RC_DIAG_FLAT_CHAIN_E_W = 28271, - SPR_WATER_RC_DIAG_FLAT_CHAIN_S_N = 28272, - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_W_E = 28273, - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_N_S = 28274, - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_E_W = 28275, - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_S_N = 28276, - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_W_E = 28277, - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_N_S = 28278, - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_E_W = 28279, - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_S_N = 28280, - SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_W_E = 28281, - SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_N_S = 28282, - SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_E_W = 28283, - SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_S_N = 28284, -}; - -static const uint32 water_rc_track_pieces_flat[2][4] = { - { - SPR_WATER_RC_FLAT_SW_NE, - SPR_WATER_RC_FLAT_NW_SE, - SPR_WATER_RC_FLAT_SW_NE, - SPR_WATER_RC_FLAT_NW_SE, - }, - { - SPR_WATER_RC_FLAT_CHAIN_SW_NE, - SPR_WATER_RC_FLAT_CHAIN_NW_SE, - SPR_WATER_RC_FLAT_CHAIN_SW_NE, - SPR_WATER_RC_FLAT_CHAIN_NW_SE, - }, -}; - -static const uint32 water_rc_track_pieces_25_deg_up[2][4] = { - { - SPR_WATER_RC_25_DEG_SW_NE, - SPR_WATER_RC_25_DEG_NW_SE, - SPR_WATER_RC_25_DEG_NE_SW, - SPR_WATER_RC_25_DEG_SE_NW, - }, - { - SPR_WATER_RC_25_DEG_CHAIN_SW_NE, - SPR_WATER_RC_25_DEG_CHAIN_NW_SE, - SPR_WATER_RC_25_DEG_CHAIN_NE_SW, - SPR_WATER_RC_25_DEG_CHAIN_SE_NW, - }, -}; - -static const uint32 water_rc_track_pieces_flat_to_25_deg_up[2][4] = { - { - SPR_WATER_RC_FLAT_TO_25_DEG_UP_SW_NE, - SPR_WATER_RC_FLAT_TO_25_DEG_UP_NW_SE, - SPR_WATER_RC_FLAT_TO_25_DEG_UP_NE_SW, - SPR_WATER_RC_FLAT_TO_25_DEG_UP_SE_NW, - }, - { - SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_SW_NE, - SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_NW_SE, - SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_NE_SW, - SPR_WATER_RC_FLAT_TO_25_DEG_UP_CHAIN_SE_NW, - }, -}; - -static const uint32 water_rc_track_pieces_25_deg_up_to_flat[2][4] = { - { - SPR_WATER_RC_25_DEG_UP_TO_FLAT_SW_NE, - SPR_WATER_RC_25_DEG_UP_TO_FLAT_NW_SE, - SPR_WATER_RC_25_DEG_UP_TO_FLAT_NE_SW, - SPR_WATER_RC_25_DEG_UP_TO_FLAT_SE_NW - }, - { - SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_SW_NE, - SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_NW_SE, - SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_NE_SW, - SPR_WATER_RC_25_DEG_UP_TO_FLAT_CHAIN_SE_NW, - }, -}; - -static const uint32 water_rc_track_pieces_diag_flat[2][4] = { - { - SPR_WATER_RC_DIAG_FLAT_W_E, - SPR_WATER_RC_DIAG_FLAT_N_S, - SPR_WATER_RC_DIAG_FLAT_E_W, - SPR_WATER_RC_DIAG_FLAT_S_N - }, - { - SPR_WATER_RC_DIAG_FLAT_CHAIN_W_E, - SPR_WATER_RC_DIAG_FLAT_CHAIN_N_S, - SPR_WATER_RC_DIAG_FLAT_CHAIN_E_W, - SPR_WATER_RC_DIAG_FLAT_CHAIN_S_N - }, -}; - -static const uint32 water_rc_track_pieces_diag_25_deg_up[2][4] = { - { - SPR_WATER_RC_DIAG_25_DEG_UP_W_E, - SPR_WATER_RC_DIAG_25_DEG_UP_N_S, - SPR_WATER_RC_DIAG_25_DEG_UP_E_W, - SPR_WATER_RC_DIAG_25_DEG_UP_S_N - }, - { - SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_W_E, - SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_N_S, - SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_E_W, - SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_S_N - }, -}; - -static const uint32 water_rc_track_pieces_diag_flat_to_25_deg_up[2][4] = { - { - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_W_E, - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_N_S, - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_E_W, - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_S_N - }, - { - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_W_E, - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_N_S, - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_E_W, - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_S_N - }, -}; - -static const uint32 water_rc_track_pieces_diag_25_deg_up_to_flat[2][4] = { - { - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_W_E, - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_N_S, - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_E_W, - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_S_N - }, - { - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_W_E, - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_N_S, - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_E_W, - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_S_N - }, -}; - -static const uint32 water_rc_track_pieces_diag_25_deg_down[2][4] = { - { - SPR_WATER_RC_DIAG_25_DEG_UP_E_W, - SPR_WATER_RC_DIAG_25_DEG_UP_S_N, - SPR_WATER_RC_DIAG_25_DEG_UP_W_E, - SPR_WATER_RC_DIAG_25_DEG_UP_N_S, - }, - { - SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_E_W, - SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_S_N, - SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_W_E, - SPR_WATER_RC_DIAG_25_DEG_UP_CHAIN_N_S, - }, -}; - -static const uint32 water_rc_track_pieces_diag_flat_to_25_deg_down[2][4] = { - { - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_E_W, - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_S_N, - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_W_E, - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_N_S, - }, - { - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_E_W, - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_S_N, - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_W_E, - SPR_WATER_RC_DIAG_25_DEG_UP_TO_FLAT_CHAIN_N_S, - }, -}; - -static const uint32 water_rc_track_pieces_diag_25_deg_down_to_flat[2][4] = { - { - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_E_W, - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_S_N, - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_W_E, - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_N_S, - }, - { - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_E_W, - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_S_N, - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_W_E, - SPR_WATER_RC_DIAG_FLAT_TO_25_DEG_UP_CHAIN_N_S, - }, -}; - static const uint8 water_rc_diag_support_segment[] = {1, 0, 2, 3}; static const int water_rc_diag_blocked_segments[] = { @@ -261,86 +35,25 @@ static const int water_rc_diag_blocked_segments[] = { static void water_rc_track_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) { bool isChained = track_element_is_lift_hill(mapElement); - uint32 imageId = water_rc_track_pieces_flat[isChained][direction] | gTrackColours[SCHEME_TRACK]; - sub_98196C_rotated(direction, imageId, 0, 6, 32, 20, 1, height); - paint_util_push_tunnel_rotated(direction, height, TUNNEL_0); - - if (track_paint_util_should_paint_supports(gPaintMapPosition)) { - metal_a_supports_paint_setup((direction & 1) ? 2 : 1, 4, 0, height, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); + junior_rc_paint_track_flat(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_CHAIN_LIFT : JUNIOR_RC_CHAIN_NONE); } static void water_rc_track_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) { bool isChained = track_element_is_lift_hill(mapElement); - uint32 image_id = gTrackColours[SCHEME_TRACK]; - image_id |= water_rc_track_pieces_25_deg_up[isChained][direction]; - - sint8 tunnel_height[4] = { -8, 8, 8, -8 }; - uint8 tunnel_type[4] = { TUNNEL_1, TUNNEL_2, TUNNEL_2, TUNNEL_1 }; - sub_98196C_rotated(direction, image_id, 0, 6, 32, 20, 1, height); - paint_util_push_tunnel_rotated(direction, height + tunnel_height[direction], tunnel_type[direction]); - - if (track_paint_util_should_paint_supports(gPaintMapPosition)) { - int supportType = direction & 1 ? 2 : 1; - metal_a_supports_paint_setup(supportType, 4, 8, height, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); + junior_rc_paint_track_25_deg_up(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_CHAIN_LIFT : JUNIOR_RC_CHAIN_NONE); } static void water_rc_track_flat_to_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { bool isChained = track_element_is_lift_hill(mapElement); - uint32 image_id = gTrackColours[SCHEME_TRACK]; - image_id |= water_rc_track_pieces_flat_to_25_deg_up[isChained][direction]; - sub_98196C_rotated(direction, image_id, 0, 6, 32, 20, 1, height); - - if (direction == 0 || direction == 3) { - paint_util_push_tunnel_rotated(direction, height, TUNNEL_0); - } else { - paint_util_push_tunnel_rotated(direction, height, TUNNEL_2); - } - - if (track_paint_util_should_paint_supports(gPaintMapPosition)) { - int supportType = direction & 1 ? 2 : 1; - uint16 ax = (direction == 0) ? 5 : 3; - metal_a_supports_paint_setup(supportType, 4, ax, height, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); + junior_rc_paint_track_flat_to_25_deg_up(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_CHAIN_LIFT : JUNIOR_RC_CHAIN_NONE); } static void water_rc_track_25_deg_up_to_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { bool isChained = track_element_is_lift_hill(mapElement); - uint32 image_id = gTrackColours[SCHEME_TRACK]; - image_id |= water_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; - } - sub_98196C_rotated(direction, image_id, 0, 6, 32, 20, 1, height); - paint_util_push_tunnel_rotated(direction, tunnelHeight, tunnelType); - - if (track_paint_util_should_paint_supports(gPaintMapPosition)) { - int supportType = direction & 1 ? 2 : 1; - metal_a_supports_paint_setup(supportType, 4, 6, height, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); + junior_rc_paint_track_25_deg_up_to_flat(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_CHAIN_LIFT : JUNIOR_RC_CHAIN_NONE); } static void water_rc_track_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) @@ -361,169 +74,158 @@ static void water_rc_track_25_deg_down_to_flat(uint8 rideIndex, uint8 trackSeque static void water_rc_track_diag_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { bool isChained = track_element_is_lift_hill(mapElement); - track_paint_util_diag_tiles_paint( - 1, - height, - direction, - trackSequence, - gTrackColours[SCHEME_TRACK], - water_rc_track_pieces_diag_flat[isChained], - defaultDiagTileOffsets, - defaultDiagBoundLengths, - 0, - get_current_rotation()); - - if (trackSequence == 3) { - metal_a_supports_paint_setup(direction & 1 ? 2 : 1, water_rc_diag_support_segment[direction], 0, height, gTrackColours[SCHEME_SUPPORTS]); - } - - int blockedSegments = water_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); + junior_rc_paint_track_diag_flat(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_CHAIN_LIFT : JUNIOR_RC_CHAIN_NONE); } static void water_rc_track_diag_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) { bool isChained = track_element_is_lift_hill(mapElement); - track_paint_util_diag_tiles_paint( - 1, - height, - direction, - trackSequence, - gTrackColours[SCHEME_TRACK], - water_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, water_rc_diag_support_segment[direction], 8, height, gTrackColours[SCHEME_SUPPORTS]); - } - - int blockedSegments = water_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); + junior_rc_paint_track_diag_25_deg_up(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_CHAIN_LIFT : JUNIOR_RC_CHAIN_NONE); } static void water_rc_track_diag_flat_to_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) { bool isChained = track_element_is_lift_hill(mapElement); - track_paint_util_diag_tiles_paint( - 1, - height, - direction, - trackSequence, - gTrackColours[SCHEME_TRACK], - water_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, water_rc_diag_support_segment[direction], 0, height, gTrackColours[SCHEME_SUPPORTS]); - } - - int blockedSegments = water_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); + junior_rc_paint_track_diag_flat_to_25_deg_up(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_CHAIN_LIFT : JUNIOR_RC_CHAIN_NONE); } static void water_rc_track_diag_25_deg_up_to_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) { bool isChained = track_element_is_lift_hill(mapElement); - track_paint_util_diag_tiles_paint( - 1, - height, - direction, - trackSequence, - gTrackColours[SCHEME_TRACK], - water_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, water_rc_diag_support_segment[direction], 4, height, gTrackColours[SCHEME_SUPPORTS]); - } - - int blockedSegments = water_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); + junior_rc_paint_track_diag_25_deg_up_to_flat(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_CHAIN_LIFT : JUNIOR_RC_CHAIN_NONE); } static void water_rc_track_diag_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) { bool isChained = track_element_is_lift_hill(mapElement); - track_paint_util_diag_tiles_paint( - 1, - height, - direction, - trackSequence, - gTrackColours[SCHEME_TRACK], - water_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, water_rc_diag_support_segment[direction], 8, height, gTrackColours[SCHEME_SUPPORTS]); - } - - int blockedSegments = water_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); + junior_rc_paint_track_diag_25_deg_down(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_CHAIN_LIFT : JUNIOR_RC_CHAIN_NONE); } static void water_rc_track_diag_flat_to_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) { bool isChained = track_element_is_lift_hill(mapElement); - track_paint_util_diag_tiles_paint( - 1, - height, - direction, - trackSequence, - gTrackColours[SCHEME_TRACK], - water_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, water_rc_diag_support_segment[direction], 4, height, gTrackColours[SCHEME_SUPPORTS]); - } - - int blockedSegments = water_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); + junior_rc_paint_track_diag_flat_to_25_deg_down(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_CHAIN_LIFT : JUNIOR_RC_CHAIN_NONE); } static void water_rc_track_diag_25_deg_down_to_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) { bool isChained = track_element_is_lift_hill(mapElement); - track_paint_util_diag_tiles_paint( - 1, - height, - direction, - trackSequence, - gTrackColours[SCHEME_TRACK], - water_rc_track_pieces_diag_25_deg_down_to_flat[isChained], - defaultDiagTileOffsets, - defaultDiagBoundLengths, - 0, - get_current_rotation()); + junior_rc_paint_track_diag_25_deg_down_to_flat(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_CHAIN_LIFT : JUNIOR_RC_CHAIN_NONE); +} - if (trackSequence == 3) { - metal_b_supports_paint_setup(direction & 1 ? 2 : 1, water_rc_diag_support_segment[direction], 0, height, gTrackColours[SCHEME_SUPPORTS]); - } +static void water_rc_track_station(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + junior_rc_paint_station(rideIndex, trackSequence, direction, height, mapElement, RIDE_TYPE_WATER_COASTER); +} - int blockedSegments = water_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); +static void water_rc_track_60_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + junior_rc_paint_track_60_deg_up(rideIndex, trackSequence, direction, height, mapElement, JUNIOR_RC_CHAIN_NONE); +} + +static void water_rc_track_25_deg_up_to_60_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + junior_rc_paint_track_25_deg_up_to_60_deg_up(rideIndex, trackSequence, direction, height, mapElement, JUNIOR_RC_CHAIN_NONE); +} + +static void water_rc_track_60_deg_up_to_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + junior_rc_paint_track_60_deg_up_to_25_deg_up(rideIndex, trackSequence, direction, height, mapElement, JUNIOR_RC_CHAIN_NONE); +} + +static void water_rc_track_60_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + water_rc_track_60_deg_up(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); +} + +static void water_rc_track_25_deg_down_to_60_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + water_rc_track_60_deg_up_to_25_deg_up(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); +} + +static void water_rc_track_60_deg_down_to_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + water_rc_track_25_deg_up_to_60_deg_up(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); +} + +#pragma mark - 5 tile turns + +static void water_rc_track_left_quarter_turn_5_tiles_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + junior_rc_paint_track_left_quarter_turn_5_tiles_25_deg_up(rideIndex, trackSequence, direction, height, mapElement, JUNIOR_RC_CHAIN_NONE); +} + +static void water_rc_track_right_quarter_turn_5_tiles_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + junior_rc_paint_track_right_quarter_turn_5_tiles_25_deg_up(rideIndex, trackSequence, direction, height, mapElement, JUNIOR_RC_CHAIN_NONE); +} + +static const uint8 left_quarter_turn_5_tiles_to_right_turn_map[] = {6, 4, 5, 3, 1, 2, 0}; + +static void water_rc_track_left_quarter_turn_5_tiles_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + water_rc_track_right_quarter_turn_5_tiles_25_deg_up(rideIndex, left_quarter_turn_5_tiles_to_right_turn_map[trackSequence], (direction + 1) % 4, height, mapElement);} + +static void water_rc_track_right_quarter_turn_5_tiles_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + water_rc_track_left_quarter_turn_5_tiles_25_deg_up(rideIndex, left_quarter_turn_5_tiles_to_right_turn_map[trackSequence], (direction + 3) % 4, height, mapElement); +} + +#pragma mark - 3 tile turns + +static void water_rc_track_right_quarter_turn_3_tiles_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + junior_rc_paint_track_right_quarter_turn_3_tiles_25_deg_up(rideIndex, trackSequence, direction, height, mapElement, JUNIOR_RC_CHAIN_NONE); +} + +static void water_rc_track_right_quarter_turn_3_tiles_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + junior_rc_paint_track_right_quarter_turn_3_tiles_25_deg_down(rideIndex, trackSequence, direction, height, mapElement, JUNIOR_RC_CHAIN_NONE); +} + +static const uint8 left_quarter_turn_3_tiles_to_right_turn_map[] = {3, 1, 2, 0}; + +static void water_rc_track_left_quarter_turn_3_tiles_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + trackSequence = left_quarter_turn_3_tiles_to_right_turn_map[trackSequence]; + water_rc_track_right_quarter_turn_3_tiles_25_deg_down(rideIndex, trackSequence, (direction + 1) % 4, height, mapElement); +} + +static void water_rc_track_left_quarter_turn_3_tiles_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + trackSequence = left_quarter_turn_3_tiles_to_right_turn_map[trackSequence]; + water_rc_track_right_quarter_turn_3_tiles_25_deg_up(rideIndex, trackSequence, (direction + 1) % 4, height, mapElement); +} + + +static void water_rc_track_diag_60_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + junior_rc_paint_track_diag_60_deg_up(rideIndex, trackSequence, direction, height, mapElement, JUNIOR_RC_CHAIN_NONE); +} + +static void water_rc_track_diag_25_deg_up_to_60_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + junior_rc_paint_track_diag_25_deg_up_to_60_deg_up(rideIndex, trackSequence, direction, height, mapElement, JUNIOR_RC_CHAIN_NONE); +} + +static void water_rc_track_diag_60_deg_up_to_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + junior_rc_paint_track_diag_60_deg_up_to_25_deg_up(rideIndex, trackSequence, direction, height, mapElement, JUNIOR_RC_CHAIN_NONE); +} + +static void water_rc_track_diag_60_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + junior_rc_paint_track_diag_60_deg_down(rideIndex, trackSequence, direction, height, mapElement, JUNIOR_RC_CHAIN_NONE); +} + +static void water_rc_track_diag_25_deg_down_to_60_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + junior_rc_paint_track_diag_25_deg_down_to_60_deg_down(rideIndex, trackSequence, direction, height, mapElement, JUNIOR_RC_CHAIN_NONE); +} + +static void water_rc_track_diag_60_deg_down_to_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + junior_rc_paint_track_diag_60_deg_down_to_25_deg_down(rideIndex, trackSequence, direction, height, mapElement, JUNIOR_RC_CHAIN_NONE); } TRACK_PAINT_FUNCTION get_track_paint_function_water_rc(int trackType, int direction) @@ -558,18 +260,55 @@ TRACK_PAINT_FUNCTION get_track_paint_function_water_rc(int trackType, int direct case TRACK_ELEM_DIAG_25_DEG_DOWN_TO_FLAT: return water_rc_track_diag_25_deg_down_to_flat; - ////////////////////////////////////////////////////// - // Use Junior RC - ////////////////////////////////////////////////////// + // Use Junior RC without lift hill case TRACK_ELEM_END_STATION: case TRACK_ELEM_BEGIN_STATION: case TRACK_ELEM_MIDDLE_STATION: + return water_rc_track_station; case TRACK_ELEM_60_DEG_UP: + return water_rc_track_60_deg_up; case TRACK_ELEM_25_DEG_UP_TO_60_DEG_UP: + return water_rc_track_25_deg_up_to_60_deg_up; case TRACK_ELEM_60_DEG_UP_TO_25_DEG_UP: + return water_rc_track_60_deg_up_to_25_deg_up; case TRACK_ELEM_60_DEG_DOWN: + return water_rc_track_60_deg_down; case TRACK_ELEM_25_DEG_DOWN_TO_60_DEG_DOWN: + return water_rc_track_25_deg_down_to_60_deg_down; case TRACK_ELEM_60_DEG_DOWN_TO_25_DEG_DOWN: + return water_rc_track_60_deg_down_to_25_deg_down; + case TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP: + return water_rc_track_left_quarter_turn_5_tiles_25_deg_up; + case TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP: + return water_rc_track_right_quarter_turn_5_tiles_25_deg_up; + case TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_DOWN: + return water_rc_track_left_quarter_turn_5_tiles_25_deg_down; + case TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_DOWN: + return water_rc_track_right_quarter_turn_5_tiles_25_deg_down; + case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP: + return water_rc_track_left_quarter_turn_3_tiles_25_deg_up; + case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP: + return water_rc_track_right_quarter_turn_3_tiles_25_deg_up; + case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN: + return water_rc_track_left_quarter_turn_3_tiles_25_deg_down; + case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN: + return water_rc_track_right_quarter_turn_3_tiles_25_deg_down; + case TRACK_ELEM_DIAG_60_DEG_UP: + return water_rc_track_diag_60_deg_up; + case TRACK_ELEM_DIAG_25_DEG_UP_TO_60_DEG_UP: + return water_rc_track_diag_25_deg_up_to_60_deg_up; + case TRACK_ELEM_DIAG_60_DEG_UP_TO_25_DEG_UP: + return water_rc_track_diag_60_deg_up_to_25_deg_up; + case TRACK_ELEM_DIAG_60_DEG_DOWN: + return water_rc_track_diag_60_deg_down; + case TRACK_ELEM_DIAG_25_DEG_DOWN_TO_60_DEG_DOWN: + return water_rc_track_diag_25_deg_down_to_60_deg_down; + case TRACK_ELEM_DIAG_60_DEG_DOWN_TO_25_DEG_DOWN: + return water_rc_track_diag_60_deg_down_to_25_deg_down; + + ////////////////////////////////////////////////////// + // Use Junior RC + ////////////////////////////////////////////////////// case TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES: case TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES: case TRACK_ELEM_FLAT_TO_LEFT_BANK: @@ -588,20 +327,12 @@ TRACK_PAINT_FUNCTION get_track_paint_function_water_rc(int trackType, int direct case TRACK_ELEM_25_DEG_DOWN_TO_RIGHT_BANK: case TRACK_ELEM_LEFT_BANK: case TRACK_ELEM_RIGHT_BANK: - case TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP: - case TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP: - case TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_DOWN: - case TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_DOWN: case TRACK_ELEM_S_BEND_LEFT: case TRACK_ELEM_S_BEND_RIGHT: case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES: case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES: case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_BANK: case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_BANK: - case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP: - case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP: - case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN: - case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN: case TRACK_ELEM_FLAT_TO_60_DEG_UP: case TRACK_ELEM_60_DEG_UP_TO_FLAT: case TRACK_ELEM_FLAT_TO_60_DEG_DOWN: @@ -623,12 +354,6 @@ TRACK_PAINT_FUNCTION get_track_paint_function_water_rc(int trackType, int direct case TRACK_ELEM_RIGHT_EIGHTH_BANK_TO_DIAG: case TRACK_ELEM_LEFT_EIGHTH_BANK_TO_ORTHOGONAL: case TRACK_ELEM_RIGHT_EIGHTH_BANK_TO_ORTHOGONAL: - case TRACK_ELEM_DIAG_60_DEG_UP: - case TRACK_ELEM_DIAG_25_DEG_UP_TO_60_DEG_UP: - case TRACK_ELEM_DIAG_60_DEG_UP_TO_25_DEG_UP: - case TRACK_ELEM_DIAG_60_DEG_DOWN: - case TRACK_ELEM_DIAG_25_DEG_DOWN_TO_60_DEG_DOWN: - case TRACK_ELEM_DIAG_60_DEG_DOWN_TO_25_DEG_DOWN: case TRACK_ELEM_DIAG_FLAT_TO_LEFT_BANK: case TRACK_ELEM_DIAG_FLAT_TO_RIGHT_BANK: case TRACK_ELEM_DIAG_LEFT_BANK_TO_FLAT: From 50bb158ee00a7b68867bc171719679f1e2d7c876 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Sun, 23 Oct 2016 14:16:56 +0200 Subject: [PATCH 2/5] Update Xcode project --- OpenRCT2.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpenRCT2.xcodeproj/project.pbxproj b/OpenRCT2.xcodeproj/project.pbxproj index 5f221925e4..b94ab0e458 100644 --- a/OpenRCT2.xcodeproj/project.pbxproj +++ b/OpenRCT2.xcodeproj/project.pbxproj @@ -642,6 +642,7 @@ C6B5A7D11CDFE4CB00C9C006 /* S6Exporter.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; fileEncoding = 4; path = S6Exporter.h; sourceTree = ""; }; C6B5A7D21CDFE4CB00C9C006 /* S6Importer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = S6Importer.cpp; sourceTree = ""; }; C6B5A7D31CDFE4CB00C9C006 /* S6Importer.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; fileEncoding = 4; path = S6Importer.h; sourceTree = ""; }; + C6FF1BAD1DBCE1A10078DCB5 /* junior_roller_coaster.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = junior_roller_coaster.h; sourceTree = ""; }; D41B73EE1C2101890080A7B9 /* libcurl.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libcurl.tbd; path = usr/lib/libcurl.tbd; sourceTree = SDKROOT; }; D41B741C1C210A7A0080A7B9 /* libiconv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libiconv.tbd; path = usr/lib/libiconv.tbd; sourceTree = SDKROOT; }; D41B74721C2125E50080A7B9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = distribution/macos/Assets.xcassets; sourceTree = SOURCE_ROOT; }; @@ -1295,6 +1296,7 @@ C686F8C31CDBC3B7009F9BFC /* inverted_impulse_coaster.c */, C686F8C41CDBC3B7009F9BFC /* inverted_roller_coaster.c */, C686F8C51CDBC3B7009F9BFC /* junior_roller_coaster.c */, + C6FF1BAD1DBCE1A10078DCB5 /* junior_roller_coaster.h */, C686F8C61CDBC3B7009F9BFC /* lay_down_roller_coaster.c */, C686F8C71CDBC3B7009F9BFC /* lim_launched_roller_coaster.c */, C686F8C81CDBC3B7009F9BFC /* looping_roller_coaster.c */, From 551962123a8db205d697b7e8e5885139f7bd21a2 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Sun, 23 Oct 2016 14:19:49 +0200 Subject: [PATCH 3/5] Reorganise file to minimise diffs --- src/ride/coaster/junior_roller_coaster.c | 1459 +++++++++++----------- 1 file changed, 729 insertions(+), 730 deletions(-) diff --git a/src/ride/coaster/junior_roller_coaster.c b/src/ride/coaster/junior_roller_coaster.c index ddcb094f4d..4b3f96a996 100644 --- a/src/ride/coaster/junior_roller_coaster.c +++ b/src/ride/coaster/junior_roller_coaster.c @@ -1804,6 +1804,57 @@ void junior_rc_paint_track_flat(uint8 rideIndex, uint8 trackSequence, uint8 dire paint_util_set_general_support_height(height + 32, 0x20); } +void junior_rc_paint_station(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, uint8 rideType) { + rct_ride * ride = get_ride(rideIndex); + const rct_ride_entrance_definition * entranceStyle = &RideEntranceDefinitions[ride->entrance_style]; + uint32 imageId = entranceStyle->base_image_id; + if (!(gTrackColours[SCHEME_MISC] & (1 << 29))) { + imageId &= 0x7FFFF; + } + + 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 | gTrackColours[SCHEME_MISC]; + 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 && rideType == RIDE_TYPE_JUNIOR_ROLLER_COASTER) { + imageId = junior_rc_track_pieces_block_brake[isBraked][direction] | gTrackColours[SCHEME_TRACK]; + }else{ + imageId = junior_rc_track_pieces_station[false][direction] | gTrackColours[SCHEME_TRACK]; + } + sub_98199C(imageId, 0, 6, 32, 20, 1, height, 0, 0, height, get_current_rotation()); + + metal_a_supports_paint_setup(3, 5, 0, height, gTrackColours[SCHEME_SUPPORTS]); + metal_a_supports_paint_setup(3, 8, 0, height, gTrackColours[SCHEME_SUPPORTS]); + + 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 | gTrackColours[SCHEME_MISC]; + 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 && rideType == RIDE_TYPE_JUNIOR_ROLLER_COASTER) { + imageId = junior_rc_track_pieces_block_brake[isBraked][direction] | gTrackColours[SCHEME_TRACK]; + }else{ + imageId = junior_rc_track_pieces_station[false][direction] | gTrackColours[SCHEME_TRACK]; + } + sub_98199C(imageId, 6, 0, 20, 32, 1, height, 0, 0, height, get_current_rotation()); + + metal_a_supports_paint_setup(3, 6, 0, height, gTrackColours[SCHEME_SUPPORTS]); + metal_a_supports_paint_setup(3, 7, 0, height, gTrackColours[SCHEME_SUPPORTS]); + 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); +} + void junior_rc_paint_track_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) { uint32 imageId = junior_rc_track_pieces_25_deg_up[chainType][direction] | gTrackColours[SCHEME_TRACK]; @@ -1822,78 +1873,6 @@ void junior_rc_paint_track_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 paint_util_set_general_support_height(height + 56, 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}, -}; - -void junior_rc_paint_track_60_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) -{ - uint32 image_id = gTrackColours[SCHEME_TRACK]; - - image_id |= junior_rc_track_pieces_60_deg_up[chainType][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 = {gPaintMapPosition.x, gPaintMapPosition.y}; - - 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); -} - void junior_rc_paint_track_flat_to_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) { uint32 imageId = junior_rc_track_pieces_flat_to_25_deg_up[chainType][direction] | gTrackColours[SCHEME_TRACK]; @@ -1915,151 +1894,6 @@ void junior_rc_paint_track_flat_to_25_deg_up(uint8 rideIndex, uint8 trackSequenc paint_util_set_general_support_height(height + 48, 0x20); } -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}}, -}; - -void junior_rc_paint_track_25_deg_up_to_60_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) -{ - uint32 image_id = gTrackColours[SCHEME_TRACK]; - - image_id |= junior_rc_track_pieces_25_deg_up_to_60_deg_up[chainType][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[chainType][direction][1] != 0) { - image_id = gTrackColours[SCHEME_TRACK]; - - image_id |= junior_rc_track_pieces_25_deg_up_to_60_deg_up[chainType][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 = {gPaintMapPosition.x, gPaintMapPosition.y}; - - 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); -} - -void junior_rc_paint_track_60_deg_up_to_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) -{ - uint32 image_id = gTrackColours[SCHEME_TRACK]; - - image_id |= junior_rc_track_pieces_60_deg_up_to_25_deg_up[chainType][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[chainType][direction][1] != 0) { - image_id = gTrackColours[SCHEME_TRACK]; - - image_id |= junior_rc_track_pieces_60_deg_up_to_25_deg_up[chainType][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 = {gPaintMapPosition.x, gPaintMapPosition.y}; - - if (track_paint_util_should_paint_supports(pos)) { - metal_a_supports_paint_setup(direction & 1 ? 2 : 1, 4, 20, height, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); -} - - void junior_rc_paint_track_25_deg_up_to_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) { uint32 imageId = junior_rc_track_pieces_25_deg_up_to_flat[chainType][direction] | gTrackColours[SCHEME_TRACK]; @@ -2095,519 +1929,6 @@ void junior_rc_paint_track_25_deg_up_to_flat(uint8 rideIndex, uint8 trackSequenc paint_util_set_general_support_height(height + 40, 0x20); } -void junior_rc_paint_track_left_quarter_turn_5_tiles_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) -{ - track_paint_util_right_quarter_turn_5_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_left_quarter_turn_5_tiles_25_deg_up[chainType], junior_rc_left_quarter_turn_5_tiles_25_deg_up_offsets, defaultRightQuarterTurn5TilesBoundLengths, NULL, get_current_rotation()); - - uint8 supportSpecial[4] = { 8, 8, 8, 3 }; - switch (trackSequence) { - case 0: - metal_a_supports_paint_setup((direction & 1) ? 2 : 1, 4, (direction == 0 || direction == 3) ? 10 : 8, height, gTrackColours[SCHEME_SUPPORTS]); - break; - case 6: - metal_a_supports_paint_setup((direction & 1) ? 1 : 2, 4, supportSpecial[direction], height, gTrackColours[SCHEME_SUPPORTS]); - 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); - } -} - -void junior_rc_paint_track_right_quarter_turn_5_tiles_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) -{ - track_paint_util_right_quarter_turn_5_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_right_quarter_turn_5_tiles_25_deg_up[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); - break; - case 6: - metal_a_supports_paint_setup((direction & 1) ? 1 : 2, 4, 8, height, gTrackColours[SCHEME_SUPPORTS]); - 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); - } -} - -void junior_rc_paint_track_right_quarter_turn_3_tiles_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) -{ - 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[chainType][direction][0] | gTrackColours[SCHEME_TRACK]; - 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[chainType][direction][1] | gTrackColours[SCHEME_TRACK]; - 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, gTrackColours[SCHEME_SUPPORTS]); - 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); -} - -void junior_rc_paint_track_right_quarter_turn_3_tiles_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) -{ - 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[chainType][direction][0] | gTrackColours[SCHEME_TRACK]; - 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[chainType][direction][1] | gTrackColours[SCHEME_TRACK]; - 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_2); - } - - 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, gTrackColours[SCHEME_SUPPORTS]); - 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 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}; - -void junior_rc_paint_track_diag_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) -{ - track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_flat[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); -} - -void junior_rc_paint_track_diag_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) -{ - track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_25_deg_up[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); -} - -void junior_rc_paint_track_diag_60_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) -{ - track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_60_deg_up[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); -} - -void junior_rc_paint_track_diag_flat_to_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) -{ - track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_flat_to_25_deg_up[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); -} - -void junior_rc_paint_track_diag_25_deg_up_to_60_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) -{ - track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_25_deg_up_to_60_deg_up[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); -} - -void junior_rc_paint_track_diag_60_deg_up_to_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) -{ - if (direction == 1 && trackSequence == 3) { - sub_98197C( - junior_rc_track_pieces_diag_60_deg_up_to_25_deg_up[chainType][direction] | gTrackColours[SCHEME_TRACK], - -16, -16, - 16, 16, 1, - height, - 0, 0, height, - get_current_rotation() - ); - } else { - track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_60_deg_up_to_25_deg_up[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); -} - -void junior_rc_paint_track_diag_25_deg_up_to_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) -{ - track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_25_deg_up_to_flat[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); -} - -void junior_rc_paint_track_diag_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) -{ - - track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_25_deg_down[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); -} - -void junior_rc_paint_track_diag_60_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) -{ - track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_60_deg_down[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); -} - -void junior_rc_paint_track_diag_flat_to_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) -{ - track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_flat_to_25_deg_down[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); -} - -void junior_rc_paint_track_diag_25_deg_down_to_60_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) -{ - if (direction == 3 && trackSequence == 0) { - sub_98197C( - junior_rc_track_pieces_diag_25_deg_down_to_60_deg_down[chainType][direction] | gTrackColours[SCHEME_TRACK], - -16, -16, - 16, 16, 1, - height, - 0, 0, height, - get_current_rotation() - ); - } else { - track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_25_deg_down_to_60_deg_down[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); -} - -void junior_rc_paint_track_diag_60_deg_down_to_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) -{ - track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_60_deg_down_to_25_deg_down[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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); -} - -void junior_rc_paint_track_diag_25_deg_down_to_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) -{ - track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_25_deg_down_to_flat[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); - } - - 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: 0x00518394 */ -static void junior_rc_flat_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement){ - bool isChained = track_element_is_lift_hill(mapElement); - junior_rc_paint_track_flat(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); -} - -void junior_rc_paint_station(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, uint8 rideType) { - rct_ride * ride = get_ride(rideIndex); - const rct_ride_entrance_definition * entranceStyle = &RideEntranceDefinitions[ride->entrance_style]; - uint32 imageId = entranceStyle->base_image_id; - if (!(gTrackColours[SCHEME_MISC] & (1 << 29))) { - imageId &= 0x7FFFF; - } - - 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 | gTrackColours[SCHEME_MISC]; - 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 && rideType == RIDE_TYPE_JUNIOR_ROLLER_COASTER) { - imageId = junior_rc_track_pieces_block_brake[isBraked][direction] | gTrackColours[SCHEME_TRACK]; - }else{ - imageId = junior_rc_track_pieces_station[false][direction] | gTrackColours[SCHEME_TRACK]; - } - sub_98199C(imageId, 0, 6, 32, 20, 1, height, 0, 0, height, get_current_rotation()); - - metal_a_supports_paint_setup(3, 5, 0, height, gTrackColours[SCHEME_SUPPORTS]); - metal_a_supports_paint_setup(3, 8, 0, height, gTrackColours[SCHEME_SUPPORTS]); - - 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 | gTrackColours[SCHEME_MISC]; - 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 && rideType == RIDE_TYPE_JUNIOR_ROLLER_COASTER) { - imageId = junior_rc_track_pieces_block_brake[isBraked][direction] | gTrackColours[SCHEME_TRACK]; - }else{ - imageId = junior_rc_track_pieces_station[false][direction] | gTrackColours[SCHEME_TRACK]; - } - sub_98199C(imageId, 6, 0, 20, 32, 1, height, 0, 0, height, get_current_rotation()); - - metal_a_supports_paint_setup(3, 6, 0, height, gTrackColours[SCHEME_SUPPORTS]); - metal_a_supports_paint_setup(3, 7, 0, height, gTrackColours[SCHEME_SUPPORTS]); - 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: 0x00515629, 0x00514D22, 0x005151B9 */ -static void paint_junior_rc_station_track(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) -{ - junior_rc_paint_station(rideIndex, trackSequence, direction, height, mapElement, RIDE_TYPE_JUNIOR_ROLLER_COASTER); -} - -/* rct2: 0x0051881E */ -static void junior_rc_25_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { - bool isChained = track_element_is_lift_hill(mapElement); - junior_rc_paint_track_25_deg_up(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); -} - -/* 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) { - bool isChained = track_element_is_lift_hill(mapElement); - junior_rc_paint_track_flat_to_25_deg_up(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); -} - -/* 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) { - bool isChained = track_element_is_lift_hill(mapElement); - junior_rc_paint_track_25_deg_up_to_flat(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); -} - -/* 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}, @@ -3152,6 +2473,90 @@ static void junior_rc_right_bank_paint_setup(uint8 rideIndex, uint8 trackSequenc junior_rc_left_bank_paint_setup(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); } +void junior_rc_paint_track_left_quarter_turn_5_tiles_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_right_quarter_turn_5_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_left_quarter_turn_5_tiles_25_deg_up[chainType], junior_rc_left_quarter_turn_5_tiles_25_deg_up_offsets, defaultRightQuarterTurn5TilesBoundLengths, NULL, get_current_rotation()); + + uint8 supportSpecial[4] = { 8, 8, 8, 3 }; + switch (trackSequence) { + case 0: + metal_a_supports_paint_setup((direction & 1) ? 2 : 1, 4, (direction == 0 || direction == 3) ? 10 : 8, height, gTrackColours[SCHEME_SUPPORTS]); + break; + case 6: + metal_a_supports_paint_setup((direction & 1) ? 1 : 2, 4, supportSpecial[direction], height, gTrackColours[SCHEME_SUPPORTS]); + 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); + } +} + +void junior_rc_paint_track_right_quarter_turn_5_tiles_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_right_quarter_turn_5_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_right_quarter_turn_5_tiles_25_deg_up[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + break; + case 6: + metal_a_supports_paint_setup((direction & 1) ? 1 : 2, 4, 8, height, gTrackColours[SCHEME_SUPPORTS]); + 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: 0x008AAE10, 0x00519D88, 0x00519DAC, 0x00519DD0, 0x00519DF4 */ static void junior_rc_left_quarter_turn_5_tiles_25_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { bool isChained = track_element_is_lift_hill(mapElement); @@ -3447,6 +2852,135 @@ static void junior_rc_right_quarter_turn_3_tiles_bank_paint_setup(uint8 rideInde paint_util_set_general_support_height(height + 32, 0x20); } +void junior_rc_paint_track_right_quarter_turn_3_tiles_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + 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[chainType][direction][0] | gTrackColours[SCHEME_TRACK]; + 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[chainType][direction][1] | gTrackColours[SCHEME_TRACK]; + 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, gTrackColours[SCHEME_SUPPORTS]); + 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); +} + +void junior_rc_paint_track_right_quarter_turn_3_tiles_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + 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[chainType][direction][0] | gTrackColours[SCHEME_TRACK]; + 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[chainType][direction][1] | gTrackColours[SCHEME_TRACK]; + 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_2); + } + + 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, gTrackColours[SCHEME_SUPPORTS]); + 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: 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) { @@ -4116,6 +3650,107 @@ static void junior_rc_right_eighth_to_orthogonal_bank_paint_setup(uint8 rideInde 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}; + +void junior_rc_paint_track_diag_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_flat[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_25_deg_up[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_flat_to_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_flat_to_25_deg_up[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_25_deg_up_to_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_25_deg_up_to_flat[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_25_deg_down[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_flat_to_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_flat_to_25_deg_down[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_25_deg_down_to_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_25_deg_down_to_flat[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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: 0x008AAF10 */ static void junior_rc_diag_flat_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) { @@ -4437,6 +4072,78 @@ static void junior_rc_diag_right_bank_paint_setup(uint8 rideIndex, uint8 trackSe 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}, +}; + +void junior_rc_paint_track_60_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + uint32 image_id = gTrackColours[SCHEME_TRACK]; + + image_id |= junior_rc_track_pieces_60_deg_up[chainType][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 = {gPaintMapPosition.x, gPaintMapPosition.y}; + + 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { bool isChained = track_element_is_lift_hill(mapElement); @@ -4447,6 +4154,89 @@ static void junior_rc_60_deg_down_paint_setup(uint8 rideIndex, uint8 trackSequen 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}}, +}; + +void junior_rc_paint_track_25_deg_up_to_60_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + uint32 image_id = gTrackColours[SCHEME_TRACK]; + + image_id |= junior_rc_track_pieces_25_deg_up_to_60_deg_up[chainType][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[chainType][direction][1] != 0) { + image_id = gTrackColours[SCHEME_TRACK]; + + image_id |= junior_rc_track_pieces_25_deg_up_to_60_deg_up[chainType][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 = {gPaintMapPosition.x, gPaintMapPosition.y}; + + 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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_up_to_60_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { bool isChained = track_element_is_lift_hill(mapElement); @@ -4457,6 +4247,67 @@ static void junior_rc_60_deg_down_to_25_deg_down_paint_setup(uint8 rideIndex, ui junior_rc_25_deg_up_to_60_deg_up_paint_setup(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); } +void junior_rc_paint_track_60_deg_up_to_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + uint32 image_id = gTrackColours[SCHEME_TRACK]; + + image_id |= junior_rc_track_pieces_60_deg_up_to_25_deg_up[chainType][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[chainType][direction][1] != 0) { + image_id = gTrackColours[SCHEME_TRACK]; + + image_id |= junior_rc_track_pieces_60_deg_up_to_25_deg_up[chainType][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 = {gPaintMapPosition.x, gPaintMapPosition.y}; + + if (track_paint_util_should_paint_supports(pos)) { + metal_a_supports_paint_setup(direction & 1 ? 2 : 1, 4, 20, height, gTrackColours[SCHEME_SUPPORTS]); + } + + 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_up_to_25_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { bool isChained = track_element_is_lift_hill(mapElement); @@ -4467,6 +4318,106 @@ static void junior_rc_25_deg_down_to_60_deg_down_paint_setup(uint8 rideIndex, ui junior_rc_60_deg_up_to_25_deg_up_paint_setup(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); } +void junior_rc_paint_track_diag_60_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_60_deg_up[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_60_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_60_deg_down[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_25_deg_up_to_60_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_25_deg_up_to_60_deg_up[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_60_deg_up_to_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + if (direction == 1 && trackSequence == 3) { + sub_98197C( + junior_rc_track_pieces_diag_60_deg_up_to_25_deg_up[chainType][direction] | gTrackColours[SCHEME_TRACK], + -16, -16, + 16, 16, 1, + height, + 0, 0, height, + get_current_rotation() + ); + } else { + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_60_deg_up_to_25_deg_up[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_25_deg_down_to_60_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + if (direction == 3 && trackSequence == 0) { + sub_98197C( + junior_rc_track_pieces_diag_25_deg_down_to_60_deg_down[chainType][direction] | gTrackColours[SCHEME_TRACK], + -16, -16, + 16, 16, 1, + height, + 0, 0, height, + get_current_rotation() + ); + } else { + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_25_deg_down_to_60_deg_down[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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); +} + +void junior_rc_paint_track_diag_60_deg_down_to_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, JUNIOR_RC_CHAINTYPE chainType) +{ + track_paint_util_diag_tiles_paint(1, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], junior_rc_track_pieces_diag_60_deg_down_to_25_deg_down[chainType], 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, gTrackColours[SCHEME_SUPPORTS]); + } + + 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_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) { bool isChained = track_element_is_lift_hill(mapElement); @@ -4675,6 +4626,54 @@ static void junior_rc_flat_to_60_deg_down_paint_setup(uint8 rideIndex, uint8 tra junior_rc_60_deg_up_to_flat_paint_setup(rideIndex, trackSequence, (direction + 2) & 3, height, mapElement); } +/* rct2: 0x00518394 */ +static void junior_rc_flat_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement){ + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_flat(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); +} + +/* rct2: 0x00515629, 0x00514D22, 0x005151B9 */ +static void paint_junior_rc_station_track(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) +{ + junior_rc_paint_station(rideIndex, trackSequence, direction, height, mapElement, RIDE_TYPE_JUNIOR_ROLLER_COASTER); +} + +/* rct2: 0x0051881E */ +static void junior_rc_25_deg_up_paint_setup(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element* mapElement) { + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_25_deg_up(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); +} + +/* 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) { + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_flat_to_25_deg_up(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); +} + +/* 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) { + bool isChained = track_element_is_lift_hill(mapElement); + junior_rc_paint_track_25_deg_up_to_flat(rideIndex, trackSequence, direction, height, mapElement, isChained ? JUNIOR_RC_CHAIN_FRICTION_WHEELS : JUNIOR_RC_CHAIN_NONE); +} + +/* 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); +} + /* 0x008AAA0C */ TRACK_PAINT_FUNCTION get_track_paint_function_junior_rc(int trackType, int direction) { From b868cccea2d7fabc80b53c85b3740852ccbeded6 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Sun, 23 Oct 2016 14:41:47 +0200 Subject: [PATCH 4/5] Remove `pragma mark` --- src/ride/water/water_coaster.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ride/water/water_coaster.c b/src/ride/water/water_coaster.c index 0000a25bf7..8a073149cc 100644 --- a/src/ride/water/water_coaster.c +++ b/src/ride/water/water_coaster.c @@ -148,7 +148,7 @@ static void water_rc_track_60_deg_down_to_25_deg_down(uint8 rideIndex, uint8 tra water_rc_track_25_deg_up_to_60_deg_up(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); } -#pragma mark - 5 tile turns +// 5 tile turns static void water_rc_track_left_quarter_turn_5_tiles_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) { @@ -171,7 +171,7 @@ static void water_rc_track_right_quarter_turn_5_tiles_25_deg_down(uint8 rideInde water_rc_track_left_quarter_turn_5_tiles_25_deg_up(rideIndex, left_quarter_turn_5_tiles_to_right_turn_map[trackSequence], (direction + 3) % 4, height, mapElement); } -#pragma mark - 3 tile turns +// 3 tile turns static void water_rc_track_right_quarter_turn_3_tiles_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) { From e8e203983267425503fe0f6c84cf805b5116ea1a Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Sun, 23 Oct 2016 14:47:40 +0200 Subject: [PATCH 5/5] Fix GCC --- src/ride/coaster/junior_roller_coaster.c | 12 +++--------- src/ride/water/water_coaster.c | 13 ------------- 2 files changed, 3 insertions(+), 22 deletions(-) diff --git a/src/ride/coaster/junior_roller_coaster.c b/src/ride/coaster/junior_roller_coaster.c index 4b3f96a996..061e739d72 100644 --- a/src/ride/coaster/junior_roller_coaster.c +++ b/src/ride/coaster/junior_roller_coaster.c @@ -1804,13 +1804,9 @@ void junior_rc_paint_track_flat(uint8 rideIndex, uint8 trackSequence, uint8 dire paint_util_set_general_support_height(height + 32, 0x20); } -void junior_rc_paint_station(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, uint8 rideType) { - rct_ride * ride = get_ride(rideIndex); - const rct_ride_entrance_definition * entranceStyle = &RideEntranceDefinitions[ride->entrance_style]; - uint32 imageId = entranceStyle->base_image_id; - if (!(gTrackColours[SCHEME_MISC] & (1 << 29))) { - imageId &= 0x7FFFF; - } +void junior_rc_paint_station(uint8 rideIndex, uint8 trackSequence, uint8 direction, uint16 height, rct_map_element* mapElement, uint8 rideType) +{ + uint32 imageId; bool isBraked = (bool)(mapElement->flags & MAP_ELEMENT_FLAG_BLOCK_BRAKE_CLOSED); @@ -1918,8 +1914,6 @@ void junior_rc_paint_track_25_deg_up_to_flat(uint8 rideIndex, uint8 trackSequenc paint_util_push_tunnel_left(tunnelHeight, tunnelType); } - const rct_xy16 pos = {gPaintMapPosition.x, gPaintMapPosition.y}; - if (track_paint_util_should_paint_supports(gPaintMapPosition)) { int supportType = direction & 1 ? 2 : 1; metal_a_supports_paint_setup(supportType, 4, 6, height, gTrackColours[SCHEME_SUPPORTS]); diff --git a/src/ride/water/water_coaster.c b/src/ride/water/water_coaster.c index 8a073149cc..f01fe6ff3b 100644 --- a/src/ride/water/water_coaster.c +++ b/src/ride/water/water_coaster.c @@ -16,22 +16,9 @@ #include "../../common.h" #include "../coaster/junior_roller_coaster.h" -#include "../../common.h" -#include "../../interface/viewport.h" -#include "../../paint/supports.h" -#include "../../paint/paint.h" #include "../track.h" #include "../track_paint.h" -static const uint8 water_rc_diag_support_segment[] = {1, 0, 2, 3}; - -static const int water_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 void water_rc_track_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) { bool isChained = track_element_is_lift_hill(mapElement);