From ab99e8c223183e4e24e271f2743982b57b08cac4 Mon Sep 17 00:00:00 2001 From: Kevin Cathcart Date: Wed, 28 Aug 2019 21:12:44 -0400 Subject: [PATCH] Triforce Hunt turn-in logic --- BaseClasses.py | 2 +- ItemList.py | 14 ++++++++++++++ Main.py | 5 +++++ Rom.py | 2 ++ Text.py | 1 + 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/BaseClasses.py b/BaseClasses.py index 4715fff6..ca6044c1 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -263,7 +263,7 @@ class World(object): def has_beaten_game(self, state, player=None): if player: - return state.has('Triforce', player) or (self.goal in ['triforcehunt'] and (state.item_count('Triforce Piece', player) + state.item_count('Power Star', player) > self.treasure_hunt_count)) + return state.has('Triforce', player) else: return all((self.has_beaten_game(state, p) for p in range(1, self.players + 1))) diff --git a/ItemList.py b/ItemList.py index d8df5fbd..a25423fb 100644 --- a/ItemList.py +++ b/ItemList.py @@ -137,6 +137,20 @@ def generate_itempool(world, player): else: world.push_item(world.get_location('Ganon', player), ItemFactory('Triforce', player), False) + if world.goal in ['triforcehunt']: + region = world.get_region('Hyrule Castle Courtyard', player) + + loc = Location(player, "Murahdahla", parent=region) + loc.access_rule = lambda state: state.item_count('Triforce Piece', player) + state.item_count('Power Star', player) > state.world.treasure_hunt_count + region.locations.append(loc) + world.dynamic_locations.append(loc) + + world.clear_location_cache() + + world.push_item(loc, ItemFactory('Triforce', player), False) + loc.event = True + loc.locked = True + world.get_location('Ganon', player).event = True world.get_location('Ganon', player).locked = True world.push_item(world.get_location('Agahnim 1', player), ItemFactory('Beat Agahnim 1', player), False) diff --git a/Main.py b/Main.py index bba6c61a..9442c8ab 100644 --- a/Main.py +++ b/Main.py @@ -276,6 +276,11 @@ def copy_dynamic_regions_and_locations(world, ret): for location in world.dynamic_locations: new_reg = ret.get_region(location.parent_region.name, location.parent_region.player) new_loc = Location(location.player, location.name, location.address, location.crystal, location.hint_text, new_reg) + # todo: this is potentially dangerous. later refactor so we + # can apply dynamic region rules on top of copied world like other rules + new_loc.access_rule = location.access_rule + new_loc.always_allow = location.always_allow + new_loc.item_rule = location.item_rule new_reg.locations.append(new_loc) ret.clear_location_cache() diff --git a/Rom.py b/Rom.py index 01d25247..2db68438 100644 --- a/Rom.py +++ b/Rom.py @@ -837,6 +837,7 @@ def patch_rom(world, player, rom): # set up goals for treasure hunt rom.write_bytes(0x180165, [0x0E, 0x28] if world.treasure_hunt_icon == 'Triforce Piece' else [0x0D, 0x28]) rom.write_byte(0x180167, world.treasure_hunt_count % 256) + rom.write_byte(0x180194, 1) # Must turn in triforced pieces (instant win not enabled) # TODO: a proper race rom mode should be implemented, that changes the following flag, and rummages the table (or uses the future encryption feature, etc) rom.write_bytes(0x180213, [0x00, 0x01]) # Not a Tournament Seed @@ -1318,6 +1319,7 @@ def write_strings(rom, world, player): tt['ganon_fall_in_alt'] = 'Why are you even here?\n You can\'t even hurt me! Get the Triforce Pieces.' tt['ganon_phase_3_alt'] = 'Seriously? Go Away, I will not Die.' tt['sign_ganon'] = 'Go find the Triforce pieces... Ganon is invincible!' + tt['murahdahla'] = "Hello @. I\nam Murahdahla, brother of\nSahasrahla and Aginah. Behold the power of\ninvisibility.\n{PAUSE3}\n… … …\nWait! you can see me? I knew I should have\nhidden in a hollow tree. If you bring\n%d triforce pieces, I can reassemble it." % world.treasure_hunt_count elif world.goal in ['pedestal']: tt['ganon_fall_in_alt'] = 'Why are you even here?\n You can\'t even hurt me! Your goal is at the pedestal.' tt['ganon_phase_3_alt'] = 'Seriously? Go Away, I will not Die.' diff --git a/Text.py b/Text.py index 517ccf18..ac254287 100644 --- a/Text.py +++ b/Text.py @@ -1890,5 +1890,6 @@ class TextTable(object): text['ganon_phase_3_no_silvers_alt'] = CompressedTextMapper.convert("You can't best me without silver arrows!") text['ganon_phase_3_no_silvers'] = CompressedTextMapper.convert("You can't best me without silver arrows!") text['ganon_phase_3_silvers'] = CompressedTextMapper.convert("Oh no! Silver! My one true weakness!") + text['murahdahla'] = CompressedTextMapper.convert("Hello @. I\nam Murahdahla, brother of\nSahasrahla and Aginah. Behold the power of\ninvisibility.\n{PAUSE3}\n… … …\nWait! you can see me? I knew I should have\nhidden in a hollow tree.") text['end_pad_data'] = bytearray([0xfb]) text['terminator'] = bytearray([0xFF, 0xFF])