OpenMFOR/Fusion_Graph.py

218 lines
6.8 KiB
Python

# Source Generated with Decompyle++
# File: Fusion_Graph.pyc (Python 3.8)
import struct
import sys
class Game:
def __init__(self, vanillaGame, randoSettings = (None,)):
self.graph = dict()
self.areaConnections = dict()
self.areaConnectionOffsets = dict()
self.doorConnections = dict()
self.rooms = dict()
self.requirements = dict()
self.visited = list()
self.queue = list()
self.majorItemLocations = list()
self.minorItemLocations = list()
self.itemLocations = list()
self.patcher = dict()
self.graph.clear()
self.areaConnections.clear()
self.areaConnectionOffsets.clear()
self.doorConnections.clear()
self.rooms.clear()
self.requirements.clear()
self.visited.clear()
self.queue.clear()
self.majorItemLocations.clear()
self.minorItemLocations.clear()
self.itemLocations.clear()
self.patcher.clear()
# WARNING: Decompyle incomplete
def set_setting(self, setting, value):
self.settings[setting] = value
def get_setting(self, setting):
return self.settings[setting]
def AddNodeToRoom(self, room, node):
nodeList = self.rooms.get(room)
nodeList.append(node)
nodeList.sort()
self.rooms.update({
room: nodeList })
def RemoveNodeFromRoom(self, room, node):
nodeList = self.rooms.get(room)
if node in nodeList:
nodeList.remove(node)
nodeList.sort()
self.rooms.update({
room: nodeList })
def ClearGraph(self):
self.graph.clear()
def ConnectAllNodes(self):
self.ClearGraph()
self.ConnectNodesInRooms()
self.ConnectNodesBetweenRooms()
def ConnectNodesInRooms(self):
for room in self.rooms:
for start in self.rooms[room]:
for end in self.rooms[room]:
if start != end:
self.add_edges(start, end)
continue
continue
continue
return None
def ConnectNodesBetweenRooms(self):
for connection in self.doorConnections.items():
if len(connection) == 2:
self.add_directed_edge(connection[0], connection[1])
continue
return None
def UpdateDoorConnection(self, source, destination):
self.doorConnections.update({
source: destination })
connectedArea = self.areaConnections.get(source)
if connectedArea != None:
self.areaConnections.update({
source: int(destination[1:2]) })
return self.areaConnectionOffsets.get(source)
def AddConnectedNodesToRoom(self, targetRoom, *nodes):
for currentNode in nodes:
if targetRoom in self.rooms:
self.rooms[targetRoom].append(currentNode)
for targetNode in self.rooms[targetRoom]:
if currentNode != targetNode:
self.add_edges(currentNode, targetNode)
continue
continue
self.rooms[targetRoom] = [
currentNode]
continue
return None
def add_directed_edge(self, start, end):
if start != end:
if start in self.graph or end not in self.graph[start]:
self.graph[start].append(end)
else:
self.graph[start] = [
end]
def add_edges(self, start, *nodes):
for end in nodes:
self.add_directed_edge(start, end)
self.add_directed_edge(end, start)
def add_to_majors(self, item):
if item not in self.itemLocations:
self.itemLocations.append(item)
if item not in self.majorItemLocations:
self.majorItemLocations.append(item)
def add_list_to_majors(self, locations):
for item in locations:
if item not in self.itemLocations:
self.itemLocations.append(item)
if item not in self.majorItemLocations:
self.majorItemLocations.append(item)
continue
return None
def add_to_minors(self, item):
if item not in self.itemLocations:
self.itemLocations.append(item)
if item not in self.minorItemLocations:
self.minorItemLocations.append(item)
def add_list_to_minors(self, locations):
for item in locations:
if item not in self.itemLocations:
self.itemLocations.append(item)
if item not in self.minorItemLocations:
self.minorItemLocations.append(item)
continue
return None
def get_requirements(self, start, end):
checkRequirement = (start, end)
return self.requirements.get(checkRequirement)
def get_path(self, start, end, LimitArea, path, depth = (False, None, 100)):
if path == None:
self.visited.clear()
self.queue.clear()
path = list()
path = path + [
start]
if start not in self.graph:
return None
if None == end:
return path
# if None(path) >= depth:
if path >= depth:
return None
for point in None.graph[start]:
if point in self.itemLocations and point not in end:
continue
if point in path:
continue
if LimitArea:
for area in range(0, 7):
if 'S{}'.format(area) in start and 'S{}'.format(area) not in point:
return None
edge = (start, point)
self.queue.append(edge)
if self.queue:
edge = self.queue.pop()
if edge not in self.visited:
self.visited.append(edge)
node = edge[1]
pathReqs = self.get_requirements(start, node)
if pathReqs == None:
newpath = self.get_path(node, end, LimitArea, path, depth)
if newpath:
path = path + [
node]
return newpath
if pathReqs == True:
newpath = self.get_path(node, end, LimitArea, path, depth)
if newpath:
path = path + [
node]
return newpath
continue
return None