From 6474975b077faa9cb137fb694af07e5cffa1642f Mon Sep 17 00:00:00 2001 From: Kara Alexandra Date: Mon, 4 May 2026 08:53:42 -0500 Subject: [PATCH] loothud option --- BaseClasses.py | 3 +++ CLI.py | 52 +++++++++++++++++++----------------- Main.py | 3 +++ Rom.py | 14 +++++++++- data/base2current.bps | Bin 157417 -> 157443 bytes resources/app/cli/args.json | 8 ++++++ 6 files changed, 54 insertions(+), 26 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index 034bcd60..fe0dce2a 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -164,6 +164,7 @@ class World(object): set_player_attr('bigkeyshuffle', 'none') set_player_attr('prizeshuffle', 'none') set_player_attr('showloot', 'never') + set_player_attr('loothud', 'never') set_player_attr('showmap', 'map') set_player_attr('restrict_boss_items', 'none') set_player_attr('bombbag', False) @@ -3156,6 +3157,7 @@ class Spoiler(object): 'bigkeyshuffle': self.world.bigkeyshuffle, 'prizeshuffle': self.world.prizeshuffle, 'showloot': self.world.showloot, + 'loothud': self.world.loothud, 'showmap': self.world.showmap, 'boss_shuffle': self.world.boss_shuffle, 'enemy_shuffle': self.world.enemy_shuffle, @@ -3430,6 +3432,7 @@ class Spoiler(object): outfile.write('Big Key Shuffle:'.ljust(line_width) + '%s\n' % self.metadata['bigkeyshuffle'][player]) outfile.write('Prize Shuffle:'.ljust(line_width) + '%s\n' % self.metadata['prizeshuffle'][player]) outfile.write('Show Value of Checks:'.ljust(line_width) + '%s\n' % self.metadata['showloot'][player]) + outfile.write('Show Value of Checks on HUD:'.ljust(line_width) + '%s\n' % self.metadata['loothud'][player]) outfile.write('Show Map:'.ljust(line_width) + '%s\n' % self.metadata['showmap'][player]) outfile.write('Key Logic Algorithm:'.ljust(line_width) + '%s\n' % self.metadata['key_logic'][player]) outfile.write('\n') diff --git a/CLI.py b/CLI.py index 6b9f416d..8711f649 100644 --- a/CLI.py +++ b/CLI.py @@ -153,31 +153,32 @@ def parse_cli(argv, no_defaults=False): 'crystals_ganon', 'crystals_gt', 'bosses_ganon', 'bosshunt_include_agas', 'ganon_item', 'openpyramid', 'mapshuffle', 'compassshuffle', 'keyshuffle', - 'bigkeyshuffle', 'prizeshuffle', 'showloot', 'showmap', - 'startinventory', 'usestartinventory', 'bombbag', - 'shuffleganon', 'overworld_map', 'restrict_boss_items', - 'triforce_max_difference', 'triforce_pool_min', - 'triforce_pool_max', 'triforce_goal_min', - 'triforce_goal_max', 'triforce_min_difference', - 'triforce_goal', 'triforce_pool', 'shufflelinks', - 'shuffletavern', 'skullwoods', 'linked_drops', - 'pseudoboots', 'mirrorscroll', 'dark_rooms', - 'damage_challenge', 'shuffle_damage_table', - 'crystal_book', 'extra_keys', 'retro', 'accessibility', - 'hints', 'beemizer', 'experimental', 'dungeon_counters', - 'shufflebosses', 'shuffleenemies', 'enemy_health', - 'enemy_damage', 'shufflepots', 'ow_palettes', - 'uw_palettes', 'sprite', 'triforce_gfx', 'disablemusic', - 'quickswap', 'fastmenu', 'heartcolor', 'heartbeep', - 'remote_items', 'shopsanity', 'dropshuffle', 'pottery', - 'keydropshuffle', 'mixed_travel', - 'standardize_palettes', 'code', 'reduce_flashing', - 'shuffle_sfx', 'shuffle_sfxinstruments', - 'shuffle_songinstruments', 'msu_resume', - 'collection_rate', 'colorizepots', 'decoupledoors', - 'door_type_mode', 'bonk_drops', 'trap_door_mode', - 'key_logic_algorithm', 'door_self_loops', - 'any_enemy_logic', 'aga_randomness', 'money_balance']: + 'bigkeyshuffle', 'prizeshuffle', 'showloot', 'loothud', + 'showmap', 'startinventory', 'usestartinventory', + 'bombbag', 'shuffleganon', 'overworld_map', + 'restrict_boss_items', 'triforce_max_difference', + 'triforce_pool_min', 'triforce_pool_max', + 'triforce_goal_min', 'triforce_goal_max', + 'triforce_min_difference', 'triforce_goal', + 'triforce_pool', 'shufflelinks', 'shuffletavern', + 'skullwoods', 'linked_drops', 'pseudoboots', + 'mirrorscroll', 'dark_rooms', 'damage_challenge', + 'shuffle_damage_table', 'crystal_book', 'extra_keys', + 'retro', 'accessibility', 'hints', 'beemizer', + 'experimental', 'dungeon_counters', 'shufflebosses', + 'shuffleenemies', 'enemy_health', 'enemy_damage', + 'shufflepots', 'ow_palettes', 'uw_palettes', 'sprite', + 'triforce_gfx', 'disablemusic', 'quickswap', 'fastmenu', + 'heartcolor', 'heartbeep', 'remote_items', 'shopsanity', + 'dropshuffle', 'pottery', 'keydropshuffle', + 'mixed_travel', 'standardize_palettes', 'code', + 'reduce_flashing', 'shuffle_sfx', + 'shuffle_sfxinstruments', 'shuffle_songinstruments', + 'msu_resume', 'collection_rate', 'colorizepots', + 'decoupledoors', 'door_type_mode', 'bonk_drops', + 'trap_door_mode', 'key_logic_algorithm', + 'door_self_loops', 'any_enemy_logic', 'aga_randomness', + 'money_balance']: value = getattr(defaults, name) if getattr(playerargs, name) is None else getattr(playerargs, name) if player == 1: setattr(ret, name, {1: value}) @@ -274,6 +275,7 @@ def parse_settings(): "bigkeyshuffle": "none", "prizeshuffle": "none", "showloot": "never", + "loothud": "never", "showmap": "map", "keysanity": False, "door_shuffle": "vanilla", diff --git a/Main.py b/Main.py index c7fabc3e..f2c19eff 100644 --- a/Main.py +++ b/Main.py @@ -516,6 +516,7 @@ def init_world(args, fish): world.bigkeyshuffle = args.bigkeyshuffle.copy() world.prizeshuffle = args.prizeshuffle.copy() world.showloot = args.showloot.copy() + world.loothud = args.loothud.copy() world.showmap = args.showmap.copy() world.bombbag = args.bombbag.copy() world.flute_mode = args.flute_mode.copy() @@ -837,6 +838,7 @@ def copy_world(world): ret.bigkeyshuffle = world.bigkeyshuffle.copy() ret.prizeshuffle = world.prizeshuffle.copy() ret.showloot = world.showloot.copy() + ret.loothud = world.loothud.copy() ret.showmap = world.showmap.copy() ret.bombbag = world.bombbag.copy() ret.flute_mode = world.flute_mode.copy() @@ -1070,6 +1072,7 @@ def copy_world_premature(world, player, create_flute_exits=True): ret.bigkeyshuffle = world.bigkeyshuffle.copy() ret.prizeshuffle = world.prizeshuffle.copy() ret.showloot = world.showloot.copy() + ret.loothud = world.loothud.copy() ret.showmap = world.showmap.copy() ret.bombbag = world.bombbag.copy() ret.flute_mode = world.flute_mode.copy() diff --git a/Rom.py b/Rom.py index e52b2aec..39c09788 100644 --- a/Rom.py +++ b/Rom.py @@ -85,7 +85,7 @@ from Utils import int16_as_bytes, int32_as_bytes, local_path, snes_to_pc from Versions import DRVersion, GKVersion, ORVersion JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = 'c4ba2f29976344e33ca1b5901b3073bb' +RANDOMIZERBASEHASH = '5fe97f04afd1880f281ec2c27cfabc17' class JsonRom(object): @@ -1516,6 +1516,18 @@ def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None): rom.write_bytes(0x1CFF08, [0x02, 0x00, 0x00, 0x00]) rom.write_byte(0x1CFF11, 0x00) + if world.loothud[player] == 'never': + rom.write_byte(0x1CFF12, 0x00) + elif world.showloot[player] == 'presence': + rom.write_byte(0x1CFF12, 0x01) + rom.write_bytes(0x1CFF0E, [0x01, 0x01]) + elif world.showloot[player] == 'value': + rom.write_byte(0x1CFF12, 0x01) + rom.write_bytes(0x1CFF0E, [0xFF, 0xFF]) + elif world.showloot[player] == 'dungeon_value': + rom.write_byte(0x1CFF12, 0x01) + rom.write_bytes(0x1CFF0E, [0xFF, 0x01]) + if world.showmap[player] == 'visited': rom.write_bytes(0x1CFF00, [0x01, 0x00, 0x00, 0x05]) elif world.showmap[player] == 'map': diff --git a/data/base2current.bps b/data/base2current.bps index 8459f435790c999b316a45c82ce53efff61c6941..710f9438eed6cabb2496e9192ec554efda465fc4 100644 GIT binary patch delta 1274 zcmW-ee^8Tk9LJyMv(aD-n5ULFlet5UU*7zY1q>Vn3SH(De_+80IZ;GX>ooOp`#!^` z9FxX;qHoI8u3~O`7@LN*zNz;pg-V?kjyTVA8i@t1&yLywoi}x8x*$}Wfl6!owIgbi!an#=&H+8?%aI={ggpf_p&LMPdto9&+H3` z5;N$XXt=AKewm-qcj`dbj6ND&a2~=#MUcnV;zvc$&3=Pj#W0oKjlIP%C!^V)6K8nn zVaO&wF5HW+6@zJVX&()J67w;Bv$!4&@(jtsOAKIU7vdfRoO$kEkPOA+G36lRymToV zMfX2t7-?SU|IjqZ#MC&un$G#Jr&UQ0f&?Y|N2$}}4@)4Fvok=DT3SU_Db-VzOHBbn z_f0fl-O?l2(o}#5T)aqr$2&@4_T1udOqs%{s~N_9Hf|v$USs8T&p_OQnu{V@;_$Y+ z{-tpTK3xhW)^)wrjN17+Sjl?9$hme<^QzG9dV{i_GDx|B@;GIq(C+yhtPR?kj;qI# zLmO=UX^1mAZTv(-cZH3&ip~QrGwtJqD&%USri~76q2wuhDBq<#Mrjw?Ip6msh-1Rm z8f0hO6}_(@ZnAL8C9+mBRk-O2P(DSw?@(q^-lNnANt`Q}jz29pxP0%e-o0)8D%8ce zZH#rI`x%bAi{D0$JjC6{`N%N^aev^+s6%EY5Anf7IVQ}qxwg{!k>KFB$u3wBhr;;r z5;(6l1rjG!c^IXS7z2Xh{g3E%4T-ROMdR4WJ$%CmnaV23_TI8}h$rJ%UIvHRVT{XQ zv0~Uq_;e|Pe<}mx@>V}lzdRI=ZL}LB**O`a^tYdg-$kVnKhdwasuZR91D1&)Mt?t% z@GP2V*G4iDeR7fTj1>11B;>ofbiw9I5yOq;Py+1F*j)jo><#>D1_X6R3D8>Sy)pE^X5c?WOjP&c~9z)ymNv0Vx4C{3eiVSvz`o+BTRBA zlJH;P?Uj(rn(@&}$jRH}J?9yUGciNK6HH9+9B`(ccER!4Qj?%Rb!7S=bY@DM@t@9R z9JeL>pc2Xya*n~a@WSOVNtUERp*jg0Dt)8nL59-WKCGR8lF|{+BlAtVz{nw94`qsu7*{t z(y~j3j#_d$KWoHi)<8K-UyIqba5Ft+!37~TTZVWONYgfj$JRm(3z;>zsuo^@Cs*M> zEnI{7&A5F%Xkc1%*t;H-vPr355z)Q50P)71&I284X)Ye9gI2Z*>+9i#nbnzBcv1AK zG*{eZsB4mS>x1(1&QAXDUti9B^j1OGRSzS{3UmI|!^L?gaB~yvN&ay->67t7?Unxk Dj;J;m delta 1231 zcmW-ge@s(X6vy8?Ef#8l65JfRC?M!SaNw_L3s@Kx@D~+yx`iTBLYOFFTQ<>U?R&4j z#ll#5yvfydTa%62_O()H&0cOcea;LO7ZsOf0>i{OvmsLh^T#%}+1>7+^ZA}{&bjv_ z=U&H^ggciLP8?FHAB^gmTZt{os zuJ-qJWq$0(+u5#6pC9M3Lfta4si=dFb4(Skb5XgyA zJoHhxGJvYv(U=h|sTs$K=~t*v(VIpqGr&_A(3&D>q@PB8MR59stNnN|8lBV*P_E0D z$H$p_pHY;O68_(`3{aDLlvPFg0yh&Ym23T&i4WW&Dis|mhH%c75N7ns3KF%7iA1$h z6~g4c=?0X!_9(J7=51{G!ga_mJyyHEEhYxC&Av3KCg51 zSbTT~7fEDTlZ)f08{Fj_zf*D@6dFlgqgcrZO++-2#%981!al;?gvSW?h#jo|yJCi= zWP2^+q&(%pR~Y_rz?I4f5^cwSiuJ4zB4U~}Oc4Gz8C)xa#eQx1M2LY#jrn$8Jw`2}aG04TGFq!HZJL<BO=L|r1nz9c4?y6wf_40%nN;T@v8?G_=`HhgGipzI|cge_Xfh_%o znJmX{iUmt7)S&$qXjxFW3&!erF5R(Ax61 zGMSHTIo+QxLf5xK88mD~b6zR=#MMK<-1YMM-+SN8SnL^E}52@Yt&GI)dgI1MtU&fLrKcC@Eue%O*=@l&+ ztAo9C5?W`47w09XjqsA>tC=(6DP<0)*mvJAJMZe|dmewe=uyiOIcSAz@tVA~VvlW= Th#XDO9-n%A_~-Xp3tRpJsF@wT diff --git a/resources/app/cli/args.json b/resources/app/cli/args.json index ae48628f..d62965e6 100644 --- a/resources/app/cli/args.json +++ b/resources/app/cli/args.json @@ -486,6 +486,14 @@ "always" ] }, + "loothud": { + "choices": [ + "never", + "presence", + "value", + "dungeon_value" + ] + }, "showmap": { "choices": [ "visited",