Exemple #1
0
        public static void initializeDungeon()
        {
            rooms_in_dungeon = new List <Room>();

            Room first_room = new Room(0, 0, 5, 10);

            first_room.id    = 0;
            first_room.depth = 0;
            first_room.fillRoom();
            rooms_in_dungeon.Add(first_room);

            Dungeon.max_x_position = 10;
            Dungeon.max_y_position = 5;
            Dungeon.min_x_position = 0;
            Dungeon.min_y_position = 0;
        }
Exemple #2
0
        static public void insertRoomInsideRoom(Room room)
        {
            int  innerRoom_X_Position;
            int  innerRoom_Y_Position;
            int  innerRoomWidth;
            int  innerRoomHeight;
            int  tries     = 0;
            bool collision = true;  // innerRoom must be fully inside room
            bool door_set  = false; // it could occur there is no space left for a door

            if (room.width > 7 && room.height > 7)
            {
                do
                {
                    innerRoomWidth       = getRoomSize();
                    innerRoomHeight      = getRoomSize();
                    innerRoom_X_Position = Navigation.pseudoRandom.Next(1, room.width - 6);
                    innerRoom_Y_Position = Navigation.pseudoRandom.Next(1, room.height - 6);
                    if (innerRoom_X_Position + innerRoomWidth < room.width &&
                        innerRoom_Y_Position + innerRoomHeight < room.height)
                    {
                        collision = false;
                    }
                    tries++;
                } while (tries < 10 && collision);
                if (!collision)
                {
                    Room innerRoom = new Room(innerRoom_X_Position + room.position_x, innerRoom_Y_Position + room.position_y, innerRoomHeight, innerRoomWidth);
                    innerRoom.id          = Dungeon.rooms_in_dungeon.Count;
                    innerRoom.isInnerRoom = true;
                    innerRoom.fillRoom();

                    door_set = setDoorInInnerRoom(room, innerRoom, Navigation.pseudoRandom);
                    if (door_set)
                    {
                        room.inner_rooms.Add(Dungeon.rooms_in_dungeon.Count);
                        setWallAroundObject(room, innerRoom.position_x, innerRoom.position_y, innerRoom.width, innerRoom.height); //?
                        Dungeon.rooms_in_dungeon.Add(innerRoom);
                    }
                }
            }
        }
Exemple #3
0
        public bool create_child_room(bool isBump)
        {
            int direction;
            int child_width;
            int child_height;
            int tile_with_door = 0;

            int pos_x_son = 0;
            int pos_y_son = 0;

            int number_of_tries     = 0;
            int max_number_of_tries = 5;

            bool collision = false;

            Room child_room;

            do
            {
                direction = Navigation.getDirection();
                if (isBump)
                {
                    //Bump rooms use uniform distribution sizes
                    child_width  = Navigation.pseudoRandom.Next(Dungeon.bump_min_side, Dungeon.bump_max_side);
                    child_height = Navigation.pseudoRandom.Next(Dungeon.bump_min_side, Dungeon.bump_max_side);
                }
                else
                {
                    //Rest of the rooms use normal distribution sizes
                    child_width  = DungeonTools.getRoomSize();
                    child_height = DungeonTools.getRoomSize();
                }
                switch (direction)
                {
                case 0:
                    tile_with_door = Navigation.pseudoRandom.Next(1, this.width - 2);
                    pos_x_son      = Navigation.pseudoRandom.Next(this.position_x + tile_with_door - child_width + 2, this.position_x + tile_with_door - 1);
                    pos_y_son      = this.position_y - child_height;
                    break;

                case 1:
                    tile_with_door = Navigation.pseudoRandom.Next(1, this.height - 2);
                    pos_x_son      = this.position_x + this.width;
                    pos_y_son      = Navigation.pseudoRandom.Next(this.position_y + tile_with_door - child_height + 2, this.position_y + tile_with_door - 1);
                    break;

                case 2:
                    tile_with_door = Navigation.pseudoRandom.Next(1, this.width - 2);
                    pos_x_son      = Navigation.pseudoRandom.Next(this.position_x + tile_with_door - child_width + 2, this.position_x + tile_with_door - 1);
                    pos_y_son      = this.position_y + this.height;
                    break;

                case 3:
                    tile_with_door = Navigation.pseudoRandom.Next(1, this.height - 2);
                    pos_x_son      = this.position_x - child_width;
                    pos_y_son      = Navigation.pseudoRandom.Next(this.position_y + tile_with_door - child_height + 2, this.position_y + tile_with_door - 1);
                    break;
                }
                child_room            = new Room(pos_x_son, pos_y_son, child_height, child_width);
                child_room.id         = Dungeon.rooms_in_dungeon.Count;
                child_room.depth      = this.depth + 1;
                child_room.isBumpRoom = isBump;

                number_of_tries++;
                //Ensure there's no collision before adding the room to the dungeon!
                collision = DungeonTools.detectDungeonCollision(child_room, Dungeon.rooms_in_dungeon);
            } while ((number_of_tries < max_number_of_tries) && collision);

            //Corridors may not be suited for the deepest graph nodes
            if ((DungeonTools.isCorridor(child_room) && child_room.depth > Dungeon.max_depth_for_corridors) ||
                (child_room.isBumpRoom && !Dungeon.bumpsCanReproduce && DungeonTools.isCorridor(child_room)))
            {
                collision = true;
            }

            if (!collision)
            {
                child_room.fillRoom();
                switch (direction)
                {
                case 0:
                    DungeonTools.setDoorInRoom(this, direction, position_x + tile_with_door, position_y);
                    DungeonTools.setDoorInRoom(child_room, (direction + 2) % 4, position_x + tile_with_door, position_y - 1);
                    break;

                case 1:
                    DungeonTools.setDoorInRoom(this, direction, position_x + width - 1, position_y + tile_with_door);
                    DungeonTools.setDoorInRoom(child_room, (direction + 2) % 4, position_x + width, position_y + tile_with_door);
                    break;

                case 2:
                    DungeonTools.setDoorInRoom(this, direction, position_x + tile_with_door, position_y + height - 1);
                    DungeonTools.setDoorInRoom(child_room, (direction + 2) % 4, position_x + tile_with_door, position_y + this.height);
                    break;

                case 3:
                    DungeonTools.setDoorInRoom(this, direction, position_x, position_y + tile_with_door);
                    DungeonTools.setDoorInRoom(child_room, (direction + 2) % 4, position_x - 1, position_y + tile_with_door);
                    break;
                }
                if (child_room.position_x < Dungeon.min_x_position)
                {
                    Dungeon.min_x_position = child_room.position_x;
                }
                if (child_room.position_y < Dungeon.min_y_position)
                {
                    Dungeon.min_y_position = child_room.position_y;
                }
                if (child_room.position_x + child_room.width > Dungeon.max_x_position)
                {
                    Dungeon.max_x_position = child_room.position_x + child_room.width;
                }
                if (child_room.position_y + child_room.height > Dungeon.max_y_position)
                {
                    Dungeon.max_y_position = child_room.position_y + child_room.height;
                }
                if (isBump)
                {
                    this.bump_rooms.Add(child_room.id);
                    DungeonTools.mergeBumpRoom(this, child_room, direction);
                }

                Dungeon.rooms_in_dungeon.Add(child_room);
                this.child_rooms.Add(child_room.id);
            }
            return(!collision);
        }