From 159f048abcaf3a5599df96ab4dfdb123c7f71240 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sat, 24 Sep 2016 09:43:15 +0100 Subject: [PATCH] Make stub mini railway based on monorail --- src/ride/track_data.c | 2 +- src/ride/track_paint.h | 1 + src/ride/transport/minature_railway.c | 1135 +++++++++++++++++++++++++ 3 files changed, 1137 insertions(+), 1 deletion(-) diff --git a/src/ride/track_data.c b/src/ride/track_data.c index 0a2a50113d..7d197c85c9 100644 --- a/src/ride/track_data.c +++ b/src/ride/track_data.c @@ -6246,7 +6246,7 @@ const TRACK_PAINT_FUNCTION_GETTER RideTypeTrackPaintFunctions[91] = { get_track_paint_function_suspended_swinging_rc, // RIDE_TYPE_SUSPENDED_SWINGING_COASTER get_track_paint_function_inverted_rc, // RIDE_TYPE_INVERTED_ROLLER_COASTER get_track_paint_function_junior_rc, // RIDE_TYPE_JUNIOR_ROLLER_COASTER - 0, // RIDE_TYPE_MINIATURE_RAILWAY + get_track_paint_function_minature_railway, // RIDE_TYPE_MINIATURE_RAILWAY get_track_paint_function_monorail, // RIDE_TYPE_MONORAIL get_track_paint_function_mini_suspended_rc, // RIDE_TYPE_MINI_SUSPENDED_COASTER get_track_paint_function_boat_ride, // RIDE_TYPE_BOAT_RIDE diff --git a/src/ride/track_paint.h b/src/ride/track_paint.h index c3409824a5..61291e171b 100644 --- a/src/ride/track_paint.h +++ b/src/ride/track_paint.h @@ -304,6 +304,7 @@ TRACK_PAINT_FUNCTION get_track_paint_function_inverted_rc(int trackType, int dir TRACK_PAINT_FUNCTION get_track_paint_function_junior_rc(int trackType, int direction); TRACK_PAINT_FUNCTION get_track_paint_function_monorail(int trackType, int direction); TRACK_PAINT_FUNCTION get_track_paint_function_mini_suspended_rc(int trackType, int direction); +TRACK_PAINT_FUNCTION get_track_paint_function_minature_railway(int trackType, int direction); TRACK_PAINT_FUNCTION get_track_paint_function_boat_ride(int trackType, int direction); TRACK_PAINT_FUNCTION get_track_paint_function_wooden_wild_mouse(int trackType, int direction); TRACK_PAINT_FUNCTION get_track_paint_function_steeplechase(int trackType, int direction); diff --git a/src/ride/transport/minature_railway.c b/src/ride/transport/minature_railway.c index 846fd9695d..6d8cd8a44d 100644 --- a/src/ride/transport/minature_railway.c +++ b/src/ride/transport/minature_railway.c @@ -13,3 +13,1138 @@ * A full copy of the GNU General Public License can be found in licence.txt *****************************************************************************/ #pragma endregion + +#include "../../common.h" +#include "../track_paint.h" +#include "../track.h" +#include "../vehicle_paint.h" +#include "../../interface/viewport.h" +#include "../../paint/paint.h" +#include "../../paint/supports.h" +#include "../ride_data.h" +#include "../../world/map.h" + +enum +{ + SPR_MINATURE_RAILWAY_FLAT_SW_NE = 23341, + SPR_MINATURE_RAILWAY_FLAT_NW_SE = 23342, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_SW_SE_PART_0 = 23343, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_SW_SE_PART_1 = 23344, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_SW_SE_PART_2 = 23345, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_SW_SE_PART_3 = 23346, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_SW_SE_PART_4 = 23347, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_NW_SW_PART_0 = 23348, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_NW_SW_PART_1 = 23349, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_NW_SW_PART_2 = 23350, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_NW_SW_PART_3 = 23351, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_NW_SW_PART_4 = 23352, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_NE_NW_PART_0 = 23353, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_NE_NW_PART_1 = 23354, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_NE_NW_PART_2 = 23355, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_NE_NW_PART_3 = 23356, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_NE_NW_PART_4 = 23357, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_SE_NE_PART_0 = 23358, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_SE_NE_PART_1 = 23359, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_SE_NE_PART_2 = 23360, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_SE_NE_PART_3 = 23361, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_SE_NE_PART_4 = 23362, + SPR_MINATURE_RAILWAY_25_DEG_UP_SW_NE = 23363, + SPR_MINATURE_RAILWAY_FLAT_TO_25_DEG_UP_SW_NE = 23364, + SPR_MINATURE_RAILWAY_25_DEG_UP_NE_SW = 23365, + SPR_MINATURE_RAILWAY_FLAT_TO_25_DEG_UP_NE_SW = 23366, + SPR_MINATURE_RAILWAY_25_DEG_UP_TO_FLAT_NE_SW = 23367, + SPR_MINATURE_RAILWAY_25_DEG_UP_TO_FLAT_SW_NE = 23368, + SPR_MINATURE_RAILWAY_25_DEG_UP_NW_SE = 23369, + SPR_MINATURE_RAILWAY_25_DEG_UP_SE_NW = 23370, + SPR_MINATURE_RAILWAY_FLAT_TO_25_DEG_UP_NW_SE = 23381, + SPR_MINATURE_RAILWAY_FLAT_TO_25_DEG_UP_SE_NW = 23382, + SPR_MINATURE_RAILWAY_25_DEG_UP_TO_FLAT_SE_NW = 23383, + SPR_MINATURE_RAILWAY_25_DEG_UP_TO_FLAT_NW_SE = 23384, + SPR_MINATURE_RAILWAY_S_BEND_RIGHT_SW_NE_PART_0 = 23385, + SPR_MINATURE_RAILWAY_S_BEND_RIGHT_SW_NE_PART_1 = 23386, + SPR_MINATURE_RAILWAY_S_BEND_RIGHT_SW_NE_PART_2 = 23387, + SPR_MINATURE_RAILWAY_S_BEND_RIGHT_SW_NE_PART_3 = 23388, + SPR_MINATURE_RAILWAY_S_BEND_LEFT_SW_NE_PART_0 = 23389, + SPR_MINATURE_RAILWAY_S_BEND_LEFT_SW_NE_PART_1 = 23390, + SPR_MINATURE_RAILWAY_S_BEND_LEFT_SW_NE_PART_2 = 23391, + SPR_MINATURE_RAILWAY_S_BEND_LEFT_SW_NE_PART_3 = 23392, + SPR_MINATURE_RAILWAY_S_BEND_LEFT_SE_NW_PART_0 = 23393, + SPR_MINATURE_RAILWAY_S_BEND_LEFT_SE_NW_PART_1 = 23394, + SPR_MINATURE_RAILWAY_S_BEND_LEFT_SE_NW_PART_2 = 23395, + SPR_MINATURE_RAILWAY_S_BEND_LEFT_SE_NW_PART_3 = 23396, + SPR_MINATURE_RAILWAY_S_BEND_RIGHT_SE_NW_PART_0 = 23397, + SPR_MINATURE_RAILWAY_S_BEND_RIGHT_SE_NW_PART_1 = 23398, + SPR_MINATURE_RAILWAY_S_BEND_RIGHT_SE_NW_PART_2 = 23399, + SPR_MINATURE_RAILWAY_S_BEND_RIGHT_SE_NW_PART_3 = 23400, + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_SW_SE_PART_0 = 23401, + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_SW_SE_PART_1 = 23402, + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_SW_SE_PART_2 = 23403, + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_NW_SW_PART_0 = 23404, + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_NW_SW_PART_1 = 23405, + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_NW_SW_PART_2 = 23406, + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_NE_NW_PART_0 = 23407, + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_NE_NW_PART_1 = 23408, + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_NE_NW_PART_2 = 23409, + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_SE_NE_PART_0 = 23410, + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_SE_NE_PART_1 = 23411, + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_SE_NE_PART_2 = 23412, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SW_E_PART_0 = 23413, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SW_E_PART_1 = 23414, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SW_E_PART_2 = 23415, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SW_E_PART_3 = 23416, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NW_S_PART_0 = 23417, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NW_S_PART_1 = 23418, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NW_S_PART_2 = 23419, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NW_S_PART_3 = 23420, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NE_W_PART_0 = 23421, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NE_W_PART_1 = 23422, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NE_W_PART_2 = 23423, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NE_W_PART_3 = 23424, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SE_N_PART_0 = 23425, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SE_N_PART_1 = 23426, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SE_N_PART_2 = 23427, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SE_N_PART_3 = 23428, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SW_N_PART_0 = 23429, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SW_N_PART_1 = 23430, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SW_N_PART_2 = 23431, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SW_N_PART_3 = 23432, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NW_E_PART_0 = 23433, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NW_E_PART_1 = 23434, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NW_E_PART_2 = 23435, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NW_E_PART_3 = 23436, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NE_S_PART_0 = 23437, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NE_S_PART_1 = 23438, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NE_S_PART_2 = 23439, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NE_S_PART_3 = 23440, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SE_W_PART_0 = 23441, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SE_W_PART_1 = 23442, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SE_W_PART_2 = 23443, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SE_W_PART_3 = 23444, + SPR_MINATURE_RAILWAY_DIAG_FLAT_W_E = 23445, + SPR_MINATURE_RAILWAY_DIAG_FLAT_N_S = 23446, + SPR_MINATURE_RAILWAY_DIAG_FLAT_E_W = 23447, + SPR_MINATURE_RAILWAY_DIAG_FLAT_S_N = 23448, + SPR_MINATURE_RAILWAY_DIAG_FLAT_TO_25_DEG_UP_W_E = 23449, + SPR_MINATURE_RAILWAY_DIAG_FLAT_TO_25_DEG_UP_N_S = 23450, + SPR_MINATURE_RAILWAY_DIAG_FLAT_TO_25_DEG_UP_E_W = 23451, + SPR_MINATURE_RAILWAY_DIAG_FLAT_TO_25_DEG_UP_S_N = 23452, + SPR_MINATURE_RAILWAY_DIAG_25_DEG_UP_TO_FLAT_W_E = 23453, + SPR_MINATURE_RAILWAY_DIAG_25_DEG_UP_TO_FLAT_N_S = 23454, + SPR_MINATURE_RAILWAY_DIAG_25_DEG_UP_TO_FLAT_E_W = 23455, + SPR_MINATURE_RAILWAY_DIAG_25_DEG_UP_TO_FLAT_S_N = 23456, + SPR_MINATURE_RAILWAY_DIAG_25_DEG_UP_W_E = 23457, + SPR_MINATURE_RAILWAY_DIAG_25_DEG_UP_N_S = 23458, + SPR_MINATURE_RAILWAY_DIAG_25_DEG_UP_E_W = 23459, + SPR_MINATURE_RAILWAY_DIAG_25_DEG_UP_S_N = 23460, +}; + +static const uint32 minature_railway_track_pieces_flat[4] = { + SPR_MINATURE_RAILWAY_FLAT_SW_NE, + SPR_MINATURE_RAILWAY_FLAT_NW_SE, + SPR_MINATURE_RAILWAY_FLAT_SW_NE, + SPR_MINATURE_RAILWAY_FLAT_NW_SE, +}; + +static const uint32 minature_railway_track_pieces_flat_quarter_turn_5_tiles[4][5] = { + { + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_SW_SE_PART_0, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_SW_SE_PART_1, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_SW_SE_PART_2, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_SW_SE_PART_3, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_SW_SE_PART_4, + }, + { + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_NW_SW_PART_0, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_NW_SW_PART_1, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_NW_SW_PART_2, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_NW_SW_PART_3, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_NW_SW_PART_4, + }, + { + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_NE_NW_PART_0, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_NE_NW_PART_1, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_NE_NW_PART_2, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_NE_NW_PART_3, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_NE_NW_PART_4, + }, + { + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_SE_NE_PART_0, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_SE_NE_PART_1, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_SE_NE_PART_2, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_SE_NE_PART_3, + SPR_MINATURE_RAILWAY_QUARTER_TURN_5_TILES_SE_NE_PART_4, + } +}; + +static const uint32 minature_railway_track_pieces_25_deg_up[4] = { + SPR_MINATURE_RAILWAY_25_DEG_UP_SW_NE, + SPR_MINATURE_RAILWAY_25_DEG_UP_NW_SE, + SPR_MINATURE_RAILWAY_25_DEG_UP_NE_SW, + SPR_MINATURE_RAILWAY_25_DEG_UP_SE_NW, +}; + +static const uint32 minature_railway_track_pieces_flat_to_25_deg_up[4] = { + SPR_MINATURE_RAILWAY_FLAT_TO_25_DEG_UP_SW_NE, + SPR_MINATURE_RAILWAY_FLAT_TO_25_DEG_UP_NW_SE, + SPR_MINATURE_RAILWAY_FLAT_TO_25_DEG_UP_NE_SW, + SPR_MINATURE_RAILWAY_FLAT_TO_25_DEG_UP_SE_NW, +}; + +static const uint32 minature_railway_track_pieces_25_deg_up_to_flat[4] = { + SPR_MINATURE_RAILWAY_25_DEG_UP_TO_FLAT_SW_NE, + SPR_MINATURE_RAILWAY_25_DEG_UP_TO_FLAT_NW_SE, + SPR_MINATURE_RAILWAY_25_DEG_UP_TO_FLAT_NE_SW, + SPR_MINATURE_RAILWAY_25_DEG_UP_TO_FLAT_SE_NW, +}; + +static const uint32 minature_railway_track_pieces_s_bend_left[2][4] = { + { + SPR_MINATURE_RAILWAY_S_BEND_LEFT_SW_NE_PART_0, + SPR_MINATURE_RAILWAY_S_BEND_LEFT_SW_NE_PART_1, + SPR_MINATURE_RAILWAY_S_BEND_LEFT_SW_NE_PART_2, + SPR_MINATURE_RAILWAY_S_BEND_LEFT_SW_NE_PART_3, + }, + { + SPR_MINATURE_RAILWAY_S_BEND_LEFT_SE_NW_PART_3, + SPR_MINATURE_RAILWAY_S_BEND_LEFT_SE_NW_PART_2, + SPR_MINATURE_RAILWAY_S_BEND_LEFT_SE_NW_PART_1, + SPR_MINATURE_RAILWAY_S_BEND_LEFT_SE_NW_PART_0, + } +}; + +static const uint32 minature_railway_track_pieces_s_bend_right[2][4] = { + { + SPR_MINATURE_RAILWAY_S_BEND_RIGHT_SW_NE_PART_0, + SPR_MINATURE_RAILWAY_S_BEND_RIGHT_SW_NE_PART_1, + SPR_MINATURE_RAILWAY_S_BEND_RIGHT_SW_NE_PART_2, + SPR_MINATURE_RAILWAY_S_BEND_RIGHT_SW_NE_PART_3, + }, + { + SPR_MINATURE_RAILWAY_S_BEND_RIGHT_SE_NW_PART_3, + SPR_MINATURE_RAILWAY_S_BEND_RIGHT_SE_NW_PART_2, + SPR_MINATURE_RAILWAY_S_BEND_RIGHT_SE_NW_PART_1, + SPR_MINATURE_RAILWAY_S_BEND_RIGHT_SE_NW_PART_0, + } +}; + +static const uint32 minature_railway_track_pieces_flat_quarter_turn_3_tiles[4][3] = { + { + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_SW_SE_PART_0, + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_SW_SE_PART_1, + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_SW_SE_PART_2 + }, + { + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_NW_SW_PART_0, + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_NW_SW_PART_1, + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_NW_SW_PART_2 + }, + { + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_NE_NW_PART_0, + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_NE_NW_PART_1, + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_NE_NW_PART_2 + }, + { + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_SE_NE_PART_0, + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_SE_NE_PART_1, + SPR_MINATURE_RAILWAY_QUARTER_TURN_3_TILES_SE_NE_PART_2 + } +}; + +static const uint32 ghost_train_track_pieces_right_eight_to_diag[4][4] = { + { + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SW_E_PART_0, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SW_E_PART_1, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SW_E_PART_2, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SW_E_PART_3, + }, + { + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NW_S_PART_0, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NW_S_PART_1, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NW_S_PART_2, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NW_S_PART_3, + }, + { + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NE_W_PART_0, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NE_W_PART_1, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NE_W_PART_2, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NE_W_PART_3, + }, + { + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SE_N_PART_0, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SE_N_PART_1, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SE_N_PART_2, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SE_N_PART_3, + }, +}; + +static const rct_xy16 ghost_train_track_pieces_right_eight_to_diag_bounds[4][4] = { + { + {32, 20}, + {32, 16}, + {16, 16}, + {16, 16}, + }, + { + {20, 32}, + {16, 32}, + {16, 16}, + {16, 16}, + }, + { + {32, 20}, + {34, 16}, + {28, 28}, + {16, 18}, + }, + { + {20, 32}, + {16, 32}, + {16, 16}, + {16, 16}, + }, +}; + +static const rct_xy16 ghost_train_track_pieces_right_eight_to_diag_offset[4][4] = { + { + {0, 6}, + {0, 16}, + {0, 0}, + {16, 0}, + }, + { + {6, 0}, + {16, 0}, + {0, 16}, + {0, 0}, + }, + { + {0, 6}, + {0, 0}, + {4, 4}, + {0, 16}, + }, + { + {6, 0}, + {0, 0}, + {16, 0}, + {16, 16}, + }, +}; + +static const uint32 ghost_train_track_pieces_left_eight_to_diag[4][4] = { + { + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SW_N_PART_0, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SW_N_PART_1, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SW_N_PART_2, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SW_N_PART_3, + }, + { + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NW_E_PART_0, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NW_E_PART_1, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NW_E_PART_2, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NW_E_PART_3, + }, + { + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NE_S_PART_0, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NE_S_PART_1, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NE_S_PART_2, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_NE_S_PART_3, + }, + { + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SE_W_PART_0, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SE_W_PART_1, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SE_W_PART_2, + SPR_MINATURE_RAILWAY_EIGHT_TO_DIAG_SE_W_PART_3, + }, +}; + +static const rct_xy16 ghost_train_track_pieces_left_eight_to_diag_bounds[4][4] = { + { + {32, 20}, + {32, 16}, + {16, 16}, + {16, 16}, + }, + { + {20, 32}, + {16, 34}, + {16, 16}, + {18, 16}, + }, + { + {32, 20}, + {32, 16}, + {16, 16}, + {16, 16}, + }, + { + {20, 32}, + {16, 32}, + {16, 16}, + {16, 16}, + }, +}; + +static const rct_xy16 ghost_train_track_pieces_left_eight_to_diag_offset[4][4] = { + { + {0, 6}, + {0, 0}, + {0, 16}, + {16, 16}, + }, + { + {6, 0}, + {0, 0}, + {16, 16}, + {16, 0}, + }, + { + {0, 6}, + {0, 16}, + {16, 0}, + {0, 0}, + }, + { + {6, 0}, + {16, 0}, + {0, 0}, + {0, 16}, + }, +}; + +static const uint32 minature_railway_track_pieces_diag_flat[4] = { + SPR_MINATURE_RAILWAY_DIAG_FLAT_W_E, + SPR_MINATURE_RAILWAY_DIAG_FLAT_N_S, + SPR_MINATURE_RAILWAY_DIAG_FLAT_E_W, + SPR_MINATURE_RAILWAY_DIAG_FLAT_S_N, +}; + +static const uint32 minature_railway_track_pieces_diag_flat_to_25_deg_up[4] = { + SPR_MINATURE_RAILWAY_DIAG_FLAT_TO_25_DEG_UP_W_E, + SPR_MINATURE_RAILWAY_DIAG_FLAT_TO_25_DEG_UP_N_S, + SPR_MINATURE_RAILWAY_DIAG_FLAT_TO_25_DEG_UP_E_W, + SPR_MINATURE_RAILWAY_DIAG_FLAT_TO_25_DEG_UP_S_N, +}; + +static const uint32 minature_railway_track_pieces_diag_25_deg_up_to_flat[4] = { + SPR_MINATURE_RAILWAY_DIAG_25_DEG_UP_TO_FLAT_W_E, + SPR_MINATURE_RAILWAY_DIAG_25_DEG_UP_TO_FLAT_N_S, + SPR_MINATURE_RAILWAY_DIAG_25_DEG_UP_TO_FLAT_E_W, + SPR_MINATURE_RAILWAY_DIAG_25_DEG_UP_TO_FLAT_S_N, +}; + +static const uint32 minature_railway_track_pieces_diag_25_deg_up[4] = { + SPR_MINATURE_RAILWAY_DIAG_25_DEG_UP_W_E, + SPR_MINATURE_RAILWAY_DIAG_25_DEG_UP_N_S, + SPR_MINATURE_RAILWAY_DIAG_25_DEG_UP_E_W, + SPR_MINATURE_RAILWAY_DIAG_25_DEG_UP_S_N, +}; + +/** rct2: 0x008AE1AC */ +static void paint_minature_railway_track_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + rct_xy16 position = {gPaintMapPosition.x, gPaintMapPosition.y}; + + uint32 imageId = minature_railway_track_pieces_flat[direction] | gTrackColours[SCHEME_TRACK]; + + if (direction == 0 || direction == 2) { + sub_98196C(imageId, 0, 6, 32, 20, 3, height, get_current_rotation()); + } else { + sub_98196C(imageId, 6, 0, 20, 32, 3, height, get_current_rotation()); + } + + if (direction == 0 || direction == 2) { + paint_util_push_tunnel_left(height, TUNNEL_6); + } else { + paint_util_push_tunnel_right(height, TUNNEL_6); + } + + if (track_paint_util_should_paint_supports(position)) { + metal_a_supports_paint_setup(3, 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); +} + +/** rct2: 0x008AE25C, 0x008AE26C, 0x008AE27C */ +static void paint_minature_railway_station(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + uint32 imageId; + + if (direction == 0 || direction == 2) { + imageId = SPR_STATION_BASE_B_SW_NE | gTrackColours[SCHEME_MISC]; + sub_98197C(imageId, 0, 0, 32, 28, 2, height - 2, 0, 2, height, get_current_rotation()); + } else if (direction == 1 || direction == 3) { + imageId = SPR_STATION_BASE_B_NW_SE | gTrackColours[SCHEME_MISC]; + sub_98197C(imageId, 0, 0, 28, 32, 2, height - 2, 2, 0, height, get_current_rotation()); + } + + imageId = minature_railway_track_pieces_flat[direction] | gTrackColours[SCHEME_TRACK]; + if (direction == 0 || direction == 2) { + sub_98199C(imageId, 0, 6, 32, 20, 2, height, 0, 0, height, get_current_rotation()); + } else { + sub_98199C(imageId, 6, 0, 20, 32, 2, height, 0, 0, height, get_current_rotation()); + } + + if (direction == 0 || direction == 2) { + paint_util_push_tunnel_left(height, TUNNEL_6); + } else { + paint_util_push_tunnel_right(height, TUNNEL_6); + } + + if (direction == 0 || direction == 2) { + metal_a_supports_paint_setup(3, 5, 0, height, gTrackColours[SCHEME_SUPPORTS]); + metal_a_supports_paint_setup(3, 8, 0, height, gTrackColours[SCHEME_SUPPORTS]); + } else { + metal_a_supports_paint_setup(3, 6, 0, height, gTrackColours[SCHEME_SUPPORTS]); + metal_a_supports_paint_setup(3, 7, 0, height, gTrackColours[SCHEME_SUPPORTS]); + } + + 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: 0x008AE1BC */ +static void paint_minature_railway_track_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + rct_xy16 position = {gPaintMapPosition.x, gPaintMapPosition.y}; + + uint32 imageId = minature_railway_track_pieces_25_deg_up[direction] | gTrackColours[SCHEME_TRACK]; + + if (direction == 0 || direction == 2) { + sub_98196C(imageId, 0, 6, 32, 20, 3, height, get_current_rotation()); + } else { + sub_98196C(imageId, 6, 0, 20, 32, 3, height, get_current_rotation()); + } + + switch (direction) { + case 0: paint_util_push_tunnel_left(height - 8, TUNNEL_7); break; + case 1: paint_util_push_tunnel_right(height + 8, TUNNEL_8); break; + case 2: paint_util_push_tunnel_left(height + 8, TUNNEL_8); break; + case 3: paint_util_push_tunnel_right(height - 8, TUNNEL_7); break; + } + + if (track_paint_util_should_paint_supports(position)) { + metal_a_supports_paint_setup(3, 4, 8, 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 + 56, 0x20); +} + +/** rct2: 0x008AE1CC */ +static void paint_minature_railway_track_flat_to_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + rct_xy16 position = {gPaintMapPosition.x, gPaintMapPosition.y}; + + uint32 imageId = minature_railway_track_pieces_flat_to_25_deg_up[direction] | gTrackColours[SCHEME_TRACK]; + + if (direction == 0 || direction == 2) { + sub_98196C(imageId, 0, 6, 32, 20, 3, height, get_current_rotation()); + } else { + sub_98196C(imageId, 6, 0, 20, 32, 3, height, get_current_rotation()); + } + + switch (direction) { + case 0: paint_util_push_tunnel_left(height, TUNNEL_6); break; + case 1: paint_util_push_tunnel_right(height, TUNNEL_8); break; + case 2: paint_util_push_tunnel_left(height, TUNNEL_8); break; + case 3: paint_util_push_tunnel_right(height, TUNNEL_6); break; + } + + if (track_paint_util_should_paint_supports(position)) { + metal_a_supports_paint_setup(3, 4, 3, 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 + 48, 0x20); +} + +/** rct2: 0x008AE1DC */ +static void paint_minature_railway_track_25_deg_up_to_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + rct_xy16 position = {gPaintMapPosition.x, gPaintMapPosition.y}; + + uint32 imageId = minature_railway_track_pieces_25_deg_up_to_flat[direction] | gTrackColours[SCHEME_TRACK]; + + if (direction == 0 || direction == 2) { + sub_98196C(imageId, 0, 6, 32, 20, 3, height, get_current_rotation()); + } else { + sub_98196C(imageId, 6, 0, 20, 32, 3, height, get_current_rotation()); + } + + switch (direction) { + case 0: paint_util_push_tunnel_left(height - 8, TUNNEL_6); break; + case 1: paint_util_push_tunnel_right(height + 8, TUNNEL_14); break; + case 2: paint_util_push_tunnel_left(height + 8, TUNNEL_14); break; + case 3: paint_util_push_tunnel_right(height - 8, TUNNEL_6); break; + } + + if (track_paint_util_should_paint_supports(position)) { + metal_a_supports_paint_setup(3, 4, 6, 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 + 40, 0x20); +} + +/** rct2: 0x008AE1EC */ +static void paint_minature_railway_track_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + paint_minature_railway_track_25_deg_up(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); +} + +/** rct2: 0x008AE1FC */ +static void paint_minature_railway_track_flat_to_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + paint_minature_railway_track_25_deg_up_to_flat(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); +} + +/** rct2: 0x008AE20C */ +static void paint_minature_railway_track_25_deg_down_to_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + paint_minature_railway_track_flat_to_25_deg_up(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); +} + +/** rct2: 0x008AE22C */ +static void paint_minature_railway_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, gTrackColours[SCHEME_TRACK], minature_railway_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, gTrackColours[SCHEME_SUPPORTS]); + 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: 0x008AE21C */ +static void paint_minature_railway_track_left_quarter_turn_5_tiles(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + trackSequence = mapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[trackSequence]; + paint_minature_railway_track_right_quarter_turn_5_tiles(rideIndex, trackSequence, (direction + 1) % 4, height, mapElement); +} + +/** rct2: 0x */ +static void paint_minature_railway_track_s_bend_left(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + if (direction == 2 || direction == 3) { + trackSequence = 3 - trackSequence; + } + + const rct_xy16 offsetList[] = { + {0, 6}, + {0, 0}, + {0, 6}, + {0, 6}, + }; + + const rct_xy16 boundsList[] = { + {32, 20}, + {32, 26}, + {32, 26}, + {32, 20}, + }; + + uint32 imageId = minature_railway_track_pieces_s_bend_left[direction & 1][trackSequence] | gTrackColours[SCHEME_TRACK]; + rct_xy16 offset = offsetList[trackSequence]; + rct_xy16 bounds = boundsList[trackSequence]; + if (direction == 0 || direction == 2) { + sub_98196C(imageId, (sint8) offset.x, (sint8) offset.y, bounds.x, bounds.y, 3, height, get_current_rotation()); + } else { + sub_98196C(imageId, (sint8) offset.y, (sint8) offset.x, bounds.y, bounds.x, 3, height, get_current_rotation()); + } + + if (direction == 0 || direction == 2) { + if (trackSequence == 0) { + paint_util_push_tunnel_left(height, TUNNEL_6); + } + + switch (trackSequence) { + case 0: metal_a_supports_paint_setup(3, 4, 0, height, gTrackColours[SCHEME_SUPPORTS]); break; + case 1: metal_a_supports_paint_setup(3, 5, 0, height, gTrackColours[SCHEME_SUPPORTS]); break; + case 3: metal_a_supports_paint_setup(3, 4, 0, height, gTrackColours[SCHEME_SUPPORTS]); break; + } + } else { + if (trackSequence == 3) { + paint_util_push_tunnel_right(height, TUNNEL_6); + } + + switch (trackSequence) { + case 0: metal_a_supports_paint_setup(3, 4, 0, height, gTrackColours[SCHEME_SUPPORTS]); break; + case 1: metal_a_supports_paint_setup(3, 6, 0, height, gTrackColours[SCHEME_SUPPORTS]); break; + case 3: metal_a_supports_paint_setup(3, 4, 0, height, gTrackColours[SCHEME_SUPPORTS]); break; + } + } + + int blockedSegments = 0; + switch (trackSequence) { + case 0: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B4; break; + case 1: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_B4; break; + case 2: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_C0 | SEGMENT_D4 | SEGMENT_BC; break; + case 3: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_C0; break; + } + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction & 1), 0xFFFF, 0); + + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AE24C */ +static void paint_minature_railway_track_s_bend_right(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + if (direction == 2 || direction == 3) { + trackSequence = 3 - trackSequence; + } + + const rct_xy16 offsetList[] = { + {0, 6}, + {0, 6}, + {0, 0}, + {0, 6}, + }; + + const rct_xy16 boundsList[] = { + {32, 20}, + {32, 26}, + {32, 26}, + {32, 20}, + }; + + uint32 imageId = minature_railway_track_pieces_s_bend_right[direction&1][trackSequence] | gTrackColours[SCHEME_TRACK]; + rct_xy16 offset = offsetList[trackSequence]; + rct_xy16 bounds = boundsList[trackSequence]; + if (direction == 0 || direction == 2) { + sub_98196C(imageId, (sint8) offset.x, (sint8) offset.y, bounds.x, bounds.y, 3, height, get_current_rotation()); + } else { + sub_98196C(imageId, (sint8) offset.y, (sint8) offset.x, bounds.y, bounds.x, 3, height, get_current_rotation()); + } + + if (direction == 0 || direction == 2) { + if (trackSequence == 0) { + paint_util_push_tunnel_left(height, TUNNEL_6); + } + + switch (trackSequence) { + case 0: metal_a_supports_paint_setup(3, 4, 0, height, gTrackColours[SCHEME_SUPPORTS]); break; + case 1: metal_a_supports_paint_setup(3, 8, 0, height, gTrackColours[SCHEME_SUPPORTS]); break; + case 3: metal_a_supports_paint_setup(3, 4, 0, height, gTrackColours[SCHEME_SUPPORTS]); break; + } + } else { + if (trackSequence == 3) { + paint_util_push_tunnel_right(height, TUNNEL_6); + } + + switch (trackSequence) { + case 0: metal_a_supports_paint_setup(3, 4, 0, height, gTrackColours[SCHEME_SUPPORTS]); break; + case 1: metal_a_supports_paint_setup(3, 7, 0, height, gTrackColours[SCHEME_SUPPORTS]); break; + case 3: metal_a_supports_paint_setup(3, 4, 0, height, gTrackColours[SCHEME_SUPPORTS]); break; + } + } + + int blockedSegments = 0; + switch (trackSequence) { + case 0: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC; break; + case 1: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_C0 | SEGMENT_D4 | SEGMENT_BC; break; + case 2: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_B4; break; + case 3: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8; break; + } + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction & 1), 0xFFFF, 0); + + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AE29C */ +static void paint_minature_railway_track_right_quarter_turn_3_tiles(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + track_paint_util_right_quarter_turn_3_tiles_paint(3, height, direction, trackSequence, gTrackColours[SCHEME_TRACK], minature_railway_track_pieces_flat_quarter_turn_3_tiles, defaultRightQuarterTurn3TilesOffsets, defaultRightQuarterTurn3TilesBoundLengths, NULL, get_current_rotation()); + track_paint_util_right_quarter_turn_3_tiles_tunnel(height, direction, trackSequence, TUNNEL_6); + + switch (trackSequence) { + case 0: + case 3: + metal_a_supports_paint_setup(3, 4, 0, height, gTrackColours[SCHEME_SUPPORTS]); + break; + } + + int blockedSegments = 0; + switch (trackSequence) { + case 0: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_BC; break; + case 2: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_D4 | SEGMENT_C0; break; + case 3: blockedSegments = SEGMENT_D4 | SEGMENT_C4 | SEGMENT_C8 | SEGMENT_B8; break; + } + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AE28C */ +static void paint_minature_railway_track_left_quarter_turn_3_tiles(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{trackSequence = mapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence]; + paint_minature_railway_track_right_quarter_turn_3_tiles(rideIndex, trackSequence, (direction + 1) % 4, height, mapElement); +} + +static const sint8 paint_minature_railway_eighth_to_diag_index[] = {0, 1, 2, -1, 3}; + +/** rct2: 0x008AE31C */ +static void paint_minature_railway_track_left_eighth_to_diag(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + uint32 imageId; + sint8 index = paint_minature_railway_eighth_to_diag_index[trackSequence]; + if (index >= 0) { + imageId = ghost_train_track_pieces_left_eight_to_diag[direction][index] | gTrackColours[SCHEME_TRACK]; + const rct_xy16 offset = ghost_train_track_pieces_left_eight_to_diag_offset[direction][index]; + const rct_xy16 bounds = ghost_train_track_pieces_left_eight_to_diag_bounds[direction][index]; + sub_98197C(imageId, 0, 0, bounds.x, bounds.y, 2, height, offset.x, offset.y, height, get_current_rotation()); + } + + switch (trackSequence) { + case 0: + metal_a_supports_paint_setup(3, 4, 0, height, gTrackColours[SCHEME_SUPPORTS]); + break; + case 4: + if (direction == 0) metal_a_supports_paint_setup(3, 3, 0, height, gTrackColours[SCHEME_SUPPORTS]); + if (direction == 1) metal_a_supports_paint_setup(3, 1, 0, height, gTrackColours[SCHEME_SUPPORTS]); + if (direction == 2) metal_a_supports_paint_setup(3, 0, 0, height, gTrackColours[SCHEME_SUPPORTS]); + if (direction == 3) metal_a_supports_paint_setup(3, 2, 0, height, gTrackColours[SCHEME_SUPPORTS]); + break; + } + + if (direction == 0 && trackSequence == 0) { + paint_util_push_tunnel_left(height, TUNNEL_0); + } + if (direction == 3 && trackSequence == 0) { + paint_util_push_tunnel_right(height, TUNNEL_0); + } + + int blockedSegments; + switch (trackSequence) { + case 0: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC; break; + case 1: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_B4; break; + case 2: blockedSegments = SEGMENT_C4 | SEGMENT_CC | SEGMENT_C0 | SEGMENT_D4 | SEGMENT_BC; break; + case 3: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_B8 | SEGMENT_C8; break; + case 4: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_C8 | SEGMENT_C0 | SEGMENT_D4; break; + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AE32C */ +static void paint_minature_railway_track_right_eighth_to_diag(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + uint32 imageId; + sint8 index = paint_minature_railway_eighth_to_diag_index[trackSequence]; + if (index >= 0) { + imageId = ghost_train_track_pieces_right_eight_to_diag[direction][index] | gTrackColours[SCHEME_TRACK]; + const rct_xy16 offset = ghost_train_track_pieces_right_eight_to_diag_offset[direction][index]; + const rct_xy16 bounds = ghost_train_track_pieces_right_eight_to_diag_bounds[direction][index]; + sub_98197C(imageId, 0, 0, bounds.x, bounds.y, 2, height, offset.x, offset.y, height, get_current_rotation()); + } + + switch (trackSequence) { + case 0: + metal_a_supports_paint_setup(3, 4, 0, height, gTrackColours[SCHEME_SUPPORTS]); + break; + case 4: + if (direction == 0) metal_a_supports_paint_setup(3, 1, 0, height, gTrackColours[SCHEME_SUPPORTS]); + if (direction == 1) metal_a_supports_paint_setup(3, 0, 0, height, gTrackColours[SCHEME_SUPPORTS]); + if (direction == 2) metal_a_supports_paint_setup(3, 2, 0, height, gTrackColours[SCHEME_SUPPORTS]); + if (direction == 3) metal_a_supports_paint_setup(3, 3, 0, height, gTrackColours[SCHEME_SUPPORTS]); + break; + } + + if (direction == 0 && trackSequence == 0) { + paint_util_push_tunnel_left(height, TUNNEL_0); + } + if (direction == 3 && trackSequence == 0) { + paint_util_push_tunnel_right(height, TUNNEL_0); + } + + int blockedSegments; + switch (trackSequence) { + case 0: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC; break; + case 1: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_C0 | SEGMENT_D4 | SEGMENT_BC; break; + case 2: blockedSegments = SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_B4; break; + case 3: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_C0 | SEGMENT_D4; break; + case 4: blockedSegments = SEGMENT_D0 | SEGMENT_C4 | SEGMENT_CC | SEGMENT_B8 | SEGMENT_C8 | SEGMENT_D4; break; + } + + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AE33C */ +static void paint_minature_railway_track_left_eighth_to_orthogonal(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + const uint8 map[] = {4, 2, 3, 1, 0}; + trackSequence = map[trackSequence]; + paint_minature_railway_track_right_eighth_to_diag(rideIndex, trackSequence, (direction + 2) % 4, height, mapElement); +} + +/** rct2: 0x008AE34C */ +static void paint_minature_railway_track_right_eighth_to_orthogonal(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + const uint8 map[] = {4, 2, 3, 1, 0}; + trackSequence = map[trackSequence]; + paint_minature_railway_track_left_eighth_to_diag(rideIndex, trackSequence, (direction + 3) % 4, height, mapElement); +} + +static void paint_minature_railway_util_diag_supports(uint8 direction, int height) +{ + switch (direction) { + case 0: + metal_a_supports_paint_setup(3, 1, 0, height, gTrackColours[SCHEME_SUPPORTS]); + break; + case 1: + metal_a_supports_paint_setup(3, 0, 0, height, gTrackColours[SCHEME_SUPPORTS]); + break; + case 2: + metal_a_supports_paint_setup(3, 2, 0, height, gTrackColours[SCHEME_SUPPORTS]); + break; + case 3: + metal_a_supports_paint_setup(3, 3, 0, height, gTrackColours[SCHEME_SUPPORTS]); + break; + } +} + +static const bool minature_railway_diag_image_segment[][4] = { + {false, true, false, false}, + {false, false, false, true}, + {false, false, true, false}, + {true, false, false, false}, +}; + +static const uint8 minature_railway_diag_support_segment[] = {1, 0, 2, 3}; + +static const int minature_railway_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 +}; + +/** rct2: 0x008AE2AC */ +static void paint_minature_railway_track_diag_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + if (minature_railway_diag_image_segment[direction][trackSequence]) { + uint32 imageId = minature_railway_track_pieces_diag_flat[direction] | gTrackColours[SCHEME_TRACK]; + sub_98197C(imageId, -16, -16, 32, 32, 2, height, -16, -16, height, get_current_rotation()); + } + + if (trackSequence == 3) { + metal_a_supports_paint_setup(3, minature_railway_diag_support_segment[direction], 0, height, gTrackColours[SCHEME_SUPPORTS]); + } + + int blockedSegments = minature_railway_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 32, 0x20); +} + +/** rct2: 0x008AE2DC */ +static void paint_minature_railway_track_diag_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + if (minature_railway_diag_image_segment[direction][trackSequence]) { + uint32 imageId = minature_railway_track_pieces_diag_25_deg_up[direction] | gTrackColours[SCHEME_TRACK]; + sub_98197C(imageId, -16, -16, 32, 32, 2, height, -16, -16, height, get_current_rotation()); + } + + if (trackSequence == 3) { + metal_b_supports_paint_setup(3, minature_railway_diag_support_segment[direction], 8, height, gTrackColours[SCHEME_SUPPORTS]); + } + + int blockedSegments = minature_railway_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 56, 0x20); +} + +/** rct2: 0x008AE2BC */ +static void paint_minature_railway_track_diag_flat_to_25_deg_up(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + if (minature_railway_diag_image_segment[direction][trackSequence]) { + uint32 imageId = minature_railway_track_pieces_diag_flat_to_25_deg_up[direction] | gTrackColours[SCHEME_TRACK]; + sub_98197C(imageId, -16, -16, 32, 32, 2, height, -16, -16, height, get_current_rotation()); + } + + if (trackSequence == 3) { + metal_b_supports_paint_setup(3, minature_railway_diag_support_segment[direction], 0, height, gTrackColours[SCHEME_SUPPORTS]); + } + + int blockedSegments = minature_railway_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: 0x008AE2CC */ +static void paint_minature_railway_track_diag_25_deg_up_to_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + if (minature_railway_diag_image_segment[direction][trackSequence]) { + uint32 imageId = minature_railway_track_pieces_diag_25_deg_up_to_flat[direction] | gTrackColours[SCHEME_TRACK]; + sub_98197C(imageId, -16, -16, 32, 32, 2, height, -16, -16, height, get_current_rotation()); + } + + if (trackSequence == 3) { + metal_b_supports_paint_setup(3, minature_railway_diag_support_segment[direction], 4, height, gTrackColours[SCHEME_SUPPORTS]); + } + + int blockedSegments = minature_railway_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 56, 0x20); +} + +/** rct2: 0x008AE30C */ +static void paint_minature_railway_track_diag_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + if (minature_railway_diag_image_segment[direction][trackSequence]) { + uint32 imageId = minature_railway_track_pieces_diag_25_deg_up[(direction + 2) % 4] | gTrackColours[SCHEME_TRACK]; + sub_98197C(imageId, -16, -16, 32, 32, 2, height, -16, -16, height, get_current_rotation()); + } + + if (trackSequence == 3) { + metal_b_supports_paint_setup(3, minature_railway_diag_support_segment[direction], 8, height, gTrackColours[SCHEME_SUPPORTS]); + } + + int blockedSegments = minature_railway_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 56, 0x20); +} + +/** rct2: 0x008AE2EC */ +static void paint_minature_railway_track_diag_flat_to_25_deg_down(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + if (minature_railway_diag_image_segment[direction][trackSequence]) { + uint32 imageId = minature_railway_track_pieces_diag_25_deg_up_to_flat[(direction + 2) % 4] | gTrackColours[SCHEME_TRACK]; + sub_98197C(imageId, -16, -16, 32, 32, 2, height, -16, -16, height, get_current_rotation()); + } + + if (trackSequence == 3) { + metal_b_supports_paint_setup(3, minature_railway_diag_support_segment[direction], 4, height, gTrackColours[SCHEME_SUPPORTS]); + } + + int blockedSegments = minature_railway_diag_blocked_segments[trackSequence]; + paint_util_set_segment_support_height(paint_util_rotate_segments(blockedSegments, direction), 0xFFFF, 0); + paint_util_set_general_support_height(height + 56, 0x20); +} + +/** rct2: 0x008AE2FC */ +static void paint_minature_railway_track_diag_25_deg_down_to_flat(uint8 rideIndex, uint8 trackSequence, uint8 direction, int height, rct_map_element * mapElement) +{ + if (minature_railway_diag_image_segment[direction][trackSequence]) { + uint32 imageId = minature_railway_track_pieces_diag_flat_to_25_deg_up[(direction + 2) % 4] | gTrackColours[SCHEME_TRACK]; + sub_98197C(imageId, -16, -16, 32, 32, 2, height, -16, -16, height, get_current_rotation()); + } + + if (trackSequence == 3) { + metal_b_supports_paint_setup(3, minature_railway_diag_support_segment[direction], 0, height, gTrackColours[SCHEME_SUPPORTS]); + } + + int blockedSegments = minature_railway_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: 0x008ACE48 + */ +TRACK_PAINT_FUNCTION get_track_paint_function_minature_railway(int trackType, int direction) +{ + switch (trackType) { + case TRACK_ELEM_FLAT: + return paint_minature_railway_track_flat; + + case TRACK_ELEM_END_STATION: + case TRACK_ELEM_BEGIN_STATION: + case TRACK_ELEM_MIDDLE_STATION: + return paint_minature_railway_station; + + case TRACK_ELEM_25_DEG_UP: + return paint_minature_railway_track_25_deg_up; + case TRACK_ELEM_FLAT_TO_25_DEG_UP: + return paint_minature_railway_track_flat_to_25_deg_up; + case TRACK_ELEM_25_DEG_UP_TO_FLAT: + return paint_minature_railway_track_25_deg_up_to_flat; + + case TRACK_ELEM_25_DEG_DOWN: + return paint_minature_railway_track_25_deg_down; + case TRACK_ELEM_FLAT_TO_25_DEG_DOWN: + return paint_minature_railway_track_flat_to_25_deg_down; + case TRACK_ELEM_25_DEG_DOWN_TO_FLAT: + return paint_minature_railway_track_25_deg_down_to_flat; + + case TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES: + return paint_minature_railway_track_left_quarter_turn_5_tiles; + case TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES: + return paint_minature_railway_track_right_quarter_turn_5_tiles; + + case TRACK_ELEM_S_BEND_LEFT: + return paint_minature_railway_track_s_bend_left; + case TRACK_ELEM_S_BEND_RIGHT: + return paint_minature_railway_track_s_bend_right; + + case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES: + return paint_minature_railway_track_left_quarter_turn_3_tiles; + case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES: + return paint_minature_railway_track_right_quarter_turn_3_tiles; + + case TRACK_ELEM_LEFT_EIGHTH_TO_DIAG: + return paint_minature_railway_track_left_eighth_to_diag; + case TRACK_ELEM_RIGHT_EIGHTH_TO_DIAG: + return paint_minature_railway_track_right_eighth_to_diag; + case TRACK_ELEM_LEFT_EIGHTH_TO_ORTHOGONAL: + return paint_minature_railway_track_left_eighth_to_orthogonal; + case TRACK_ELEM_RIGHT_EIGHTH_TO_ORTHOGONAL: + return paint_minature_railway_track_right_eighth_to_orthogonal; + + case TRACK_ELEM_DIAG_FLAT: + return paint_minature_railway_track_diag_flat; + + case TRACK_ELEM_DIAG_25_DEG_UP: + return paint_minature_railway_track_diag_25_deg_up; + case TRACK_ELEM_DIAG_FLAT_TO_25_DEG_UP: + return paint_minature_railway_track_diag_flat_to_25_deg_up; + case TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT: + return paint_minature_railway_track_diag_25_deg_up_to_flat; + + case TRACK_ELEM_DIAG_25_DEG_DOWN: + return paint_minature_railway_track_diag_25_deg_down; + case TRACK_ELEM_DIAG_FLAT_TO_25_DEG_DOWN: + return paint_minature_railway_track_diag_flat_to_25_deg_down; + case TRACK_ELEM_DIAG_25_DEG_DOWN_TO_FLAT: + return paint_minature_railway_track_diag_25_deg_down_to_flat; + } + + return NULL; +}