def create(self, nav_grid, map_data, config, max_area_size, max_area_size_merged): """ Creates navigation areas from a navigation grid. """ self.map_data = map_data self.config = config self.nav_grid = nav_grid self.max_area_size = max_area_size self.max_area_size_merged = max_area_size_merged self.max_size_elements = self.max_area_size / self.nav_grid.element_size # Determine the area where to test for elements. grid_area = Rectangle() grid_area.left = self.nav_grid.map_data.min.x / self.nav_grid.element_size grid_area.top = self.nav_grid.map_data.min.y / self.nav_grid.element_size grid_area.right = grid_area.left + self.nav_grid.size.x grid_area.bottom = grid_area.top + self.nav_grid.size.y # Generate square areas of decreasing size. min_side = self.max_size_elements while min_side > 0: print 'Size iteration {}...'.format(min_side) self.generate_iteration(grid_area, min_side) min_side -= 1 # Merge areas until none can be merged any more. print 'Merging...' while 1: old_len = len(self.areas) self.areas = filter(self.area_merge_filter, self.areas) new_len = len(self.areas) # If no areas were removed, stop merging. if new_len == old_len: break print 'Merged to {} navigation areas.'.format(new_len) print 'Adding areas to blockmap...' self.map_data.blockmap.generate_areas(self) print 'Pruning elements...' self.prune_elements() print 'Connecting areas...' count = self.connect_areas() print 'Generated {} connections.'.format(count) print 'Connecting teleporters...' self.connect_teleporters() return True