From 7b483780dba6d0be448d1500791774df7f027549 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Sun, 11 Jan 2026 00:07:20 -0600 Subject: [PATCH 01/13] Fixed bonk drops duplicate counting and potentially writing bad values --- Rom.py | 2 +- data/base2current.bps | Bin 138747 -> 138753 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Rom.py b/Rom.py index a2bc02a6..3c9293e5 100644 --- a/Rom.py +++ b/Rom.py @@ -43,7 +43,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = 'f2eebfbec9c8ad638e922ed1047d1c10' +RANDOMIZERBASEHASH = 'b8eedc36b1c63dc295367f16868ddf89' class JsonRom(object): diff --git a/data/base2current.bps b/data/base2current.bps index 06b22326da5cc6fec420ce885de1e93dac614d12..f741607edccdb7a2043496260aa14d7042c96b2e 100644 GIT binary patch delta 286 zcmV+(0pb4py9j~22(U5(1nkBWIfFI>w>AR-^_>g-jF1uNy#TvNAUu~gp#iNw{fw{! zO#6)Jy#Tw~NFY3oNU#N|8;vgkqXVjwFM*FFf(d}|1%(ej@|$A2?v!If8*Bnour^rI{cOyCN94jqneu kbv22N|Cv||cajyCrlSEi0XVnaqX8Cr2%LJAR-^_>g#jF1uNy#TvNAT*aYp#iNw^^C9s zO!JKBy#Tw~NFX$gNU#N|8;vgkqXVjwFM*FFf(d}|1BBB9FC1H)KB6i-MfIZ1X&;+UCfHBF@&;+ThfGNq+&;+UDfFa4#&~lfM zq5%{WA%Oa+3nF2Ss%X$LyCTWsqL3<=yrKaw5T)(_zTzN&YWna8mkT5YfS3HD0aXDa zmr|nvClv&Oy@1!H8}JIRLGpeh1MnX>VB0g7j-vq^0~eDEm#m`!HUTKN Date: Sun, 11 Jan 2026 00:43:55 -0600 Subject: [PATCH 02/13] Fixed bonk drops duplicate counting and potentially writing bad values --- Rom.py | 2 +- data/base2current.bps | Bin 138753 -> 138751 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Rom.py b/Rom.py index 3c9293e5..d16fafb4 100644 --- a/Rom.py +++ b/Rom.py @@ -43,7 +43,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = 'b8eedc36b1c63dc295367f16868ddf89' +RANDOMIZERBASEHASH = '740314e3692259e7f21c19079f8e2bdf' class JsonRom(object): diff --git a/data/base2current.bps b/data/base2current.bps index f741607edccdb7a2043496260aa14d7042c96b2e..8f2df3381aaecd25f46455b16ff92a38646303df 100644 GIT binary patch delta 213 zcmV;`04o21ya@lh2(U5(1YyXYH-k0AR-^_>g*jF1uNy#TvNAUc;ep#iNw`;4#y zO!BBB9FC1;JQB6i-MfIZ1X&;+UCfHBF@&;+ThfGNq+&;+UDfFa4#(0G@S zq5%{ZEr9x|3nFKYs%Y>7O!thtBFW>TkoK3nq5+iwD3?;B0apWmk`b4zqX9MnG`HiU P0Ty})NOKM3c&z`3w>AR-^_>g-jF1uNy#TvNAUu~gp#iNw{fw{! zO#6)Jy#Tw~NFY3oNU#N|8;vgkqXVjwFM*FFf(d}|1l>sc5P@@4?19y@Ym#U)yHUT)d R;iCZ-dI+3))SK_fa-Y>NV?zJ{ From 44415b3ca5a23485e9a59e8dcc43200aebbbf65a Mon Sep 17 00:00:00 2001 From: codemann8 Date: Sun, 11 Jan 2026 02:00:00 -0600 Subject: [PATCH 03/13] Fixed boss icons not showing on dungeon map check --- Rom.py | 2 +- data/base2current.bps | Bin 138751 -> 138758 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Rom.py b/Rom.py index d16fafb4..c0b2d39c 100644 --- a/Rom.py +++ b/Rom.py @@ -43,7 +43,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '740314e3692259e7f21c19079f8e2bdf' +RANDOMIZERBASEHASH = 'b118695a85b98bb1e59af2f8ae443d6f' class JsonRom(object): diff --git a/data/base2current.bps b/data/base2current.bps index 8f2df3381aaecd25f46455b16ff92a38646303df..49b4509bac4e080b28aefd9bab9ec549352829d5 100644 GIT binary patch delta 898 zcmW-baZuA`9LC@8ZyVbfV;dl`0BNBky8HN3GvR z6Q&Fp8@!&oZbL@`>uy}XxVLK_qq#peG9$ATxw0b*j=IKmLBN%3_1yE^eg1i#d*T7! z#hbi|oh)`|_?=4TS(b(ZhUwuM?7Fc+|Pc*T+ZIydttTuS$YHZpX%Y*yTVR7JCe!y{Y zFeLM5R3YD_iQ_Yy*w~EgiA@hO{w`gW{qvY72l>DG(^wcsyP|P4u?N3VH$OMM8%;=p ze?R*8VZeQI+PJy26p7Hwf#CkSc}K-3u5!HiCMYs0+w3L{Twt{O6QGSd3Z6)xtMk&SDhVyC=trq8aXa|=bdHJ?=9fG7*fvDgP$(iExF289UqmC~+z z_-j+%jZR-hmeWy!RX#WaW%#-e4gwGV>VsB6$5yBP5JI5BrKI5_XiQ1kmpfQsdXe1y z6xPx~h@-a?A78;g--ej@^|H$&bq$CcM~TL9*K_3YmvC$k9L42AY6sO`Mzli8Pf;ow z3&m6^$5pHB{}vw*Qwr8I9kW?fbh{j0X zn^s$-U}@oIb^^LOEM}b|T6c2J`SX*UbM}TL zdR;Q07YMD9&Mo{~0uzQH-z*wp;9vg36r%{f<1eNMC2-UG-iGb)h-WvX3h|3Y{-QcF z4*dL}R)|5)|DZbz@D;DqUtSA;d4Da|z-*gAksDeHJnrv~T%Vhoe_%f2Hk+0L$3N{F zX?G-=A1noKa4o+7o!jI#OT7j|CM@!Y4I$erej2|`2}k+e6G?kPM61|sF7=0`l(8l+MJ4wC`ieMKxWrH**qr?U(={jSP=ll6?1?s=O*q9SV`J+)ZP(b#P zaXX|-bQROy%y0ZE^3)FMHQ99@PEB;Dz37;SOC!mRp8hpNQwLu{9=THoDs91Xzy)YR zx$^MsJ&V5kmygU&P?4ww^$!7Aj9zq}^mySUfPL|Of4Um)qJIF3KXp^m5TeE{O8R>X42oo*HBPuBZ45C=|-xu(o;(tTIPVa2DO!1ET`H>d4vlEQCM>o#lyVdfGcS zRZd=6e=tZ?X+AgPAk>=2`tOimxQw3Dp|Vt;w}_O6zzW5rF9gM)Ad4Y5x=Oy@=P8X* z3W<^)>4O?sT&1!-o2#PJ-@@}`luxt~pPQd*bZ{|n}gY(3(xz}RP6C;Dw z0-=*c1Ld-WPSg E1a+xhO#lD@ From 5f53da73be27bfd68b5fd1b15b6ca1acde26a116 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Sun, 11 Jan 2026 02:39:53 -0600 Subject: [PATCH 04/13] Fixed key total autotracking after prior default key total HUD change --- Rom.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Rom.py b/Rom.py index c0b2d39c..0a821e9b 100644 --- a/Rom.py +++ b/Rom.py @@ -1382,9 +1382,13 @@ def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None): | (0x04 if world.mapshuffle[player] != 'none' else 0x00) | (0x08 if world.bigkeyshuffle[player] != 'none' else 0x00))) # free roaming item text boxes rom.write_byte(0x18003B, 0x01 if world.mapshuffle[player] not in ['none', 'nearby'] else 0x00) # maps showing crystals on overworld - if world.keyshuffle[player] != 'universal' and (world.mapshuffle[player] not in ['none', 'nearby'] or world.doorShuffle[player] != 'vanilla' - or world.dropshuffle[player] != 'none' or world.pottery[player] not in ['none', 'cave']): - rom.write_byte(0x18003A, 0x01) # show key counts on map pickup + map_hud_mode = 0x00 + if world.dungeon_counters[player] == 'on': + map_hud_mode = 0x02 # always on + elif world.keyshuffle[player] != 'universal' and (world.mapshuffle[player] not in ['none', 'nearby'] or world.doorShuffle[player] != 'vanilla' + or world.dropshuffle[player] != 'none' or world.pottery[player] not in ['none', 'cave'] or world.dungeon_counters[player] == 'pickup'): + map_hud_mode = 0x01 # show on pickup + rom.write_byte(0x18003A, map_hud_mode) # compasses showing dungeon count compass_mode = 0x80 if world.compassshuffle[player] not in ['none', 'nearby'] else 0x00 From ceb189b04817f1c267e454a5d457e0c723fd56be Mon Sep 17 00:00:00 2001 From: codemann8 Date: Sun, 11 Jan 2026 03:40:15 -0600 Subject: [PATCH 05/13] dungeon_counters default behavior is handled elsewhere --- source/tools/MysteryUtils.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/source/tools/MysteryUtils.py b/source/tools/MysteryUtils.py index ac130d8b..673f2224 100644 --- a/source/tools/MysteryUtils.py +++ b/source/tools/MysteryUtils.py @@ -147,11 +147,7 @@ def roll_settings(weights): ret.door_self_loops = get_choice_bool('door_self_loops') ret.experimental = get_choice_bool('experimental') ret.collection_rate = get_choice_bool('collection_rate') - ret.dungeon_counters = get_choice_non_bool('dungeon_counters') if 'dungeon_counters' in weights else 'default' - if ret.dungeon_counters == 'default': - ret.dungeon_counters = 'pickup' if ret.door_shuffle != 'vanilla' or ret.compassshuffle != 'none' else 'off' - ret.pseudoboots = get_choice_bool('pseudoboots') ret.mirrorscroll = get_choice_bool('mirrorscroll') ret.shopsanity = get_choice_bool('shopsanity') From 515bc0cb0ba63370a18ef57a0969c11ca5cd86cb Mon Sep 17 00:00:00 2001 From: codemann8 Date: Sun, 11 Jan 2026 13:45:06 -0600 Subject: [PATCH 06/13] Bandaid fix to money balancing --- Fill.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/Fill.py b/Fill.py index 43915406..52021036 100644 --- a/Fill.py +++ b/Fill.py @@ -1024,7 +1024,10 @@ def balance_money_progression(world): 'Rupees (100)': 100, 'Rupees (300)': 300} rupee_rooms = {'Eastern Rupees': 90, 'Mire Key Rupees': 45, 'Mire Shooter Rupees': 90, 'TR Rupees': 270, 'PoD Dark Basement': 270} - acceptable_balancers = ['Bombs (3)', 'Arrows (10)', 'Bombs (10)'] + acceptable_balancers = ['Single Bomb', 'Bombs (3)', 'Bombs (10)', + 'Single Arrow', 'Arrows (5)', 'Arrows (10)', + 'Small Magic', 'Big Magic', 'Small Heart', + 'Fairy', 'Chicken', 'Nothing'] base_value = sum(rupee_rooms.values()) available_money = {player: base_value for player in range(1, world.players+1)} @@ -1125,10 +1128,11 @@ def balance_money_progression(world): unchecked_locations.remove(location) if location.item: if location.item.name.startswith('Rupee'): - wallet[location.item.player] += rupee_chart[location.item.name] - if location.item.name != 'Rupees (300)': - balance_locations[location.item.player].add(location) - if interesting_item(location, location.item, world, location.item.player): + if not (location.item.name == 'Rupee (1)' and world.algorithm != 'district'): + wallet[location.item.player] += rupee_chart[location.item.name] + if location.item.name != 'Rupees (300)': + balance_locations[location.item.player].add(location) + elif interesting_item(location, location.item, world, location.item.player): checked_locations.append(location) elif location.item.name in acceptable_balancers: balance_locations[location.item.player].add(location) @@ -1172,7 +1176,11 @@ def balance_money_progression(world): if len(increase_targets) == 0: increase_targets = [x for x in balance_locations[target_player] if (rupee_chart[x.item.name] if x.item.name in rupee_chart else 0) < best_value] if len(increase_targets) == 0: - raise Exception('No early sphere swaps for rupees - money grind would be required - bailing for now') + if state.can_farm_rupees(target_player): + logger.warning(f'No more swap targets available. Short by {difference} rupees, but continuing (player can farm)') + break + else: + raise Exception(f'No early sphere swaps for rupees - money grind would be required - bailing for now') best_target = min(increase_targets, key=lambda t: rupee_chart[t.item.name] if t.item.name in rupee_chart else 0) make_item_free = wallet[target_player] < 20 old_value = 0 if make_item_free else (rupee_chart[best_target.item.name] if best_target.item.name in rupee_chart else 0) From 769a8e626b094b6a1dfefe0770acc2aeb42a405b Mon Sep 17 00:00:00 2001 From: codemann8 Date: Fri, 16 Jan 2026 14:22:23 -0600 Subject: [PATCH 07/13] Fixing key totals marking MapCountDisplay flag --- Rom.py | 4 +++- data/base2current.bps | Bin 138758 -> 139121 bytes 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Rom.py b/Rom.py index 0a821e9b..a82379c9 100644 --- a/Rom.py +++ b/Rom.py @@ -43,7 +43,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = 'b118695a85b98bb1e59af2f8ae443d6f' +RANDOMIZERBASEHASH = 'b078fd606ee5ec68190a177d977221cf' class JsonRom(object): @@ -1385,6 +1385,8 @@ def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None): map_hud_mode = 0x00 if world.dungeon_counters[player] == 'on': map_hud_mode = 0x02 # always on + elif world.dungeon_counters[player] == 'off': + pass elif world.keyshuffle[player] != 'universal' and (world.mapshuffle[player] not in ['none', 'nearby'] or world.doorShuffle[player] != 'vanilla' or world.dropshuffle[player] != 'none' or world.pottery[player] not in ['none', 'cave'] or world.dungeon_counters[player] == 'pickup'): map_hud_mode = 0x01 # show on pickup diff --git a/data/base2current.bps b/data/base2current.bps index 49b4509bac4e080b28aefd9bab9ec549352829d5..290bb9eb1d2790bb348a496e252bccc50d87122c 100644 GIT binary patch delta 3517 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 delta 3040 zcmWkw3s@7^63*=ANrVJY6ct$(K~a&1))!i_YE6ME*7_**QC~H6wN|CoqK4gQkOa~M zS8~9Vh6a#i5rb~MTeN`E-hPGJn$~MoY9E4L1+6z)Y%M-=*R$U_XXnh!*`0sp%$)nJ z%Azln_D;wz`}P<#^1IKN=E1!ODoUzv zRFS`*95P!5X>8_jH>C4D!{>s6y6f)qn*}y`}yRkkW-rux!dH+nJBc)pCB z$KQyl16ameVsB$uS_z*|%B0va3%e(A4#e;+i3vE|XM2*G;Urr%E*hrr!Z?)_-eJ#8 zoEdWIhWqOm^|X~_SVc-T#PgmMH$Wkqoklr~DH^4$( z_3|5&Wkr9uNe{oN;D{WPmhd=Z4}q=x;gT?!dRedgi&Tv6P?8;dqy0n}EaKO=&MBdY zkMqbdQECjgO%`cgx!PCcik|i@n?CFkGYv)Wy1_U4wkt%)V}(Tkm-ua;M`Mt}n@@*i zJm31^d68n*K6)hXm-o+jY1X;#21)(ucA`Rq_Zw_tr)mm5VJ2NPHs_19*s0@#q^U%^ zmYwQCt3Rod1aPANci#+lCfz7)??q3rT!sblV6Clb4BwoNatl#|Kl-QB4uY)P@XpB)`)eMWXf-mddB|?vdB11J&if|cPB#0qZ(sV%MCn-kv}vlIjr#0ryzg?qA)xhL z={LAC6$TQqJ;4d^pj->Xq963M6Q8V%GcgpmaITXH^*5FqYnZ3l>+ua0l8>Qo5!}5;`U*e#KwRn6nLn5;IsUM>?A>7_Ay&v>4y&v^9 z^nTv!d#&Fv+$IhKlrI70k3YyHxbj=rO{0pL1lGtT*o?M!_oEfj#Y`efXk`*zx>hzL zR-{B`qRnVd>^C3+rO049wkI8JmO&X81w@tI@n2uo-)Qz0kA+P6BKd*5`v!3A50D z_rf^P3E}(T+#uM4E}9_`(uDytgeXJC%q=s~;Y*B?Y$5Cr1TgJRqR1pBkHto-ExzC2 zTrGr^!}qv$wboKn$!KkM^P*;tYfmJ)TLE728;(jyfk;F6jT7yu`e9UyKQs{1seR;H zfvy~Z#t5?8-Ib?9TVAHGD{~9|akhIY`P%Jh}l0xE_S4``DOXBI&9(5S4R3KD)GIB`Kseno=7h_D`cuJ$A6%K8d zk3XiDYm#|KSW}<|=hzg+ zHrlA71F}wijBS@Rcj+0j13jw&LgVGy=m!QIT;ho2?I^icbjwV%surfmW1=s)#zvsZT3EjM zP&i(Doh&QnK7JziVKk=^>u5kpkY$Yn@>GRGqp^KQwWlWG5>E){EtFUXL%o3fa*K9cLZQ}twI|G}m^XnP%uFI+G* zmS&>9U;OyghE@9ZH2qPm?!d~~USrL=C^3i7(Z>el9}mdS76vr!+T)MpBF@CLLk-=j zR9jE2QPcUSfkQ*q)l~(gD>oK%7OGyqp)Q)vtClnllVhTVFJ8~7S)T3 zIml8E_h35u&;t{&cN0*(2QsjIOVJGv#0_daeAH4WGg*pc#9$Qeg$a?Zhu?CJ8y`b6 zA+AlLU&QoPfpWbtF}0-Jmqj=E zEC;=Xn1zmeVQS1QN8PFpsp$G~6$d|_k2j2+tEQ2JHV^eizawEAhpY~4p-u1X&754bFaOHW}}}uculJQ zX7hR>tpV!ffC-mRKstzX2oD)bITcf*+jc-$dj@bR9`%-4*whB?nur3u-5UWf1Q*L+ z3oenrzNB>q%D4cpjdpEc@U1)7@HG?KX*7k0J7!09JKk1b=Cb2{V>c$440P)FK6Ly7 z#D*6r8-!WO3i^NMGvf}Nd~?KA;nxeWFI1KPfyYb+hdIX!8-9V8q%!rA=9=|F!*#eP zi-7-mYR6fa0|?e{5>8f)|HPkZbNy Date: Fri, 16 Jan 2026 15:30:34 -0600 Subject: [PATCH 08/13] Fixing key totals marking MapCountDisplay flag --- Rom.py | 2 +- data/base2current.bps | Bin 139121 -> 139111 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Rom.py b/Rom.py index a82379c9..e0e106dd 100644 --- a/Rom.py +++ b/Rom.py @@ -43,7 +43,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = 'b078fd606ee5ec68190a177d977221cf' +RANDOMIZERBASEHASH = 'b79f744b89a03f5b4cce99934f43defa' class JsonRom(object): diff --git a/data/base2current.bps b/data/base2current.bps index 290bb9eb1d2790bb348a496e252bccc50d87122c..38fe3037a1bef9e9bfc4c4cab6f7789e5e1a792e 100644 GIT binary patch delta 520 zcmV+j0{8v#z6j^O2(U5(1W)F$8Iv{xHU$isry?SgaRWdB0+X@>S_n~^rznnfBmb1DK?G^z@v#2I0RRPk2(R;VidjYBp5FVI~qLXWa;iSjE5b&@d9+!)V0i_Jq zmXipBr3V1e15DPJJc$8F0r{7Oi2*wlFqo?@W}2nirU0*K^L`I>^p}S5m)nT}9s&k{ zm;8wVB7dQmsUfEnW}1nqAS}a-i?I`cs*gH=lNV3%lWY?7m-=hkib|6#f|EB=_16?)+0`Z_7nh%k0UQC-m%NGrJpnYA`icQ!0o#{d zivbw{QI~g%0aXiZny?EX6`HU-ASajCivcGOCz`NupJHGZfQ7^qpLuGR4U7R9FmP%X zfR%(GeyR8rs~uq$fS+Pu7Jz{Wk_aV$pNxeV39p2+2!M&H{GGomeiMMZQkPbY0Us0x zahQn-r3#a3kCIdsmx-XsHn%dDiHrdwD{Pwjumhz4YpDSNYiU3LOj4Sv4TFJLmr-7r zp#acNuln$(@FACGU6_+em)DE|a0g?CXn%m0FSkyO0k9JR9+&^10XzX5w>+T%Eq(|} KUr2nGw$N{DIpE6x delta 572 zcmV-C0>l01z6kNY2(U5(1SI6!8fBo3pwP?G^z|v#2I0RRPz7(R;VidjYBp5F?n4qLXWa;iSjE5b&@dBbSSa0i_Jv zmXipBr3V1e15DeOJc$8F0sfbTi2*x2HJGa|W}1oGrT~*Sgoy$G(3fXTkO6?en1Jvk z`rnfJ^nT(nAb*&` zFr}jjf`z3AmywD3fD4y|g~-UCa)F-%fuDrU4woo;`fJ+1zL%$}Anup?YubuRlPrRh zK~nYC6k^%cCYO_n0UiO^m$HfhJpn$K@QMLq8{n9yukin;#h~yIukw>DfQbmN^pA#x z&>^o|mu-syRSR*NunQm>ny@?|ESJrT0Vg^vny_%6Y+x3Eg~Sw}18Ww5nFb(!sl^nZ zl3KW>K%WF4eyQjbpMsZqY8HT%gdl#Y_!O%rVHSX&Y?m&K0T>1~eiMMZT$fCY0Us0* zahQn-r3#a3kCIdsmx-XsHn%*Ne~bYmD{-3oumhz4YpDSNYiU3LOjnw!4TFJLms?(# zp#acNuln$(@FACQU6_+om(7d;a0gF@Xn%m0CAUP40k9JRD3|r10XzW`w=$stEq(~Y K9PvKg;rP$d1pzbw From a84b125bbd8be39ff8ac6ec45e986b75169b5a7d Mon Sep 17 00:00:00 2001 From: codemann8 Date: Fri, 16 Jan 2026 15:36:58 -0600 Subject: [PATCH 09/13] missing DR version number change --- Main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Main.py b/Main.py index a25f6bc0..a2dba973 100644 --- a/Main.py +++ b/Main.py @@ -40,7 +40,7 @@ from source.enemizer.DamageTables import DamageTable from source.enemizer.Enemizer import randomize_enemies from source.rom.DataTables import init_data_tables -version_number = '1.5.0' +version_number = '1.5.2' version_branch = '-u' __version__ = f'{version_number}{version_branch}' From 5a28f42454c2b1ff1c5c3cc17b0fd6c5b30a2901 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Fri, 16 Jan 2026 21:26:26 -0600 Subject: [PATCH 10/13] Fixed issue with ow sprite data pushing the uw sprite pointer table down to overlap the pot pointer table --- source/rom/DataTables.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/source/rom/DataTables.py b/source/rom/DataTables.py index 2ecfc518..2139066a 100644 --- a/source/rom/DataTables.py +++ b/source/rom/DataTables.py @@ -141,10 +141,11 @@ class DataTables: bytes = sum(1+len(x)*3 for x in self.ow_enemy_table.values() if len(x) > 0)+1 self.pointer_addresses['ow_sprites'][1] = bytes # ending_byte = 0x09CB3B + bytes - max_per_state = {0: 0x40, 1: 0x90, 2: 0x90} + max_per_state = {0: 0x40, 1: 0x90, 2: 0x81} # dropped max on state 2 to steal space for extra sprites (Murahdahla, extra tutorial guard) pointer_address = snes_to_pc(self.pointer_addresses['ow_sprites'][2][0]) - data_pointer = snes_to_pc(self.pointer_addresses['ow_sprites'][0]) + self.pointer_addresses['ow_sprites'][0] = pointer_address + ((max_per_state[0] + max_per_state[1] + max_per_state[2]) * 2) + data_pointer = self.pointer_addresses['ow_sprites'][0] empty_pointer = pc_to_snes(data_pointer) & 0xFFFF rom.write_byte(data_pointer, 0xff) cached_dark_world = {} @@ -177,6 +178,10 @@ class DataTables: data_pointer += len(data) rom.write_byte(data_pointer, 0xff) data_pointer += 1 + # Check if OW sprite data has overwritten the UW sprite pointer table + max_allowed_address = snes_to_pc(0x09D62E) + if data_pointer > max_allowed_address: + raise Exception(f'OW sprite data will cause the UW sprite pointer table to overwrite the pots pointer table. Data end: {hex(pc_to_snes(data_pointer))}, Max allowed: $09D62E') special_health_table = { From ebebfe3ec0eb7d41c8a89d3bccc923f1f2dd283e Mon Sep 17 00:00:00 2001 From: codemann8 Date: Fri, 16 Jan 2026 23:24:06 -0600 Subject: [PATCH 11/13] Allowing some enemies on water since enemies can move on water --- source/enemizer/SpriteSheets.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/source/enemizer/SpriteSheets.py b/source/enemizer/SpriteSheets.py index f558eb7d..15b81f51 100644 --- a/source/enemizer/SpriteSheets.py +++ b/source/enemizer/SpriteSheets.py @@ -177,9 +177,9 @@ def init_sprite_requirements(): SpriteRequirement(EnemySprite.Vulture).no_drop().sub_group(2, 0x12).exclude(NoFlyingRooms), SpriteRequirement(EnemySprite.CorrectPullSwitch).affix().sub_group(3, [0x52, 0x53]), SpriteRequirement(EnemySprite.WrongPullSwitch).affix().sub_group(3, [0x52, 0x53]), - SpriteRequirement(EnemySprite.Octorok).aquaphobia().sub_group(2, [0xc, 0x18]), + SpriteRequirement(EnemySprite.Octorok).sub_group(2, [0xc, 0x18]), SpriteRequirement(EnemySprite.Moldorm).exalt().sub_group(2, 0x30), - SpriteRequirement(EnemySprite.Octorok4Way).aquaphobia().sub_group(2, 0xc), + SpriteRequirement(EnemySprite.Octorok4Way).sub_group(2, 0xc), SpriteRequirement(EnemySprite.Cucco).immune().sub_group(3, [0x15, 0x50]).exclude(NoFlyingRooms), SpriteRequirement(EnemySprite.Buzzblob).sub_group(3, 0x11), SpriteRequirement(EnemySprite.Snapdragon).sub_group(0, 0x16).sub_group(2, 0x17), @@ -191,7 +191,7 @@ def init_sprite_requirements(): .exclude(NoFlyingRooms).exclude({0x40}), # no anti-fairies in aga tower bridge room SpriteRequirement(EnemySprite.Wiseman).affix().sub_group(2, 0x4c), SpriteRequirement(EnemySprite.Hoarder).sub_group(3, 0x11).exclude({0x10c}), - SpriteRequirement(EnemySprite.MiniMoldorm).aquaphobia().sub_group(1, 0x1e), + SpriteRequirement(EnemySprite.MiniMoldorm).sub_group(1, 0x1e), SpriteRequirement(EnemySprite.Poe).no_drop().sub_group(3, 0x15).exclude(NoFlyingRooms), SpriteRequirement(EnemySprite.Smithy).affix().sub_group(1, 0x1d).sub_group(3, 0x15), SpriteRequirement(EnemySprite.Statue).stasis().immune().sub_group(3, [0x52, 0x53]), @@ -225,12 +225,12 @@ def init_sprite_requirements(): SpriteRequirement(EnemySprite.Hoarder2).sub_group(3, 0x11).exclude({0x10c}), SpriteRequirement(EnemySprite.TutorialGuard).affix(), SpriteRequirement(EnemySprite.LightningGate).affix().sub_group(3, 0x3f), - SpriteRequirement(EnemySprite.BlueGuard).aquaphobia().sub_group(1, [0xd, 0x49]).exclude(PitRooms), - SpriteRequirement(EnemySprite.BlueGuard).aquaphobia().sub_group(1, [0xd, 0x49]).sub_group(2, [0x29, 0x13]), - SpriteRequirement(EnemySprite.GreenGuard).aquaphobia().sub_group(1, 0x49).exclude(PitRooms), - SpriteRequirement(EnemySprite.GreenGuard).aquaphobia().sub_group(1, 0x49).sub_group(2, 0x13), - SpriteRequirement(EnemySprite.RedSpearGuard).aquaphobia().sub_group(1, [0xd, 0x49]).exclude(PitRooms), - SpriteRequirement(EnemySprite.RedSpearGuard).aquaphobia().sub_group(1, [0xd, 0x49]).sub_group(2, [0x29, 0x13]), + SpriteRequirement(EnemySprite.BlueGuard).sub_group(1, [0xd, 0x49]).exclude(PitRooms), + SpriteRequirement(EnemySprite.BlueGuard).sub_group(1, [0xd, 0x49]).sub_group(2, [0x29, 0x13]), + SpriteRequirement(EnemySprite.GreenGuard).sub_group(1, 0x49).exclude(PitRooms), + SpriteRequirement(EnemySprite.GreenGuard).sub_group(1, 0x49).sub_group(2, 0x13), + SpriteRequirement(EnemySprite.RedSpearGuard).sub_group(1, [0xd, 0x49]).exclude(PitRooms), + SpriteRequirement(EnemySprite.RedSpearGuard).sub_group(1, [0xd, 0x49]).sub_group(2, [0x29, 0x13]), SpriteRequirement(EnemySprite.BluesainBolt).aquaphobia().sub_group(0, 0x46).sub_group(1, [0xd, 0x49]), SpriteRequirement(EnemySprite.UsainBolt).aquaphobia().sub_group(1, [0xd, 0x49]), SpriteRequirement(EnemySprite.BlueArcher).sub_group(0, 0x48).sub_group(1, 0x49), From bb7c482d1d1a208db0b6bda199f1bab6d4b5df92 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Sat, 17 Jan 2026 00:52:31 -0600 Subject: [PATCH 12/13] Fixed issue with Old Man follower infinite pit fall --- Rom.py | 2 +- data/base2current.bps | Bin 139111 -> 139133 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Rom.py b/Rom.py index e0e106dd..64577f96 100644 --- a/Rom.py +++ b/Rom.py @@ -43,7 +43,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = 'b79f744b89a03f5b4cce99934f43defa' +RANDOMIZERBASEHASH = '34c9d7b09fad982dea9e7c9e3ae885ee' class JsonRom(object): diff --git a/data/base2current.bps b/data/base2current.bps index 38fe3037a1bef9e9bfc4c4cab6f7789e5e1a792e..1d7cbcfa483758e9343acc1bde1a29400feba20a 100644 GIT binary patch delta 763 zcmVgw>dr5i~B>gw7eTBtcfCJv#=nE0u`0$lP8UjChnU>@HB#tW>J8gjUrr=P9x6>&+4Gefri+X zA|{h3Bp?(}>!6&QUPytMfrXrxJ7s~ajUtJ&TO7bTyHQtdT9+PQ-JqMxbppc0o#FMRo8yQsTpx~ckH=U$`fIxwPjqHJjT!MjsxQYIg z;ei$z4C=cRdGC;whL95?8S1|PY>xDSfYgm5I+GBBISHeELD_|e=fetj}4iO2u|n@&XNs~&-s#TP=W>BolzkdX$9;;gf`;Y=e_x&KMYk>4gTVlYI*%&9fPSlUC1B2TWe-fg6)QldjJl0vdjk&CekLFO%=j?g<+sfG{n}dzxai z=Fs3s8c$V=jY5F1@RCy*fQf+c2bM*Ofor0TpBEvQ;28ne0eY9X8UY>wPq)_^0UQ_v zI^&Z9xA!suF)k2aSdNRvov?|c1gfBFYnMZ}IAH+?ECmDrftO3SM2!JH4gv^AmxP-E tDFJ)8uA2df1O;kH*qdLsJD>rq1O+t+q?2X0?4$v6dI)fH-XW{rGDD(zXIuaP delta 771 zcmV+e1N{8`z6j^O2(U5(1W)F$8M8J6*&G2alMo;q5vk~)>gw>dr5i~B>gw7eTBtcfC5v#=nE0u_holP8UjChnU>@HB#tW>J8gjUrByP9x6>!RnyQfri+X zA{dh=Bp?(*>!6&QUPytMfrXrxJ7s~ajUs!qTO7bTyHQtdT5R++vJqMHNppc0owv(-a8yQCFpx~ckH=U$`fIxwPjqHJjT!MjsxQXzS z;ei$z{^`3DdGC;whL95?3+lfBY>xDSfYgm5ERzs|IS8kHLD_-l!w8d7f-NAEIi94Y zA_(Z9>gpmTpNXu2f~0|fz=`vgpa6rbGh*Vipn@Gslg!O6E_djogpJkQugaTmBzAb^uw~BjEic3n|FefEY2KY@SgyIg|E|>4}+at_}hj6 z0Qmo(2SUq%?xQwD%acJXfR`i_fXjN6g$d!4griV{fefR?xv2$fuX^)-YrTLD$pX+M zyIFvlcIkx%sfOu~j*a2suhy%GkpKYr|E{YAlc>%;e;|mFAZw`rYnC}w!=pWlk1^h{ z7;7TX<)E+xy$}y;siSh`j~;}f!Q`Cz0$hOQpq6VTkd}G{)ro7uFsofx;(;)Z1c2FV zrA_b?$pY{Vt$PE|2(9=6&;zLfYpJJRSK^f-u;rkz1(OYjn{kzr1!&xpMUcBbshOne zg$Aj#2VX@RBZ!j{ftNvYw zGq>#;0UQ_v9^;c9w+%A^F)k2$SdNRvov?|c1gfBFYnLatPGJEDECpzPfR`_~T8#ld z4gzdOmztXaDFI)%#G3(#1O-k=*qcMQQJ?{=1O-tDq?1Xv0;K_SdI(BiNPL#I&~HHW BZJq!C From a2a291b0e18ab01d8fe8da84618c0f27eb50c30f Mon Sep 17 00:00:00 2001 From: codemann8 Date: Sat, 17 Jan 2026 01:06:55 -0600 Subject: [PATCH 13/13] Version bump 0.6.1.11 --- CHANGELOG.md | 11 +++++++++++ OverworldShuffle.py | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 113ed8cf..2e06e72c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +# 0.6.1.11 +- Fixed bonk drops duplicate counting and potentially overwriting arbitrary values +- Fixed boss icons on dungeon map check +- Fixed dungeon counters to autotrack correctly +- Key and chest counts in menu now display consistently (must have dungeon item or have visited dungeon to see the HUD) +- Money balancing will fail in less scenarios +- Fixed issue with Sanc pots not collecting +- Enemizer now allows more enemies on water +- Fix infinite pit fall issue with Old Man follower location +- Fix bad overworld tilemap drawing on HC and Pyramid screens in OW Layout Shuffle + ## 0.6.1.10 - Emergency fix for bonk functionality diff --git a/OverworldShuffle.py b/OverworldShuffle.py index 5b95f33e..a9b721a6 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -8,7 +8,7 @@ from OWEdges import OWTileRegions, OWEdgeGroups, OWEdgeGroupsTerrain, OWExitType from OverworldGlitchRules import create_owg_connections from Utils import bidict -version_number = '0.6.1.10' +version_number = '0.6.1.11' # branch indicator is intentionally different across branches version_branch = '-u'