some stuff fixed; stuff still broken

master
Lucent 2023-10-12 01:09:32 +02:00
parent 8674605497
commit 86b344f933
3 changed files with 31 additions and 53 deletions

View File

@ -32,6 +32,8 @@ class Game:
self.itemLocations.clear() self.itemLocations.clear()
self.patcher.clear() self.patcher.clear()
print('DEBUG: Opening ROM to pick stuff')
try: try:
with open(vanillaGame, 'rb') as sourceRom: with open(vanillaGame, 'rb') as sourceRom:
sourceRom.seek(3967888, 0) sourceRom.seek(3967888, 0)
@ -48,7 +50,6 @@ 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')
continue
for currentArea in range(7): for currentArea in range(7):
sourceRom.seek(7977108 + currentArea * 4, 0) sourceRom.seek(7977108 + currentArea * 4, 0)
data = sourceRom.read(4) data = sourceRom.read(4)
@ -71,18 +72,17 @@ class Game:
roomNumber = format(roomNumber, '02X') roomNumber = format(roomNumber, '02X')
roomString = 'Room-S{}-{}'.format(currentArea, roomNumber) roomString = 'Room-S{}-{}'.format(currentArea, roomNumber)
doorString = 'S{}-{:02X}'.format(currentArea, doorNumber) doorString = 'S{}-{:02X}'.format(currentArea, doorNumber)
print('DEBUG: Adding door {} to S{}-{:02X}'.format(doorNumber, currentArea, roomNumber))
if roomString in self.rooms: if roomString in self.rooms:
self.rooms[roomString].append(doorString) self.rooms[roomString].append(doorString)
else: else:
self.rooms[roomString] = [ self.rooms[roomString] = [
doorString] doorString]
doorNumber += 1 doorNumber += 1
finally: print('DEBUG: Parsing seemingly done?')
pass except:
except FileNotFoundError: sys.exit('Error:', vanillaGame, 'could not be opened.')
sys.exit('Error:', vanillaGame, 'could not be opened.')
return None
def set_setting(self, setting, value): def set_setting(self, setting, value):
@ -126,19 +126,12 @@ class Game:
for end in self.rooms[room]: for end in self.rooms[room]:
if start != end: if start != end:
self.add_edges(start, end) self.add_edges(start, end)
continue
continue
continue
return None
def ConnectNodesBetweenRooms(self): def ConnectNodesBetweenRooms(self):
for connection in self.doorConnections.items(): for connection in self.doorConnections.items():
if len(connection) == 2: if len(connection) == 2:
self.add_directed_edge(connection[0], connection[1]) self.add_directed_edge(connection[0], connection[1])
continue
return None
def UpdateDoorConnection(self, source, destination): def UpdateDoorConnection(self, source, destination):
self.doorConnections.update({ self.doorConnections.update({
@ -173,7 +166,6 @@ class Game:
self.graph[start] = [ self.graph[start] = [
end] end]
def add_edges(self, start, *nodes): def add_edges(self, start, *nodes):
for end in nodes: for end in nodes:
self.add_directed_edge(start, end) self.add_directed_edge(start, end)
@ -193,9 +185,6 @@ class Game:
self.itemLocations.append(item) self.itemLocations.append(item)
if item not in self.majorItemLocations: if item not in self.majorItemLocations:
self.majorItemLocations.append(item) self.majorItemLocations.append(item)
continue
return None
def add_to_minors(self, item): def add_to_minors(self, item):
if item not in self.itemLocations: if item not in self.itemLocations:
@ -203,22 +192,17 @@ class Game:
if item not in self.minorItemLocations: if item not in self.minorItemLocations:
self.minorItemLocations.append(item) self.minorItemLocations.append(item)
def add_list_to_minors(self, locations): def add_list_to_minors(self, locations):
for item in locations: for item in locations:
if item not in self.itemLocations: if item not in self.itemLocations:
self.itemLocations.append(item) self.itemLocations.append(item)
if item not in self.minorItemLocations: if item not in self.minorItemLocations:
self.minorItemLocations.append(item) self.minorItemLocations.append(item)
continue
return None
def get_requirements(self, start, end): def get_requirements(self, start, end):
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, path, depth = (False, None, 100)):
if path == None: if path == None:
self.visited.clear() self.visited.clear()
@ -262,7 +246,5 @@ class Game:
path = path + [ path = path + [
node] node]
return newpath return newpath
continue
return None

View File

@ -20,6 +20,7 @@ parser.add_argument('-num', help='Number of seeds to generate (default 1)')
parser.add_argument('-hideitems', default=False, action='store_true', help='All items use ? tank graphics') parser.add_argument('-hideitems', default=False, action='store_true', help='All items use ? tank graphics')
parser.add_argument('-debug', default=False, action='store_true', help='Debugging, for my own use') parser.add_argument('-debug', default=False, action='store_true', help='Debugging, for my own use')
args = parser.parse_args() args = parser.parse_args()
if not os.path.exists(os.path.join('.', 'data')): if not os.path.exists(os.path.join('.', 'data')):
os.mkdir('data') os.mkdir('data')
if not os.path.exists(os.path.join('.', 'seeds')): if not os.path.exists(os.path.join('.', 'seeds')):

View File

@ -17,6 +17,9 @@ from bps.apply import apply_to_files
version = '0.11.6' version = '0.11.6'
# FIXME: Debug should not be set here
Debug = False
def ceiling(num, denom): def ceiling(num, denom):
return -(num // -denom) return -(num // -denom)
@ -4696,8 +4699,6 @@ def patch_game():
if len(x) > 1 and re.search('^[a-zA-Z]', x[1]): if len(x) > 1 and re.search('^[a-zA-Z]', x[1]):
sym.update({ sym.update({
x[1]: x[0][2:] }) x[1]: x[0][2:] })
finally:
pass
os.remove(os.path.join('.', 'data', 'asm', 'temp.sym')) os.remove(os.path.join('.', 'data', 'asm', 'temp.sym'))
roomEventOffset = int(sym.get('t_bossanddownloadevents'), 16) roomEventOffset = int(sym.get('t_bossanddownloadevents'), 16)
itemEventOffset = int(sym.get('t_obtainitemevents'), 16) itemEventOffset = int(sym.get('t_obtainitemevents'), 16)
@ -4841,37 +4842,37 @@ def patch_game():
patchedGame.seek(offset) patchedGame.seek(offset)
patchedGame.write(location.encode('ascii')) patchedGame.write(location.encode('ascii'))
for x in range(len(location), 35): for x in range(len(location), 35):
patchedGame.write(0.to_bytes(1, 'little')) patchedGame.write((0).to_bytes(1, 'little'))
if SeedSettings['HideItems']: if SeedSettings['HideItems']:
patchedGame.seek(3926048) patchedGame.seek(3926048)
patchedGame.write(76.to_bytes(2, 'little')) patchedGame.write((76).to_bytes(2, 'little'))
patchedGame.write(77.to_bytes(2, 'little')) patchedGame.write((77).to_bytes(2, 'little'))
patchedGame.write(78.to_bytes(2, 'little')) patchedGame.write((78).to_bytes(2, 'little'))
patchedGame.write(79.to_bytes(2, 'little')) patchedGame.write((79).to_bytes(2, 'little'))
patchedGame.write(76.to_bytes(2, 'little')) patchedGame.write((76).to_bytes(2, 'little'))
patchedGame.write(77.to_bytes(2, 'little')) patchedGame.write((77).to_bytes(2, 'little'))
patchedGame.write(78.to_bytes(2, 'little')) patchedGame.write((78).to_bytes(2, 'little'))
patchedGame.write(79.to_bytes(2, 'little')) patchedGame.write((79).to_bytes(2, 'little'))
patchedGame.write(76.to_bytes(2, 'little')) patchedGame.write((76).to_bytes(2, 'little'))
patchedGame.write(77.to_bytes(2, 'little')) patchedGame.write((77).to_bytes(2, 'little'))
patchedGame.write(78.to_bytes(2, 'little')) patchedGame.write((78).to_bytes(2, 'little'))
patchedGame.write(79.to_bytes(2, 'little')) patchedGame.write((79).to_bytes(2, 'little'))
if SeedSettings['SplitSecurity'] == True: if SeedSettings['SplitSecurity'] == True:
security = securityOffset security = securityOffset
patchedGame.seek(security) patchedGame.seek(security)
patchedGame.write(0.to_bytes(2, 'little')) patchedGame.write((0).to_bytes(2, 'little'))
if SeedSettings['MissilesWithoutMainData']: if SeedSettings['MissilesWithoutMainData']:
patchedGame.seek(24828) patchedGame.seek(24828)
patchedGame.write(15.to_bytes(1, 'little')) patchedGame.write((15).to_bytes(1, 'little'))
patchedGame.seek(395742) patchedGame.seek(395742)
patchedGame.write(15.to_bytes(1, 'little')) patchedGame.write((15).to_bytes(1, 'little'))
patchedGame.seek(465582) patchedGame.seek(465582)
patchedGame.write(15.to_bytes(1, 'little')) patchedGame.write((15).to_bytes(1, 'little'))
if SeedSettings['PowerBombsWithoutBombs']: if SeedSettings['PowerBombsWithoutBombs']:
patchedGame.seek(24756) patchedGame.seek(24756)
patchedGame.write(32.to_bytes(1, 'little')) patchedGame.write((32).to_bytes(1, 'little'))
patchedGame.seek(465672) patchedGame.seek(465672)
patchedGame.write(32.to_bytes(1, 'little')) patchedGame.write((32).to_bytes(1, 'little'))
if SeedSettings['SectorShuffle'] == True: if SeedSettings['SectorShuffle'] == True:
for currentArea in range(7): for currentArea in range(7):
patchedGame.seek(7977108 + currentArea * 4, 0) patchedGame.seek(7977108 + currentArea * 4, 0)
@ -4910,8 +4911,7 @@ def patch_game():
value = World.patcher.get(target) value = World.patcher.get(target)
patchedGame.seek(target) patchedGame.seek(target)
patchedGame.write(value.to_bytes(1, 'little')) patchedGame.write(value.to_bytes(1, 'little'))
finally:
pass
if Patch: if Patch:
# FIXME: replace with internal patch creator # FIXME: replace with internal patch creator
os.system('.\\flips\\flips.exe --create --bps "{}" ".\\seeds\\{}.gba"'.format(BaseGame, FileName)) os.system('.\\flips\\flips.exe --create --bps "{}" ".\\seeds\\{}.gba"'.format(BaseGame, FileName))
@ -4998,8 +4998,6 @@ def patch_game():
'Items': itemDict }) 'Items': itemDict })
with open(os.path.join('.', 'spoilers', '{}.json'.format(FileName)), 'w') as spoiler: with open(os.path.join('.', 'spoilers', '{}.json'.format(FileName)), 'w') as spoiler:
json.dump(spoilerLog, spoiler, indent=4) json.dump(spoilerLog, spoiler, indent=4)
finally:
pass
return None return None
@ -5008,8 +5006,6 @@ def initialize():
HashList = list() HashList = list()
with open(os.path.join('.', 'data', 'SeedHash.json')) as jsonFile: with open(os.path.join('.', 'data', 'SeedHash.json')) as jsonFile:
HashList = json.load(jsonFile) HashList = json.load(jsonFile)
finally:
pass
HashList.sort() HashList.sort()
AreaOpen = list() AreaOpen = list()
for area in range(0, 7): for area in range(0, 7):
@ -5113,6 +5109,7 @@ def start_randomizer(rom, settings):
Difficulty = SeedSettings['Difficulty'] Difficulty = SeedSettings['Difficulty']
DamageRuns = SeedSettings['DamageRuns'] DamageRuns = SeedSettings['DamageRuns']
random.seed(SeedValue + str(SeedSettings)) random.seed(SeedValue + str(SeedSettings))
print('DEBUG: Calling Graph creation')
World = Graph.Game(BaseGame) World = Graph.Game(BaseGame)
World.RemoveNodeFromRoom('Room-S2-07', 'S2-10') World.RemoveNodeFromRoom('Room-S2-07', 'S2-10')
World.RemoveNodeFromRoom('Room-S2-0D', 'S2-1E') World.RemoveNodeFromRoom('Room-S2-0D', 'S2-1E')
@ -5140,8 +5137,6 @@ def start_randomizer(rom, settings):
AreaItemLocations.append(list()) AreaItemLocations.append(list())
with open(os.path.join('.', 'data', 'NodeData.json')) as jsonFile: with open(os.path.join('.', 'data', 'NodeData.json')) as jsonFile:
RoomNodes = json.load(jsonFile) RoomNodes = json.load(jsonFile)
finally:
pass
for area in RoomNodes: for area in RoomNodes:
areaIndex = list(RoomNodes.keys()).index(area) areaIndex = list(RoomNodes.keys()).index(area)
for node in RoomNodes[area]: for node in RoomNodes[area]: