diff --git a/BaseClasses.py b/BaseClasses.py index 77f3d93e..57472ad9 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -2898,7 +2898,8 @@ class Spoiler(object): 'triforcegoal': self.world.treasure_hunt_count, 'triforcepool': self.world.treasure_hunt_total, 'race': self.world.settings.world_rep['meta']['race'], - 'code': {p: Settings.make_code(self.world, p) for p in range(1, self.world.players + 1)} + 'code': {p: Settings.make_code(self.world, p) for p in range(1, self.world.players + 1)}, + 'seed': self.world.seed } for p in range(1, self.world.players + 1): @@ -3018,7 +3019,7 @@ class Spoiler(object): if self.shops: out['Shops'] = self.shops out['playthrough'] = self.playthrough - out['paths'] = {l:p for (l, p) in self.paths if l not in self.suppress_spoiler_locations} + out['paths'] = {l:p for (l, p) in self.paths.items() if l not in self.suppress_spoiler_locations} out['Bosses'] = self.bosses out['meta'] = self.metadata diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d9a8e76..25fa22be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.3.1.2 +- Retro now gives a universal key from bottle vendor fish prize +- Fixed issue with Aga Door preventing Murahduhla Cutscene +- Fixed issue with Ice Cave/Shopping Mall water transitions not flipping in Mixed OWR +- Minor improvements to item GFX draw routine + ## 0.3.1.1 - \~Merged in DR v1.2.0.17~ - Various renames/reorganizations of region/rule definition to match upcoming DR world remodel diff --git a/Main.py b/Main.py index 6f0bad59..c426cef7 100644 --- a/Main.py +++ b/Main.py @@ -227,6 +227,8 @@ def main(args, seed=None, fish=None): update_world_regions(world, player) mark_light_dark_world_regions(world, player) create_dynamic_exits(world, player) + if args.print_custom_yaml: + world.settings.record_overworld(world) init_districts(world) diff --git a/OWEdges.py b/OWEdges.py index 2657c682..f4da280e 100644 --- a/OWEdges.py +++ b/OWEdges.py @@ -1153,6 +1153,7 @@ OWTileRegions = bidict({ 'Lake Hylia Water D': 0x35, 'Ice Cave Area': 0x37, + 'Ice Cave Water': 0x37, 'Desert Pass Area': 0x3a, 'Middle Aged Man': 0x3a, @@ -1292,6 +1293,7 @@ OWTileRegions = bidict({ 'Ice Palace Area': 0x75, 'Shopping Mall Area': 0x77, + 'Shopping Mall Water': 0x77, 'Swamp Nook Area': 0x7a, diff --git a/OverworldGlitchRules.py b/OverworldGlitchRules.py index 715bbc41..0e05246d 100644 --- a/OverworldGlitchRules.py +++ b/OverworldGlitchRules.py @@ -383,7 +383,7 @@ boots_clips_local = [ # (name, from_region, to_region) ('Hyrule Castle To Water Clip', 'Hyrule Castle Area', 'Hyrule Castle Water'), #fake flipper - ('Bat Cave River Clip Spot', 'Blacksmith Area', 'Blacksmith Ledge'), #cannot guarantee camera correction + #('Bat Cave River Clip Spot', 'Blacksmith Area', 'Blacksmith Ledge'), #TODO: This should be added in MG (screenwrap transition) ('Maze Race Item Get Ledge Clip', 'Maze Race Area', 'Maze Race Prize'), diff --git a/OverworldShuffle.py b/OverworldShuffle.py index 53cf7e91..3f08fcbf 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -7,7 +7,7 @@ from OWEdges import OWTileRegions, OWEdgeGroups, OWEdgeGroupsTerrain, OWExitType from OverworldGlitchRules import create_owg_connections from Utils import bidict -version_number = '0.3.1.1' +version_number = '0.3.1.2' # branch indicator is intentionally different across branches version_branch = '' @@ -639,17 +639,17 @@ def shuffle_tiles(world, groups, result_list, do_grouped, player): if world.customizer: if not do_grouped: custom_flips = world.customizer.get_owtileflips() - if custom_flips: + if custom_flips and player in custom_flips: + custom_flips = custom_flips[player] nonflipped_groups = list() forced_flips = list() forced_nonflips = list() - player_key = player - if 'undefined_chance' in custom_flips[player_key]: - undefined_chance = custom_flips[player_key]['undefined_chance'] - if 'force_flip' in custom_flips[player_key]: - forced_flips = custom_flips[player_key]['force_flip'] - if 'force_no_flip' in custom_flips[player_key]: - forced_nonflips = custom_flips[player_key]['force_no_flip'] + if 'undefined_chance' in custom_flips: + undefined_chance = custom_flips['undefined_chance'] + if 'force_flip' in custom_flips: + forced_flips = custom_flips['force_flip'] + if 'force_no_flip' in custom_flips: + forced_nonflips = custom_flips['force_no_flip'] for group in groups: if any(owid in group[0] for owid in forced_nonflips): diff --git a/Rom.py b/Rom.py index b2621829..c21832e0 100644 --- a/Rom.py +++ b/Rom.py @@ -38,7 +38,7 @@ from source.dungeon.RoomList import Room0127 JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = 'a5c37eecbe3e52b49639c0d0ad91a7c3' +RANDOMIZERBASEHASH = '614fa2fcbb4644beddadcf356e121d5a' class JsonRom(object): @@ -1582,7 +1582,8 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False): rom.write_byte(0x301FC, 0xDA if world.bow_mode[player].startswith('retro') else 0xE1) # rupees replace arrows under pots if enemized: rom.write_byte(0x1B152e, 0xDA if world.bow_mode[player].startswith('retro') else 0xE1) - rom.write_byte(0x30052, 0xDB if world.bow_mode[player].startswith('retro') else 0xE2) # replace arrows in fish prize from bottle merchant + if world.bow_mode[player].startswith('retro'): + rom.write_byte(0x30052, 0xE4 if world.keyshuffle[player] == 'universal' else 0xDB) # replace arrows in fish prize from bottle merchant rom.write_bytes(0xECB4E, [0xA9, 0x00, 0xEA, 0xEA] if world.bow_mode[player].startswith('retro') else [0xAF, 0x77, 0xF3, 0x7E]) # Thief steals rupees instead of arrows rom.write_bytes(0xF0D96, [0xA9, 0x00, 0xEA, 0xEA] if world.bow_mode[player].startswith('retro') else [0xAF, 0x77, 0xF3, 0x7E]) # Pikit steals rupees instead of arrows rom.write_bytes(0xEDA5, [0x35, 0x41] if world.bow_mode[player].startswith('retro') else [0x43, 0x44]) # Chest game gives rupees instead of arrows diff --git a/data/base2current.bps b/data/base2current.bps index 82728c51..99b8b750 100644 Binary files a/data/base2current.bps and b/data/base2current.bps differ diff --git a/source/classes/CustomSettings.py b/source/classes/CustomSettings.py index c5ff7e78..3e90e5b3 100644 --- a/source/classes/CustomSettings.py +++ b/source/classes/CustomSettings.py @@ -232,6 +232,14 @@ class CustomSettings(object): self.world_rep['settings'] = settings_dict for p in self.player_range: settings_dict[p] = {} + settings_dict[p]['ow_shuffle'] = world.owShuffle[p] + settings_dict[p]['ow_terrain'] = world.owTerrain[p] + settings_dict[p]['ow_crossed'] = world.owCrossed[p] + settings_dict[p]['ow_keepsimilar'] = world.owKeepSimilar[p] + settings_dict[p]['ow_mixed'] = world.owMixed[p] + settings_dict[p]['ow_whirlpool'] = world.owWhirlpoolShuffle[p] + settings_dict[p]['ow_fluteshuffle'] = world.owFluteShuffle[p] + settings_dict[p]['bonk_drops'] = world.shuffle_bonk_drops[p] settings_dict[p]['shuffle'] = world.shuffle[p] settings_dict[p]['door_shuffle'] = world.doorShuffle[p] settings_dict[p]['intensity'] = world.intensity[p] @@ -329,6 +337,15 @@ class CustomSettings(object): else: placements[location.player][location.name] = location.item.name + def record_overworld(self, world): + self.world_rep['ow-tileflips'] = flips = {} + for p in self.player_range: + if p in world.owswaps and len(world.owswaps[p][0]) > 0: + flips[p] = {} + flips[p]['force_flip'] = list(f for f in world.owswaps[p][0] if f < 0x40 or f >= 0x80) + flips[p]['force_flip'].sort() + flips[p]['undefined_chance'] = 0 + def record_entrances(self, world): self.world_rep['entrances'] = entrances = {} world.custom_entrances = {}