From b8666545419bf6b0355999821fa586c7500b41d6 Mon Sep 17 00:00:00 2001 From: aerinon Date: Fri, 17 Jan 2020 16:36:36 -0700 Subject: [PATCH] Stonewall fix attempt - causing long generations right now --- DungeonGenerator.py | 48 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/DungeonGenerator.py b/DungeonGenerator.py index b2ea506d..9b7b773b 100644 --- a/DungeonGenerator.py +++ b/DungeonGenerator.py @@ -402,6 +402,54 @@ def winnow_hangers(hangers, hooks): hangers[hanger].remove(door) +def stonewalls_valid(valid_doors, proposed_map): + stonewall_doors = [] + for door in valid_doors.values(): + if door.stonewall: + stonewall_doors.append(door) + for stonewall in stonewall_doors: + if not stonewall_valid(stonewall, valid_doors, proposed_map): + return False + return True + + +def stonewall_valid(stonewall, valid_doors, proposed_map): + if stonewall in proposed_map: + bad_entrance = proposed_map[stonewall].entrance + if bad_entrance.door.blocked: + return True # great we're done with this one + loop_region = stonewall.entrance.parent_region + start_region = proposed_map[stonewall].entrance.parent_region + queue = deque([start_region]) + visited = {start_region} + while len(queue) > 0: + region = queue.popleft() + if region == loop_region: + return False # guaranteed loop + possible_entrances = list(region.entrances) + for d in proposed_map: + if d.entrance.parent_region == region: + possible_entrances.append(proposed_map[d].entrance) + for entrance in possible_entrances: + parent = entrance.parent_region + if entrance.name in valid_doors: + door = entrance.door + if not door.blocked and door != stonewall: + if door in proposed_map: + if parent not in visited: + visited.add(parent) + queue.append(parent) + else: + if parent.type != RegionType.Dungeon: + return False # you can get stuck from an entrance + else: + door = entrance.door + if door is not None and not door.blocked and parent not in visited: + visited.add(parent) + queue.append(parent) + return True # we didn't find anything bad + + def create_graph_piece_from_state(door, o_state, b_state, proposed_map): # todo: info about dungeon events - not sure about that graph_piece = GraphPiece()