Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- HashMap<Point, Set<Integer>> connectorRegions = new HashMap<Point, Set<Integer>>();
- for(int yi = 1; yi < dHeight- 1; yi++){
- for(int xi = 1; xi < dWidth - 1; xi++){
- Point pos = new Point(xi, yi);
- if(getTile(pos.x, pos.y) != Tile.CAVE_WALL) continue;
- Set<Integer> regions = new HashSet<Integer>();
- for(Point dir : cardinal){
- Point indexer = new Point(pos.x + dir.x, pos.y + dir.y);
- int region = this.regions[indexer.x][indexer.y];
- if(region != -1) regions.add(region);
- }
- if(regions.size() < 2) continue;
- connectorRegions.put(pos, regions);
- }
- List<Point> connectors = new ArrayList<Point>();
- for(Point key : connectorRegions.keySet()){
- connectors.add(key);
- }
- List<Integer> merged = new ArrayList<Integer>();
- Set<Integer> openRegions = new HashSet<Integer>();
- for(int i = 0; i < currentRegion; i++){
- merged.add(i, i);
- openRegions.add(i);
- }
- while(openRegions.size() > 1){
- Point connector = connectors.get(random.nextInt(connectors.size()));
- addJunction(connector);
- List<Integer> regions = connectorRegions.get(connector).stream().map((region) -> merged.get(region)).collect(Collectors.toList());
- int dest = regions.get(0);
- List<Integer> sources = regions.subList(1, regions.size());
- for(int i = 0; i <= currentRegion; i++){
- if(sources.contains(merged.get(i))) merged.set(i, dest);
- }
- openRegions.removeAll(sources);
- connectors.removeIf((pos) -> {
- List<Integer> regionss = connectorRegions.get(pos).stream().map((region) -> merged.get(region)).collect(Collectors.toList());
- if(regionss.size() > 1) return false;
- if(random.nextInt(100) < extraConnectorChance){
- for(Point dir : cardinal){
- Point indexer = new Point(pos.x + dir.x, pos.y + dir.y);
- if(tiles[indexer.x][indexer.y] == Tile.DOOR) return true;
- }
- addJunction(pos);
- }
- return true;
- });
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement