Пример #1
0
        /* Smooths the boundaries between different landscape types. */
        void Smooth()
        {
            for (ushort y = 0; y < 64; y++)
            {
                for (ushort x = 0; x < 64; x++)
                {
                    var index = y * 64 + x;
                    var tile  = m[index];

                    if (tile == D2MapUtils.RockTile || tile == D2MapUtils.DuneTile || tile == D2MapUtils.RoughTile)
                    {
                        m[index] = D2MapUtils.SmoothTileTypeForPos(m, 64, 64, x, y);
                    }
                }
            }
        }
Пример #2
0
        public void WorldLoaded(World w, WorldRenderer wr)
        {
            /* based on SmudgeLayer.cs */
            var first = sideSprites.First().Value.First();
            var sheet = first.Sheet;

            if (sideSprites.Values.Any(sprites => sprites.Any(s => s.Sheet != sheet)))
            {
                throw new InvalidDataException("Resource sprites span multiple sheets. Try loading their sequences earlier.");
            }

            var blendMode = first.BlendMode;

            if (sideSprites.Values.Any(sprites => sprites.Any(s => s.BlendMode != blendMode)))
            {
                throw new InvalidDataException("Smudges specify different blend modes. "
                                               + "Try using different smudge types for smudges that use different blend modes.");
            }

            render = new TerrainSpriteLayer(w, wr, sheet, blendMode, wr.Palette(Info.Palette), wr.World.Type != WorldType.Editor);

            var tilesLayer = w.Map.Tiles;

            for (var v = 0; v < tilesLayer.Size.Height; v++)
            {
                for (var u = 0; u < tilesLayer.Size.Width; u++)
                {
                    var pos  = new MPos(u, v);
                    var tile = tilesLayer[pos];

                    if (tile.Type == D2MapUtils.RockTile)
                    {
                        var index = D2MapUtils.SmoothIndexForPos(tilesLayer, pos);
                        if (index != 15)
                        {
                            CPos   cpos   = pos.ToCPos(w.Map);
                            Sprite sprite = sideSprites["rock"][index];
                            render.Update(cpos, sprite);
                        }
                    }

                    if (tile.Type == D2MapUtils.DuneTile)
                    {
                        var index = D2MapUtils.SmoothIndexForPos(tilesLayer, pos);
                        if (index != 15)
                        {
                            CPos   cpos   = pos.ToCPos(w.Map);
                            Sprite sprite = sideSprites["dune"][index];
                            render.Update(cpos, sprite);
                        }
                    }

                    if (tile.Type == D2MapUtils.RoughTile)
                    {
                        var index = D2MapUtils.SmoothIndexForPos(tilesLayer, pos);
                        if (index != 15)
                        {
                            CPos   cpos   = pos.ToCPos(w.Map);
                            Sprite sprite = sideSprites["rough"][index];
                            render.Update(cpos, sprite);
                        }
                    }
                }
            }
        }
Пример #3
0
        public void WorldLoaded(World w, WorldRenderer wr)
        {
            /* based on SmudgeLayer.cs */
            var first   = sideSprites.First().Value.First();
            var sheet2D = first.Sheet2D;
            //this check can be removed
            //if (sideSprites.Values.Any(sprites => sprites.Any(s => s.Sheet2D != sheet2D)))
            //	throw new InvalidDataException("Resource sprites span multiple sheets. Try loading their sequences earlier.");

            var blendMode = first.BlendMode;

            if (sideSprites.Values.Any(sprites => sprites.Any(s => s.BlendMode != blendMode)))
            {
                throw new InvalidDataException("Smudges specify different blend modes. "
                                               + "Try using different smudge types for smudges that use different blend modes.");
            }

            // using base TerrainRenderer to avoid using one more renderer through TerrainSpriteLayer class as it was done.
            //var terrainRenderer = w.WorldActor.TraitOrDefault<IRenderTerrain>(); //to get TerrainRenderer.cs class
            //TerrainRenderer = terrainRenderer.GetTerrainSpriteLayerRenderer(); //get all Sprites that it has from tileset\*.yaml file
            //render = TerrainRenderer[Info.Palette];
            // Nowadays way to accomplish task is to add one more renderer through TerrainSpriteLayer class and we get one more Batch for total terrain vertexes
            render = new TerrainSpriteLayer(w, wr, sheet2D, blendMode, wr.Palette(Info.Palette), wr.World.Type != WorldType.Editor, "D2TerrainLayer");
            MersenneTwister random = new MersenneTwister();

            var tilesLayer = w.Map.Tiles;

            for (var v = 0; v < tilesLayer.Size.Height; v++)
            {
                for (var u = 0; u < tilesLayer.Size.Width; u++)
                {
                    var pos  = new MPos(u, v);
                    var tile = tilesLayer[pos];

                    if (tile.Type == D2MapUtils.RockTile)
                    {
                        var index = D2MapUtils.SmoothIndexForPos(tilesLayer, pos);
                        if (index != 15)
                        {
                            CPos cpos = pos.ToCPos(w.Map);
                            //ushort sdf;
                            //int ffd = (128 + Convert.ToInt32(index));
                            //sdf = Convert.ToUInt16(ffd);
                            //var t = new TerrainTile(sdf, 0);
                            //Sprite sprite = wr.Theater.TileSprite(t, 0);
                            Sprite sprite = sideSprites["rock"][index];
                            render.Update(cpos, sprite);
                        }
                    }

                    if (tile.Type == D2MapUtils.DuneTile)
                    {
                        var index = D2MapUtils.SmoothIndexForPos(tilesLayer, pos);
                        if (index != 15)
                        {
                            CPos cpos = pos.ToCPos(w.Map);
                            //ushort sdf;
                            //int ffd = (144 + Convert.ToInt32(index)); //158
                            //sdf = Convert.ToUInt16(ffd);
                            //var t = new TerrainTile(sdf, 0);
                            //Sprite sprite = wr.Theater.TileSprite(t, 0);
                            Sprite sprite = sideSprites["dune"][index];
                            render.Update(cpos, sprite);
                        }
                    }

                    if (tile.Type == D2MapUtils.RoughTile)
                    {
                        var index = D2MapUtils.SmoothIndexForPos(tilesLayer, pos);
                        if (index != 15)
                        {
                            CPos cpos = pos.ToCPos(w.Map);
                            //ushort sdf;
                            //int ffd = (160 + Convert.ToInt32(index));
                            //sdf = Convert.ToUInt16(ffd);
                            //var t = new TerrainTile(sdf, 0);
                            //Sprite sprite = wr.Theater.TileSprite(t, 0);
                            Sprite sprite = sideSprites["rough"][index];
                            render.Update(cpos, sprite);
                        }
                    }
                }
            }
        }