From 6edfbda0bf0503120b6ea7dd7cccc0056c33a17e Mon Sep 17 00:00:00 2001 From: codemann8 Date: Wed, 29 Oct 2025 20:17:45 -0500 Subject: [PATCH] Custom Goal framework fixes --- BaseClasses.py | 18 +++++++++++++++--- ItemList.py | 1 + Main.py | 11 ++++++++--- Rom.py | 2 +- data/base2current.bps | Bin 137030 -> 137065 bytes docs/Customizer.md | 2 +- 6 files changed, 26 insertions(+), 8 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index f2305238..f41301eb 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -3394,10 +3394,22 @@ class Spoiler(object): outfile.write(f'{dungeon}:'.ljust(line_width) + '%s Medallion\n' % medallion) for player in range(1, self.world.players + 1): player_name = '' if self.world.players == 1 else str(' (Player ' + str(player) + ')') - if self.world.crystals_gt_orig[player] == 'random': + goal = self.world.custom_goals[player]['gtentry'] + if goal and 'requirements' in goal and goal['requirements'][0]['condition'] != 0x00: + outfile.write(str('GT Entry Sign Text' + player_name + ':').ljust(line_width) + '%s\n' % goal['goaltext']) + elif self.world.crystals_gt_orig[player] == 'random': outfile.write(str('Crystals Required for GT' + player_name + ':').ljust(line_width) + '%s\n' % (str(self.metadata['gt_crystals'][player]))) - if self.world.crystals_ganon_orig[player] == 'random': - outfile.write(str('Crystals Required for Ganon' + player_name + ':').ljust(line_width) + '%s\n' % (str(self.metadata['ganon_crystals'][player]))) + goal = self.world.custom_goals[player]['ganongoal'] + if goal and 'requirements' in goal and goal['requirements'][0]['condition'] != 0x00: + outfile.write(str('Ganon Sign Text' + player_name + ':').ljust(line_width) + '%s\n' % goal['goaltext']) + elif self.world.crystals_ganon_orig[player] == 'random': + outfile.write(str('Crystals Required for Ganon' + player_name + ':').ljust(line_width) + '%s\n' % (str(self.metadata['ganon_crystals'][player]))) + goal = self.world.custom_goals[player]['pedgoal'] + if goal and 'requirements' in goal and goal['requirements'][0]['condition'] != 0x00: + outfile.write(str('Pedestal Sign Text' + player_name + ':').ljust(line_width) + '%s\n' % goal['goaltext']) + goal = self.world.custom_goals[player]['murahgoal'] + if goal and 'requirements' in goal and goal['requirements'][0]['condition'] != 0x00: + outfile.write(str('Murahdahla Sign Text' + player_name + ':').ljust(line_width) + '%s\n' % goal['goaltext']) outfile.write('\n\nPrizes:\n\n') for dungeon, prize in self.prizes.items(): outfile.write(str(dungeon + ':').ljust(line_width) + '%s\n' % prize) diff --git a/ItemList.py b/ItemList.py index b7dd5e18..5fd7cfaf 100644 --- a/ItemList.py +++ b/ItemList.py @@ -236,6 +236,7 @@ def generate_itempool(world, player): else: set_event_item(world, player, 'Ganon', 'Triforce') + goal_req = None if world.custom_goals[player]['murahgoal'] and 'requirements' in world.custom_goals[player]['murahgoal']: goal_req = world.custom_goals[player]['murahgoal']['requirements'][0] if world.goal[player] in ['triforcehunt', 'trinity'] or (goal_req and goal_req['condition'] != 0x00): diff --git a/Main.py b/Main.py index 6324f3bc..ee5a2d63 100644 --- a/Main.py +++ b/Main.py @@ -552,10 +552,12 @@ def resolve_random_settings(world, args): req_table = { 'Invulnerable': 0x00, + 'Disabled': 0x00, 'Pendants': 0x01, 'Crystals': 0x02, 'PendantBosses': 0x03, 'CrystalBosses': 0x04, + 'PrizeBosses': 0x05, 'Bosses': 0x05, 'Agahnim1Defeated': 0x06, 'Agahnim1': 0x06, @@ -577,7 +579,10 @@ def resolve_random_settings(world, args): for r in list(goal_input['requirements']): req = {} try: - req['condition'] = req_table[list(r.keys())[0]] + if isinstance(r, str): + req['condition'] = req_table[r] + else: + req['condition'] = req_table[list(r.keys())[0]] if req['condition'] == req_table['Invulnerable']: goal['requirements']= [req] goal['logic'] = False @@ -647,7 +652,7 @@ def resolve_random_settings(world, args): goal['logic']['pendant_bosses'] = req['target'] or 3 elif req['condition'] & 0x7F == req_table['CrystalBosses']: goal['logic']['crystal_bosses'] = req['target'] or 7 - elif req['condition'] & 0x7F == req_table['Bosses']: + elif req['condition'] & 0x7F == req_table['PrizeBosses']: goal['logic']['bosses'] = req['target'] or 10 elif req['condition'] & 0x7F == req_table['Aga1']: goal['logic']['aga1'] = True @@ -662,7 +667,7 @@ def resolve_random_settings(world, args): raise KeyError(f'Invalid {goal_type} requirement: {r}') else: raise KeyError(f'Invalid {goal_type} requirement definition') - if 'logic' in goal_input and goal['logic'] is not None: + if 'logic' in goal_input and goal['logic'] and goal['logic'] is not None: goal['logic'].update(goal_input['logic']) return diff --git a/Rom.py b/Rom.py index 6579220b..43c3006e 100644 --- a/Rom.py +++ b/Rom.py @@ -43,7 +43,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = 'ec0ac9063daaeb39faf1282faa3fdba8' +RANDOMIZERBASEHASH = '72c4b2d00057d1faced32871d8081f3a' class JsonRom(object): diff --git a/data/base2current.bps b/data/base2current.bps index 2f28105755a45943fc16a8d9725fba2536f5e5f0..224e1fb6c7a305d7eaf1f730f18852f88bc3c6fd 100644 GIT binary patch delta 6496 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 delta 6471 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 i#0A|{;&UR6h#|ZQ