1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-24 07:14:31 +01:00

implement more sub_6DAB4C

This commit is contained in:
IntelOrca
2015-11-22 12:14:53 +00:00
parent 1527a443b8
commit eaef1bf08e
3 changed files with 66 additions and 24 deletions

View File

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

View File

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

View File

@@ -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, &regs);
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, &regs);
goto end;