From 4c498a723baa922b1cd942d56a8f7173df482f30 Mon Sep 17 00:00:00 2001 From: Kara Alexandra Date: Sat, 8 Mar 2025 18:18:06 -0600 Subject: [PATCH] Add dark_room settings --- BaseClasses.py | 4 ++++ CLI.py | 3 ++- ItemList.py | 19 +++++++++++++++---- Main.py | 3 +++ Rom.py | 12 ++++++++++-- Utils.py | 4 ++-- data/base2current.bps | Bin 133998 -> 134043 bytes resources/app/cli/args.json | 8 ++++++++ resources/app/cli/lang/en.json | 6 ++++++ 9 files changed, 50 insertions(+), 9 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index 138f8bae..f0f48418 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -71,6 +71,7 @@ class World(object): self.fix_palaceofdarkness_exit = {} self.fix_trock_exit = {} self.shuffle_ganon = shuffle_ganon + self.dark_rooms = {} self.custom = custom self.customitemarray = customitemarray self.can_take_damage = True @@ -169,6 +170,7 @@ class World(object): set_player_attr('pot_contents', None) set_player_attr('pseudoboots', False) set_player_attr('mirrorscroll', False) + set_player_attr('dark_rooms', 'require_lamp') set_player_attr('collection_rate', False) set_player_attr('colorizepots', True) set_player_attr('pot_pool', {}) @@ -3062,6 +3064,7 @@ class Spoiler(object): 'shopsanity': self.world.shopsanity, 'pseudoboots': self.world.pseudoboots, 'mirrorscroll': self.world.mirrorscroll, + 'dark_rooms': self.world.dark_rooms, 'triforcegoal': self.world.treasure_hunt_count, 'triforcepool': self.world.treasure_hunt_total, 'race': self.world.settings.world_rep['meta']['race'], @@ -3311,6 +3314,7 @@ class Spoiler(object): outfile.write('\n') outfile.write('Pseudoboots:'.ljust(line_width) + '%s\n' % yn(self.metadata['pseudoboots'][player])) outfile.write('Mirror Scroll:'.ljust(line_width) + '%s\n' % yn(self.metadata['mirrorscroll'][player])) + outfile.write('Dark Rooms:'.ljust(line_width) + '%s\n' % self.metadata['dark_rooms'][player]) outfile.write('Hints:'.ljust(line_width) + '%s\n' % yn(self.metadata['hints'][player])) outfile.write('Race:'.ljust(line_width) + '%s\n' % yn(self.world.settings.world_rep['meta']['race'])) diff --git a/CLI.py b/CLI.py index 8fc7263e..07e499e0 100644 --- a/CLI.py +++ b/CLI.py @@ -139,7 +139,7 @@ def parse_cli(argv, no_defaults=False): 'triforce_max_difference', 'triforce_pool_min', 'triforce_pool_max', 'triforce_goal_min', 'triforce_goal_max', 'triforce_min_difference', 'triforce_goal', 'triforce_pool', 'shufflelinks', 'shuffletavern', 'skullwoods', 'linked_drops', - 'pseudoboots', 'mirrorscroll', 'retro', 'accessibility', 'hints', 'beemizer', 'experimental', 'dungeon_counters', + 'pseudoboots', 'mirrorscroll', "dark_rooms", 'retro', 'accessibility', 'hints', 'beemizer', 'experimental', 'dungeon_counters', 'shufflebosses', 'shuffleenemies', 'enemy_health', 'enemy_damage', 'shufflepots', 'ow_palettes', 'uw_palettes', 'sprite', 'disablemusic', 'quickswap', 'fastmenu', 'heartcolor', 'heartbeep', 'remote_items', 'shopsanity', 'dropshuffle', 'pottery', 'keydropshuffle', @@ -210,6 +210,7 @@ def parse_settings(): "take_any": "none", "pseudoboots": False, "mirrorscroll": False, + "dark_rooms": "require_lamp", "shuffleenemies": "none", "shufflebosses": "none", diff --git a/ItemList.py b/ItemList.py index 08be1d62..ec2be0e7 100644 --- a/ItemList.py +++ b/ItemList.py @@ -1081,7 +1081,10 @@ def get_pool_core(world, player, progressive, shuffle, difficulty, treasure_hunt else: pool.extend(basicgloves) - lamps_needed_for_dark_rooms = 1 + if world.dark_rooms[player] in ['lamp_required']: + lamps_needed_for_dark_rooms = 1 + else: + lamps_needed_for_dark_rooms = 0 # old insanity shuffle didn't have fake LW/DW logic so this used to be conditional pool.extend(['Magic Mirror', 'Moon Pearl']) @@ -1260,7 +1263,7 @@ def modify_pool_for_start_inventory(start_inventory, world, player): d.big_key = None -def make_custom_item_pool(world, player, progressive, shuffle, difficulty, timer, goal, mode, swords, bombbag, customitemarray): +def make_custom_item_pool(world, player, progressive, shuffle, difficulty, timer, goal, mode, swords, bombbag, dark_rooms, customitemarray): pool = [] placed_items = {} precollected_items = [] @@ -1299,7 +1302,10 @@ def make_custom_item_pool(world, player, progressive, shuffle, difficulty, timer diff = difficulties[difficulty] - lamps_needed_for_dark_rooms = 1 + if world.dark_rooms[player] in ['lamp_required']: + lamps_needed_for_dark_rooms = 1 + else: + lamps_needed_for_dark_rooms = 0 # expert+ difficulties produce the same contents for # all bottles, since only one bottle is available @@ -1505,7 +1511,12 @@ def make_customizer_pool(world, player): pool.remove('Fighter Sword') pool.append('Rupees (50)') - return pool, placed_items, precollected_items, clock_mode, 1 + if world.dark_rooms[player] in ['lamp_required']: + lamps_needed_for_dark_rooms = 1 + else: + lamps_needed_for_dark_rooms = 0 + + return pool, placed_items, precollected_items, clock_mode, lamps_needed_for_dark_rooms filler_items = { diff --git a/Main.py b/Main.py index 1928a654..f908e702 100644 --- a/Main.py +++ b/Main.py @@ -508,6 +508,7 @@ def init_world(args, fish): world.linked_drops = args.linked_drops.copy() world.pseudoboots = args.pseudoboots.copy() world.mirrorscroll = args.mirrorscroll.copy() + world.dark_rooms = args.dark_rooms.copy() world.overworld_map = args.overworld_map.copy() world.take_any = args.take_any.copy() world.restrict_boss_items = args.restrict_boss_items.copy() @@ -603,6 +604,7 @@ def copy_world(world): ret.linked_drops = world.linked_drops.copy() ret.pseudoboots = world.pseudoboots.copy() ret.mirrorscroll = world.mirrorscroll.copy() + ret.dark_rooms = world.dark_rooms.copy() ret.overworld_map = world.overworld_map.copy() ret.take_any = world.take_any.copy() ret.boss_shuffle = world.boss_shuffle.copy() @@ -823,6 +825,7 @@ def copy_world_premature(world, player): ret.linked_drops = world.linked_drops.copy() ret.pseudoboots = world.pseudoboots.copy() ret.mirrorscroll = world.mirrorscroll.copy() + ret.dark_rooms = world.dark_rooms.copy() ret.overworld_map = world.overworld_map.copy() ret.take_any = world.take_any.copy() ret.boss_shuffle = world.boss_shuffle.copy() diff --git a/Rom.py b/Rom.py index 03f8b3af..1542420f 100644 --- a/Rom.py +++ b/Rom.py @@ -43,7 +43,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '80e0a4f8bd5cc6f83ac9f7f46c01bf4f' +RANDOMIZERBASEHASH = '9cdc4e5b97fc03af357b4f35ea8802fd' class JsonRom(object): @@ -956,7 +956,15 @@ def patch_rom(world, rom, player, team, is_mystery=False): rom.write_bytes(0x6D323, [0x00, 0x00, 0xe4, 0xff, 0x08, 0x0E]) # set light cones - rom.write_byte(0x180038, 0x01 if world.sewer_light_cone[player] else 0x00) + if world.dark_rooms[player] == 'no_dark_rooms': + light_cone = 0x20 + elif world.dark_rooms[player] == 'always_light_cone': + light_cone = 0x10 + elif world.sewer_light_cone[player]: + light_cone = 0x01 + else: + light_cone = 0x00 + rom.write_byte(0x180038, light_cone) GREEN_TWENTY_RUPEES = 0x47 TRIFORCE_PIECE = ItemFactory('Triforce Piece', player).code diff --git a/Utils.py b/Utils.py index b0f64517..6f1a38be 100644 --- a/Utils.py +++ b/Utils.py @@ -792,10 +792,10 @@ def hex_representer(dumper, data): if __name__ == '__main__': - # make_new_base2current() + print(make_new_base2current()) # read_entrance_data(old_rom=sys.argv[1]) # room_palette_data(old_rom=sys.argv[1]) # extract_data_from_us_rom(sys.argv[1]) # extract_data_from_jp_rom(sys.argv[1]) # check_pots() - find_and_replace() + # find_and_replace() diff --git a/data/base2current.bps b/data/base2current.bps index db46c22a6aaf24c4317e0d06e25a5acb3590b983..0986c290927fc4d96248e0846db7bd5ff7fffd0f 100644 GIT binary patch delta 8683 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 xU=pS!B$$sbAId*oQ`w4>_ep5LZZUSI{ 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