/* 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); } } } }
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); } } } } }
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); } } } } }