From 235cc69b884c62193aac1ad66ccb5aba077ae9b0 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Thu, 18 Feb 2016 11:49:58 +0100 Subject: [PATCH 01/13] Decompile function --- src/windows/ride_construction.c | 1340 ++++++++++++++++++++++++++++++- 1 file changed, 1338 insertions(+), 2 deletions(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 45c54a2e04..4b4fa26f03 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -34,6 +34,7 @@ #include "../ride/ride_data.h" #include "../ride/track.h" #include "dropdown.h" +#include "../ride/track_data.h" /* move to ride.c */ void sub_6B2FA9(rct_windownumber number) @@ -2380,6 +2381,1292 @@ void sub_6C84CE() window_ride_construction_update_widgets(w); } +static bool sub_6CA2DF_get_dh(uint8 *dh) { + window_ride_construction_update_enabled_track_pieces(); + + uint32 edi = 0; + uint8 bl = _previousTrackSlopeEnd; + uint8 bh = _currentTrackSlopeEnd; + uint8 cl = _previousTrackBankEnd; + uint8 ch = _currentTrackBankEnd; + + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { + bl = _currentTrackSlopeEnd; + bh = _previousTrackSlopeEnd; + cl = _currentTrackBankEnd; + ch = _previousTrackBankEnd; + } + + uint16 ax = _currentTrackCurve; + if (ax == 0xFFFF) { + return true; + } + + printf("[ax=%d, bl=%d, bh=%d, cl=%d, ch=%d, rotation=%d, state=%d]\n", ax, bl, bh, cl, ch, RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8), _rideConstructionState); + + if (ax == 0) { + if (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) < 4) { + if (bl == bh) { + if (bl == 0) { + if (cl == ch) { + *dh = 0; + if (cl == 0) { + return true; + } + + *dh = 0x20; + if (cl == 2) { + return true; + } + + *dh = 0x21; + return true; + } + + if (cl == 0) { + *dh = 0x12; + if (ch == 2) { + return true; + } + + *dh = 0x13; + return true; + } + + if (ch == 0) { + return false; + } + + *dh = 0x14; + if (cl == 2) { + return true; + } + + *dh = 0x15; + return true; + } + + if (bl == 2) { + if (cl == ch) { + *dh = 0x6E; + if (cl == 2) { + return true; + } + + *dh = 0x6F; + if (cl == 4) { + return true; + } + + *dh = 4; + return true; + } + + if (cl == 0) { + *dh = 0xE1; + if (ch == 2) { + return true; + } + + *dh = 0xE2; + return true; + } + + if (ch == 0) { + return false; + } + + *dh = 0xE3; + if (cl == 2) { + return true; + } + + *dh = 0xE4; + return true; + } + + *dh = 5; + if (bl == 4) { + return true; + } + + if (bl == 6) { + if (cl == ch) { + *dh = 0x73; + if (cl == 2) { + return true; + } + + *dh = 0x74; + if (cl == 2) { + return true; + } + + *dh = 0x0A; + return true; + } + + if (cl == 0) { + *dh = 0xE5; + if (ch == 2) { + return true; + } + + *dh = 0xE6; + return true; + } + + if (ch == 0) { + return false; + } + + *dh = 0xE7; + if (cl == 2) { + return true; + } + + *dh = 0xE8; + return true; + } + + *dh = 0xB; + if (bl == 8) { + return true; + } + + *dh = 0x7E; + if (bl == 10) { + return true; + } + + *dh = 0x7F; + if (bl == 18) { + return true; + } + + return false; + } + + // end bl = bh + + if (bl == 18) { + *dh = 0x81; + if (bh == 8) { + return true; + } + } + + if (bl == 10) { + *dh = 0x82; + if (bh == 4) { + return true; + } + } + + *dh = 0xE; + if (bl == 8) { + if (bh == 6) { + return true; + } + + *dh = 0x41; + if (bh == 0) { + return true; + } + + *dh = 0x83; + if (bh == 18) { + return true; + } + + return false; + } + + if (bl == 6) { + *dh = 0x0D; + if (bh == 8) { + return true; + } + + if (bh != 0) { + return false; + } + + if (cl == 0) { + *dh = 0x0F; + if (ch == 0) { + return true; + } + + *dh = 0x1E; + if (ch == 2) { + return true; + } + + *dh = 0x1F; + return true; + } + + if (cl == ch) { + *dh = 0xEF; + if (cl == 2) { + return true; + } + + *dh = 0xF0; + return true; + } + + *dh = 0xF7; + if (cl == 2) { + return true; + } + + *dh = 0xF8; + return true; + } + + if (bl == 0) { + if (bh == 6) { + if (ch == 0) { + *dh = 0xC; + if (cl == 0) { + return true; + } + + *dh = 0x1C; + if (cl == 2) { + return true; + } + + *dh = 0x1D; + return true; + } + + if (cl == ch) { + *dh = 0xED; + if (ch == 2) { + return true; + } + + *dh = 0xEE; + return true; + } + + *dh = 0xF5; + if (ch == 2) { + return true; + } + + *dh = 0xF6; + return true; + } + + *dh = 0x3E; + if (bh == 4) { + return true; + } + + *dh = 0x40; + if (bh == 8) { + return true; + } + + if (bh != 2) { + return false; + } + + if (ch == 0) { + *dh = 6; + if (cl == 0) { + return true; + } + + *dh = 0x18; + if (cl == 2) { + return true; + } + + *dh = 0x19; + return true; + } + + if (cl == ch) { + *dh = 0xE9; + if (ch == 2) { + return true; + } + + *dh = 0xEA; + return true; + } + + *dh = 0xF1; + if (ch == 2) { + return true; + } + + *dh = 0xF2; + return true; + } + + *dh = 8; + if (bl == 4) { + if (bh == 2) { + return true; + } + + *dh = 0x3F; + if (bh == 0) { + return true; + } + + *dh = 0x80; + if (bh == 10) { + return true; + } + + return false; + } + + *dh = 7; + if (bh == 4) { + if (bl == 2) { + return true; + } + + return false; + } + + if (bh != 0) { + return false; + } + + if (cl == 0) { + *dh = 9; + if (ch == 0) { + return true; + } + + *dh = 0x1A; + if (ch == 2) { + return true; + } + + *dh = 0x18; + return true; + } + + if (cl == ch) { + *dh = 0xEB; + if (cl == 2) { + return true; + } + + *dh = 0xEC; + return true; + } + + *dh = 0xF3; + if (cl == 2) { + return true; + } + + *dh = 0xF4; + return true; + } + + // TRACK_PREVIEW_ROTATION >= 4 + if (bl == bh) { + if (bl == 0) { + if (cl == ch) { + *dh = 0x8D; + if (cl == 0) { + return true; + } + + *dh = 0xAA; + if (cl == 2) { + return true; + } + + *dh = 0xAB; + return true; + } + + if (cl == 0) { + *dh = 0x9E; + if (ch == 2) { + return true; + } + + *dh = 0x9F; + return true; + } + + if (ch != 0) { + return false; + } + + *dh = 0xA0; + if (cl == 2) { + return true; + } + + *dh = 0xA1; + return true; + } + + *dh = 0x8E; + if (bl == 2) { + return true; + } + + *dh = 0x8F; + if (bl == 4) { + return true; + } + + *dh = 0x94; + if (bl == 6) { + return true; + } + + *dh = 0x95; + if (bl == 8) { + return true; + } + + *dh = 0x7E; + if (bl == 10) { + return false; + } + + *dh = 0x7F; + if (bl == 18) { + return false; + } + + return false; + } + + if (bl == 18) { + *dh = 0x81; + if (bh == 8) { + return false; + } + } + + if (bl == 10) { + *dh = 0x82; + if (bh == 4) { + return false; + } + } + + *dh = 0x98; + if (bl == 8) { + if (bh == 6) { + return true; + } + + *dh = 0x9D; + if (bh == 0) { + return true; + } + + *dh = 0x83; + if (bh == 18) { + return false; + } + + return false; + } + + if (bl == 6) { + *dh = 0x97; + if (bh == 8) { + return true; + } + + if (bh == 0) { + return false; + } + + *dh = 0x99; + if (ch == 0) { + return true; + } + + *dh = 0xA8; + if (ch == 2) { + return true; + } + + *dh = 0xA9; + return true; + } + + if (bl == 0) { + if (bh == 6) { + *dh = 0x96; + if (cl == 0) { + return true; + } + + *dh = 0xA6; + if (cl == 2) { + return true; + } + + *dh = 0xA7; + return true; + } + + *dh = 0x9A; + if (bh == 4) { + return true; + } + + *dh = 0x9C; + if (bh == 8) { + return true; + } + + if (bh == 2) { + return false; + } + + *dh = 0x90; + if (cl == 0) { + return true; + } + + *dh = 0xA2; + if (cl == 2) { + return true; + } + + *dh = 0xA3; + return true; + } + + *dh = 0x92; + if (bl == 4) { + if (bh == 2) { + return true; + } + + *dh = 0x98; + if (bh == 0) { + return true; + } + + *dh = 0x80; + if (bh == 10) { + return false; + } + + return false; + } + + *dh = 0x91; + if (bh == 4) { + if (bl == 2) { + return true; + } + + return false; + } + + *dh = 0x93; + if (bh != 0) { + return false; + } + + if (ch == 0) { + return true; + } + + *dh = 0xA4; + if (ch == 2) { + return true; + } + + *dh = 0xA5; + return true; + } + + if (ax == 1) { + if (bl != bh) { + return false; + } + + if (bl == 4) { + return false; + } + + if (bl == 8) { + return false; + } + + if (bh == 6) { + *dh = 0x24; + if (cl == 0) { + return true; + } + + *dh = 0xDF; + return true; + } + + if (bh == 2) { + *dh = 0x22; + if (cl == 0) { + return true; + } + + *dh = 0xDD; + return true; + } + + *dh = 0x10; + if (ch == 0) { + return true; + } + + *dh = 0x16; + return true; + } + + if (ax == 2) { + if (bl != bh) { + return false; + } + + if (bl == 4) { + return false; + } + + if (bl == 8) { + return false; + } + + if (bh == 6) { + *dh = 0x25; + if (cl == 0) { + return true; + } + + *dh = 0xE0; + return true; + } + + if (bh == 2) { + *dh = 0x23; + if (cl == 0) { + return true; + } + + *dh = 0xDE; + return true; + } + + *dh = 0x11; + if (ch == 0) { + return true; + } + + *dh = 0x17; + return true; + } + + if (ax == 3) { + if (bl != bh) { + if (bl == 0 && bh == 2 && cl == 2) { + *dh = 0xB2; + if (ch == 0) { + return true; + } + } + + if (bl != 6) { + return false; + } + + if (bh != 0) { + return false; + } + + if (cl != 0) { + return false; + } + + *dh = 0xB4; + if (ch == 2) { + return true; + } + + return false; + } + + *dh = 0x61; + if (bh == 8) { + return true; + } + + *dh = 0x5F; + if (bh == 4) { + return true; + } + + *dh = 0xFB; + if (bh == 0x12) { + return true; + } + + *dh = 0xF9; + if (bh == 0xA) { + return true; + } + + if (bh == 6) { + *dh = 0x30; + if (cl == 0) { + return true; + } + + *dh = 0xDB; + return true; + } + + if (bh == 2) { + *dh = 0x2E; + if (cl == 0) { + return true; + } + + *dh = 0xD9; + return true; + } + + *dh = 0x2A; + if (ch == 0) { + return true; + } + + *dh = 0x2C; + return true; + } + + if (ax == 4) { + if (bl != bh) { + if (bl == 0 && bh == 2 && cl == 4) { + *dh = 0xB3; + if (ch == 0) { + return true; + } + } + + if (bl != 6) { + return false; + } + + if (bh != 0) { + return false; + } + + if (cl != 0) { + return false; + } + + *dh = 0xB5; + if (ch == 4) { + return true; + } + + return false; + } + + *dh = 0x62; + if (bh == 8) { + return true; + } + + *dh = 0x68; + if (bh == 4) { + return true; + } + + *dh = 0x0F; + if (bh == 0x12) { + return true; + } + + if (bh == 6) { + *dh = 0x31; + if (cl == 0) { + return true; + } + + *dh = 0xDC; + return true; + } + + if (bh == 2) { + *dh = 0x2F; + if (cl == 0) { + return true; + } + + *dh = 0xDA; + return true; + } + + *dh = 0x2B; + if (ch == 0) { + return true; + } + + *dh = 0x2D; + return true; + + } + + if (ax == 5) { + if (bl != bh) { + return false; + } + + if (bl == 2) { + return false; + } + + if (bl == 6) { + return false; + } + + *dh = 0x61; + if (bh == 8) { + return true; + } + + *dh = 0x5F; + if (bh == 4) { + return true; + } + + *dh = 0xFB; + if (bh == 0x12) { + return true; + } + + *dh = 0xF9; + if (bh == 0xA) { + return true; + } + + *dh = 0x32; + if (ch == 0) { + return true; + } + + return false; + } + + if (ax == 6) { + if (bl != bh) { + return false; + } + + if (bl == 2) { + return false; + } + + if (bl == 6) { + return false; + } + + *dh = 0x62; + if (bh == 8) { + return true; + } + + *dh = 0x60; + if (bh == 4) { + return true; + } + + *dh = 0xFC; + if (bh == 0x12) { + return true; + } + + *dh = 0xFA; + if (bh == 0xA) { + return true; + } + + *dh = 0x33; + if (ch == 0) { + return true; + } + + return false; + } + + if (ax == 7) { + *dh = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8); + if (_rideConstructionState == 2) { + *dh = *dh ^ 0x04; + } + + if (*dh & 0x04) { + if (bl != bh) { + return false; + } + + if (bl == 4) { + return false; + } + + if (bl == 8) { + return false; + } + + *dh = 0x24; + if (bh == 6) { + return false; + } + + *dh = 0x22; + if (bh == 2) { + return false; + } + + *dh = 0x87; + if (ch == 0) { + return true; + } + + *dh = 0x8B; + return true; + } + + if (bl != bh) { + return false; + } + + if (bl == 4) { + return false; + } + + if (bl == 8) { + return false; + } + + *dh = 0x24; + if (bh == 6) { + return false; + } + + *dh = 0x22; + if (bh == 2) { + return false; + } + + *dh = 0x85; + if (ch == 0) { + return true; + } + + *dh = 0x89; + return true; + } + + if (ax == 8) { + *dh = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8); + if (_rideConstructionState == 2) { + *dh = *dh ^ 0x04; + } + + if (*dh & 0x04) { + if (bl != bh) { + return false; + } + + if (bl == 4) { + return false; + } + + if (bl == 8) { + return false; + } + + *dh = 0x25; + if (bh == 6) { + return false; + } + + *dh = 0x23; + if (bh == 2) { + return false; + } + + *dh = 0x86; + if (ch == 0) { + return true; + } + + *dh = 0x8A; + return true; + } + + if (bl != bh) { + return false; + } + + if (bl == 4) { + return false; + } + + if (bl == 8) { + return false; + } + + *dh = 0x25; + if (bh == 6) { + return false; + } + + *dh = 0x23; + if (bh == 2) { + return false; + } + + *dh = 0x88; + if (ch == 0) { + return true; + } + + *dh = 0x8C; + return true; + } + + *dh = ax & 0xFF; + switch (*dh) { + case TRACK_ELEM_END_STATION: + case TRACK_ELEM_S_BEND_LEFT: + case TRACK_ELEM_S_BEND_RIGHT: + if (bl != 0 || bh != 0) { + return false; + } + + if (cl != 0 || ch != 0) { + return false; + } + + return true; + + case TRACK_ELEM_LEFT_VERTICAL_LOOP: + case TRACK_ELEM_RIGHT_VERTICAL_LOOP: + if (cl != 0 || ch != 0) { + return false; + } + + if (_rideConstructionState == 2) { + if (bh != 6) { + return false; + } + } else { + if (bl != 2) { + return false; + } + } + + return true; + + default: + return true; + } +} + +/** + * rct2: 0x006CA2DF + * + * @param[out] _trackType (dh) + * @param[out] _trackDirection (bh) + * @param[out] _rideIndex (dl) + * @param[out] _edxRS16 (edxrs16) + * @param[out] _x (ax) + * @param[out] _y (cx) + * @param[out] _z (di) + * @param[out] _properties (edirs16) + * @return (CF) + */ +static bool new_sub_6CA2DF(uint8 *_trackType, uint8 *_trackDirection, uint8 *_rideIndex, uint16 *_edxRS16, uint16 *_x, uint16 *_y, uint16 *_z, uint16 *_properties) { + uint8 trackType, trackDirection, rideIndex; + uint16 z, x, y, edxRS16; + uint32 properties; + + if (!sub_6CA2DF_get_dh(&trackType)) { + return true; + } + + edxRS16 = 0; + rideIndex = _currentRideIndex; + if (_currentTrackLiftHill & 1) { + edxRS16 |= 0x1; + } + + if (_currentTrackCovered & (1 << 1)) { + edxRS16 |= 0x2; + } + + rct_ride *ride = get_ride(rideIndex); + + if (_enabledRidePiecesB & (1 << 8)) { + if (trackType == 0x3E) { + trackType = 0x76; + } + + if (trackType == 0x3F) { + trackType = 0x77; + } + + if (trackType == 0x48) { + trackType = 0x7A; + } + + if (trackType == 14) { + trackType = 0x79; + } + + if (trackType == 0x9A) { + return true; + } + + if (trackType == 0x98) { + return true; + } + + if (trackType == 0x9D) { + return true; + } + + if (trackType == 0x9C) { + return true; + } + } + + if (ride_type_has_flag(ride->type, 0x1000) && _currentTrackCovered != 1) { + if (ride->type == RIDE_TYPE_WATER_COASTER || trackType == 0 || trackType == 0x10 || trackType == 0x11) { + trackType = RCT2_GLOBAL(0x00993D1C + trackType, uint8); + edxRS16 &= 0xFFFE; // unsets 0x1 + } + } + + z = _currentTrackBeginZ; + rct_track_coordinates trackCoordinates; + if (ride_type_has_flag(ride->type, 0x80000)) { + trackCoordinates = FlatTrackCoordinates[trackType]; + } else { + trackCoordinates = TrackCoordinates[trackType]; + } + + x = _currentTrackBeginX; + y = _currentTrackBeginY; + if (_rideConstructionState == 2) { + z -= trackCoordinates.z_end; + trackDirection = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) ^ 0x02; + trackDirection -= trackCoordinates.rotation_end; + trackDirection += trackCoordinates.rotation_begin; + trackDirection &= 0x03; + + if (trackCoordinates.rotation_begin == 4) { + trackDirection |= 0x04; + } + + sint16 deltaX = trackCoordinates.x; + sint16 deltaY = trackCoordinates.y; + sint16 temp; + switch (trackDirection & 0x03) { + case 0: + deltaX = -deltaX; + deltaY = -deltaY; + break; + + case 1: + deltaY = -deltaY; + temp = deltaY; + deltaY = deltaX; + deltaX = temp; + break; + + case 3: + deltaX = -deltaX; + temp = deltaY; + deltaY = deltaX; + deltaX = temp; + break; + + default: + break; + } + + x += deltaX; + y += deltaY; + } else { + z -= trackCoordinates.z_begin; + trackDirection = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8); + } + + // loc_6CAEEA: + + bool do_loc_6CAF26 = false; + if (!(_enabledRidePiecesA & (1 << 5))) { + if (RCT2_ADDRESS(0x0099423C, uint16)[trackType] & 0x2000) { + do_loc_6CAF26 = true; + } + } + + if (!(RCT2_ADDRESS(0x0099423C, uint16)[trackType] & 0x1000)) { + do_loc_6CAF26 = true; + } + + if (do_loc_6CAF26) { + edxRS16 &= 0xFFFE; // unsets 0x1 + _currentTrackLiftHill &= 0xFE; + + if (trackType == 0xD1 || trackType == 0xD2) { + edxRS16 |= 0x1; + } + } + + // loc_6CAF49: + if (trackType == 0x63) { + uint32 ebp = RCT2_GLOBAL(0x00F440CD, uint8) << 16; + properties &= 0xFFFF; + properties |= ebp; + } else { + uint32 ebp = _currentSeatRotationAngle << 26; + properties &= 0xFFFFFFF; + properties |= ebp; + } + + + if (_trackType != NULL) *_trackType = trackType; + if (_trackDirection != NULL) *_trackDirection = trackDirection; + if (_rideIndex != NULL) *_rideIndex = rideIndex; + if (_edxRS16 != NULL) *_edxRS16 = edxRS16; + if (_x != NULL) *_x = x; + if (_y != NULL) *_y = y; + if (_z != NULL) *_z = z; + if (_properties != NULL) *_properties = (properties >> 16) & 0xFFFF; + + return false; +} + /** * * rct2: 0x006CA2DF @@ -2388,8 +3675,7 @@ void sub_6C84CE() * dh: trackType (out) * edx >> 16: ??? (out) */ -static bool sub_6CA2DF(int *trackType, int *trackDirection, int *rideIndex, int *edxRS16, int *x, int *y, int *z, int *properties) -{ +static bool original_sub_6CA2DF(uint8 *trackType, uint8 *trackDirection, uint8 *rideIndex, uint16 *edxRS16, uint16 *x, uint16 *y, uint16 *z, uint16 *properties) { int eax, ebx, ecx, edx, esi, edi, ebp; if (RCT2_CALLFUNC_X(0x006CA2DF, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp) & 0x100) return true; @@ -2405,6 +3691,56 @@ static bool sub_6CA2DF(int *trackType, int *trackDirection, int *rideIndex, int return false; } +/** + * + * rct2: 0x006CA2DF + * bh: trackRotation (out) + * dl: ??? (out) + * dh: trackType (out) + * edx >> 16: ??? (out) + */ +static bool sub_6CA2DF(int *trackType, int *trackDirection, int *rideIndex, int *edxRS16, int *x, int *y, int *z, int *properties) { + uint8 before_currentTrackLiftHill = _currentTrackLiftHill; + + uint8 new_trackType, new_trackDirection, new_rideIndex; + uint16 new_edxRS16, new_x, new_y, new_z, new_properties; + bool new_return = new_sub_6CA2DF(&new_trackType, &new_trackDirection, &new_rideIndex, &new_edxRS16, &new_x, &new_y, &new_z, &new_properties); + uint8 new_currentTrackLiftHill = _currentTrackLiftHill; + + _currentTrackLiftHill = before_currentTrackLiftHill; + + uint8 original_trackType, original_trackDirection, original_rideIndex; + uint16 original_edxRS16, original_x, original_y, original_z, original_properties; + bool original_return = original_sub_6CA2DF(&original_trackType, &original_trackDirection, &original_rideIndex, &original_edxRS16, &original_x, &original_y, &original_z, &original_properties); + uint8 original_currentTrackLiftHill = _currentTrackLiftHill; + + assert(new_return == original_return); + if (new_return) { + return true; + } + + assert(new_trackType == original_trackType); + assert(new_trackDirection == original_trackDirection); + assert(new_rideIndex == original_rideIndex); + assert(new_edxRS16 == original_edxRS16); + assert(new_x == original_x); + assert(new_y == original_y); + assert(new_z == original_z); + //assert(new_properties == original_properties); + assert(new_currentTrackLiftHill == original_currentTrackLiftHill); + + if (trackType != NULL) *trackType = original_trackType; + if (trackDirection != NULL) *trackDirection = original_trackDirection; + if (rideIndex != NULL) *rideIndex = original_rideIndex; + if (edxRS16 != NULL) *edxRS16 = original_edxRS16; + if (x != NULL) *x = original_x; + if (y != NULL) *y = original_y; + if (z != NULL) *z = original_z; + if (properties != NULL) *properties = original_properties; + + return false; +} + /** * * rct2: 0x006C6A77 From 76f0ca9afbfff66cccf0e4e77d815758457dc5b4 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Thu, 18 Feb 2016 13:31:42 +0100 Subject: [PATCH 02/13] Clean logic --- src/windows/ride_construction.c | 84 +++++++++++++-------------------- 1 file changed, 34 insertions(+), 50 deletions(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 4b4fa26f03..169542e4b5 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -3526,41 +3526,33 @@ static bool new_sub_6CA2DF(uint8 *_trackType, uint8 *_trackDirection, uint8 *_ri rct_ride *ride = get_ride(rideIndex); if (_enabledRidePiecesB & (1 << 8)) { - if (trackType == 0x3E) { - trackType = 0x76; - } + switch (trackType) { + case TRACK_ELEM_FLAT_TO_60_DEG_UP: + trackType = TRACK_ELEM_FLAT_TO_60_DEG_UP_LONG_BASE; + break; - if (trackType == 0x3F) { - trackType = 0x77; - } + case TRACK_ELEM_60_DEG_UP_TO_FLAT: + trackType = TRACK_ELEM_60_DEG_UP_TO_FLAT_LONG_BASE; + break; - if (trackType == 0x48) { - trackType = 0x7A; - } + case TRACK_ELEM_FLAT_TO_60_DEG_DOWN: + trackType = TRACK_ELEM_60_DEG_UP_TO_FLAT_LONG_BASE_122; + break; - if (trackType == 14) { - trackType = 0x79; - } + case TRACK_ELEM_60_DEG_DOWN_TO_FLAT: + trackType = TRACK_ELEM_FLAT_TO_60_DEG_DOWN_LONG_BASE; + break; - if (trackType == 0x9A) { - return true; - } - - if (trackType == 0x98) { - return true; - } - - if (trackType == 0x9D) { - return true; - } - - if (trackType == 0x9C) { - return true; + case TRACK_ELEM_DIAG_FLAT_TO_60_DEG_UP: + case TRACK_ELEM_DIAG_60_DEG_UP_TO_FLAT: + case TRACK_ELEM_DIAG_FLAT_TO_60_DEG_DOWN: + case TRACK_ELEM_DIAG_60_DEG_DOWN_TO_FLAT: + return true; } } - if (ride_type_has_flag(ride->type, 0x1000) && _currentTrackCovered != 1) { - if (ride->type == RIDE_TYPE_WATER_COASTER || trackType == 0 || trackType == 0x10 || trackType == 0x11) { + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_TRACK_ELEMENTS_HAVE_TWO_VARIETIES) && _currentTrackCovered & 1) { + if (ride->type == RIDE_TYPE_WATER_COASTER || trackType == TRACK_ELEM_FLAT || trackType == TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES || trackType == TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES) { trackType = RCT2_GLOBAL(0x00993D1C + trackType, uint8); edxRS16 &= 0xFFFE; // unsets 0x1 } @@ -3568,7 +3560,7 @@ static bool new_sub_6CA2DF(uint8 *_trackType, uint8 *_trackDirection, uint8 *_ri z = _currentTrackBeginZ; rct_track_coordinates trackCoordinates; - if (ride_type_has_flag(ride->type, 0x80000)) { + if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { trackCoordinates = FlatTrackCoordinates[trackType]; } else { trackCoordinates = TrackCoordinates[trackType]; @@ -3587,35 +3579,27 @@ static bool new_sub_6CA2DF(uint8 *_trackType, uint8 *_trackDirection, uint8 *_ri trackDirection |= 0x04; } - sint16 deltaX = trackCoordinates.x; - sint16 deltaY = trackCoordinates.y; - sint16 temp; switch (trackDirection & 0x03) { case 0: - deltaX = -deltaX; - deltaY = -deltaY; + x -= trackCoordinates.x; + y -= trackCoordinates.y; break; case 1: - deltaY = -deltaY; - temp = deltaY; - deltaY = deltaX; - deltaX = temp; + x -= trackCoordinates.y; + y += trackCoordinates.x; + break; + + case 2: + x += trackCoordinates.x; + y += trackCoordinates.y; break; case 3: - deltaX = -deltaX; - temp = deltaY; - deltaY = deltaX; - deltaX = temp; - break; - - default: + x += trackCoordinates.y; + y -= trackCoordinates.x; break; } - - x += deltaX; - y += deltaY; } else { z -= trackCoordinates.z_begin; trackDirection = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8); @@ -3638,13 +3622,13 @@ static bool new_sub_6CA2DF(uint8 *_trackType, uint8 *_trackDirection, uint8 *_ri edxRS16 &= 0xFFFE; // unsets 0x1 _currentTrackLiftHill &= 0xFE; - if (trackType == 0xD1 || trackType == 0xD2) { + if (trackType == TRACK_ELEM_LEFT_CURVED_LIFT_HILL || trackType == TRACK_ELEM_RIGHT_CURVED_LIFT_HILL) { edxRS16 |= 0x1; } } // loc_6CAF49: - if (trackType == 0x63) { + if (trackType == TRACK_ELEM_BRAKES) { uint32 ebp = RCT2_GLOBAL(0x00F440CD, uint8) << 16; properties &= 0xFFFF; properties |= ebp; From b88ac9f26ed397b85b81abb3dff8393cba7af72c Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Thu, 18 Feb 2016 13:55:56 +0100 Subject: [PATCH 03/13] Apply suggested fixes --- src/windows/ride_construction.c | 35 ++++++++++++++------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 169542e4b5..d1034f26a3 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -3552,56 +3552,51 @@ static bool new_sub_6CA2DF(uint8 *_trackType, uint8 *_trackDirection, uint8 *_ri } if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_TRACK_ELEMENTS_HAVE_TWO_VARIETIES) && _currentTrackCovered & 1) { - if (ride->type == RIDE_TYPE_WATER_COASTER || trackType == TRACK_ELEM_FLAT || trackType == TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES || trackType == TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES) { + if (ride->type != RIDE_TYPE_WATER_COASTER || trackType == TRACK_ELEM_FLAT || trackType == TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES || trackType == TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES) { trackType = RCT2_GLOBAL(0x00993D1C + trackType, uint8); edxRS16 &= 0xFFFE; // unsets 0x1 } } z = _currentTrackBeginZ; - rct_track_coordinates trackCoordinates; - if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_FLAT_RIDE)) { - trackCoordinates = FlatTrackCoordinates[trackType]; - } else { - trackCoordinates = TrackCoordinates[trackType]; - } + const rct_track_coordinates *trackCoordinates = get_track_coord_from_ride(ride, trackType); x = _currentTrackBeginX; y = _currentTrackBeginY; if (_rideConstructionState == 2) { - z -= trackCoordinates.z_end; + z -= trackCoordinates->z_end; trackDirection = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) ^ 0x02; - trackDirection -= trackCoordinates.rotation_end; - trackDirection += trackCoordinates.rotation_begin; + trackDirection -= trackCoordinates->rotation_end; + trackDirection += trackCoordinates->rotation_begin; trackDirection &= 0x03; - if (trackCoordinates.rotation_begin == 4) { + if (trackCoordinates->rotation_begin & (1 << 2)) { trackDirection |= 0x04; } switch (trackDirection & 0x03) { case 0: - x -= trackCoordinates.x; - y -= trackCoordinates.y; + x -= trackCoordinates->x; + y -= trackCoordinates->y; break; case 1: - x -= trackCoordinates.y; - y += trackCoordinates.x; + x -= trackCoordinates->y; + y += trackCoordinates->x; break; case 2: - x += trackCoordinates.x; - y += trackCoordinates.y; + x += trackCoordinates->x; + y += trackCoordinates->y; break; case 3: - x += trackCoordinates.y; - y -= trackCoordinates.x; + x += trackCoordinates->y; + y -= trackCoordinates->x; break; } } else { - z -= trackCoordinates.z_begin; + z -= trackCoordinates->z_begin; trackDirection = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8); } From 1f2afd6bac261275a10af011f7b454cd0034f3bd Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Thu, 18 Feb 2016 14:24:09 +0100 Subject: [PATCH 04/13] Process feedback --- src/windows/ride_construction.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index d1034f26a3..4ce95c17b5 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -2399,7 +2399,7 @@ static bool sub_6CA2DF_get_dh(uint8 *dh) { uint16 ax = _currentTrackCurve; if (ax == 0xFFFF) { - return true; + return false; } printf("[ax=%d, bl=%d, bh=%d, cl=%d, ch=%d, rotation=%d, state=%d]\n", ax, bl, bh, cl, ch, RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8), _rideConstructionState); @@ -2472,7 +2472,7 @@ static bool sub_6CA2DF_get_dh(uint8 *dh) { return true; } - if (ch == 0) { + if (ch != 0) { return false; } @@ -2498,7 +2498,7 @@ static bool sub_6CA2DF_get_dh(uint8 *dh) { } *dh = 0x74; - if (cl == 2) { + if (cl == 4) { return true; } @@ -2516,7 +2516,7 @@ static bool sub_6CA2DF_get_dh(uint8 *dh) { return true; } - if (ch == 0) { + if (ch != 0) { return false; } From e20f487629f55c954fbabc146eec7c6e1e5fd169 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Thu, 18 Feb 2016 21:15:22 +0100 Subject: [PATCH 05/13] Fix mistakes --- src/windows/ride_construction.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 4ce95c17b5..d808f65841 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -2753,7 +2753,7 @@ static bool sub_6CA2DF_get_dh(uint8 *dh) { return true; } - *dh = 0x18; + *dh = 0x1B; return true; } @@ -2889,7 +2889,7 @@ static bool sub_6CA2DF_get_dh(uint8 *dh) { return true; } - if (bh == 0) { + if (bh != 0) { return false; } @@ -2933,7 +2933,7 @@ static bool sub_6CA2DF_get_dh(uint8 *dh) { return true; } - if (bh == 2) { + if (bh != 2) { return false; } @@ -2957,7 +2957,7 @@ static bool sub_6CA2DF_get_dh(uint8 *dh) { return true; } - *dh = 0x98; + *dh = 0x9B; if (bh == 0) { return true; } @@ -3413,12 +3413,12 @@ static bool sub_6CA2DF_get_dh(uint8 *dh) { return false; } - *dh = 0x86; + *dh = 0x88; if (ch == 0) { return true; } - *dh = 0x8A; + *dh = 0x8C; return true; } @@ -3444,12 +3444,12 @@ static bool sub_6CA2DF_get_dh(uint8 *dh) { return false; } - *dh = 0x88; + *dh = 0x86; if (ch == 0) { return true; } - *dh = 0x8C; + *dh = 0x8A; return true; } From 2b879cd586ee7f0393d7b47c532bc78781f066f0 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Thu, 18 Feb 2016 22:01:54 +0100 Subject: [PATCH 06/13] [temp] log tracktype conditions --- src/windows/ride_construction.c | 123 +++++++++++++++++++++++++++++++- 1 file changed, 121 insertions(+), 2 deletions(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index d808f65841..d0c0e186d2 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -2381,6 +2381,125 @@ void sub_6C84CE() window_ride_construction_update_widgets(w); } +char *track_curve_description(uint16 trackCurve) { + switch (trackCurve) { + case TRACK_CURVE_NONE: + return "TRACK_CURVE_NONE"; + + case TRACK_CURVE_LEFT: + return "TRACK_CURVE_LEFT"; + + case TRACK_CURVE_RIGHT: + return "TRACK_CURVE_RIGHT"; + + case TRACK_CURVE_LEFT_SMALL: + return "TRACK_CURVE_LEFT_SMALL"; + + case TRACK_CURVE_RIGHT_SMALL: + return "TRACK_CURVE_RIGHT_SMALL"; + + case TRACK_CURVE_LEFT_VERY_SMALL: + return "TRACK_CURVE_LEFT_VERY_SMALL"; + + case TRACK_CURVE_RIGHT_VERY_SMALL: + return "TRACK_CURVE_RIGHT_VERY_SMALL"; + + case TRACK_CURVE_LEFT_LARGE: + return "TRACK_CURVE_LEFT_LARGE"; + + case TRACK_CURVE_RIGHT_LARGE: + return "TRACK_CURVE_RIGHT_LARGE"; + + default: + return ""; + } +} + +char *track_slope_description(uint8 trackSlope) { + switch (trackSlope) { + case TRACK_SLOPE_NONE: + return "TRACK_SLOPE_NONE"; + + case TRACK_SLOPE_UP_25: + return "TRACK_SLOPE_UP_25"; + + case TRACK_SLOPE_UP_60: + return "TRACK_SLOPE_UP_60"; + + case TRACK_SLOPE_DOWN_25: + return "TRACK_SLOPE_DOWN_25"; + + case TRACK_SLOPE_DOWN_60: + return "TRACK_SLOPE_DOWN_60"; + + case TRACK_SLOPE_UP_90: + return "TRACK_SLOPE_UP_90"; + + case TRACK_SLOPE_DOWN_90: + return "TRACK_SLOPE_DOWN_90"; + + default: + return ""; + } +} + +char *track_bank_description(uint8 trackBank) { + switch (trackBank) { + case TRACK_BANK_NONE: + return "TRACK_BANK_NONE"; + + case TRACK_BANK_LEFT: + return "TRACK_BANK_LEFT"; + + case TRACK_BANK_RIGHT: + return "TRACK_BANK_RIGHT"; + + default: + return ""; + } +} + +int log_6CA2DF_ids[255]; + +static void log_6CA2DF(uint8 trackType) { + if (log_6CA2DF_ids[trackType] == 1) { + return;; + } + + log_6CA2DF_ids[trackType] = 1; + + uint8 bl = _previousTrackSlopeEnd; + uint8 bh = _currentTrackSlopeEnd; + uint8 cl = _previousTrackBankEnd; + uint8 ch = _currentTrackBankEnd; + + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { + bl = _currentTrackSlopeEnd; + bh = _previousTrackSlopeEnd; + cl = _currentTrackBankEnd; + ch = _previousTrackBankEnd; + } + + if (_currentTrackCurve > 8) { + return; + } + + char *string_ax = track_curve_description(_currentTrackCurve); + char *string_bl = track_slope_description(bl); + char *string_bh = track_slope_description(bh); + char *string_cl = track_bank_description(cl); + char *string_ch = track_bank_description(ch); + char *string_lt_4 = (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) < 4) ? "true" : "false"; + uint8 rotation = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8); + if (_rideConstructionState == 2) { + rotation = rotation ^ 0x04; + } + char *string_xor_4 = (rotation & 0x04) ? "true" : "false"; + + printf("%s, %s, %s, %s, %s, %s, %s, %d\n", string_ax, string_lt_4, string_xor_4, string_bl, string_bh, string_cl, string_ch, trackType); + +} + static bool sub_6CA2DF_get_dh(uint8 *dh) { window_ride_construction_update_enabled_track_pieces(); @@ -2402,8 +2521,6 @@ static bool sub_6CA2DF_get_dh(uint8 *dh) { return false; } - printf("[ax=%d, bl=%d, bh=%d, cl=%d, ch=%d, rotation=%d, state=%d]\n", ax, bl, bh, cl, ch, RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8), _rideConstructionState); - if (ax == 0) { if (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) < 4) { if (bl == bh) { @@ -3513,6 +3630,8 @@ static bool new_sub_6CA2DF(uint8 *_trackType, uint8 *_trackDirection, uint8 *_ri return true; } + log_6CA2DF(trackType); + edxRS16 = 0; rideIndex = _currentRideIndex; if (_currentTrackLiftHill & 1) { From 0b792cb9270325908cfca9a3df2bc0219c58468b Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Fri, 19 Feb 2016 00:16:03 +0100 Subject: [PATCH 07/13] Fix conditional --- src/windows/ride_construction.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index d0c0e186d2..9ace453179 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -2550,7 +2550,7 @@ static bool sub_6CA2DF_get_dh(uint8 *dh) { return true; } - if (ch == 0) { + if (ch != 0) { return false; } From a5ee1ddb563b8870030e1a61b239cf7c7aaa017e Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Fri, 19 Feb 2016 01:29:30 +0100 Subject: [PATCH 08/13] More fixes --- src/windows/ride_construction.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 9ace453179..3f20ccba01 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -3276,7 +3276,7 @@ static bool sub_6CA2DF_get_dh(uint8 *dh) { return true; } - if (ax == 4) { + if (ax == TRACK_CURVE_RIGHT_SMALL) { if (bl != bh) { if (bl == 0 && bh == 2 && cl == 4) { *dh = 0xB3; @@ -3310,13 +3310,18 @@ static bool sub_6CA2DF_get_dh(uint8 *dh) { return true; } - *dh = 0x68; + *dh = 0x60; if (bh == 4) { return true; } - *dh = 0x0F; - if (bh == 0x12) { + *dh = 0xFC; + if (bh == 18) { + return true; + } + + *dh = 0xFA; + if (bh == 10) { return true; } From 7b2c3f5b88f227f0873f579ed2285aa8fc1d68a0 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Fri, 19 Feb 2016 13:31:00 +0100 Subject: [PATCH 09/13] Refactor known input/output combinations to use table --- src/windows/ride_construction.c | 1225 ++++++------------------------- 1 file changed, 223 insertions(+), 1002 deletions(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 3f20ccba01..3fea92e668 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -446,6 +446,160 @@ rct_string_id RideConfigurationStringIds[] = { #pragma endregion + +typedef struct { + bool is_diagonal; + uint8 slope_start; + uint8 bank_start; + uint8 track_curve; + uint8 slope_end; + uint8 bank_end; + uint8 track_element; +} track_descriptor; + +const track_descriptor TrackDescriptors[140] = { + {true, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_DIAG_60_DEG_DOWN}, + {true, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_60_DEG_DOWN_TO_25_DEG_DOWN}, + {true, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_60_DEG_DOWN_TO_FLAT}, + {true, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_DIAG_25_DEG_DOWN_TO_60_DEG_DOWN}, + {true, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_25_DEG_DOWN}, + {true, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_DIAG_25_DEG_DOWN_TO_LEFT_BANK}, + {true, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_25_DEG_DOWN_TO_FLAT}, + {true, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_DIAG_25_DEG_DOWN_TO_RIGHT_BANK}, + {true, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_LEFT_BANK_TO_25_DEG_DOWN}, + {true, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_DIAG_LEFT_BANK}, + {true, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_LEFT_BANK_TO_FLAT}, + {true, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_LEFT_BANK_TO_25_DEG_UP}, + {true, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_CURVE_LEFT_LARGE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_EIGHTH_BANK_TO_ORTHOGONAL}, + {true, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_CURVE_LEFT_LARGE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_EIGHTH_TO_ORTHOGONAL}, + {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_DIAG_FLAT_TO_60_DEG_DOWN}, + {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_ELEM_DIAG_FLAT_TO_25_DEG_DOWN}, + {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_DIAG_FLAT_TO_LEFT_BANK}, + {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_FLAT}, + {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_DIAG_FLAT_TO_RIGHT_BANK}, + {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_FLAT_TO_25_DEG_UP}, + {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_DIAG_FLAT_TO_60_DEG_UP}, + {true, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_CURVE_RIGHT_LARGE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_EIGHTH_TO_ORTHOGONAL}, + {true, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_CURVE_RIGHT_LARGE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_EIGHTH_BANK_TO_ORTHOGONAL}, + {true, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_RIGHT_BANK_TO_25_DEG_DOWN}, + {true, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_RIGHT_BANK_TO_FLAT}, + {true, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_DIAG_RIGHT_BANK}, + {true, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_RIGHT_BANK_TO_25_DEG_UP}, + {true, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_DIAG_25_DEG_UP_TO_LEFT_BANK}, + {true, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT}, + {true, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_DIAG_25_DEG_UP_TO_RIGHT_BANK}, + {true, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_25_DEG_UP}, + {true, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_DIAG_25_DEG_UP_TO_60_DEG_UP}, + {true, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_60_DEG_UP_TO_FLAT}, + {true, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_60_DEG_UP_TO_25_DEG_UP}, + {true, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_DIAG_60_DEG_UP}, + {false, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_90_DEG_DOWN}, + {false, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_ELEM_90_DEG_DOWN}, + {false, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_90_DEG_DOWN_TO_60_DEG_DOWN}, + {false, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_90_DEG_DOWN}, + {false, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_DOWN}, + {false, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_DOWN_TO_90_DEG_DOWN}, + {false, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_DOWN}, + {false, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_DOWN_TO_25_DEG_DOWN}, + {false, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_DOWN_TO_FLAT}, + {false, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_DOWN}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_3_TILE_25_DEG_DOWN}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_CURVE_LEFT, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_5_TILE_25_DEG_DOWN}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_ELEM_25_DEG_DOWN_LEFT_BANKED}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANKED_25_DEG_DOWN_TO_25_DEG_DOWN}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_25_DEG_DOWN_TO_LEFT_BANKED_FLAT}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANKED_25_DEG_DOWN_TO_FLAT}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_LEFT, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_DOWN}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_25_DEG_DOWN_TO_60_DEG_DOWN}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_ELEM_25_DEG_DOWN_TO_LEFT_BANKED_25_DEG_DOWN}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_25_DEG_DOWN}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_ELEM_25_DEG_DOWN_TO_RIGHT_BANKED_25_DEG_DOWN}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_25_DEG_DOWN_TO_LEFT_BANK}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_25_DEG_DOWN_TO_FLAT}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_25_DEG_DOWN_TO_RIGHT_BANK}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_RIGHT, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_DOWN}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANKED_25_DEG_DOWN_TO_25_DEG_DOWN}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_ELEM_25_DEG_DOWN_RIGHT_BANKED}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANKED_25_DEG_DOWN_TO_FLAT}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_25_DEG_DOWN_TO_RIGHT_BANKED_FLAT}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_5_TILE_25_DEG_DOWN}, + {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_3_TILE_25_DEG_DOWN}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_BANK}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_LEFT, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_BANKED_LEFT_QUARTER_TURN_5_TILES}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_LEFT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_EIGHTH_BANK_TO_DIAG}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_FLAT_TO_LEFT_BANKED_25_DEG_DOWN}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANK_TO_25_DEG_DOWN}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANK}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANK_TO_FLAT}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_FLAT_TO_LEFT_BANKED_25_DEG_UP}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANK_TO_25_DEG_UP}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_LEFT, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_LEFT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_EIGHTH_TO_DIAG}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_FLAT_TO_60_DEG_DOWN}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_ELEM_FLAT_TO_LEFT_BANKED_25_DEG_DOWN}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_FLAT_TO_25_DEG_DOWN}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_ELEM_FLAT_TO_RIGHT_BANKED_25_DEG_DOWN}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_FLAT_TO_LEFT_BANK}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_FLAT}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_LEFT_VERY_SMALL, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_VERY_SMALL, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_FLAT_TO_RIGHT_BANK}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_ELEM_FLAT_TO_LEFT_BANKED_25_DEG_UP}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_FLAT_TO_25_DEG_UP}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_ELEM_FLAT_TO_RIGHT_BANKED_25_DEG_UP}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_FLAT_TO_60_DEG_UP}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_EIGHTH_TO_DIAG}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_RIGHT, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANK_TO_25_DEG_DOWN}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_FLAT_TO_RIGHT_BANKED_25_DEG_DOWN}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANK_TO_FLAT}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANK}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANK_TO_25_DEG_UP}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_FLAT_TO_RIGHT_BANKED_25_DEG_UP}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_EIGHTH_BANK_TO_DIAG}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_BANKED_RIGHT_QUARTER_TURN_5_TILES}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_BANK}, + {false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_3_TILE_25_DEG_UP}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_CURVE_LEFT, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_5_TILE_25_DEG_UP}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_25_DEG_UP_TO_LEFT_BANKED_FLAT}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANKED_25_DEG_UP_TO_FLAT}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_ELEM_25_DEG_UP_LEFT_BANKED}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANKED_25_DEG_UP_TO_25_DEG_UP}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_LEFT, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_25_DEG_UP_TO_LEFT_BANK}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_25_DEG_UP_TO_FLAT}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_25_DEG_UP_TO_RIGHT_BANK}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_ELEM_25_DEG_UP_TO_LEFT_BANKED_25_DEG_UP}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_25_DEG_UP}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_ELEM_25_DEG_UP_TO_RIGHT_BANKED_25_DEG_UP}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_25_DEG_UP_TO_60_DEG_UP}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_RIGHT, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANKED_25_DEG_UP_TO_FLAT}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_25_DEG_UP_TO_RIGHT_BANKED_FLAT}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANKED_25_DEG_UP_TO_25_DEG_UP}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_ELEM_25_DEG_UP_RIGHT_BANKED}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_5_TILE_25_DEG_UP}, + {false, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_3_TILE_25_DEG_UP}, + {false, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_UP}, + {false, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_UP_TO_FLAT}, + {false, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_UP_TO_25_DEG_UP}, + {false, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_UP}, + {false, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_UP_TO_90_DEG_UP}, + {false, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_UP}, + {false, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_90_DEG_UP}, + {false, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_90_DEG_UP_TO_60_DEG_UP}, + {false, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_ELEM_90_DEG_UP}, + {false, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_90_DEG_UP}, +}; + #define _trackPlaceCtrlState RCT2_GLOBAL(0x00F44159, uint8) static int _trackPlaceCtrlZ; #define _trackPlaceShiftState RCT2_GLOBAL(0x00F4415C, uint8) @@ -2489,18 +2643,17 @@ static void log_6CA2DF(uint8 trackType) { char *string_bh = track_slope_description(bh); char *string_cl = track_bank_description(cl); char *string_ch = track_bank_description(ch); - char *string_lt_4 = (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) < 4) ? "true" : "false"; + char *string_lt_4 = (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) >= 4) ? "true" : "false"; uint8 rotation = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8); - if (_rideConstructionState == 2) { + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { rotation = rotation ^ 0x04; } - char *string_xor_4 = (rotation & 0x04) ? "true" : "false"; - - printf("%s, %s, %s, %s, %s, %s, %s, %d\n", string_ax, string_lt_4, string_xor_4, string_bl, string_bh, string_cl, string_ch, trackType); + char *string_xor_4 = (rotation & (1 << 2)) ? "true" : "false"; + printf("(%s || %s), %s, %s, %s, %s, %s, %d\n", string_lt_4, string_xor_4, string_bl, string_cl, string_ax, string_bh, string_ch, trackType); } -static bool sub_6CA2DF_get_dh(uint8 *dh) { +static bool sub_6CA2DF_get_dh(uint8 *dh, bool *must_refactor) { window_ride_construction_update_enabled_track_pieces(); uint32 edi = 0; @@ -2521,1058 +2674,123 @@ static bool sub_6CA2DF_get_dh(uint8 *dh) { return false; } - if (ax == 0) { - if (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) < 4) { - if (bl == bh) { - if (bl == 0) { - if (cl == ch) { - *dh = 0; - if (cl == 0) { - return true; - } + bool isDiagonal = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) >= 4; - *dh = 0x20; - if (cl == 2) { - return true; - } - - *dh = 0x21; - return true; - } - - if (cl == 0) { - *dh = 0x12; - if (ch == 2) { - return true; - } - - *dh = 0x13; - return true; - } - - if (ch != 0) { - return false; - } - - *dh = 0x14; - if (cl == 2) { - return true; - } - - *dh = 0x15; - return true; - } - - if (bl == 2) { - if (cl == ch) { - *dh = 0x6E; - if (cl == 2) { - return true; - } - - *dh = 0x6F; - if (cl == 4) { - return true; - } - - *dh = 4; - return true; - } - - if (cl == 0) { - *dh = 0xE1; - if (ch == 2) { - return true; - } - - *dh = 0xE2; - return true; - } - - if (ch != 0) { - return false; - } - - *dh = 0xE3; - if (cl == 2) { - return true; - } - - *dh = 0xE4; - return true; - } - - *dh = 5; - if (bl == 4) { - return true; - } - - if (bl == 6) { - if (cl == ch) { - *dh = 0x73; - if (cl == 2) { - return true; - } - - *dh = 0x74; - if (cl == 4) { - return true; - } - - *dh = 0x0A; - return true; - } - - if (cl == 0) { - *dh = 0xE5; - if (ch == 2) { - return true; - } - - *dh = 0xE6; - return true; - } - - if (ch != 0) { - return false; - } - - *dh = 0xE7; - if (cl == 2) { - return true; - } - - *dh = 0xE8; - return true; - } - - *dh = 0xB; - if (bl == 8) { - return true; - } - - *dh = 0x7E; - if (bl == 10) { - return true; - } - - *dh = 0x7F; - if (bl == 18) { - return true; - } - - return false; - } - - // end bl = bh - - if (bl == 18) { - *dh = 0x81; - if (bh == 8) { - return true; - } - } - - if (bl == 10) { - *dh = 0x82; - if (bh == 4) { - return true; - } - } - - *dh = 0xE; - if (bl == 8) { - if (bh == 6) { - return true; - } - - *dh = 0x41; - if (bh == 0) { - return true; - } - - *dh = 0x83; - if (bh == 18) { - return true; - } - - return false; - } - - if (bl == 6) { - *dh = 0x0D; - if (bh == 8) { - return true; - } - - if (bh != 0) { - return false; - } - - if (cl == 0) { - *dh = 0x0F; - if (ch == 0) { - return true; - } - - *dh = 0x1E; - if (ch == 2) { - return true; - } - - *dh = 0x1F; - return true; - } - - if (cl == ch) { - *dh = 0xEF; - if (cl == 2) { - return true; - } - - *dh = 0xF0; - return true; - } - - *dh = 0xF7; - if (cl == 2) { - return true; - } - - *dh = 0xF8; - return true; - } - - if (bl == 0) { - if (bh == 6) { - if (ch == 0) { - *dh = 0xC; - if (cl == 0) { - return true; - } - - *dh = 0x1C; - if (cl == 2) { - return true; - } - - *dh = 0x1D; - return true; - } - - if (cl == ch) { - *dh = 0xED; - if (ch == 2) { - return true; - } - - *dh = 0xEE; - return true; - } - - *dh = 0xF5; - if (ch == 2) { - return true; - } - - *dh = 0xF6; - return true; - } - - *dh = 0x3E; - if (bh == 4) { - return true; - } - - *dh = 0x40; - if (bh == 8) { - return true; - } - - if (bh != 2) { - return false; - } - - if (ch == 0) { - *dh = 6; - if (cl == 0) { - return true; - } - - *dh = 0x18; - if (cl == 2) { - return true; - } - - *dh = 0x19; - return true; - } - - if (cl == ch) { - *dh = 0xE9; - if (ch == 2) { - return true; - } - - *dh = 0xEA; - return true; - } - - *dh = 0xF1; - if (ch == 2) { - return true; - } - - *dh = 0xF2; - return true; - } - - *dh = 8; - if (bl == 4) { - if (bh == 2) { - return true; - } - - *dh = 0x3F; - if (bh == 0) { - return true; - } - - *dh = 0x80; - if (bh == 10) { - return true; - } - - return false; - } - - *dh = 7; - if (bh == 4) { - if (bl == 2) { - return true; - } - - return false; - } - - if (bh != 0) { - return false; - } - - if (cl == 0) { - *dh = 9; - if (ch == 0) { - return true; - } - - *dh = 0x1A; - if (ch == 2) { - return true; - } - - *dh = 0x1B; - return true; - } - - if (cl == ch) { - *dh = 0xEB; - if (cl == 2) { - return true; - } - - *dh = 0xEC; - return true; - } - - *dh = 0xF3; - if (cl == 2) { - return true; - } - - *dh = 0xF4; - return true; + if (ax == 7 || ax == 8) { + uint8 tmp_dh = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8); + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { + tmp_dh = tmp_dh ^ 0x04; } - // TRACK_PREVIEW_ROTATION >= 4 - if (bl == bh) { - if (bl == 0) { - if (cl == ch) { - *dh = 0x8D; - if (cl == 0) { - return true; - } - - *dh = 0xAA; - if (cl == 2) { - return true; - } - - *dh = 0xAB; - return true; - } - - if (cl == 0) { - *dh = 0x9E; - if (ch == 2) { - return true; - } - - *dh = 0x9F; - return true; - } - - if (ch != 0) { - return false; - } - - *dh = 0xA0; - if (cl == 2) { - return true; - } - - *dh = 0xA1; - return true; - } - - *dh = 0x8E; - if (bl == 2) { - return true; - } - - *dh = 0x8F; - if (bl == 4) { - return true; - } - - *dh = 0x94; - if (bl == 6) { - return true; - } - - *dh = 0x95; - if (bl == 8) { - return true; - } - - *dh = 0x7E; - if (bl == 10) { - return false; - } - - *dh = 0x7F; - if (bl == 18) { - return false; - } - - return false; - } - - if (bl == 18) { - *dh = 0x81; - if (bh == 8) { - return false; - } - } - - if (bl == 10) { - *dh = 0x82; - if (bh == 4) { - return false; - } - } - - *dh = 0x98; - if (bl == 8) { - if (bh == 6) { - return true; - } - - *dh = 0x9D; - if (bh == 0) { - return true; - } - - *dh = 0x83; - if (bh == 18) { - return false; - } - - return false; - } - - if (bl == 6) { - *dh = 0x97; - if (bh == 8) { - return true; - } - - if (bh != 0) { - return false; - } - - *dh = 0x99; - if (ch == 0) { - return true; - } - - *dh = 0xA8; - if (ch == 2) { - return true; - } - - *dh = 0xA9; - return true; - } - - if (bl == 0) { - if (bh == 6) { - *dh = 0x96; - if (cl == 0) { - return true; - } - - *dh = 0xA6; - if (cl == 2) { - return true; - } - - *dh = 0xA7; - return true; - } - - *dh = 0x9A; - if (bh == 4) { - return true; - } - - *dh = 0x9C; - if (bh == 8) { - return true; - } - - if (bh != 2) { - return false; - } - - *dh = 0x90; - if (cl == 0) { - return true; - } - - *dh = 0xA2; - if (cl == 2) { - return true; - } - - *dh = 0xA3; - return true; - } - - *dh = 0x92; - if (bl == 4) { - if (bh == 2) { - return true; - } - - *dh = 0x9B; - if (bh == 0) { - return true; - } - - *dh = 0x80; - if (bh == 10) { - return false; - } - - return false; - } - - *dh = 0x91; - if (bh == 4) { - if (bl == 2) { - return true; - } - - return false; - } - - *dh = 0x93; - if (bh != 0) { - return false; - } - - if (ch == 0) { - return true; - } - - *dh = 0xA4; - if (ch == 2) { - return true; - } - - *dh = 0xA5; - return true; + isDiagonal = (tmp_dh & 0x04); } - if (ax == 1) { - if (bl != bh) { - return false; - } + if (ax <= 8) { + for (int i = 0; i < 140; i++) { + track_descriptor trackDescriptor = TrackDescriptors[i]; + if (trackDescriptor.track_curve != ax) continue; + if (trackDescriptor.is_diagonal != isDiagonal) continue; + if (trackDescriptor.slope_start != bl) continue; + if (trackDescriptor.slope_end != bh) continue; + if (trackDescriptor.bank_start != cl) continue; + if (trackDescriptor.bank_end != ch) continue; - if (bl == 4) { - return false; - } - - if (bl == 8) { - return false; - } - - if (bh == 6) { - *dh = 0x24; - if (cl == 0) { - return true; - } - - *dh = 0xDF; + *dh = trackDescriptor.track_element; return true; } - if (bh == 2) { - *dh = 0x22; - if (cl == 0) { - return true; - } - - *dh = 0xDD; - return true; - } - - *dh = 0x10; - if (ch == 0) { - return true; - } - - *dh = 0x16; - return true; + log_error("missing element"); + *must_refactor = true; } - if (ax == 2) { - if (bl != bh) { - return false; - } - if (bl == 4) { - return false; - } - - if (bl == 8) { - return false; - } - - if (bh == 6) { - *dh = 0x25; - if (cl == 0) { - return true; - } - - *dh = 0xE0; + if (ax == TRACK_CURVE_LEFT_SMALL) { + if (bl == TRACK_SLOPE_DOWN_25 && bh == TRACK_BANK_NONE && cl == TRACK_BANK_NONE && ch == TRACK_BANK_LEFT) { + *dh = TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_LEFT_BANK; return true; } - if (bh == 2) { - *dh = 0x23; - if (cl == 0) { - return true; - } - - *dh = 0xDE; - return true; - } - - *dh = 0x11; - if (ch == 0) { - return true; - } - - *dh = 0x17; - return true; - } - - if (ax == 3) { - if (bl != bh) { - if (bl == 0 && bh == 2 && cl == 2) { - *dh = 0xB2; - if (ch == 0) { - return true; - } - } - - if (bl != 6) { - return false; - } - - if (bh != 0) { - return false; - } - - if (cl != 0) { - return false; - } - - *dh = 0xB4; - if (ch == 2) { - return true; - } - - return false; - } - - *dh = 0x61; - if (bh == 8) { - return true; - } - - *dh = 0x5F; - if (bh == 4) { - return true; - } - - *dh = 0xFB; - if (bh == 0x12) { - return true; - } - - *dh = 0xF9; - if (bh == 0xA) { - return true; - } - - if (bh == 6) { - *dh = 0x30; - if (cl == 0) { - return true; - } - - *dh = 0xDB; - return true; - } - - if (bh == 2) { - *dh = 0x2E; - if (cl == 0) { - return true; - } - - *dh = 0xD9; - return true; - } - - *dh = 0x2A; - if (ch == 0) { - return true; - } - - *dh = 0x2C; - return true; + return false; } if (ax == TRACK_CURVE_RIGHT_SMALL) { - if (bl != bh) { - if (bl == 0 && bh == 2 && cl == 4) { - *dh = 0xB3; - if (ch == 0) { - return true; - } - } - - if (bl != 6) { - return false; - } - - if (bh != 0) { - return false; - } - - if (cl != 0) { - return false; - } - - *dh = 0xB5; - if (ch == 4) { - return true; - } - - return false; - } - - *dh = 0x62; - if (bh == 8) { - return true; - } - - *dh = 0x60; - if (bh == 4) { - return true; - } - - *dh = 0xFC; - if (bh == 18) { - return true; - } - - *dh = 0xFA; - if (bh == 10) { - return true; - } - - if (bh == 6) { - *dh = 0x31; - if (cl == 0) { - return true; - } - - *dh = 0xDC; - return true; - } - - if (bh == 2) { - *dh = 0x2F; - if (cl == 0) { - return true; - } - - *dh = 0xDA; - return true; - } - - *dh = 0x2B; - if (ch == 0) { - return true; - } - - *dh = 0x2D; - return true; - - } - - if (ax == 5) { - if (bl != bh) { - return false; - } - - if (bl == 2) { - return false; - } - - if (bl == 6) { - return false; - } - - *dh = 0x61; - if (bh == 8) { - return true; - } - - *dh = 0x5F; - if (bh == 4) { - return true; - } - - *dh = 0xFB; - if (bh == 0x12) { - return true; - } - - *dh = 0xF9; - if (bh == 0xA) { - return true; - } - - *dh = 0x32; - if (ch == 0) { + if (bl == TRACK_SLOPE_DOWN_25 && bh == TRACK_BANK_NONE && cl == TRACK_BANK_NONE && ch == TRACK_BANK_RIGHT) { + *dh = TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_RIGHT_BANK; return true; } return false; } - if (ax == 6) { + if (ax == TRACK_CURVE_LEFT_VERY_SMALL) { if (bl != bh) { return false; } - if (bl == 2) { + if (bl == TRACK_SLOPE_UP_25 || bl == TRACK_SLOPE_DOWN_25) { return false; } - if (bl == 6) { - return false; - } - - *dh = 0x62; - if (bh == 8) { + *dh = TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_DOWN; + if (bh == TRACK_SLOPE_DOWN_60) { return true; } - *dh = 0x60; - if (bh == 4) { + *dh = TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_UP; + if (bh == TRACK_SLOPE_UP_60) { return true; } - *dh = 0xFC; - if (bh == 0x12) { + *dh = TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_90_DEG_DOWN; + if (bh == TRACK_SLOPE_DOWN_90) { return true; } - *dh = 0xFA; - if (bh == 0xA) { - return true; - } - - *dh = 0x33; - if (ch == 0) { + *dh = TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_90_DEG_UP; + if (bh == TRACK_SLOPE_UP_90) { return true; } return false; } - if (ax == 7) { - *dh = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8); - if (_rideConstructionState == 2) { - *dh = *dh ^ 0x04; - } - - if (*dh & 0x04) { - if (bl != bh) { - return false; - } - - if (bl == 4) { - return false; - } - - if (bl == 8) { - return false; - } - - *dh = 0x24; - if (bh == 6) { - return false; - } - - *dh = 0x22; - if (bh == 2) { - return false; - } - - *dh = 0x87; - if (ch == 0) { - return true; - } - - *dh = 0x8B; - return true; - } - + if (ax == TRACK_CURVE_RIGHT_VERY_SMALL) { if (bl != bh) { return false; } - if (bl == 4) { + if (bl == TRACK_SLOPE_UP_25 || bl == TRACK_SLOPE_DOWN_25) { return false; } - if (bl == 8) { - return false; - } - - *dh = 0x24; - if (bh == 6) { - return false; - } - - *dh = 0x22; - if (bh == 2) { - return false; - } - - *dh = 0x85; - if (ch == 0) { + *dh = TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_DOWN; + if (bh == TRACK_SLOPE_DOWN_60) { + // DOWN_60, ?, RIGHT_VERY_SMALL, DOWN_60, ? return true; } - *dh = 0x89; - return true; + *dh = TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_UP; + if (bh == TRACK_SLOPE_UP_60) { + // UP_60, ?, RIGHT_VERY_SMALL, UP_60, ? + return true; + } + + *dh = TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_90_DEG_DOWN; + if (bh == TRACK_SLOPE_DOWN_90) { + // DOWN_90, ?, RIGHT_VERY_SMALL, DOWN_90, ? + return true; + } + + *dh = TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_90_DEG_UP; + if (bh == TRACK_SLOPE_UP_90) { + return true; + } + + return false; } - if (ax == 8) { - *dh = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8); - if (_rideConstructionState == 2) { - *dh = *dh ^ 0x04; - } - - if (*dh & 0x04) { - if (bl != bh) { - return false; - } - - if (bl == 4) { - return false; - } - - if (bl == 8) { - return false; - } - - *dh = 0x25; - if (bh == 6) { - return false; - } - - *dh = 0x23; - if (bh == 2) { - return false; - } - - *dh = 0x88; - if (ch == 0) { - return true; - } - - *dh = 0x8C; - return true; - } - - if (bl != bh) { - return false; - } - - if (bl == 4) { - return false; - } - - if (bl == 8) { - return false; - } - - *dh = 0x25; - if (bh == 6) { - return false; - } - - *dh = 0x23; - if (bh == 2) { - return false; - } - - *dh = 0x86; - if (ch == 0) { - return true; - } - - *dh = 0x8A; - return true; + if (ax <= 8) { + return false; } *dh = ax & 0xFF; @@ -3630,12 +2848,15 @@ static bool new_sub_6CA2DF(uint8 *_trackType, uint8 *_trackDirection, uint8 *_ri uint8 trackType, trackDirection, rideIndex; uint16 z, x, y, edxRS16; uint32 properties; + bool mustRefactor = false; - if (!sub_6CA2DF_get_dh(&trackType)) { + if (!sub_6CA2DF_get_dh(&trackType, &mustRefactor)) { return true; } - log_6CA2DF(trackType); + if (mustRefactor) { + log_6CA2DF(trackType); + } edxRS16 = 0; rideIndex = _currentRideIndex; From a157a7945c27a1d5526238e59e639dd83ee0a430 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Fri, 19 Feb 2016 16:30:56 +0100 Subject: [PATCH 10/13] Fix structure of diagonal curves --- src/windows/ride_construction.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 3fea92e668..0085502041 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -466,12 +466,12 @@ const track_descriptor TrackDescriptors[140] = { {true, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_DIAG_25_DEG_DOWN_TO_LEFT_BANK}, {true, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_25_DEG_DOWN_TO_FLAT}, {true, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_DIAG_25_DEG_DOWN_TO_RIGHT_BANK}, + {true, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_LEFT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_EIGHTH_BANK_TO_ORTHOGONAL}, {true, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_LEFT_BANK_TO_25_DEG_DOWN}, {true, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_DIAG_LEFT_BANK}, {true, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_LEFT_BANK_TO_FLAT}, {true, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_LEFT_BANK_TO_25_DEG_UP}, - {true, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_CURVE_LEFT_LARGE, TRACK_BANK_LEFT, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_EIGHTH_BANK_TO_ORTHOGONAL}, - {true, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_CURVE_LEFT_LARGE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_EIGHTH_TO_ORTHOGONAL}, + {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_LEFT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_EIGHTH_TO_ORTHOGONAL}, {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_DIAG_FLAT_TO_60_DEG_DOWN}, {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_ELEM_DIAG_FLAT_TO_25_DEG_DOWN}, {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_DIAG_FLAT_TO_LEFT_BANK}, @@ -479,12 +479,12 @@ const track_descriptor TrackDescriptors[140] = { {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_DIAG_FLAT_TO_RIGHT_BANK}, {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_FLAT_TO_25_DEG_UP}, {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_DIAG_FLAT_TO_60_DEG_UP}, - {true, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_CURVE_RIGHT_LARGE, TRACK_BANK_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_EIGHTH_TO_ORTHOGONAL}, - {true, TRACK_SLOPE_NONE, TRACK_SLOPE_NONE, TRACK_CURVE_RIGHT_LARGE, TRACK_BANK_RIGHT, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_EIGHTH_BANK_TO_ORTHOGONAL}, + {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_EIGHTH_TO_ORTHOGONAL}, {true, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_RIGHT_BANK_TO_25_DEG_DOWN}, {true, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_RIGHT_BANK_TO_FLAT}, {true, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_DIAG_RIGHT_BANK}, {true, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_RIGHT_BANK_TO_25_DEG_UP}, + {true, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_EIGHTH_BANK_TO_ORTHOGONAL}, {true, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_DIAG_25_DEG_UP_TO_LEFT_BANK}, {true, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT}, {true, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_DIAG_25_DEG_UP_TO_RIGHT_BANK}, From 9b8b90964e0783fa4a745a95ed619c41efaf7b85 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Fri, 19 Feb 2016 17:19:34 +0100 Subject: [PATCH 11/13] Use TRACK_SLOPE_NONE for comparing with bl --- src/windows/ride_construction.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index 0085502041..c85f8edec7 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -2705,7 +2705,7 @@ static bool sub_6CA2DF_get_dh(uint8 *dh, bool *must_refactor) { if (ax == TRACK_CURVE_LEFT_SMALL) { - if (bl == TRACK_SLOPE_DOWN_25 && bh == TRACK_BANK_NONE && cl == TRACK_BANK_NONE && ch == TRACK_BANK_LEFT) { + if (bl == TRACK_SLOPE_DOWN_25 && bh == TRACK_SLOPE_NONE && cl == TRACK_BANK_NONE && ch == TRACK_BANK_LEFT) { *dh = TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_LEFT_BANK; return true; } @@ -2714,7 +2714,7 @@ static bool sub_6CA2DF_get_dh(uint8 *dh, bool *must_refactor) { } if (ax == TRACK_CURVE_RIGHT_SMALL) { - if (bl == TRACK_SLOPE_DOWN_25 && bh == TRACK_BANK_NONE && cl == TRACK_BANK_NONE && ch == TRACK_BANK_RIGHT) { + if (bl == TRACK_SLOPE_DOWN_25 && bh == TRACK_SLOPE_NONE && cl == TRACK_BANK_NONE && ch == TRACK_BANK_RIGHT) { *dh = TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_RIGHT_BANK; return true; } From 88d0f8c60be00f0772e55dae9dd9c0ad4823a1af Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Sat, 20 Feb 2016 17:53:20 +0100 Subject: [PATCH 12/13] Clean up track retrieval --- src/ride/track_data.c | 143 +++++++++++ src/ride/track_data.h | 12 + src/windows/ride_construction.c | 437 +++----------------------------- 3 files changed, 187 insertions(+), 405 deletions(-) diff --git a/src/ride/track_data.c b/src/ride/track_data.c index 95d35a213f..ce414446af 100644 --- a/src/ride/track_data.c +++ b/src/ride/track_data.c @@ -5658,3 +5658,146 @@ const TRACK_PAINT_FUNCTION_GETTER RideTypeTrackPaintFunctions[91] = { 0, // RIDE_TYPE_59 0, // RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER }; + +const track_descriptor gTrackDescriptors[140] = { + { true, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_DIAG_60_DEG_DOWN }, + { true, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_60_DEG_DOWN_TO_25_DEG_DOWN }, + { true, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_60_DEG_DOWN_TO_FLAT }, + { true, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_DIAG_25_DEG_DOWN_TO_60_DEG_DOWN }, + { true, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_25_DEG_DOWN }, + { true, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_DIAG_25_DEG_DOWN_TO_LEFT_BANK }, + { true, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_25_DEG_DOWN_TO_FLAT }, + { true, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_DIAG_25_DEG_DOWN_TO_RIGHT_BANK }, + { true, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_LEFT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_EIGHTH_BANK_TO_ORTHOGONAL }, + { true, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_LEFT_BANK_TO_25_DEG_DOWN }, + { true, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_DIAG_LEFT_BANK }, + { true, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_LEFT_BANK_TO_FLAT }, + { true, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_LEFT_BANK_TO_25_DEG_UP }, + { true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_LEFT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_EIGHTH_TO_ORTHOGONAL }, + { true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_DIAG_FLAT_TO_60_DEG_DOWN }, + { true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_ELEM_DIAG_FLAT_TO_25_DEG_DOWN }, + { true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_DIAG_FLAT_TO_LEFT_BANK }, + { true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_FLAT }, + { true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_DIAG_FLAT_TO_RIGHT_BANK }, + { true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_FLAT_TO_25_DEG_UP }, + { true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_DIAG_FLAT_TO_60_DEG_UP }, + { true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_EIGHTH_TO_ORTHOGONAL }, + { true, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_RIGHT_BANK_TO_25_DEG_DOWN }, + { true, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_RIGHT_BANK_TO_FLAT }, + { true, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_DIAG_RIGHT_BANK }, + { true, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_RIGHT_BANK_TO_25_DEG_UP }, + { true, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_EIGHTH_BANK_TO_ORTHOGONAL }, + { true, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_DIAG_25_DEG_UP_TO_LEFT_BANK }, + { true, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT }, + { true, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_DIAG_25_DEG_UP_TO_RIGHT_BANK }, + { true, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_25_DEG_UP }, + { true, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_DIAG_25_DEG_UP_TO_60_DEG_UP }, + { true, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_60_DEG_UP_TO_FLAT }, + { true, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_60_DEG_UP_TO_25_DEG_UP }, + { true, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_DIAG_60_DEG_UP }, + { false, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_90_DEG_DOWN }, + { false, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_ELEM_90_DEG_DOWN }, + { false, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_90_DEG_DOWN_TO_60_DEG_DOWN }, + { false, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_90_DEG_DOWN }, + { false, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_DOWN }, + { false, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_DOWN_TO_90_DEG_DOWN }, + { false, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_DOWN }, + { false, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_DOWN_TO_25_DEG_DOWN }, + { false, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_DOWN_TO_FLAT }, + { false, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_DOWN }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_3_TILE_25_DEG_DOWN }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_CURVE_LEFT, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_5_TILE_25_DEG_DOWN }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_ELEM_25_DEG_DOWN_LEFT_BANKED }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANKED_25_DEG_DOWN_TO_25_DEG_DOWN }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_25_DEG_DOWN_TO_LEFT_BANKED_FLAT }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANKED_25_DEG_DOWN_TO_FLAT }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_LEFT, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_DOWN }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_25_DEG_DOWN_TO_60_DEG_DOWN }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_ELEM_25_DEG_DOWN_TO_LEFT_BANKED_25_DEG_DOWN }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_25_DEG_DOWN }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_ELEM_25_DEG_DOWN_TO_RIGHT_BANKED_25_DEG_DOWN }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_25_DEG_DOWN_TO_LEFT_BANK }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_25_DEG_DOWN_TO_FLAT }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_25_DEG_DOWN_TO_RIGHT_BANK }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_RIGHT, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_DOWN }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANKED_25_DEG_DOWN_TO_25_DEG_DOWN }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_ELEM_25_DEG_DOWN_RIGHT_BANKED }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANKED_25_DEG_DOWN_TO_FLAT }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_25_DEG_DOWN_TO_RIGHT_BANKED_FLAT }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_5_TILE_25_DEG_DOWN }, + { false, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_3_TILE_25_DEG_DOWN }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_BANK }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_LEFT, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_BANKED_LEFT_QUARTER_TURN_5_TILES }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_LEFT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_EIGHTH_BANK_TO_DIAG }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_FLAT_TO_LEFT_BANKED_25_DEG_DOWN }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANK_TO_25_DEG_DOWN }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANK }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANK_TO_FLAT }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_FLAT_TO_LEFT_BANKED_25_DEG_UP }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANK_TO_25_DEG_UP }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_LEFT, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_LEFT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_EIGHTH_TO_DIAG }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_FLAT_TO_60_DEG_DOWN }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_ELEM_FLAT_TO_LEFT_BANKED_25_DEG_DOWN }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_FLAT_TO_25_DEG_DOWN }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_ELEM_FLAT_TO_RIGHT_BANKED_25_DEG_DOWN }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_FLAT_TO_LEFT_BANK }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_FLAT }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_LEFT_VERY_SMALL, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_VERY_SMALL, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_FLAT_TO_RIGHT_BANK }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_ELEM_FLAT_TO_LEFT_BANKED_25_DEG_UP }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_FLAT_TO_25_DEG_UP }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_ELEM_FLAT_TO_RIGHT_BANKED_25_DEG_UP }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_FLAT_TO_60_DEG_UP }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_EIGHTH_TO_DIAG }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_RIGHT, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANK_TO_25_DEG_DOWN }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_FLAT_TO_RIGHT_BANKED_25_DEG_DOWN }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANK_TO_FLAT }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANK }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANK_TO_25_DEG_UP }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_FLAT_TO_RIGHT_BANKED_25_DEG_UP }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_EIGHTH_BANK_TO_DIAG }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_BANKED_RIGHT_QUARTER_TURN_5_TILES }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_BANK }, + { false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_3_TILE_25_DEG_UP }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_CURVE_LEFT, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_5_TILE_25_DEG_UP }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_25_DEG_UP_TO_LEFT_BANKED_FLAT }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANKED_25_DEG_UP_TO_FLAT }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_ELEM_25_DEG_UP_LEFT_BANKED }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANKED_25_DEG_UP_TO_25_DEG_UP }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_LEFT, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_25_DEG_UP_TO_LEFT_BANK }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_25_DEG_UP_TO_FLAT }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_25_DEG_UP_TO_RIGHT_BANK }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_ELEM_25_DEG_UP_TO_LEFT_BANKED_25_DEG_UP }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_25_DEG_UP }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_ELEM_25_DEG_UP_TO_RIGHT_BANKED_25_DEG_UP }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_25_DEG_UP_TO_60_DEG_UP }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_RIGHT, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANKED_25_DEG_UP_TO_FLAT }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_25_DEG_UP_TO_RIGHT_BANKED_FLAT }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANKED_25_DEG_UP_TO_25_DEG_UP }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_ELEM_25_DEG_UP_RIGHT_BANKED }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_5_TILE_25_DEG_UP }, + { false, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_3_TILE_25_DEG_UP }, + { false, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_UP }, + { false, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_UP_TO_FLAT }, + { false, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_UP_TO_25_DEG_UP }, + { false, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_UP }, + { false, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_UP_TO_90_DEG_UP }, + { false, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_UP }, + { false, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_90_DEG_UP }, + { false, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_90_DEG_UP_TO_60_DEG_UP }, + { false, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_ELEM_90_DEG_UP }, + { false, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_90_DEG_UP }, +}; diff --git a/src/ride/track_data.h b/src/ride/track_data.h index 11a7ec84b8..41e8c37d15 100644 --- a/src/ride/track_data.h +++ b/src/ride/track_data.h @@ -43,3 +43,15 @@ extern const track_curve_chain gFlatRideTrackCurveChain[256]; extern const TRACK_PAINT_FUNCTION_GETTER RideTypeTrackPaintFunctions[91]; extern const uint32 RideTypeTrackPaintFunctionsOld[91]; + +typedef struct { + bool starts_diagonal; + uint8 slope_start; + uint8 bank_start; + uint8 track_curve; + uint8 slope_end; + uint8 bank_end; + uint8 track_element; +} track_descriptor; + +extern const track_descriptor gTrackDescriptors[140]; diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index c85f8edec7..c4cda4f638 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -446,160 +446,6 @@ rct_string_id RideConfigurationStringIds[] = { #pragma endregion - -typedef struct { - bool is_diagonal; - uint8 slope_start; - uint8 bank_start; - uint8 track_curve; - uint8 slope_end; - uint8 bank_end; - uint8 track_element; -} track_descriptor; - -const track_descriptor TrackDescriptors[140] = { - {true, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_DIAG_60_DEG_DOWN}, - {true, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_60_DEG_DOWN_TO_25_DEG_DOWN}, - {true, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_60_DEG_DOWN_TO_FLAT}, - {true, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_DIAG_25_DEG_DOWN_TO_60_DEG_DOWN}, - {true, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_25_DEG_DOWN}, - {true, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_DIAG_25_DEG_DOWN_TO_LEFT_BANK}, - {true, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_25_DEG_DOWN_TO_FLAT}, - {true, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_DIAG_25_DEG_DOWN_TO_RIGHT_BANK}, - {true, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_LEFT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_EIGHTH_BANK_TO_ORTHOGONAL}, - {true, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_LEFT_BANK_TO_25_DEG_DOWN}, - {true, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_DIAG_LEFT_BANK}, - {true, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_LEFT_BANK_TO_FLAT}, - {true, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_LEFT_BANK_TO_25_DEG_UP}, - {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_LEFT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_EIGHTH_TO_ORTHOGONAL}, - {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_DIAG_FLAT_TO_60_DEG_DOWN}, - {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_ELEM_DIAG_FLAT_TO_25_DEG_DOWN}, - {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_DIAG_FLAT_TO_LEFT_BANK}, - {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_FLAT}, - {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_DIAG_FLAT_TO_RIGHT_BANK}, - {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_FLAT_TO_25_DEG_UP}, - {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_DIAG_FLAT_TO_60_DEG_UP}, - {true, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_EIGHTH_TO_ORTHOGONAL}, - {true, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_RIGHT_BANK_TO_25_DEG_DOWN}, - {true, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_RIGHT_BANK_TO_FLAT}, - {true, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_DIAG_RIGHT_BANK}, - {true, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_RIGHT_BANK_TO_25_DEG_UP}, - {true, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_EIGHTH_BANK_TO_ORTHOGONAL}, - {true, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_DIAG_25_DEG_UP_TO_LEFT_BANK}, - {true, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT}, - {true, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_DIAG_25_DEG_UP_TO_RIGHT_BANK}, - {true, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_25_DEG_UP}, - {true, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_DIAG_25_DEG_UP_TO_60_DEG_UP}, - {true, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_DIAG_60_DEG_UP_TO_FLAT}, - {true, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_DIAG_60_DEG_UP_TO_25_DEG_UP}, - {true, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_DIAG_60_DEG_UP}, - {false, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_90_DEG_DOWN}, - {false, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_ELEM_90_DEG_DOWN}, - {false, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_90_DEG_DOWN_TO_60_DEG_DOWN}, - {false, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_90_DEG_DOWN}, - {false, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_DOWN}, - {false, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_90, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_DOWN_TO_90_DEG_DOWN}, - {false, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_DOWN}, - {false, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_DOWN_TO_25_DEG_DOWN}, - {false, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_DOWN_TO_FLAT}, - {false, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_DOWN}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_3_TILE_25_DEG_DOWN}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_CURVE_LEFT, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_5_TILE_25_DEG_DOWN}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_ELEM_25_DEG_DOWN_LEFT_BANKED}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANKED_25_DEG_DOWN_TO_25_DEG_DOWN}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_25_DEG_DOWN_TO_LEFT_BANKED_FLAT}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANKED_25_DEG_DOWN_TO_FLAT}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_LEFT, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_DOWN}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_25_DEG_DOWN_TO_60_DEG_DOWN}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_ELEM_25_DEG_DOWN_TO_LEFT_BANKED_25_DEG_DOWN}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_25_DEG_DOWN}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_ELEM_25_DEG_DOWN_TO_RIGHT_BANKED_25_DEG_DOWN}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_25_DEG_DOWN_TO_LEFT_BANK}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_25_DEG_DOWN_TO_FLAT}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_25_DEG_DOWN_TO_RIGHT_BANK}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_RIGHT, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_DOWN}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANKED_25_DEG_DOWN_TO_25_DEG_DOWN}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_ELEM_25_DEG_DOWN_RIGHT_BANKED}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANKED_25_DEG_DOWN_TO_FLAT}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_25_DEG_DOWN_TO_RIGHT_BANKED_FLAT}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_5_TILE_25_DEG_DOWN}, - {false, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_3_TILE_25_DEG_DOWN}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_BANK}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_LEFT, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_BANKED_LEFT_QUARTER_TURN_5_TILES}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_LEFT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_EIGHTH_BANK_TO_DIAG}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_FLAT_TO_LEFT_BANKED_25_DEG_DOWN}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANK_TO_25_DEG_DOWN}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANK}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANK_TO_FLAT}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_FLAT_TO_LEFT_BANKED_25_DEG_UP}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANK_TO_25_DEG_UP}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_LEFT, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_LEFT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_EIGHTH_TO_DIAG}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_60, TRACK_BANK_NONE, TRACK_ELEM_FLAT_TO_60_DEG_DOWN}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_LEFT, TRACK_ELEM_FLAT_TO_LEFT_BANKED_25_DEG_DOWN}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_FLAT_TO_25_DEG_DOWN}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_ELEM_FLAT_TO_RIGHT_BANKED_25_DEG_DOWN}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_FLAT_TO_LEFT_BANK}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_FLAT}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_LEFT_VERY_SMALL, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_VERY_SMALL, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_FLAT_TO_RIGHT_BANK}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_ELEM_FLAT_TO_LEFT_BANKED_25_DEG_UP}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_FLAT_TO_25_DEG_UP}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_ELEM_FLAT_TO_RIGHT_BANKED_25_DEG_UP}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_FLAT_TO_60_DEG_UP}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_EIGHTH_TO_DIAG}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_RIGHT, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANK_TO_25_DEG_DOWN}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_DOWN_25, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_FLAT_TO_RIGHT_BANKED_25_DEG_DOWN}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANK_TO_FLAT}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANK}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANK_TO_25_DEG_UP}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_FLAT_TO_RIGHT_BANKED_25_DEG_UP}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT_LARGE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_EIGHTH_BANK_TO_DIAG}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_BANKED_RIGHT_QUARTER_TURN_5_TILES}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_BANK}, - {false, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_3_TILE_25_DEG_UP}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_CURVE_LEFT, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_5_TILE_25_DEG_UP}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_LEFT_BANKED_25_DEG_UP_TO_LEFT_BANKED_FLAT}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANKED_25_DEG_UP_TO_FLAT}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_ELEM_25_DEG_UP_LEFT_BANKED}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_BANKED_25_DEG_UP_TO_25_DEG_UP}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_LEFT, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_LEFT, TRACK_ELEM_25_DEG_UP_TO_LEFT_BANK}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_25_DEG_UP_TO_FLAT}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_25_DEG_UP_TO_RIGHT_BANK}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_LEFT, TRACK_ELEM_25_DEG_UP_TO_LEFT_BANKED_25_DEG_UP}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_25_DEG_UP}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_ELEM_25_DEG_UP_TO_RIGHT_BANKED_25_DEG_UP}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_25_DEG_UP_TO_60_DEG_UP}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_RIGHT, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANKED_25_DEG_UP_TO_FLAT}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_25_DEG_UP_TO_RIGHT_BANKED_FLAT}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_BANKED_25_DEG_UP_TO_25_DEG_UP}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_ELEM_25_DEG_UP_RIGHT_BANKED}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_5_TILE_25_DEG_UP}, - {false, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_UP_25, TRACK_BANK_RIGHT, TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_3_TILE_25_DEG_UP}, - {false, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_UP}, - {false, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_NONE, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_UP_TO_FLAT}, - {false, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_25, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_UP_TO_25_DEG_UP}, - {false, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_UP}, - {false, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_ELEM_60_DEG_UP_TO_90_DEG_UP}, - {false, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_UP}, - {false, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_CURVE_LEFT_SMALL, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_90_DEG_UP}, - {false, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_60, TRACK_BANK_NONE, TRACK_ELEM_90_DEG_UP_TO_60_DEG_UP}, - {false, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_CURVE_NONE, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_ELEM_90_DEG_UP}, - {false, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_CURVE_RIGHT_SMALL, TRACK_SLOPE_UP_90, TRACK_BANK_NONE, TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_90_DEG_UP}, -}; - #define _trackPlaceCtrlState RCT2_GLOBAL(0x00F44159, uint8) static int _trackPlaceCtrlZ; #define _trackPlaceShiftState RCT2_GLOBAL(0x00F4415C, uint8) @@ -2535,274 +2381,60 @@ void sub_6C84CE() window_ride_construction_update_widgets(w); } -char *track_curve_description(uint16 trackCurve) { - switch (trackCurve) { - case TRACK_CURVE_NONE: - return "TRACK_CURVE_NONE"; - - case TRACK_CURVE_LEFT: - return "TRACK_CURVE_LEFT"; - - case TRACK_CURVE_RIGHT: - return "TRACK_CURVE_RIGHT"; - - case TRACK_CURVE_LEFT_SMALL: - return "TRACK_CURVE_LEFT_SMALL"; - - case TRACK_CURVE_RIGHT_SMALL: - return "TRACK_CURVE_RIGHT_SMALL"; - - case TRACK_CURVE_LEFT_VERY_SMALL: - return "TRACK_CURVE_LEFT_VERY_SMALL"; - - case TRACK_CURVE_RIGHT_VERY_SMALL: - return "TRACK_CURVE_RIGHT_VERY_SMALL"; - - case TRACK_CURVE_LEFT_LARGE: - return "TRACK_CURVE_LEFT_LARGE"; - - case TRACK_CURVE_RIGHT_LARGE: - return "TRACK_CURVE_RIGHT_LARGE"; - - default: - return ""; - } -} - -char *track_slope_description(uint8 trackSlope) { - switch (trackSlope) { - case TRACK_SLOPE_NONE: - return "TRACK_SLOPE_NONE"; - - case TRACK_SLOPE_UP_25: - return "TRACK_SLOPE_UP_25"; - - case TRACK_SLOPE_UP_60: - return "TRACK_SLOPE_UP_60"; - - case TRACK_SLOPE_DOWN_25: - return "TRACK_SLOPE_DOWN_25"; - - case TRACK_SLOPE_DOWN_60: - return "TRACK_SLOPE_DOWN_60"; - - case TRACK_SLOPE_UP_90: - return "TRACK_SLOPE_UP_90"; - - case TRACK_SLOPE_DOWN_90: - return "TRACK_SLOPE_DOWN_90"; - - default: - return ""; - } -} - -char *track_bank_description(uint8 trackBank) { - switch (trackBank) { - case TRACK_BANK_NONE: - return "TRACK_BANK_NONE"; - - case TRACK_BANK_LEFT: - return "TRACK_BANK_LEFT"; - - case TRACK_BANK_RIGHT: - return "TRACK_BANK_RIGHT"; - - default: - return ""; - } -} - -int log_6CA2DF_ids[255]; - -static void log_6CA2DF(uint8 trackType) { - if (log_6CA2DF_ids[trackType] == 1) { - return;; - } - - log_6CA2DF_ids[trackType] = 1; - - uint8 bl = _previousTrackSlopeEnd; - uint8 bh = _currentTrackSlopeEnd; - uint8 cl = _previousTrackBankEnd; - uint8 ch = _currentTrackBankEnd; - - if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { - bl = _currentTrackSlopeEnd; - bh = _previousTrackSlopeEnd; - cl = _currentTrackBankEnd; - ch = _previousTrackBankEnd; - } - - if (_currentTrackCurve > 8) { - return; - } - - char *string_ax = track_curve_description(_currentTrackCurve); - char *string_bl = track_slope_description(bl); - char *string_bh = track_slope_description(bh); - char *string_cl = track_bank_description(cl); - char *string_ch = track_bank_description(ch); - char *string_lt_4 = (RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) >= 4) ? "true" : "false"; - uint8 rotation = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8); - if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { - rotation = rotation ^ 0x04; - } - char *string_xor_4 = (rotation & (1 << 2)) ? "true" : "false"; - - printf("(%s || %s), %s, %s, %s, %s, %s, %d\n", string_lt_4, string_xor_4, string_bl, string_cl, string_ax, string_bh, string_ch, trackType); -} - -static bool sub_6CA2DF_get_dh(uint8 *dh, bool *must_refactor) { +static bool sub_6CA2DF_get_track_element(uint8 *trackElement) { window_ride_construction_update_enabled_track_pieces(); - uint32 edi = 0; - uint8 bl = _previousTrackSlopeEnd; - uint8 bh = _currentTrackSlopeEnd; - uint8 cl = _previousTrackBankEnd; - uint8 ch = _currentTrackBankEnd; + uint8 startSlope = _previousTrackSlopeEnd; + uint8 endSlope = _currentTrackSlopeEnd; + uint8 startBank = _previousTrackBankEnd; + uint8 endBank = _currentTrackBankEnd; if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { - bl = _currentTrackSlopeEnd; - bh = _previousTrackSlopeEnd; - cl = _currentTrackBankEnd; - ch = _previousTrackBankEnd; + startSlope = _currentTrackSlopeEnd; + endSlope = _previousTrackSlopeEnd; + startBank = _currentTrackBankEnd; + endBank = _previousTrackBankEnd; } - uint16 ax = _currentTrackCurve; - if (ax == 0xFFFF) { + uint16 curve = _currentTrackCurve; + if (curve == 0xFFFF) { return false; } - bool isDiagonal = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) >= 4; - - if (ax == 7 || ax == 8) { - uint8 tmp_dh = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8); + bool startsDiagonal = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) & (1 << 2); + if (curve == TRACK_CURVE_LEFT_LARGE || curve == TRACK_CURVE_RIGHT_LARGE) { if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { - tmp_dh = tmp_dh ^ 0x04; + startsDiagonal = !startsDiagonal; } - - isDiagonal = (tmp_dh & 0x04); } - if (ax <= 8) { + if (curve <= 8) { for (int i = 0; i < 140; i++) { - track_descriptor trackDescriptor = TrackDescriptors[i]; - if (trackDescriptor.track_curve != ax) continue; - if (trackDescriptor.is_diagonal != isDiagonal) continue; - if (trackDescriptor.slope_start != bl) continue; - if (trackDescriptor.slope_end != bh) continue; - if (trackDescriptor.bank_start != cl) continue; - if (trackDescriptor.bank_end != ch) continue; + track_descriptor trackDescriptor = gTrackDescriptors[i]; + if (trackDescriptor.track_curve != curve) continue; + if (trackDescriptor.starts_diagonal != startsDiagonal) continue; + if (trackDescriptor.slope_start != startSlope) continue; + if (trackDescriptor.slope_end != endSlope) continue; + if (trackDescriptor.bank_start != startBank) continue; + if (trackDescriptor.bank_end != endBank) continue; - *dh = trackDescriptor.track_element; - return true; - } - - log_error("missing element"); - *must_refactor = true; - } - - - if (ax == TRACK_CURVE_LEFT_SMALL) { - if (bl == TRACK_SLOPE_DOWN_25 && bh == TRACK_SLOPE_NONE && cl == TRACK_BANK_NONE && ch == TRACK_BANK_LEFT) { - *dh = TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_LEFT_BANK; + *trackElement = trackDescriptor.track_element; return true; } return false; } - if (ax == TRACK_CURVE_RIGHT_SMALL) { - if (bl == TRACK_SLOPE_DOWN_25 && bh == TRACK_SLOPE_NONE && cl == TRACK_BANK_NONE && ch == TRACK_BANK_RIGHT) { - *dh = TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_RIGHT_BANK; - return true; - } - - return false; - } - - if (ax == TRACK_CURVE_LEFT_VERY_SMALL) { - if (bl != bh) { - return false; - } - - if (bl == TRACK_SLOPE_UP_25 || bl == TRACK_SLOPE_DOWN_25) { - return false; - } - - *dh = TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_DOWN; - if (bh == TRACK_SLOPE_DOWN_60) { - return true; - } - - *dh = TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_UP; - if (bh == TRACK_SLOPE_UP_60) { - return true; - } - - *dh = TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_90_DEG_DOWN; - if (bh == TRACK_SLOPE_DOWN_90) { - return true; - } - - *dh = TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_90_DEG_UP; - if (bh == TRACK_SLOPE_UP_90) { - return true; - } - - return false; - } - - if (ax == TRACK_CURVE_RIGHT_VERY_SMALL) { - if (bl != bh) { - return false; - } - - if (bl == TRACK_SLOPE_UP_25 || bl == TRACK_SLOPE_DOWN_25) { - return false; - } - - *dh = TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_DOWN; - if (bh == TRACK_SLOPE_DOWN_60) { - // DOWN_60, ?, RIGHT_VERY_SMALL, DOWN_60, ? - return true; - } - - *dh = TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_UP; - if (bh == TRACK_SLOPE_UP_60) { - // UP_60, ?, RIGHT_VERY_SMALL, UP_60, ? - return true; - } - - *dh = TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_90_DEG_DOWN; - if (bh == TRACK_SLOPE_DOWN_90) { - // DOWN_90, ?, RIGHT_VERY_SMALL, DOWN_90, ? - return true; - } - - *dh = TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_90_DEG_UP; - if (bh == TRACK_SLOPE_UP_90) { - return true; - } - - return false; - } - - if (ax <= 8) { - return false; - } - - *dh = ax & 0xFF; - switch (*dh) { + *trackElement = curve & 0xFF; + switch (*trackElement) { case TRACK_ELEM_END_STATION: case TRACK_ELEM_S_BEND_LEFT: case TRACK_ELEM_S_BEND_RIGHT: - if (bl != 0 || bh != 0) { + if (startSlope != TRACK_SLOPE_NONE || endSlope != TRACK_SLOPE_NONE) { return false; } - if (cl != 0 || ch != 0) { + if (startBank != TRACK_BANK_NONE || endBank != TRACK_BANK_NONE) { return false; } @@ -2810,16 +2442,16 @@ static bool sub_6CA2DF_get_dh(uint8 *dh, bool *must_refactor) { case TRACK_ELEM_LEFT_VERTICAL_LOOP: case TRACK_ELEM_RIGHT_VERTICAL_LOOP: - if (cl != 0 || ch != 0) { + if (startBank != TRACK_BANK_NONE || endBank != TRACK_BANK_NONE) { return false; } - if (_rideConstructionState == 2) { - if (bh != 6) { + if (_rideConstructionState == RIDE_CONSTRUCTION_STATE_BACK) { + if (endSlope != TRACK_SLOPE_DOWN_25) { return false; } } else { - if (bl != 2) { + if (startSlope != TRACK_SLOPE_UP_25) { return false; } } @@ -2848,16 +2480,11 @@ static bool new_sub_6CA2DF(uint8 *_trackType, uint8 *_trackDirection, uint8 *_ri uint8 trackType, trackDirection, rideIndex; uint16 z, x, y, edxRS16; uint32 properties; - bool mustRefactor = false; - if (!sub_6CA2DF_get_dh(&trackType, &mustRefactor)) { + if (!sub_6CA2DF_get_track_element(&trackType)) { return true; } - if (mustRefactor) { - log_6CA2DF(trackType); - } - edxRS16 = 0; rideIndex = _currentRideIndex; if (_currentTrackLiftHill & 1) { From a744f84292ceda3b911818b5d0630ad6b745e150 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Sat, 20 Feb 2016 21:55:12 +0100 Subject: [PATCH 13/13] Clean up property calculation --- src/windows/ride_construction.c | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index c4cda4f638..2a180be04b 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -2478,8 +2478,7 @@ static bool sub_6CA2DF_get_track_element(uint8 *trackElement) { */ static bool new_sub_6CA2DF(uint8 *_trackType, uint8 *_trackDirection, uint8 *_rideIndex, uint16 *_edxRS16, uint16 *_x, uint16 *_y, uint16 *_z, uint16 *_properties) { uint8 trackType, trackDirection, rideIndex; - uint16 z, x, y, edxRS16; - uint32 properties; + uint16 z, x, y, edxRS16, properties; if (!sub_6CA2DF_get_track_element(&trackType)) { return true; @@ -2530,11 +2529,11 @@ static bool new_sub_6CA2DF(uint8 *_trackType, uint8 *_trackDirection, uint8 *_ri } } - z = _currentTrackBeginZ; const rct_track_coordinates *trackCoordinates = get_track_coord_from_ride(ride, trackType); x = _currentTrackBeginX; y = _currentTrackBeginY; + z = _currentTrackBeginZ; if (_rideConstructionState == 2) { z -= trackCoordinates->z_end; trackDirection = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8) ^ 0x02; @@ -2572,7 +2571,6 @@ static bool new_sub_6CA2DF(uint8 *_trackType, uint8 *_trackDirection, uint8 *_ri trackDirection = RCT2_GLOBAL(RCT2_ADDRESS_TRACK_PREVIEW_ROTATION, uint8); } - // loc_6CAEEA: bool do_loc_6CAF26 = false; if (!(_enabledRidePiecesA & (1 << 5))) { @@ -2594,15 +2592,11 @@ static bool new_sub_6CA2DF(uint8 *_trackType, uint8 *_trackDirection, uint8 *_ri } } - // loc_6CAF49: + if (trackType == TRACK_ELEM_BRAKES) { - uint32 ebp = RCT2_GLOBAL(0x00F440CD, uint8) << 16; - properties &= 0xFFFF; - properties |= ebp; + properties = RCT2_GLOBAL(0x00F440CD, uint8); } else { - uint32 ebp = _currentSeatRotationAngle << 26; - properties &= 0xFFFFFFF; - properties |= ebp; + properties = _currentSeatRotationAngle << 12; } @@ -2613,7 +2607,7 @@ static bool new_sub_6CA2DF(uint8 *_trackType, uint8 *_trackDirection, uint8 *_ri if (_x != NULL) *_x = x; if (_y != NULL) *_y = y; if (_z != NULL) *_z = z; - if (_properties != NULL) *_properties = (properties >> 16) & 0xFFFF; + if (_properties != NULL) *_properties = properties; return false; } @@ -2677,7 +2671,7 @@ static bool sub_6CA2DF(int *trackType, int *trackDirection, int *rideIndex, int assert(new_x == original_x); assert(new_y == original_y); assert(new_z == original_z); - //assert(new_properties == original_properties); + assert(new_properties == original_properties); assert(new_currentTrackLiftHill == original_currentTrackLiftHill); if (trackType != NULL) *trackType = original_trackType;