def evaluate_bounds_are_of_type(self, bounds, type_id): sum = 0 position = Vector(0, 0) # Bottom horizontal bound position.y = bounds.y_min for x in range(bounds.x_min, bounds.x_max): position.x = x sum += self.evaluate_tile_type(position, type_id) # Top horizontal bound position.y = bounds.y_max - 1 for x in range(bounds.x_min, bounds.x_max): position.x = x sum += self.evaluate_tile_type(position, type_id) # Left vertical bound position.x = bounds.x_min for y in range(bounds.y_min, bounds.y_max - 1): position.y = y sum += self.evaluate_tile_type(position, type_id) # Right vertical bound position.x = bounds.x_max - 1 for y in range(bounds.y_min + 1, bounds.y_max - 1): position.y = y sum += self.evaluate_tile_type(position, type_id) return sum
def evaluate_tiles_in_bounds_are_of_type(self, bounds, type_id): sum = 0 position = Vector(0, 0) for x in range(bounds.x_min, bounds.x_max): position.x = x for y in range(bounds.y_min, bounds.y_max): position.y = y sum += self.evaluate_tile_type(position, type_id) return sum
def is_room(self, start_position, area_bounds): found_floor = False current_position = Vector(start_position.x, start_position.y + 1) # Check vertical for the room bounds while (current_position.y <= area_bounds.y_max and not found_floor): if not self.is_tile_of_type(current_position, TILE_TYPES["WALL"]): found_floor = True current_position.y -= 1 else: current_position.y += 1 room_bounds_y = current_position.y next_position = room_bounds_y + 1 if not found_floor or room_bounds_y == start_position.y: return False, next_position, None # Check horizontal for the room bounds found_floor = False current_position.x += 1 while (current_position.x <= area_bounds.x_max and not found_floor): if not self.is_tile_of_type(current_position, TILE_TYPES["WALL"]): found_floor = True current_position.x -= 1 else: current_position.x += 1 room_bounds_x = current_position.x if not found_floor or room_bounds_x == start_position.x: return False, next_position, None # Check vertical with the bounds found for y for y in range(start_position.y, room_bounds_y + 1): current_position.y = y if not self.is_tile_of_type(current_position, TILE_TYPES["WALL"]): return False, next_position, None # Check horizontal with the bounds found for y current_position.y = start_position.y for x in range(start_position.x, room_bounds_x + 1): current_position.x = x if not self.is_tile_of_type(current_position, TILE_TYPES["WALL"]): return False, next_position, None if abs(start_position.x - room_bounds_x) == 1 or \ abs(start_position.y - room_bounds_y) == 1: return False, next_position, None room_bounds = Bounds(start_position.x, start_position.y, room_bounds_x, room_bounds_y) return True, next_position, room_bounds
def find_rooms(self, bounds): room_areas = list() position = Vector(0, 0) # Evaluate the area for rooms next_position = 0 for x in range(bounds.x_min, bounds.x_max): position.x = x for y in range(bounds.y_min, bounds.y_max): position.y = y if self.is_tile_of_type(position, TILE_TYPES["WALL"]): # Found wall tile result, next_position, room_bounds = self.is_room( position, bounds) if result: room_areas.append(room_bounds) self.rooms = room_areas return room_areas