コード例 #1
0
        public virtual List <Room> Fill(LevelComponent level, DefiningMapFragment fragment)
        {
            InitializeTerrain(level, fragment);
            var rooms = PlaceDefiningMapFragment(level, fragment);

            PlaceSurroundingFragments(level, rooms);

            return(rooms);
        }
コード例 #2
0
 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;
         }
     }
 }
コード例 #3
0
        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);
        }
コード例 #4
0
 public override List <Room> Fill(LevelComponent level, DefiningMapFragment fragment)
 {
     _lotSize = MaxLotSize;
     return(base.Fill(level, fragment));
 }
コード例 #5
0
        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);
            }
        }