diff --git a/src/ride/ride.h b/src/ride/ride.h index ae8a5a8cd8..6afd1124a3 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -232,13 +232,20 @@ typedef struct { // (in RCT2, display_speed = (max_speed * 9) >> 18) sint32 max_speed; // 0x0D8 sint32 average_speed; // 0x0DC - uint8 pad_0E0[4]; + uint8 var_0E0; + uint8 var_0E1; + uint8 pad_0E2[0x2]; sint32 length[4]; // 0x0E4 uint16 time[4]; // 0x0F4 fixed16_2dp max_positive_vertical_g; // 0x0FC fixed16_2dp max_negative_vertical_g; // 0x0FE fixed16_2dp max_lateral_g; // 0x100 - uint8 pad_102[0xC]; + fixed16_2dp previous_vertical_g;// 0x102 + fixed16_2dp previous_lateral_g; // 0x104 + uint8 pad_106[0x2]; + uint32 var_108; + // x y map location + uint16 var_10C; uint16 var_10E; uint16 var_110; uint16 var_112; @@ -253,7 +260,7 @@ typedef struct { uint8 var_116; uint8 highest_drop_height; // 0x117 sint32 sheltered_length; // 0x118 - uint8 pad_11C[0x2]; + uint16 var_11C; uint8 num_sheltered_sections; // 0x11E uint8 var_11F; sint16 var_120; @@ -358,7 +365,7 @@ typedef struct { uint32 lifecycle_flags; // 0x1D0 uint8 vehicle_colours_extended[32]; // 0x1D4 uint16 total_air_time; // 0x1F4 - uint8 pad_1F6; + uint8 var_1F6; uint8 num_circuits; // 0x1F7 sint16 cable_lift_x; // 0x1F8 sint16 cable_lift_y; // 0x1FA diff --git a/src/ride/vehicle.c b/src/ride/vehicle.c index df8a68a9b3..0871114590 100644 --- a/src/ride/vehicle.c +++ b/src/ride/vehicle.c @@ -475,6 +475,99 @@ static void sub_6D6D1F(rct_vehicle *vehicle) rct_ride *ride; ride = GET_RIDE(vehicle->ride); + + if (vehicle->status == VEHICLE_STATUS_TRAVELLING_07){ + ride->lifecycle_flags |= RIDE_LIFECYCLE_TESTED; + ride->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS; + ride->lifecycle_flags &= ~RIDE_LIFECYCLE_TEST_IN_PROGRESS; + vehicle->var_48 &= ~(1 << 1); + window_invalidate_by_number(WC_RIDE, vehicle->ride); + return; + } + + uint8 entrance = ride->var_1F6; + if (ride->entrances[entrance] != 0xFFFF){ + + //ecx + uint8 var_E0 = ride->var_0E0; + + ride->var_0E1++; + if (ride->var_0E1 >= 32)ride->var_0E1 = 0; + + sint32 velocity = abs(vehicle->velocity); + if (velocity > ride->max_speed){ + ride->max_speed = velocity; + } + + if (ride->var_0E1 == 0 && velocity > 0x8000){ + ride->average_speed += velocity; + ride->time[var_E0]++; + } + + sint32 distance = abs(((vehicle->velocity + vehicle->var_2C) / 1024) * 42); + if (vehicle->var_CE != 0){ + ride->length[var_E0] += distance; + } + + if (RCT2_ADDRESS(RCT2_ADDRESS_RIDE_FLAGS, uint32)[ride->type * 2] & RIDE_TYPE_FLAG_HAS_G_FORCES){ + int vertical_g, lateral_g; + vehicle_get_g_forces(vehicle, &vertical_g, &lateral_g); + + vertical_g += ride->previous_vertical_g; + lateral_g += ride->previous_lateral_g; + vertical_g /= 2; + lateral_g /= 2; + + ride->previous_vertical_g = vertical_g; + ride->previous_lateral_g = lateral_g; + + if (vertical_g <= 0){ + ride->total_air_time++; + } + + if (vertical_g > ride->max_positive_vertical_g) + ride->max_positive_vertical_g = vertical_g; + + if (vertical_g < ride->max_negative_vertical_g) + ride->max_negative_vertical_g = vertical_g; + + lateral_g = abs(lateral_g); + + if (lateral_g > ride->max_lateral_g) + ride->max_lateral_g = lateral_g; + } + } + + uint16 map_location = (vehicle->var_38 / 32) | ((vehicle->var_3A / 32) << 8); + if (vehicle->var_3C / 8 != ride->var_11F && map_location != ride->var_10C){ + ride->var_11F = vehicle->var_3C / 8; + ride->var_10C = map_location; + + if (ride->entrances[ride->var_1F6] != 0xFFFF){ + + sint16 var_36 = vehicle->var_36 / 4; + if (var_36 == 182 || !(vehicle->var_48 & (1<<0))){ + if (!(ride->var_108 & (1 << 6))){ + ride->var_108 |= (1 << 6); + if (ride->drops + 64 < 0xFF){ + ride->drops += 64; + } + } + } + else{ + ride->var_108 &= ~(1 << 6); + } + + if (ride->type == RIDE_TYPE_WATER_COASTER){ + if (var_36 >= 68 && var_36 < 87){ + ride->special_track_elements |= (1 << 5); + } + } + + //0x6d6edf + } + } + //6d7211 RCT2_CALLPROC_X(0x006D6D1F, 0, 0, 0, 0, (int)vehicle, (int)ride, 0); } diff --git a/src/ride/vehicle.h b/src/ride/vehicle.h index 4ae4c5f8f9..9ab2cd7759 100644 --- a/src/ride/vehicle.h +++ b/src/ride/vehicle.h @@ -106,7 +106,7 @@ typedef struct { uint8 pad_21[3]; uint32 var_24; sint32 velocity; // 0x28 - uint32 var_2C; + sint32 var_2C; uint8 ride; // 0x30 uint8 vehicle_type; // 0x31 rct_vehicle_colour colours; // 0x32