def __merge_rooms(self, _sqrs, _floors): _rooms = split_sets(_floors) while len(_rooms.keys()) > 1: _start = self.__pick_room(_rooms) _dir = self.__pick_dir(_start.value) r = _start.value[0]+_dir[0] c = _start.value[1]+_dir[1] _reject = False while self.__look_ahead(_sqrs, _start, _dir, r, c): r += _dir[0] c += _dir[1] if not self.__in_bounds(r,c): _reject = True break if _reject: continue if not self.__check_for_short_hallway(r, c, _dir, _sqrs, _start): if self.__vet_door(r, c, _dir, _sqrs, _start): union(_start, _sqrs[r][c]) union(_start, _sqrs[r+_dir[0]][c+_dir[1]]) if randrange(4) < 3: self._map[r][c] = self.__tf.get_terrain_tile(DOOR) else: self._map[r][c] = self.__floor _rooms = split_sets(_floors)
def __join_rooms(self): # divide the square into equivalence classes for r in range(1,self.__length-1): for c in range(1,self.__width-1): self.__union_adj_sqr(r,c) _nodes = [] for _row in self.ds_nodes: for _node in _row: _n = _node.value if self.map[_n[0]][_n[1]].get_type() == FLOOR: _nodes.append(_node) all_caves = split_sets(_nodes) for cave in all_caves.keys(): self.join_points(all_caves[cave][0].value)
def __discover_rooms(self): _sqrs = [] for r in range(1, len(self._map) - 1): _row = [] for c in range(1, len(self._map[0]) - 1): _row.append(DSNode((r,c, self._map[r][c]))) _sqrs.append(_row) _floors = [] for _row in _sqrs: for _item in _row: if _item.value[2].get_type() == FLOOR: _floors.append(_item) self.__mark_adjacent(_item, _sqrs) self.__record_rooms(split_sets(_floors)) self.__merge_rooms(_sqrs, _floors)