Example #1
0
        protected override bool Build()
        {
            InitRooms();

            int distance;
            var retry = 0;

            do
            {
                if (retry++ > 10)
                {
                    return(false);
                }

                var innerRetry = 0;
                do
                {
                    if (innerRetry++ > 10)
                    {
                        return(false);
                    }

                    RoomEntrance = Random.Element(Rooms);
                } while (RoomEntrance.Width() < 4 || RoomEntrance.Height() < 4);

                innerRetry = 0;
                do
                {
                    if (innerRetry++ > 10)
                    {
                        return(false);
                    }

                    RoomExit = Random.Element(Rooms);
                }while (RoomExit == RoomEntrance || RoomExit.Width() < 7 || RoomExit.Height() < 7 || RoomExit.Top == 0);

                Graph.BuildDistanceMap(Rooms, RoomExit);
                distance = Graph.BuildPath(Rooms, RoomEntrance, RoomExit).Count;
            } while (distance < 3);

            RoomEntrance.type = RoomType.ENTRANCE;
            RoomExit.type     = RoomType.BOSS_EXIT;

            var path = Graph.BuildPath(Rooms, RoomEntrance, RoomExit);

            Graph.SetPrice(path, RoomEntrance.distance);

            Graph.BuildDistanceMap(Rooms, RoomExit);
            path = Graph.BuildPath(Rooms, RoomEntrance, RoomExit);

            _anteroom      = path[path.Count - 2];
            _anteroom.type = RoomType.STANDARD;

            var room = RoomEntrance;

            foreach (var next in path)
            {
                room.Connect(next);
                room = next;
            }

            foreach (var room1 in Rooms.Where(room1 => room1.type == RoomType.NULL && room1.Connected.Count > 0))
            {
                room1.type = RoomType.PASSAGE;
            }

            Paint();

            var r = RoomExit.Connected.Keys.ToArray()[0];

            if (RoomExit.Connected[r].Y == RoomExit.Top)
            {
                return(false);
            }

            PaintWater();
            PaintGrass();

            PlaceTraps();

            return(true);
        }
Example #2
0
        protected override bool Build()
        {
            InitRooms();

            int distance;
            var retry       = 0;
            var minDistance = (int)Math.Sqrt(Rooms.Count);

            do
            {
                var innerRetry = 0;
                do
                {
                    if (innerRetry++ > 10)
                    {
                        return(false);
                    }

                    RoomEntrance = pdsharp.utils.Random.Element(Rooms);
                }while (RoomEntrance.Width() < 4 || RoomEntrance.Height() < 4);

                innerRetry = 0;
                do
                {
                    if (innerRetry++ > 10)
                    {
                        return(false);
                    }

                    RoomExit = pdsharp.utils.Random.Element(Rooms);
                }while (RoomExit == RoomEntrance || RoomExit.Width() < 6 || RoomExit.Height() < 6 || RoomExit.Top == 0);

                Graph.BuildDistanceMap(Rooms, RoomExit);
                distance = RoomEntrance.Distance();

                if (retry++ > 10)
                {
                    return(false);
                }
            }while (distance < minDistance);

            RoomEntrance.type = RoomType.ENTRANCE;
            RoomExit.type     = RoomType.BOSS_EXIT;

            Graph.BuildDistanceMap(Rooms, RoomExit);
            var path = Graph.BuildPath(Rooms, RoomEntrance, RoomExit);

            Graph.SetPrice(path, RoomEntrance.distance);

            Graph.BuildDistanceMap(Rooms, RoomExit);
            path = Graph.BuildPath(Rooms, RoomEntrance, RoomExit);

            var room = RoomEntrance;

            foreach (var next in path)
            {
                room.Connect(next);
                room = next;
            }

            room = RoomExit.Connected.Keys.First();
            if (RoomExit.Top == room.Bottom)
            {
                return(false);
            }

            foreach (var r in Rooms.Where(r => r.type == RoomType.NULL && r.Connected.Count > 0))
            {
                r.type = RoomType.TUNNEL;
            }

            var candidates = new List <Room>();

            foreach (var r in RoomExit.Neigbours)
            {
                if (!RoomExit.Connected.ContainsKey(r) && (RoomExit.Left == r.Right || RoomExit.Right == r.Left || RoomExit.Bottom == r.Top))
                {
                    candidates.Add(r);
                }
            }

            if (candidates.Count > 0)
            {
                var kingsRoom = pdsharp.utils.Random.Element(candidates);
                kingsRoom.Connect(RoomExit);
                kingsRoom.type = RoomType.RAT_KING;
            }

            Paint();

            PaintWater();
            PaintGrass();

            PlaceTraps();

            return(true);
        }
Example #3
0
        protected internal override void Decorate()
        {
            for (var i = Width + 1; i < Length - Width - 1; i++)
            {
                if (map[i] != Terrain.EMPTY)
                {
                    continue;
                }

                var c = 0.15f;
                if (map[i + 1] == Terrain.WALL && map[i + Width] == Terrain.WALL)
                {
                    c += 0.2f;
                }
                if (map[i - 1] == Terrain.WALL && map[i + Width] == Terrain.WALL)
                {
                    c += 0.2f;
                }
                if (map[i + 1] == Terrain.WALL && map[i - Width] == Terrain.WALL)
                {
                    c += 0.2f;
                }
                if (map[i - 1] == Terrain.WALL && map[i - Width] == Terrain.WALL)
                {
                    c += 0.2f;
                }

                if (Random.Float() < c)
                {
                    map[i] = Terrain.EMPTY_DECO;
                }
            }

            for (var i = 0; i < Width; i++)
            {
                if (map[i] == Terrain.WALL && (map[i + Width] == Terrain.EMPTY || map[i + Width] == Terrain.EMPTY_SP) && Random.Int(4) == 0)
                {
                    map[i] = Terrain.WALL_DECO;
                }
            }

            for (var i = Width; i < Length - Width; i++)
            {
                if (map[i] == Terrain.WALL && map[i - Width] == Terrain.WALL && (map[i + Width] == Terrain.EMPTY || map[i + Width] == Terrain.EMPTY_SP) && Random.Int(2) == 0)
                {
                    map[i] = Terrain.WALL_DECO;
                }
            }

            while (true)
            {
                var pos = RoomEntrance.Random();

                if (pos == entrance)
                {
                    continue;
                }

                map[pos] = Terrain.SIGN;
                break;
            }

            var door = RoomExit.Entrance();

            _arenaDoor = door.X + door.Y * Width;
            Painter.Set(this, _arenaDoor, Terrain.LOCKED_DOOR);

            Painter.Fill(this, RoomExit.Left + 2, RoomExit.Top + 2, RoomExit.Width() - 3, RoomExit.Height() - 3, Terrain.INACTIVE_TRAP);
        }
Example #4
0
        protected override bool Build()
        {
            InitRooms();

            int distance;
            var retry       = 0;
            var minDistance = (int)Math.Sqrt(Rooms.Count);

            do
            {
                var innerRetry = 0;
                do
                {
                    if (innerRetry++ > 10)
                    {
                        return(false);
                    }

                    RoomEntrance = pdsharp.utils.Random.Element(Rooms);
                }while (RoomEntrance.Width() < 4 || RoomEntrance.Height() < 4);

                innerRetry = 0;
                do
                {
                    if (innerRetry++ > 10)
                    {
                        return(false);
                    }

                    RoomExit = pdsharp.utils.Random.Element(Rooms);
                }while (RoomExit == RoomEntrance || RoomExit.Width() < 6 || RoomExit.Height() < 6 || RoomExit.Top == 0);

                Graph.BuildDistanceMap(Rooms, RoomExit);
                distance = Graph.BuildPath(Rooms, RoomEntrance, RoomExit).Count;

                if (retry++ > 10)
                {
                    return(false);
                }
            }while (distance < minDistance);

            RoomEntrance.type = RoomType.ENTRANCE;
            RoomExit.type     = RoomType.EXIT;

            Graph.BuildDistanceMap(Rooms, RoomExit);
            var path = Graph.BuildPath(Rooms, RoomEntrance, RoomExit);

            Graph.SetPrice(path, RoomEntrance.distance);

            Graph.BuildDistanceMap(Rooms, RoomExit);
            path = Graph.BuildPath(Rooms, RoomEntrance, RoomExit);

            var room = RoomEntrance;

            foreach (var next in path)
            {
                room.Connect(next);
                room = next;
            }

            Room roomShop   = null;
            var  shopSquare = 0;

            foreach (var r in Rooms)
            {
                if (r.type != RoomType.NULL || r.Connected.Count <= 0)
                {
                    continue;
                }

                r.type = RoomType.PASSAGE;

                if (r.Square() <= shopSquare)
                {
                    continue;
                }

                roomShop   = r;
                shopSquare = r.Square();
            }

            if (roomShop == null || shopSquare < 30)
            {
                return(false);
            }

            roomShop.type = Imp.Quest.IsCompleted ? RoomType.SHOP : RoomType.STANDARD;

            Paint();

            PaintWater();
            PaintGrass();

            return(true);
        }