From 3f5bd269132e2cedb4b3e1c14719408316cb180b Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 12 Nov 2014 01:32:20 +0000 Subject: [PATCH] implement vehicle_update_doing_circus_show --- src/ride/vehicle.c | 116 ++++++++++++++++++++++++++++++++++++++------- src/ride/vehicle.h | 3 +- 2 files changed, 101 insertions(+), 18 deletions(-) diff --git a/src/ride/vehicle.c b/src/ride/vehicle.c index 1443d972e0..df8a68a9b3 100644 --- a/src/ride/vehicle.c +++ b/src/ride/vehicle.c @@ -33,11 +33,15 @@ #include "vehicle.h" static void vehicle_update(rct_vehicle *vehicle); -static void vehicle_update_moving_to_end_of_station(rct_vehicle *vehicle); -static void vehicle_update_waiting_to_depart(rct_vehicle *vehicle); -static void vehicle_update_departing(rct_vehicle *vehicle); -static void vehicle_update_travelling(rct_vehicle *vehicle); -static void vehicle_update_arriving(rct_vehicle *vehicle); + +static void vehicle_D6_255_update_moving_to_end_of_station(rct_vehicle *vehicle); +static void vehicle_D6_255_update_waiting_to_depart(rct_vehicle *vehicle); +static void vehicle_D6_255_update_departing(rct_vehicle *vehicle); +static void vehicle_D6_255_update_travelling(rct_vehicle *vehicle); +static void vehicle_D6_255_update_arriving(rct_vehicle *vehicle); + +static void vehicle_update_doing_circus_show(rct_vehicle *vehicle); + static void vehicle_update_sound(rct_vehicle *vehicle); static int vehicle_update_scream_sound(rct_vehicle *vehicle); @@ -508,19 +512,19 @@ static void vehicle_update(rct_vehicle *vehicle) if (vehicle->ride_subtype == 255) { switch (vehicle->status) { case VEHICLE_STATUS_MOVING_TO_END_OF_STATION: - vehicle_update_moving_to_end_of_station(vehicle); + vehicle_D6_255_update_moving_to_end_of_station(vehicle); break; case VEHICLE_STATUS_WAITING_TO_DEPART: - vehicle_update_waiting_to_depart(vehicle); + vehicle_D6_255_update_waiting_to_depart(vehicle); break; case VEHICLE_STATUS_DEPARTING: - vehicle_update_departing(vehicle); + vehicle_D6_255_update_departing(vehicle); break; case VEHICLE_STATUS_TRAVELLING: - vehicle_update_travelling(vehicle); + vehicle_D6_255_update_travelling(vehicle); break; case VEHICLE_STATUS_ARRIVING: - vehicle_update_arriving(vehicle); + vehicle_D6_255_update_arriving(vehicle); break; } return; @@ -549,39 +553,92 @@ static void vehicle_update(rct_vehicle *vehicle) } } - int *addressSwitchPtr = (int*)(0x006D7B70 + (vehicle->status * 4)); - RCT2_CALLPROC_X(*addressSwitchPtr, 0, 0, 0, (vehicle->var_51 << 8) | ride->mode, (int)vehicle, 0, 0); + switch (vehicle->status) { + case VEHICLE_STATUS_MOVING_TO_END_OF_STATION: + case VEHICLE_STATUS_WAITING_FOR_PASSENGERS: + case VEHICLE_STATUS_WAITING_TO_DEPART: + case VEHICLE_STATUS_DEPARTING: + case VEHICLE_STATUS_TRAVELLING: + case VEHICLE_STATUS_ARRIVING: + case VEHICLE_STATUS_UNLOADING_PASSENGERS: + case VEHICLE_STATUS_TRAVELLING_07: + case VEHICLE_STATUS_CRASHING: + case VEHICLE_STATUS_CRASHED: + case VEHICLE_STATUS_TRAVELLING_0A: + case VEHICLE_STATUS_SWINGING: + case VEHICLE_STATUS_ROTATING: + case VEHICLE_STATUS_ROTATING_0D: + case VEHICLE_STATUS_OPERATING: + case VEHICLE_STATUS_SHOWING_FILM: + case VEHICLE_STATUS_ROTATING_10: + case VEHICLE_STATUS_OPERATING_11: + case VEHICLE_STATUS_OPERATING_12: + case VEHICLE_STATUS_OPERATING_13: + case VEHICLE_STATUS_WAITING_FOR_CABLE_LIFT: + case VEHICLE_STATUS_TRAVELLING_15: + { + int *addressSwitchPtr = (int*)(0x006D7B70 + (vehicle->status * 4)); + RCT2_CALLPROC_X(*addressSwitchPtr, 0, 0, 0, (vehicle->var_51 << 8) | ride->mode, (int)vehicle, 0, 0); + } + break; + + case VEHICLE_STATUS_DOING_CIRCUS_SHOW: + vehicle_update_doing_circus_show(vehicle); + } vehicle_update_sound(vehicle); } -static void vehicle_update_moving_to_end_of_station(rct_vehicle *vehicle) +static void vehicle_D6_255_update_moving_to_end_of_station(rct_vehicle *vehicle) { RCT2_CALLPROC_X(0x006DF8A4, 0, 0, 0, 0, (int)vehicle, 0, 0); } -static void vehicle_update_waiting_to_depart(rct_vehicle *vehicle) +static void vehicle_D6_255_update_waiting_to_depart(rct_vehicle *vehicle) { RCT2_CALLPROC_X(0x006DF8F1, 0, 0, 0, 0, (int)vehicle, 0, 0); } -static void vehicle_update_departing(rct_vehicle *vehicle) +static void vehicle_D6_255_update_departing(rct_vehicle *vehicle) { RCT2_CALLPROC_X(0x006DF97A, 0, 0, 0, 0, (int)vehicle, 0, 0); } -static void vehicle_update_travelling(rct_vehicle *vehicle) +static void vehicle_D6_255_update_travelling(rct_vehicle *vehicle) { RCT2_CALLPROC_X(0x006DF99C, 0, 0, 0, 0, (int)vehicle, 0, 0); } -static void vehicle_update_arriving(rct_vehicle *vehicle) +static void vehicle_D6_255_update_arriving(rct_vehicle *vehicle) { vehicle->var_51++; if (vehicle->var_51 >= 64) vehicle->status = VEHICLE_STATUS_MOVING_TO_END_OF_STATION; } +/** + * + * rct2: 0x006D95F7 + */ +static void vehicle_update_doing_circus_show(rct_vehicle *vehicle) +{ + int currentTime, totalTime; + + if (RCT2_GLOBAL(0x00F64E34, uint8) == 0) + return; + + totalTime = *(RCT2_ADDRESS(0x009A0AB4, uint16*)[vehicle->var_51]); + currentTime = vehicle->var_4C + 1; + if (currentTime <= totalTime) { + vehicle->var_4C = currentTime; + } else { + vehicle->status = VEHICLE_STATUS_ARRIVING; + vehicle_invalidate_window(vehicle); + vehicle->var_51 = 0; + vehicle->var_C0 = 0; + } +} + /** * * rct2: 0x006D7888 @@ -960,3 +1017,28 @@ int vehicle_get_total_num_peeps(rct_vehicle *vehicle) return numPeeps; } + +/** + * + * rct2: 0x006DA1EC + */ +void vehicle_invalidate_window(rct_vehicle *vehicle) +{ + int viewVehicleIndex; + rct_ride *ride; + rct_window *w; + + w = window_find_by_number(WC_RIDE, vehicle->ride); + if (w == NULL) + return; + + ride = GET_RIDE(vehicle->ride); + viewVehicleIndex = w->ride.view - 1; + if (viewVehicleIndex < 0 || viewVehicleIndex >= ride->num_vehicles) + return; + + if (vehicle->sprite_index != ride->vehicles[viewVehicleIndex]) + return; + + window_invalidate(w); +} diff --git a/src/ride/vehicle.h b/src/ride/vehicle.h index 7fa5ac8535..4ae4c5f8f9 100644 --- a/src/ride/vehicle.h +++ b/src/ride/vehicle.h @@ -149,7 +149,7 @@ typedef struct { uint8 sound2_id; // 0xBD uint8 sound2_volume; // 0xBE sint8 var_BF; - uint8 pad_C0[2]; + uint16 var_C0; uint8 speed; // 0xC2 uint8 acceleration; // 0xC3 uint8 var_C4; @@ -282,6 +282,7 @@ bool sub_6DD365(rct_vehicle *vehicle); int sub_6DAB4C(rct_vehicle *vehicle, int *outStation); rct_ride_type_vehicle *vehicle_get_vehicle_entry(rct_vehicle *vehicle); int vehicle_get_total_num_peeps(rct_vehicle *vehicle); +void vehicle_invalidate_window(rct_vehicle *vehicle); /** Helper macro until rides are stored in this module. */ #define GET_VEHICLE(sprite_index) &(g_sprite_list[sprite_index].vehicle)