示例#1
0
        public bool compareTerrain(RTGWorld rtgWorld, TerrainBase oldTerrain)
        {
            OpenSimplexNoise     simplex = new OpenSimplexNoise(4444);
            SimplexCellularNoise cell    = new SimplexCellularNoise(4444);
            Random rand = new Random(4444);

            float oldNoise;

            TerrainBase newTerrain = this.initTerrain();
            float       newNoise;

            for (int x = -64; x <= 64; x++)
            {
                for (int z = -64; z <= 64; z++)
                {
                    oldNoise = oldTerrain.generateNoise(rtgWorld, x, z, 0.5f, 0.5f);
                    newNoise = newTerrain.generateNoise(rtgWorld, x, z, 0.5f, 0.5f);

                    //Logger.info("%s (%d) = oldNoise = %f | newNoise = %f", this.baseBiome.getBiomeName(), Biome.getIdForBiome(this.baseBiome), oldNoise, newNoise);

                    if (oldNoise != newNoise)
                    {
                        throw new Exception(
                                  "Terrains do not match in biome ID " + this.baseBiome.getBiomeID() + " (" + this.baseBiome.ToString() + ")."
                                  );
                    }
                }
            }

            return(true);
        }
示例#2
0
 public HeroBase Fight(HeroBase hero1, HeroBase hero2, TerrainBase terrain)
 {
     terrain.ApplyEffects(new List <HeroBase> {
         hero1, hero2
     });
     return(Fight(hero1, hero2));
 }
示例#3
0
 private void OnTriggerExit2D(Collider2D coll)
 {
     if (coll.gameObject.CompareTag(terr) && !(DragFlag || ReTurn))
     {
         //DragFlag = false;
         GOTarget = null;
     }
 }
示例#4
0
 private void init()
 {
     initConfig();
     this.terrain        = initTerrain();
     this.surface        = initSurface();
     this.surfaceRiver   = new SurfaceRiverOasis(config);
     this.surfaceGeneric = new SurfaceGeneric(config, this.surface.getTopPixel(), this.surface.getFillerPixel());
 }
示例#5
0
        public override float Added(OverworldGeneratorV2 generator, float x, float y)
        {
            float noise = generator.SimplexInstance(Octave).GetValue(x / Wavelength, y / Wavelength);

            noise = Math.Abs(noise);
            noise = TerrainBase.BlendedHillHeight(noise, MinimumSimplex);
            noise = TerrainBase.UnsignedPower(noise, Power);
            return(noise * Spiked.Added(generator, x, y));
        }
示例#6
0
        public void PaintTerrain(ChunkColumn column, int i, int j, int x, int z, int depth,
                                 OverworldGeneratorV2 generator, float[] noise, float river, BiomeBase[] biomes)
        {
            float c     = TerrainBase.CalcCliff(x, z, noise);
            bool  cliff = c > 1.4f;

            for (int k = 255; k > -1; k--)
            {
                Block b = column.GetBlockObject(x, k, z);
                if (b is Air)
                {
                    depth = -1;
                }
                else if (b is Stone)
                {
                    depth++;

                    if (cliff)
                    {
                        if (depth > -1 && depth < 2)
                        {
                            if (_rnd.Next(3) == 0)
                            {
                                column.SetBlock(x, k, z, CliffCobbleBlock);
                            }
                            else
                            {
                                column.SetBlock(x, k, z, CliffStoneBlock);
                            }
                        }
                        else if (depth < 10)
                        {
                            column.SetBlock(x, k, z, CliffStoneBlock);
                        }
                    }
                    else
                    {
                        if (depth == 0 && k > 61)
                        {
                            column.SetBlock(x, k, z, TopBlock);
                        }
                        else if (depth < 4)
                        {
                            column.SetBlock(x, k, z, FillerBlock);
                        }
                    }
                }
            }
        }
示例#7
0
    //占領後
    private void AfterArrivalFunc(bool flag)
    {
        TerrainBase _before;

        if (flag)
        {
            _before = NowPos as TerrainBase;
            NowPos  = GOTarget;
        }
        else
        {
            _before = NowPos;
        }


        if (FriendArmy.Count > 0)
        {
            for (int i = 1; i < FriendArmy.Count; i++)
            {
                //Debug.Log(flag);
                _before.MoveGarrison.Remove(FriendArmy[i]);

                FriendArmy[i].NowPos   = NowPos;
                FriendArmy[i].startpos = NowPos.transform.localPosition;
                NowPos.Garrison.Add(FriendArmy[i]);

                FriendArmy[i].transform.parent = null;
                FriendArmy[i].ForFrinedATKInit();
            }
            FriendArmy.Clear();
        }
        startpos = NowPos.transform.localPosition;
        _before.MoveGarrison.Remove(this);        //元の場所の移動兵力枠から消去
        GOTarget  = null;
        ReTurn    = false;
        FirstFlag = false;


        NowPos.Garrison.Add(this);

        //NowPos.ArmmyArrival();
        NowPos.SortArmy();        //ソートする

        if ((CompareTag(mytag) && NowPos.ISOCCUPATION) || (CompareTag(enetag) && !NowPos.ISOCCUPATION))
        {
            NowPos.ISOCCUPATION = !NowPos.ISOCCUPATION;
        }
        NowPos.ArmmyArrival();
    }
        public override float Added(OverworldGeneratorV2 generator, float x, float y)
        {
            var   evaluateAt = new Vector2(x / PointWavelength, y / PointWavelength);
            var   points     = generator.CellularInstance(1).Eval2D(evaluateAt.X, evaluateAt.Y);
            float raise      = (float)(points.InteriorValue);
            // now we're going to get an adjustment value which will be the same
            // for all points on a given vector from the voronoi basin center
            var   adjustAt     = points.ToLength(evaluateAt, AdjustmentRadius);
            float multiplier   = 1.3f;
            float noZeros      = 0.1f;
            float adjustment   = (float)generator.CellularInstance(2).Eval2D(adjustAt.X, adjustAt.Y).InteriorValue *multiplier + noZeros;
            float reAdjustment = (float)generator.CellularInstance(3).Eval2D(adjustAt.X, adjustAt.Y).InteriorValue *multiplier + noZeros;

            // 0 to 1 which is currently undesirable so increase to average closer to 1
            adjustment = TerrainBase.BayesianAdjustment(adjustment, reAdjustment);
            raise      = TerrainBase.BayesianAdjustment(raise, adjustment);
            return(raise);
        }
示例#9
0
    public void MoveFunc(TerrainBase Home, TerrainBase _GoTarget, int NodeNum)
    {
        float _speed = SPEED;

        GOTarget   = _GoTarget;
        Target_dis = Home.Way[NodeNum];
        DragFlag   = true;
        if (FriendArmy.Count > 0)
        {
            //速度でソート
            for (int i = 0; i < FriendArmy.Count; i++)
            {
                _speed = FriendArmy[i].SPEED;
                FriendArmy[i].transform.parent         = transform;
                FriendArmy[i].transform.localPosition += new Vector3(GoudouPos_X[(i + 1) % 3], Mathf.Floor((i + 1) / 3));
            }
        }

        MoveTime = Target_dis / _speed;        //残り時間計算
        Vector2 move_vec = GOTarget.transform.localPosition - transform.localPosition;

        transform.localRotation = Quaternion.FromToRotation(Vector2.up, move_vec);
    }
示例#10
0
        /// <inheritdoc />
        public override void PaintTerrain(ChunkColumn column,
                                          int blockX,
                                          int blockZ,
                                          int x,
                                          int z,
                                          int depth,
                                          OverworldGeneratorV2 generator,
                                          float[] noise,
                                          float river,
                                          BiomeBase[] biomes)
        {
            FastRandom rand    = new FastRandom();
            var        simplex = generator.SimplexInstance(0);
            float      c       = TerrainBase.CalcCliff(x, z, noise);
            bool       cliff   = c > 1.4f;

            for (int y = 255; y > -1; y--)
            {
                Block b = column.GetBlockObject(x, y, z);
                if (b is Air)
                {
                    depth = -1;
                }
                else if (b is Stone)
                {
                    depth++;

                    if (cliff)
                    {
                        if (depth > -1 && depth < 2)
                        {
                            if (rand.Next(3) == 0)
                            {
                                column.SetBlock(x, y, z, CliffCobbleBlock);
                            }
                            else
                            {
                                column.SetBlock(x, y, z, CliffStoneBlock);
                            }
                        }
                        else if (depth < 10)
                        {
                            column.SetBlock(x, y, z, CliffStoneBlock);
                        }
                    }
                    else
                    {
                        if (depth == 0 && y > 61)
                        {
                            if (simplex.GetValue(blockX / width, blockZ / width) > height)                             // > 0.27f, i / 12f
                            {
                                column.SetBlock(x, y, z, mixBlock);
                            }
                            else
                            {
                                column.SetBlock(x, y, z, TopBlock);
                            }
                        }
                        else if (depth < 4)
                        {
                            column.SetBlock(x, y, z, FillerBlock);
                        }
                    }
                }
            }
        }
示例#11
0
        /// <inheritdoc />
        public override void PaintTerrain(ChunkColumn column,
                                          int blockX,
                                          int blockZ,
                                          int x,
                                          int z,
                                          int depth,
                                          OverworldGeneratorV2 generator,
                                          float[] noise,
                                          float river,
                                          BiomeBase[] biomes)
        {
            float c     = TerrainBase.CalcCliff(x, z, noise);
            bool  cliff = c > 1.3f;
            Block b;

            for (int k = 255; k > -1; k--)
            {
                b = column.GetBlockObject(x, k, z);
                if (b is Air)
                {
                    depth = -1;
                }
                else if (b is Stone)
                {
                    depth++;

                    if (cliff)
                    {
                        column.SetBlock(x, k, z, PlateauBlocks[k % PlateauBlocks.Length]);
                    }
                    else
                    {
                        if (k > 74 + grassRaise)
                        {
                            if (depth == 0)
                            {
                                if (Rnd.Next(5) == 0)
                                {
                                    column.SetBlock(x, k, z, mix2Block);
                                }
                                else
                                {
                                    column.SetBlock(x, k, z, TopBlock);
                                }
                            }
                            else if (depth < 4)
                            {
                                column.SetBlock(x, k, z, FillerBlock);
                            }
                        }
                        else if (depth == 0 && k > 61)
                        {
                            int r = (int)((k - (62 + grassRaise)) / 2f);
                            if (Rnd.Next(r + 2) == 0)
                            {
                                column.SetBlock(x, k, z, mixBlock);
                            }
                            else if (Rnd.Next((int)(r / 2f) + 2) == 0)
                            {
                                column.SetBlock(x, k, z, mix2Block);
                            }
                            else
                            {
                                column.SetBlock(x, k, z, TopBlock);
                            }
                        }
                        else if (depth < 4)
                        {
                            column.SetBlock(x, k, z, FillerBlock);
                        }
                    }
                }
            }
        }
示例#12
0
 public override float Added(OverworldGeneratorV2 generator, float x, float y)
 {
     return(TerrainBase.GetGroundNoise(x, y, amplitude, generator));
 }
示例#13
0
 //初期化
 public void ClearMove()
 {
     GOTarget = null;
     transform.localRotation = Quaternion.identity;
 }
示例#14
0
        /// <inheritdoc />
        public override void PaintTerrain(ChunkColumn column,
                                          int blockX,
                                          int blockZ,
                                          int x,
                                          int z,
                                          int depth,
                                          OverworldGeneratorV2 generator,
                                          float[] noise,
                                          float river,
                                          BiomeBase[] biomes)
        {
            var   simplex = generator.SimplexInstance(0);
            float p       = simplex.GetValue(blockX / 8f, blockZ / 8f) * 0.5f;
            float c       = TerrainBase.CalcCliff(x, z, noise);
            int   cliff   = 0;

            Block b;

            for (int y = 255; y > -1; y--)
            {
                b = column.GetBlockObject(x, y, z);
                if (b is Air)
                {
                    depth = -1;
                }
                else if (b is Stone)
                {
                    depth++;

                    if (depth == 0)
                    {
                        if (c > 0.45f && c > 1.5f - ((y - 60f) / 65f) + p)
                        {
                            cliff = 1;
                        }
                        if (c > 1.5f)
                        {
                            cliff = 2;
                        }
                        if (y > 110 + (p * 4) && c < 0.3f + ((y - 100f) / 50f) + p)
                        {
                            cliff = 3;
                        }

                        if (cliff == 1)
                        {
                            if (Rnd.Next(3) == 0)
                            {
                                column.SetBlock(x, y, z, CliffCobbleBlock);
                            }
                            else
                            {
                                column.SetBlock(x, y, z, CliffStoneBlock);
                            }
                        }
                        else if (cliff == 2)
                        {
                            column.SetBlock(x, y, z, ShadowStoneBlock);
                        }
                        else if (cliff == 3)
                        {
                            column.SetBlock(x, y, z, new Snow());
                        }
                        else if (simplex.GetValue(blockX / 50f, blockZ / 50f) + p * 0.6f > 0.24f)
                        {
                            column.SetBlock(x, y, z, MixBlock);
                        }
                        else
                        {
                            column.SetBlock(x, y, z, new Grass());
                        }
                    }
                    else if (depth < 6)
                    {
                        if (cliff == 1)
                        {
                            column.SetBlock(x, y, z, CliffStoneBlock);
                        }
                        else if (cliff == 2)
                        {
                            column.SetBlock(x, y, z, ShadowStoneBlock);
                        }
                        else if (cliff == 3)
                        {
                            column.SetBlock(x, y, z, new Snow());
                        }
                        else
                        {
                            column.SetBlock(x, y, z, new Dirt());
                        }
                    }
                }
            }
        }
示例#15
0
    public void BattleCalculate(List <UniteBase> _Diffender, List <UniteBase> _Attacker, TerrainBase BattleZone)
    {
        //Debug.Log("dddd");
        //初期化
        Attacker.Clear();
        Diffender.Clear();
        //キャッシュ
        Diffender = new List <UniteBase>(_Diffender);
        Attacker  = new List <UniteBase>(_Attacker);


        for (int i = 0; i < Attacker.Count; i++)
        {
            A[i] = Attacker[i].UnitAtkCalculate() * ((100 - BattleZone.B_DEF) / 100);            //攻撃側攻撃力計算 バフはダメージカット
        }

        for (int i = 0; i < Diffender.Count; i++)
        {
            D[i] = Diffender[i].UnitAtkCalculate() * ((BattleZone.B_ATK + 100) / 100);            //防御側攻撃力計算 バフは攻撃力上昇
        }

        //このへん攻撃受ける側が少ないとダメージが変に減ってる気がする

        //防御側ダメージ計算
        for (int i = 0; i < Diffender.Count; i++)
        {
            for (int j = 0; j < Attacker.Count; j++)
            {
                if (Diffender.Count == 1)
                {
                    //一人のときは当然すべて受ける
                    Battle(Diffender[i], A[j]);
                }
                else if (i < 2)
                {
                    //0番目は攻撃力の2/3を受ける
                    Battle(Diffender[i], (A[j] / 3) * (2 - i));
                }
                else
                {
                    Debug.Log("aaaaaa");
                    //処理なし
                }
            }
        }

        //攻撃側ダメージ計算
        for (int i = 0; i < Attacker.Count; i++)
        {
            for (int j = 0; j < Diffender.Count; j++)
            {
                if (i < 2)
                {
                    //0番目は攻撃力の2/3を受ける
                    Battle(Attacker[i], (A[j] / 3) * (2 - i));
                }
                else
                {
                    Debug.Log("bbbbbbbb");
                }
                if (Attacker.Count == 1)
                {
                    Debug.Log("戦闘システムに以上あり");
                }
            }
        }

        _Diffender.Clear();
        _Attacker.Clear();
        //値を返却
        for (int i = 0; i < Diffender.Count; i++)
        {
            if (Diffender[i]._NUMBER > 0)
            {
                _Diffender.Add(Diffender[i]);
            }
        }
        for (int i = 0; i < Attacker.Count; i++)
        {
            if (Attacker[i]._NUMBER > 0)
            {
                _Attacker.Add(Attacker[i]);
            }
        }
    }
示例#16
0
 //戦闘場所と攻撃者のデータ
 public BattleObserve(TerrainBase Current)
 {
     //_base = Current;
 }
示例#17
0
    //一人攻撃用
    public void BattleCalculate(List <UniteBase> _Diffender, UniteBase _Attacker, TerrainBase BattleZone)
    {
        //Debug.Log("oson");
        //初期化
        Attacker.Clear();
        Diffender.Clear();
        //キャッシュ
        Diffender = new List <UniteBase>(_Diffender);
        Attacker.Add(_Attacker);



        A[0] = Attacker[0].UnitAtkCalculate() * ((100 - BattleZone.B_DEF) / 100);        //攻撃側攻撃力計算 バフはダメージカット

        for (int i = 0; i < Diffender.Count; i++)
        {
            if (Diffender[i] != null)
            {
                D[i] = Diffender[i].UnitAtkCalculate() * ((BattleZone.B_ATK + 100) / 100);                //防御側攻撃力計算 バフは攻撃力上昇
            }
            else
            {
                D[i] = 0;
            }
        }
        //Debug.Log("D0:" + D[0] + ",D1:" + D[1]);
        //防御側ダメージ計算
        for (int i = 0; i < Diffender.Count; i++)
        {
            //0番目は攻撃力の2/3を受ける
            Battle(Diffender[i], (A[0] / 3) * (2 - i));
        }

        //攻撃側ダメージ計算

        for (int j = 0; j < 3; j++)
        {
            //0番目は攻撃力の2/3を受ける
            Battle(Attacker[0], D[j]);
        }


        _Diffender.Clear();
        //_Attacker.Clear();
        //Debug.Log(Diffender.Count);

        //値を返却
        for (int i = 0; i < Diffender.Count; i++)
        {
            //Debug.Log(Diffender[i].name);

            if (Diffender[i] && Diffender[i]._HP > 0)
            {
                _Diffender.Add(Diffender[i]);
            }
        }
        //for (int i = 0; i < Attacker.Count; i++)
        //{
        //	if (Attacker[i] && Attacker[i]._HP > 0)
        //		_Attacker.Add(Attacker[i]);
        //}

        //HPが0なら攻撃者をnullで返す
        if (Attacker[0]._HP < 0)
        {
            //_Attacker = null;
            Debug.Log("やられたー");
        }
    }
示例#18
0
        /// <inheritdoc />
        public override void PaintTerrain(ChunkColumn column,
                                          int blockX,
                                          int blockZ,
                                          int x,
                                          int z,
                                          int depth,
                                          OverworldGeneratorV2 generator,
                                          float[] noise,
                                          float river,
                                          BiomeBase[] biomes)
        {
            var   simplex = generator.SimplexInstance(0);
            float c       = TerrainBase.CalcCliff(x, z, noise);
            int   cliff   = 0;
            bool  m       = false;

            Block b;

            for (int k = 255; k > -1; k--)
            {
                b = column.GetBlockObject(x, k, z);

                if (b is Air)
                {
                    depth = -1;
                }
                else if (b is Stone)
                {
                    depth++;

                    if (depth == 0)
                    {
                        float p = simplex.GetValue(blockX / 8f, blockZ / 8f, k / 8f) * 0.5f;

                        if (c > min && c > sCliff - ((k - sHeight) / sStrength) + p)
                        {
                            cliff = 1;
                        }

                        if (c > cCliff)
                        {
                            cliff = 2;
                        }

                        if (cliff == 1)
                        {
                            if (Rnd.Next(3) == 0)
                            {
                                column.SetBlock(x, k, z, CliffCobbleBlock);
                            }
                            else
                            {
                                column.SetBlock(x, k, z, CliffStoneBlock);
                            }
                        }
                        else if (cliff == 2)
                        {
                            column.SetBlock(x, k, z, ShadowStoneBlock);
                        }
                        else if (k < 63)
                        {
                            if (k < 62)
                            {
                                column.SetBlock(x, k, z, FillerBlock);
                            }
                            else
                            {
                                column.SetBlock(x, k, z, TopBlock);
                            }
                        }
                        else if (simplex.GetValue(blockX / 12f, blockZ / 12f) > mixHeight)
                        {
                            column.SetBlock(x, k, z, mixBlock);
                            m = true;
                        }
                        else
                        {
                            column.SetBlock(x, k, z, TopBlock);
                        }
                    }
                    else if (depth < 6)
                    {
                        if (cliff == 1)
                        {
                            column.SetBlock(x, k, z, CliffStoneBlock);
                        }
                        else if (cliff == 2)
                        {
                            column.SetBlock(x, k, z, ShadowStoneBlock);
                        }
                        else
                        {
                            column.SetBlock(x, k, z, FillerBlock);
                        }
                    }
                }
            }
        }
        private int[] CalculateBiomes(ChunkCoordinates coordinates, ChunkLandscape landscape)
        {
            // var biomes = BiomeProvider.GetBiomes().ToArray();

            int worldX = coordinates.X << 4;
            int worldZ = coordinates.Z << 4;

            float[] weightedBiomes = new float[256];
            var     biomeData      = new int[SampleArraySize * SampleArraySize];

            for (int x = -SampleSize; x < SampleSize + 5; x++)
            {
                for (int z = -SampleSize; z < SampleSize + 5; z++)
                {
                    var xx = worldX + ((x * 8f));
                    var zz = worldZ + ((z * 8f));

                    var temp = TemperatureNoise.GetValue(xx, zz);

                    //Note for self: The temperature noise returns a value between -1 & 1 however we need the value to be between 0 & 2.
                    //We do this by getting the absolute value (0 to 1) and multiplying it by 2.
                    temp = MathF.Abs(temp) * 2f;

                    var rain = MathF.Abs(RainfallNoise.GetValue(xx, zz));

                    if (temp < _lowestTemp)
                    {
                        _lowestTemp = temp;
                    }

                    if (temp > _highestTemp)
                    {
                        _highestTemp = temp;
                    }

                    if (rain < _lowestHumidity)
                    {
                        _lowestHumidity = rain;
                    }

                    if (rain > _highestHumidity)
                    {
                        _highestHumidity = rain;
                    }

                    _totalTemp     += temp;
                    _totalHumidity += rain;
                    _totalLookups++;

                    if (_totalLookups % 1024 == 0)
                    {
                        /*  Console.Clear();
                         *
                         * Console.WriteLine(
                         *    $"Average temperature: {_totalTemp / _totalLookups} Highest: {_highestTemp} Lowest: {_lowestTemp}");
                         *
                         * Console.WriteLine(
                         *    $"Average humidity: {_totalHumidity / _totalLookups} Highest: {_highestHumidity} Lowest: {_lowestHumidity}");
                         *
                         * Console.WriteLine($"Unique biomes: {_uniqueBiomes.Count}");*/
                    }

                    biomeData[(x + SampleSize) * SampleArraySize + (z + SampleSize)] = (BiomeProvider.GetBiome(
                                                                                            (float)temp, (float)rain).Id);
                }
            }

            for (int x = 0; x < 16; x++)
            {
                for (int z = 0; z < 16; z++)
                {
                    int index = NoiseMap.GetIndex(x, z);

                    float totalWeight = 0;
                    for (int mapX = 0; mapX < SampleArraySize; mapX++)
                    {
                        for (int mapZ = 0; mapZ < SampleArraySize; mapZ++)
                        {
                            float weight = _weightings[mapX * SampleArraySize + mapZ][(x << 4) + z];
                            if (weight > 0)
                            {
                                totalWeight += weight;
                                weightedBiomes[biomeData[mapX * SampleArraySize + mapZ]] += weight;
                            }
                        }
                    }

                    // normalize biome weights
                    for (int biomeIndex = 0; biomeIndex < weightedBiomes.Length; biomeIndex++)
                    {
                        weightedBiomes[biomeIndex] /= totalWeight;
                    }

                    // combine mesa biomes
                    // mesaCombiner.adjust(weightedBiomes);
                    landscape.Noise[index] = 0f;

                    float river = TerrainBase.GetRiverStrength(new BlockCoordinates(worldX + x, 0, worldZ + z), this);
                    landscape.River[index] = -river;

                    float maxWeight = 0f;
                    for (int i = 0; i < weightedBiomes.Length; i++)
                    {
                        var value = weightedBiomes[i];

                        if (value > 0f)
                        {
                            var biome = BiomeProvider.GetBiome(i);

                            landscape.Noise[index] += biome.RNoise(
                                this, worldX + x, worldZ + z, value, river + 1f) * value;

                            weightedBiomes[i] = 0f;

                            if (value > maxWeight)
                            {
                                maxWeight = value;
                                landscape.Biome[index] = biome;

                                if (!_uniqueBiomes.Contains(biome.Id))
                                {
                                    _uniqueBiomes.TryAdd(biome.Id);
                                    // Console.WriteLine($"Unique biomes: {uniqueBiomes.Count}");
                                }
                            }
                        }
                    }

                    //landscape.Biome[index] = weightedBiomes.;

                    // landscape.Biome[index] = BiomeProvider.GetBiome(i);
                    //landscape.Biome[index] = BiomeProvider.GetBiome();
                }
            }

            return(biomeData);
        }
示例#20
0
        private int[] CalculateBiomes(ChunkCoordinates coordinates, ChunkLandscape landscape)
        {
            int worldX = coordinates.X * 16;
            int worldZ = coordinates.Z * 16;

            float[] weightedBiomes = new float[256];
            var     biomeData      = new int[SampleArraySize * SampleArraySize];

            for (int x = -SampleSize; x < SampleSize + 5; x++)
            {
                for (int z = -SampleSize; z < SampleSize + 5; z++)
                {
                    var temp = TemperatureNoise.GetValue(worldX + ((x * 8)), worldZ + ((z * 8)));
                    var rain = RainfallNoise.GetValue(worldX + ((x * 8)), worldZ + ((z * 8)));

                    biomeData[(x + SampleSize) * SampleArraySize + (z + SampleSize)] = (BiomeProvider.GetBiome((float)temp, (float)rain).Id);
                }
            }

            for (int x = 0; x < 16; x++)
            {
                for (int z = 0; z < 16; z++)
                {
                    int index = NoiseMap.GetIndex(x, z);

                    float totalWeight = 0;
                    for (int mapX = 0; mapX < SampleArraySize; mapX++)
                    {
                        for (int mapZ = 0; mapZ < SampleArraySize; mapZ++)
                        {
                            float weight = _weightings[mapX * SampleArraySize + mapZ][x * 16 + z];
                            if (weight > 0)
                            {
                                totalWeight += weight;
                                weightedBiomes[biomeData[mapX * SampleArraySize + mapZ]] += weight;
                            }
                        }
                    }

                    // normalize biome weights
                    for (int biomeIndex = 0; biomeIndex < weightedBiomes.Length; biomeIndex++)
                    {
                        weightedBiomes[biomeIndex] /= totalWeight;
                    }

                    // combine mesa biomes
                    // mesaCombiner.adjust(weightedBiomes);

                    landscape.Noise[index] = 0f;

                    float river = TerrainBase.GetRiverStrength(new BlockCoordinates(worldX + x, 0, worldZ + z), this);
                    landscape.River[index] = -river;

                    for (int i = 0; i < 256; i++)
                    {
                        var value = weightedBiomes[i];
                        if (value > 0f)
                        {
                            var biome = BiomeProvider.GetBiome(i);
                            landscape.Noise[index] += biome.RNoise(this, worldX + x, worldZ + z, value, river + 1f) * value;
                            landscape.Biome[index]  = biome;
                            // 0 for the next column
                            weightedBiomes[i] = 0f;
                        }
                    }

                    // landscape.Biome[index] = BiomeProvider.GetBiome(i);
                    //landscape.Biome[index] = BiomeProvider.GetBiome();
                }
            }

            for (int x = 0; x < 16; x++)
            {
                for (int z = 0; z < 16; z++)
                {
                    BlockCoordinates pos = new BlockCoordinates(worldX + (x - 7) * 8 + 4, 0, worldZ + (z - 7) * 8 + 4);
                    //  landscape.Biome[x * 16 + z] = BiomeProvider.GetBiome(pos.X, pos.Z);
                }
            }

            return(biomeData);
        }
示例#21
0
 public void SetTerrain(TerrainBase terrain)
 {
     this.terrain = terrain;
 }