// Use this for initialization
    void Start()
    {
        GameObject crossroadsGO = new GameObject("Crossroads");
        GameObject segmentsGO   = new GameObject("Road Segments");
        GameObject districtsGO  = new GameObject("Districts");

        System.DateTime t1 = System.DateTime.Now;
        terrainMap  = terrainGenerator.GenerateTerrain(terrainGeneratorSeed, null, this);
        roadNetwork = new RoadNetwork();

        System.DateTime t2 = System.DateTime.Now;
        for (int i = 0; i < agentsList.Length; i++)
        {
            agentsList[i].agent.generator = this;
            if (agentsList[i].enable)
            {
                for (int j = 0; j < agentsList[i].runs; j++)
                {
                    agentsList[i].agent.agentAction();
                }
            }
        }

        System.DateTime t3 = System.DateTime.Now;
        roadMeshGenerator.generateMesh(crossroadsGO, segmentsGO, roadNetwork, this);
        districtMeshGenerator.generateMesh(districtsGO, districtsMap, this);
        System.DateTime t4 = System.DateTime.Now;
        Debug.Log("Terrain generation time: " + (t2 - t1).ToString());
        Debug.Log("Agents processing time: " + (t3 - t2).ToString());
        Debug.Log("Meshes time: " + (t4 - t3).ToString());
        Debug.Log("Road segments: " + roadNetwork.roadSegments.Count);
        Debug.Log("Crossroads: " + roadNetwork.crossroads.Count);
        Debug.Log("Districts: " + districtsMap.Count);
        Debug.Log("City Center: " + cityCenter.ToString());
        Debug.Log("Commercial minimal distance: " + DistrictsHelper.getCommercialDistrictsMinimumDistance(this));
        Debug.Log("Most far commercial distance: " + DistrictsHelper.getCommercialDistrictsMaximumDistance(this));

        terrainGenerator.terrainObject.transform.localScale *= meshScale;
        crossroadsGO.transform.localScale *= meshScale;
        segmentsGO.transform.localScale   *= meshScale;
        districtsGO.transform.localScale  *= meshScale;
    }
    public override void agentAction()
    {
        List <District> residentialDistricts = new List <District>();

        foreach (District district in generator.districtsMap)
        {
            if (district.type == DistrictType.RESIDENTIAL)
            {
                residentialDistricts.Add(district);
            }
        }
        if (residentialDistricts.Count > 0)
        {
            District district = residentialDistricts[(int)Random.Range(0, residentialDistricts.Count - 1)];
            int      count    = district.cells.Count;
            if (district.cells.Count > maxSize || Random.value >= probability * Mathf.Sqrt(1.0f / count))
            {
                return;
            }
            float minimumDistancePre = DistrictsHelper.getCommercialDistrictsMinimumDistance(generator);
            float maximumDistancePre = DistrictsHelper.getCommercialDistrictsMaximumDistance(generator);

            district.type = DistrictType.COMMERCIAL;

            float minimumDistancePost = DistrictsHelper.getCommercialDistrictsMinimumDistance(generator);
            float maximumDistancePost = DistrictsHelper.getCommercialDistrictsMaximumDistance(generator);

            // Revert changes in case of bad decision
            if (minimumDistancePost < minimumDistance)
            {
                district.type = DistrictType.RESIDENTIAL;
            }
            if (maximumDistancePre < maximumDistancePost)
            {
                district.type = DistrictType.RESIDENTIAL;
            }
        }
    }