using Gley.UrbanSystem.Internal;
using System.Collections.Generic;
using UnityEngine;
namespace Gley.TrafficSystem.Internal
{
///
/// Stores all instantiated vehicles.
///
internal class AllVehiclesData
{
private readonly VehicleComponent[] _allVehicles;
internal VehicleComponent[] AllVehicles => _allVehicles;
internal AllVehiclesData(Transform parent, VehiclePool vehiclePool, int nrOfVehicles, LayerMask buildingLayers, LayerMask obstacleLayers, LayerMask playerLayers, LayerMask roadLayers, bool lightsOn, ModifyTriggerSize modifyTriggerSize)
{
var trafficHolder = MonoBehaviourUtilities.CreateGameObject(TrafficSystemConstants.TrafficHolderName, parent, parent.position, false).transform;
_allVehicles = new VehicleComponent[nrOfVehicles];
int currentVehicleIndex = 0;
// Transform percent into numbers.
int carsToInstantiate = vehiclePool.trafficCars.Length;
if (carsToInstantiate > nrOfVehicles)
{
carsToInstantiate = nrOfVehicles;
}
// Instantiate at least a car from each type.
for (int i = 0; i < carsToInstantiate; i++)
{
_allVehicles[currentVehicleIndex] = LoadVehicle(currentVehicleIndex, vehiclePool.trafficCars[i].vehiclePrefab, trafficHolder, buildingLayers, obstacleLayers, playerLayers, roadLayers, vehiclePool.trafficCars[i].dontInstantiate, lightsOn, modifyTriggerSize);
currentVehicleIndex++;
}
nrOfVehicles -= carsToInstantiate;
float sum = 0;
List thresholds = new List();
for (int i = 0; i < vehiclePool.trafficCars.Length; i++)
{
sum += vehiclePool.trafficCars[i].percent;
thresholds.Add(sum);
}
float perCarValue = sum / nrOfVehicles;
// instantiate remaining vehicles.
int vehicleIndex = 0;
for (int i = 0; i < nrOfVehicles; i++)
{
while ((i + 1) * perCarValue > thresholds[vehicleIndex])
{
vehicleIndex++;
if (vehicleIndex >= vehiclePool.trafficCars.Length)
{
vehicleIndex = vehiclePool.trafficCars.Length - 1;
break;
}
}
_allVehicles[currentVehicleIndex] = LoadVehicle(currentVehicleIndex, vehiclePool.trafficCars[vehicleIndex].vehiclePrefab, trafficHolder, buildingLayers, obstacleLayers, playerLayers, roadLayers, vehiclePool.trafficCars[vehicleIndex].dontInstantiate, lightsOn, modifyTriggerSize);
currentVehicleIndex++;
}
}
///
/// Load vehicle in scene
///
private VehicleComponent LoadVehicle(int vehicleIndex, GameObject carPrefab, Transform parent, LayerMask buildingLayers, LayerMask obstacleLayers, LayerMask playerLayers, LayerMask roadLayers, bool excluded, bool lightsOn, ModifyTriggerSize modifyTriggerSize)
{
VehicleComponent vehicle = MonoBehaviourUtilities.Instantiate(carPrefab, Vector3.zero, Quaternion.identity, parent).GetComponent().Initialize(buildingLayers, obstacleLayers, playerLayers, roadLayers, lightsOn, modifyTriggerSize);
vehicle.SetIndex(vehicleIndex);
vehicle.name += vehicleIndex;
vehicle.excluded = excluded;
vehicle.DeactivateVehicle();
return vehicle;
}
}
}