From c3dd6bac795cb0fb65e9988cccd18862a6847571 Mon Sep 17 00:00:00 2001 From: aerinon Date: Fri, 3 Mar 2023 16:52:29 -0700 Subject: [PATCH 01/15] 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 02/15] 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 03/15] 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 da71e9ba12dc110a91e3a95c5b7ce1bef498d57d Mon Sep 17 00:00:00 2001 From: codemann8 Date: Mon, 6 Mar 2023 15:16:23 -0600 Subject: [PATCH 04/15] Placing Sanc Drop in DW if HC in DW and non-crossworld --- source/overworld/EntranceShuffle2.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/source/overworld/EntranceShuffle2.py b/source/overworld/EntranceShuffle2.py index 349af41c..e7010520 100644 --- a/source/overworld/EntranceShuffle2.py +++ b/source/overworld/EntranceShuffle2.py @@ -444,17 +444,19 @@ def do_holes_and_linked_drops(entrances, exits, avail, cross_world, keep_togethe random.shuffle(hole_entrances) if not cross_world and 'Sanctuary Grave' in holes_to_shuffle: hc = avail.world.get_entrance('Hyrule Castle Exit (South)', avail.player) + chosen_entrance = None if hc.connected_region and hc.connected_region.type == RegionType.DarkWorld: chosen_entrance = next(entrance for entrance in hole_entrances if entrance[0] in DW_Entrances) if not chosen_entrance: chosen_entrance = next(entrance for entrance in hole_entrances if entrance[0] in LW_Entrances) - hole_entrances.remove(chosen_entrance) - sanc_interior = next(target for target in hole_targets if target[0] == 'Sanctuary Exit') - hole_targets.remove(sanc_interior) - connect_two_way(chosen_entrance[0], sanc_interior[0], avail) # two-way exit - connect_entrance(chosen_entrance[1], sanc_interior[1], avail) # hole - remove_from_list(entrances, [chosen_entrance[0], chosen_entrance[1]]) - remove_from_list(exits, [sanc_interior[0], sanc_interior[1]]) + if chosen_entrance: + hole_entrances.remove(chosen_entrance) + sanc_interior = next(target for target in hole_targets if target[0] == 'Sanctuary Exit') + hole_targets.remove(sanc_interior) + connect_two_way(chosen_entrance[0], sanc_interior[0], avail) # two-way exit + connect_entrance(chosen_entrance[1], sanc_interior[1], avail) # hole + remove_from_list(entrances, [chosen_entrance[0], chosen_entrance[1]]) + remove_from_list(exits, [sanc_interior[0], sanc_interior[1]]) random.shuffle(hole_targets) for entrance, drop in hole_entrances: From 87ab4a8c8ad45f09203158e274b5f1be42f3a1e2 Mon Sep 17 00:00:00 2001 From: aerinon Date: Mon, 6 Mar 2023 16:10:07 -0700 Subject: [PATCH 05/15] 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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 Date: Mon, 6 Mar 2023 16:29:58 -0700 Subject: [PATCH 06/15] Update for enemizer bits --- RELEASENOTES.md | 3 ++- Rom.py | 4 ++-- source/classes/CustomSettings.py | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index ac51ccda..e87d4a22 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -112,8 +112,9 @@ These are now independent of retro mode and have three options: None, Random, an * 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 + * Enemizer alteration for Hovers and normal enemies in shallow water * Fix for beemizer including modes with an increased item pool - * Fix for district algoritm + * Fix for district algorithm * 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 981b554a..13b4f133 100644 --- a/Rom.py +++ b/Rom.py @@ -1684,8 +1684,8 @@ def write_custom_shops(rom, world, player): 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? + 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() diff --git a/source/classes/CustomSettings.py b/source/classes/CustomSettings.py index fd15253f..53105764 100644 --- a/source/classes/CustomSettings.py +++ b/source/classes/CustomSettings.py @@ -129,8 +129,8 @@ class CustomSettings(object): args.mapshuffle[p] = True args.compassshuffle[p] = True - args.shufflebosses[p] = get_setting(settings['shufflebosses'], args.shufflebosses[p]) - args.shuffleenemies[p] = get_setting(settings['shuffleenemies'], args.shuffleenemies[p]) + args.shufflebosses[p] = get_setting(settings['boss_shuffle'], args.shufflebosses[p]) + args.shuffleenemies[p] = get_setting(settings['enemy_shuffle'], args.shuffleenemies[p]) args.enemy_health[p] = get_setting(settings['enemy_health'], args.enemy_health[p]) args.enemy_damage[p] = get_setting(settings['enemy_damage'], args.enemy_damage[p]) args.shufflepots[p] = get_setting(settings['shufflepots'], args.shufflepots[p]) From 4563f96fd5d6c8066c23e3868379b1b39e6ef15a Mon Sep 17 00:00:00 2001 From: aerinon Date: Wed, 8 Mar 2023 08:25:46 -0700 Subject: [PATCH 07/15] Fix for mirror portal in inverted Yet another fix for blocked doors in Standard ER, minor alteration for the swamp entrance fix to work when blocked as well. --- RELEASENOTES.md | 3 +++ Rom.py | 2 +- data/base2current.bps | Bin 93909 -> 93952 bytes 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index e87d4a22..317db6b2 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -108,6 +108,9 @@ These are now independent of retro mode and have three options: None, Random, an * Bonk Fairy (Dark) # Bug Fixes and Notes +* 1.2.0.12u + * Fix for mirror portal in inverted + * Yet another fix for blocked door in Standard ER * 1.2.0.11u * Fixed an issue with lower layer doors in Standard * Fix for doors in cave state (will no longer be vanilla) diff --git a/Rom.py b/Rom.py index 13b4f133..0ca8e140 100644 --- a/Rom.py +++ b/Rom.py @@ -37,7 +37,7 @@ from source.dungeon.RoomList import Room0127 JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = 'badc0c787f7ab5e0ad05fb517953849a' +RANDOMIZERBASEHASH = '4faba57f154a2263bf91af041a0d8700' class JsonRom(object): diff --git a/data/base2current.bps b/data/base2current.bps index 57c2f8b618b86d3c6a8124c7723b85ac68063570..5a239f15ad6edbb9e939796d1ecad384d3162259 100644 GIT binary patch delta 1256 zcmX9)e^8TU9Dl$2#RljGylhMnpS_5V#0xbEMU5-7LOSf^N)vUFoY>5(oC}DgTt6iTHxXkKN4K*brQmKm+HNRlwZXMcGv;L}CNVWCr{e zYoWhgE6Mc4YBmq<0y+kXvI+>0aw!;f(k9o)+EOVVf8Y?w5+_>d znD%)o+uNZyvutQsR*aJ>Ud95dY{xTrjV!Rg(~X)OsD=$R4aRnoAJs4?Z|{jq?G9dw zLY*e$a_|U!;wY}9(63~s1`5h*hAeXb&IZ@5{$XLXI7Nkc3N>-8gijNRi28ZCO9t5A zjJO^N@^CE0XObijx*)SKEM`m!U%Ev{Yw)xA*svL2|9%9OY9a*fW>oBR_ zjZYu_x@EXjKrFeE1Fq~>#aP{qV~(xKBu5S#B)5KJfNX+;rreGBOKd!4zoQ=!IxXF*nV;RQTW+(U^S)>X z+T)9^M655mmjt!Iv^uBpTY-XlEoRTsfn~e2*sDM-;ZZu^di4Zf8IXx&k`A0tB3Bc{Z*@S~nDw=S@p9I}^$0+^V^R8Oa&CA=sk_Rrt0#r6(E zi_)TFzL?(K~%Uh44I#?LU*=9BU73t_5Csad_F J=fd8H%)iX72q6Ff delta 1257 zcmW+ze@s(n6n(cpXrY8sCi3+ak{ug&4llD zJksKzeSOxiv?DF(TU!iiUCpXXu;_Gax3FO%iPJcR#Dx7JdphPEE_BcRb)W`KP%8N>%?&`gvdoE`4`DYzB+I+oE#=del~YEEue!7V8qCyUjv(kduo zKmOT4>fU)i*?K?5jAaD{8uNrCSc>wwOjaoKAK%XYBhqrTn-$3c7R|WK)-vn=)a@6P z#gkg!(m(#YTf~c5RONml^HL_%mGfOW8COGT-hMaQ#01~Jkk~|K)lk{ldTH`gH!nqz zZYyHkJVGwFv4KLry15EW>s@vlarV(`CSGaGQVeA^X2JZBA}cP_^1#7;o`=Ju!VOW0 z@D$q5F%n)OHX<74r#Bhdw2AZ-LQzHg zx3tn_ACdDiq+@4B`)@ERZm2ikYE%bykxPY8lT)WJ#Y{7qDg-_B5t#;FflP9VM!a$D zWe#h{(&R)DY*4FD+olV- z9bQj)g}WC2L2ebn)|>+@{RXKgreau>`{6EUpw{LLRFLLk(e*v@Nipo#9P_z`h~*Hz zdhUmgQImjQONgoj8Z?K_1nP0Gxb``5(D|g@ zPIi@mZc84?!{?{Y9%LqscY2zJr%kDl5H@GW<~q<*pZKn`1>Fpk|_ZLEF(`!;4MvlrQfMDSX~)b@B9AT z9ik#@bkMl!Fz-~x=3L#;3C*-ATFUI0eIOw%IRXBf$u_s#nG(9`Gr0v{KW?pe(&)TD zu0qZJ_?xKBA3s8V)`4CX{9v~ZGuO4jlQsgSu&DE>O^3Z*s3ZDJ`%{GZci_s-S7~Qd znH#>wuy_W2HE;z($uwf|xY!(cyva>W=8LNYGB&_UdqNS9OPt$lpEX&E@klg%nw1 z?d|15nY!e*<^B<~!{Bg4X0%3!BhAGJBj&Ur?MOGRC*>t2c$~=-1I~BGr95Se0@w~V zP!<>FEd+X zJtU{*bVfh4ke!)H2|_rN%?jEZp^3-j;|)Gq;j*(5Jc*}>@ihrv(%oi$=BYXmpmPGS z`B73=29{jdNA^~OK_c6n?5zehfRYU8VXb;~r-MDP(iRHEYF~E;RwiflFT~2^LJiC} NDXTUj^o_@2{STKc5XJxi From 44afe50bf4ca08504006eb9ec300d0f9a14196f0 Mon Sep 17 00:00:00 2001 From: aerinon Date: Wed, 8 Mar 2023 08:26:50 -0700 Subject: [PATCH 08/15] Version bump --- Main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Main.py b/Main.py index 2a334081..f731df8a 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.11u' +__version__ = '1.2.0.12u' from source.classes.BabelFish import BabelFish From d549a2c323d261db4d164ca8602772f1c721d103 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Wed, 8 Mar 2023 16:19:29 -0600 Subject: [PATCH 09/15] Adding OWR modes to Customizer settings --- source/classes/CustomSettings.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/classes/CustomSettings.py b/source/classes/CustomSettings.py index 55796263..6d297347 100644 --- a/source/classes/CustomSettings.py +++ b/source/classes/CustomSettings.py @@ -72,7 +72,13 @@ class CustomSettings(object): args.mystery = True else: settings = defaultdict(lambda: None, player_setting) + args.ow_shuffle[p] = get_setting(settings['ow_shuffle'], args.ow_shuffle[p]) + args.ow_terrain[p] = get_setting(settings['ow_terrain'], args.ow_terrain[p]) + args.ow_crossed[p] = get_setting(settings['ow_crossed'], args.ow_crossed[p]) + args.ow_keepsimilar[p] = get_setting(settings['ow_keepsimilar'], args.ow_keepsimilar[p]) args.ow_mixed[p] = get_setting(settings['ow_mixed'], args.ow_mixed[p]) + args.ow_whirlpool[p] = get_setting(settings['ow_whirlpool'], args.ow_whirlpool[p]) + args.ow_fluteshuffle[p] = get_setting(settings['ow_fluteshuffle'], args.ow_fluteshuffle[p]) args.shuffle[p] = get_setting(settings['shuffle'], args.shuffle[p]) args.door_shuffle[p] = get_setting(settings['door_shuffle'], args.door_shuffle[p]) args.logic[p] = get_setting(settings['logic'], args.logic[p]) From 252f9ba1a701dacc4a1e79a84d2b458b7635d2c5 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Wed, 8 Mar 2023 20:41:16 -0600 Subject: [PATCH 10/15] Remove 5 Arrow items from bonk drop locations --- Fill.py | 2 +- ItemList.py | 2 ++ Items.py | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Fill.py b/Fill.py index 4507ddeb..d549e969 100644 --- a/Fill.py +++ b/Fill.py @@ -538,7 +538,7 @@ def ensure_good_pots(world, write_skips=False): and (loc.type != LocationType.Pot or loc.item.player != loc.player)): loc.item = ItemFactory(invalid_location_replacement[loc.item.name], loc.item.player) if (loc.item.name in {'Arrows (5)'} - and (loc.type not in [LocationType.Pot, LocationType.Bonk] or loc.item.player != loc.player)): + and (loc.type != LocationType.Pot or loc.item.player != loc.player)): loc.item = ItemFactory(invalid_location_replacement[loc.item.name], loc.item.player) # # can be placed here by multiworld balancing or shop balancing # # change it to something normal for the player it got swapped to diff --git a/ItemList.py b/ItemList.py index aebb6489..956b8153 100644 --- a/ItemList.py +++ b/ItemList.py @@ -1104,6 +1104,8 @@ def get_pool_core(world, player, progressive, shuffle, difficulty, treasure_hunt pool.remove('Fighter Sword') pool.extend(['Rupees (50)']) + #TODO: Remove test placements + #place_item('Purple Chest', 'Magic Mirror') if timer in ['timed', 'timed-countdown']: pool.extend(diff.timedother) clock_mode = 'stopwatch' if timer == 'timed' else 'countdown' diff --git a/Items.py b/Items.py index 6bde89ef..d0f6ba84 100644 --- a/Items.py +++ b/Items.py @@ -80,7 +80,7 @@ item_table = {'Bow': (True, False, None, 0x0B, 200, 'You have\nchosen the\narche 'Arrow Upgrade (+10)': (False, False, None, 0x54, 100, 'Increase arrow\nstorage, low\nlow price', 'and the quiver', 'quiver-enlarging kid', 'arrow boost for sale', 'witch and more skewers', 'upgrade boy sews more again', 'arrow capacity'), 'Arrow Upgrade (+5)': (False, False, None, 0x53, 100, 'Increase arrow\nstorage, low\nlow price', 'and the quiver', 'quiver-enlarging kid', 'arrow boost for sale', 'witch and more skewers', 'upgrade boy sews more again', 'arrow capacity'), 'Single Bomb': (False, False, None, 0x27, 5, 'I make things\ngo BOOM! But\njust once.', 'and the explosion', 'the bomb-holding kid', 'firecracker for sale', 'blend fungus into bomb', '\'splosion boy explodes again', 'a bomb'), - 'Arrows (5)': (False, False, None, 0xB5, 15, 'This will give\nyou five shots\nwith your bow!', 'and the arrow pack', 'stick-collecting kid', 'sewing kit for sale', 'fungus for arrows', 'archer boy sews again', 'five arrows'), + 'Arrows (5)': (False, False, None, 0x5A, 15, 'This will give\nyou five shots\nwith your bow!', 'and the arrow pack', 'stick-collecting kid', 'sewing kit for sale', 'fungus for arrows', 'archer boy sews again', 'five arrows'), 'Small Magic': (False, False, None, 0x45, 5, 'A bit of magic', 'and the bit of magic', 'bit-o-magic kid', 'magic bit for sale', 'fungus for magic', 'magic boy conjures again', 'a bit of magic'), 'Big Magic': (False, False, None, 0xB4, 40, 'A lot of magic', 'and lots of magic', 'lot-o-magic kid', 'magic refill for sale', 'fungus for magic', 'magic boy conjures again', 'a magic refill'), 'Chicken': (False, False, None, 0xB3, 5, 'Cucco of Legend', 'and the legendary cucco', 'chicken kid', 'fried chicken for sale', 'fungus for chicken', 'cucco boy clucks again', 'a cucco'), From 93eea0b40f780eec2cb791378ae43cdcec3a7066 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Thu, 9 Mar 2023 20:35:39 -0600 Subject: [PATCH 11/15] Added Cold Fairy Statue to bonkable locations --- Items.py | 1 + Regions.py | 5 +- Rom.py | 15 +++-- Rules.py | 4 +- Tables.py | 1 + asm/owrando.asm | 146 ++++++++++++++++++++++++++++++++++++---- data/base2current.bps | Bin 105527 -> 105775 bytes source/item/FillUtil.py | 2 +- 8 files changed, 153 insertions(+), 21 deletions(-) diff --git a/Items.py b/Items.py index d0f6ba84..1b7a041d 100644 --- a/Items.py +++ b/Items.py @@ -175,6 +175,7 @@ item_table = {'Bow': (True, False, None, 0x0B, 200, 'You have\nchosen the\narche 'Green Potion': (False, False, None, 0x2F, 60, 'Refreshing green goop!', 'and the green goo', 'the liquid kid', 'potion for sale', 'free samples', 'bottle boy has green goo again', 'a green potion'), 'Blue Potion': (False, False, None, 0x30, 160, 'Delicious blue goop!', 'and the blue goo', 'the liquid kid', 'potion for sale', 'free samples', 'bottle boy has blue goo again', 'a blue potion'), 'Bee': (False, False, None, 0x0E, 10, 'I will sting your foes a few times', 'and the sting buddy', 'the beekeeper kid', 'insect for sale', 'shroom pollenation', 'bottle boy has mad bee again', 'a bee'), + 'Good Bee': (False, False, None, 0xB5, 10, 'I will sting your foes a lot', 'and the cold buddy', 'the beekeeper kid', 'cold insect for sale', 'shroom pollenation', 'bottle boy has cold bee again', 'a good bee'), 'Small Heart': (False, False, None, 0x42, 10, 'Just a little\npiece of love!', 'and the heart', 'the life-giving kid', 'little love for sale', 'fungus for life', 'life boy feels some love again', 'a heart'), 'Apples': (False, False, None, 0xB1, 30, 'Just a few pieces of fruit!', 'and the juicy fruit', 'the fruity kid', 'the fruit stand', 'expired fruit', 'bottle boy has fruit again', 'an apple hoard'), 'Fairy': (False, False, None, 0xB2, 50, 'Just a pixie!', 'and the pixie', 'the pixie kid', 'pixie for sale', 'pixie fungus', 'bottle boy has pixie again', 'a pixie'), diff --git a/Regions.py b/Regions.py index 0bbca8b0..4f8e85de 100644 --- a/Regions.py +++ b/Regions.py @@ -688,6 +688,8 @@ def create_dungeon_regions(world, player): create_dungeon_region(player, 'Thieves Big Chest Nook', 'Thieves\' Town', ['Thieves\' Town - Big Key Chest'], ['Thieves Big Chest Nook ES Edge']), create_dungeon_region(player, 'Thieves Hallway', 'Thieves\' Town', ['Thieves\' Town - Hallway Pot Key'], ['Thieves Hallway SE', 'Thieves Hallway NE', 'Thieves Hallway WN', 'Thieves Hallway WS']), create_dungeon_region(player, 'Thieves Boss', 'Thieves\' Town', ['Revealing Light', 'Thieves\' Town - Boss', 'Thieves\' Town - Prize'], ['Thieves Boss SE']), + #create_dungeon_region(player, 'Thieves Boss', 'Thieves\' Town', ['Thieves\' Town - Boss', 'Thieves\' Town - Prize'], ['Revealing Light', 'Thieves Boss SE']), + #create_dungeon_region(player, 'Thieves Revealing Light', 'Thieves\' Town', ['Revealing Light'], ['Thieves Boss Room']), create_dungeon_region(player, 'Thieves Pot Alcove Mid', 'Thieves\' Town', None, ['Thieves Pot Alcove Mid ES', 'Thieves Pot Alcove Mid WS']), create_dungeon_region(player, 'Thieves Pot Alcove Bottom', 'Thieves\' Town', None, ['Thieves Pot Alcove Bottom SW']), create_dungeon_region(player, 'Thieves Pot Alcove Top', 'Thieves\' Town', None, ['Thieves Pot Alcove Top NW']), @@ -1304,7 +1306,8 @@ bonk_prize_table = { 'Dark Tree Line Tree 2': (0x26, 0x10, False, '', 'Dark Tree Line Area', 'in a tree'), 'Dark Tree Line Tree 3': (0x27, 0x08, False, '', 'Dark Tree Line Area', 'in a tree'), 'Dark Tree Line Tree 4': (0x28, 0x04, False, '', 'Dark Tree Line Area', 'in a tree'), - 'Hype Cave Statue': (0x29, 0x10, False, '', 'Hype Cave Area', 'encased in stone') + 'Hype Cave Statue': (0x29, 0x10, False, '', 'Hype Cave Area', 'encased in stone'), + 'Cold Fairy Statue': (0x2a, 0x02, False, '', 'Good Bee Cave', 'encased in stone') } bonk_table_by_location_id = {0x2ABB00+(data[0]*6)+3: name for name, data in bonk_prize_table.items()} diff --git a/Rom.py b/Rom.py index ffa91963..3a5c689c 100644 --- a/Rom.py +++ b/Rom.py @@ -38,7 +38,7 @@ from source.dungeon.RoomList import Room0127 JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '2b14cd0bbab8a7fb943c8bc1ca75ed1f' +RANDOMIZERBASEHASH = '4458a348e3040d79d0e28d572579fcb5' class JsonRom(object): @@ -686,7 +686,7 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False): flute_spots = default_flute_connections else: flute_spots = world.owflutespots[player] - owFlags |= 0x100 + owFlags |= 0x0100 for o in range(0, len(flute_spots)): owslot = flute_spots[o] @@ -740,12 +740,12 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False): owMode = 2 if world.owKeepSimilar[player] and (world.owShuffle[player] != 'vanilla' or world.owCrossed[player] in ['limited', 'chaos']): - owMode |= 0x100 + owMode |= 0x0100 if world.owCrossed[player] != 'none' and (world.owCrossed[player] != 'polar' or world.owMixed[player]): - owMode |= 0x200 + owMode |= 0x0200 world.fix_fake_world[player] = True if world.owMixed[player]: - owMode |= 0x400 + owMode |= 0x0400 # patches map data specific for OW Shuffle #inverted_buffer[0x03] = inverted_buffer[0x03] | 0x2 # convenient portal on WDM @@ -793,7 +793,7 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False): # for prize, address in zip(bonk_prizes, bonk_addresses): # rom.write_byte(address, prize) - owFlags |= 0x200 + owFlags |= 0x0200 # setting spriteID to D8, a placeholder sprite we use to inform ROM to spawn a dynamic item #for address in bonk_addresses: @@ -803,6 +803,8 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False): rom.write_byte(snes_to_pc(0x09AE32), 0xD8) rom.write_byte(snes_to_pc(0x09AE35), 0xD8) + rom.write_byte(snes_to_pc(0x06918E), 0x80) # skip good bee bottle check + write_int16(rom, 0x150002, owMode) write_int16(rom, 0x150004, owFlags) @@ -1649,6 +1651,7 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False): if world.shuffle_bonk_drops[player]: # warning, this temporary patch might cause fairies to respawn differently?, limiting this to bonk drop mode only rom.write_byte(snes_to_pc(0x0DB808), 0x03) # patch fairies sprites to not permadeath like enemies + rom.write_byte(snes_to_pc(0x1DF6D8), 0) # allows sprites to travel across water / same flag as write_enemizer_tweaks # allow smith into multi-entrance caves in appropriate shuffles if world.shuffle[player] in ['restricted', 'full', 'lite', 'lean', 'crossed', 'insanity'] or (world.shuffle[player] == 'simple' and world.mode[player] == 'inverted'): diff --git a/Rules.py b/Rules.py index 5bf4f76e..1cb91819 100644 --- a/Rules.py +++ b/Rules.py @@ -862,7 +862,9 @@ def default_rules(world, player): from Regions import bonk_prize_table for location_name, (_, _, aga_required, _, _, _) in bonk_prize_table.items(): loc = world.get_location(location_name, player) - if not aga_required: + if location_name == 'Cold Fairy Statue': + set_rule(loc, lambda state: state.can_use_bombs(player) and state.can_collect_bonkdrops(player)) + elif not aga_required: set_rule(loc, lambda state: state.can_collect_bonkdrops(player)) else: set_rule(loc, lambda state: state.can_collect_bonkdrops(player) and state.has_beaten_aga(player)) diff --git a/Tables.py b/Tables.py index a30f24f0..52f96488 100644 --- a/Tables.py +++ b/Tables.py @@ -130,6 +130,7 @@ bonk_prize_lookup = { 'Chicken': (0x0b, 0, None), 'Bee Trap': (0x79, 6, None), 'Apples': (0xac, 8, None), + 'Good Bee': (0xb2, 1, None), 'Small Heart': (0xd8, 2, None), 'Rupee (1)': (0xd9, 0, None), 'Rupees (5)': (0xda, 3, None), # TODO: add in murahdahla tree rupee diff --git a/asm/owrando.asm b/asm/owrando.asm index 09fe010d..3f3a7be0 100644 --- a/asm/owrando.asm +++ b/asm/owrando.asm @@ -157,6 +157,14 @@ and #$7f : eor #$40 : nop #2 org $06AD4C jsl.l OWBonkDrops : nop #4 +org $1EDE6F +jsl.l OWBonkGoodBeeDrop : bra + +GoldBee_SpawnSelf_SetProperties: +phb : lda.b #$1E : pha : plb ; switch to bank 1E + jsr GoldBee_SpawnSelf+12 +plb : rtl +nop #3 ++ ;Code org $aa8800 @@ -395,6 +403,112 @@ LoadMapDarkOrMixed: dw $0400+$0210 ; bottom right } +OWBonkGoodBeeDrop: +{ + LDA.l OWFlags+1 : AND.b #$02 : BNE .shuffled + .vanilla ; what we wrote over + STZ.w $0DD0,X + LDA.l BottleContentsOne : ORA.l BottleContentsTwo + ORA.l BottleContentsThree : ORA.l BottleContentsFour + RTL + .shuffled + PHY : TXY + LDA.l RoomDataWRAM[$0120].high : AND.b #$02 : PHA : BNE + ; check if collected + LDA.b #$1B : STA $12F ; JSL Sound_SetSfx3PanLong ; seems that when you bonk, there is a pending bonk sfx, so we clear that out and replace with reveal secret sfx + + + LDA.l OWBonkPrizeData+(42*6+4) : BEQ + ; multiworld item + LDA.l OWBonkPrizeData+(42*6+3) + JMP .spawn_item + + + + .determine_type ; S = Collected, FlagBitmask, X (row + 2) + LDA.l OWBonkPrizeData+(42*6+3) ; A = item id + CMP.b #$B0 : BNE + + LDA.b #$79 : JMP .sprite_transform ; transform to bees + + CMP.b #$42 : BNE + + JSL.l Sprite_TransmuteToBomb ; transform a heart to bomb, vanilla behavior + JMP .mark_collected + + CMP.b #$34 : BNE + + LDA.b #$D9 : JMP .sprite_transform ; transform to single rupee + + CMP.b #$35 : BNE + + LDA.b #$DA : JMP .sprite_transform ; transform to blue rupee + + CMP.b #$36 : BNE + + LDA.b #$DB : BRA .sprite_transform ; transform to red rupee + + CMP.b #$27 : BNE + + LDA.b #$DC : BRA .sprite_transform ; transform to 1 bomb + + CMP.b #$28 : BNE + + LDA.b #$DD : BRA .sprite_transform ; transform to 4 bombs + + CMP.b #$31 : BNE + + LDA.b #$DE : BRA .sprite_transform ; transform to 8 bombs + + CMP.b #$45 : BNE + + LDA.b #$DF : BRA .sprite_transform ; transform to small magic + + CMP.b #$B4 : BNE + + LDA.b #$E0 : BRA .sprite_transform ; transform to big magic + + CMP.b #$B5 : BNE + + LDA.b #$79 : JSL.l OWBonkSpritePrep + JSL.l GoldBee_SpawnSelf_SetProperties ; transform to good bee + BRA .mark_collected + + CMP.b #$44 : BNE + + LDA.b #$E2 : BRA .sprite_transform ; transform to 10 arrows + + CMP.b #$B1 : BNE + + LDA.b #$AC : BRA .sprite_transform ; transform to apples + + CMP.b #$B2 : BNE + + LDA.b #$E3 : BRA .sprite_transform ; transform to fairy + + CMP.b #$B3 : BNE .spawn_item + INX : INX : LDA.l OWBonkPrizeData+(42*6+5) + CLC : ADC.b #$08 : PHA + LDA.w $0D00,Y : SEC : SBC.b 1,S : STA.w $0D00,Y + LDA.w $0D20,Y : SBC.b #$00 : STA.w $0D20,Y : PLX + LDA.b #$0B : SEC ; BRA .sprite_transform ; transform to chicken + + .sprite_transform + JSL.l OWBonkSpritePrep + + .mark_collected ; S = Collected + PLA : BNE .return + LDA.l RoomDataWRAM[$0120].high : ORA.b #$02 : STA.l RoomDataWRAM[$0120].high + + REP #$20 + LDA.l TotalItemCounter : INC : STA.l TotalItemCounter + SEP #$20 + BRA .return + + ; spawn itemget item + .spawn_item ; A = item id ; Y = bonk sprite slot ; S = Collected + PLX : BEQ + : LDA.b #$00 : STA.w $0DD0,Y : BRA .return + + LDA.l OWBonkPrizeData+(42*6+4) : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID + + LDA.b #$01 : STA !REDRAW + + LDA.b #$EB : STA.l $7FFE00 + JSL Sprite_SpawnDynamically+15 ; +15 to skip finding a new slot, use existing sprite + + ; affects the rate the item moves in the Y/X direction + LDA.b #$00 : STA.w $0D40,Y + LDA.b #$0A : STA.w $0D50,Y + + LDA.b #$20 : STA.w $0F80,Y ; amount of force (gives height to the arch) + LDA.b #$FF : STA.w $0B58,Y ; stun timer + LDA.b #$30 : STA.w $0F10,Y ; aux delay timer 4 ?? dunno what that means + + LDA.b #$00 : STA.w $0F20,Y ; layer the sprite is on + + ; sets OW event bitmask flag, uses free RAM + LDA.l OWBonkPrizeData+(42*6+2) : STA.w $0ED0,Y + + ; determines the initial spawn point of item + LDA.w $0D00,Y : SEC : SBC.l OWBonkPrizeData+(42*6+5) : STA.w $0D00,Y + LDA.w $0D20,Y : SBC #$00 : STA.w $0D20,Y + + LDA.b #$01 : STA !REDRAW : STA !FORCE_HEART_SPAWN + + .return + PLY + LDA #$08 ; makes original good bee not spawn + RTL + nop #20 +} + ; Y = sprite slot index of bonk sprite OWBonkDrops: { @@ -439,7 +553,7 @@ OWBonkDrops: + CMP.b #$34 : BNE + LDA.b #$D9 : CLC : JMP .sprite_transform ; transform to single rupee + CMP.b #$35 : BNE + - LDA.b #$DA : CLC : BRA .sprite_transform ; transform to blue rupee + LDA.b #$DA : CLC : JMP .sprite_transform ; transform to blue rupee + CMP.b #$36 : BNE + LDA.b #$DB : CLC : BRA .sprite_transform ; transform to red rupee + CMP.b #$27 : BNE + @@ -453,7 +567,9 @@ OWBonkDrops: + CMP.b #$B4 : BNE + LDA.b #$E0 : CLC : BRA .sprite_transform ; transform to big magic + CMP.b #$B5 : BNE + - LDA.b #$E1 : CLC : BRA .sprite_transform ; transform to 5 arrows + LDA.b #$79 : JSL.l OWBonkSpritePrep + JSL.l GoldBee_SpawnSelf_SetProperties ; transform to good bee + BRA .mark_collected + CMP.b #$44 : BNE + LDA.b #$E2 : CLC : BRA .sprite_transform ; transform to 10 arrows + CMP.b #$B1 : BNE + @@ -468,14 +584,7 @@ OWBonkDrops: LDA.b #$0B : SEC ; BRA .sprite_transform ; transform to chicken .sprite_transform - STA.w $0E20,Y - TYX : JSL.l Sprite_LoadProperties - BEQ + - ; these are sprite properties that make it fall out of the tree to the east - LDA #$30 : STA $0F80,Y ; amount of force (related to speed) - LDA #$10 : STA $0D50,Y ; eastward rate of speed - LDA #$FF : STA $0B58,Y ; expiration timer - + + JSL.l OWBonkSpritePrep .mark_collected ; S = Collected, FlagBitmask, X (row + 2) PLA : BNE + ; S = FlagBitmask, X (row + 2) @@ -495,8 +604,7 @@ OWBonkDrops: LDA.b #$01 : STA !REDRAW - LDA.b #$EB - STA.l $7FFE00 + LDA.b #$EB : STA.l $7FFE00 JSL Sprite_SpawnDynamically+15 ; +15 to skip finding a new slot, use existing sprite ; affects the rate the item moves in the Y/X direction @@ -525,6 +633,19 @@ OWBonkDrops: PLA : PLA : PLB : RTL } +; A = SpriteID, Y = Sprite Slot Index, X = free/overwritten +OWBonkSpritePrep: +{ + STA.w $0E20,Y + TYX : JSL.l Sprite_LoadProperties + BEQ + + ; these are sprite properties that make it fall out of the tree to the east + LDA #$30 : STA $0F80,Y ; amount of force (related to speed) + LDA #$10 : STA $0D50,Y ; eastward rate of speed + LDA #$FF : STA $0B58,Y ; expiration timer + + RTL +} + org $aa9000 OWDetectEdgeTransition: { @@ -1539,6 +1660,7 @@ db $6e, $8c, $10, $35, $00, $10 db $6e, $90, $08, $b0, $00, $10 db $6e, $a4, $04, $b1, $00, $10 db $74, $4e, $10, $b1, $00, $1c +db $ff, $00, $02, $b5, $00, $08 ; temporary fix - murahdahla replaces one of the bonk tree prizes ; so we copy the sprite table here and update the pointer diff --git a/data/base2current.bps b/data/base2current.bps index 0d2e6dd4428d2baf700f9943f65fef0e500a0053..f12897a42e34bbc4aaa14a6c175c0ec7b49f9d35 100644 GIT binary patch delta 1808 zcmW-hYgAKL7RT?sdGZRP0s-U|P~;&Xk%wBaiXlP5!(u50q*|p7TxU_n)&gCSb0eWf z2r(YX9k@|iQ>ML1Y0$JHL!COV)xk@ra;>XtAyjnX%vzKWW0rI}4l^xt;{CAyd;Ry_ z=j`+Qu*YwRJ%199HR3|YTgU(4ZNiU8h-(ec>f2xQgr^4z5!6geZfoVV--^aAcy;s&m78D z{e#-FmQg-+Px0GFx#N(M{*#oWNxz$9>WqbKs`u9@>7 z`+T6sHY^5E-TKtF#!J~!Cc723l_W~lHA^N|$aKJuN*u%n2=}Pd@eW9;{TC4 zwyDv#o8G0pUJVXN9a&UR;=K3eg!#9?!JX4H1y`@H3tNHfG|J#BWcyhOwc2pTaPT~= z(B$rCCf*x)qvv<=R?oJe>sget(xmH_ z=H7*yRPbv}B%$huvzpCB`zTz~Y$9}@!`RZ(#PKmWP`Vu_yi=uxBBJSgD6UK<-u@nD zRBDMmJnX29$KUe~Remic3ZKKe+M1%;C}94TkA^Y866UE}p%cRaC9xVuw3|m+A<6y5 z?_%;Iz_2qCNj^>0y_~GH0S3A)F5-5!V<2fd}-@L}h zIAh}h-4Fqs`#n(Gy>`jG07oAxj4crYD^XmxOsV%@F(B@x*Xhf>U zYGk4<7Van??yTDa%!QtTPujM?JGwfeF#~R{%M5!xbq)sV=B=-00<%V{p&Q|ey1zrWRamQ)J>m|BgO*s zZ19J8ebk~zpAXi1gQ@G~;`;4>qw|#T&Rqvy1siA5iHTeF_hmtVr=hVmxx-C-=`AvVbqAZ&W%++&O<+~hQDGhYI;OE|vZ@%qANX6^}xpt}#F%`3O z@C{Qb$U}7J<)95w6|q0cK?}kvVjs$Z;Y|cq#4gCe5kywRK9Yk&h^&ZxEWh8>Js@Hi zR3Oa}pF zQcxZ16z`US@#I%_hh F`#)n48tDK4 delta 1627 zcmW+$ZBSEJ8qU2p2?0zBTHrz|#26X@1^JTrK@pmSAmO8>MGT0#TiWQgqHR~FQsKQw zr~zZdQ@F-}ahp|pgK2=<8qwM^o$lI8OTCWM8H3$&j4+I6Xuli0jzzY6D zLBY!0M;F>bvKagk=P}AM9Xj}UV`NL{{6u@Cz!$y8b2%w!A|f~|RXTPvxvl3MgMSjecK^1CSXphL)8gIc`^r|^!Mcd(j^eu^#E4(iqM##KI(e~oJgOz%- z(MRS%y!;%pm1kkusJlEBFX=&7%J-)Cmy2sFo(E4FXStPIujkOkvX8m#nuo8zbDJmc z8b+^cE6<@!OMWZ?7xggNd~&Dt0@`mWOmn`zaJ24Z5uHtgE6)s|>fDs-rh!|1V6qK} zA#~HCR@WN8osyr|yxR}hc?a5W%O>BD553+{zfYF}&R>KSqy|@fsBwXLH38@- zcjskmdXSY;{Qre5UOWkWt5SfDb$2>N+Iza6V4tOU31d!yDNG<(BgNz5W};X##V-l# zy#)Bw9SqxckI~F z3a38ap7#Di3q!B+uS*8+Y3G5Eoe4NvM*Ll((+q!Mvgi=iqK|f|H&=+aM4=awA)M!6 z&N!C@wSRvaFqui0u4+LqBv)}k@1Zj5gh$nZKf3^%)+d&DOz(SwT+ zB_!IU>)oB+6qk$NDn%tPObrX0nH&)vLa_@2O``tI<6TBtX?omD}qSgi<{fT1p9iKDX zrV!WKOB^fx7gu`tQ%r?$%TEJG>O1Kg?~@JPDE_tXsLE`b1{BL(e63ZL)YwYjj!1cY zB-+ldxP&z&eJ_ z)BZ!@m;~&izGEm79Vh1>L@;J=wG_U_1(~)XD5u0nyWI2ce`X}NgoOF=fnyuaPVJH? zmybBaPhReslL+`QHHoBML-1h!w&d2dg;}G*p|oo)W)Wnp+LeR(iNLaASuPRTq}_U= zchb&}i0YeGQ!ig8L}?p3f^utfFJBA{YwosI(NjT1L62U_fj_`UB{FMYdzfJ@* zB<$gHMevA(dfp_0SrV$m)RD1sBpAiWk+I*Bu$4E8;5!oX#7vX2*C12OFDd&Nv|?)2 z&o4V7_bV*pk`ATeF&5Cs=?@p#Sc6BSx}_y=xFSyks+8ba@-)QSg=D7e;2lOs^>Mo2 zL!b4>-o*%WL^E?+M1DN*+bp+dqJ5I7Et~Of>!uHSTha$yY>cPYyE*@!|7hJj+FAW* z-0l%ni}UmI;}WIe7s;(*TRQNZyMHupJWDqFmGUj)C&Nk?IRqmSA73#P%^s&tr=* zH_Zjt8dLpotzBVV9Y#orgoA_O%$=A+m8gf+HA*1pyh0W9*P11gk@0X*UifwkcA!Xc Nd}hmmr~m%e?60;cyTt$i diff --git a/source/item/FillUtil.py b/source/item/FillUtil.py index 3f82db2a..1ed455b3 100644 --- a/source/item/FillUtil.py +++ b/source/item/FillUtil.py @@ -821,7 +821,7 @@ trash_items = { 'Nothing': -1, 'Bee Trap': 0, 'Rupee (1)': 1, 'Rupees (5)': 1, 'Small Heart': 1, 'Bee': 1, 'Arrows (5)': 1, 'Chicken': 1, 'Single Bomb': 1, - 'Rupees (20)': 2, 'Small Magic': 2, + 'Rupees (20)': 2, 'Small Magic': 2, 'Good Bee': 2, 'Bombs (3)': 3, 'Arrows (10)': 3, 'Bombs (10)': 3, 'Apples': 3, 'Fairy': 4, 'Big Magic': 4, 'Red Potion': 4, 'Blue Shield': 4, 'Rupees (50)': 4, 'Rupees (100)': 4, 'Rupees (300)': 5, From ab5670c64fc43c40a73d641a969e9101bfd0ca90 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Thu, 9 Mar 2023 22:23:32 -0600 Subject: [PATCH 12/15] Adding Lean/Lite ER support for new Good Bee Cave location --- source/overworld/EntranceShuffle2.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/source/overworld/EntranceShuffle2.py b/source/overworld/EntranceShuffle2.py index e7010520..ecadaee9 100644 --- a/source/overworld/EntranceShuffle2.py +++ b/source/overworld/EntranceShuffle2.py @@ -1134,6 +1134,9 @@ def do_vanilla_connect(pool_def, avail): elif pool_def['condition'] == 'takeany': if avail.world.take_any[avail.player] == 'fixed': return + elif pool_def['condition'] == 'bonk': + if avail.world.shuffle_bonk_drops[avail.player]: + return defaults = {**default_connections, **(inverted_default_connections if avail.inverted != avail.world.is_tile_swapped(0x1b, avail.player) else open_default_connections)} for entrance in pool_def['entrances']: if entrance in avail.entrances: @@ -1574,7 +1577,11 @@ modes = { 'Light World Bomb Hut', '20 Rupee Cave', '50 Rupee Cave', 'Hookshot Fairy', 'Palace of Darkness Hint', 'Dark Lake Hylia Ledge Spike Cave', 'Dark Desert Hint'] - + }, + 'fixed_bonk': { + 'special': 'vanilla', + 'condition': 'bonk', + 'entrances': ['Good Bee Cave'] }, 'item_caves': { # shuffles shops/pottery if they weren't fixed in the last steps 'entrances': ['Mimic Cave', 'Spike Cave', 'Mire Shed', 'Dark World Hammer Peg Cave', 'Chest Game', @@ -1661,7 +1668,11 @@ modes = { 'Light World Bomb Hut', '20 Rupee Cave', '50 Rupee Cave', 'Hookshot Fairy', 'Palace of Darkness Hint', 'Dark Lake Hylia Ledge Spike Cave', 'Dark Desert Hint'] - + }, + 'fixed_bonk': { + 'special': 'vanilla', + 'condition': 'bonk', + 'entrances': ['Good Bee Cave'] }, 'item_caves': { # shuffles shops/pottery if they weren't fixed in the last steps 'entrances': ['Mimic Cave', 'Spike Cave', 'Mire Shed', 'Dark World Hammer Peg Cave', 'Chest Game', From 4108370849d3f2e3fd9875392a6d6f592e967a0a Mon Sep 17 00:00:00 2001 From: codemann8 Date: Thu, 9 Mar 2023 22:23:32 -0600 Subject: [PATCH 13/15] Adding Lean/Lite ER support for new Good Bee Cave location --- source/overworld/EntranceShuffle2.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/source/overworld/EntranceShuffle2.py b/source/overworld/EntranceShuffle2.py index e7010520..3515fa47 100644 --- a/source/overworld/EntranceShuffle2.py +++ b/source/overworld/EntranceShuffle2.py @@ -1134,6 +1134,9 @@ def do_vanilla_connect(pool_def, avail): elif pool_def['condition'] == 'takeany': if avail.world.take_any[avail.player] == 'fixed': return + elif pool_def['condition'] == 'bonk': + if avail.world.shuffle_bonk_drops[avail.player]: + return defaults = {**default_connections, **(inverted_default_connections if avail.inverted != avail.world.is_tile_swapped(0x1b, avail.player) else open_default_connections)} for entrance in pool_def['entrances']: if entrance in avail.entrances: @@ -1550,7 +1553,7 @@ modes = { 'condition': '', 'entrances': ['Dark Desert Fairy', 'Archery Game', 'Fortune Teller (Dark)', 'Dark Sanctuary Hint', 'Dark Lake Hylia Ledge Hint', 'Dark Lake Hylia Fairy', 'Dark Lake Hylia Shop', - 'East Dark World Hint', 'Kakariko Gamble Game', 'Good Bee Cave', 'Long Fairy Cave', + 'East Dark World Hint', 'Kakariko Gamble Game', 'Long Fairy Cave', 'Bush Covered House', 'Fortune Teller (Light)', 'Lost Woods Gamble', 'Lake Hylia Fortune Teller', 'Lake Hylia Fairy', 'Bonk Fairy (Light)', 'Inverted Dark Sanctuary'], }, @@ -1574,7 +1577,11 @@ modes = { 'Light World Bomb Hut', '20 Rupee Cave', '50 Rupee Cave', 'Hookshot Fairy', 'Palace of Darkness Hint', 'Dark Lake Hylia Ledge Spike Cave', 'Dark Desert Hint'] - + }, + 'fixed_bonk': { + 'special': 'vanilla', + 'condition': 'bonk', + 'entrances': ['Good Bee Cave'] }, 'item_caves': { # shuffles shops/pottery if they weren't fixed in the last steps 'entrances': ['Mimic Cave', 'Spike Cave', 'Mire Shed', 'Dark World Hammer Peg Cave', 'Chest Game', @@ -1582,7 +1589,7 @@ modes = { 'Ice Rod Cave', 'Dam', 'Bonk Rock Cave', 'Library', 'Potion Shop', 'Mini Moldorm Cave', 'Checkerboard Cave', 'Graveyard Cave', 'Cave 45', 'Sick Kids House', 'Blacksmiths Hut', 'Sahasrahlas Hut', 'Aginahs Cave', 'Chicken House', 'Kings Grave', 'Blinds Hideout', - 'Waterfall of Wishing', 'Cave Shop (Dark Death Mountain)', + 'Waterfall of Wishing', 'Cave Shop (Dark Death Mountain)', 'Good Bee Cave', 'Dark World Potion Shop', 'Dark World Lumberjack Shop', 'Dark World Shop', 'Red Shield Shop', 'Kakariko Shop', 'Capacity Upgrade', 'Cave Shop (Lake Hylia)', 'Lumberjack House', 'Snitch Lady (West)', 'Snitch Lady (East)', 'Tavern (Front)', @@ -1637,7 +1644,7 @@ modes = { 'condition': '', 'entrances': ['Dark Desert Fairy', 'Archery Game', 'Fortune Teller (Dark)', 'Dark Sanctuary Hint', 'Dark Lake Hylia Ledge Hint', 'Dark Lake Hylia Fairy', 'Dark Lake Hylia Shop', - 'East Dark World Hint', 'Kakariko Gamble Game', 'Good Bee Cave', 'Long Fairy Cave', + 'East Dark World Hint', 'Kakariko Gamble Game', 'Long Fairy Cave', 'Bush Covered House', 'Fortune Teller (Light)', 'Lost Woods Gamble', 'Lake Hylia Fortune Teller', 'Lake Hylia Fairy', 'Bonk Fairy (Light)', 'Inverted Dark Sanctuary'], }, @@ -1661,7 +1668,11 @@ modes = { 'Light World Bomb Hut', '20 Rupee Cave', '50 Rupee Cave', 'Hookshot Fairy', 'Palace of Darkness Hint', 'Dark Lake Hylia Ledge Spike Cave', 'Dark Desert Hint'] - + }, + 'fixed_bonk': { + 'special': 'vanilla', + 'condition': 'bonk', + 'entrances': ['Good Bee Cave'] }, 'item_caves': { # shuffles shops/pottery if they weren't fixed in the last steps 'entrances': ['Mimic Cave', 'Spike Cave', 'Mire Shed', 'Dark World Hammer Peg Cave', 'Chest Game', @@ -1669,7 +1680,7 @@ modes = { 'Ice Rod Cave', 'Dam', 'Bonk Rock Cave', 'Library', 'Potion Shop', 'Mini Moldorm Cave', 'Checkerboard Cave', 'Graveyard Cave', 'Cave 45', 'Sick Kids House', 'Blacksmiths Hut', 'Sahasrahlas Hut', 'Aginahs Cave', 'Chicken House', 'Kings Grave', 'Blinds Hideout', - 'Waterfall of Wishing', 'Cave Shop (Dark Death Mountain)', + 'Waterfall of Wishing', 'Cave Shop (Dark Death Mountain)', 'Good Bee Cave', 'Dark World Potion Shop', 'Dark World Lumberjack Shop', 'Dark World Shop', 'Red Shield Shop', 'Kakariko Shop', 'Capacity Upgrade', 'Cave Shop (Lake Hylia)', 'Lumberjack House', 'Snitch Lady (West)', 'Snitch Lady (East)', 'Tavern (Front)', From 76da44f6582b8d167b8346404ae9e6f9684e924d Mon Sep 17 00:00:00 2001 From: codemann8 Date: Fri, 10 Mar 2023 23:48:04 -0600 Subject: [PATCH 14/15] Adding more OWR examples to customizer example yaml --- docs/customizer_example.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/customizer_example.yaml b/docs/customizer_example.yaml index 188c17d6..cd70004c 100644 --- a/docs/customizer_example.yaml +++ b/docs/customizer_example.yaml @@ -17,6 +17,13 @@ settings: shopsanity: true shuffle: crossed shufflelinks: true + ow_shuffle: parallel + ow_terrain: true + ow_crossed: grouped + ow_keepsimilar: true + ow_mixed: true + ow_whirlpool: true + ow_fluteshuffle: balanced shufflebosses: unique item_pool: 1: From 6283a880deb267dae1114f2473d768ba6841bfc9 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Fri, 10 Mar 2023 23:56:40 -0600 Subject: [PATCH 15/15] Version bump 0.3.0.2 --- CHANGELOG.md | 7 +++++++ OverworldShuffle.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f782574c..522421f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## 0.3.0.2 +- \~Merged in DR v1.2.0.12~ + - Fixed some door landing issues +- Added Cold Fairy Statue as a new Bonk Location in Bonk Drop Shuffle +- Added Customizer support for enabling OWR Options +- Removed `Arrows (5)` item from Item Table, replaces with `Arrows (10)` + ## 0.3.0.1 - \~Merged in DR v1.2.0.10~ - Fixed some door landing issues diff --git a/OverworldShuffle.py b/OverworldShuffle.py index a49a6db5..264c5a19 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.0.1' +version_number = '0.3.0.2' # branch indicator is intentionally different across branches version_branch = '-u'