1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-30 10:15:36 +01:00

Implement diagonals

This commit is contained in:
Ted John
2016-09-24 15:01:28 +01:00
parent 5d4e262a40
commit 42c56dbcc5

View File

@@ -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