public virtual List <Room> Fill(LevelComponent level, DefiningMapFragment fragment) { InitializeTerrain(level, fragment); var rooms = PlaceDefiningMapFragment(level, fragment); PlaceSurroundingFragments(level, rooms); return(rooms); }
protected void InitializeTerrain(LevelComponent level, DefiningMapFragment fragment) { level.TerrainChanges = null; level.WallNeighboursChanges = null; if (fragment.DefaultTerrain != MapFeature.Default) { for (var index = 0; index < level.Terrain.Length; index++) { level.Terrain[index] = (byte)fragment.DefaultTerrain; } } }
protected List <Room> PlaceDefiningMapFragment(LevelComponent level, DefiningMapFragment fragment) { var rooms = new List <Room>(); var room = fragment.TryPlace(level, level.BoundingRectangle); if (room != null) { rooms.Add(room); } // TODO: place nested fragments if needed return(rooms); }
public override List <Room> Fill(LevelComponent level, DefiningMapFragment fragment) { _lotSize = MaxLotSize; return(base.Fill(level, fragment)); }
private void BuildRoomTest(string map) { var game = TestHelper.CreateGame((uint)Environment.TickCount); var fragment = new DefiningMapFragment { Map = map, Layout = new EmptyLayout { Coverage = 0 }, CreatureGenerator = new CreatureGenerator { ExpectedInitialCount = 0 }, ItemGenerator = new ItemGenerator { ExpectedInitialCount = 0 } }; fragment.EnsureInitialized(game); var byteMap = fragment.ByteMap; fragment.ByteMap = new byte[0]; var(level, rooms) = TestHelper.CreateLevel(fragment, game); var input = new List <Point>(); var expectedInside = new List <Point>(); var expectedPerimeter = new List <Point>(); var expectedOutside = new List <Point>(); fragment.ByteMap = byteMap; fragment.WriteMap(new Point(0, 0), level, (c, point, _, s) => { if (c != ' ') { input.Add(point); } switch (c) { case 'I': s.expectedInside.Add(point); break; case 'P': s.expectedPerimeter.Add(point); break; case 'O': s.expectedOutside.Add(point); break; } }, (expectedInside, expectedPerimeter, expectedOutside)); var inside = new List <Point>(); var perimeter = new List <Point>(); var outside = new List <Point>(); var room = fragment.BuildRoom(level, input, inside.Add, perimeter.Add, outside.Add); try { Assert.Equal(fragment.Width, room.BoundingRectangle.Width); Assert.Equal(fragment.Height, room.BoundingRectangle.Height); TestAssert.Equal(expectedInside, inside, ""); TestAssert.Equal(expectedPerimeter, perimeter.Distinct(), ""); TestAssert.Equal(expectedOutside, outside, ""); Point?firstPoint = null; Point?lastPoint = null; foreach (var point in perimeter) { if (firstPoint == null) { firstPoint = point; lastPoint = point; } else { Assert.Equal(1, lastPoint.Value.OrthogonalDistanceTo(point)); lastPoint = point; } } if (perimeter.Count > 1) { Assert.Equal(1, firstPoint.Value.OrthogonalDistanceTo(lastPoint.Value)); } } catch (Exception e) { throw new InvalidOperationException("Seed: " + level.Game.InitialSeed, e); } }