From c10a791ed6bc761642726709aa92ab4e11dd94a2 Mon Sep 17 00:00:00 2001 From: aerinon Date: Fri, 2 Sep 2022 13:10:03 -0600 Subject: [PATCH 1/9] Important key fix for logic placment --- Fill.py | 3 ++- KeyDoorShuffle.py | 23 +++++++++++++---------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Fill.py b/Fill.py index 5a414c98..d7a97bf2 100644 --- a/Fill.py +++ b/Fill.py @@ -172,7 +172,8 @@ def valid_key_placement(item, location, key_pool, world): if key_logic.prize_location: prize_loc = world.get_location(key_logic.prize_location, location.player) cr_count = world.crystals_needed_for_gt[location.player] - return key_logic.check_placement(unplaced_keys, location if item.bigkey else None, prize_loc, cr_count) + wild_keys = world.keyshuffle[item.player] != 'none' + return key_logic.check_placement(unplaced_keys, wild_keys, location if item.bigkey else None, prize_loc, cr_count) else: return not item.is_inside_dungeon_item(world) diff --git a/KeyDoorShuffle.py b/KeyDoorShuffle.py index bb4f6835..ad06f3fc 100644 --- a/KeyDoorShuffle.py +++ b/KeyDoorShuffle.py @@ -62,9 +62,9 @@ class KeyLogic(object): self.sm_doors = {} self.prize_location = None - def check_placement(self, unplaced_keys, big_key_loc=None, prize_loc=None, cr_count=7): + def check_placement(self, unplaced_keys, wild_keys, big_key_loc=None, prize_loc=None, cr_count=7): for rule in self.placement_rules: - if not rule.is_satisfiable(self.outside_keys, unplaced_keys, big_key_loc, prize_loc, cr_count): + if not rule.is_satisfiable(self.outside_keys, wild_keys, unplaced_keys, big_key_loc, prize_loc, cr_count): return False if big_key_loc: for rule_a, rule_b in itertools.combinations(self.placement_rules, 2): @@ -186,17 +186,20 @@ class PlacementRule(object): if not bk_blocked and check_locations is None: return True available_keys = outside_keys - empty_chests = 0 # todo: sometimes we need an extra empty chest to accomodate the big key too # dungeon bias seed 563518200 for example threshold = self.needed_keys_wo_bk if bk_blocked else self.needed_keys_w_bk - for loc in check_locations: - if not loc.item: - empty_chests += 1 - elif loc.item and loc.item.name == self.small_key: - available_keys += 1 - place_able_keys = min(empty_chests, unplaced_keys) - available_keys += place_able_keys + if not wild_keys: + empty_chests = 0 + for loc in check_locations: + if not loc.item: + empty_chests += 1 + elif loc.item and loc.item.name == self.small_key: + available_keys += 1 + place_able_keys = min(empty_chests, unplaced_keys) + available_keys += place_able_keys + else: + available_keys += unplaced_keys return available_keys >= threshold From 9cca25bdc4c7b1d96f7a974545e1fa9d22cfb933 Mon Sep 17 00:00:00 2001 From: aerinon Date: Fri, 2 Sep 2022 13:11:03 -0600 Subject: [PATCH 2/9] Modified key fix for Unstable --- Fill.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Fill.py b/Fill.py index d7a97bf2..23058688 100644 --- a/Fill.py +++ b/Fill.py @@ -172,7 +172,7 @@ def valid_key_placement(item, location, key_pool, world): if key_logic.prize_location: prize_loc = world.get_location(key_logic.prize_location, location.player) cr_count = world.crystals_needed_for_gt[location.player] - wild_keys = world.keyshuffle[item.player] != 'none' + wild_keys = world.keyshuffle[item.player] return key_logic.check_placement(unplaced_keys, wild_keys, location if item.bigkey else None, prize_loc, cr_count) else: return not item.is_inside_dungeon_item(world) From c298b392d003e778d5c56d17bd54b5687dc6370b Mon Sep 17 00:00:00 2001 From: aerinon Date: Wed, 7 Sep 2022 16:53:52 -0600 Subject: [PATCH 3/9] Fix for rain prevented doors fouling up key doors --- Main.py | 2 +- RELEASENOTES.md | 3 +++ Rom.py | 2 +- data/base2current.bps | Bin 93186 -> 93219 bytes 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Main.py b/Main.py index d47fbc46..2f7350c5 100644 --- a/Main.py +++ b/Main.py @@ -31,7 +31,7 @@ from Utils import output_path, parse_player_names from source.item.FillUtil import create_item_pool_config, massage_item_pool, district_item_pool_config from source.tools.BPS import create_bps_from_data -__version__ = '1.0.1.2-u' +__version__ = '1.0.1.3-u' from source.classes.BabelFish import BabelFish diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 1e059997..dcb80a60 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -183,6 +183,9 @@ Same as above but both small keys and bigs keys of the dungeon are not allowed o #### Unstable +* 1.0.1.3 + * Fix for rain prevented doors fouling up key doors + * Couple minor issues * 1.0.1.2 * Removed "good bee" as an in-logic way of killing Mothula * Fixed an issue with Mystery generation and Windows path diff --git a/Rom.py b/Rom.py index 4af847ad..b76cfef8 100644 --- a/Rom.py +++ b/Rom.py @@ -37,7 +37,7 @@ from source.dungeon.RoomList import Room0127 JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '0f96237c73cccaf7a250343fe3e8c887' +RANDOMIZERBASEHASH = 'fc4d4a01f8c4e00280ea5640297f8e9c' class JsonRom(object): diff --git a/data/base2current.bps b/data/base2current.bps index 55525ee50a0d8f30527d68ac4de47956a9acb906..25cc58b2c300e723aaa269298be9cd15e9323ea3 100644 GIT binary patch delta 1046 zcmW-dZ%i9?7{~9q{)HB?Q?WC(W!#2$Kb7H74*vL*`B8QaBU$F0f9mO*C*SYq`+T1l zk9SQqv8KA#2>K-_sZ$X^lrVRC6UU)K0fh;l@(WUn`Uh>pe!C&@f+iDSdZJOQgr3Ap z`l}kapCHZ0E1)Cc+S^e`YD0N>UnCr9A|>b5?wFSF#4q3@UBXsH^q=(R=7J>IQ|Yu+v=mv{+CU2rCHoSwq6>DP z<*qLxca>)m(QEE}Pm~yK?BQZ$%pjAL4OaAHo}Rz<(TWY^Y2850r~bC2)RJzV$dc4< z_k*iGk37Hjd2Xa74O$CCNLqnPg;ZL~A3aJ1{*bW>b@MX3&Le`Wa^<`JN78@jL|~!D znnyF>pB&uHqg}$-u&7`o=hQd5aYr_6)Ae!a33kjflQ7O=J{v53*4ghba-ssA`M`xP zaUwz=bB;O!ZE=EyW^8^hg9PvVqEpn$k6;OxBMnu*61Z#j;)%m_P`P_}OInhXNs&OO z1(p;wvXRx4sB%!mn$K+GW zQ2YSxbm%eB&&G)F%?vxU zThw88(OEcTIK|)&L(-88^%;tW+8O+=70MKCbu-B^D`W#%b_B<_!#?UP;p5#ko=7Ba edWH)(CDYr11gK4t#qg+J`>plp;cFAeKKT~_?x1@B delta 1033 zcmW-de@q*77{>3t_Sym+*V4j@VE3i`Xd5(wie+0EE^3U`ty8n9IJYL72o{hyBVY*J zmEA(AU4LB47url(*hM*|xYiUt5uVl00=EYd%{whlUC7KtB47Gq- z>Rk(nx!z)MjT4bO2{NIPc*O)6^_Z*opL?=Z#f~bzH_yz; ztxP6IkaK`+1I#8tKGu6Ij1C9TW87Htx5;;>PizDXQh-;-@k~Bw3@y`_j|2o6I&#d3 z+yMch&jZ%y3G@rTnGeS2cFr6>>|loF4dMIZqV$eQfk1nCjuey1hrrCjDDW-S23P5JQGsgJZ+b*VXisn z2|~2^FRm~&bwW{IU!#usCkf~*^;chLwZE3>nv$(O{ z!v=6Oi+eq6{e(Nd?Lr@8GZhbxM?0OKsIAQtHQ{wFm`Fz)mli;?wt2)qj!o^%cPB6O z&DDsg8S@1YDllSR;}(=eM)sN!C$yHSTx`<;Lc?LRq5o{yJehWi=Fu06mX{L`Dx^Bm zWfS8nv=evfpt7jSqGzJJ23R`!W_~0nDp2>xS05JOvpQ(3-aj1O%J`(cckv*r#%*pc zQI`6^?foKnyU16uc_LoUgnSCLj?-V`GCdT+ZEVwnvA79aK6~i8nuZbcDO5Wm$ss%c zgqwdEcj&Yf3NjZh`C_YI`xjgSvyrvqoUz)t!l!V_%S=8DCpbWaDOrW8Uz0#K>) RGFZ2(mZ`;_)b2~~{0GNjp9KH_ From 4ce85a9f2db4722c14882945e56f2af5cdde0505 Mon Sep 17 00:00:00 2001 From: aerinon Date: Wed, 7 Sep 2022 16:49:47 -0600 Subject: [PATCH 4/9] Couple minor issues - let a door not be dead in higher intensity, slightly better reporting --- Doors.py | 7 ++++++- ItemList.py | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Doors.py b/Doors.py index 26d474cc..a7c1d9f3 100644 --- a/Doors.py +++ b/Doors.py @@ -435,7 +435,7 @@ def create_doors(world, player): create_door(player, 'PoD Dark Basement W Up Stairs', Sprl).dir(Up, 0x6a, 0, HTH).ss(S, 0x1b, 0x3c, True), create_door(player, 'PoD Dark Basement E Up Stairs', Sprl).dir(Up, 0x6a, 1, HTH).ss(S, 0x1b, 0x9c, True), create_door(player, 'PoD Dark Alley NE', Nrml).dir(No, 0x6a, Right, High).big_key().pos(0), - create_door(player, 'PoD Mimics 2 SW', Nrml).dir(So, 0x1b, Left, High).pos(1).kill().portal(Z, 0x00), + create_door(player, 'PoD Mimics 2 SW', Nrml).dir(So, 0x1b, Left, High).pos(1).portal(Z, 0x00), create_door(player, 'PoD Mimics 2 NW', Intr).dir(No, 0x1b, Left, High).pos(0), create_door(player, 'PoD Bow Statue SW', Intr).dir(So, 0x1b, Left, High).pos(0), create_door(player, 'PoD Bow Statue Left to Right Barrier - Orange', Lgcl), @@ -1467,6 +1467,11 @@ def create_doors(world, player): world.get_door('GT Spike Crystal Right to Left Barrier - Orange', player).barrier(CrystalBarrier.Orange) world.get_door('GT Spike Crystal Left to Right Bypass', player).barrier(CrystalBarrier.Blue) + # kill certain doors + if world.intensity[player] == 1: # due to ladder & warp being fixed + world.get_door('PoD Mimics 2 SW', player).kill() + + # nifty dynamic logical doors: south_controller = world.get_door('Ice Cross Bottom SE', player) east_controller = world.get_door('Ice Cross Right ES', player) diff --git a/ItemList.py b/ItemList.py index 9dd69157..279fec61 100644 --- a/ItemList.py +++ b/ItemList.py @@ -514,7 +514,7 @@ def fill_prizes(world, attempts=15): continue break else: - raise FillError('Unable to place dungeon prizes') + raise FillError(f'Unable to place dungeon prizes {", ".join(list(map(lambda d: d.hint_text, prize_locs)))}') def set_up_shops(world, player): From 1e4b857dabead4e1e6d29574a7d19d373c29b64f Mon Sep 17 00:00:00 2001 From: aerinon Date: Wed, 7 Sep 2022 16:55:46 -0600 Subject: [PATCH 5/9] Update default setting to vanilla --- CLI.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CLI.py b/CLI.py index ba5090ec..e212c935 100644 --- a/CLI.py +++ b/CLI.py @@ -174,12 +174,12 @@ def parse_settings(): "keyshuffle": False, "bigkeyshuffle": False, "keysanity": False, - "door_shuffle": "basic", - "intensity": 2, - "experimental": False, - "dungeon_counters": "default", - "mixed_travel": "prevent", - "standardize_palettes": "standardize", + 'door_shuffle': 'vanilla', + 'intensity': 2, + 'experimental': False, + 'dungeon_counters': 'default', + 'mixed_travel': 'prevent', + 'standardize_palettes': 'standardize', "triforce_pool": 0, "triforce_goal": 0, From 3227ffee1439390671917631b38cfde1674f7915 Mon Sep 17 00:00:00 2001 From: aerinon Date: Wed, 7 Sep 2022 21:30:57 -0600 Subject: [PATCH 6/9] Missed a change --- KeyDoorShuffle.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KeyDoorShuffle.py b/KeyDoorShuffle.py index ad06f3fc..b600f814 100644 --- a/KeyDoorShuffle.py +++ b/KeyDoorShuffle.py @@ -158,7 +158,7 @@ class PlacementRule(object): left -= rule_needed return False - def is_satisfiable(self, outside_keys, unplaced_keys, big_key_loc, prize_location, cr_count): + def is_satisfiable(self, outside_keys, wild_keys, unplaced_keys, big_key_loc, prize_location, cr_count): if self.prize_relevance and prize_location: if self.prize_relevance == 'BigBomb': if prize_location.item.name not in ['Crystal 5', 'Crystal 6']: From 7adb75cfb96dafb8e762579d37e8f56d3e6ca751 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Thu, 8 Sep 2022 13:50:38 -0500 Subject: [PATCH 7/9] Added Unique Boss Shuffle to mystery example yaml --- mystery_example.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mystery_example.yml b/mystery_example.yml index ab7ffe63..1093ec75 100644 --- a/mystery_example.yml +++ b/mystery_example.yml @@ -154,6 +154,7 @@ none: 3 simple: 1 full: 1 + unique: 1 random: 1 enemy_shuffle: none: 3 From f393bad008e1f659bf91731833401671c8cf11c8 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Fri, 9 Sep 2022 20:40:37 -0500 Subject: [PATCH 8/9] Added Menu Speed to example mystery yaml --- mystery_example.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mystery_example.yml b/mystery_example.yml index 1093ec75..feb4a3ed 100644 --- a/mystery_example.yml +++ b/mystery_example.yml @@ -203,6 +203,13 @@ half: 0 quarter: 1 off: 0 + menuspeed: + normal: 1 + double: 0 + triple: 0 + quadruple: 0 + instant: 0 + half: 0 shuffle_sfx: on: 1 off: 1 From 635fd10a8ce8a12a41940401efc22d835b89ecd4 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Sun, 18 Sep 2022 17:55:17 -0500 Subject: [PATCH 9/9] Version bump 0.2.10.1 --- CHANGELOG.md | 6 ++++++ OverworldShuffle.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aac5994d..d0a059de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.2.10.1 +- Merged DR v1.0.1.3 + - Fixed Zelda despawn in TT Prison + - Fixed issue with key door usage in rainstate +- Added missing modes to example mystery yaml + ## 0.2.10.0 - Merged DR v1.0.1.1-1.0.1.2 - Removed text color from hint tiles diff --git a/OverworldShuffle.py b/OverworldShuffle.py index bf1193a4..f881aa81 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -6,7 +6,7 @@ from Regions import mark_dark_world_regions, mark_light_world_regions from OWEdges import OWTileRegions, OWEdgeGroups, OWExitTypes, OpenStd, parallel_links, IsParallel from Utils import bidict -version_number = '0.2.10.0' +version_number = '0.2.10.1' # branch indicator is intentionally different across branches version_branch = '-u'