From c3dd6bac795cb0fb65e9988cccd18862a6847571 Mon Sep 17 00:00:00 2001 From: aerinon Date: Fri, 3 Mar 2023 16:52:29 -0700 Subject: [PATCH 1/4] Murderdactyl ohko rule --- Rules.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Rules.py b/Rules.py index 5015c019..9e048b38 100644 --- a/Rules.py +++ b/Rules.py @@ -873,6 +873,9 @@ def default_rules(world, player): set_rule(world.get_entrance('Graveyard Ledge Mirror Spot', player), lambda state: state.has_Pearl(player) and state.has_Mirror(player)) set_rule(world.get_entrance('Bumper Cave Entrance Rock', player), lambda state: state.has_Pearl(player) and state.can_lift_rocks(player)) set_rule(world.get_entrance('Bumper Cave Ledge Mirror Spot', player), lambda state: state.has_Mirror(player)) + # this more like an ohko rule - dependent on bird being present too - so enemizer could turn this off? + set_rule(world.get_entrance('Bumper Cave Ledge Drop', player), lambda state: state.has_Pearl(player) and + (state.has('Cape', player) or state.has('Cane of Byrna', player) or state.has_sword(player))) set_rule(world.get_entrance('Bat Cave Drop Ledge Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Dark World Hammer Peg Cave', player), lambda state: state.has_Pearl(player) and state.has('Hammer', player)) set_rule(world.get_entrance('Village of Outcasts Eastern Rocks', player), lambda state: state.has_Pearl(player) and state.can_lift_heavy_rocks(player)) From 9aab5a2c955e70dd2e6205273f509eb275c54c58 Mon Sep 17 00:00:00 2001 From: aerinon Date: Fri, 3 Mar 2023 16:53:23 -0700 Subject: [PATCH 2/4] Beemizer fix for shopsanity, pottery, etc. --- ItemList.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/ItemList.py b/ItemList.py index 53524e6c..845d0d78 100644 --- a/ItemList.py +++ b/ItemList.py @@ -372,21 +372,7 @@ def generate_itempool(world, player): for i in range(4): next(adv_heart_pieces).advancement = True - beeweights = {'0': {None: 100}, - '1': {None: 75, 'trap': 25}, - '2': {None: 40, 'trap': 40, 'bee': 20}, - '3': {'trap': 50, 'bee': 50}, - '4': {'trap': 100}} - def beemizer(item): - if world.beemizer[item.player] and not item.advancement and not item.priority and not item.type: - choice = random.choices(list(beeweights[world.beemizer[item.player]].keys()), weights=list(beeweights[world.beemizer[item.player]].values()))[0] - return item if not choice else ItemFactory("Bee Trap", player) if choice == 'trap' else ItemFactory("Bee", player) - return item - - if not skip_pool_adjustments: - world.itempool += [beemizer(item) for item in items] - else: - world.itempool += items + world.itempool += items # shuffle medallions mm_medallion, tr_medallion = None, None @@ -439,6 +425,20 @@ def generate_itempool(world, player): # modfiy based on start inventory, if any modify_pool_for_start_inventory(start_inventory, world, player) + beeweights = {'0': {None: 100}, + '1': {None: 75, 'trap': 25}, + '2': {None: 40, 'trap': 40, 'bee': 20}, + '3': {'trap': 50, 'bee': 50}, + '4': {'trap': 100}} + def beemizer(item): + if world.beemizer[item.player] and not item.advancement and not item.priority and not item.type: + choice = random.choices(list(beeweights[world.beemizer[item.player]].keys()), weights=list(beeweights[world.beemizer[item.player]].values()))[0] + return item if not choice else ItemFactory("Bee Trap", player) if choice == 'trap' else ItemFactory("Bee", player) + return item + + if not skip_pool_adjustments: + world.itempool = [beemizer(item) for item in world.itempool] + # increase pool if not enough items ttl_locations = sum(1 for x in world.get_unfilled_locations(player) if '- Prize' not in x.name) pool_size = count_player_dungeon_item_pool(world, player) From a5da504b90862a92b0fac742e53503628cb97bbd Mon Sep 17 00:00:00 2001 From: aerinon Date: Fri, 3 Mar 2023 16:53:50 -0700 Subject: [PATCH 3/4] Fix for district shuffle's placeholder issue --- source/item/FillUtil.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/item/FillUtil.py b/source/item/FillUtil.py index f581f3fb..c3881e7a 100644 --- a/source/item/FillUtil.py +++ b/source/item/FillUtil.py @@ -426,7 +426,8 @@ def filter_locations(item_to_place, locations, world, vanilla_skip=False, potion return filtered if len(filtered) > 0 else locations if world.algorithm == 'district': config = world.item_pool_config - if item_to_place == 'Placeholder' or item_to_place.name in config.item_pool[item_to_place.player]: + if ((isinstance(item_to_place,str) and item_to_place == 'Placeholder') + or item_to_place.name in config.item_pool[item_to_place.player]): restricted = config.location_groups[0].locations filtered = [l for l in locations if l.name in restricted and l.player in restricted[l.name]] return filtered if len(filtered) > 0 else locations From 87ab4a8c8ad45f09203158e274b5f1be42f3a1e2 Mon Sep 17 00:00:00 2001 From: aerinon Date: Mon, 6 Mar 2023 16:10:07 -0700 Subject: [PATCH 4/4] Update baserom and release notes --- Main.py | 2 +- RELEASENOTES.md | 6 ++++++ Rom.py | 8 +++++++- data/base2current.bps | Bin 93872 -> 93909 bytes 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Main.py b/Main.py index 52073cce..2a334081 100644 --- a/Main.py +++ b/Main.py @@ -34,7 +34,7 @@ from source.overworld.EntranceShuffle2 import link_entrances_new from source.tools.BPS import create_bps_from_data from source.classes.CustomSettings import CustomSettings -__version__ = '1.2.0.10u' +__version__ = '1.2.0.11u' from source.classes.BabelFish import BabelFish diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 6cb841e6..ac51ccda 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -108,6 +108,12 @@ These are now independent of retro mode and have three options: None, Random, an * Bonk Fairy (Dark) # Bug Fixes and Notes +* 1.2.0.11u + * Fixed an issue with lower layer doors in Standard + * Fix for doors in cave state (will no longer be vanilla) + * Added a logic rule for th murderdactyl near bumper ledge for OHKO purposes + * Fix for beemizer including modes with an increased item pool + * Fix for district algoritm * 1.2.0.10u * Fixed overrun issues with edge transitions * Better support for customized start_inventory with dungeon items diff --git a/Rom.py b/Rom.py index 0d9b0849..981b554a 100644 --- a/Rom.py +++ b/Rom.py @@ -37,7 +37,7 @@ from source.dungeon.RoomList import Room0127 JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = 'd981a1fc7408ecbb30fa44135c7239b7' +RANDOMIZERBASEHASH = 'badc0c787f7ab5e0ad05fb517953849a' class JsonRom(object): @@ -1591,6 +1591,7 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False): raise Exception('Pot table is too big for current area') world.pot_contents[player].write_pot_data_to_rom(rom, colorize_pots) + write_enemizer_tweaks(rom, world, player) write_strings(rom, world, player, team) # write initial sram @@ -1681,6 +1682,11 @@ def write_custom_shops(rom, world, player): rom.write_bytes(0x184900, items_data) +def write_enemizer_tweaks(rom, world, player): + if world.enemy_shuffle[player] != 'none': + rom.write_byte(snes_to_pc(0x1DF6D8, 0)) # lets enemies walk on water instead of clipping into infinity? + rom.write_byte(snes_to_pc(0x0DB6B3, 0x82)) # hovers don't need water necessarily? + def hud_format_text(text): output = bytes() for char in text.lower(): diff --git a/data/base2current.bps b/data/base2current.bps index b5582c3f917243a2eedb422ae856bbf82f7f21cd..57c2f8b618b86d3c6a8124c7723b85ac68063570 100644 GIT binary patch delta 1985 zcmW-hdr(u^9mnàjz0YX4|T`r&A0~ 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