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; }
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); } } } }
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); }