Part of #9473: Convert vehicle_update_moving_to_end_of_station to Vehicle::UpdateMovingToEndOfStation

This commit is contained in:
hdpoliveira 2020-04-10 02:26:03 -03:00
parent 857db2925c
commit 3b5f9a372f
2 changed files with 94 additions and 93 deletions

View File

@ -50,8 +50,6 @@ static void vehicle_claxon(const Vehicle* vehicle);
static void vehicle_update_showing_film(Vehicle* vehicle); static void vehicle_update_showing_film(Vehicle* vehicle);
static void vehicle_update_doing_circus_show(Vehicle* vehicle); static void vehicle_update_doing_circus_show(Vehicle* vehicle);
static void vehicle_update_moving_to_end_of_station(Vehicle* vehicle);
static void vehicle_update_waiting_for_passengers(Vehicle* vehicle);
static void vehicle_update_waiting_to_depart(Vehicle* vehicle); static void vehicle_update_waiting_to_depart(Vehicle* vehicle);
static void vehicle_update_departing(Vehicle* vehicle); static void vehicle_update_departing(Vehicle* vehicle);
static void vehicle_finish_departing(Vehicle* vehicle); static void vehicle_finish_departing(Vehicle* vehicle);
@ -1998,10 +1996,10 @@ void Vehicle::Update()
switch (status) switch (status)
{ {
case VEHICLE_STATUS_MOVING_TO_END_OF_STATION: case VEHICLE_STATUS_MOVING_TO_END_OF_STATION:
vehicle_update_moving_to_end_of_station(this); UpdateMovingToEndOfStation();
break; break;
case VEHICLE_STATUS_WAITING_FOR_PASSENGERS: case VEHICLE_STATUS_WAITING_FOR_PASSENGERS:
vehicle_update_waiting_for_passengers(this); UpdateWaitingForPassengers();
break; break;
case VEHICLE_STATUS_WAITING_TO_DEPART: case VEHICLE_STATUS_WAITING_TO_DEPART:
vehicle_update_waiting_to_depart(this); vehicle_update_waiting_to_depart(this);
@ -2074,31 +2072,31 @@ void Vehicle::Update()
* *
* rct2: 0x006D7BCC * rct2: 0x006D7BCC
*/ */
static void vehicle_update_moving_to_end_of_station(Vehicle* vehicle) void Vehicle::UpdateMovingToEndOfStation()
{ {
auto ride = get_ride(vehicle->ride); auto curRide = get_ride(ride);
if (ride == nullptr) if (curRide == nullptr)
return; return;
int32_t flags, station; int32_t curFlags, station;
switch (ride->mode) switch (curRide->mode)
{ {
case RIDE_MODE_UPWARD_LAUNCH: case RIDE_MODE_UPWARD_LAUNCH:
case RIDE_MODE_ROTATING_LIFT: case RIDE_MODE_ROTATING_LIFT:
case RIDE_MODE_DOWNWARD_LAUNCH: case RIDE_MODE_DOWNWARD_LAUNCH:
case RIDE_MODE_FREEFALL_DROP: case RIDE_MODE_FREEFALL_DROP:
if (vehicle->velocity >= -131940) if (velocity >= -131940)
{ {
vehicle->acceleration = -3298; acceleration = -3298;
} }
if (vehicle->velocity < -131940) if (velocity < -131940)
{ {
vehicle->velocity -= vehicle->velocity / 16; velocity -= velocity / 16;
vehicle->acceleration = 0; acceleration = 0;
} }
flags = vehicle_update_track_motion(vehicle, &station); curFlags = vehicle_update_track_motion(this, &station);
if (!(flags & VEHICLE_UPDATE_MOTION_TRACK_FLAG_5)) if (!(curFlags & VEHICLE_UPDATE_MOTION_TRACK_FLAG_5))
break; break;
[[fallthrough]]; [[fallthrough]];
case RIDE_MODE_BUMPERCAR: case RIDE_MODE_BUMPERCAR:
@ -2118,63 +2116,63 @@ static void vehicle_update_moving_to_end_of_station(Vehicle* vehicle)
case RIDE_MODE_HAUNTED_HOUSE: case RIDE_MODE_HAUNTED_HOUSE:
case RIDE_MODE_CROOKED_HOUSE: case RIDE_MODE_CROOKED_HOUSE:
case RIDE_MODE_CIRCUS_SHOW: case RIDE_MODE_CIRCUS_SHOW:
vehicle->current_station = 0; current_station = 0;
vehicle->velocity = 0; velocity = 0;
vehicle->acceleration = 0; acceleration = 0;
vehicle->SetState(VEHICLE_STATUS_WAITING_FOR_PASSENGERS); SetState(VEHICLE_STATUS_WAITING_FOR_PASSENGERS);
break; break;
default: default:
{ {
rct_ride_entry* rideEntry = get_ride_entry(vehicle->ride_subtype); rct_ride_entry* rideEntry = get_ride_entry(ride_subtype);
if (rideEntry == nullptr) if (rideEntry == nullptr)
{ {
return; return;
} }
rct_ride_entry_vehicle* vehicleEntry = &rideEntry->vehicles[vehicle->vehicle_type]; rct_ride_entry_vehicle* vehicleEntry = &rideEntry->vehicles[vehicle_type];
if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_POWERED)) if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_POWERED))
{ {
if (vehicle->velocity <= 131940) if (velocity <= 131940)
{ {
vehicle->acceleration = 3298; acceleration = 3298;
} }
} }
if (vehicle->velocity > 131940) if (velocity > 131940)
{ {
vehicle->velocity -= vehicle->velocity / 16; velocity -= velocity / 16;
vehicle->acceleration = 0; acceleration = 0;
} }
flags = vehicle_update_track_motion(vehicle, &station); curFlags = vehicle_update_track_motion(this, &station);
if (flags & VEHICLE_UPDATE_MOTION_TRACK_FLAG_1) if (curFlags & VEHICLE_UPDATE_MOTION_TRACK_FLAG_1)
{ {
vehicle->velocity = 0; velocity = 0;
vehicle->acceleration = 0; acceleration = 0;
vehicle->sub_state++; sub_state++;
if (ride->mode == RIDE_MODE_RACE && vehicle->sub_state >= 40) if (curRide->mode == RIDE_MODE_RACE && sub_state >= 40)
{ {
vehicle->SetState(VEHICLE_STATUS_WAITING_FOR_PASSENGERS); SetState(VEHICLE_STATUS_WAITING_FOR_PASSENGERS);
break; break;
} }
} }
else else
{ {
if (vehicle->velocity > 98955) if (velocity > 98955)
{ {
vehicle->sub_state = 0; sub_state = 0;
} }
} }
if (!(flags & VEHICLE_UPDATE_MOTION_TRACK_FLAG_VEHICLE_AT_STATION)) if (!(curFlags & VEHICLE_UPDATE_MOTION_TRACK_FLAG_VEHICLE_AT_STATION))
break; break;
vehicle->current_station = station; current_station = station;
vehicle->velocity = 0; velocity = 0;
vehicle->acceleration = 0; acceleration = 0;
vehicle->SetState(VEHICLE_STATUS_WAITING_FOR_PASSENGERS); SetState(VEHICLE_STATUS_WAITING_FOR_PASSENGERS);
break; break;
} }
} }
@ -2261,53 +2259,53 @@ static std::optional<uint32_t> ride_get_train_index_from_vehicle(Ride* ride, uin
* *
* rct2: 0x006D7DA1 * rct2: 0x006D7DA1
*/ */
static void vehicle_update_waiting_for_passengers(Vehicle* vehicle) void Vehicle::UpdateWaitingForPassengers()
{ {
vehicle->velocity = 0; velocity = 0;
auto ride = get_ride(vehicle->ride); auto curRide = get_ride(ride);
if (ride == nullptr) if (curRide == nullptr)
return; return;
if (vehicle->sub_state == 0) if (sub_state == 0)
{ {
if (!vehicle_open_restraints(vehicle)) if (!vehicle_open_restraints(this))
return; return;
if (ride_get_entrance_location(ride, vehicle->current_station).isNull()) if (ride_get_entrance_location(curRide, current_station).isNull())
{ {
ride->stations[vehicle->current_station].TrainAtStation = RideStation::NO_TRAIN; curRide->stations[current_station].TrainAtStation = RideStation::NO_TRAIN;
vehicle->sub_state = 2; sub_state = 2;
return; return;
} }
auto trainIndex = ride_get_train_index_from_vehicle(ride, vehicle->sprite_index); auto trainIndex = ride_get_train_index_from_vehicle(curRide, sprite_index);
if (!trainIndex) if (!trainIndex)
{ {
return; return;
} }
if (ride->stations[vehicle->current_station].TrainAtStation != RideStation::NO_TRAIN) if (curRide->stations[current_station].TrainAtStation != RideStation::NO_TRAIN)
return; return;
ride->stations[vehicle->current_station].TrainAtStation = *trainIndex; curRide->stations[current_station].TrainAtStation = *trainIndex;
vehicle->sub_state = 1; sub_state = 1;
vehicle->time_waiting = 0; time_waiting = 0;
vehicle->Invalidate(); Invalidate();
return; return;
} }
else if (vehicle->sub_state == 1) else if (sub_state == 1)
{ {
if (vehicle->time_waiting != 0xFFFF) if (time_waiting != 0xFFFF)
vehicle->time_waiting++; time_waiting++;
vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART; update_flags &= ~VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART;
// 0xF64E31, 0xF64E32, 0xF64E33 // 0xF64E31, 0xF64E32, 0xF64E33
uint8_t num_peeps_on_train = 0, num_used_seats_on_train = 0, num_seats_on_train = 0; uint8_t num_peeps_on_train = 0, num_used_seats_on_train = 0, num_seats_on_train = 0;
for (uint16_t sprite_id = vehicle->sprite_index; sprite_id != SPRITE_INDEX_NULL;) for (uint16_t sprite_id = sprite_index; sprite_id != SPRITE_INDEX_NULL;)
{ {
Vehicle* train_vehicle = GET_VEHICLE(sprite_id); Vehicle* train_vehicle = GET_VEHICLE(sprite_id);
@ -2320,11 +2318,11 @@ static void vehicle_update_waiting_for_passengers(Vehicle* vehicle)
num_seats_on_train &= 0x7F; num_seats_on_train &= 0x7F;
if (ride->SupportsStatus(RIDE_STATUS_TESTING)) if (curRide->SupportsStatus(RIDE_STATUS_TESTING))
{ {
if (vehicle->time_waiting < 20) if (time_waiting < 20)
{ {
train_ready_to_depart(vehicle, num_peeps_on_train, num_used_seats_on_train); train_ready_to_depart(this, num_peeps_on_train, num_used_seats_on_train);
return; return;
} }
} }
@ -2332,40 +2330,40 @@ static void vehicle_update_waiting_for_passengers(Vehicle* vehicle)
{ {
if (num_peeps_on_train == 0) if (num_peeps_on_train == 0)
{ {
train_ready_to_depart(vehicle, num_peeps_on_train, num_used_seats_on_train); train_ready_to_depart(this, num_peeps_on_train, num_used_seats_on_train);
return; return;
} }
} }
if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS)) if (ride_type_has_flag(curRide->type, RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS))
{ {
if (ride->depart_flags & RIDE_DEPART_WAIT_FOR_MINIMUM_LENGTH) if (curRide->depart_flags & RIDE_DEPART_WAIT_FOR_MINIMUM_LENGTH)
{ {
if (ride->min_waiting_time * 32 > vehicle->time_waiting) if (curRide->min_waiting_time * 32 > time_waiting)
{ {
train_ready_to_depart(vehicle, num_peeps_on_train, num_used_seats_on_train); train_ready_to_depart(this, num_peeps_on_train, num_used_seats_on_train);
return; return;
} }
} }
if (ride->depart_flags & RIDE_DEPART_WAIT_FOR_MAXIMUM_LENGTH) if (curRide->depart_flags & RIDE_DEPART_WAIT_FOR_MAXIMUM_LENGTH)
{ {
if (ride->max_waiting_time * 32 < vehicle->time_waiting) if (curRide->max_waiting_time * 32 < time_waiting)
{ {
vehicle->update_flags |= VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART; update_flags |= VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART;
train_ready_to_depart(vehicle, num_peeps_on_train, num_used_seats_on_train); train_ready_to_depart(this, num_peeps_on_train, num_used_seats_on_train);
return; return;
} }
} }
} }
if (ride->depart_flags & RIDE_DEPART_LEAVE_WHEN_ANOTHER_ARRIVES) if (curRide->depart_flags & RIDE_DEPART_LEAVE_WHEN_ANOTHER_ARRIVES)
{ {
for (auto train_id : ride->vehicles) for (auto train_id : curRide->vehicles)
{ {
if (train_id == SPRITE_INDEX_NULL) if (train_id == SPRITE_INDEX_NULL)
continue; continue;
if (train_id == vehicle->sprite_index) if (train_id == sprite_index)
continue; continue;
Vehicle* train = GET_VEHICLE(train_id); Vehicle* train = GET_VEHICLE(train_id);
@ -2373,27 +2371,28 @@ static void vehicle_update_waiting_for_passengers(Vehicle* vehicle)
if (train->status == VEHICLE_STATUS_UNLOADING_PASSENGERS if (train->status == VEHICLE_STATUS_UNLOADING_PASSENGERS
|| train->status == VEHICLE_STATUS_MOVING_TO_END_OF_STATION) || train->status == VEHICLE_STATUS_MOVING_TO_END_OF_STATION)
{ {
if (train->current_station == vehicle->current_station) if (train->current_station == current_station)
{ {
vehicle->update_flags |= VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART; update_flags |= VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART;
train_ready_to_depart(vehicle, num_peeps_on_train, num_used_seats_on_train); train_ready_to_depart(this, num_peeps_on_train, num_used_seats_on_train);
return; return;
} }
} }
} }
} }
if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS) && ride->depart_flags & RIDE_DEPART_WAIT_FOR_LOAD) if (ride_type_has_flag(curRide->type, RIDE_TYPE_FLAG_HAS_LOAD_OPTIONS)
&& curRide->depart_flags & RIDE_DEPART_WAIT_FOR_LOAD)
{ {
if (num_peeps_on_train == num_seats_on_train) if (num_peeps_on_train == num_seats_on_train)
{ {
vehicle->update_flags |= VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART; update_flags |= VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART;
train_ready_to_depart(vehicle, num_peeps_on_train, num_used_seats_on_train); train_ready_to_depart(this, num_peeps_on_train, num_used_seats_on_train);
return; return;
} }
// any load: load=4 , full: load=3 , 3/4s: load=2 , half: load=1 , quarter: load=0 // any load: load=4 , full: load=3 , 3/4s: load=2 , half: load=1 , quarter: load=0
uint8_t load = ride->depart_flags & RIDE_DEPART_WAIT_FOR_LOAD_MASK; uint8_t load = curRide->depart_flags & RIDE_DEPART_WAIT_FOR_LOAD_MASK;
// We want to wait for ceiling((load+1)/4 * num_seats_on_train) peeps, the +3 below is used instead of // We want to wait for ceiling((load+1)/4 * num_seats_on_train) peeps, the +3 below is used instead of
// ceil() to prevent issues on different cpus/platforms with floats. Note that vanilla RCT1/2 rounded // ceil() to prevent issues on different cpus/platforms with floats. Note that vanilla RCT1/2 rounded
@ -2404,29 +2403,29 @@ static void vehicle_update_waiting_for_passengers(Vehicle* vehicle)
peepTarget = 1; peepTarget = 1;
if (num_peeps_on_train >= peepTarget) if (num_peeps_on_train >= peepTarget)
vehicle->update_flags |= VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART; update_flags |= VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART;
train_ready_to_depart(vehicle, num_peeps_on_train, num_used_seats_on_train); train_ready_to_depart(this, num_peeps_on_train, num_used_seats_on_train);
return; return;
} }
vehicle->update_flags |= VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART; update_flags |= VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART;
train_ready_to_depart(vehicle, num_peeps_on_train, num_used_seats_on_train); train_ready_to_depart(this, num_peeps_on_train, num_used_seats_on_train);
return; return;
} }
if (!vehicle_close_restraints(vehicle)) if (!vehicle_close_restraints(this))
return; return;
vehicle->velocity = 0; velocity = 0;
vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_WAIT_ON_ADJACENT; update_flags &= ~VEHICLE_UPDATE_FLAG_WAIT_ON_ADJACENT;
if (ride->depart_flags & RIDE_DEPART_SYNCHRONISE_WITH_ADJACENT_STATIONS) if (curRide->depart_flags & RIDE_DEPART_SYNCHRONISE_WITH_ADJACENT_STATIONS)
{ {
vehicle->update_flags |= VEHICLE_UPDATE_FLAG_WAIT_ON_ADJACENT; update_flags |= VEHICLE_UPDATE_FLAG_WAIT_ON_ADJACENT;
} }
vehicle->SetState(VEHICLE_STATUS_WAITING_TO_DEPART); SetState(VEHICLE_STATUS_WAITING_TO_DEPART);
} }
/** /**

View File

@ -308,6 +308,8 @@ private:
uint16_t GetSoundPriority() const; uint16_t GetSoundPriority() const;
rct_vehicle_sound_params CreateSoundParam(uint16_t priority) const; rct_vehicle_sound_params CreateSoundParam(uint16_t priority) const;
void CableLiftUpdate(); void CableLiftUpdate();
void UpdateMovingToEndOfStation();
void UpdateWaitingForPassengers();
}; };
struct train_ref struct train_ref