mirror of https://github.com/OpenRCT2/OpenRCT2.git
Part of #9473: Convert vehicle_update_moving_to_end_of_station to Vehicle::UpdateMovingToEndOfStation
This commit is contained in:
parent
857db2925c
commit
3b5f9a372f
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue