diff --git a/BaseClasses.py b/BaseClasses.py index 6a12f32e..3b06f10b 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -69,7 +69,6 @@ class World(object): self.dynamic_locations = [] self.spoiler_mode = spoiler_mode self.spoiler = Spoiler(self) - self.lamps_needed_for_dark_rooms = 1 self.doors = [] self._door_cache = {} self.paired_doors = {} @@ -123,6 +122,8 @@ class World(object): set_player_attr('bombbag', False) set_player_attr('flute_mode', False) set_player_attr('bow_mode', False) + set_player_attr('free_lamp_cone', False) + set_player_attr('difficulty_requirements', None) set_player_attr('boss_shuffle', 'none') set_player_attr('enemy_shuffle', 'none') diff --git a/ItemList.py b/ItemList.py index 3dce2da3..32da56cc 100644 --- a/ItemList.py +++ b/ItemList.py @@ -266,13 +266,13 @@ def generate_itempool(world, player): # set up item pool skip_pool_adjustments = False if world.customizer and world.customizer.get_item_pool() and player in world.customizer.get_item_pool(): - (pool, placed_items, precollected_items, clock_mode, lamps_needed_for_dark_rooms) = make_customizer_pool(world, player) + (pool, placed_items, precollected_items, clock_mode) = make_customizer_pool(world, player) skip_pool_adjustments = True elif world.custom: - (pool, placed_items, precollected_items, clock_mode, treasure_hunt_count, treasure_hunt_icon, lamps_needed_for_dark_rooms) = make_custom_item_pool(world, player, world.progressive, world.shuffle[player], world.difficulty[player], world.timer, world.goal[player], world.mode[player], world.swords[player], world.bombbag[player], world.customitemarray) + (pool, placed_items, precollected_items, clock_mode, treasure_hunt_count, treasure_hunt_icon) = make_custom_item_pool(world, player, world.progressive, world.shuffle[player], world.difficulty[player], world.timer, world.goal[player], world.mode[player], world.swords[player], world.bombbag[player], world.customitemarray) world.rupoor_cost = min(world.customitemarray[player]["rupoorcost"], 9999) else: - (pool, placed_items, precollected_items, clock_mode, lamps_needed_for_dark_rooms) = get_pool_core(world, player, world.progressive, world.shuffle[player], world.difficulty[player], world.treasure_hunt_total[player], world.timer, world.goal[player], world.mode[player], world.swords[player], world.bombbag[player], world.doorShuffle[player], world.logic[player], world.flute_mode[player] == 'active') + (pool, placed_items, precollected_items, clock_mode) = get_pool_core(world, player, world.progressive, world.shuffle[player], world.difficulty[player], world.treasure_hunt_total[player], world.timer, world.goal[player], world.mode[player], world.swords[player], world.bombbag[player], world.doorShuffle[player], world.logic[player], world.flute_mode[player] == 'active') if player in world.pool_adjustment.keys() and not skip_pool_adjustments: amt = world.pool_adjustment[player] @@ -351,8 +351,6 @@ def generate_itempool(world, player): if item.name == 'Bomb Upgrade (+10)' and item.player == player: item.advancement = True - world.lamps_needed_for_dark_rooms = lamps_needed_for_dark_rooms - if clock_mode is not None: world.clock_mode = clock_mode @@ -946,8 +944,6 @@ def get_pool_core(world, player, progressive, shuffle, difficulty, treasure_hunt else: pool.extend(basicgloves) - lamps_needed_for_dark_rooms = 1 - # old insanity shuffle didn't have fake LW/DW logic so this used to be conditional pool.extend(['Magic Mirror', 'Moon Pearl']) @@ -1048,7 +1044,7 @@ def get_pool_core(world, player, progressive, shuffle, difficulty, treasure_hunt pool.extend(['Small Key (Universal)']) else: pool.extend(['Small Key (Universal)']) - return (pool, placed_items, precollected_items, clock_mode, lamps_needed_for_dark_rooms) + return (pool, placed_items, precollected_items, clock_mode) item_alternates = { @@ -1152,8 +1148,6 @@ def make_custom_item_pool(world, player, progressive, shuffle, difficulty, timer diff = difficulties[difficulty] - lamps_needed_for_dark_rooms = 1 - # expert+ difficulties produce the same contents for # all bottles, since only one bottle is available if diff.same_bottle: @@ -1213,7 +1207,7 @@ def make_custom_item_pool(world, player, progressive, shuffle, difficulty, timer pool.remove('Fighter Sword') pool.append('Rupees (50)') - return (pool, placed_items, precollected_items, clock_mode, treasure_hunt_count, treasure_hunt_icon, lamps_needed_for_dark_rooms) + return (pool, placed_items, precollected_items, clock_mode, treasure_hunt_count, treasure_hunt_icon) def make_customizer_pool(world, player): @@ -1357,7 +1351,7 @@ def make_customizer_pool(world, player): pool.remove('Fighter Sword') pool.append('Rupees (50)') - return pool, placed_items, precollected_items, clock_mode, 1 + return pool, placed_items, precollected_items, clock_mode filler_items = { diff --git a/Main.py b/Main.py index 197602e2..5a67ca15 100644 --- a/Main.py +++ b/Main.py @@ -171,7 +171,7 @@ def main(args, seed=None, fish=None): world.finish_init() # custom settings - these haven't been promoted to full settings yet - in_progress_settings = ['force_enemy'] + in_progress_settings = ['force_enemy', 'free_lamp_cone'] for player in range(1, world.players + 1): for setting in in_progress_settings: if world.customizer and world.customizer.has_setting(player, setting): @@ -494,7 +494,6 @@ def copy_world(world): ret.can_take_damage = world.can_take_damage ret.difficulty_requirements = world.difficulty_requirements.copy() ret.fix_fake_world = world.fix_fake_world.copy() - ret.lamps_needed_for_dark_rooms = world.lamps_needed_for_dark_rooms ret.mapshuffle = world.mapshuffle.copy() ret.compassshuffle = world.compassshuffle.copy() ret.keyshuffle = world.keyshuffle.copy() @@ -502,6 +501,7 @@ def copy_world(world): ret.bombbag = world.bombbag.copy() ret.flute_mode = world.flute_mode.copy() ret.bow_mode = world.bow_mode.copy() + ret.free_lamp_cone = world.free_lamp_cone.copy() ret.crystals_needed_for_ganon = world.crystals_needed_for_ganon.copy() ret.crystals_needed_for_gt = world.crystals_needed_for_gt.copy() ret.crystals_ganon_orig = world.crystals_ganon_orig.copy() diff --git a/Rom.py b/Rom.py index 04987530..ec343ee7 100644 --- a/Rom.py +++ b/Rom.py @@ -42,7 +42,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '1e87ad01a54f1c15e2ec16a79a9bcc20' +RANDOMIZERBASEHASH = 'f327962e7f2872c80fd75b35c6f2c985' class JsonRom(object): @@ -811,7 +811,8 @@ 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) + lamp_cone_flags = (0x1 if world.sewer_light_cone[player] else 0) | (0x10 if world.free_lamp_cone[player] else 0) + rom.write_byte(0x180038, lamp_cone_flags) GREEN_TWENTY_RUPEES = 0x47 TRIFORCE_PIECE = ItemFactory('Triforce Piece', player).code diff --git a/Rules.py b/Rules.py index 5d059a5c..19dc9922 100644 --- a/Rules.py +++ b/Rules.py @@ -160,7 +160,7 @@ def and_rule(rule1, rule2): def add_lamp_requirement(spot, player): - add_rule(spot, lambda state: state.has('Lamp', player, state.world.lamps_needed_for_dark_rooms)) + add_rule(spot, lambda state: state.has('Lamp', player) or state.world.free_lamp_cone[player]) def forbid_item(location, item, player): diff --git a/data/base2current.bps b/data/base2current.bps index a287a08d..f2b1f925 100644 Binary files a/data/base2current.bps and b/data/base2current.bps differ