diff --git a/src/ride/track.c b/src/ride/track.c index 3a77514fb5..01fdd09311 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -2385,33 +2385,16 @@ int track_delete() int track_is_connected_by_shape(rct_map_element *a, rct_map_element *b) { int trackType, aBank, aAngle, bBank, bAngle; - rct_ride *ride; - ride = GET_RIDE(a->properties.track.ride_index); trackType = a->properties.track.type; aBank = gTrackDefinitions[trackType].bank_end; aAngle = gTrackDefinitions[trackType].vangle_end; - if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_3) { - if (a->properties.track.colour & 4) { - if (aBank == TRACK_BANK_NONE) - aBank = TRACK_BANK_UPSIDE_DOWN; - else if (aBank == TRACK_BANK_UPSIDE_DOWN) - aBank = TRACK_BANK_NONE; - } - } + aBank = track_get_actual_bank(a, aBank); - ride = GET_RIDE(b->properties.track.ride_index); trackType = b->properties.track.type; bBank = gTrackDefinitions[trackType].bank_start; bAngle = gTrackDefinitions[trackType].vangle_start; - if (RideData4[ride->type].flags & RIDE_TYPE_FLAG4_3) { - if (b->properties.track.colour & 4) { - if (bBank == TRACK_BANK_NONE) - bBank = TRACK_BANK_UPSIDE_DOWN; - else if (bBank == TRACK_BANK_UPSIDE_DOWN) - bBank = TRACK_BANK_NONE; - } - } + bBank = track_get_actual_bank(b, bBank); return aBank == bBank && aAngle == bAngle; } @@ -4957,3 +4940,24 @@ void track_element_set_cable_lift(rct_map_element *trackElement) { void track_element_clear_cable_lift(rct_map_element *trackElement) { trackElement->properties.track.colour &= ~TRACK_ELEMENT_COLOUR_FLAG_CABLE_LIFT; } + +int track_get_actual_bank(rct_map_element *mapElement, int bank) +{ + rct_ride *ride = GET_RIDE(mapElement->properties.track.ride_index); + int trackColour = mapElement->properties.track.colour; + return track_get_actual_bank_2(ride->type, trackColour, bank); +} + +int track_get_actual_bank_2(int rideType, int trackColour, int bank) +{ + if (RideData4[rideType].flags & RIDE_TYPE_FLAG4_3) { + if (trackColour & 4) { + if (bank == TRACK_BANK_NONE) { + bank = TRACK_BANK_UPSIDE_DOWN; + } else if (bank == TRACK_BANK_UPSIDE_DOWN) { + bank = TRACK_BANK_NONE; + } + } + } + return bank; +} diff --git a/src/ride/track.h b/src/ride/track.h index a973cba0c4..c526f7d5f2 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -553,4 +553,7 @@ bool track_element_is_cable_lift(rct_map_element *trackElement); void track_element_set_cable_lift(rct_map_element *trackElement); void track_element_clear_cable_lift(rct_map_element *trackElement); +int track_get_actual_bank(rct_map_element *mapElement, int bank); +int track_get_actual_bank_2(int rideType, int trackColour, int bank); + #endif diff --git a/src/ride/vehicle.c b/src/ride/vehicle.c index a0a1b69dae..212080056a 100644 --- a/src/ride/vehicle.c +++ b/src/ride/vehicle.c @@ -840,6 +840,33 @@ static void vehicle_update_scenery_door(rct_vehicle *vehicle) RCT2_CALLPROC_X(0x006DEE93, 0, 0, 0, 0, (int)vehicle, 0, 0); } +/** + * + * rct2: 0x006DB38B + */ +static bool loc_6DB38B(rct_vehicle *vehicle, rct_map_element *mapElement) +{ + uint8 colourThingToXor = (vehicle->update_flags >> 9) & 8; + int trackType = mapElement->properties.track.type; + + // Get bank + int rideType = GET_RIDE(mapElement->properties.track.ride_index)->type; + int trackColour = mapElement->properties.track.colour ^ colourThingToXor; + int bankStart = gTrackDefinitions[trackType].bank_start; + bankStart = track_get_actual_bank_2(rideType, trackColour, bankStart); + + // Get vangle + int vangleStart = gTrackDefinitions[trackType].vangle_start; + + // ? + uint16 angleAndBank = vangleStart | (bankStart << 8); + if (angleAndBank != RCT2_GLOBAL(0x00F64E36, uint16)) { + return false; + } + + return true; +} + /** * * rct2: 0x006DAB4C @@ -1054,14 +1081,22 @@ loc_6DB358: } } -// loc_6DB38B: - regs.esi = vehicle; - regs.edi = mapElement; - RCT2_CALLFUNC_Y(0x006DB38B, ®s); - goto end; + if (!loc_6DB38B(vehicle, mapElement)) { + goto loc_6DB94A; + } + + // Update VEHICLE_UPDATE_FLAG_11 flag + vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_11; + int rideType = GET_RIDE(mapElement->properties.track.ride_index)->type; + if (RideData4[rideType].flags & RIDE_TYPE_FLAG4_3) { + if (mapElement->properties.track.colour & 4) { + vehicle->update_flags |= VEHICLE_UPDATE_FLAG_11; + } + } loc_6DB41D: regs.esi = vehicle; + regs.edi = mapElement; RCT2_CALLFUNC_Y(0x006DB41D, ®s); goto end;