From 7d5f842d0f5353d7ac3dcf17bb48fc6cfab01424 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Wed, 25 May 2016 23:50:27 +0200 Subject: [PATCH] Paint 5-tile turn --- src/ride/gentle/monorail_cycles.c | 7 +- src/ride/track_paint.c | 117 ++++++++++++++++++------------ src/ride/track_paint.h | 6 +- src/ride/transport/monorail.c | 96 +++++++++++++++++++++++- 4 files changed, 172 insertions(+), 54 deletions(-) diff --git a/src/ride/gentle/monorail_cycles.c b/src/ride/gentle/monorail_cycles.c index fd6e046352..a2f9b9a989 100644 --- a/src/ride/gentle/monorail_cycles.c +++ b/src/ride/gentle/monorail_cycles.c @@ -283,8 +283,7 @@ static const sint8 monorail_cycles_track_right_quarter_turn_5_tiles_support_spec /** rct2: 0x0088ADB8 */ static void paint_monorail_cycles_track_right_quarter_turn_5_tiles(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) { - track_paint_util_right_quarter_turn_5_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), monorail_cycles_track_pieces_flat_quarter_turn_5_tiles, get_current_rotation()); - + track_paint_util_right_quarter_turn_5_tiles_paint(1, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), monorail_cycles_track_pieces_flat_quarter_turn_5_tiles, NULL, defaultRightQuarterTurn5TilesBoundLengths, defaultRightQuarterTurn5TilesOffsets, get_current_rotation()); int supportHeight = height + monorail_cycles_track_right_quarter_turn_5_tiles_support_height_offset[direction][trackSequence]; int supportSpecial = monorail_cycles_track_right_quarter_turn_5_tiles_support_special[direction][trackSequence]; @@ -336,12 +335,10 @@ static void paint_monorail_cycles_track_right_quarter_turn_5_tiles(uint8 rideInd paint_util_set_general_support_height(height + 32, 0x20); } -static const uint8 left_quarter_turn_5_tiles_to_right_turn_map[] = {6, 4, 5, 3, 1, 2, 0}; - /** rct2: 0x0088ADA8 */ static void paint_monorail_cycles_track_left_quarter_turn_5_tiles(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) { - trackSequence = left_quarter_turn_5_tiles_to_right_turn_map[trackSequence]; + trackSequence = mapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[trackSequence]; paint_monorail_cycles_track_right_quarter_turn_5_tiles(rideIndex, trackSequence, (direction + 1) % 4, height, mapElement); } diff --git a/src/ride/track_paint.c b/src/ride/track_paint.c index 3bc377d454..a28a22082c 100644 --- a/src/ride/track_paint.c +++ b/src/ride/track_paint.c @@ -551,57 +551,84 @@ void track_paint_util_draw_pier(rct_ride * ride, const rct_ride_entrance_definit } } +const uint8 mapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[] = {6, 4, 5, 3, 1, 2, 0}; + +const rct_xy16 defaultRightQuarterTurn5TilesOffsets[4][5] = { + { + {0, 6}, + {0, 16}, + {0, 0}, + {16, 0}, + {6, 0}, + }, + { + {6, 0}, + {16, 0}, + {0, 16}, + {0, 0}, + {0, 6}, + }, + { + {0, 6}, + {0, 0}, + {16, 16}, + {0, 0}, + {6, 0}, + }, + { + {6, 0}, + {0, 0}, + {16, 0}, + {0, 16}, + {0, 6}, + } +}; + +const rct_xy16 defaultRightQuarterTurn5TilesBoundLengths[4][5] = { + { + {32, 20}, + {32, 16}, + {16, 16}, + {16, 32}, + {20, 32}, + }, + { + {20, 32}, + {16, 32}, + {16, 16}, + {32, 16}, + {32, 20}, + }, + { + {32, 20}, + {32, 16}, + {16, 16}, + {16, 32}, + {20, 32}, + }, + { + {20, 32}, + {16, 32}, + {16, 16}, + {32, 16}, + {32, 20}, + } +}; + static const sint8 right_quarter_turn_5_tiles_sprite_map[] = {0, -1, 1, 2, -1, 3, 4}; -void track_paint_util_right_quarter_turn_5_tiles_paint(sint8 thickness, sint16 height, int direction, uint8 trackSequence, uint32 colourFlags, const uint32 sprites[4][5], uint8 rotation) +void track_paint_util_right_quarter_turn_5_tiles_paint(sint8 thickness, sint16 height, int direction, uint8 trackSequence, uint32 colourFlags, const uint32 sprites[4][5], const rct_xy16 offsets[4][5], const rct_xy16 boundsLengths[4][5], const rct_xy16 boundsOffsets[4][5], uint8 rotation) { - sint8 sprite = right_quarter_turn_5_tiles_sprite_map[trackSequence]; - if (sprite < 0) { + int index = right_quarter_turn_5_tiles_sprite_map[trackSequence]; + if (index < 0) { return; } - uint32 imageId = sprites[direction][sprite] | colourFlags; + uint32 imageId = sprites[direction][index] | colourFlags; + rct_xy16 offset = (offsets == NULL ? (rct_xy16){0, 0} : offsets[direction][index]); + rct_xy16 boundsLength = boundsLengths[direction][index]; + rct_xy16 boundsOffset = (boundsOffsets == NULL ? offset : boundsOffsets[direction][index]); - switch (direction) { - case 0: - switch (trackSequence) { - case 0: sub_98197C(imageId, 0, 0, 32, 20, thickness, height, 0, 6, height, rotation); break; - case 2: sub_98197C(imageId, 0, 0, 32, 16, thickness, height, 0, 16, height, rotation); break; - case 3: sub_98197C(imageId, 0, 0, 16, 16, thickness, height, 0, 0, height, rotation); break; - case 5: sub_98197C(imageId, 0, 0, 16, 32, thickness, height, 16, 0, height, rotation); break; - case 6: sub_98197C(imageId, 0, 0, 20, 32, thickness, height, 6, 0, height, rotation); break; - } - break; - - case 1: - switch (trackSequence) { - case 0: sub_98197C(imageId, 0, 0, 20, 32, thickness, height, 6, 0, height, rotation); break; - case 2: sub_98197C(imageId, 0, 0, 16, 32, thickness, height, 16, 0, height, rotation); break; - case 3: sub_98197C(imageId, 0, 0, 16, 16, thickness, height, 0, 16, height, rotation); break; - case 5: sub_98197C(imageId, 0, 0, 32, 16, thickness, height, 0, 0, height, rotation); break; - case 6: sub_98197C(imageId, 0, 0, 32, 20, thickness, height, 0, 6, height, rotation); break; - } - break; - - case 2: - switch (trackSequence) { - case 0: sub_98197C(imageId, 0, 0, 32, 20, thickness, height, 0, 6, height, rotation); break; - case 2: sub_98197C(imageId, 0, 0, 32, 16, thickness, height, 0, 0, height, rotation); break; - case 3: sub_98197C(imageId, 0, 0, 16, 16, thickness, height, 16, 16, height, rotation); break; - case 5: sub_98197C(imageId, 0, 0, 20, 32, thickness, height, 0, 0, height, rotation); break; - case 6: sub_98197C(imageId, 0, 0, 20, 32, thickness, height, 6, 0, height, rotation); break; - } - break; - - case 3: - switch (trackSequence) { - case 0: sub_98197C(imageId, 0, 0, 20, 32, thickness, height, 6, 0, height, rotation); break; - case 2: sub_98197C(imageId, 0, 0, 16, 32, thickness, height, 0, 0, height, rotation); break; - case 3: sub_98197C(imageId, 0, 0, 16, 16, thickness, height, 16, 0, height, rotation); break; - case 5: sub_98197C(imageId, 0, 0, 32, 16, thickness, height, 0, 16, height, rotation); break; - case 6: sub_98197C(imageId, 0, 0, 32, 20, thickness, height, 0, 6, height, rotation); break; - } - break; - } + sub_98197C(imageId, (sint8) offset.x, (sint8) offset.y, boundsLength.x, boundsLength.y, thickness, height, boundsOffset.x, boundsOffset.y, height, rotation); } void track_paint_util_right_quarter_turn_5_tiles_paint_2(sint16 height, int direction, uint8 rotation, uint8 trackSequence, uint32 colourFlags, const sprite_bb sprites[][5]) diff --git a/src/ride/track_paint.h b/src/ride/track_paint.h index 725ce3d74b..4aaf1efd89 100644 --- a/src/ride/track_paint.h +++ b/src/ride/track_paint.h @@ -179,6 +179,10 @@ extern const uint32 fenceSpritesMetalB[]; extern const uint32 trackSpritesSubmarineRideMiniHelicoptersQuarterTurn3Tiles[4][3]; extern const uint32 trackSpritesSubmarineRideMiniHelicoptersQuarterTurn1Tile[4]; +extern const uint8 mapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[]; +extern const rct_xy16 defaultRightQuarterTurn5TilesOffsets[4][5]; +extern const rct_xy16 defaultRightQuarterTurn5TilesBoundLengths[4][5]; + extern const uint8 mapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[]; extern const rct_xy16 defaultRightQuarterTurn3TilesOffsets[4][3]; extern const rct_xy16 defaultRightQuarterTurn3TilesBoundLengths[4][3]; @@ -194,7 +198,7 @@ void track_paint_util_draw_station(uint8 rideIndex, uint8 trackSequence, uint8 d bool track_paint_util_should_paint_supports(rct_xy16 position); void track_paint_util_draw_pier(rct_ride * ride, const rct_ride_entrance_definition * entranceStyle, rct_xy16 position, uint8 direction, int height, rct_map_element * mapElement, uint8 rotation); -void track_paint_util_right_quarter_turn_5_tiles_paint(sint8 thickness, sint16 height, int direction, uint8 trackSequence, uint32 colourFlags, const uint32 sprites[4][5], uint8 rotation); +void track_paint_util_right_quarter_turn_5_tiles_paint(sint8 thickness, sint16 height, int direction, uint8 trackSequence, uint32 colourFlags, const uint32 sprites[4][5], const rct_xy16 offsets[4][5], const rct_xy16 boundsLengths[4][5], const rct_xy16 boundsOffsets[4][5], uint8 rotation); void track_paint_util_right_quarter_turn_5_tiles_paint_2(sint16 height, int direction, uint8 rotation, uint8 trackSequence, uint32 colourFlags, const sprite_bb sprites[][5]); void track_paint_util_right_quarter_turn_3_tiles_paint(sint8 thickness, sint16 height, int direction, uint8 trackSequence, uint32 colourFlags, const uint32 sprites[4][3], const rct_xy16 offsets[4][3], const rct_xy16 boundsLengths[4][3], const rct_xy16 boundsOffsets[4][3], uint8 rotation); void track_paint_util_right_quarter_turn_3_tiles_tunnel(sint16 height, uint8 direction, uint8 trackSequence); diff --git a/src/ride/transport/monorail.c b/src/ride/transport/monorail.c index b3494231c3..1e2eda8ccf 100644 --- a/src/ride/transport/monorail.c +++ b/src/ride/transport/monorail.c @@ -28,7 +28,26 @@ enum { SPR_MONORAIL_FLAT_SW_NE = 23231, SPR_MONORAIL_FLAT_NW_SE = 23232, - + SPR_MONORAIL_QUARTER_TURN_5_TILES_SW_SE_PART_0 = 23233, + SPR_MONORAIL_QUARTER_TURN_5_TILES_SW_SE_PART_1 = 23234, + SPR_MONORAIL_QUARTER_TURN_5_TILES_SW_SE_PART_2 = 23235, + SPR_MONORAIL_QUARTER_TURN_5_TILES_SW_SE_PART_3 = 23236, + SPR_MONORAIL_QUARTER_TURN_5_TILES_SW_SE_PART_4 = 23237, + SPR_MONORAIL_QUARTER_TURN_5_TILES_NW_SW_PART_0 = 23238, + SPR_MONORAIL_QUARTER_TURN_5_TILES_NW_SW_PART_1 = 23239, + SPR_MONORAIL_QUARTER_TURN_5_TILES_NW_SW_PART_2 = 23240, + SPR_MONORAIL_QUARTER_TURN_5_TILES_NW_SW_PART_3 = 23241, + SPR_MONORAIL_QUARTER_TURN_5_TILES_NW_SW_PART_4 = 23242, + SPR_MONORAIL_QUARTER_TURN_5_TILES_NE_NW_PART_0 = 23243, + SPR_MONORAIL_QUARTER_TURN_5_TILES_NE_NW_PART_1 = 23244, + SPR_MONORAIL_QUARTER_TURN_5_TILES_NE_NW_PART_2 = 23245, + SPR_MONORAIL_QUARTER_TURN_5_TILES_NE_NW_PART_3 = 23246, + SPR_MONORAIL_QUARTER_TURN_5_TILES_NE_NW_PART_4 = 23247, + SPR_MONORAIL_QUARTER_TURN_5_TILES_SE_NE_PART_0 = 23248, + SPR_MONORAIL_QUARTER_TURN_5_TILES_SE_NE_PART_1 = 23249, + SPR_MONORAIL_QUARTER_TURN_5_TILES_SE_NE_PART_2 = 23250, + SPR_MONORAIL_QUARTER_TURN_5_TILES_SE_NE_PART_3 = 23251, + SPR_MONORAIL_QUARTER_TURN_5_TILES_SE_NE_PART_4 = 23252, SPR_MONORAIL_25_DEG_UP_SW_NE = 23253, SPR_MONORAIL_FLAT_TO_25_DEG_UP_SW_NE = 23254, SPR_MONORAIL_25_DEG_UP_NE_SW = 23255, @@ -83,6 +102,37 @@ static const uint32 monorail_track_pieces_flat[4] = { SPR_MONORAIL_FLAT_NW_SE, }; +static const uint32 monorail_track_pieces_flat_quarter_turn_5_tiles[4][5] = { + { + SPR_MONORAIL_QUARTER_TURN_5_TILES_SW_SE_PART_0, + SPR_MONORAIL_QUARTER_TURN_5_TILES_SW_SE_PART_1, + SPR_MONORAIL_QUARTER_TURN_5_TILES_SW_SE_PART_2, + SPR_MONORAIL_QUARTER_TURN_5_TILES_SW_SE_PART_3, + SPR_MONORAIL_QUARTER_TURN_5_TILES_SW_SE_PART_4, + }, + { + SPR_MONORAIL_QUARTER_TURN_5_TILES_NW_SW_PART_0, + SPR_MONORAIL_QUARTER_TURN_5_TILES_NW_SW_PART_1, + SPR_MONORAIL_QUARTER_TURN_5_TILES_NW_SW_PART_2, + SPR_MONORAIL_QUARTER_TURN_5_TILES_NW_SW_PART_3, + SPR_MONORAIL_QUARTER_TURN_5_TILES_NW_SW_PART_4, + }, + { + SPR_MONORAIL_QUARTER_TURN_5_TILES_NE_NW_PART_0, + SPR_MONORAIL_QUARTER_TURN_5_TILES_NE_NW_PART_1, + SPR_MONORAIL_QUARTER_TURN_5_TILES_NE_NW_PART_2, + SPR_MONORAIL_QUARTER_TURN_5_TILES_NE_NW_PART_3, + SPR_MONORAIL_QUARTER_TURN_5_TILES_NE_NW_PART_4, + }, + { + SPR_MONORAIL_QUARTER_TURN_5_TILES_SE_NE_PART_0, + SPR_MONORAIL_QUARTER_TURN_5_TILES_SE_NE_PART_1, + SPR_MONORAIL_QUARTER_TURN_5_TILES_SE_NE_PART_2, + SPR_MONORAIL_QUARTER_TURN_5_TILES_SE_NE_PART_3, + SPR_MONORAIL_QUARTER_TURN_5_TILES_SE_NE_PART_4, + } +}; + static const uint32 monorail_track_pieces_25_deg_up[4] = { SPR_MONORAIL_25_DEG_UP_SW_NE, SPR_MONORAIL_25_DEG_UP_NW_SE, @@ -400,14 +450,54 @@ static void paint_monorail_track_25_deg_down_to_flat(uint8 rideIndex, uint8 trac paint_monorail_track_flat_to_25_deg_up(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); } -/** rct2: 0x */ +/** rct2: 0x008AE22C */ static void paint_monorail_track_right_quarter_turn_5_tiles(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) { + track_paint_util_right_quarter_turn_5_tiles_paint(3, height, direction, trackSequence, RCT2_GLOBAL(0x00F44198, uint32), monorail_track_pieces_flat_quarter_turn_5_tiles, defaultRightQuarterTurn5TilesOffsets, defaultRightQuarterTurn5TilesBoundLengths, NULL, get_current_rotation()); + + switch (trackSequence) { + case 0: + case 6: + metal_a_supports_paint_setup(3, 4, 0, height, RCT2_GLOBAL(0x00F4419C, uint32)); + break; + } + + if (direction == 0 && trackSequence == 0) { + paint_util_push_tunnel_left(height, TUNNEL_6); + } + + if (direction == 0 && trackSequence == 6) { + paint_util_push_tunnel_right(height, TUNNEL_6); + } + + if (direction == 1 && trackSequence == 6) { + paint_util_push_tunnel_left(height, TUNNEL_6); + } + + if (direction == 3 && trackSequence == 0) { + paint_util_push_tunnel_right(height, TUNNEL_6); + } + + int blockedSegments = 0; + switch (trackSequence) { + case 0: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC; break; + case 2: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_D4 | SEGMENT_BC | SEGMENT_C0 | SEGMENT_CC; break; + case 3: blockedSegments = SEGMENT_B4 | SEGMENT_C8 | SEGMENT_CC | SEGMENT_C4; break; + case 5: blockedSegments = SEGMENT_D4 | SEGMENT_C4 | SEGMENT_D0 | SEGMENT_B8 | SEGMENT_C0 | SEGMENT_C8; break; + case 6: blockedSegments = SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8; break; + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + + + paint_util_set_general_support_height(height + 32, 0x20); } -/** rct2: 0x */ +/** rct2: 0x008AE21C */ static void paint_monorail_track_left_quarter_turn_5_tiles(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) { + trackSequence = mapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[trackSequence]; + paint_monorail_track_right_quarter_turn_5_tiles(rideIndex, trackSequence, (direction + 1) % 4, height, mapElement); } /** rct2: 0x */