1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-04 13:42:55 +01:00

Refactor loc_6DDF9C (#13369)

* Move ride_create_vehicles into Ride

* Refactor loc_6DDF9C
This commit is contained in:
Manuel Vögele
2020-11-04 16:58:24 +01:00
committed by GitHub
parent 88b73d8716
commit ef51cfb29c
2 changed files with 30 additions and 28 deletions

View File

@@ -138,7 +138,6 @@ static void ride_inspection_update(Ride* ride);
static void ride_mechanic_status_update(Ride* ride, int32_t mechanicStatus);
static void ride_music_update(Ride* ride);
static void ride_shop_connected(Ride* ride);
void loc_6DDF9C(Ride* ride, TileElement* tileElement);
RideManager GetRideManager()
{
@@ -4699,19 +4698,19 @@ static void ride_create_vehicles_find_first_block(Ride* ride, CoordsXYE* outXYEl
}
/**
*
* Create and place the rides vehicles
* rct2: 0x006DD84C
*/
static bool ride_create_vehicles(Ride* ride, const CoordsXYE& element, int32_t isApplying)
bool Ride::CreateVehicles(const CoordsXYE& element, bool isApplying)
{
ride->UpdateMaxVehicles();
if (ride->subtype == RIDE_ENTRY_INDEX_NULL)
UpdateMaxVehicles();
if (subtype == RIDE_ENTRY_INDEX_NULL)
{
return true;
}
// Check if there are enough free sprite slots for all the vehicles
int32_t totalCars = ride->num_vehicles * ride->num_cars_per_train;
int32_t totalCars = num_vehicles * num_cars_per_train;
if (totalCars > count_free_misc_sprite_slots())
{
gGameCommandErrorText = STR_UNABLE_TO_CREATE_ENOUGH_VEHICLES;
@@ -4728,7 +4727,7 @@ static bool ride_create_vehicles(Ride* ride, const CoordsXYE& element, int32_t i
int32_t direction = trackElement->GetDirection();
//
if (ride->mode == RideMode::StationToStation)
if (mode == RideMode::StationToStation)
{
vehiclePos -= CoordsXYZ{ CoordsDirectionDelta[direction], 0 };
@@ -4738,31 +4737,31 @@ static bool ride_create_vehicles(Ride* ride, const CoordsXYE& element, int32_t i
direction = trackElement->GetDirection();
}
vehicle_create_trains(ride->id, vehiclePos, trackElement);
vehicle_create_trains(id, vehiclePos, trackElement);
// return true;
// Initialise station departs
// 006DDDD0:
ride->lifecycle_flags |= RIDE_LIFECYCLE_ON_TRACK;
lifecycle_flags |= RIDE_LIFECYCLE_ON_TRACK;
for (int32_t i = 0; i < MAX_STATIONS; i++)
{
ride->stations[i].Depart = (ride->stations[i].Depart & STATION_DEPART_FLAG) | 1;
stations[i].Depart = (stations[i].Depart & STATION_DEPART_FLAG) | 1;
}
//
if (ride->type != RIDE_TYPE_SPACE_RINGS && !ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_VEHICLE_IS_INTEGRAL))
if (type != RIDE_TYPE_SPACE_RINGS && !ride_type_has_flag(type, RIDE_TYPE_FLAG_VEHICLE_IS_INTEGRAL))
{
if (ride->IsBlockSectioned())
if (IsBlockSectioned())
{
CoordsXYE firstBlock{};
ride_create_vehicles_find_first_block(ride, &firstBlock);
loc_6DDF9C(ride, firstBlock.element);
ride_create_vehicles_find_first_block(this, &firstBlock);
MoveTrainsToBlockBrakes(firstBlock.element->AsTrack());
}
else
{
for (int32_t i = 0; i < ride->num_vehicles; i++)
for (int32_t i = 0; i < num_vehicles; i++)
{
Vehicle* vehicle = GetEntity<Vehicle>(ride->vehicles[i]);
Vehicle* vehicle = GetEntity<Vehicle>(vehicles[i]);
if (vehicle == nullptr)
{
continue;
@@ -4779,34 +4778,35 @@ static bool ride_create_vehicles(Ride* ride, const CoordsXYE& element, int32_t i
}
}
}
ride_update_vehicle_colours(ride);
ride_update_vehicle_colours(this);
return true;
}
/**
*
* Move all the trains so each one will be placed at the block brake of a different block.
* The first vehicle will placed into the first block and all other vehicles in the blocks
* preceding that block.
* rct2: 0x006DDF9C
*/
void loc_6DDF9C(Ride* ride, TileElement* tileElement)
void Ride::MoveTrainsToBlockBrakes(TrackElement* firstBlock)
{
for (int32_t i = 0; i < ride->num_vehicles; i++)
for (int32_t i = 0; i < num_vehicles; i++)
{
auto train = GetEntity<Vehicle>(ride->vehicles[i]);
auto train = GetEntity<Vehicle>(vehicles[i]);
if (train == nullptr)
continue;
train->UpdateTrackMotion(nullptr);
if (i == 0)
{
train->UpdateTrackMotion(nullptr);
train->EnableCollisionsForTrain();
continue;
}
train->UpdateTrackMotion(nullptr);
do
{
tileElement->AsTrack()->SetBlockBrakeClosed(true);
firstBlock->SetBlockBrakeClosed(true);
for (Vehicle* car = train; car != nullptr; car = GetEntity<Vehicle>(car->next_vehicle_on_train))
{
car->velocity = 0;
@@ -4816,7 +4816,7 @@ void loc_6DDF9C(Ride* ride, TileElement* tileElement)
}
} while (!(train->UpdateTrackMotion(nullptr) & VEHICLE_UPDATE_MOTION_TRACK_FLAG_VEHICLE_AT_BLOCK_BRAKE));
tileElement->AsTrack()->SetBlockBrakeClosed(true);
firstBlock->SetBlockBrakeClosed(true);
for (Vehicle* car = train; car != nullptr; car = GetEntity<Vehicle>(car->next_vehicle_on_train))
{
car->ClearUpdateFlag(VEHICLE_UPDATE_FLAG_COLLISION_DISABLED);
@@ -5222,7 +5222,7 @@ bool Ride::Test(int32_t newStatus, bool isApplying)
if (!ride_type_has_flag(type, RIDE_TYPE_FLAG_NO_VEHICLES) && !(lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK))
{
if (!ride_create_vehicles(this, trackElement, isApplying))
if (!CreateVehicles(trackElement, isApplying))
{
return false;
}
@@ -5354,7 +5354,7 @@ bool Ride::Open(bool isApplying)
if (!ride_type_has_flag(type, RIDE_TYPE_FLAG_NO_VEHICLES) && !(lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK))
{
if (!ride_create_vehicles(this, trackElement, isApplying))
if (!CreateVehicles(trackElement, isApplying))
{
return false;
}

View File

@@ -376,6 +376,8 @@ private:
void UpdateChairlift();
void UpdateSpiralSlide();
void UpdateQueueLength(StationIndex stationIndex);
bool CreateVehicles(const CoordsXYE& element, bool isApplying);
void MoveTrainsToBlockBrakes(TrackElement* firstBlock);
money32 CalculateIncomePerHour() const;
void ChainQueues() const;
void ConstructMissingEntranceOrExit() const;