예제 #1
0
        protected internal override void CreateItems()
        {
            var keyPos = _anteroom.Random();

            while (!passable[keyPos])
            {
                keyPos = _anteroom.Random();
            }

            Drop(new IronKey(), keyPos).HeapType = Heap.Type.Chest;

            var item = Bones.Get();

            if (item == null)
            {
                return;
            }
            int pos;

            do
            {
                pos = RoomEntrance.Random();
            }while (pos == entrance || map[pos] == Terrain.SIGN);

            Drop(item, pos).HeapType = Heap.Type.Skeleton;
        }
예제 #2
0
        protected internal override void Decorate()
        {
            var start = RoomExit.Top * Width + RoomExit.Left + 1;
            var end   = start + RoomExit.Width() - 1;

            for (var i = start; i < end; i++)
            {
                if (i != exit)
                {
                    map[i]         = Terrain.WALL_DECO;
                    map[i + Width] = Terrain.WATER;
                }
                else
                {
                    map[i + Width] = Terrain.EMPTY;
                }
            }

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

                if (pos == entrance)
                {
                    continue;
                }

                map[pos] = Terrain.SIGN;
                break;
            }
        }
예제 #3
0
        protected internal override void Decorate()
        {
            for (var i = 0; i < Length; i++)
            {
                if (map[i] == Terrain.EMPTY && pdsharp.utils.Random.Int(10) == 0)
                {
                    map[i] = Terrain.EMPTY_DECO;
                }
                else
                if (map[i] == Terrain.WALL && pdsharp.utils.Random.Int(8) == 0)
                {
                    map[i] = Terrain.WALL_DECO;
                }
            }

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

                if (pos == entrance)
                {
                    continue;
                }

                map[pos] = Terrain.SIGN;
                break;
            }
        }
예제 #4
0
        protected internal override void CreateItems()
        {
            var item = Bones.Get();

            if (item == null)
            {
                return;
            }

            int pos;

            do
            {
                pos = RoomEntrance.Random();
            }while (pos == entrance || map[pos] == Terrain.SIGN);

            Drop(item, pos).HeapType = Heap.Type.Skeleton;
        }
예제 #5
0
        protected internal override void Decorate()
        {
            for (var i = 0; i < Width; i++)
            {
                if (map[i] == Terrain.WALL && map[i + Width] == Terrain.WATER && 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.WATER && Random.Int(2) == 0)
                {
                    map[i] = Terrain.WALL_DECO;
                }
            }

            for (var i = Width + 1; i < Length - Width - 1; i++)
            {
                if (map[i] == Terrain.EMPTY)
                {
                    var count = (map[i + 1] == Terrain.WALL ? 1 : 0) + (map[i - 1] == Terrain.WALL ? 1 : 0) + (map[i + Width] == Terrain.WALL ? 1 : 0) + (map[i - Width] == Terrain.WALL ? 1 : 0);

                    if (Random.Int(16) < count * count)
                    {
                        map[i] = Terrain.EMPTY_DECO;
                    }
                }
            }

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

                if (pos == entrance)
                {
                    continue;
                }

                map[pos] = Terrain.SIGN;
                break;
            }
        }
예제 #6
0
        protected internal override void Decorate()
        {
            for (var i = Width + 1; i < Length - Width - 1; i++)
            {
                switch (map[i])
                {
                case Terrain.EMPTY:
                {
                    var count = NEIGHBOURS8.Count(neighbour => (Terrain.Flags[map[i + neighbour]] & Terrain.PASSABLE) > 0);

                    if (pdsharp.utils.Random.Int(80) < count)
                    {
                        map[i] = Terrain.EMPTY_DECO;
                    }
                }
                break;

                case Terrain.WALL:
                {
                    var count = NEIGHBOURS4.Count(neighbour => map[i + neighbour] == Terrain.WATER);

                    if (pdsharp.utils.Random.Int(4) < count)
                    {
                        map[i] = Terrain.WALL_DECO;
                    }
                }
                break;
                }
            }

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

                if (pos == entrance)
                {
                    continue;
                }

                map[pos] = Terrain.SIGN;
                break;
            }
        }
예제 #7
0
        protected internal override void Decorate()
        {
            foreach (var room in Rooms)
            {
                if (room.type != RoomType.STANDARD)
                {
                    continue;
                }

                if (room.Width() <= 3 || room.Height() <= 3)
                {
                    continue;
                }

                var s = room.Square();

                if (Random.Int(s) > 8)
                {
                    var corner = (room.Left + 1) + (room.Top + 1) * Width;
                    if (map[corner - 1] == Terrain.WALL && map[corner - Width] == Terrain.WALL)
                    {
                        map[corner] = Terrain.WALL;
                    }
                }

                if (Random.Int(s) > 8)
                {
                    var corner = (room.Right - 1) + (room.Top + 1) * Width;
                    if (map[corner + 1] == Terrain.WALL && map[corner - Width] == Terrain.WALL)
                    {
                        map[corner] = Terrain.WALL;
                    }
                }

                if (Random.Int(s) > 8)
                {
                    var corner = (room.Left + 1) + (room.Bottom - 1) * Width;
                    if (map[corner - 1] == Terrain.WALL && map[corner + Width] == Terrain.WALL)
                    {
                        map[corner] = Terrain.WALL;
                    }
                }

                if (Random.Int(s) > 8)
                {
                    var corner = (room.Right - 1) + (room.Bottom - 1) * Width;
                    if (map[corner + 1] == Terrain.WALL && map[corner + Width] == Terrain.WALL)
                    {
                        map[corner] = Terrain.WALL;
                    }
                }

                foreach (var n in room.Connected.Keys)
                {
                    if ((n.type == RoomType.STANDARD || n.type == RoomType.TUNNEL) && Random.Int(3) == 0)
                    {
                        Painter.Set(this, room.Connected[n], Terrain.EMPTY_DECO);
                    }
                }
            }

            for (var i = Width + 1; i < Length - Width; i++)
            {
                if (map[i] != Terrain.EMPTY)
                {
                    continue;
                }

                var n = 0;
                if (map[i + 1] == Terrain.WALL)
                {
                    n++;
                }

                if (map[i - 1] == Terrain.WALL)
                {
                    n++;
                }

                if (map[i + Width] == Terrain.WALL)
                {
                    n++;
                }

                if (map[i - Width] == Terrain.WALL)
                {
                    n++;
                }

                if (Random.Int(6) <= n)
                {
                    map[i] = Terrain.EMPTY_DECO;
                }
            }

            for (var i = 0; i < Length; i++)
            {
                if (map[i] == Terrain.WALL && Random.Int(12) == 0)
                {
                    map[i] = Terrain.WALL_DECO;
                }
            }

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

                if (pos == entrance)
                {
                    continue;
                }

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

            if (Dungeon.BossLevel(Dungeon.Depth + 1))
            {
                return;
            }

            foreach (var r in Rooms)
            {
                if (r.type != RoomType.STANDARD)
                {
                    continue;
                }

                foreach (var n in r.Neigbours)
                {
                    if (n.type != RoomType.STANDARD || r.Connected.ContainsKey(n))
                    {
                        continue;
                    }

                    var w = r.Intersect(n);
                    if (w.Left == w.Right && w.Bottom - w.Top >= 5)
                    {
                        w.Top    += 2;
                        w.Bottom -= 1;

                        w.Right++;

                        Painter.Fill(this, w.Left, w.Top, 1, w.Height(), Terrain.CHASM);
                    }
                    else
                    if (w.Top == w.Bottom && w.Right - w.Left >= 5)
                    {
                        w.Left  += 2;
                        w.Right -= 1;

                        w.Bottom++;

                        Painter.Fill(this, w.Left, w.Top, w.Width(), 1, Terrain.CHASM);
                    }
                }
            }
        }
예제 #8
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.05f;
                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 (pdsharp.utils.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) && pdsharp.utils.Random.Int(6) == 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) && pdsharp.utils.Random.Int(3) == 0)
                {
                    map[i] = Terrain.WALL_DECO;
                }
            }

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

                if (pos == entrance)
                {
                    continue;
                }

                map[pos] = Terrain.SIGN;
                break;
            }
        }
예제 #9
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);
        }