From 42c56dbcc5f51b708a7cf7049d830c1219d8c223 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 24 Sep 2016 15:01:28 +0100 Subject: [PATCH] Implement diagonals --- src/ride/water/water_coaster.c | 212 +++++++++++++++++++++++++++++++-- 1 file changed, 205 insertions(+), 7 deletions(-) diff --git a/src/ride/water/water_coaster.c b/src/ride/water/water_coaster.c index aec0e7c148..91a21d61ca 100644 --- a/src/ride/water/water_coaster.c +++ b/src/ride/water/water_coaster.c @@ -50,6 +50,38 @@ enum { 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] = { @@ -112,7 +144,76 @@ static const uint32 water_rc_track_pieces_25_deg_up_to_flat[2][4] = { }, }; -static void paint_water_rc_track_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +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 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); uint32 imageId = water_rc_track_pieces_flat[isChained][direction] | gTrackColours[SCHEME_TRACK]; @@ -127,7 +228,7 @@ static void paint_water_rc_track_flat(uint8 rideIndex, uint8 trackSequence, uint paint_util_set_general_support_height(height + 32, 0x20); } -static void paint_water_rc_track_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +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]; @@ -192,24 +293,121 @@ static void water_rc_track_25_deg_up_to_flat(uint8 rideIndex, uint8 trackSequenc paint_util_set_general_support_height(height + 40, 0x20); } +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); +} + +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); +} + +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 = mapElement->type & (1 << 7); + 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); +} + +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 = mapElement->type & (1 << 7); + 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); +} + TRACK_PAINT_FUNCTION get_track_paint_function_water_rc(int trackType, int direction) { switch (trackType) { case TRACK_ELEM_FLAT: - return paint_water_rc_track_flat; + return water_rc_track_flat; case TRACK_ELEM_25_DEG_UP: - return paint_water_rc_track_25_deg_up; + return water_rc_track_25_deg_up; case TRACK_ELEM_FLAT_TO_25_DEG_UP: return water_rc_track_flat_to_25_deg_up; case TRACK_ELEM_25_DEG_UP_TO_FLAT: return water_rc_track_25_deg_up_to_flat; - case TRACK_ELEM_DIAG_FLAT: + return water_rc_track_diag_flat; case TRACK_ELEM_DIAG_25_DEG_UP: + return water_rc_track_diag_25_deg_up; case TRACK_ELEM_DIAG_FLAT_TO_25_DEG_UP: + return water_rc_track_diag_flat_to_25_deg_up; case TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT: - // TODO - return NULL; + return water_rc_track_diag_25_deg_up_to_flat; ////////////////////////////////////////////////////// // Use Junior RC