clean up Fusion_Graph and fix get_path

master
magical 2024-02-03 02:23:12 -08:00
parent 20e24a40e3
commit 2f2c281265
1 changed files with 54 additions and 58 deletions

View File

@ -15,7 +15,7 @@ import sys
class Game: class Game:
def __init__(self, vanillaGame, randoSettings = (None,)): def __init__(self, vanillaGame, randoSettings=None):
self.graph = dict() self.graph = dict()
self.areaConnections = dict() self.areaConnections = dict()
self.areaConnectionOffsets = dict() self.areaConnectionOffsets = dict()
@ -50,7 +50,7 @@ class Game:
sourceDoor = int.from_bytes(sourceRom.read(1), 'little') sourceDoor = int.from_bytes(sourceRom.read(1), 'little')
targetOffset = sourceRom.tell() targetOffset = sourceRom.tell()
targetArea = int.from_bytes(sourceRom.read(1), 'little') targetArea = int.from_bytes(sourceRom.read(1), 'little')
if sourceArea != 255: while sourceArea != 255:
self.areaConnections.update({ self.areaConnections.update({
'S{}-{:02X}'.format(sourceArea, sourceDoor): targetArea }) 'S{}-{:02X}'.format(sourceArea, sourceDoor): targetArea })
self.areaConnectionOffsets.update({ self.areaConnectionOffsets.update({
@ -91,7 +91,7 @@ class Game:
doorString] doorString]
doorNumber += 1 doorNumber += 1
# print('DEBUG: Parsing seemingly done?') # print('DEBUG: Parsing seemingly done?')
except: except FileNotFoundError:
print('Error:', vanillaGame, 'could not be opened.') print('Error:', vanillaGame, 'could not be opened.')
sys.exit(1) sys.exit(1)
@ -212,48 +212,44 @@ class Game:
checkRequirement = (start, end) checkRequirement = (start, end)
return self.requirements.get(checkRequirement) return self.requirements.get(checkRequirement)
def get_path(self, start, end, LimitArea, path, depth = (False, None, 100)): def get_path(self, start, end, LimitArea=False, path=None, depth=100):
if path == None: if path == None:
self.visited.clear() self.visited.clear()
self.queue.clear() self.queue.clear()
path = list() path = list()
path = path + [ path = path + [start]
start]
if start not in self.graph: if start not in self.graph:
return None return None
if None == end: if start == end:
return path return path
# if None(path) >= depth: if len(path) >= depth:
if path >= depth:
return None return None
for point in None.graph[start]: for point in self.graph[start]:
if point in self.itemLocations and point not in end: if point in self.itemLocations:
continue if point not in end:
continue
if point in path: if point in path:
continue continue
if LimitArea: if LimitArea:
for area in range(0, 7): for area in range(0, 7):
if 'S{}'.format(area) in start and 'S{}'.format(area) not in point: if 'S{}'.format(area) in start:
return None if 'S{}'.format(area) not in point:
edge = (start, point) return None
self.queue.append(edge) edge = (start, point)
if self.queue: self.queue.append(edge)
edge = self.queue.pop() while self.queue:
if edge not in self.visited: edge = self.queue.pop()
self.visited.append(edge) if edge not in self.visited:
node = edge[1] self.visited.append(edge)
pathReqs = self.get_requirements(start, node) node = edge[1]
if pathReqs == None: pathReqs = self.get_requirements(start, node)
newpath = self.get_path(node, end, LimitArea, path, depth) if pathReqs == None:
if newpath: newpath = self.get_path(node, end, LimitArea, path, depth)
path = path + [ if newpath:
node] path = path + [node]
return newpath return newpath
if pathReqs == True: elif pathReqs == True:
newpath = self.get_path(node, end, LimitArea, path, depth) newpath = self.get_path(node, end, LimitArea, path, depth)
if newpath: if newpath:
path = path + [ path = path + [node]
node] return newpath
return newpath