Example #1
0
        void IWorldLoaded.WorldLoaded(World w, WorldRenderer wr)
        {
            // Cache locations of veinhole actors
            // TODO: Add support for monitoring actors placed in the map editor!
            w.ActorAdded   += ActorAddedToWorld;
            w.ActorRemoved += ActorRemovedFromWorld;
            foreach (var a in w.Actors)
            {
                ActorAddedToWorld(a);
            }

            veinSequence = w.Map.Rules.Sequences.GetSequence(info.Image, info.Sequence);
            veinPalette  = wr.Palette(info.Palette);

            var first       = veinSequence.GetSprite(0);
            var emptySprite = new Sprite(first.Sheet, Rectangle.Empty, TextureChannel.Alpha);

            spriteLayer = new TerrainSpriteLayer(w, wr, emptySprite, first.BlendMode, wr.World.Type != WorldType.Editor);

            // Initialize the renderIndices with the initial map state so it is visible
            // through the fog with the Explored Map option enabled
            foreach (var cell in w.Map.AllCells)
            {
                var resource    = resourceLayer.GetResource(cell);
                var cellIndices = CalculateCellIndices(resource, cell);
                if (cellIndices != null)
                {
                    renderIndices[cell] = cellIndices;
                    UpdateRenderedSprite(cell, cellIndices);
                }
            }
        }
        public void WorldLoaded(World w, WorldRenderer wr)
        {
            // Initialize tile cache
            // This includes the region outside the visible area to cover any sprites peeking outside the map
            foreach (var uv in w.Map.AllCells.MapCoords)
            {
                var pos     = w.Map.CenterOfCell(uv.ToCPos(map));
                var screen  = wr.Screen3DPosition(pos - new WVec(0, 0, pos.Z));
                var variant = (byte)Game.CosmeticRandom.Next(info.ShroudVariants.Length);
                tileInfos[uv] = new TileInfo(screen, variant);
            }

            // Dirty the whole projected space
            DirtyCells(map.AllCells.MapCoords.Select(uv => (PPos)uv));

            // All tiles are visible in the editor
            if (w.Type == WorldType.Editor)
            {
                visibleUnderShroud = _ => true;
            }
            else
            {
                visibleUnderShroud = puv => map.Contains(puv);
            }

            visibleUnderFog = puv => map.Contains(puv);

            var shroudSheet = shroudSprites[0].Sheet2D;

            if (shroudSprites.Any(s => s.Sheet2D != shroudSheet))
            {
                throw new InvalidDataException("Shroud sprites span multiple sheets. Try loading their sequences earlier.");
            }

            var shroudBlend = shroudSprites[0].BlendMode;

            if (shroudSprites.Any(s => s.BlendMode != shroudBlend))
            {
                throw new InvalidDataException("Shroud sprites must all use the same blend mode.");
            }

            var fogSheet = fogSprites[0].Sheet2D;

            if (fogSprites.Any(s => s.Sheet2D != fogSheet))
            {
                throw new InvalidDataException("Fog sprites span multiple sheets. Try loading their sequences earlier.");
            }

            var fogBlend = fogSprites[0].BlendMode;

            if (fogSprites.Any(s => s.BlendMode != fogBlend))
            {
                throw new InvalidDataException("Fog sprites must all use the same blend mode.");
            }


            shroudLayer = new TerrainSpriteLayer(w, wr, shroudSheet, shroudBlend, wr.Palette(info.ShroudPalette), false, "D2ShroudRenderer.shroudLayer");
            fogLayer    = new TerrainSpriteLayer(w, wr, fogSheet, fogBlend, wr.Palette(info.FogPalette), false, "D2ShroudRenderer.foglayer");
        }
Example #3
0
        void IWorldLoaded.WorldLoaded(World w, WorldRenderer wr)
        {
            // Initialize tile cache
            // This includes the region outside the visible area to cover any sprites peeking outside the map
            foreach (var uv in w.Map.AllCells.MapCoords)
            {
                var pos    = w.Map.CenterOfCell(uv.ToCPos(map));
                var screen = wr.Screen3DPosition(pos - new WVec(0, 0, pos.Z));
                tileInfos[uv] = new TileInfo(screen);
            }

            // All tiles are visible in the editor
            if (w.Type == WorldType.Editor)
            {
                visibleUnderShroud = _ => true;
            }
            else
            {
                visibleUnderShroud = puv => map.Contains(puv);
            }

            visibleUnderFog = puv => map.Contains(puv);

            var shroudSheet = shroudSprites[0].Sheet;

            if (shroudSprites.Any(s => s.Sheet != shroudSheet))
            {
                throw new InvalidDataException("Shroud sprites span multiple sheets. Try loading their sequences earlier.");
            }

            var shroudBlend = shroudSprites[0].BlendMode;

            if (shroudSprites.Any(s => s.BlendMode != shroudBlend))
            {
                throw new InvalidDataException("Shroud sprites must all use the same blend mode.");
            }

            var fogSheet = fogSprites[0].Sheet;

            if (fogSprites.Any(s => s.Sheet != fogSheet))
            {
                throw new InvalidDataException("Fog sprites span multiple sheets. Try loading their sequences earlier.");
            }

            var fogBlend = fogSprites[0].BlendMode;

            if (fogSprites.Any(s => s.BlendMode != fogBlend))
            {
                throw new InvalidDataException("Fog sprites must all use the same blend mode.");
            }

            shroudLayer = new TerrainSpriteLayer(w, wr, shroudSheet, shroudBlend, wr.Palette(info.ShroudPalette), false);
            fogLayer    = new TerrainSpriteLayer(w, wr, fogSheet, fogBlend, wr.Palette(info.FogPalette), false);

            WorldOnRenderPlayerChanged(world.RenderPlayer);
        }
Example #4
0
        void IWorldLoaded.WorldLoaded(World world, WorldRenderer wr)
        {
            worldRenderer = wr;
            spriteLayer   = new TerrainSpriteLayer(world, wr, tileCache.MissingTile, BlendMode.Alpha, world.Type != WorldType.Editor);
            foreach (var cell in map.AllCells)
            {
                UpdateCell(cell);
            }

            map.Tiles.CellEntryChanged  += UpdateCell;
            map.Height.CellEntryChanged += UpdateCell;
        }
Example #5
0
        protected virtual void WorldLoaded(World w, WorldRenderer wr)
        {
            var sequences = w.Map.Rules.Sequences;

            foreach (var kv in Info.ResourceTypes)
            {
                var resourceInfo     = kv.Value;
                var resourceVariants = resourceInfo.Sequences
                                       .ToDictionary(v => v, v => sequences.GetSequence(resourceInfo.Image, v));
                Variants.Add(kv.Key, resourceVariants);

                if (spriteLayer == null)
                {
                    var first       = resourceVariants.First().Value.GetSprite(0);
                    var emptySprite = new Sprite(first.Sheet, Rectangle.Empty, TextureChannel.Alpha);
                    spriteLayer = new TerrainSpriteLayer(w, wr, emptySprite, first.BlendMode, wr.World.Type != WorldType.Editor);
                }

                if (shadowLayer == null)
                {
                    var firstWithShadow = resourceVariants.Values.FirstOrDefault(v => v.ShadowStart > 0);
                    if (firstWithShadow != null)
                    {
                        var first       = firstWithShadow.GetShadow(0, WAngle.Zero);
                        var emptySprite = new Sprite(first.Sheet, Rectangle.Empty, TextureChannel.Alpha);
                        shadowLayer = new TerrainSpriteLayer(w, wr, emptySprite, first.BlendMode, wr.World.Type != WorldType.Editor);
                    }
                }

                // All resources must share a blend mode
                var sprites = resourceVariants.Values.SelectMany(v => Exts.MakeArray(v.Length, x => v.GetSprite(x)));
                if (sprites.Any(s => s.BlendMode != spriteLayer.BlendMode))
                {
                    throw new InvalidDataException("Resource sprites specify different blend modes. "
                                                   + "Try using different ResourceRenderer traits for resource types that use different blend modes.");
                }
            }

            // Initialize the RenderContent with the initial map state so it is visible
            // through the fog with the Explored Map option enabled
            foreach (var cell in w.Map.AllCells)
            {
                var resource             = ResourceLayer.GetResource(cell);
                var rendererCellContents = CreateRenderCellContents(wr, resource, cell);
                if (rendererCellContents.Type != null)
                {
                    RenderContents[cell] = rendererCellContents;
                    UpdateRenderedSprite(cell, rendererCellContents);
                }
            }
        }
Example #6
0
        void IWorldLoaded.WorldLoaded(World w, WorldRenderer wr)
        {
            var resources = w.WorldActor.TraitsImplementing <ResourceType>()
                            .ToDictionary(r => r.Info.ResourceType, r => r);

            foreach (var r in resources)
            {
                if (spriteLayer == null)
                {
                    var first       = r.Value.Variants.First().Value.GetSprite(0);
                    var emptySprite = new Sprite(first.Sheet, Rectangle.Empty, TextureChannel.Alpha);
                    spriteLayer = new TerrainSpriteLayer(w, wr, emptySprite, first.BlendMode, wr.World.Type != WorldType.Editor);
                }

                if (shadowLayer == null)
                {
                    var firstWithShadow = r.Value.Variants.Values.FirstOrDefault(v => v.ShadowStart > 0);
                    if (firstWithShadow != null)
                    {
                        var first       = firstWithShadow.GetShadow(0, WAngle.Zero);
                        var emptySprite = new Sprite(first.Sheet, Rectangle.Empty, TextureChannel.Alpha);
                        shadowLayer = new TerrainSpriteLayer(w, wr, emptySprite, first.BlendMode, wr.World.Type != WorldType.Editor);
                    }
                }

                // All resources must share a blend mode
                var sprites = r.Value.Variants.Values.SelectMany(v => Exts.MakeArray(v.Length, x => v.GetSprite(x)));
                if (sprites.Any(s => s.BlendMode != spriteLayer.BlendMode))
                {
                    throw new InvalidDataException("Resource sprites specify different blend modes. "
                                                   + "Try using different ResourceRenderer traits for resource types that use different blend modes.");
                }
            }

            // Initialize the RenderContent with the initial map state
            // because the shroud may not be enabled.
            foreach (var cell in w.Map.AllCells)
            {
                var type = ResourceLayer.GetResource(cell).Type;
                if (type != null && Info.RenderTypes.Contains(type.Info.Type))
                {
                    var resourceContent      = ResourceLayer.GetResource(cell);
                    var rendererCellContents = new RendererCellContents(ChooseRandomVariant(resourceContent.Type), resourceContent.Type, resourceContent.Density);
                    RenderContent[cell] = rendererCellContents;
                    UpdateRenderedSprite(cell, rendererCellContents);
                }
            }
        }
        public void WorldLoaded(World w, WorldRenderer wr)
        {
            theater = wr.Theater;
            bi      = w.WorldActor.Trait <BuildingInfluence>();
            Sheet2D sh;

            if (string.IsNullOrEmpty(theater.tileset.MegaTexture))
            {
                sh = theater.Sheet;
            }
            else
            {
                sh = theater.sbMegaTexture.Current;
            }
            render = new TerrainSpriteLayer(w, wr, sh, BlendMode.Alpha, wr.Palette(info.Palette), wr.World.Type != WorldType.Editor, "BuildableTerrainLayer");
        }
Example #8
0
        public void WorldLoaded(World w, WorldRenderer wr)
        {
            var first = smudges.First().Value.First();
            var sheet = first.Sheet;

            if (smudges.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 (smudges.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);

            // Add map smudges
            foreach (var s in w.Map.SmudgeDefinitions)
            {
                var name = s.Key;
                var vals = name.Split(' ');
                var type = vals[0];

                if (!smudges.ContainsKey(type))
                {
                    continue;
                }

                var loc   = vals[1].Split(',');
                var cell  = new CPos(Exts.ParseIntegerInvariant(loc[0]), Exts.ParseIntegerInvariant(loc[1]));
                var depth = Exts.ParseIntegerInvariant(vals[2]);

                var smudge = new Smudge
                {
                    Type   = type,
                    Depth  = depth,
                    Sprite = smudges[type][depth]
                };

                tiles.Add(cell, smudge);
                render.Update(cell, smudge.Sprite);
            }
        }
Example #9
0
        void IWorldLoaded.WorldLoaded(World w, WorldRenderer wr)
        {
            render = new TerrainSpriteLayer(w, wr, disabledSprite, BlendMode.Alpha, wr.World.Type != WorldType.Editor);

            world.Map.Tiles.CellEntryChanged         += UpdateTerrainCell;
            world.Map.CustomTerrain.CellEntryChanged += UpdateTerrainCell;

            var cells = w.Map.AllCells.Where(c => w.Map.Contains(c) &&
                                             !info.AllowedTerrainTypes.Contains(w.Map.GetTerrainInfo(c).Type)).ToHashSet();

            palette = wr.Palette(info.Palette);

            foreach (var cell in cells)
            {
                UpdateTerrainCell(cell);
            }
        }
Example #10
0
        public void WorldLoaded(World w, WorldRenderer wr)
        {
            var first = smudges.First().Value.First();
            var sheet = first.Sheet;

            if (smudges.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 (smudges.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);

            // Add map smudges
            foreach (var kv in Info.InitialSmudges)
            {
                var s = kv.Value;
                if (!smudges.ContainsKey(s.Type))
                {
                    continue;
                }

                var smudge = new Smudge
                {
                    Type   = s.Type,
                    Depth  = s.Depth,
                    Sprite = smudges[s.Type][s.Depth]
                };

                tiles.Add(kv.Key, smudge);
                render.Update(kv.Key, smudge.Sprite);
            }
        }
Example #11
0
        public void WorldLoaded(World w, WorldRenderer wr)
        {
            var sprites   = smudges.Values.SelectMany(v => Exts.MakeArray(v.Length, x => v.GetSprite(x))).ToList();
            var sheet     = sprites[0].Sheet;
            var blendMode = sprites[0].BlendMode;

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

            if (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), w.Type != WorldType.Editor);

            // Add map smudges
            foreach (var kv in Info.InitialSmudges)
            {
                var s = kv.Value;
                if (!smudges.ContainsKey(s.Type))
                {
                    continue;
                }

                var seq    = smudges[s.Type];
                var smudge = new Smudge
                {
                    Type     = s.Type,
                    Depth    = s.Depth,
                    Sequence = seq
                };

                tiles.Add(kv.Key, smudge);
                render.Update(kv.Key, seq, s.Depth);
            }
        }
Example #12
0
        public void WorldLoaded(World w, WorldRenderer wr)
        {
            var sprites     = smudges.Values.SelectMany(v => Exts.MakeArray(v.Length, x => v.GetSprite(x))).ToList();
            var sheet       = sprites[0].Sheet;
            var blendMode   = sprites[0].BlendMode;
            var emptySprite = new Sprite(sheet, Rectangle.Empty, TextureChannel.Alpha);

            if (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.");
            }

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

            // Add map smudges
            foreach (var kv in Info.InitialSmudges)
            {
                var s = kv.Value;
                if (!smudges.ContainsKey(s.Type))
                {
                    continue;
                }

                var seq    = smudges[s.Type];
                var smudge = new Smudge
                {
                    Type     = s.Type,
                    Depth    = s.Depth,
                    Sequence = seq
                };

                tiles.Add(kv.Key, smudge);
                render.Update(kv.Key, seq, paletteReference, s.Depth);
            }
        }
Example #13
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);
                        }
                    }
                }
            }
        }
Example #14
0
 public void WorldLoaded(World w, WorldRenderer wr)
 {
     theater = wr.Theater;
     render  = new TerrainSpriteLayer(w, wr, theater.Sheet, BlendMode.Alpha, wr.Palette(info.Palette), wr.World.Type != WorldType.Editor);
 }
Example #15
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 mpos = new MPos(u, v);
                    var tile = tilesLayer[mpos];

                    if (tile.Type == 143)
                    {
                        ClearSides clear = ClearSides.None;

                        if (u > 0)
                        {
                            var leftPos  = new MPos(u - 1, v);
                            var leftTile = tilesLayer[leftPos];
                            if (!(leftTile.Type >= 126 && leftTile.Type <= 143) &&
                                !(leftTile.Type >= 160 && leftTile.Type <= 175))
                            {
                                clear |= ClearSides.Left;
                            }
                        }

                        if (v > 0)
                        {
                            var topPos  = new MPos(u, v - 1);
                            var topTile = tilesLayer[topPos];
                            if (!(topTile.Type >= 126 && topTile.Type <= 143) &&
                                !(topTile.Type >= 160 && topTile.Type <= 175))
                            {
                                clear |= ClearSides.Top;
                            }
                        }

                        if (u < tilesLayer.Size.Width - 1)
                        {
                            var rightPos  = new MPos(u + 1, v);
                            var rightTile = tilesLayer[rightPos];
                            if (!(rightTile.Type >= 126 && rightTile.Type <= 143) &&
                                !(rightTile.Type >= 160 && rightTile.Type <= 175))
                            {
                                clear |= ClearSides.Right;
                            }
                        }

                        if (v < tilesLayer.Size.Height - 1)
                        {
                            var bottomPos  = new MPos(u, v + 1);
                            var bottomTile = tilesLayer[bottomPos];
                            if (!(bottomTile.Type >= 126 && bottomTile.Type <= 143) &&
                                !(bottomTile.Type >= 160 && bottomTile.Type <= 175))
                            {
                                clear |= ClearSides.Bottom;
                            }
                        }

                        if (clear != ClearSides.None)
                        {
                            CPos   cpos   = mpos.ToCPos(w.Map);
                            Sprite sprite = sideSprites["rock"][SpriteMap[clear]];
                            render.Update(cpos, sprite);
                        }
                    }

                    if (tile.Type == 175)
                    {
                        ClearSides clear = ClearSides.None;

                        if (u > 0)
                        {
                            var leftPos  = new MPos(u - 1, v);
                            var leftTile = tilesLayer[leftPos];
                            if (!(leftTile.Type >= 160 && leftTile.Type <= 175))
                            {
                                clear |= ClearSides.Left;
                            }
                        }

                        if (v > 0)
                        {
                            var topPos  = new MPos(u, v - 1);
                            var topTile = tilesLayer[topPos];
                            if (!(topTile.Type >= 160 && topTile.Type <= 175))
                            {
                                clear |= ClearSides.Top;
                            }
                        }

                        if (u < tilesLayer.Size.Width - 1)
                        {
                            var rightPos  = new MPos(u + 1, v);
                            var rightTile = tilesLayer[rightPos];
                            if (!(rightTile.Type >= 160 && rightTile.Type <= 175))
                            {
                                clear |= ClearSides.Right;
                            }
                        }

                        if (v < tilesLayer.Size.Height - 1)
                        {
                            var bottomPos  = new MPos(u, v + 1);
                            var bottomTile = tilesLayer[bottomPos];
                            if (!(bottomTile.Type >= 160 && bottomTile.Type <= 175))
                            {
                                clear |= ClearSides.Bottom;
                            }
                        }

                        if (clear != ClearSides.None)
                        {
                            CPos   cpos   = mpos.ToCPos(w.Map);
                            Sprite sprite = sideSprites["rough"][SpriteMap[clear]];
                            render.Update(cpos, sprite);
                        }
                    }

                    if (tile.Type == 159)
                    {
                        ClearSides clear = ClearSides.None;

                        if (u > 0)
                        {
                            var leftPos  = new MPos(u - 1, v);
                            var leftTile = tilesLayer[leftPos];
                            if (!(leftTile.Type >= 144 && leftTile.Type <= 159))
                            {
                                clear |= ClearSides.Left;
                            }
                        }

                        if (v > 0)
                        {
                            var topPos  = new MPos(u, v - 1);
                            var topTile = tilesLayer[topPos];
                            if (!(topTile.Type >= 144 && topTile.Type <= 159))
                            {
                                clear |= ClearSides.Top;
                            }
                        }

                        if (u < tilesLayer.Size.Width - 1)
                        {
                            var rightPos  = new MPos(u + 1, v);
                            var rightTile = tilesLayer[rightPos];
                            if (!(rightTile.Type >= 144 && rightTile.Type <= 159))
                            {
                                clear |= ClearSides.Right;
                            }
                        }

                        if (v < tilesLayer.Size.Height - 1)
                        {
                            var bottomPos  = new MPos(u, v + 1);
                            var bottomTile = tilesLayer[bottomPos];
                            if (!(bottomTile.Type >= 144 && bottomTile.Type <= 159))
                            {
                                clear |= ClearSides.Bottom;
                            }
                        }

                        if (clear != ClearSides.None)
                        {
                            CPos   cpos   = mpos.ToCPos(w.Map);
                            Sprite sprite = sideSprites["dune"][SpriteMap[clear]];
                            render.Update(cpos, sprite);
                        }
                    }
                }
            }
        }
Example #16
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);
                        }
                    }
                }
            }
        }
Example #17
0
 public void WorldLoaded(World w, WorldRenderer wr)
 {
     theater = wr.Theater;
     bi      = w.WorldActor.Trait <BuildingInfluence>();
     render  = new TerrainSpriteLayer(w, wr, theater.Sheet, BlendMode.Alpha, wr.Palette(info.Palette), wr.World.Type != WorldType.Editor);
 }
Example #18
0
 void IWorldLoaded.WorldLoaded(World w, WorldRenderer wr)
 {
     render           = new TerrainSpriteLayer(w, wr, terrainRenderer.MissingTile, BlendMode.Alpha, wr.World.Type != WorldType.Editor);
     paletteReference = wr.Palette(info.Palette);
 }