Пример #1
0
    public virtual float[,] CreateMountains()
    {
        bool         canCreateMountain;
        List <float> heights = new List <float>();

        //Debug.Log(Length);

        for (int j = 0; j < Length; j++)
        {
            for (int i = 0; i < Length; i++)
            {
                if (IsInGrasslands(i, j))
                {
                    Map[j, i] = 0f;
                    continue;
                }
                canCreateMountain = true;

                foreach (var m in Mountains)
                {
                    canCreateMountain &= m.CanCreateNewMountain(i, j);
                }

                if (canCreateMountain && GetRandomChance(Hillyness) && Mountains.Count <= MaxNumberOfMountainsAtOneTime)
                {
                    var   radius = 0f;
                    float h      = GetRandomHillHeight();
                    h = (1 / (11 - h));
                    do
                    {
                        radius = (GetRandomHillWidth() / 10f) * Length / 2f;
                    }while (radius == 0 && Mathf.Asin(h * TerrainHeight / radius) * (180f / Mathf.PI) > 35);

                    //radius = radius * Length * Length;
                    var centerX = radius + i;
                    var centerY = radius + j;
                    Mountains.Add(new Mountain(radius, (int)centerX, (int)centerY, h * RegionBase.TerrainMaxHeight));
                }

                heights.Clear();
                var tempMountain = new Mountain[Mountains.Count];
                Mountains.CopyTo(tempMountain);

                foreach (var m in tempMountain)
                {
                    if (m.IsInMountain(i, j))
                    {
                        heights.Add(m.HeightAtPosition(i, j));
                    }
                    else if (m.CanRemoveMountain(i, j))
                    {
                        Mountains.Remove(m);
                    }
                }

                Map[j, i] = heights.Count == 0 ? 0f : GetMaxHeight(heights);
            }
        }
        return(Map);
    }
        private void UpdateMountain(MountainsModel mountain)
        {
            var index = Mountains.IndexOf(mountain);

            Mountains.Remove(mountain);
            Mountains.Insert(index, mountain);
        }